開發板:TQ210
OS:Android 4.0.3
以下所有內容都是在TQ210開發板上實現,并且很多內容也是天嵌公司提供,我將一些內容進行了刪減、替換,然后加入了一些自己的理解,同時也是記錄自己學習的旅程。
廢話不多說 先看硬件電路圖 很簡單 通過NPN三極管控制LED的陰極 NPN三極管的基極給高電平 則三級管導通 則LED等點亮 反之則熄滅
LED驅動源碼
led_unders.c
#include #include #include #include #include #include #define DEVICE_NAME 'led_unders' //設備名 #define GPIO_CTIOL_ON 1 //控制LED亮 #define GPIO_CTIOL_OFF 0 //控制LED 滅 static unsigned int gpio_table[]= //引用I/O引腳 { S5PV210_GPC0(3), //開發板的手冊上是GPC1 ,是錯的 S5PV210_GPC0(4), }; static unsigned int gpio_cfg_table[]= //設置IO為輸出 { S3C_GPIO_SFN(1), //設置引腳為輸出 S3C_GPIO_SFN(1), }; static int gpio_led_under_open(struct inode *inode,struct file *file) //打開led_unders設備 { int ret=0,i; for(i=0;i s3c_gpio_cfgpin(gpio_table[i], gpio_cfg_table[i]); //設置引腳為輸出 ret=gpio_direction_output(gpio_table[i],GPIO_CTIOL_OFF); //設置引腳為0 } if(ret==0) printk('led_open success.n'); else {ret=-1; printk('led_open failed.n');} return ret; } static int gpio_led_under_close(struct inode *inode,struct file *file) { printk(KERN_INFO 'led_close success.n'); return 0; } static long gpio_led_under_ioctl(struct file *file,unsigned int cmd,unsigned long arg) //控制哪個led燈亮或者滅 { int ret=0; printk(KERN_INFO 'led ioctl.n'); arg=arg-1; if(arg>sizeof(gpio_table)/sizeof(gpio_table[0])) return -EINVAL; //判斷傳遞的參數是否合法 switch(cmd) { case GPIO_CTIOL_ON: gpio_direction_output(gpio_table[arg],GPIO_CTIOL_ON); //點亮LED break; case GPIO_CTIOL_OFF: gpio_direction_output(gpio_table[arg],GPIO_CTIOL_OFF); //熄滅LED break; default: ret=-1; printk(KERN_INFO 'led ioctl error'); } return ret; } static struct file_operations dev_fops= { .owner=THIS_MODULE, .unlocked_ioctl=gpio_led_under_ioctl, .open=gpio_led_under_open, .release=gpio_led_under_close, }; static struct miscdevice misc_led= { //led混雜設備結構體定義 .minor=MISC_DYNAMIC_MINOR, //動態分配次設備號 .name=DEVICE_NAME, //設備名稱 .fops=&dev_fops, //設備操作結構體 }; static int __init led_init() //led初始化 { int ret; ret=misc_register(&misc_led); //注冊混雜設備成功注冊返回0 if(ret==0) printk(KERN_INFO 'led_init driver success.n'); else { printk(KERN_INFO 'led_init driver failed.n'); ret=-1;} return ret; } static void __exit led_exit() //led卸載 { int ret=misc_deregister(&misc_led); //卸載混雜設備 ,成功返回0 if(ret==0) printk(KERN_INFO 'led_exit driver success.n'); else printk(KERN_INFO 'led_exit driver failed.n'); } //模塊入口與出口 module_init(led_init); module_exit(led_exit); MODULE_LICENSE('GPL'); //gpl許可 Makefile文件 obj-m :=led_unders.o KERNELDIR :=~/java/Kernel_3.0.8_TQ210_for_Android_v1.0/ PWD :=$(shell pwd) build:kernel_module kernel_module: make -C $(KERNELDIR) M=$(PWD) modules clean: make -C $(KERNELDIR) M=$(PWD) clean Makefile的詳細編寫 參看GUN的Makefile手冊 給一個簡單實例連接 http://www.embedu.org/Column/Column310.htm 該驅動模塊采用混雜設備來表示led設備,通過使用misc_register函數告訴內核misc_led設備所擁有的功能, 對于混雜設備我看了看源碼,個人理解misc_register主要做了三件事, 1.通過MISC_DYNAMIC_MINOR這個標志獲取到次設備號 2.通過class_device_create創建/dev/led_unders設備文件 3.通過list_add將misc_led添加到混雜設備鏈表 測試文件 led_under_driver_test.c #include #include #define DEVICE_NAME '/dev/led_unders' //設備名稱 #define GPIO_IOCTL_ON 1 //打開led #define GPIO_IOCTL_OFF 0 //關閉led #define LED1 1 #define LED2 2 /* usage: led1/led2 on/off */ int main(int argc,char **argv) { int fd,ison=0,isnumber=0; fd=open(DEVICE_NAME,O_RDWR); //以可讀可寫的方式打開設備文件 if(fd<0) //判斷是否成功打開文件 { printf('open %s failed.n',DEVICE_NAME); return 0; } if(argc!=3) //判斷參數是否合法 { printf('usage:n'); printf('led1/led2 on/offn'); } if(strcmp(argv[2],'on')==0) ison=GPIO_IOCTL_ON; //判斷是打開還是關閉LED else ison=GPIO_IOCTL_OFF; if(strcmp(argv[1],'led1')==0) isnumber=LED1; //判斷是操作哪一個LED else isnumber=LED2; if(ison!=0&&isnumber!=0) ioctl(fd,ison,isnumber); //操作led return 0; } 通過輸入的參數來控哪個led燈的亮或者滅 編譯文件 Android.mk LOCAL_PATH :=$(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS :=eng LOCAL_SRC_FILES :=led_under_driver_test.c LOCAL_MODULE :=led_unders LOCAL_MODULE_PATH :=$(LOCAL_PATH) include $(BUILD_EXECUTABLE) 對于android編譯系統 可以查看官網 http://www.kandroid.org/online-pdk/guide/build_system.html
上一篇:用定時器去除按鍵抖動
下一篇:TQ210搭載Android4.0.3系統構建之LED從驅動到HAL到JNI到應用程序(HAL篇)
推薦閱讀最新更新時間:2025-04-04 11:58




設計資源 培訓 開發板 精華推薦
- AD9558/PCBZ,用于評估 AD9558 時鐘乘法器的評估板
- SECO-HVDCDC1362-40W-GEVB:40 W SiC 高壓輔助電源,適用于混合動力汽車和電動汽車 純電動汽車應用
- LTC2992HDE 雙向 30V 至 300V 高側功率監視器的典型應用
- ESP32 星核
- LTC2633-HZ10 雙路 10 位數模轉換器的典型應用
- 使用 ROHM Semiconductor 的 BD46355 的參考設計
- LTC1410、12 位、1.25Msps、采樣 A/D 轉換器的典型應用
- LTC2292IUP 演示板,MUX 雙路 ADC,VDD=+3.0V,40Msps,12Bit,1MHz < AIN< 70MHz
- 使用 AD5380 DAC 的 40 通道可編程電壓具有出色的溫漂性能
- AM6TW-4805SZ 5V 6 瓦雙路輸出 DC-DC 轉換器的典型應用