Ultra96V2+Debian環境でのPSのGPIO制御メモ

## はじめに
[Ultra96V2ボード](https://www.avnet.com/wps/portal/japan/products/product-highlights/ultra96/) + [Debian環境](https://qiita.com/ikwzm/items/92221c5ea6abbd5e991c)で PSのGPIOを弄りたかったのですが、Linuxからのやり方や、番号の対応がよくわからなかったので、少し調べてみたメモ書きです(自信のないところも多いですが)。

## rootで操作

以下 sudo su などで root になってから操作する前提で説明しております。
sudo を使う場合は sudo sh -c "echo hoge > hogehoge"  などとしないとリダイレクト部分で権限が戻ってしまうので注意が必要です。

## GPIO の制御

例として40ピンのLS拡張コネクタのに出てきている MIO36_PS_GPIO1_0 (23番ピン) を操作する場合

```
echo "36" > /sys/class/gpio/export
```

とすると /sys/class/gpio/gpio36 が出現するので

```
echo "out" >  /sys/class/gpio/gpio36/direction
echo "1" > /sys/class/gpio/gpio36/value
```

のようにすると出力に切り替えて1が書き込めるようです。

```
echo "36" > /sys/class/gpio/unexport
```

とすると削除できます。

## LED の点灯

LEDの場合、gpio-keys が制御しているので

```
echo "1" > /sys/class/leds/ds5/brightness
```
で点灯し

```
echo "0" > /sys/class/leds/ds5/brightness
```
で消灯します。


## 番号対応

ざっくり調べた範囲の番号対応です。

[TRM](https://www.xilinx.com/support/documentation/user_guides/ug1085-zynq-ultrascale-trm.pdf)に "78 GPIO signals for device pins, 96 GPIO channels between PS and PL, programmable interrupt on individual GPIO channel." と書かれていますのでそのまま 78+96 = 174個という事なのだと思います。

/sys/class/gpio/export したら出現してくれたものを一覧にしていますが、当然ながら他の用途に利用中のものを操作してしまうと何が起こるかわかりませんので注意して利用しましょう。

ちなみにVivadoのブロックデザイナで[PLへのGPIOのアサイン可能な数は pl_resetn の使用個数で変わる](https://japan.xilinx.com/support/answers/68962.html)ようです。

|No.|16進|path|name|備考|
|--|--|--|--|--|
|0|0x00|/sys/class/gpio/gpio0|UART1_TX||
|1|0x01|/sys/class/gpio/gpio1|UART1_RX||
|2|0x02|/sys/class/gpio/gpio2|UART0_RX||
|3|0x03|/sys/class/gpio/gpio3|UART0_TX||
|4|0x04|/sys/class/gpio/gpio4|I2C1_SCL||
|5|0x05|/sys/class/gpio/gpio5|I2C1_SDA||
|6|0x06|/sys/class/gpio/gpio6|SPI1_SCLK||
|7|0x07|/sys/class/gpio/gpio7|RADIO_RST_N|wilc_sdio|
|8|0x08|/sys/class/gpio/gpio8|RADIO_EN|wilc_sdio|
|9|0x09|/sys/class/gpio/gpio9|SPI1_CS||
|10|0x0A|/sys/class/gpio/gpio10|SPI1_MISO||
|11|0x0B|/sys/class/gpio/gpio11|SPI1_MOSI||
|12|0x0C|/sys/class/gpio/gpio12|I2C_MUX_RESET||
|13|0x0D|/sys/class/gpio/gpio13|SD0_DAT0||
|14|0x0E|/sys/class/gpio/gpio14|SD0_DAT1||
|15|0x0F|/sys/class/gpio/gpio15|SD0_DAT2||
|16|0x10|/sys/class/gpio/gpio16|SD0_DAT3||
|17|0x11|/sys/class/leds/ds5|PS_LED3||
|18|0x12|/sys/class/leds/ds4|PS_LED2||
|19|0x13|/sys/class/leds/ds3|PS_LED1||
|20|0x14|/sys/class/leds/ds2|PS_LED0|別用途に使われている？|
|21|0x15|/sys/class/gpio/gpio21|SD0_CMD||
|22|0x16|/sys/class/gpio/gpio22|SD0_CLK||
|23|0x17||GPIO_PB|sw4(gpio-keys)|
|24|0x18|/sys/class/gpio/gpio24|SD0_DETECT||
|25|0x19|/sys/class/leds/vbus_det|VBUS_DET||
|26|0x1A|/sys/class/gpio/gpio26|POWER_INT|ltc2954|
|27|0x1B|/sys/class/gpio/gpio27|DP_AUX||
|28|0x1C|/sys/class/gpio/gpio28|DP_HPD||
|29|0x1D|/sys/class/gpio/gpio29|DP_OE||
|30|0x1E|/sys/class/gpio/gpio30|DP_AUX_IN||
|31|0x1F|/sys/class/gpio/gpio31|INA226_ALERT||
|32|0x20|/sys/class/gpio/gpio32|PS_FP_PWR_EN||
|33|0x21|/sys/class/gpio/gpio33|PL_PWR_EN||
|34|0x22|/sys/class/gpio/gpio34|POWER_KILL|ltc2954|
|35|0x23|/sys/class/gpio/gpio35|-|ltc2954|
|36|0x24|/sys/class/gpio/gpio36|GPIO-A||
|37|0x25|/sys/class/gpio/gpio37|GPIO-B||
|38|0x26|/sys/class/gpio/gpio38|SPI0_SCLK||
|39|0x27|/sys/class/gpio/gpio39|GPIO-C||
|40|0x28|/sys/class/gpio/gpio40|GPIO-D||
|41|0x29|/sys/class/gpio/gpio41|SPI0_CS||
|42|0x2A|/sys/class/gpio/gpio42|SPI0_MISO||
|43|0x2B|/sys/class/gpio/gpio43|SPI_MOSI||
|44|0x2C|/sys/class/gpio/gpio44|GPIO-E||
|45|0x2D|/sys/class/gpio/gpio45|GPIO-F||
|46|0x2E|/sys/class/gpio/gpio46|SD1_D0||
|47|0x2F|/sys/class/gpio/gpio47|SD1_D1||
|48|0x30|/sys/class/gpio/gpio48|SD1_D2||
|49|0x31|/sys/class/gpio/gpio49|SD1_D3||
|50|0x32|/sys/class/gpio/gpio50|SD1_CMD||
|51|0x33|/sys/class/gpio/gpio51|SD1_CLK||
|52|0x34|/sys/class/gpio/gpio52|USB0_CLK||
|53|0x35|/sys/class/gpio/gpio53|USB0_DIR||
|54|0x36|/sys/class/gpio/gpio54|USB0_DATA2||
|55|0x37|/sys/class/gpio/gpio55|USB0_NXT||
|56|0x38|/sys/class/gpio/gpio56|USB0_DATA0||
|57|0x39|/sys/class/gpio/gpio57|USB0_DATA1||
|58|0x3A|/sys/class/gpio/gpio58|USB0_STP||
|59|0x3B|/sys/class/gpio/gpio59|USB0_DATA3||
|60|0x3C|/sys/class/gpio/gpio60|USB0_DATA4||
|61|0x3D|/sys/class/gpio/gpio61|USB0_DATA5||
|62|0x3E|/sys/class/gpio/gpio62|USB0_DATA6||
|63|0x3F|/sys/class/gpio/gpio63|USB0_DATA7||
|64|0x40|/sys/class/gpio/gpio64|USB1_CLK||
|65|0x41|/sys/class/gpio/gpio65|USB1_DIR||
|66|0x42|/sys/class/gpio/gpio66|USB1_DATA2||
|67|0x43|/sys/class/gpio/gpio67|USB1_NXT||
|68|0x44|/sys/class/gpio/gpio68|USB1_DATA0||
|69|0x45|/sys/class/gpio/gpio69|USB1_DATA1||
|70|0x46|/sys/class/gpio/gpio70|USB1_STP||
|71|0x47|/sys/class/gpio/gpio71|USB1_DATA3||
|72|0x48|/sys/class/gpio/gpio72|USB1_DATA4||
|73|0x49|/sys/class/gpio/gpio73|USB1_DATA5||
|74|0x4A|/sys/class/gpio/gpio74|USB1_DATA6||
|75|0x4B|/sys/class/gpio/gpio75|USB_DATA7||
|76|0x4C|/sys/class/gpio/gpio76|WLAN_IRQ|wilc_sdio|
|77|0x4D|/sys/class/gpio/gpio77|PMIC_IRQ||
|78|0x4E|/sys/class/gpio/gpio78|PL GPIO0||
|79|0x4F|/sys/class/gpio/gpio79|PL GPIO1||
|80|0x50|/sys/class/gpio/gpio80|PL GPIO2||
|81|0x51|/sys/class/gpio/gpio81|PL GPIO3||
|82|0x52|/sys/class/gpio/gpio82|PL GPIO4||
|83|0x53|/sys/class/gpio/gpio83|PL GPIO5||
|84|0x54|/sys/class/gpio/gpio84|PL GPIO6||
|85|0x55|/sys/class/gpio/gpio85|PL GPIO7||
|86|0x56|/sys/class/gpio/gpio86|PL GPIO8||
|87|0x57|/sys/class/gpio/gpio87|PL GPIO9||
|88|0x58|/sys/class/gpio/gpio88|PL GPIO10||
|89|0x59|/sys/class/gpio/gpio89|PL GPIO11||
|90|0x5A|/sys/class/gpio/gpio90|PL GPIO12||
|91|0x5B|/sys/class/gpio/gpio91|PL GPIO13||
|92|0x5C|/sys/class/gpio/gpio92|PL GPIO14||
|93|0x5D|/sys/class/gpio/gpio93|PL GPIO15||
|94|0x5E|/sys/class/gpio/gpio94|PL GPIO16||
|95|0x5F|/sys/class/gpio/gpio95|PL GPIO17||
|96|0x60|/sys/class/gpio/gpio96|PL GPIO18||
|97|0x61|/sys/class/gpio/gpio97|PL GPIO19||
|98|0x62|/sys/class/gpio/gpio98|PL GPIO20||
|99|0x63|/sys/class/gpio/gpio99|PL GPIO21||
|100|0x64|/sys/class/gpio/gpio100|PL GPIO22||
|101|0x65|/sys/class/gpio/gpio101|PL GPIO23||
|102|0x66|/sys/class/gpio/gpio102|PL GPIO24||
|103|0x67|/sys/class/gpio/gpio103|PL GPIO25||
|104|0x68|/sys/class/gpio/gpio104|PL GPIO26||
|105|0x69|/sys/class/gpio/gpio105|PL GPIO27||
|106|0x6A|/sys/class/gpio/gpio106|PL GPIO28||
|107|0x6B|/sys/class/gpio/gpio107|PL GPIO29||
|108|0x6C|/sys/class/gpio/gpio108|PL GPIO30||
|109|0x6D|/sys/class/gpio/gpio109|PL GPIO31||
|110|0x6E|/sys/class/gpio/gpio110|PL GPIO32||
|111|0x6F|/sys/class/gpio/gpio111|PL GPIO33||
|112|0x70|/sys/class/gpio/gpio112|PL GPIO34||
|113|0x71|/sys/class/gpio/gpio113|PL GPIO35||
|114|0x72|/sys/class/gpio/gpio114|PL GPIO36||
|115|0x73|/sys/class/gpio/gpio115|PL GPIO37||
|116|0x74|/sys/class/gpio/gpio116|PL GPIO38||
|117|0x75|/sys/class/gpio/gpio117|PL GPIO39||
|118|0x76|/sys/class/gpio/gpio118|PL GPIO40||
|119|0x77|/sys/class/gpio/gpio119|PL GPIO41||
|120|0x78|/sys/class/gpio/gpio120|PL GPIO42||
|121|0x79|/sys/class/gpio/gpio121|PL GPIO43||
|122|0x7A|/sys/class/gpio/gpio122|PL GPIO44||
|123|0x7B|/sys/class/gpio/gpio123|PL GPIO45||
|124|0x7C|/sys/class/gpio/gpio124|PL GPIO46||
|125|0x7D|/sys/class/gpio/gpio125|PL GPIO47||
|126|0x7E|/sys/class/gpio/gpio126|PL GPIO48||
|127|0x7F|/sys/class/gpio/gpio127|PL GPIO49||
|128|0x80|/sys/class/gpio/gpio128|PL GPIO50||
|129|0x81|/sys/class/gpio/gpio129|PL GPIO51||
|130|0x82|/sys/class/gpio/gpio130|PL GPIO52||
|131|0x83|/sys/class/gpio/gpio131|PL GPIO53||
|132|0x84|/sys/class/gpio/gpio132|PL GPIO54||
|133|0x85|/sys/class/gpio/gpio133|PL GPIO55||
|134|0x86|/sys/class/gpio/gpio134|PL GPIO56||
|135|0x87|/sys/class/gpio/gpio135|PL GPIO57||
|136|0x88|/sys/class/gpio/gpio136|PL GPIO58||
|137|0x89|/sys/class/gpio/gpio137|PL GPIO59||
|138|0x8A|/sys/class/gpio/gpio138|PL GPIO60||
|139|0x8B|/sys/class/gpio/gpio139|PL GPIO61||
|140|0x8C|/sys/class/gpio/gpio140|PL GPIO62||
|141|0x8D|/sys/class/gpio/gpio141|PL GPIO63||
|142|0x8E|/sys/class/gpio/gpio142|PL GPIO64||
|143|0x8F|/sys/class/gpio/gpio143|PL GPIO65||
|144|0x90|/sys/class/gpio/gpio144|PL GPIO66||
|145|0x91|/sys/class/gpio/gpio145|PL GPIO67||
|146|0x92|/sys/class/gpio/gpio146|PL GPIO68||
|147|0x93|/sys/class/gpio/gpio147|PL GPIO69||
|148|0x94|/sys/class/gpio/gpio148|PL GPIO70||
|149|0x95|/sys/class/gpio/gpio149|PL GPIO71||
|150|0x96|/sys/class/gpio/gpio150|PL GPIO72||
|151|0x97|/sys/class/gpio/gpio151|PL GPIO73||
|152|0x98|/sys/class/gpio/gpio152|PL GPIO74||
|153|0x99|/sys/class/gpio/gpio153|PL GPIO75||
|154|0x9A|/sys/class/gpio/gpio154|PL GPIO76||
|155|0x9B|/sys/class/gpio/gpio155|PL GPIO77||
|156|0x9C|/sys/class/gpio/gpio156|PL GPIO78||
|157|0x9D|/sys/class/gpio/gpio157|PL GPIO79||
|158|0x9E|/sys/class/gpio/gpio158|PL GPIO80||
|159|0x9F|/sys/class/gpio/gpio159|PL GPIO81||
|160|0xA0|/sys/class/gpio/gpio160|PL GPIO82||
|161|0xA1|/sys/class/gpio/gpio161|PL GPIO83||
|162|0xA2|/sys/class/gpio/gpio162|PL GPIO84||
|163|0xA3|/sys/class/gpio/gpio163|PL GPIO85||
|164|0xA4|/sys/class/gpio/gpio164|PL GPIO86||
|165|0xA5|/sys/class/gpio/gpio165|PL GPIO87||
|166|0xA6|/sys/class/gpio/gpio166|PL GPIO88||
|167|0xA7|/sys/class/gpio/gpio167|PL GPIO89||
|168|0xA8|/sys/class/gpio/gpio168|PL GPIO90||
|169|0xA9|/sys/class/gpio/gpio169|PL GPIO91||
|170|0xAA|/sys/class/gpio/gpio170|PL GPIO92|pl_resetnと兼用|
|171|0xAB|/sys/class/gpio/gpio171|PL GPIO93|pl_resetnと兼用|
|172|0xAC|/sys/class/gpio/gpio172|PL GPIO94|pl_resetnと兼用|
|173|0xAD|/sys/class/gpio/gpio173|PL GPIO95|pl_resetnと兼用|


# おしらせ

2020/10/30 にて Qrunch がサービス終了したので移転してきた記事となります。
一時退避場所：https://github.com/ryuz/qrunch_blog