往期内容
本专栏往期内容:Uart子系统
- UART串口硬件介绍
- 深入理解TTY体系:设备节点与驱动程序框架详解
- Linux串口应用编程:从UART到GPS模块及字符设备驱动
- 解UART 子系统:Linux Kernel 4.9.88 中的核心结构体与设计详解
- IMX 平台UART驱动情景分析:注册篇
- IMX 平台UART驱动情景分析:open篇
- IMX 平台UART驱动情景分析:read篇–从硬件驱动到行规程的全链路剖析
- IMX 平台UART驱动情景分析:write篇–从 TTY 层到硬件驱动的写操作流程解析
interrupt子系统专栏:
- 专栏地址:interrupt子系统
- Linux 链式与层级中断控制器讲解:原理与驱动开发
– 末片,有专栏内容观看顺序pinctrl和gpio子系统专栏:
专栏地址:pinctrl和gpio子系统
编写虚拟的GPIO控制器的驱动程序:和pinctrl的交互使用
– 末片,有专栏内容观看顺序
input子系统专栏:
- 专栏地址:input子系统
- input角度:I2C触摸屏驱动分析和编写一个简单的I2C驱动程序
– 末片,有专栏内容观看顺序I2C子系统专栏:
- 专栏地址:IIC子系统
- 具体芯片的IIC控制器驱动程序分析:i2c-imx.c-CSDN博客
– 末篇,有专栏内容观看顺序总线和设备树专栏:
- 专栏地址:总线和设备树
- 设备树与 Linux 内核设备驱动模型的整合-CSDN博客
– 末篇,有专栏内容观看顺序
目录
1.UART驱动调试方法
1.1 怎么得到UART硬件上收发的数据
1.1.1 接收到的原始数据(收)
可以在接收中断函数里把它打印出来,这些数据也会存入UART对应的tty_port的buffer里:
imx_rxint
// 读取硬件状态
// 得到数据
// 在对应的uart_port中更新统计信息, 比如sport->port.icount.rx++;
------添加打印---------
// 把数据存入tty_port里的tty_buffer
tty_insert_flip_char(port, rx, flg)
------添加打印,确保是否接收到数据---------
// 通知行规程来处理
tty_flip_buffer_push(port);
tty_schedule_flip(port);
queue_work(system_unbound_wq, &buf->work); // 使用工作队列来处理
// 对应flush_to_ldisc函数
1.1.2 发送出去的数据(发)
所有要发送出去的串口数据,都会通过uart_write函数发送,所有可以在uart_write中把它们打印出来:
1.2 proc文件
1.2.1 /proc/interrupts
查看中断次数。
1.2.2 /proc/tty/drivers
1.2.3 /proc/tty/driver(非常有用)
1.2.4 /proc/tty/ldiscs
1.3 sys文件
在drivers\tty\serial\serial_core.c
中,有如下代码:
这写代码会在/sys目录中创建串口的对应文件,查看这些文件可以得到串口的很多参数。
怎么找到这些文件?在开发板上执行:
cd /sys
find -name uartclk // 就可以找到这些文件所在目录
2.编写虚拟UART驱动程序
2.1 要做的事
-
注册一个uart_driver:它里面有名字、主次设备号等
-
对于每一个port,调用uart_add_one_port,里面的核心是uart_ops,提供了硬件操作函数
-
uart_add_one_port由platform_driver的probe函数调用
-
所以:
- 编写设备树节点
- 注册platform_driver
-
2.2 虚拟的UART
为了做实验,还要创建一个虚拟文件:/proc/virt_uart_buf
- 要发数据给虚拟串口时,执行:echo “xxx” > /proc/virt_uart_buf
- 要读取虚拟串口的数据时,执行:cat /proc/virt_uart_buf