Android驱动开发实例控制LED灯精.docx
- 文档编号:24904170
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:15
- 大小:57.87KB
Android驱动开发实例控制LED灯精.docx
《Android驱动开发实例控制LED灯精.docx》由会员分享,可在线阅读,更多相关《Android驱动开发实例控制LED灯精.docx(15页珍藏版)》请在冰豆网上搜索。
Android驱动开发实例控制LED灯精
Android驱动例子(LED灯控制)
本例子,讲述在Android2.1上完全自已开发一个驱动去控制硬件口并写应用测试该驱动,通过这样一个例子,解析android下的驱动开发流程的应用调用流程,可以说是很好的入门引导
要达到的效果:
通过Android的应用,调用驱动程序,在开发板上控制4个LED的亮灭。
一、硬件原理
如上图,通过4个IO口控制这LED,低电平LED亮,
这4个IO口分别是GPM1,GPM2,GPM3,GPM4,
二、驱动程序
1、在kernel文件夹下的driver目录,新键驱动文件夹
#cdkernel_Android_2.6.28.6/drivers
进到开发板的kernel目录,建驱动文件夹
#mkdirledtest
2、在/driver/ledtest目录下,新建leddriver.c,leddriver.h,Kconfig,Makefile等4个文件
leddriver.c
leddriver.c
1.#include
2.#include
3.#include
4.#include /*For__init/__exit/...*/
5.#include
6.#include
7.#include
8.#include
9.#include
10.#include
11.#include
12.#include
13.#include
14.#include
15.#include
16.#include
17.#include//forregister_chrdev(
18.#include
19.#include
20.#include"leddriver.h"
21.#include /*ForMODULE_ALIAS_MISCDEV
22. (WATCHDOG_MINOR*/
23.#include /*Forthewatchdogspecificitems*/
24.#include /*Forfileoperations*/
25.#defineViberator_MAJOR 97 //?
÷éè±?
o?
26.#defineSCULL_NR_DEVS 4
27.#defineSCULL_QUANTUM 4000
28.#defineSCULL_QSET 1000
29.//---doastheGIOdriver
30.#defineDEVCOUNT 4
31.#defineGIO_MINOR 2 /*GIOminorno.*/
32.staticdev_tdev; //éê?
?
μ?
μ?
?
÷éè±?
o?
33.staticstructcdev*cdev_p;
34.staticintopenCnt;
35.//--è±?
á?
------------
36.intVIB_major =97;//weasigmentitfortest
37.intVIB_minor=0;
38.intVIB_nr_devs=SCULL_NR_DEVS;
39.intVIB_quantum=SCULL_QUANTUM;
40.intVIB_qset=SCULL_QSET;
41.
42.staticstructclass*vib_dev_class;
43.#defineGPNCON S3C64XX_GPNCON
44.#defineGPNDAT S3C64XX_GPNDAT
45.#defineGPNPUD S3C64XX_GPNPUD
46.#defineGPMCONS3C64XX_GPMCON
47.#defineGPMDAT S3C64XX_GPMDAT
48.#defineGPMPUDS3C64XX_GPMPUD
49.
50.#defineVIB_ON0x11
51. #defineVIB_OFF0x22
52.staticconststructfile_operationsGPIO_Viberator_ctl_ops={
53. .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_tGPIO_VIB_read(structfile*file,char*buf,size_tcount,loff_t*f_ops
61.{
62. printk("GPIO_VIB_read\r\n";
63. gpio_direction_output(S3C64XX_GPM(3,0;//
64. returncount;
65.}
66.ssize_tGPIO_VIB_write(structfile*file,constchar*buf,size_tcount,loff_t*f_ops
67.{
68. printk("GPIO_VIB_write\r\n";
69. gpio_direction_output(S3C64XX_GPM(3,1;//
70. returncount;
71.}
72.
73.//ssize_tGPIO_VIB_ioctl(structinode* inode,structfile*file,unsignedintcmd,longdata
74.staticintGPIO_VIB_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg
75.{
76. printk(KERN_ERR"VIB:
GPIO_VIB_ioctl--CMD=%x\n",cmd;
77. switch(cmd
78. {
79. caseVIB_ON:
80. gpio_direction_output(S3C64XX_GPM(1,0;//
81. gpio_direction_output(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_ON\n";
85. break;
86. caseVIB_OFF:
87. {
88. printk(KERN_ERR"VIB:
GPIO_VIB_ioctl--VIB_OFF\n";
89. gpio_direction_output(S3C64XX_GPM(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_tGPIO_VIB_open(structinode*inode,structfile*file
101.{
102.//?
£?
éêy
103. //MOD_INC_USE_COUNT;
104. printk("GPIO_VIB_open(\n";
105. return0;
106.}
107.ssize_tGPIO_VIB_release(structinode*inode,structfile*file
108.{
109. //MOD_DEC_USE_COUNT;//?
£?
éêy?
?
110. printk("GPIO_VIB_release(\n";
111. return0;
112.}
113.staticintGPIO_VIB_CTL_init(void
114.{
115. intret =-ENODEV;
116. interror;
117. printk("----------------------------------------------\r\n";
118. //3?
ê?
?
ˉú
119. s3c_gpio_cfgpin(S3C64XX_GPM(1,S3C_GPIO_SFN(1;//GPM1output
120. s3c_gpio_cfgpin(S3C64XX_GPM(2,S3C_GPIO_SFN(1;//GPM2output
121. s3c_gpio_cfgpin(S3C64XX_GPM(3,S3C_GPIO_SFN(1;//GPM3output
122. s3c_gpio_cfgpin(S3C64XX_GPM(4,S3C_GPIO_SFN(1;//GPM4output
123.#if1/*?
2ì?
·?
ê?
×¢2á?
y?
ˉ*/
124.ret=register_chrdev(Viberator_MAJOR,"viberator",&GPIO_Viberator_ctl_ops;
125.if(ret<0{
126. printk(KERN_ERR"VIB:
unabletogetmajor%d\n",ret;
127. returnret;
128.}
129.//′′?
¨\uc1class
130.vib_dev_class=class_create(THIS_MODULE,"viberator";
131.if(IS_ERR(vib_dev_class{
132. unregister_chrdev(Viberator_MAJOR,"capi20";
133. returnPTR_ERR(vib_dev_class;
134.}
135.//′′?
¨?
úμ?
£?
136.device_create(vib_dev_class,NULL,MKDEV(Viberator_MAJOR,0,NULL,"vib";
137.//createapointunder/dev/class/vib
138.//í¨1yéaá?
2?
£?
?
y?
ˉ?
ó?
?
oó£?
?
í?
á?
ú/dev/class/éú3é\uc1vib?
úμ?
£?
ó|ó?
3ìDò?
éò2ù×÷tù2ù×÷?
aúμ?
£?
í¨1y\uc1open,write,readμèoˉêy2ù×÷£?
?
ê?
é?
éò?
?
′oó?
?
μ?
ó|ó?
ê?
ày3ìDò?
£
139. return0;
140.#endif
141.#if0/*×¢2á?
ˉì?
*/
142. if((error=alloc_chrdev_region(&dev,0,DEVCOUNT,"vibrate"<0
143. {
144. printk(KERN_ERR
145. "VIB:
Couldn'talloc_chrdev_region,error=%d\n",
146. error;
147. return1;
148. }
149. printk("dev=%d \n",dev;
150. cdev_p=cdev_alloc(;
151. cdev_p->ops=&GPIO_Viberator_ctl_ops;
152. error=cdev_add(cdev_p,dev,DEVCOUNT;
153. if(error{
154. printk(KERN_ERR
155. "VIB:
Couldn'tcdev_add,error=%d\n",error;
156. return1;
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. gotoout_unreg_class;
163. }
164. return0;
165.#endif
166.out_unreg_class:
167. class_destroy(vib_dev_class;
168.return1;
169.}
170.
171.staticint__initS3C6410_VIB_init(void
172.{
173. intret=-ENODEV;
174. //μ÷ó?
oˉêy
175. printk(KERN_ERR"Auly:
S3C6410_VIB_init---\n";
176. ret=GPIO_VIB_CTL_init(;
177. if(ret
178. {
179. printk(KERN_ERR"Auly:
S3C6410_VIB_init--Fail\n";
180. returnret;
181. }
182. return0;
183.}
184.staticvoid__exitcleanup_GPIO_VIB(void
185.{
186. //×¢?
úéè±?
187. // devfs_unregister_chrdev(Viberator_MAJOR,"gpio_vib_ctl";
188.#if0
189. cdev_del(cdev_p;
190. unregister_chrdev_region(dev,DEVCOUNT;
191. class_destroy(vib_dev_class;
192.#endif
193.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("Peterfirstdriver";
199.MODULE_ALIAS_CHARDEV(Viberator_MAJOR,0;
200.
201.module_init(S3C6410_VIB_init;
202.module_exit(cleanup_GPIO_VIB;
leddriver.h文件
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_ops;
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文件
Kconfig文件
1.configLEDTEST
2. tristate"LEDtestforARMeasy"
3. defaultn
4. help
5. thisisaLEDdriverforARMEASYwithS3C6410
Makefile文件
Makefile文件
1.obj-$(CONFIG_LEDTEST+=leddriver.o
3、在内核配置里菜单里加入本驱动的配置项
达到的效果是,可以通过内核配置来选择是否把本驱动编译进内核里,也就是出现在makemenuconfig后出来的界面里,可以参考9.8章
1)在arch/arm/Kconfig文件里menu"DeviceDrivers"与endmenu之间添加
1.source"drivers/ledtest/Kconfig"
2)在drivers/Kconfigmenu"DeviceDrivers"和endmenu之间添加
1.source"drivers/ledtest/Kconfig"
3修改/drivers/Makefile文件
1.Obj-$(CONFIG_LEDTEST+=ledtest/
4、编译驱动
在kernel目录下,终端输入
1.#makemenuconfig
“DeviceDrivers”下面会看到“LEDtestforARMeasy”,选择它,
保存并退出
1.#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
1.#include
2.#include
3.#include//contacttheopen(,close(,read(,write(andsoon!
4.#define"/dev/vib"//devicepoint
5.#defineLED_ON 0x11
6.#define
7.intmain(intargc,char**argv
8.
9. intfd;
10.int
11. char*i;
12."\nstartgpio_led_drivertest\r\n"
13. fd=open(DEVICE_NAME,O_RDWR;//Opendevice,getthehandle
14."fd=%d\n"
15. if(fd==-1//openfail
16.
17. printf("opendevice%serror\n",DEVICE_NAME;
18.
19. else
20.
21. while(1
22.
23. ioctl(fd,LED_OFF;//calltheoutputfunctiontooffLEDs
24.//wait1second
25. ioctl(fd,LED_ON;
26. sleep(1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 驱动 开发 实例 控制 LED 灯精