• Android USB gadget框架学习笔记


    一 Gadget框架结构

    kernel/drivers/usb/gadget,这个目录是android下usbgadget的主要目录。
    Gadget功能组织单元:主要文件android.c,usb gadget功能的统领文件,负责组织usb 复合设备的功能,与上层应用提供交互的接口,面向市场需求的产品规划部门。
    复合设备逻辑处理单元(复合设备管理单元):主要文件:composite.c,这个文件类似于一个项目管理组,负责各个单元的接口对接,资源整理。针对拥有多个usb功能的复合设备,这部分负责将支持的各个功能组织到一起,协助各个功能与UDC控制器单元建立联系。
    具体功能单元:以U盘为例,f_mass_storge.c文件,用来完成具体的功能。这个部分是一个功能性很强的部分,将与UDC控制器单元直接对话,完成数据的传输。

    UDC控制器单元:只做一件事情,收发usb数据,将数据透明的传递出去。

    通过configfs用户空间对android gadget设备的配置在init.usb.rc文件中。

    1.Android中通过UEventObserver类来接收内核发出的uevent事件

    kernel向用户空间发送uevent消息函数:
        kobject_uevent_env(&dev->dev->kobj,KOBJ_CHANGE, uevent_envp);
    
    android层的接收uevent事件:
     
    private final UEventObservermUEventObserver = newUEventObserver() {
       @Override
       public void onUEvent(UEventObserver.UEvent event) {
           if (DEBUG) Slog.v(TAG, "USB UEVENT: " +event.toString());
           String state = event.get("USB_STATE");
           String accessory = event.get("ACCESSORY");
    
           if (state != null) {
               mHandler.updateState(state);
           } else if ("START".equals(accessory)) {
               if(DEBUG) Slog.d(TAG, "got accessory start");
               setCurrentFunction(UsbManager.USB_FUNCTION_ACCESSORY,false);
           }
       }
    };
    
     
    在类初始化时会调用mUEventObserver.startObserving(USB_STATE_MATCH)启动监听动作,最终会调用到UEventObserver的addObserver:
    
    privateArrayList<Object> mObservers = newArrayList<Object>();
    publicvoid addObserver(String match, UEventObserver observer){
        synchronized(mObservers) {
            mObservers.add(match);
            mObservers.add(observer);
        }
    
    }
    
    private static final String USB_STATE_MATCH = "DEVPATH=/devices/virtual/android_usb/android0";
    该函数最终会将”DEVPATH=/devices/virtual/android_usb/android0”增加到匹配序列中,当kernel发送具有该字符串的数据时,就返回匹配成功,然后调用mUEventObserver 的onUEvent函数;
    
    UeventObserver.java    //目前的Android内核中好像不存在这个文件了。
      private static class UEventThreadextends Thread {
           private ArrayList<Object> mObservers= new ArrayList<Object>();
           UEventThread() {
               super("UEventObserver");
           }
           public void run() {
               native_setup();
               byte[] buffer = new byte[1024];
               int len;
               while (true) {
                   len = next_event(buffer);
                   if (len > 0) {
                       String bufferStr = new String(buffer, 0, len);  //easier to search a String
                       synchronized (mObservers) {
                           for (int i = 0; i < mObservers.size(); i += 2){
                               if (bufferStr.indexOf((String)mObservers.get(i)) != -1){
                                   ((UEventObserver)mObservers.get(i+1))
                                           .onUEvent(new UEvent(bufferStr));
                               }
                           }
                       }
                   }
               }
           }
    }
  • 相关阅读:
    AsyncTask类
    linux下带有空格的文件怎么删除
    python 获取指定文件夹的大小
    python 无法获取隐藏文件夹中的文件列表
    LINK : fatal error LNK1104: 无法打开文件“libboost_serialization-vc90-mt-gd-1_62.lib”
    解决错误 fatal error C1010: unexpected end of file while looking for precompiled head
    PCH Warning: header stop cannot be in a macro or #if block.
    C++ Boost在VS2015中的使用
    dev-c++ boost库的安装
    python 获取命令行输出结果
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/10397990.html
Copyright © 2020-2023  润新知