eclipse arm Linux驱动开发环境搭建
1、建立驱动工程,设置eclipse打开eclipse如下图

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

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

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

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

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

13、添加后

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有关的路径而已。

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

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");//遵循的协议此时会有警告,不管他。

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文件就是你的编译文件的名称,按照自己实际情况修开

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