labs.beatcraft.com

BeagleBoard-xm with bc10カメラモジュール

BeagleBoard-xmにbc10のカメラモジュールを接続し動かしました。 BeagleBoard-xm に bc10向けrowboatカーネルをポーティングしました。
bc10向けrowboatカーネルのソースコード入手方法はこちらを参考にしてください。

カーネルソースの書き換え

arch/arm/mach-omap2/board-omap3bc10.c の書き換え

・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 の書き換え

・カメラからのデータ読み込みタイミングとデータの順序を変更します。

       @@ -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

・カメラから受信する色情報の設定を変更します。

        @@ -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では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による対処を行いました。

カーネルコンフィギュレーションの変更

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 の書き換え

こちらにある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' に 書き換えてください。

動画撮影に使用したアプリケーションのソースファイルを添付します。 今回撮影した画像を添付します。


sample.jpg
Keisuke Koike

添付ファイル: filesample.jpg 811件 [詳細] filesample6.bmp 379件 [詳細] filev4l2_sample.c 1069件 [詳細]

BC::labsへの質問は、bc9-dev @ googlegroups.com までお願い致します。
トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2011-09-02 (金) 18:45:37 (2270d)