基于linux-3.14.16
基于imx分析
一、串口设备注册
注册了一个uart设备驱动,和一个平台设备驱动
先一个一个看
1、serial_imx_driver平台设备驱动
看看匹配的设备树,imx6qdl.dtsi定义了很多,我们只看一个
如上图,设备树描述了寄存器地址,中断,使用时钟,使用dma等信息。
接着看probe干了什么,
serial_imx_probe
首先分配和一块空间作为struct imx_port
serial_imx_probe_dt拿了一些设备树的属性,初始化到创建的struct imx_port,但是这些属性在设备树我没有找到,先忽略。
接着获取寄存器地址,并映射出来,接着继续初始化struct imx_port
其他的先不管,我们先注意到imx_pops和一个定时器,先记着,,在struct imx_port中有一个操作集合定时器
这个是定时器的超时函数
接下来获取时钟,,猜uartclk是什么????
最后这里有一个全局变量imx_ports是个数组,以line为下标保存了创建的struct imx_port,,line在哪里初始化的,是什么内容现在我们还不清楚。
补充:在probe开始解析设备树的时候,看到port的line来自对serial的解析,应该是串口的序号(我们暂且这么理解)
然后看到一个注册port的接口uart_add_one_port,注册其实是struct uart_port,我们在上一节研究了uart的核心和api。
至此,通过对这个平台驱动的注册,以及匹配到设备树的uart节点,完成一个struct imx_port(struct uart_port)的创建,并且注册到serial核心
接下来返回去看uart_register_driver
uart_register_driver注册一个uart驱动
uart_register_driver注册的驱动imx_reg,上一节在注册port的时候就已经看到了,,最终是对imx_reg注册了一个port。
总结
总的来说,imx的串口驱动做了什么呢??,首先定义了一个struct uart_driver,调用serial核心的api uart_register_driver注册了这个struct uart_driver,,,然后匹配设备树,对每个uart(x)创建了一个struct uart_port,并调用uart_add_one_port将其添加到struct uart_driver。