Armadilloフォーラム

C言語からGPIOを直接操作する方法

hattadk

2019年7月11日 12時05分

お世話になります。hattadkと申します。

たびたび申し訳ございません。
現在、linux-4.9-x1-at9 でC言語にてGPIOの処理を記載しているのですが、今回のターゲットはGPIOの点数が多くファイル入出力を利用しての操作に限界を感じております。

ソースからレジスタ等を直接操作するなどを行うことにより、ファイル操作ではなくGPIOの入出力を直接行うことは可能でしょうか?
もしございましたら、サンプル等の場所をご教示いただきたく思います。

お忙しいところ恐縮ですがよろしくお願いいたします。

コメント

at_koseki

2019年7月11日 12時49分

古関です。

技術的には/dev/memで直接レジスタアクセス可能です。

ただ、直接レジスタアクセスしている時に、kernel側でGPIOとしてアクセスしたり
同じGPIOバンク(同レジスタ、ビット違い)のPINにkernelでWriteアクセスすると
競合して正常動作しなくなる可能性があります。

このあたりを理解して使用する必要があります。

GPIOアクセスではなく、直メモリアクセスですが以下howtoにサンプルコードがあります。
https://armadillo.atmark-techno.com/howto/accessing-any-address

GPIOを動かすサンプルは手元にちょうど良いのがなかったです。

大きいコードになってしまうので抜き出すのが手間ですが、
/dev/memを使って、jtagやswdのステートマシンをGPIO bitbangで作っているコードがopenocdにあります。

https://github.com/ntfreak/openocd/blob/master/src/jtag/drivers/imx_gpi…

以下のパラメータを調整し、必要なコード部分を抜き出せば
Armadillo-X1のSoC(i.MX7D)でも動作しそうです。

-#define IMX_GPIO_BASE 0x0209c000
-#define IMX_GPIO_SIZE 0x00004000
-#define IMX_GPIO_REGS_COUNT 8

+#define IMX_GPIO_BASE 0x30200000
+#define IMX_GPIO_SIZE 0x00010000
+#define IMX_GPIO_REGS_COUNT 7

hattadk

2019年7月11日 16時48分

早速のご回答、有難うございました。
こちら、参考にさせていただきます。

> 古関です。
>
> 技術的には/dev/memで直接レジスタアクセス可能です。
>
> ただ、直接レジスタアクセスしている時に、kernel側でGPIOとしてアクセスしたり
> 同じGPIOバンク(同レジスタ、ビット違い)のPINにkernelでWriteアクセスすると
> 競合して正常動作しなくなる可能性があります。
>
> このあたりを理解して使用する必要があります。
>
> GPIOアクセスではなく、直メモリアクセスですが以下howtoにサンプルコードがあります。
> https://armadillo.atmark-techno.com/howto/accessing-any-address
>
>
> GPIOを動かすサンプルは手元にちょうど良いのがなかったです。
>
> 大きいコードになってしまうので抜き出すのが手間ですが、
> /dev/memを使って、jtagやswdのステートマシンをGPIO bitbangで作っているコードがopenocdにあります。
>
> https://github.com/ntfreak/openocd/blob/master/src/jtag/drivers/imx_gpi…
>
> 以下のパラメータを調整し、必要なコード部分を抜き出せば
> Armadillo-X1のSoC(i.MX7D)でも動作しそうです。
>
> -#define IMX_GPIO_BASE 0x0209c000
> -#define IMX_GPIO_SIZE 0x00004000
> -#define IMX_GPIO_REGS_COUNT 8
>
> +#define IMX_GPIO_BASE 0x30200000
> +#define IMX_GPIO_SIZE 0x00010000
> +#define IMX_GPIO_REGS_COUNT 7
>