AXP288移植说明

2019-07-14 02:18发布

AXP288是X-powers(芯智汇)联合Intel共同为多核系统设计的一款高效高集成的电源IC,也是英特尔2014年力推的平板CPU指定PMIC之一。
    
目前,AXP288以极高的性价比和稳定性赢得了众多品牌客户青睐,ODM代工大厂BYD、仁宝等已开始小批量试产。作为本土一流模拟IC设计公司,x-powers将继续专注技术创新,领导中国模拟IC企业迈入国际舞台。
2014年或许你也将拥有一台Intel inside的平板,别忘了它 Powered by X-powers! (www.x-powers.com )
1. 模块简介
AXP288是一款针对于锂离子电池或锂聚合物电池的高度集成的电源管理芯片。


2. 代码路径
2.1. MFD设备(AXP288)代码路径
./linux/kernel/drivers/external_drivers/drivers/mfd/intel_pmic/pmic_i2c.c
./linux/kernel/drivers/external_drivers/drivers/mfd/intel_pmic/pmic.c
./linux/kernel/drivers/external_drivers/drivers/mfd/intel_pmic/dollar_cove.c


2.2. Fuel Gauge驱动代码路径
./linux/kernel/drivers/power/dc_xpwr_battery.c 
./linux/kernel/arch/x86/platform/intel-mid/device_libs/platform_dc_xpwr_battery.c
./linux/kernel/drivers/platform/x86/intel_fg_helper.c
./device/intel/common/fg_config/fg_conf_helper.c
./device/intel/baytrail/anzhen4_mrd7/config/fg_config/config2/fg_config_xpwr.xml


2.3. charger驱动代码路径
./linux/kernel/drivers/power/dc_xpwr_charger.c 
./linux/kernel/arch/x86/platform/intel-mid/device_libs/platform_dc_xpwr_charger.c


2.4. pwrsrc 驱动代码路径
./linux/kernel/drivers/platform/x86/dc_xpwr_pwrsrc.c
./linux/kernel/arch/x86/platform/intel-mid/device_libs/platform_dc_xpwr_pwrsrc.c


2.5. 相关子系统代码路径
./linux/kernel/drivers/power/power_supply_core.c
./linux/kernel/drivers/power/power_supply_charger.c
./linux/kernel/drivers/power/charging_algo_pse.c
./linux/kernel/drivers/power/battery_id.c

3. 模块体系结构


(AXP288模块体系结构)
如上图所示,AXP288驱动结构分三个层次:MFD设备,MFD设备驱动,子设备驱动。
3.1. MFD设备
MFD(multi function device)为linux下的多功能设备。AXP288对应的文件为dollar_cove.c,该文件包含了各子模块的平台数据及设备本身信息(如中断号)。


3.2. MFD设备驱动
通过i2c_add_driver(&pmic_i2c_driver)将MFD设备挂接在I2C总线下,为各功能模块提供统一的读写函数接口,并加载各子设备,为子设备创建相应的设备节点。


3.3. 子设备驱动
完成AXP288各子模块具体功能的实现,如电池信息的获取,gpio口的设置,充电策略的实现等。


4. MFD设备驱动流程
AXP288作为I2C设备挂接在I2C总线下,其驱动流程如下:
4.1. I2C设备注册
I2C设备的注册由FirmWare完成,将AXP288相关信息(如I2C总线,从地址等)提交给intel FirmWare team,由他们在FirmWare中完成I2C设备的注册。


4.2. I2C驱动注册
I2C驱动注册对应文件为pmic_i2c.c,通过i2c_device_id中的设备名与FirmWare中注册的I2C设备进行匹配,其初始化过程如下图所示:

MFD设备驱动的probe函数主要完成两方面工作:1. 中断初始化;2. 加载各子模块的平台数据并创建相应的设备节点。


4.3. AXP288中断说明
多功能设备通常只有一条中断线,各子设备需共享一条中断线来实现自身的中断请求。axp288采用中断线程嵌套模式来实现中断共享。其大致流程如下:
4.3.1. 父中断注册:
为每个子设备,申请irq编号(cur_irq);
使用irq_set_chip_data设置必要的数据;
使用irq_set_chip_and_handler设置子控制器的irq_chip实例(pmic_irq_chip)和子irq的流控处理程序(handle_edge_irq);
使用irq_set_nested_thread函数,把子设备irq的线程嵌套特性打开;
使用父设备(MFD设备)的irq编号,利用request_threaded_irq函数为父设备申请中断服务,并在中断服务处理程序(pmic_irq_thread)中调用handle_nested_irq函数,激活子中断处理程序。
4.4. AXP288读写接口(pmic.c)
int intel_mid_pmic_readb(int reg); //读reg寄存器的值
int intel_mid_pmic_writeb(int reg, u8 val); //将val写入reg寄存器
int intel_mid_pmic_setb(int reg, u8 mask); //把reg寄存器的mask位置1
int intel_mid_pmic_clearb(int reg, u8 mask); //把reg寄存器的mask位清0
int intel_mid_pmic_update(int reg, u8 val, u8 mask);//更新reg寄存器中mask位的值


5. fuel gauge简介
5.1. fuel gauge设备驱动流程
fuel gauge是AXP288下的电量获取模块,驱动中作为platform设备,挂接在platform虚拟总线下,其驱动流程如下:
5.1.1. platform设备注册
如MFD设备驱动一节所描述,fuel gauge作为platform设备的注册及其设备节点的建立在MFD设备驱动的probe函数中完成。


5.1.2. platform驱动注册
platform驱动通过驱动名称与设备名称匹配,完成设备的初始化并开启相应功能。本例对应的文件为dc_xpwr_battery.c,其流程如下图所示。

函数简要说明:
dollarcove_fg_pdata()
获取gauge参数,包括电池设计容量,电池设计电压,电池最大温度,电池最小温度。
  intel_fg_set_store_fn(pmic_fg_save_fg_params)
为字符设备“intel_fg”设置读函数,用于读取电池校准参数。
intel_fg_set_restore_fn(pmic_fg_set_config_params)
为字符设备“intel_fg”设置写函数,用于更新电池校准参数。
pmic_fg_init_config_regs()
设置gauge相关寄存器,包括1.电池设计电压;2.电池设计容量;3.电池内阻;4.电池曲线;5.低电报警阀值。
psy_register_thermal()


pmic_fg_init_hw_regs() 
设置工作状态下(第二级温度警报)电池低温和电池高温阀值,并开启gauge相关中断。
                                                                     
Fuel gauge 通过一个delayed work来监控电池信息,每隔120秒向上层报送一次电池信息。


5.1.3. fuelgauge中断处理流程
fuelgauge处理的中断有以下几种,1:退出电池低温模式(工作状态);2:进入电池低温模式(工作状态);3:退出电池高温模式(工作状态);4:进入电池高温模式(工作状态);5:电池电量达到低点报警门限2;6:电池电量达到低点报警门限1。其处理流程如下图所示:
  主要函数说明:
is_trigger_charging_algo()
根据充电状态改变与否决定是否激活充电算法。
trigger_algo()
设置充电电流,和目标电压。
get_tempzone()
根据当前温度设置充电电流和目标电压。
update_sysfs()
更新sysfs文件节点。


5.2. fuel gauge主要客制化内容:
5.2.1. 电池校准参数导入:
电池校准参数导入主要为针对不同的电池导入不同的电池校准参数(一般将电池寄给IC产商,由IC产商测得电池校准参数,如此例产商为x-power),AXP288的校准参数分为三个部分:电池容量,电池内阻,OCV曲线。
电池容量:将厂商测得的电池容量除以“1.456”获得电池容量参数,存入寄存器0XE0和0XE1,并将0XE0[7]置1,以使容量参数生效。
电池内阻:将厂商测得的电池内阻除以“1.0742”获得电池内阻参数,存入寄存器0XBA和0XBB,并将0XBA[7:6]置1,以使内阻参数生效。
OCV曲线:OCV曲线由32个参数构成,在代码上对应为一个32位的数组,存入0XC0到0XDF共32个寄存器中。
电池校准参数在驱动中以结构体dc_xpwr_fg_cfg表示,系统启动时服务“fg_conf(fg_conf_helper.c)”通过字符设备节点“intel_fg(intel_fg_helper.c)”导入到相应的寄存器中,电池校准参数配置文件为fg_config.xml。
5.2.2. 电池温度曲线导入
电池温度曲线是指AXP288 监控电池上温敏电阻所得到的值(ADC输出)与电池温度的对应关系表。其中“ADC输出”=“温敏电阻阻值(欧姆)”*“PMIC输出电流(REG 84[5:4])( μA)”/“(0.8*1000)”。
当REG 84[5:4]为默认值“11”时,即输入电流为80uA,ADC输出等于“温敏电阻阻值(欧姆)/10”。
如下图所示为文敏电阻“NCP15XH103F03R”的datasheet,若输入电流采用默认值80uA,则导入的数据为“(温敏电阻的阻值/10)/10”,第二个“10”为驱动中的修正。

5.2.4. 低电报警配置
AXP288支持两级低电报警配置,其初始值在pmic_fg_set_config_params中配置,并在系统进入休眠时(pmic_fg_suspend)修改,具体配置函数为pmic_fg_set_lowbatt_thresholds()。
6. charger驱动简介
axp288的charger模块对设备充电过程进行管理,如充电电流,目标电压的设置等。
6.1. charger设备驱动流程
6.1.1. platform设备注册
如MFD设备驱动一节所描述,charger作为platform设备的注册及其设备节点的建立在MFD设备驱动的probe函数中完成。


6.1.2. platform驱动注册
charger作为planform设备注册于系统中,对应文件为platform_dc_xpwr_charger.c,其驱动初始化如下图所示:

函数简要说明:
dollarcove_chrg_pdata()
该函数获取charger的配置信息,包括gpio口的申请,充电参数的获取。
pmic_chrg_init_psy_props()
记录最大恒流充电电流,最大恒压充电电压。
pmic_chrg_init_hw_regs()
设置第一级电池低温和电池高温阀值,设置充电周期完成后不关闭charger输出,使能charger相关中断。
usb_get_phy()
获得一个usb_phy设备,并为该设备设置一个notifier(通知),当USB模块检测到设备作为USB主设备时,关闭VBUS路径并使能5V升压。
psy_register_cooler()
注册一个cooling_device,提供cur_state接口用于修正输入电流。 
power_supply_register_charger()

6.1.3. charger中断处理流程
charger主要处理1:VBUS过压;2:充电完成;3:正在充电;4:退出电池保护模式;5:进入电池保护模式;6:退出电池低温模式(充电状态);7:进入电池低温模式(充电状态);8:退出电池高温模式(充电状态);9:进入电池高温模式(充电状态),其流程如下图所示:

6.2. charger主要客制化内容
charger客制化分为两部分:1.初始化参数;2.充电参数。
初始化参数
充电参数


7. pwrsrc驱动简介
axp288的pwrsrc模块用于检测设备的充电类型(支持SDP,CDP,DCP),并对输入电压,电流做相应设置。
7.1. pwrsrc设备驱动流程
7.1.1. platform设备注册
pwrsrc在驱动中作为platform设备,其注册及设备节点的建立在MFD设备驱动的probe函数中完成。


7.1.2. platform驱动注册
pwrsrc作为planform设备注册于系统中,应文件为dc_xpwr_pwrsrc.c