Browse Source

fixed issue: can not output sound when config external sound card

lixh 3 years ago
parent
commit
8a293fcdcf

+ 6 - 2
linux/arch/arm/boot/dts/ark1668e.dtsi

@@ -521,7 +521,9 @@
 			compatible = "arkmicro,ark1668e-i2s";
 			reg = <0xe4000000 0x1000
 					0xe4900000 0x1000>;
-			//external-adc;
+#ifdef I2S_USE_EXTERNAL_CODEC
+			external-adc;
+#endif
 			interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
 			nco-reg = <0xe4900174>;
 			dmas = <&dmac 0 1 0>, <&dmac 1 0 1>;
@@ -534,7 +536,9 @@
 			compatible = "arkmicro,ark1668e-i2s";
 			reg = <0xe4200000 0x1000
 					0xE4900000 0x1000>;
-			//external-dac;
+#ifdef I2S_USE_EXTERNAL_CODEC
+			external-dac;
+#endif
 			interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
 			nco-reg = <0xe490019c>;
 			dmas = <&dmac 25 1 0>, <&dmac 26 0 1>;

+ 6 - 3
linux/arch/arm/boot/dts/ark1668e_devb.dts

@@ -1,11 +1,14 @@
 // SPDX-License-Identifier: GPL-2.0
 /dts-v1/;
-#include "ark1668e.dtsi"
-#include "ark1668e-pinctrl.dtsi"
 
 //#define I2S_USE_EXTERNAL_CODEC
 //#define ARK1668E_I2S_FULL_DUPLEX_MODE
 
+
+#include "ark1668e.dtsi"
+#include "ark1668e-pinctrl.dtsi"
+
+
 / {
 	i2c-gpio-0 {
 		#address-cells = <1>;
@@ -120,7 +123,7 @@
 			"MIC2", "Mic Jack";
 
 #ifdef I2S_USE_EXTERNAL_CODEC
-		//simple-audio-card,aux-devs = <&amp>;
+		simple-audio-card,aux-devs = <&amp>;
 
 		simple-audio-card,format = "i2s";
 		simple-audio-card,cpu {

+ 76 - 12
linux/sound/soc/arkmicro/BD37033.c

@@ -208,7 +208,7 @@ static unsigned char *get_data_addr(unsigned char regaddr)
 	return addr;
 }
 
-#if 0
+#if 1
 static int register_write(unsigned char regaddr, unsigned char regval)
 {
 	unsigned char *data_addr;
@@ -295,7 +295,6 @@ static int bd37033_select_input_channel(struct bd37033_data *bd, unsigned char v
 	unsigned char input_select = select_data.select_data_input_selector;
 	unsigned char mute_state = select_data.select_data_input_gain >> 7;
 	int ret = -1;
-
 	switch(value)
 	{
 		case BD37033_INPUT_SELECTOR_A_SINGLE:
@@ -313,7 +312,7 @@ static int bd37033_select_input_channel(struct bd37033_data *bd, unsigned char v
 			ret = bd37033_write_byte(client, client->addr, SELECT_ADDR_INPUT_SELECTOR, input_select);
 			if(ret == 0)
 				select_data.select_data_input_selector = input_select;
-			bd37033_set_mute(bd,mute_state);
+			bd37033_set_mute(bd,mute_state);//mute_state
 			break;
 		case BD37033_INPUT_SELECTOR_FULL_DIFF_TYPE_NEGATIVE_INPUT:
 			input_select &= ~(0x1<<7);
@@ -624,7 +623,7 @@ int bd37033_sys_reset(struct bd37033_data *bd)
 }
 
 int bd37033_set_default(struct bd37033_data *bd)
-{//printk("==============[%s]:[ %d]\n", __FUNCTION__, __LINE__);		
+{
 	//input channel select
 	if(mp.input_channel >= 0)
 		bd37033_set_stream(mp.input_channel);
@@ -656,7 +655,7 @@ int bd37033_set_default(struct bd37033_data *bd)
 	if (!of_property_read_u32(bd->client->dev.of_node, "rrout-gain", &bd->dac.vol_flout))
 		mp.rr_gain = bd->dac.vol_flout;
 	//printk("dac.vol_flout = %d dac.vol_flout = %d dac.vol_flout = %d dac.vol_flout = %d\n",bd->dac.vol_flout,bd->dac.vol_flout,bd->dac.vol_flout,bd->dac.vol_flout);
-	printk("mp.fl_gain = %d mp.fr_gain = %d mp.rl_gain = %d mp.rr_gain = %d\n",mp.fl_gain,mp.fr_gain,mp.rl_gain,mp.rr_gain);
+	//printk("mp.fl_gain = %d mp.fr_gain = %d mp.rl_gain = %d mp.rr_gain = %d\n",mp.fl_gain,mp.fr_gain,mp.rl_gain,mp.rr_gain);
 	if(mp.fl_gain >= 0)
 		bd37033_set_fader(SELECT_ADDR_FADER_1CH_FRONT,mp.fl_gain);
 	if(mp.fr_gain >= 0)
@@ -695,7 +694,7 @@ int bd37033_set_default(struct bd37033_data *bd)
 
 
 static void bd37033_init(struct bd37033_data *bd)
-{//printk("==============[%s]:[ %d]\n", __FUNCTION__, __LINE__);
+{
 	struct i2c_client *client = NULL;
 
 	if (bd == NULL)
@@ -832,7 +831,6 @@ static int set_stream (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value
 		return 0;
 
 	input_ch = ucontrol->value.integer.value[0];
-
 	ret = bd37033_set_stream(input_ch);
 
 	return ret;
@@ -1955,7 +1953,7 @@ static int bd37033_startup(struct snd_pcm_substream *substream,struct snd_soc_da
 	struct snd_soc_dai *codec_dai = rtd->codec_dai;
 
 	/* variable MCLK */
-	ret = snd_soc_dai_set_sysclk(codec_dai, 0, 0, SND_SOC_CLOCK_IN);
+//	ret = snd_soc_dai_set_sysclk(codec_dai, 0, 0, SND_SOC_CLOCK_IN);
 
 	return ret;
 }
@@ -1965,7 +1963,7 @@ static int bd37033_hw_params(
 {
 	void __iomem 	*Sys_base;
 	unsigned int val;
-	
+#if 0
 	Sys_base = ioremap(0xe4900000, 0x1ff);
 
 	//cancel pop noise
@@ -2036,6 +2034,7 @@ static int bd37033_hw_params(
 		writel(val, Sys_base + 0x174);
 	}
 	iounmap(Sys_base);
+#endif
 	return 0;
 }
 
@@ -2149,6 +2148,62 @@ static struct snd_soc_component_driver soc_component_dev_bd37033= {
 //	iounmap(Sys_base);
 //}
 
+static ssize_t bd37033_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
+{
+	int val=0, flag=0;
+	u8 i=0, reg, num, value_w, value_r;
+
+	struct bd37033_data *bd = dev_get_drvdata(dev);
+	val = simple_strtol(buf, NULL, 16);
+	flag = (val >> 16) & 0xFF;
+
+	if (flag) {
+		reg = (val >> 8) & 0xFF;
+		value_w = val & 0xFF;
+		printk("\nWrite: start REG:0x%02x,val:0x%02x,count:0x%02x\n", reg, value_w, flag);
+		while(flag--) {
+			register_write(reg, value_w);
+			printk("Write 0x%02x to REG:0x%02x\n", value_w, reg);
+			reg++;
+		}
+	} else {
+		reg = (val >> 8) & 0xFF;
+		num = val & 0xff;
+		printk("\nRead: start REG:0x%02x,count:0x%02x\n", reg, num);
+		do {
+			value_r = 0;
+			//es7210_read(reg, &value_r, bd->client);
+			value_r = register_read(reg);
+			printk("REG[0x%02x]: 0x%02x;  ", reg, value_r);
+			reg++;
+			i++;
+			if ((i==num) || (i%4==0))	printk("\n");
+		} while (i<num);
+	}
+
+	return count;
+}
+
+static ssize_t bd37033_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+	printk("echo flag|reg|val > bd37033\n");
+	printk("eg read star addres=0x06,count 0x10:echo 0610 >bd37033\n");
+	printk("eg write star addres=0x90,value=0x3c,count=4:echo 4903c >bd37033\n");
+	//printk("eg write value:0xfe to address:0x06 :echo 106fe > bd37033\n");
+	return 0;
+}
+static DEVICE_ATTR(bd37033, 0644, bd37033_show, bd37033_store);
+
+static struct attribute *bd37033_debug_attrs[] = {
+	&dev_attr_bd37033.attr,
+	NULL,
+};
+
+static struct attribute_group bd37033_debug_attr_group = {
+	.name   = "bd37033_debug",
+	.attrs  = bd37033_debug_attrs,
+};
+
 static int bd37033_drv_probe(struct i2c_client *client, const struct i2c_device_id *id)
 { //printk("==============[%s]:[ %d]\n", __FUNCTION__, __LINE__);
 	struct bd37033_data *bd;
@@ -2172,15 +2227,24 @@ static int bd37033_drv_probe(struct i2c_client *client, const struct i2c_device_
 	
 //	ret =  snd_soc_register_codec(&client->dev,
 //				&soc_codec_dev_bd37033, bd37033_dai,
+//				ARRAY_SIZE(bd37033_dai));
+//	ret =  devm_snd_soc_register_component(&client->dev,
+//				&soc_component_dev_bd37033, bd37033_dai,
 //				ARRAY_SIZE(bd37033_dai));
 	ret =  devm_snd_soc_register_component(&client->dev,
-				&soc_component_dev_bd37033, bd37033_dai,
-				ARRAY_SIZE(bd37033_dai));
+				&soc_component_dev_bd37033, NULL,
+				0);
 	if (ret < 0) {
 		dev_err(&client->dev, "Failed to register codec: %d\n", ret);
 	}
-	return ret;
+
+	ret = sysfs_create_group(&client->dev.kobj, &bd37033_debug_attr_group);
+	if (ret) {
+		pr_err("failed to create attr group\n");
+	}
+
 	//printk(KERN_INFO "==============>%s end\n", __FUNCTION__);
+	return ret;
 }
 
 static int bd37033_drv_remove(struct i2c_client *client)

+ 4 - 2
linux/sound/soc/arkmicro/ark1668e_i2s.c

@@ -59,8 +59,10 @@ static int ark1668e_i2s_startup(
 	//unsigned int i2s_master = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS;
 	//snd_soc_dai_set_fmt(dai, i2s_master);
 	/*default:internal codec:ark1668e-i2s-slave*/
-	unsigned int i2s_slave = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM;
-	snd_soc_dai_set_fmt(dai, i2s_slave);
+	if(!i2s->extdac){
+		unsigned int i2s_slave = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM;
+		snd_soc_dai_set_fmt(dai, i2s_slave);
+	}
 
 	/* reset */
 	writel(SACR0_RST, i2s->base + I2S_SACR0);

+ 0 - 3
linux/sound/soc/codecs/es8316.c

@@ -741,7 +741,6 @@ static int es8316_pcm_startup(struct snd_pcm_substream *substream,
 			    ES8316_CLKMGR_MCLK_DIV_NML |
 			    ES8316_CLKMGR_DAC_MCLK_EN);
 	es8316->pwr_count++;
-	printk("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
 	if (playback) {//printk("startup:>>>>>>>>>>>>>>>>>>SNDRV_PCM_STREAM_PLAYBACK\n");
 		snd_soc_component_write(component, ES8316_SYS_LP1_REG0E, 0x3F);
 		snd_soc_component_write(component, ES8316_SYS_LP2_REG0F, 0x1F);
@@ -779,7 +778,6 @@ static void es8316_pcm_shutdown(struct snd_pcm_substream *substream,
 	struct snd_soc_component *component = dai->component;
 	struct es8316_priv *es8316 = snd_soc_component_get_drvdata(component);
 	bool playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
-	printk("#############################\n");
 	if (playback) {//printk("shutdown:>>>>>>>>>>>>>>>>>>SNDRV_PCM_STREAM_PLAYBACK\n");
 		snd_soc_component_write(component, ES8316_CPHP_OUTEN_REG17, 0x66);//default:0x00	new:0x66
 		snd_soc_component_write(component, ES8316_DAC_PDN_REG2F, 0x11);
@@ -896,7 +894,6 @@ static int es8316_set_bias_level(struct snd_soc_component *component,
 		break;
 
 	case SND_SOC_BIAS_OFF:
-		printk("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
 		snd_soc_component_write(component, ES8316_CPHP_OUTEN_REG17, 0x00);//0x00		add:20220401
 		snd_soc_component_write(component, ES8316_DAC_PDN_REG2F, 0x11);
 		snd_soc_component_write(component, ES8316_CPHP_LDOCTL_REG1B, 0x03);