一:分配和释放设备号
1,动态分配:
dev:高12位为主设备号,低20位为次设备号;baseminor:次设备号起始地址;count:请求分配设备号数量;name:设备名
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
2,静态分配:
form:要分配的设备号;count:申请数量;name:设备名
int register_chrdev_region(dev_t from, unsigned count, const char *name)
3,释放设备号:
void unregister_chrdev_region(dev_t from, unsigned count)
二:注册新字符设备
1,字符设备结构:struct cdev
struct cdev {struct kobject kobj;struct module *owner;const struct file_operations *ops;struct list_head list;dev_t dev;unsigned int count;
};
2,注册初始化设备
static struct cdev demo_dev;
static struct file_opetarions demo_fops = {.owner = THIS_MOUDULE,... ...
};demo_dev.owner = THIS_MOUDULE;
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
3,添加设备
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
4,删除设备
void cdev_del(struct cdev *p)
三:自动创建设备节点
1,创建和删除设备类
struct class *class_create (struct module *owner, const char *name)void class_destroy(struct class *cls);
2,创建和删除设备
struct device *device_create(struct class *cls, struct device *parent,dev_t devt, void *drvdata,const char *fmt, ...);extern void device_destroy(struct class *cls, dev_t devt);
四:新字符设备框架模板
#define DEV_COUNT 1
#define DEV_NAME "newchardev"struct newchar_dev {dev_t devid;int major;int minor;struct cdev cdev;struct class *class_newchar;struct device *device_newchar;
};struct newchar_dev newchardev;static int newchar_init(void)
{/* 创建设备号 */alloc_chrdev_region(&newchardev.devid, 0, DEV_COUNT, DEV_NAME);newchardev.major = MAJOR(newchardev.devid);newchardev.minor = MINOR(newchardev.devid);/* 创建初始化设备 */newchardev.cdev.owner = THIS_MOUDLE;cdev_init(&newchardev.cdev, &newchar_fops);/* 添加设备 */cdev_add(&newchardev.cdev, newchardev.devid, DEV_COUNT);/* 创建设备类和设备 */newchardev.class_newchar = class_create (THIS_MOUDLE, DEV_NAME);newchardev.device_newchar = device_create(newchardev.class_newchar, NULL,newchardev.devid, NULL, DEV_NAME);
}static void newchar_exit(void)
{device_destroy(newchardev.class_newchar, newchardev.devid);class_destroy(newchardev.class_newchar);cdev_del(&newchardev.cdev);unregister_chrdev_region(newchardev.devid, DEV_COUNT);
}