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

目录

一   打开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文件

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

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

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

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

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

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

十二 给Eclipse项目设置过滤

十三  编写应用程序led_test.c


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 "<macro><name>" $2 "</name><value>" $3 "</value></macro>"}' > symbols_linux.xml

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

<macro><name>__KERNEL__</name><value>1</value></macro> 

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

需要插入的头文件内容如下: 需要根据自己的路径以及开发板类型做相应的修改.

<includepath>/home/ningjw/linux-3.4.2/include</includepath>  
<includepath>/home/ningjw/linux-3.4.2/arch/arm/include</includepath>  
<includepath>/home/ningjw/linux-3.4.2/arch/arm/plat-samsung/include</includepath>  
<includepath>/home/ningjw/linux-3.4.2/arch/arm/mach-s3c24xx/include</includepath>  

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

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

#include <linux/module.h>  //定义了THIS_MODULE宏
#include <linux/fs.h>      //定义了file_operations结构体
#include <asm/uaccess.h>   //定义了copy_to_user函数
#include <asm/io.h>        //定义了ioremap 与iounremap函数
#include <linux/device.h>  //定义了class_create/device_create/class_destory/device_destory函数
                           //定义了class 与 class_device结构体
#include <mach/regs-gpio.h>//包含了GPIO相关宏
#include <linux/gpio.h>    //包含了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\n");
	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 <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

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\n");
	} 
	led_val[0] = 1;
	led_val[1] = 0;
	led_val[2] = 1;
	write(fd, led_val, 3);
	return 0;
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值