開發平台:farsight s5pc100-a
內核:linux2.6.29
環境搭配:有博文介紹
開發環境:Ubuntu 、Eclipse
首先強調一下要點:
1.編寫Android驅動時,首先先要完成linux驅動,因為android驅動其實是在linux驅動基礎之上完成了HAL層(硬件抽象層),如果想要測試的話,自己也要編寫java程序來測試你的驅動。
2.android的根文件系統是eclair_2.1版本。我會上傳做好的根文件系統提供大家。這裡要說的是,android底層內核還是linux的內核,只是進行了一些裁剪。做好的linux內核鏡像,這個我也會上傳給大家。android自己做了一套根文件系統,這才是android自己做的東西。android事實上只是做了一套根文件系統罷了。
假設linux驅動大家都已經做好了。我板子上有四個燈,通過ioctl控制四個燈,給定不同的參數,點亮不同的燈。
相關文件下載:
本文源碼與Android根文件系統、內核zIamge下載
下載在Linux公社的1號FTP服務器裡,下載地址:
FTP地址:ftp://www.linuxidc.com
用戶名:www.linuxidc.com
密碼:www.muu.cc
在 2012年LinuxIDC.com\2月\自己動手寫最簡單的Android驅動---LED驅動的編寫
下載方法見 http://www.linuxidc.net/thread-1187-1-1.html
linux驅動代碼因平台不同而有所不同,這就不黏代碼了。
這是我測試linux驅動編寫的驅動,代碼如下:
[cpp]
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/ioctl.h>
- #define LED_ON _IO ('k',1)
- #define LED_OFF _IO ('k',2)
- int main()
- {
- int i = 0;
- int dev_fd;
- dev_fd = open("/dev/led",O_RDWR);
- if ( dev_fd == -1 ) {
- printf("Cann't open file /dev/led\n");
- exit(1);
- }
- while(1)
- {
- ioctl(dev_fd,LED_ON,1);
- sleep(1);
- ioctl(dev_fd,LED_OFF,1);
- sleep(1);
- ioctl(dev_fd,LED_ON,2);
- sleep(1);
- ioctl(dev_fd,LED_OFF,2);
- sleep(1);
- ioctl(dev_fd,LED_ON,3);
- sleep(1);
- ioctl(dev_fd,LED_OFF,3);
- sleep(1);
- ioctl(dev_fd,LED_ON,4);
- sleep(1);
- ioctl(dev_fd,LED_OFF,4);
- sleep(1);
-
- }
- return 0;
- }
下面開始把linux驅動封裝成android驅動。
首先介紹一下android驅動用到的三個重要的結構體,
struct hw_module_t;
struct hw_device_t;
struct hw_module_methods_t;
android源碼裡面結構體的聲明
[cpp]
- typedef struct hw_module_t {
-
- uint 32_t tag;
-
- uint16_t version_major;
-
- uint16_t version_minor;
-
- const char *id;
-
- const char *name;
-
- const char *author;
-
- const hw_module_methods_t *methods;
-
- void* dso;
-
- uint32_t reserved[32-7];
-
- } hw_module_t;
[cpp]
- typedef struct hw_device_t {
-
- uint32_t tag;
-
- uint32_t version;
-
- struct hw_module_t* module;
-
- uint32_t reserved[12];
-
- int (*close) (struct hw_device_t *device);
-
- }hw_device_t;
[cpp]
- typedef struct hw_module_methods_t {
-
- int (*open) (const struct hw_module_t *module, const char *id,
-
- struct hw_device_t **device);
-
- } hw_module_methods_t;
我們經常會用到這三個結構體。
android驅動目錄結構:
led
|--- hal
| |----jni
| |----- Android.mk
| |----com_farsgiht_server_ledServer.cpp
| |----stub
| |---- include
| | |-----led.h
| |-----module
| |-----Android.mk
| |-----led.c
|--- linux_drv