- 命運(yùn)以痛吻我季俩,我報(bào)之以歌
- 轉(zhuǎn)載請(qǐng)注明出處 http://www.reibang.com/u/30f6e7af18d0
背景介紹:
我們mt8167項(xiàng)目用到了2顆充電ic窃肠,分別是 HL 7026 和 ETA 6095 ,
HL 7026 :可以用mtk公版BQ 24296 的代碼稠肘,而且是i2c通訊方式,而ETA 6095沒有i2c台谍,只是硬件去控制 I/O镐依;
ETA 6095:通過硬件去控制I/O匹涮,沒有i2c。
上圖的 USB_ID腳 是檢測(cè)插入是 otg 還是 USB 充電槐壳,CC_COUT1 腳是檢測(cè)充電電流的大腥坏汀(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
打開開關(guān)充電才能進(jìn)行電流控制( cc cv階段大小電流充電)
ifeq ($(CONFIG_MTK_SWCHR_SUPPORT),y)
obj-$(CONFIG_MTK_SWCHR_SUPPORT) += switch_charging.o
接下來就是一些功能的現(xiàn)實(shí):
最初的需求是:
不用 BQ 的 OTG 功能枫笛,所以我們要去屏蔽 BQ 的 otg吨灭,我們?cè)?/p>
kernel-4.4\drivers\misc\mediatek\usb20\mt8167\usb20_host.c文件中把 OTG_BOOST_BY_SWITCH_CHARGER 相關(guān)的宏定義全部取反定義(比如 #ifndef 改為 #ifdefine ),_
為什么要取反呢刑巧?如 下面的usb20.h 如果定義CONFIG_MTK_BQ24296_SUPPORT 的話喧兄,那么就會(huì)定義 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 下面進(jìn)入 void mt_usb_set_vbus(struct musb *musb, int is_on) 函數(shù)中看下
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 時(shí) is_on 是 1 */
/* power on VBUS, implement later... */
#if defined OTG_BOOST_BY_SWITCH_CHARGER /*如上解釋這個(gè)宏有定義的話海诲,就要打開才能跑下面的函數(shù)*/
tbl_charger_otg_vbus((work_busy(&musb->id_pin_work.work) << 8) | 1);
/* 進(jìn)入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 時(shí) 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);函數(shù)進(jìn)入tbl_helper_func.c這個(gè)文件看下怎么設(shè)置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
...
}
該函數(shù)里面會(huì)去寫 BQ 的01寄存器去使能otg模式繁莹,再進(jìn)入該函數(shù)把
//bq24296_set_otg_config(0x1);
這個(gè)屏蔽即可。
第二個(gè)需求是:又要用 BQ 的 OTG 功能特幔,繼續(xù)改代碼,我們只需要把dts里面的
drvvbus_gpio
改成BQ otg_en腳對(duì)應(yīng)的I/O闸昨,然后把
bq24296_set_otg_config(0x1);
這個(gè)打開就行了蚯斯。
后面還要把typec的識(shí)別功能(TCS1320a IC 來完成)改成用pmic(mt6392 )來完成,待續(xù)6稀拍嵌!