otg-功能实现

  • 命运以痛吻我,我报之以歌

背景介绍:
我们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 )来完成,待续!!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,014评论 19 139
  • 历时三周左右的时间,完成了一架四旋翼无人机F450的组装,今天成功试飞定高、定点、自动返航、自动降落等飞行...
    85后程序员阅读 24,631评论 11 48
  • 感恩凉爽的天气,白天工作很舒服,晚上睡觉也很舒服,睡眠质量超好,一觉睡到天亮。 感恩自己超棒的身体,小有感...
    喜悦的霞光阅读 203评论 0 0
  • 我打碎了窗子 住着牵牛花的家 我用泪水浇灌 灼烧它娇嫩的叶 以为它懂得我的爱 却只是我以为而已 我打碎了自己 撕裂...
    三闻鱼r阅读 274评论 4 2
  • 每天都要画画摄影打卡。时间简直不够。
    Lyiata阅读 120评论 0 0