在上一章我們已經說明了uart驅動的開發流程,本章我們就不再介紹uart相關的接口實現,僅通過實現一個虛拟的串口控制器程序,用以說明虛拟串口的開發流程。
本次開發的虛拟串口提供的功能如下:
本次開發的代碼涉及的模塊包括:
在虛拟串口驅動中,定義了數據結構virtual_uart_port,該數據結構中包含了uart_port。并定義了tx_enable_flag、rx_enable_flag,分别用于控制串口收發,因是虛拟串口所以使用這兩個變量進行表示,若是真是的串口控制器,則不需要這兩個變量,而隻需要在uart_ops->startup、uart_ops->stop_rx、uart_ops->stop_tx中關閉中斷即可,這兩個變量由自旋鎖write_lock進行保護。
定義virtual_uart_driver,本串口控制器驅動支持的串口個數為MAX_VIRTUAL_UART(6個)、而dev_name則為該虛拟串口對應字符設備文件名稱的前綴,本次定義前綴為“vttyU”,本串口不支持控制台。調用uart_register_driver即完成本串口控制器驅動的注冊與注銷
本次我們主要完成了串口的注冊,因此我們定義并注冊了兩個platform device,而傳遞的參數為串口的index的。接口定義如下所示,platform device的name為“virtual_uart_port_dev”,根據該名稱可完成與platform driver的匹配及探測功能(因我們在ubuntu16.04下完成的驗證,沒有設備樹概念,因此就定義了這兩個platform device,若支持設備樹,則無須我們手動定義這兩個platform device,隻需要修改設備樹文件即可)。
我們的platform driver的定義如下,支持probe、remove接口,probe接口主要完成uart port的注冊、remove接口主要完成uart port注銷,該platform driver的name為“virtual_uart_port_dev”,通過該名稱可進行platform device與platform driver的匹配檢測,同時我們也定義了of_device_id,若内核支持設備樹,則在設備樹中的compatible中也設置“jerry_chg,virtual-uart”,即可完成platform device與platform driver的匹配檢測。
virtual_uart_port_platform_probe接口的定義如下,主要實現的功能如下:
我們為虛拟串口定義的操作接口如下
而set_mctrl接口則一定要定義,即使是一個空函數也要定義。
模拟串口接收功能實現因為我們是虛拟串口,但是又要模拟串口接收功能,因此我們在tty port對應的device中,定義了模拟串口接收數據的屬性文件,定義如下:
當用戶向該屬性文件(uart_receive_buff)中寫數據時,則在該屬性文件的store接口中,将寫入的數據發送到tty_port的接收緩存中,并通過調用tty_flip_buffer_push接口,将tty_port接收緩存中的數據通過線路規程的receive_buff接口将數據刷新到tty_struct的接收緩存中,并wakeup讀等待隊列中sleep的讀線程(這一系統的操作流程可參考我之前寫的幾篇文檔),即将數據發送的該串口上的讀線程中。
我們可以通過如下腳本向uart_receive_buff寫數據,從而模拟串口接收數據
至此我們完成了虛拟串口驅動代碼的實現以及驗證工作,我們也完成了tty子系統、uart子系統架構内部實現流程的分析,也完成了對應虛拟控制器驅動的實現及驗證,下一次我們開始進行input子系統的分析(關于本驅動的源碼,後續我們會把鍊接發出來)。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!