DeviceDriver(1):新しいキャラクターデバイスフレームワーク

1つ:デバイス番号の割り当てと解放

1.動的割り当て:

dev:上位12ビットがメインデバイス番号、下位20ビットがマイナーデバイス番号、baseminor:マイナーデバイス番号の開始アドレス、count:割り当てが要求されたデバイス番号の数、name:デバイス名

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

2.静的割り当て:

フォーム:割り当てられる機器番号;カウント:アプリケーション数量;名前:機器名

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

3.デバイス番号を解放します。

void unregister_chrdev_region(dev_t from, unsigned count)

2:新しいキャラクターデバイスを登録する

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)

3:デバイスノードを自動的に作成する

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

4:新しいキャラクター装備フレームテンプレート

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

 

おすすめ

転載: blog.csdn.net/qq_34968572/article/details/103175944