Intel GalileoでLinuxを起動してI2Cを使えるようにする

投稿日:

なんとなく買ったIntel GalileoでSDからLinuxを起動し,i2c-toolsを使えるようにしたメモ.

FWの更新

  1. Intelのサイトからarduino-windows-1.0.3.7z をダウンロードする.
  2. 適当なフォルダに展開し,IDEを起動する.
  3. ヘルプからFirmware Updateを実行する

Linuxのインストール

  1. Intelのサイトから SDCard.1.0.3.zip をダウンロードする.
  2. 展開してできる image-full-galileo フォルダの中の image-full-galileo-clanton.ext3 を適当なLinuxマシンにコピーする.
  3. 容量を増やす
    %  dd if=/dev/zero of=image-full-galileo-clanton.ext3 bs=1M count=3500 oflag=append conv=notrun
    % sudo e2fsck ./image-full-galileo-clanton.ext3
    % sudo resize2fs ./image-full-galileo-clanton.ext3
  4. Micro SDにimage-full-galileoの中身をコピーする.
  5. スロットに挿して電源ON

開発環境のインストール

/etc/opkg/base-feeds.conf ファイルに以下を記載し,opkgを使えるようにする.

src all http://alextgalileo.altervista.org/pkgrepo/all
src clanton http://alextgalileo.altervista.org/pkgrepo/clanton
src i586 http://alextgalileo.altervista.org/pkgrepo/i586

開発環境一式をopkgで入れる

# opkg install make gcc-dev gcc-symlinks cpp cpp-symlinks g++ g++-symlinks uclibc-dev uclibc-utils binutils-dev binutils-symlinks python-dev coreutils-dev

i2c-toolsをインストール

i2c-toolsはパッケージになっていないのでソースから入れる.

Makefileを編集

# diff Makefile_orig Makefile
--- Makefile_orig
+++ Makefile
@@ -41,6 +41,6 @@
 all:

 EXTRA :=
-#EXTRA += py-smbus
+EXTRA += py-smbus
 SRCDIRS := include lib eeprom stub tools $(EXTRA)
 include $(SRCDIRS:%=%/Module.mk)

あとは,make, make install で終わり.

i2cを有効にする

i2cのピンはADC4,5と共用になっていて,デフォルトでMUXがADCの方に倒れている.
なので,MUXをi2cの方に変更する必要がある.

MUXの制御GPIO番号はこれを見ると29番なので,GPIO29に0を書く.

  1. GPIO29を触れるようにする.
    # echo -n 29 > /sys/class/gpio/export
  2. 出力に設定
    # echo -n out > /sys/class/gpio/gpio29/direction
  3. 0を書き込む
    # echo -n 0 > /sys/class/gpio/gpio29/value

これで,i2cdetectが反応するようになる.

MUXがADC側のときのi2cdetect結果

# /usr/local/sbin/i2cdetect -y -r 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

MUXがI2C側のときのi2cdetect結果

# /usr/local/sbin/i2cdetect -y -r 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

とりあえずつないだADT7410の0x048が認識した.

温度を読み取る

# /usr/local/sbin/i2cdump -y -r 0-3 0 0x48 b
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 0c a8 80 00                                        ???.

レジスタ3の7ビットめが0なので13ビット精度.レジスタ0とレジスタ1の計16ビットのうち,上位13ビットが温度レジスタになる.上の結果から,その値は 0x0ca8 >> 3 = 0x0195.

13ビット精度のときの分解能は 0.0625℃/LSB なので,0x195 * 0.0625 = 405 * 0.0625 =25.3125℃.

というわけで,値としては問題なさそう.

参考にしたページ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です