BeagleBoard-xmにbc10のカメラモジュールを接続し動かしました。
BeagleBoard-xm に bc10向けrowboatカーネルをポーティングしました。
bc10向けrowboatカーネルのソースコード入手方法はこちらを参考にしてください。
・bc10 と BeagleBoard-xm では映像出力信号の配線が異なるので、 映像信号の設定を変更します。
@@ -695,6 +695,42 @@ #ifdef CONFIG_OMAP_MUX static struct omap_board_mux board_mux[] __initdata = { + { .reg_offset = OMAP3_CONTROL_PADCONF_DSS_DATA18_OFFSET, + .value = 0x0003, + }, + { .reg_offset = OMAP3_CONTROL_PADCONF_DSS_DATA19_OFFSET, + .value = 0x0003, + }, + { .reg_offset = OMAP3_CONTROL_PADCONF_DSS_DATA20_OFFSET, + .value = 0x0003, + }, + { .reg_offset = OMAP3_CONTROL_PADCONF_DSS_DATA21_OFFSET, + .value = 0x0003, + }, + { .reg_offset = OMAP3_CONTROL_PADCONF_DSS_DATA22_OFFSET, + .value = 0x0003, + }, + { .reg_offset = OMAP3_CONTROL_PADCONF_DSS_DATA23_OFFSET, + .value = 0x0003, + }, + { .reg_offset = OMAP3_CONTROL_PADCONF_SYS_BOOT0_OFFSET, + .value = 0x0103, + }, + { .reg_offset = OMAP3_CONTROL_PADCONF_SYS_BOOT1_OFFSET, + .value = 0x0103, + }, + { .reg_offset = OMAP3_CONTROL_PADCONF_SYS_BOOT3_OFFSET, + .value = 0x0103, + }, + { .reg_offset = OMAP3_CONTROL_PADCONF_SYS_BOOT4_OFFSET, + .value = 0x0103, + }, + { .reg_offset = OMAP3_CONTROL_PADCONF_SYS_BOOT5_OFFSET, + .value = 0x0103, + }, + { .reg_offset = OMAP3_CONTROL_PADCONF_SYS_BOOT6_OFFSET, + .value = 0x0003, + }, { .reg_offset = OMAP_MUX_TERMINATOR }, }; #else
・詳細
----------------------------------------------------------------------------------- | 映像出力先信号 | 映像入力元信号名 (BC10) | 映像入力元信号名 (BeagleBoard) | ----------------------------------------------------------------------------------- | DVI_DATA0 (R0) | DSS_D0 | DSS_D18 | | DVI_DATA1 (R1) | DSS_D1 | DSS_D19 | | DVI_DATA2 (R2) | DSS_D2 | DSS_D20 | | DVI_DATA3 (R3) | DSS_D3 | DSS_D21 | | DVI_DATA4 (R4) | DSS_D4 | DSS_D22 | | DVI_DATA5 (R5) | DSS_D5 | DSS_D23 | | DVI_DATA6 (R6) | DSS_D6 | DSS_D6 | | DVI_DATA7 (R7) | DSS_D7 | DSS_D7 | | DVI_DATA8 (G0) | DSS_D8 | DSS_D8 | | DVI_DATA9 (G1) | DSS_D9 | DSS_D9 | | DVI_DATA10 (G2) | DSS_D10 | DSS_D10 | | DVI_DATA11 (G3) | DSS_D11 | DSS_D11 | | DVI_DATA12 (G4) | DSS_D12 | DSS_D12 | | DVI_DATA13 (G5) | DSS_D13 | DSS_D13 | | DVI_DATA14 (G6) | DSS_D14 | DSS_D14 | | DVI_DATA15 (G7) | DSS_D15 | DSS_D15 | | DVI_DATA16 (B0) | DSS_D16 | DSS_D16 | | DVI_DATA17 (B1) | DSS_D17 | DSS_D17 | | DVI_DATA18 (B2) | DSS_D18 | SYS_BOOT0 | | DVI_DATA19 (B3) | DSS_D19 | SYS_BOOT1 | | DVI_DATA20 (B4) | DSS_D20 | SYS_BOOT3 | | DVI_DATA21 (B5) | DSS_D21 | SYS_BOOT4 | | DVI_DATA22 (B6) | DSS_D22 | SYS_BOOT5 | | DVI_DATA23 (B7) | DSS_D23 | SYS_BOOT6 | -----------------------------------------------------------------------------------
R0〜R5, B18〜B23に対応する入力信号がbc10とBeagleBoardで異なっています。
DM37xの Pad Configuration レジスタのMUXフィールドを変更することで、
マルチプレクサの設定が変わり、映像出力信号の入力元が切り替わります。
・カメラからのデータ読み込みタイミングとデータの順序を変更します。
@@ -868,6 +868,8 @@ ispctrl_val &= ~ISPCTRL_SYNC_DETECT_VSRISE; ispctrl_val |= config->hsvs_syncdetect; + ispctrl_val &= ~(0x4); // ブリッジの設定 ( カメラから送信されるデータ UYVY の順番をブリッジで入れ替えないように変更 ) + ispctrl_val |= 0x00000010; // データ取得タイミング ( カメラから送信されるデータを読み込むタイミングをネガティブエッジに変更 ) isp_reg_writel(dev, ispctrl_val, OMAP3_ISP_IOMEM_MAIN, ISP_CTRL);
・カメラから受信する色情報の設定を変更します。
@@ -681,7 +682,7 @@ syncif.fldpol = 0; syncif.fldstat = 0; syncif.hdpol = 0; - syncif.ipmod = YUV16; + syncif.ipmod = YUV8; // 入力色情報の設定 ( YUVはそれぞれ8bitずつカメラから送信されるので YUV16 を YUV8に変更 ) syncif.vdpol = 1; syncif.bt_r656_en = 0; ispccdc_config_imgattr(isp_ccdc, 0);
・カーネル変更前 と カーネル変更後 の動作の違い
------------------------------------------------------------------------------------------------- | 設定項目 | 動作 (変更前) | 動作 (変更前) | ================================================================================================= | データ取得タイミング | YUVデータをポジティブエッジで取得 | YUVデータをネガティブエッジで取得 | ------------------------------------------------------------------------------------------------- | ブリッジ | U ⇔ Y, V ⇔ Y を入れ替え | YUVを入れ替えない | ------------------------------------------------------------------------------------------------- | 入力色情報 | CCDC内部での U ⇔ Y, V ⇔ Y | CCDC内部での U ⇔ Y, V ⇔ Y | | | 入れ替えが動作せず | 入れ替えが動作 | ------------------------------------------------------------------------------------------------- -------------------------------------------- | DM37x / OMAP3 | | | | ----------------------------------- | | | ISP | | ----------------- | | ---------- --------- | | --------- | | | | | | | | | | | | | カメラ(cli6010) |=========>| ブリッジ | =====> | CCDC | =========>| Memory | | | | | | | | | | | | | ----------------- | | ---------- --------- | | --------- | ----------------------------------- | -------------------------------------------- -------------------------------------------------------------------------------------------------------------------------- | | カメラ出力 | ブリッジ入力 | ブリッジ出力(CCDC入力) | CCDC出力(メモリ格納データ) | ========================================================================================================================== | bc10 (変更前カーネル) | UYVY | UYVY | YUYV | YUYV | | bc10 (変更後カーネル) | UYVY | UYVY | YUYV | YUYV(有ノイズ小) | | BeagleBoard (変更前カーネル) | UYVY | YUYV | UYVY | UYVY(有ノイズ大) | | BeagleBoard (変更後カーネル) | UYVY | UYVY | UYVY | YUYV | -------------------------------------------------------------------------------------------------------------------------- | データの流れ --------> | --------------------------------------------------------------------------------------------------------------------------
bc10はブリッジ入力の際、ポジティブエッジで画素データを取得しなければなりません。
一方 BeagleBoard はネガティブエッジで画素データを取得しなければなりません。
異なるエッジでデータを取得した場合、bc10はノイズが混じます。
BeagleBoardはデータの順序が入れ替わりノイズも発生します。
カメラは画素データがポジティブエッジに同期する設定となっています。
・mdelayで画像の取得を待ちます。
@@ -1561,6 +1562,7 @@ { struct isp_ccdc_device *isp_ccdc = _isp_ccdc; + mdelay(15); return ispccdc_busy(isp_ccdc) | (isp_reg_readl(isp_ccdc->dev, OMAP3_ISP_IOMEM_SBL, ISPSBL_CCDC_WR_0) &
mdelayを行わない場合、CCDCがメモリへの画像の格納を終了しないうちに、バッファの切り替えを行ってしまいます。
これは、CCDC_PCR レジスタの ENABLE フィールドがキャプチャリング中にアサートされておらず、
CCDCの状態( busyかどうか )が取得できないことが原因です。
1.Pad Configuration レジスタへの書き込みを有効にし、映像出力信号の入力元を変更します。
System Type -> TI OMAP Implementations -> OMAP multiplexing support[*]
2.カメラドライバを組み込みます。
Device Drivers -> Multimedia support -> Video capture adapters -> Encoders/decoders and other helper chips -> CLI6010 ISP driver[*]
こちらにあるboot.src の
omapfb.mode=dvi:1024x768MR-24@60 omapdss.def_disp=lcd cli6010.enable=0' を
omapfb.mode=dvi:640x480MR-24@60 omapdss.def_disp=lcd cli6010.enable=1' に
書き換えてください。