Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长
Linux的学习笔记今天更新到了第42天。鉴于国往笔记内容整理中出现的问题,我尽量按照平时学习时笔记的要求进行优化。尽量不再大段大段的贴代码。而是从我自身学习的角度,按照我个人的理解去整理优化教程中的内容。因为如果都是大段的贴代码贴内容而没有自己的思考总结,学习的过程仅仅是机械的复制粘贴将是没有任何意义的。因为我文章的定位是学习笔记而不是教程,不能面面俱到。整理重点、难点,加之自己的理解消化后形成的文章才是我所需要的。
本次笔记将学习开发板通过GPS模块接收卫星信息,题目中提到的天外来客就是卫星。接收以后模块通过串口232发送给开发板,解码以后显示在minicom界面中。
本章的思维导图如下:
串口分为TTL和RS232,不管什么接口电平,驱动程序都是一样的。
一、Linux下UART驱动框架
1、uart_driver注册与注销
串口驱动没有主机端和设备端区分,就只有一个串口驱动。
295 struct uart_driver {
296 struct module *owner; /* 模块所属者 */
297 const char *driver_name; /* 驱动名字 */
298 const char *dev_name; /* 设备名字 */
299 int major; /* 主设备号 */
300 int minor; /* 次设备号 */
301 int nr; /* 设备数 */
302 struct console *cons; /* 控制台 */
303
304 /*
305 * these are private; the low level driver should not
306 * touch these; they should be initialised to NULL
307 */
308 struct uart_state *state;
309 struct tty_driver *tty_driver;
310 };
每个串口驱动都需要定义一个 uart_driver,加载驱动的时候通过 uart_register_driver 函数向
系统注册这个 uart_driver,此函数原型如下:
int uart_register_driver(struct uart_driver *drv)
同理,注销驱动需要:
void uart_unregister_driver(struct uart_driver *drv)
2、uart_port的添加与移除
uart_port 表示一个具体的 port,uart_port 中最主要的就是第 235 行的 ops, ops 包含了串口的具体驱动函数。
uart_port 是怎么和 uart_driver 结合起来的呢?这里要用到 uart_add_one_port 函数:
int uart_add_one_port(struct uart_driver *drv,
struct uart_port *uport)
卸载函数:
int uart_remove_one_port(struct uart_driver *drv, struct uart_port *uport)
3、uart_ops实现
Linux收发数据都是通过ops函数实现的。
ops是uart_ops类型的结构体指针变量。是和寄存器打交道的。
二、I.MX6U UART驱动分析
1、UART的platform驱动框架
imx_uart_devtype为传统匹配表。
static const struct of_device_id imx_uart_dt_ids[]为设备树所使用的匹配表。
platform 驱动框架结构体 serial_imx_driver。
2、uart_driver初始化
在 imx_serial_init 函数中向 Linux 内核注册了 imx_reg, imx_reg 就是 uart_driver 类型的结
构体变量。
3、uart_port初始化与添加
当 UART 设备和驱动匹配成功以后 serial_imx_probe 函数就会执行,此函数的重点工作就
是初始化 uart_port,然后将其添加到对应的 uart_driver 中。
4、imx_pops结构体变量
imx_pops 就是 uart_ops 类型的结构体变量,保存了 I.MX6ULL 串口最底层的操作函数.都是和寄存器打交道的。
三、硬件原理图分析
1、RS232原理图
2、RS485原理图
RO 为数据输出端, RI 为数据输入端, RE 是接收使能信号(低电平有效), DE 是发送使能信号(高电平有效)。
3、GPS原理图
四、RS232驱动编写
NXP已经将驱动写好了,开发者只需要添加对应的uart3节点即可。
1、UART IO节点创建
参考已有的uart1节点,创建uart3节点:
1 pinctrl_uart3: uart3grp {
2 fsl,pins = <
3 MX6UL_PAD_UART3_TX_DATA__UART3_DCE_TX 0X1b0b1
4 MX6UL_PAD_UART3_RX_DATA__UART3_DCE_RX 0X1b0b1
5 >;
6 };
2、添加uart3节点
1 &uart3 {
2 pinctrl-names = "default";
3 pinctrl-0 = <&pinctrl_uart3>;
4 status = "okay";
5 };
五、移植minicom
minicom类似于串口调试助手,是Linux下很常用的一个串口工具。
1、移植ncurses
移植minicom前,需要先移植ncurses。因为minicom会用到ncurses.
2、移植minicom
移植minicom完成后,输入minicom -s命令,如果打开失败的话。新建/etc/passwd 文件,然后在 passwd 文件里面输入如下所示内容:
1 root:x:0:0:root:/root:/bin/sh
之后一定记得重启开发板。
六、RS232驱动测试
1、RS232连接设置
JP1跳线帽 USB转串口线连接
2、minicom设置
回显功能配置项为“ local Echo on/off..E”,按键E打开或关闭回显功能。
3、RS232收发测试
1)、发送测试
minicom输入需要传输信息内容,在电脑端的SecureCRT会收到该信息内容。前提是需要打开minicom的回显功能。
2)、接收测试
同样,通过Secure CRT发送信息内容,在minicom界面能收到该信息内容。同样需要提前打开Secure CRT的回显功能。
七、RS485测试
1、RS485连接设置
一个设备是不能测试通信功能的,需要另外一个设备才行。
三合一串口转换器
2、RS485收发测试
485的测试和232一样。
1)、RS485发送测试
2)、RS485接收测试
八、GPS测试
1、GPS连接设置
minicom设置如下:
①、波特率设置为 38400,因为正点原子的 ATK1218-BD 模块默认波特率就是 38400。
②、 8 位数据位, 1 位停止位。
③、关闭硬件和软件流控。
2、GPS数据接收测试
minicom界面显示接收数据。
本文为参考正点原子开发板配套教程整理而得,仅用于学习交流使用,不得用于商业用途。