迅为rk3568开发板RS485收发切换 linux485驱动修改

这篇具有很好参考价值的文章主要介绍了迅为rk3568开发板RS485收发切换 linux485驱动修改。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考链接:

  1. Linux RS485串口驱动修改方法–基于Rockchip及Amlogic验证
  2. linux驱动 内核层适配485驱动控制引脚

起因

迅为rk3568开发板用的SP3485E芯片,需要在应用程序中控制管脚的高低电平实现收发切换。
发送前先拉高电平,然后发送数据,数据发送完成后再拉低电平,使其处于接收状态。

在程序中,485发送数据后,根据波特率和数据长度计算延时时间,但是在实际应用中发现这个时间不太准确,而且不同的485设备,有的收到数据后延时10ms才返回数据,有的收到后是立即返回数据(延时很短)。如果写入后拉低电平的延时时间过长或过短都会导致通信失败。

在网上找了一些教程,将收发切换放到串口驱动程序中,不用在应用程序中控制。因为之前没有具体做过设备树和驱动程序修改,这里记录下过程。

修改过程

因为这里用的板子硬件固定,所以偷懒在驱动程序里直接根据设备树里的控制管脚来判断是否进行管脚的拉高拉低。
主要修改的有两个地方:一是设备树,二是驱动程序
设备树的修改:

1、设备树文件屏蔽原有的描述

迅为开发板默认的设备树里是将收发控制引脚单独加到了设备树文件里,需要先将其屏蔽掉

/* 把这段屏蔽掉
rk_485_ctl: rk-485-ctl {
            compatible = "topeet,rs485_ctl";
            gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>;
            pinctrl-names = "default";
            pinctrl-0 = <&rk_485_gpio>;
        };
*/

2、添加新的串口描述

&uart7 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&uart7m1_xfer>; // 迅为用的是uart7_m1,根据自己的实际情况修改
    rts-gpio = <&gpio0 22 GPIO_ACTIVE_HIGH>; // 这个就是收发控制引脚,如果自己画的底板,根据实际情况修改
    // rs485-rts-active-low;
    // rs485-rts-delay = <5 100>;
    linux,rs485-enabled-at-boot-time;
};

3、修改驱动文件

迅为开发板用的是8250的串口程序。这里一共需要修改以下3个文件。
/home/topeet/rk356x_linux/kernel/include/uapi/linux/serial.h
/home/topeet/rk356x_linux/kernel/drivers/tty/serial/8250/8250_dw.c
/home/topeet/rk356x_linux/kernel/drivers/tty/serial/8250/8250_port.c

修改serial.h文件

文件serial.h,在结构体serial_rs485的定义中,增加一个rts_gpio的整型变量,用来存储上收发控制引脚的gpio号.

struct serial_rs485 {
    __u32    flags;            /* RS485 feature flags */
#define SER_RS485_ENABLED        (1 << 0)    /* If enabled */
#define SER_RS485_RTS_ON_SEND        (1 << 1)    /* Logical level for
                               RTS pin when
                               sending */
#define SER_RS485_RTS_AFTER_SEND    (1 << 2)    /* Logical level for
                               RTS pin after sent*/
#define SER_RS485_RX_DURING_TX        (1 << 4)
#define SER_RS485_TERMINATE_BUS        (1 << 5)    /* Enable bus
                               termination
                               (if supported) */
    __u32    delay_rts_before_send;    /* Delay before send (milliseconds) */
    __u32    delay_rts_after_send;    /* Delay after send (milliseconds) */
    __u32    padding[5];        /* Memory is cheap, new structs
                       are a royal PITA .. */
    // 2023.11.13 新增
    __u32    rts_gpio; // 2023.11.13 新增
};

#endif /* _UAPI_LINUX_SERIAL_H */

修改8250_dw.c

文件8250_dw.c,一共需要修改2处,一处是增加头文件,一处是获取收发切换的管脚编号。.
1、增加头文件包含

#include <linux/gpio.h>
#include <linux/of_gpio.h>

rk3568发送485信号,linux,驱动开发,嵌入式硬件,arm

2、在static int dw8250_probe()函数里,增加如下代码,用来获取收发控制引脚的编号。

 uart.port.rs485.rts_gpio = of_get_named_gpio(p->dev->of_node, "rts-gpio", 0);
    if(22 == uart.port.rs485.rts_gpio)
    {
        gpio_direction_output(uart.port.rs485.rts_gpio, 0);
        gpio_set_value(uart.port.rs485.rts_gpio, 0); // defalut low-level

    }

rk3568发送485信号,linux,驱动开发,嵌入式硬件,arm

修改8250_port.c

文件8250_port.c,一共需要修改2处,一处是增加头文件,一处是发送前拉高,发送后拉低的控制。.
1、增加头文件包含

#include <linux/of_gpio.h>

rk3568发送485信号,linux,驱动开发,嵌入式硬件,arm

2、增加收发切换控制代码。在函数serial8250_tx_chars中增加以下代码

int lsr; // 用于获取状态
int i;   // 用于循环计数

发送前先拉高

 if(22 == up->port.rs485.rts_gpio)
 {
         gpio_set_value(up->port.rs485.rts_gpio, 1);
         udelay(2); // 这个延时好像可以不用
  }

rk3568发送485信号,linux,驱动开发,嵌入式硬件,arm

发送后,循环判断是否结束,结束后拉低。

1873                 if(22 == up->port.rs485.rts_gpio)
1874                 {
1875                         for(i = 0; i < 200; i++)
1876                         {
1877                                 mdelay(3);
1878                                 lsr = serial_in(up, UART_LSR);
1879                                 if(UART_LSR_TEMT == (lsr & UART_LSR_TEMT))
1880                                 {
1881                                         printk("[%d] wait finished: %d, lsr: %d\n", i, (lsr & UART_LSR_TEMT) == UART_LSR_TEMT, lsr);
1882                                         break;
1883                                 }
1884                         }
1885                         gpio_set_value(up->port.rs485.rts_gpio, 0);
1886                 }

rk3568发送485信号,linux,驱动开发,嵌入式硬件,arm

全部修改完成后,重新编译生成boot.img文件,烧写到板子上。文章来源地址https://www.toymoban.com/news/detail-857812.html

到了这里,关于迅为rk3568开发板RS485收发切换 linux485驱动修改的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 迅为RK3568开发板使用OpenCV处理图像-ROI区域-位置提取ROI

    在图像处理过程中,我们可能会对图像的某一个特定区域感兴趣,该区域被称为感兴趣区域(Region of Interest, ROI)。在设定感兴趣区域 ROI 后,就可以对该区域进行整体操作。 位置提取 ROI 本小节代码在配套资料“iTOP-3568 开发板\\03_【iTOP-RK3568 开发板】指南教程\\04_OpenCV 开发配

    2024年02月21日
    浏览(39)
  • Linux驱动开发一、RK3568把hello编译到Linux内核中运行。‘rk_vendor_read’未定义的引用

    1、在字符设备目录下建立hello目录 ~/Linux/rk356x_linux/kernel/drivers/char/hello 2、进入hello目录,新建hello.c、Makefile、Kconfig三个文件 3、Kconfig是打开make menuconfig配置界面是后的选项,这Kconfig是在字符设备下的。 config后面的HELLO就是对应配置后在kernel目录下的**.config中的CONFIG_HELLO配置

    2024年02月11日
    浏览(71)
  • rk3568驱动开发之mipi屏

    屏是嵌入式驱动开发中常见的设备,一般的带屏项目中最开始要调试的,简单记录一下自己在项目开发中的经验过程。所用平台是rockchip的rk3568,android11。 硬件原理图主要看接的是哪个mipi接口,屏的电源控制io,背光控制io,这些需要在设备树中配置的要仔细核对。 PS:以上

    2024年02月12日
    浏览(52)
  • RK系列(RK3568) MIPI屏适配 PWM背光 驱动开发

    平台:Android12 SOC:RK3568 一般拿到MIPI屏 厂家会给一个跑的配置文件  例如我的: 那么可以配置设备树 由于我接的是DSI0 backlight = backlight; 设置背光

    2024年02月07日
    浏览(52)
  • 利用RS485通信、串口收发数据的硬件连接及部分代码

    设计思路:单片机A检测单片机B的功能,单片机B待检测的地方全部引出,然后再将一些功能信息发送到屏幕。单片机A和单片机B之间、单片机A和屏幕(一种可视化编辑的屏幕,规定好通信协议,利用485通信将字符串发送过去就能显示相应的内容,屏幕:TK607ID) 。 注:本文只对

    2024年02月08日
    浏览(49)
  • RK3568平台开发系列讲解(驱动基础篇)自动创建设备节点

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢自动创建设备节点分为两个步骤: 步骤一:使用 class_create 函数创建一个类。 步骤二:使用 device_create 函数在我们创建的类下面创建一个设备。 Linux 驱动实验中,当我们通过 insmod 命令加载模块后,

    2023年04月12日
    浏览(72)
  • 第19章 并发与竞争实验(iTOP-RK3568开发板驱动开发指南 )

    瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网

    2024年02月09日
    浏览(48)
  • 第22章 自旋锁死锁实验(iTOP-RK3568开发板驱动开发指南 )

    瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网

    2024年02月09日
    浏览(50)
  • 正点原子AtomPi-CA1 RK3568的Linux CH340串口驱动安装

    想使用串口,找了半天也没找到它所给的pin的使用示例,淘宝客服说只是硬件兼容树莓派。 想来想去,还是直接接个USB串口最方便。 但是插上不识别,说明没有驱动。 直接在板子上编译没有header依赖,后续下载华硕对应的arm依赖能编译但是驱动不能正常使用。 就在所给虚拟

    2024年03月17日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包