就是塔塔的个人空间 https://www.eechina.com/space-uid-136863.html [收藏] [复制] [RSS]

博客

iTOP-4418开发板RS85模块ioctl操作时间间隔修改

已有 655 次阅读2022-6-13 10:36

本章节主要介绍 RS485 驱动如何修改 ioctl 操作间隔的参数,通过 ioctl 控制模块数据传输方向的时间间隔修改方法。适用于 iTOP-4412 精英版、iTOP-4412 全能版、iTOP-4418/6818 全能版、 iTOP-iMX6Q/D全能版等。
以 iTOP-4412 开发板的 RS485 模块为例,其它系列开发板 RS485 模块在底板上,硬件原理和驱动代码是一模一样的。如下图所示,串口转 RS485 的模块为 “SN65HVD3082”,pin2 和 pin3 管脚,用于控制 RS485 发送和接收的方向。

在 RS485 的 C 测试例程中,ioctl 控制的 RS485 设备节点为“/dev/max485_ctl_pin”
设备节点赋值的代码为:
char *max485_ctl = "/dev/max485_ctl_pin";
如下图所示,函数“prepare_to_send”和“prepare_to_recv”,RS485 模块在准备发送和接收数据前,都需要调用对应 的发送准备函数和接收准备函数 ,其中控制发送和接收的,就 是 RS485 模块
“SN65HVD3082”的 pin2 和 pin3 管脚,控制 pin2 和 pin3 的高低就可以控制方向。
如果用户自己更新 RS485 的应用程序,会发现这个管脚高低电平切换最少需要 100ms,不能短于这个时间。

ioctl 函数就涉及到 RS485 驱动,RS485 模块的驱动是内核源码下的

“drivers/char/max485_ctl.c”文件。RS485 驱动文件中,ioctl 相关代码如下所示。

long max485_ctl_ioctl(struct file *filp,unsigned int cmd,unsigned long arg)

{

printk("firecxx debug: max485_ctl_ioctl cmd is %d\n" , cmd);

switch(cmd)

{

case 1:

if(gpio_request(EXYNOS4_GPA0(7) ,"GPA0_7"))

{

DPRINTK("max485_ctl GPIO err!\r\n");

}

else

{

gpio_direction_output(EXYNOS4_GPA0(7), 1);

DPRINTK("max485_ctl Set High!\n");

gpio_free(EXYNOS4_GPA0(7));

mdelay(100);

}

break;

case 0:

if(gpio_request(EXYNOS4_GPA0(7) ,"GPA0_7"))

{

DPRINTK("max485_ctl GPIO err!\r\n");

}

else

{

gpio_direction_output(EXYNOS4_GPA0(7),0);

DPRINTK("max485_ctl Set Low!\n");

gpio_free(EXYNOS4_GPA0(7));

mdelay(100);

}

break;

default:

DPRINTK("max485_ctl COMMAND ERROR!\n");

return -ENOTTY;

}

return 0;

}

如上代码所示,红色部分是导致上层应用调用 ioctl 间隔至少 100ms,硬件管脚高低切换至少为 100ms的原因。

如果用户切换数据发送和接收的状态少于 100ms,可以将其 mdelay(100);注释,然后重新编译内核镜像烧写到开发板。但是请务必注意的是,发送和接收之间切换的时候,请务必在应用程序中根据实际情况给一定的延时,延时的大小,用户需要根据自己实际应用来调整,否则会出现丢数据的情况。

更多内容关注:北京迅为


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
返回顶部