FC2カウンター FPGAの部屋 2014年11月17日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する8(実機でテスト)

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する7(devicetree.dtb)”の続き。

前回は devicetree を生成した。今回は、devicetree.dtbBOOT.bin を SDカードに書いて、ZYBOに挿入して確かめてみた。

・ZYBOにSDカードを挿入して電源をONした。

・問題なくLinuxが起動した。いつもの様に、シリアル接続のTrea Term で、ifconfig コマンドを発行して、DHCPで割り振られたIPアドレスを見た。

・Xming を立ちあげた。

・Putty で そのIPアドレスに SSH でログインした。(linaro ユーザーでログイン)

・gvim で UIO を使用して、カメラを表示するためのソフトウェアを書いた。
ZYBO_EM_Linux_159_141116.png

cc -o cam_disp_uio cam_disp_uio.c コマンドでコンパイルした。

./cam_disp_uio で実行すると、ディスプレイへ画像出力はされているが、画面は真っ暗だった。

あちゃ~。動かない。。。ので、デバックを行う。

とりあえず、今のところの cam_disp_uio.c を下に貼っておく。

//
// cam_disp_uio.c
// Created on: 2014/11/15
//      Author: Masaaki
//

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/mman.h>
#include <fcntl.h>

#define CMA_START_ADDRESS 0x17800000
#define VIDEO_BUFFER_START_ADDRESS  0x18000000  // Limit 0x18800000, 800*600*4 = 2MBytes * 2

#define HORIZONTAL_PIXEL    800
#define ALL_CHAR_OF_1LINE   (HORIZONTAL_PIXEL/8)
#define VERTICAL_PIXEL      600
#define ALL_CHAR_OF_ROW     (VERTICAL_PIXEL/8)
#define ALL_DISP_ADDRESS    (HORIZONTAL_PIXEL*VERTICAL_PIXEL*4)
#define ALL_DISP_CHARACTOR  HORIZONTAL_PIXEL*VERTICAL_PIXEL

void cam_i2c_init(volatile unsigned *mt9d111_i2c_axi_lites) {
    mt9d111_i2c_axi_lites[64] = 0x2// reset tx fifo ,address is 0x100, i2c_control_reg
    mt9d111_i2c_axi_lites[64] = 0x1// enable i2c
}

void cam_i2x_write_sync(void) {
    // unsigned c;

    // c = *cam_i2c_rx_fifo;
    // while ((c & 0x84) != 0x80)
        // c = *cam_i2c_rx_fifo; // No Bus Busy and TX_FIFO_Empty = 1
    usleep(1000);
}

void cam_i2c_write(volatile unsigned *mt9d111_i2c_axi_lites, unsigned int device_addr, unsigned int write_addr, unsigned int write_data){
    mt9d111_i2c_axi_lites[66] = 0x100 | (device_addr & 0xfe);   // Slave IIC Write Address, address is 0x108, i2c_tx_fifo
    mt9d111_i2c_axi_lites[66] = write_addr;
    mt9d111_i2c_axi_lites[66] = (write_data >> 8)|0xff;         // first data
    mt9d111_i2c_axi_lites[66] = 0x200 | (write_data & 0xff);        // second data
    cam_i2x_write_sync();
}

int main()
{
    int i, j, k;
    int fd0, fd1, fd2, fd3;
    volatile unsigned *bmdc_axi_lites;
    volatile unsigned *mt9d111_axi_lites;
    volatile unsigned *mt9d111_i2c_axi_lites;
    volatile unsigned *frame_buffer;

    // Bitmap Display Controller AXI4 Lite Slave (UIO0)
    fd0 = open("/dev/uio0", O_RDWR); // bitmap_display_controller axi4 lite
    if (fd0 < 1){
        fprintf(stderr, "/dev/uio0 open error\n");
        exit(-1);
    }
    bmdc_axi_lites = (volatile unsigned *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd0, 0);
    if (!bmdc_axi_lites){
        fprintf(stderr, "bmdc_axi_lites mmap error\n");
        exit(-1);
    }
    bmdc_axi_lites[0] = VIDEO_BUFFER_START_ADDRESS; // Bitmap Display Controller start

    // mt9d111 interface AXI4 Lite Slave (UIO1)
    fd1 = open("/dev/uio1", O_RDWR); // mt9d111 interface AXI4 Lite Slave
    if (fd1 < 1){
        fprintf(stderr, "/dev/uio1 open error\n");
        exit(-1);
    }
    mt9d111_axi_lites = (volatile unsigned *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd1, 0);
    if (!mt9d111_axi_lites){
        fprintf(stderr, "mt9d111_axi_lites mmap error\n");
        exit(-1);
    }
    mt9d111_axi_lites[0] = VIDEO_BUFFER_START_ADDRESS; // Bitmap Display Controller start

    // mt9d111 i2c AXI4 Lite Slave (UIO2)
    fd2 = open("/dev/uio2", O_RDWR); // mt9d111 i2c AXI4 Lite Slave
    if (fd2 < 1){
        fprintf(stderr, "/dev/uio2 open error\n");
        exit(-1);
    }
    mt9d111_i2c_axi_lites = (volatile unsigned *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd2, 0);
    if (!mt9d111_i2c_axi_lites){
        fprintf(stderr, "mt9d111_i2c_axi_lites mmap error\n");
        exit(-1);
    }

    // Frame Buffer UIO3
    fd3 = open("/dev/uio3", O_RDWR); // Frame Buffer
    if (fd3 < 1){
        fprintf(stderr, "/dev/uio3 open error\n");
        exit(-1);
    }
    frame_buffer = (volatile unsigned *)mmap(NULL, 0x1000000, PROT_READ|PROT_WRITE, MAP_SHARED, fd3, 0);
    if (!frame_buffer){
        fprintf(stderr, "frame_buffer mmap error\n");
        exit(-1);
    }

    // CMOS Camera initialize, MT9D111
    cam_i2c_init(mt9d111_i2c_axi_lites);
    
    cam_i2c_write(mt9d111_i2c_axi_lites, 0xba, 0xf00x1);      // Changed regster map to IFP page 1
    cam_i2c_write(mt9d111_i2c_axi_lites, 0xba, 0x970x20); // RGB Mode, RGB565
    
    mt9d111_axi_lites[1] = 0

    munmap((void *)bmdc_axi_lites, 0x10000);
    munmap((void *)mt9d111_axi_lites, 0x10000);
    munmap((void *)mt9d111_i2c_axi_lites, 0x10000);
    munmap((void *)frame_buffer, 0x1000000);
    
    return(0);
}


ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する9(デバック)”に続く。
  1. 2014年11月17日 04:26 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0