• 正文
    • 一、bq24735簡介
    • 二、Linux內(nèi)核充電架構(gòu)
    • 三、bq24735驅(qū)動實現(xiàn)
    • 四、 log
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

【Linux驅(qū)動】充電芯片bq24735調(diào)試筆記

02/01 11:45
215
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

一、bq24735簡介

bq24735 是一款高效率同步電池充電器。

當(dāng)系統(tǒng)供電需求暫時高于適配器最大供電水平的時候, bq24735 使用智能加速技術(shù)來允許電池向系統(tǒng)中釋放能量,這樣的話將保護(hù)適配器不被損壞。

bq24735 為滿足自動系統(tǒng)電源選擇的需要,使用 2 個充電泵來分別驅(qū)動 n-通道 MOSFET (ACFET, RBFET 和 BATFET) 。

SMBus(I2C總線) 控制的輸入電流, 充電電流, 和充電電壓DAC允許非常高的調(diào)節(jié)精度,此調(diào)節(jié)精度可通過系統(tǒng)功率管微控制器很容易地進(jìn)行編程。

bq24735 使用內(nèi)部輸入電流寄存器或者外部ILIM引腳來減緩PWM調(diào)制速度以減小充電電流。

二、Linux內(nèi)核充電架構(gòu)

要想理解bq24735驅(qū)動,必須首先理解Android供電系統(tǒng)框架,最重要的知識點是power supply。

1. Android供電系統(tǒng)框架

power supply(以下簡稱psy)是Linux中從供電驅(qū)動抽象出來的子系統(tǒng),是Linux電源管理的重要組成部分。

psy是一個中間層,在kernel中是屬于設(shè)備驅(qū)動的一部分,psy的作用主要是向用戶空間匯總各類供電的狀態(tài)信息。

抽象出來的各類信息稱為property,比如供電設(shè)備是否連接就對應(yīng)著POWER_SUPPLY_PROP_ONLINE。

2. power supply功能

power_supply的軟件架構(gòu):

power supply framework功能包括:

    抽象PSY設(shè)備的共性,向用戶空間提供統(tǒng)一的API;為底層PSY驅(qū)動的編寫,提供簡單、統(tǒng)一的方式,同時封裝并實現(xiàn)公共邏輯。

power supply class位于drivers/power/目錄中,主要由3部分組成(可參考下圖的軟件架構(gòu)):

    1)power_supply_core,用于抽象核心數(shù)據(jù)結(jié)構(gòu)、實現(xiàn)公共邏輯。位于drivers/power/power_supply_core.c中。2)power_supply_sysfs,實現(xiàn)sysfs以及uevent功能。位于drivers/power/power_supply_sysfs.c中。3)power_supply_leds,基于Linux led class,提供PSY設(shè)備狀態(tài)指示的通用實現(xiàn)。位于drivers/power/power_suppply_leds.c中。

最后,驅(qū)動工程師可以基于power supply class,實現(xiàn)具體的PSY drivers,主要處理平臺相關(guān)、硬件相關(guān)的邏輯。這些drivers都位于drivers/power/power_supply目錄下。

3. 驅(qū)動層功能

在驅(qū)動層,主要是兩大模塊,與電池監(jiān)控(fuelgauge)和與充放電管理(charger)相關(guān)的驅(qū)動(對應(yīng)圖中的battery.c和charger.c),這兩大模塊主要處理硬件相關(guān)的邏輯,在硬件狀態(tài)發(fā)生變化時,會觸發(fā)相關(guān)的中斷,驅(qū)動層會調(diào)用相應(yīng)的中斷函數(shù),并更新修改相應(yīng)的psy節(jié)點值。

fuelgauge驅(qū)動主要是負(fù)責(zé)向上層android系統(tǒng)提供當(dāng)前電池的電量以及健康狀態(tài)信息等等,另外除了這個以外,它也向charger驅(qū)動提供電池的相關(guān)信息;charger驅(qū)動主要負(fù)責(zé)電源線的插拔檢測,以及充放電的過程管理。

對于battery管理,硬件上有電量計IC和充放電IC,當(dāng)然有些廠家為了成本的考慮,也會把電量計和充放電功能集成到一個IC上,更有甚者,可能會把PMU功能也集成在一塊硅面上。

4. 其他問題

問:android怎么知道當(dāng)前是什么供電,充電中與否?

答:uevent機(jī)制(實質(zhì)是net_link方式的socket)(廣泛應(yīng)用于hotplug),充電插入與斷開時,內(nèi)核通過發(fā)送uevent信息,告訴android。

問:android如何知道各種參數(shù)并更新的?

答:通過kobject_uevent發(fā)送通知給上層,上層讀取sys相關(guān)文件屬性

以下是某平臺sysfs文件目錄

root@********_arm64:/sys/class?#?pwd
sys/class/power_supply
root@********_arm64:/sys/class/power_supply?#?ls
ac
battery
bq24735@5-0009
usb
root@********_arm64:/sys/class/power_supply?#?cd?bq24735@5-0009
cd?bq24735@5-0009
root@*********_arm64:/sys/class/power_supply/bq24735@5-0009?#?ls
device
online
power
status
subsystem
type
uevent??????????????????????????????????????????????????????????????????????????????

三、bq24735驅(qū)動實現(xiàn)

下面基于某款soc來講解如何讓我們的產(chǎn)品支持bq24735。

1. 硬件連接圖圖

下面是一個典型的bq24735電路連接圖:

當(dāng)沒有電源供電的時候,bq24735會直接將電池傳遞給降壓電路,給系統(tǒng)供電

當(dāng)有電源供電的時候,bq24735會給電池充電。

2. 引腳說明

在此我們只介紹與驅(qū)動相關(guān)的引腳

3. 寄存器

bq24735用到的寄存器如下:

    充電選項寄存器Charge Options Register [reset = 0x12H]

其中最重要的兩個位bit[4]/bit[0]
bit:[4]

0:?AC?adapter不在?(ACDET?<?2.4?V)??
1:?AC?adapter存在(ACDET?>?2.4?V)

bit:[0]

0:?使能充電
1:?抑制充電

該寄存器為可讀寫,
如果要判斷當(dāng)前是否在充電,則可以讀取該寄存器,通過判斷bit[0]是否為0來確認(rèn)
如果要判斷當(dāng)前是否存在,則可以讀取該寄存器,通過判斷bit[4]是否為1來確認(rèn)

    充電電流寄存器Charge Current Register (0x14H)

通過該寄存器可以設(shè)置充電電流。

比如我們要設(shè)置充電電流為3072mA,該值為2048+1024,將對應(yīng)的bite[10]/[11]為1,其他位為0

1100?0000?0000

即設(shè)置該寄存器值為:0xC00

充電電壓寄存器Charge Voltage Register (0x15H)

該寄存器設(shè)置方法類似于充電電流寄存器

輸入電流Input Current Register (0x3FH)

該寄存器設(shè)置方法類似于充電電流寄存器

0xfe,0xff
這兩個寄存器分別讀取MANUFACTURER_ID和DEVICE_ID

這兩個值分別為:0x0040、0x000B

驅(qū)動初始化時可以通過讀取這兩個寄存器的值來判斷,驅(qū)動是否和硬件匹配。

注意:
通常寄存器0x14、0x15、0x3F值需要詢問硬件工程師

4. 設(shè)備樹

bq24735@9?{
?compatible?=?"ti,bq24735";
?reg?=?<0x9>;
?ti,ac-detect-gpios?=?<&gpio?72?0x1>;
?ti,charge-current?=<0x600>;
?ti,charge-voltage=<0x41a0>;
?ti,input-current?=<0x800>;
}

參數(shù)說明

compatible :用于和驅(qū)動的結(jié)構(gòu)體i2c_driver的driver.of_match_table->compatible屬性進(jìn)行匹配
reg:bq24735從設(shè)備地址(I2C)
ti,ac-detect-gpios:中斷使用的gpio,第三個參數(shù)是該pin默認(rèn)電平
ti,charge-current :充電電流
ti,charge-voltage :充電電壓
ti,input-current ?:輸入電流

5. 驅(qū)動講解

    1. 驅(qū)動文件

 

    內(nèi)核代碼中已經(jīng)有該驅(qū)動
driverspowerbq24735-charger.c

但是該驅(qū)動往往需要修改以適配實際的方案。

該驅(qū)動是基于I2C總線,對應(yīng)結(jié)構(gòu)體變量定義如下:

static?struct?i2c_driver?bq24735_charger_driver?=?{
?.driver?=?{
??.name?=?"bq24735-charger",
??.owner?=?THIS_MODULE,
??.of_match_table?=?bq24735_match_ids,
?},
?.probe?=?bq24735_charger_probe,
?.remove?=?bq24735_charger_remove,
?.id_table?=?bq24735_charger_id,
};
    主要函數(shù)
static?bool?bq24735_charger_is_present(struct?bq24735?*charger)
判斷bq24735?是否存在
其實就是讀取寄存器0x12的值,判斷bit[4]值是否為1
static?int?bq24735_charger_is_charging(struct?bq24735?*charger)
判斷bq24735?是否在充電
其實就是讀取寄存器0x12的值,判斷bit[0]值是否為0
static?inline?int?bq24735_enable_charging(struct?bq24735?*charger)
使能充電
將寄存器寄存器0x12的bit[0]置0
static?inline?int?bq24735_disable_charging(struct?bq24735?*charger)
禁止充電
將寄存器寄存器0x12的bit[0]置1
static?int?bq24735_config_charger(struct?bq24735?*charger)
配置充電電壓(寄存器0x15)、充電電流(寄存器0x14)、輸入電流(寄存器0x3f)
static?irqreturn_t?bq24735_charger_isr(int?irq,?void?*devid)
中斷處理函數(shù),
當(dāng)bq24735充電狀態(tài)發(fā)生變化的時候,會發(fā)送中斷給cpu
此時可以通過I2C來讀取寄存器0x12的內(nèi)容來獲取bq24735當(dāng)前狀態(tài)
static?int?bq24735_charger_get_property(struct?power_supply?*psy,
?????enum?power_supply_property?psp,
?????union?power_supply_propval?*val)
提供給power?supply子系統(tǒng)的回調(diào)函數(shù)
該函數(shù)用于獲取bq24735當(dāng)前狀態(tài)

狀態(tài)包括
enum?{
?POWER_SUPPLY_STATUS_UNKNOWN?=?0,
?POWER_SUPPLY_STATUS_CHARGING,??//正在充電
?POWER_SUPPLY_STATUS_DISCHARGING,?
?POWER_SUPPLY_STATUS_NOT_CHARGING,//沒有充電
?POWER_SUPPLY_STATUS_FULL,//充滿
};
    probe流程

此處檢測MANUFACTURER_ID和DEVICE_ID流程稍做了修改,只有bq24735 present的時候才會check并配置

此外還有個最重要的機(jī)構(gòu)體

?supply_desc->name?=?name;
?supply_desc->type?=?POWER_SUPPLY_TYPE_MAINS;
?supply_desc->properties?=?bq24735_charger_properties;
?supply_desc->num_properties?=?ARRAY_SIZE(bq24735_charger_properties);
?supply_desc->get_property?=?bq24735_charger_get_property;
supply_desc->properties
?提供給power?supply架構(gòu)可以訪問的命令的集合,
?這些命令需要在函數(shù)supply_desc->get_property增加對應(yīng)的命令代碼
supply_desc->get_property
?power?supply會定時通過該回調(diào)函數(shù)獲取充電芯片是否在線、是否在充電等狀態(tài)
    1. 代碼架構(gòu)

這個架構(gòu)是一口君根據(jù)項目中平臺所畫的架構(gòu),其他平臺架構(gòu)可能會有所不同,
需要具體問題具體分析。

四、 log

下面log是開機(jī)啟動流程log,
第一步
用電池供電啟動

啟動后再插入電源充電,
插入電源后,bq24735會觸發(fā)中斷:然后再斷開電源停止充電

end

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

公眾號『一口Linux』號主彭老師,擁有15年嵌入式開發(fā)經(jīng)驗和培訓(xùn)經(jīng)驗。曾任職ZTE,某研究所,華清遠(yuǎn)見教學(xué)總監(jiān)。擁有多篇網(wǎng)絡(luò)協(xié)議相關(guān)專利和軟件著作。精通計算機(jī)網(wǎng)絡(luò)、Linux系統(tǒng)編程、ARM、Linux驅(qū)動、龍芯、物聯(lián)網(wǎng)。原創(chuàng)內(nèi)容基本從實際項目出發(fā),保持原理+實踐風(fēng)格,適合Linux驅(qū)動新手入門和技術(shù)進(jìn)階。