嵌入式linux系统-Kernel串口2做交互终端
1 驱动源码
Kernel中串口的驱动程序使用8250通用驱动,路径在:
drivers/tty/serial/8250/8250_core.c
drivers/tty/serial/8250/8250_dma.c dma实现。
drivers/tty/serial/8250/8250_dw.c design ware ip相关操作。
drivers/tty/serial/8250/8250_early.c early console实现。
drivers/tty/serial/8250/8250_fsl.c
drivers/tty/serial/8250/8250.c
drivers/tty/serial/8250/8250_port.c 端口相关的接口。
drivers/tty/serial/earlycon.c 解析命令行参数,并提供注册early con接口。
默认配置下就是使用了该驱动程序了。
2 内核设备树
内核设备树的路径在(arch/arm64/boot/dts/rockchip):
其中rk3308.dtsi和rk3308k.dtsi是通用配置树,rk3308-evb-xxx是针对某个
硬件型号的配置信息,如果我们需要自定义一个针对自己的硬件外设,可以根据这两个配置树进行参考修改。
驱动起来后会先注册5个ttySx设备。但如果没有经过2.3.1使能的串口,虽然也有设备节点,但是是不能操作的。
在rk3308.dtsi中,可以看到:
驱动会根据aliase,来对应串口编号,如下: serial0最终会生成ttyS0,serial3会生成ttyS3设备。
同样在该配置文件中可以找到如下定义:
rockchip,serial‐id = <2>; /*设置串口id,想换不同的串口就改这个ID*/
rockchip,baudrate = <xxx>; /* 波特率,只能115200或者1500000 */
该节点驱动加载后会注册/dev/ttyFIQ0设备,需要注意的是rockchip,serial-id即便改了,注册的也是ttyFIQ0;接着我们在rk3308-evb-v10.dtsi中可以看到使能该节点:
这里是使能了early printk功能,当kernel启动不了,但又没有什么提示消息时,可以打开early printk查看;这是因为在内核刚启动时,有些打印语句可能在串口还没有注册之前就调用了,那当然不能显示啦,early printk就是实现这个功能,提前注册好串口。
其中0xff0c0000是uart2的物理基地址,不同的串口基地址不一样;地址可以在rk3308.dtsi中的设备节点查看到:
3 补丁更新
默认串口2支持的波特率是1500000,我们用的usb转串口可能无法支持,因此需要修改成115200,为了保持源码的原生性,我们采用打补丁的方式来支持,在目录(/home/lucker/share/patchs/terminal-kernel-uart2):
有个补丁文件:baudrate.patch,和补丁脚本patchloader.sh,只需要运行这个脚本就可以完成补丁,带参数 -u 可以卸载补丁:
打补丁后,进入到kernel中进行编译:
make rk3308_linux_defconfig
make rk3308-evb-amic-v10.img
编译后烧录内核可以看到串口有日志输出而且可以进交互终端:
==================================================================================================================================
交叉编译轻松就学习完啦,就是这样Easy!!
如果觉得对您有帮助并想进一步深入学习交流可以扫描以下微信二维码或加入QQ群:928840648
欢迎共同学习成长,有一群爱学习的小伙伴一起勉励!!一起加油!!也可点击
笔者基于嵌入式系统框架内容如下整理编辑: