GPIOの探し方


mruby on YABMを動かしているBCM5354なGemtek WRTB-204GなデバイスのGPIOを探してみました。

基板の写真はInternal-Photos-830239.pdfというファイルで見ることができます。

led.rb
begin

yabm = YABM.new

bit = 0

maxpin = 8

orgdir = yabm.gpiogetdir()
orgctl = yabm.gpiogetctl()
yabm.print "ORG DIR: " + orgdir.to_s + " CTL: " + orgctl.to_s + "\r\n"
yabm.gpiosetdir(0xff)

while 1 do

  yabm.print bit.to_s + " "
  yabm.gpiosetdat(1 << bit)
  bit = bit + 1
  if bit == maxpin
    bit = 0
  end
  6.times {
    start = yabm.count() 
    while yabm.count() < start + 1000 do
    end
    yabm.print "*"
  }
  yabm.print "\r\n"
end

rescue => e
  yabm.print e.to_s
end

このスクリプトを実行してLEDがGPIOのどのピンにアサインされているかを確認します。

回路はこのようになっています。

ビットが立つと消灯します。

パターン 表示 接続
LED1 POWER GND直結
LED10 SECURITY GPIO6
LED2 WIRELESS GPIO2
LED6 GPIO1(未実装)
LED11 DIAG GPIO7
LED7 ?(未実装)
LED4 INTERNET Ethernet

yabmでのLEDの制御はこんな感じで書けます。

LED10 = (1 << 6)
  reg = yabm.gpiogetdat
# 点灯
  yabm.gpiosetdat(reg & ~LED10)
# 消灯
  yabm.gpiosetdat(reg | LED10)

スイッチもテスターであたって、確認します。

パターン GPIO
SW1 0
SW2 4

これで3と5がないので、最初液晶とスイッチの基板に実装されているHT82K68Eへの接続が3,5なのかと思って調べていたのですが、テスターが反応しません。

BCM5354はPRODUCT Briefを見ても使えそうなインターフェースがGPIOとUSBしかないので、これのどちらかだと考えたのですがHT82K68EはUSBは使えないので、GPIOではないかと考えていました。

しばらく基板とにらめっこしてふと気が付きました。左上にSW3という未実装なパターンがあり、そこが3,5でした。

BCM5354はuartが2つあるのでHT82K68Eへの接続はuartでした。

ちょうどBitbangなI2Cを試したいとおもっていたので3,5を使うことにしました。

ビットの回し方を以下のようなコードを最近見かけました。

  bit = (bit + 1) % maxpin

好みですが、私はあまり好きではないです。

おまけ

液晶をArudinoで制御してみました。