Linux kernel 绕过tty层并复制到用户

Linux kernel 绕过tty层并复制到用户,linux-kernel,serial-port,linux-device-driver,mamp,dma,Linux Kernel,Serial Port,Linux Device Driver,Mamp,Dma,我想将数据从内核模块复制到用户空间,内核模块从串口接收数据并将其传输到DMA,DMA将数据转发到tty层,最后转发到用户空间 当前的流量是 串行驱动程序FIFO-->DMA-->TTY层-->用户空间(计时器到期时,TTY层的数据将从DMA中清空) 我想要达到的是 串行驱动程序FIFO-->DMA-->用户空间。(我可以使用定时器将数据发送到用户空间,如果有更好的方法,请告诉我) 此外,处理串行FIFO->DMA的内核模块不是字符设备。 我想完全绕过tty层。实现这一目标的最佳方式是什么 任何指

我想将数据从内核模块复制到用户空间,内核模块从串口接收数据并将其传输到DMA,DMA将数据转发到tty层,最后转发到用户空间

当前的流量是 串行驱动程序FIFO-->DMA-->TTY层-->用户空间(计时器到期时,TTY层的数据将从DMA中清空)

我想要达到的是

串行驱动程序FIFO-->DMA-->用户空间。(我可以使用定时器将数据发送到用户空间,如果有更好的方法,请告诉我)

此外,处理串行FIFO->DMA的内核模块不是字符设备。 我想完全绕过tty层。实现这一目标的最佳方式是什么

任何指针/代码片段都将不胜感激

在>=3.10.5中,您所指的“串行FIFO”称为
uart\U端口。这些在
驱动程序/tty/serial
中定义

我假设您要做的是将UART的驱动程序复制到一个新文件中,然后不使用
UART\u insert\u char
从UART RX FIFO插入字符,而是将字符插入一个可以从用户空间访问的缓冲区

实现这一点的方法是创建第二个驱动程序,
misc
类设备驱动程序,它具有文件操作,包括
mmap
,并分配驱动程序的
mmap
文件操作函数与用户空间映射内存关联的内核内存。Maxime Ripard为此编写了一系列代码。本例是为FIQ处理的设备编写的,但您可以仅使用探测例程的
dma_zalloc_coherent
调用和mmap例程,以及它对
remap_pfn_range
的调用,来实现技巧,即将
misc
设备文件上的用户空间mmap与分配内存相关联

如果
misc
驱动程序是一个模块,则需要使用全局无效指针或使用导出符号,将在
misc
驱动程序中分配的内存连接到UART驱动程序中写入的缓冲区。初始化指向UART驱动程序中已知无效值的指针,并对其进行测试,以确保
misc
驱动程序在尝试向其所指向的地址插入字符之前已分配该指针

请注意,您不能直接向UART驱动程序添加
mmap
函数,因为UART驱动程序类不支持
mmap
文件操作。它只支持在include/linux/serial_core.h
struct uart_ops
中定义的操作

诚然,这是一个麻烦的解决方案-两个设备驱动程序,但另一种选择是编写一个新的设备类,一个UART设备,它具有
mmap
操作,与上述解决方案相比,这将是大量的工作,尽管它将是优雅的。迄今为止还没有人这样做,因为正如乔纳森·科比特所说,尽管这正是你所要求的

我基于
mxs auart.c
code和Maxime的示例为轮询模式UART驱动程序实现了这个解决方案。这是一项不平凡的工作,但主要是因为我使用了一个FIQ处理程序作为轮询计时器。你应该有两到三个星期的时间来完成整个项目


问题的DMA方面取决于UART是否支持DMA传输模式。如果是这样,那么您应该能够使用串行
标志设置它。i.MX28的PrimeCell auarts支持DMA传输,但对于我的应用程序来说,直接从UART RX FIFO读取字节没有优势

我个人会首先为另一个具有一般可比要求的设备寻找驱动程序,例如嵌入式系统上的同步串行通道(只需确保它适用于普通linux,而不是可以使用某些快捷方式的uClinux内核)。嗨,克里斯,谢谢你的评论,这是基于MontaVista的(2.6.32)嵌入式linux。我寻找了这样一个示例,但没有找到任何示例。是否考虑使用基于mmap的驱动程序将数据传递到用户空间。我一直在考虑以下路径。驱动程序将数据复制到DMA,并从DMA复制数据(memcpy)到基于mmap的内存,用户空间程序可以从中读取数据。我还关心该方法的一些问题。例如,如何通知用户空间新数据,避免DMA覆盖/损坏数据。“不是字符设备”-那么它必须是块设备,没有意义。“…并将其传输到DMA”--DMA是一种传输数据的方法,而不是复制的目的地。请解释一下你认为绕过tty层的好处是什么。你明白你放弃了什么吗,例如tc[gs]etattr()和friends?这可能是一个XY问题。你是否在尝试减少延迟?请参阅使用ASYNC_LOW_延迟来解决这个问题