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

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

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

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/delay.h>


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 <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

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!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值