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