- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 ARM iMX6 处理器的嵌入式 Linux 设备上进行开发。主要目的是从外部源读取传入的串行流。
由于串行流的非典型性质,我在 Linux serial driver 方面遇到了一些障碍。对于imx处理器。但没有什么超出 iMX6 的能力。例如,传入的串行流是反转逻辑。 iMX6 有一个特定的寄存器设置来反转 RX 信号。据我所知,Linux 驱动程序没有公开它。
另一个复杂之处是传入的串行数据以 3ms 突发的形式到达。外部源连续传输 3ms,然后 3ms 空闲,然后 3ms 数据,然后空闲,等等。为了与每个突发的第一个字节同步,能够检测线路何时空闲是非常有用的。同样,iMX6 有一个寄存器值专门用于指示 RX 线路空闲,但 Linux 驱动程序不会公开它。
我也很困惑驱动程序中的缓冲是如何工作的。我知道 iMX6 有一个 32 字节 FIFO 缓冲区,但我无法判断驱动程序是否使用该缓冲区或使用外部 RAM 进行缓冲。我遇到了一个问题,当我处于阻塞模式时,read
命令经常挂起一秒钟,而这种情况永远不会发生,因为数据流是连续的。
作为引用,以下是我在 C 代码中配置串行端口并读取 50 个字节的方法(我现在已将其更改为非阻塞):
#include <stropts.h>
#include <asm/termios.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
int fd;
struct termios2 terminal;
unsigned char v[50];
fd = open ("/dev/ttymxc2", O_RDONLY | O_NOCTTY | O_NONBLOCK );
ioctl(fd, TCGETS2, &terminal);
terminal.c_cflag |= (CLOCAL | CREAD) ;
terminal.c_cflag |= PARENB ; //enable parity
terminal.c_cflag &= ~PARODD ; //even parity
terminal.c_cflag |= CSTOPB ; //2 stop bits
terminal.c_cflag &= ~CSIZE ;
terminal.c_cflag |= CS8 ;
terminal.c_lflag &= ~(ICANON | IEXTEN | ECHO | ECHOE | ISIG) ;
terminal.c_oflag &= ~OPOST ;
terminal.c_cflag &= ~CBAUD;
terminal.c_cflag |= BOTHER;
terminal.c_ispeed = 100000; //100kHz baud
terminal.c_ospeed = 100000;
ioctl(fd, TCSETS2, &terminal);
...
for(i=0;i<50;i++)
{
read(fd,v+i,1)
}
...
}
所以我有两个问题:
从处理器可用但驱动程序未公开的串行端口获取功能的“正确”方法是什么?我无法想象我是第一个想要使用处理器如此基本功能的人,但我不想重新发明轮子。我需要编写自己的驱动程序吗?
是否存在有关 iMX 串行驱动程序的综合文档?该代码的注释很差,我很快就迷失了方向,试图找到解决它的方法。例如,我不知道从哪里开始调查导致其在接收连续数据流时挂起的缓冲问题。
最佳答案
我完全放弃了串行驱动程序,而是编写了一些函数来直接访问寄存器内存(以 devmem2.c 源代码为模型)。现在我可以直接设置 INVR 位来反转 RX 信号,使用 IDLE 位来检测线路何时空闲,并在传入的数据字节到达后立即检索它们,而无需延迟。
我在另一个论坛上发现了一些关于 UART DMA 需要 RX 线路空闲至少 8ms 才能为缓冲区提供服务的信息。这显然是我遇到 1 秒延迟的原因。
关于drivers - iMX 处理器上的串行驱动程序限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41458330/
我正在使用 ARM iMX6 处理器的嵌入式 Linux 设备上进行开发。主要目的是从外部源读取传入的串行流。 由于串行流的非典型性质,我在 Linux serial driver 方面遇到了一些障碍
尝试获取一个可工作的 directfb,用于基于运行 Linux 2.6.35.3(由 Freescale 提供)的 i.MX53 处理器(ARM Cortex-A8 内核)的嵌入式系统。 我在 i6
我试图了解嵌入式 Linux 原理,但无法在 u-boot 输出中找出地址。 如何找到U-boot的起始地址? 例如,我有基于 i.MX6 四核处理器的 MX6-SabreSD 板,我从 U-Boot
我有一个在 imx CPU 上运行的自定义构建 linux 2.6。 CAN 与外部节点的通信非常有效,但是当在终端中使用“candump can0”时(当我使用 usb-CAN 加密狗在我的主机上运
我是一名优秀的程序员,十分优秀!