立命館大学 大学院 講義資料
(C) by T.IZUMI @ Ritsumeikan U, Apr 2021 - 無断複製・再配布を禁ず
Acknowledgements:
the base design is presented by Kaitlyn Franz and
the base kit is provided by Digilent Inc.
PWM制御モジュールをLinuxから制御する。
Zybot の linaro 環境はK.Franz氏により提供されている。 そのシステムの構成を確認しておく。
linaro@linaro-ubuntu-desktop:~$ cd /home/linaro/zybot
linaro@linaro-ubuntu-desktop:~$ dtc -I dtb -O dts -o devicetree.dts /mnt/ZYBO_BOOT/devicetree.dtb
DTC: dtb->dts on file "/mnt/ZYBO_BOOT/devicetree.dtb"
linaro@linaro-ubuntu-desktop:~$ more devicetree.dts
:
gpio_btns@41210000 {
#gpio-cells = <0x2>;
compatible = "xlnx,xps-gpio-1.00.a";
gpio-controller;
reg = <0x41210000 0x10000>;
:
};
gpio_leds@41200000 {
#gpio-cells = <0x2>;
compatible = "xlnx,xps-gpio-1.00.a";
gpio-controller;
reg = <0x41200000 0x10000>;
:
};
gpio_sws@41220000 {
#gpio-cells = <0x2>;
compatible = "xlnx,xps-gpio-1.00.a";
gpio-controller;
reg = <0x41220000 0x10000>;
:
};
:
motor {
compatible = "dglnt,motor-1.00.a";
reg = <0x43c40000 0x10000>;
};
servo {
compatible = "dglnt,servo-1.00.a";
reg = <0x43c30000 0x10000>;
};
:
|
| 制御対象 | 方向 | 物理アドレス | ビット位置 | 値 |
|---|---|---|---|---|
| LD[3:0] | output | 0x41200000 | [3:0] | 各ビットが各LED |
| BTN[3:0] | input | 0x41210000 | [3:0] | 各ビットが各BTN |
| SW[3:0] | input | 0x41220000 | [3:0] | 各ビットが各SW |
| 上下サーボPWM | output | 0x43c30000 | [31:0] | 120000〜180000 |
| 左右サーボPWM | output | 0x43c30004 | [31:0] | 120000〜180000 |
| 右輪EN | output | 0x43c40000 | [0:0] | 1で動作、0で停止 |
| 右輪DIR | output | 0x43c40000 | [1:1] | 0で前進、1で後退 |
| 左輪EN | output | 0x43c40000 | [8:8] | 1で動作、0で停止 |
| 左輪DIR | output | 0x43c40000 | [9:9] | 1で前進、0で後退 |
| 右輪出力PWM | output | 0x43c40004 | [31:0] | 0〜50000 |
| 左輪出力PWM | output | 0x43c40010 | [31:0] | 0〜50000 |
linaro@linaro-ubuntu-desktop:~$ cd /home/linaro/zybot
linaro@linaro-ubuntu-desktop:~$ more testmem.c
:
linaro@linaro-ubuntu-desktop:~$ gcc -Wall -o testmem testmem.c
|
※BTN[3:0]の読み取り(操作してみる)
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x41210000
mem[41210000] => 00000000
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x41210000
mem[41210000] => 00000001
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x41210000
mem[41210000] => 00000008
※SW[3:0]の読み取り(操作してみる)
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x41220000
mem[41220000] => 00000000
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x41220000
mem[41220000] => 00000001
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x41220000
mem[41220000] => 0000000f
※LD[3:0]への書き込み(点滅を確認する)
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x41200000 1
mem[41200000] <= 00000001
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x41200000 15
mem[41200000] <= 0000000f
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x41200000 0
mem[41200000] <= 00000000
※上下サーボへの書き込み(動作を確認する)
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x43c30000 120000
mem[43c30000] <= 0001d4c0
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x43c30000 180000
mem[43c30000] <= 0002bf20
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x43c30000 150000
mem[43c30000] <= 000249f0
※左右サーボへの書き込み(動作を確認する)
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x43c30004 120000
mem[43c30004] <= 0001d4c0
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x43c30004 180000
mem[43c30004] <= 0002bf20
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x43c30004 150000
mem[43c30004] <= 000249f0
※左輪モータへの書き込み(動作を確認する)
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x43c40000 0x0000
mem[43c40000] <= 00000000
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x43c40004 20000
mem[43c40004] <= 00004e20
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x43c40000 0x0001
mem[43c40000] <= 00000001
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x43c40000 0x0003
mem[43c40000] <= 00000003
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x43c40000 0x0000
mem[43c40000] <= 00000000
※右輪モータへの書き込み(動作を確認する)
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x43c40010 20000
mem[43c40010] <= 00004e20
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x43c40000 0x0300
mem[43c40000] <= 00000300
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x43c40000 0x0100
mem[43c40000] <= 00000100
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testmem 0x43c40000 0x0000
mem[43c40000] <= 00000000
|
linaro@linaro-ubuntu-desktop:~$ ls /sys/class/gpio/
export gpiochip842 gpiochip874 gpiochip906 unexport
root@ZR-01:~$ ls /sys/class/gpio/
export gpio899 gpio901 gpio903 gpio905 gpiochip898 gpiochip906
gpio898 gpio900 gpio902 gpio904 gpiochip894 gpiochip902 unexport
root@ZR-01:~$ ls /sys/class/gpio/*/label
/sys/class/gpio/gpiochip894/label /sys/class/gpio/gpiochip902/label
/sys/class/gpio/gpiochip898/label /sys/class/gpio/gpiochip906/label
zynq_gpio
root@ZR-01:~$ cat /sys/class/gpio/gpiochip894/label
/amba_pl/gpio_sws@41220000
root@ZR-01:~$ cat /sys/class/gpio/gpiochip898/label
/amba_pl/gpio_leds@41200000
root@ZR-01:~$ cat /sys/class/gpio/gpiochip902/label
/amba_pl/gpio_btns@41210000
root@ZR-01:~$ cat /sys/class/gpio/gpiochip906/label
zynq_gpio
|
linaro@linaro-ubuntu-desktop:~$ cd /home/linaro/zybot
linaro@linaro-ubuntu-desktop:~/zybot$ more testgpio.sh
:
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testgpio.sh
※LD[3:0]の発光パタンを確認し、またBTN[3:0]を操作してみる
BTN0=0
BTN1=0
BTN2=1
BTN3=0
|
linaro@linaro-ubuntu-desktop:~$ cd /home/linaro/zybot
linaro@linaro-ubuntu-desktop:~/zybot$ more testgpio_zybot.c
:
linaro@linaro-ubuntu-desktop:~/zybot$ gcc -Wall -o testgpio_zybot testgpio_zybot.c
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testgpio_zybot
※LD[3:0]の発光パタンを確認し、またBTN[3:0]を操作してみる
BTN[0]=0
BTN[1]=0
BTN[2]=1
BTN[3]=0
|
linaro@linaro-ubuntu-desktop:~$ ls /proc
1 16 2248 2434 3 3567 5 asound ioports slabinfo
10 1606 2249 2436 3020 3568 566 buddyinfo irq softirqs
11 1630 2250 2488 3074 3706 567 bus kallsyms stat
12 17 2272 2503 3143 377 599 cgroups kmsg swaps
1337 1711 2278 2531 3154 3865 6 cmdline kpagecount sys
1345 1732 2297 2568 3158 3880 685 config.gz kpageflags sysvipc
14 19 2302 2570 3244 391 7 consoles loadavg thread-self
1485 2 2305 2572 3245 3952 716 cpu locks timer_list
1489 2003 2320 2574 3324 3953 720 cpuinfo meminfo timer_stats
1499 2076 2358 2601 3353 3963 734 crypto misc tty
15 2088 2367 2607 336 3966 747 device-tree modules uptime
1531 2127 2369 2609 338 3969 758 devices motor_ctrl version
1534 2130 2404 2615 339 3980 767 diskstats mounts vmallocinfo
1538 2131 2406 2622 342 4052 768 driver mtd vmstat
1546 2145 2415 2660 3467 4053 769 execdomains net zoneinfo
1553 2146 2421 2674 3472 4068 770 fb pagetypeinfo
1572 2186 2427 2689 3474 474 8 filesystems partitions
1573 2191 2428 2730 3481 488 9 fs scsi
1578 2201 2430 2741 3483 489 914 interrupts self
1595 2210 2432 2975 3492 490 919 iomem servo_ctrl
|
linaro@linaro-ubuntu-desktop:~$ cd /home/linaro/zybot
linaro@linaro-ubuntu-desktop:~/zybot$ more testproc_zybot.c
:
linaro@linaro-ubuntu-desktop:~/zybot$ gcc -Wall -o testproc_zybot testproc_zybot.c
linaro@linaro-ubuntu-desktop:~/zybot$ sudo ./testproc_zybot
※カメラや車輪の動作を確認する
|
#include <unistd.h>
#include <fcntl.h>
// open 部分のコード例
int fd;
fd=open("/proc/motor_ctrl",O_WRONLY);
// write 部分のコード例
unsigned int buf[2];
buf[0]=offset;
buf[1]=value;
write(fd,(void *)buf,sizeof(unsigned int)*2);
|
組込みシステムでは、電源投入時やリセット時に自動で特定のプログラムを起動する。Zybot-R での起動スクリプトを確認する。
linaro@linaro-ubuntu-desktop:~$ ls -l /etc/init.d/server_script
-rwxr-xr-x 1 root root 2455 Sep 24 17:15 /etc/init.d/server_script
linaro@linaro-ubuntu-desktop:~$ ls -l /etc/rc*.d/*server_script
lrwxrwxrwx 1 root root 23 Aug 28 14:28 /etc/rc0.d/K20server_script -> ../init.d/server_script
lrwxrwxrwx 1 root root 23 Aug 28 14:28 /etc/rc1.d/K20server_script -> ../init.d/server_script
lrwxrwxrwx 1 root root 23 Aug 28 14:28 /etc/rc2.d/S20server_script -> ../init.d/server_script
lrwxrwxrwx 1 root root 23 Aug 28 14:28 /etc/rc3.d/S20server_script -> ../init.d/server_script
lrwxrwxrwx 1 root root 23 Aug 28 14:28 /etc/rc4.d/S20server_script -> ../init.d/server_script
lrwxrwxrwx 1 root root 23 Aug 28 14:28 /etc/rc5.d/S20server_script -> ../init.d/server_script
lrwxrwxrwx 1 root root 23 Aug 28 14:28 /etc/rc6.d/K20server_script -> ../init.d/server_script
linaro@linaro-ubuntu-desktop:~$ more /etc/init.d/server_script
:
|