嵌入式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版本是:

嵌入式Linux驱动开发IDE - Eclipse配置与使用_第1张图片

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

(试过在library Source添加linux-3.4.2内核的路径,但就是不跳转,在多次尝试过后,也曾有过跳转到定义,但是后面不知道怎么又不跳转了.)

推荐使用Visual Studio Code搭建linux驱动开发环境,详情见:https://blog.csdn.net/Ningjianwen/article/details/88075042

 

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

嵌入式Linux驱动开发IDE - Eclipse配置与使用_第2张图片

 

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

嵌入式Linux驱动开发IDE - Eclipse配置与使用_第3张图片

 

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

嵌入式Linux驱动开发IDE - Eclipse配置与使用_第4张图片

 

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

嵌入式Linux驱动开发IDE - Eclipse配置与使用_第5张图片

五  在 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文件如下两处进行修改:

嵌入式Linux驱动开发IDE - Eclipse配置与使用_第6张图片需要插入的头文件内容如下: 需要根据自己的路径以及开发板类型做相应的修改.

/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

嵌入式Linux驱动开发IDE - Eclipse配置与使用_第7张图片

九  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\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 加载该驱动.

嵌入式Linux驱动开发IDE - Eclipse配置与使用_第8张图片                 嵌入式Linux驱动开发IDE - Eclipse配置与使用_第9张图片

十二 给Eclipse项目设置过滤

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

嵌入式Linux驱动开发IDE - Eclipse配置与使用_第10张图片

十三  编写应用程序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\n");
	} 
	led_val[0] = 1;
	led_val[1] = 0;
	led_val[2] = 1;
	write(fd, led_val, 3);
	return 0;
}

 

你可能感兴趣的:(嵌入式linux)