




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 在Android硬件抽象層(HAL)概要介紹和學(xué)習(xí)計(jì)劃一文中,我們簡(jiǎn)要介紹了在Android系統(tǒng)為為硬件編寫(xiě)驅(qū)動(dòng)程序的方法。簡(jiǎn)單來(lái)說(shuō),硬件驅(qū)動(dòng)程序一方面分布在Linux內(nèi)核中,另一方面分布在用戶空間的硬件抽象層中。接著,在Ubuntu上為Android系統(tǒng)編寫(xiě)Linux內(nèi)核驅(qū)動(dòng)程序一文中舉例子說(shuō)明了如何在Linux內(nèi)核編寫(xiě)驅(qū)動(dòng)程序。在這一篇文章中,我們將繼續(xù)介紹Android系統(tǒng)硬件驅(qū)動(dòng)程序的另一方面實(shí)現(xiàn),即如何在硬件抽象層中增加硬件模塊來(lái)和內(nèi)核驅(qū)動(dòng)程序交互。在這篇文章中,我們還將學(xué)習(xí)到如何在Android系統(tǒng)創(chuàng)建設(shè)備文件時(shí)用類(lèi)似Linux的udev規(guī)則修
2、改設(shè)備文件模式的方法。 一. 參照在Ubuntu上為Android系統(tǒng)編寫(xiě)Linux內(nèi)核驅(qū)動(dòng)程序一文所示,準(zhǔn)備好示例內(nèi)核驅(qū)動(dòng)序。完成這個(gè)內(nèi)核驅(qū)動(dòng)程序后,便可以在Android系統(tǒng)中得到三個(gè)文件,分別是/dev/hello、/sys/class/hello/hello/val和/proc/hello。在本文中,我們將通過(guò)設(shè)備文件/dev/hello來(lái)連接硬件抽象層模塊和Linux內(nèi)核驅(qū)動(dòng)程序模塊。 二. 進(jìn)入到在hardware/libhardware/include/hardware目錄,新建h
3、ello.h文件: USER-NAMEMACHINE-NAME:/Android$ cd hardware/libhardware/include/hardware USER-NAMEMACHINE-NAME:/Android/hardware/libhardware/include/hardware$ vi hello.h hello.h文件的內(nèi)容如下: view plain1. #i
4、fndef ANDROID_HELLO_INTERFACE_H 2. #define ANDROID_HELLO_INTERFACE_H 3. #include <hardware/hardware.h> 4. 5. _BEGIN_DECLS 6. 7. /*定義模塊ID*/ 8. #define HELLO_HARDWARE_MODULE_ID "hello&quo
5、t; 9. 10. /*硬件模塊結(jié)構(gòu)體*/ 11. struct hello_module_t 12. struct hw_module_t common; 13. ; 14. 15. /*硬件接口結(jié)構(gòu)體*/ 16. struct hello_device_t 17.
6、160; struct hw_device_t common; 18. int fd; 19. int (*set_val)(struct hello_device_t* dev, int val); 20. int (*get_val)(struct hello_d
7、evice_t* dev, int* val); 21. ; 22. 23. _END_DECLS 24. 25. #endif 這里按照Android硬件抽象層規(guī)范的要求,分別定義模塊ID、模塊結(jié)構(gòu)體以及硬件接口結(jié)構(gòu)體。在硬件接口結(jié)構(gòu)體中,fd表示設(shè)備文件描述符,對(duì)應(yīng)我們將要處理的設(shè)備文件"/dev/hello",set_val和get_val為該HAL對(duì)上
8、提供的函數(shù)接口。 三. 進(jìn)入到hardware/libhardware/modules目錄,新建hello目錄,并添加hello.c文件。 hello.c的內(nèi)容較多,我們分段來(lái)看。 首先是包含相關(guān)頭文件和定義相關(guān)結(jié)構(gòu): view plain1. #define LOG_TAG "HelloStub" 2. 3. #include <hardwar
9、e/hardware.h> 4. #include <hardware/hello.h> 5. #include <fcntl.h> 6. #include <errno.h> 7. #include <cutils/log.h> 8. #include <cutils/atomic.h> 9. 10. #define
10、0;DEVICE_NAME "/dev/hello" 11. #define MODULE_NAME "Hello" 12. #define MODULE_AUTHOR "shyluo" 13. 14. /*設(shè)備打開(kāi)和關(guān)閉接口*/ 15. static int hello_device_open(const struct hw_modu
11、le_t* module, const char* name, struct hw_device_t* device); 16. static int hello_device_close(struct hw_device_t* device); 17. 18. /*設(shè)備訪問(wèn)接口*/ 19. static int hello_set_val(struct hello_
12、device_t* dev, int val); 20. static int hello_get_val(struct hello_device_t* dev, int* val); 21. 22. /*模塊方法表*/ 23. static struct hw_module_methods_t hello_module_methods = 2
13、4. open: hello_device_open 25. ; 26. 27. /*模塊實(shí)例變量*/ 28. struct hello_module_t HAL_MODULE_INFO_SYM = 29. common: 30. &
14、#160; tag: HARDWARE_MODULE_TAG, 31. version_major: 1, 32. version_minor: 0, 33. id: HELLO_HARDWARE
15、_MODULE_ID, 34. name: MODULE_NAME, 35. author: MODULE_AUTHOR, 36. methods: &hello_module_methods, &
16、#160;37. 38. ; 這里,實(shí)例變量名必須為HAL_MODULE_INFO_SYM,tag也必須為HARDWARE_MODULE_TAG,這是Android硬件抽象層規(guī)范規(guī)定的。 定義hello_device_open函數(shù): view plain1. static int hello_device_open(const
17、60;struct hw_module_t* module, const char* name, struct hw_device_t* device) 2. struct hello_device_t* dev;dev = (struct hello_device_t*)malloc(sizeof(struct hello_device_t); 3.
18、 4. if(!dev) 5. LOGE("Hello Stub: failed to alloc space"); 6. return -EFAULT;
19、 7. 8. 9. memset(dev, 0, sizeof(struct hello_device_t); 10. dev->common.tag = HARDWARE_DEVICE_TAG; 11. dev->common.v
20、ersion = 0; 12. dev->common.module = (hw_module_t*)module; 13. dev->common.close = hello_device_close; 14. dev->set_val = hello_set_val;dev->ge
21、t_val = hello_get_val; 15. 16. if(dev->fd = open(DEVICE_NAME, O_RDWR) = -1) 17. LOGE("Hello Stub: failed to open /dev/he
22、llo - %s.", strerror(errno);free(dev); 18. return -EFAULT; 19. 20. 21. *device = &(dev->common); 22.
23、0; LOGI("Hello Stub: open /dev/hello successfully."); 23. 24. return 0; 25. DEVICE_NAME定義為"/dev/hello"。由于設(shè)備文件是在內(nèi)核驅(qū)動(dòng)里面通過(guò)device_create創(chuàng)建的,而devic
24、e_create創(chuàng)建的設(shè)備文件默認(rèn)只有root用戶可讀寫(xiě),而hello_device_open一般是由上層APP來(lái)調(diào)用的,這些APP一般不具有root權(quán)限,這時(shí)候就導(dǎo)致打開(kāi)設(shè)備文件失敗: Hello Stub: failed to open /dev/hello - Permission denied. 解決辦法是類(lèi)似于Linux的udev規(guī)則,打開(kāi)Android源代碼工程目錄下,進(jìn)入到system/core/rootdir目錄,里面有一個(gè)名為ueventd.rc文件,往里面添加一行:
25、 /dev/hello 0666 root root 定義hello_device_close、hello_set_val和hello_get_val這三個(gè)函數(shù): view plain1. static int hello_device_close(struct hw_device_t* device) 2. str
26、uct hello_device_t* hello_device = (struct hello_device_t*)device; 3. 4. if(hello_device) 5. close(hello_device->fd); 6.
27、0; free(hello_device); 7. 8. 9. return 0; 10. 11. 12. static int hello_set_val(struct hello_device_t* dev, int&
28、#160;val) 13. LOGI("Hello Stub: set value %d to device.", val); 14. 15. write(dev->fd, &val, sizeof(val); 16. 17. &
29、#160; return 0; 18. 19. 20. static int hello_get_val(struct hello_device_t* dev, int* val) 21. if(!val) 22. LOGE("
30、Hello Stub: error val pointer"); 23. return -EFAULT; 24. 25. 26. read(dev->fd, val, sizeof(*val); 27.
31、160; 28. LOGI("Hello Stub: get value %d from device", *val); 29. 30. return 0; 31. 四. 繼續(xù)在hello目錄下新建Android.mk文件: LOCAL_PATH := $(call my-dir) include
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度裝配生產(chǎn)線升級(jí)終止合同書(shū)
- 二零二五年度旅行社導(dǎo)游旅游產(chǎn)品推廣合同
- 人力資源管理培訓(xùn)體系構(gòu)建指南
- 小王子經(jīng)典解讀
- 關(guān)于辦公室設(shè)備維護(hù)的通知申請(qǐng)
- 高效事務(wù)處理手冊(cè)與操作指南
- 食品安全追溯系統(tǒng)合作協(xié)議
- 影視行業(yè)影視作品發(fā)行權(quán)轉(zhuǎn)讓協(xié)議
- 公司債券受托管理合同
- 計(jì)算機(jī)網(wǎng)絡(luò)安全風(fēng)險(xiǎn)防御練習(xí)題
- 康復(fù)科護(hù)士的康復(fù)護(hù)理計(jì)劃的個(gè)性化制定
- 2022年南京鐵道職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能題庫(kù)及答案解析
- 項(xiàng)目一-旅游概述-(旅游概論課件完美版)
- 10G409預(yù)應(yīng)力管樁圖集
- 《電視節(jié)目制作》課件
- 挖掘機(jī)司機(jī)培訓(xùn)服務(wù)投標(biāo)方案(技術(shù)標(biāo) )
- 小學(xué)生主題班會(huì) 愛(ài)國(guó)主義教育 課件(共35張PPT)
- 雇傭保姆免責(zé)協(xié)議7篇(通用)
- 水電站水輪機(jī)調(diào)速器及其附屬設(shè)備安裝施工技術(shù)方案
- XX大學(xué)學(xué)科競(jìng)賽項(xiàng)目申請(qǐng)書(shū)
- 03S702鋼筋混凝土化糞池圖集
評(píng)論
0/150
提交評(píng)論