TQ210 LED驱动 流水灯.docx
- 文档编号:30744817
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:17
- 大小:20.15KB
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;i 74. { 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;i 81. { 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;i 163. { 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;i 175. { 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.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TQ210 LED驱动 流水灯 LED 驱动 流水
![提示](https://static.bdocx.com/images/bang_tan.gif)