u米電簽版pos機(jī)注冊(cè)流程

 新聞資訊3  |   2023-09-05 10:03  |  投稿人:pos機(jī)之家

網(wǎng)上有很多關(guān)于u米電簽版pos機(jī)注冊(cè)流程,linux串口子系統(tǒng)中串口設(shè)備注冊(cè)與注銷以及串口開發(fā)流程說明的知識(shí),也有很多人為大家解答關(guān)于u米電簽版pos機(jī)注冊(cè)流程的問題,今天pos機(jī)之家(m.afbey.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來看下吧!

本文目錄一覽:

1、u米電簽版pos機(jī)注冊(cè)流程

u米電簽版pos機(jī)注冊(cè)流程

上一章我們介紹了串口的數(shù)據(jù)結(jié)構(gòu),本章我們介紹串口相關(guān)的操作接口,并介紹串口的注冊(cè)與注銷接口,本章主要包括如下幾個(gè)方面的內(nèi)容:

串口控制器、串口的注冊(cè)與注銷串口子系統(tǒng)操作接口的介紹說明串口驅(qū)動(dòng)開發(fā)流程說明串口子系統(tǒng)架構(gòu)總結(jié)串口控制器、串口的注冊(cè)與注銷

既然串口子系統(tǒng)是對(duì)tty子系統(tǒng)的封裝,因此其注冊(cè)與注銷也同樣包括tty_driver、tty_port兩部分。在之前閱讀tty子

系統(tǒng)時(shí),我們可以發(fā)現(xiàn)真正實(shí)現(xiàn)讀寫tty端口的操作全部是由tty_driver數(shù)據(jù)結(jié)構(gòu)中的操作接口實(shí)現(xiàn)的,而tty_port中僅僅是實(shí)現(xiàn)具體tty端口的使能與去使能等操作。而在串口子系統(tǒng)中,為了減少開發(fā)量,同時(shí)又要對(duì)接tty子系統(tǒng),串口子系統(tǒng)內(nèi)部為tty_driver注冊(cè)了通用的操作接口,而把不同串口控制器操作接口的操作又移至uart_port->ops接口中,從而使串口驅(qū)動(dòng)的開發(fā)只需要關(guān)注uart_potr->ops即可,無需再同時(shí)關(guān)注tty_driver->ops、tty_port->ops。

串口控制器驅(qū)動(dòng)注冊(cè)與注銷

針對(duì)串口控制器驅(qū)動(dòng),其注冊(cè)接口為uart_register_driver,而針對(duì)uart_driver的注冊(cè),開發(fā)人員主要需要設(shè)置

uart_driver的driver_name、dev_name、nr、cons,其中dev_name、nr表示串口的名稱前綴、串口個(gè)數(shù),而cons則表示該串口控制器是否支持控制臺(tái)功能,若支持控制臺(tái)則設(shè)置該變量。

如下就是uart_driver的注冊(cè)接口,其實(shí)現(xiàn)的功能較簡單,主要功能如下:

調(diào)用alloc_tty_driver申請(qǐng)tty_driver類型的內(nèi)存,并設(shè)置tty_driver的各成員變量,同時(shí)設(shè)置其ops成員為uart_ops;根據(jù)串口的個(gè)數(shù),為每一個(gè)串口申請(qǐng)對(duì)應(yīng)的uart_state類型的內(nèi)存空間(也就完成了對(duì)應(yīng)tty_port的創(chuàng)建),用于存儲(chǔ)每一個(gè)串口的資源相關(guān)的信息以及串口對(duì)應(yīng)tty_port信息,并為tty_port設(shè)置其ops成員為uart_port_ops;

我們知道tty_port中包含接收數(shù)據(jù)的緩存,但卻沒有發(fā)送數(shù)據(jù)的緩存,而uart_state中則包含了發(fā)送數(shù)據(jù)的緩存(即環(huán)形緩存區(qū)),因此借助uart_state、tty_port則實(shí)現(xiàn)了串口收發(fā)數(shù)據(jù)的緩存(在我們之前實(shí)現(xiàn)的虛擬串口中也定義了數(shù)據(jù)發(fā)送的buff,只不過是使用kfifo實(shí)現(xiàn)的)。

從上面的代碼我們可以看到,針對(duì)所有的uart_driver,其tty_driver成員的ops都設(shè)置為uart_ops接口,而uart_ops的定義如下,下面簡要說明下其實(shí)現(xiàn)的功能:

open、close用于開啟和關(guān)閉串口,通過調(diào)用struct uart_ops的startup、stop_rx、stop_tx,實(shí)現(xiàn)串口的開啟與關(guān)閉操作;write接口實(shí)現(xiàn)將數(shù)據(jù)從串口發(fā)送出去(當(dāng)然在uart_write中先將數(shù)據(jù)寫入環(huán)形緩沖區(qū)中,再調(diào)用uart_port->ops->start_tx接口,實(shí)現(xiàn)數(shù)據(jù)的發(fā)送);uart_put_char接口主要將一個(gè)字節(jié)的數(shù)據(jù)拷貝到該串口的發(fā)送緩存中;Flush_chars接口的作用是將串口發(fā)送緩沖中的數(shù)據(jù)發(fā)送出去(調(diào)用uart_port->ops->start_tx接口,實(shí)現(xiàn)真正的數(shù)據(jù)發(fā)送);uart_write_room、uart_chars_in_buffer主要用于返回發(fā)送緩存中可用空間、已使用空間的字節(jié)數(shù)等;uart_flush_buffer接口主要用于flush該串口的發(fā)送緩存,并喚醒寫等待隊(duì)列;uart_throttle、uart_unthrottle主要是實(shí)現(xiàn)流控(包括硬件流控和軟件流控,其中軟件流控則通過定義一個(gè)特殊字符作為流控約束的標(biāo)志位);uart_set_termios接口主要是termios設(shè)置,包括輸入、輸出參數(shù)設(shè)置、控制參數(shù)設(shè)置等,如上面說的軟件流控中start、stop標(biāo)志字符的設(shè)置,還包括串口波特率的設(shè)置、CRTSCTS、字節(jié)寬度的設(shè)置等等;uart_stop、uart_start、uart_hangup則主要串口停止、啟動(dòng)、掛起相關(guān)的接口,內(nèi)部也是調(diào)用uart_port->ops->stop、start停止或啟動(dòng)一個(gè)發(fā)送操作;而uart_hangup則主要是掛起操作;uart_tiocmget、uart_tiocmset則主要是modem ctrl相關(guān)的操作接口。

在主要的接口中,也設(shè)置了tty_port->ops成員,我們看下uart定義的tty_port操作接口函數(shù),這幾個(gè)接口也捎帶說明下:

針對(duì)activate,在tty子系統(tǒng)中,主要在tty_port_open中調(diào)用,實(shí)現(xiàn)tty端口的啟用,但針對(duì)uart子系統(tǒng)而言,在其uart_tty_driver->open接口中,并沒有調(diào)用tty_port_open接口,取而代之的是uart_startup、uart_ops->start,因此只需要實(shí)現(xiàn)uart_ops->start接口即可,此處定義的uart_port_activate并不會(huì)被調(diào)用,沒有意義。。。針對(duì)shutdown接口而言,在tty子系統(tǒng)中,主要是在tty_port_close接口中調(diào)用,而針對(duì)uart_tty_driver->close接口中,也沒有調(diào)用uart_port_ops->shutdown接口(即uart_port_shutdown)

因此此處設(shè)置的activate、shutdown,沒有任何意義,沒有必要設(shè)置這兩個(gè)變量

串口的注冊(cè)接口

串口的注冊(cè)接口為uart_add_one_port,該接口的定義如下,主要功能說明如下:

完成uart_state與uart_port的互相關(guān)聯(lián);調(diào)用uart_configure_port,配置該串口(如mem、io資源的申請(qǐng)等);調(diào)用tty_port_register_device_attr接口,完成tty_port與tty_driver的關(guān)聯(lián),并調(diào)用device_register完成tty_port對(duì)應(yīng)device的注冊(cè),同時(shí)該動(dòng)作也完成了tty_port對(duì)應(yīng)device與tty_class的關(guān)聯(lián),同時(shí)也完成tty對(duì)應(yīng)字符設(shè)備的創(chuàng)建(通過向應(yīng)用層發(fā)送kobject add uevent,而udevd、mdev在接收到該uevent后,根據(jù)設(shè)備節(jié)點(diǎn)至,通過調(diào)用mknod接口完成設(shè)備文件inode的創(chuàng)建,也就完成了字符設(shè)備文件的創(chuàng)建),同時(shí)也為該tty端口對(duì)應(yīng)的device創(chuàng)建了uart相關(guān)的屬性信息(即tty_dev_attr_groups)

在uart port的注冊(cè)時(shí),為其對(duì)應(yīng)的device創(chuàng)建了屬性文件(即tty_dev_attr_groups),我們看下tty_dev_attr_groups的定義。包含的屬性如下所示,包括串口類型、index、端口的iobase、中斷、flag、發(fā)送fifo大小、uart clk、iomem_base等,當(dāng)我們需要獲取一個(gè)串口詳細(xì)信息時(shí),可進(jìn)入串口對(duì)應(yīng)的sysfs文件下對(duì)應(yīng)文件中查看(我之前實(shí)現(xiàn)的虛擬串口也創(chuàng)一個(gè)文件屬性,用于模擬向虛擬串口發(fā)送,當(dāng)時(shí)是調(diào)用sysfs_create_group實(shí)現(xiàn)的,其實(shí)tty_port_register_device_attr接口即可實(shí)現(xiàn)tty port注冊(cè)+創(chuàng)建屬性文件,哎,我沒看這個(gè)接口啊…)。

串口子系統(tǒng)操作接口的介紹說明

串口子系統(tǒng)提供的操作接口包含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等接口,在上面也做了簡要說明,此處則對(duì)應(yīng)uart_open、uart_write這兩個(gè)接口進(jìn)行一個(gè)說明

uart_open接口

一般針對(duì)tty_driver->open接口而言,基本上就是調(diào)用tty_port_open接口,增加tty_port的引用計(jì)數(shù)、完成tty_port與tty_struct的關(guān)聯(lián),并調(diào)用tty_port->ops->active接口,使能該tty端口;而在串口的open函數(shù)中,雖然沒有調(diào)用tty_port_open接口,但也實(shí)現(xiàn)了其中的tty_port的引用計(jì)數(shù)、完成tty_port與tty_struct的關(guān)聯(lián),也調(diào)用tty_port_block_til_ready等待該串口可用。因沒有調(diào)用tty_port->ops->active接口,uart_open則通過調(diào)用uart_startup使能一個(gè)串口。

下面看下該接口的實(shí)現(xiàn),該接口實(shí)現(xiàn)如下流程圖(省略了異常判斷),主要功能如下:

增加tty_port的引用計(jì)數(shù)(即tty_port->count++);完成tty_struct與uart_state的關(guān)聯(lián)、uart_port與uart_state的關(guān)聯(lián);完成tty_port與tty_struct的關(guān)聯(lián)(在此之前tty_struct已完成tty_port),至此完成tty_port與tty_struct的相互關(guān)聯(lián)調(diào)用uart_startup,用于啟動(dòng)一個(gè)串口,在uart_startup接口中,通過間接調(diào)用uart_port->ops->startup、uart_port->ops->set_termios完成一個(gè)端口的開啟,并完成termios相關(guān)參數(shù)的設(shè)置(如波特率等)。最后調(diào)用tty_port_block_til_ready,用于等待一個(gè)tty端口準(zhǔn)備好(若該串口正處于關(guān)閉狀態(tài),則等該串口關(guān)閉完成后,則返回失?。蝗粼摯谑峭ㄟ^非阻塞模式打開,則返回打開成功;若該串口為阻塞打開,則必須等待已打開該串口的進(jìn)程關(guān)閉該串口后,方能返回)

而tty_port_block_til_ready的作用如下:

若該端口處于hangup或者處于關(guān)閉狀態(tài)中,則將該進(jìn)程加入到close_wait等待隊(duì)列,待hangup結(jié)束后,則返回EAGAIN;待close完成被喚醒后,則返回ERESTARTSYS;若非上述情況,且是非阻塞,則設(shè)置port的標(biāo)簽為ASYNC_NORMAL_ACTIVE,并返回;若非1中情況,且是第一次打開,則設(shè)置port的標(biāo)簽為ASYNC_NORMAL_ACTIVE,并返回;若為阻塞,且不是上述1.2.3中情況,則當(dāng)前進(jìn)程等待,并加入open_wait,待上一個(gè)進(jìn)程關(guān)閉后,本進(jìn)程被喚醒,并繼續(xù)執(zhí)行打開操作。 uart_write接口

該接口的實(shí)現(xiàn)比較簡單,代碼如下:

將待發(fā)送的數(shù)據(jù)寫入環(huán)形緩沖區(qū);調(diào)用uart_start,啟動(dòng)一次發(fā)送操作,而uart_start接口則主要調(diào)用uart_port->ops->start_tx接口,由具體串口設(shè)備的start_tx接口啟動(dòng)一次發(fā)送(如在該接口中使能tx中斷,實(shí)現(xiàn)tx中斷觸發(fā),而在tx中斷處理函數(shù)中完成一次發(fā)送)串口驅(qū)動(dòng)開發(fā)流程說明在module_init標(biāo)識(shí)的初始化函數(shù)中,調(diào)用uart_register_driver,完成uart_driver的注冊(cè),主要設(shè)置串口字符設(shè)備文件名稱的前綴、串口個(gè)數(shù)的設(shè)置等;創(chuàng)建一個(gè)platform_driver,在platform_driver的probe接口中,獲取待注冊(cè)串口信息的資源信息,并定義struct uart_ops中各函數(shù),并調(diào)用uart_add_one_port完成uart port的注冊(cè);為每一個(gè)待注冊(cè)的串口設(shè)備,創(chuàng)建一個(gè)platform device,并傳遞該串口相關(guān)的信息(若內(nèi)核支持設(shè)備樹,開發(fā)人員無需事先該步,只需在設(shè)備樹中增加相應(yīng)串口信息即可)。

基本上完成以上幾步,即完成了一個(gè)串口驅(qū)動(dòng),其實(shí)最主要的就是實(shí)現(xiàn)struct uart_ops中各成員函數(shù)指針。下一章我們來完成一個(gè)虛擬的串口設(shè)備及其驅(qū)動(dòng)。

串口子系統(tǒng)架構(gòu)總結(jié)

串口子系統(tǒng)針對(duì)所有串口,完成了統(tǒng)一的tty_driver的變量的實(shí)現(xiàn),而將每一個(gè)串口需要實(shí)現(xiàn)的內(nèi)容全部移至uart_port、uart_pos中,而無需實(shí)現(xiàn)tty_driver的操作接口、tty_port的操作接口(均由串口子系統(tǒng)內(nèi)部實(shí)現(xiàn))。相對(duì)于tty子系統(tǒng)而言,確實(shí)方便了一些。

以上就是關(guān)于u米電簽版pos機(jī)注冊(cè)流程,linux串口子系統(tǒng)中串口設(shè)備注冊(cè)與注銷以及串口開發(fā)流程說明的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于u米電簽版pos機(jī)注冊(cè)流程的知識(shí),希望能夠幫助到大家!

轉(zhuǎn)發(fā)請(qǐng)帶上網(wǎng)址:http://m.afbey.com/newstwo/108601.html

你可能會(huì)喜歡:

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 babsan@163.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。