linux驱动编写及测试简要指导

一、首先编写3个文件,分别为

1、下面为一个简单的驱动程序示例,文件名为led.c

#include 
#include 
#include 
#include 
#include 


static int  led_device_open(struct inode *inode, struct file *file);
static ssize_t led_device_write(struct file *file, const char __user *buf, size_t count, loff_t *f_pos);
static ssize_t led_device_read(struct file *file, char __user *buf,size_t count, loff_t *f_pos);

struct file_operations driver_options = {
	.open = led_device_open,
    .read = led_device_read,
    .write = led_device_write
};

static int device_number = 0;

static int  led_device_open(struct inode *inode, struct file *file)
{
	printk("led open\n");
	return 0;
}

static ssize_t led_device_write(struct file *file, const char __user *buf, size_t count, loff_t *f_pos)
{
	printk("led write\n");
	return 0;
}

static ssize_t led_device_read(struct file *file, char __user *buf,size_t count, loff_t *f_pos)
{
	printk("led read\n");
	return 0;
}

MODULE_LICENSE("GPL");

static int __init led_init(void)
{
	
	device_number = register_chrdev(0, "led_drv", &driver_options);
	if (device_number < 0)
	{
		printk("sorry, register char device failed!");
		return -1;
	}
	printk("led driver initialized!\n");
	return 0;
}

static void __exit led_exit(void)
{
	
	unregister_chrdev(device_number, "led_drv");
	printk("led driver exit!\n");
}

module_init(led_init);
module_exit(led_exit);

2、驱动编译文件 Makefile

KERN_DIR=/lib/modules/4.15.0-43-generic/build
all:
		make -C $(KERN_DIR) M=`pwd` modules
clean:
		make -C $(KERN_DIR) M=`pwd` modules clean
		rm -rf modules.order

obj-m += led.o

注意第一行,为内核源目录,不同版本不同。

示例为unbantu中一个版本。具体哪个版本可以在linux中用uname -a查看

3、驱动测试程序,命名为test_led.c

#include 
#include 
#include 
#include 

int main(void)
{
	int val=1;
	printf("this is led drive test\n");
    int fd = open("/dev/leddev",O_RDWR);
	if(fd<0)
	{
		printf("can't open led device\n");
	}
	write(fd, &val, 4);
	return 0;
}

二、编译及测试方法
1. 本目录传到linux服务器
2.执行make编译。 编译完成后会生成led.ko文件
3.执行insmod led.ko.   安装驱动程序
4. cat /proc/devices|grep led_drv  查看系统分配的设备号sn。 (注:“led_drv"为led.c中注册的设备名)

三、创建设备文件
1、执行以下命令 ,创建设备文件。(注sn为上一步查到的设备号,为一个整形数字)
mknod leddev c sn 0
2、 复制上一步生成的leddev到/dev 目录

四、测试
1. 执行以下命令,编译测试程序
gcc -o test_led test_led.c 
2. 执行下面命令运行测试程序
./test_led

五、内核消息查看及卸载驱动

1. 执行以下命令检查内核消息
dmesg

应当可以看到如下消息内容,中括号内的为时间戳,后面的为led.c中的消息
[1229543.190380] led driver initialized!
[1229550.950369] led open
[1229550.950374] led write

2. 执行 rmmod led (注意此处不用加ko),卸载led.ko驱动.
卸载成功后,dmesg查看内核消息可以看到如下内容
[1228368.334598] led driver exit!

你可能感兴趣的:(物联网)