ブログ

Armadillo-840でgpioctrlを使う

at_takuya.sasaki
2014年11月24日 18時32分

Armadillo-400シリーズで使用可能であった、gpioctrlをArmadillo-840でも使用できるようにしてみたいと思います。 (注意) 実際にハードウェアを接続しての検証はしておりません。 あくまでソフトウェア的に移植をしたところまでですので、ご了承ください。

[9.9.2. Armadillo-200 シリーズ互換 GPIO ドライバー]
https://manual.atmark-techno.com/armadillo-4x0/armadillo-400_series_software_manual_ja-1.9.1/ch09.html#sec-armadillo-200-series-gpio-driver

1) ユーザーランドとカーネルを展開します

atmark@atde5:~$ ln -s atmark-dist-20140602/ atmark-dist
atmark@atde5:~$ cd atmark-dist
atmark@atde5:~/atmark-dist$ ln -s ../linux-3.4-at10 ./linux-3.x

2) パッチを /home/atmark に置きます。

パッチは以下からダウンロードしてください。

atmark@atde5:~$ ls *patch
atmark-dist-gpioctrl-support.patch  linux-3.4-at10-a2x0-gpio-support.patch

3) パッチを適用します

atmark@atde5:~$ cd atmark-dist
atmark@atde5:~/atmark-dist$ patch -p 1 < ~/atmark-dist-gpioctrl-support.patch 
atmark@atde5:~/atmark-dist$ cd ../linux-3.4-at10/
atmark@atde5:~/linux-3.4-at10$ patch -p 1 < ~/linux-3.4-at10-a2x0-gpio-support.patch 

4) make menuconfigを実行します

atmark@atde5:~/linux-3.4-at10$ cd ~/atmark-dist
atmark@atde5:~/atmark-dist$  make menuconfig
 
vendor: AtmarkTechno
product: Armadillo-840
 
を選択しああと、
カーネルコンフィギュレーションで、
/sys/class/gpioのチェックを外し、
 
Device Drivers  --->
  -*- GPIO Support  ---> 
     [ ]   /sys/class/gpio/... (sysfs interface)    ←チェックを外す
 
Armadillo-2x0 GPIOドライバにチェックをつけてください。
 
Device Drivers  --->
   Character devices  --->
     <*> Armadillo-2x0 compatible GPIO driver (deprecated)  ←チェックをつける

5) make を実行します。

atmark@atde5:~/atmark-dist$ make

6) linux.bin.gz / romfs.img.gzをArmadillo-840に書き込みます。

7) 以下のようにgpioctrlを実行できるところまで確認しています。

GPIO0~GPIO4まで定義しています。 使用できるポートは以下のソースコードで定義していますので、適時変更してください。

linux-3.4-at10/arch/arm/mach-shmobile/board-armadillo840.c

static struct armadillo2x0_gpio_info armadillo400_a2x0_compat_gpio_info[] = {
        ARMADILLO2X0_GPIO_PIN_INPUT(GPIO0,  GPIO_PORT182, 1), // EXT CON13 pin7
        ARMADILLO2X0_GPIO_PIN_INPUT(GPIO1,  GPIO_PORT181, 1), // EXT CON13 pin8
        ARMADILLO2X0_GPIO_PIN_INPUT(GPIO2,  GPIO_PORT180, 1), // EXT CON13 pin9
        ARMADILLO2X0_GPIO_PIN_INPUT(GPIO3,  GPIO_PORT179, 1), // EXT CON13 pin10
        ARMADILLO2X0_GPIO_PIN_INPUT(GPIO4,  GPIO_PORT178, 1), // EXT CON13 pin11
};

GPIO0の状態を表示します。

root@armadillo840-0 (ttySC2) ~]# gpioctrl --get=gpio0
GPIO No.   : 1 (GPIO0)
MODE       : 1 (MODE_INPUT)
VALUE      : 1 (HIGH)
INTERRUPT  : 0 (DISABLE)

GPIO0をOUTPUTにしてLowに設定します。

[root@armadillo840-0 (ttySC2) ~]# gpioctrl --set=gpio0 --mode=output --type=low
[root@armadillo840-0 (ttySC2) ~]# gpioctrl --get=gpio0
GPIO No.   : 1 (GPIO0)
MODE       : 0 (MODE_OUTPUT)
VALUE      : 0 (LOW)

割込み(IRQ)に使えるのはGPIO2です。

[root@armadillo840-0 (ttySC2) ~]# gpioctrl --set=gpio2 --mode=input --type=risin
g-edge --debounce --handler="echo interrupted"

以上