2012-08-15 100 views
2

我目前的任務是將一個驅動程序從QNX移植到Linux的一些16550兼容芯片。該芯片提供了幾個UART,每個都被視爲一個標準的16550串行端口,雖然有一些擴展。命令行配置一個TTY設備

現在,在QNX中,整個設備驅動程序被打包成一個獨立的可執行程序,既可以作爲驅動程序,也可以作爲所提供的UART的初始配置程序(波特率,環回模式等)。這在QNX中很自然因爲設備驅動程序在用戶空間中運行並且比標準可執行文件多一點。

在Linux,OTOH上,驅動程序現在作爲內核模塊實現,可以隨意加載。更多的,這個模塊是由製作人提供的,所以我不想修改或修補它太多。

對我來說,剩下的任務是提供一些機制來設置這些UART的參數。它們被視爲/ dev/ttyPREFIXX設備。我打算通過在感興趣的串行端口上調用一個標準的C程序可執行文件來調用標準termios(即tcsetattr()或ioctls)。

這引出了我的問題:我的方法是對的嗎?如果是,那麼如何實現持久配置?當我認識到這個事實時(從這個例子:http://www.easysw.com/~mike/serial/serial.html),termios函數在OPEN設備上起作用。簡而言之:他們打開設備,設置參數,讀取或寫入參數,然後關閉端口。關閉端口後,配置(波特率等)是否丟失?我希望它不是,因爲它已經存儲在硬件中。

可以somebodey向我確認配置是持久的嗎?如果沒有,如何實現持久性,未來的應用程序將再次打開該端口,並期望它具有一些預先建立的參數?如果沒有,我應該修改模塊內核來接受一些參數,然後在加載時進行配置嗎?

我現在打算的方法是編寫C可執行文件,用於打開端口,設置其配置,然後關閉端口。我希望後面的應用程序將看到具有所需配置的端口。

謝謝。

回答

1

你可能想看看sttysetserial。可敬的Serial-HOWTO(哇,是我最後一次真正向任何人推薦HOWTO的時候?)可能也是一個很好的起點。

+0

謝謝你提到'stty'。你是對的,其中的代碼應該做我想要做的。我主要關心的是設備驅動程序的釋放功能撤消了所有配置,並且在設備關閉時調用此釋放功能。但看着'stty'應該能給我一點啓發。 – user1284631 2012-08-16 06:02:13

0

好了,我在這裏找到了答案:http://www.gnu.org/software/libc/manual/html_node/Mode-Functions.html#Mode-Functions

引用:「雖然tcgetattr和tcsetattr指定一個文件描述符的終端裝置,屬性是那些終端設備本身,而不是文件描述符的這種情況。意味着更改終端屬性的效果是持久的;如果另一個進程稍後打開終端文件,它將看到已更改的屬性,即使它與最初在更改屬性中指定的打開文件描述符沒有任何關係。 「

這就解決了這個問題。