qshinoの日記

Powershell関係と徒然なこと

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

https://www.kernel.org/doc/Documentation/DMA-API.txt