当前位置: 代码迷 >> 综合 >> Android USB Tethering的实现以及代码流程
  详细解决方案

Android USB Tethering的实现以及代码流程

热度:68   发布时间:2024-01-20 10:29:01.0

分析还不是很全,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
  相关解决方案