10

你好Linux內核驅動程序大師!訪問串口從一個Linux內核模塊

我正在寫一個使用串行接口,用於配置攝像頭的V4L2驅動。我希望驅動程序配置攝像頭,因爲它可以讓客戶端代碼在各個攝像頭模型中保持一致。問題是:從驅動模塊訪問攝像機串行接口的最佳方式是什麼?

據我所知,從內核驅動程序訪問文件是一大禁忌,但它可以做到的。因此,我目前使用下面的代碼片段,但感覺像是一個黑客。

oldfs = get_fs(); 
set_fs(KERNEL_DS); 

fd->f_pos=0; 
fd->f_op->write(fd, data, data_len, &fd->f_pos); 

set_fs(oldfs); 

我的問題是:真正做到這一點的正確方法是什麼?

回答

4

我相信,既然有串口的參與,這一定是某種嵌入式系統。畢竟,沒有多少PC甚至有串口。我還假定串行端口可以被認爲是永久連接,至少從用戶的角度來看。如果那是真的,那麼你真的不需要TTY設備。您想要將該設備作爲專用UART訪問。

如果你看看歐勝的音頻編解碼器(聲音/ SOC/WM的* .c),你會看到,主要傳達了I2S但對配置的輔助I2C接口的設備的一個例子。我相信這在概念上是你想要的。該驅動程序爲軟件提供統一的界面,並向任何適合的硬件發佈命令。顯然這比將硬件實現細節公開給用戶空間要簡單得多。

我無法找到這種方式工作的內核中UART驅動程序的一個很好的例子,但我希望我所描述尋找什麼。從實用而非純粹的技術角度來看,從內核執行文件I/O可能會更好。

+0

感謝:歐勝微驅動器是很好的例子。目前還不清楚如何最好地使用UART(我真的不想重寫UART驅動!),但這是一個很好的開始。謝謝! – IndigoFire 2011-04-18 20:55:29

1

首先,我建議你找到一種方法,從用戶空間如果有可能做到這一點:你什麼嘗試在這裏實現真正的內核代碼中的用戶空間代碼。

但是如果你沒有找到一個方法來做到這一點,這article告訴您如何做內核空間用戶空間的調用。

既然你要訪問一個串行端口,你應該有一個TTY導向,例如用於開啓來電:

serial_fd = sys_open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK)) 
+0

我明白,這確實應該是在用戶空間,所以我想的問題是:我怎麼能有一個用v412驅動器,接收讀寫控制來控制變焦,需要發送通過串口命令? – IndigoFire 2011-03-22 15:48:45

+0

感謝您的偉大的文章!它解釋了很多我在內核和用戶空間中不理解的東西。 – IndigoFire 2011-03-22 15:49:25