<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Android系統(tǒng)下CAN總線驅(qū)動程序的設(shè)計與實現(xiàn)

          Android系統(tǒng)下CAN總線驅(qū)動程序的設(shè)計與實現(xiàn)

          作者: 時間:2013-04-25 來源:網(wǎng)絡(luò) 收藏

          3.2 Linux中
          針對MCP2515控制器,在Linux kernel中采用字符設(shè)備驅(qū)動開發(fā)的形式。驅(qū)動初始化函數(shù)staticint_init MCP2515_init(),首先通過ioremap()函數(shù)將S5PV210的SPI寄存器的物理地址映射到內(nèi)核空間,這樣才可以在中訪問和配置S5PV210的SPI寄存器。在正確配置S5PV210的SPI寄存器后,通過register_chrdev()函數(shù)為MCP2515注冊設(shè)備驅(qū)動,分配主設(shè)備號,這樣在設(shè)備文件目錄中創(chuàng)建對應(yīng)的設(shè)備文件后,就可以用Linux的函數(shù)操作MCP2515了。而分配內(nèi)存部分放在probe()函數(shù)中完成,分配空間包括為設(shè)備數(shù)據(jù)結(jié)構(gòu)以及其內(nèi)部的接收發(fā)送緩沖區(qū)動態(tài)分配空間。同時在probe()還需要完成申請中斷工作,并初始化中斷處理隊列,在中斷處理隊列中讀取INTF寄存器,判斷是接收/發(fā)送中斷的哪一個緩沖器,或者說是錯誤中斷最后通過enable_irq()函數(shù)使能S5PV210相應(yīng)的中斷引腳。
          (1)MCP2515初始化。在了SPI的加載和聲明后,就可以利用SPI寫命令對MCP2515進(jìn)行初始化。MCP2515的初始化過程為:首先將控制寄存器CANCTRL的REQOP2:0>位設(shè)置為‘100’進(jìn)入配置模式,所有錯誤計數(shù)器被清零,進(jìn)入配置模式后設(shè)置波特率,禁止所有中斷,設(shè)置濾波器,清除發(fā)送接收緩存,打開中斷,完成MCP2515的初始化。MCP2515初始化過程如圖5所示。

          本文引用地址:http://www.ex-cimer.com/article/148042.htm

          e.JPG


          (2)MCP2515中斷方式。由于CAN接收數(shù)據(jù)時必須與以中斷方式交換數(shù)據(jù),所以必須注冊中斷。使用的中斷函數(shù)有request_irq(),free_irq(),enable_irq()和disable_irq(),其中函數(shù)request_irq()是給定的中斷源裝載中斷處理程序;enable_irq()調(diào)用中斷控制函數(shù)使給定的中斷鏈有效;free_irq()釋放分配給已定中斷的內(nèi)存;disable_irq()使定義中斷鏈?zhǔn)А>唧w代碼為request_irq(irq_EINTO mcp2515_int,IRQF_DISABLED,device_name,NULL);其中函數(shù)request_irq()的第1個參數(shù)是設(shè)備申請的中斷號;第2個參數(shù)是向注冊的中斷處理函數(shù);第3個參數(shù)是中斷處理的屬性,IRQF_DISABLED表示中斷處理程序是一個快速中斷處理程序,被調(diào)用時屏蔽所有中斷;第4個參數(shù)是中斷的設(shè)備名稱;第5個參數(shù)是申請時通知系統(tǒng)的設(shè)備標(biāo)志,該函數(shù)返回值為0表示申請成功,返回負(fù)數(shù)表示失敗,這樣當(dāng)中斷發(fā)生時,在中斷處理函數(shù)mcp2515_int()中讀取CAN狀態(tài)寄存器CANSTAT,判斷RXB0是否裝入報文,如果是則把報文通過SPI接收數(shù)據(jù)寄存器讀取到buff er中,等待系統(tǒng)函數(shù)CAN_Read()讀取。
          (3)MCP2515的核心文件結(jié)構(gòu)file_operations。CAN應(yīng)用程序通過file_operations數(shù)據(jù)結(jié)構(gòu)訪問CAN設(shè)備驅(qū)動函數(shù),/kem el/linux/fs.h>對file_operations數(shù)據(jù)結(jié)構(gòu)中的各個變量做了詳解。內(nèi)核可以通過文件結(jié)構(gòu)來訪問驅(qū)動程序的函數(shù),系統(tǒng)調(diào)用。
          CAN應(yīng)用程序可以通過系統(tǒng)函數(shù)read()和write()實現(xiàn)讀取和寫入相應(yīng)的數(shù)據(jù),open()函數(shù)中完成設(shè)備的打開,close()函數(shù)中完成注銷設(shè)備的工作,ioctl()函數(shù)中需要完成MCP2515控制器的初始化工作:設(shè)置控制器的工作模式、設(shè)置控制的波特率、清空發(fā)送緩沖區(qū)和接收緩沖區(qū)等。
          3.3 CAN驅(qū)動編譯
          (1)將寫好的驅(qū)動源文件拷貝到/kernel/drivers/char/下,并打開Kconfig添加如下代碼:
          config S5pv210_CAN
          tristate“S5pv210 can controller driver”
          depends on ARCH_S5pv210
          help
          This option enable support for CAN
          (2)在/kernel/drivers/char/Makefile文件的適當(dāng)位置添加如下代碼:
          obj-$(CONFIG_S5pv210_CAN)+=S5pv210-can.o
          (3)添加can功能。在/kernel/下make menuconfig DeviceDrivers→Characterdevices→M>S5pv210 cancontroller driver動態(tài)加載CAN驅(qū)動并保存退出。
          (4)重新編譯內(nèi)核。在終端進(jìn)入/kernel/目錄,執(zhí)行make命令后在/kernel/drivers/char/下找到S5pv210_can.o,此為Linux kernel層生成的CAN設(shè)備驅(qū)動文件,kernel層驅(qū)動向下直接操作硬件,向上層也就是HAL層,提供/dev/can設(shè)備節(jié)點文件,提供驅(qū)動接口unclocked_ioctl()函數(shù)。

          4 HAL層的調(diào)用
          CAN驅(qū)動程序在系統(tǒng)下的實現(xiàn),硬件抽象層(HAL)的調(diào)用是關(guān)鍵。將系統(tǒng)移植到其他硬件平臺或在Android系統(tǒng)中添加新硬件支持時,都需要對Android HAL層進(jìn)行移植或?qū)崿F(xiàn)在libhardware接口的頭文件hardware.h中,定義了HAL實現(xiàn)過程中的3個通用結(jié)構(gòu)體struct hw_module_t、struct hw_module_methods_t和struct hw_device_tostruct hw modules_methods_t用來表示一個模塊表示方法,結(jié)構(gòu)體中只包含了打開模塊的函數(shù)指針。struethw_module_t用來定義一個硬件模塊的信息,具體的硬件模塊中,需要“繼承”這個結(jié)構(gòu)體。st ruct hw_device_t用來表示一個硬件設(shè)備,在一個硬件模塊中可以同時包含多個硬件設(shè)備。在一個模塊的HAL層開發(fā)中,具體的硬件調(diào)用流程為:(1)通過ID得到硬件模塊。(2)從硬件模塊得到hw_modules_t,打開得到硬件設(shè)備hw_device_t。(3)調(diào)用hw_device_t中的各個方法。(4)通過hw_device_t的close關(guān)閉設(shè)備。
          Android系統(tǒng)下CAN模塊的實現(xiàn)在完成SPI總線和:MCP2515控制器的驅(qū)動后必須實現(xiàn)Android HAL層的調(diào)用。CAN總線的HAL層調(diào)用流程如圖6所示。

          f.JPG


          編寫HAL層使用struet hw_module_t、struct hw_module_methods_t和struct hw_device_t 3個結(jié)構(gòu)體來設(shè)置對CAN模塊的操作方法;JNI層主要完成對HAL層提供的硬件操作方法的注冊,JNI通過CAN_HARDWARE_MODULE_ID找到對應(yīng)的stub,使Framework層可以使用這些方法;Setv ice層主要聲明了JNI可以提供的方法,加載libcan_runtime.so,加載時會調(diào)用JNI層的JNI_OnLoad,這樣JNI中的方法可以被 Service調(diào)用;編寫App應(yīng)用程序,使App直接調(diào)用service,完成Android HAL層的調(diào)用。之后將can文件夾放到系統(tǒng)development目錄下。
          配置環(huán)境變量執(zhí)行../build/envsetup.sh。然后執(zhí)行mmm development/can編譯文件。最后,重新編譯內(nèi)核,生成鏡像文件,下載并運行操作系統(tǒng)。此時,CAN總線驅(qū)動程序?qū)虞d,這樣就實現(xiàn)了Android系統(tǒng)下CAN控制器MCP2515驅(qū)動程序的開發(fā)。

          5 結(jié)束語
          在分析Android驅(qū)動原理的基礎(chǔ)上,介紹了CAN總線在Android下的實現(xiàn)流程,并添加了CAN驅(qū)動程序在嵌入式操作系統(tǒng)Android中,對其他Android平臺非標(biāo)準(zhǔn)設(shè)備驅(qū)動程序的開發(fā)有一定的借鑒作用。

          塵埃粒子計數(shù)器相關(guān)文章:塵埃粒子計數(shù)器原理

          上一頁 1 2 3 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();