zynq/Petalinux2018.3でaxi_gpio のバックアップ差分(No.3)

更新


  • 追加された行はこの色です。
  • 削除された行はこの色です。
[[電気回路/zynq]]

** axi_gpio の追加 [#cf1a998e]

CPU から axi_gpio 経由で制御する。

vivado の Block Diagram に axi_gpio を置き、ダブルクリック。
GPIO Width に適当な値を入れる。
(ここでは LCD_RST ピン以外も制御したかったため5を入れた)

&ref(電気回路/zynq/I2CでLCD(NHD-C0216CIZ)を制御する/axi_gpio-width.png,,33%);

GPIO ポートの上で右クリック後 [Make External] する。

&ref(電気回路/zynq/I2CでLCD(NHD-C0216CIZ)を制御する/axi_gpio-make_external.png,,50%);

追加された GPIO_1 ポートをクリックして、プロパティエディタで適当な名前に変更。

&ref(電気回路/zynq/I2CでLCD(NHD-C0216CIZ)を制御する/axi_gpio-port-rename.png,,50%);

Diagram の右クリックから [Run Connection Automation] すると、

&ref(電気回路/zynq/I2CでLCD(NHD-C0216CIZ)を制御する/axi_gpio-connection.png,,33%);

Processor System Reset および AXI Interconnect が追加され、接続が完了する。

** design_1_wrapper の編集 [#td6a4ab7]

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),
        ...
 );

** ピン配置の指定 [#ie814751]

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]

- コメントは # の前に ; を付けておかないとエラーになるらしい

https://japan.xilinx.com/support/answers/51613.html

** vivado 上でビルド [#u89f9a56]

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(電気回路/zynq/I2CでLCD(NHD-C0216CIZ)を制御する/design-reset-output.png,,50%);
** PL をプログラムする [#i092c854]

(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 の更新 [#tab2c783]

上のようにして追加した axi_gpio は petalinux の作る system.dtb に現れるんだろうか?
上のようにして追加した axi_gpio は petalinux が自動で作る system.dtb に現れるんだろうか?

試してみたいところだが、system.dtb のみをビルドする方法が分からない

普通にやるなら hdf を petalinux へ持って行って、
もう一度 petalinux-configure してから petalinux-build だけど、
これをやると小一時間かかるのでいくらなんでも・・・

そこで、
- https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841846/AXI+GPIO
- https://www.xilinx.com/support/documentation/ip_documentation/axi_gpio/v2_0/pg144-axi-gpio.pdf#page=20

を見ながら手動で設定してしまう。

[[Device Tree書き換え用スクリプト dto>電気回路/zynq/Petalinux2018.3でPLとDevice Treeを動的に変更する#b87fd39f]] を使う。

 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
 $ sudo dto gpio1 gpio1.dtso
 $ 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
 $ ls -l /sys/class/gpio/gpiochip901/
  total 0
  -r--r--r-- 1 root root 4096  1月 28 19:02 base
  lrwxrwxrwx 1 root root    0  1月 28 19:02 device -> ../../../41200000.axi_gpio
  -r--r--r-- 1 root root 4096  1月 28 19:02 label
  -r--r--r-- 1 root root 4096  1月 28 19:02 ngpio
  drwxr-xr-x 2 root root    0  1月 28 19:02 power
  lrwxrwxrwx 1 root root    0  1月 28 19:02 subsystem -> ../../../../../../class/gpio
  -rw-r--r-- 1 root root 4096  1月 28 19:02 uevent

/dev/gpiochip1 というデバイスができた。

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841846/AXI+GPIO

に使い方がある・・・のだろうか?何だかよくわからない。
に使い方がある。

generic-uio で使った方が楽な気がするなあ・・・


Counter: 8885 (from 2010/06/03), today: 2, yesterday: 1