网站首页 美食营养 游戏数码 手工爱好 生活家居 健康养生 运动户外 职场理财 情感交际 母婴教育 时尚美容

eclipse arm Linux驱动开发环境搭建

时间:2024-10-14 13:39:57

1、建立驱动工程,设置eclipse打开eclipse如下图

eclipse arm Linux驱动开发环境搭建

2、建议将工程目录选择在NFS共享的那个目录,这样方便从开发板加载驱动或者执行程序,新建一个C项目,空项目

eclipse arm Linux驱动开发环境搭建

3、一直下一步,直到下图位置,填好自己的arm-linux-gcc的路径。

eclipse arm Linux驱动开发环境搭建

4、设置完成后点击完成。

eclipse arm Linux驱动开发环境搭建

5、到这一步新建工程完成了,先别急着添加.c文件。在工程上面右键,属性,到 C/C++常规---->Code Analysis---->路径和符号

eclipse arm Linux驱动开发环境搭建

6、点击下方ExportSettings,将设置导出为xml文件.

eclipse arm Linux驱动开发环境搭建

7、点击确定 应用 退出即可。到开那个.xml文件,用文本编辑器打开即可,

eclipse arm Linux驱动开发环境搭建

8、现在我们还需要将autoconf.h中的宏定义加入到Eclipse中,执行如下步骤打开内核的这个目录 include/generated/ ,我的是 cd /home/cfan/linux/linux-3.0.1/include/generated/ ,另外打开一个终端 cd到这个目录

eclipse arm Linux驱动开发环境搭建

9、在刚刚这个终端中执行[cpp]view plaincopycatautoconf.h|grepdefine|awk媪青怍牙'{print"<macro><name>"$2"</name><value>"$3"</value></macro>"}'>symbo

eclipse arm Linux驱动开发环境搭建

10、打开这个目录/home/cfan/linux/linux-3.0.1/include/generated,会多了一个文件

eclipse arm Linux驱动开发环境搭建

11、将 symbol.xml这个文件用文本编辑器打开

eclipse arm Linux驱动开发环境搭建

12、此时文本编辑器里面打开了两个xml文件了,将之前导出eclipse的那个xml文件打开,需要添加一行代码,在这两行代码之间(剧安颌儿如果有两个,是下面的那个)[html]view plaincopy<languagename="C源文件"></language>添加[html]view plaincopy<macro><name>__KERNEL__</name><value>1</value></macro>如下图

eclipse arm Linux驱动开发环境搭建

13、添加后

eclipse arm Linux驱动开发环境搭建

14、再将刚刚那个symbol.xml文件里面的所有代码复制到[html]view plaincopy<macro><name>__KERNEL__</name><value>1</value></macro>这行的下一行,如下图

eclipse arm Linux驱动开发环境搭建

15、在上面的一个[html]view plaincopy<languagename="C源文件&鳎溻趄酃quot;></language>添加[cpp]view plaincopy<includepath>/home/cfan/linux/linux-3.0.1/include</includepath><includepath>/home/cfan/linux/linux-3.0.1/arch/arm/include</includepath><includepath>/home/cfan/linux/linux-3.0.1/arch/arm/plat-samsung/include</includepath><includepath>/home/cfan/linux/linux-3.0.1/arch/arm/mach-s3c64xx/include</includepath>这里面的路径要看自己实际的内核路径进行修改,也可以在工程属性中一个一个的添加,就是添加一个linux有关的路径而已。

eclipse arm Linux驱动开发环境搭建

16、保存退出即可。再打开eclipse的刚刚那个导出的位置,现在将导出的文件导入即可

eclipse arm Linux驱动开发环境搭建

17、点击完成即可,如果导入出问题了,仔细对照我的教程。应用,退出即可,导入后会多了几个路径,内核目录里面的头文件路径

eclipse arm Linux驱动开发环境搭建

18、然后新建一个.c文件

eclipse arm Linux驱动开发环境搭建

19、代码是之前写的[cpp]view plaincopy/*********涯箨唁峦*******************************************************忮氽阝另*************************************************文件名称:led_drive.c//系统头文件#include<linux/miscdevice.h>#include<linux/delay.h>#include<asm/irq.h>#include<mach/hardware.h>#include<linux/kernel.h>#include<linux/module.h>#include<linux/init.h>#include<linux/mm.h>#include<linux/fs.h>#include<linux/types.h>#include<linux/delay.h>#include<linux/moduleparam.h>#include<linux/slab.h>#include<linux/errno.h>#include<linux/ioctl.h>#include<linux/cdev.h>#include<linux/string.h>#include<linux/list.h>#include<linux/pci.h>#include<asm/uaccess.h>#include<asm/atomic.h>#include<asm/unistd.h>//--------------------------//#include<mach/map.h>#include<mach/regs-clock.h>#include<mach/regs-gpio.h>//--------------------------//#include<plat/gpio-cfg.h>#include<mach/gpio-bank-e.h>#include<mach/gpio-bank-m.h>/////////////////////////////////////////////////驱动模块名称#defineDEVICE_NAME"OK6410_LED"//函数声明///////////////////////////////////////////////staticlongOK6410_LED_ioctl(structfile*file,unsignedintcmd,unsignedlongarg);staticssize_tOK6410_LED_write(structfile*file,constchar__user*buff,size_tsize,loff_t*loff);staticssize_tOK6410_LED_read(structfile*file,char__user*buff,size_tsize,loff_t*loff);////////////////////////////////////////////////////*这个结构是字符设备驱动的核心*当应用程序操作设备文件所提供的open,read,write等函数,*最终会调用到这个结构中的对应函数*/staticstructfile_operationsdev_fops={.owner=THIS_MODULE,//这是一个宏,指向编译模块时自动创建的__this_module变量.unlocked_ioctl=OK6410_LED_ioctl,.read=OK6410_LED_read,.write=OK6410_LED_write};//注册驱动所使用的相关信息staticstructmiscdevicemisc={.minor=MISC_DYNAMIC_MINOR,.name=DEVICE_NAME,//驱动模块名称.fops=&dev_fops,};//LED设备访问信号量structsemaphoreled_sem;/*****************************************************************************************************************函数名:staticint__initOK6410_LED_init(void)*功能:LED模块初始化函数*参数:无*返回:0:成功;<0:失败*依赖:linux底层宏定义*作者:异灵元(cp1300@139.com)*创建时间:2012/08/2717:28*最后修改时间:2012/08/2717:28*说明:初始化LED硬件,注册LED驱动****************************************************************************************************************/staticint__initOK6410_LED_init(void){intret;unsignedintreg;//GPIOM0-3推挽输出reg=readl(S3C64XX_GPMCON);//获取GPIOM寄存器数据reg&=(~0xffff);//清除之前设置reg|=0x1111;//推挽输出writel(reg,S3C64XX_GPMCON);//配置IO模式reg=readl(S3C64XX_GPMDAT);//读取输出寄存器之前数据reg|=0xf;writel(reg,S3C64XX_GPMDAT);//写入1,让所有的灯都熄灭ret=misc_register(&misc);//注册驱动if(ret<0){printk(DEVICE_NAME"can'tinitializedLED!\n");returnret;}init_MUTEX(&led_sem);//注册信号量printk(DEVICE_NAME"initialized\n");return0;//返回成功}/*****************************************************************************************************************函数名:staticlongOK6410_LED_ioctl(structfile*file,unsignedintcmd,unsignedlongarg)*功能:发送命令给LED驱动模块,无实际作用,直接返回0*参数:无作用*返回:0*依赖:无*作者:异灵元(cp1300@139.com)*创建时间:2012/08/2717:28*最后修改时间:2012/08/2717:28*说明:无****************************************************************************************************************/staticlongOK6410_LED_ioctl(structfile*file,unsignedintcmd,unsignedlongarg){return0;}/*****************************************************************************************************************函数名:staticssize_tOK6410_LED_write(structfile*file,constchar__user*buff,size_tsize,loff_t*loff)*功能:写数据到LED驱动模块,低电平灯亮*参数:file:文件指针(无作用);buff:数据缓冲区指针;buff:数据数量;loff:无作用*返回:0:成功;<0:失败*依赖:linux底层宏*作者:异灵元(cp1300@139.com)*创建时间:2012/08/2717:43*最后修改时间:2012/08/2717:43*说明:点灯函数,低电平亮,0-3BIT有效;对应4个LED****************************************************************************************************************/staticssize_tOK6410_LED_write(structfile*file,constchar__user*buff,size_tsize,loff_t*loff){unsignedintreg;if(down_interruptible(&led_sem))//获取信号量return-ERESTARTSYS;reg=readl(S3C64XX_GPMDAT);reg&=(~0xf);reg|=buff[0]&0xf;writel(reg,S3C64XX_GPMDAT);up(&led_sem);//释放信号量return0;}/*****************************************************************************************************************函数名:staticssize_tOK6410_LED_read(structfile*file,char__user*buff,size_tsize,loff_t*loff)*功能:读LED状态,低电平灯亮*参数:file:文件指针(无作用);buff:数据缓冲区指针;buff:数据数量;loff:无作用*返回:0:成功;<0:失败*依赖:linux底层宏*作者:异灵元(cp1300@139.com)*创建时间:2012/08/2717:48*最后修改时间:2012/08/2717:48*说明:读取灯的状态,低电平灯亮,0-3bit有效;对应4个LED****************************************************************************************************************/staticssize_tOK6410_LED_read(structfile*file,char__user*buff,size_tsize,loff_t*loff){unsignedintreg;if(down_interruptible(&led_sem))//获取信号量return-ERESTARTSYS;reg=readl(S3C64XX_GPMDAT);buff[0]=reg|0xfffffff0;up(&led_sem);//释放信号量return0;}/*****************************************************************************************************************函数名:staticvoid__exitOK6410_LED_exit(void)*功能:卸载LED驱动*参数:无*返回:无*依赖:linux底层宏*作者:异灵元(cp1300@139.com)*创建时间:2012/08/2717:50*最后修改时间:2012/08/2717:50*说明:卸载驱动****************************************************************************************************************/staticvoid__exitOK6410_LED_exit(void){unsignedintreg;//GPIOM0-3输入reg=readl(S3C64XX_GPMCON);//获取GPIOM寄存器数据reg&=(~0xffff);//清除之前设置writel(reg,S3C64XX_GPMCON);//配置IO模式misc_deregister(&misc);//卸载驱动}//动态加载驱动接口(必须)module_init(OK6410_LED_init);module_exit(OK6410_LED_exit);//其它信息(非必需)MODULE_AUTHOR("cp1300@139.com");//驱动程序作者MODULE_DESCRIPTION("OK6410(S3C6410)LEDDriver");//一些描述信息MODULE_LICENSE("GPL");//遵循的协议此时会有警告,不管他。

eclipse arm Linux驱动开发环境搭建

20、在工程属性中将自动生成makefile选项去掉

eclipse arm Linux驱动开发环境搭建

21、新建一个makefile文件修改makefile,编译驱动文件[cpp]view plaincopyARCH=armCROSS_COMPILE=arm-linux-obj-m:=led.oKDIR:=/home/cfan/linux/linux-3.0.1PWD:=$(shellpwd)all:$(MAKE)-C$(KDIR)M=$(PWD)modulesclean:$(MAKE)-C$(KDIR)M=$(PWD)cleanled.o文件就是你的编译文件的名称,按照自己实际情况修开

eclipse arm Linux驱动开发环境搭建

22、保存后按 ctrl+B编译工程。完成后会发现目录里面多了一个led.ko,这就是编译好的LED驱动模块。在开发板上面加载驱动,没有NFS的将led.ko复制到开发板中,不管是SD卡还是U盘,有NFS的就好办了,在串口终端中CD到工程目录

eclipse arm Linux驱动开发环境搭建

23、执行 insmod led.ko 加载驱动,加载成功后会发现LED灯都灭了,后面会添加这个驱动的测试程序

eclipse arm Linux驱动开发环境搭建

24、到这里使用eclipse编写驱动就完成了,其实一共就三步,只不过我写的比较详细而已,以后每次建立工程可以直接复制工程或者导入之前的那个xml文件皆可,。在嵌入式驱动开发过程中需要频繁的加载卸载驱动,但是使用rmmod的时候你会发现,驱动无法卸载,如 rmmod led,卸载的时候不需要.ko,直接是模块名。

eclipse arm Linux驱动开发环境搭建
© 2025 一点资料
信息来自网络 所有数据仅供参考
有疑问请联系站长 site.kefu@gmail.com