Armadilloフォーラム

シリアルインターフェースをGPIOとして使う方法

ohshimayyyy

2015年4月24日 10時23分

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

標記の件、Armadillo-810のCPUボードのシリアルインターフェースで、
CON2及びCON3(どちらかというとCON3)のピンをGPIOの様な使い方ができないか
考えているのですが、可能なものでしょうか?
本来は、CON5のGPIOを使用するのが常套手段だと思うのですが、
Armadillo-810を筐体に収めた状態(拡張ボードは収まりません)で使用したく、
配線で何とか外に出せ、接続先に出したピンを接続できそうなものが、
CON2及びCON3のピンのみとなっており、お伺いした次第です。

ご対応の程、宜しくお願い致します。

コメント

溝渕です。

> CON2及びCON3(どちらかというとCON3)のピンをGPIOの様な使い方ができないか
> 考えているのですが、可能なものでしょうか?

可能です。

Armadillo-810のカーネルでは、CON3をUARTとして使うことを前提にしているた
め、ソースコードを変更する必要があります。

/sys/class/gpio/から制御したい場合は、該当ピンのマルチプレクスを変更します。

SCIFA2としてマルチプレクスする個所をコメントアウトし、
arch/arm/mach-shmobile/include/mach/board-armadillo810.c

240: static void a810_scifx_init(void)
241: {
250:     /* SCIFA2 (CON3) */
251:     /* gpio_request_array_simple(scifa2_gpios, ARRAY_SIZE(scifa2_gpios)); */

GPIOとしてマルチプレクスします。
arch/arm/mach-shmobile/include/mach/board-armadillo810.c

1415: static void a810_ext_gpio_init(void)
1416: {
1417:     gpio_request(GPIO_PORT201, NULL); /* CON3_1 */
1418:     gpio_request(GPIO_PORT200, NULL); /* CON3_3 */
1419:     gpio_request(GPIO_PORT96, NULL); /* CON3_7 */
1420:     gpio_request(GPIO_PORT95, NULL); /* CON3_5 */

デフォルトで/sys/class/gpio/にGPIOディレクトリを作成したい場合は、次の
ようにexportしてください。

gpio_export(GPIO_PORT201, 1);
gpio_export(GPIO_PORT200, 1);
gpio_export(GPIO_PORT96, 1);
gpio_export(GPIO_PORT95, 1);

# ちなみに試していないので動くかどうかわかりませんが、考え方としては上
# 記で合っていると思います。

# 上記は、Linuxカーネルの変更のみなので、ブートローダ Hermit-At からは
# UARTとして利用されます。

また、カーネルを変更せずに、tty_ioctlの"TIOCMGET"コマンドを使用して
RTS, CTSピンをGPIOのように扱うこともできます(入出力方向は固定です)。

以上です。

溝渕さま

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

下記の件、早々のご返信、有難う御座います。
下記、不明点が御座いますので、ご対応頂きたく、
宜しくお願い致します。

> # 上記は、Linuxカーネルの変更のみなので、ブートローダHermit-At からは
> # UARTとして利用されます。
上記の際ですが、机上では、実際のArmadilloの動作に、影響ない認識で良いでしょうか?
他に必要な修正などが御座いましたら、ご教示頂ければ幸いです。

> また、カーネルを変更せずに、tty_ioctlの"TIOCMGET"コマンドを使用して
> RTS,CTSピンをGPIOのように扱うこともできます(入出力方向は固定です)。
私の理解不足で申し訳ないのですが、調べてみたところ、
tty_ioctlの"TIOCMGET"コマンドを使用したRTS,CTSピンの扱い方が
分かりませんでした。。
詳細をご教示頂きたいです。

製品マニュアルでは、SCIFA_RXD_2は入力、SCIFA_TXD_2は出力、
SCIFA_CTS_2は入力、SCIFA_RTS_2は出力となっておりますが
(CON2も記載の通り)、GPIOに割り当てた際の入出力の扱いは、
通常のGPIOと同様の扱いで良いしょうか?

ご対応の程、宜しくお願い致します。

溝渕です。

> > # 上記は、Linuxカーネルの変更のみなので、ブートローダHermit-At からは
> > # UARTとして利用されます。
> 上記の際ですが、机上では、実際のArmadilloの動作に、影響ない認識で良いでしょうか?
> 他に必要な修正などが御座いましたら、ご教示頂ければ幸いです。

Armadillo-810に接続する機器次第ですが、信号を衝突させない限りは影響は無
いかと思います。

ブートローダ Hermit-At から UART として利用されないようにするには、製品
マニュアルの次の章をご参照ください。

http://manual.atmark-techno.com/armadillo-810/armadillo-810_product_man…

> tty_ioctlの"TIOCMGET"コマンドを使用したRTS,CTSピンの扱い方が
> 分かりませんでした。。
> 詳細をご教示頂きたいです。

tty_ioctlを使用する方法では、CTSピンの状態取得(入力レベルの取得)および
RTSピンの状態変更(出力レベルの変更)をおこなうことができます。入出力方向
を変更することはできません。

例として、CTSピンの取得は次のようにおこなうことができます。

int arg;
ioctl(fd, TIOCMGET, &arg);
if (arg & TIOCM_CTS)
    printf("SET\n");
else
    printf("UNSET\n");

> 製品マニュアルでは、SCIFA_RXD_2は入力、SCIFA_TXD_2は出力、
> SCIFA_CTS_2は入力、SCIFA_RTS_2は出力となっておりますが
> (CON2も記載の通り)、GPIOに割り当てた際の入出力の扱いは、
> 通常のGPIOと同様の扱いで良いしょうか?

Linuxカーネルをカスタマイズして、該当ピンのマルチプレクスを変更した場合
は、通常のGPIOと同様に入出力方向の変更が可能です。

入出力方向の変更方法は、製品マニュアルの次の章に記載されています。

http://manual.atmark-techno.com/armadillo-810/armadillo-810_product_man…

以上です。

溝渕さま

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

下記の件、時間が空いてしまいましたが、ご対応頂き、有難う御座います。
下記、確認が御座います。

CON2及びCON3のピンをGPIOに割り当てた際は、
機能として、UARTは使用不可になる認識で良かったでしょうか?

ご対応の程、宜しくお願い致します。

溝渕です。

> CON2及びCON3のピンをGPIOに割り当てた際は、
> 機能として、UARTは使用不可になる認識で良かったでしょうか?

上記ご認識で合っています。

これは、同一ピンに対し(GPIOとUARTなど)複数の機能を同時に割り当てること
ができないためです。

UARTもGPIOも利用する必要があるのであれば、UARTのハードウェアフローピン
(RTS, CTS)をGPIOとして、データピン(TXD, RXD)をUARTとして利用するのはい
かがでしょうか?

以上です。

溝渕さま

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

下記の件、早々のご対応、有難う御座います。

> UARTもGPIOも利用する必要があるのであれば、UARTのハードウェアフローピン
> (RTS, CTS)をGPIOとして、データピン(TXD,RXD)をUARTとして利用するのはい
> かがでしょうか?
例えば、CON2及びCON3のハードウェアフローピン(RTS, CTS)を
GPIOに割り当てておきながら、Teratermなどのシリアルコンソールとの通信が、
データピン(TXD,RXD)のみで行なえる認識で良かったでしょうか?
知識不足で申し訳ありません。

今回は、CON3のピンをGPIOに割り当てますが、
シリアル通信で、kernelやuserlandの書き込みを実施することも想定すると、
HERMIT_EN_Nも潰せないかと考えております。
もっとも、netflushによる書き込みで事足りるのですが、
稀にカーネルパニックを起こすこともありましたので、
その為の保険となります。

また、VCCとGNDについては、GPIOなどに割り当てられない認識で良かったでしょうか?

ご対応の程、宜しくお願い致します。

溝渕さま

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

下記の件、度々すみません。

tty_ioctlを使用する方法で、
例えば、GPIOのH / Lを制御するのと同様に、
RTSピンによる制御はどの様にすれば良かったでしょうか?

ご対応の程、宜しくお願い致します。

溝渕さま

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

下記の件、度々すみません。

CON3のUARTをGPIOに割り当てる様、ソースコードを修正し、
カーネルを書き換えたところ、GPIOとして動作することを確認しました。
その際なのですが、割り当てたGPIOの電気的な特性について、
純正のGPIOと比較して違いはありますか?
GPIO制御したい電子部品に対して、印加される電圧は、
純正のGPIOも割り当てたGPIOも同じ様なのですが、
性能が低い様に感じます。
例えば、ブザーであれば音量が低いなど。
回路構成はまったく同じです。
もし、お気付きの点があれば、ご教示頂ければと思います。

ご対応の程、宜しくお願い致します。

溝渕です。

> その際なのですが、割り当てたGPIOの電気的な特性について、
> 純正のGPIOと比較して違いはありますか?

CON3の各信号線には100Ω抵抗が付いています。

そのため、CON3の信号線が供給可能な電流が33mA(3.3V / 100Ω)に制限される
ように見えますが、各ピンの最大出力電流が2mA[1]であるため実質的な差異は
無いように思います。

[1]:http://manual.atmark-techno.com/armadillo-810/armadillo-810_product_man…

もし、GPIOをブザーの電源として利用している場合は2mA以上の電流を流そうと
している可能性があるため、GPIOは電源制御用途で利用することをおすすめし
ます。

以上です。