Power-- 1.charge Fuel gauge
點擊打開鏈接
1.電池曲線數據
??? 高通平臺:
????FG電量計來計算電池電量
??? 電池數據是電量計不可或缺的一部分
??? 一個型號的電池數據是一份dts文件
2.電池數據分析
????文件命名一般包含項目、廠商、電壓、電容,如:xxx_xxx_xxmAh_xxx.dtsi???
????得到dtsi后可以根據情況做一些調整:電池電壓,顯示容量,電池ID電阻,熱溫度系數
??? Beta值,電池型號名稱等內容需要修改/確認,如:黃色背景處數據
??? 充電電流值和一些FG參數也需要關注,如藍色標注
????
下面介紹一下這些節點:
qcom,max-voltage-uv:最大額定電壓
qcom,nom-batt-capacity-mah:電池名義上的容量,單位mah,最新的好像不用這個節點了
qcom,batt-id-kohm:電池的電阻id
qcom,battery-beta:熱溫度系數Beta值,不太確定是做什么用的
qcom,battery-type:指出電池類型的字符串
qcom,fastchg-current-ma:指定最大的快速充電電流
qcom,fg-cc-cv-threshold-mv:從恒定電荷過度到恒定電壓的一個電壓閾值
qcom,fg-profile-data:一組十六進制的數據用來配置更加復雜的fuel gauge外設。有大量的參數用來配置硬件狀態然后在軟件中讀取。
合入項目中: 項目一般是定義dts,然后通過#include dtsi 文件的方式擴展添加電池曲線。 如:某個項目中,是這樣擴展電池曲線:位置:kernel/msm-3.18/arch/arm/boot/dts/qcom/msm8909-mtp.dtsi代碼如下:?/ {
?mtp_batterydata: qcom,battery-data {
??qcom,rpull-up-kohm = <100>;
??qcom,vref-batt-therm = <1800000>;#include "batterydata-palladium.dtsi"
?};
};
qcom,rpull-up-kohm : The vadc pullup resistor's resistance value in kOhms.? vadc上拉電阻的阻值,單位是kohmsqcom,vref-batt-therm-uv : The vadc voltage used to make readings. vadc的電壓,
正確識別出電池id是調試的基礎:cat sys/class/power_supply/bms/battery_type能夠正確識別出電池廠商型號,對應正確的電池數據為檢查通過。
3.充電模塊配置充電的大部分數據都需要在dts/dtsi里面配置
3.1電池最大充電電流(這部分有點不懂)Qcom,fastchg-current-ma??:Specifies the maximum fastcharge current.Msm8952平臺 是在電池數據中配置的,默認的代碼邏輯是,PMI在pmi8950_charger:qcom,qpnp-smbcharger模塊中不配置數據。compatible:??Must be "qcom,qpnp-smbcharger"??
檢查方法:用adb方式檢查?? adb shell
?? echo 0x210F2 > sys/kernel/debug/spmi/spmi-0/address?? cat data
??? 數據表格如下:
3.2 AC充電器、usb充電電流
???? 充電器的最大值來自于usb模塊的設置;usb-pc的充電電流值同樣來自于usb模塊的設置,默認是500mA。
????AC充電器與DC充電器的區別在于前者應用于交流電,而DC充電器應用直流電,AC充電器即交流電充電器,DC充電器則是直流充電器。
??? 問題:usb模塊的設置在哪里?
??? 檢查方式:使用電流檢測儀器,接在usb線上可以直接讀到電流數據。
3.3標準參數設置
??? 充電ic的配置和電量計ic的配置dts,下面高亮的數據都是需要特定配置的。???
qcom,qpnp-smbcharger {
?????? spmi-dev-container;????//默認 Must be included in the parent node to set up the spmi sub node devices.
?????? compatible= "qcom,qpnp-smbcharger";??//模塊名
?????? #address-cells= <1>;
?????? #size-cells= <1>;
?????? qcom,iterm-ma= <100>;???//停止充電截止電流,有FG后不再使用,默認配置
???????qcom,float-voltage-mv = <4400>;???//充電電壓(電池最大電壓),會被電池數據覆蓋,支持范圍是3600mv到4500mv
?????? qcom,resume-delta-mv= <100>;???//回充電壓,有FG后不再使用
?????? qcom,bmd-pin-src= "bpd_thm_id";??//電池移除檢測引腳配置,有四個值,但是不知道是干什么用的
?????? //qcom,dc-psy-type= "Mains";????//DC_IN路充電,目前不使用
?????? //qcom,dc-psy-ma= <1500>;??????//DC_IN路充電,目前不使用
???????qcom,bms-psy-name = "bms";?????//必須定義,指向電量計名,用于報告電池容量的名稱
?????? qcom,battery-psy-name= "battery";???//需要,驅動代碼有默認值,電池驅動注冊的電池充電名字
?????? qcom,thermal-mitigation= <1500 700 600 325>;???//thermal_enginer的控制,不同thermal系統的電流極限值
?????? qcom,vchg_sns-vadc= <&pmi8950_vadc>;???//讀取VCHG電壓所需,可選,vadc節點的指針
?????? qcom,vchg-adc-channel-id= <3>;???????????//VCHG的通道,可選
?????? qcom,pmic-revid= <&pmi8950_revid>;??????//PMI版本號。必須。pmic revid 模塊的指針,需要特別指出,定義pmic 子類型
?????? qcom,force-aicl-rerun;????????????????????//AICL自動控制電流,需要,不懂
?????? qcom,aicl-rerun-period-s= <180>;??????????//AICL自動控制電流,時間間隔,需要
????????qcom,chg-inhibit-fg;????????????????????//使用FG控制二次充電
????????qcom,autoadjust-vfloat;?????????????????//檢測充電時電池電壓,需要
??……
}
pmi8950_fg: qcom,fg {
???????????? spmi-dev-container;
???????????? compatible= "qcom,qpnp-fg";? //"qcom,qpnp-fg" for the FG driver.
???????????? #address-cells= <1>;
???????????? #size-cells= <1>;
?????????????qcom,resume-soc = <99>;?????????????//回充電量,啟動二次充電的門限 soc to resume charging in percentage.
???????????? status= "okay";
???????????? qcom,bcl-lm-threshold-ma= <127>;?????//默認LPM-〉MPM LPM,MPM,HPM這三種模式的切換電流門限,不懂這三種模式
???????????? qcom,bcl-mh-threshold-ma= <405>;????//默認?MPM-〉HPM
???????????? qcom,fg-iterm-ma= <150>;????????????//顯示100%電量的充電電流
???????????? qcom,fg-chg-iterm-ma= <100>;????????//硬件完全停止充電的電流
???????????? qcom,pmic-revid= <&pmi8950_revid>;??//FG版本號,pmic revid模塊的指針,用來定義pmic子類型
?????????????qcom,fg-cutoff-voltage-mv = <3400>;????//關機電壓,對應0%電壓值;
??????????? //The voltage where the fuel gauge will steer the SOC to be zero.
?????????????qcom,fg-cc-cv-threshold-mv = <4390>;???//CCàCV的電壓值,影響100%電量顯示
??????????? //This value should be 10 mV less than the float voltage configured in the charger.
??????????? //"qcom,autoadjust-vfloat"需要定義在charger driver中
???????????? qcom,cycle-counter-en;???? ???????? ??
???????????? qcom,capacity-learning-on;? ??????? ??
?????????????qcom,vbat-estimate-diff-mv= <100>;???//重啟時OCV檢測變化門限值
??????????? //qcom,fg-vbat-estimate-diff-mv 如果soc和電池的電流電阻的估計值不同于真實的電壓值,則fuel gauge將重新做一個soc的估計當driver probes到時候
????????????qcom,cl-max-increment-deciperc = <1>;? //默認
????????????qcom,cl-max-decrement-deciperc = <1>;? //默認
????????????qcom,fg-delta-soc =<1>;???????????????//電量觸發中斷百分比,就是電量改變多少后要上報
????????????qcom,bad-battery-detection-enable;
????????????qcom,hold-soc-while-full;???????????????//100%持滿電鎖,建議設置,電池充滿就顯示100%
????????????qcom,thermal-coefficients= [B7 85 B2 49 71 35];?//NTC熱溫度系數用來讀取電池熱敏電阻,不知道做什么用的。重要。
????????????qcom,cold-bat-decidegc= <(0)>;???????????????????????//HW-cold
????????????qcom,cool-bat-decidegc= <(100)>;?? ??????????????????//SW-cool
????????????qcom,hot-bat-decidegc =<550>;???? ?????????????//HW-hot
????????????qcom,warm-bat-decidegc= <450>;?????????????????//Soft-warm
qcom,warm-bat-decidegc:?? ??? ?Warm battery temperature in decidegC.
qcom,cool-bat-decidegc:?? ??? ?Cool battery temperature in decidegC.
qcom,hot-bat-decidegc:?? ??? ?Hot battery temperature in decidegC.
qcom,cold-bat-decidegc:?? ??? ?Cold battery temperature in decidegC.
????????????qcom,battery-data =?<&qrd_batterydata>;??????//電池曲線加載,指向節點的指針,它包含電池曲線,用來支持charger/Fg
……
}
qcom,battery-data can also include any number of children nodes. These children nodes will be treated as battery profile data nodes.? 自動輸入限流器技術(AICL)
??? 自動輸入電流限制的功能是能夠根據輸入電源的提供,來選擇最大電流選擇的充電電流,能夠將usb/ac/dc充電器相容。
根據充電芯片設定一個充電輸入門限電壓值,比如4.75v,當充電芯片的輸入電壓大于該門限電壓值的時候,設置電流;
當輸入電壓沒有下降或者是稍有下降但高于該門限電壓時候,每次以100ma逐級提高充電器的輸出電流,檢測充電芯片的輸入電壓是否小于門限電壓值,每次時間間隔為5~10ms,直到充電芯片的輸入電壓小于門限電壓值,設定充電電流為前面一級或者前面兩級較小電流充電,輸入電壓沒有下降到該門限電壓值,就以設定好的充電電流進行充電。保證以最大的充電電流,最小的時間完成充電,提高用戶體驗。
?充電的控制過程中有這樣一種情況:比如你要設置一個輸入電流限制的值,這個值跟溫度有關系(溫度高了你希望這個值小一點),跟充電器類型有關系,跟用戶設置有關系,跟你是否用HVDCP有關系-->那么多決定因素,可是我們只可能設置一個值,有效的辦法是這幾種情況下都對應一個值,然后我們最終設置一個最小值,我們把每一個因素看成是一個clients,即選民,然后由選民進行vote,就像在這幾個值中選擇一個最合適的值。
completion機制
內核編程中常見的一種模式是,在當前線程之外需要初始化某個活動,然后等待該活動的結束。這個活動可以是:創建一個新的內核線程或者新的用戶空間進程,對一個已有進程的某個請求,或者某種類型的硬件動作。我們可以用信號量來同步兩個任務,內核有completion機制,他允許一個線程告訴另一個線程某個工作已經完成了。completion---基于等待隊列
同步函數一般都是成對出現,complete 和 wait_for_completion
read the followingregister to get nominal capacity of battery
Example reading register address 0
$ adb shell "echo 0 >/sys/kernel/debug/fg/sram/address"
$ adb shell "echo 4 >/sys/kernel/debug/fg/sram/count"
$ adb shell "cat/sys/kernel/debug/fg/sram/data"?
未完待續
總結
以上是生活随笔為你收集整理的Power-- 1.charge Fuel gauge的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux驱动由浅入深系列:高通sens
- 下一篇: 修改adb shell在pc端显示的名称