zynq/Petalinux2018.3でaxi_gpio の履歴(No.1)
更新- 履歴一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- 電気回路/zynq/Petalinux2018.3でaxi_gpio へ行く。
axi_gpio の追加†
CPU から axi_gpio 経由で制御する。
vivado の Block Diagram に axi_gpio を置き、ダブルクリック。 GPIO Width に適当な値を入れる。 (ここでは LCD_RST ピン以外も制御したかったため5を入れた)
&ref(): File not found: "axi_gpio-width.png" at page "電気回路/zynq/I2CでLCD(NHD-C0216CIZ)を制御する";
GPIO ポートの上で右クリック後 [Make External] する。
&ref(): File not found: "axi_gpio-make_external.png" at page "電気回路/zynq/Petalinux2018.3でaxi_gpio";
追加された GPIO_1 ポートをクリックして、プロパティエディタで適当な名前に変更。
&ref(): File not found: "axi_gpio-port-rename.png" at page "電気回路/zynq/Petalinux2018.3でaxi_gpio";
Diagram の右クリックから [Run Connection Automation] すると、
&ref(): File not found: "axi_gpio-connection.png" at page "電気回路/zynq/Petalinux2018.3でaxi_gpio";
Processor System Reset および AXI Interconnect が追加され、接続が完了する。
design_1_wrapper の編集†
design_1 は Dialog から生成されるのだけれど、 design_1_wrapper は手動で変更しなければならないらしい?
LANG:verilog
module design_1_wrapper(
...
//user define io,
DATAPINS,
...
);
inout [4:0] DATAPINS;
....
// user wire define code
wire [4:0] DATAPINS_i, DATAPINS_o, DATAPINS_t;
...
//user logic example
IOBUF DATAPINS_0_iobuf(.I(DATAPINS_o[0]),.IO(DATAPINS[0]),.O(DATAPINS_i[0]),.T(DATAPINS_t[0]));
IOBUF DATAPINS_1_iobuf(.I(DATAPINS_o[1]),.IO(DATAPINS[1]),.O(DATAPINS_i[1]),.T(DATAPINS_t[1]));
IOBUF DATAPINS_2_iobuf(.I(DATAPINS_o[2]),.IO(DATAPINS[2]),.O(DATAPINS_i[2]),.T(DATAPINS_t[2]));
IOBUF DATAPINS_3_iobuf(.I(DATAPINS_o[3]),.IO(DATAPINS[3]),.O(DATAPINS_i[3]),.T(DATAPINS_t[3]));
IOBUF DATAPINS_4_iobuf(.I(DATAPINS_o[4]),.IO(DATAPINS[4]),.O(DATAPINS_i[4]),.T(DATAPINS_t[4]));
design_1 design_1_i(
...
.DATAPINS_tri_i(DATAPINS_i),
.DATAPINS_tri_o(DATAPINS_o),
.DATAPINS_tri_t(DATAPINS_i),
...
);
ピン配置の指定†
xdc ファイルの中で PACKAGE_PIN を指定する。
LANG:xdc
set_property PACKAGE_PIN A20 [get_ports {DATAPINS[4]}] ;# IO_B35_LN[2]
set_property IOSTANDARD LVCMOS33 [get_ports {DATAPINS[4]}] ;# IO_B35_LN[2]
- コメントは # の前に ; を付けておかないとエラーになるらしい
vivado 上でビルド†
vivado 上で Generate Block Design 後、Generate Bitstream する。
あれ?
[Synth 8-439] module 'design_1_processing_system7_0_0' not found ["(snip).srcs/sources_1/bd/design_1/synth/design_1.v":239]
のエラーが出た。
[Design Sources]-[design_1_wrapper]-[design_1_i] の上で右クリックから、 [Reset Output Products] してからビルドしたところうまくいった。
&ref(): File not found: "design-reset-output.png" at page "電気回路/zynq/Petalinux2018.3でaxi_gpio";
PL をプログラムする†
(project).runs\impl_1\design_1_wrapper.bin を ~/lcd-control/design_1_wrapper.bin にコピー
LANG:console $ cd ~/lcd-control $ sudo fpga-load design_1_wrapper.bin
Device Tree の更新†
上のようにして追加した axi_gpio は petalinux の作る system.dtb に現れるんだろうか?
試してみたいところだが、system.dtb のみをビルドする方法が分からない
普通にやるなら hdf を petalinux へ持って行って、 もう一度 petalinux-configure してから petalinux-build だけど、 これをやると小一時間かかるのでいくらなんでも・・・
そこで、 https://okchan08.hateblo.jp/entry/2019/02/01/190000 を見ながら手動で設定してしまう。
LANG:console
$ cat << EOT > gpio1.dtso
> // Device Tree File for gpio1
> /dts-v1/;
> /plugin/;
> / {
> fragment@0 {
> target-path = "/amba";
> __overlay__ {
> #address-cells = <1>;
> #size-cells = <1>;
> axi_gpio_0: axi_gpio@41200000 {
> #gpio-cells = <3>;
> clock-names = "s_axi_aclk";
> clocks = <&clkc 15>;
> compatible = "xlnx,axi-gpio-2.0", "xlnx,xps-gpio-1.00.a";
> gpio-controller ;
> reg = <0x41200000 0x10000>;
> xlnx,all-inputs = <0x0>;
> xlnx,all-inputs-2 = <0x0>;
> xlnx,all-outputs = <0x0>;
> xlnx,all-outputs-2 = <0x0>;
> xlnx,dout-default = <0x00000000>;
> xlnx,dout-default-2 = <0x00000000>;
> xlnx,gpio-width = <0x5>;
> xlnx,gpio2-width = <0x0>;
> xlnx,interrupt-present = <0x0>;
> xlnx,is-dual = <0x0>;
> xlnx,tri-default = <0xFFFFFFFF>;
> xlnx,tri-default-2 = <0xFFFFFFFF>;
> };
> };
> };
> };
> EOT
$ ls /sys/kernel/config/device-tree/overlays/
$ sudo mkdir -p /sys/kernel/config/device-tree/overlays/gpio1
$ ls /sys/kernel/config/device-tree/overlays/gpio1
dtbo path status
$ sudo dtc -o dtb gpio1.dtso -o /sys/kernel/config/device-tree/overlays/gpio1/dtbo
$ ls /proc/device-tree/amba/axi_gpio@41200000/
'#gpio-cells' gpio-controller xlnx,all-inputs-2 xlnx,dout-default-2 xlnx,is-dual
clock-names name xlnx,all-outputs xlnx,gpio-width xlnx,tri-default
clocks reg xlnx,all-outputs-2 xlnx,gpio2-width xlnx,tri-default-2
compatible xlnx,all-inputs xlnx,dout-default xlnx,interrupt-present
$ ls /dev/gpiochip1
/dev/gpiochip1
/dev/gpiochip1 というデバイスができた。
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841846/AXI+GPIO
に使い方がある。