写一个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是我们在第一步中得到的设备号。
至此我们的新字符设备已经创建好了。