android usb大體流程解析

來源:互聯網
上載者:User



我分析這個流程也是從這張圖來分析:
首先kernel層是由kernel_imx/drivers/power/下的bq27x00_battery.c和power_supply_core.c以及power_supply_sysfs.c三個檔案來做,power_supply_core.c主要提供統一裝置檔案的建立以及發送power_supply相關的Uevent;bq27x00_battery.c主要提供具體的電池資訊.
每當產生充放電中斷時,驅動會調用中斷函數ext_power_isr,該函數調用power_supply_core.c的power_supply_changed(&(id->bat))函數,發送一個power_supply屬性的Uevent,java層的BatteryService接收到該事件後就會調用jni層的native——update函數來獲得電池資訊,然後通過intnet廣播給相應的activity。

那麼由kernel層發送一個Uevent,當插入usb時,然後通過NetLinkManage中的NetlinkManager::start()開始建立socket和bind:
mSock = socket(PF_NETLINK,
                        SOCK_DGRAM,NETLINK_KOBJECT_UEVENT,bind(mSock, (struct sockaddr *) &nladdr, sizeof(nladdr)
然後通過一個Handler傳送給socketListener.cpp:
mHandler = new NetlinkHandler(mSock);mHandler->start();
然後socketListener.cpp的SocketListener::startListener() 開始監聽
mSock = android_get_control_socket(mSocketName),
 mClients->push_back(new SocketClient(mSock));
建立線程pthread_create(&mThread, NULL, SocketListener::threadStart, this)不斷監聽。
而VolumeManager則通過NetLinkeEent的findParam方法在
handleSwitchEvent
handleBlockEvent
handleUsbCompositeEvent中來擷取路徑,而在notifyUmsAvailable中的getBroadcaster()則又通過VolumeManager.h調用的SocketListen的*getBroadcaster()。
再由NativeDaemonConnector.java來監聽VolumeManager中而來的socket,
public void run() {   listenToSocket();}。
MountService的onEvent給IMountServiceListener傳遞資料,並且IMountService 通過MountServiceListene給MountService:如MountServiceBinderListener(IMountServiceListener listener)。

      IMountServiceListener通過AIDL向StorageManager傳遞
onStorageStateChanged(path, oldState, newState);和
onUsbMassStorageConnectionChanged(connected);
在StorageManager中去實現:
public void onUsbMassStorageConnectionChanged(boolean available) {
            final int size = mListeners.size();
            for (int i = 0; i < size; i++) {
                mListeners.get(i).sendShareAvailabilityChanged(available);
            }
public void onStorageStateChanged(String path, String oldState, String newState) {
            final int size = mListeners.size();
            for (int i = 0; i < size; i++) {
                mListeners.get(i).sendStorageStateChanged(path, oldState, newState);
            }
        }

在電池資訊方面:由於電池電量變化時不能產生中斷來通知上層讀取電池資訊,所以設定了一個定時器,每隔30s發送一個Uevent事件讓BatteryService 來讀取電池資訊是否有變化 :在這裡充當Uevent觀察者的角色
private UEventObserver mUEventObserver = new UEventObserver() {
        @Override
        public void onUEvent(UEventObserver.UEvent event) {
            update();
        }
    };
這裡只關注power_supply的事件:
mUEventObserver.startObserverving("SUBSYSTEM=power_supply");
當有power_supply相關的事件上報時,就會調用update函數。
update先調用native_update從sysfs中讀取相關狀態。
Update然後根據讀到的狀態更新BatteryService的成員變數,並廣播一個Intent來通知其它關注電源狀態的組件。
 private final void sendIntent() {
        //  Pack up the values and broadcast them to everyone
        Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
        intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
                | Intent.FLAG_RECEIVER_REPLACE_PENDING);

        int icon = getIcon(mBatteryLevel);

        intent.putExtra(BatteryManager.EXTRA_STATUS, mBatteryStatus);
        intent.putExtra(BatteryManager.EXTRA_HEALTH, mBatteryHealth);
        intent.putExtra(BatteryManager.EXTRA_PRESENT, mBatteryPresent);
        intent.putExtra(BatteryManager.EXTRA_LEVEL, mBatteryLevel);
        intent.putExtra(BatteryManager.EXTRA_SCALE, BATTERY_SCALE);
        intent.putExtra(BatteryManager.EXTRA_ICON_SMALL, icon);
        intent.putExtra(BatteryManager.EXTRA_PLUGGED, mPlugType);
        Log.i("mPlugType","mPlugType="+mPlugType+"mBatteryLevel"+mBatteryLevel);
        intent.putExtra(BatteryManager.EXTRA_VOLTAGE, mBatteryVoltage);
        intent.putExtra(BatteryManager.EXTRA_TEMPERATURE, mBatteryTemperature);
        intent.putExtra(BatteryManager.EXTRA_TECHNOLOGY, mBatteryTechnology);
..........
當有變化時就調用JNI層的native_update()來 更新,通過JNI到   com_android_sever_batteryService.cpp的 android_server_BatteryService_update方法   :
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)
{
    setBooleanField(env, obj, gPaths.acOnlinePath, gFieldIds.mAcOnline);
    setBooleanField(env, obj, gPaths.usbOnlinePath, gFieldIds.mUsbOnline);
    setBooleanField(env, obj, gPaths.batteryPresentPath, gFieldIds.mBatteryPresent);
    setIntField(env, obj, gPaths.batteryCapacityPath, gFieldIds.mBatteryLevel);
    setVoltageField(env, obj, gPaths.batteryVoltagePath, gFieldIds.mBatteryVoltage);
    setIntField(env, obj, gPaths.batteryTemperaturePath, gFieldIds.mBatteryTemperature);
const int SIZE = 128;
    char buf[SIZE];
    if (readFromFile(gPaths.batteryStatusPath, buf, SIZE) > 0)
        env->SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));
    else
        env->SetIntField(obj, gFieldIds.mBatteryStatus,
                         gConstants.statusUnknown);
   
    if (readFromFile(gPaths.batteryHealthPath, buf, SIZE) > 0)
        env->SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));

    if (readFromFile(gPaths.batteryTechnologyPath, buf, SIZE) > 0)
        env->SetObjectField(obj, gFieldIds.mBatteryTechnology, env->NewStringUTF(buf));
}
static JNINativeMethod sMethods[] = {
     /* name, signature, funcPtr */
    {"native_update", "()V", (void*)android_server_BatteryService_update},
};
   

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.