Chinaunix首页 | 论坛 | 博客
  • 博客访问: 182661
  • 博文数量: 63
  • 博客积分: 725
  • 博客等级: 军士长
  • 技术积分: 375
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-12 19:55
文章分类

全部博文(63)

文章存档

2012年(35)

2011年(28)

分类:

2012-02-21 23:53:01

原文地址:Android USB 驱动分析 作者:jim226


一、USB驱动代码架构和使用
   
    1、代码简介
       USB驱动代码在/drivers/usb/gadget下,有三个文件:android.c,f_adb.c,
       f_mass_storage.c;g_android.ko 是由这三个文件编译而来,其中android.c 依赖于
       f_adb.c 和 f_mass_storage.c(这两个文件之间无依赖关系)。
       可在android.c中看到:
       static int __init android_bind_config(struct usb_configuration *c)  
       {  
          struct android_dev *dev = _android_dev;  
          int ret;  
          printk(KERN_DEBUG "android_bind_config\n");  
          ret = mass_storage_function_add(dev->cdev, c, dev->nluns);  
          if (ret)  
              return ret;  
          return adb_function_add(dev->cdev, c);  
       }
 
    2、驱动使用
       要使USB mass storage连接到主机:
       打开/sys/devices/platform/usb_mass_storage/lun0/file文件,向file文件写入一个存储
       设备的路径,例如/dev/block/vold/179:0 (major:minor)路径;
       这里的usb_mass_storage根据实际应用可以改的,由platform_device_register函数的参数决
       定。
       例如:
       static struct platform_device fsg_platform_device =  
       {
          .name = "usb_mass_storage",  
          .id   = -1,  
       };  
       static void __init tegra_machine_init(void)  
       {  
        ....  
        (void) platform_device_register(&fsg_platform_device);  
        ....  
       }
   
       能够连接的设备数,由驱动中的nluns变量来控制,最多支持8个。

二、USB插入检测
   
三、USB代码分析
 
    1、USB初始化
       在android.c中分别注册adb和mass storage:
       static int __init android_bind_config(struct usb_configuration *c)  
       {  
           struct android_dev *dev = _android_dev;  
           int ret;  
           printk(KERN_DEBUG "android_bind_config\n");  
           ret = mass_storage_function_add(dev->cdev, c, dev->nluns);  
           if (ret)  
              return ret;   
           return adb_function_add(dev->cdev, c);  
       }
 
    2、往驱动写入lun信息
       在驱动中有static DEVICE_ATTR(file, 0444, show_file, store_file);这是负责读
       (cat/read)或直写(echo/write)设备属性文件的宏。
 
    3、USB连接到主机
 
      echo /dev/block/vold/179:0 > /sys/devices/platform/usb_mass_storage/lun0/file
 
    4、USB从主机断开
      
       echo "" > /sys/devices/platform/usb_mass_storage/lun0/file
 
阅读(1150) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~