FC2カウンター FPGAの部屋 2014年11月

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

FPGAの部屋

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

ZYBO のUbuntu Linuxで ”saned disabled; edit /etc/default/saned” が出る

ZYBO の Ubuntu Linux で ”saned disabled; edit /etc/default/saned” が出て、途中でLinuxのブートが止まってしまった。リターンキーを押すとプロンプトがが出てきたが、自分がタイプしたキーがエコーされないので、TreaTermでローカルエコーに設定する必要があった。

これを解消したいと思って、いろいろとやってみたがうまく行かなかった。
ZYBO_Ubuntu_17_141130.png

検索していると、”After Upgrading to 12.04 I can't get to the login screen”を見つけた。それに従って、

sudo apt-get remove --purge xserver-xorg
sudo apt-get install xserver-xorg
sudo dpkg-reconfigure xserver-xorg

を行うと、プロンプトが出た。キーのエコーが問題無くなった。直りました。
ZYBO_Ubuntu_18_141130.png

但し、root でコマンドを実行したので、sudo は省略した。

追記
xserver-xorg よりも adjtimex を remove したほうが効いた気がする。
sudo apt-get remove adjtimex
  1. 2014年11月30日 20:07 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

ZYBO用Ubuntu Linuxの時計のずれ2(解決編)

ZYBO用Ubuntu Linuxの時計のずれ”の続き。

この時計のズレはDTS (Deviece Tree Source) にあるかも知れないという推測ができたので、確かめてみた。

ZYBOのDTSは、下の図に示すように、

operating-points = <666667 1000000 333334 1000000>;

に設定してある。
ZYBO_EM_Linux_141_140915.png
なお、このVivado の operating-points は、動作周波数(KHz) とコア電圧(uV) の組を表すようだ。”Re: [PATCH 08/11] ARM: dts: rockchip: add operating points and armclk references”参照。

ブロック・デザイン上のZYNQ7 Processing System の Clock Configuration を見てみると、CPUのPLL出力周波数は 650MHz だった。
ZYBO_Ubuntu_13_141130.png

cat /proc/cpuinfo を見てもCPUの動作周波数は書いていない。(ZYBOのLinux上)
ZYBO_Ubuntu_14_141130.png

もしかして、operating-points に 333MHz も書いてあるので、333MHzで時刻を計算しているかもしれない?という可能性が出てきた。

そこで、

operating-points = <650000 1000000 >;

のみにしてみた。
ZYBO_Ubuntu_15_141130.png

../Linux-Digilent-Dev/scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb zynq-zybo.dts コマンドで、再度デバイス・ツリーをコンパイルした。

devicetree.dtb をZYBO のSDカードの第1パーティションにコピーして、ZYBOに挿入して電源ONした。

今度は時計が狂わなくなった。ZYBOを起動してから30分程度だが、Windows 7 の時刻とZYBOの date コマンドの時刻があっているのがわかる。
ZYBO_Ubuntu_16_141130.png

  1. 2014年11月30日 05:49 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

ZYBO用Ubuntu Linuxの時計のずれ

ZYBO用Ubuntu14.04LTS の時計がずれて、困っている。
今計測してみたら、NTPで今日の午前4時にZYBOの時計を合わせて、午前5時に date コマンドで確認したところ、午前4時30分だった。1/2進みが遅い。

Linuxの時計の仕組みを調べてみたところ、大体、NTPで時計を合わせろと書いてある。後、adjtimex で合わせろとも書いてあったので、この2つをインストールした。
adjtimex -p の結果を示す。

linaro@linaro-ubuntu-desktop:~$ sudo adjtimex -p
         mode: 0
        offset: 0
    frequency: 0
     maxerror: 1251516
     esterror: 16
       status: 16385
   time_constant: 7
    precision: 1
    tolerance: 32768000
         tick: 10000
     raw time:  1417203572s 868504us = 1417203572.868504

adjtimex -f 667000000 で周波数に667MHzを入れようとしたが、このコマンドを実行して、adjtimex -p で表示した結果は以下の通りだった。
ZYBO_Ubuntu_11_141129.png
frequency の値は、tolerance の値よりも増えないようだ。tolerance はread-only ということで変更できない。
adjtimex -- help の結果を下に示す。

linaro@linaro-ubuntu-desktop:~$ sudo adjtimex --help

Usage: adjtimex  [OPTION]...
Mandatory or optional arguments to long options are mandatory or optional
for short options too.

Get/Set Kernel Time Parameters:
       -p, --print               print values of kernel time variables
       -t, --tick val            set the kernel tick interval in usec
       -f, --frequency newfreq   set system clock frequency offset
       -s, --singleshot adj      slew the system clock by adj usec
       -S, --status val          set kernel clock status
       -R, --reset               reset status after setting parameters
                                 (needed for early kernels)
       -o, --offset adj          add a time offset of adj usec
       -m, --maxerror val        set maximum error (usec)
       -e, --esterror val        set estimated error (usec)
       -T, --timeconstant val    set phase locked loop time constant
       -a, --adjust[=count]      set system clock parameters per CMOS
                                 clock or (with --review) log file
       --force-adjust            override +-1 percent sanity check

Estimate Systematic Drifts:
       -c, --compare[=count]     compare system and CMOS clocks
       -i, --interval tim        set clock comparison interval (sec)
       -l, --log[=file]          log current times to file
       -h, --host timeserver     query the timeserver
       -w, --watch               get current time from user
       -r, --review[=file]       review clock log file, estimate drifts
       -u, --utc                 the CMOS clock is set to UTC
       -d, --directisa           access the CMOS clock directly
       -n, --nointerrupt         bypass the CMOS clock interrupt access method

Informative Output:
           --help                print this help, then exit
       -v, --version             print adjtimex program version, then exit
       -V, --verbose             increase verbosity


次に、”Linux時刻管理の仕組みと設定”が良く書いてあるので、参照した。
sudo hwclock -r
sudo hwclock -r --utc
sudo hwclock -r --localtime

3つのコマンドとも時刻が取れない。
ZYBO_Ubuntu_12_141129.png

カーネルの設定が悪いのか?継続調査中。

ZYBO用Ubuntu Linuxの時計のずれ2(解決編)”に続く。
  1. 2014年11月29日 05:37 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

ZYBO用カメラ画像をOpenCVで顔認証した

ZYBOのUbuntu上でカメラ画像をBMPファイルに変換できた”でカメラ画像をBMPファイルに変換できた。

今回は、BMPファイルを gimp でJPEGファイルに変換して、OpenCV で顔認証を試みた。

./disp2bmp でカメラ画像がらBMPファイルを生成した。

・gimp でBMPファイルをJPEGファイルに変換した。

./nautilus ファイルマネージャーを立ちあげて、OpenCV のサンプルフォルダ (samples/c) にコピーした。

./facedetect --cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" ????.jpg コマンドで、顔認証を行ったところ、認識された。
ZYBO_OpenCV_52_141127.jpg

なおカメラ画像は、自分ではうまく取れないので、息子のを使用した。

顔認証は成功したが、よく見てみると、何かおかしい。拡大してみるとおかしい様子がわかるはずだ。
ZYBO_OpenCV_54_141128.jpg

よく見るとザラザラになっている。この特徴は横の1ピクセル分が入れ替わっている時の特徴だ。
ハードウェアでは、ビッグエンディアンでアラインされている(”ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する10(デバック2)”の mt9d111_cam_cont.v 参照)が、Zynq のARMプロセッサはリトルエンディアンだった(”Zynq-7000 All Programmable SoC テクニカル リファレンス マニュアル UG585 (v1.7) 2014 年 2 月 11 日”63ページ、一番下の注記から引用、

注記 : アプ リ ケーシ ョ ン プロセッシング ユニッ ト (APU) および PS 全体は、命令 とデータのどち らについて も リ ト ルエンディ アン アーキテ クチャ しかサポー ト していません。

)。
ZynqのARMプロセッサの内部バスは64ビットだったと思われるため、int でデータを取り扱った場合、異なるエンディアンの影響を受けてしまう。これはハードウェア、ソフトウェアどちらかで対応が可能だが、修正が簡単なソフトウェアで修正を行うことにした。

現在の disp2bmp.c の bmp_data の書き込みの C ソースを下に示す。

    // bmp_dataの書き込み
    for (i=0; i<VERTICAL_LINES; i++) {
        for (j=0; j<HORIZONTAL_PIXEL; j++) {
            fputc((int)bmp_data[i][j].blue, fbmp);
            fputc((int)bmp_data[i][j].green, fbmp);
            fputc((int)bmp_data[i][j].red, fbmp);
        }
    }

これを次のように修正する

    // bmp_dataの書き込み
    for (i=0; i<VERTICAL_LINES; i++) {
        for (j=0; j<HORIZONTAL_PIXEL; j++) {
            fputc((int)bmp_data[i][j^1].blue, fbmp);
            fputc((int)bmp_data[i][j^1].green, fbmp);
            fputc((int)bmp_data[i][j^1].red, fbmp);
        }
    }

つまり、1との排他的論理和演算をすることで、LSBを反転させた。これはint 単位(32ビット単位)でアドレスを1つひっくり返すことになる。

これでもう一度、顔認証を行った写真を下に示す。
ZYBO_OpenCV_55_141129.jpg

拡大してみた。
ZYBO_OpenCV_56_141129.jpg

結構スムーズになっていると思う。これで問題無さそうだ。
ZYBOのUbuntu上でカメラ画像をBMPファイルに変換できた”の disp2bmp.c は修正した。
  1. 2014年11月28日 05:23 |
  2. OpenCV
  3. | トラックバック:0
  4. | コメント:0

ZYBO用Ubuntu Linux のファイルマネージャー

ZYBO用のファイルマネージャーは、nautilus を使っている。

putty ターミナルから、(linaro ユーザーで) nautilus & をタイプして起動している。(フリーのWindows 用XサーバーのXming を起動してある)
ZYBO_Ubuntu_9_141128.png

起動した、nautilus ファイルマネージャー。
ZYBO_Ubuntu_10_141128.png

これで結構便利になる。
  1. 2014年11月28日 04:46 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

ZYBO用Ubuntu Linuxのファイルチェック

ZYBO用のUbuntu Linuxが起動の途中で止まってしまう。

 * Starting regular background program processing daemon                 [ OK ]
 * Stopping save kernel messages                                         [ OK ]


この後、止まってしまいプロンプトが出てこなくなってしまった。
リターンキーを押せばプロンプトが出るが、エコーが効いていないので、ローカルエコーに設定している。
(下の図は、上のメッセージ後にリターンキーを押してプロンプトを出して、ifconfig コマンドを実行したところ)
ZYBO_Ubuntu_1_141128.png

後で、下の図の様に adjtimex , ntpd などが実行されている。
ZYBO_Ubuntu_2_141128.png

いろいろと、apt-get 関係のコマンドを実行してやってみたが、どうもおかしくなってしまったので、ファイルチェックをすることにした。ファイルチェックのコマンドを検索すると、”Ubuntu 12.10でハードディスクのファイルシステムをチェックする”が検索できた。
それによると gparted がそのファイルシステムのチェックができるソフトウェアのようだ。
早速、linaro アカウントから sudo apt-get install gparted でインストールを行った。
次に起動は、やはりスーパーユーザの権限が必要で、sudo gparted で起動した。
フリーのWindows 用Xサーバーの Xming を起動してあるので、gparted が立ち上がって、ウインドウが出た。
ZYBO_Ubuntu_3_141128.png

/dev/mmcblk0p2 をクリックして右クリックメニューからCheck を選択した。
ZYBO_Ubuntu_4_141128.png

Apply ボタンをクリックした。
ZYBO_Ubuntu_5_141128.png

確認ダイアログが出た。
ZYBO_Ubuntu_6_141128.png

やはり、マウントされているので、チェックできなかった。
ZYBO_Ubuntu_7_141128.png

ログ。
ZYBO_Ubuntu_8_141128.png
  1. 2014年11月28日 04:38 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

ハードディスクが壊れちゃいました

突然、D: ハードディスクが壊れちゃいました。ここはISEのプロジェクトがたくさん入っています。まだ、起動ドライブじゃなくて良かったです。

急遽、アマゾンから、【Amazon.co.jp限定】WD 内蔵HDD Green 2TB 3.5inch SATA3.0 64MB Inteilipower 2年保証 WD20EZRX/N (FFP) を購入したので交換します。

今は、購入した裸族のお立ち台に2TB HDDを載せて、USBでつないでコピーしています。コピーできる時もあれば、できない時もあって時間がかかっても、やってみるしか無さそうです。

Windows7 が出しているエラー・ダイアログを下に示します。
HDD_error_141126.png

完全復旧するまで、ブログはお休みします。

(2014/11/28:追記)
新しいハードディスクをパソコンに入れて、壊れたハードディスクは裸のお立ち台に立てました。とりあえず、これで行けそうです。
ご心配をお掛けしました。
ISEプロジェクト等のデータは大丈夫そうです。と言っても1つ1つ調べたわけではありませんが、2, 3個やってみたところでは、大丈夫そうです。
  1. 2014年11月26日 03:31 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ZYBOのUbuntu上でカメラ画像をBMPファイルに変換できた

カメラ画像をUIO領域にDMAし、それをキャプチャ画像として停止することができたので、カメラ画像をBMPファイルに変換することにした。

まずは、カメラの画像をBMPファイルに変換するソフトウエア disp2bmp.c を作った。bmpheader.h も必要だった。BMPヘッダの定義は、”BMP ファイルフォーマット”さんから引用させて頂いた。
./disp2bmp でカメラ画像をBMPファイルにしてから、ZYBOのUbuntu 上で gimp を起動してJPGファイルに変換した。
ZYBO_Cam_Linux_73_141125.png

変換した default.jpg ファイルだ。
default_141125.jpg

これで、カメラ画像からJPGファイルすることができたので、OpenCVの顔認証アプリケーションを使用して、カメラ画像で顔認証を確かめてみることができそうだ。

disp2bmp.c と bmpheader.h を貼っておく。
disp2bmp.c から下に示す。(2014/11/29:修正 詳しい経緯は、”ZYBO用カメラ画像をOpenCVで顔認証した”を参照して下さい。)

//
// disp2bmp.c
//
// Created on: 2014/11/24
//     Author: Masaaki
// カメラの画像をBMPファイルに変換する
//

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

#include "bmpheader.h"

#define HORIZONTAL_PIXEL    800
#define VERTICAL_LINES      600

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

int main(int argc, char * argv[])
{
    char bmp_file[300];
    BITMAPFILEHEADER bmpfh; // BMPファイルのファイルヘッダ
    BITMAPINFOHEADER bmpih; // BMPファイルのINFOヘッダ
    BMP24FORMAT **bmp_data; // 24ビットのBMPファイルのデータ HORIZONTAL_PIXEL * VERTICAL_LINES
    FILE *fbmp;
    int i, j;
    int fd3;
    volatile unsigned int *frame_buffer, *fb_base_addr;

    // 引数の処理
    if (argc == 1) { // 引数なし
        strcpy(bmp_file, "default.bmp");
    } else if (argc == 2){ // 
        strcpy(bmp_file, (const char *)argv[1]);
    } else {
        fprintf(stderr, "disp2bmp <BMP file name>\n");
        exit(1);
    }

    // メモリをアロケートする
    if ((bmp_data=(BMP24FORMAT **)malloc(sizeof(BMP24FORMAT *)*VERTICAL_LINES)) == NULL){
        fprintf(stderr, "bmp_dataの1次元目の VERTICAL_LINES のメモリを確保できません\n");
        exit(1);
    }
    for (i=0; i<VERTICAL_LINES; i++){
        if ((bmp_data[i]=(BMP24FORMAT *)malloc(sizeof(BMP24FORMAT) * HORIZONTAL_PIXEL)) == NULL){
            fprintf(stderr, "bmp_dataの2次元目の%d番目のメモリが確保できません\n", i);
            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 int *)mmap(NULL, 0x1000000, PROT_READ|PROT_WRITE, MAP_SHARED, fd3, 0);
    if (!frame_buffer){
        fprintf(stderr, "frame_buffer mmap error\n");
        exit(-1);
    }

    // キャプチャ画像のベースアドレスを設定する
    fb_base_addr = (volatile unsigned int *)((unsigned int)frame_buffer + (VIDEO_BUFFER_START_ADDRESS-CMA_START_ADDRESS));

    // カメラのカラーデータをbmp_dataにをコピー(その際にBMPのデータは左下から始まる)
    for (i=0; i<VERTICAL_LINES; i++){
        for (j=0; j<HORIZONTAL_PIXEL; j++){
            bmp_data[(VERTICAL_LINES-1)-i][j].red = (fb_base_addr[i*HORIZONTAL_PIXEL+j]>>16)&0xff;
            bmp_data[(VERTICAL_LINES-1)-i][j].green = (fb_base_addr[i*HORIZONTAL_PIXEL+j]>>8)&0xff;
            bmp_data[(VERTICAL_LINES-1)-i][j].blue = (fb_base_addr[i*HORIZONTAL_PIXEL+j])&0xff;
        }
    }

    // BMPファイルのファイルヘッダに値を代入
    bmpfh.bfType = 0x4d42;
    bmpfh.bfSize = HORIZONTAL_PIXEL*VERTICAL_LINES*3+54;
    bmpfh.bfReserved1 = 0;
    bmpfh.bfReserved2 = 0;
    bmpfh.bfOffBits = 0x36;
    // BMPファイルのINFOヘッダに値を代入
    bmpih.biSize = 0x28;
    bmpih.biWidth = HORIZONTAL_PIXEL;
    bmpih.biHeight = VERTICAL_LINES;
    bmpih.biPlanes = 0x1;
    bmpih.biBitCount = 24;
    bmpih.biCompression = 0;
    bmpih.biSizeImage = 0;
    bmpih.biXPixPerMeter = 3779;
    bmpih.biYPixPerMeter = 3779;
    bmpih.biClrUsed = 0;
    bmpih.biClrImporant = 0;
    
    // bmpファイルに書き出す
    if ((fbmp=fopen(bmp_file, "wb")) == NULL){
        fprintf(stderr, "%s がバイナリ・ライトモードで開けません\n", bmp_file);
        exit(1);
    }
    // BMPファイルヘッダの書き込み
    fwrite(&bmpfh.bfType, sizeof(char), 2, fbmp);
    fwrite(&bmpfh.bfSize, sizeof(long), 1, fbmp);
    fwrite(&bmpfh.bfReserved1, sizeof(short), 1, fbmp);
    fwrite(&bmpfh.bfReserved2, sizeof(short), 1, fbmp);
    fwrite(&bmpfh.bfOffBits, sizeof(long), 1, fbmp);
    // BMPファイルのINFOヘッダの書き込み
    fwrite(&bmpih, sizeof(BITMAPINFOHEADER), 1, fbmp);
    // bmp_dataの書き込み
    for (i=0; i<VERTICAL_LINES; i++) {
        for (j=0; j<HORIZONTAL_PIXEL; j++) {
            fputc((int)bmp_data[i][j^1].blue, fbmp);
            fputc((int)bmp_data[i][j^1].green, fbmp);
            fputc((int)bmp_data[i][j^1].red, fbmp);
        }
    }
    fclose(fbmp);
    for(i=0; i<VERTICAL_LINES; i++){
        free(bmp_data[i]);
    }
    free(bmp_data);
    munmap((void *)frame_buffer, 0x1000000);

    return 0;
}


bmpheader.h を下に示す。

//
// bmpheader.h
// 2014/11/24
//
// reference : http://www.kk.iij4u.or.jp/~kondo/bmp/
//

#include <stdio.h>

// BITMAPFILEHEADER 14bytes
typedef struct tagBITMAPFILEHEADER {
  unsigned short bfType;
  unsigned long  bfSize;
  unsigned short bfReserved1;
  unsigned short bfReserved2;
  unsigned long  bfOffBits;
} BITMAPFILEHEADER;

// BITMAPINFOHEADER 40bytes
typedef struct tagBITMAPINFOHEADER{
    unsigned long  biSize;
    long           biWidth;
    long           biHeight;
    unsigned short biPlanes;
    unsigned short biBitCount;
    unsigned long  biCompression;
    unsigned long  biSizeImage;
    long           biXPixPerMeter;
    long           biYPixPerMeter;
    unsigned long  biClrUsed;
    unsigned long  biClrImporant;
} BITMAPINFOHEADER;

typedef struct BMP24bitsFORMAT {
    unsigned char blue;
    unsigned char green;
    unsigned char red;
} BMP24FORMAT;

  1. 2014年11月25日 05:03 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

Maker Faire Tokyo 2014 に行ってきました

今日はMaker Faire Tokyo 2014 に行ってきました

毎年出ているんですが、今年は作品を作れなかったので、見る側に回りました。
今年は企業のブースが多かったです。SONYとかTOSHIBAとか出てました。マクリニカも出ていて、Altera のFPGA MAX10のボードといろんなMaker 向けボードが出ていました。マクリニカはMaker向けのボードを作るということを言ってました。イメージと違ってフレンドリーな雰囲気でした。
IntelやGoogle 、NVIDIAも出ていました。はやりなんでしょうか?良い世の中になった気がします。

大体ひと通り見てきました。今回は殆ど写真を取らずに見ていたのですが、数少ない写真を貼っておきます。

MFT2014の看板です。
MFT2014_1_141125.jpg

東京工業大学附属科学技術高校の門田ロボテクを見てきました。練りきり、つまり、あんこの3Dプリンタです。
大きな注射筒に練りきりを入れて、圧力を掛けて出してました。かなりの力が必要なので、ステッピングモータが脱調し易いみたいです。でもあんこをプリントする様子を見せて頂きました。
MFT2014_2_141125.jpg

MFT2014_3_141125.jpg

MFT2014_4_141125.jpg

屋外でエグゾーストキャノンを見てきました。すごい音です。カッコ良いですよ。旋盤を使ってよく作りますね。しかもこれを仙台から持ってきたところが凄い。かなりの労力とお金が掛かっているでしょうね。
MFT2014_5_141125.jpg

写真はこれだけですが、いろいろなものが展示してありました。
ただ、以前はアイデアに驚くものが1つはあったんですが、いろいろ見過ぎたせいでしょうか?心の底から、”こう来るのか?”と驚くものが無かったです。何か、物凄いもの(物理的という意味では無くて)を見たいですね。
その中でもアート系の作品が良い気がします。

それから、ツィッターでお話している方に会えなくて残念でした。後でお声がけ頂いたんですが、もう帰ってしまってお会いできませんでした。お昼をご一緒できれば良かったです。

早めに帰ったので、奥さんとプールに行って、歩行トレーニングをしてきました。

(追記)
書き忘れましたが、Google Lunar XPRIZE という民間組織による月面ロボット探査を競う賞金レースがあるそうです。
日本でもHAKUTO というところが月面ロボット探査ロボットのプロトタイプを展示してました。これは驚きました。こういうのがあるんですね。とっても面白そうです。応援したいと思います。

(2014/11/26:追記)
だいぶ見逃していたみたいで、フェンリルさんの「ちょっとすごいロガー」を見逃してしまいました。
あと、きのこたけのこ判別器、凄いですね。画像認証をきのこの山とたけのこの里の判別器に使っているくだらなさがとっても良いです。驚くものがなかったという前言を撤回します。見たかったな。。。
上の2つの記事は、アスキーの“「100万円で電気自動車作ってみた」未来のヒット商品アイデア5点:Maker Faire Tokyo 2014”で読むことができます。
  1. 2014年11月24日 23:22 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

つくばマラソン2014

今日はつくばマラソンでした。今日はとっても良い天気でしたよ。気温も暖かかったので、マラソンには暑かったみたいです。脱水に注意ですね。

とてもすごいのがいましたよ。これで42.192km走るとは考えられないですが、スタートラインには付いていました。
tukuba_marathon_1_141123.jpg

マラソンのスタートは9時30分でした。スタートの様子です。G 辺りのスタートラインです。因みに一番早い人が A で F くらいまであったのかな?
tukuba_marathon_2_141123.jpg

うちの奥さんもスタートしていきました。

私は10kmに出場したのですが、腰の状態がまだ悪いので、スタートの雰囲気を味わって、3.5km付近で棄権しました。でも、5分45秒/km くらいのタイムで走れたので満足です。10km のスタートは10時10分でした。フルマラソンより40分後でした

奥さんは、4時間39分位でフルマラソンをゴールしました。さすがに疲れたようです。

そうそう、いつも腰のリハビリに行っているKクリニックのMさんは、フルマラソンを 2時間39分程度でゴールしました。物凄いです。速い~。1ヶ月に400kmは走りこむそうです。

交通規制の解除された3時50分ころに帰ってきました。今日はとっても天気が良かったです。

明日はMFT2014 に行ってきます。
  1. 2014年11月23日 20:45 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する11(Linuxで確認)

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する10(デバック2)”の続き。

前回、カメラの機能をベアメタル・アプリケーションで確認することができた。今度は、ZYBO用のUbuntu14.04 LTS で確認する。

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する6(BOOT.BINの生成)”に書いたようにFSBLと新しく生成したビットストリーム、u-boot から BOOT.bin を生成した。

生成したBOOT.bin をSDカードに入れて、ZYBOに挿入して電源ONした。

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する8(実機でテスト)”に載せておいた cam_disp_uio.c を実行するとカメラ画像が表示できた。やった~~~。嬉しい。。。
ZYBO_Cam_Linux_72_141122.jpg

cam_capture.c を作って、画像のキャプチャを行った。と言うか、frame_valid を止めただけなのだが。。。これも成功。。。
cam_capture.c を下に示す。

//
// cam_capture.c
// Created on: 2014/11/22
//      Author: Masaaki
//

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

int main(){
    int fd1;
    volatile unsigned *mt9d111_axi_lites;

    // 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[1] = 3;
    
    munmap((void *)mt9d111_axi_lites, 0x10000);
}


次に、画像キャプチャ状態から連続表示モードに戻すアプリケーションを作った。cam_on.c だ。
cam_on.c を下に示す。 cc でコンパイルした。

//
// cam_on.c
// Created on: 2014/11/22
//      Author: Masaaki
//

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

int main(){
    int fd1;
    volatile unsigned *mt9d111_axi_lites;

    // 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[1] = 0;

    munmap((void *)mt9d111_axi_lites, 0x10000);
}

  1. 2014年11月23日 04:38 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する10(デバック2)

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する9(デバック)”の続き。

前回は、カメラの画像が表示されないので、ZYBOのLinux(Ubuntu) 環境からベアメタル・アプリケーションに変更してデバックを行った。Vivado logic analyzer を入れて原因を探ってきたが、デバックをしてカメラ画像を表示し、キャプチャモードでワンショットでカメラ画像をキャプチャすることができるようになった。つまり、ベアメタル・アプリケーションとしては、仕様通りに動作している。
ZYBO_Cam_Linux_72_141122.jpg

原因は複合的だったが、(と言うか、しばらくソフトウェアばかりやっていたので、Verilog HDL コードがダメダメだった)カメラが表示されなかった第一の原因は、カメラの frame_valid を適切に処理できなかったことだ。カメラからの出力信号の frame_valid は有効なフレームであることを示しているので、それを L レベルにすれば、カメラ・コントローラIP回路は動作しない。それを利用しているわけだ。つまり独自の frame_valid を作って、今までの回路に送り込んでいる。但し、frame の途中で、frame_valid を L にすると画像表示がおかしくなるため、実際のframe_valid が L の時にいろいろな処理をするようにステートマシンが書いてある。それが、”ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する2(IPのシミュレーション)”の one_shot_sm でここで、作り替えた frame_valid_1d_oh を出力している。だが、よく見ると、条件があった時にしか frame_valid_1d をラッチしていない。これは、ステートマシンのステートのところに書く必要があった。

ワンショットのトリガも不完全だった。これは、ワンショットを出力するのは、AXI Lite Slave のアクセスの1クロックで、クロックは100MHz であるため 10ns 幅のパルスとなる。受ける方は pixel clock 動作なので、16MHz位で受けていた。これでは受かるはず無いので、100MHzで 20 クロック、200 ns まで幅を広げた。非同期処理も加えた結果、画像のワンショット取得ができるようになった。

今は、ベアメタル・アプリケーションなので、これを Linux でできれば完成だ。

修正した mt9d111_axi_lite_slave.v と mt9d111_cam_cont.v を貼っておく。
まずは、 mt9d111_axi_lite_slave.v を下に示す。

// mt9d111_axi_lite_slave.v 
// mt9d111_inf_axi_master のAXI Lite Slave モジュール。Frame Buffer のスタートアドレス・レジスタを持つ。
//
// 2014/11/08 : one_shot_reg を実装。
// オフセット0番地: フレーム・バッファの先頭アドレス(fb_start_address)
// オフセット4番地: 0 ビット目が 0 の時動画、0 ビット目に 1 の時に、ワンショットで取得した1フレームのカメラ画像を表示(one_shot_reg)
//            1 ビット目に 1 を Write した時に、ワンショットで1フレームの画像をフレーム・バッファに保存
// 2014/11/11 : init_done を追加
//

`default_nettype none

module mt9d111_axi_lite_slave # (
    parameter integer C_S_AXI_LITE_ADDR_WIDTH = 9, // Address width of the AXI Lite Interface
    parameter integer C_S_AXI_LITE_DATA_WIDTH = 32, // Data width of the AXI Lite Interface
    
    parameter [31:0] C_DISPLAY_START_ADDRESS = 32'h1A00_0000,
    parameter integer ONE_SHOT_PULSE_LENGTH = 20   // 1ショットパルスの長さのAXI Lite Slave ACLKのクロック数をセット
)(
    input    wire                                    s_axi_lite_aclk,
    input    wire                                    axi_resetn,
    
    // AXI Lite Write Address Channel
    input    wire                                    s_axi_lite_awvalid,
    output    wire                                    s_axi_lite_awready,
    input    wire    [C_S_AXI_LITE_ADDR_WIDTH-1: 0]    s_axi_lite_awaddr,

    // AXI Lite Write Data Channel
    input    wire                                    s_axi_lite_wvalid,
    output    wire                                    s_axi_lite_wready,
    input    wire    [C_S_AXI_LITE_DATA_WIDTH-1: 0]    s_axi_lite_wdata,
    
    // AXI Lite Write Response Channel
    output    wire    [1:0]                            s_axi_lite_bresp,
    output    wire                                    s_axi_lite_bvalid,
    input    wire                                    s_axi_lite_bready,

    // AXI Lite Read Address Channel
    input    wire                                    s_axi_lite_arvalid,
    output    wire                                    s_axi_lite_arready,
    input    wire    [C_S_AXI_LITE_ADDR_WIDTH-1: 0]    s_axi_lite_araddr,
    
    // AXI Lite Read Data Channel
    output    wire                                    s_axi_lite_rvalid,
    input    wire                                    s_axi_lite_rready,
    output    reg        [C_S_AXI_LITE_DATA_WIDTH-1: 0]    s_axi_lite_rdata,
    output    wire    [1:0]                            s_axi_lite_rresp,
    
    output    wire    [31:0]                            fb_start_address,    // Frame Buffer のスタートアドレス
    output    reg                                        init_done,            // fb_start_address に書き込まれた
    output    wire                                    one_shot_state,        // 1フレーム分取り込んだカメラ画像を保持する
    output    reg                                        one_shot_trigger    // 1フレーム分のカメラ画像取り込みのトリガー、1クロックパルス
);

    // RESP の値の定義
    parameter    RESP_OKAY =        2'b00;
    parameter    RESP_EXOKAY =    2'b01;
    parameter    RESP_SLVERR =     2'b10;
    parameter    RESP_DECERR =    2'b11;
    
    parameter    [1:0]    IDLE_WR =            2'b00,    // for wrt_cs
                        DATA_WRITE_HOLD =    2'b01,
                        BREADY_ASSERT =        2'b11;
                
    parameter    IDLE_RD    =        1'b0,            //  for rdt_cs
                AR_DATA_WAIT =    1'b1;

    reg        [1:0]    wrt_cs = IDLE_WR;
    
    reg        [31:0]    fb_start_addr_reg = C_DISPLAY_START_ADDRESS;
    
    reg        rdt_cs = IDLE_RD;
    
    reg        reset_1d = 1'b0;
    reg        reset = 1'b0;
    reg        awready = 1'b1;
    reg        bvalid = 1'b0;
    reg        arready = 1'b1;
    reg        rvalid = 1'b0;
    wire        aclk;
    reg        [31:0]    one_shot_reg;

    parameter    [1:0]    IDLE_TSM =            2'b00,    // for one_shot_tsm
                        WAIT_ONE_SHOT =        2'b01,
                        ONE_SHOT_TRIG =        2'b11;
    reg        [1:0]    one_shot_tsm;
    integer    one_shot_counter;

    assign aclk = s_axi_lite_aclk;
    // Synchronization of axi_resetn
    always @(posedge aclk) begin
        reset_1d <= ~axi_resetn;
        reset <= reset_1d;
    end
    
    // AXI4 Lite Slave Write Transaction State Machine
    always @(posedge aclk) begin
        if (reset) begin
            wrt_cs <= IDLE_WR;
            awready <= 1'b1;
            bvalid <= 1'b0;
        end else begin
            case (wrt_cs)
                IDLE_WR :
                    if (s_axi_lite_awvalid & ~s_axi_lite_wvalid) begin    // Write Transaction Start
                        wrt_cs <= DATA_WRITE_HOLD;
                        awready <= 1'b0;
                    end else if (s_axi_lite_awvalid & s_axi_lite_wvalid) begin    // Write Transaction Start with data
                        wrt_cs <= BREADY_ASSERT;
                        awready <= 1'b0;
                        bvalid <= 1'b1;
                    end
                DATA_WRITE_HOLD :
                    if (s_axi_lite_wvalid) begin    // Write data just valid
                        wrt_cs <= BREADY_ASSERT;
                        bvalid <= 1'b1;
                    end
                BREADY_ASSERT :
                    if (s_axi_lite_bready) begin    // The write transaction was terminated.
                        wrt_cs <= IDLE_WR;
                        bvalid <= 1'b0;
                        awready <= 1'b1;
                    end
            endcase
        end
    end
    assign s_axi_lite_awready = awready;
    assign s_axi_lite_bvalid = bvalid;
    assign s_axi_lite_wready = 1'b1;
    assign s_axi_lite_bresp = RESP_OKAY;
    
    // AXI4 Lite Slave Read Transaction State Machine
    always @(posedge aclk) begin
        if (reset) begin
            rdt_cs <= IDLE_RD;
            arready <= 1'b1;
            rvalid <= 1'b0;
        end else begin
            case (rdt_cs)
                IDLE_RD :
                    if (s_axi_lite_arvalid) begin
                        rdt_cs <= AR_DATA_WAIT;
                        arready <= 1'b0;
                        rvalid <= 1'b1;
                    end
                AR_DATA_WAIT :
                    if (s_axi_lite_rready) begin
                        rdt_cs <= IDLE_RD;
                        arready <= 1'b1;
                        rvalid <= 1'b0;
                    end
            endcase
        end
    end
    assign s_axi_lite_arready = arready;
    assign s_axi_lite_rvalid = rvalid;
    assign s_axi_lite_rresp = RESP_OKAY;
                    
    // fb_start_addr_reg
    always @(posedge aclk) begin
        if (reset) begin
            init_done <= 1'b0;
            fb_start_addr_reg <= C_DISPLAY_START_ADDRESS;
        end else begin
            if (s_axi_lite_wvalid==1'b1 && s_axi_lite_awaddr[2]==1'b0) begin
                init_done <= 1'b1;
                fb_start_addr_reg <= s_axi_lite_wdata;
            end
        end
    end
    assign fb_start_address = fb_start_addr_reg;

    // one_shot_reg
    always @(posedge aclk) begin
        if (reset)
            one_shot_reg <= 32'd0;    // default is continuous display mode
        else
            if (s_axi_lite_wvalid==1'b1 && s_axi_lite_awaddr[2]==1'b1)
                one_shot_reg <= s_axi_lite_wdata;
    end
    assign one_shot_state = one_shot_reg[0];

    // one_shot_tsm(State Machine for one_shot_trgger)
    always @(posedge aclk) begin
        if (reset) begin
            one_shot_tsm <= IDLE_TSM;
            one_shot_trigger <= 1'b0;
        end else begin
            case (one_shot_tsm)
                IDLE_TSM :
                    if (s_axi_lite_awvalid & awready & s_axi_lite_awaddr[2]) begin // one_shot_reg address
                        if (s_axi_lite_wvalid) begin // s_axi_wready is always 1
                            if (s_axi_lite_wdata[1]) begin // one_shot was triggered
                                one_shot_tsm <= ONE_SHOT_TRIG;
                                one_shot_trigger <= 1'b1;
                            end else begin // is not trigger
                                one_shot_tsm <= IDLE_TSM;
                                one_shot_trigger <= 1'b0;
                            end
                        end else begin // s_axi_lite_wvalid is not asserted
                            one_shot_tsm <= WAIT_ONE_SHOT;
                            one_shot_trigger <= 1'b0;
                        end
                    end
                WAIT_ONE_SHOT :
                    if (s_axi_lite_wvalid) begin // s_axi_wready is always 1
                        if (s_axi_lite_wdata[1]) begin // one_shot was triggered
                            one_shot_tsm <= ONE_SHOT_TRIG;
                            one_shot_trigger <= 1'b1;
                        end else begin // is not trigger
                            one_shot_tsm <= IDLE_TSM;
                            one_shot_trigger <= 1'b0;
                        end
                    end
                ONE_SHOT_TRIG : begin
                    if (one_shot_counter == 0) begin
                        one_shot_tsm <= IDLE_TSM;
                        one_shot_trigger <= 1'b0;
                    end
                end
            endcase
        end
    end

    // one shot pulse length counter
    always @(posedge aclk) begin
        if (reset) begin
            one_shot_counter <= ONE_SHOT_PULSE_LENGTH;
        end else if (one_shot_tsm == ONE_SHOT_TRIG) begin
            one_shot_counter <= one_shot_counter - 1;
        end else begin
            one_shot_counter <= ONE_SHOT_PULSE_LENGTH;
        end
    end
    // s_axi_lite_rdata
    always @(posedge aclk) begin
        if (reset) begin
            s_axi_lite_rdata <= 0;
        end else if (s_axi_lite_arvalid) begin
            case (s_axi_lite_araddr[2])
                1'b0 :     s_axi_lite_rdata <= fb_start_addr_reg;
                1'b1 :    s_axi_lite_rdata <= one_shot_reg;
            endcase
        end
    end
endmodule
    
`default_nettype wire        


次に、mt9d111_cam_cont.v を下に示す。

// MT9D111カメラコントローラ
// mt9d111_cam_cont.v
// 2012/12/26
//
// 2014/11/07 : fb_start_address を追加。レジスタに設定された値をスタートアドレスとして参照。
// 2014/11/08 : one_shot_state, one_shot_trigger の入力ポートを追加

`default_nettype none

module mt9d111_cam_cont # (
    parameter    integer    UPSIDE_DOWN = 0        // 1 = 上下反転、0 = 正常
)(
    input    wire    aclk,
    input    wire    areset,
    input    wire    pclk,
    input    wire    preset,
    input    wire    pclk_from_pll,
    output    wire    xclk,
    input    wire    line_valid,
    input    wire    frame_valid,
    input    wire    [7:0]    cam_data,
    output    wire    standby,
    output    wire    [31:0]    paddr,
    input    wire    pfifo_rd_en,
    output    wire    [63:0]    pfifo_dout,
    output    wire    pfifo_empty,
    output    wire    pfifo_almost_empty,
    output    wire    [9:0]    pfifo_rd_data_count,
    output    wire    pfifo_overflow,
    output    wire    pfifo_underflow,
    input    wire    [31:0]    fb_start_address,
    input    wire    one_shot_state,        // 1フレーム分取り込んだカメラ画像を保持する
    input    wire    one_shot_trigger    // 1フレーム分のカメラ画像取り込みのトリガー、1クロックパルス
);
    `include "./disp_timing_parameters.vh"

    // Frame Buffer End Address
    reg        line_valid_1d;
    reg        frame_valid_1d;
    reg        [7:0]    cam_data_1d;
    reg        line_valid_1d_odd;
    reg        line_v_1d_odd_1d;
    reg        [63:0]    rgb565;
    wire    pfifo_full, pfifo_almost_full;
    reg        frame_valid_1d_aclk_1d, frame_valid_1d_aclk_2d;
    parameter    [1:0]    IDLE_ADDR_RST =    2'b00,
                        ADDR_RST =        2'b01,
                        ADDR_RST_HOLD =    2'b11;
    reg        [1:0]    addr_rst_cs;
    reg        [31:0]    paddr_reg;
    reg        rgb565_2nd;

    parameter    [2:0]    IDLE_OS =                3'b000,
                        WAIT_FRAME_VALID_END =    3'b001,
                        HOLD_PICTURE =            3'b011,
                        WAIT_FRAME_VALID_LOW =    3'b010,
                        WAIT_FRAME_VALID_HIGH =    3'b110;
    reg        [2:0]    one_shot_sm;
    reg        frame_valid_1d_oh;
    reg        ost_1d, ost_2d, ost_3d, ost_4d;
    reg        one_shot_tig_pclk;

    assign standby = 1'b0;

    // MT9D111 へのクロックを出力 (xclk)
    ODDR #(
        .DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
        .INIT(1'b0), // Initial value of Q: 1'b0 or 1'b1
        .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
    ) ODDR_inst (
        .Q(xclk), // 1-bit DDR output
        .C(pclk_from_pll), // 1-bit clock input
        .CE(1'b1), // 1-bit clock enable input
        .D1(1'b1), // 1-bit data input (positive edge)
        .D2(1'b0), // 1-bit data input (negative edge)
        .R(1'b0), // 1-bit reset
        .S(1'b0) // 1-bit set
    );

    // 入力信号を一旦ラッチする
    always @(posedge pclk) begin
        if (preset) begin
            line_valid_1d <=    1'b0;
            frame_valid_1d <=    1'b0;
            cam_data_1d <=        8'd0;
        end else begin
            line_valid_1d <=    line_valid;
            frame_valid_1d <=    frame_valid;
            cam_data_1d <=        cam_data;
        end
    end

    // one_shot_trigger はAXIバスのaclkで生成されているので、pclkで動作するステートマシンでは、本当にone shotでは取れない
    // よって、one shotと言ってもある程度の幅を用意してある。pclk の幅のone shot pulse を作る必要がある
    always @(posedge pclk) begin // one_shot_trigger を pclk で同期化
        if (preset) begin
            ost_1d <= 1'b0;
            ost_2d <= 1'b0;
            ost_3d <= 1'b0;
            ost_4d <= 1'b0;
        end else begin
            ost_1d <= one_shot_trigger;
            ost_2d <= ost_1d;
            ost_3d <= ost_2d;
            ost_4d <= ost_3d;
        end
    end

    // pclk 幅の one shot pulse を生成
    always @(posedge pclk) begin
        if (preset) begin
            one_shot_tig_pclk <= 1'b0;
        end else if (ost_3d==1'b1 && ost_4d==1'b0) begin // rising edge
            one_shot_tig_pclk <= 1'b1;
        end else begin
            one_shot_tig_pclk <= 1'b0;
        end
    end
    
    // one shot state machine
    // frame_valid_1d_oh を生成する
    always @(posedge pclk) begin
        if (preset) begin
            one_shot_sm <= IDLE_OS;
            frame_valid_1d_oh <= frame_valid_1d;
        end else begin
            case (one_shot_sm)
                IDLE_OS : begin
                    frame_valid_1d_oh <= frame_valid_1d;
                    if (one_shot_state) begin
                        one_shot_sm <= WAIT_FRAME_VALID_END;
                    end
                end
                WAIT_FRAME_VALID_END : begin
                    frame_valid_1d_oh <= frame_valid_1d;
                    if (!frame_valid_1d) begin
                        one_shot_sm <= HOLD_PICTURE;
                    end
                end
                HOLD_PICTURE : begin
                    frame_valid_1d_oh <= 1'b0;
                    if (one_shot_tig_pclk) begin
                        one_shot_sm <= WAIT_FRAME_VALID_LOW;
                    end else if (~one_shot_state & ~frame_valid_1d) begin
                        one_shot_sm <= IDLE_OS;
                    end
                end
                WAIT_FRAME_VALID_LOW : begin
                    frame_valid_1d_oh <= 1'b0;
                    if (!frame_valid_1d) begin
                        one_shot_sm <= WAIT_FRAME_VALID_HIGH;
                    end
                end
                WAIT_FRAME_VALID_HIGH : begin
                    frame_valid_1d_oh <= frame_valid_1d;
                    if (frame_valid_1d) begin
                        one_shot_sm <= WAIT_FRAME_VALID_END;
                    end
                end
            endcase
        end
    end

    // frame_valid_1d_oh をaclk でラッチする
    always @(posedge aclk) begin
        if (areset) begin
            frame_valid_1d_aclk_1d <= 1'b0;
            frame_valid_1d_aclk_2d <= 1'b0;
        end else begin
            frame_valid_1d_aclk_1d <= frame_valid_1d_oh;
            frame_valid_1d_aclk_2d <= frame_valid_1d_aclk_1d;
        end
    end

    // line_valid_1d が偶数か奇数かをカウント
    always @(posedge pclk) begin
        if (preset)
            line_valid_1d_odd <= 1'b0;
        else begin
            if (!frame_valid_1d_oh)
                line_valid_1d_odd <= 1'b0;
            else if (line_valid_1d)
                line_valid_1d_odd <= ~line_valid_1d_odd;
            else
                line_valid_1d_odd <= 1'b0;
        end
    end

    // rgb565でラッチしているので、line_valid_1d_odd を1クロック遅延する
    always @(posedge pclk) begin
        if (preset)
            line_v_1d_odd_1d <= 1'b0;
        else
            line_v_1d_odd_1d <= line_valid_1d_odd;
    end

    // 2番めのRGB565を示す。64ビット長のFIFOに入れるのに2ピクセル集めてから非同期FIFOにWriteする
    always @(posedge pclk) begin
        if (preset)
            rgb565_2nd <= 1'b0;
        else begin
            if (line_valid_1d_odd)
                rgb565_2nd <= ~rgb565_2nd;
        end
    end

    // addressの生成
    always @(posedge aclk) begin
        if (areset) begin
            if (UPSIDE_DOWN==0) // 正常、それ以外は上下反転
                paddr_reg <= fb_start_address;
            else // 上下反転
                paddr_reg <= fb_start_address + (H_ACTIVE_VIDEO * V_ACTIVE_VIDEO)*4 - 8;
        end else begin
            if (pfifo_rd_en) begin
                if (UPSIDE_DOWN==0) // 正常
                    paddr_reg <= paddr_reg + 32'd8;
                else // 上下反転
                    paddr_reg <= paddr_reg - 32'd8;
            end else if (addr_rst_cs==ADDR_RST) begin    // frame_valid が0になって、pfifoにデータが無くなった時にアドレスをクリア
                if (UPSIDE_DOWN==0) // 正常、それ以外は上下反転
                    paddr_reg <= fb_start_address;
                else // 上下反転
                    paddr_reg <= fb_start_address + (H_ACTIVE_VIDEO * V_ACTIVE_VIDEO)*4 - 8;
            end
        end
    end
    assign paddr = paddr_reg;

    // address をリセットするためのステートマシン
    always @(posedge aclk) begin
        if (areset)
            addr_rst_cs <= IDLE_ADDR_RST;
        else begin
            case (addr_rst_cs)
                IDLE_ADDR_RST :
                    if (~frame_valid_1d_aclk_2d & pfifo_empty)
                        addr_rst_cs <= ADDR_RST;
                ADDR_RST :
                    addr_rst_cs <= ADDR_RST_HOLD;
                ADDR_RST_HOLD :
                    if (frame_valid_1d_aclk_2d)
                        addr_rst_cs <= IDLE_ADDR_RST;
            endcase
        end
    end

    // RGB565 のデータを保存する。正常と上下反転ではバイト配列が異なる
    always @(posedge pclk) begin
        if (preset)
            rgb565 <= 64'd0;
        else begin
            if (UPSIDE_DOWN==0) begin // 正常、それ以外は上下反転
                case ({rgb565_2nd, line_valid_1d_odd})
                    2'b00 : // 1番目
                        rgb565[63:45] <= {8'd0, cam_data_1d[7:3], 3'b000, cam_data_1d[2:0]};    // cam_data_1d = R7 R6 R5 R4 R3 G7 G6 G5
                    2'b01 : // 2番目
                        rgb565[44:32] <= {cam_data_1d[7:5], 2'b00, cam_data_1d[4:0], 3'b000};    // cam_data_1d = G4 G3 G2 B7 B6 B5 B4 B3
                    2'b10 : // 3番目
                        rgb565[31:13] <= {8'd0, cam_data_1d[7:3], 3'b000, cam_data_1d[2:0]};    // cam_data_1d = R7 R6 R5 R4 R3 G7 G6 G5
                    2'b11 : // 4番目
                        rgb565[12:0] <= {cam_data_1d[7:5], 2'b00, cam_data_1d[4:0], 3'b000};    // cam_data_1d = G4 G3 G2 B7 B6 B5 B4 B3
                endcase
            end else begin // 上下反転
                case ({rgb565_2nd, line_valid_1d_odd})
                    2'b00 : // 1番目
                        rgb565[31:13] <= {8'd0, cam_data_1d[7:3], 3'b000, cam_data_1d[2:0]};    // cam_data_1d = R7 R6 R5 R4 R3 G7 G6 G5
                    2'b01 : // 2番目
                        rgb565[12:0] <= {cam_data_1d[7:5], 2'b00, cam_data_1d[4:0], 3'b000};    // cam_data_1d = G4 G3 G2 B7 B6 B5 B4 B3
                    2'b10 : // 3番目
                        rgb565[63:45] <= {8'd0, cam_data_1d[7:3], 3'b000, cam_data_1d[2:0]};    // cam_data_1d = R7 R6 R5 R4 R3 G7 G6 G5
                    2'b11 : // 4番目
                        rgb565[44:32] <= {cam_data_1d[7:5], 2'b00, cam_data_1d[4:0], 3'b000};    // cam_data_1d = G4 G3 G2 B7 B6 B5 B4 B3
                endcase
            end
        end
    end

    // pixel FIFO をインスタンスする
    pixel_fifo pfifo (
        .rst(areset), // input rst
        .wr_clk(pclk), // input wr_clk
        .rd_clk(aclk), // input rd_clk
        .din(rgb565), // input [63 : 0] din
        .wr_en(line_v_1d_odd_1d & ~rgb565_2nd), // input wr_en, 2つのピクセルが揃うには4クロック掛かる
        .rd_en(pfifo_rd_en), // input rd_en
        .dout(pfifo_dout), // output [63 : 0] dout
        .full(pfifo_full), // output full
        .almost_full(pfifo_almost_full), // output almost_full
        .overflow(pfifo_overflow), // output overflow
        .empty(pfifo_empty), // output empty
        .almost_empty(pfifo_almost_empty), // output almost_empty
        .underflow(pfifo_underflow), // output underflow
        .rd_data_count(pfifo_rd_data_count) // output [9 : 0] rd_data_count
    );
endmodule

`default_nettype wire

  1. 2014年11月22日 17:29 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ホンダ ライフ GF-JB1

10月に、ホンダ ライフ GF-JB1を中古で購入しました。
息子が大学に通うための車として購入したのですが、一向に乗らないので、私が乗っています。
このライフは、10年以上経っていますが、7万6千キロくらいの走行距離でした。エンジンはとっても調子良いです。
ヒューンという音で、音は多少大きいですが、とっても耳に心地よいホンダサウンド?です。奥さんはうるさいと言って評判悪いですが、私には心地よい音。加速も良いですよ。普通車に負けません。まあ、かなり回転数も回っていると思います。ステップワゴンでこんなに回したら法定速度をゆうに超えてしまいますが、ライフだと大丈夫。バイクに乗っているようで楽しめますね。
ハンドルはゆるいカーブを曲がっていると、引っかかる感じがして調子悪いですが、これが仕様のよう?です。(ギアボックスの不具合そのものです)修理は10万円程度みたいですね。でも慣れたから大丈夫そうです。
燃費は相当エンジンを回していますが、15km/Lくらいです。ステップワゴンは10km/Lくらいなので、1.5倍燃費が良いです。
ハンドルが良かったら最高です。後、中古車で少し煙草臭いのが難点です。
  1. 2014年11月20日 05:40 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する9(デバック)

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

今回は、前回実機で動作しなかったので、デバックを行う。使用するのは、Vivado logic Analyzer (Hardware manager) だ。
Vivado logic Analyzer は残念ながら、Vivado のWeb Packでは使用できない。Digilent のZYBOのWebサイトで、ZYBOと一緒に ZYBO Accessory Kit を購入すると、Voucher for Xilinx Vivado® Design Suite: Design Edition (One full seat, node locked, device-locked to the Zynq-7000 XC7Z010) がもらえて、ライセンスを取ると使えるようになる。
だいぶ途中の手順を抜いてあるので、(全部書くと大変なので)詳しい手順は、”Vivado 2013.4でAXI VDMAを使ったカメラ表示回路の作製15(ハードウェアのデバック3)”を参照下さい。

・V_ZYBO_CAMDfL ブロック・デザインを開いた。

・ブロック・デザインで、見たいネットを右クリックして、右クリックメニューからMark Debugを選択する。
ZYBO_Cam_Linux_60_141118.png

・mt9d111_inf_axi_master_0, bitmap_disp_cntrler_axi_master_0 のAXI4 Masterバスにデバック・マークを付けた。

・processing_system7_0 のM_AXI_GP0 ポートからAXI Interconnect に行っているネットにデバックマークを付けた。
ZYBO_Cam_Linux_59_141118.png

・ブロック・デザインをセーブした。

・Flow Navigator の Synthesis -> Run Synthesis をクリックして、論理合成をスタートした。

・論理合成が終了した。(ダイアログは出さないように設定している)

・Flow Navigator の Synthesis -> Synthesized Desgin をクリックして、Synthesized Design を表示させた。

・Tools メニューから Set up Debug... を選択した。
ZYBO_Cam_Linux_61_141118.png

・Set up Debugダイアログが表示された。Next >ボタンをクリックした。
ZYBO_Cam_Linux_62_141118.png

・何個かダイアログをデフォルトのまま進めると、Nets to Debug ダイアログが出てくる。
ZYBO_Cam_Linux_63_141118.png

・Clock Domain が赤くなって、undefined のところをすべて削除した。(一定の値なので、削除したが、値を見るためには残しておいたほうが良いかもしれない)

・Next >ボタンで進めていって、Summary が表示されたら、Finishボタンをクリックした。

・これで、・Flow Navigator の Program and Debug -> Generate Bitstream をクリックして、ビットストリームを生成した。
ZYBO_Cam_Linux_64_141118.png

・リソースの状況。Vivado logic Analyzer を入れたので、以前と比べてリソース使用量が増えている。
ZYBO_Cam_Linux_65_141118.png

・Vivado logic Analyzer を入れる前のリソース使用量。
ZYBO_Cam_Linux_39_141113.png

Zynq は、PS部が生きていないとFPGA(PL)のクロックも出ていないので、Vivado logic Analyzer を使うためには、一度、ARMプロセッサをブートする必要がある。今回は、PL部のデバックということで、SDKでベアメタル・アプリを作製してそこからデバックを行うことにした。

・SDKを立ちあげて、cam_dispプロジェクトを作った。(SDKはBOOT.bin の作製の時に立ちあげてある)
ZYBO_Cam_Linux_66_141118.png

・ZYBOの電源をONした。

・SDKでビットストリームをダウンロードし、ソフトウェアを起動しておく。
ZYBO_Cam_Linux_67_141118.png

・cam_disp のRun Configuration を作製して、Runした。これで PL にクロックが供給された。
ZYBO_Cam_Linux_68_141118.png

・Flow Navigator からOpen Hardware Manager を立ち上げる。

・Hardware Manager が立ち上がった。Open a new hardware target をクリックした。

・Open Hardware Target ダイアログが表示された。Next >ボタンをクリックした。

・Hardware Server Settings を設定する。Local server のデフォルトのまま、Next >ボタンをクリックした。

・Select Hardware Target を設定する。デフォルトのまま、Next >ボタンをクリックした。

・Summary が表示された。Finishボタンをクリックした。

・Hardware Managerが起動して、ILAが見えた。
ZYBO_Cam_Linux_69_141118.png

・mt9_inf_axi_master_0_M_AXI_AWVALID == R (立ち上がり)でトリガを掛けたが、掛からなかった。カメラのAXI4 Master Write 出ていないようだ。
ZYBO_Cam_Linux_70_141118.png

・PSのAXI4 Lite Slave アクセス、各IPのレジスタ Write は思い通りに行っているようだ。
ZYBO_Cam_Linux_71_141118.png

少なくとも、mt9d111_inf_axi_master_0 のAXI4 Lite Slave 番地 0x43C10000 番地に 0x18000000 を書いているので、カメラのデータをDDR3 SDRAMに書いても良さそうなので、もう一度シミュレーションを確かめてみる。

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

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

ZYBOのUbuntuで使用するエディタを gvim にしました

ZYBOのUbuntu14.04LTS で使用するエディタを何にしようかいろいろとやってみました。

今は gedit 使っているんですが、単語の補完ができないので、とっても不便です。プラグインを入れれば大丈夫そうですが、プラグインの入れ方が分かりませんでした。

次に、kate を apt-get install で入れました。とってもライブラリをたくさんインストールしましたが、libEG.so.1 がオープンできないと言われて起動しなかったので、削除しました。
ZYBO_EM_Linux_157_141116.png

次に、gvim をインストールすることにしました。 apt-get install gvim でインストールしようとしたら、3つあると言われました。

vim-gtk 2:7.4.052-1ubuntu3
vim-athena 2:7.4.052-1ubuntu3
vim-gnome 2:7.4.052-1ubuntu3


その内の、vim-gtk をインストールしました。
ZYBO_EM_Linux_158_141116.png

vim-gtk をインストールしても、起動するコマンドは gvim でした。
CTRL+p で補完もできるし便利です。
ZYBO_EM_Linux_159_141116.png
  1. 2014年11月16日 05:48 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

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

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する6(BOOT.BINの生成)”の続き。

前回、BOOT.BIN を生成したので、今回は、devicetree.dtb を生成する。

・まずは、以前のドライバと区別するために、/home/masaaki/ZYBO/Digilent_Linux_Tutrial/drivers3 ディレクトリを作製した。

・Linux-Digilent-Dev/arch/arm/boot/dts/zynq-zybo.dts を drivers3 ディレクトリにコピーした。
ZYBO_Cam_Linux_53_141115.png

・zynq-zybo.dts を gedit で開いて、Vivado 2014.3.1 の V_ZYBO_CAMDfL143 でインスタンスしたAXIスレーブIPを generic-uio として追加した。割り込みは行わない。

        bitmap_display_cntrler_axim@43c00000 {
            compatible = "generic-uio";
            reg = < 0x43c00000 0x10000 >;
        };
        mt9d111_inf_axim@0x43c10000 {
            compatible = "generic-uio";
            reg = < 0x43c10000 0x10000 >;
        };
        mt9d111_axi_iic@0x41600000 {
            compatible = "generic-uio";
            reg = < 0x41600000 0x10000>;
        };
        frame_buffer_bmdc@0x17800000 {
            compatible = "generic-uio";
            reg = < 0x17800000 0x1000000>;
        };

ZYBO_Cam_Linux_54_141115.png

・後のzynq-zybo.dts の変更点は、”ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する3(UIOの設定)”と”ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する4(UIOの設定2)”を引き継ぐ。

../Linux-Digilent-Dev/scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb zynq-zybo.dts コマンドで、zynq-zybo.dts を dtc でコンパイルして、devicetree.dtb を生成した。
ZYBO_Cam_Linux_58_141115.png

・出来上がった BOOT.bin と devicetree.dtb をSDカードの同じ名前のファイルと入れ替えた。

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

・Linuxがブートして、Ubuntuが立ち上がった。
ZYBO_Cam_Linux_55_141115.png

・ls /dev/uio* コマンドを実行すると、uio が4つできていた。
ZYBO_Cam_Linux_56_141115.png

・linaro 一般ユーザーで入って、cd /sys/devices; cd amba.0 コマンドを実行すると、17800000.frame_buffer_bmdc、41200000.mt9d111_axi_iic、43c00000.bitmap_display_cntrler_axim、43c10000.mt9d111_inf_axim が見えた。
ZYBO_Cam_Linux_57_141115.png

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する8(実機でテスト)”に続く。
  1. 2014年11月15日 05:20 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する6(BOOT.BINの生成)

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する5(インプリメント)”の続き。

前回、カメラ表示システムのインプリメントまで終了した。今回は、BOOT.BINを生成する。

・ハードウェアをエクスポートする。Vivado 2014.3.1 で、File メニューから Export -> Export Hardware を選択した。

・Export Hardware ダイアログが表示された。Include bitstream がチェックされていないので、チェックしてから、OKボタンをクリックした。
ZYBO_Cam_Linux_40_141113.png

・File メニューから Launch SDK を選択した。

・Launch SDK ダイアログが表示された。
ZYBO_Cam_Linux_41_141113.png

・SDKが起動した。カメラ・コントローラIP (mt9d111_inf_axi_master_0) とビットマップ・ディスプレイ・コントローラIP (bitmap_disp_cntrler_axi_master_0) も表示されている。
ZYBO_Cam_Linux_42_141113.png

・FSBLプロジェクトを作製する。

・SDKで、File メニューから New -> Application Project を選択した。
ZYBO_Cam_Linux_43_141113.png

・New Project ダイアログが表示された。Project Name に FSBL と入力して、Next > ボタンをクリックした。
ZYBO_Cam_Linux_44_141114.png

・Templates 画面で、Zynq FSBL を指定して、Finish ボタンをクリックした。
ZYBO_Cam_Linux_45_141114.png

・FSBLフォルダとFSBL_bspフォルダが作られて、自動でビルドされた。
ZYBO_Cam_Linux_46_141114.png

・FSBLフォルダを右クリックして、右クリックメニューから Create Boot Image をクリックした。
ZYBO_Cam_Linux_47_141114.png

・Create Zynq Boot Image ダイアログが表示された。すでに、FSBLとビットストリームはイメージに入っていた。Addボタンをクリックして、u-bootを追加する。
ZYBO_Cam_Linux_48_141114.png

・Browseボタンをクリックして u-boot.elf を追加して、OKボタンをクリックした。(u-boot.elf の生成方法については、”ZYBO用のEmbedded Linux チュートリアル5(U-Bootのビルド)”を参照下さい)
ZYBO_Cam_Linux_49_141114.png

・File path の3番目に、u-boot.elf が入った。これで終了なので、Create Image ボタンをクリックした。
ZYBO_Cam_Linux_50_141114.png

・BOOT.BIN ブート・イメージが生成された。
ZYBO_Cam_Linux_51_141114.png

・BOOT.BINは、V_ZYBO_CAMDfL143\V_ZYBO_CAMDfL143.sdk\FSBL\bootimage に生成された。
ZYBO_Cam_Linux_52_141114.png

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

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する5(インプリメント)

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する4(ブロック・デザイン)”の続き。

前回で、ブロック・デザインが完成したので、今回は論理合成と制約の追加、インプリメントを行う。

・SourcesウインドウのV_ZYBO_CAMDfL を右クリックして、右クリックメニューから Create HDL Wapper... を選択した。

・Create HDL Wapper ダイアログが表示された。そのまま、OKボタンをクリックした。

・V_ZYBO_CAMDfL_wrapper.v が生成された。mt9d11_iic の scl と sda の iobuf も自動的に生成された。
ZYBO_Cam_Linux_37_141113.png

・Flow Navigaotr の Synthesis -> Run Synthesis をクリックして、論理合成を行った。

・論理合成が成功した。
ZYBO_Cam_Linux_31_141112.png

・インプリメントとビットストリームの生成が終了した。
ZYBO_Cam_Linux_38_141113.png

・FFの使用率は8%、LUTの使用率は14% だった。
ZYBO_Cam_Linux_39_141113.png

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する6(BOOT.BINの生成)”に続く。
  1. 2014年11月12日 20:38 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する4(ブロック・デザイン)

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

前回はカメラ・コントローラIPが出来たので、それとビットマップ・ディスプレイ・コントローラIPを組み込んだブロック・デザインを作製する。

なお手順は端折るところが多々ありますので、詳しい手順は以下のリンクをご覧ください。

”ZYBO用ビットマップ・ディスプレイ・コントローラの作製1(ブロック・デザイン1)”
”ZYBO用ビットマップ・ディスプレイ・コントローラの作製2(ブロック・デザイン2)”
”ZYBO用ビットマップ・ディスプレイ・コントローラの作製3(ブロック・デザイン3)”


・最初に、Vivado 2014.3.1 のプロジェクトを作製した。ZYBOに使用しているFPGAチップの型番は xc7z010clg400-1 なので、それ用のプロジェクト V_ZYBO_CAMDfL143 を作製した。
ZYBO_Cam_Linux_15_141111.png

・V_ZYBO_CAMDfL143 フォルダに、カメラ・コントローラIP (cam_inf_d111fl) とビットマップ・ディスプレイ・コントローラIP (BMDispCaL) をコピーした。
ZYBO_Cam_Linux_16_141111.png

・カメラ・コントローラIPのフォルダ内には、”ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する3(IP化)”の最後の xilinx.com_user_mt9d111_inf_axi_master_1.0.zip を展開した内容をコピーした。
ZYBO_Cam_Linux_17_141111.png

・IP Catalog を表示して、右クリックメニューのIP Settings... を選択した。

・カメラ・コントローラIP (cam_inf_d111fl) とビットマップ・ディスプレイ・コントローラIP (BMDispCaL)をAdd Repository...ボタンをクリックして追加した。
ZYBO_Cam_Linux_18_141111.png

・V_ZYBO_CAMDfL ブロック・デザインを作製した。
ZYBO_Cam_Linux_19_141111.png

・ZYNQ Processing System をブロック・デザインに追加して、ZYBOの設定(ZYBO_zynq_def.xml)を読み込んだりして設定を行った。
ZYBO_Cam_Linux_20_141111.png

・Clock Configuration で、FCLK_CLK1 をビットマップ・ディスプレイ・コントローラIP用に 25MHz に設定した。

・Clock Configuration で、FCLK_CLK2 をカメラ・コントローラIP用に 36MHz に設定した。
ZYBO_Cam_Linux_21_141111.png

・ZYNQ processing_system7_0 に Run Block Automation を行った。
ZYBO_Cam_Linux_22_141111.png

・ビットマップ・ディスプレイ・コントローラIP(bitmap_disp_cntrler_axi_master_v1_0) とカメラ・・コントローラIP(mt9d111_inf_axi_master_v1_0) をAdd IP して、Run Connection Automation をクリックしたところ。ダイアログが出てきた。S_AXI_LITEを接続できるようだ。
ZYBO_Cam_Linux_23_141111.png

・AXI Interconnect と Processer System Reset が追加されて自動的に配線してくれた。とっても楽だ。
ZYBO_Cam_Linux_24_141111.png

・processing_system7_0 をダブルクリックして、ダイアログを表示させた。

・ダイアログで、PS-PL Configuration をクリックして、HP Slave AXI Interface を展開し、S AXI HP0 interface にチェックを入れた。
ZYBO_Cam_Linux_25_141111.png

・processing_system7_0 にS_AXI_HP0, S_AX_HP0_FIFO_CTRL が追加された。

・Run Connection Automation をクリックした。

・Run Connection Automation ダイアログが表示された。全てにチェックを入れてOKボタンをクリックした。
ZYBO_Cam_Linux_26_141111.png

・axi_mem_inter con (AXI Interconnect) が追加されて、チェックを入れたAXIバスのポートが接続された。
ZYBO_Cam_Linux_27_141111.png

・入力ポート、出力ポート、残っている配線を行って、ブロック・デザインを完成させた。(2014/11/13:追記 まだ未完成でした。AXI IICを追加するのを忘れていました)
ZYBO_Cam_Linux_28_141111.png

・AXI_IICを追加した。(2014/11/13:追記
ZYBO_Cam_Linux_33_141113.png 

Run Connection Automation をクリックした。

・Run Connection Automationダイアログが表示された。全てにチェックを入れた。
ZYBO_Cam_Linux_34_141113.png 

・AXI_IIC関連の配線がすべて配線された。
ZYBO_Cam_Linux_35_141113.png 

・ブロック・デザイン完成。
ZYBO_Cam_Linux_36_141113.png 

・Validate Desin を実行したところ成功した。
ZYBO_Cam_Linux_29_141111.png

・Address Editor タブの状況。問題無さそうだ。
ZYBO_Cam_Linux_30_141111.png

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

いわい将門ハーフマラソン、映画『トワイライト ささらさや』を見てきました

昨日は、いわい将門ハーフマラソンでした。10kmに夫婦でエントリーしたんですが、私は腰痛のため棄権しました。奥さんは出たんですが、雨に降られたそうです。10kmで50分11秒で50歳代女性で10位だったそうです。後で、具合が悪くなりましたが、今日は良くなりました。
高校時代からの友人が、石下のカカシ大会でグランプリを受賞したということだったので、午前中に授賞式を見に行ってきました。生憎の雨でしたが授賞式はやってましたよ。作品名はスズメバチだそうです。良くできてました。
suzumebachi_141110.jpg

午後から夫婦で映画に行ってきました。つくばイオンで、映画『トワイライト ささらさや』を見てきました。
チープな映画で、遠景で電車が走っているシーンが模型感アリアリでしたが、最後は良かったですよ。ベタな話でしたが、こういうのも良いもんです。
  1. 2014年11月10日 20:55 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する3(IP化)

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する2(IPのシミュレーション)”の続き。

前回は、以前に作ってあったカメラ・コントローラIPを1フレームの画像をキャプチャして止めて置けるように改造して、シミュレーションを行った。今回は出来上がったカメラ・コントローラIPのIP化を行う。
例によって、お馴染みの行程なので、キャプチャ図は割愛する。キャプチャ図をふんだんに使ったIP化の記事は、”VivadoでZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP4(IP化)”辺りを参照のこと。

・Toolsメニューから Create and Package IP... を選択した。

・Create And Package New IPダイアログが立ち上がった。Next >ボタンをクリックした。

・Package your projectのラジオボタンが選択されていたので、そのまま、Next >ボタンをクリックした。

・Package your project の Packaging IP in the Project の Include .xci files が選択されていた。これは、最初にIPコアを生成する場合に選択するそうだ。そのまま、Next >ボタンをクリックした。

・New IP Creation が表示された。Finish ボタンをクリックした。

・Finish Packaging successfully ダイアログが表示された。OKボタンをクリックした。

・Package IP ウインドウが表示された。

・IP Identification が表示されている。Vender display name と Company url を入力した。Vivado 2014.3.1 では、デフォルトの Categories は/UserIP となっている。以前は、/BaseIP だった。
ZYBO_Cam_Linux_3_141110.png

・ Compatibility 画面、以前は IP Compatibility 画面だったので、名称が変更されている。IPはすべて抜いたようだ。
ZYBO_Cam_Linux_4_141110.png

・File Groups 画面。
ZYBO_Cam_Linux_5_141110.png

・Customization Parameters 画面。
ZYBO_Cam_Linux_6_141110.png

・ Ports and Interface 画面。
ZYBO_Cam_Linux_7_141110.png

・Addressing and Memory 画面では、s_axi_lite のアドレス範囲が表示されている。512バイトなので狭すぎる気もするがそのままとした。
ZYBO_Cam_Linux_8_141110.png

・Customization GUI 画面。これも以前は、IP GUI Customization 画面だった。
ZYBO_Cam_Linux_9_141110.png

・Package IP 画面のReview and Package から edit package settings をクリックする。
ZYBO_Cam_Linux_10_141110.png

・After Packageing で Create archive of IP にチェックを入れる。
ZYBO_Cam_Linux_11_141110.png

・Review and Package 画面で、Package IP ボタンをクリックして、IPを作製した。
ZYBO_Cam_Linux_12_141110.png

・Finished packaging successfully. ダイアログが出た。OKボタンをクリックした。

・IP生成後の Vivado 2014.3.1 の画面。Sources ウインドウに、IP-XACTにcomponet.xml ができているのが見える。
ZYBO_Cam_Linux_13_141110.png

・xilinx.com_user_mt9d111_inf_axi_master_1.0.zip が生成された。
ZYBO_Cam_Linux_14_141110.png

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

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する2(IPのシミュレーション)

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する1(準備編)”の続き。

以前作ったZedBoard用カメラ・コントローラIPを流用した。pixel_fifo はその通りにIP Catalog の FIFO Generator で生成した。

mt9d111_axi_lite_slave.v にレジスタを作って、機能を追加した。

オフセット0番地: フレーム・バッファの先頭アドレス

はもう実装されていたので、それを使用した。

オフセット4番地: 0 ビット目が 0 の時動画、0 ビット目に 1 の時に、ワンショットで取得した1フレームのカメラ画像を表示
            1 ビット目に 1 を Write した時に、ワンショットで1フレームの画像をフレーム・バッファに保存

を実装した。
”1 ビット目に 1 を Write した時に、ワンショットで1フレームの画像をフレーム・バッファに保存”という仕様なので、つまり、1 が書かれている時に 1 を書いてもワンショットパルスを出す仕様なのだ。それでステートマシンが長くなってしまった。AXIバスはアドレス転送とデータ転送が分かれているので、それでも大丈夫なようにステートマシンを組んだつもりだ。
オフセット4番地の 0 ビット目の値は、one_shot_state に割り当てた。
オフセット4番地の 1 ビット目に 1 を書いた時のワンショット・パルスは、one_shot_trigger に割り当てた。
そのコードを仕手に示す。

    // one_shot_reg
    always @(posedge aclk) begin
        if (reset)
            one_shot_reg <= 32'd0;    // default is continuous display mode
        else
            if (s_axi_lite_wvalid==1'b1 && s_axi_lite_awaddr[2]==1'b1)
                one_shot_reg <= s_axi_lite_wdata;
    end
    assign one_shot_state = one_shot_reg[0];

    // one_shot_tsm(State Machine for one_shot_trgger)
    always @(posedge aclk) begin
        if (reset) begin
            one_shot_tsm <= IDLE_TSM;
            one_shot_trigger <= 1'b0;
        end else begin
            case (one_shot_tsm)
                IDLE_TSM :
                    if (s_axi_lite_awvalid & awready & s_axi_lite_awaddr[2]) begin // one_shot_reg address
                        if (s_axi_lite_wvalid) begin // s_axi_wready is always 1
                            if (s_axi_lite_wdata[1]) begin // one_shot was triggered
                                one_shot_tsm <= ONE_SHOT_TRIG;
                                one_shot_trigger <= 1'b1;
                            end else begin // is not trigger
                                one_shot_tsm <= IDLE_TSM;
                                one_shot_trigger <= 1'b0;
                            end
                        end else begin // s_axi_lite_wvalid is not asserted
                            one_shot_tsm <= WAIT_ONE_SHOT;
                            one_shot_trigger <= 1'b0;
                        end
                    end
                WAIT_ONE_SHOT :
                    if (s_axi_lite_wvalid) begin // s_axi_wready is always 1
                        if (s_axi_lite_wdata[1]) begin // one_shot was triggered
                            one_shot_tsm <= ONE_SHOT_TRIG;
                            one_shot_trigger <= 1'b1;
                        end else begin // is not trigger
                            one_shot_tsm <= IDLE_TSM;
                            one_shot_trigger <= 1'b0;
                        end
                    end
                ONE_SHOT_TRIG : begin
                    one_shot_tsm <= ONE_SHOT_HOLD_OFF;
                    one_shot_trigger <= 1'b0;
                end
                ONE_SHOT_HOLD_OFF :
                    if (!awready) begin
                        one_shot_tsm <= IDLE_TSM;
                        one_shot_trigger <= 1'b0;
                    end
            endcase
        end
    end


mt9d111_cam_cont.v に mt9d111_axi_lite_slave.v から入力される one_shot_state, one_shot_trigger の入力ポートを追加した。one shot state machine を作って、one_shot_state がアサートされてもも、frame_valid がディアサートされるまでは画面を描画するようにした。また、one_shot_trigger がアサートされた時は、frame_valid がディアサートされるまで待っていて、1画面をチャプチャするようになっている。(つもりだ)
下に、one shot state machine を示す。(角ハイボールで酔っ払っている時に作ったので、間違っているかも?w)

    // one shot state machine
    // frame_valid_1d_oh を生成する
    always @(posedge pclk) begin
        if (preset) begin
            one_shot_sm <= IDLE_OS;
            frame_valid_1d_oh <= frame_valid_1d;
        end else begin
            case (one_shot_sm)
                IDLE_OS :
                    if (one_shot_state) begin
                        one_shot_sm <= WAIT_FRAME_VALID_END;
                        frame_valid_1d_oh <= frame_valid_1d;
                    end
                WAIT_FRAME_VALID_END :
                    if (!frame_valid_1d) begin
                        one_shot_sm <= HOLD_PICTURE;
                        frame_valid_1d_oh <= 1'b0;
                    end
                HOLD_PICTURE :
                    if (one_shot_trigger) begin
                        one_shot_sm <= WAIT_FRAME_VALID_LOW;
                        frame_valid_1d_oh <= 1'b0;
                    end else if (~one_shot_state & ~frame_valid_1d) begin
                        one_shot_sm <= IDLE_OS;
                        frame_valid_1d_oh <= frame_valid_1d;
                    end
                WAIT_FRAME_VALID_LOW :
                    if (!frame_valid_1d) begin
                        one_shot_sm <= WAIT_FRAME_VALID_HIGH;
                        frame_valid_1d_oh <= frame_valid_1d;
                    end
                WAIT_FRAME_VALID_HIGH :
                    if (frame_valid_1d) begin
                        one_shot_sm <= WAIT_FRAME_VALID_END;
                        frame_valid_1d_oh <= frame_valid_1d;
                    end
            endcase
        end
    end

(2014/11/12:追記 上の2つの Verilog HDL コードにはバグがありました。詳しくは、”ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する10(デバック2)”を参照して下さい)

シミュレーションを行った。最初は、カメラのピクセル値をDDR3 SDRAMへWrite するためのAXI4 Write Transction だ。
ZYBO_Cam_Linux_1_141109.png

AXI4 Lite Slave に設けたレジスタをテストするのに下の様なスティミュラスを作った。

        // Add stimulus here
        @(posedge ACLK);    // 次のクロックへ
        #DELAY;
        AXI_MASTER_WADC1(32'h0000_0000, 32'h1200_0000);
        @(posedge ACLK);    // 次のクロックへ
        #DELAY;
        AXI_MASTER_RADC1(32'h0000_0000);
        #DELAY;
        
        @(posedge ACLK);    // 次のクロックへ        
        #DELAY;
        AXI_MASTER_WADC2(32'h0000_0004, 32'h0000_0001);    // one_shot mode
        @(posedge ACLK);    // 次のクロックへ        
        #DELAY;
        AXI_MASTER_RADC2(32'h0000_0004);
        
        @(posedge ACLK);    // 次のクロックへ        
        #DELAY;
        AXI_MASTER_WADC2(32'h0000_0004, 32'h0000_0003); // one_shot trigger
        @(posedge ACLK);    // 次のクロックへ        
        #DELAY;
        AXI_MASTER_RADC2(32'h0000_0004);
    end
            
    // Write Transcation 1
    task AXI_MASTER_WADC1;
        input    [C_S_AXI_LITE_ADDR_WIDTH-1:0]    awaddr;
        input    [C_S_AXI_LITE_DATA_WIDTH-1:0]    wdata;
        begin
            s_axi_lite_awaddr    = awaddr;
            s_axi_lite_awvalid    = 1'b1;
            
            @(posedge ACLK);    // 次のクロックへ
            #DELAY;
            
            s_axi_lite_awvalid = 1'b0;
            s_axi_lite_wdata = wdata;
            s_axi_lite_wvalid = 1'b1;
            @(posedge ACLK);    // 次のクロックへ, s_axi_lite_wready は常に 1
            
            #DELAY;
            s_axi_lite_wvalid = 1'b0;
            s_axi_lite_bready = 1'b1;
            
            @(posedge ACLK);    // 次のクロックへ
            #DELAY;
                
            s_axi_lite_bready = 1'b0;
        end
    endtask

    // Write Transcation 2
    task AXI_MASTER_WADC2;
        input    [C_S_AXI_LITE_ADDR_WIDTH-1:0]    awaddr;
        input    [C_S_AXI_LITE_DATA_WIDTH-1:0]    wdata;
        begin
            s_axi_lite_awaddr    = awaddr;
            s_axi_lite_awvalid    = 1'b1;
            
            @(posedge ACLK);    // 次のクロックへ
            #DELAY;
            
            s_axi_lite_awvalid = 1'b0;
            s_axi_lite_wdata = wdata;
            s_axi_lite_wvalid = 1'b1;
            @(posedge ACLK);    // 次のクロックへ, s_axi_lite_wready は常に 1
            
            #DELAY;
            s_axi_lite_wvalid = 1'b0;        
            @(posedge ACLK);    // 次のクロックへ
            
            #DELAY;        
            s_axi_lite_bready = 1'b1;
            
            @(posedge ACLK);    // 次のクロックへ
            #DELAY;
                
            s_axi_lite_bready = 1'b0;
        end
    endtask
    
    // Read Transcation 1    
    task AXI_MASTER_RADC1;
        input    [31:0]    araddr;
        begin
            s_axi_lite_araddr    = araddr;
            s_axi_lite_arvalid     = 1'b1;
            @(posedge ACLK);    // 次のクロックへ
            #DELAY;
            
            s_axi_lite_araddr    = 0;
            s_axi_lite_arvalid     = 1'b0;
            s_axi_lite_rready = 1'b1;

            @(posedge ACLK);    // 次のクロックへ
            #DELAY;

            s_axi_lite_rready = 1'b0;
        end
    endtask


そのシミュレーションを下に示す。one_shot_state が 1 にアサートされて、ワンショット・パルス one_shot_trigger も1クロックだけアサートされているのを見て欲しい。
ZYBO_Cam_Linux_2_141109.png

frame_valid がディアサートされて、one_shot_state が 1 にアサートされた時に、画像が保持されるのをシミュレーションで見ていないが、シミュレーションをすると長いので、実機で確かめることにする。

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

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する1(準備編)

ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する8(ZYBOで動作確認2)”で、16MBのCMA領域をUIOで確保して、キャラクタを表示することができた。
ツィッターで、CMA領域はDMAなどのバッファ領域として使われるので危ないんじゃないのか?というご指摘を頂いたが、たしかにその通りだと思う。まともに使うのであれば、ドライバを作るか?ドライバを作らないまでも、カーネルでCMA領域を確保して、確保したアドレスにUIOでアクセスすれば良いと思う。
ドライバなどを作らないといけないという状況は重々承知の上で、CMA領域の先頭番地から使っていても、とりあえずは問題ないので、より問題の少ないと思われる真ん中くらいのアドレスを使って、カメラ・コントローラを実装してカメラ画像を Linaro Ubuntu の動作する ZYBO で表示してみたい。

最初に、”ZYBO用カメラ表示回路の作製6(デバック2、完成)”で出来上がったカメラ・コントローラIPを利用して、少し仕様を変更しようと思う。

まずは、ビットマップ・ディスプレイ・コントローラIPと同様にフレーム・バッファ領域との先頭アドレスをレジスタに入れておくために32ビット幅のAXI Lite Slave インターフェースを追加する。
次に、AXI Lite Slave インターフェースで設定できる機能を追加しようと思う。具体的には連続的な動画だけでなく、1ショットで1フレームだけキャプチャする機能を付け加えようと思う。

オフセット0番地: フレーム・バッファの先頭アドレス
オフセット4番地: 0 ビット目が 0 の時動画、0 ビット目に 1 の時に、ワンショットで取得した1フレームのカメラ画像を表示
            1 ビット目に 1 を Write した時に、ワンショットで1フレームの画像をフレーム・バッファに保存

上記の仕様でカメラ・コントローラIPを作ろうと思う。

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する2(IPのシミュレーション)”に続く。
  1. 2014年11月06日 04:31 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

PocketDuinoが来ました

PocketDuino Alcohol sensor kitを購入しました”で indiegogo で購入した PocketDuino が昨日来ました。IRキットも購入したと思うのですが、これは後日となっています。
またおもちゃが増えてしましました。。。
こんなパッケージで来ました。
PocketDuino_1_141105.jpg

PocketDuino のアップです。ATMELのMEGA328Pが載っています。
PocketDuino_2_141105.jpg

アルコールセンサーです。
PocketDuino_3_141105.jpg

楽しみですね。。。

Android にPoketDuino で心拍センサを付けて、ランニングの加速度と速度、心拍を同時に測定してみたいです。
  1. 2014年11月05日 04:59 |
  2. マイコン関連
  3. | トラックバック:0
  4. | コメント:0

Edison を無線LANに接続

Edison のファームウェアの更新”でEdison のファームウェアを更新出来たので、今度はEdison を無線LANに接続した。

Edison を無線LANに接続する際に参考にさせて頂いたWebサイトは、”Intel Edisonを手に入れたらやること(ウィンドウズの場合)”と”Edison開発方法”だった。ありがとうございました。

最初にプラネックスのBLW-04GM という無線LANに接続しようとした。これは古い無線ルーターだが、他にルーターがあるため、その下で無線のアクセス・ポイントとして使用している。なお、ニンテンドーDSを無線LAN接続するのにWEP を使用している。今はニンテンドーDSも無いのだが、そのまま使用している。
WEPキーには16進数を使用しているが、Edison では、5または8 キャラクタのアスキー・コードで入力するようになっていた。BLW-04GM は16進数入力だったので、アスキー・コードに無いコードがあって、アスキー・コードに変換できない。
BLW-04GM をアスキー・コードにある文字列で再設定してみたが、設定変更ができなかった。
なお、configure_edison --wifi コマンドで設定を行った。
Edison_13_141103.png

無線LANは息子用のが余っていたので、ロジテックのLAN-WH300AN/DGR を使用することにした。
LAN-WH300AN/DGRの設定を行った。アクセス・ポイントの設定にして、ANとBGNの設定を行った。
設定が終了して、また、configure_edison --wifi コマンドで設定を行ったが設定が失敗した。
失敗しているメッセージやネットの情報などによるとどうやら、/etc/wpa_supplicant/wpa_supplicant.conf に原因があるようだ。早速、wpa_supplicant.conf を見ると、接続できないBLW-04GM の設定が2つも残っている。
Edison_22_141104.png

この設定を削除した。(もしくは、wpa_supplicant.conf.original ファイルがあるので、 wpa_supplicant.conf を一旦削除して、これを wpa_supplicant.conf として、コピーしてもよいと思う)
もう一度、configure_edison --wifi コマンドで設定を行ったところ、成功した。
Edison_14_141103.png

パソコンのChrome から、192.168.3.73 を見たところ表示が見えた。
Edison_15_141103.png

Edison開発方法”に従って、”5. Edisonを最新にする”にする操作を行った。

まずは、opkg と言うパッケージマネージャのリストを更新した。
Edison_16_141103.png

次に、ダウンロードしたコンフィグファイルを移動した。
Edison_17_141103.png

opkg update を行った。
Edison_18_141103.png

okg upgrade を行った。
Edison_19_141103.png

opkg install git コマンドで git をインストールした。次に git コマンドを実行する。
Edison_20_141103.png

git コマンドを実行した。
Edison_21_141103.png


ここ5日ほど、Edison が無線LANに接続できなくて悩んでいたのだが、うまく行って本当に良かった。。。
  1. 2014年11月04日 05:20 |
  2. Edison
  3. | トラックバック:0
  4. | コメント:4

Edison のファームウェアの更新

この所、Edison の設定で悩んでいます。いろいろとやってみたんですが、Wifi の設定でどうしても設定することができません。
Wifi を認識できなくて、どうしても設定することができません。どうやらファームウェアをアップデートするれば良いことがわかり、アップデートしようとネットを探してやってみましたが、できませんでした。
そうこうするうちに SWITCHSCIENCE さんの”Intel Edisonを手に入れたらやること”が出てきたので、”Intel Edisonを手に入れたらやること(ウィンドウズの場合)”の場合を参考にやってみたのですが、自分のパソコンのIPアドレスを 192.168.2.2 に設定して、192.168.2.15 にTera Term で SSH ログインしようとしてもできません。
そこで、FTDI社のサイトから VCP Driver をダウンロードしてインストールしました。当然、Windows Driver setup 1.0.0 もインストールしました。
この状態で、Edison へのコマンドは、COMポートで Edison に接続した Tera Term 上から行いました。 これが私の場合には一番良い方法でした。

uname -a コマンドでデフォルトの状態のバージョンです。Aug 20 でした。(COMポートで Edison に接続した Tera Term を使用しています)
Edison_8_141102.png

Edison - Software Downloads ページから Edison Yocto complete image をダウンロードして、Edison のフォルダに入れたところ。
Edison_9_141102.png

reboot ota コマンドを入力しました。
Edison_10_141102.png

リブート途中。やってます。やっとファームウェアをアップデートすることができそうです。
Edison_11_141102.png

Edison のLinuxが立ち上がって、もう一度、uname -a コマンドを入力したところです。Oct 14 バージョンにアップデート出来ました。
Edison_12_141102.png

ふう~。やれやれ、やっと Edison のファームウェアをアップデートできた。。。

しかし、Edison の Wifi 接続で、”Password must be either 5 or 13 characters.”と言われて困っています。
家はニンテンドーDS のWifi のためにWEP接続なんですが、WEPキーの入力には、アスキー・キャラクタ入力と16進入力あるそうです。Edison のWifi で要求されているのは、アスキー・キャラクタ入力だそうです。
家では16進数で入れてます。アスキー・キャラクタにした時に無い文字があるんですが、どうしたら良いのでしょうか?
アスキー・キャラクタに合うようにコードを変えますか。。。もしくはWPAにしますかね?
Edison_13_141103.png
  1. 2014年11月03日 04:13 |
  2. Edison
  3. | トラックバック:0
  4. | コメント:0