Vart hittar jag aktiveringen för PLL hos SII9022A? HDMI

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
DanielM
Inlägg: 2415
Blev medlem: 5 september 2019, 14:19:58

Vart hittar jag aktiveringen för PLL hos SII9022A? HDMI

Inlägg av DanielM »

Introduktion
Jag har en HDMI PHY vid namn SII9022A. Med denna PHY så kan jag konvertera LCD bilder direkt till HDMI och visa allt på en skärm. Jag kan även skicka ut ljud via I2S. Bildproblemet är löst så det är inga problem. Men ljudproblemet är inte löst. Här skulle jag behöva lite hjälp.

Syfte
Syftet är att i Linux kunna konfigurera ett Device Tree som konfigurerar ljudfunktionen för denna PHY.

Mål
Att lära sig Device Tree.

Problem
Det finns ett datablad här som vi kan använda oss utav.
I databladet så står det följande signaler kan användas för att skicka ut ljud.
Skärmbild 2024-10-24 195744.png
Här är en mera detaljerad förklaring. Det som är intressant här är att den kräver MCKL, alltså Master Clock, förutsatt att inte PLL används. Se rödmarkerat.
Skärmbild 2024-10-24 200702.png
I min layout finns inte MCLK och detta tackar jag SII9022A för. Det verkar bara vara dom "enkla" PHY som kräver MCKL.
Skärmbild 2024-10-24 200554.png
Diskussionsunderlag
Som vi ser ovan så behövs inte MCKL om PLL är redan används. Då vill jag yttra två frågor:
  1. Om jag låter MCKL vara flytande. Används då PLL per automatik, som PLL vore en "weak" klocksignal?
  2. Behöver PLL konfigureras via register?

Kod: Markera allt

root@stm32-os:/proc/asound# dmesg | grep audio
[    0.059222] platform 4000b000.audio-controller: Fixed dependency cycle(s) with /soc/etzpc@5c007000/i2c@5c002000/hdmi-transmitter@39
[    3.445159] platform 4000b000.audio-controller: Fixed dependency cycle(s) with /soc/etzpc@5c007000/i2c@5c002000/hdmi-transmitter@39
[    3.467797] i2c 1-0039: Fixed dependency cycle(s) with /soc/etzpc@5c007000/audio-controller@4000b000
[    3.605216] st,stm32-i2s 4000b000.audio-controller: No cache defaults, reading back from HW
[    3.658636] asoc-audio-graph-card sound: ASoC: no source widget found for MCLK
[    3.664591] asoc-audio-graph-card sound: ASoC: Failed to add route MCLK -> direct -> Playback
[    3.673099] asoc-audio-graph-card sound: ASoC: no source widget found for MCLK
[    3.680193] asoc-audio-graph-card sound: ASoC: Failed to add route MCLK -> direct -> Capture
[    3.688863] asoc-audio-graph-card sound: ASoC: no source widget found for Mic Bias
[    3.698380] asoc-audio-graph-card sound: ASoC: Failed to add route Mic Bias -> direct -> MICL
[    3.706004] asoc-audio-graph-card sound: error -ENODEV: parse error
root@stm32-os:/proc/asound# dmesg | grep hdmi
[    0.056347] platform 5a001000.display-controller: Fixed dependency cycle(s) with /soc/etzpc@5c007000/i2c@5c002000/hdmi-transmitter@39
[    0.059222] platform 4000b000.audio-controller: Fixed dependency cycle(s) with /soc/etzpc@5c007000/i2c@5c002000/hdmi-transmitter@39
[    0.066316] platform connector: Fixed dependency cycle(s) with /soc/etzpc@5c007000/i2c@5c002000/hdmi-transmitter@39
[    3.445159] platform 4000b000.audio-controller: Fixed dependency cycle(s) with /soc/etzpc@5c007000/i2c@5c002000/hdmi-transmitter@39
[    3.455821] platform 5a001000.display-controller: Fixed dependency cycle(s) with /soc/etzpc@5c007000/i2c@5c002000/hdmi-transmitter@39
root@stm32-os:/proc/asound#
root@stm32-os:~# cat /sys/kernel/debug/dynamic_debug/control | grep sii
drivers/gpu/drm/bridge/sii902x.c:816 [sii902x]sii902x_audio_codec_init =p "%s: No "sil,i2s-data-lanes", use default <0>\n"
drivers/gpu/drm/bridge/sii902x.c:805 [sii902x]sii902x_audio_codec_init =p "%s: No "#sound-dai-cells", no audio\n"
drivers/gpu/drm/bridge/sii902x.c:695 [sii902x]sii902x_audio_hw_params =p "%s: hdmi audio enabled\n"
drivers/gpu/drm/bridge/sii902x.c:632 [sii902x]sii902x_audio_hw_params =p "Inaccurate reference clock (%ld/%d != %u)\n"
drivers/gpu/drm/bridge/sii902x.c:577 [sii902x]sii902x_audio_hw_params =p "%s: Unsupported i2s format %u\n"
drivers/gpu/drm/bridge/sii902x.c:560 [sii902x]sii902x_audio_hw_params =p "%s: I2S clock provider mode not supported\n"
drivers/gpu/drm/bridge/sii902x.c:498 [sii902x]sii902x_mute =p "%s: %s\n"
root@stm32-os:~#
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Klas-Kenny
Inlägg: 11803
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Vart hittar jag aktiveringen för PLL hos SII9022A? HDMI

Inlägg av Klas-Kenny »

PLL behöver aktiveras genom registerkonfiguration.

Googla fram SiI-PR-0020 SiI9020 HDMI PanelLink Transmitter Programmer’s Reference så har du specifikation på de ingående registerna.
Officiellt behöver du NDA för att få ut dokumentet ifrån Lattice, men det finns från obskyra källor på Google.
DanielM
Inlägg: 2415
Blev medlem: 5 september 2019, 14:19:58

Re: Vart hittar jag aktiveringen för PLL hos SII9022A? HDMI

Inlägg av DanielM »

Tror du att detta är redan inskriven i linuxkärnan?
https://github.com/torvalds/linux/blob/ ... /sii902x.c

Jag hittar inget register om PLL. Men C-koden känns ändå seriöst skrivet av Atmel.
Det kanske är implementerat?

Kod: Markera allt

#define SII902X_TPI_VIDEO_DATA			0x0

#define SII902X_TPI_PIXEL_REPETITION		0x8
#define SII902X_TPI_AVI_PIXEL_REP_BUS_24BIT     BIT(5)
#define SII902X_TPI_AVI_PIXEL_REP_RISING_EDGE   BIT(4)
#define SII902X_TPI_AVI_PIXEL_REP_4X		3
#define SII902X_TPI_AVI_PIXEL_REP_2X		1
#define SII902X_TPI_AVI_PIXEL_REP_NONE		0
#define SII902X_TPI_CLK_RATIO_HALF		(0 << 6)
#define SII902X_TPI_CLK_RATIO_1X		(1 << 6)
#define SII902X_TPI_CLK_RATIO_2X		(2 << 6)
#define SII902X_TPI_CLK_RATIO_4X		(3 << 6)
screen.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Klas-Kenny
Inlägg: 11803
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Vart hittar jag aktiveringen för PLL hos SII9022A? HDMI

Inlägg av Klas-Kenny »

Tycker mig inte se något i koden för drivrutinen, som tyder på att det finns implementerat.

Det är hopplöst med såna här kretsar där det inte går smidigt att få fram riktig dokumentation utan NDA osv.
DanielM
Inlägg: 2415
Blev medlem: 5 september 2019, 14:19:58

Re: Vart hittar jag aktiveringen för PLL hos SII9022A? HDMI

Inlägg av DanielM »

Vi kan börja med att titta vad debuggen säger.

Kod: Markera allt

root@stm32-os:~# cat /sys/kernel/debug/dynamic_debug/control | grep sii
drivers/gpu/drm/bridge/sii902x.c:816 [sii902x]sii902x_audio_codec_init =p "%s: No "sil,i2s-data-lanes", use default <0>\n"
drivers/gpu/drm/bridge/sii902x.c:805 [sii902x]sii902x_audio_codec_init =p "%s: No "#sound-dai-cells", no audio\n"
drivers/gpu/drm/bridge/sii902x.c:695 [sii902x]sii902x_audio_hw_params =p "%s: hdmi audio enabled\n"
drivers/gpu/drm/bridge/sii902x.c:632 [sii902x]sii902x_audio_hw_params =p "Inaccurate reference clock (%ld/%d != %u)\n"
drivers/gpu/drm/bridge/sii902x.c:577 [sii902x]sii902x_audio_hw_params =p "%s: Unsupported I2S format %u\n"
drivers/gpu/drm/bridge/sii902x.c:560 [sii902x]sii902x_audio_hw_params =p "%s: I2S clock provider mode not supported\n"
drivers/gpu/drm/bridge/sii902x.c:498 [sii902x]sii902x_mute =p  "%s: %s:\n"
Vi börjar kolla på rad 816.

Kod: Markera allt

if (num_lanes == -EINVAL) {
	dev_dbg(dev, "%s: No \"sil,i2s-data-lanes\", use default <0>\n", __func__); <---------------------------------------
	num_lanes = 1;
Okej, den använder standard sil,i2s-data-lanes. Kanske dags att jag använder den också i mitt Device Tree. Vad säger Kernel.org?

Kod: Markera allt

  sil,i2s-data-lanes:
    $ref: /schemas/types.yaml#/definitions/uint32-array
    minItems: 1
    maxItems: 4
    uniqueItems: true
    items:
      enum: [ 0, 1, 2, 3 ]
    description:
      Each integer indicates which I2S pin is connected to which audio FIFO.
      The first integer selects the I2S audio pin for the first audio FIFO#0
      (HDMI channels 1&2), the second for FIFO#1 (HDMI channels 3&4), and so
      on. There are 4 FIFOs and 4 I2S pins (SD0 - SD3). Any I2S pin can be
      connected to any FIFO, but there can be no gaps. E.g. an I2S pin must be
      mapped to FIFO#0 and FIFO#1 before mapping a channel to FIFO#2. The
      default value is <0>, describing SD0 pin being routed to HDMI audio
      FIFO#0.
Här är mitt Device Tree

Kod: Markera allt

	hdmi-transmitter@39{
		compatible = "sil,sii9022";
		reg = <0x39>;
		iovcc-supply = <&v3v3_hdmi>;
		cvcc12-supply = <&v1v2_hdmi>;
		reset-gpios = <&gpioe 8 GPIO_ACTIVE_LOW>;
		interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
		interrupt-parent = <&gpiog>;
		#sound-dai-cells = <0>;
		status = "okay";

		ports{
			#address-cells = <1>;
			#size-cells = <0>;

			port@0{
				reg = <0>;

				sii9022_in:endpoint{
					remote-endpoint = <&ltdc_ep0_out>;
				};
			};

			port@1{
				reg = <1>;

				sii9022_out:endpoint{
					remote-endpoint = <&hdmi_connector_in>;
				};
			};

			port@3{
				reg = <3>;

				sii9022_tx_endpoint:endpoint{
					remote-endpoint = <&i2s2_endpoint>;
				};
			};
		};
	};
Jag använder I2S2 som har:
  • I2S2_CK
  • I2S2_WS
  • I2S2_SD0
Alltså måste jag ha följande

Kod: Markera allt

sil,i2s-data-lanes = <0>;
OK! Vi tar nästa debugmeddelande: 805

Kod: Markera allt

if (!of_property_read_bool(dev->of_node, "#sound-dai-cells")) {
	dev_dbg(dev, "%s: No \"#sound-dai-cells\", no audio\n", __func__); <-------------------------------
	return 0;
}
Denna retunerar 0 och är före första debugmeddelandet. Men det stämmer. Jag har inga DAI celler konfigurerade. Vilket förklarar i mitt Device Tree så står det

Kod: Markera allt

  '#sound-dai-cells':
    enum: [ 0, 1 ]
    description: |
      <0> if only I2S or S/PDIF pin is wired,
Så jag låter detta vara som den är <0>.
Vi tittar på nästa meddelande hos rad 695.

Kod: Markera allt


	/* Decode Level 0 Packets */
	ret = regmap_write(sii902x->regmap, SII902X_IND_SET_PAGE, 0x02);
	if (ret)
		goto out;

	ret = regmap_write(sii902x->regmap, SII902X_IND_OFFSET, 0x24);
	if (ret)
		goto out;

	ret = regmap_write(sii902x->regmap, SII902X_IND_VALUE, 0x02);
	if (ret)
		goto out;

	dev_dbg(dev, "%s: hdmi audio enabled\n", __func__);   <----------------------------------------
out:
	mutex_unlock(&sii902x->mutex);

	if (ret) {
		clk_disable_unprepare(sii902x->audio.mclk);
		dev_err(dev, "%s: hdmi audio enable failed: %d\n", __func__,
			ret);
	}

	return ret;
Detta betyder att HDMI audio är aktiverad. Låter bra. Vi tittar på nästa rad 632.

Kod: Markera allt


	ret = clk_prepare_enable(sii902x->audio.mclk);
	if (ret) {
		dev_err(dev, "Enabling mclk failed: %d\n", ret);
		return ret;
	}

	if (sii902x->audio.mclk) {
		mclk_rate = clk_get_rate(sii902x->audio.mclk);
		ret = sii902x_select_mclk_div(&i2s_config_reg, params->sample_rate, mclk_rate);
		if (mclk_rate != ret * params->sample_rate)
			dev_dbg(dev, "Inaccurate reference clock (%ld/%d != %u)\n", mclk_rate, ret, params->sample_rate); <-----------------------------------------
	}
Det verkar som att sii902x->audio.mclk retunerar en return som är 0, vilket betyder att inget har skett, vilket är bra. Detta betyder att trots att jag har MCLK ej dragen, så vekar den känna utav någon MCLK ändå.
Däremot så är referensklockan felaktig inställd. Kan man inte få se vilka värden det är??? Vi tar felmeddelandet på rad 577 och 560 istället.

Kod: Markera allt

static int sii902x_audio_hw_params(struct device *dev, void *data,
				   struct hdmi_codec_daifmt *daifmt,
				   struct hdmi_codec_params *params)
{
	struct sii902x *sii902x = dev_get_drvdata(dev);
	u8 i2s_config_reg = SII902X_TPI_I2S_SD_DIRECTION_MSB_FIRST;
	u8 config_byte2_reg = (SII902X_TPI_AUDIO_INTERFACE_I2S |
			       SII902X_TPI_AUDIO_MUTE_ENABLE |
			       SII902X_TPI_AUDIO_CODING_PCM);
	u8 config_byte3_reg = 0;
	u8 infoframe_buf[HDMI_INFOFRAME_SIZE(AUDIO)];
	unsigned long mclk_rate;
	int i, ret;

	if (daifmt->bit_clk_provider || daifmt->frame_clk_provider) {
		dev_dbg(dev, "%s: I2S clock provider mode not supported\n", __func__); <--------------------------
		return -EINVAL;
	}

	switch (daifmt->fmt) {
	case HDMI_I2S:
		i2s_config_reg |= SII902X_TPI_I2S_FIRST_BIT_SHIFT_YES |
			SII902X_TPI_I2S_SD_JUSTIFY_LEFT;
		break;
	case HDMI_RIGHT_J:
		i2s_config_reg |= SII902X_TPI_I2S_SD_JUSTIFY_RIGHT;
		break;
	case HDMI_LEFT_J:
		i2s_config_reg |= SII902X_TPI_I2S_SD_JUSTIFY_LEFT;
		break;
	default:
		dev_dbg(dev, "%s: Unsupported i2s format %u\n", __func__, daifmt->fmt); <--------------------------------
		return -EINVAL;
	}

Okej, den stödjer inte I2S formatet. Jaha? Varför inte då? Jag har "Master Half-Duplex Playpack" på min I2S2. Så detta är problemet helt enkelt!
I2S clock provider mode är ej stött....så vad har jag då satt som klocka?

Vi har svaret på felmeddelandet :tumupp: Då är det bara nästa steg att lista ut vad man ska skriva för att få rätt klocka :)
Det jag måste göra är att lägga till dessa i mitt Device Tree, men då är frågan....det verkar som att om jag låter MCLK vara flytande, så aktiveras PLL. Jag hittar nämligen inget register för PLL.

Kod: Markera allt

clocks = <&mclk>;
clock-names = "mclk";
DanielM
Inlägg: 2415
Blev medlem: 5 september 2019, 14:19:58

Re: Vart hittar jag aktiveringen för PLL hos SII9022A? HDMI

Inlägg av DanielM »

Nu fungerar det!
Kan skicka ljud nu från min STM32MP1:a och direkt ut på HDMI. 8)

Svaret är att PLL behövs ej sättas register på. Låter man MCLK vara flytande så körs den interna klocka per automatik, eller så är det så att PLL är en standard inställning. Hur som helst så fungerar sii9022A med Simple Audio Card i Linux.
Skriv svar