• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      自動站氣壓傳感器校準(zhǔn)系統(tǒng)串口擴(kuò)展設(shè)計

      2022-02-18 08:39:18馬修才溫曉輝牛永紅
      南方農(nóng)機(jī) 2022年4期
      關(guān)鍵詞:內(nèi)核調(diào)用寄存器

      馬修才 , 溫曉輝 , 牛永紅

      (1.內(nèi)蒙古自治區(qū)大氣探測技術(shù)保障中心,內(nèi)蒙古 呼和浩特 010051;2.內(nèi)蒙古自治區(qū)氣象信息中心,內(nèi)蒙古 呼和浩特 010051)

      0 引言

      串口作為常用的通信接口,在嵌入式領(lǐng)域有著廣泛的應(yīng)用?,F(xiàn)如今,隨著計算機(jī)、網(wǎng)絡(luò)技術(shù)的發(fā)展,設(shè)備連入網(wǎng)絡(luò)的要求越來越迫切。目前,電子領(lǐng)域仍存在著大量的串口設(shè)備,對現(xiàn)有的串口設(shè)備進(jìn)行改造使其具備聯(lián)網(wǎng)功能將耗費(fèi)大量人力、財力。自動氣象站的氣壓傳感器[1]接口為232串口,為提高檢定/校準(zhǔn)的效率,設(shè)計了氣壓傳感器多路采集器,將多路氣壓串口信號轉(zhuǎn)換為以太網(wǎng)信號傳輸,可以同時批量完成傳感器的檢定/校準(zhǔn)任務(wù)。氣壓傳感器多路采集器在設(shè)計時,由于主控芯片自帶232串行端口數(shù)量有限,需要進(jìn)行串口的擴(kuò)展。串口擴(kuò)展的實(shí)現(xiàn)方案多種多樣[2-6],本設(shè)計采用的是嵌入式微控制器+專用串口擴(kuò)展芯片的方法[7-9]。本文以嵌入式設(shè)備驅(qū)動的整個開發(fā)流程為主線,從硬件電路設(shè)計、Linux下的擴(kuò)展串口驅(qū)動、驅(qū)動測試等方面對本設(shè)計展開討論。

      1 硬件平臺及串口擴(kuò)展芯片介紹

      S3C2440A基于ARM920T核心,集成了強(qiáng)大的片上功能,多達(dá)130個復(fù)用用戶IO,4通道DMA控制器,3通道64位FIFO的UART,8通道多路復(fù)用ADC,支持IIC、IIS、SPI接口。

      TL16C754B與EXAR的ST16C654管腳兼容,內(nèi)置4個可獨(dú)立工作的UART單元,最高波特率可達(dá)3 Mbit/s,具有軟/硬件流控功能,可設(shè)置4路UART在不同的波特率下工作,并可選擇各種串行數(shù)據(jù)格式。對驅(qū)動程序開發(fā)人員來說,必須要了解以下引腳功能[10]:CS[A:D]為4路UART的選通信號引腳,低電平有效;A[0:2]為3位地址線;D[0:7]為8位數(shù)據(jù)線;TX/RX[A:D]為4路UART串行發(fā)送/接收引腳;INT[A:D]為4路UART的中斷信號引腳;RESET為芯片的復(fù)位信號,高電平有效;INTSEL為UART中斷屏蔽引腳,高電平時能UART中斷,低電平時需視MCR寄存器的第3位而定;CLKSEL為芯片時鐘選擇引腳,高電平時為低電平時的四倍頻;XTAL1、XTAL2為芯片外部晶振的輸入輸出引腳,外接晶振典型值為1.843 2 M、3.072 M。該器件內(nèi)部共有20個8位寬的寄存器,在硬件連接正確的情況下,只要地址正確,就能像讀取MCU內(nèi)部寄存器那樣讀取芯片的內(nèi)部寄存器。通過A0~A2這3根地址線的8種狀態(tài)來區(qū)分20個寄存器,這20個寄存器中一定有一些是地址重疊的,這就需要通過讀寫信號及某些寄存器的特定位來進(jìn)行唯一確定。S3C2440A與TL16C754B硬件連接圖,如圖1所示。

      圖1 S3C2440A與TL16C754B硬件連接圖

      S3C2440A的nGCS5地址譯碼芯片使能端口相連接,addr0[3:5]連接地址譯碼器的輸入,地址譯碼器的8個輸出端依次連接兩片TL16C754B的8個通道的片選信號,S3C2440A的addr[0:2]分別與TL16C754B的A[0:2]順序直連,S3C2440A讀寫控制信號與TL16C754B讀寫控制信號。兩片TL16C754B的8個通道UART寄存器的尋址范圍為:0×28000000-0×2800003F。

      2 Linux下的TL16C754B驅(qū)動

      2.1 Linux下的終端設(shè)備驅(qū)動

      終端設(shè)備多種多樣,如串行終端、顯示器、telnet終端、HSS終端等。串口也屬于一種終端設(shè)備,它的驅(qū)動程序不僅僅是簡單的初始化硬件、接收/發(fā)送數(shù)據(jù)。串口驅(qū)動程序從上到下可分為四層:終端設(shè)備層、行規(guī)層、串口抽象層、串口芯片層。

      終端設(shè)備層實(shí)現(xiàn)了用于注冊終端設(shè)備的接口函數(shù)tty_register_driver(),行規(guī)層實(shí)現(xiàn)了tty_disc結(jié)構(gòu)體中的成員,串口抽象層的drivers/serial/serial_core.h將各類串口的共性概括出來,串口類型的識別/波特率的設(shè)置都是通過這一層來完成的。串口芯片層與具體的芯片有關(guān),比如訪問地址和中斷號,并對芯片寄存器進(jìn)行相關(guān)設(shè)置,對于標(biāo)準(zhǔn)串口,大部分驅(qū)動工作都是在這一層完成。TL16C754與8250/16550等標(biāo)準(zhǔn)串口在結(jié)構(gòu)與操作方式上具有一致性,因此可以參考Linux內(nèi)核中的8250/16550等標(biāo)準(zhǔn)串口驅(qū)動8250.c完成Linux下的TL16C754的驅(qū)動。

      2.2 Linux下的串口驅(qū)動編程思路

      串口抽象層的serial_core.c為串口芯片層驅(qū)動提供了三個結(jié)構(gòu):uart_driver、uart_port、uart_ops以及對應(yīng)的接口函數(shù)。uart_driver封裝了tty_driver,包含了串口設(shè)備的驅(qū)動名稱、設(shè)備名稱和主次設(shè)備號等信息。uart_port用來描述一個串口的地址、中斷號、端口類型等信息。uart_ops定義了針對串口的操作,如打開、關(guān)閉、線路設(shè)置等。

      串口芯片層驅(qū)動程序需要完成的任務(wù)很明確:實(shí)現(xiàn)uart_driver、uart_port、uart_ops結(jié)構(gòu)體實(shí)例并初始化它們;模塊初始化時調(diào)用uart_register_driver()和uart_add_one_port()完成串口驅(qū)動的注冊和端口的添加,模塊卸載時調(diào)用對應(yīng)的“反函數(shù)”進(jìn)行回收處理;根據(jù)串口芯片手冊實(shí)現(xiàn)uart_ops實(shí)例中的成員函數(shù),串口芯片驅(qū)動的大部分任務(wù)是在這里完成的。

      2.3 驅(qū)動數(shù)據(jù)結(jié)構(gòu)定義和驅(qū)動模塊初始化

      定義uart_driver實(shí)體serial_16c754,定義UART_NR個uart_port實(shí)體,本設(shè)計中UART_NR定義為8。driver_name成員代表驅(qū)動名稱,在Linux下用cat/proc/drivers命令所看到的驅(qū)動名稱;dev_name成員代表設(shè)備名稱,在Linux下用cat/proc/tty/driver/serialEX所看到的串口設(shè)備名稱,如ttysEX0;major成員代表驅(qū)動主設(shè)備號;minor成員代表驅(qū)動的起始次設(shè)備號;nr成員代表串口個數(shù)。

      定義驅(qū)動的uart_ops,其中較為重要的成員函數(shù)具體實(shí)現(xiàn)將在2.4小節(jié)中進(jìn)行介紹。除了調(diào)用uart_register_driver()和uart_add_one_port()完成串口驅(qū)動的注冊和端口的添加,Linux2.6內(nèi)核中,還新增了platform驅(qū)動的結(jié)構(gòu),在內(nèi)核啟動時由probe機(jī)制自動完成平臺設(shè)備結(jié)構(gòu)數(shù)組和平臺驅(qū)動的匹配。在TL16C754B的驅(qū)動模塊初始化時,調(diào)用platform_device_register()和platform_driver_register()完成擴(kuò)展串口平臺設(shè)備和平臺驅(qū)動的注冊。此前,需要定義擴(kuò)展串口的平臺數(shù)據(jù)結(jié)構(gòu)的定義和初始化。

      plat_serial16c754_port結(jié)構(gòu)體st16c654_data加入dmdk2410的platform_device結(jié)構(gòu)體數(shù)組里,內(nèi)核啟動時會將此結(jié)構(gòu)體信息加載到內(nèi)核中。內(nèi)核將通過probe機(jī)制尋找與之匹配的驅(qū)動自動完成tl16c754串口驅(qū)動的加載。另外,模塊初始化函數(shù)中還要完成TL16C754B芯片復(fù)位和中斷申請的任務(wù)。

      2.4 串口操作函數(shù)實(shí)現(xiàn)

      serial16c754_startup:應(yīng)用程序的open()函數(shù),最終會調(diào)用到serial16c754_startup,主要完成串口芯片寄存器的初始化工作。serial16c754_set_mctrl:應(yīng)用程序的tcsetattr()函數(shù),最終會調(diào)用serial16c754_set_mctrl,主要完成串行通信的通信格式的設(shè)定等功能。serial16c754_get_mctrl:應(yīng)用程序的tcgetattr()函數(shù),最終會調(diào)用serial16c754_get_mctrl,主要完成串行通信的通信格式的設(shè)定等功能。serial16c754_shutdown:應(yīng)用程序的close()函數(shù),最終會調(diào)用到serial16c754_shutdown,功能與serial16c754_startup相反。中斷處理函數(shù)static irqreturn_t serial16c754_interrupt:串口最終的數(shù)據(jù)收發(fā)都是在此完成的,當(dāng)應(yīng)用程序調(diào)用write()函數(shù)時,系統(tǒng)經(jīng)過層層調(diào)用,達(dá)到驅(qū)動的serial16c754_start_tx函數(shù),啟動串口發(fā)送中斷,驅(qū)動在中斷處理函數(shù)中將緩存中的數(shù)據(jù)發(fā)送出去,直到發(fā)送緩存為空,驅(qū)動程序調(diào)用serial16c754_stop_tx關(guān)閉串口發(fā)送中斷;當(dāng)串口接收到數(shù)據(jù),并且數(shù)據(jù)個數(shù)超過串口接收中斷觸發(fā)層級或者產(chǎn)生串口超時中斷,驅(qū)動在中斷處理函數(shù)中將接收到的數(shù)據(jù)寫入內(nèi)核中的串口數(shù)據(jù)緩沖區(qū)中,此時如果應(yīng)用程序調(diào)用了read()函數(shù),內(nèi)核會把內(nèi)核中的串口數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)返回給應(yīng)用程序。

      3 驅(qū)動測試及結(jié)果

      驅(qū)動調(diào)試完成之后,重新編譯、下載內(nèi)核,啟動新的內(nèi)核后,執(zhí)行“#cat/proc/tty/driver/serialEX”命令,可以查看擴(kuò)展串口的內(nèi)核相關(guān)信息。將8個擴(kuò)展串口與安裝有串口卡(至少8個串口)的PC機(jī)相連,利用PC機(jī)下串口測試軟件和擴(kuò)展串口平臺Linux下的簡單多串口應(yīng)用程序完成擴(kuò)展串口的驅(qū)動測試。PC串口測試軟件每秒鐘產(chǎn)生數(shù)據(jù)包長度為255的無符號char型隨機(jī)數(shù)據(jù),通過串口卡串口發(fā)送到擴(kuò)展串口,擴(kuò)展串口平臺串口應(yīng)用程序?qū)⒔邮盏降臄?shù)據(jù)通過擴(kuò)展串口原樣發(fā)送回串口卡串口,由PC機(jī)串口測試軟件統(tǒng)計成功回送次數(shù)。在以上測試條件下運(yùn)行2 330 min左右,8路串口在長時不間斷工作情況下,未產(chǎn)生丟包,可靠性高。

      4 結(jié)束語

      本設(shè)計為TL16C754B串口擴(kuò)展的硬件系統(tǒng)設(shè)計和Linux下的串口驅(qū)動開發(fā)提供了一個示例,可作為設(shè)計多串口服務(wù)器時進(jìn)行串口擴(kuò)展的參考方案。氣壓傳感器多路采集器可以支持多路氣壓傳感器同時接入,大大提高傳感器的檢定/校準(zhǔn)效率。

      猜你喜歡
      內(nèi)核調(diào)用寄存器
      萬物皆可IP的時代,我們當(dāng)夯實(shí)的IP內(nèi)核是什么?
      強(qiáng)化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
      Lite寄存器模型的設(shè)計與實(shí)現(xiàn)
      核電項目物項調(diào)用管理的應(yīng)用研究
      基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計
      Linux內(nèi)核mmap保護(hù)機(jī)制研究
      LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
      分簇結(jié)構(gòu)向量寄存器分配策略研究*
      基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
      利用RFC技術(shù)實(shí)現(xiàn)SAP系統(tǒng)接口通信
      西畴县| 万年县| 津南区| 灵石县| 镇沅| 泗水县| 东乌珠穆沁旗| 盱眙县| 保靖县| 张北县| 永胜县| 休宁县| 福泉市| 香格里拉县| 德令哈市| 温宿县| 察雅县| 五莲县| 兴义市| 綦江县| 衡东县| 长寿区| 清丰县| 乐山市| 长沙县| 开鲁县| 尼勒克县| 松潘县| 肥城市| 甘德县| 蓝山县| 石城县| 司法| 儋州市| 天门市| 当阳市| 鱼台县| 军事| 吉隆县| 新闻| 临武县|