日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MSM USB插入流程代码分析

發布時間:2025/4/16 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MSM USB插入流程代码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊打開鏈接

代碼路徑:kernel\msm-3.18\drivers\power\qpnp-smbcharger.c

src_detect_handler -->update_usb_status(chip, usb_present, 0);-->handle_usb_insertion(chip);read_usb_type(chip, &usb_type_name, &usb_supply_type);//讀寄存器獲得充電器類型smbchg_change_usb_supply_type(chip, usb_supply_type);//根據充電器類型設置輸入電流門限,下面單獨分析power_supply_set_present(chip->usb_psy, chip->usb_present);//設置usb在位的屬性schedule_work(&chip->usb_set_online_work);//調度USB online工作隊列 if (!chip->hvdcp_not_supported && (usb_supply_type == POWER_SUPPLY_TYPE_USB_DCP)) {//如果芯片支持快充且充電器類型為DCP,則啟動HVDCP檢測,其中 PMI8937/PMI8940 不支持HVDCPsmbchg_stay_awake(chip, PM_DETECT_HVDCP); schedule_delayed_work(&chip->hvdcp_det_work, msecs_to_jiffies(HVDCP_NOTIFY_MS));}smbchg_detect_parallel_charger(chip);//并充相關檢測read_usb_type -->smbchg_read(chip, &reg, chip->misc_base + IDEV_STS, 1);//讀寄存器1608獲得類型 type = get_type(reg);//獲得相應的bit位的值 *usb_type_name = get_usb_type_name(type);//獲得類型名 *usb_supply_type = get_usb_supply_type(type);//獲得類型type
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

Bit7位1,充電器類型為CDP?
Bit6位1,充電器類型為DCP,即通常說的AC adapter?
Bit5位1,充電器類型為other,可以認為是非標充電器??
Bit4位1,充電器類型為SDP

get_usb_type_name(type) -->return usb_type_str[type]; static char *usb_type_str[] = {"SDP", /* bit 0 */ 對應上面寄存器的Bit4"OTHER", /* bit 1 */ 對應上面寄存器的Bit5"DCP", /* bit 2 */ 對應上面寄存器的Bit6"CDP", /* bit 3 */ 對應上面寄存器的Bit7"NONE", /* bit 4 error case */ }; /* helper to return enum power_supply_type of USB type */ get_usb_supply_type(int type) ?return usb_type_enum[type]; static enum power_supply_type usb_type_enum[] = {POWER_SUPPLY_TYPE_USB, /* bit 0 */ POWER_SUPPLY_TYPE_USB_DCP, /* bit 2 */這里將other統一處理成了DCP類型POWER_SUPPLY_TYPE_USB_CDP, /* bit 3 */POWER_SUPPLY_TYPE_USB_DCP, /* bit 4 error case, report DCP */ };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

輸入端限流設置代碼流程

代碼路徑:/kernel/msm-3.18/drivers/power/qpnp_smbcharger.c

handle_usb_insertion -->smbchg_change_usb_supply_type(chip, usb_supply_type);-->rc = vote(chip->usb_icl_votable, PSY_ICL_VOTER, true,current_limit_ma);//投票機制實際是調用他的毀掉函數-->set_usb_current_limit_vote_cb(struct device *dev,int icl_ma,int client,int last_icl_ma, int last_client)-->rc = smbchg_set_usb_current_max(chip, icl_ma); switch (chip->usb_supply_type) {//根據充電器配置最大電流case POWER_SUPPLY_TYPE_USB: case POWER_SUPPLY_TYPE_USB_CDP: default:rc = smbchg_set_high_usb_chg_current(chip, current_ma);//dcp類型默認走這個default設置 smbchg_set_high_usb_chg_current(struct smbchg_chip *chip,int current_ma) ? i = find_smaller_in_array(chip->tables.usb_ilim_ma_table, current_ma, chip->tables.usb_ilim_ma_len);//該函數返回數組中最接近設定值的數值/* finds the index of the closest smaller value in the array. */ if (i < 0) {dev_err(chip->dev,"Cannot find %dma current_table using %d\n",current_ma, CURRENT_150_MA); }//如果找不到就設置150ma usb_cur_val = i & USBIN_INPUT_MASK; rc = smbchg_sec_masked_write(chip, chip->usb_chgpth_base + IL_CFG,USBIN_INPUT_MASK, usb_cur_val);//設置寄存器13f2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20


《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的MSM USB插入流程代码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。