一、 谈谈驱动实现。(说的轻松)

针对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