ルーターなどの未知のGPIOを探索するためのmruby-bsdgpioを使ったGPIOのチェックプログラムを作ってみました。
gpio.rb
#!/usr/local/bin/mruby
# ./gpio.rb <device number> <operation> <ignore list>
t = BsdGpio.new(ARGV[0].to_i)
opt = ARGV[1]
if ARGV.size == 3 then
ignore = ARGV[2].split(',')
else
ignore = []
end
n = 0
while n <= t.maxpin
if !ignore.include?(n.to_s) then
if opt == "in" then
t.setflags(n, BsdGpio::INPUT)
else
t.setflags(n, BsdGpio::OUTPUT)
end
if opt == "1" || opt == "check" then
t.set(n, 1)
o = t.get(n)
end
if opt == "0" || opt == "check" then
t.set(n, 0)
z = t.get(n)
end
if opt == "check" then
if z == 0 && o == 1
p n.to_s + " OK"
else
p n.to_s + " NG"
end
end
end
n = n + 1
end
第一引数がデバイス番号で第二引数が0,1,check,inのどれかで、すべてを0か1にするか、checkはOUTした0,1が読めるかのチェックになり、inはすべてINPUTにします。
mediatekのSOCはpinコントロールでGPIO以外の設定になっている場合は、checkでNGになります。GPIOでもスイッチなどの入力系はエラーになる事があります。
第三引数はある場合は、カンマ区切りの無視リストです。これはGPIOを設定してしまうとリセットするようなポートがある場合に使います。
# ./gpio.rb 1 check 0,3
のように使います。
このスクリプトであたりをつけてgpioctlコマンドで個別の確認を行います。
linux方面のdtsファイルがあればそれを参考にすると良いです。
これでやっとUSBのPowerのコントロールが見つかりました。