Android驅(qū)動例子(LED燈控制)_第1頁
Android驅(qū)動例子(LED燈控制)_第2頁
Android驅(qū)動例子(LED燈控制)_第3頁
Android驅(qū)動例子(LED燈控制)_第4頁
Android驅(qū)動例子(LED燈控制)_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、本例子,講述在An droid 2.1上完全自已開發(fā)一個驅(qū)動去控制硬件口并寫應用測試該驅(qū)動, 通過這樣一個例子,解析an droid下的驅(qū)動開發(fā)流程的應用調(diào)用流程,可以說是很好的入門引導要達到的效果:通過An droid的應用,調(diào)用驅(qū)動程序,在開發(fā)板上控制4個LED的亮滅。、硬件原理r os fI ceit'D6 W LEO07 W LED;nLED4/DH LEDbVDO 10VBA1-LED如上圖,通過 4個10 口控制這LED,低電平LED亮,這 4 個 I0 口分別是 GPM1, GPM2, GPM3, GPM4,二、驅(qū)動程序1、在kernel文件夾下的driver目錄,新鍵驅(qū)

2、動文件夾# cd kernel_ An droid /drivers進到開發(fā)板的kernel目錄,建驅(qū)動文件夾#mkdir ledtest2、在 /driver/ledtest 目錄下,新建 leddriver.c , leddriver.h , Kconfig, Makefile 等4個文件leddriver.c3.#include<linux/timer.h>4.#include<linux/init.h>/* For _init/_exit/.*/5.#include<linux/module.h>6.#include<mach/

3、hardware.h>7.#include<asm/io.h>8.#include<asm/uaccess.h>9.#includevplat/gpio-cfg.h>10.#includevplat/regs-clock.h>11.#include<plat/regs-lcd.h>12.#include<plat/regs-gpio.h>13.#include<mach/map.h>14.#include<linux/gpio.h>15.#include<plat/gpio-bank-m.h>

4、16.#include<linux/cdev.h>17.#include<linux/fs.h>/for register_chrdev()18.#include<linux/device.h>19.#include<mach/map.h>20.#include"leddriver.h"21.#include<linux/miscdevice.h>/* For MODULE_ALIAS_MISCDEV22.(WATCHDOG_MINOR) */23.#include<linux/watchdog.h>/

5、* For the watchdog specific items */24.#include<linux/fs.h>/* For file operations */25.#defineViberator_MAJOR97/? -ee± ?o?26.#defineSCULL_NR_DEVS427.#defineSCULL_QUANTUM400028.#defineSCULL_QSET100029./-do as the GIO driver30.#defineDEVCOUNT431.#defineGIO_MINOR2/* GIO minor no. */32.static

6、dev_t dev;/ ee ?g ? g ?* ee士 ? o?33.staticstruct cdev *cdev_p;34.staticint openCnt;35./- e?±?d?36.intVIB_major = 97;/we asigment it for VIB_minor = 0;38.intVIB_nr_devs = SCULL_NR_DEVS;39.int VIB_quantum = SCULL_QUANTUM;40.int VIB_qset = SCULL_QSET;41.42.staticstructclass *vib_dev_clas

7、s;43.#defineGPNCON S3C64XX_GPNCON44.#defineGPNDAT S3C64XX_GPNDAT45.#defineGPNPUD S3C64XX_GPNPUD46.#defineGPMCON S3C64XX_GPMCON47.#define GPMDAT S3C64XX_GPMDAT48.#define GPMPUD S3C64XX_GPMPUD49.50.#define VIB_ON 0x1151.#define VIB_OFF 0x2252.staticconst struct file_operations GPIO_Viberator_ctl_ops=5

8、3.owner= THIS_MODULE,54.open = GPIO_VIB_open,55.read =GPIO_VIB_read,56.write =GPIO_VIB_write,57.ioctl = GPIO_VIB_ioctl,58.release =GPIO_VIB_release,59.;60.ssize_t GPIO_VIB_read(struct file * file,char* buf,size_t count,loff_t *f_ops)61.62.printk(" GPIO_VIB_read rn");63.gpio_direction_outpu

9、t(S3C64XX_GPM(3), 0);/64.return count ;65.66.ssize_t GPIO_VIB_write (struct file * file,const char * buf, size_tcount,loff_t * f_ops)67.68.printk(" GPIO_VIB_write rn");69.gpio_direction_output(S3C64XX_GPM(3), 1);/70.return count;71.72.73.ssize_t GPIO_VIB_ioctl(struct inode * inode,struct f

10、ile *file,unsignedint cmd, long data)74.staticint GPIO_VIB_ioctl(struct inode *inode,struct file*file,unsignedint cmd, unsignedlong arg)75.76.printk(KERN_ERR"VIB:GPIO_VIB_ioctl -CMD=%x n",cmd);77.switch (cmd)78.79.case VIB_ON:80.gpio_direction_output(S3C64XX_GPM(1), 0);/81.gpio_direction_o

11、utput(S3C64XX_GPM(2), 0);/82.gpio_direction_output(S3C64XX_GPM(3), 0);/83.gpio_direction_output(S3C64XX_GPM(4), 1);/84.printk(KERN_ERR"VIB:GPIO_VIB_.ioctl -VIB._ONn");85.break ;86.case VIB_OFF:87.88.printk(KERN_ERR"VIB:GPIO_VIB_ioctl -VIB_OFFn");89.gpio_direction_output(S3C64XX_G

12、PM(1), 1);/90.gpio_direction_output(S3C64XX_GPM(2), 1);/91.gpio_direction_output(S3C64XX_GPM(3), 1);/92.gpio_direction_output(S3C64XX_GPM(4), 0);/93.break ;94.95.default : break ;96.97.98./gpio_free(S3C64XX_GPN(7);99.100.ssize_t GPIO_VIB_open(struct inode * inode,struct file* file)101.102./?£ ?

13、eey103.MOD_INC_USE_COUNT;104.printk("GPIO_VIB_open() n");105.return 0;106.107.ssize_t GPIO_VIB_release(structinode * inode,structfile* file)108.109./ MOD_DEC_USE_COUNT;?£ ?ee y?110.printk("GPIO_VIB_release() n");111.return 0;112.113.staticint GPIO_VIB_CTL_init(void )114.115.

14、int ret = -ENODEV;116.int error ;117.printk("rn");118./3? e ?_? 口119.s3c_gpio_cfgpin(S3C64XX_GPM(1), S3C_GPIO_SFN(1);/GPM1 output120.s3c_gpio_cfgpin(S3C64XX_GPM(2), S3C_GPIO_SFN(1);/GPM2 output121.s3c_gpio_cfgpin(S3C64XX_GPM(3), S3C_GPIO_SFN(1);/GPM3 output122.s3c_gpio_cfgpin(S3C64XX_GPM(4

15、), S3C_GPIO_SFN(1);/GPM4 output123.#if1/*?2 i ? ?e?X 2d?y?_*/124.ret=register_chrdev(Viberator_MAJOR,"viberator",& GPIO_Viberator_ctl_ops);125.if(ret < 0) 126.printk(KERN_ERR"VIB: unable to get major %dn",ret);127.return ret;128.129./''?'uc1class130.vib_dev_cla

16、ss = class_create (T HIS_MODULE,"viberator");131.if (IS_ERR(vib_dev_class) 132.unregister_chrdev(Viberator_MAJOR,"capi20");133.return PTR_ERR(vib_dev_class);134.135./ '' ?mM136.device_create(vib_dev_class,NULL, MKDEV(Viberator_MAJOR,0), NULL, "vib");137./ create

17、 a point under /dev/class/vib138./ 廠 1ye?ad?2? £ ?y?-?6?o6 £uc1vib2 ug?£ ?6 | 6?3i Do?eo ?2 uX ?t? u2uX ?a?up£ ? i"1yuc1open ,write,readge oe y2uX22e2e?eo 22' o 6 22 g 2 6 | 6 2 e 2 a y3 i D£?139.return 0;140.#endif141.#if 0 /* X 0 2 d 2 _i 2*/142.if (error = alloc_

18、chrdev_region(&dev, 0, DEVCOUNT,"vibrate") < 0)143.144.printk(KERN_ERR145."VIB: Couldn't alloc_chrdev_region, error=%dn",146.error);147.return 1;148.149.printk("dev = %d n",dev);150.cdev_p = cdev_alloc();151.cdev_p->ops = & GPIO_Viberator_ctl_ops;152.e

19、rror = cdev_add(cdev_p, dev, DEVCOUNT);153.if (error) 154.printk(KERN_ERR155."VIB: Couldn't cdev_add, error=%dn",error);156.return 1;157.158.159.vib_dev_class = class_create (THIS_MODULE,"vib-dev");160.if (IS_ERR(vib_dev_class) 161.res = PTR_ERR(vib_dev_class);162.goto out_un

20、reg_class;163.164.return 0;165.#endif166.out_unreg_class:167.class_destroy(vib_dev_class);168.return 1;169.170.171.staticint _init S3C6410_VIB_init(void )172.173.int ret = -ENODEV;174./?oey175.printk(KERN_ERR"Auly: S3C6410_VIB_init-n");176.ret = GPIO_VIB_CTL_init();177.if (ret)178.179.prin

21、tk(KERN_ERR"Auly: S3C6410_VIB_init-Fail !n");180.return ret;181.182.return 0;183.184.staticvoid _exit cleanup_GPIO_VIB(void )185.186./?uee±?187./ devfs_unregister_chrdev(Viberator_MAJOR,"gpio_vib_ctl");188.#if 0189.cdev_del(cdev_p);190.unregister_chrdev_region(dev, DEVCOUNT)

22、;191.class_destroy(vib_dev_class);192.#endif193.device_destroy(vib_dev_class, MKDEV(Viberator_MAJOR, 0);194.class_destroy(vib_dev_class);195.unregister_chrdev(Viberator_MAJOR,"viberator");196.197.MODULE_LICENSE( "GPL");198.MODULE_DESCRIPTION( "Peter first driver");199.M

23、ODULE_ALIAS_CHARDEV(Viberator_MAJOR, 0);200.201.module_init(S3C6410_VIB_init);202.module_exit(cleanup_GPIO_VIB);leddriver.h 文件1.* f_ops);ssize_t GPIO_VIB_read(struct file * file,char * buf,size_t count,loff_t2.ssize_t GPIO_VIB_write (struct file * file,const char* buf, size_tcount,loff_t * f_ops);3.

24、staticintGPIO_VIB_ioctl(struct inode*inode,structfile*file,unsignedint cmd,unsignedlong arg);4.ssize_t GPIO_VIB_open(struct inode * inode,struct file *file);5.ssize_t GPIO_VIB_release(structinode *inode,structfile * file);6.staticintGPIO_VIB_CTL_init(void );1.config LEDTEST2.tristate"LED test f

25、or ARMeasy"3.defaultn4.help5.this is a LED driverfor ARMEASY with S3C6410Makefile 文件Kconfig 文件obj-$(CONFIG_LEDTEST)+=leddriver.o1.3、在內(nèi)核配置里菜單里加入本驅(qū)動的配置項達到的效果是,可以通過內(nèi)核配置來選擇是否把本驅(qū)動編譯進內(nèi)核里,也就是出現(xiàn)在makemenuconfig 后出來的界面里,可以參考9.8章雜門droid添加新驅(qū)動方法1) 在 arch/arm/Kconfig 文件里 menu "Device Drivers" 與 end

26、menu 之間添加1.source "drivers/ledtest/Kconfig"2) 在 drivers/Kconfig menu "Device Drivers"和 endmenu 之間添加1.source "drivers/ledtest/Kconfig"3) 修改 /drivers/Makefile 文件1.Obj-$(CONFIG_LEDTEST) +=ledtest/4、編譯驅(qū)動在kernel目錄下,終端輸入1. #make menuconfig“ Device Drivers ” 下面會看到 "LED te

27、st for ARMeasy",選擇它,1.#make保存并退出這樣,就會在/drivers/ledtest 目錄下得到leddrivr.ko 文件,它就是驅(qū)動目標文件,已 級編譯進了 zlmage里了,只要用這個kernel燒錄到開發(fā)板,開機就會自動加載本驅(qū)動,PS如果發(fā)現(xiàn)如上編譯,沒有在 ledtest目錄下生成leddriver.ko 文件,也就是本根沒有 去編譯本驅(qū)動,那就把 ledtest目錄入到/drivers/misc 目錄下,相應的修改 misc下面, 然后,在makefile里,不用選直接寫成 obj-y += leddriver.o ,這樣強制的包含進去編譯。三、

28、應用程序(測試驅(qū)動)用C語言寫一個應用,測試上面寫的驅(qū)動是否工作正常,這是一般的驅(qū)動開發(fā)流程主要有兩個文件:An droid .mk和ledtest.c1、在$(YOUR_Android )/external/LEDTEST/ 目錄編寫 ledtest.c 文件,ledtest.c1.#include<stdio.h>2.#include<stdlib.h>3.#include<fcntl.h>/ contact the open(),close(),read(),write() and soon!4.#defineDEVICE_NAME "/de

29、v/vib"/device point5.#defineLED_ON 0x116.#defineLED_OFF 0 main(int argc, char *argv)8.9.intfd;10.intret;11.char*i;12.printf("n start gpio_led_driver test rn");13.fd = open(DEVICE_NAME,O_RDWR);/Open device ,get the handle14.printf("fd = %d n",fd);15.if (fd = -1)/open

30、fail16.17.printf("open device %s error n",DEVICE_NAME);18.19.else20.21.while (1)22.23.ioctl(fd, LED_OFF);/call the output function to off LEDs24.sleep(1);/wait 1 second25.ioctl(fd, LED_ON);26.sleep(1);27.28.ret = close(fd);/close device29.printf("ret = %d n",ret);30.printf("

31、close gpio_led test n"31.32.return 0;33.2、在 $(YOUR_A ndroid "external/LEDTEST / 目錄編寫 An droid.mk 文件。這是 An droidMakefile的標準命名,不要更改。Android.mk文件的格式和內(nèi)容可以參考其他已有的Android.mk文件的寫法,針對 helloworld 程序的Android.mk文件內(nèi)容如下:1.2. LOCAL_PATH:= $(call my-dir)3. include $(CLEAR_VARS)4. LOCAL_SRC_FILES:= par he

32、llo.c5. LOCAL_MODULE := ledtestapp6. include $(BUILD_EXECUTABLE)注意上面LOCAL_SRC_FILE用來指定源文件;LOCAL_MODULE定要編譯的模塊的名字,下一步驟編譯時就要用到;include $(BUILD_EXECUTABLE)表示要編譯成一個可執(zhí)行文件,如果想編譯成動態(tài)庫則可用 BUILD_SHARED_LIBRARY這些可以在$(YOUR_Android )/build/core/config.mk查至嘰3、回到An droid源代碼頂層目錄進行編譯:# cd $(YOUR_ Android ) &&

33、; make ledtestapp例如我這里的實際操作是#cd An droid 2.1 #make ledtestapp注意 make ledtestapp 中的目標名 ledtestapp 就是上面 Android .mk文件中由 LOCAL_MODULE指定的模塊名。編譯結(jié)果如下make ledtestappPLATFORM_VERSION_CODENAME=REL PLATF0RM_VERSI0N=2.1-update1 TARGET_PRODUCT=ge neric TARGET_BUILD_VARIANT=e ng TARGET_SIMULATOR=TARGET_BUILD_TYPE=release TARGET_ARCH=armHOST_ARCH=x86 HOST_OS=li nux HOST

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論