目前項目在開發過程中原來音頻鏈接到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;
}