2011-04-12 09:34
994人閱讀
收藏舉報
本例子,講述在android2.1上完全自已開發乙個驅動去控制硬體口並寫應用測試該驅動,通過這樣乙個例子,解析android下的驅動開發流程的應用呼叫流程,可以說是很好的入門引導
要達到的效果:通過android的應用,呼叫驅動程式,在開發板上控制4個led的亮滅。
一、硬體原理
如上圖,通過4個io口控制這led,低電平led亮,
這4個io口分別是gpm1, gpm2, gpm3, gpm4,
二、驅動程式
1、在kernel資料夾下的driver目錄,新鍵驅動資料夾
# cd kernel_android_2.6.28.6/drivers
進到開發板的kernel目錄,建驅動資料夾
2、在/driver/ledtest目錄下,新建leddriver.c ,leddriver.h , kconfig, makefile 等4個檔案
leddriver.c
leddriver.h檔案
leddriver.h檔案
ssize_t gpio_vib_read(struct file * file,char * buf,size_t count,loff_t * f_ops);
ssize_t gpio_vib_write (struct file * file,const
char * buf, size_t count,loff_t * f_ops);
static
int gpio_vib_ioctl(struct inode *inode, struct file *file, unsigned
int cmd, unsigned
long arg);
ssize_t gpio_vib_open(struct inode * inode,struct file * file);
ssize_t gpio_vib_release(struct inode * inode, struct file * file);
static
int gpio_vib_ctl_init(void);
kconfig檔案
kconfig 檔案
config ledtest
tristate "led test for armeasy"
default n
help
this is a led driver for armeasy with s3c6410
makefile檔案
makefile檔案
obj-$(config_ledtest)+=leddriver.o
3、在核心配置裡選單裡加入本驅動的配置項
達到的效果是,可以通過核心配置來選擇是否把本驅動編譯進核心裡,也就是出現在make menuconfig 後出來的介面裡,可以參考9.8章1)在arch/arm/kconfig檔案裡 menu "device drivers"與 endmenu之間新增
source "drivers/ledtest/kconfig"
2)在drivers/kconfig menu "device drivers" 和 endmenu之間新增
source "drivers/ledtest/kconfig"
3)修改/drivers/makefile檔案
obj-$(config_ledtest) +=ledtest/
4、編譯驅動
在kernel目錄下,終端輸入
#make menuconfig
「device drivers」 下面會看到 「led test for armeasy」,選擇它,
儲存並退出
#make
這樣,就會在/drivers/ledtest目錄下得到leddrivr.ko檔案,它就是驅動目標檔案,已級編譯進了zimage 裡了,只要用這個kernel燒錄到開發板,開機就會自動載入本驅動,
ps,如果發現如上編譯,沒有在ledtest目錄下生成leddriver.ko檔案,也就是本根沒有去編譯本驅動,那就把ledtest目錄入到/drivers/misc目錄下,相應的修改misc下面,然後,在makefile裡,不用選直接寫成obj-y += leddriver.o,這樣強制的包含進去編譯。
三、 應用程式(測試驅動)
用c語言寫乙個應用,測試上面寫的驅動是否工作正常,這是一般的驅動開發流程
主要有兩個檔案:android.mk和ledtest.c
1、在$(your_android)/external/ledtest/目錄編寫ledtest.c檔案,
ledtest.c
ledtest.c
#include
#include
#include
// contact the open(),close(),read(),write() and so on!
#define device_name "/dev/vib"
//device point
#define led_on
0x11
#define led_off
0x22
int main(int argc,char **argv)
else
ret = close(fd); //close device
printf("ret = %d \n",ret);
printf("close gpio_led test \n");
}return 0;}
2、在$(your_android)/external/ ledtest /目錄編寫android.mk檔案。這是android makefile的標準命名,不要更改。android.mk檔案的格式和內容可以參考其他已有的android.mk檔案的寫法,針對helloworld程式的android.mk檔案內容如下:
android.mk
local_path:= $(call my-dir)
include $(clear_vars)
local_src_files:= \/par
hello.c
include $(build_executable)
注意上面local_src_files用來指定原始檔;
local_module指定要編譯的模組的名字,下一步驟編譯時就要用到;
include $(build_executable)表示要編譯成乙個可執行檔案,如果想編譯成動態庫則可用build_shared_library,這些可以在
$(your_android)/build/core/config.mk查到。
3、 回到android源**頂層目錄進行編譯:
例如我這裡的實際操作是
****************************************====
platform_version=2.1-update1
target_build_variant=eng
target_build_type=release
host_arch=x86
host_build_type=release
****************************************====
install: out/host/linux-x86/bin/soslim
install: out/target/product/generic/system/lib/libdl.so
install: out/target/product/generic/system/lib/libstdc++.so4、如上面的編譯結果所示,編譯後的可執行檔案存放在
6、開電,在啟動進入android的過程中,串列埠終端 按回車,進入命令列模式
7、拷貝可執行檔案到根目錄
8、執行程式
通過上面的步驟,可以看到開發板上相應的led在閉,每秒鐘閃一次!
LED燈驅動的編寫
led燈驅動的編寫 一 原理圖 led2 gpx2 7 led3 gpx1 0 led4 gpf3 4 led5 gpf3 5 輸出 0滅 1亮 二 晶元手冊 gpx2con 0x11000c40 31 28 0x1 gpx2dat 0x11000c44 7 0 1 gpx1con 0x11000c...
使用驅動程式點亮LED燈
在最開始之前先來梳理一下點亮led程式的框架 1 通過對驅動程式的框架分析,我們知道第一步都要從入口函式開始,第乙個驅動裡我寫的入口函式很簡單,只是完成了必要操作 這裡的話就要進行改進。2 要點亮led首先要對led使用的引腳進行配置,引腳的模式只用配置一次,所以該部分工作放在開啟裝置檔案時進行,因...
小結 stm32 驅動LED燈
使用位帶操作,位帶操作就是把每個位元膨脹成乙個32位的字,當訪問這些字的時候就訪問這些位元位。然後,埠使能 pb5 pe5 led io void led init void gpio setbits gpiob,gpio pin 5 這個必須要寫,取位址。gpio setbits gpiob,gp...