*参照元 [#t07b9271]
#backlinks

*説明 [#ga1ecee9]
-パス: [[linux-2.6.33/fs/char_dev.c]]

-FIXME: これは何?
--説明


**引数 [#c55b4bfd]
-unsigned int major
--
-unsigned int baseminor
--
-unsigned int count
--
-const char *name
--
-const struct file_operations *fops
--
--[[linux-2.6.33/file_operations]]


**返り値 [#sab63e11]
-int
--成功したときはデバイスのメジャー番号が返ります。
失敗したときは負のエラー番号が返ります。
--major に 0 を指定(自動的に割り当て)したとき、
成功時はデバイスのメジャー番号が返ります。
major に 0 以外を指定(明示的に割り当て)したとき、
成功時は 0 が返ります。
いずれも失敗したときは負のエラー番号が返ります。


**参考 [#v5fac2b0]


*実装 [#kda7cf99]
 /**
  * __register_chrdev() - create and register a cdev occupying a range of minors
  * @major: major device number or 0 for dynamic allocation
  * @baseminor: first of the requested range of minor numbers
  * @count: the number of minor numbers required
  * @name: name of this range of devices
  * @fops: file operations associated with this devices
  *
  * If @major == 0 this functions will dynamically allocate a major and return
  * its number.
  *
  * If @major > 0 this function will attempt to reserve a device with the given
  * major number and will return zero on success.
  *
  * Returns a -ve errno on failure.
  *
  * The name of this device has nothing to do with the name of the device in
  * /dev. It only helps to keep track of the different owners of devices. If
  * your module name has only one type of devices it's ok to use e.g. the name
  * of the module here.
  */
 int __register_chrdev(unsigned int major, unsigned int baseminor,
 		      unsigned int count, const char *name,
 		      const struct file_operations *fops)
 {
 	struct char_device_struct *cd;
 	struct cdev *cdev;
 	int err = -ENOMEM;
 
-
--[[linux-2.6.33/char_device_struct]]
-
--[[linux-2.6.33/cdev]]
-
--[[linux-2.6.33/ENOMEM]]

 	cd = __register_chrdev_region(major, baseminor, count, name);
 	if (IS_ERR(cd))
 		return PTR_ERR(cd);
 	
-
--[[linux-2.6.33/__register_chrdev_region()]]
-
--[[linux-2.6.33/IS_ERR()]]
-
--[[linux-2.6.33/PTR_ERR()]]

 	cdev = cdev_alloc();
 	if (!cdev)
 		goto out2;
 
-
--[[linux-2.6.33/cdev_alloc()]]

 	cdev->owner = fops->owner;
 	cdev->ops = fops;
 	kobject_set_name(&cdev->kobj, "%s", name);
 		
-
--[[linux-2.6.33/kobject_set_name()]]

 	err = cdev_add(cdev, MKDEV(cd->major, baseminor), count);
 	if (err)
 		goto out;
 
-
--[[linux-2.6.33/cdev_add()]]
-
--[[linux-2.6.33/MKDEV()]]

 	cd->cdev = cdev;
 
 	return major ? 0 : cd->major;
 out:
 	kobject_put(&cdev->kobj);
-
--[[linux-2.6.33/kobject_put()]]

 out2:
 	kfree(__unregister_chrdev_region(cd->major, baseminor, count));
 	return err;
-
--[[linux-2.6.33/kfree()]]

 }


*コメント [#f3d7e97f]

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS