• Linux学习第42天:Linux RS232/485/GPS 驱动实验:天外来客


    Linux版本号4.1.15   芯片I.MX6ULL                                    大叔学Linux    品人间百味  思文短情长 


            Linux的学习笔记今天更新到了第42天。鉴于国往笔记内容整理中出现的问题,我尽量按照平时学习时笔记的要求进行优化。尽量不再大段大段的贴代码。而是从我自身学习的角度,按照我个人的理解去整理优化教程中的内容。因为如果都是大段的贴代码贴内容而没有自己的思考总结,学习的过程仅仅是机械的复制粘贴将是没有任何意义的。因为我文章的定位是学习笔记而不是教程,不能面面俱到。整理重点、难点,加之自己的理解消化后形成的文章才是我所需要的。

            本次笔记将学习开发板通过GPS模块接收卫星信息,题目中提到的天外来客就是卫星。接收以后模块通过串口232发送给开发板,解码以后显示在minicom界面中。

            本章的思维导图如下:

            串口分为TTL和RS232,不管什么接口电平,驱动程序都是一样的。

    一、Linux下UART驱动框架

    1、uart_driver注册与注销

            串口驱动没有主机端和设备端区分,就只有一个串口驱动。

    1. 295 struct uart_driver {
    2. 296 struct module *owner; /* 模块所属者 */
    3. 297 const char *driver_name; /* 驱动名字 */
    4. 298 const char *dev_name; /* 设备名字 */
    5. 299 int major; /* 主设备号 */
    6. 300 int minor; /* 次设备号 */
    7. 301 int nr; /* 设备数 */
    8. 302 struct console *cons; /* 控制台 */
    9. 303
    10. 304 /*
    11. 305 * these are private; the low level driver should not
    12. 306 * touch these; they should be initialised to NULL
    13. 307 */
    14. 308 struct uart_state *state;
    15. 309 struct tty_driver *tty_driver;
    16. 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 函数:

    1. int uart_add_one_port(struct uart_driver *drv,
    2. 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. 1 pinctrl_uart3: uart3grp {
    2. 2 fsl,pins = <
    3. 3 MX6UL_PAD_UART3_TX_DATA__UART3_DCE_TX 0X1b0b1
    4. 4 MX6UL_PAD_UART3_RX_DATA__UART3_DCE_RX 0X1b0b1
    5. 5 >;
    6. 6 };

    2、添加uart3节点

    1. 1 &uart3 {
    2. 2 pinctrl-names = "default";
    3. 3 pinctrl-0 = <&pinctrl_uart3>;
    4. 4 status = "okay";
    5. 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界面显示接收数据。


    本文为参考正点原子开发板配套教程整理而得,仅用于学习交流使用,不得用于商业用途。

  • 相关阅读:
    【计算机网络】 粘包问题
    【技术】视频汇聚/视频云存储/视频监控管理平台EasyCVR安全检查相关问题及解决方法2.0
    电源线虚接,导致信号线发烫
    一个排列中任意两个元素对换,排列改变奇偶性。
    ADSP-21489的图形化编程详解(1:硬件的准备和软件环境的搭建)
    OpenCV中的边缘检测技术及实现
    网站构建初级教程
    RS232/RS485信号转12路模拟信号 隔离D/A转换器YL34
    uiautomator2遍历子元素.all()
    Python 集合
  • 原文地址:https://blog.csdn.net/jiage987450/article/details/134395542