【嵌入式linux】(第五步):使用eclipse集成开发环境开发第一个嵌入式Linux驱动

2019-07-13 08:14发布

原文地址 :  http://blog.csdn.net/cp1300/article/details/8266806

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项目,空项目
一直下一步,直到下图位置,填好自己的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到这个目录
在刚刚这个终端中执行[cpp] view plaincopy
  1. cat autoconf.h |grep define |awk '{print "" $2 "" $3 ""}' > symbol.xml  

此时打开这个目录/home/cfan/linux/linux-3.0.1/include/generated,会多了一个文件
将 symbol.xml这个文件用文本编辑器打开
此时文本编辑器里面打开了两个xml文件了,将之前导出eclipse的那个xml文件打开,需要添加一行代码,在这两行代码之间(如果有两个,是下面的那个)[html] view plaincopy
  1. <language name="C 源文件">  
  2.   
  3.   
  4.   
  5. language>  
添加[html] view plaincopy
  1. <macro><name>__KERNEL__name><value>1value>macro>  

如下图
添加后

再将刚刚那个symbol.xml文件里面的所有代码复制到[html] view plaincopy
  1. <macro><name>__KERNEL__name><value>1value>macro>  
这行的下一行,如下图
在上面的一个[html] view plaincopy
  1. <language name="C 源文件">  
  2.   
  3.   
  4.   
  5. language>  
添加[cpp] view plaincopy
  1. /home/cfan/linux/linux-3.0.1/include  
  2. /home/cfan/linux/linux-3.0.1/arch/arm/include  
  3. /home/cfan/linux/linux-3.0.1/arch/arm/plat-samsung/include  
  4. /home/cfan/linux/linux-3.0.1/arch/arm/mach-s3c64xx/include  
这里面的路径要看自己实际的内核路径进行修改,也可以在工程属性中一个一个的添加,就是添加一个linux有关的路径而已。
保存退出即可。
再打开eclipse的刚刚那个导出的位置,现在将导出的文件导入即可
点击完成即可,如果导入出问题了,仔细对照我的教程。应用,退出即可,导入后会多了几个路径,内核目录里面的头文件路径


然后新建一个.c文件
代码是之前写的[cpp] view plaincopy
  1. /**************************************************************************************************************** 
  2.  * 文件名称 :   led_drive.c 
  3.  * 简介       :   OK6410 LED驱动 
  4.  * 作者       :   异灵元(cp1300@139.com) 
  5.  * 创建时间 :   2012/08/27 17:28 
  6.  * 修改时间 :   2012/08/27 
  7.  * 说明       :   OK6410 开发板(S3C6410)LED(GPIO)驱动 
  8.  ****************************************************************************************************************/  
  9.   
  10. //系统头文件  
  11. #include   
  12. #include   
  13. #include   
  14. #include   
  15. #include   
  16. #include   
  17. #include   
  18. #include   
  19. #include   
  20. #include   
  21. #include   
  22. #include   
  23. #include   
  24. #include   
  25. #include   
  26. #include   
  27. #include   
  28. #include   
  29. #include   
  30. #include   
  31. #include   
  32. #include   
  33. //--------------------------//  
  34. #include   
  35. #include   
  36. #include   
  37. //--------------------------//  
  38. #include   
  39. #include   
  40. #include   
  41.   
  42.   
  43. ///////////////////////////////////////////////  
  44. //驱动模块名称  
  45. #define DEVICE_NAME "OK6410_LED"  
  46.   
  47. //函数声明  
  48. ///////////////////////////////////////////////  
  49. static long OK6410_LED_ioctl(  
  50.         struct file *file,  
  51.         unsigned int cmd,  
  52.         unsigned long arg);  
  53. static ssize_t OK6410_LED_write(  
  54.         struct file *file,  
  55.         const char __user *buff,  
  56.         size_t size,  
  57.         loff_t *loff);  
  58. static ssize_t OK6410_LED_read(  
  59.         struct file *file,  
  60.         char __user *buff,  
  61.         size_t size,  
  62.         loff_t *loff);  
  63. ///////////////////////////////////////////////////  
  64.   
  65.   
  66. /*  这个结构是字符设备驱动的核心 
  67. *   当应用程序操作设备文件所提供的open,read,write等函数, 
  68. *   最终会调用到这个结构中的对应函数 
  69. */  
  70. static struct file_operations dev_fops = {  
  71.         .owner              = THIS_MODULE,      //这是一个宏,指向编译模块时自动创建的__this_module变量  
  72.         .unlocked_ioctl     = OK6410_LED_ioctl,  
  73.         .read               = OK6410_LED_read,  
  74.         .write              = OK6410_LED_write