1. 程式人生 > >Linux核心移植 part3:串列埠驅動

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

配置

原始碼

位於/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這類介面也可以用了。