device_create詳細
2249 ワード
1.関数の存在経路:kernel/drivers/base/core.c
2.関数プロトタイプ:
3.パラメータを先に見る
class: pointer to the struct class that this device should be registered to
the struct classポインタは、この関数が呼び出される前に作成する必要があります.
parent: pointer to the parent struct device of this new device
デバイスのparentポインタ.
devt: the dev_t for the char device to be added
dev_の場合、文字デバイスのデバイス番号tが0,0でない場合、1つの「dev」ファイルが作成されます.
drvdata:
デバイスコールバックに追加されたデータ.
fmt: string for the device's name
デバイス名.
4.以下の関数呼び出し例を見ることができる
例1
device_create( my_class, NULL, MKDEV(hello_major, 0), "hello""%d", 0 );
成功すると、/devディレクトリの下で/dev/hello 0デバイスが生成されます.
例2
led_cdev->dev = device_create_drvdata(leds_class, parent, 0, led_cdev,
"%s", led_cdev->name);
dev_のためtは0であるため、/devでデバイスファイルは生成されません.
led_cdevはclassに渡されるプライベートデータである.
6番目のパラメータの内容はprintfのように5番目のパラメータ「%s」にコピーされます.
5.dev->parentが指定されていないdevが/sys/devices/virtual/tty/ディレクトリに追加されます.dev->parentが指定されている場合、dev->classが存在し、parent->classが存在する場合、dev->nameディレクトリはparent->classが存在するディレクトリの下に追加されます.
linux 2を見てみましょう.6.25カーネルのソースコード、どのようにします.
device_create(tty_class,NULL, MKDEV(TTYAUX_MAJOR, 1),"console");==>device_register==>device_add==>setup_parent==>get_device_parent==>dev->kobj.parent= kobj("/sys/devices/virtual/tty");//したがって、すべてのファイルの追加はディレクトリ6を指す.
device_create ==>device_create_vargs ==>device_register ==>device_add==> kobj = get_device_parent(dev, parent)==>
if (parent == NULL) parent_kobj = virtual_device_parent(dev); ==>
virtual_dir = kobject_create_and_add("virtual", &devices_kset->kobj); ==>
devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL); ==>これにより得られる経路は/sys/devices/virtual
2.関数プロトタイプ:
struct device *device_create(struct class *class, struct device *parent,
dev_t devt, void *drvdata, const char *fmt, ...)
{
va_list vargs;
struct device *dev;
va_start(vargs, fmt);
dev = device_create_vargs(class, parent, devt, drvdata, fmt, vargs);
va_end(vargs);
return dev;
}
3.パラメータを先に見る
class: pointer to the struct class that this device should be registered to
the struct classポインタは、この関数が呼び出される前に作成する必要があります.
parent: pointer to the parent struct device of this new device
デバイスのparentポインタ.
devt: the dev_t for the char device to be added
dev_の場合、文字デバイスのデバイス番号tが0,0でない場合、1つの「dev」ファイルが作成されます.
drvdata:
デバイスコールバックに追加されたデータ.
fmt: string for the device's name
デバイス名.
4.以下の関数呼び出し例を見ることができる
例1
device_create( my_class, NULL, MKDEV(hello_major, 0), "hello""%d", 0 );
成功すると、/devディレクトリの下で/dev/hello 0デバイスが生成されます.
例2
led_cdev->dev = device_create_drvdata(leds_class, parent, 0, led_cdev,
"%s", led_cdev->name);
dev_のためtは0であるため、/devでデバイスファイルは生成されません.
led_cdevはclassに渡されるプライベートデータである.
6番目のパラメータの内容はprintfのように5番目のパラメータ「%s」にコピーされます.
5.dev->parentが指定されていないdevが/sys/devices/virtual/tty/ディレクトリに追加されます.dev->parentが指定されている場合、dev->classが存在し、parent->classが存在する場合、dev->nameディレクトリはparent->classが存在するディレクトリの下に追加されます.
linux 2を見てみましょう.6.25カーネルのソースコード、どのようにします.
device_create(tty_class,NULL, MKDEV(TTYAUX_MAJOR, 1),"console");==>device_register==>device_add==>setup_parent==>get_device_parent==>dev->kobj.parent= kobj("/sys/devices/virtual/tty");//したがって、すべてのファイルの追加はディレクトリ6を指す.
device_create ==>device_create_vargs ==>device_register ==>device_add==> kobj = get_device_parent(dev, parent)==>
if (parent == NULL) parent_kobj = virtual_device_parent(dev); ==>
virtual_dir = kobject_create_and_add("virtual", &devices_kset->kobj); ==>
devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL); ==>これにより得られる経路は/sys/devices/virtual