一、驱动概要
二、步骤
(1)Ubuntu操作
1.编写驱动代码框架 :
code:pin5driver.c
#include <linux/fs.h> // file_opertions声明
#include <linux/module.h> // module_init module_exit 声明
#include <linux/init.h> // _init _exit 宏定义声明
#include <linux/device.h> // class device 声明
#include <linux/uaccess.h> // class_from_user 的头文件
#include <linux/types.h> // 设备号 dev_t 类型声明
#include <asm/io.h> // ioremap iounmap 的头文件声明
static struct class *pin5_class;
static struct device *pin5_class_dev;
static dev_t devno; //设备号
static int major = 222; //主设备好
static int minor = 1; //次设备号
static char *module_name = "pin5"; //模块名(设备名)
static int pin5_read(struct file *file,char __user *buf,size_t count,loff_t *ppos)
{
printk("pin5_read\n");
return 0;
}
//pin4_open函数
static int pin5_open(struct inode *inode, struct file *file)
{
printk("pin5_open\n"); //内核的打印函数,和printf类似
return 0;
}
/pin4_write函数
static int pin5_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{
printk("pin5_write\n");
return 0;
}
//赋值()
static struct file_operations pin5_fops ={
.owner= THIS_MODULE,
.open = pin5_open,
.write= pin5_write,
.read = pin5_read,
};
// 真是驱动入口
int __init pin5_drv_init(void)
{
int ret;
devno = MKDEV(major, minor); //2.创建设备号
ret = register_chrdev(major, module_name,&pin5_fops); // 3.注册驱动,告诉内核,把这个驱动加到内核的驱动链表中去
//可以在终端生成:mknod chen c 8
pin5_class = class_create(THIS_MODULE,"demo2"); //让代码在dev中自动生成设备,"demo2"也很重要(唯一)
pin5_class_dev = device_create(pin5_class,NULL,devno,NULL,module_name);//创建设备文件
return 0;
}
void __exit pin5_drv_exit(void)
{
device_destroy(pin5_class, devno);
class_destroy(pin5_class);
unregister_chrdev( major, module_name); //卸载驱动
}
module_init(pin5_drv_init); //入口,内核加载该驱动的时候,这个宏会被调用
module_exit(pin5_drv_exit);
MODULE_LICENSE("GPL v2");
2. 把代码pin5driver.c放到到 /home/cslz/SYSTEM/l/linux-rpi-4.14.y/drivers/char
目录下
3.修改Makefile,告诉编译器,要编译 pin4driver.c 驱动文件
指令:
vi Makefile
4.在/home/cslz/SYSTEM/l/linux-rpi-4.14.y
目录下进行编译
指令:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make modules
顺利的话就会出现:
生成drivers/char/pin5driver.ko
cslz@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make modules
CHK include/config/kernel.release
CHK include/generated/uapi/linux/version.h
CHK include/generated/utsrelease.h
CHK include/generated/bounds.h
CHK include/generated/timeconst.h
CHK include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
CHK scripts/mod/devicetable-offsets.h
CHK kernel/config_data.h
CC [M] drivers/char/pin5driver.o
Building modules, stage 2.
MODPOST 1524 modules
CC drivers/char/pin5driver.mod.o
LD [M] drivers/char/pin5driver.ko
5.把 pin5driver.ko 拷贝到树莓派系统
指令:
scp pin5driver.ko pi@192.168.111.11:/home/pi
(2)在树莓派上操作
6.编写测试代码 pin5test.c,并完成编译
gcc pin5test.c -o pin5test
code:pin5test.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void)
{
int fd;
fd = open("/dev/pin4",O_RDWR);
if(fd < 0){
perror("fail reason:");
}else{
printf("K---------O\n");
}
return 0;
}
7.把pin5driver.ko,内核驱动装载生成pin5
sudo insmod pin5driver.ko
指令: ls /dev/pin5 -l
可以看到我们配置的驱动pin5,以及设备号
8.更改文件的属性
sudo chmod 666 /dev/pin5
666 - 所有用户可以操作
9.运行测试代码
./pin5test
指令:查看内核的打印信息
dmesg | grep pin5
注:
- 内核驱动删除:sudo rmmod pin5driver (不用加 .ko)
- 查看内核模块:lsmod