一、首先编写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!