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 )来完成,待续!!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容

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