FPGAの部屋

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

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

2014年11月

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

これを解消したいと思って、いろいろとやってみたがうまく行かなかった。
a94d2051.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

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


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

追記
xserver-xorg よりも adjtimex を remove したほうが効いた気がする。
sudo apt-get remove adjtimex

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

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

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

operating-points = <666667 1000000 333334 1000000>;

に設定してある。
104e0b26.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 だった。
92cc7303.png


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


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

そこで、

operating-points = <650000 1000000 >;

のみにしてみた。
61870ca3.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 コマンドの時刻があっているのがわかる。
30abc340.png

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 で表示した結果は以下の通りだった。
da41ac26.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つのコマンドとも時刻が取れない。
c3b12d3f.png


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

ZYBO用Ubuntu Linuxの時計のずれ2(解決編)”に続く。

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 コマンドで、顔認証を行ったところ、認識された。
ff223727.jpg


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

顔認証は成功したが、よく見てみると、何かおかしい。拡大してみるとおかしい様子がわかるはずだ。
2d02cdab.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つひっくり返すことになる。

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


拡大してみた。
60103cdf.jpg


結構スムーズになっていると思う。これで問題無さそうだ。
ZYBOのUbuntu上でカメラ画像をBMPファイルに変換できた”の disp2bmp.c は修正した。

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

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


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


これで結構便利になる。

↑このページのトップヘ