写好驱动代码
pin4module.c
#include
#include
#include
#include
#include
#include
#include
#include
static struct class *pin4_class; // 创建一个类
static struct device *pin4_class_dev; //创建一个设备
static dev_t devno; // 设备号
static int major = 231; // 主设备号
static int minor = 0; // 次设备号
static char *module_name = "pin4"; //驱动模块名
static int pin4_open(struct inode *inode, struct file *file){
printk("pin4_open\n"); // 内核的打印函数 和printf类似
return 0;
}
static int pin4_write(struct file *file, const char __user * buf, size_t count, loff_t *ppos){
printk("pin4_write\n");
return 0;
}
static int pin4_read(struct file *file, char __user * buf, size_t size, loff_t *ppos)
{
printk("pin4_read\n");
return 0;
}
struct file_operations pin4_fops = {
.owner = THIS_MODULE,
.open = pin4_open,
.write = pin4_write,
.read = pin4_read,
};
int __init pin4_drv_init(void) //真实入口
{
int ret;
devno = MKDEV(major,minor); //创建设备号
ret = register_chrdev( major , module_name , &pin4_fops); //注册驱动 告诉内核,把这个驱动加入到内核的链表当中去
pin4_class = class_create( THIS_MODULE , "myfirstdemo"); // 创建一个类 让代码在dev下自动生成 (就如苹果)
pin4_class_dev = device_create( pin4_class , NULL, devno, NULL , module_name); // 创建设备文件 (如苹果11)
return 0;
}
void __exit pin4_drv_exit(void)
{
device_destroy( pin4_class , devno); // 销毁设备
class_destroy( pin4_class ); //销毁类
unregister_chrdev( major , module_name); //卸载驱动
}
module_init(pin4_drv_init); //入口 内核加载该驱动的时候 这个宏会被调用
module_exit(pin4_drv_exit);
MODULE_LICENSE("GPL v2");
测试代码(上层代码)
pin4test.c
#include
#include
#include
#include
#include
int main()
{
int fd =open("/dev/pin4",O_RDWR);
if(fd == -1){
printf("open failed\n");
perror("why");
}
else {
printf("open sucess\n");
}
return 0;
}
然后修改当前路径的Makefile
然后在Linux源码的目录结构下输入如下指令来生成目标驱动 如图
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make modules
生成目标文件pin4moudle.ko 以 .ko 结尾的文件
然后编译测试代码
arm-linux-gnueabihf-gcc pin4.c -o pin4test
将生成的驱动文件 和 测试文件 用scp xxx [email protected]:/home/pi
拷贝到树莓派下面。
在树莓派上使用如下指令 将目标驱动加载到内核当中
sudo insmod pin4moudle.ko
lsmod 查看当前驱动
rmmod xxx 删除当前驱动
然后用指令 sudo chmod 666 /dev/pin4 给生成的目标文件赋予所有人都可读可写的权限。
然后运行测试文件 ./pin4test 的到如图的结果