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