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

        ?

        嵌入式Linux下CAN總線驅(qū)動程序設(shè)計

        2011-10-18 06:21:56王保和
        大眾科技 2011年6期
        關(guān)鍵詞:嵌入式設(shè)備

        王保和

        (電子科技大學(xué),四川 成都 611731)

        嵌入式Linux下CAN總線驅(qū)動程序設(shè)計

        王保和

        (電子科技大學(xué),四川 成都 611731)

        嵌入式Linux下開發(fā)各類CAN總線設(shè)備,需設(shè)計相應(yīng)的驅(qū)動程序,以CAN控制器MCP2510為例,詳細(xì)介紹了CAN總線控制器硬件接口設(shè)計,以及嵌入式Linux下設(shè)備驅(qū)動程序的開發(fā)流程和技巧,結(jié)合CAN控制器的特點(diǎn),設(shè)計相關(guān)的數(shù)據(jù)結(jié)構(gòu)和操作代碼來實現(xiàn)CAN控制器的設(shè)備驅(qū)動程序。

        嵌入式Linux;CAN總線;S3C2440;設(shè)備驅(qū)動程序;MCP2510

        (一)引言

        CAN現(xiàn)場總線已經(jīng)成為在儀表裝置通信的新標(biāo)準(zhǔn),其在短距離條件下具有高達(dá)1Mbps的數(shù)據(jù)傳輸能力,由于其成本低,實時性好,抗干擾能力強(qiáng),因此廣泛應(yīng)用于車載數(shù)據(jù)采集系統(tǒng)及汽車電子控制網(wǎng)絡(luò)。與此同時,利用 ARM處理器具有高性能耗能低等優(yōu)點(diǎn)和嵌入式 linux的多任務(wù)處理的能力,在ARM和嵌入式Linux平臺下開發(fā)CAN總線系統(tǒng)已經(jīng)得到廣泛應(yīng)用。本文主要介紹如何在基于ARM和嵌入式linux平臺下開發(fā)CAN總線控制器的驅(qū)動程序。

        (二)CAN 控制器與S3C2440硬件接口設(shè)計

        CAN節(jié)點(diǎn)主要有微控制器,CAN控制器,CAN收發(fā)器組成,在本設(shè)計中采用三星S3C2440作為微控制器,CAN控制器和收發(fā)器采用的是Microchip公司的MCP2510和MCP2551,S3C2440是一款A(yù)RM9TDMI內(nèi)核的RISC處理器,CPU主頻最高可達(dá)500M,處理速度快,可滿足 CAN節(jié)點(diǎn)實時性高的需求,但由于其片內(nèi)不帶CAN控制器,所以硬件上需要外擴(kuò)CAN控制器MCP2510,MCP2510完全支持CAN1.2、CAN2.0A、CAN2.0B等版本的協(xié)議,能夠發(fā)送和接受標(biāo)準(zhǔn)和擴(kuò)展報文,它還同時具備驗收濾波以及報文管理功能,它與微控制器的通訊是采用SPI口實現(xiàn)的,其 SPI口數(shù)據(jù)傳輸速率高達(dá) 5Mb/s,同時高速 CAN收發(fā)器MCP2551把 CAN控制器生成的數(shù)字信號轉(zhuǎn)化成為適合總線傳輸?shù)牟罘中盘?,它也為CAN控制器和CAN總線的之間加入了緩沖器可以有效抑制高壓尖峰信號,具有很強(qiáng)的抗噪特性。在本設(shè)計中S3C2440被設(shè)置為SPI的主設(shè)備,MCP2551作為從設(shè)備,GPG6引腳控制對從設(shè)備的操作,MISO是主設(shè)備輸入從設(shè)備輸出,MOSI是主設(shè)備輸出從設(shè)備輸入,在這里為了減少I/O口占用,MCP2510采用通用中斷引腳與S3C2440的外部中斷1相連,MCP2510與S3C2440硬件接口電路如圖1所示:

        圖1 MCP2510與S3C2440硬件接口電路

        (三)MCP2510的讀寫與狀態(tài)控制操作

        MCP2510是Microchip公司推出的功能很強(qiáng)的CAN控制器,該芯片包含三個發(fā)送緩存和兩個接收緩存,可以對發(fā)送優(yōu)先級進(jìn)行管理,可濾除無用信息,其主要功能是在 MCU的控制下實現(xiàn) CAN規(guī)范,其內(nèi)部的所有寄存器都映射在一個地址表上,MCU通過 SPI口發(fā)送相應(yīng)的命令和數(shù)據(jù)來完成對MCP2510的初始化,工作狀態(tài)的控制以及數(shù)據(jù)的讀寫。在實現(xiàn)驅(qū)動程序之前需要完成對 MCP2510進(jìn)行讀寫或控制的底層函數(shù),而這些函數(shù)主要是根據(jù) SPI口的通信時序完成 MCP2510的讀寫操作或狀態(tài)控制如下:比如MCP2510的SPI口寫時序如圖2所示,可以按照此時序?qū)崿F(xiàn)對MCP2510進(jìn)行寫操作的的底層函數(shù)。其他的操作以此類推。

        圖2 MCP2510的SPI口寫時序

        write2510(u8 cmd,u8 addr,u8 data)

        {CS_L;//拉低GPG6引腳啟動對MCP2510的操作

        iowrite8(cmd,SPTDAT0);//寫指令到 SPI 口

        wait;//等待發(fā)送操作完成

        iowrite8(addr,SPTDAT0);//寫地址到SPI口

        wait;//等待發(fā)送操作完成

        iowrite8(data,SPTDAT0);//寫數(shù)據(jù)到SPI口

        wait;//等待發(fā)送操作完成

        CS_H;//拉高GPG6引腳結(jié)束對MCP2510的操作

        }

        (四)CAN控制器驅(qū)動程序的接口

        由于對MCP2510的控制是以字節(jié)為單位逐個進(jìn)行I/O操作的設(shè)備,所以其屬于字符設(shè)備,驅(qū)動程序是用戶應(yīng)用程序與硬件的接口,需要屏蔽設(shè)備的工作細(xì)節(jié)提供給用戶程序一系列的標(biāo)準(zhǔn)調(diào)用,其主要就是調(diào)用操作 MCP2510的底層函數(shù)實現(xiàn)open,read,write,ioctl,release等系統(tǒng)調(diào)用函數(shù),來完成與內(nèi)核的通信,為了方便用戶程序與驅(qū)動的交互,可以根據(jù)CAN控制器的工作特點(diǎn)定義MCP2510的設(shè)備結(jié)構(gòu)體。MCP2510設(shè)備結(jié)構(gòu)體的定義

        struct MCP2510{

        wait_queue_head_t read_wq;//讀進(jìn)程的等待隊列

        wait_queue_head_t write_wq;//寫進(jìn)程的等待隊列

        unsigned char en_read;//讀進(jìn)程等待的條件

        unsigned char en_write;//寫進(jìn)程等待的條件

        struct CANR_MSG rec_buf;//接收報文緩沖器

        struct CANT_MSG tra_buf;//發(fā)送報文緩沖器

        struct SET_FILTER set_filter; //MCP2510寄存器配置

        struct cdev cdev; // 字符設(shè)備結(jié)構(gòu)體

        }

        CANR_MSG結(jié)構(gòu)體作為接收報文的緩沖區(qū),CANR_MSG結(jié)構(gòu)體作為發(fā)送報文的緩沖區(qū),en_read是讀進(jìn)程等待隊列的等待標(biāo)志,en_write是寫進(jìn)程等待隊列的等待標(biāo)志,在驅(qū)動程序中運(yùn)用這種機(jī)制可以很好地解決與應(yīng)用程序通信的問題,定義 SET_FILTER結(jié)構(gòu)體是為了用戶應(yīng)用程序可以配置MCP2510。

        1.open函數(shù)的實現(xiàn)

        open函數(shù)實現(xiàn)對S3C2440的SPI口的初始化,以及通過SPI口對MCP2510的寄存器進(jìn)行相應(yīng)的初始化。包括CAN總線波特率的設(shè)置,設(shè)置報文濾波以及屏蔽寄存器,開啟中斷使能等。

        2.ioctl函數(shù)的實現(xiàn)

        該函數(shù)在 linux中標(biāo)準(zhǔn)定義是 int (*ioctl)(struct inode* inode,struct file* filp,unsigned int cmd,unsigned long arg),用戶程序可以通過傳遞參數(shù)給該函數(shù)實現(xiàn)對MCP2510的控制,其中形參cmd是命令,arg是命令的參數(shù),cmd可以控制CAN控制器復(fù)位,進(jìn)入各種模式,如配置,監(jiān)聽,正常,回環(huán),睡眠等模式,還可以配置有關(guān)報文濾波的寄存器,因此可實現(xiàn)用戶程序動態(tài)配置所需要接收的報文,其中arg是用戶程序傳遞的一個指向SET_FILTER結(jié)構(gòu)體的用戶空間指針。

        3.read函數(shù)的實現(xiàn)

        當(dāng)用戶進(jìn)程調(diào)用read函數(shù)讀取接收的報文時,必須等待en_read這個變量變?yōu)?1,如果為 1的話,就會調(diào)用copy_to_user函數(shù)將儲存在內(nèi)核空間的報文數(shù)據(jù)(即設(shè)備結(jié)構(gòu)體MCP2510里面的CANR_MESSAGE)拷貝到用戶空間,否則該進(jìn)程就會進(jìn)入 read_wq等待隊列,直到接收中斷程序中喚醒它。

        4.write函數(shù)的實現(xiàn)

        當(dāng)用戶進(jìn)程調(diào)用 write函數(shù)發(fā)送報文時,將同樣需要等待 en_write變量,當(dāng)發(fā)送完一幀報文后中斷程序就會將en_write變量置位,這時將調(diào)用 copy_from_user 函數(shù)將用戶空間的報文數(shù)據(jù)拷貝到內(nèi)核空間的發(fā)送緩沖區(qū)(即設(shè)備結(jié)構(gòu)體MCP2510里面的CANT_MESSAGE),然后將MCP2510中的發(fā)送緩沖控制寄存器(TXBnCTL)的TXREQ置位,啟動報文發(fā)送請求。

        5.release函數(shù)的實現(xiàn)

        關(guān)閉設(shè)備,以及釋放申請的中斷號和分配的內(nèi)存空間。

        6.中斷函數(shù)的實現(xiàn)

        Linux內(nèi)核將所有的中斷統(tǒng)一編號,使用一個 irq_desc結(jié)構(gòu)數(shù)組來描述這些中斷;每個數(shù)組項對應(yīng)一個中斷號,里面記錄了中斷處理函數(shù)入口,底層的硬件訪問接口,中斷狀態(tài)等,嵌入式 linux內(nèi)核會維護(hù)一個中斷信號線注冊表,所以在使用中斷前必須先申請中斷號,使用完之后要釋放該中斷號,這里使用的就是函數(shù) request_irq(IRQ_EINT1,can_interrupt,IRQT_FALLING,DEVICE_NAME,dev_id);來注冊一個中斷處理程序,IRQ_EINT1是所要申請的中斷號,can_interrupt是中斷處理函數(shù)的指針,IRQT_FALLING是中斷觸發(fā)的方式,這里選擇的是下降沿觸發(fā),DEVICE_NAME是產(chǎn)生中斷的設(shè)備名稱,dev_id主要用于共享中斷線,當(dāng)一個中斷處理程序需要釋放時,內(nèi)核可以根據(jù)該參數(shù)找到中斷處理函數(shù)鏈表中的需要刪除的中斷處理程序, 由于 MCP2510的中斷比較多,所以在中斷處理程序需要處理各緩沖器的接收和發(fā)送中斷以及喚醒和錯誤處理。中斷函數(shù)代碼片段如下:

        icode=read2510(0x0e)&0x0e;//讀取CANSTA寄存器

        switch(icode)

        {case 0x0c://接收緩沖器0中斷

        for(i=1;i<=13;i++)

        {rbaddr=(icode<<3)+i;

        temp=read2510(rbaddr);

        *((unsigned char *)(&mcp2510->rbuf)+i-1)=temp;

        }//拷貝接收到的報文ID和數(shù)據(jù)到設(shè)備結(jié)構(gòu)體的緩沖區(qū)

        mcp2510->en_read=1;//將讀使能標(biāo)志置1

        modbits2510(0x2c,0x01,0x00); //清除中斷標(biāo)志

        wake_up_interruptible(&mcp2510->read_wq);//喚醒正在等待的讀進(jìn)程

        break;

        case 0x0a://接收緩沖器1中斷

        …...

        }

        上述代碼中icode保存的是從MCP2510的CANSTA寄存器中讀取的中斷信息,將icode值左移3位即可得到接收緩沖器0在CAN控制器中的寄存器映射地址,然后將接收到的報文ID和數(shù)據(jù)拷貝到設(shè)備結(jié)構(gòu)體中的CANR_MSG類型緩沖器,然后喚醒讀進(jìn)程,用戶應(yīng)用程序就可以得到底層硬件接收到的報文數(shù)據(jù)。其他的中斷都可以按這種方法實現(xiàn)。

        (五)模塊化驅(qū)動程序的注冊

        Linux驅(qū)動程序的開發(fā)有兩種實現(xiàn)方式,一種是直接將相關(guān)的驅(qū)動程序編譯進(jìn)內(nèi)核,但這樣勢必會造成內(nèi)核非常龐大,而且在開發(fā)中非常不方便,每次得重新燒寫內(nèi)核鏡像。另外一種就是將具體的設(shè)備驅(qū)動程序獨(dú)立編譯,成為可安裝的模塊,可以動態(tài)地加載和卸載模塊。本文采用后一種方式,因此需要實現(xiàn) init_module和 cleanup_module函數(shù),init_module函數(shù)會調(diào)用 register_chrdev函數(shù)來申請設(shè)備號,同時動態(tài)地給設(shè)備結(jié)構(gòu)體分配空間,而cleanup_module函數(shù)則實現(xiàn)在卸載模塊時的釋放內(nèi)存空間,注銷主設(shè)備號,以及釋放中斷號等。

        (六)驅(qū)動程序的編譯

        在編寫完嵌入式 linux驅(qū)動程序后,需要將驅(qū)動程序添加到內(nèi)核中,然后編譯內(nèi)核,具體步驟如下:

        1.將驅(qū)動程序 mcp2510.c文件拷貝到內(nèi)核的drivers/char目錄下,該目錄下是字符設(shè)備的設(shè)備驅(qū)動程序。

        2.修改drivers/char目錄下的Kconfig文件,添加如下腳本:

        config MCP2510

        tristate 〝CAN controler driver〞

        default m

        help

        XXXXXXXX

        添加這段腳本意味著在配置內(nèi)核時,在字符設(shè)備驅(qū)動的配置菜單中就會有相應(yīng)的 MCP2510這個選項,這個驅(qū)動模塊可以配置為編譯進(jìn)內(nèi)核,編譯為模塊,要么不編譯,在這里默認(rèn)的是編譯為模塊,“help”后面的內(nèi)容為幫助信息。在內(nèi)核頂層目錄下運(yùn)行make menuconfig 后會生成.config文件,該文件決定文件是否編譯進(jìn)內(nèi)核或模塊。

        3.修改drivers/char目錄下的Makefile文件,在其中添加obj-$(CONFIG_MCP2510)=

        MCP2510.o,在這里CONFIG_MCP2510的變量值為m,表示該文件要作為模塊編譯,可以在第二步生成的.config文件中找到該變量的賦值。

        4.在內(nèi)核源代碼頂層目錄下運(yùn)行make modules命令,就會在drivers/char目錄下生成MCP2510.ko文件。

        (七)驅(qū)動程序模塊的加載與測試

        現(xiàn)在將驅(qū)動程序MCP2510.ko和用戶測試程序從PC交叉編譯平臺拷貝到arm+linux平臺下,也可以通過NFS服務(wù)掛載宿主機(jī)下的目錄,這樣更易于調(diào)試,運(yùn)行 insmod MCP2510.ko這時可以查看/proc/devices文件可以看到加載的設(shè)備信息,查看/proc/interrupts文件可以看到申請的中斷號信息,當(dāng)這些都沒問題時就可以運(yùn)行用戶測試程序./mcp2510_test.o。

        (八)結(jié) 語

        本文介紹了基于ARM平臺的CAN總線設(shè)備的硬件接口設(shè)計以及在嵌入式linux系統(tǒng)下開發(fā)CAN控制器的驅(qū)動程序的開發(fā)流程,結(jié)合 CAN控制器的工作特點(diǎn),合理地設(shè)計了數(shù)據(jù)結(jié)構(gòu)以及使用了等待隊列的機(jī)制和使用緩沖區(qū)的控制方法。經(jīng)過應(yīng)用程序測試證明該驅(qū)動可以正確運(yùn)行。同時也給在嵌入式Linux操作系統(tǒng)下開發(fā)類似的接口驅(qū)動程序提供了參考。

        [1] 王黎明,夏立,邵英,等.CAN 現(xiàn)場總線系統(tǒng)的設(shè)計與應(yīng)用[M].北京:電子工業(yè)出版社,2008.

        [2] 宋寶華.Linux設(shè)備驅(qū)動開發(fā)詳解[M].北京:人民郵電出版社,2008.

        [3] 饒運(yùn)濤,王進(jìn)宏,等.現(xiàn)場總線 CAN 原理與應(yīng)用技術(shù)[M].北京:北京航空航天大學(xué)出版社,2007.

        [4] 鄭靈翔.嵌入式接口技術(shù)與 Linux驅(qū)動開發(fā)[M].北京:北京航空航天大學(xué)出版社,2010.

        TP336

        A

        1008-1151(2011)06-0019-02

        2011-04-26

        王保和,電子科技大學(xué)碩士研究生,研究方向為嵌入式系統(tǒng)。

        猜你喜歡
        嵌入式設(shè)備
        諧響應(yīng)分析在設(shè)備減振中的應(yīng)用
        TS系列紅外傳感器在嵌入式控制系統(tǒng)中的應(yīng)用
        電子制作(2019年7期)2019-04-25 13:17:14
        基于VB6.0+Access2010開發(fā)的設(shè)備管理信息系統(tǒng)
        嵌入式系統(tǒng)通信技術(shù)的應(yīng)用
        電子制作(2018年18期)2018-11-14 01:48:16
        基于MPU6050簡單控制設(shè)備
        電子制作(2018年11期)2018-08-04 03:26:08
        搭建基于Qt的嵌入式開發(fā)平臺
        嵌入式軟PLC在電鍍生產(chǎn)流程控制系統(tǒng)中的應(yīng)用
        500kV輸變電設(shè)備運(yùn)行維護(hù)探討
        如何在設(shè)備采購中節(jié)省成本
        原來他們都是可穿戴設(shè)備
        日本女优在线观看一区二区三区| 亚洲国产日韩精品一区二区三区 | 91日韩东京热中文字幕| 又粗又硬又大又爽免费视频播放| 2019年92午夜视频福利| 人妻少妇人人丰满视频网站| 女主播啪啪大秀免费观看| 欧美丰满熟妇xxxx性ppx人交| 久久综合精品国产二区无码| 亚洲两性视频一三区| 国产自拍在线视频观看| 欧美又大又硬又粗bbbbb| 亚洲色丰满少妇高潮18p| 亚洲春色AV无码专区在线播放| 久久亚洲春色中文字幕久久久综合| 凌辱人妻中文字幕一区| 色一情一乱一乱一区99av| 麻豆国产av尤物网站尤物| 久久综合加勒比东京热| 国产特级毛片aaaaaa高潮流水| 99久久人人爽亚洲精品美女| 精品久久久久久电影院| 亚洲日产乱码在线中文字幕| 亚洲人成欧美中文字幕| 亚洲人成人影院在线观看| 五月激情狠狠开心五月| 国产一区二区三区不卡在线观看 | 99精品国产自产在线观看| 精彩视频在线观看一区二区三区| 欧美狠狠入鲁的视频777色| 国产成人精品电影在线观看18 | 亚洲一区二区三区亚洲| 欧美xxxxx在线观看| 国产女女精品视频久热视频| 国产高清一级毛片在线看| 久久精品熟女亚洲av麻豆永永| 亚洲裸男gv网站| 国产91吞精一区二区三区| av男人天堂网在线观看| 人妻少妇久久久久久97人妻 | 爱性久久久久久久久|