otg-功能实现

作者: SayidZhong | 来源:发表于2017-11-25 10:05 被阅读54次
    • 命运以痛吻我,我报之以歌

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

    相关文章

      网友评论

        本文标题: otg-功能实现

        本文链接:https://www.haomeiwen.com/subject/dhnqbxtx.html