2013-09-26 25 views
2

我想將數據從內核模塊複製到用戶空間,內核模塊從串口接收數據並將其傳輸到DMA,然後DMA將數據轉發到tty層,最後轉發到用戶空間。繞過tty層並複製到用戶

中的電流流動 串行驅動器FIFO - > DMA - > TTY層 - >用戶空間

我想達到什麼(數據到TTY層由DMA在定時器期滿排空)是

串行驅動程序FIFO - > DMA - >用戶空間。 (如果有更好的方法讓我知道,我可以使用定時器將數據發送到用戶空間)

另外,處理serialFIFO-> DMA的內核模塊不是字符設備。 我想完全繞過tty層。最好的辦法是什麼?

任何指針/代碼片段,將不勝感激。

+0

我個人開始尋找驅動程序來尋找其他設備的驅動程序,這些驅動程序通常需要相當的要求,例如嵌入式系統上的同步串行通道(只要確保它是用於普通的linux,而不是uClinux內核的某些快捷方式可以採取)。 –

+0

嗨克里斯,感謝您的意見,它是基於MontaVista的(2.6.32)嵌入式Linux。我尋找這樣一個例子,但沒有找到任何。任何有關使用基於mmap的驅動程序將數據傳遞給用戶空間的想法。我一直在想下面的道路。驅動程序將數據複製到DMA,並從DMA將數據複製(memcpy)到基於mmap的內存,用戶空間程序可從中讀取數據。我也關注該方法的一些問題。即如何通知用戶空間新數據並避免數據被DMA覆蓋/損壞。 – user1867459

+2

*「不是字符設備」* - 那麼它必須是一個**塊**設備,這是沒有意義的。 *「...並將其傳送到DMA」* - DMA是傳送數據的方法,而不是複製的目的地。請解釋你認爲繞過tty層的好處是什麼。你明白你放棄了什麼,例如* tc [gs] etattr()*和朋友?這可能是一個XY問題。你是否想減少延遲?看到這[問題](http://stackoverflow.com/questions/4667141/high-delay-in-rs232-communication-on-a-pxa270)通過使用** ASYNC_LOW_LATENCY **解決 – sawdust

回答

2

In> = 3.10.5所指的「串行FIFO」稱爲uart_port。這些在drivers/tty/serial中定義。

我假設你要做的就是將你的UART的驅動程序複製到一個新的文件中,而不是使用uart_insert_char插入來自UART RX FIFO的字符,你希望將字符插入到你的緩衝區可以從用戶空間訪問。

做到這一點的方法是創建第二個驅動器,具有文件操作,包括mmap一個misc類設備驅動程序,並且分配內核內存與用戶空間的映射內存駕駛員mmap文件操作功能同夥。 Maxime Ripard編寫的代碼爲good example。此示例是爲FIQ處理的設備編寫的,但您可以只使用探測例程的dma_zalloc_coherent調用和mmap例程(調用remap_pfn_range)來執行這個技巧,也就是將misc設備文件上的用戶空間mmap關聯起來與分配的內存。

如果您的misc驅動程序是模塊,您需要使用全局空指針或使用導出符號將您在misc驅動程序中分配的內存連接到您在UART驅動程序中寫入的緩衝區。將指針初始化爲UART驅動程序中已知的無效值並對其進行測試,以確保misc驅動程序在嘗試將字符插入到它所指向的地址之前分配了它。

請注意,由於UART驅動程序類不支持mmap文件操作,因此不能直接向UART驅動程序添加mmap函數。它僅支持在include/linux/serial_core.hstruct uart_ops中定義的操作。

誠然,這是一個麻煩的解決方案 - 設備驅動程序,但另一種方法是寫一個新的設備類,其具有mmap操作的UART裝置,這將是大量的工作與上述解決方案相比雖然它會很優雅。迄今沒有人這樣做過,因爲Jonathan Corbet說的是"...not every device lends itself to the mmap abstraction; it makes no sense, for instance, for serial ports and other stream-oriented devices",儘管這正是你所要求的。

我爲基於mxs-auart.c代碼和Maxime示例的輪詢模式UART驅動程序實現了此解決方案。這是不重要的努力,但主要是因爲我正在使用FIQ處理程序的投票計時器。你應該允許兩到三週的時間來完成整個事情。

問題的DMA方面取決於UART是否支持DMA傳輸模式。如果是這樣,那麼你應該可以使用串行flags來設置它。 i.MX28的PrimeCell auarts支持DMA傳輸,但對於我的應用來說,與直接從UART RX FIFO讀取字節相比,沒有任何優勢。