树莓派-Linux-内核驱动编译

写好驱动代码
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;


}

将驱动代码拷贝到当前路径如下
树莓派-Linux-内核驱动编译_第1张图片

然后修改当前路径的Makefile

树莓派-Linux-内核驱动编译_第2张图片
然后在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 删除当前驱动

之后会生成如图所示的结果
树莓派-Linux-内核驱动编译_第3张图片

然后用指令 sudo chmod 666 /dev/pin4 给生成的目标文件赋予所有人都可读可写的权限。

然后运行测试文件 ./pin4test 的到如图的结果

树莓派-Linux-内核驱动编译_第4张图片

你可能感兴趣的:(树莓派-Linux-内核驱动编译)