【发布时间】:2013-09-26 16:08:49
【问题描述】:
我想将数据从内核模块复制到用户空间,该内核模块从串口接收数据并将其传输到 DMA,然后将数据转发到 tty 层,最后到用户空间。
当前流量是 串口驱动FIFO--> DMA-->TTY层-->用户空间(到tty层的数据在定时器到期时从DMA清空)
我想要达到的是
串行驱动FIFO-->DMA-->用户空间。 (我可以使用计时器将数据发送到用户空间,如果有更好的方法请告诉我)
处理serialFIFO->DMA的内核模块也不是字符设备。 我想完全绕过 tty 层。实现这一目标的最佳方法是什么?
任何指针/代码 sn-p 将不胜感激。
【问题讨论】:
-
我个人会首先为另一个具有类似要求的设备寻找驱动程序,例如用于嵌入式系统上的同步串行通道的驱动程序(只要确保它适用于普通的 linux,而不是uClinux内核,可以使用某些快捷方式)。
-
嗨,克里斯,感谢您的 cmets,它适用于基于 MontaVista (2.6.32) 的嵌入式 linux。我找了一个这样的例子,但没有找到。关于使用基于 mmap 的驱动程序将数据传递到用户空间的任何想法。我一直在思考以下路径。驱动程序会将数据复制到 DMA,然后从 DMA 将数据复制(memcpy)到基于 mmap 的内存,用户空间程序可以从中读取数据。我也担心这种方法的一些问题。即如何通知用户空间有新数据并避免数据被 DMA 覆盖/损坏。
-
"is not a character device" -- 那么它必须是一个block 设备,这没有意义。 "...并将其传输到 DMA" -- DMA 是一种传输数据的方法,而不是复制的目的地。请解释您认为绕过 tty 层的好处是什么。你明白你放弃了什么吗? tc[gs]etattr() 和朋友?这可能是一个 XY 问题。您是否正在尝试减少延迟?请参阅使用 ASYNC_LOW_LATENCY 解决的 question
标签: linux-kernel serial-port linux-device-driver mamp dma