dda-isk.kobbysi_19
2016年8月5日 9時54分
株式会社グリーンハウスの小林と申します。
こちらには初めて投稿させて頂きます。
どうぞよろしくお願い致します。
基本的な質問で大変申し訳ないのですが、Armadillo-440において、
I2CをGPIOでエミュレーションして使用している場合、
I2C通信速度の設定は、どのように行えば宜しいのでしょうか。
標準のI2Cバスドライバーの場合、440のソフトウェアマニュアルに
"/arch/arm/mach-mx25/armadillo400.c" への設定例の記載が
御座いましたが、GPIOでエミュレーションしている際の
I2C通信速度の設定手順を発見できませんでした。
「Armdillo実践開発ガイド第3部」など、関連するドキュメントにも
発見できませんでした。
何かご存じの方がおられましたら、どうかご教示の程を
何卒、よろしくお願い致します。
コメント
dda-isk.kobbysi_19
いつもお世話になっております。
株式会社グリーンハウスの小林です。
I2C通信速度の設定方法をご教示頂き、ありがとうございました。
教えて頂いた ".udelay" を変更して動作確認致しました。
ですが、結果に疑問がありまして、再度ご教示を頂けますようお願い致します。
".udelay" を変更してI2Cの波形を確認したところ、以下の結果になりました。
・.udelay = 5:83kHz
・.udelay = 2:158.7kHz
・.udelay = 1:200kHz
ご教示頂いた情報通り、"include/linux/i2c-gpio.h" の説明には「(500 / udelay) kHz」と
記述されていたのですが、上記の結果とは食い違っておりました。
通信速度を「400kHz」に設定したいと考えているのですが、
GPIOエミュレーションの場合は「200kHz」が上限なのでしょうか。
他に設定が必要な領域があるのでしょうか。
ご存じのことがございましたら、どうかご教示のほどを何とぞよろしくお願い致します。
> 中村です。
>
> > "/arch/arm/mach-mx25/armadillo400.c" への設定例の記載が
>
> このソースを見ているということは、
> カーネルは2.6.26系ですね。
>
> > 御座いましたが、GPIOでエミュレーションしている際の
> > I2C通信速度の設定手順を発見できませんでした。
>
> 参考として、armadillo400.cの95行目あたりに、
> Armadillo-460でのi2c-gpioの設定があります。
>
> static struct i2c_gpio_platform_data armadillo460_ext_i2c_data = { > ... > .udelay = 5, > ... > }; > > static struct platform_device armadillo460_ext_i2c_device = { > .name = "i2c-gpio", > .id = ARMADILLO460_EXT_I2C_ID, > }; >
> このudelayが通信速度の指定で、
> include/linux/i2c-gpio.hに次の説明があります。
>
> * @udelay: signal toggle delay. SCL frequency is (500 / udelay) kHz >
>
> --
> なかむら
>
y.nakamura
中村です。
> ".udelay" を変更してI2Cの波形を確認したところ、以下の結果になりました。
>
> ・.udelay = 5:83kHz
> ・.udelay = 2:158.7kHz
> ・.udelay = 1:200kHz
>
> ご教示頂いた情報通り、"include/linux/i2c-gpio.h" の説明には「(500 / udelay) kHz」と
> 記述されていたのですが、上記の結果とは食い違っておりました。
単純に考えて(実際はもっと複雑なようです:後述のソースを見てください)、
SCL信号の上げ下げの"待ち"にudaley()関数を使っていて、
設定したudelay値をudelay()に渡しているとすれば、
たとえば、udelay=1のとき、SCL=HIGHにして1usec待ち、
SCL=LOWにして1usec待つと1周期が2usecなので、
周波数は500kHzになります。
ですが実際は、仮にudelay()が正確だとしても、
関数呼び出しのオーバーヘッドがありますので、
udelay(1)とやっても1usecでは終わりません。
udelay()はソフトウェアループで実装されている
はずですので、どのくらい正確かもわかりません。
i2c-gpioの実装は、カーネルソースの
drivers/i2c/algos/i2c-algo-bit.cだと思います。
(そんなに大きなソースではないので、
一度ご覧になることをお勧めします)
このソースをみると、SDAの上げ下げ(出力の場合)、
SCLの上げ下げのあちこちにudelayが使われいます。
ヘッダの説明は「(500 / udelay) kHz」でも、実際は
そうはなっていない、ということだと思います。
> 通信速度を「400kHz」に設定したいと考えているのですが、
> GPIOエミュレーションの場合は「200kHz」が上限なのでしょうか。
そういうことだと思います。
> 他に設定が必要な領域があるのでしょうか。
ソースを見た限りでは、なさそうです。
--
なかむら
y.nakamura
2016年8月5日 11時27分
中村です。
> "/arch/arm/mach-mx25/armadillo400.c" への設定例の記載が
このソースを見ているということは、
カーネルは2.6.26系ですね。
> 御座いましたが、GPIOでエミュレーションしている際の
> I2C通信速度の設定手順を発見できませんでした。
参考として、armadillo400.cの95行目あたりに、
Armadillo-460でのi2c-gpioの設定があります。
このudelayが通信速度の指定で、
include/linux/i2c-gpio.hに次の説明があります。
--
なかむら