分析还不是很全,kernel层的代码还在看,同步更新吧
直接略过界面层,界面一系列处理后调用Tethering.java的setUsbTethering函数。
public int setUsbTethering(boolean enable) {if (VDBG) Log.d(TAG, "setUsbTethering(" + enable + ")");UsbManager usbManager = (UsbManager)mContext.getSystemService(Context.USB_SERVICE);synchronized (mPublicSync) {if (enable) {if (mRndisEnabled) {tetherUsb(true);} else {mUsbTetherRequested = true;usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_RNDIS, false);//一开始因为rndis还没有enable,所以会先设置function}} else {tetherUsb(false);if (mRndisEnabled) {usbManager.setCurrentFunction(null, false);}mUsbTetherRequested = false;}}return ConnectivityManager.TETHER_ERROR_NO_ERROR;
}
Java层改变usb的function,其实就是设置内核提供的接口文件进行操作的
具体可以在init.usbmode.sh里面看到
echo 0 > /sys/class/android_usb/android0/enable
echo ${VENDOR_ID} > /sys/class/android_usb/android0/idVendorif [ ${ENG_PROP} -eq 1 ] ; thenset_engpid ${USB_FUNCTION}
fiecho ${PID} > /sys/class/android_usb/android0/idProduct
/system/bin/log -t ${TAG} -p i "usb product id: ${PID}"echo 0 > /sys/class/android_usb/android0/bDeviceClass
echo 0 > /sys/class/android_usb/android0/bDeviceSubClass
echo 0 > /sys/class/android_usb/android0/bDeviceProtocolecho ${USB_FUNCTION} > /sys/class/android_usb/android0/functions
/system/bin/log -t ${TAG} -p i "enabled usb functions: ${USB_FUNCTION}"echo 1 > /sys/class/android_usb/android0/enable
首先设置enable为0,即断开,然后设置functions等,最后再 将enable设为1,也就是代表连接上了USB。设置enable会调用android.c的enable_store函数,设置fucntions会调用functions_store函数。
android.c里面的代码:
static DEVICE_ATTR(functions, S_IRUGO | S_IWUSR, functions_show, functions_store);
static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR, enable_show, enable_store);
functions_store只是把enable的function存储到一个enabled_list里面。
重点是enable_store函数
static ssize_t enable_store(struct device *pdev, struct device_attribute *attr,const char *buff, size_t size)
{
struct android_dev *dev = dev_get_drvdata(pdev);
struct usb_composite_dev *cdev = dev->cdev;
struct android_usb_function *f;
struct android_configuration *conf;
int enabled = 0;
static DEFINE_RATELIMIT_S