立命館大学 大学院 講義資料 (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 |