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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

MSM USB插入流程代码分析

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

點(diǎn)擊打開鏈接

代碼路徑: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);//根據(jù)充電器類型設(shè)置輸入電流門限,下面單獨(dú)分析power_supply_set_present(chip->usb_psy, chip->usb_present);//設(shè)置usb在位的屬性schedule_work(&chip->usb_set_online_work);//調(diào)度USB online工作隊(duì)列 if (!chip->hvdcp_not_supported && (usb_supply_type == POWER_SUPPLY_TYPE_USB_DCP)) {//如果芯片支持快充且充電器類型為DCP,則啟動(dòng)HVDCP檢測(cè),其中 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);//并充相關(guān)檢測(cè)read_usb_type -->smbchg_read(chip, &reg, chip->misc_base + IDEV_STS, 1);//讀寄存器1608獲得類型 type = get_type(reg);//獲得相應(yīng)的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,即通常說(shuō)的AC adapter?
Bit5位1,充電器類型為other,可以認(rèn)為是非標(biāo)充電器??
Bit4位1,充電器類型為SDP

get_usb_type_name(type) -->return usb_type_str[type]; static char *usb_type_str[] = {"SDP", /* bit 0 */ 對(duì)應(yīng)上面寄存器的Bit4"OTHER", /* bit 1 */ 對(duì)應(yīng)上面寄存器的Bit5"DCP", /* bit 2 */ 對(duì)應(yīng)上面寄存器的Bit6"CDP", /* bit 3 */ 對(duì)應(yīng)上面寄存器的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統(tǒng)一處理成了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

輸入端限流設(shè)置代碼流程

代碼路徑:/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);//投票機(jī)制實(shí)際是調(diào)用他的毀掉函數(shù)-->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) {//根據(jù)充電器配置最大電流case POWER_SUPPLY_TYPE_USB: case POWER_SUPPLY_TYPE_USB_CDP: default:rc = smbchg_set_high_usb_chg_current(chip, current_ma);//dcp類型默認(rèn)走這個(gè)default設(shè)置 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);//該函數(shù)返回?cái)?shù)組中最接近設(shè)定值的數(shù)值/* 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); }//如果找不到就設(shè)置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);//設(shè)置寄存器13f2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20


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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。