MTK平台特殊功能管脚不用虚空导致系统启动卡顿的问题

目前项目在开发过程中原来音频链接到tda7729的I2C0没有使用,硬件将其管脚悬空。之前是有使用第一版硬件有链接,I2C0管脚在硬件上有上拉,到第二版之后因为音频直接到I2S到功放,并没有走PMIC到tda7729到喇叭。直接导致的结果就是在开机拉下倒车线进入倒车状态,出现先显示倒车信号,释放倒车线之后,大概要等很长时间,系统快进入主界面的时候才显示一下静态logo,再显示动态logo,分析两个版本硬件,发现唯一的区别在这里。

修改方法:

将I2C0的管脚在lk、ARM2、kernel阶段配置成GPIO模式,方法如下:

lk:

vendor/mediatek/proprietary/bootable/bootloader/lk/target/8227LGO_demo/dct/dct/codegen.dws

修改成:

ARM2:

vendor/autochips/proprietary/arm2/src/mt_gpio.c

vendor/autochips/proprietary/arm2/src/mt_gpio.c
32 mt_set_gpio_dir_chip(u32 pin, u32 dir)
{
    u32 pos;
    u32 bit;
    struct mt_gpio_obj *obj = gpio_obj;

    if (!obj)
        return -ERACCESS;
#ifdef MTK_PMIC_MT6397
    if (pin >= GPIO_EXTEND_START)
        return -ERINVAL;
#else
    if (pin >= MAX_GPIO_PIN)
        return -ERINVAL;
#endif
    if (dir >= GPIO_DIR_MAX)
        return -ERINVAL;
    
    if ((dir == GPIO_DIR_OUT) &&
                //((pin >= GPIO75 && pin <= GPIO76)||(pin >= GPIO57 && pin <= GPIO58)------>修改成:
                (/*(pin >= GPIO75 && pin <= GPIO76)||*/(pin >= GPIO57 && pin <= GPIO58) //注释掉管脚限制
                ||(pin >= GPIO138 && pin <= GPIO141))){
            return -ERINVAL;
    }

    pos = pin / MAX_GPIO_REG_BITS;
    bit = pin % MAX_GPIO_REG_BITS;
    
    if (dir == GPIO_DIR_IN)
        GPIO_SET_BITS((1L << bit), &obj->reg->dir[pos].rst);
    else
        GPIO_SET_BITS((1L << bit), &obj->reg->dir[pos].set);
    return RSUCCESS; 
}

kernel-3.18:

kernel-3.18/arch/arm/boot/dts/8227LGO_demo.dts

&i2c0 {
	pinctrl-names = "default";
	pinctrl-0 = <&i2c0_pins_a>;
	status = "okay";

	kd_camera_hw1@36 {
		compatible = "mediatek,camera_main";
		reg = <0x36>;
	};

	tda7729@44 {
		compatible = "autochips,tda7729";
		reg = <0x44>;
	};
};
修改成:
&i2c0 {
	pinctrl-names = "default";
	pinctrl-0 = <&i2c0_pins_a>;
	status = "disabled"; /*修改这里,不使能够I2C0*/

	kd_camera_hw1@36 {
		compatible = "mediatek,camera_main";
		reg = <0x36>;
	};

	tda7729@44 {
		compatible = "autochips,tda7729";
		reg = <0x44>;
	};
};

最后去掉tda7729的内核驱动:

kernel-3.18/sound/soc/codecs/Makefile

.................

snd-soc-wm9705-objs := wm9705.o
snd-soc-wm9712-objs := wm9712.o
snd-soc-wm9713-objs := wm9713.o
snd-soc-wm-hubs-objs := wm_hubs.o
###snd-soc-tda7729-objs := tda7729.o ###注释掉这行

obj-$(CONFIG_SND_SOC_WM9712)	+= snd-soc-wm9712.o
obj-$(CONFIG_SND_SOC_WM9713)	+= snd-soc-wm9713.o
obj-$(CONFIG_SND_SOC_WM_ADSP)	+= snd-soc-wm-adsp.o
obj-$(CONFIG_SND_SOC_WM_HUBS)	+= snd-soc-wm-hubs.o
#obj-$(CONFIG_SND_SOC) += snd-soc-tda7729.o #####注释掉这行

kernel-3.18/sound/soc/mediatek/ac8227l/mt_soc_codec_63xx.c

#ifdef CONFIG_ATC_AOSP_ENHANCEMENT
	int tda7729_mode_controls_add(struct snd_soc_codec *codec);
	int tda7729_mute_control(bool enable);
#endif
修改成:
#ifndef CONFIG_ATC_AOSP_ENHANCEMENT
	int tda7729_mode_controls_add(struct snd_soc_codec *codec);
	int tda7729_mute_control(bool enable);
#endif
......................
static int Ext_Speaker_Amp_Set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{
	PRINTK_AUDDRV("%s() gain = %ld\n", __func__, ucontrol->value.integer.value[0]);
	if (ucontrol->value.integer.value[0]) {
		Ext_Speaker_Amp_Change(true);
#ifdef  CONFIG_ATC_AOSP_ENHANCEMENT
		msleep(10);
		tda7729_mute_control(false);
#endif
		mCodec_data->mAudio_Ana_DevicePower[AUDIO_ANALOG_DEVICE_OUT_EXTSPKAMP] =
		    ucontrol->value.integer.value[0];
	} else {
		mCodec_data->mAudio_Ana_DevicePower[AUDIO_ANALOG_DEVICE_OUT_EXTSPKAMP] =
		    ucontrol->value.integer.value[0];
#ifdef  CONFIG_ATC_AOSP_ENHANCEMENT
		tda7729_mute_control(true);
		msleep(10);
#endif
		Ext_Speaker_Amp_Change(false);
	}
	return 0;
}
修改成:
static int Ext_Speaker_Amp_Set(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{
	PRINTK_AUDDRV("%s() gain = %ld\n", __func__, ucontrol->value.integer.value[0]);
	if (ucontrol->value.integer.value[0]) {
		Ext_Speaker_Amp_Change(true);
		msleep(10);
#ifndef  CONFIG_ATC_AOSP_ENHANCEMENT //去掉这个代码 将之前的休眠移到外面
		tda7729_mute_control(false);
#endif
		mCodec_data->mAudio_Ana_DevicePower[AUDIO_ANALOG_DEVICE_OUT_EXTSPKAMP] =
		    ucontrol->value.integer.value[0];
	} else {
		mCodec_data->mAudio_Ana_DevicePower[AUDIO_ANALOG_DEVICE_OUT_EXTSPKAMP] =
		    ucontrol->value.integer.value[0];
#ifndef  CONFIG_ATC_AOSP_ENHANCEMENT //去掉这个代码
		tda7729_mute_control(true);
#endif
		msleep(10); //将休眠时间放到后面
		Ext_Speaker_Amp_Change(false);
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章