自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux驅(qū)動(dòng) | 充電芯片bq24735調(diào)試,你學(xué)會(huì)了嗎?

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

一、bq24735簡(jiǎn)介

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

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

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

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

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

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

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

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

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

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

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

2. power supply功能

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

power supply framework功能包括:

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

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

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

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

3. 驅(qū)動(dòng)層功能

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

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

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

4. 其他問(wèn)題

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

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

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

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

以下是某平臺(tái)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ū)動(dòng)實(shí)現(xiàn)

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

1. 硬件連接圖圖

下面是一個(gè)典型的bq24735電路連接圖:

當(dāng)沒(méi)有電源供電的時(shí)候,bq24735會(huì)直接將電池傳遞給降壓電路,給系統(tǒng)供電 當(dāng)有電源供電的時(shí)候,bq24735會(huì)給電池充電。

2. 引腳說(shuō)明

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

3. 寄存器

bq24735用到的寄存器如下:

  • 充電選項(xiàng)寄存器Charge Options Register [reset = 0x12H]。

其中最重要的兩個(gè)位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)前是否在充電,則可以讀取該寄存器,通過(guò)判斷bit[0]是否為0來(lái)確認(rèn) 如果要判斷當(dāng)前是否存在,則可以讀取該寄存器,通過(guò)判斷bit[4]是否為1來(lái)確認(rèn)

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

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

比如我們要設(shè)置充電電流為3072mA。

該值為2048+1024,將對(duì)應(yīng)的bite[10]/[11]為1,其他位為0。

1100 0000 0000

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

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

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

  • 輸入電流Input Current Register (0x3FH)。

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

  • 0xfe,0xff 這兩個(gè)寄存器分別讀取MANUFACTURER_ID和DEVICE_ID。

這兩個(gè)值分別為:0x0040、0x000B。。

驅(qū)動(dòng)初始化時(shí)可以通過(guò)讀取這兩個(gè)寄存器的值來(lái)判斷,驅(qū)動(dòng)是否和硬件匹配。。

注意: 通常寄存器0x14、0x15、0x3F值需要詢問(wèn)硬件工程師。

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ù)說(shuō)明:

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

5. 驅(qū)動(dòng)講解

  • 驅(qū)動(dòng)文件 內(nèi)核代碼中已經(jīng)有該驅(qū)動(dòng)。
drivers\power\bq24735-charger.c

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

該驅(qū)動(dòng)是基于I2C總線,對(duì)應(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 是否存在
其實(shí)就是讀取寄存器0x12的值,判斷bit[4]值是否為1
static int bq24735_charger_is_charging(struct bq24735 *charger)
判斷bq24735 是否在充電
其實(shí)就是讀取寄存器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ā)生變化的時(shí)候,會(huì)發(fā)送中斷給cpu
此時(shí)可以通過(guò)I2C來(lái)讀取寄存器0x12的內(nèi)容來(lá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,//沒(méi)有充電
POWER_SUPPLY_STATUS_FULL,//充滿
};
  • probe流程

此處檢測(cè)MANUFACTURER_ID和DEVICE_ID流程稍做了修改,只有bq24735 present的時(shí)候才會(huì)check并配置。

此外還有個(gè)最重要的機(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)可以訪問(wèn)的命令的集合,
這些命令需要在函數(shù)supply_desc->get_property增加對(duì)應(yīng)的命令代碼
supply_desc->get_property
power supply會(huì)定時(shí)通過(guò)該回調(diào)函數(shù)獲取充電芯片是否在線、是否在充電等狀態(tài)
  • 代碼架構(gòu):

這個(gè)架構(gòu)是一口君根據(jù)項(xiàng)目中平臺(tái)所畫的架構(gòu),其他平臺(tái)架構(gòu)可能會(huì)有所不同, 需要具體問(wèn)題具體分析。

四、 log

下面log是開(kāi)機(jī)啟動(dòng)流程log, 第一步 用電池供電啟動(dòng)。

啟動(dòng)后再插入電源充電, 插入電源后,bq24735會(huì)觸發(fā)中斷:

然后再斷開(kāi)電源停止充電。

責(zé)任編輯:武曉燕 來(lái)源: 一口Linux
相關(guān)推薦

2023-08-08 08:34:47

漏洞環(huán)境獲取方法

2023-01-10 08:43:15

定義DDD架構(gòu)

2024-02-04 00:00:00

Effect數(shù)據(jù)組件

2023-07-26 13:11:21

ChatGPT平臺(tái)工具

2024-01-19 08:25:38

死鎖Java通信

2024-01-02 12:05:26

Java并發(fā)編程

2023-08-01 12:51:18

WebGPT機(jī)器學(xué)習(xí)模型

2023-04-07 07:42:01

2024-09-30 09:05:46

Linux網(wǎng)絡(luò)延遲

2024-05-06 00:00:00

InnoDBView隔離

2024-08-06 09:47:57

2022-07-08 09:27:48

CSSIFC模型

2023-01-30 09:01:54

圖表指南圖形化

2024-07-31 08:39:45

Git命令暫存區(qū)

2023-12-12 08:02:10

2023-10-10 11:04:11

Rust難點(diǎn)內(nèi)存

2022-07-13 08:16:49

RocketMQRPC日志

2023-01-31 08:02:18

2023-05-05 06:54:07

MySQL數(shù)據(jù)查詢

2023-08-26 21:34:28

Spring源碼自定義
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)