網上有很多關于u米電簽版pos機注冊流程,linux串口子系統中串口設備注冊與注銷以及串口開發流程說明的知識,也有很多人為大家解答關于u米電簽版pos機注冊流程的問題,今天pos機之家(www.bangarufamily.com)為大家整理了關于這方面的知識,讓我們一起來看下吧!
本文目錄一覽:
u米電簽版pos機注冊流程
上一章我們介紹了串口的數據結構,本章我們介紹串口相關的操作接口,并介紹串口的注冊與注銷接口,本章主要包括如下幾個方面的內容:
串口控制器、串口的注冊與注銷串口子系統操作接口的介紹說明串口驅動開發流程說明串口子系統架構總結串口控制器、串口的注冊與注銷既然串口子系統是對tty子系統的封裝,因此其注冊與注銷也同樣包括tty_driver、tty_port兩部分。在之前閱讀tty子
系統時,我們可以發現真正實現讀寫tty端口的操作全部是由tty_driver數據結構中的操作接口實現的,而tty_port中僅僅是實現具體tty端口的使能與去使能等操作。而在串口子系統中,為了減少開發量,同時又要對接tty子系統,串口子系統內部為tty_driver注冊了通用的操作接口,而把不同串口控制器操作接口的操作又移至uart_port->ops接口中,從而使串口驅動的開發只需要關注uart_potr->ops即可,無需再同時關注tty_driver->ops、tty_port->ops。
串口控制器驅動注冊與注銷針對串口控制器驅動,其注冊接口為uart_register_driver,而針對uart_driver的注冊,開發人員主要需要設置
uart_driver的driver_name、dev_name、nr、cons,其中dev_name、nr表示串口的名稱前綴、串口個數,而cons則表示該串口控制器是否支持控制臺功能,若支持控制臺則設置該變量。
如下就是uart_driver的注冊接口,其實現的功能較簡單,主要功能如下:
調用alloc_tty_driver申請tty_driver類型的內存,并設置tty_driver的各成員變量,同時設置其ops成員為uart_ops;根據串口的個數,為每一個串口申請對應的uart_state類型的內存空間(也就完成了對應tty_port的創建),用于存儲每一個串口的資源相關的信息以及串口對應tty_port信息,并為tty_port設置其ops成員為uart_port_ops;我們知道tty_port中包含接收數據的緩存,但卻沒有發送數據的緩存,而uart_state中則包含了發送數據的緩存(即環形緩存區),因此借助uart_state、tty_port則實現了串口收發數據的緩存(在我們之前實現的虛擬串口中也定義了數據發送的buff,只不過是使用kfifo實現的)。
從上面的代碼我們可以看到,針對所有的uart_driver,其tty_driver成員的ops都設置為uart_ops接口,而uart_ops的定義如下,下面簡要說明下其實現的功能:
open、close用于開啟和關閉串口,通過調用struct uart_ops的startup、stop_rx、stop_tx,實現串口的開啟與關閉操作;write接口實現將數據從串口發送出去(當然在uart_write中先將數據寫入環形緩沖區中,再調用uart_port->ops->start_tx接口,實現數據的發送);uart_put_char接口主要將一個字節的數據拷貝到該串口的發送緩存中;Flush_chars接口的作用是將串口發送緩沖中的數據發送出去(調用uart_port->ops->start_tx接口,實現真正的數據發送);uart_write_room、uart_chars_in_buffer主要用于返回發送緩存中可用空間、已使用空間的字節數等;uart_flush_buffer接口主要用于flush該串口的發送緩存,并喚醒寫等待隊列;uart_throttle、uart_unthrottle主要是實現流控(包括硬件流控和軟件流控,其中軟件流控則通過定義一個特殊字符作為流控約束的標志位);uart_set_termios接口主要是termios設置,包括輸入、輸出參數設置、控制參數設置等,如上面說的軟件流控中start、stop標志字符的設置,還包括串口波特率的設置、CRTSCTS、字節寬度的設置等等;uart_stop、uart_start、uart_hangup則主要串口停止、啟動、掛起相關的接口,內部也是調用uart_port->ops->stop、start停止或啟動一個發送操作;而uart_hangup則主要是掛起操作;uart_tiocmget、uart_tiocmset則主要是modem ctrl相關的操作接口。在主要的接口中,也設置了tty_port->ops成員,我們看下uart定義的tty_port操作接口函數,這幾個接口也捎帶說明下:
針對activate,在tty子系統中,主要在tty_port_open中調用,實現tty端口的啟用,但針對uart子系統而言,在其uart_tty_driver->open接口中,并沒有調用tty_port_open接口,取而代之的是uart_startup、uart_ops->start,因此只需要實現uart_ops->start接口即可,此處定義的uart_port_activate并不會被調用,沒有意義。。。針對shutdown接口而言,在tty子系統中,主要是在tty_port_close接口中調用,而針對uart_tty_driver->close接口中,也沒有調用uart_port_ops->shutdown接口(即uart_port_shutdown)因此此處設置的activate、shutdown,沒有任何意義,沒有必要設置這兩個變量
串口的注冊接口串口的注冊接口為uart_add_one_port,該接口的定義如下,主要功能說明如下:
完成uart_state與uart_port的互相關聯;調用uart_configure_port,配置該串口(如mem、io資源的申請等);調用tty_port_register_device_attr接口,完成tty_port與tty_driver的關聯,并調用device_register完成tty_port對應device的注冊,同時該動作也完成了tty_port對應device與tty_class的關聯,同時也完成tty對應字符設備的創建(通過向應用層發送kobject add uevent,而udevd、mdev在接收到該uevent后,根據設備節點至,通過調用mknod接口完成設備文件inode的創建,也就完成了字符設備文件的創建),同時也為該tty端口對應的device創建了uart相關的屬性信息(即tty_dev_attr_groups)在uart port的注冊時,為其對應的device創建了屬性文件(即tty_dev_attr_groups),我們看下tty_dev_attr_groups的定義。包含的屬性如下所示,包括串口類型、index、端口的iobase、中斷、flag、發送fifo大小、uart clk、iomem_base等,當我們需要獲取一個串口詳細信息時,可進入串口對應的sysfs文件下對應文件中查看(我之前實現的虛擬串口也創一個文件屬性,用于模擬向虛擬串口發送,當時是調用sysfs_create_group實現的,其實tty_port_register_device_attr接口即可實現tty port注冊+創建屬性文件,哎,我沒看這個接口啊…)。
串口子系統操作接口的介紹說明串口子系統提供的操作接口包含uart_open、uart_close、uart_write、uart_put_char uart_flush_chars、uart_write_room、uart_chars_in_buffer、uart_flush_buffer、uart_ioctl、uart_throttle、uart_unthrottle等接口,在上面也做了簡要說明,此處則對應uart_open、uart_write這兩個接口進行一個說明
uart_open接口一般針對tty_driver->open接口而言,基本上就是調用tty_port_open接口,增加tty_port的引用計數、完成tty_port與tty_struct的關聯,并調用tty_port->ops->active接口,使能該tty端口;而在串口的open函數中,雖然沒有調用tty_port_open接口,但也實現了其中的tty_port的引用計數、完成tty_port與tty_struct的關聯,也調用tty_port_block_til_ready等待該串口可用。因沒有調用tty_port->ops->active接口,uart_open則通過調用uart_startup使能一個串口。
下面看下該接口的實現,該接口實現如下流程圖(省略了異常判斷),主要功能如下:
增加tty_port的引用計數(即tty_port->count++);完成tty_struct與uart_state的關聯、uart_port與uart_state的關聯;完成tty_port與tty_struct的關聯(在此之前tty_struct已完成tty_port),至此完成tty_port與tty_struct的相互關聯調用uart_startup,用于啟動一個串口,在uart_startup接口中,通過間接調用uart_port->ops->startup、uart_port->ops->set_termios完成一個端口的開啟,并完成termios相關參數的設置(如波特率等)。最后調用tty_port_block_til_ready,用于等待一個tty端口準備好(若該串口正處于關閉狀態,則等該串口關閉完成后,則返回失??;若該串口是通過非阻塞模式打開,則返回打開成功;若該串口為阻塞打開,則必須等待已打開該串口的進程關閉該串口后,方能返回)而tty_port_block_til_ready的作用如下:
若該端口處于hangup或者處于關閉狀態中,則將該進程加入到close_wait等待隊列,待hangup結束后,則返回EAGAIN;待close完成被喚醒后,則返回ERESTARTSYS;若非上述情況,且是非阻塞,則設置port的標簽為ASYNC_NORMAL_ACTIVE,并返回;若非1中情況,且是第一次打開,則設置port的標簽為ASYNC_NORMAL_ACTIVE,并返回;若為阻塞,且不是上述1.2.3中情況,則當前進程等待,并加入open_wait,待上一個進程關閉后,本進程被喚醒,并繼續執行打開操作。 uart_write接口該接口的實現比較簡單,代碼如下:
將待發送的數據寫入環形緩沖區;調用uart_start,啟動一次發送操作,而uart_start接口則主要調用uart_port->ops->start_tx接口,由具體串口設備的start_tx接口啟動一次發送(如在該接口中使能tx中斷,實現tx中斷觸發,而在tx中斷處理函數中完成一次發送)串口驅動開發流程說明在module_init標識的初始化函數中,調用uart_register_driver,完成uart_driver的注冊,主要設置串口字符設備文件名稱的前綴、串口個數的設置等;創建一個platform_driver,在platform_driver的probe接口中,獲取待注冊串口信息的資源信息,并定義struct uart_ops中各函數,并調用uart_add_one_port完成uart port的注冊;為每一個待注冊的串口設備,創建一個platform device,并傳遞該串口相關的信息(若內核支持設備樹,開發人員無需事先該步,只需在設備樹中增加相應串口信息即可)。基本上完成以上幾步,即完成了一個串口驅動,其實最主要的就是實現struct uart_ops中各成員函數指針。下一章我們來完成一個虛擬的串口設備及其驅動。
串口子系統架構總結
串口子系統針對所有串口,完成了統一的tty_driver的變量的實現,而將每一個串口需要實現的內容全部移至uart_port、uart_pos中,而無需實現tty_driver的操作接口、tty_port的操作接口(均由串口子系統內部實現)。相對于tty子系統而言,確實方便了一些。
以上就是關于u米電簽版pos機注冊流程,linux串口子系統中串口設備注冊與注銷以及串口開發流程說明的知識,后面我們會繼續為大家整理關于u米電簽版pos機注冊流程的知識,希望能夠幫助到大家!
