立命館大学 大学院 講義資料 (C) by T.IZUMI @ Ritsumeikan U, Sep 2016 - 無断複製・再配布を禁ず
ZYBOにLinux環境を構築し、 設計したPWM制御モジュールをLinuxから制御する。
izumi@rsl:~$ ls -R ./zynqpwm
./zynqpwm:
zynqpwm.sdk
./zynqpwm/zynqpwm.sdk:
ZYBO_top_hw_platform_0 fsbl
./zynqpwm/zynqpwm.sdk/ZYBO_top_hw_platform_0:
ZYBO_top.bit ps7_init.c ps7_init.html ps7_init_gpl.c system.hdf
Zynq_PS_bd.tcl ps7_init.h ps7_init.tcl ps7_init_gpl.h
./zynqpwm/zynqpwm.sdk/fsbl:
Debug
./zynqpwm/zynqpwm.sdk/fsbl/Debug:
fsbl.elf
|
izumi@rsl:~$ petalinux-create --type project --template zynq --name plzybotr
INFO: Create project: plzybotr
INFO: New project successfully created in /home/izumi/plzybotr
|
izumi@rsl:~$ cd zynqpwm/zynqpwm.sdk/ZYBO_top_hw_platform_0/
izumi@rsl:~/zynqpwm/zynqpwm.sdk/ZYBO_top_hw_platform_0$ ls
ZYBO_top.bit ps7_init.c ps7_init.html ps7_init_gpl.c system.hdf
Zynq_PS_bd.tcl ps7_init.h ps7_init.tcl ps7_init_gpl.h
izumi@rsl:~/zynqpwm/zynqpwm.sdk/ZYBO_top_hw_platform_0$ petalinux-config --get-hw-description -p /home/izumi/plzybotr
INFO: Checking component...
INFO: Getting hardware description...
****** hsi v2015.4 (64-bit)
**** SW Build 1412921 on Wed Nov 18 09:44:32 MST 2015
** Copyright 1986-2015 Xilinx, Inc. All Rights Reserved.
source /home/izumi/plzybotr/build/linux/hw-description/hw-description.tcl -notrace
INFO: [Common 17-206] Exiting hsi at Tue Oct 4 08:57:25 2016...
INFO: Config linux
[INFO ] config linux
(コンフィギュレーションメニューが起動する)
|
(続き)
configuration written to /home/izumi/plzybotr/subsystems/linux/config
*** End of the configuration.
*** Execute 'make' to start the build or try 'make help'.
[INFO ] generate DTS to /home/izumi/plzybotr/subsystems/linux/configs/device-tree
INFO: [Hsi 55-1698] elapsed time for repository loading 6 seconds
WARNING: ps7_ethernet_0: No reset found
INFO: [Common 17-206] Exiting hsi at Tue Oct 4 09:07:59 2016...
[INFO ] generate BSP for zynq_fsbl
INFO: [Hsi 55-1698] elapsed time for repository loading 0 seconds
INFO: [Common 17-206] Exiting hsi at Tue Oct 4 09:08:19 2016...
INFO: Config linux/kernel
[INFO ] oldconfig linux/kernel
INFO: Config linux/rootfs
[INFO ] oldconfig linux/rootfs
INFO: Config linux/u-boot
[INFO ] generate linux/u-boot configuration files
[INFO ] generate linux/u-boot board header files
INFO: [Hsi 55-1698] elapsed time for repository loading 0 seconds
INFO: [Common 17-206] Exiting hsi at Tue Oct 4 09:08:43 2016...
[INFO ] oldconfig linux/u-boot
|
izumi@rsl:~/plzybor$ cd /home/izumi/plzybotr
|
izumi@rsl:~/plzybor$ petalinux-config -c kernel
INFO: Checking component...
INFO: Config linux/kernel
[INFO ] config linux/kernel
:
|
izumi@rsl:~/plzybotr$ ls subsystems/linux/configs/device-tree
pcw.dtsi skeleton.dtsi system-top.dts
pl.dtsi system-conf.dtsi zynq-7000.dtsi
|
izumi@rsl:~/plzybotr$ vi subsystems/linux/configs/device-tree/system-conf.dtsi ※起動設定bootargsにUIOを追加して保存する。
|
izumi@rsl:~/plzybotr$ vi subsystems/linux/configs/device-tree/pl.dtsi ※サーボ用GPIOのaxi_gpio_1と車輪モータ用axi_gpio_2についてcompatibleをUIOに書き換えて保存する。
|
izumi@rsl:~/plzybotr$ petalinux-create -t apps --name testmem
INFO: Create apps: testmem
INFO: New apps successfully created in /home/izumi/plzybotr/components/apps/testmem
izumi@rsl:~/plzybotr$ petalinux-create -t apps --name testuio
INFO: Create apps: testuio
INFO: New apps successfully created in /home/izumi/plzybotr/components/apps/testuio
izumi@rsl:~/plzybotr$ ls components/apps/*
components/apps/testmem:
Kconfig Makefile README testmem.c
components/apps/testuio:
Kconfig Makefile README testuio.c
|
izumi@rsl:~/plzybotr$ petalinux-config -c rootfs
INFO: Checking component...
INFO: Config linux/rootfs
[INFO ] config linux/rootfs
|
izumi@rsl:~/plzybotr$ petalinux-build
izumi@rsl-op780w7-03:~/plzybotr$
INFO: Checking component...
INFO: Generating make files and build linux
INFO: Generating make files for the subcomponents of linux
INFO: Building linux
[INFO ] pre-build linux/rootfs/fwupgrade
[INFO ] pre-build linux/rootfs/gpio-demo
[INFO ] pre-build linux/rootfs/peekpoke
[INFO ] pre-build linux/rootfs/testmem
[INFO ] pre-build linux/rootfs/testuio
[INFO ] build system.dtb
[INFO ] build linux/kernel
(中略、かなり時間がかかる)
[INFO ] Update and install vmlinux image
[INFO ] vmlinux linux/kernel
[INFO ] install linux/kernel
[INFO ] package zImage
[INFO ] zImage linux/kernel
[INFO ] install linux/kernel
[INFO ] Package HDF bitstream
|
petalinux-build -c rootfs/testmem
でよい。
izumi@rsl:~/plzybotr$ petalinux-package --boot \
--fsbl /home/izumi/zynqpwm/zynqpwm.sdk/fsbl/Debug/fsbl.elf \
--fpga /home/izumi/zynqpwm/zynqpwm.sdk/ZYBO_top_hw_platform_0/ZYBO_top.bit \
--uboot
INFO: File in BOOT BIN: "/home/izumi/zynqpwm/zynqpwm.sdk/fsbl/Debug/fsbl.elf"
INFO: File in BOOT BIN: "/home/izumi/zynqpwm/zynqpwm.sdk/ZYBO_top_hw_platform_0/ZYBO_top.bit"
INFO: File in BOOT BIN: "/home/izumi/plzybotr/images/linux/u-boot.elf"
INFO: Generating zynq binary package BOOT.BIN...
INFO: Binary is ready.
izumi@rsl:~/plzybotr$ ls images/linux/
BOOT.BIN image.ub u-boot-s.bin u-boot.elf zImage
System.map.linux rootfs.cpio u-boot-s.elf u-boot.srec zynq_fsbl.elf
ZYBO_top.bit rootfs.cpio.gz u-boot-s.srec urootfs.cpio.gz
image.elf system.dtb u-boot.bin vmlinux
|
BOOTP broadcast 1
BOOTP broadcast 2
DHCP client bound to address 192.168.1.9 (506 ms)
Hit any key to stop autoboot: 0
Device: zynq_sdhci
(中略)
INIT: Entering runlevel: 5
Configuring network interfaces... udhcpc (v1.23.1) started
Sending discover...
macb e000b000.ethernet eth0: link up (100/Full)
Sending discover...
Sending select for 192.168.1.9...
Lease of 192.168.1.9 obtained, lease time 172800
/etc/udhcpc.d/50default: Adding DNS 192.168.1.1
done.
Starting Dropbear SSH server: Generating key, this may take a while...
Public key portion is:
ssh-rsa AAAXXXXXXFNET: Registered protocol family 10
8tlNJM16dm2m7q7b8X root@plzybotr
Fingerprint: md5 44:a0:a4:XXXXXX:35:87:55
dropbear.
Built with PetaLinux v2015.4 (Yocto 1.8) plzybotr /dev/ttyPS0
plzybotr login: root
Password: root
login[898]: root login on 'ttyPS0'
root@plzybotr:~#
|
※SW[3:0],BTN[3:0]の読み取り(操作してみる)
root@plzybotr:~# testmem 0x41200000
mem[41200000] => 00000000
root@plzybotr:~# testmem 0x41200000
mem[41200000] => 00010000
root@plzybotr:~# testmem 0x41200000
mem[41200000] => 00030000
root@plzybotr:~# testmem 0x41200000
mem[41200000] => 00070000
root@plzybotr:~# testmem 0x41200000
mem[41200000] => 000f0000
※LD[3:0]への書き込み(点滅を確認する)
root@plzybotr:~# testmem 0x41200000 0
mem[41200000] <= 00000000
root@plzybotr:~# testmem 0x41200000 1
mem[41200000] <= 00000001
root@plzybotr:~# testmem 0x41200000 3
mem[41200000] <= 00000003
root@plzybotr:~# testmem 0x41200000 7
mem[41200000] <= 00000007
root@plzybotr:~# testmem 0x41200000 15
mem[41200000] <= 0000000f
※上下サーボへの書き込み(動作を確認する)
root@plzybotr:~# testmem 0x41210000 30000
mem[41210000] <= 00007530
root@plzybotr:~# testmem 0x41210000 -30000
mem[41210000] <= ffff8ad0
root@plzybotr:~# testmem 0x41210000 0
mem[41210000] <= 00000000
※左右サーボへの書き込み(動作を確認する)
root@plzybotr:~# testmem 0x41210008 30000
mem[41210008] <= 00007530
root@plzybotr:~# testmem 0x41210008 -30000
mem[41210008] <= ffff8ad0
root@plzybotr:~# testmem 0x41210008 0
mem[41210008] <= 00000000
※右輪モータへの書き込み(動作を確認する)
root@plzybotr:~# testmem 0x41220000 3000
mem[41220000] <= 00000bb8
root@plzybotr:~# testmem 0x41220000 -3000
mem[41220000] <= fffff448
root@plzybotr:~# testmem 0x41220000 0
mem[41220000] <= 00000000
※左輪モータへの書き込み(動作を確認する)
root@plzybotr:~# testmem 0x41220008 3000
mem[41220008] <= 00000bb8
root@plzybotr:~# testmem 0x41220008 -3000
mem[41220008] <= fffff448
root@plzybotr:~# testmem 0x41220008 0
mem[41220008] <= 00000000
|
root@plzybotr:~# ls /sys/class/gpio/
export gpiochip842 gpiochip874 gpiochip906 unexport
root@plzybotr:~# cat /sys/class/gpio/gpiochip842/label
/amba_pl/gpio@41200000
root@plzybotr:~# cat /sys/class/gpio/gpiochip874/label
/amba_pl/gpio@41200000
root@plzybotr:~# cat /sys/class/gpio/gpiochip906/label
zynq_gpio
|
※SW[3:0],BTN[3:0]の読み取り(操作してみる)
root@plzybotr:~# gpio-demo -g 874 -i
0x00000000
root@plzybotr:~# gpio-demo -g 874 -i
0x00010000
root@plzybotr:~# gpio-demo -g 874 -i
0x00030000
root@plzybotr:~# gpio-demo -g 874 -i
0x00070000
root@plzybotr:~# gpio-demo -g 874 -i
0x000F0000
※LD[3:0]への書き込み(点滅を確認する)
root@plzybotr:~# gpio-demo -g 874 -o 0
root@plzybotr:~# gpio-demo -g 874 -o 1
root@plzybotr:~# gpio-demo -g 874 -o 3
root@plzybotr:~# gpio-demo -g 874 -o 4
root@plzybotr:~# gpio-demo -g 874 -o 15
|
root@plzybotr:~# ls /dev/uio*
/dev/uio0 /dev/uio1
root@plzybotr:~# ls /sys/class/uio
uio0 uio1
root@plzybotr:~# cat /sys/class/uio/uio0/maps/map0/name
/amba_pl/gpio@41210000
root@plzybotr:~# cat /sys/class/uio/uio1/maps/map0/name
/amba_pl/gpio@41220000
|
※上下サーボへの書き込み(動作を確認する)
root@plzybotr:~# testuio /dev/uio0 0 30000
/dev/uio0 <= 00007530
root@plzybotr:~# testuio /dev/uio0 0 -30000
/dev/uio0 <= ffff8ad0
root@plzybotr:~# testuio /dev/uio0 0 0
/dev/uio0 <= 00000000
※左右サーボへの書き込み(動作を確認する)
root@plzybotr:~# testuio /dev/uio0 8 30000
/dev/uio0 <= 00007530
root@plzybotr:~# testuio /dev/uio0 8 -30000
/dev/uio0 <= ffff8ad0
root@plzybotr:~# testuio /dev/uio0 8 0
/dev/uio0 <= 00000000
※右輪モータへの書き込み(動作を確認する)
root@plzybotr:~# testuio /dev/uio1 0 3000
/dev/uio1 <= 00000bb8
root@plzybotr:~# testuio /dev/uio1 0 -3000
/dev/uio1 <= fffff448
root@plzybotr:~# testuio /dev/uio1 0 0
/dev/uio1 <= 00000000
※左輪モータへの書き込み(動作を確認する)
root@plzybotr:~# testuio /dev/uio1 8 3000
/dev/uio1 <= 00000bb8
root@plzybotr:~# testuio /dev/uio1 8 -3000
/dev/uio1 <= fffff448
root@plzybotr:~# testuio /dev/uio1 8 0
/dev/uio1 <= 00000000
|
組込みシステムでは、電源投入時やリセット時に自動で特定のプログラムを起動する。ここではLEDのデモパターン点滅プログラムを起動時に実行する。
以下では、PetaLinux を使用するマシンにて作業する。
izumi@rsl:~/plzybotr$ cd /home/izumi/plzybotr/build/linux/rootfs/targetroot/etc/init.d izumi@rsl:~/plzybotr/build/linux/rootfs/targetroot/etc/init.d$ vi testldsw.sh ※以下のように作成する
|
izumi@rsl:~/plzybotr/build/linux/rootfs/targetroot/etc/init.d$ ls ../rc*.d
../rc0.d:
K10dropbear S20sendsigs S30urandom S40umountfs
K80networking S25save-rtc.sh S31umountnfs.sh S90halt
../rc1.d:
K10dropbear K80networking S31umountnfs.sh
../rc2.d:
S01networking S10dropbear S15mountnfs.sh S99rmnologin.sh S99stop-bootlogd
../rc3.d:
S01networking S10dropbear S15mountnfs.sh S99rmnologin.sh S99stop-bootlogd
../rc4.d:
S01networking S10dropbear S15mountnfs.sh S99rmnologin.sh S99stop-bootlogd
../rc5.d:
S01networking S10dropbear S15mountnfs.sh S99rmnologin.sh S99stop-bootlogd
../rc6.d:
K10dropbear S20sendsigs S30urandom S40umountfs
K80networking S25save-rtc.sh S31umountnfs.sh S90reboot
../rcS.d:
S02banner.sh S06checkroot.sh S38devpts.sh
S02sysfs.sh S07bootlogd S38dmesg.sh
S03mdev S10flashdev S39hostname.sh
S03mountall.sh S29read-only-rootfs-hook.sh S55bootmisc.sh
S05modutils.sh S30urandom S65inetd.busybox
S06alignment.sh S37populate-volatile.sh S99run-postinsts
|
izumi@rsl:~/plzybotr/build/linux/rootfs/targetroot/etc/init.d$ ln -s ../init.d/testldsw.sh ../rc1.d/S99testldsw
izumi@rsl:~/plzybotr/build/linux/rootfs/targetroot/etc/init.d$ ln -s ../init.d/testldsw.sh ../rc2.d/S99testldsw
izumi@rsl:~/plzybotr/build/linux/rootfs/targetroot/etc/init.d$ ln -s ../init.d/testldsw.sh ../rc3.d/S99testldsw
izumi@rsl:~/plzybotr/build/linux/rootfs/targetroot/etc/init.d$ ln -s ../init.d/testldsw.sh ../rc4.d/S99testldsw
izumi@rsl:~/plzybotr/build/linux/rootfs/targetroot/etc/init.d$ ln -s ../init.d/testldsw.sh ../rc5.d/S99testldsw
|
izumi@rsl:~/plzybotr/build/linux/rootfs/targetroot/etc/init.d$ ls ../rc*.d
../rc0.d:
K10dropbear S20sendsigs S30urandom S40umountfs
K80networking S25save-rtc.sh S31umountnfs.sh S90halt
../rc1.d:
K10dropbear K80networking S31umountnfs.sh S99testldsw
../rc2.d:
S01networking S15mountnfs.sh S99stop-bootlogd
S10dropbear S99rmnologin.sh S99testldsw
../rc3.d:
S01networking S15mountnfs.sh S99stop-bootlogd
S10dropbear S99rmnologin.sh S99testldsw
../rc4.d:
S01networking S15mountnfs.sh S99stop-bootlogd
S10dropbear S99rmnologin.sh S99testldsw
../rc5.d:
S01networking S15mountnfs.sh S99stop-bootlogd
S10dropbear S99rmnologin.sh S99testldsw
../rc6.d:
K10dropbear S20sendsigs S30urandom S40umountfs
K80networking S25save-rtc.sh S31umountnfs.sh S90reboot
../rcS.d:
S02banner.sh S06checkroot.sh S38devpts.sh
S02sysfs.sh S07bootlogd S38dmesg.sh
S03mdev S10flashdev S39hostname.sh
S03mountall.sh S29read-only-rootfs-hook.sh S55bootmisc.sh
S05modutils.sh S30urandom S65inetd.busybox
S06alignment.sh S37populate-volatile.sh S99run-postinsts
|
izumi@rsl:~/plzybotr/build/linux/rootfs/targetroot/etc/init.d$ cd /home/izumi/plzybotr
izumi@rsl:~/plzybotr$ petalinux-build
:
izumi@rsl:~/plzybotr$ petalinux-package --force --boot \
--fsbl /home/izumi/zynqpwm/zynqpwm.sdk/fsbl/Debug/fsbl.elf \
--fpga /home/izumi/zynqpwm/zynqpwm.sdk/ZYBO_top_hw_platform_0/ZYBO_top.bit \
--uboot
:
|
root@plzybotr:~# mkdir /mnt/boot
root@plzybotr:~# mount /dev/mmcblk0p1 /mnt/boot
root@plzybotr:~# ls /mnt/boot
BOOT.BIN image.ub
root@plzybotr:~# scp izumi@192.168.1.8:/home/izumi/plzybotr/images/linux/BOOT.BIN /mnt/boot/
izumi@192.168.1.8's password:
BOOT.BIN 100% 2473KB 2.4MB/s 00:00
root@plzybotr:~# scp izumi@192.168.1.8:/home/izumi/plzybotr/images/linux/image.ub /mnt/boot/
izumi@192.168.1.8's password:
image.ub 100% 6449KB 6.3MB/s 00:01
root@plzybotr:~# sync
root@plzybotr:~# shutdown -r now
|
| qspiboot.bif |
|---|
the_ROM_image:
{
[bootloader] /home/izumi/zynqpwm/zynqpwm.sdk/fsbl/Debug/fsbl.elf
/home/izumi/zynqpwm/zynqpwm.runs/impl_1/ZYBO_top.bit
./images/linux/u-boot.elf
./images/linux/image.ub
}
|
$ bootgen -image qspiboot.bif -o qspiboot.bin -w -log info
:
[INFO] : After Link
-- Dump of Binary Image ----
00000000 Len: 000008a0 Res: 00000000 "BootHeader"
000008c0 Len: 00000040 Res: 00000000 "ImageHeaderTable"
00000900 Len: 00000020 Res: 00000000 "ImageHeader fsbl.elf"
00000940 Len: 00000024 Res: 00000000 "ImageHeader ZYBO_top.bit"
00000980 Len: 00000020 Res: 00000000 "ImageHeader u-boot.elf"
000009c0 Len: 00000020 Res: 000002c0 "ImageHeader image.ub"
00000c80 Len: 00000040 Res: 00000000 "PartitionHeader fsbl.elf.0"
00000cc0 Len: 00000040 Res: 00000000 "PartitionHeader ZYBO_top.bit.0"
00000d00 Len: 00000040 Res: 00000000 "PartitionHeader u-boot.elf.0"
00000d40 Len: 00000040 Res: 00000000 "PartitionHeader image.ub.0"
00000d80 Len: 00000040 Res: 00000980 "PartitionHeader Null"
00001700 Len: 0001800c Res: 00000000 "fsbl.elf.0"
00019740 Len: 001fcba0 Res: 00000000 "ZYBO_top.bit.0"
00216300 Len: 00054278 Res: 00000000 "u-boot.elf.0"
0026a580 Len: 007bbf94 Res: 00000000 "image.ub.0"
-- End of Dump
|
$ program_flash -f qspiboot.bin -offset 0 -flash_type qspi_single -cable type xilinx_tcf url TCP:127.0.0.1:3121
|
U-Boot 2015.07 (Oct 10 2016 - 21:41:17 +0900)
DRAM: ECC disabled 512 MiB
MMC: zynq_sdhci: 0
SF: Detected S25FL128S_64K with page size 256 Bytes, erase size 64 KiB, total 16 MiB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: Gem.e000b000
U-BOOT for plzybotr
Gem.e000b000 Waiting for PHY auto negotiation to complete......... TIMEOUT !
Gem.e000b000: No link.
Hit any key to stop autoboot: 0
SF: Detected S25FL128S_64K with page size 256 Bytes, erase size 64 KiB, total 16 MiB
device 0 offset 0x520000, size 0xa80000
SF: 11010048 bytes @ 0x520000 Read: OK
Wrong Image Format for bootm command
ERROR: can't get kernel image!
U-Boot-PetaLinux>
|
U-Boot-PetaLinux> echo $netstart
0x01000000
U-Boot-PetaLinux> sf read $netstart 26a580 7bbf94
device 0 offset 0x26a580, size 0x7bbf94
SF: 8109972 bytes @ 0x26a580 Read: OK
U-Boot-PetaLinux> bootm $netstart
## Loading kernel from FIT Image at 01000000 ...
:
Built with PetaLinux v2015.4 (Yocto 1.8) plzybotr /dev/ttyPS0
plzybotr login:
|
| qspiboot.bif |
|---|
the_ROM_image:
{
[bootloader] /home/izumi/zynqpwm/zynqpwm.sdk/fsbl/Debug/fsbl.elf
/home/izumi/zynqpwm/zynqpwm.runs/impl_1/ZYBO_top.bit
./images/linux/u-boot.elf
[offset = 0x520000, reserve = 0xa80000]./images/linux/image.ub
}
|
$ bootgen -image qspiboot.bif -o qspiboot.bin -w -log info
:
[INFO] : After Link
-- Dump of Binary Image ----
00000000 Len: 000008a0 Res: 00000000 "BootHeader"
000008c0 Len: 00000040 Res: 00000000 "ImageHeaderTable"
00000900 Len: 00000020 Res: 00000000 "ImageHeader fsbl.elf"
00000940 Len: 00000024 Res: 00000000 "ImageHeader ZYBO_top.bit"
00000980 Len: 00000020 Res: 00000000 "ImageHeader u-boot.elf"
000009c0 Len: 00000020 Res: 000002c0 "ImageHeader image.ub"
00000c80 Len: 00000040 Res: 00000000 "PartitionHeader fsbl.elf.0"
00000cc0 Len: 00000040 Res: 00000000 "PartitionHeader ZYBO_top.bit.0"
00000d00 Len: 00000040 Res: 00000000 "PartitionHeader u-boot.elf.0"
00000d40 Len: 00000040 Res: 00000000 "PartitionHeader image.ub.0"
00000d80 Len: 00000040 Res: 00000980 "PartitionHeader Null"
00001700 Len: 0001800c Res: 00000000 "fsbl.elf.0"
00019740 Len: 001fcba0 Res: 00000000 "ZYBO_top.bit.0"
00216300 Len: 00054278 Res: 00000000 "u-boot.elf.0"
00520000 Len: 007bbf94 Res: 00a80000 "image.ub.0"
-- End of Dump
|
$ program_flash -f qspiboot.bin -offset 0 -flash_type qspi_single -cable type xilinx_tcf url TCP:127.0.0.1:3121
|