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;
}

 

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