Android驱动开发实例控制LED灯精.docx

上传人:b****4 文档编号:24904170 上传时间:2023-06-02 格式:DOCX 页数:15 大小:57.87KB
下载 相关 举报
Android驱动开发实例控制LED灯精.docx_第1页
第1页 / 共15页
Android驱动开发实例控制LED灯精.docx_第2页
第2页 / 共15页
Android驱动开发实例控制LED灯精.docx_第3页
第3页 / 共15页
Android驱动开发实例控制LED灯精.docx_第4页
第4页 / 共15页
Android驱动开发实例控制LED灯精.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

Android驱动开发实例控制LED灯精.docx

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

Android驱动开发实例控制LED灯精.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1