User DMA
Userlevel DMA
code
ボチボチ解析していく。
まずは、module登録関係。
/** * udmabuf_module_init() */ static int __init udmabuf_module_init(void){ int retval = 0; ida_init(&udmabuf_device_ida); retval = alloc_chrdev_region( &udmabuf_device_number, 0, 0, DRIVER_NAME); if (retval != 0) { printk(KERN_ERR "%s: couldn't allocate device major number. return=%d\n", DRIVER_NAME, retval); udmabuf_device_number = 0; goto failed; } udmabuf_sys_class = class_create( THIS_MODULE, DRIVER_NAME ); if( IS_ERR_OR_NULL( udmabuf_sys_class )) { retval = PTR_ERR( udmabuf_sys_class ); udmabuf_sys_class = NULL; printk(KERN_ERR "%s: couldn't create sys class. return=%d\n", DRIVER_NAME, retval); retval = (retval == 0) ? -ENOMEM : retval; goto failed; } udmabuf_sys_class_set_attributes(); udmabuf_static_device_create_all(); retval = platform_driver_register( &udmabuf_platform_driver ); if (retval) { printk( KERN_ERR "%s: couldn't register platform driver. return=%d\n", DRIVER_NAME, retval); udmabuf_platform_driver_registerd = 0; goto failed; } else { udmabuf_platform_driver_registerd = 1; } return 0; failed: udmabuf_module_cleanup(); return retval; } /** * udmabuf_module_exit() */ static void __exit udmabuf_module_exit(void){ udmabuf_module_cleanup(); } module_init(udmabuf_module_init); module_exit(udmabuf_module_exit);
ref
Code
https://qiita.com/ikwzm/items/cc1bb33ff43a491440ea
DMA API