[[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 はネガティブエッジで画素データを取得するとノイズが発生しません。 異なるエッジでデータを取得した場合、bc10はノイズが混じます。~ BeagleBoardはデータの順序が入れ替わりノイズも発生します。 カメラは画素データがポジティブエッジに同期する設定となっています。 //ノイズのタイミング考察 // BeagleBoardで起こっていることの考察 従って、ノイズはブリッジに入力される際に発生すると考えられます。~ また、カメラは画素データがポジティブエッジに同期する設定となっています。 BeagleBoardではYUV信号と、データ取得クロックのタイミングがずれているため、~ ポジティブエッジでのデータ取得がうまく行えないものと考えられます。 ・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かどうか )が取得できないことが原因です。 //未修正の理由 今回は時間の都合上適切なソースの修正が行えず、mdelayによる対処を行いました。 ** カーネルコンフィギュレーションの変更 [#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' に 書き換えてください。 動画撮影に使用したアプリケーションのソースファイルを添付します。 今回撮影した画像を添付します。 #ref(v4l2_sample.c); ~ #ref(sample.jpg,,40%);~ RIGHT:Keisuke Koike