目前项目在开发过程中原来音频链接到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;
}