嵌入式Linux驱动开发IDE - Eclipse配置与使用

2019-07-13 01:00发布

Eclipse官网下载链接: https://www.eclipse.org/downloads/ 使用的linux版本:3.4.2  可在该链接下载制作好的内核:https://pan.baidu.com/s/10r4kku8C0bt8vLampOyvWQ 开发板: jz2440V3 使用的Eclipse版本是:

缺点:只能跳转到声明,不能跳转到定义,有谁知道怎么配置跳转到声明,请告知,感谢!

(试过在library Source添加linux-3.4.2内核的路径,但就是不跳转,在多次尝试过后,也曾有过跳转到定义,但是后面不知道怎么又不跳转了.) 推荐使用Visual Studio Code搭建linux驱动开发环境,详情见:https://blog.csdn.net/Ningjianwen/article/details/88075042  

一   打开Eclipse新建一个C Project,在以下界面需要注意Toolchains栏目选择Cross GCC

 

二   next到Cross GCC Command窗口,做以下配置.

 

三   建立好工程后,按"ALT+ENTER"快捷键,调出Properties窗口,选中"C/C++ Build",做两处修改:1.不勾选Generate Makefiles automatically(不自动生成Makefile,使用自己编写的) 2.Build directory去掉后面的"/Debug"

 

四   点击"C/C++ General -> Paths and Symbols -> Export Setting..."将当前配置导出为symbols.xml文件进行保存(该文件修改好后,还需要从Import Setting导入进来).

五  在 linux3.4.2/include/generated/ 目录下执行命令, 完成后在该目录下生成一个symbols_linux.xml文件

cd linux3.4.2/include/generated/ cat autoconf.h |grep define |awk '{print "" $2 "" $3 ""}' > symbols_linux.xml

六  在symbols_linux.xml文件的开头增加语句:

__KERNEL__1

七  打开之前从eclipse导出的symbols.xml文件如下两处进行修改:

需要插入的头文件内容如下: 需要根据自己的路径以及开发板类型做相应的修改. /home/ningjw/linux-3.4.2/include /home/ningjw/linux-3.4.2/arch/arm/include /home/ningjw/linux-3.4.2/arch/arm/plat-samsung/include /home/ningjw/linux-3.4.2/arch/arm/mach-s3c24xx/include

八  将修改好的symbols.xml文件重新导入Eclipse

九  Eclipse项目下新建led驱动文件led_drv.c,代码如下:

#include //定义了THIS_MODULE宏 #include //定义了file_operations结构体 #include //定义了copy_to_user函数 #include //定义了ioremap 与iounremap函数 #include //定义了class_create/device_create/class_destory/device_destory函数 //定义了class 与 class_device结构体 #include //包含了GPIO相关宏 #include //包含了s3c2410_gpio_cfgpin等io操作函数 #define LED_NUM 3 static struct class *leddrv_class; static struct class_device *leddrv_class_dev; /**应用程序的open函数时,最终会调用该函数,配置LED控制引脚为输出*/ static int led_drv_open(struct inode *inode, struct file *file) { s3c2410_gpio_cfgpin(S3C2410_GPF(4),S3C2410_GPIO_OUTPUT); s3c2410_gpio_cfgpin(S3C2410_GPF(5),S3C2410_GPIO_OUTPUT); s3c2410_gpio_cfgpin(S3C2410_GPF(6),S3C2410_GPIO_OUTPUT); return 0; } /**应用程序的read函数时,最终会调用该函数*/ ssize_t led_drv_read(struct file *file, char __user *buf, size_t size, loff_t *ppos) { unsigned char led_vals[LED_NUM]; if (size > LED_NUM || size < 0) return -EINVAL; led_vals[0] = s3c2410_gpio_getpin(S3C2410_GPF(4)); led_vals[1] = s3c2410_gpio_getpin(S3C2410_GPF(5)); led_vals[2] = s3c2410_gpio_getpin(S3C2410_GPF(6)); copy_to_user(buf, led_vals, size); return size; } /**应用程序的write函数时,最终会调用该函数*/ ssize_t led_drv_write(struct file *file, const char __user *buf, size_t size, loff_t *ppos) { unsigned char led_vals[LED_NUM]; unsigned char i = 0; if ( size < 0 || size > LED_NUM)//3个led return -EINVAL; copy_from_user(led_vals, buf, size); for(i = 0; i< size ; i++){ //GPF4=buf[0],GPF5=buf[1],GPF6=buf[2] s3c2410_gpio_setpin(S3C2410_GPF(4+i),led_vals[i]); } return 0; } static struct file_operations led_drv_fops = { .owner = THIS_MODULE, .open = led_drv_open, .read = led_drv_read, .write = led_drv_write, }; int major; /** *初始化函数在加载该模块时就会调用, *注册设备 */ static int led_drv_init(void) { major = register_chrdev(0, "led_drv", &led_drv_fops); leddrv_class = class_create(THIS_MODULE, "led_drv"); if(IS_ERR(leddrv_class)) return PTR_ERR(leddrv_class); /* 加载模块后,/dev目录下会新增 leds */ leddrv_class_dev = device_create(leddrv_class, NULL, MKDEV(major, 0), NULL, "leds"); if(unlikely(IS_ERR(leddrv_class_dev))) return PTR_ERR(leddrv_class_dev); printk("led_drv_init "); return 0; } static void led_drv_exit(void) { unregister_chrdev(major, "led_drv"); device_destroy(leddrv_class, MKDEV(major, 0));//卸载设备 class_destroy(leddrv_class);//删除class类 } module_init(led_drv_init); module_exit(led_drv_exit); MODULE_LICENSE("GPL");

十  Eclipse项目下新建Makefile文件,内容如下:

KERN_DIR = /home/ningjw/linux-3.4.2 all: make -C $(KERN_DIR) M=`pwd` modules clean: make -C $(KERN_DIR) M=`pwd` modules clean rm -rf modules.order obj-m += led_drv.o

十一 按"Ctrl+B"快捷键,进行编译,可看到成功编译,并生成了led_drv.ko文件,将该文件复制到开发板,执行insmod led_drc.ko 加载该驱动.

                 

十二 给Eclipse项目设置过滤

从上图可以看出,通过make生成的*.o *mod*等等文件都自动添加到项目架构当中了,但这些文件我们又关心,这就可以增加过滤规则,让项目不自动添加这些文件.设置方式如下图所示"Resource->Resource Filter->Exclude all->Add Filter"

十三  编写应用程序led_test.c

该应用程序点亮中间的led灯, 写好后通过命令 arm-linux-gcc -o led_test led_test.c 生成可执行文件,复制led_test到开发板上运行,可发现成功点亮l开发板中间的led灯. #include #include #include #include int main(int argc,char **argv) { int fd; char led_val[3]; int i; fd = open("/dev/leds",O_RDWR); if (fd < 0){ printf("can't open leds "); } led_val[0] = 1; led_val[1] = 0; led_val[2] = 1; write(fd, led_val, 3); return 0; }