DeviceDriver (1): Nuevo marco de dispositivo de caracteres

Uno: asignar y liberar números de dispositivo

1. Asignación dinámica:

dev: los 12 bits superiores son el número de dispositivo principal, los 20 bits inferiores son el número de dispositivo menor; baseminor: la dirección de inicio del número de dispositivo menor; count: la cantidad de números de dispositivo solicitados para ser asignados; nombre: el nombre del dispositivo

int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)

2. Asignación estática:

formulario: número de equipo a asignar; recuento: cantidad de aplicación; nombre: nombre del equipo

int register_chrdev_region(dev_t from, unsigned count, const char *name)

3. Libera el número de dispositivo:

void unregister_chrdev_region(dev_t from, unsigned count)

Dos: registra un nuevo dispositivo de personaje

1. Estructura del dispositivo de caracteres: 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. Registre e inicialice el dispositivo

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. Agregar equipo

int cdev_add(struct cdev *p, dev_t dev, unsigned count)

4. Elimina el dispositivo

void cdev_del(struct cdev *p)

Tres: crear automáticamente nodos de dispositivos

1. Cree y elimine clases de dispositivos

struct class *class_create (struct module *owner, const char *name)

void class_destroy(struct class *cls);

2. Crea y elimina dispositivos

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

Cuatro: nueva plantilla de marco de equipo de personaje

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

 

Supongo que te gusta

Origin blog.csdn.net/qq_34968572/article/details/103175944
Recomendado
Clasificación