关键词: MTK android 充电IC
内核: linux3.18
系统: android7.0
作者: arunboy(欢迎转载,请注明作者)

在原有展讯平台下面的bq25601的基础上编写mtk平台下的bq25601代码,参考mtk平台下的.并进行相关调试.
充电IC的移植是在kernel和lk里面,lk里面是mt_battery.c中调用了以下几个函数

#if defined(MTK_BQ25601_SUPPORT)bq25601_hw_init();bq25601_charging_enable(bEnable);bq25601_dump_register();
#endif

kernel里面在power/mt6735/Makefile中

ifeq ($(CONFIG_MTK_BQ25601_SUPPORT),y)obj-$(CONFIG_MTK_SMART_BATTERY) += bq25601.o charging_hw_bq25601.o

首先参考两个代码新建了一个文件,把一些接口函数进行了替换.然后查看数据手册修改数组,寄存器的值.

图中的数组都是查看数据手册然后进行填充,下面那些使用字母的因为在别的文件中定义了数字.

电池充电有三个阶段:预充电阶段,恒流充电,恒压充电.
预充电阶段:设置充电电流一般为500mA以下
恒流充电阶段:电压一般在3.2~4.1v左右,充电器的输入电压会越来越高
恒压充电阶段:4.2v左右,充电ic输出电压不变,电流逐渐减小.

驱动代码分析

1.bq25601.c

/************************************************************   [I2C Slave Setting]**********************************************************/
#define bq25601_SLAVE_ADDR_WRITE   0xD6//根据数据手册i2c的地址是0x6b,左移一位以后得到0xd6
#define bq25601_SLAVE_ADDR_READ    0xD7static struct i2c_client *new_client;
static const struct i2c_device_id bq25601_i2c_id[] = { {"bq25601", 0}, {} };kal_bool chargin_hw_init_done = KAL_FALSE;
static int bq25601_driver_probe(struct i2c_client *client, const struct i2c_device_id *id);#ifdef CONFIG_OF
static const struct of_device_id bq25601_of_match[] = {{.compatible = "bq25601",},{},
};MODULE_DEVICE_TABLE(of, bq25601_of_match);
#endifstatic struct i2c_driver bq25601_driver = {.driver = {.name = "bq25601",
#ifdef CONFIG_OF.of_match_table = bq25601_of_match,
#endif},.probe = bq25601_driver_probe,.id_table = bq25601_i2c_id,
};

2.charging_hw_bq25601.c

//充电的一些初始化的值,根据数据手册的某个寄存的的某位代表的什么意思进行设值.
static unsigned int charging_hw_init(void *data)
{unsigned int status = STATUS_OK;battery_log(BAT_LOG_CRTI, "charging_hw_init!\n");bq25601_set_en_hiz(0x0);bq25601_set_vindpm(0x8);    /* VIN DPM check 4.70V *///bq25601_set_vindpm(0x0);bq25601_set_reg_rst(0x0);bq25601_set_wdt_rst(0x1);   /* Kick watchdog */bq25601_set_sys_min(0x5);   /* Minimum system voltage 3.5V */bq25601_set_iprechg(0x7);   /* Precharge current 480mA */bq25601_set_iterm(0x1); /* Termination current 120mA */bq25601_set_vreg(0x0B); /* VREG 4.208V */bq25601_set_min_vbat_sel(0x0);  /* BATLOWV 2.8V */bq25601_set_vrechg(0x0);    /* VRECHG 0.1V (4.108V) */bq25601_set_en_term(0x1);   /* Enable termination */bq25601_set_watchdog(0x1);  /* WDT 40s */bq25601_set_en_timer(0x0);  /* Disable charge timer */bq25601_set_vindpm_int(0x0);    /* Disable fault vindpm interrupt */bq25601_set_iindpm_int(0x0);    /* Disable fault iindpm interrupt */bq25601_set_ovp(0x3);return status;
}

然后把这几个函数进行填充完整就行,根据项目需求,有的不需要.

charging_func[CHARGING_CMD_INIT] = charging_hw_init;charging_func[CHARGING_CMD_DUMP_REGISTER] = charging_dump_register;charging_func[CHARGING_CMD_ENABLE] = charging_enable;charging_func[CHARGING_CMD_SET_CV_VOLTAGE] = charging_set_cv_voltage;charging_func[CHARGING_CMD_GET_CURRENT] = charging_get_current;charging_func[CHARGING_CMD_SET_CURRENT] = charging_set_current;charging_func[CHARGING_CMD_SET_INPUT_CURRENT] = charging_set_input_current;charging_func[CHARGING_CMD_GET_CHARGING_STATUS] =  charging_get_charging_status;charging_func[CHARGING_CMD_RESET_WATCH_DOG_TIMER] = charging_reset_watch_dog_timer;charging_func[CHARGING_CMD_SET_HV_THRESHOLD] = charging_set_hv_threshold;charging_func[CHARGING_CMD_GET_HV_STATUS] = charging_get_hv_status;charging_func[CHARGING_CMD_GET_BATTERY_STATUS] = charging_get_battery_status;charging_func[CHARGING_CMD_GET_CHARGER_DET_STATUS] = charging_get_charger_det_status;charging_func[CHARGING_CMD_GET_CHARGER_TYPE] = charging_get_charger_type;charging_func[CHARGING_CMD_SET_PLATFORM_RESET] = charging_set_platform_reset;charging_func[CHARGING_CMD_GET_PLATFORM_BOOT_MODE] = charging_get_platform_boot_mode;charging_func[CHARGING_CMD_SET_POWER_OFF] = charging_set_power_off;charging_func[CHARGING_CMD_SET_TA_CURRENT_PATTERN] = charging_set_ta_current_pattern;charging_func[CHARGING_CMD_SET_ERROR_STATE] = charging_set_error_state;charging_func[CHARGING_CMD_DISO_INIT] = charging_diso_init;charging_func[CHARGING_CMD_GET_DISO_STATE] = charging_get_diso_state;charging_func[CHARGING_CMD_SET_VBUS_OVP_EN] = charging_set_vbus_ovp_en;charging_func[CHARGING_CMD_SET_VINDPM] = charging_set_vindpm;

主要记录两个函数,i2c的读写数据的函数:

int bq25601_read_byte(unsigned char cmd, unsigned char *returnData)
{char cmd_buf[1] = { 0x00 };char readData = 0;int ret = 0;mutex_lock(&bq25601_i2c_access);/* new_client->addr = ((new_client->addr) & I2C_MASK_FLAG) | I2C_WR_FLAG; */new_client->ext_flag =((new_client->ext_flag) & I2C_MASK_FLAG) | I2C_WR_FLAG | I2C_DIRECTION_FLAG;cmd_buf[0] = cmd;ret = i2c_master_send(new_client, &cmd_buf[0], (1 << 8 | 1));if (ret < 0) {/* new_client->addr = new_client->addr & I2C_MASK_FLAG; */new_client->ext_flag = 0;mutex_unlock(&bq25601_i2c_access);return 0;}readData = cmd_buf[0];*returnData = readData;/* new_client->addr = new_client->addr & I2C_MASK_FLAG; */new_client->ext_flag = 0;mutex_unlock(&bq25601_i2c_access);return 1;
}int bq25601_write_byte(unsigned char cmd, unsigned char writeData)
{char write_data[2] = { 0 };int ret = 0;mutex_lock(&bq25601_i2c_access);write_data[0] = cmd;write_data[1] = writeData;new_client->ext_flag = ((new_client->ext_flag) & I2C_MASK_FLAG) | I2C_DIRECTION_FLAG;ret = i2c_master_send(new_client, write_data, 2);if (ret < 0) {new_client->ext_flag = 0;mutex_unlock(&bq25601_i2c_access);return 0;}new_client->ext_flag = 0;mutex_unlock(&bq25601_i2c_access);return 1;
}

3.对于lk里面,就是实现 bq25601_hw_init(),bq25601_charging_enable(bEnable),bq25601_dump_register()这三个函数,基本上和kernel里面的差不多.
4.参考数据手册几个有关充电IC的参数
Termination Current 截止电流,一般设置为200mA以下
Charge Voltage 充电IC的输出电压
Precharge current 预充电电流,一般设置为500mA以下
VAG OVP 最高电压,bq25601可以支持到14v
Absolute VINDPM Threshold 充电IC的最高输出

总结

编写调试驱动代码一定要认真,特别注意宏定义,加上了没,有没有把以前的宏定义注释掉,而且要查看一下有没有在Makefile,Kconfig中添加修改,报错的话要看错误提示,然后去查错误类型,有的报的这个地方的错误但是错误不在这个文件当中.
kernel-3.18/arch/arm64/boot/dts/project_bat_setting.dtsi可以配置电池曲线,充电属性等相关配置.注意还有一个电阻值的配置,如果与硬件不匹配,会导致误差较大.

问题

pmic检测充电器状态不对,改用了通过读取充电IC的寄存器的状态来判断是否在充电.查寻datasheet后可以看到在REG08里面读取.

添加如下检测代码:

    stat = bq25601_get_vbus_stat();if (stat == 0x1 || stat == 0x2)val = KAL_TRUE;elseval = KAL_FALSE;

充电IC的配置

1 device下面的配置
2 kernel 里面的config和dts(i2c地址) PS:尽量保证user版和debug版一块修改.
3 lk里面的config
4 preloader里面的config
END

充电IC驱动调试----移植充电IC bq25601相关推荐

  1. Linux Charger IC 驱动移植总结

    Linux Charger IC 驱动移植总结 文章目录 Linux Charger IC 驱动移植总结 1 设备树的基本知识 设备树的概念 设备树的基本结构 compatible属性 举个栗子 2 ...

  2. 9V2A实现快充原因小米9手机27W极速快充关键技术在于内置独立电容电荷泵,用了高通新的充电IC SMB1390。这颗IC与最新的骁龙855处理配套组合,成为套片,让搭配骁龙855的旗舰手机超级快充

    第一次有人把小米9快充讲的这么简单明了 2019年02月25日     充电头网 分享到: [导读]发布会上,雷军第一次花费超长篇幅介绍了小米9手机在充电技术上的创新,尤其是20W无线快充,开创了20 ...

  3. android 6.0 电池曲线,Android6.0 RK3399 电池系统(一)BQ25700 IC 驱动分析 · Younix’s Studio...

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Platform: RK3399 OS: Android 6.0 Kernel: 4.4 Version: v2017. ...

  4. 单节磷酸铁锂电池充电管理芯片IC驱动方案3.6V充电芯片手电筒_低压应急球泡灯适用

    单节磷酸铁锂电池充电管理芯片IC驱动方案3.6V充电芯片手电筒_低压应急球泡灯适用 2:品牌名称:泛海微 3方案特点: 4.(1)产品特点 特点:   3.6V独立的单节磷酸铁锂电池充电管理    ...

  5. 学习使用USB-TTL驱动PN532来读写IC卡

    学习使用USB-TTL驱动PN532来读写IC卡 PN532简介 PN532模块 使用前准备 硬件接线 软件设置 读取数据 写入数据 写入完成 总结 原文链接:https://www.yourcee. ...

  6. LED灯串控制芯片,8模式灯串IC芯片,跑马闪灯IC芯片,FH8A15G圣诞灯串驱动IC

    FH8A15G是一款用于LED灯串控制芯片,8模式灯串IC芯片,跑马闪灯IC芯片,圣诞灯串驱动IC FH8A15G特点描述                      1/2/3/4线八功能灯串IC芯片 ...

  7. 交流充电桩电路图_交流充电桩原理

    充电桩充电桩由桩体. 电气模块.计量模块等部分组成, 充电桩分为交流充电桩和直流充电 桩. 交流充电桩又称为交流供电装置, 固定安装在电动汽车外. 与交流电网连接,为电动汽车车 载充电机(即 固定安装 ...

  8. 触摸屏gt9xx系列芯片驱动调试

    平台:STM32MP157 触摸屏芯片:gt911 驱动:goodix.c 现在很多平台都使用gt9xx系列的触摸屏,我在imx6dl平台和imx6ull平台都调试过这个芯片. 这次刚好调试157平台 ...

  9. 手机首次充电方法及关于锂电池充电的正确知识

    首次充电方法及关于手机锂电池充电的知识 在手机中,无论是从技术角度评估还是从价格方面的考虑,电池都占有十分重要的地位.时值今日,市场上正在销售的手机中,所使用的电池已经基本完成了从镍电池到锂电池的过渡 ...

  10. 手机首次充电方法及关于锂电池充电的正确知识ZZ

    首次充电方法及关于手机锂电池充电的知识 在手机中,无论是从技术角度评估还是从价格方面的考虑,电池都占有十分重要的地位.时值今日,市场上正在销售的手机中,所使用的电池已经基本完成了从镍电池到锂电池的过渡 ...

最新文章

  1. Spread for Windows Forms高级主题(5)---数据处理
  2. java如何构造ajax回调参数,jQuery实现ajax回调函数带入参数的方法示例
  3. java vector_Java Vector elements()方法与示例
  4. git restore
  5. css3切角文本框_特殊border的样式 -- CSS3实现三种切角效果
  6. android框架揭秘之Java服务学习笔记
  7. 【SENCHA TOUCH】改了tomcat的IP访问!java的session失效问题! [ Web 开发]
  8. win10鼠标主题linux,win10系统安装鼠标指针主题包的操作方法
  9. 今天正式开始做毕业设计——自助装机系统
  10. flexbox的基本概念
  11. 桌面虚拟化中VDI和IDV的五大区别
  12. flyingsaucer转换多个html,如何在将PDF转换为HTML的同时在Flying-Saucer中设置基本URL?...
  13. 该文件包与具有同一名称的现有文件包存在冲突
  14. Windows Sever 2008 本地安全策略之登陆策略
  15. 7 操作系统之DLL文件
  16. Vue项目清理本地缓存并删除node_modules (清除不掉揍我)
  17. 内部总线、系统总线、外部总线区别
  18. [Java经典题目] 随机得到一个[ 1-100]之间的年龄
  19. Android BootLoader及两种刷机模式fastboot和recovery
  20. Veristand制作Custom Device全网最详细教程

热门文章

  1. 联想本装系统stop:0X000007B错误[转]
  2. 编程人员的不二之选 LEGION Y9000X正式发布
  3. c语言里的除法运算定律,加法乘法运算,乘法需要打括号吗?
  4. 如何恢复被删短信_手机短信删除了怎么恢复?超级简单的两种方法
  5. kali系统自带的aircrack-ng破解WIFI
  6. 2021年英国经济发展研究报告
  7. java available_关于InputStream类的available()方法
  8. 客户说发货慢怎么回复_物流走件慢回复话术
  9. 2021年中国人工智能市场发展现状
  10. TKactions V8 for Mac(亮度蒙版PS插件)