在Linux中,設備初始化通常涉及以下幾個步驟:
定義設備結構體:
struct my_device {
struct cdev cdev;
struct class *class;
struct device *dev;
// 其他設備相關的成員
};
注冊字符設備:
register_chrdev
或cdev_init
和cdev_add
函數來注冊你的字符設備。static int __init my_device_init(void) {
int ret;
// 分配設備號
dev_t dev = MKDEV(MAJOR_NUM, MINOR_NUM);
// 初始化字符設備
cdev_init(&my_device->cdev, &fops);
my_device->cdev.owner = THIS_MODULE;
// 添加字符設備
ret = cdev_add(&my_device->cdev, dev, 1);
if (ret < 0) {
printk(KERN_ALERT "Failed to add cdev\n");
return ret;
}
// 創建設備類
my_device->class = class_create(THIS_MODULE, "my_device");
if (IS_ERR(my_device->class)) {
unregister_chrdev(MAJOR_NUM, DEVICE_NAME);
return PTR_ERR(my_device->class);
}
// 創建設備節點
my_device->dev = device_create(my_device->class, NULL, dev, NULL, DEVICE_NAME);
if (IS_ERR(my_device->dev)) {
class_destroy(my_device->class);
unregister_chrdev(MAJOR_NUM, DEVICE_NAME);
return PTR_ERR(my_device->dev);
}
return 0;
}
實現文件操作結構體:
file_operations
,并實現其中的方法,如open
、read
、write
、release
等。static struct file_operations fops = {
.owner = THIS_MODULE,
.open = my_device_open,
.read = my_device_read,
.write = my_device_write,
.release = my_device_release,
};
設備初始化函數:
module_init(my_device_init);
設備退出函數:
static void __exit my_device_exit(void) {
// 刪除設備節點
device_destroy(my_device->class, MKDEV(MAJOR_NUM, MINOR_NUM));
// 刪除設備類
class_unregister(my_device->class);
class_destroy(my_device->class);
// 刪除字符設備
cdev_del(&my_device->cdev);
// 釋放設備號
unregister_chrdev(MAJOR_NUM, DEVICE_NAME);
}
module_exit(my_device_exit);
編譯和加載模塊:
insmod
命令加載模塊,使用rmmod
命令卸載模塊。obj-m += my_device.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
通過以上步驟,你可以完成Linux驅動的設備初始化。請注意,具體的實現細節可能會因設備和硬件平臺的不同而有所差異。