利用Eclipse开发Linux驱动.doc_第1页
利用Eclipse开发Linux驱动.doc_第2页
利用Eclipse开发Linux驱动.doc_第3页
利用Eclipse开发Linux驱动.doc_第4页
利用Eclipse开发Linux驱动.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

利用Eclipse开发Linux驱动Eclipse CDT 的使用第一步:下载cygwin(选择从网络直接安装的包)第二步:安装cygwin(如果不做任何配置,将默认安装Cygwin运行最少的程序组件)1, Devel目录: gcc-g+ ,点击“default”,使其选中最新版本2, Devel目录: gcc-core ,点击“default”,使其选中最新版本3, Libs目录: win32api,点击“default”,使其选中最新版本4, Editor目录:vim,点击“default”,使其选中最新版本然后各种确定继续。第三步:配置环境变量PATH: cygwin存放目录的bin目录下,如:F:/cygwin/bin,如果PATH有多个配置项,此项放在最前面。第四步:装cdt插件即可,两种方式(在线或者离线)Restart eclipse, all done!设置Eclipse具有很强大的自动补全功能,在浏览代码和编辑代码的时候用起来十分得心应手,下面我将介绍如何配置Eclipse,让它来帮助我们开放linux驱动。(注意,此处说的Eclipse是Eclipse IDE for C/C+ Developers 。而不是Eclipse IDE for Java Developers 安装CDT插件后)。1、新建一个c project。此项目专门为驱动使用。在右侧project explorer列表中,右键单击刚才新建的项目,选择properties.依次选择c/c+ general - paths and symbols, 在右面选择includes选项卡,languages中选择 GNU C此时在右侧会显示出编译器默认的include路径,好的添加以下内容(mini6410为例)/path/of/kernel/dir/include/path/of/kernel/dir/arch/arm/include/path/of/kernel/dir/arch/arm/plat-samsung/include/path/of/kernel/dir/arch/arm/mach-s3c64xx/include(如果写的是x86下的驱动,用/path/of/kernel/dir/arch/x86/include)再选择Symbols选项卡, 点击下方Export Settings,将设置导出为xml文件.打开该xml文件, 在 标签中,添加_KERNEL_1之后我们还需要将autoconf.h中的宏定义加入到Eclipse中,执行如下步骤plainview plaincopy1. cd/path/of/kernel/dir/include/generated/2. catautoconf.h|grepdefine|awkprint$2$3symbol.xml打开symbol.xml, 将里面的全部内容复制到 刚才xml文件的后面保存文件,点击Import Settings 导入该文件(如果在导入的时候经常提示解析错误,那么应该是xml的格式写错了,一定要好好地检查一下到底是错在哪里了。)点击OK退出properties,再右击项目,选择 Index - Rebuild但是配置到此以后,还是没有办法自动编译。只好使用自己编写的Makefile来编译了。选择项目properties.依次选择c/c+ build - Makefile Generation,将build Direcotry指定为Makefile位置。如$workspace_loc:/HelloDriver。其中的HelloDriver是我的项目根目录。然后自己手动编写Makefile文件。并放置到项目的根目录下。Makefile示例cssview plaincopy1. pwd=$(shellpwd)2. KERNEL_SRC=/lib/modules/$(shelluname-r)/build3. obj-m:=hello.o4. module-objs:=hello.o5. all:6. $(MAKE)-C$(KERNEL_SRC)M=$(PWD)modules7. clean:8. rm-f*o*.*cmd*o*ko*.*cmdhello.mod.c右键选择项目-Make Target-Create。在弹出的对话框中,填写Target Name。此处的名称一般为自己编写Makefile中目标名称。在我的Makefile文件中,我一般写all。同样方法也可以添加clean。此时就可以用Eclipse编写自己的驱动,并且可以通过Make来自动编译驱动程序了。驱动示例之前写Linux驱动都是在纯文本下完成的,最近发现原来可以使用Eclipse来开发,于是捣鼓了半天终于编译成功,感觉还不错。下面以HelloWorld驱动为例说一下使用Eclipse开发ARM-Linux驱动的过程。关于Eclipse和CDT的安装就不说了。安装完Eclipse和CDT后,运行Eclipse,file-New-project选择C/C+里面的CProject,如下图:然后点击Next,填写工程名为hello和设置工程路径,设置如下:点击Next后再点击Next,填写交叉编译器前缀和交叉编译器路径,如下:然后点击finish,此时的工程结构如下图所示,自动包含了几个与交叉编译器相关的头文件路径:右键工程-Propertise,选择C/C+General里的PathsandSymbols,选中在includes选项卡里的GNUC,然后点击右边的Add按钮,添加内核(必须事先已经用交叉编译器编译过)头文件目录,如下:勾选Addtoallconfigurations,然后点击OK,在Symbols选项卡里添加一个Symbols,Name为_KERNEL_,Value为1,如下:勾选Addtoallconfigurations,然后点击OK。再点击OK,此时会弹出一个框,如下,选择YES。编写hello.c文件:1#include/*Neededbyallmodules*/2#include/*NeededforKERN_INFO*/3#include/*Neededforthemacros*/456staticint_inithello_init(void)78printk(KERN_INFOHello,worldn);9return0;101112staticvoid_exithello_exit(void)1314printk(KERN_INFOGoodbye,worldn);151617module_init(hello_init);18module_exit(hello_exit);19MODULE_LICENSE(GPL);编写Makefile文件:1obj-m+=hello.o23PWD=$(shellpwd)45all:6make-C/GT2440/kernel/linux-2M=$(PWD)modules78clean:9rm-f*.o*.ko完成后,如下图:最后,右键工程-Properties-C/C+Build,在BuilderSettings选项卡里取消勾选GenerateMakefilesautomatically,如下:然后单击OK。右键工程-BuildProject编译工程,成功编译效果如下:已经生成hello.ko文件,并且可以看到Console的输出和在终端下编译的输出是一样的。附:要导入原来的C工程的方法是,File-Import,选在General下的ExistingProjectsintoWorkspace,如下:然后点击Next,点击Browse选择要导入的工程的根目录,然后点击Finish。Ubuntu中实现步骤1.准备工作首先得安装好gcc工具链,以及开发环境,可以看看我的前面的几步。还得编译好内核,一般开发板都带了,现在我还不知道配置内核,只能按照开发板默认的去编译,编译前需要先编译uboot,建议像我一样的新手先学会驱动编写,慢慢的去学习 内核的配置裁剪,我觉得到时候这个肯定是非常简单的过程,只不过没有找到门道而已,等我会了一定和大家分享,如果有会的可以教我一下,在下感激不尽。我的嵌入式内核编译的路径为:/home/cfan/linux/linux-3.0.1/ ,这个待会会用到的。今天我就教大家使用eclipse开发一个最简单的驱动程序,LED驱动,其实使用eclipse编译这种简单的驱动可能显得有点麻烦,如果是大工程我想集成开发环境的优势就会体现出来了,还有就是eclipse的编辑器界面比较友好,跟RVDS4.0一样。2.建立驱动工程,设置eclipse打开eclipse可以在桌面上面建立一个指向eclipse的快捷键,或者到eclipse的目录执行 ./eclipse 即可启动,我设置了eclipse的全局变量,因此只需要在终端中输入eclipse即可启动,如下图建议将工程目录选择在NFS共享的那个目录,这样方便从开发板加载驱动或者执行程序,我的就选择在nfs6410这个共享目录里面。新建一个C项目,空项目1.设置一直下一步,直到下图位置,填好自己的arm-linux-gcc的路径。设置完成后点击完成。到这一步新建工程完成了,此时还有重要的一部要做,先别急着添加.c文件。在工程上面右键,属性,到 C/C+常规-Code Analysis-路径和符号点击下方ExportSettings,将设置导出为xml文件.我的道出到桌面上面了,这个大家随意点击确定 应用 退出即可。到你刚才保存的位置处打开那个.xml文件,用文本编辑器打开即可,我的在桌面上面,右键单击,使用文本编辑器打开现在我们还需要将autoconf.h中的宏定义加入到Eclipse中,执行如下步骤打开内核的这个目录 include/generated/ 这个按个人实际情况而定,我的是 cd /home/cfan/linux/linux-3.0.1/include/generated/ ,另外打开一个终端 cd到这个目录在刚刚这个终端中执行cppview plaincopy1. catautoconf.h|grepdefine|awkprint$2$3symbol.xml此时打开这个目录/home/cfan/linux/linux-3.0.1/include/generated,会多了一个文件将 symbol.xml这个文件用文本编辑器打开此时文本编辑器里面打开了两个xml文件了,将之前导出eclipse的那个xml文件打开,需要添加一行代码,在这两行代码之间(如果有两个,是下面的那个)htmlview plaincopy1. 2. 3. 4. 5. 添加htmlview plaincopy1. _KERNEL_1如下图添加后再将刚刚那个symbol.xml文件里面的所有代码复制到htmlview plaincopy1. _KERNEL_1这行的下一行,如下图在上面的一个htmlview plaincopy1. 2. 3. 4. 5. 添加cppview plaincopy1. /home/cfan/linux/linux-3.0.1/include2. /home/cfan/linux/linux-3.0.1/arch/arm/include3. /home/cfan/linux/linux-3.0.1/arch/arm/plat-samsung/include4. /home/cfan/linux/linux-3.0.1/arch/arm/mach-s3c64xx/include这里面的路径要看自己实际的内核路径进行修改,也可以在工程属性中一个一个的添加,就是添加一个linux有关的路径而已。保存退出即可。再打开eclipse的刚刚那个导出的位置,现在将导出的文件导入即可点击完成即可,如果导入出问题了,仔细对照我的教程。应用,退出即可,导入后会多了几个路径,内核目录里面的头文件路径2.C文件然后新建一个.c文件代码是之前写的cppview plaincopy1. /*2. *文件名称:led_drive.c3. *简介:OK6410LED驱动4. *作者:异灵元()5. *创建时间:2012/08/2717:286. *修改时间:2012/08/277. *说明:OK6410开发板(S3C6410)LED(GPIO)驱动8. */9. 10. /系统头文件11. #include12. #include13. #include14. #include15. #include16. #include17. #include18. #include19. #include20. #include21. #include22. #include23. #include24. #include25. #include26. #include27. #include28. #include29. #include30. #include31. #include32. #include33. /-/34. #include35. #include36. #include37. /-/38. #include39. #include40. #include41. 42. 43. /44. /驱动模块名称45. #defineDEVICE_NAMEOK6410_LED46. 47. /函数声明48. /49. staticlongOK6410_LED_ioctl(50. structfile*file,51. unsignedintcmd,52. unsignedlongarg);53. staticssize_tOK6410_LED_write(54. structfile*file,55. constchar_user*buff,56. size_tsize,57. loff_t*loff);58. staticssize_tOK6410_LED_read(59. structfile*file,60. char_user*buff,61. size_tsize,62. loff_t*loff);63. /64. 65. 66. /*这个结构是字符设备驱动的核心67. *当应用程序操作设备文件所提供的open,read,write等函数,68. *最终会调用到这个结构中的对应函数69. */70. staticstructfile_operationsdev_fops=71. .owner=THIS_MODULE,/这是一个宏,指向编译模块时自动创建的_this_module变量72. .unlocked_ioctl=OK6410_LED_ioctl,73. .read=OK6410_LED_read,74. .write=OK6410_LED_write75. ;76. 77. /注册驱动所使用的相关信息78. staticstructmiscdevicemisc=79. .minor=MISC_DYNAMIC_MINOR,80. .name=DEVICE_NAME,/驱动模块名称81. .fops=&dev_fops,82. ;83. 84. /LED设备访问信号量85. structsemaphoreled_sem;86. 87. 88. /*89. *函数名:staticint_initOK6410_LED_init(void)90. *功能:LED模块初始化函数91. *参数:无92. *返回:0:成功;0:失败93. *依赖:linux底层宏定义94. *作者:异灵元()95. *创建时间:2012/08/2717:2896. *最后修改时间:2012/08/2717:2897. *说明:初始化LED硬件,注册LED驱动98. */99. staticint_initOK6410_LED_init(void)100. 101. intret;102. unsignedintreg;103. 104. /GPIOM0-3推挽输出105. reg=readl(S3C64XX_GPMCON);/获取GPIOM寄存器数据106. reg&=(0xffff);/清除之前设置107. reg|=0x1111;/推挽输出108. writel(reg,S3C64XX_GPMCON);/配置IO模式109. reg=readl(S3C64XX_GPMDAT);/读取输出寄存器之前数据110. reg|=0xf;111. writel(reg,S3C64XX_GPMDAT);/写入1,让所有的灯都熄灭112. 113. ret=misc_register(&misc);/注册驱动114. if(ret0)115. 116. printk(DEVICE_NAMEcantinitializedLED!n);117. returnret;118. 119. init_MUTEX(&led_sem);/注册信号量120. printk(DEVICE_NAMEinitializedn);121. return0;/返回成功122. 123. 124. 125. /*126. *函数名:staticlongOK6410_LED_ioctl(127. structfile*file,128. unsignedintcmd,129. unsignedlongarg)130. *功能:发送命令给LED驱动模块,无实际作用,直接返回0131. *参数:无作用132. *返回:0133. *依赖:无134. *作者:异灵元()135. *创建时间:2012/08/2717:28136. *最后修改时间:2012/08/2717:28137. *说明:无138. */139. staticlongOK6410_LED_ioctl(140. structfile*file,141. unsignedintcmd,142. unsignedlongarg)143. 144. return0;145. 146. 147. 148. /*149. *函数名:staticssize_tOK6410_LED_write(150. structfile*file,151. constchar_user*buff,152. size_tsize,153. loff_t*loff)154. *功能:写数据到LED驱动模块,低电平灯亮155. *参数:file:文件指针(无作用);buff:数据缓冲区指针;buff:数据数量;loff:无作用156. *返回:0:成功;0:失败157. *依赖:linux底层宏158. *作者:异灵元()159. *创建时间:2012/08/2717:43160. *最后修改时间:2012/08/2717:43161. *说明:点灯函数,低电平亮,0-3BIT有效;对应4个LED162. */163. staticssize_tOK6410_LED_write(164. structfile*file,165. constchar_user*buff,166. size_tsize,167. loff_t*loff)168. 169. unsignedintreg;170. 171. if(down_interruptible(&led_sem)/获取信号量172. return-ERESTARTSYS;173. reg=readl(S3C64XX_GPMDAT);174. reg&=(0xf);175. reg|=buff0&0xf;176. writel(reg,S3C64XX_GPMDAT);177. up(&led_sem);/释放信号量178. 179. return0;180. 181. 182. 183. /*184. *函数名:staticssize_tOK6410_LED_read(185. structfile*file,186. char_user*buff,187. size_tsize,188. loff_t*loff)189. *功能:读LED状态,低电平灯亮190. *参数:file:文件指针(无作用);buff:数据缓冲区指针;buff:数据数量;loff:无作用191. *返回:0:成功;0:失败192. *依赖:linux底层宏193. *作者:异灵元()194. *创建时间:2012/08/2717:48195. *最后修改时间:2012/08/2717:48196. *说明:读取灯的状态,低电平灯亮,0-3bit有效;对应4个LED197. */198. staticssize_tOK6410_LED_read(199. structfile*file,200. char_user*buff,201. size_tsize,202. loff_t*loff)203. 204. unsignedintreg;205. 206. if(down_interruptible(&led_sem)/获取信号量207. return-ERESTARTSYS;208. reg=readl(S3C64XX_GPMDAT);209. buff0=reg|0xfffffff0;210. up(&led_sem);/释放信号量211. 212. return0;213. 214. 215. 216. 217. /*218. *函数名:staticvoid_exitOK6410_LED_exit(void)219. *功能:卸载LED驱动220. *参数:无221. *返回:无222. *依赖:linux底层宏223. *作者:异灵元()224. *创建时间:2012/08/2717:50225. *最后修改时间:2012/08/2717:50226. *说明:卸载驱动227. */228. staticvoid_exitOK6410_LED_exit(void)229. 230. unsignedintreg;231. 232. /GPIOM0-3输入233. reg=readl(S3C64XX_GPMCON);/获取GPIOM寄存器数据234. reg&=(0xffff);/清除之前设置235. writel(reg,S3C64XX_GPMCON);/配置IO模式236. misc_deregister(&misc);/卸载驱动237. 238. 239. 240. 241. /动态加载驱动接口(必须)242. module_init(OK6410_LED_init);243. module_exit(OK6410_LED_exit);244. /其它信息(非必需)245. MODULE_AUTHOR();/驱动程序作者246. MODULE_DESCRIPTION(OK6410(S3C6410)LEDDriver);/一些描述信息247. MODULE_LICENSE(GPL);/遵循的协议此时会有警告,不管他。在工程属性中将自动生成makefile选项去掉3.makefile文件新建一个makefile文件修改makefile,编译驱动文件cppview plaincopy1. ARCH=arm2. CROSS_COMPILE=arm-linux-3. obj-m:=led.o4. KDIR:=/home/cfan/linux/linux-3.0.15. PWD:=$(shellpwd)6. all:7. $(MAKE)-C$(KDIR)M=$(PWD)modules8. clean:9. $(MAKE)-C$(KDIR)M=$(PWD)cleanled.o文件就是你的编译文件的名称,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论