android usb 复合,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() {

@Overridepublic voidonUEvent(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 mObservers = newArrayList();

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 classUEventThreadextends Thread {private ArrayList mObservers= new ArrayList();

UEventThread() {super("UEventObserver");

}public voidrun() {

native_setup();byte[] buffer = new byte[1024];intlen;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(newUEvent(bufferStr));

}

}

}

}

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值