Android驱动开发实例(控制LED灯)(精)

上传人:ya****h 文档编号:114396131 上传时间:2022-06-28 格式:DOCX 页数:13 大小:45.45KB
收藏 版权申诉 举报 下载
Android驱动开发实例(控制LED灯)(精)_第1页
第1页 / 共13页
Android驱动开发实例(控制LED灯)(精)_第2页
第2页 / 共13页
Android驱动开发实例(控制LED灯)(精)_第3页
第3页 / 共13页
资源描述:

《Android驱动开发实例(控制LED灯)(精)》由会员分享,可在线阅读,更多相关《Android驱动开发实例(控制LED灯)(精)(13页珍藏版)》请在装配图网上搜索。

1、Android驱动例子(LED灯控制)本例子,讲述在Android2.1上完全自已开发一个驱动去控制硬件口并写应用测试该驱动,通过这样一个例子,解析android下的驱动开发流程的应用调用流程,可以说是很好的入门引导要达到的效果:通过Android的应用,调用驱动程序,在开发板上控制4个LED的亮灭。一、硬件原理rii11F|LfeOi1电UFlelEd11:一TSiWLED111圳制:ldiiVSATj1ITFlLED111LED配hi生鼻追“11p如上图,通过4个IO口控制这LED,低电平LED亮,这4个IO口分另U是GPM1,GPM2,GPM3,GPM4,二、驱动程序1、在kernel文

2、件夹下的driver目录,新键驱动文件夹#cdkernel_Android_2.6.28.6/drivers进到开发板的kernel目录,建驱动文件夹#mkdirledtest2、在/driver/ledtest目录下,新建leddriver.c,leddriver.h,Kconfig,Makefile等4个文件leddriver.c1. #include2. #include3. #include4. #include/*Forinit/exit/.*/5. #include6. #include7. #include8. #include9. #include10.#include11.#

3、include12.#include13.#include14.#include15.#include16.#include17.#include/forregisterchrdev(18.#include19.#include20.#includeleddriver.h21.#include/*ForMODULEALIASMISCDEV22.(WATCHDOGMINOR*/23.#include/*Forthewatchdogspecificitems*/24.#include/*Forfileoperations*/25.#defineViberatorMAJOR97/?ee?o?26.#

4、defineSCULLNRDEVS427.#defineSCULLQUANTUM400028.#defineSCULLQSET100029./doastheGIOdriver30. #defineDEVCOUNT431. #defineGIO_MINOR2/*GIOminorno.*/32. staticdev_tdev;/ee?p?p?ee?o?33. staticstructcdev*cdev_p;34. staticintopenCnt;35. /e?a?36. intVIB_major=97;/weasigmentitfortest37. intVIB_minor=0;38. intV

5、IB_nr_devs=SCULL_NR_DEVS;39. intVIB_quantum=SCULL_QUANTUM;40. intVIB_qset=SCULL_QSET;41.41. staticstructclass*vib_dev_class;42. #defineGPNCONS3C64XX_GPNCON43. #defineGPNDATS3C64XX_GPNDAT44. #defineGPNPUDS3C64XX_GPNPUD45. #defineGPMCONS3C64XX_GPMCON46. #defineGPMDATS3C64XX_GPMDAT47. #defineGPMPUDS3C6

6、4XX_GPMPUD49.48. #defineVIB_ON0x1149. #defineVIB_OFF0x2250. staticconststructfile_operationsGPIO_Viberator_ctl_ops=51. .owner=THIS_MODULE,52. .open=GPIO_VIB_open,53. .read=GPIO_VIB_read,54. .write=GPIO_VIB_write,55. .ioctl=GPIO_VIB_ioctl,56. .release=GPIO_VIB_release,57. ;58. ssize_tGPIO_VIB_read(st

7、ructfile*file,char*buf,size_tcount,loff_t*f_ops59. 60. printk(GPIO_VIB_readrn;63.gpiodirectionoutput(S3C64XXGPM(3,0;/64.returncount;65.66.ssizetGPIOVIBwrite(structfile*file,constcharcount,lofft*fops*buf,sizet67.68.printk(GPIOVIBwritern;69.gpiodirectionoutput(S3C64XXGPM(3,1;/70.returncount;71.72.73.i

8、nt/ssizetGPIOVIBioctl(structinode*inode,structcmd,longdatafile*file,unsigned74.intstaticintGPIOVIBioctl(structinode*inode,structcmd,unsignedlongargfile*file,unsigned75.76.printk(KERNERRVIB:GPIOVIBioctl-CMD=%xn,cmd;77.switch(cmd78.79.caseVIBON:80.gpiodirectionoutput(S3C64XXGPM(1,0;/81.gpiodirectionou

9、tput(S3C64XXGPM(2,0;/82.gpiodirectionoutput(S3C64XXGPM(3,0;/83.gpiodirectionoutput(S3C64XXGPM(4,1;/84.printk(KERNERRVIB:GPIOVIBioctl-VIBONn;85.break;86.caseVIBOFF:87.88.printk(KERNERRVIB:GPIOVIBioctl-VIBOFFn;89.gpiodirectionoutput(S3C64XXGPM(1,1;/90.gpiodirectionoutput(S3C64XXGPM(2,1;/91.gpiodirecti

10、onoutput(S3C64XXGPM(3,1;/92.gpiodirectionoutput(S3C64XXGPM(4,0;/93.break;94.95.default:break;96.97.98./gpio_free(S3C64XX_GPN(7;99.100.ssizetGPIOVIBopen(structinode*inode,structfile*file101.102./?eey103./MODINCUSECOUNT;104.printk(GPIOVIBopen(n;105.return0;106.107.ssizetGPIOVIBrelease(structinode*inod

11、e,structfile*file108.109./MOD_DEC_USE_COUNT;/?eey?110.printk(GPIOVIBrelease(n;111.return0;112.113.staticintGPIOVIBCTLinit(void114.115.intret=-ENODEV;116.interror;117.printk(rn;118./3?e?_u119.s3c_gpio_cfgpin(S3C64XX_GPM(1,S3C_GPIO_SFN(1;/GPM1Output120.s3c_gpio_cfgpin(S3C64XX_GPM(2,S3C_GPIO_SFN(1;/GPM

12、2Output121.s3c_gpio_cfgpin(S3C64XX_GPM(3,S3C_GPIO_SFN(1;/GPM3Output122.s3c_gpio_cfgpin(S3C64XX_GPM(4,S3C_GPIO_SFN(1;/GPM4Output123.#if1/*?21?e?xC2a?y?_*/124.ret=registerchrdev(ViberatorMAJOR,viberator,&GPIOViberatorctlops;125.if(ret0126.printk(KERNERRVIB:unabletogetmajor%dn,ret;127.returnret;128.129

13、.?uclclass130.vibdevclass=classcreate(THISMODULE,viberator;131.if(ISERR(vibdevclass132.unregisterchrdev(ViberatorMAJOR,capi20;133.returnPTRERR(vibdevclass;134.135./?“?仲??136.devicecreate(vibdevclass,NULL,MKDEV(ViberatorMAJOR,0,NULL,vib;137./createapointunder/dev/class/vib138./i_1yea自?2?y?_?6?o6?i?自?

14、U/dev/class/eU3euc1vib?Up?6|6?3iDd?ed2uxtu2ux?aup?i_1yuc1open,write,?e?e?ed?ro6?p?6|6?e?ay3iDd?readpeo_ey2ux139.return0;140.#endif141.#if0/*xC2a?i?*/142.if(error=allocchrdevregion(&dev,0,DEVCOUNT,vibrateops=&GPIOViberatorctlops;152.error=cdevadd(cdevp,dev,DEVCOUNT;153.if(error154.printk(KERNERR155.V

15、IB:Couldntcdevadd,error=%dn,error;156.return1;157.158.159.vibdevclass=classcreate(THISMODULE,vib-dev;160.if(ISERR(vibdevclass161.res=PTRERR(vibdevclass;162.gotooutunregclass;163.164.return0;165.#endif166.outunregclass:167.classdestroy(vibdevclass;168.return1;169.170.171.staticintinitS3C6410VIBinit(v

16、oid172.173.intret=-ENODEV;174.p+6?o飞y175.printk(KERNERRAuly:S3C6410VIBinitn;176.ret=GPIOVIBCTLinit(;177.if(ret178.179.printk(KERNERRAuly:S3C6410VIBinit一一Failn;180.returnret;181.182.return0;183.184.staticvoidexitcleanupGPIOVIB(void185.186./x0?uee?187./devfs_unregister_chrdev(Viberator_MAJOR,gpio_vib_

17、ctl;188.#if0189.cdevdel(cdevp;190.unregisterchrdevregion(dev,DEVCOUNT;191.classdestroy(vibdevclass;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_DESCRIPTIO

18、N(Peterfirstdriver;199. MODULE_ALIAS_CHARDEV(Viberator_MAJOR,0;200.200. module_init(S3C6410_VIB_init;201. module_exit(cleanup_GPIO_VIB;leddriver.h文件1. ssize_tGPIO_VIB_read(structfile*file,char*buf,size_tcount,loff_t*f_ops;2. ssize_tGPIO_VIB_write(structfile*file,constchar*buf,size_tcount,loff_t*f_op

19、s;3. staticintGPIO_VIB_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg;4. ssize_tGPIO_VIB_open(structinode*inode,structfile*file;5. ssize_tGPIO_VIB_release(structinode*inode,structfile*file;6. staticintGPIO_VIB_CTL_init(void;Kconfig文件1.configLEDTEST2.tristateLEDtestforARMeasy3

20、.defaultn4.help5.thisisaLEDdriverforARMEASYwithS3C6410Makefile文件1.obj-$(CONFIG_LEDTEST+=leddriver.o3、在内核配置里菜单里加入本驱动的配置项达到的效果是,可以通过内核配置来选择是否把本驱动编译进内核里,也就是出现在makemenuconfig后出来的界面里,可以参考9.8章5小负添加新驱动方法1)在arch/arm/Kconfig文件里menuDeviceDrivers与endmenu之间添加1.sourcedrivers/ledtest/Kconfig2)在drivers/Kcconfigmen

21、uDeviceDrivers和endmenu之间添力口1.sourcedrivers/ledtest/Kconfig3修改/drivers/Makefile文件1.Obj-$(CONFIG_LEDTEST+=ledtest/4、编译驱动在kernel目录下,终端输入1.#makemenuconfig“DeviceDrivers下面会看到“LEDtestforARMeasy,选择它,保存并退出1.#make这样,就会在/drivers/ledtest目录下得到leddrivr.ko文件,它就是驱动目标文件,已级编译进了zImage里了,只要用这个kernel烧录到开发板,开机就会自动加载本驱动,

22、PS,如果发现如上编译,没有在ledtest目录下生成leddriver.ko文件,也就是本根没有去编译本驱动,那就把ledtest目录入到/drivers/misc目录下,相应的修改misc下面,然后,在makefile里,不用选直接写成obj-y+=leddriver.o,这样强制的包含进去编译。三、应用程序(测试驱动)用C语言写一个应用,测试上面写的驱动是否工作正常,这是一般的驱动开发流程主要有两个文件:Android.mk和ledtest.c1、在$(YOUR_Android/external/LEDTEST/目录编写ledtest.c文件,ledtest.cledtest.c1.2.

23、#include3.4.#defineDEv:/dev/vib/devicepoint5.LEDON0x116.#define12.nstartgpio_led_drivertestrn13. fd=open(DEVICE_NAME,O_RDWR;14. printf(fd=%dn15. if(fd=-11617.printf(opendevice%serrorn,DEVICENAME1819.21.23.24. /wait1second25. ioctlfd,LED_ON;26. sleep(1;2728.ret=closefd;/closedevice29printf(et=%dn,ret

24、;30.printf(closegpio_ledtestn;3132return0;332、在$(YOUR_Android/external/LEDTEST/目录编写Android.mk文件。这是AndroidMakefile的标准命名,不要更改。Android.mk文件的格式和内容可以参考其他已有的Android.mk文件的写法,针对helloworld程序的Android.mk文件内容如下:.mk12. LOCAL_PATH:=$(callmy-dir3. include$(CLEAR_VARS4. LOCAL_SRC_FILES:=parhelloC5. LOCAL_MODULE:=le

25、dtestapp6. include$(BUILD_EXECUTABLE注意上面IOCAISRCFIIES用来指定源文件:LOCALMODULE指定要编译的模块的名字,下一步骤编译时就要用到:inelude$(BUILD_EXECUTABLE表示要编译成一个可执行文件,如果想编译成动态库则可用BUTID_SHARFDTBRARY,这些可以在$(YOURAndroid/build/core/config.mk杳到。3、回到Android源代码顶层目录进行编译:#cd$(YOUR_Android&makeledtestapp例如我这里的实际操作是#cdAndroid2.1#makeledtesta

26、pp注意makeledtestapp中的目标名ledtestapp就是上面Android.mk文件中由LOCAL_MODULE指定的模块名。编译结果如下makeledtestappPLATFORM_VERSION_CODENAME=RELPLATFORM_VERSION=21-update1TARGET_PRODUCT=genericTARGET_BUILD_VARIANT=engTARGET_SIMULATOR=TARGET_BUILD_TYPE=releaseTARGET_ARCH=armH0ST_ARCH=x86HOST_OS=linuxHOST_BUILD_TYPE=releaseBU

27、ILD_ID=ECLAIR/bin/bash:line0:cd:sdk/layoutopt/app/src/resources:NosuchfileordirectorytargetthumbC:ledtestapp=external/LEDTEST/ledtest.cInstall:out/host/linux-x86/bin/aprioriInstall:out/host/linux-x86/bin/soslimtargetExecutable:ledtestapp(out/target/product/generic/obj/EXECUTABLES/ledtestapp_intermed

28、iates/LINKED/ledtestapptargetNon-prelinked:ledtestapp(out/target/product/generic/symbols/system/bin/ledtestapptargetStrip:ledtestapp(out/target/product/generic/obj/EXECUTABLES/ledtestapp_intermediates/ledtestappInstall:out/target/product/generic/system/lib/libdl.soInstall:out/target/product/generic/

29、system/lib/libc.soInstall:out/target/product/generic/system/lib/libstdc+.soInstall:out/target/product/generic/system/lib/libm.soInstall:out/target/product/generic/system/bin/ledtestapp4、如上面的编译结果所示,编译后的可执行文件存放在out/target/product/generic/system/bin/目录可执行文件是ledtestapp5、拷贝ledtestapp可执行文件到T卡,插入开发板6、开电,在启动进入Android的过程中,串口终端按回车,进入命令行模式7、拷贝可执行文件到根目录#cp/sdcard/ledtestapp/8、执行程序#/ledtestapp通过上面的步骤,可以看到开发板上相应的LED在闭,每秒钟闪一次!

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!