- 命运以痛吻我,我报之以歌
背景介绍:
我们mt8167项目用到了2颗充电ic,分别是 HL 7026 和 ETA 6095 ,
HL 7026 :可以用mtk公版BQ 24296 的代码,而且是i2c通讯方式,而ETA 6095没有i2c,只是硬件去控制 I/O;
ETA 6095:通过硬件去控制I/O,没有i2c。
figure TCS1320a上图的 USB_ID脚 是检测插入是 otg 还是 USB 充电,CC_COUT1 脚是检测充电电流的大小(500,2000,3000 ma)。
首先在 defconfig 中去配置 :
CONFIG_MTK_SWCHR_SUPPORT,
CONFIG_MTK_SWCHR_SUPPORT,
CONFIG_MTK_BQ24296_SUPPORT
然后修改 \kernel-4.4\drivers\power\mediatek 下的Makefile 打开switch_charging.c
打开开关充电才能进行电流控制( cc cv阶段大小电流充电)
ifeq ($(CONFIG_MTK_SWCHR_SUPPORT),y)
obj-$(CONFIG_MTK_SWCHR_SUPPORT) += switch_charging.o
接下来就是一些功能的现实:
最初的需求是:
不用 BQ 的 OTG 功能,所以我们要去屏蔽 BQ 的 otg,我们在
kernel-4.4\drivers\misc\mediatek\usb20\mt8167\usb20_host.c文件中把 OTG_BOOST_BY_SWITCH_CHARGER 相关的宏定义全部取反定义(比如 #ifndef 改为 #ifdefine ),_
为什么要取反呢?如 下面的usb20.h 如果定义CONFIG_MTK_BQ24296_SUPPORT 的话,那么就会定义 OTG_BOOST_BY_SWITCH_CHARGER 的,接着往下看
#if (defined(CONFIG_MTK_FAN5405_SUPPORT) \
|| defined(CONFIG_MTK_BQ24158_SUPPORT) \
|| defined(CONFIG_MTK_NCP1851_SUPPORT) \
|| defined(CONFIG_MTK_BQ24196_SUPPORT) \
|| defined(CONFIG_MTK_NCP1854_SUPPORT) \
|| defined(CONFIG_MTK_BQ24297_SUPPORT) \
|| defined(CONFIG_MTK_BQ24296_SUPPORT)) \
&& !defined(CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT)
#define OTG_BOOST_BY_SWITCH_CHARGER 1
#endif
- 1 下面进入 void mt_usb_set_vbus(struct musb *musb, int is_on) 函数中看下
void mt_usb_set_vbus(struct musb *musb, int is_on)
{
DBG(0, "mt65xx_usb20_vbus++,is_on=%d\r\n", is_on);
#ifndef FPGA_PLATFORM
if (is_on) {
/*插入 USB 时 is_on 是 1 */
/* power on VBUS, implement later... */
#if defined OTG_BOOST_BY_SWITCH_CHARGER /*如上解释这个宏有定义的话,就要打开才能跑下面的函数*/
tbl_charger_otg_vbus((work_busy(&musb->id_pin_work.work) << 8) | 1);
/* 进入tbl_helper_func.c去写成otg模式【 bq24296_set_otg_config(0x1); 】*/
pinctrl_select_state(pinctrl, pinctrl_drvvbus_high);
/* 拉高 vbus 的 i/o脚*/
#else
#ifdef CONFIG_OF
#if defined(CONFIG_MTK_LEGACY)
mt_set_gpio_mode(drvvbus_pin, drvvbus_pin_mode);
mt_set_gpio_out(drvvbus_pin, GPIO_OUT_ONE);
#else
DBG(0, "****%s:%d Drive VBUS ON!!!!!\n", __func__, __LINE__);
pinctrl_select_state(pinctrl, pinctrl_drvvbus_high);
#endif
#else
mt_set_gpio_mode(GPIO_OTG_DRVVBUS_PIN, GPIO_OTG_DRVVBUS_PIN_M_GPIO);
mt_set_gpio_out(GPIO_OTG_DRVVBUS_PIN, GPIO_OUT_ONE);
#endif
#endif
} else {
/*拔出 USB 时 is_on 是 0 */
/* power off VBUS, implement later... */
#if defined OTG_BOOST_BY_SWITCH_CHARGER
tbl_charger_otg_vbus((work_busy(&musb->id_pin_work.work) << 8) | 0);
pinctrl_select_state(pinctrl, pinctrl_drvvbus_low);//zy add
printk("[otg2]-OTG_BOOST_BY_SWITCH_CHARGER");
#else
#ifdef CONFIG_OF
#if defined(CONFIG_MTK_LEGACY)
mt_set_gpio_mode(drvvbus_pin, drvvbus_pin_mode);
mt_set_gpio_out(drvvbus_pin, GPIO_OUT_ZERO);
#else
DBG(0, "****%s:%d Drive VBUS OFF!!!!!\n", __func__, __LINE__);
pinctrl_select_state(pinctrl, pinctrl_drvvbus_low);
#endif
#else
mt_set_gpio_mode(GPIO_OTG_DRVVBUS_PIN, GPIO_OTG_DRVVBUS_PIN_M_GPIO);
mt_set_gpio_out(GPIO_OTG_DRVVBUS_PIN, GPIO_OUT_ZERO);
#endif
#endif
}
#endif
}
- 2 跟着tbl_charger_otg_vbus((work_busy(&musb->id_pin_work.work) << 8) | 1);函数进入tbl_helper_func.c这个文件看下怎么设置BQ的寄存器
void tbl_charger_otg_vbus(int mode)
{
#ifdef CONFIG_MTK_BQ24296_SUPPORT
bq24296_set_chg_config(0x0); /*disable charge*/
//bq24296_set_otg_config(0x1); /*disable OTG func*/
bq24296_set_boostv(0x7); /*boost voltage 4.998V*/
bq24296_set_boost_lim(0x1); /*1.5A on VBUS*/
bq24296_set_en_hiz(0x0);
#endif
...
}
该函数里面会去写 BQ 的01寄存器去使能otg模式,再进入该函数把
//bq24296_set_otg_config(0x1);
这个屏蔽即可。
第二个需求是:又要用 BQ 的 OTG 功能,继续改代码,我们只需要把dts里面的
drvvbus_gpio
改成BQ otg_en脚对应的I/O,然后把
bq24296_set_otg_config(0x1);
这个打开就行了。
后面还要把typec的识别功能(TCS1320a IC 来完成)改成用pmic(mt6392 )来完成,待续!!
网友评论