*参照元 [#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]