z-turn/linux kernel のビルド の履歴(No.4)
更新概要†
z-turn ボード用の Linux Kernel (uImage) と U-Boot (u-boot) を自分でコンパイルして、 最新のものに更新するのが目的です。
結果として、andreamerello さんのリポジトリに z-turn 用の設定があり、 それを使うことで成功しました。(u-boot はまだビルドができたところ)
VirtualBox に Debian8 を新規インストール†
VirtualBox の作成†
必要なパッケージなどを洗い出すため、まっさらから始めてみます。
ビルドに linux の開発環境が必要なので、64bit Windows 10 上の Oracle VM VirtualBox に 32bit の Debian8 (Jessie) をインストールします。
Zynq 用の arm バイナリをコンパイルするのに 32 ビットライブラリが必要という情報があるようで、 たぶんコンパイル環境も 32 ビットのほうが都合が良いのかと思ったためです。
VirtualBox マネージャの [新規] から、Debian8new という 32bit Debian の VM を作成します。
- メモリ4G
- VDI形式の仮想ハードディスク可変型20G
としました。
インストールディスクのダウンロード&マウント†
https://www.debian.org/CD/netinst/
の i386 というリンクから、debian-8.7.1-i386-netinst.iso をダウンロード。
VirtualBox "Debian8new" を右クリックし、[設定] から [ストレージ] の [光学ディスクファイルを選択...] で上記 .iso ファイルをマウント
ネットワークの設定†
ホスト PC の Windows10 と、VirtualBox 内の Debian8 との間で通信を可能にするため ネットワークアダプタを追加します。
起動&インストール†
- [Install]
- Select Language => [Japanese]
- 場所の選択 => [日本]
- キーボードの設定 => [日本語]
- ネットワークの設定
- プライマリアダプタ => [eth0] (NATアダプタ)
- ホスト名 => [debian8new]
- ドメイン名 => []
- root のパスワード => [********]
- 新しいユーザー
- 本名 => [Osamu Takeuchi]
- ユーザ名 => [osamu]
- パスワード => [********]
- パーティショニング => [ディスク全体を使う] - [return] x 3 - [はい]
- アーカイブミラー => [日本]-[ftp.tsukuba.wide.ad.jp]-[]
- パッケージ利用調査に参加しますか => [はい]
- ソフトウェアの選択 => [SSHサーバ + 標準システムユーティリティ]
- GRUB ブートローダのインストール => [はい]-[/dev/sda]
- インストールの完了
vivado は Windows 上で使うつもりで、デスクトップ環境は入れませんでした。
インストールCDがアンマウントされていることを確認して続行すると再起動されます。
ログイン&必須パッケージのインストール†
etckeeper, sudo, jed の導入†
自動再起動後、コンソールからログインできることを確認し、
- /etc フォルダのバージョン管理をするため etckeeper を入れます。
- 設定ファイルの編集用に sudo および jed エディタを入れます。
- sudo グループに自分を追加します
LANG:console $ export LANG=C $ su Password: (rootパスワードを入力) # export LANG=C # apt install etckeeper The following extra packages will be installed: git git-man liberror-perl rsync Suggested packages: sudo git-daemon-run git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-arch git-cvs git-mediawiki git-svn The following NEW packages will be installed: etckeeper git git-man liberror-perl rsync 0 upgraded, 5 newly installed, 0 to remove and 0 not upgraded. Need to get 5065 kB of archives. After this operation, 26.7 MB of additional disk space will be used. Do you want to continue? [Y/n] ... # apt install sudo jed The following extra packages will be installed: jed-common libonig2 libslang2-modules slsh Suggested packages: gpm The following NEW packages will be installed: jed jed-common libonig2 libslang2-modules slsh sudo 0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded. Need to get 1892 kB of archives. After this operation, 5984 kB of additional disk space will be used. Do you want to continue? [Y/n] ... # adduser osamu sudo Adding user `osamu' to group `sudo' ... Adding user osamu to group sudo Done # exit $ sudo echo ok We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for osamu: osamu is not in the sudoers file. This incident will be reported. $ groups osamu cdrom floppy audio dip video plugdev netdev bluetooth $ groups osamu osamu: osamu cdrom floppy sudo audio dip video plugdev netdev bluetooth $ exit
一旦ログインしなおさないと、グループ設定は反映されないみたいだったので、 exit してログインしなおしました。
sshd on eth1†
以下、再ログイン後、
LANG:console $ export LANG=C $ groups osamu cdrom floppy sudo audio dip video plugdev netdev bluetooth $ sudo ifconfig [sudo] password for osamu: eth0 ... ... lo ... ... $ sudo jed /etc/network/interfaces + allow-hotplug eth1 + iface eth1_inet dhcp $ sudo service networking restart $ sudo service networking restart # なぜか2回必要? $ sudo ifconfig eth1 eth1 ... inet addr:192.168.56.103 ...
これでホスト PC から 192.168.56.103 というアドレスへ ssh 接続が可能になった
以下、PuTTY で ssh 接続して手順を続行します。
クロスコンパイル環境の整備†
ツールのインストール†
http://blog.kmckk.com/archives/4777624.html を見ながら
LANG:console ### 基本的な開発環境(git と make など) $ sudo apt-get install git-core build-essential ### make menuconfig のため $ sudo apt-get install ncurses-dev ### uImage を作成するため $ sudo apt-get install u-boot-tools
2種類の arm アーキテクチャについて†
Debian の arm 用アーキテクチャは armel と armhf の2種類ある
https://www.debian.org/releases/stable/armel/release-notes/ch-whats-new.ja.html
- ARM EABI ('armel')
- ARMv7 (EABI 浮動小数点ハードウェア ABI, 'armhf')
https://japan.xilinx.com/support/documentation/data_sheets/j_ds190-Zynq-7000-Overview.pdf
*Zynq‐7000 All Programmable SoC
- ARM Cortex ‐ A9 ベース
-- ARMv7-A アーキテクチャ
-- 単精度および倍精度のベクター浮動小数点ユニット (VFPU)
浮動小数点付き ARMv7 に対応する armhf を使えば良さそう。
実機のアーキテクチャ名を確認†
z-turn 付属の SD カードから立ち上げて、
LANG:console # gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper Target: arm-linux-gnueabihf Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --enable-multilib --disable-sjlj-exceptions --with-arch=armv7-a --with-float=hard --with-fpu=vfpv3-d16 --with-mode=thumb --disable-werror --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf Thread model: posix gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) $ uname -a Linux localhost.localdomain 3.15.0-xilinx #9 SMP PREEMPT Tue May 26 17:26:14 CST 2015 armv7l armv7l armv7l GNU/Linux
armv7l とか armv7-a というアーキテクチャはどこで定義されているのだろう?
VirtualBox 上の linux-xlnx/ にて、
LANG:console $ grep -s armv7l */*/*/* tools/perf/jvmti/Makefile:ifeq ($(ARCH), armv7l) $ grep -A5 armv7l tools/perf/jvmti/Makefile ifeq ($(ARCH), armv7l) JARCH=armhf endif ifeq ($(ARCH), armv6l) JARCH=armhf endif
ふむ、ARCH=armv7l としておくと、内部で armhf に置き換えられるみたい。
armv7l という単語は他には出てこなかった。
emdebian.org を apt のソースに指定†
以下、http://qiita.com/myahal@github/items/fc332e53713df244518f を見ながら クロスコンパイル用のツールチェインをインストールする
LANG:console $ jed /etc/apt/sources.list.d/crosstools.list + deb http://emdebian.org/tools/debian/ jessie main $ curl http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | sudo apt-key add - -bash: curl: コマンドが見つかりません gpg: 有効なOpenPGPデータが見つかりません。 $ sudo apt install curl $ curl http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | sudo apt-key add -
armhf アーキテクチャのパッケージ一覧を読み込む†
LANG:console $ sudo dpkg --add-architecture armhf $ sudo apt-get update
crossbuild-essential-armhf をインストール†
LANG:console $ sudo apt-get install crossbuild-essential-armhf 提案パッケージ: binutils-doc gcc-4.9-locales binutils-multiarch gcc-4.9-doc libstdc++6-4.9-dbg:armhf libgcc1-dbg:armhf libgomp1-dbg:armhf libitm1-dbg:armhf libatomic1-dbg:armhf libasan1-dbg:armhf liblsan0-dbg:armhf libtsan0-dbg:armhf libubsan0-dbg:armhf libcilkrts5-dbg:armhf libquadmath-dbg:armhf glibc-doc:armhf locales:armhf manpages-dev:armhf libstdc++-4.9-doc:armhf libyaml-shell-perl $ arm-linux-gnueabihf-gcc --version arm-linux-gnueabihf-gcc ( 4.9.2-10) 4.9.2 Copyright (C) 2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
適当なソースをコンパイル†
LANG:console $ mkdir arm-hello $ cd arm-hello $ cat > hello.c #include <stdio.h> void main() { puts("Hello world!"); } $ arm-linux-gnueabihf-gcc hello.c -o hello $ file hello a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=94a2aefddb7ebe7a244405372693ca3758564470, not stripped
エミュレータで動かす†
LANG:console $ sudo apt-get install qemu-user-static $ qemu-arm-static ./hello Hello world!
実機で動かす†
Windows 上で SD カードにコピーして z-turn board で動かす
Windows から見えるパーティションはブート領域で、 z-turn 上では /dev/mmcblk0p1 に来るので、 これをマウントしてホームにコピーし、実行する。
LANG:console # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT mmcblk0 179:0 0 7.4G 0 disk |-mmcblk0p1 179:1 0 64M 0 part `-mmcblk0p2 179:2 0 7.4G 0 part / mtdblock0 31:0 0 512K 0 disk mtdblock1 31:1 0 128K 0 disk mtdblock2 31:2 0 4.4M 0 disk mtdblock3 31:3 0 4.5M 0 disk mtdblock4 31:4 0 64K 0 disk mtdblock5 31:5 0 6M 0 disk mtdblock6 31:6 0 448K 0 disk # mount /dev/mmcblk0p1 /media/BOOT media-BOOT.mount # cp -r /media/BOOT/arm-hello . # cd arm-hello/ # file hello hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=94a2aefddb7ebe7a244405372693ca3758564470, not stripped # ./hello Hello world!
ちゃんと動いた!
Linux Kernel のビルド†
最新ソースから uImage, modules, firmware をビルド&インストールする。
uImage, zImage, vmlinuz の関係†
http://fowlrat.hatenablog.com/entry/2014/08/31/011056
http://aoking.hatenablog.jp/entry/2013/09/30/132325
uImage は zImage に
-A arm -O linux -C none -T kernel -a 0x40008000 -e 0x40008000 -n 'Linux-3.16.0'
といったヘッダ情報を付けたもの
zImage は vmlinux から .comment セクションの削除および、シンボルと再配置情報を落としたもの
vmlinux がカーネル自身
vmlinuz は vmlinux を gzip したものにヘッダ情報を追加したもの
xilinx のソースを使う†
uImage のビルド†
http://blog.kmckk.com/archives/4777624.html を見ながら
LANG:console $ git clone https://github.com/Xilinx/linux-xlnx.git $ git checkout xilinx-v2016.4 $ export CROSS_COMPILE=arm-linux-gnueabihf- $ make ARCH=armv7l xilinx_zynq_defconfig Makefile:531: arch/armv7l/Makefile: そのようなファイルやディレクトリはありません make: *** No rule to make target 'arch/armv7l/Makefile'. 中止. $ ls -d arch/arm* arch/arm arch/arm64
どうやら armv7l を指定するのはここじゃないみたい。
LANG:console $ make ARCH=arm xilinx_zynq_defconfig $ make ARCH=arm menuconfig メニュー形式でカーネル設定を変更可能 Device Drivers ---> Userspace I/O drivers ---> <*> Userspace I/O platform driver with generic IRQ handling <*> Xilinx AXI Performance Monitor driver を確認(初めからマークされているはず) $ make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage ... LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready Kernel: arch/arm/boot/Image is ready Kernel: arch/arm/boot/zImage is ready UIMAGE arch/arm/boot/uImage Image Name: Linux-4.6.0-xilinx Created: Thu Feb 2 02:05:34 2017 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 3848368 Bytes = 3758.17 kB = 3.67 MB Load Address: 00008000 Entry Point: 00008000 Image arch/arm/boot/uImage is ready $ ls -l arch/arm/boot/uImage -rw-r--r-- 1 osamu osamu 3848432 2月 2 02:05 arch/arm/boot/uImage $
modules もビルドする†
ファイル名が *.ko となっているのがカーネルモジュールの本体
LANG:console $ make ARCH=arm modules ... Building modules, stage 2. MODPOST 23 modules CC crypto/drbg.mod.o LD [M] crypto/drbg.ko CC crypto/echainiv.mod.o LD [M] crypto/echainiv.ko CC crypto/hmac.mod.o LD [M] crypto/hmac.ko CC crypto/jitterentropy_rng.mod.o LD [M] crypto/jitterentropy_rng.ko CC crypto/sha256_generic.mod.o LD [M] crypto/sha256_generic.ko CC drivers/remoteproc/mb_remoteproc.mod.o LD [M] drivers/remoteproc/mb_remoteproc.ko CC drivers/remoteproc/remoteproc.mod.o LD [M] drivers/remoteproc/remoteproc.ko CC drivers/remoteproc/zynq_remoteproc.mod.o LD [M] drivers/remoteproc/zynq_remoteproc.ko CC drivers/rpmsg/virtio_rpmsg_bus.mod.o LD [M] drivers/rpmsg/virtio_rpmsg_bus.ko CC drivers/usb/gadget/function/usb_f_mass_storage.mod.o LD [M] drivers/usb/gadget/function/usb_f_mass_storage.ko CC drivers/usb/gadget/function/usb_f_ss_lb.mod.o LD [M] drivers/usb/gadget/function/usb_f_ss_lb.ko CC drivers/usb/gadget/legacy/g_zero.mod.o LD [M] drivers/usb/gadget/legacy/g_zero.ko CC drivers/usb/gadget/libcomposite.mod.o LD [M] drivers/usb/gadget/libcomposite.ko CC drivers/virtio/virtio.mod.o LD [M] drivers/virtio/virtio.ko CC drivers/virtio/virtio_ring.mod.o LD [M] drivers/virtio/virtio_ring.ko CC fs/configfs/configfs.mod.o LD [M] fs/configfs/configfs.ko CC net/802/p8022.mod.o LD [M] net/802/p8022.ko CC net/802/psnap.mod.o LD [M] net/802/psnap.ko CC net/802/stp.mod.o LD [M] net/802/stp.ko CC net/8021q/8021q.mod.o LD [M] net/8021q/8021q.ko CC net/bridge/bridge.mod.o LD [M] net/bridge/bridge.ko CC net/ipv4/ipip.mod.o LD [M] net/ipv4/ipip.ko CC net/llc/llc.mod.o LD [M] net/llc/llc.ko $ ls modules* modules.builtin modules.order
firmware はコンパイル必要ない?†
LANG:console $ ls firmware 3com edgeport qlogic Makefile emi26 r128 README.AddingFirmware emi62 radeon WHENCE ess sb16 acenic ihex2fw.c sun adaptec kaweth tehuti advansys keyspan ti_3410.fw.ihex atmsar11.HEX keyspan_pda ti_5052.fw.ihex av7110 korg tigon bnx2 matrox ttusb-budget bnx2x modules.builtin vicam built-in.o modules.order whiteheat.HEX cis mts_cdma.fw.ihex whiteheat_loader.HEX cpia2 mts_edge.fw.ihex whiteheat_loader_debug.HEX cxgb3 mts_gsm.fw.ihex yam dsp56k myricom yamaha e100 ositech
すべて .ihex のようになっているけれど、make firmware_install というコマンドでインストールが可能みたい?
SD カードの構成†
uImage は BOOT 領域にコピーすればいいとして、modules はどうすれば?
実機から z-turn 付属の SD カードの構成を見てみる。
LANG:console # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT mmcblk0 179:0 0 3.7G 0 disk |-mmcblk0p1 179:1 0 196.1M 0 part /media/boot # SDカードのパーティション1 `-mmcblk0p2 179:2 0 3.5G 0 part / # SDカードのパーティション2 mtdblock0 31:0 0 512K 0 disk mtdblock1 31:1 0 128K 0 disk mtdblock2 31:2 0 4.4M 0 disk mtdblock3 31:3 0 4.5M 0 disk mtdblock4 31:4 0 64K 0 disk mtdblock5 31:5 0 6M 0 disk mtdblock6 31:6 0 448K 0 disk # ls /media/boot/ # ここに uImage 7z010-hdmi.bit BOOT.bin uEnv-ramdisk.txt 7z010-lcd.bit System Volume Information uEnv-ubuntu.txt 7z010.bit devicetree-7ic.dtb uEnv.txt 7z020-hdmi.bit devicetree-hdmi-1080p.dtb uImage 7z020-lcd.bit devicetree-hdmi-720p.dtb uramdisk.image.gz 7z020.bit devicetree.dtb # ls /lib/modules/3.15.0-xilinx/ # ここに modules.* kernel/ modules.builtin modules.dep.bin modules.softdep modules.alias modules.builtin.bin modules.devname modules.symbols modules.alias.bin modules.dep modules.order modules.symbols.bin # ls /lib/modules/3.15.0-xilinx/kernel/ # ここに *.ko crypto/ drivers/ net/ # ls /lib/firmware # ここに *.fw 3com e100 keyspan_pda rtwifi ttusb-budget av7110 edgeport korg sun whiteheat.fw bnx2 emi26 mts_cdma.fw tehuti whiteheat_loader.fw bnx2x emi62 mts_edge.fw ti_3410.fw yam cpia2 ess mts_gsm.fw ti_5052.fw yamaha cxgb3 kaweth rtl8192cufw_TMSC.bin tigon
インストールのため VirtualBox へ SD カードをマウントする†
Extention Pack のインストール†
SD カードは USB3.0 のカードリーダーで PC につないているのだけれど、 VirtualBox はそのままだと USB3.0 にアクセスできない。
VirtualBox からアクセスできるようにするため、 https://www.virtualbox.org/wiki/Downloads から落とした VirtualBox Extension Pack をダブルクリックし、VirtualBox を USB3.0 対応にした。
VirtualBox のハードウェア設定†
USBポートを 3.0 にする。
カードリーダーを VirtualBox に割り当てる†
VirtualBox 起動後に、USB 設定でカードリーダーを割り当てる。
インストール†
Makefile は
LANG:console $ make help ... modules_install - Install all modules to INSTALL_MOD_PATH (default: /) firmware_install- Install all firmware to INSTALL_FW_PATH (default: $(INSTALL_MOD_PATH)/lib/firmware) ..
となっている。
実際にモジュールがインストールされるのは
$(INSTALL_MOD_PATH)/lib/modules/$(VERSION)/
である。
LANG:console $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 19.1G 0 part / ├─sda2 8:2 0 1K 0 part └─sda5 8:5 0 880M 0 part [SWAP] sdf 8:80 1 7.4G 0 disk ├─sdf1 8:81 1 64M 0 part └─sdf2 8:82 1 7.4G 0 part sr0 11:0 1 1024M 0 rom $ sudo mkdir /mnt/sdcard1 $ sudo mkdir /mnt/sdcard2 $ sudo mount /dev/sdf1 /mnt/sdcard1 $ sudo mount /dev/sdf2 /mnt/sdcard2 $ ls /mnt/sdcard1 7z020.bit System Volume Information devicetree.dtb uImage 7z020b.bit arm-hello original uramdisk.image.gz BOOT.bin devicetree-wo-uio.dtb uEnv.txt $ sudo mv /mnt/sdcard1/uImage /mnt/sdcard1/uImage-orig $ sudo cp arch/arm/boot/uImage /mnt/sdcard1 $ sudo umount /mnt/sdcard1 $ ls -l /mnt/sdcard2/lib/modules 合計 8 drwxrwxr-x 3 1002 1002 4096 5月 26 2015 3.15.0-xilinx $ sudo make ARCH=arm INSTALL_MOD_PATH=/mnt/sdcard2 modules_install INSTALL crypto/drbg.ko INSTALL crypto/echainiv.ko INSTALL crypto/hmac.ko INSTALL crypto/jitterentropy_rng.ko INSTALL crypto/sha256_generic.ko INSTALL drivers/remoteproc/mb_remoteproc.ko INSTALL drivers/remoteproc/remoteproc.ko INSTALL drivers/remoteproc/zynq_remoteproc.ko INSTALL drivers/rpmsg/virtio_rpmsg_bus.ko INSTALL drivers/usb/gadget/function/usb_f_mass_storage.ko INSTALL drivers/usb/gadget/function/usb_f_ss_lb.ko INSTALL drivers/usb/gadget/legacy/g_zero.ko INSTALL drivers/usb/gadget/libcomposite.ko INSTALL drivers/virtio/virtio.ko INSTALL drivers/virtio/virtio_ring.ko INSTALL fs/configfs/configfs.ko INSTALL net/802/p8022.ko INSTALL net/802/psnap.ko INSTALL net/802/stp.ko INSTALL net/8021q/8021q.ko INSTALL net/bridge/bridge.ko INSTALL net/ipv4/ipip.ko INSTALL net/llc/llc.ko DEPMOD 4.6.0-xilinx $ ls /mnt/sdcard2/lib/modules/4.6.0-xilinx/ build/ modules.alias.bin modules.dep modules.order modules.symbols.bin kernel/ modules.builtin modules.dep.bin modules.softdep source/ modules.alias modules.builtin.bin modules.devname modules.symbols $ ls /mnt/sdcard2/lib/firmware 3.2.0-1498-omap4 ipw2100-1.3-i.fw qat_895xcc_mmp.bin 3com ipw2100-1.3-p.fw qat_c3xxx.bin GPL-3 ipw2100-1.3.fw qat_c3xxx_mmp.bin Makefile ipw2200-bss.fw qat_c62x.bin NPE-B ipw2200-ibss.fw qat_c62x_mmp.bin NPE-C ipw2200-sniffer.fw qat_mmp.bin README isci qca RTL8192E iwlwifi-100-5.ucode qed WHENCE.ubuntu iwlwifi-1000-5.ucode ql2100_fw.bin acenic iwlwifi-105-6.ucode ql2200_fw.bin adaptec iwlwifi-135-6.ucode ql2300_fw.bin advansys iwlwifi-2000-6.ucode ql2322_fw.bin ... $ sudo mv /mnt/sdcard2/lib/firmware /mnt/sdcard2/lib/firmware_3.15.0-xilinx $ sudo make ARCH=arm INSTALL_MOD_PATH=/mnt/sdcard2 firmware_install IHEX firmware/acenic/tg1.bin INSTALL /mnt/sdcard2/lib/firmware/acenic/tg1.bin IHEX firmware/acenic/tg2.bin INSTALL /mnt/sdcard2/lib/firmware/acenic/tg2.bin ... IHEX firmware/yam/1200.bin INSTALL /mnt/sdcard2/lib/firmware/yam/1200.bin IHEX firmware/yam/9600.bin INSTALL /mnt/sdcard2/lib/firmware/yam/9600.bin $ ls /mnt/sdcard2/lib/firmware 3com bnx2 e100 keyspan mts_gsm.fw sb16 ttusb-budget acenic bnx2x edgeport keyspan_pda myricom sun vicam adaptec cis emi26 korg ositech tehuti whiteheat.fw advansys cpia2 emi62 matrox qlogic ti_3410.fw whiteheat_loader.fw atmsar11.fw cxgb3 ess mts_cdma.fw r128 ti_5052.fw yam av7110 dsp56k kaweth mts_edge.fw radeon tigon yamaha $ sudo umount /mnt/sdcard2
起動失敗†
上記のようにインストールした SD カードを差してリセット。
LANG:console ... reading uImage 3848432 bytes read in 249 ms (14.7 MiB/s) reading devicetree.dtb 11172 bytes read in 15 ms (726.6 KiB/s) ## Booting kernel from Legacy Image at 02080000 ... Image Name: Linux-4.6.0-xilinx Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 3848368 Bytes = 3.7 MiB Load Address: 00008000 Entry Point: 00008000 Verifying Checksum ... OK ## Flattened Device Tree blob at 02000000 Booting using the fdt blob at 0x2000000 Loading Kernel Image ... OK Loading Device Tree to 1fffa000, end 1ffffba3 ... OK Starting kernel ...
ここで止まってしまった。
andreamerello/linux-zynq-stable でやってみる†
FPGA の部屋にて、z-turn 用の dts が置かれていると書いてあった andreamerello さんのリポジトリを使ってみる。
http://marsee101.blog19.fc2.com/blog-entry-3485.html
LANG:console $ git clone https://github.com/andreamerello/linux-zynq-stable.git $ cd linux-zynq-stable $ git branch -a | grep zturn remotes/origin/P2016_I03_zturn_rgmii_id remotes/origin/z2016-07-zturn-hdmi $ git checkout remotes/origin/z2016-07-zturn-hdmi Checking out files: 100% (22328/22328), done. Note: checking out 'remotes/origin/z2016-07-zturn-hdmi'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b new_branch_name HEAD is now at 86f1091... drm/bridge: avoid reading edid when setting mode .. use the one stored in connector struct $ git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative * 86f1091 - (HEAD, origin/z2016-07-zturn-hdmi) drm/bridge: avoid reading edid when setting mode .. use the one stored in connector struct (8 months ago) <Andrea Merello> * fbcdb6d - drm/bridge: sii902x: fix get edid may fail (8 months ago) <Andrea Merello> * e002b07 - DRM: ocdrm: try to apply HW restrictions for DMA burst len (8 months ago) <Andrea Merello> * f37a83c - DRM: ocdrm: update pixel format on plane update, instead of crtc update (8 months ago) <Andrea Merello> * 8c024053 - DRM/brige: sii902x: change the edid read procedure to more closely match reference code (8 months ago) <Andrea Merello> * 624c0b0 - drm/bridge: sii902x: make the detect function return the actual number of edid modes (8 months ago) <Andrea Merello> * 801fd51 - DRM/bridge: sii902x: possibly fix device screwing up the I2C bus (8 months ago) <Andrea Merello> * d9470bd - DRM: ocdrm: improve mode check (8 months ago) <Andrea Merello> * e317dee - drm:sii902x: add basic check for mode depending by variant (8 months ago) <Andrea Merello> * 740b624 - DRM/bridge: add sii902x driver (8 months ago) <Andrea Merello> * b5230a3 - DRM: add driver for OpenCores LCD/VGA controller (8 months ago) <Andrea Merello> * 6ec8bef - DRM: axi_adi_hdmi: update for 4.6 (8 months ago) <Andrea Merello> * 20c0838 - defconfig: zynq_edl_deconfig: update for 4.6 (8 months ago) <Andrea Merello> * 7b634b1 - config: zynq_edl_defconfig: add support for /proc/config.gz (8 months ago) <Andrea Merello> * 4a6fd8f - config: zynq_edl_defconfig (8 months ago) <Andrea Merello> * 22ebc3b - DT: zynq-zturn-myir: enable uart0 (8 months ago) <Andrea Merello> * 62fbe8d - config: zynq_edl_defconfig: add IIT sound devices (8 months ago) <Andrea Merello> * aa15b8d - sound: add IIT custom driver for gla and group IIT sound drivers in a dedicated subdir (8 months ago) <Andrea Merello> * ad2eb06 - sound: soc: Kconfig: enable ssm2518 to be selected in kernel config (8 months ago) <Andrea Merello> * 145575f - USB reset correctly driven by gpio (8 months ago) <Francesco Diotalevi> * eeb3b2a - defconfig: enable mcp3422 (8 months ago) <Andrea Merello> * 556bf46 - dmaengine: xilinx_dma: don't require dma-channels DT property when multi-channel is false (8 months ago) <Andrea Merello> * 7b5ff65 - dmaengine: xilinx_dma: ensure termination of all pending work before freeing resoruces (8 months ago) <Andrea Merello> * 85d8fe6 - dmaengine: xilinx_dma: no need to reconfigure interrupt so often (8 months ago) <Andrea Merello> * 652909d - dmaengine: xilinx_dma: remove unused var (8 months ago) <Andrea Merello> * 0729f71 - dmaengine: xilinx_dma: fix working on wrong tail segment (8 months ago) <Andrea Merello> * 2e695b8 - dmaengine: xilinx_dma: disable ISR on terminate_all(), and clear pending flags (8 months ago) <Andrea Merello> * 5d8e873 - dmaengine: xilinx_dma: fix error (current descriptor set to zero) after channel reset (8 months ago) <Andrea Merello> * 796e37f - dmaengine: xilinx_dma: avoid completion cb to be called after dma_terminate_all() has been invoked (8 months ago) <Andrea Merello> * a007d64 - xilinx_dma: Avoid "scheduling while atomic". (8 months ago) <Jeremy Trimble> * 9fa2fa8 - dmaengine: xilinx_dma: try to fixup interleaved mode wrt 5ec63a0 (8 months ago) <Andrea Merello> * 7dd0ed2 - dmaengine: xilinx_dma: style fixes (8 months ago) <Andrea Merello> * 54ede0c - xilinx_dma: re-institute use of segment dma_pool (8 months ago) <Jeremy Trimble> * 95e6985 - xilinx_dma: Reset channel if unable to halt. (8 months ago) <Jeremy Trimble> * 8e2abcd - xilinx_dma: Print status word prior to clearing error mask. (8 months ago) <Jeremy Trimble> * 65df81a - xilinx_dma: IrqThreshold set incorrectly, unreliable. (8 months ago) <Jeremy Trimble> * dba8d9c - dmaengine: xilinx_dma: mark channel as "idle" when it has been stopped (8 months ago) <Andrea Merello> * 1735726 - dmaengine: xilinx_dma: autodetect whether the HW supports scatter-gather (8 months ago) <Andrea Merello> * 2223719 - dma: Add support for multi channel DMA (8 months ago) <Kedareswara rao Appana> * 12cf172 - DT: zynq-zturn-myir: add missing clock-freq prop to i2c0 (8 months ago) <Andrea Merello> * 030dcc5 - DT: zynq-zed: fixed serial console (8 months ago) <Andrea Merello> * 4bbd8da - config: updated zynq_edl_defconfig for 4.4.6 (8 months ago) <Andrea Merello> * 9b3c403 - i2c: xiic: fix stuck on transfer timeout (8 months ago) <Andrea Merello> * ba6d32e - i2c: Revert "i2c: xiic: Do not reset controller before every transfer" (8 months ago) <Lars-Peter Clausen> * 7febb25 - i2c: xiic: Do not reset controller before every transfer (8 months ago) <Shubhrajyoti Datta> * 41d2353 - i2c: xiic: move the xiic_process to thread context (8 months ago) <Shubhrajyoti Datta> * 4c55186 - i2c: xiic: Remove the disabling of interrupts (8 months ago) <Shubhrajyoti Datta> * 6197a22 - Added DAI wrapper for using ssm2518 sound chip (8 months ago) <Francesco Diotalevi> * 354e513 - Modifications for having USB disk mass storage fully working (8 months ago) <Francesco Diotalevi> * e39a348 - defconfig: enable module build for AXI DMA test (8 months ago) <Andrea Merello> * 43c036a - dmaengine: Added Xilinx DMA test client (8 months ago) <Andrea Merello> * fbbeb94 - deconfig: zynq_edl: enable in-kernel build of WiFi stack and WiFi dongle driver (8 months ago) <Andrea Merello> * ff33b8a4 - defconfig: zynq_edl: enable DEBUG_FS (8 months ago) <Andrea Merello> * a87fcda - defconfig: zynq_edl: enable Xilinx DMA IP (8 months ago) <Andrea Merello> * bc9c538 - dmaengine: add Xilinx DMA IP driver (8 months ago) <Andrea Merello> * dc4496c - defconfig: zynq-edl: enable ar803x driver (8 months ago) <Andrea Merello> * d5878f0 - defconfig: zynq-edl: more clean ups (8 months ago) <Andrea Merello> * 175015c - defconfig: zynq-edl: clean up (8 months ago) <Andrea Merello> * 1ef3316 - defconfig: zynq-edl: add driver for zedboard RTC pmod (8 months ago) <Andrea Merello> * 4744f80 - DT: rename MYIR in zturn-MYIR (8 months ago) <Andrea Merello> * b5d5fce - DT: MYIR: fix typo (8 months ago) <Andrea Merello> * 956bb29 - defconfig: zynq_edl: enable LM75, that is used on MYIR board (8 months ago) <Andrea Merello> * a9c0ea3 - DT: MYIR: enable temperature sensor (8 months ago) <Andrea Merello> * 9c659a0 - defconfig: zynq_edl_defconfig: enable in-kernel G-Sensor for MYIR (8 months ago) <Andrea Merello> * d7ce7b0 - defconfig: zynq_edl: add GPIO_BEEPER for MYIR (8 months ago) <Andrea Merello> * fc2c988 - DT: MYIR: enable adxl34x G-Sensor (8 months ago) <Andrea Merello> * d1f72e2 - DT: add support for z-turn myir board (8 months ago) <Andrea Merello> ... * 2dcd0af - Linux 4.6 (9 months ago) <Linus Torvalds> ... $
- Linux 4.6 ベースのコード
- 2017年2月2日の8か月前に z-turn のサポートを始めた
- 以下をサポート
- DT: adxl34x G-Sensor
- defconfig: zynq_edl: GPIO_BEEPER
- defconfig: zynq_edl_defconfig: in-kernel G-Sensor
- DT: MYIR: temperature sensor
- defconfig: zynq_edl: LM75 temperature sensor
- dmaengine: Xilinx DMA IP driver
- DT: zynq-zturn-myir: clock-freq prop for i2c0
- DT: zynq-zturn-myir: enable uart0
LANG:console $ cat .config cat: .config: そのようなファイルやディレクトリはありません $ ls -d arch/arm* arch/arm arch/arm64 $ ls arch/arm/configs/* | grep zynq arch/arm/configs/zynq_edl_defconfig $ make ARCH=arm zynq_edl_defconfig $ make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage ... CC drivers/dma/xilinx/xilinx_dma.o drivers/dma/xilinx/xilinx_dma.c: In function ‘xilinx_dma_prep_dma_cyclic’: drivers/dma/xilinx/xilinx_dma.c:1332:30: warning: ‘segment’ may be used uninitialized in this function [-Wmaybe-uninitialized] last_segment->hw.next_desc = segment->phys; ^ ... Image Name: Linux-4.6.0+ Created: Thu Feb 2 21:19:15 2017 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 4542272 Bytes = 4435.81 kB = 4.33 MB Load Address: 00008000 Entry Point: 00008000 Image arch/arm/boot/uImage is ready $ less drivers/dma/xilinx/xilinx_dma.c { struct xilinx_dma_tx_segment *last_segment = segment; segment = list_first_entry(&desc->segments, struct xilinx_dma_tx_segment, node); /* Link last segment to first */ #ifdef CONFIG_PHYS_ADDR_T_64BIT last_segment->hw.next_desc = lower_32_bits(segment->phys); last_segment->hw.next_desc_msb = upper_32_bits(segment->phys); #else > last_segment->hw.next_desc = segment->phys; #endif } $ make ARCH=arm modules ... CC [M] drivers/gpu/drm/adi_axi_hdmi/axi_hdmi_encoder.o drivers/gpu/drm/adi_axi_hdmi/axi_hdmi_encoder.c: In function ‘get_slave_funcs’: drivers/gpu/drm/adi_axi_hdmi/axi_hdmi_encoder.c:123:2: warning: return discards ‘const’ qualifier from pointer target type return to_encoder_slave(enc)->slave_funcs; ^ ... $ sudo mount /dev/sdf1 /mnt/sdcard1 $ sudo mount /dev/sdf2 /mnt/sdcard2 $ sudo cp arch/arm/boot/uImage /mnt/sdcard1 $ ls /mnt/sdcard2/lib/modules 3.15.0-xilinx 4.6.0-xilinx $ sudo make ARCH=arm INSTALL_MOD_PATH=/mnt/sdcard2 modules_install INSTALL crypto/ansi_cprng.ko INSTALL crypto/authenc.ko INSTALL crypto/authencesn.ko INSTALL crypto/cbc.ko INSTALL crypto/deflate.ko INSTALL crypto/echainiv.ko INSTALL drivers/dma/xilinx/axidmatest.ko INSTALL drivers/gpu/drm/adi_axi_hdmi/adi_axi_hdmi.ko INSTALL drivers/i2c/busses/i2c-gpio.ko INSTALL drivers/i2c/i2c-smbus.ko INSTALL drivers/net/can/usb/esd_usb2.ko INSTALL drivers/net/wireless/realtek/rtl818x/rtl8187/rtl8187.ko INSTALL drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.ko INSTALL drivers/usb/serial/ftdi_sio.ko INSTALL drivers/usb/serial/pl2303.ko INSTALL drivers/usb/serial/usbserial.ko INSTALL drivers/video/fbdev/ocfb.ko INSTALL lib/zlib_deflate/zlib_deflate.ko INSTALL net/bluetooth/bluetooth.ko INSTALL net/ipv4/ip_tunnel.ko INSTALL net/ipv4/tunnel4.ko INSTALL net/ipv6/ah6.ko INSTALL net/ipv6/esp6.ko INSTALL net/ipv6/ip6_tunnel.ko INSTALL net/ipv6/ipcomp6.ko INSTALL net/ipv6/ipv6.ko INSTALL net/ipv6/mip6.ko INSTALL net/ipv6/sit.ko INSTALL net/ipv6/tunnel6.ko INSTALL net/ipv6/xfrm6_mode_beet.ko INSTALL net/ipv6/xfrm6_mode_transport.ko INSTALL net/ipv6/xfrm6_mode_tunnel.ko INSTALL net/ipv6/xfrm6_tunnel.ko INSTALL net/xfrm/xfrm_algo.ko INSTALL net/xfrm/xfrm_ipcomp.ko DEPMOD 4.6.0+ $ ls /mnt/sdcard2/lib/modules 3.15.0-xilinx 4.6.0+ 4.6.0-xilinx $ sudo mv /mnt/sdcard2/lib/firmware /mnt/sdcard2/lib/firmware_4.6.0-xilinx $ sudo make ARCH=arm INSTALL_MOD_PATH=/mnt/sdcard2 firmware_install $ sudo umount /mnt/sdcard2
devicetree.dtb を作る†
LANG:console $ sudo apt-get install device-tree-compiler $ dtc --version Version: DTC 1.4.0 $ sudo mv /mnt/sdcard1/devicetree.dtb /mnt/sdcard1/devicetree-old.dtb $ sudo dtc -O dtb -o /mnt/sdcard1/devicetree.dtb arch/arm/boot/dts/zynq-zturn-myir.dts $ ls /mnt/sdcard1/devicetree.dtb /mnt/sdcard1/devicetree.dtb $ sudo umount /mnt/sdcard1
起動した!†
LANG:console login as: osamu osamu@10.225.225.168's password: New release '16.04.1 LTS' available. Run 'do-release-upgrade' to upgrade to it. Last login: Tue Jan 31 05:43:39 2017 from 10.225.225.105 Welcome to the Xillinux distribution for Zynq-7000 EPP. You may communicate data with standard FPGA FIFOs in the logic fabric by writing to or reading from the /dev/xillybus_* device files. Additional pipe files of that sort can be set up by configuring and downloading a custom IP core from Xillybus' web site (at the IP Core Factory). For more information: http://www.xillybus.com. To start a graphical X-Windows session, type "startx" at shell prompt. $ uname -a Linux localhost.localdomain 4.6.0+ #1 SMP PREEMPT Thu Feb 2 21:19:10 JST 2017 armv7l armv7l armv7l GNU/Linux
hdmi に繋いだディスプレイは見えてない。
u-boot のビルド†
を見ながら、リポジトリは andreamerello さんのものを使います。
https://github.com/andreamerello/u-boot-zynq
LANG:console $ git clone https://github.com/andreamerello/u-boot-zynq.git Cloning into 'u-boot-zynq'... remote: Counting objects: 396329, done. remote: Total 396329 (delta 0), reused 0 (delta 0), pack-reused 396329 Receiving objects: 100% (396329/396329), 87.23 MiB | 7.85 MiB/s, done. Resolving deltas: 100% (319574/319574), done. Checking connectivity... done. $ cd u-boot-zynq/ $ git branch -a * zynq-zturn remotes/origin/HEAD -> origin/zynq-zturn remotes/origin/from-francesco remotes/origin/from-xlnx remotes/origin/upstream-denx remotes/origin/zynq-zturn remotes/origin/zynq-zturn-for-upstream $ export CROSS_COMPILE=arm-linux-gnueabihf- $ ls configs/zynq* configs/zynq_microzed_defconfig configs/zynq_zc706_defconfig configs/zynq_zc770_xm012_defconfig configs/zynq_zturn_defconfig configs/zynq_picozed_defconfig configs/zynq_zc770_xm010_defconfig configs/zynq_zc770_xm013_defconfig configs/zynq_zybo_defconfig configs/zynq_zc702_defconfig configs/zynq_zc770_xm011_defconfig configs/zynq_zed_defconfig $ make zynq_zturn_defconfig $ make CROSS_COMPILE=arm-linux-gnueabihf- u-boot ... HOSTCC tools/aisimage.o In file included from tools/aisimage.c:10:0: include/image.h:944:27: fatal error: openssl/evp.h: そのようなファイルやディレクトリはありません # include <openssl/evp.h> ^ compilation terminated. ... $ sudo apt-get install libssl-dev:armhf 以下の追加パッケージがインストールされます: libssl1.0.0:armhf zlib1g:armhf zlib1g-dev:armhf 推奨パッケージ: libssl-doc:armhf 以下のパッケージが新たにインストールされます: libssl-dev:armhf libssl1.0.0:armhf zlib1g:armhf zlib1g-dev:armhf アップグレード: 0 個、新規インストール: 4 個、削除: 0 個、保留: 0 個。 2,267 kB のアーカイブを取得する必要があります。 この操作後に追加で 7,173 kB のディスク容量が消費されます。 $ make CROSS_COMPILE=arm-linux-gnueabihf- u-boot ... HOSTCC tools/aisimage.o In file included from include/image.h:944:0, from tools/aisimage.c:10: /usr/include/openssl/evp.h:66:35: fatal error: openssl/opensslconf.h: そのようなファイルやディレクトリはありません # include <openssl/opensslconf.h> ^ compilation terminated. ... $ ls -d /usr/include/openssl/ ## アーキテクチャ非依存のヘッダー aes.h comp.h ec.h modes.h rc2.h ssl3.h asn1.h conf.h ecdh.h obj_mac.h rc4.h stack.h asn1_mac.h conf_api.h ecdsa.h objects.h ripemd.h symhacks.h asn1t.h crypto.h engine.h ocsp.h rsa.h tls1.h bio.h des.h err.h opensslv.h safestack.h ts.h blowfish.h des_old.h evp.h ossl_typ.h seed.h txt_db.h bn.h dh.h hmac.h pem.h sha.h ui.h buffer.h dsa.h krb5_asn.h pem2.h srp.h ui_compat.h camellia.h dso.h kssl.h pkcs12.h srtp.h whrlpool.h cast.h dtls1.h lhash.h pkcs7.h ssl.h x509.h cmac.h e_os2.h md4.h pqueue.h ssl2.h x509_vfy.h cms.h ebcdic.h md5.h rand.h ssl23.h x509v3.h $ ls /usr/include/arm-linux-gnueabihf/openssl/ opensslconf.h ## アーキテクチャ依存のインクルードパスが正しく反映されていない? $ cd ~/arm-hello $ arm-linux-gnueabihf-gcc -v hello.c ... ignoring nonexistent directory "/usr/local/include/arm-linux-gnueabihf" ignoring nonexistent directory "/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../../arm-linux-gnueabihf/include" #include "..." search starts here: #include <...> search starts here: /usr/lib/gcc/arm-linux-gnueabihf/4.9/include /usr/lib/gcc/arm-linux-gnueabihf/4.9/include-fixed /usr/include/arm-linux-gnueabihf ## ちゃんと入ってる /usr/include End of search list. ... ## 理由が分からないので無理やり通す $ cd ~/u-boot-zynq $ mkdir arch/arm/include/openssl $ ln -s /usr/include/arm-linux-gnueabihf/openssl/opensslconf.h arch/arm/include/openssl/opensslconf.h $ make CROSS_COMPILE=arm-linux-gnueabihf- u-boot ... HOSTLD tools/dumpimage /usr/bin/ld: -lssl が見つかりません /usr/bin/ld: -lcrypto が見つかりません collect2: error: ld returned 1 exit status scripts/Makefile.host:103: recipe for target 'tools/dumpimage' failed make[1]: *** [tools/dumpimage] Error 1 Makefile:1215: recipe for target 'tools' failed make: *** [tools] Error 2 $ sudo apt-get install libssl-dev パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下の追加パッケージがインストールされます: libssl-doc zlib1g-dev 以下のパッケージが新たにインストールされます: libssl-dev libssl-doc zlib1g-dev アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 0 個。 2,633 kB のアーカイブを取得する必要があります。 この操作後に追加で 7,438 kB のディスク容量が消費されます。 $ make CROSS_COMPILE=arm-linux-gnueabihf- u-boot ... LDS u-boot.lds LD u-boot $ ls u-boot u-boot
できた。
後から試したところ、i386 版の libssl-dev:i386 がインストールされていれば libssl-dev:armhf は必要ないみたいだった。
インストール†
Xilinx SDK を使って BOOT.bin にまとめなければならない。
後で試す。