Armadilloフォーラム

パワーマネジメントにおける、省電力モードからのGPINによる復帰

da-takatori

2021年2月26日 13時55分

お世話になっております。
高取と申します。

パワーマネジメントにおける、Suspend-to-RAMからの復帰要因としてGPINを使用したいと考えています。

具体的には、拡張ボードだとUART1_RXとして使用する91番ピン(GPIO1_1026)をGPINとして使用し、そのGPINへの入力を外部割り込み要因として起床させるというものです。

もしかすると、ドライバを作成しなければならないのかも?とも思ったのですが、なにか参考になる情報などありましたらご教示いただければ幸いです。

お忙しいところ申し訳ございませんが、よろしくお願いいたします。

コメント

da-takatori

2021年2月26日 16時02分

高取です。

91番ピンは私の勘違いでした。
申し訳ございません。

UART1_RXに割り付けられる15番ピンをGPINとして使用し、復帰要因として使えないか?というご相談です。
よろしくお願いいたします。

at_akihito.irie

2021年3月2日 15時57分

入江です。

回答が遅くなり申し訳ございません。

> UART1_RXに割り付けられる15番ピンをGPINとして使用し、復帰要因として使えないか?というご相談です。

dtsの修正で対応できます。

具体的な手順をお教えする前に1点確認させていただきたいのですが、お客様
は以前にat-dtwebを用いたdtb作成についてご質問されていましたが、本件は
そのat-dtwebで作成したdtbを用いたArmadilloにおけるご質問という認識でよ
ろしかったでしょうか。

da-takatori

2021年3月3日 8時03分

ご回答ありがとうございます。
高取です。

具体的な開発条件を明示しておらず、申し訳ございません。
開発条件を次に示します。

●Armadillo-610
●周辺機器を搭載する基板は、Armadillo-610を搭載できるよう設計した自社開発基板
●at-dtwebで作成したdtbを利用
●デバッグ用にUART3(93番、94番)を使用
●15番をタクトスイッチのためにGPIOで使用し、省電力モードからタクトスイッチで復帰したい

不足の情報がありましたらご連絡ください。
お忙しいところ申し訳ございませんが、よろしくお願いいたします。

at_akihito.irie

2021年3月3日 11時26分

入江です。

ご回答ありがとうございます。

GPIOを復帰要因として使用するにはdtsの修正が必要ですが、現状at-dtwebは
その修正に対応しておりません。

そのため、
at-dtwebでdts(及びdtb)作成→作成されたdtsを修正→再ビルドしてdtbを生成
という手順を取る必要があります。

なお、以下の手順では15番ピンにHigh(+3.3V)が印加された時に復帰する例を
示します。

まずはat-dtwebで任意のピンアサインでsaveします。

その後at-dtwebを終了し、linuxカーネルソースディレクトリ内の、
arch/arm/boot/dts/armadillo-610-expansion-interface.dtsiの以下の3箇所
を修正します。

(1箇所目)

#include "armadillo-610-onboard-usdhc2.dtsi"

↓1行追加

#include "armadillo-610-onboard-usdhc2.dtsi"
#include "gpio-wakeup.dtsi" // この行を追加

(2箇所目)

MX6UL_PAD_GPIO1_IO03__GPIO1_IO03    0x400010b0 // CON2_15

↓コメントアウト

// MX6UL_PAD_GPIO1_IO03__GPIO1_IO03    0x400010b0 // CON2_15

(3箇所目)

MX6UL_PAD_JTAG_MOD__GPIO1_IO10      0x400010b0 // CON2_43

↓設定値の変更

MX6UL_PAD_JTAG_MOD__GPIO1_IO10      0x10b0 // CON2_43

また、添付のgpio-wakeup.dtsiをarch/arm/boot/dts/に配置してください。シ
ステムの都合上gpio-wakeup.dtsi_.txtとして添付していますが、末尾の_.txt
は消してください。

その後、linuxカーネルソースディレクトリ直下で以下のコマンドを実行して
dtbを再ビルドします。

[ATDE]$ pwd
/home/atmark/linux-v4.14-at[VERSION] // linuxカーネルソースディレクトリ直下
[ATDE]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- armadillo-610-at-dtweb.dtb

実行後、arch/arm/boot/dts/armadillo-610-at-dtweb.dtbが生成されるので、
Armadillo-610に書き込み再起動してください。
その後、Suspend-to-RAMから15番ピンへのHigh印加で復帰することをご確認く
ださい。

注意事項としまして、上記手順の後に再度at-dtwebでdtbを作成すると、
armadillo-610-expansion-interface.dtsiへの修正が上書きされ消えてしまい
ます。
そのため、再度at-dtwebでdtbを作成した場合は、上記手順の
armadillo-610-expansion-interface.dtsiの修正を再度行う必要がありますの
でご注意ください。

ファイル ファイルの説明
gpio-wakeup.dtsi_.txt 末尾の「_.txt」を消してからご使用ください。

da-takatori

2021年3月3日 13時11分

高取です。

先ほど確認したところ、無事動作いたしました。
迅速なご対応、誠にありがとうございました。

da-takatori

2021年3月16日 12時06分

お世話になっております。
高取です。

GPINからの復帰については、解決いたしました。

ところで、当該修正を加えた場合、15番ピン(GPIO1_IO03)はGPIOのSysfsとして使用することはできますでしょうか?

修正を実施した状態で
echo 3 > /sys/class/gpio/export
を入力すると、
-bash: echo: write error: Device or resource busy
が出力されます。
ちなみに、/sys/class/gpio/gpio3は存在しておりません。

お忙しいところ恐縮ですが、アドバイスいただければ幸いです。
よろしくお願いいたします。

at_akihito.irie

2021年3月16日 14時57分

入江です。

> ところで、当該修正を加えた場合、15番ピン(GPIO1_IO03)はGPIOのSysfsとして使用することはできますでしょうか?

本修正を加えた場合は、当該のピンをsysfsから操作することはできません。

当該のピンをsuspendからの起床要因にする際に、gpio-keysドライバがそのピ
ンを使用することになるため、sysfsから操作することができなくなります。

確認ですが、sysfsで当該ピンにどのような操作をされますでしょうか。

da-takatori

2021年3月16日 15時15分

高取です。
ご回答ありがとうございます。

15番ピンにタクトスイッチを接続し、システム稼働中は特定動作を開始・中断するための入力(HIGH、LOW)を“0”と“1”で読み取り、省電力モードへ移行したときは復帰要因として利用するということを考えています。
すなわち、タクトスイッチのハイ・ローの読み取りと、省電力モードからの復帰要因の、二役での使用を考えています。

ドライバ周りでの知識が不十分で、勘違いをしてしまい申し訳ございませんでした。
何か良いアイデアがありましたら、アドバイスいただければ幸いです。

よろしくお願いいたします。

at_akihito.irie

2021年3月16日 17時06分

入江です。

過去のフォーラムでgpio-keysの値を読むサンプルコードを作成された例があ
りましたので、こちらを参考にするといいかもしれません。
https://armadillo.atmark-techno.com/forum/armadillo/2125

当方で上記プログラムをArmadillo-610上でコンパイルして動作確認済みです。

da-takatori

2021年3月17日 9時50分

高取です。

早速のご回答ありがとうございます。
試したところ上手くいきました。

一点だけ確認させてください。
gpio-keysの値の読み取りにおけるビット位置(サンプルでは、(i*8+j)番目のビット)は、カーネルとDTBを変えなければ固定されると認識しておりますが、その認識は正しいでしょうか?

お忙しいところ恐縮ですが、ご回答いただければ幸いです。
よろしくお願いいたします。

at_akihito.irie

2021年3月18日 11時23分

入江です。

> gpio-keysの値の読み取りにおけるビット位置(サンプルでは、(i*8+j)番目のビット)は、カーネルとDTBを変えなければ固定されると認識しておりますが、その認識は正しいでしょうか?

ご認識のとおりです。

先に添付しましたgpio-wakeup.dtsi内で、

linux,code = <KEY_ENTER>;

としています。

KEY_ENTERはlinux-4.14-at[VERSION]/include/uapi/linux/input-event-codes.h内で
定義されており、

#define KEY_ENTER		28

となっています。

そのため、ビット位置(=keycode)はdtsの上記箇所の設定で固定です。

da-takatori

2021年3月18日 15時57分

高取です。

迅速なご回答ありがとうございます。
よく理解できました。

ありがとうございました。