简单的linux驱动开发,自动注册/dev/xxx和自动分配主分区号

驱动源码

#include <linux/init.h>     //定义了module_init
#include <linux/module.h>   //最基本的头文件,其中定义了MODULE_LICENSE这一类宏
#include <linux/fs.h>
#include <linux/device.h>    // file_operations结构体定义在该头文件中

static const char* devName = "first_driver";  //  定义设备名
static struct class *first_class;
static int dev_id = 0;               //定义设备号

//定义了open函数
static int first_drv_open (struct inode *inode, struct file *file)
{
        printk("open file success.\n");
        return 0;
}

//定义了write函数
static ssize_t first_drv_write (struct file *file, const char __user *buf, size_t size, loff_t * ppos)
{
        printk("write buf.\n");
        return 0;
}

//在file_operations中注册open和write函数
static struct file_operations first_drv_fo =
{
        .owner  =  THIS_MODULE,

        //将对应的函数关联在file_operations的结构体中
        .open   =  first_drv_open,
        .write  =  first_drv_write,
};

//init驱动的入口函数
static int first_drv_init(void)
{
        //注册设备,实际是将file_operations结构体放到内核的制定数组中,以便管理
        //在register_chrdev中制定major作为主设备号
        dev_id = register_chrdev(dev_id, devName, &first_drv_fo);
        first_class = class_create(THIS_MODULE, devName);
        device_create(first_class, NULL, MKDEV(dev_id, 0), NULL, devName);
        printk("init\n");
        return 0;
}

//驱动的出口函数
static void first_drv_exit(void)
{
        printk("exit\n");
        unregister_chrdev(dev_id, devName);  //卸载设备,实际是将file_operations结构体从内核维护的相关数组中以主设备号作为索引删除
        device_destroy(first_class, MKDEV(dev_id, 0));
        class_destroy(first_class);
}

//内核将通过这个宏,来直到这个驱动的入口和出口函数
module_init(first_drv_init);
module_exit(first_drv_exit);

MODULE_AUTHOR("wangguoshan 20210425");
MODULE_LICENSE("GPL");  //指定协议

Makefile文件

ifneq ($(KERNELRELEASE),)
        obj-m := chaDrv.o
else
        KERNELDIR=/usr/src/linux-4.12.14-94.41/
        PWD := $(shell pwd)
default:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif

clean:
        rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versionsi

调用驱动的main文件

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int fd;
    int val = 1;
    fd = open("/dev/first_driver", O_RDWR);
    if (fd < 0) {
        printf("open file fail\n");
        return -1;
    }
    ssize_t ret = write(fd, &val, 4);
    if (ret != 0) {
        printf("write file fail, ret=%d.\n", ret);
        return -2;
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guoguo123a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值