TQ210 LED驱动 流水灯.docx
《TQ210 LED驱动 流水灯.docx》由会员分享,可在线阅读,更多相关《TQ210 LED驱动 流水灯.docx(17页珍藏版)》请在冰豆网上搜索。
TQ210LED驱动流水灯
TQ210LED驱动及测试
1. 编写led驱动
1.1在系统中创建目录/home/share/led/
1.#mkdir–p/home/share/led
复制代码
进入led目录
1.#cd/home/share/led
复制代码
1.2创建源码文件led_driver.c
1.#vimled_driver.c
复制代码
源码内容见附件一。
保存退出.
1.3创建并编辑Makefile
在该目录下创建Makefile文件,将驱动程序编译成模块。
#vimMakefile
内容如下:
1.oj-m+=led_driver.o
2.CURRENT_PATH:
=/home/share/led
3.LINUX_KERNEL?
=/home/share/learning/linux-2.6.35
4.#LINUX_KERNEL_PATH:
=$(LINUX_KERNEL)
5.default:
6. $(MAKE)-C$(LINUX_KERNEL)m=$(CURRENT_PATH)modules
7.clean:
8. $(MAKE)-C$(LINUX_KERNEL)M=$(CURRENT_PATH)clean
复制代码
2. 编译
TQ210使用天嵌提供交叉编译器,路径:
/home/share/tmp/opt/EmbedSky/4.4.6/bin
在该目录下直接make即可
#make
3. 测试led驱动
测试代码:
见附件二
使用交叉编译工具编译程序:
1.#arm-linux-gcc-oled_testled_test.c
将生成的可执行程序led_test复制到nfs文件系统/home/share/nfsboot/rootfs中/mnt目录下;
在超级终端上控制开发板。
挂载好nfs文件系统:
1.#mount–tnfs10.10.84.41:
/home/share/nfsboot/rootfs–onolock/mnt
进入挂载在/mnt目录下的nfs文件系统内并且进入内部/mnt目录下:
#cd/mnt //此目录是开发版的子目录
#cd/mnt //此目录是挂载的宿主机上的nfs文件系统的子目录
执行可执行文件:
1.#./led_test
出现段错误提示,原因参数不正确,还需要输入led的序号,以及开关指令。
测试程序没有做好参数检查,所以会段错误在代码中对argc进行判断即可。
#./led_test 2 on //打开第二个led
#./led_test 2 off //关掉第二个led
开发板上两个LED灯均能正确控制,至此led驱动及测试代码试验完成。
附件一led驱动源码
/***********************************************************************************
*drivers/char/tq210_leds.c
*功能简要:
* 该驱动注册一个字符设备“/dev/led”,用于2个LED。
*函数简介:
* staticvoidtq210_debug_leds(unsignedintcmd,unsignedlongarg),用于内核驱动调试
*提供的外部接口:
* ioctol(structinode*inode,structfile*file,unsignedintbrightness);
* 用于LED的亮,灭。
*调用实例:
* 提供控制台,命令式的测试程序。
*
1.#include
2.#include
3.#include
4.#include
5.#include
6.#include
7.#include
8.#include
9.//#include
10.#include
11.#include
12.#include
13.#include
14.#defineDEVICE_NAME"led"
15./*应用程序执行ioctl(fd,cmd,arg)时的第2个参数*/
16./*thesecondparameterthatapplicationprogramexecute*/
17.#defineIOCTL_GPIO_ON 1
18.#defineIOCTL_GPIO_OFF 0
19./*用来指定LED所用的GPIO引脚*/
20./*appointthepintheLEDwilluse*/
21.staticunsignedlonggpio_table[]=
22.{
23. S5PV210_GPC0(3),
24. S5PV210_GPC0(4),
25.};
26./*用来指定GPIO引脚的功能:
输出*/
27./*appointthefunctionofthepin:
output*/
28.staticunsignedintgpio_cfg_table[]=
29.{
30. S3C_GPIO_SFN
(1),
31. S3C_GPIO_SFN
(1),
32.};
33.//staticchargpio_name[][]={{"GPC0_3"},{"GPC0_4"}};
34.#ifdefCONFIG_TQ210_DEBUG_LEDS
35.staticvoidtq210_debug_leds(unsignedintcmd,unsignedlongarg)
36.{
37. gpio_direction_output(gpio_table[arg],cmd);
38. //s3c_gpio_setpin(gpio_table[arg],cmd);
39.}
40.staticvoidtoggle_led(unsignedintcmd,unsignedlongarg)
41.{
42. intloop=0;
43. printk("%s:
led%ldtogglenow:
\n",__func__,arg);
44. for(;loop<11;loop++)
45. { cmd=loop%2;
46. printk("leds%d%s\n",arg+1,(cmd)?
"on":
"o ff");
47. tq210_debug_leds(cmd,arg);
48. mdelay(1000);
49. }
50.}
51.#endif
52./**
53.*函数功能:
打开/dev/led设备,设备名是:
/dev/led
54.*fuction:
open/dev/leddevice,devcename:
/dev/led
55.**/
56.staticinttq210_gpio_open(structinode*inode,structfile*file)
57.{
58. inti;
59. interr;
60. err=gpio_request(gpio_table[0],"GPC0_3");
61. if(err)
62. {
63. printk(KERN_ERR"failedtorequestGPC0_3forLVDSPWDNpin\n");
64. returnerr;
65. }
66. err=gpio_request(gpio_table[1],"GPC0_4");
67. if(err)
68. {
69. printk(KERN_ERR"failedtorequestGPC0_4forLVDSPWDNpin\n");
70. returnerr;
71. }
72. printk(KERN_INFO"ledsopened\n");
73. for(i=0;i74. {
75. s3c_gpio_cfgpin(gpio_table,gpio_cfg_table);
76. gpio_direction_output(gpio_table,0);
77. //s3c_gpio_setpin(gpio_table,0);
78. }
79.#ifdefCONFIG_TQ210_DEBUG_LEDS
80. for(i=0;i81. {
82. toggle_led(1,i);
83. }
84.#endif
85. return0;
86.}
87./**
88.*函数功能:
用于控制led的亮灭
89.*fuction:
controltheled/turnon&turnoff
90.*控制字为cmd,arg为控制哪个灯的亮灭取值范围为0-1:
cmd为IOCTL_GPIO_ON时亮,cmd为IOCTL_GPIO_OFF为灭
91.*controlbyteiscmd;argappointedwhichledwilebeturnonoroff,itcanbe0and1;IOCTL_GPIO_ON:
turnon,IOCTL_GPIO_OFF:
turnoff.
92.**/
93.staticlongtq210_gpio_ioctl(
94. structinode*inode,
95. structfile*file,
96. unsignedintcmd,
97. unsignedlongarg)
98.{
99. arg-=1;
100. if(arg>sizeof(gpio_table)/sizeof(unsignedlong))
101. {
102. return-EINVAL;
103. }
104. switch(cmd)
105. {
106. caseIOCTL_GPIO_ON:
107. //设置指定引脚的输出电平为1
108. gpio_direction_output(gpio_table[arg],1);
109. //s3c_gpio_setpin(gpio_table[arg],1);
110. return0;
111. caseIOCTL_GPIO_OFF:
112. //设置指定引脚的输出电平为0
113. gpio_direction_output(gpio_table[arg],0);
114. //s3c_gpio_setpin(gpio_table[arg],0);
115. return0;
116. default:
117. return-EINVAL;
118. }
119.}
120.staticinttq210_gpio_close(structinode*inode,structfile*file)
121.{
122. gpio_free(gpio_table[0]);
123. gpio_free(gpio_table[1]);
124. printk(KERN_INFO"TQ210LEDsdriversuccessfullyclose\n");
125. return0;
126.}
127./*驱动接口设置*/
128./*settingtheinterfaceofthedriver*/
129.staticstructfile_operationsdev_fops={
130. .owner = THIS_MODULE,
131. .ioctl = tq210_gpio_ioctl,
132. .open= tq210_gpio_open,
133. .release= tq210_gpio_close,
134.};
135./*设备结构的设置*/
136./*settingthearchitectureofthedevice*/
137.staticstructmiscdevicemisc={
138. .minor=MISC_DYNAMIC_MINOR,
139. .name=DEVICE_NAME,
140. .fops=&dev_fops,
141.};
142./*初始化设备,配置对应的IO,以及注册设备*/
143./*initthedevice,configtherightIOandregisterthedevice*/
144.staticint__initdev_init(void)
145.{
146. intret;
147. inti;
148. interr;
149. #ifdefCONFIG_TQ210_DEBUG_LEDS
150. err=gpio_request(gpio_table[0],"GPC0_3");
151. if(err)
152. {
153. printk(KERN_ERR"failedtorequestGPC0_3forLVDSPWDNpin\n");
154. returnerr;
155. }
156. err=gpio_request(gpio_table[1],"GPC0_4");
157. if(err)
158. {
159. printk(KERN_ERR"failedtorequestGPC0_4forLVDSPWDNpin\n");
160. returnerr;
161. }
162. for(i=0;i163. {
164. //gpio_request(gpio_table[0],gpio_name);
165. s3c_gpio_cfgpin(gpio_table,gpio_cfg_table);//配置管脚为输出configthepintooutput
166. gpio_direction_output(gpio_table,0);
167. //s3c_gpio_setpin(gpio_table,0);//设置管脚为低电平configthepintolowlevel
168. s3c_gpio_setpull(gpio_table,S3C_GPIO_PULL_NONE);
169. }
170. #endif
171. ret=misc_register(&misc);
172. printk(KERN_INFO"TQ210LEDsdriversuccessfullyprobed\n");
173. #ifdefCONFIG_TQ210_DEBUG_LEDS
174. for(i=0;i175. {
176. toggle_led(1,i);
177. }
178. #endif
179. returnret;
180.}
181./*注销设备*/
182./*logoutthedevice*/
183.staticvoid__exitdev_exit(void)
184.{
185. misc_deregister(&misc);
186. gpio_free(gpio_table[0]);
187. gpio_free(gpio_table[1]);
188. printk(KERN_INFO"TQ210LEDsdriversuccessfullyexit\n");
189.}
190.module_init(dev_init);
191.module_exit(dev_exit);
192.MODULE_LICENSE("GPL");
193.MODULE_AUTHOR("");
194.MODULE_DESCRIPTION("LEDS'Driver");
195.附件二led测试源码
196./*FILENAME:
led_test.c
197.*AUTHOR:
MichaelLi
198.*DATE:
2013-06-03
199.*DESCRIPTION:
thetestoftheleddriver
200.**/
201.#include
202.#include
203.#defineDEVICENAME"/dev/led"
204.#defineIOCTL_LED_ON1
205.#defineIOCTL_LED_OFF0
206.intmain(intargc,char**argv)
207.{
208. FILE*fd;
209. intled_no=0;
210. fd=(FILE*)open(DEVICENAME,0);
211. if(argc<3)
212. {
213. printf("Theargumentsyouinputarewrong\n");
214. printf("USE:
\n");
215. printf("\t\t./program\tled-number\ton/off\n");
216. return-1;
217. }
218. //led_no=strtoul(argv[1],0,0)-1;//itswrongtosetlikethis
219. led_no=strtoul(argv[1],0,0);//operatetheled_1byinput1andled_2byinput2
220. printf("111111\n");
221. if(!
strcmp(argv[2],"on"))//turnontheled
222. {
223.