当前位置: 代码迷 >> 综合 >> DeviceDriver(一):新字符设备框架
  详细解决方案

DeviceDriver(一):新字符设备框架

热度:58   发布时间:2023-10-24 00:42:31.0

一:分配和释放设备号

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);
}