Linux内核移植 part3:串口驱动

来源:互联网 发布:爱动体感运动机 知乎 编辑:程序博客网 时间:2024/05/22 11:46

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

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

串口配置

  • 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_OFstatic 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);#endifstatic 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这类接口也可以用了。

0 0
原创粉丝点击