树莓派字符驱动模板

#include<linux/fs.h>                   //file_operations声明
#include<linux/module.h>             //module_init  module_exit声明
#include<linux/init.h>                //_init _exit宏定义声明
#include<linux/device.h>             //class   device声明
#include<linux/uaccess.h>           //copy_from_user的头文件
#include<linux/types.h>            //设备号 dev_t类型声明
#include<asm/io.h>                 // ioremap  iounmap的头文件

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_read(struct file *file,char __user *buf,size_t size,loff_t *ppos)
{
	printk("pin4_read\n");
	return 0;
}


//led_open
static int pin4_open(struct inode *inode,struct file *file)
{
	printk("pin4_open\n");
	return 0;
}

//led_write
static ssize_t pin4_write(struct file *file,const char __user *buf,size_t count,loff_t *ppos)
{
	printk("pin4_write\n");
	return 0;
}

static 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);//2创建设备号
	ret  = register_chrdev(major,module_name,&pin4_fops);//3注册驱动 告诉内核,把驱动加到内核链表中

	pin4_class =class_create(THIS_MODULE,"mtfirstdemo");//让代码在dev自动生成设备
	pin4_class_dev = device_create(pin4_class,NULL,devno,NULL,module_name);//创建设备文件
	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);//1入口,内核加载该驱动时,调用这个宏
module_exit(pin4_drv_exit);
MODULE_LICENSE("GPL 2");




上层程序

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
int main(){
	int fd;
	fd=open("/dev/pin4",O_RDWR);
	if(fd<0){
		printf("open failed\n");
		perror("reason");
	}else{
		printf("success\n");
	}
	fd=writte(fd,'1',1);
	}

编译
进入内核目录下
cd ->driver->char
到目录下后,把模板程序添加进去
然后vi Makefile,进入后按照格式添加
obj-m += pin4driver.o
编译
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNUL=kernel7 make modules

之后scp 拷贝到树莓派
sudo chmod 666 /dev/pin4

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页