Linux字符设备驱动
- Fang XS.
- 1452512966@qq.com
- 如果有错误,希望被指出
关于字符设备驱动
- Linux设备的驱动分为字符设备驱动,块设备驱动,网络设备驱动。
- 字符设备即以字节流进行读写的设备。
字符设备驱动框架
- 头文件
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/kdev_t.h>
#include <linux/cdev.h>
#include <linux/device.h>
- 驱动初始化
struct dev{
dev_t devnum;
struct cdev cdev;
struct class* pclass;
struct device* pdevice;
}dev;
static int dev_test_init(void){
int ret;
ret = alloc_chrdev_region(&dev.devnum,0,1,"dev_test");
if(ret<0){
printk("alloc_chrdev_region err.\n");
goto err_alloc_region;
}
dev.cdev.owner = THIS_MODULE;
cdev_init(&dev.cdev,&fops);
ret = cdev_add(&dev.cdev,dev.devnum,1);
if(ret < 0){
printk("cdev_add err.\n");
goto err_cdev_add;
}
dev.pclass = class_create(THIS_MODULE,"dev_test");
if(IS_ERR(dev.pclass)){
goto err_class_create;
}
dev.pdevice = device_create(dev.pclass,NULL,dev.devnum,NULL,"dev_test");
if(IS_ERR(dev.pdevice)){
goto err_device_create;
}
printk("dev_test_init..\n");
return 0;
err_device_create:
class_destroy(dev.pclass);
err_class_create:
cdev_del(&dev.cdev);
err_cdev_add:
unregister_chrdev_region(dev.devnum,1);
err_alloc_region:
return -1;
}
- 填充file_operations结构体
ssize_t dev_read (struct file *file, char __user *buf, size_t size, loff_t *off){
printk("dev_read.. \n");
return 0;
}
ssize_t dev_write (struct file *file, const char __user *buf,
size_t size, loff_t *off){
printk("dev_write.. \n");
return 0;
}
int dev_open (struct inode *inode, struct file *file){
printk("dev_open.. \n");
return 0;
}
int dev_release (struct inode *inode, struct file *file){
printk("dev_release.. \n");
return 0;
}
static struct file_operations fops = {
.owner = THIS_MODULE,
.read = dev_read,
.write = dev_write,
.open = dev_open,
.release = dev_release
};
- 驱动卸载
static void dev_test_exit(void){
unregister_chrdev_region(dev.devnum,1);
cdev_del(&dev.cdev);
device_destroy(dev.pclass,dev.devnum);
class_destroy(dev.pclass);
printk("dev_test_exit..\n");
}
- 模块入口出口
module_init(dev_test_init);
module_exit(dev_test_exit);
MODULE_LICENSE("GPL");