TDA4VM-LINUX-CSI-9296-9295-Kamera-Architektur-Treiberanalyse und detaillierte Verwendung

Vorwort

TI unterstützt den Linux V4L2-Zugriff auf CSI2 erst nach der Version LINUX-SDK-8.01. Versuchen Sie daher, vor der Verwendung RTOS-SDK für den Zugriff auf die CSI2-Schnittstellenkamera zu verwenden, und beginnen Sie dann mit der Entwicklung von Linux V4L2, sobald es normal funktioniert.
Informationen zur Installation und Verwendung des LINUX-SDK finden Sie in einem anderen Dokument „Elegant Play with TDA4VM“.
In TDA4VM startet eine CSI-Schnittstelle standardmäßig 16 virtuelle Kanäle.

Hardware-Architektur

System Hardware-Architektur
Linux Das CSI2RX-Subsystem besteht aus 3 IPs: Cadence DPHY, Cadence CSI2RX Bridge, TI CSI2RX DMA Wrapper
RTOS Das CSI2RX-Subsystem besteht aus 2 IPs: Cadence DPHY, CSI2RX_drive

Bild.png
Das CSI2RX-Subsystem unterstützt die folgenden Funktionen:

  • Konform mit dem MIPI CSI v1.3-Standard
  • Unterstützt bis zu 16 virtuelle Kanäle pro Eingang (teilweise MIPI CSI v2.0-Funktionalität).
  • Datenraten bis zu 2,5 Gbit/s (Leitungsrate) pro Spur.
  • Unterstützt 1, 2, 3 oder 4 Datenspuren, die mit DPHY_RX verbunden sind.
  • Zu den programmierbaren Formaten gehören YUV420, YUV422, RGB, Raw usw.

Treiber

Dieser Treiber basiert auf der Video 4 Linux 2 (V4L2) API. Es wurde gemäß dem V4L2-Standard für Erfassungsgeräte implementiert. Der Treiber ist lediglich für die Programmierung der für die Erfassung verwendeten SoC-Komponenten verantwortlich, wie z. B. DPHY, CSI-Bridge, DMA. Für externe Geräte wie Kamerasensoren ist ein separates V4L2-Untergerät erforderlich.

link_freq-Berechnung

V4L2_CID_LINK_FREQ

Datenbusfrequenz. Die Datenbusfrequenz definiert zusammen mit dem Medienbus-Pixelcode und dem Bustyp (Taktzyklen pro Abtastung) die Pixelrate im Pixelarray (V4L2_CID_PIXEL_RATE). Andere Pixelraten können definiert werden, wenn das Gerät kein Bildsensor ist (V4L2_CID_PIXEL_RATE). . Die Bildrate kann aus dem Pixeltakt, der Bildbreite und -höhe sowie der horizontalen und vertikalen Austastung berechnet werden. Obwohl die Pixelratensteuerung anderswo als in der Unterentwicklung, die das Pixelarray enthält, definiert werden kann, kann die Bildrate nicht aus diesen Informationen ermittelt werden. Dies liegt daran, dass nur davon ausgegangen werden kann, dass die vertikalen und horizontalen Austastinformationen für das Pixelarray genau sind. Andere Austastinformationen sind im Pixelarray nicht zulässig. Wählen Sie die Bildrate, indem Sie die gewünschte horizontale und vertikale Austastung auswählen. Die Einheit für diese Steuerung ist Hz.

V4L2_CID_PIXEL_RATE

Pixelrate im Quellpad für die kindliche Entwicklung. Dieses Steuerelement ist schreibgeschützt und seine Einheiten sind Pixel/Sekunde. Ex-Mipi-Bus: pixel_rate = link_freq * 2 * nr_of_lanes / bits_per_sample Bittiefe
mipi_link_freq = w h * fps * bits_per_sample / nr_of_lanes / 2
pixel_clk_rate = w
h * fps

CSI2RX-Register-Debugging

Verwenden Sie das Tool devmem2, um die CSI2RX entsprechenden Register anzuzeigen und festzustellen, ob die Hardware über einen Dateneingang verfügt.

Normaler DPHY-Status

0x04590B00(DPHY_RX_VBUS2APB_PCS_TX_DIG_TBIT0) = 0x000001ef
0x04504040(CSI_RX_IF_VBUS2APB_DPHY_LANE_CONTROL) = 0x0001F01F
0x04504048(CSI_RX_IF_VBUS2APB_DPHY_STATUS) = 0x00333306/0x00222206
0x04504060(CSI_RX_IF_VBUS2APB_INTEGRATION_DEBUG) = 0x10000000 // WAIT_FOR_PACKET
0x04504100(CSI_RX_IF_VBUS2APB_STREAM0_CTRL) = 0x00000001
0x04504104(CSI_RX_IF_VBUS2APB_STREAM0_STATUS) = 0x80000111
0x04580C10 ( DPHY_RX_VBUS2APB_ISO_PHY_ISO_CL_CNTRL_L ) = 0x00000029 //normal

Konfiguration registrieren

max9296

//使能
max9296_write(priv, 0x0313, 0x02);
//关闭
max9296_write(priv, 0x0313, 0x00);
    max9296_write(priv, 0x0010, 0x31);
    msleep(100);
    max9296_write(priv, 0x0313, 0x00);
    msleep(1);
    max9296_write(priv, 0x048B, 0x07);
    msleep(1);
    max9296_write(priv, 0x048D, 0x1E);
    msleep(1);
    max9296_write(priv, 0x048E, 0x1E);
    msleep(1);
    max9296_write(priv, 0x0490, 0x00);
    msleep(1);
    max9296_write(priv, 0x0491, 0x01);
    msleep(1);
    max9296_write(priv, 0x0492, 0x01);
    msleep(1);
    // max9296_write(priv, 0x04AD, 0x2A);
    max9296_write(priv, 0x04AD, 0x15);//206
    msleep(1);
    max9296_write(priv, 0x0320, 0x2C);
    msleep(1);
    max9296_write(priv, 0x0051, 0x02);
    msleep(1);
    max9296_write(priv, 0x0052, 0x01);
    msleep(1);

max9295

    max9295_write(priv, 0x0010, 0x21);
    msleep(100);
    max9295_write(priv, 0x02be, 0x10);
    msleep(500);
    max9295_write(priv, 0x0318, 0x5E);
    msleep(1);
    max9295_write(priv, 0x02D3, 0x00);
    msleep(500);
    max9295_write(priv, 0x02D3, 0x10);
    msleep(100);
    max9295_write(priv, 0x02D6, 0x00);
    msleep(500);
    max9295_write(priv, 0x02D6, 0x10);
    msleep(100);

Treiber-Quellcode

...
static int max9295_probe(struct i2c_client *client)
{
    
    
	struct max9295_priv *priv;
	struct device *dev = &client->dev;
	int ret;

	priv = devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;
	
	priv->client = client;
	i2c_set_clientdata(client, priv);
	
	priv->regmap = devm_regmap_init_i2c(client, &max9295_i2c_regmap);
	if (IS_ERR(priv->regmap))
		return PTR_ERR(priv->regmap);
	
	if (max9295_read(priv, 0x0000) != MAX9295_ID)
		return -EFAULT;
	
	max9295_mipi_configure(priv);
	
	// max9295_v4l2_register(priv);
	dev_info(dev, "Successfully probed 9295 (rev/mask)\n");
	return 0;

}
...
...
static int max9296_probe(struct i2c_client *client)
{
    
    
	struct max9296_priv *priv;
	int ret;
	

	priv = devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;
	
	mutex_init(&priv->mutex);
	
	priv->client = client;
	i2c_set_clientdata(client, priv);
	
	priv->regmap = devm_regmap_init_i2c(client, &max9296_i2c_regmap);
	if (IS_ERR(priv->regmap))
		return PTR_ERR(priv->regmap);
	
	/*parse_dt*/
	ret = max9296_parse_dt(priv);
	if (ret)
		goto err_powerdown;
	
	ret = max9296_init(&client->dev);
	if (ret < 0)
		goto err_cleanup_dt;
	dev_err(&client->dev, "Successfully probed 9296 ok\n");
	return 0;

err_cleanup_dt:
	max9296_cleanup_dt(priv);
err_powerdown:
	gpiod_set_value_cansleep(priv->gpiod_pwdn, 0);
	return ret;
}
...

Erstellen Sie einen Gerätebaumknoten

Bestimmen Sie den Hauptgerätebaum

Verwenden Sie das dmesg-Tool, um das Startprotokoll anzuzeigen und den Hauptgerätebaum zu finden, der für den Start verwendet wird.
Jede im Kernel-Ringpuffer protokollierte Nachricht hat eine zusätzliche Ebene. Der Level gibt die Wichtigkeit der Informationen an. Die enthaltenen Level sind:

  • emerg: Das System kann nicht verwendet werden;
  • Alarm: Es müssen sofort Maßnahmen ergriffen werden;
  • Krit: ernste Situation;
  • err: Fehler;
  • warnen: warnen;
  • Hinweis: eine normale, aber wichtige Situation;
  • Info: Nachricht;
  • debug: Debugging-Informationen;

Nachrichten, die einer bestimmten Ebene entsprechen, können extrahiert werden, indem der Parameter -l (Ebene) verwendet und der Name der Ebene als Befehlszeilenargument übergeben wird. Um Nachrichten auf „Informationsebene“ anzuzeigen, verwenden Sie den folgenden Befehl:

$ dmesg -l info  //列出的所有消息都是"info"消息。 它们不包含错误或警告,仅包含有用的通知。

Bestätigen Sie den Gerätebaum aus dem Startprotokoll als k3-j721e-common-proc-board.dts.

Ändern Sie den Hauptgerätebaum

&main_i2c6 {
    
    
	pinctrl-names = "default";
	pinctrl-0 = <&main_i2c6_pins_default>;
	clock-frequency = <400000>;

	exp5: gpio@20 {
    
    
		compatible = "ti,tca6408";
		reg = <0x20>;
		gpio-controller;
		#gpio-cells = <2>;
	};
	
	des@48 {
    
    
		compatible = "maxim,max9296";
		reg       = <0x48>;
		ports {
    
    
			#address-cells = <1>;
			#size-cells = <0>;
	
			/* CSI-2 */
			port@4 {
    
    
				reg = <4>;
				max9296_0_csi_out: endpoint {
    
    
					clock-lanes = <0>;
					data-lanes = <1 2 3 4>;
					remote-endpoint = <&csi2_phy0>;
				};
			};
		};
	};
	
	ser@40 {
    
    
		compatible = "maxim,max9295";
		reg = <0x40>;
	
	};

};

Lasttreiber

lsmod max9295.ko
lsmod max9296.ko
$ ls /dev  //查看一个CSI接口,video节点是否正常创建16

Bildanzeige

gst-launch-1.0 v4l2src device="/dev/video2" ! video/x-raw ,width=1920, height=1080, framerate=30/1 ! waylandsink
sleep 1
gst-launch-1.0 v4l2src device="/dev/video2" ! video/x-raw, width=1920, height=1080, format=UYVY ! autovideosink


Guess you like

Origin blog.csdn.net/yiyu20180729/article/details/130321743