亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于DSP嵌入式uClinux的串口驅(qū)動程序開發(fā)

        2018-09-20 06:37:46董純蔣方亮季啟政楊林鵬
        電氣自動化 2018年4期
        關(guān)鍵詞:設(shè)置設(shè)備

        董純, 蔣方亮, 季啟政, 楊林鵬

        (北京東方計量測試研究所,北京 100086)

        0 引 言

        在多串口應(yīng)用中,使用多片ST16C2552為BF518擴(kuò)展串口設(shè)備。在uClinux系統(tǒng)中,基于字符設(shè)備驅(qū)動模型[1]開發(fā)ST16C2552串口驅(qū)動程序存在以下不足:第一,字符設(shè)備驅(qū)動模型只提供最基本的和操作系統(tǒng)的接口,不實(shí)現(xiàn)任何通用邏輯,因此所有串口功能都需要編程實(shí)現(xiàn),比如數(shù)據(jù)緩沖邏輯、阻塞邏輯和配置命令等,開發(fā)和測試成本高;第二,為每個串口設(shè)備單獨(dú)開發(fā)驅(qū)動,由于同型號芯片操作方式相同,會產(chǎn)生大量重復(fù)代碼,代碼復(fù)用性差且不支持?jǐn)U展。采用uClinux平臺設(shè)備驅(qū)動技術(shù)和TTY終端設(shè)備驅(qū)動模型進(jìn)行串口驅(qū)動程序開發(fā),TTY終端設(shè)備驅(qū)動中已經(jīng)實(shí)現(xiàn)了串口通用邏輯,因此只需對標(biāo)準(zhǔn)接口進(jìn)行實(shí)現(xiàn)[2],就可以開發(fā)出功能完備的串口驅(qū)動程序,縮短了開發(fā)和測試周期。當(dāng)硬件連接更多擴(kuò)展芯片時,在系統(tǒng)中創(chuàng)建對應(yīng)的平臺設(shè)備,就可以實(shí)現(xiàn)驅(qū)動程序的復(fù)用和擴(kuò)展。

        1 串口擴(kuò)展硬件原理

        圖1描述了使用ST16C2552擴(kuò)展串口設(shè)備的硬件連接方式。為了提高BF518異步總線[3]的擴(kuò)展能力,使用CPLD對BF518異步總線的高位地址線(A16-A19)進(jìn)行譯碼,產(chǎn)生多個片選信號。BF518通過CPLD連接了4片ST16C2552芯片,一片ST16C2552提供2個獨(dú)立串口,因此總共擴(kuò)展出8個串口。為每個串口分配一個用來連接中斷信號線的GPIO。

        圖1 BF518與ST16C2552硬件連接圖

        2 uClinux下的串口驅(qū)動程序

        2.1 平臺設(shè)備驅(qū)動

        平臺設(shè)備驅(qū)動架構(gòu)包含總線、設(shè)備和驅(qū)動,總線自動完成設(shè)備和驅(qū)動的匹配工作[4]。使用平臺設(shè)備驅(qū)動技術(shù)可以隔離板級信息和驅(qū)動程序,在平臺設(shè)備信息中定義設(shè)備使用的資源、設(shè)備的具體配置信息,而在驅(qū)動中,使用標(biāo)準(zhǔn)API去獲取資源和信息,做到了板相關(guān)代碼和驅(qū)動代碼的分離,使驅(qū)動具有擴(kuò)展性。

        2.2 平臺設(shè)備驅(qū)動的注冊與卸載

        ST16C2552驅(qū)動程序使用module_init(st16c2552_uart_init)與module_exit(st16c2552_uart_exit)指定加載函數(shù)與卸載函數(shù)。st16c2552_uart_init函數(shù)調(diào)用uart_register_driver和platform_driver_register完成uart_driver和platform_driver的注冊,st16c2552_uart_exit函數(shù)調(diào)用uart_unregister_driver和platform_driver_unregister完成uart_driver和platform_driver的卸載。

        2.3 平臺設(shè)備接口和驅(qū)動接口的實(shí)現(xiàn)

        platform_device是平臺設(shè)備接口,對于每個串口設(shè)備,都需要實(shí)現(xiàn)該接口。platform_device數(shù)據(jù)結(jié)構(gòu)包含name、id、resource等成員變量。name是平臺驅(qū)動中實(shí)現(xiàn)驅(qū)動和設(shè)備匹配的關(guān)鍵,總線會根據(jù)name尋找對應(yīng)的設(shè)備驅(qū)動[5]。id字段用來區(qū)分name字段完全相同的平臺設(shè)備。resource是資源數(shù)組,將內(nèi)存基地址和中斷號信息抽取出來保存到資源數(shù)組中,是實(shí)現(xiàn)設(shè)備相關(guān)代碼與驅(qū)動代碼分離的關(guān)鍵。根據(jù)ST16C2552的芯片特性,在這個數(shù)組中定義了兩個元素:基地址資源、中斷號資源。數(shù)組元素中的flags字段表示該資源類別,IORESOURCE_MEM表示內(nèi)存資源,IORESOURCE_IRQ表示中斷資源。驅(qū)動程序需要支持8個串口,因此建立8個platform_device,每個platform_device的name成員設(shè)置相同內(nèi)容,id成員從0依次累加,根據(jù)實(shí)際情況設(shè)置每片ST16C2552的基地址和中斷號。

        platform_driver是平臺驅(qū)動接口,需要為probe和remove函數(shù)指針及name變量賦值,platform_device和platform_driver匹配時會調(diào)用probe指向的函數(shù),注銷platform_device或platform_driver時會調(diào)用remove指向的函數(shù)。name字段用來匹配對應(yīng)的platform_device。

        platform_driver中的probe函數(shù)主要完成驅(qū)動程序的初始化工作,首先創(chuàng)建uart_port,然后使用標(biāo)準(zhǔn)API獲取platform_device中的基地址和中斷號信息,對uart_port進(jìn)行初始化,最后通過調(diào)用dev_set_drvdata函數(shù)設(shè)置uart_port與platform_device關(guān)聯(lián),調(diào)用uart_add_one_port函數(shù)設(shè)置uart_port與uart_driver關(guān)聯(lián)。上述操作完成后,系統(tǒng)中會生成與uart_port對應(yīng)的設(shè)備節(jié)點(diǎn),設(shè)備名稱由uart_driver的dev_name與uart_port的line編號組成。

        2.4 TTY終端設(shè)備驅(qū)動接口的實(shí)現(xiàn)

        1)uart_driver與uart_port接口的實(shí)現(xiàn)

        在驅(qū)動程序中實(shí)現(xiàn)uart_driver接口,該接口driver_name字段是驅(qū)動名稱,dev_name字段是設(shè)備名稱,major是主設(shè)備號,minor是從設(shè)備起始號,nr是uart_driver對應(yīng)串口設(shè)備的最大數(shù)量,硬件上擴(kuò)展了8個串口,所以設(shè)定為8。

        uart_port用來保存了串口設(shè)備信息,初始化uart_port時,需要設(shè)置晶振頻率、發(fā)送FIFO大小、line編號、iotype 等參數(shù)字段,還要為其關(guān)聯(lián)uart_ops操作函數(shù)集。uart_ops包含與硬件相關(guān)的底層操作函數(shù)接口,需要編程實(shí)現(xiàn)這些操作函數(shù)。

        2)startup函數(shù)的實(shí)現(xiàn)

        在應(yīng)用層調(diào)用open函數(shù)時,會最終調(diào)用uart_ops中的startup函數(shù),該函數(shù)主要完成申請中斷、設(shè)置中斷處理函數(shù)以及使能ST16C2552接收中斷的操作。為了實(shí)現(xiàn)驅(qū)動程序的復(fù)用性,ST16C2552芯片寄存器的訪問地址通過計算方式獲得,使用基地址加上ST16C2552芯片內(nèi)部寄存器的偏移地址,得到硬件訪問地址。

        3)set_termios函數(shù)的實(shí)現(xiàn)

        在應(yīng)用層進(jìn)行串口參數(shù)設(shè)置時,會最終調(diào)用uart_ops中的set_termios函數(shù),實(shí)現(xiàn)設(shè)置串口參數(shù),包括數(shù)據(jù)位、停止位、奇偶校驗和波特率等功能。該函數(shù)獲取來自應(yīng)用層的termios數(shù)據(jù)結(jié)構(gòu),從該數(shù)據(jù)結(jié)構(gòu)中讀取串口參數(shù)的設(shè)置值,根據(jù)波特率計算分頻值,然后關(guān)閉ST16C2552中斷使能,將分頻值寫入DLL和DLM寄存器,將設(shè)置值寫入LCR寄存器,最后使能ST16C2552中斷,根據(jù)最新的設(shè)置值更新端口的timeout值。

        4)start_tx函數(shù)的實(shí)現(xiàn)

        用戶發(fā)送數(shù)據(jù)時,通過“write()系統(tǒng)調(diào)用-TTY核心-線路規(guī)程”的層層調(diào)用,最終調(diào)用uart_ops中的start_tx函數(shù)。在start_tx函數(shù)中,首先在ST16C2552中斷使能寄存器中設(shè)置發(fā)送中斷使能位,然后將發(fā)送緩沖區(qū)數(shù)據(jù)依次傳遞給ST16C2552發(fā)送寄存器。發(fā)送緩沖區(qū)中數(shù)據(jù)比較多時,未發(fā)送的數(shù)據(jù)會在后續(xù)的發(fā)送中斷處理程序中發(fā)送出去。

        5)中斷服務(wù)程序的實(shí)現(xiàn)

        ST16C2552提供了基于優(yōu)先級的中斷管理機(jī)制,ISR(中斷狀態(tài)寄存器)中總是保存當(dāng)前優(yōu)先級最高的中斷代碼,其余中斷則保存到隊列中等待后續(xù)服務(wù),需要將中斷觸發(fā)方式設(shè)置為電平觸發(fā),在中斷處理程序中讀取ISR寄存器,根據(jù)中斷代碼判斷中斷類型,然后進(jìn)行相應(yīng)處理。

        圖2是中斷處理函數(shù)流程圖。首先讀取ST16C2552中斷狀態(tài)寄存器獲得中斷代碼,然后判斷中斷類型。如果是接收中斷,先讀取線路狀態(tài)寄存器,然后讀取數(shù)據(jù)接收寄存器,接收數(shù)據(jù)計數(shù)累加,判斷是否產(chǎn)生錯誤,有則設(shè)置錯誤標(biāo)志,調(diào)用uart_insert_char函數(shù),將接收到的數(shù)據(jù)拷貝到tty_struct結(jié)構(gòu)體的buf緩沖區(qū)中,最后調(diào)用tty_flip_buffer_push將數(shù)據(jù)拷貝到tty_struct結(jié)構(gòu)體的read_buf緩沖區(qū)中。如果是發(fā)送中斷,意味著硬件已經(jīng)將之前的數(shù)據(jù)發(fā)送完畢,串口發(fā)送硬件處于空閑狀態(tài),這時可以將新的數(shù)據(jù)傳遞給硬件。程序先檢查發(fā)送緩沖區(qū)中數(shù)據(jù)的數(shù)量和停止發(fā)送標(biāo)志,如果發(fā)送數(shù)據(jù)緩沖區(qū)里沒有待發(fā)送的數(shù)據(jù)或停止標(biāo)志有效,就將ST16C2552中斷使能寄存器的發(fā)送中斷使能標(biāo)志清零,禁用發(fā)送中斷,以減少對CPU資源的消耗,接下來檢查是否設(shè)置了高優(yōu)先級的字符,如果設(shè)置了,就先發(fā)送高優(yōu)先級字符,然后將發(fā)送數(shù)據(jù)緩沖區(qū)里的數(shù)據(jù)依次寫入ST16C2552的發(fā)送寄存器,由硬件發(fā)送,每次將數(shù)據(jù)寫入發(fā)送寄存器時,對已發(fā)送字符個數(shù)進(jìn)行一次累加,最后檢查發(fā)送緩沖區(qū)中剩余字符的個數(shù),如果小于256個,就喚醒向發(fā)送緩沖區(qū)寫數(shù)據(jù)的線程。

        3 串口驅(qū)動程序測試

        3.1 驅(qū)動安裝

        使用insmod指令將所有platform_device和platform_driver安裝到系統(tǒng)中,進(jìn)入/dev目錄,執(zhí)行l(wèi)s命令列出所有設(shè)備節(jié)點(diǎn),系統(tǒng)自動生成tty_ST16C2552_UART0~tty_ST16C2552_UART7共8個串口設(shè)備節(jié)點(diǎn)。

        3.2 驅(qū)動調(diào)用測試

        首先使用open系統(tǒng)調(diào)用打開串口,然后使用tcgetattr函數(shù)獲取當(dāng)前的termios數(shù)據(jù)結(jié)構(gòu),設(shè)置8數(shù)據(jù)位、1停止位、無奇偶校驗、波特率9 600 bps、原始輸入模式,設(shè)置更新termios數(shù)據(jù)結(jié)構(gòu)[6],循環(huán)中使用read系統(tǒng)調(diào)用接收數(shù)據(jù),并將接收到的數(shù)據(jù)通過write系統(tǒng)調(diào)用發(fā)送出去。將測試板串口與計算機(jī)串口相連,在計算機(jī)上運(yùn)行串口調(diào)試助手,設(shè)置與測試程序一致的串口參數(shù),使用串口調(diào)試助手發(fā)送數(shù)據(jù),停止發(fā)送后觀測到發(fā)送與接收字節(jié)數(shù)及數(shù)據(jù)內(nèi)容都一致,證明串口驅(qū)動工作正常。

        圖2 中斷處理函數(shù)流程圖

        4 結(jié)束語

        使用平臺設(shè)備驅(qū)動技術(shù)及TTY終端設(shè)備驅(qū)動模型相結(jié)合的方法開發(fā)了串口驅(qū)動程序,并編寫應(yīng)用程序?qū)︱?qū)動程序進(jìn)行調(diào)用測試,測試結(jié)果顯示該驅(qū)動程序?qū)崿F(xiàn)了預(yù)期功能,目前已經(jīng)投入到項目使用中。使用該方案開發(fā)串口驅(qū)動程序主要有兩個優(yōu)點(diǎn):第一,當(dāng)硬件連接更多ST16C2552時,只需編寫platform_device并動態(tài)加載到系統(tǒng)中,可實(shí)現(xiàn)對新增ST16C2552串口設(shè)備的支持,體現(xiàn)了驅(qū)動程序的動態(tài)擴(kuò)展特性;第二,uClinux下的TTY設(shè)備驅(qū)動模型已包含通用邏輯的實(shí)現(xiàn),只需要實(shí)現(xiàn)它提供的一組接口函數(shù),就可以開發(fā)出功能完備的串口驅(qū)動程序,降低了開發(fā)和測試成本,提高了驅(qū)動程序的可靠性。

        猜你喜歡
        設(shè)置設(shè)備
        諧響應(yīng)分析在設(shè)備減振中的應(yīng)用
        中隊崗位該如何設(shè)置
        少先隊活動(2021年4期)2021-07-23 01:46:22
        7招教你手動設(shè)置參數(shù)
        基于VB6.0+Access2010開發(fā)的設(shè)備管理信息系統(tǒng)
        基于MPU6050簡單控制設(shè)備
        電子制作(2018年11期)2018-08-04 03:26:08
        500kV輸變電設(shè)備運(yùn)行維護(hù)探討
        本刊欄目設(shè)置說明
        中俄臨床醫(yī)學(xué)專業(yè)課程設(shè)置的比較與思考
        如何在設(shè)備采購中節(jié)省成本
        原來他們都是可穿戴設(shè)備
        久久久久亚洲av片无码v| 国产自拍三级黄片视频| 人妻少妇久久中中文字幕| 3d动漫精品啪啪一区二区免费| 亚洲精品国产第一区二区尤物| 青青草综合在线观看视频| 国产精品日本一区二区三区在线 | 97人妻人人揉人人躁九色| 中文字幕被公侵犯的漂亮人妻| 国产精品区一区二区三在线播放 | 吃下面吃胸在线看无码| 色婷婷在线一区二区三区| 天天做天天爱夜夜爽女人爽| 久久精品国产第一区二区三区 | 国产亚洲精品看片在线观看| 偷拍女厕尿尿在线免费看| 亚洲精品久久区二区三区蜜桃臀 | 国产清品夜色一区二区三区不卡 | 亚洲国产av玩弄放荡人妇| 边做边流奶水的人妻| 亚洲亚洲网站三级片在线| 日韩熟女精品一区二区三区视频 | 一区二区三区中文字幕| 久久国产精品波多野结衣av| 久久久诱惑一区二区三区| 在线高清亚洲精品二区| 日本xxxx色视频在线观看| 玩弄少妇高潮ⅹxxxyw| 亚洲精品一区网站在线观看| 亚洲精品不卡av在线免费| 97se狠狠狠狠狼鲁亚洲综合色| 亚洲av永久无码精品秋霞电影影院| 大陆国产乱人伦| 日本一二三区在线视频观看| 久久久久成人精品免费播放动漫| 内射人妻视频国内| 狠狠久久久久综合网| 成年人男女啪啪网站视频| 日本xxxx色视频在线观看免费| 欧美大黑帍在线播放| 国产亚洲欧美另类第一页|