一、 谈谈驱动实现。(说的轻松)
针对uart,首先想到是驱动程序的实现,什么uart_driver,uart_port和uart_ops,都是一堆初始化的结构体,研究kernel driver的代码:
得到如下的基本流程实现driver:
1. 针对uart_driver,实现uart_register_driver,该接口内部其实也是注册到tty core相关接口。
2. 进行对uart_port 和 uart_ops实现。
3. platform driver 的触发,具体可以参考/kernel/drivers/tty/serial/的具体例子。
二、熟悉dts、dtsi、dtb、dtc概念
dts: device tree setting,作为设备树的配置,eg:
其中显然,reg作为寄存器地址,status作为串口状态,pinctrl-0 作为串口的配置,xfer,ctsn,rtsn等。
dtsi:可以理解为dts的一种头文件形式,作为过多的电路,实现不一样的串口或者spi等接口,dtsi作为一个通用的dts,组合各种新的dts使用。
dtb:b即binary,二进制文件,即通过编译得到的数据。
dtc:c即compile,编译处理,作为dtb的编译工具。
DTC编译
tip:
dts 中包含dtsi
三、dts是为了实现更加描述硬件信息
摘于百度:
设备树是一个树形数据结构。每一个节点都有多个键值对(name-value),除了root节点,其他节点都有一个确定的父节点。 一个服从DTS规范的设备树描述的设备信息一定不可以被客户端程序动态检测到。例如:PCI总线探查和检测一个关联的设备,这不需要设备数描述;但是,一个PCI host bridge必须被描述为一个设备节点。
pinctrl-names 设备状态,也可以为
“sleep”状态,“default”状态,“idle”状态三种状态
pinctro-0 选择第一种状态,即default
status 作为属性值,通常为ok/okay/disabled(默认)
根据pinctrl.dtsi,可以知道:
原厂的m0,可能其他设计电路板改为
m0 m1 m2,具体选择(根据电路图)或调试出来。
总结流程:
dtsi -> pinctrl配置->dts
四、 调试串口收发
1. 先看看ttySx
2. 直接调用本博客的串口测试程序即可
stty -F /dev/ttyS* speed 115200 baud; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -brkint -icrnl -imaxbel -isig -icanon -echo -echoe
https://www.cnblogs.com/real-watson/p/14373901.html