USB模块解析
- 简介
主要完成USB 功能的切换和状态的更新。通过接受kernel发送过来的event消息来确定USB状态的切换并向外界发送广播消息。
1.1 UsbDeviceManager主要功能函数简介:
1.1.1 kernel层的event消息监控
/*
* Listens for uevent messages from the kernel to monitor the USB state
*/
private final UEventObserver mUEventObserver = new UEventObserver() {
@Override
public void onUEvent(UEventObserver.UEvent event) {
... ...
String state = event.get("USB_STATE");
String accessory = event.get("ACCESSORY");
... ...
mHandler.updateState(state);
... ...
startAccessoryMode();
}
};
在UsbHandler初始化时注册:
// Watch for USB configuration changes
mUEventObserver.startObserving(USB_STATE_MATCH);
mUEventObserver.startObserving(ACCESSORY_START_MATCH);
其中:
USB_STATE_MATCH ="DEVPATH=/devices/virtual/android_usb/android0" :
监听 /sys/deivces/virtual/android_usb/anroid0下的uevent节点的值,此节点上报USB_STATE相关的消息。
ACCESSORY_START_MATCH = "DEVPATH=/devices/virtual/misc/usb_accessory";
监听 /sys/devices/virtual/misc/usb_accessory 下的uvent节点的值,次节点上报USB_ACCESSORY相关的消息。
1.1.2 UsbDeviceManager构造函数
public UsbDeviceManager(Context context, UsbAlsaManager alsaManager) {
... ...
//初始化mUsbAlsaManager 对象,主要负责USB audio和USB MIDI功能
mUsbAlsaManager = alsaManager;
... ...
//是否支持USB_ACCESSORY功能
mHasUsbAccessory = pm.hasSystemFeature(PackageManager.FEATURE_USB_ACCESSORY);
//通过系统属性ro.serialno的值对应的配置RNDIS以太网的地址信息。
initRndisAddress();
//处理OEM 厂商对USB FUBCTIONS下发的修改
readOemUsbOverrideConfig();
... ...
//
boolean secureAdbEnabled = SystemProperties.getBoolean("ro.adb.secure", false);
boolean dataEncrypted = "1".equals(SystemProperties.get("vold.decrypt"));
if (secureAdbEnabled && !dataEncrypted) {
mDebuggingManager = new UsbDebuggingManager(context);
}
}
1.1.3 systemReady()
public void systemReady() {
... ...
//初始化mNotificationManager,用于在USB链接状态或者USB FUNCTION变化时对应的Notification处理。
mNotificationManager = (NotificationManager)
mContext.getSystemService(Context.NOTIFICATION_SERVICE);
... ...
//初始化大容量存储相关:
// Android默认能开启大容量存储的设置是primary的存储空间
boolean massStorageSupported = false;
final StorageManager storageManager = StorageManager.from(mContext);
final StorageVolume primary = storageManager.getPrimaryVolume();
massStorageSupported = primary != null && primary.allowMassStorage();
mUseUsbNotification = !massStorageSupported;
... ...
// 读取Setting应用关于adb 是否enable 的配置,对应于“设置”->“开发者选项”
//“USB调试”选项
Settings.Global.putInt(mContentResolver,
Settings.Global.ADB_ENABLED, mAdbEnabled ? 1 : 0);
... ...
mHandler.sendEmptyMessage(MSG_SYSTEM_READY);
//MSG_SYSTEM_READY 会在handleMessage中分别调用
// updateUsbNotification():更新USB 相关的Notification
//updateAdbNotification()
//updateUsbStateBroadcast() : 发送USB 链接状态的信息
//updateUsbFunctions() : 更新Audio和MIDI 相关配置信息
}
1.1.4 handleMessage()
handleMessage(){
switch (msg.what) {
case MSG_UPDATE_STATE:
//更新USB_STATE消息
//1.如果当前的functions中包含accessory就主动更新accessory状态信息
//2.如果USB链接断开,主动修改下发的function(某些特定的function如rndis
必须在USB线链接状态下才可以下发)
//3.更新USB链接消息,包括:1.发送UsbStateBroadcast ;2.更新audio 和midi
... ...
case MSG_ENABLE_ADB:
// 设置应用更新adb调试模式时触发 boolean mAdbEnabled 的更新,
// mAdbEnabled :直接影响下发的function中是否包含function:adb
setAdbEnabled(msg.arg1 == 1);
... ...
case MSG_SET_CURRENT_FUNCTIONS:
//function的下发
String functions = (String)msg.obj;
setEnabledFunctions(functions, false);
... ...
case MSG_UPDATE_USER_RESTRICTIONS:
//重新下发当前的function来更新当前用户的状态信息
setEnabledFunctions(mCurrentFunctions, false);
break;
case MSG_SET_USB_DATA_UNLOCKED:
// 下拉菜单中 “仅充电模式”的开关
setUsbDataUnlocked(msg.arg1 == 1);
break;
case MSG_SYSTEM_READY:
// system ready时调用
updateUsbNotification();
updateAdbNotification();
updateUsbStateBroadcast();
updateUsbFunctions();
break;
case MSG_BOOT_COMPLETED:
//boot completed时
mBootCompleted = true;
// 初始化accessory配置
getCurrentSettings().accessoryAttached(mCurrentAccessory);
// 初始化mAdbEnabled 的值
mDebuggingManager.setAdbEnabled(mAdbEnabled);
case MSG_USER_SWITCHED:
// 多用户切换时
//主要控制mtp 和ptp function的下发,对应的影响到当前手机的MTP和PTP
//功能对于当前用户是否使能
case MSG_BATTERY_CHANGED:
1.2 UsbService 主要函数简介
UsbService管理所有的USB 相关的状态,包括主机本身的状态和USB 链接设备的状态。
1.3 UsbHostManager 主要函数简介
- 主要流程解析
2.1 USB 状态更新
2.2 USB function的下发
2.2.1 各功能简介
UsbFunction 的下发,指的是用户开启手机特定功能时下发特定的USB function的过程,其中:
- 开启 传输文件(MTP) 功能:下发 ”mtp” function;
- 开启 传输照片(PTP) 功能:下发 ”ptp” function;
- 开启 仅充电 功能:下发 ”charging” function;
2.2.2 功能下发流程
- 调用接口UsbManager.class 中 setCurrentFunction(String function)
- UsbDeviceManager.class 中 setCurrentFunctions()
public void setCurrentFunctions(String functions) {
mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, functions);
}
- handleMessage中接受消息,调用setEnabledFunctions
public void handleMessage(Message msg) {
... ...
case MSG_UPDATE_USER_RESTRICTIONS:
setEnabledFunctions(mCurrentFunctions, false);
break;
... ...
}
- setEnabledFunctions() 主要作用是:
1.对将要下发function进行fix,保证下发的functions符合下发规范;
2.处理下发functions失败的状况;
private void setEnabledFunctions(String functions, boolean forceRestart){
... ...
//对将要下发function进行fix,保证下发的functions符合下发规范
final String fixed_functions = fixFuntions(functions);
... ...
//下发rndis和accessory时,为了避免较长时间耗时导致ANR,需要重新起一个线程
if (fixed_functions!=null&&
(UsbManager.containsFunction(fixed_functions ,UsbManager.USB_FUNCTION_RNDIS)||
UsbManager.containsFunction(fixed_functions ,UsbManager.USB_FUNCTION_ACCESSORY))){
new Thread() {
public void run() {
if(!trySetEnabledFunctions(fixed_functions, setforceRestart)){
//如果下发失败,则主动下发默认的functions
trySetEnabledFunctions(getDefaultFunctions(), false);
}
}.start();
return;
}
}
- trySetEnabledFunctions()
trySetEnabledFunctions(String functions, boolean forceRestart){
... ...
//处理OEM需求对function的修改
functions = applyOemOverrideFunction(functions);
... ...
// 处理下发的function对系统属性persist.sys.usb.config的修改
setUsbPersistConfig(functions);
... ...
//下发function时,将先下发UsbManager.USB_FUNCTION_NONE,USB将软断开
if(!setUsbConfig(UsbManager.USB_FUNCTION_NONE)){
//Do not insist setting new configuration , set back when closing failed.
setUsbConfig(mCurrentFunctions);
return false;
}
//下发UsbManager.USB_FUNCTION_NONE成功后将再次下发需要下发的functions
//仅有在USB 断开的状况下,下发新的functions时才会生效
if (!setUsbConfig(functions))
... ...
}
- private boolean setUsbConfig(String config){
... ...
//将要下发的function set到系统property:sys.usb.config
SystemProperties.set(USB_CONFIG_PROPERTY, config);
... ...
return waitForState(config);
}
-
private boolean waitForState(String state){ ... ... //在set操作中将等待2S,2S内未下发成功则返回false for (int i = 0; i < 40; i++) { value = SystemProperties.get(USB_STATE_PROPERTY); if (state.equals(value)) return true; SystemClock.sleep(50); } ... ... Return false ; }
- USB 优化
3.1 USB function下发流程优化
private String fixFuntions(String functions) {
... ...
if (functions != null){
switch (functions){
case UsbManager.USB_FUNCTION_RNDIS:
//处理下发rndis function
//调用functionsCompatiableSupported
case UsbManager.USB_FUNCTION_ENABLE_SERIAL:
//开启serial,下发function serial
//调用functionsCompatiableSupported
case UsbManager.USB_FUNCTION_DISABLE_SERIAL:
//关闭serial
// 当前已下发的function中去除”serial”
case UsbManager.USB_FUNCTION_ADB:
//处理adb
//根据mAdbEnabled 来增加/去除”adb”
case UsbManager.USB_FUNCTION_CHARGING:
//处理charging
//调用functionsCompatiableSupported
}
}else{
//functions = null 时下发默认的function
}
}
3.1.1 在setEnabledFunctions中,在将functions下发到trySetEnabledFunctions中时,先由fixfunction进行处理:
private String functionsCompatiableSupported (String function,String functionsArray){
//function : 将要下发的function
//functionArray : 需要和function一起下发到propery:sys.usb.config的属性值
... ...
... ...
}