TQ210 LED驱动 流水灯.docx

上传人:b****5 文档编号:30744817 上传时间:2023-08-20 格式:DOCX 页数:17 大小:20.15KB
下载 相关 举报
TQ210 LED驱动 流水灯.docx_第1页
第1页 / 共17页
TQ210 LED驱动 流水灯.docx_第2页
第2页 / 共17页
TQ210 LED驱动 流水灯.docx_第3页
第3页 / 共17页
TQ210 LED驱动 流水灯.docx_第4页
第4页 / 共17页
TQ210 LED驱动 流水灯.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

TQ210 LED驱动 流水灯.docx

《TQ210 LED驱动 流水灯.docx》由会员分享,可在线阅读,更多相关《TQ210 LED驱动 流水灯.docx(17页珍藏版)》请在冰豆网上搜索。

TQ210 LED驱动 流水灯.docx

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. 

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

当前位置:首页 > 小学教育 > 语文

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

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