Armadilloフォーラム

GPIOの動作について

ma2013

2015年1月9日 10時37分

いつもお世話になっております。
MCSのマーです。

armadillo840のCON7の40ピンが,
GPIO(gpio73)が有効な時,
初期状態で,
directionがinになっていますが,
valueの値は入力によって変わりませんでした。

一回echo in > direction を実行すると正常に動作します。

その他のGPIOはまだ確認していません。

以上,どうぞ宜しくお願いいたします。

コメント

y.nakamura

2015年1月10日 2時59分

中村です。

> armadillo840のCON7の40ピンが,
> GPIO(gpio73)が有効な時,
> 初期状態で,
> directionがinになっていますが,
> valueの値は入力によって変わりませんでした。
>
> 一回echo in > direction を実行すると正常に動作します。

800シリーズの勉強のつもりで、GPIOまわりのカーネルソースと
R-Mobile A1のデータシートをざっとみてみました。

カーネルメモリ上では初期値としてinputになっていますが、
(gpio_desc[]のflagsのFLAG_IS_OUTビットが0なので、
catでdirectionを読み出すと"in"になる)
GPIOの初期化処理で、明示的にはinput/outputの設定を
していないように見えます。
(board-armadillo840.cのactivate_ext_gpios()などです)

リセット時は、PORT73CRの初期値は0xC0なので、
inputもoutputもdisableです。

--
なかむら

ma2013

2015年1月10日 13時53分

MCSのマーです。
ご回答ありがとうございました。

シリアルI/Fを有効にした時,
CON7の4ピン(SCIFA_RTS_1_N)が,カーネルソースでプルダウンしていますが,
オープン状態で計ってみると約2.5Vの出力が出ていますが,
それが何の原因でしょうか?

ちなみに,カーネルソースで,シリアルI/Fについて,
RTSをプルダウン,CTSをプルアップしているのは,
何の理由でしょうか?

良ければ,お願いいたします。

y.nakamura

2015年1月10日 20時11分

中村です。

先に後半の質問から・・・

> ちなみに,カーネルソースで,シリアルI/Fについて,
> RTSをプルダウン,CTSをプルアップしているのは,
> 何の理由でしょうか?

CTSをプルアップするのは、CTSの信号線が未接続のときに、
ソフトウェアとしてCTS=OFFとなるようにするためだと思います。
アクティブLOWなので。

RTSはTXD同じようにpulloffしてもよさそうですが、
ソースではどのポートもpulldownになってますね。
たぶん・・・ですが、起動後の早い時期に実行される
a840_scifx_init()では、まだRTSのポートは入力、もしくは
Hi-Zになっていることを想定し、シリアルポートとして
初期化されるまでの間はRTS=ONになるようにするため
ではないかなぁ、と思います。
(シリアルポート初期化までの間、RTS=ONにしちゃって
いいの?とも思うのですが)

RTSのプルダウンは、アットマークテクノさんの回答を
待った方がよさそうです。

> シリアルI/Fを有効にした時,
> CON7の4ピン(SCIFA_RTS_1_N)が,カーネルソースでプルダウンしていますが,
> オープン状態で計ってみると約2.5Vの出力が出ていますが,
> それが何の原因でしょうか?

そのとき、ソフトの方ではRTS信号はONしてますか?
それともOFFしてますか?
たぶんOFF(アクティブLowなのでポート出力はHigh)に
していると思うのですが、3.3Vに上がりきっていないのは
気になりますね。

あ、カーネルの設定でSCIFA1のCTS/RTSを使う設定に
しているのであれば・・・です。

質問とは直接には関係ないかもしれませんが、
840の製品マニュアルと、R1-Mobileのデータシートで、
CON7の4ピン(SCIFA_RTS_1_N/PORT23)のリセット時の
状態の説明が違っているように思います。

840の製品マニュアルの
 表18.11 CON7 拡張入出力ピンの信号状態
では、4ピン(SCIFA_RTS_1_N)のリセット中の状態はPU、
リセット後の状態はIUになってます。

ところが、R1-Mobileのデータシートの
Table 54.1 List of Multiplexed Pins
では、/SCIFA_RTS_1(PORT23)のPullU/Dの欄は"-"に
なっていて、このポート(ピン)は、プルアップもプルダウンも
ついていないことになってます。
("-"という表記が「PUもPDもない」という意味だと思って
いるのですが・・・)
また、初期状態が書いてある
 Table 54.2 Register Configuration
では、PORT23CRのInitial valueはH'20で、
やはり、PU/PDはoffです。

マーさん、
ちゃんとした回答になってなくて、すみません。

--
なかむら

ma2013

2015年1月13日 10時35分

なかむら 様

MCSのマーです。
助かる情報をたくさんいただいて,
本当にありがとうございます。

そのとき、ソフトの方ではRTS信号はONしてますか?
それともOFFしてますか?
● シリアルを操作するアプリは起動していませんでした。

ma2013

2015年1月13日 10時35分

なかむら 様

MCSのマーです。
助かる情報をたくさんいただいて,
本当にありがとうございます。

そのとき、ソフトの方ではRTS信号はONしてますか?
それともOFFしてますか?
● シリアルを操作するアプリは起動していませんでした。

ma2013

2015年1月13日 15時11分

CON7の4ピンが3.15 Vまで出ていますが,
CON7の9ピンが約0Vで,Lowになっており,
同じなRTCピンですが,
統一していないので,
ちょっと気になっております。

以上,どうぞ宜しくお願いいたします。

y.nakamura

2015年1月13日 20時31分

中村です。

> CON7の4ピンが3.15 Vまで出ていますが,
> CON7の9ピンが約0Vで,Lowになっており,
> 同じなRTCピンですが,
> 統一していないので,

ドライバの初期化では、CON7の4ピンもCON7の9ピンも
gpio_request_pulldown()していますが、前に書いたように、
CON7の4ピン(PORT23)は内蔵のPU/PDがありませんが、
CON7の9ピン(PORT194)には内蔵のPU/PDがあります。

これが違いの原因ではないでしょうか?

ところで・・・
> CON7の4ピンが3.15 Vまで出ていますが,

前に書かれたのだと、2.5Vということでしたよね。
ソフト、あるいは測定の方法を何か変えましたか?

CON7の4ピンはRTSで出力ですが、デバイスをオープンする前は
GPIOの初期状態で入力になっていて、内蔵のPU/PDはなしなので、
外付けのPU/PDがなければ、Hi-Z。
それを2.5Vとか3.15Vと計測してしまっている、といことはないでしょうか?

--
なかむら

ma2013

2015年1月14日 9時56分

なかむら 様

いつもお世話になっております。
MCSのマーです。

2.5Vの件ですが,
再テストしてみましたが,
出力は約3.15Vでした。再現できませんでした。
計測のミスだと思います。
申し訳ありませんでした。

いろいろ教えていただいて,
本当にありがとうございました。

ma2013

2015年1月14日 16時34分

なかむら 様

いつもお世話になっております。
MCSのマーです。
申し訳ありませんが,
良ければ,もうちょっと教えていただきたいです。

プロセッサデータシートのTable 54.1 PullU/D 欄について

PD: 内臓プルダウンのみ有,対応端子電源投入後プルダウンでスタート
PU: 内臓プルアップのみ有,対応端子電源投入後プルアップでスタート
--:   内臓プルアップ,プルダウン同時無し
PD/PU: 内臓プルアップ,プルダウン両方有,電源投入時に有効のはTable 54.2のInitial value欄の値と一致する

上記理解は正しいでしょうか?

y.nakamura

2015年1月14日 17時43分

中村です。

> プロセッサデータシートのTable 54.1 PullU/D 欄について
>

> PD: 内臓プルダウンのみ有,対応端子電源投入後プルダウンでスタート
> PU: 内臓プルアップのみ有,対応端子電源投入後プルアップでスタート
> --:   内臓プルアップ,プルダウン同時無し
> PD/PU: 内臓プルアップ,プルダウン両方有,電源投入時に有効のはTable 54.2のInitial value欄の値と一致する
> 

> 上記理解は正しいでしょうか?

Table 54.1 PullU/Dは内蔵PU/PDの有無だけを示していて、
初期状態はどのポートもTable 54.2のInitial value欄だと思います。
そのinitial valueの上位2ビットがPU/PDで、意味は
54.2.1 PORTn Control register (PORTnCR)
に書いてあります。

ということでいいのではないかと思いますが・・・

--
なかむら

ma2013

2015年1月15日 9時03分

中村 様

MCSのマーです。
ご回答ありがとうございました。

at_takashi.sasayama

2015年1月19日 8時45分

笹山です。

> 840の製品マニュアルと、R1-Mobileのデータシートで、
> CON7の4ピン(SCIFA_RTS_1_N/PORT23)のリセット時の
> 状態の説明が違っているように思います。
>
> 840の製品マニュアルの
> 表18.11 CON7 拡張入出力ピンの信号状態
> では、4ピン(SCIFA_RTS_1_N)のリセット中の状態はPU、
> リセット後の状態はIUになってます。
>
> ところが、R1-Mobileのデータシートの
> Table 54.1 List of Multiplexed Pins
> では、/SCIFA_RTS_1(PORT23)のPullU/Dの欄は"-"に
> なっていて、このポート(ピン)は、プルアップもプルダウンも
> ついていないことになってます。
> ("-"という表記が「PUもPDもない」という意味だと思って
> いるのですが・・・)
>
> また、初期状態が書いてある
> Table 54.2 Register Configuration
> では、PORT23CRのInitial valueはH'20で、
> やはり、PU/PDはoffです。

R-Mobile-A1のデータシート Table 54.1 List of Multiplexed Pins
SCIFA_RTS_1(PORT23) の PullU/D の欄に出てくる "-" の意味ですが、
PORTnCRレジスタで PU/PD の設定ができないことを示しています。

また、リセット状態で PU/PDがあり PullU/D が "-" のピンは、
リセット後の状態で固定されます。

SIFA_RTS_1(PORT23)ですと、リセット後の状態は IU(Input PU) 固定ですね。

なお "-" のピンでも PORTnCRレジスタで設定を行うと、
PU/PDが有効になる事もありますが、
その際の動作は保証されていません。

その為、以下のコードには問題があります。

linux-3.4-at10 board-armadillo840.c
266行目 SCIFA1 の RTSをPD、CTSをPU

 266     gpio_request_pulldown(portcr(23)); /* RTS */ # PullU/D が "-" の為、PD には設定はできない。
 267     gpio_request_pullup(portcr(21)); /* CTS */   # PullU/D が PD の為、PU には設定できない。

345行目 SCIFAB の CTSをPU

 345     gpio_request_pulldown(portcr(172)); /* RTS */
 346     gpio_request_pullup(portcr(173)); /* CTS */  # PullU/D が PD の為、PU には設定できない。

> CTSをプルアップするのは、CTSの信号線が未接続のときに、
> ソフトウェアとしてCTS=OFFとなるようにするためだと思います。
> アクティブLOWなので。
> RTSはTXD同じようにpulloffしてもよさそうですが、
> ソースではどのポートもpulldownになってますね。
> たぶん・・・ですが、起動後の早い時期に実行される
> a840_scifx_init()では、まだRTSのポートは入力、もしくは
> Hi-Zになっていることを想定し、シリアルポートとして
> 初期化されるまでの間はRTS=ONになるようにするため
> ではないかなぁ、と思います。
> (シリアルポート初期化までの間、RTS=ONにしちゃって
> いいの?とも思うのですが)

CTSのPullUpは、なかむらさん が既に記載されている通りの理由で、
PullUp(CTS=OFF)としていますが、
RTSに関しては、ご指摘の通り、シリアルポートの初期化前に、
PullDown(RTS=ON) になっていることは検討が必要と思います。

ピンのPU/PD設定の問題と合わせ、
今後の製品アップデートにて修正を行いたいと思います。
フィードバック、誠に有難うございました。

y.nakamura

2015年1月19日 13時00分

中村です。

笹山さん、どうもありがとうございます。

> R-Mobile-A1のデータシート Table 54.1 List of Multiplexed Pins
> SCIFA_RTS_1(PORT23) の PullU/D の欄に出てくる "-" の意味ですが、
> PORTnCRレジスタで PU/PD の設定ができないことを示しています。

私が書いた説明は間違ってましたね。
「ということでいいのではないかと思いますが・・・」と濁しておいてよかった。

とすると、すべてのポートにPU/PDは存在すると考えて
いいのでしょうか?

このあたりのこと、つまり、
> PORTnCRレジスタで PU/PD の設定ができないことを示しています。
ということと、上に書いた「すべてのポートにPU/PDは存在する」と
いうことは、データシートのどこに書いてありますか?

> また、リセット状態で PU/PDがあり PullU/D が "-" のピンは、
> リセット後の状態で固定されます。

その固定値が
Table 54.2 Register Configuration
のInitial valueということですね?

> > Table 54.2 Register Configuration
> > では、PORT23CRのInitial valueはH'20で、
> > やはり、PU/PDはoffです。
...
> SIFA_RTS_1(PORT23)ですと、リセット後の状態は IU(Input PU) 固定ですね。

PORT23の PullU/D が "-" なので固定、ということはわかりましたが、
なぜ、 IU(Input PU)になるのでしょうか?
IUの"I"(Input)は0x20の2の部分なのでわかります。
わからないのは、"U"(PU)です。

54.2.1 PORTn Control register (PORTnCR)
のbit7, 6(PULMD)の説明で
0x: Pull-up/pull-down OFF
です。

--
なかむら

at_takashi.sasayama

2015年1月20日 18時49分

笹山です。

今一度、整理します。

ピンにpull-upやpull-downが存在するかどうかは、
Table 1.2 Pin Assignment (480-Pin BGA Package) で確認してください。

そして、これら存在しているpull-upやpull-downをレジスタで変更できるかどうかは、
Table 54.1 List of Multiplexed Pinsで確認してください。

ここで、注意が必要なのはPORTnCRレジスタの初期値が、
リセット時のpull-upやpull-downの状態を示しているわけではないことです。

レジスタで変更ができるピンの場合は、
リセット後の状態とレジスタ初期値は一致していますが、
レジスタで変更ができないピン("-"表示)の場合は、
ハード的にCPU内部でレジスタと結線されているわけではないので、
PORTnCR の PULMD に何の値を設定しても影響はありません。

その為、このCPUの場合は PORTnCR PULLMD の初期値を、
「0x: Pull-up/pull-down OFF」としているようです。

他のCPUでは、pull-upやpull-downの制御スイッチがすべてレジスタに接続されていて、
レジスタの初期値がリセット後のpull-upやpull-downを表すCPUもありますので、
少し混乱しますね。

y.nakamura

2015年1月20日 19時50分

中村です。

> 今一度、整理します

自分なりに、整理しなおさせていただきます。

> ピンにpull-upやpull-downが存在するかどうかは、
> Table 1.2 Pin Assignment (480-Pin BGA Package) で確認してください。

この表のの"Pin State during Reset"と"Pin State after Reset"が
Armadillo-840の製品マニュアルの
表18.11 CON7 拡張入出力ピンの信号状態
の"リセット中"と"リセット後"ということですね。

表18.11のSCIFA_RTS_1の"PD"と"PU"の件はわかりました。

「pull-upやpull-downが存在するか」はTable 1.2の
どこを見ればいいのでしょう?
表の最後のところ(Page 1-39)にある[Legend]で
IU: Input (pull-up MOS on)
ID: Input (pull-down MOS on)
PU: Pulled up (input buffer off; output buffer off; pull-up MOS on)
PD: Pulled down (input buffer off; output buffer off; pull-down MOS on)
以外ものはpull-up/pull-downが存在しない、ということでいいでしょうか?

PORT23については、IUなので、このポートはpull-upありで、
> そして、これら存在しているpull-upやpull-downをレジスタで変更できるかどうかは、
> Table 54.1 List of Multiplexed Pinsで確認してください。
のPORT23は"-"なので制御はできない。

1つ前の投稿で
> > > PORTnCRレジスタで PU/PD の設定ができないことを示しています。
> > いうことは、データシートのどこに書いてありますか?
と質問しました。
Table 54.1 List of Multiplexed Pins の"PullU/D"欄の意味は
データシートのどこで説明がされていますか?ということなのですが、
どこなのでしょう?

> ハード的にCPU内部でレジスタと結線されているわけではないので、
> PORTnCR の PULMD に何の値を設定しても影響はありません。
>
> その為、このCPUの場合は PORTnCR PULLMD の初期値を、
> 「0x: Pull-up/pull-down OFF」としているようです。

これは理解しました。

--
なかむら