Rickey 裘 一无所知

Linux 串口驱动

2017-02-28
Kai Qiu

每日一乐:小美在作文簿里写上长大后的愿望:一、我希望能有一个可爱的孩子;二、我还希望能有一个爱我的丈夫。结果,发现老师写了一句评语:“请注意先后顺序。”

其实这部分工作已经过去很久了,因为以后的重心不在这方面了,今天为了帮一个童鞋解决个问题,正好又看到这个,索性就写篇文章记录一下吧,不过说不定哪天有人因为看到了这篇文章,能够在工作上节省一点时间,多点时间享受生活。

串口配置

  • dts 这一版的硬件配置基本以dts的形式提供,譬如我的是在arch/arm/boot/dts/exynos4412-landrover.dts中。
serial@13800000 {
		status = "diable";
	};

	serial@13810000 {
		status = "disable";
	};

	serial@13820000 {
		status = "okay";
	};

	serial@13830000 {
		status = "disable";
	};
  • menuconfig

配置

源代码

位于/drivers/tty/serial/samsung.c,已经兼容的很好了,配置一下就可以。

#ifdef CONFIG_OF
static const struct of_device_id s3c24xx_uart_dt_match[] = {
	{ .compatible = "samsung,s3c2410-uart",
		.data = (void *)S3C2410_SERIAL_DRV_DATA },
	{ .compatible = "samsung,s3c2412-uart",
		.data = (void *)S3C2412_SERIAL_DRV_DATA },
	{ .compatible = "samsung,s3c2440-uart",
		.data = (void *)S3C2440_SERIAL_DRV_DATA },
	{ .compatible = "samsung,s3c6400-uart",
		.data = (void *)S3C6400_SERIAL_DRV_DATA },
	{ .compatible = "samsung,s5pv210-uart",
		.data = (void *)S5PV210_SERIAL_DRV_DATA },
	{ .compatible = "samsung,exynos4210-uart",
		.data = (void *)EXYNOS4210_SERIAL_DRV_DATA },
	{ .compatible = "samsung,exynos5433-uart",
		.data = (void *)EXYNOS5433_SERIAL_DRV_DATA },
	{},
};
MODULE_DEVICE_TABLE(of, s3c24xx_uart_dt_match);
#endif

static struct platform_driver samsung_serial_driver = {
	.probe		= s3c24xx_serial_probe,
	.remove		= s3c24xx_serial_remove,
	.id_table	= s3c24xx_serial_driver_ids,
	.driver		= {
		.name	= "samsung-uart",
		.pm	= SERIAL_SAMSUNG_PM_OPS,
		.of_match_table	= of_match_ptr(s3c24xx_uart_dt_match),
	},
};

module_platform_driver(samsung_serial_driver);

console和串口的关系

Linux内核中的console是虚拟的,它依赖于串口设备;在系统启动的时候,首先会有个earlyconsole用来打印log,这个时候内核中的串口设备还没有probe,通过printascii工作;等到串口初始化结束之后就通过串口设备打印,这个时候prink这类接口也可以用了。


上一篇 《胭脂扣》

下一篇 uboot eMMC启动

评论