MIPI CSI2 не может получить данные правильно! ошибка при захвате видео с камеры ov9724 и микроконтроллера imx6dl

Я пытаюсь связать камеру ov9724 от omnivision с микроконтроллером imx6dl. Камера имеет только интерфейс MIPI с одной полосой, и я использую только одну полосу для связи (одну полосу дифференциальных данных и полосу дифференциальных часов).

iMx6dl pin          OV9724 pin
CSI0_MCLK(P4)  -    XCLK      -> Source clock: **24 MHz**
CSI_CLK0M(F4)  -    MCN    (MIPI_CLK_N)
CSI_CLK0P(F3)  -    MCP    (MIPI_CLK_P)
CSI_D0M(E4)    -    MDN0 (MIPI_D0_N)
CSI_D0P(E3)    -    MDP0 (MIPI_D0_P)

Я портировал драйвер камеры для ov5640 в "git: //git.freescale.com/imx/linux-2.6-imx.git". Поскольку камера имеет только выходной сигнал RAW-10, я отредактировал код на основе справочного кода, который нашел в Интернете.

Это соответствующая конфигурация dts, которую я редактировал.

ov9724_mipi: ov9724_mipi@10
{ 
compatible = "ovti,ov9724_mipi";
reg = <0x10>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ipu1_3>;
clocks = <&clks IMX6QDL_CLK_CKO>; //&clks 201 ??
clock-names = "csi_mclk";
DOVDD-supply = <&sw4_reg>; /* 1.8v */
AVDD-supply = <&vgen5_reg>; /* 2.8v, on rev C board is VGEN3,
on rev B board is VGEN5 */
DVDD-supply = <&vgen1_reg>; /* 1.5v*/
pwn-gpios = <&gpio6 2 GPIO_ACTIVE_LOW>; /* active low: CSI0_DAT16 -   PWRDWN*/ //REF MANUAL PG : 1523
stby-gpios = <&gpio6 0 GPIO_ACTIVE_LOW>; /* active low: CSI0_DAT14 -      STANDBY - XSHUTDOWN*/
csi_id = <0>;
mclk = <24000000>;
mclk_source = <0>;
};

&mipi_csi {
status = "okay";
ipu_id = <0>;
csi_id = <0>;
v_channel = <0>; //v_channel 0: CSI0_IPU1; v_channel1: CSI1_IPU1; 2:     CSI0_IPU2; 3: CSI1_IPU2
lanes = <1>;
};

v4l2_cap_0 {
compatible = "fsl,imx6q-v4l2-capture";
ipu_id = <0>;
csi_id = <0>;
mclk_source = <0>;
status = "okay";
};


v4l2_out {
compatible = "fsl,mxc_v4l2_output";
status = "okay";
};

Я прилагаю журнал ошибок ниже. Для меня это похоже на проблему с часами, так как в отношении ошибок я обнаружил, что эти два бита установлены в соответствии с таблицей данных в регистре ошибок 1.

Бит 4: ошибка соответствия начала кадра с концом кадра для виртуального канала 0

Бит 28: заголовок ECC содержит 2 ошибки.Неисправимая.

Я настроил IMX для использования IPU - 1, CSI - 0, Виртуальный канал - 0 и Количество каналов - 1. Пожалуйста, обратитесь к журналу ниже.

Я думаю, что это может быть связано с настройкой часов, но я не уверен, что делать дальше. Я видел настройки регистра dphy, упомянутые в документе "Шаги отладки для датчика MIPI клиента", который, я думаю, автор создал на основе информации, доступной в документе AN5305(стр.14), который я прилагаю здесь.

Я настроил часы следующим образом.

На стороне датчика камеры в соответствии с таблицей, Pixel clk = (ext_clk * pll_multiplier) / (sys_clk_div_pll * pre_pll_clk_div_pll * pix_clk_div_pll) = (24000000 * 0x3E) / (0x0A * 0x01 * 0x02. = 75) = 75).

Теперь для настройки часов mipi dphy на стороне imx я использовал следующий расчет. (Для 1280 x 720 при 30 кадрах в секунду) (Этот расчет основан на уравнениях в документе AN5305, приложенном здесь, раздел 3.4, стр. 13).

Тактовая частота пикселя = 1280 * 720 * 30 кадр / с * 1 такт / пиксель * 1,35 интервал гашения = 74,6 МГц

Общая скорость передачи данных MIPI = 74,6 * 10 бит = 746 Мбит / с. Для интерфейса с 1 полосой частота MIPI = 746 / (Количество полос) / 2 = 746 / 1 / 2 = 373 МГц.

Настройка MIPI_CSI2_PHY_TST_CTRL1 = 373 МГц * 2 (режим DDR) = 746 МГц

Основываясь на этом значении, я отредактировал настройки mipi dphy следующим образом в mxc_mipi_csi2.c, ссылаясь на AN5305 стр. 14.

mipi_csi2_write(info, 0x00000001, MIPI_CSI2_PHY_TST_CTRL0);
mipi_csi2_write(info, 0x00000000, MIPI_CSI2_PHY_TST_CTRL1);
mipi_csi2_write(info, 0x00000000, MIPI_CSI2_PHY_TST_CTRL0);
mipi_csi2_write(info, 0x00000002, MIPI_CSI2_PHY_TST_CTRL0);
mipi_csi2_write(info, 0x00010044, MIPI_CSI2_PHY_TST_CTRL1);
mipi_csi2_write(info, 0x00000000, MIPI_CSI2_PHY_TST_CTRL0);
mipi_csi2_write(info, 0x00000012, MIPI_CSI2_PHY_TST_CTRL1); //750-800 MHz
mipi_csi2_write(info, 0x00000002, MIPI_CSI2_PHY_TST_CTRL0);
mipi_csi2_write(info, 0x00000000, MIPI_CSI2_PHY_TST_CTRL0);

Я все еще не уверен, что настройки часов верны. Мне также неясно, как настроены часы для ov5640, упомянутые в AN5305, стр. 21. (Я прикрепил их здесь как изображение - настройка MIPI CLK в AN5305.png). Почему они устанавливают PLL5 на 596 МГц?

Кроме того, конфиги ipu и mipi, как показано ниже.

mipi_csi: mipi_csi@021dc000 { /* MIPI-CSI */
compatible = "fsl,imx6q-mipi-csi2";
reg = <0x021dc000 0x4000>;
interrupts = <0 100 0x04>, <0 101 0x04>;
clocks = <&clks IMX6QDL_CLK_HSI_TX>,
<&clks IMX6QDL_CLK_EMI_SEL>,
<&clks IMX6QDL_CLK_VIDEO_27M>;
/* Note: clks 138 is hsi_tx, however, the dphy_c
* hsi_tx and pll_refclk use the same clk gate.
* In current clk driver, open/close clk gate do
* use hsi_tx for a temporary debug purpose.
*/
clock-names = "dphy_clk", "pixel_clk", "cfg_clk";
status = "disabled";
};



ipu1: ipu@02400000 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "fsl,imx6q-ipu";
reg = <0x02400000 0x400000>;
interrupts = <0 6 IRQ_TYPE_LEVEL_HIGH>,
<0 5 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clks IMX6QDL_CLK_IPU1>,
<&clks IMX6QDL_CLK_IPU1_DI0>, <&clks IMX6QDL_CLK_IPU1_DI1>,
<&clks IMX6QDL_CLK_IPU1_DI0_SEL>, <&clks IMX6QDL_CLK_IPU1_DI1_SEL>,
<&clks IMX6QDL_CLK_LDB_DI0>, <&clks IMX6QDL_CLK_LDB_DI1>;
clock-names = "bus",
"di0", "di1",
"di0_sel", "di1_sel",
"ldb_di0", "ldb_di1";
resets = <&src 2>;
bypass_reset = <0>;
};

Я напечатал "dphy_clk", "pixel_clk" и "cfg_clk", как показано ниже.

sh-4.3 # dmesg | grep clk

[ 0.259781] imx-ipuv3 2400000.ipu: ipu_clk = 270000000
MIPI CSI2 cfg_clk: **27000000**
MIPI CSI2 dphy_clk: **198000000**
MIPI CSI2 pixel_clk: **396000000**
[ 0.381171] imx-ipuv3 2400000.ipu: pixel clk = 30919000
[ 0.381240] imx-ipuv3 2400000.ipu: try ipu internal clk
[ 0.381253] imx-ipuv3 2400000.ipu: rounded pix clk:30000000
[ 0.381258] imx-ipuv3 2400000.ipu: try ipu ext di clk
[ 0.381477] #### clk_pllv3_av_set_rate : rate 989407992, parent_rate 24000000, val 0x0, mfn 0x37035 mfd 0xf4240
[ 0.381509] imx-ipuv3 2400000.ipu: di clk:30919000
[ 0.381525] imx-ipuv3 2400000.ipu: round pixel clk:30919000
[ 0.428329] imx-ipuv3 2400000.ipu: pixel clk = 30919000
[ 0.428387] imx-ipuv3 2400000.ipu: try ipu internal clk
[ 0.428402] imx-ipuv3 2400000.ipu: rounded pix clk:30000000
[ 0.428408] imx-ipuv3 2400000.ipu: try ipu ext di clk
[ 0.428429] imx-ipuv3 2400000.ipu: di clk:30919000
[ 0.428442] imx-ipuv3 2400000.ipu: round pixel clk:**30919000**
OV9724 Clock csi_mclk: 24000000
[ 2.879715] galcore: clk_get vg clock failed, disable vg!

Я видел, что пиксель clk был округлен до 30919000. Я не понял эту часть. Здесь dphy_clk составляет 198 МГц. Должен ли я изменить какие-либо дополнительные настройки pll или что-то еще?

ЖУРНАЛ DEBUG ПОКАЗЫВАЕТ ОШИБКУ MIPI

# ioctl_g_chip_ident #sensor chip is ov9724_mipi_camera
sensor supported frame size:
In mxc_v4l2_s_param
640x480
320x240
720x480
720x576
# ioctl_g_parm #
1280x720
1920x1080
2592x1944
176x144
1024x768
Current capabilities are 1001
sensor frame format: BG10
Current capturemode is 0 change to 0
sensor frame format: BG10
Current framerate is 30 change to 30
sensor frame format: BG10
sensor frame format:BG10
# ioctl_s_parm #
sensor frame format: BG10
sensor frame format: BG10
sensor frame format: BG10
sensor frame format: BG10
sensor frame format: BG10
# INIT MODE mode: 0 frame rate: 1 mode_original: 0 #
MIPI CSI2 Enable Status: 1
MIPI CSI2 Enable Status: 1
MIPI CSI2 Befor setting Lanes: info->lanes: 1
MIPI CSI2 Set Lanes: 0
MIPI CSI2 Set Datatype : 43 0x2b   --> RAW-10 datatype
Pixel Format is V4L2_PIX_FMT_SBGGR10

************ Changing to direct mode! Frame rate is : 1 Mode number is 0

Writing 0x24001b30 to register CSI_SENS_CONF Read Val: 0x4001b30
Writing 0x2cf04ff to register CSI_SENS_FRM_SIZE Read Val: 0x2cf04ff
Writing 0x2cf04ff to register CSI_ACT_FRM_SIZE Read Val: 0x2cf04ff
Writing 0xffffff2b to register IPU_CSI0_DI Read Val: 0xffffff2b
Writing 0x661 to register IPU_CONF Read Val: 0x661
Writing 0x2 to register CSI2IPU_SW_RST Read Val: 0x2

# OV9724 CHANGE MODE DIRECT # Frame Rate: 1 Mode : 4

@@@@@@@@@@@@@@@@@@@ STREAM OFF @@@@@@@@@@@@@@@@@@@@@@@
############## OV9724 REGISTER VALUES READBACK############## 
IPU_CONF = 0x661
IPU_CSI0_SENS_CONF_REG = 0x4001b30
IPU_CSI0_SENS_FRM_SIZE_REG = 0x2cf04ff
IPU_CSI0_ACT_FRM_SIZE_REG = 0x2cf04ff
IPU_CSI0_OUT_FRM_CTRL_REG = 0x0
IPU_CSI0_DI_REG = 0xffffff2b
IOMUXC_GPR1_REG = 0x48441005
CSI2IPU_SW_RST_REG = 0x2
@@@@@@@@@@@@@@@@@@@ STREAM ON @@@@@@@@@@@@@@@@@@@@@@@
Setting Virtual Channel to 0 Channel Reg Value: 2b
GEtting CSI Ready!!
############## OV9724 REGISTER VALUES ############## 
IPU_CONF = 0x661
IPU_CSI0_SENS_CONF_REG = 0x4001b30
IPU_CSI0_SENS_FRM_SIZE_REG = 0x2cf04ff
IPU_CSI0_ACT_FRM_SIZE_REG = 0x2cf04ff
IPU_CSI0_OUT_FRM_CTRL_REG = 0x0
IPU_CSI0_DI_REG = 0xffffff2b
IOMUXC_GPR1_REG = 0x48441005
CSI2IPU_SW_RST_REG = 0x2

MIPI CSI2 PHY_STATE : 0x300
MIPI_CSI2_VERSION : 0x3130302a
MIPI_CSI2_N_LANES : 0x0
MIPI_CSI2_PHY_SHUTDOWNZ : 0x1
MIPI_CSI2_DPHY_RSTZ : 0x1
MIPI_CSI2_DATA_IDS_1 : 0x0
MIPI_CSI2_DATA_IDS_2 : 0x0
MIPI_CSI2_PHY_TST_CTRL0 : 0x0
MIPI_CSI2_PHY_TST_CTRL1 : 0x2a2a

MIPI CSI2 ERROR1 : 0x10000010
MIPI CSI2 ERROR2 : 0x0
MIPI CSI2 ERROR1 : 0x10000000
MIPI CSI2 ERROR2 : 0x0
MIPI CSI2 ERROR1 : 0x10000000
MIPI CSI2 ERROR2 : 0x0
MIPI CSI2 ERROR1 : 0x10000010
MIPI CSI2 ERROR2 : 0x0
MIPI CSI2 ERROR1 : 0x10000010
MIPI CSI2 ERROR2 : 0x0
MIPI CSI2 ERROR1 : 0x10000010
MIPI CSI2 ERROR2 : 0x0
MIPI CSI2 ERROR1 : 0x10000000
MIPI CSI2 ERROR2 : 0x0
MIPI CSI2 ERROR1 : 0x10000010
MIPI CSI2 ERROR2 : 0x0
MIPI CSI2 ERROR1 : 0x10000010
MIPI CSI2 ERROR2 : 0x0
MIPI CSI2 ERROR1 : 0x10000010
MIPI CSI2 ERROR2 : 0x0
MIPI CSI2 ERROR1 : 0x10000000
MIPI CSI2 ERROR2 : 0x0
mipi csi2 can not receive data correctly!

Я не могу исследовать clk и линии передачи данных, поскольку у меня есть DSO только на 200 МГц. Формы волны, которые я наблюдал, я прикрепил ниже. (Желтый зонд - DATA_P, Зеленый зонд - DATA_N, Синий - CLK_P, Розовый - CLK_N). Я наблюдаю данные на линиях данных при включении потоковой передачи, но изначально ничего не видел на линии синхронизации. Затем, когда я уменьшил деление напряжения на линиях синхронизации до 100 мВ (напряжение данных составляет около 1 В), я увидел рисунок формы сигнала на часах, который изначально выглядел как шум. Похоже, часы присутствуют, когда данные присутствуют. Но когда я проверяю обе строки данных, линии часов выглядят как шум, как показано на рис. Scope_15.bmp. Не знаю, почему часы так себя ведут - ТС ПРОБЛЕМА? Но на стороне imx, часы ddr обнаружены согласно регистру MPHY MIPI CSI2 PHY_STATE.

Я знаю, что это длинный пост, но я хотел включить все, что я сделал до даты. Я новичок в Linux, и в основном это мой первый проект. Я кратко изложу мои вопросы ниже.

  1. Что может быть причиной ошибки MIPI CSI, замеченной в журнале?
  2. Часы на осциллограммах выглядят нормально? Достаточно ли для работы интерфейса mipi?
  3. Если моя конфигурация часов dphy неверна, как настроить часы imx и камеру? Что еще более важно, как часы датчика камеры связаны с dphyclock?
  4. В документе AN5605, на стр. 21, каково значение тактовой частоты 596 МГц и какую тактовую частоту мне следует использовать?

Пожалуйста, поделись своими мыслями.

Ссылка на документ AN5305 - http://www.nxp.com/assets/documents/data/en/application-notes/AN5305.pdf

scope_2.bmp

0 ответов

Другие вопросы по тегам