mkohei1122
2015年8月27日 13時38分
森と申します。
Armadillo-IoTに絶縁デジタル入出力/アナログ入力アドオンモジュール DA002個を
アドオン用のコネクタCON1, CON2にそれぞれ実装し、各2ポートのアナログ入力×2
の合計4ポートのアナログ入力を検討しております。
下記のマニュアルV2.01を拝見しますと、カーネル3.1.4では、アナログ入力は、
IIO デバイスとして実装され、デバイスを認識した順番で iio:deviceN (N は'0'からの連番)
となるとあります。
http://manual.atmark-techno.com/armadillo-iot/armadillo-iotg-std_produc…
そこで、認識の順番がポイントとなりますが、標準の状態においては、必ず
CON1、CON2の順に認識されて、CON1: iio:deviceN、CON2: iio:deviceN+1
となるのでしょうか。
認識順がランダムですと、間違ったアナログ入力となってしまい問題となって
しまいます。
なお、IIO デバイス名(name)で区別しても、同じボードで"mcp3202"ですので、
区別できません。
回避策等をご指導をいただければ、幸いです。
コメント
y.nakamura
中村です。
コピペミスの訂正と、書き忘れです。
> /dev/iio:deviceN と evices/iio:deviceN の下を探してみましたが、
> それらしき情報はなさそうです。(探したりない?)
上の"evices/iio:deviceN"は、
" /sys/bus/iio/devices/iio:deviceN"の間違いです。
"/dev/iio:deviceN"は、「その下」ということではなくて、
IOCTLで何かとれないかな?ということを調べてみました。
iioのioctlの実装は drivers/iio/industrialio-core.c にありますが、
static long iio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { struct iio_dev *indio_dev = filp->private_data; int __user *ip = (int __user *)arg; int fd; if (!indio_dev->info) return -ENODEV; if (cmd == IIO_GET_EVENT_FD_IOCTL) { fd = iio_event_getfd(indio_dev); if (copy_to_user(ip, &fd, sizeof(fd))) return -EFAULT; return 0; } return -EINVAL; }
となっていて、IIO_GET_EVENT_FD_IOCTL以外は何もないようです。
--
なかむら
mkohei1122
y.nakamura
2015年8月29日 2時30分
中村です。
#ちょっと長いです
> 下記のマニュアルV2.01を拝見しますと、カーネル3.1.4では、アナログ入力は、
カーネル3.14-at2ですよね?
Armadilloのカーネル3.14は出たばかりなので、
まだまだわからないことだらけですが、
勉強を兼ねて探ってみました。
> 認識順がランダムですと、間違ったアナログ入力となってしまい問題となって
> しまいます。
> なお、IIO デバイス名(name)で区別しても、同じボードで"mcp3202"ですので、
> 区別できません。
/dev/iio:deviceN と evices/iio:deviceN の下を探してみましたが、
それらしき情報はなさそうです。(探したりない?)
マニュアルの
8.3.10. ADコンバーター
http://manual.atmark-techno.com/armadillo-iot/armadillo-iotg-std_produc…
に、次の記述があります。
| MCP3202 は、絶縁 IO アドオンモジュールをアドオン
| インターフェース(ベースボード:CON1)に接続した場合は SPI2 に、
| アドオンインターフェース(ベースボード:CON2)に接続した場合は SPI3 に
| 接続されています。
これを頼りにSPIの方から探してみました。
ブート時に
spi_imx imx35-cspi.1: probed
spi_imx imx35-cspi.2: probed
というメッセージが出てます。
これ以外はspiのメッセージはなさそうです。
ブート後、spiデバイスは・・・
# ls /sys/bus/spi/devices/
spi1.0@ spi2.0@
# ls /sys/bus/spi/devices/spi1.0/
driver@ iio:device0/ modalias power/ subsystem@ uevent
# ls /sys/bus/spi/devices/spi2.0/
driver@ iio:device1/ modalias power/ subsystem@ uevent
# cat /sys/bus/spi/devices/spi1.0/modalias
spi:mcp3202
# cat /sys/bus/spi/devices/spi2.0/modalias
spi:mcp3202
これから、
spi1.0 ⇒ iio:device0
spi2.0 ⇒ iio:device1
ということがわります。
そうすると、デバイスファイル(といっていいのかな?)のspi0,spi1と
ハードウェアのSPI2(CON1),SPI3(CON2)の関係がわかれば、
解決ですね。
spiを初期化しているソースを探しました。
linux-3.14-at2/arch/arm/mach-imx/armadillo_iotg_std_extif.c
の次の関数で初期化(登録?)しているようです。
この順番で
/sys/bus/spi/devices/spi1.0/
/sys/bus/spi/devices/spi2.0/
になるではないなかぁ~と、思ってます。
これとは別に、
linux-3.14-at2/arch/arm/mach-imx/armadillo_iotg_std_addon/addon_atmark_techno_didoad.c
に、こんなコードもありました。
これを見ると、CON1がspi1.0でCON2がspi2.0なようです。
以下は余談です。
このソース見ていて、ゴミを発見。
この★の行から最初の".do2"までは、コピペミスかな、と思います。
--
なかむら