- 追加された行はこの色です。
- 削除された行はこの色です。
[[labs.beatcraft.com]]
#contents
* BeagleBoard-xm with bc10カメラモジュール [#n3cb8ca2]
BeagleBoard-xmにbc10のカメラモジュールを接続し動かしました。
BeagleBoard-xm に bc10向けrowboatカーネルをポーティングしました。~
bc10向けrowboatカーネルのソースコード入手方法は[[こちら>http://labs.beatcraft.com/ja/index.php?bc10%2Fkernel-2.6.32#oa8705d8]]を参考にしてください。
** カーネルソースの書き換え [#p8ee5d94]
*** arch/arm/mach-omap2/board-omap3bc10.c の書き換え [#c4be6a2e]
・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フィールドを変更することで、
マルチプレクサの設定が変わり、映像出力信号の入力元が切り替わります。
*** driver/media/video/isp/isp.c の書き換え [#o13a78e5]
・カメラからのデータ読み込みタイミングとデータの順序を変更します。
@@ -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);
*** driver/media/video/isp/ispccdc.c [#i01c78a6]
・カメラから受信する色情報の設定を変更します。
@@ -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はデータの順序が入れ替わりノイズも発生します。
カメラは画素データがポジティブエッジに同期する設定となっています。
//ノイズのタイミング考察
// 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かどうか )が取得できないことが原因です。
//未修正の理由
** カーネルコンフィギュレーションの変更 [#vd1afa6b]
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.scr の書き換え [#e4106340]
[[こちら>http://labs.beatcraft.com/ja/index.php?cmd=read&page=bc10%2Fprebuilt-20110127&word=dvi#g1d02e0d]]にある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' に
書き換えてください。