« 2017年11月 | トップページ | 2018年1月 »

2017.12.31

2017年を振り返って

皆様、特電を応援していただき、今年も1年間ありがとうございました。

今年は、新しいスタッフが3人も入ってくれて、よい1年でした。

何をやっていたのかを思い出してみます。

  • 1月
    • CosmoKというPCI Express基板に非DMAで読み書き
    • 1GspsADC基板のJESD2014B信号のデコード
    • Cosmo-Kの新バージョン(RTC搭載、電源強化など)
    • Cosmo-KのDDRメモリの速度が上がらない理由の調査
  • 2月
    • 某レーダーのための信号処理回路開発
    • UltraScaleボードの輸入
    • 基板チョコレート
  • 3月
    • 応物学会と物理学会への出展
    • CSIやHDMIてんこもりのFPGAボード(Cosmo-K DVI)
    • 某レーダーの仕事で手一杯
  • 4月
    • Cosmo-Zの18bit版の性能評価
    • ハードウェアFFTの改良
    • 残りの時間はDVIボードにRasPiカメラをつないだり、某レーダーの仕事

    • 5月
      • 某レーダーの仕事を納品
      • ZYNQのUbuntu化をはじめる
      • 1GspsADCボードの波形デコード
      • PCI ExpressのDMAをはじめる。まだ不安定。
    • 6月
      • 1Gsps ADCボードの精度が出なくて悩む
      • ハードウェアFFTの納品
      • DVIボードでHDMIの入出力ができるようになる
    • 7月
      • はじめてFPGAの勉強会に参加
      • XILINX Virtual Cable(XVC)のサーバを作る
      • 1Gsps ADCボードの精度が出なくて悩む
      • Artix-7でハードウェアイーサネット
    • 8月
      • PCI Express用DMAのデバイスドライバを本気で作り始める
      • 特電の製品箱が更新される
      • セキュリティキャンプの講師をする
      • Webサイトのデザイン更新
      • MITOUJTAG BASICが累計1000台出荷
    • 9月
      • Cosmo-Zの1Gsps ADC拡張基板を開発
      • PCIe-Kintex7-DDR3メモリのDMA転送に成功
    • 10月
      • Cosmo-Zの1Gsps ADC拡張基板で波形が取れるようになった
      • ZYNQ LinuxにPythonやJupyterを入れる。Pythonの力に気付き始める。
      • Cosmo-Zのライブラリ2.0の開発開始
      • Cosmo-Z Miniの開発開始
      • 新しいMPPCアレイが出来てくる
    • 11月
      • Cosmo-Z Miniの開発
      • ZYNQ Linuxの探求。USB、WiFi、RTCの使い方など。
      • 光るLEDチカチカハンドスピナー
      • ET2017出展
    • 12月
      • はじめてのZYNQ&Trenzセミナー開催
      • 1Gspaの拡張ADCボードで綺麗な波形が取れるようになる
      • ZYNQでリッチなLinuxを動かす方法の確立
      • 新しいショッピングカートの開発スタート
      • ZynqBerryスタータキットの発表

    という感じでした。

    中でも注力した大きなことは、

    • ZYNQでリッチなLinuxを動かせるようになった
    • 1GspsのADCボードが動作するようになった
    • PCI ExpressのDMAを完璧に行えるようになった

    ということだったのではないかと思います。

    受託開発として反省するところは、簡単に終わると思っていた某レーダーの仕事が、開発要件をよく読むと、仕様書をぱっと見てわかることの何倍もあって(様々な条件を掛け算していって、場合の数が非常に多い)、5月ごろまでかかってしまいました。これで大幅に予定が遅れてしまいました。大きな仕事は専属の人を雇って、それなりの予算を客先に要求しないとだめだということを痛感しました。

    また、今年は初めてFPGAの勉強会に参加し、自分でもZYNQの勉強会を開催しました。informationとexformation。情報を入れたり出したりすることを続けていきたいですね。

    それから、今年1年はデザインにこだわりました。ホームページのデザインを変更しただけでなく、特電の商品箱がシンプルな白無地のものだったのを、デザインで6面フルカラー印刷のかっこよい箱に変わりました。また、開発途上ではありますが、今後の計測/ADC製品は専用のアルミケースと一緒に基板を設計していこうと思いました。そんな考えを具現化したものがCosmo-Z Miniです。

    中途半端に終わってしまって心残りなのはCosmo-Zの新ライブラリです。これは正月休みに続きを作りたいと思います。

    では、来年もよろしくお願いします。

    | | コメント (0)

    2017.12.30

    ZYNQのLinuxでWiFiを使う方法

    ZYNQのUbuntu Linux 12あるいは14でWiFiを使う方法を説明します。

    ZynqBerryで試していますが、おそらくほかのボードでも同じでしょう。

    この手順を試す前に、必要なパッケージを入れておきます。おそらく最初の2つはデフォルトで入っていると思いますが、wicd-cursesは便利なツールなので、ぜひ入れておくとよいでしょう。

    apt-get install wireless-tools
    apt-get install wpasupplicant
    apt-get install wicd-curses

    対応している無線LANアダプタ

    ZYNQのLinuxにUSB WiFiドングルを挿したとき、ほとんどのものは認識されないでしょう。

    私が試した限りでは、

    がZYNQ Ubuntu Linuxで無事に認識できました。しかし、WLI-UC-GNM2Sのほうは動かしていると数分で落ちてしまうので、発熱などの問題があるのではないかと思われます。(実際にコールドスプレーで冷やし続けると何分でも動く)

    Wsnano2Wli

    (画像はAmazonより)

    なお、下記のものも試したのですが、私の知識不足のため、動作させることはできませんでした。iwconfigでwlan0が見つかりません。

    • Wavlink WIFI 無線LAN子機 AC600 https://www.amazon.co.jp/dp/B019DDP2B6/
    • エレコムWDC-150SU2MBK https://www.amazon.co.jp/dp/B00JTSF7DY/
    • TP-Link TL-WN725N https://www.amazon.co.jp/dp/B008IFXQFU/
    • DIZA100 https://www.amazon.co.jp/dp/B074CWPVRY/

    結局のところGW-USNano2がベストという結果になりました。

    Zbwifi

    ファームウェアを入れる

    Linuxで無線LANを使うには、デバイスドライバのほかにファームウェアというものが必要になります。無線LANのファームウェアというのが実際に何なのかはよくわかりませんが、バイナリファイルで、中身を見てもARMのプログラムっぽくはないようです。

    まず、gitでファームウェアを取ってきます。

    git clone http://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git

    そして、

    cp linux-firmware/rt*.bin /lib/firmware/
    cp -R linux-firmware/rtlwifi /lib/firmware/

    で、ファームウェアをいろいろコピーします。無線LANのファームウェアは、ファイルシステムの/lib/firmwareというところに入れておくようですね。

    WiFiの設定

    手順としては、

    1. iwconfigで認識されるかの確認
    2. iwlist scanでアクセスポイントが見えるかの確認
    3. wpa_passphraseでwpa_supplicant.confを作成する
    4. /etc/network/interfacesを編集する
    5. wpa_supplicantで接続してみる

    となります。

    iwconfigで見てみる

    iwconfigとやったとき、wlan0が(もしくはwlan1、wlan2・・)が見えていれば、認識はされています。ドライバ(*.ko)が組み込まれていないと、このwlan0が出ません。

    Zynqwifi1

    iwlist scanをやってみる

    iwlist scanというコマンドで、どんな無線LANのアクセスポイントが使えるかが見えるはずです。

    Zynqwifi3

    wpa_supplicant.confを作成

    $ wpa_passphrase myid mypass 

    で、ESSIDとパスフレーズの組を作ります。例えば、ZYNQAPというSSIDと、zynqberryというパスフレーズなら、

    $ wpa_passphrase ZYNQAP zynqberry

    とします。

    Zynqwifi2

    この結果の文字列を利用して/etc/wpa_supplicant/wpa_supplicant.confを作ります。一般によく使われているWPA2-PSKでAESの場合、proto=RSN、key_mgmt=WPA-PSK、pairwise=CCMP、group=CCMPと書いておきます。

    network={
          ssid="ZYNQAP"
          #psk="zynqberry"
          psk=c4c9b76402b20db5681188dc7049f9f39760fbb1c473c53987f8369272b46e28
          proto=RSN
          key_mgmt=WPA-PSK
          pairwise=CCMP
          group=CCMP
    }

    また、#pskの行は暗号化前のパスフレーズが書かれているので、消したほうがよいでしょう。

    /etc/network/interfacesを編集する

    次に、/etc/network/interfacesを編集して、以下の記述を追記します。

    auto lo
    iface lo inet loopback
    auto wlan0
    iface wlan0 inet dhcp
    wpa-conf /root/wpa_supplicant.conf
    

    wpa_supplicantで接続してみる

    設定ファイルとは別に、wpa_supplicantという実行ファイルがあり、以下のようにすると接続の試験ができます。

    $ wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf &

    最後に&を付けておかないと、このコマンドの中で処理がブロックされてしまい、他のことができなくなります。

    このファイルを実行したときに、ioctl[SIOCSIWFREQ]: Device or resource busyと出るかもしれませんが、特に問題はないようです。

    Zynqwifi4

    root@zynqberry:~#  wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf &
    [1] 23384
    root@zynqberry:~# ioctl[SIOCSIWENCODEEXT]: Invalid argument
    ioctl[SIOCSIWENCODEEXT]: Invalid argument
    
    root@zynqberry:~# Trying to associate with **:**:**:**:**:** (SSID='ZYNQAP' freq=2462 MHz)
    ioctl[SIOCSIWFREQ]: Device or resource busy
    Association request to the driver failed
    Associated with **:**:**:**:**:**
    WPA: Key negotiation completed with **:**:**:**:**:** [PTK=CCMP GTK=CCMP]
    CTRL-EVENT-CONNECTED - Connection to **:**:**:**:**:** completed (auth) [id=0 id_str=]
    
    root@zynqberry:~# iwconfig
    wlan0     IEEE 802.11  ESSID:"ZYNQAP"
              Mode:Managed  Frequency:2.462 GHz  Access Point: **:**:**:**:**:**
              Bit Rate=150 Mb/s   Tx-Power=20 dBm
              Retry short limit:7   RTS thr=2347 B   Fragment thr:off
              Encryption key:off
              Power Management:off
              Link Quality=60/70  Signal level=-50 dBm
              Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
              Tx excessive retries:0  Invalid misc:4   Missed beacon:0
    
    sit0      no wireless extensions.
    
    eth0      no wireless extensions.
    
    lo        no wireless extensions.
    

    これで無線LANが接続できることがわかったら、再起動してください。あとはDHCP接続で自動的にIPアドレスが取得され、ZYNQでWiFiが使用できるようになるはずです。

    | | コメント (0)

    2017.12.29

    ZYNQ LinuxのUbuntuを入れた後の作業

    ZynqBerryまたはGigaZeeにUbuntu Linux 12.11を入れて、リッチなLinux環境の構築をする方法を説明します。

    XILINXのWikiにある「RAMDISKで作るLinux」はシンプルすぎます。パッケージも管理できないし、名前解決にnmbdも使えません。この章ではLinaro Ubunuを使用してリッチなLinuxを作る方法を説明します。

    なお、ZynqBerryについてはこちらのページをご覧ください。

    新しいSDカードの準備

    まず、新しいSDカードを用意します。

    開発用のホストPC(Linux。仮想マシンで可)でgpartedを実行し、第一パーティションを64MB程度のfat32で、第二パーティションを5GB程度のext4で作成します。

    Linaro Ubuntuのダウンロード

    次に、下記のURLからLinaro Ubuntuをダウンロードします。

    https://releases.linaro.org/archive/12.11/ubuntu/precise-images/

    12.11というと少し古いように感じますが、このバージョンが安定しています。Ubuntu-desktopの中のlinaro-precise-ubuntu-desktop-20121124-560.tar.gzをダウンロードします。

    第1パーティションに入れるもの

    下記のファイルをWindows上でコピーします。

    • BOOT.bin (ZynqBerryの場合は不要)
    • uImage
    • devicetree.dtb
    • uEnv.txt
    • u-boot.rgba  (起動画面を出すための画像ファイル)

    第2パーティションに入れるもの

    第2パーティションには、ルートファイルシステムを入れます。具体的には、ubuntu-desktopのlinaro-precise-ubuntu-desktop-20121124-560.tar.gzをダウンロードして解凍したものを入れますが、単純にgunzipとtarで解凍するのではなく、下記のようにします。

    sudo tar --strip-components=3 -C /(マウント先) -xzpvf linaro-precise-ubuntu-desktop-20121124-560.tar.gz binary/boot/filesystem.dir

    インストール後の作業

    SDカードが出来上がったら、ZynqBerryを起動します。デフォルトでは基本的に何もないので、いろいろと必要なものをインストールします。

    時刻の設定

    ただし、その前にZynqBerryを起動したら、ntpdate ntp.nict.jpでネットワーク経由で時刻を合わせるか、date -s “2017-12-29 23:45:00″のようにして時刻を設定します。そうしないと、今後の作業で作るファイルの日付が1970になってしまい、わからなくなってしまいます。

    パッケージ情報を最新に

    最初に、

    apt-get update
    apt-get upgrade
    apt-get dist-upgrade

    を行って、apt-getやパッケージを最新の状態にします。

    タイムゾーンの設定

    デフォルトではUTCになっているので、

    ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

    とやって、日本時刻が適用されるようにします。

    各種ツールのインストール

    人によって好みはあると思いますが、

    apt-get install ssh
    apt-get install emacs
    apt-get install httpd
    apt-get install samba

    などを入れておくとよいでしょう。sambaを入れると、nmbdが一緒に入り、Windowsから容易に名前解決できるようになります。

    emacsの設定

    また、emacsを入れた直後はバックスペースが効きません。バックスペースが使えるようにするには、.emacsファイルを作成し、

    (keyboard-translate ?\C-h ?\C-?)
    (global-set-key (kbd "C-h") 'delete-backward-char)

    と記述しておきます。

    ホスト名の設定

    vi /etc/hosts
    vi /etc/hostname

    でホスト名を設定しておきます。

    avahi-daemonのアンインストール

    avahi-daemonというパッケージがデフォルトで有効になっています。これはLinux等で使われる名前解決のしくみなのですが、Windowsはこのプロトコルに応答しないため、TeraTermなどでSSH接続する際にとても応答が遅くなってしまいます。

    apt-get remove avahi-daemon

    module.depの作成

    以下のコマンドでmodule.depを作成しておきます。

    mkdir /lib/modules/4.9.0-xilinx-00051-gb450e90/
    touch /lib/modules/4.9.0-xilinx-00051-gb450e90/modules.dep

    apt-keyのインストール

    作業をしていると、どこかで

    W: There is no public key available for the following key IDs:

    というエラーが出ることがあります。以下のコマンド

    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32

    を入力し、鍵をインストールします。

    起動の高速化

    Ubuntuは起動する際にネットワークがつながっていなかったりすると、

    Waiting for network configuration
    Waiting up to 60more seconds for network configuration

    というメッセージが出て、最初に60秒、そしてまた60秒間、待たされます。

    これは/etc/init/failsafe.confというファイルで

        # The point here is to wait for 2 minutes before forcibly booting
        # the system. Anything that is in an "or" condition with 'started
        # failsafe' in rc-sysinit deserves consideration for mentioning in
        # these messages. currently only static-network-up counts for that.
    
            sleep 20
    
        # Plymouth errors should not stop the script because we *must* reach
        # the end of this script to avoid letting the system spin forever
        # waiting on it to start.
            $PLYMOUTH message --text="Waiting for network configuration..." || :
            sleep 40
    
            $PLYMOUTH message --text="Waiting up to 60 more seconds for network configuration..." || :
            sleep 59
            $PLYMOUTH message --text="Booting system without full network configuration..." || :

    などと、sleepが記述されていることが原因です。

    つまり、/etc/init/failsafe.confの中にあるsleep60を短くしてしまえば起動が早くなります。

    しかし、このsleepが実行される原因は、/etc/udev/rules.d/70-persistent-net.rulesというファイルにあります。

    root@zynqberry:~# cat  /etc/udev/rules.d/70-persistent-net.rules
    # This file was automatically generated by the /lib/udev/write_net_rules
    # program, run by the persistent-net-generator.rules rules file.
    #
    # You can modify it, as long as you keep each rule on a single
    # line, and change only the value of the NAME= key.
    
    # USB device 0x2019:0xab2a (usb)
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="**:**:**:**:**:**", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0"
    

    のようになっているので、、# USB device以降の部分を消してしまうというのも手です。

    Ubuntu 14.04へのアップグレード

    Ubuntu12では物足りない、という人はUbuntu14にアップグレードしてください。

    上記の作業を行ったのち、

    do-release-upgrade

    でアップグレードできます。

    その後、

    apt-get update
    apt-get upgrade

    を行いますが、依存関係が壊れているので、

    apt-get -f install

    で修復します。

    ここまでの作業でアップグレードは完了です。

    Ubuntu14にすると、自動的にいろいろなパッケージがアップグレードされていて、特にPython3がインストールされているなど、好印象です。

    しかし、Ubuntu14.04にするとGUI画面でのログインができなくなるため、GUIが重要なアプリケーションを作る場合は避けたほうが良いでしょう。

    | | コメント (0)

    2017.12.28

    仕事納め

    今年の仕事納めは、和光市にある某研究所でした。

    Wako

    Cosmo-Zの機能や拡張についていろいろお話をしてきました。

    ライブラリのアップグレードが全然進んでいませんね、という話になって、申し訳ございませんということになりました。

    この年末年始に少し進めます。

    | | コメント (0)

    2017.12.26

    ZynqBerryスタータキットを発売します

    この2か月ほどの間、寝ても覚めてもZYNQ Linuxをビルドしてきました。

    FSBLから始まり、U-Boot、Linuxカーネル、デバイスツリー、WiFiの有効化、Ubuntu、HDMI出力・・・そんな成果をまとめた「ZynqBerryスタータキット」を発売することにしました。

    Zbstart

    見ての通り、RaspBerry PiのケースにZynqBerryを入れたもので、SDカードやACアダプタなどの付属品を一式揃えたものなのですが、

    • ZynqBerryのオンボードROMに、boot.binが書き込み済み
    • Ubuntu Linuxが起動するSDカードを添付

    という特電オリジナルのオールイン・ワン・キットです。

    ZYNQでLinuxを始めてみたいけど、開発環境のセットアップや、ソフトウェアをインストールする時間がない・・という方向けです。

    ちなみに、ZynqBerryはオンボードのSPI ROMからしか起動できません。SDブートができないので、SPI ROMにboot.binを書き込む必要があります。しかし、困ったことにZynqBerryのSPI ROMに書き込むためにはXILINX SDKやVivado、Trenz社のプロジェクトファイルなど様々なアプリやデータをインストールしなければならず、結構な手間と手順を理解するための時間がかかります。

    そんな手間を省き、SDカードからすぐに起動できるようにしたのがこのキットです。

    また、FSBLやU-Boot、LinuxのビルドについてもPetaLinuxやYoctoLinuxを使わずに、見える手順でビルドしています。何がどうなっているかがは、すべてクリーンで明確化されています。

    OSには一番安定して動くLinaro 12.11を入れています。

    Zbstart3_2

    実用的かどうかはわかりませんが、HDMI出力も使えてデスクトップも表示できるので、モニタとマウスとキーボードをつなげばネットサーフィンもできます。

    Zbstart2_2

    ただし、GPUは積んでいないので描画は遅いです。パソコンやRasPiの代わりではなく、FPGA搭載のサーバとして使ったり、ZYNQでLinuxをビルドするための練習に使うのが良いかと思います。

    一般に、ZYNQのLinux環境を構築するには膨大な知識と手間が必要で、手順書通りにやっても2日以上かかりますが、このスタータキットなら5分でできます。ビルドで失敗して時間を無駄にすることもありません。

    そこで、「Trenz&ZYNQセミナー」の資料をまとめて、どのようにしてこのFSBLやU-Bootを作ったかをまとめた「ZYNQでLinuxが動くまで」という小冊子を先着20名様に差し上げることにいたしました。

    ZynqBerryオリジナルスタータキットの製品情報はこちらです。

    https://www.trenz.jp/product/zbstart/

    どうぞよろしくお願いします。

    | | コメント (1)

    2017.12.25

    第2回 Zynq&Trenzセミナーを開催します

    「第2回 Trenz社ZYNQボード活用セミナー」を開催します。

    Zbgz

    このセミナーでは、PetaLinuxやYoctoLinuxを使わないZYNQ Linuxのビルド方法をお伝えします。

    主な内容は

    • GigaZee(TE0720)のハードウェア
    • ZynqBerry(TE0726)のハードウェア
    • スクリプトベースのVivado活用法
    • FSBLへのパッチ
    • U-Bootの構築
    • 何もないところからのXILINX Linux Kernelの構築
    • デバイスツリーの書き方と各項目の意味
    • USBとWiFiを開放する
    • Ubuntu Linuxでリッチな環境
    • HDMI出力とデスクトップ
    • 独自IPのためのドライバ作成

    です。

    12月13日に行われた「第1回目のセミナー」の反省点を踏まえ、ハンズオンの時間をしっかりと確保します。

    まず、セミナーのはじめに本編資料(数百ページのスライド)のURLをお伝えし、15分ほどで概要を説明した後、基本的には各自で作業していただきます

    セミナー講師は、随時、質問等への対応を行います。

    なお、当日の時間を有効にご利用いただくために、ノートパソコンに開発環境のセットアップをお願いします。資料URLは別途お伝えします。スライドの一部は事前にお見せします。

    ◆開催概要◆

    • 日時 1月10日(水)14:00~17:00
    • 場所 秋葉原駅前(電気街口) 
          新秋葉原ビル 3階 秋葉原駅前会議室

    お申込みは「こくちーず」のサイトで行います。

    http://kokucheese.com/event/index/501674/

    12月27日(水)の正午から申込み受付開始で、1月5日(金)の正午まで受け付けております。(早期終了の可能性あり)

    定員は15名ですが、応募者多数の場合は抽選とさせていただきます。

    抽選の基準としては、

    1. 前回のセミナーにお申込みいただいたけど、定員オーバーとなって受講できなかった方
    2. 該当製品をご購入いただいた方、購入予定の方
    3. それ以外の方

    という優先順位とさせていただきます。

    何卒ご了承くださいませ。

    | | コメント (0)

    2017.12.17

    見積システムを開発しています

    見積システムというのを作っています。

    これはショッピングカートのようなものなのですが、見積書を出すことに特化しています。

    Est1

    「カートへ」を押すと、だいたいショッピングカートのような感じで進行していくのですが、

    Est2

    目的は、このような見積書を表示することにあります。

    Est3

    Webアプリケーションの中でPDFを作成しているので、ブラウザ内で印刷用のPDFを表示したり、メールでPDFを送ることができます。

    Est4

    ショッピングカートの前身のような感じですね。

    いずれ、オンラインショップに発展させたいと考えています。

    | | コメント (0)

    2017.12.15

    ZynqBerryでUbuntu Linuxを動かす

    ZynqBerryでLinuxを動かすための情報を公開します。

    ◆FSBLの構築

    ZynqBerryは、フレームバッファというしくみを使ってHDMIに画像表示を行います。この機能を有効にするにはFSBLにパッチを当てる必要があります。そのパッチを含めたFSBLのソース一式は、Trenz社からダウンロードしたプロジェクトアーカイブのsw_apps\zynq_fsbl\srcディレクトリにあるのですが、ps7_init.cとps7_init.hは間違っているようなので、これを使ってはいけません。

    やり方としては、XSDKで新規にFSBLのプロジェクトを作成し、sw_apps\zynq_fsbl\srcからps7_init.cとps7_init.h以外を持ってくることになります。

    また、

    #define FSBL_DEBUG_INFO
    

    は、付けた方がよいでしょう。

    Trenz社から提供されたZYNQ Berry用のU-Bootと、新しいFSBLで起動した画面を下の図に示します。

    Zb_fsbl

    ◆U-Bootの構築

    ZynqBerryで普通にU-Bootを起動すると、MMCのclockがどうので止まってしまいます。それを回避しても、GEMがない、と止まってしまいます。さらにはSPI ROMから起動しようとして、非常に遅いメモリコピーをした挙句に、起動イメージがないと出ます。

    U-Bootで改変しなければならない箇所は

    • sdhci0ではなく、sdhci1を使うようデバイスツリーを変える
    • defconfigのCONFIG_ZYNQ_GEMをnにする
    • serial0とserian1を入れ替える
    • memoryの範囲を<0x0 0x1F700000>にする

    また、board.cというソースのboard_late_init()という関数を書き換えます

    int board_late_init(void)
    {
        switch ((zynq_slcr_get_boot_mode()) & ZYNQ_BM_MASK) {
            case ZYNQ_BM_QSPI:
            setenv("modeboot", "sdboot");
    //      setenv("modeboot", "qspiboot");
            break;
    ・・・

    U-Bootは、SPI ROMからZYNQが起動したら、SLCRというレジスタを読んでSPI BOOTであることを調べ、LinuxのイメージもSPI ROM上にあると想定した動作を行います。この修正を行うことで、SPI ROMから起動しても、SDカードからLinuxイメージを読み込むようになります。

    下のリストは、FSBLとU-Bootが起動したときのメッセージです。

    Xilinx First Stage Boot Loader
    Release 2017.1  Dec 15 2017-16:06:19
    Devcfg driver initialized
    Silicon Version 3.1
    Boot mode is QSPI
    Single Flash Information
    FlashID=0x1 0x20 0x18
    SPANSION 128M Bits
    QSPI is in single flash connection
    QSPI Init Done
    Flash Base Address: 0xFC000000
    Reboot status register: 0x60480000
    Multiboot Register: 0x0000C000
    Image Start Address: 0x00000000
    Partition Header Offset:0x00000C80
    Partition Count: 3
    Partition Number: 1
    Header Dump
    Image Word Len: 0x0003DC28
    Data Word Len: 0x0003DC28
    Partition Word Len:0x0003DC28
    Load Addr: 0x00000000
    Exec Addr: 0x00000000
    Partition Start: 0x000085D0
    Partition Attr: 0x00000020
    Partition Checksum Offset: 0x00000000
    Section Count: 0x00000001
    Checksum: 0xFFF3E346
    Bitstream
    In FsblHookBeforeBitstreamDload function
    PCAP:StatusReg = 0x40000A30
    PCAP:device ready
    PCAP:Clear done
    Level Shifter Value = 0xA
    Devcfg Status register = 0x40000A30
    PCAP:Fabric is Initialized done
    PCAP register dump:
    PCAP CTRL 0xF8007000: 0x4C00E07F
    PCAP LOCK 0xF8007004: 0x0000001A
    PCAP CONFIG 0xF8007008: 0x00000508
    PCAP ISR 0xF800700C: 0x0802000B
    PCAP IMR 0xF8007010: 0xFFFFFFFF
    PCAP STATUS 0xF8007014: 0x00000A30
    PCAP DMA SRC ADDR 0xF8007018: 0xFC021741
    PCAP DMA DEST ADDR 0xF800701C: 0xFFFFFFFF
    PCAP DMA SRC LEN 0xF8007020: 0x0003DC28
    PCAP DMA DEST LEN 0xF8007024: 0x0003DC28
    PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
    PCAP MBOOT 0xF800702C: 0x0000C000
    PCAP SW ID 0xF8007030: 0x00000000
    PCAP UNLOCK 0xF8007034: 0x757BDF0D
    PCAP MCTRL 0xF8007080: 0x30800100
    ...................................................................................................
    DMA Done !
    
    FPGA Done !
    In FsblHookAfterBitstreamDload function
    Partition Number: 2
    Header Dump
    Image Word Len: 0x0001CB48
    Data Word Len: 0x0001CB48
    Partition Word Len:0x0001CB48
    Load Addr: 0x04000000
    Exec Addr: 0x04000000
    Partition Start: 0x00046200
    Partition Attr: 0x00000010
    Partition Checksum Offset: 0x00000000
    Section Count: 0x00000001
    Checksum: 0xF7F639B6
    Application
    PCAP:StatusReg = 0x40000F30
    PCAP:device ready
    PCAP:Clear done
    PCAP register dump:
    PCAP CTRL 0xF8007000: 0x4C00E07F
    PCAP LOCK 0xF8007004: 0x0000001A
    PCAP CONFIG 0xF8007008: 0x00000508
    PCAP ISR 0xF800700C: 0x00030004
    PCAP IMR 0xF8007010: 0xFFFFFFFF
    PCAP STATUS 0xF8007014: 0x00000F30
    PCAP DMA SRC ADDR 0xF8007018: 0xFC118801
    PCAP DMA DEST ADDR 0xF800701C: 0x04000001
    PCAP DMA SRC LEN 0xF8007020: 0x0001CB48
    PCAP DMA DEST LEN 0xF8007024: 0x0001CB48
    PCAP ROM SHADOW CTRL 0xF8007028: 0xFFFFFFFF
    PCAP MBOOT 0xF800702C: 0x0000C000
    PCAP SW ID 0xF8007030: 0x00000000
    PCAP UNLOCK 0xF8007034: 0x757BDF0D
    PCAP MCTRL 0xF8007080: 0x30800110
    ...................................................................................................
    DMA Done !
    Handoff Address: 0x04000000
    In FsblHookBeforeHandoff function
    FSBL: Enabling VTC..
    FSBL: Enabling Out VDMA at 0x1FC00000..
    FSBL: Enabling In  VDMA at 0x1F700000..
    SUCCESSFUL_HANDOFF
    FSBL Status = 0x1
    
    
    U-Boot 2017.01-00014-g5fa7d2e-dirty (Dec 15 2017 - 16:34:59 +0900)
    
    Model: TrenzElectronic TE0726-03M ZynqBerry (U-Boot by Tokuden 1.0)
    Board: Xilinx Zynq
    I2C:   ready
    DRAM:  ECC disabled 503 MiB
    MMC:   sdhci@e0101000: 0 (SD)
    SF: Detected s25fl128s_64k with page size 256 Bytes, erase size 64 KiB, total 16 MiB
    *** Warning - bad CRC, using default environment
    
    In:    serial@e0001000
    Out:   serial@e0001000
    Err:   serial@e0001000
    Model: TrenzElectronic TE0726-03M ZynqBerry (U-Boot by Tokuden 1.0)
    Board: Xilinx Zynq
    Net:   No ethernet found.
    reading uEnv.txt
    115 bytes read in 8 ms (13.7 KiB/s)
    Importing environment from SD ...
    Hit any key to stop autoboot:  0
    Berry> usb start
    starting USB...
    USB0:   USB EHCI 1.00
    scanning bus 0 for devices... 4 USB Device(s) found
           scanning usb for storage devices... 0 Storage Device(s) found
    Berry> usb info
    1: Hub,  USB Revision 2.0
     - u-boot EHCI Host Controller
     - Class: Hub
     - PacketSize: 64  Configurations: 1
     - Vendor: 0x0000  Product 0x0000 Version 1.0
       Configuration: 1
       - Interfaces: 1 Self Powered 0mA
         Interface: 0
         - Alternate Setting 0, Endpoints: 1
         - Class Hub
         - Endpoint 1 In Interrupt MaxPacket 8 Interval 255ms
    
    2: Hub,  USB Revision 2.0
     - Class: Hub
     - PacketSize: 64  Configurations: 1
     - Vendor: 0x0424  Product 0x9514 Version 2.0
       Configuration: 1
       - Interfaces: 1 Self Powered Remote Wakeup 2mA
         Interface: 0
         - Alternate Setting 0, Endpoints: 1
         - Class Hub
         - Endpoint 1 In Interrupt MaxPacket 1 Interval 12ms
         - Endpoint 1 In Interrupt MaxPacket 1 Interval 12ms
    
    3: Vendor specific,  USB Revision 2.0
     WDC-150SU2M ?凪i}・己O
     - Class: (from Interface) Vendor specific
     - PacketSize: 64  Configurations: 1
     - Vendor: 0x056e  Product 0x4008 Version 0.0
       Configuration: 1
       - Interfaces: 1 Bus Powered Remote Wakeup 500mA
         Interface: 0
         - Alternate Setting 0, Endpoints: 3
         - Class Vendor specific
         - Endpoint 1 In Bulk MaxPacket 512
         - Endpoint 2 Out Bulk MaxPacket 512
    
    

    usb startとusb infoでUSBデバイスのj情報が取得できていることがわかります。

    ◆Linuxの構築

    Linuxの構築はセミナーで説明したとおりにやれば、USBやWiFiが使えるようになりますが、それに加えてHDMI出力を有効にするために、Drivers→Graphics Support→Frame Buffer Driversの中のSimple framebuffer supportを有効にします。

    Fb

    これで画像出力対応になります。

    これで、Linuxの起動時にペンギンの絵が出るようになります。

    Linuxfb

    ◆リッチなLinuxの構築

    まずは、Linaro Ubuntuのイメージをとってきます。

    http://www.tokudenkairo.co.jp/cosmoz/files/cosmoz-ubuntu12.img

    から、ZYNQ用のLinaro Ubuntu 12のイメージをとってきて、Win32DiskImagerでSDカードに書き込みます。

    そして、第一パーティションに、devicetree.dtb、u-boot.rgba、uEnv.txt、uImageを入れます。

    このSDカードで起動すれば、ZynqBerryでLinaro Ubuntu 12が起動するはずです。

    そうしたら、/etc/resolv.confを削除し、/etc/hostnameを書き換えてホスト名を決めてください。そして、決めたホスト名が127.0.0.1をさすように/etc/hostsも設定してください。

    127.0.0.1       zynqberry

    Linuxが起動したときの画面を下の図に示します。

    Zb_linux

    こうして、めでたくZynqBerryでリッチなUbuntu Linux 12が起動します。

    コンソールからも使えますが、キーボードやマウス、HDMIをなぐとパソコンのようになります。

    Zb_linux1 Zb_linux2

    フレームバッファというのは単純にメモリの内容を画像として出力するだけのもので、アクセラレータもないので、とても遅いです。GUIでさわるともっさりもっさりした動作ですが、RaspBerry Pi2くらいの速度は出ているように思えます。コンソールからのアクセスならばそんれほど遅さは感じません。

    ビルド済みのBoot.binは下記のURLにアップロードしました。

    また、Linuxの起動に必要なビルド済みのSDカード内容は下記のURLにアップロードしました。

    Ubuntu Linuxのイメージはこちらです。

    これで、ZYNQで動くリッチなLinuxがご堪能いただけると思います。

    | | コメント (4)

    2017.12.14

    火鍋

    ◆これから書く

    | | コメント (1)

    2017.12.13

    Trenz&ZYNQセミナーを開催しました

    秋葉原の駅前のビルで、「Trenz製品&ZYNQセミナー」を開催しました。ご来場いただいた皆様、ありがとうございました。

    反省点としてはいっぱいあるのですが、とにかく時間が足りなくて、最初の1時間は早口で環境構築の話を説明してしまい、手を動かす時間がほとんどなかったことです。

    アンケートを行ったので、その結果を集計しました。

    まず、このセミナーにご来場いただいたのは19名、そのうちアンケートの提出が18名(無記名が4名)でした。

    ご参加いただいた目的のほとんどが、ZYNQでLinuxを動かすための情報を知りたかったとのことですが、目的を達成できたかどうかというと・・

    Tassei

    約50%の人が「はい」と答えてくれました。

    「いいえ」の人の理由を見てみると、やはり時間がなくて実際に試せなかったという意見が優勢でした。

    それから、このセミナーを少人数で、時間をかけて、テキストも配布するとしたら、いくらの価値があるかという質問は、

    Price

    半数の方が10000円と答えてくれました。今回のセミナーは無料だったので、印刷した資料を提供する余裕はなかったのですが、今後はサービス品質を向上させた有料のセミナーを目指していきたいですね。

    それから、満足度ですが、

    Satisfaction

    このように、不満と満足がほぼ半々でした。

    皆様からいただいた改善点や不満な点を挙げていくと、

    • 手を動かしている時間がない
    • ハンズオン形式でいっしょにやってみたかった
    • ZynqBerryでLinuxが起動できなかった
    • GigaZeeとZynqBerryという複数のHWがあるので混乱
    • アンケートをネットで記入できるようにしてほしい

    とう意見がありました。とにかく、急ぎすぎました。これは次回のセミナーでは改善したいと思います。

    また今回のセミナーでは紹介しなかったことを聞きたかったという意見では、

    • Linuxカーネル構築の詳細を知りたかった
    • 独自I/Oの作り方を知りたかった
    • PLアクセスの方法が知りたかった

    などがありました。このあたりは、今後のセミナーで検討していきます。

    最後に、皆様からいただいた良い意見で締めくくりたいと思います。

    • デバイスツリーのあたりが聞けて良かった
    • 無料でここまで対応してくれるのはすばらしい
    • 配布資料がとてもよかった
    • Linuxを立ち上げることができそうなところまで教えていただいた
    • Linuxを動かすための流れが一通りわかった
    • 説明だけでなく、実際に変更したファイルやビルド済みバイナリが公開されていた
    • 予習がしっかりやりやすい
    • 貴重な情報を共有していただき、ありがとうございます

    自己評価では40点くらいでした。

    次回のセミナーは、今回の反省点を踏まえて改善したものを、2018年1月10日(水)に開催します。12月20日(水)から受付を開始する予定ですので、皆様、どしどしご応募ください。

    | | コメント (2)

    2017.12.12

    GigaZeeでLinuxを動かす方法

    ◆あとで書く

    | | コメント (0)

    2017.12.10

    セミナー資料3章 Trenzボードの使い方

    13日に開催するZYNQ&Trenzセミナーの資料 第3章を公開します。

    ■ ZYNQ&Trenz製品セミナー第3章 PDF

    Sec3

    要約します。

    この手順を試すために必要なものは、

    • XILINX Vivado 2017.1または2017.2 (2017.2が推奨)
    • Trenz社のプロジェクトファイル

    です。

    USB-JTAGとVivadoからの認識

    まず、Trenz社のZYNQボードにはUSB-UART兼USB-JTAGが乗っています。このUSBのドライバは、パソコンに挿すだけでWindowsが勝手にドライバを探してインストールしてくれます。したがって、最初に挿したら1分ほど放置します。

    USB-JTAGのソフトウェアはDigilentからライセンスされているものを使用しているので、動作させるにはDigilent AdeptのRUNTIMEが必要です。Digilent AdeptのRUNTIMEは、

    <Vivadoをインストールしたディレクトリ>¥data¥xicom¥cable_drivers¥nt64¥di gilent

    にあります。

    Sec3_2

    Vivadoを起動して、Hardware Managerから認識されれば、成功です。xilinx_tcf/digilent の文字が出て、 ZYNQが認識されているはずです。

    Sec3_3

    もし、うまくいかない場合は、

    • Degilent adeptがインストールされていない
    • Vivadoのhw_server.exeがゾンビになっている
    • Vivadoよりも先にUSB-JTAG用のCOMポートを先に開いてしまっている

    という原因が考えられます。

    Vivadoプロジェクトの作成

    これができたら、Trenz社のプロジェクトをダウンロードします。

    Trenz社のプロジェクトは、Vivadoプロジェクト(xpr)ではなく、ソースコードやXML、Tclなどで与えられています。これを謎スクリプトを使って処理して、Vivadoプロジェクトを生成するというスタイルです。

    プロジェクトは、ZynqBerryGigaZee にあります。

    プロジェクトファイルをダウンロードし、解凍したら

    _create_win_setup.cmd

    を実行します。DOSプロンプトが現れるので、1を押します。

    様々なコマンドファイルが生成されるので、•design_basic_settings.cmdを開き、XILINXディレクトリへのパス、Vivadoのバージョン、を変更します。

    Sec3_4

    ボードの型番は、ZynqBerryは3、Gigazeeの1CFは5、GigaZeeの2IFは1です。それから、@set SWAPP=NAを@set SWAPP=u-bootにしておきます。

    Vivadoプロジェクトの作成

    また、Trenz社のプロジェクトは2017.1用に作られているので、 block_design¥zsys_bd.tcl を開き、25行目の

    set scripts_vivado_version 2017.1

    set scripts_vivado_version 2017.2

    に変更します。

    そして、vivado_create_project_guimode.cmdを実行すると、Vivadoのプロジェクトが生成されます。

    TclやVHDL、XMLのソースからバッチファイルでプロジェクトを自動生成して、GUIモードで開くさまは圧巻です。

    また、こういうボードの写真入りのプロジェクトを作るとか、芸が細かくてニクいですね。

    Sec3_5

    書き込み

    ZynqBerryやGigaZeeに書き込むには、program_flash_binfile.cmdを実行します。

    設定が正しければ、下の図のように書き込みが行われます。

    Sec3_6

    なお、Flash Operation Successfulと出ていれば、そのあとでエラーが出ていても問題ありません。

    そうでない場合の原因と対処法については、記事先頭のPDFファイルをご覧ください。

    | | コメント (0)

    2017.12.09

    Linuxカーネル3.17と4.9

    ◆あとで書く

    | | コメント (0)

    2017.12.08

    1GspsのADCボード

    特電のアルバイトさんが、Cosmo-Zに挿す1G ADCの拡張ボードとFPGAを作って、Pythonのキャプチャプログラムまで作ってくれました。

    Np1094_1

    当初のプリアンプも改造してくれて、設計どおりに450MHz付近で急峻に切れるLPFも動き、歪も少ない素晴らしい1Gsps 14bit 2chのADCに仕上がってきました。

    Cosmoz1g

    当初の特性は全然ダメで、歪も-40dBくらいあったように思えます。

    その原因は、広帯域可変ゲイン作動アンプにありました。シリアルでゲインを可変できるアンプだったのですが、こいつがすべての元凶でした。

    下の写真でジャンパでバイパスされているのが、可変ゲインアンプです。

    Np1094_2

    ただし、可変ゲインアンプと、1段目の作動アンプでは出力インピーダンスが違うようなので、発振してしまったり望の周波数特性が出なかったりという問題はありましたが、抵抗の値をうまく合わせることで所望の特性になったとのことです。

    1MHzの正弦波を1GHzでサンプリングした波形を示します。8個の波形が見えますが、1GHz 1chの波形を125MHz 8chにインターリーブしてFPGAに取り込んでいるためです。

    ZYNQ的には1GHzのクロックで信号は処理できませんが、125MHzで処理することは容易です。

    1mhz

    ↑8個の波形はほとんど重なっています。

    次の波形は10MHzの正弦波を1GHzでサンプリングしたものです。8個のチャネルが少しずつずれています。

    10mhz

    最後は100MHzの波形を1GHzでサンプリングしたものです。

    100

    ぐちゃぐちゃっとしていますが、つなげていけば、周期10の正弦波になっているのでしょう。

    | | コメント (0)

    2017.12.07

    ZYNQセミナーの資料 第1章

    12月13日に開催するZYNQ&Trenz製品セミナーの資料を公開します。

    以下の資料には、ノートPCにインストールしておくべきツールなどがまとめてあります。

    ZYNQ&Trenz製品セミナー1(PDFファイル)

    Sec1

    この資料の内容を以下に要約します。

    ① あらかじめ下記のツールをインストールしておいてください。

    • 仮想Linux環境(例:VirtualBOX + Ubuntu Linux 16)
    • XILINX SDK 2017.2
    • Vivado Lab Tools ←起動できず、動かないのでVivado本体が推奨
    • Vivado 2017.2
    • UbuntuでLinuxとU-bootをビルドするための追加パッケージ
    $ sudo apt-get install git git-email
    $ sudo apt-get install ncurses-dev
    $ sudo apt-get install lib32z1
    $ sudo apt-get install lib32ncurses5 lib32stdc++6
    $ sudo apt-get install device-tree-compiler
    $ sudo apt-get install u-boot-tools
    $ sudo apt-get install libssl-dev

    SDKのバージョンは2017.2がおすすめです。2017.3はarm-xilinx-linux-gnueabi-gccが入っていないので、現時点ではおすすめできません。

    LinuxにSDKをインストールし、TeraTermなどでコンソールを開いたら、U-Bootや、Linuxのビルドを行う前に以下のコマンドを打ちます。

    Vivado2017.1または2の場合は

    $ export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
    $ source /opt/Xilinx/SDK/2017.2/settings64.sh      ※2017.1の場合は1に変える

    Vivado2017.3の場合は

    $ export CROSS_COMPILE==arm-linux-gnueabihf-
    $ source /opt/Xilinx/SDK/2017.3/settings64.sh

    ソースコードの取得

    下記のソースコードが必要です。

    ① U-Bootのソース 

    まず、

    $ git clone git://github.com/Xilinx/u-boot-xlnx.git

    でソースを取ってきます。そして、

    $ cd u-boot-xlnx
    $ make zynq_zc702_config
    $ make

    で一通りコンパイルができるかどうかを確かめます。エラーが出たら、↑のPDFの資料を読んでください。

    ② XILINX Linuxのソース

    $ git clone git://github.com/Xilinx/linux-xlnx.git

    でソースを取ってきます。

    $ cd linux-xlnx
    $ make ARCH=arm xilinx_zynq_defconfig
    $ make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage
    

    で一通りコンパイルができるかどうかを確かめます。エラーが出たら、↑のPDFの資料を読んでください。

    ③ Trenz社のリファレンスデザイン

    Trenz社のWebサイトからリファレンスデザインをダウンロードします。URLは頻繁に変わるので、このURLは2017年12月現在のものです。

    | | コメント (0)

    2017.12.06

    UIOデバイスドライバを組み込む方法

    LinuxにUniversal I/Oというドライバがあります。ユーザモードでドライバを組むことができるというものだそうです。

    このドライバを使おうと思ったのですが、デバイスツリーに

            uio@b8800000 {
                compatible = "generic-uio";
                reg = <0xb8800000 0x1000>;
                interrupt-parent = <0x3>;
                interrupts = <0x0 0x1d 0x4>;
            };

    のように書くだけでは組み込まれないようでした。

    uioドライバの一番元のやつはuio_pdrv_genirq.cというファイルのようですが、

    Uio1

    ソースを見てみると、

    static const struct dev_pm_ops uio_pdrv_genirq_dev_pm_ops = {
    	.runtime_suspend = uio_pdrv_genirq_runtime_nop,
    	.runtime_resume = uio_pdrv_genirq_runtime_nop,
    };
    
    #ifdef CONFIG_OF
    static struct of_device_id uio_of_genirq_match[] = {
    	{ /* This is filled with module_parm */ },
    	{ /* Sentinel */ },
    };
    MODULE_DEVICE_TABLE(of, uio_of_genirq_match);
    module_param_string(of_id, uio_of_genirq_match[0].compatible, 128, 0);
    MODULE_PARM_DESC(of_id, "Openfirmware id of the device to be handled by uio");
    #endif
    
    static struct platform_driver uio_pdrv_genirq = {
    	.probe = uio_pdrv_genirq_probe,
    	.remove = uio_pdrv_genirq_remove,
    	.driver = {
    		.name = DRIVER_NAME,
    		.pm = &uio_pdrv_genirq_dev_pm_ops,
    		.of_match_table = of_match_ptr(uio_of_genirq_match),
    	},
    };
    

    となっていて、match文字列がありません。

    つまり、デバイスツリーにcompatible = "generic-uio";の記述を追加するだけではこのドライバは読み込まれないようです。

    UIOドライバが読み込まれるようにするには2つの方法があります。

    • デバイスドライバのソースを書き換えて、uio_of_genirq_matchに{.compatible = "generic-uio"},の記述を追加する
    • device treeのbootargsに指示する

    前者の方法だと、ドライバのソースを書き換えて再ビルドしなければならないので、面倒です。

    後者の方法だと、デバイスツリーを書き換えるだけで入れることができます。

    やり方は、device treeのchosenのbootargsにuio_pdrv_genirq.of_id=generic-uioの記述を追加するだけです。

    chosen {
        bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1 uio_pdrv_genirq.of_id=generic-uio earlycon earlycon";
        stdout-path = "serial0:115200n8"
    };

    デバイスドライバの世界ではofといったら、デバイスツリーでモジュールを組み込む仕組みのことをいうようです。

    このbootargsへの追加によって、generic-uioというドライバを見たら、uio_pdrv_genireqモジュールを読み込め、ということが指示されます。

    なお、詳しく見てみると、UIOドライバはuio.cというのが根本にあるドライバです。uio.cでは、copy_to_user()やcopy_from_user()といった関数で実際のハードウェアを読み書きします。しかし、probe関数がないので、これ自体が組み込まれて実行されるようではないようです。

    そのため/class/sys/uioというクラスはできているのですが、実際のデバイスは作られていません。

    実際のデバイスが作られるには、probeされる子ドライバの中でuio_register_device(&pdev->dev, &gdev->info);関数が呼び出されたときのようです。uio_register_deviceが呼び出されると、親であるuio.cのuio_unregister_device()が呼び出され、はじめて使えるようになります。

    クラスとインスタンスの関係のように、実際のデバイスが認識されてはじめて登録されて、デバイスドライバの実体が出来上がるようですね。

    まとめると、使う側としては、

    • デバイスツリーのbootargsに uio_pdrv_genirq.of_id=generic-uio を追加する
    • デバイスツリーにcompatible = "generic-uio";を持つデバイスを追加する

    だけでよいようです。

    | | コメント (0)

    2017.12.04

    自分で作ったデバイスドライバをmenuconfigに出す方法

    Linuxのデバイスドライバを作り、それをMenuconfigで選べるようにする方法を紹介します。

    ZYNQ Linuxのフォルダのdriversフォルダに、いろいろなカテゴリに分けてドライバが存在しています。

    ここではdrivers\gpioの中にオリジナルのドライバ「gpio-cosmoz.c」を入れて、それをmenuconfigで有効/無効を切り替えられるようにしてみます。

    まず、linux-xlnx/drivers/gpioの中にドライバのファイルを作成し、KConfigを編集します。

    Menuconfig1

    GPIO_ZYNQとGPIO_ZXの間に自分のドライバのconfig定義を書きます。

    書き方は、他のconfig定義に倣って、見よう見まねで書けばよいでしょう。

    config GPIO_ZYNQ
    	tristate "Xilinx Zynq GPIO support"
    	depends on ARCH_ZYNQ || ARCH_ZYNQMP
    	select GPIOLIB_IRQCHIP
    	help
    	  Say yes here to support Xilinx Zynq GPIO controller.
    
    config GPIO_COSMOZ
    	tristate "Cosmo-Z AXI Driver"
    	help
    	  Help yourself!
    
    config GPIO_ZX
    	bool "ZTE ZX GPIO support"
    	select GPIOLIB_IRQCHIP
    	help
    	  Say yes here to support the GPIO device on ZTE ZX SoCs.

    これで、menuconfigを実行します。

    すると、Device Drivers→GPIO Support→Memory Mapped GPIO driversの中に、Zynq GPIOとZTE ZXの間に自分で定義したドライバ(Cosmo-Z AXI)が出来ました。

    Menuconfig2

    これを有効にすると、Linuxソースディレクトリ(linux-xlinx)のトップにある.configにCONFIG_GPIO_COSMOZが追加されます。

    # CONFIG_GPIO_ZEVIO is not set
    CONFIG_GPIO_ZYNQ=y
    CONFIG_GPIO_COSMOZ=y
    # CONFIG_GPIO_ZX is not set

    また、drivers/gpio/Makefileには

    obj-$(CONFIG_GPIO_XTENSA)	+= gpio-xtensa.o
    obj-$(CONFIG_GPIO_ZEVIO)	+= gpio-zevio.o
    obj-$(CONFIG_GPIO_ZYNQ)		+= gpio-zynq.o
    obj-$(CONFIG_GPIO_COSMOZ)	+= gpio-cosmoz.o
    obj-$(CONFIG_GPIO_ZX)		+= gpio-zx.o
    obj-$(CONFIG_GPIO_LOONGSON1)	+= gpio-loongson1.o
    

    を追加しておきます。

    これでMakeを行うと、.configによってCONFIG_ドライバ名のマクロが有効になって、gpio-cosmoz.cがコンパイルされ、gpio-cosmoz.oとなってカーネルに追加されます。

    つまり、やり方としては

    1. ドライバのソースファイル(.c)を用意する。
    2. 適当なドライバソースのディレクトリに入れる
    3. そのディレクトリのKConfigを見て、見よう見まねでconfig追加する
    4. そのディレクトリのMakeファイルに、ソースファイルの.cを.oに変えたものを登録する
    というわけです。

    | | コメント (0)

    2017.12.03

    LM26420をなんとか入手

    特電のほとんどの製品で、LM26420/XSQというTexas Instruments社の電源ICを使用しています。

    Lm264201

    11月の末にDigikeyに注文しようとして、リードタイムが付いていることで在庫がないことがわかりました。

    TI storeに270個くらいあったので、それを注文したのですが、一向に出荷される気配がありません。どうやら、TI storeの在庫は実際には無いものだったようです。

    かろうじて見つけたのが、AVNETに1リール1000個の在庫が3巻くらいあったものでした。

    これを速攻で注文し、無事に入手できました!1000なのでいつ使い切るかわかりませんが、しばらくは持ちそうです。

    Lm26420

    その後、あっという間に世界中で争奪戦が起こり、AVNETでさえ入手できなくなってしまいました。

    電子部品はなくなりかけると、一瞬で消えます。ご注意ください。

    | | コメント (0)

    « 2017年11月 | トップページ | 2018年1月 »