device_create詳細

2249 ワード

1.関数の存在経路:kernel/drivers/base/core.c
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