*参照元 [#k15af749]
#backlinks

*説明 [#v278fd84]
-パス: [[linux-2.6.33/driver/uio/uio.c]]
-パス: [[linux-2.6.33/drivers/uio/uio.c]]

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


**引数 [#g94acd49]
-
--

**返り値 [#vcc453f0]
-
--

**参考 [#z051e64f]


*実装 [#d9c130dd]
 /**
  * uio_register_device - register a new userspace IO device
  * @owner:	module that creates the new device
  * @parent:	parent device
  * @info:	UIO device capabilities
  *
  * returns zero on success or a negative error code.
  */
 int __uio_register_device(struct module *owner,
 			  struct device *parent,
 			  struct uio_info *info)
 {
 	struct uio_device *idev;
-
--[[linux-2.6.33/uio_device]]

 	int ret = 0;
 
 	if (!parent || !info || !info->name || !info->version)
 		return -EINVAL;
 
 	info->uio_dev = NULL;
 
 	ret = init_uio_class();
 	if (ret)
 		return ret;
-
--[[linux-2.6.33/init_uio_class()]]

 
 	idev = kzalloc(sizeof(*idev), GFP_KERNEL);
 	if (!idev) {
 		ret = -ENOMEM;
 		goto err_kzalloc;
 	}
-
--[[linux-2.6.33/kzalloc()]]

 
 	idev->owner = owner;
 	idev->info = info;
 	init_waitqueue_head(&idev->wait);
 	atomic_set(&idev->event, 0);
 
-
--[[linux-2.6.33/init_waitqueue_head()]]
-
--[[linux-2.6.33/atomic_set()]]

 	ret = uio_get_minor(idev);
 	if (ret)
 		goto err_get_minor;
 
-
--[[linux-2.6.33/uio_get_minor()]]

 	idev->dev = device_create(uio_class->class, parent,
 				  MKDEV(uio_major, idev->minor), idev,
 				  "uio%d", idev->minor);
 	if (IS_ERR(idev->dev)) {
 		printk(KERN_ERR "UIO: device register failed\n");
 		ret = PTR_ERR(idev->dev);
 		goto err_device_create;
 	}
 
-
--[[linux-2.6.33/device_create()]]
-
--[[linux-2.6.33/IS_ERR()]]
-
--[[linux-2.6.33/printk()]]
-
--[[linux-2.6.33/PTR_ERR()]]

 	ret = uio_dev_add_attributes(idev);
 	if (ret)
 		goto err_uio_dev_add_attributes;
 
-
--[[linux-2.6.33/uio_dev_add_attributes()]]

 	info->uio_dev = idev;
 
 	if (idev->info->irq >= 0) {
 		ret = request_irq(idev->info->irq, uio_interrupt,
 				  idev->info->irq_flags, idev->info->name, idev);
 		if (ret)
 			goto err_request_irq;
 	}
 
-ユーザ定義のデバイスが割り込みを使用するならば、
カーネルにハンドラを登録する。
-ただしユーザ定義のハンドラを直接登録するのではなく、
いったん uio_interrupt() を登録し、
uio_interrupt() 経由でユーザ定義のハンドラを呼び出す。
--[[linux-2.6.33/request_irq()]]
--[[linux-2.6.33/uio_interrupt()]]

 	return 0;
 
 err_request_irq:
 	uio_dev_del_attributes(idev);
-
--[[linux-2.6.33/uio_dev_del_attributes()]]

 err_uio_dev_add_attributes:
 	device_destroy(uio_class->class, MKDEV(uio_major, idev->minor));
-
--[[linux-2.6.33/device_destroy()]]

 err_device_create:
 	uio_free_minor(idev);
-
--[[linux-2.6.33/uio_free_monitor()]]

 err_get_minor:
 	kfree(idev);
-
--[[linux-2.6.33/kfree()]]

 err_kzalloc:
 	uio_class_destroy();
-
--[[linux-2.6.33/uio_class_destroy()]]

 	return ret;
 }
 EXPORT_SYMBOL_GPL(__uio_register_device);
-他のモジュールにシンボルを公開する。
--[[linux-2.6.33/EXPORT_SYMBOL_GPL()]]


*コメント [#y9d563cd]

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