写一个linux驱动

简单一点,写一个字符设备驱动。

首先我们希望在/dev下面出现一个新的字符设备文件。

1. 分配一个设备号;

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);

示例:

首先定义一个dev_t的变量,它其实就是一个32位的整数。再使用上述函数获取设备号。

dev_t mydev;
alloc_chrdev_region(&mydev, 0, 1, "mydev");

2. 内核中使用cdev来表示字符设备。我们需要准备一个结构体用来存放我们的字符设备必要的数据,其中一定要包含cdev变量。

struct mydev {
    void *data;
    struct cdev cdev;
}

3. 准备一个操作集合。待我们的字符设备完成,用户需要通过文件操作来使用这个设备。那么就需要一个文件操作集合,比如包含:read,write等的方法。

struct file_operations mydev_fops = {
        .owner          = THIS_MODULE,
        .read           = mydev_read,
        .write          = mydev_write,
        .open           = mydev_open,
        .release        = mydev_release,
};

自然这些op都是需要自己额外实现的,此处略去。

4. 初始化cdev结构体。需要的原料差不多都有了,可以初始化cdev了。

cdev_init(&mydev->cdev, &mydev_fops);
mydev->cdev.owner=THIS_MODULE;

linux内核很贴心的准备了cdev_init来帮助我们初始化cdev。还需要手动初始化cdev的owner变量。

5. 将设备添加到内核。

cdev准备好了,内核还不知道,使用cdev_add告诉内核我们准备了一个新的字符设备。

cdev_add(&mydev->cdev, devno, 1);

这里的devno是我们在第一步中得到的设备号。

至此我们的新字符设备已经创建好了。

posted @ 2024-06-06 15:46  半山随笔  阅读(3)  评论(0编辑  收藏  举报