一 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));
}
}
}
}
}
}
}

最新文章

  1. js日历选择控件
  2. Testing - 测试基础 - 方法
  3. 浅析ODS与EDW关系(转载)
  4. SQLServer2005数据导入Mysql到详细教程
  5. C# lesson2
  6. angularjs uigrid 中celltemplate的写浮动框
  7. Linux IPC - Shared memory
  8. office2007每次打开都要配置文件,怎么取消配置
  9. 1011. World Cup Betting (20)
  10. 【python练习题】程序2
  11. springboot整合JSP以及发布项目到独立的tomcat中与打成jar包使用
  12. java安装jdk错误1316 指定的账户已存在
  13. 自学Linux Shell11.5-执行数字运算
  14. webpack 打包产生的文件名中,hash、chunkhash、contenthash 的区别
  15. Python自动化开发 - Django【进阶篇】
  16. python 穷举法 算24点(史上最简短代码)
  17. CodeForces - 258D:Little Elephant and Broken Sorting(概率DP)
  18. Java之封装特性
  19. MVC5中的路由
  20. C#学习你需要知道的---(For和Foreach)

热门文章

  1. arcgis for silverlight 地图放大到某个点或者几何对象
  2. codeforces 578b//&quot;Or&quot; Game// Codeforces Round #320 (Div. 1)
  3. codeforces 1041d// Glider// Codeforces Round #509(Div. 2)
  4. Java数组常用API
  5. 装载问题(load)
  6. OC 内存管理之手动内存管理MRC
  7. JAVA并行程序基础
  8. Android开发——1轻松战胜开发环境
  9. jquery ajax和php实现返回值 json类型
  10. C++primer 练习4.31-4.35