Linux内核移植 part3:串口驱动

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

介绍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

Linux内核移植 part3:串口驱动_第1张图片

源代码

位于/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这类接口也可以用了。

你可能感兴趣的:(Linux,Linux内核移植)