您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > TQ210 LED驱动 流水灯
TQ210LED驱动及测试1.编写led驱动1.1在系统中创建目录/home/share/led/1.#mkdir–p/home/share/led复制代码进入led目录1.#cd/home/share/led复制代码1.2创建源码文件led_driver.c1.#vimled_driver.c复制代码源码内容见附件一。保存退出.1.3创建并编辑Makefile在该目录下创建Makefile文件,将驱动程序编译成模块。#vimMakefile内容如下:1.oj-m+=led_driver.o2.CURRENT_PATH:=/home/share/led3.LINUX_KERNEL?=/home/share/learning/linux-2.6.354.#LINUX_KERNEL_PATH:=$(LINUX_KERNEL)5.default:6.$(MAKE)-C$(LINUX_KERNEL)m=$(CURRENT_PATH)modules7.clean:8.$(MAKE)-C$(LINUX_KERNEL)M=$(CURRENT_PATH)clean复制代码2.编译TQ210使用天嵌提供交叉编译器,路径:/home/share/tmp/opt/EmbedSky/4.4.6/bin在该目录下直接make即可#make3.测试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_test2on//打开第二个led#./led_test2off//关掉第二个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.#includelinux/miscdevice.h2.#includelinux/input.h3.#includelinux/clk.h4.#includelinux/delay.h5.#includeasm/io.h6.#includeasm/uaccess.h7.#includemach/map.h8.#includemach/gpio.h9.//#includemach/gpio-bank.h10.#includemach/regs-gpio.h11.#includeplat/gpio-core.h12.#includeplat/gpio-cfg.h13.#includeplat/gpio-cfg-helpers.h14.#defineDEVICE_NAMEled15./*应用程序执行ioctl(fd,cmd,arg)时的第2个参数*/16./*thesecondparameterthatapplicationprogramexecute*/17.#defineIOCTL_GPIO_ON118.#defineIOCTL_GPIO_OFF019./*用来指定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_LEDS35.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(;loop11;loop++)45.{cmd=loop%2;46.printk(leds%d%s\n,arg+1,(cmd)?on:off);47.tq210_debug_leds(cmd,arg);48.mdelay(1000);49.}50.}51.#endif52./**53.*函数功能:打开/dev/led设备,设备名是:/dev/led54.*fuction:open/dev/leddevice,devcename:/dev/led55.**/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_ERRfailedtorequestGPC0_3forLVDSPWDNpin\n);64.returnerr;65.}66.err=gpio_request(gpio_table[1],GPC0_4);67.if(err)68.{69.printk(KERN_ERRfailedtorequestGPC0_4forLVDSPWDNpin\n);70.returnerr;71.}72.printk(KERN_INFOledsopened\n);73.for(i=0;isizeof(gpio_table)/sizeof(unsignedlong);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_LEDS80.for(i=0;isizeof(gpio_table)/sizeof(unsignedlong);i++)81.{82.toggle_led(1,i);83.}84.#endif85.return0;86.}87./**88.*函数功能:用于控制led的亮灭89.*fuction:controltheled/turnon&turnoff90.*控制字为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(argsizeof(gpio_table)/sizeof(unsignedlong))101.{102.return-EINVAL;103.}104.switch(cmd)105.{106.caseIOCTL_GPIO_ON:107.//设置指定引脚的输出电平为1108.gpio_direction_output(gpio_table[arg],1);109.//s3c_gpio_setpin(gpio_table[arg],1);110.return0;111.caseIOCTL_GPIO_OFF:112.//设置指定引脚的输出电平为0113.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_INFOTQ210LEDsdriversuccessfullyclose\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.#i
本文标题:TQ210 LED驱动 流水灯
链接地址:https://www.777doc.com/doc-4029798 .html