タグ: I2C

WHR-300HP2でI2Cを使ったメモ

最近急に思い立ち、I2Cを用いてLED等を制御してみたくなった。
その際、I2Cをどうやって使うか、という点で、WHR-300HP2を利用してみたメモ。

WHR-300HP2

基板のフロント寄りAOSSボタン付近にJTAG用らしきピンが並んでいる(2行7列)ため、ここに2.54mmピッチのピンヘッダを足を外側に曲げたうえでハンダ付け。
IMG_20171224_140819.jpg

IMG_20171226_163853.jpg

基板表面をフロントLEDが右、RJ-45ポートを左、UARTを上として見た場合
(I2Cに必要なピン数のみ調べた)

GND GND 3.3V
GPIO
#41
GPIO
#40

3.3VはUARTの3.3Vと同回路。

#40, #41 の各ピンは JTAG or EPHY LED or GPIO でMUXできるピンであり、OpenWrtではデフォルトでEPHY LEDとして構成されているため、WHR-300HP2のDTSを書き換えてGPIOに向ける。

diff --git a/target/linux/ramips/dts/mt7620a_buffalo_whr-300hp2.dts b/target/linux/ramips/dts/mt7620a_buffalo_whr-300hp2.dts
index 8bdf87501e..ef1f5af6a4 100644
--- a/target/linux/ramips/dts/mt7620a_buffalo_whr-300hp2.dts
+++ b/target/linux/ramips/dts/mt7620a_buffalo_whr-300hp2.dts
@@ -133,15 +133,15 @@
 &pinctrl {
        state_default: pinctrl0 {
                gpio {
-                       ralink,group = "i2c", "uartf", "rgmii1", "rgmii2", "wled", "nd_sd";
+                       ralink,group = "i2c", "uartf", "rgmii1", "rgmii2", "wled", "nd_sd", "ephy";
                        ralink,function = "gpio";
                };
        };
 };

 ðernet {
-       pinctrl-names = "default";
-       pinctrl-0 = <&ephy_pins>;
+/*     pinctrl-names = "default";
+       pinctrl-0 = <&ephy_pins>;*/
        mtd-mac-address = <&factory 0x4>;
        mediatek,portmap = "llllw";
 };

書き換えたDTSを用いてビルドし実機へインストール。
ビルド時に使用したconfigは以下の通り。I2C関連のドライバとツールを含める。無線は要らないから大体落とした。

CONFIG_TARGET_ramips=y
CONFIG_TARGET_ramips_mt7620=y
CONFIG_TARGET_ramips_mt7620_DEVICE_buffalo_whr-300hp2=y
# CONFIG_DRIVER_11N_SUPPORT is not set
# CONFIG_DRIVER_11W_SUPPORT is not set
CONFIG_KERNEL_BUILD_DOMAIN="Taiha.Net"
CONFIG_KERNEL_BUILD_USER="musashino205"
CONFIG_LIBCURL_COOKIES=y
CONFIG_LIBCURL_FILE=y
CONFIG_LIBCURL_FTP=y
CONFIG_LIBCURL_HTTP=y
CONFIG_LIBCURL_MBEDTLS=y
CONFIG_LIBCURL_NO_SMB="!"
CONFIG_LIBCURL_PROXY=y
CONFIG_LUCI_LANG_ja=y
CONFIG_OPENSSL_ENGINE=y
CONFIG_OPENSSL_PREFER_CHACHA_OVER_GCM=y
CONFIG_OPENSSL_WITH_ASM=y
CONFIG_OPENSSL_WITH_CHACHA_POLY1305=y
CONFIG_OPENSSL_WITH_CMS=y
CONFIG_OPENSSL_WITH_DEPRECATED=y
CONFIG_OPENSSL_WITH_ERROR_MESSAGES=y
CONFIG_OPENSSL_WITH_PSK=y
CONFIG_OPENSSL_WITH_SRP=y
CONFIG_OPENSSL_WITH_TLS13=y
CONFIG_PACKAGE_ca-bundle=y
CONFIG_PACKAGE_ca-certificates=y
CONFIG_PACKAGE_cgi-io=y
CONFIG_PACKAGE_curl=y
# CONFIG_PACKAGE_hostapd-common is not set
CONFIG_PACKAGE_i2c-tools=y
# CONFIG_PACKAGE_iw is not set
# CONFIG_PACKAGE_iwinfo is not set
# CONFIG_PACKAGE_iw is not set                                                                                                                                                                                                                                        [0/21126]
# CONFIG_PACKAGE_iwinfo is not set
# CONFIG_PACKAGE_kmod-cfg80211 is not set
CONFIG_PACKAGE_kmod-i2c-algo-bit=y
CONFIG_PACKAGE_kmod-i2c-core=y
CONFIG_PACKAGE_kmod-i2c-gpio=y
CONFIG_PACKAGE_kmod-i2c-gpio-custom=y
CONFIG_PACKAGE_kmod-ledtrig-heartbeat=y
CONFIG_PACKAGE_kmod-ledtrig-timer=y
# CONFIG_PACKAGE_kmod-mac80211 is not set
# CONFIG_PACKAGE_kmod-rt2800-soc is not set
# CONFIG_PACKAGE_kmod-rt2x00-lib is not set
CONFIG_PACKAGE_libcurl=y
CONFIG_PACKAGE_libi2c=y
CONFIG_PACKAGE_libiwinfo-lua=y
CONFIG_PACKAGE_liblua=y
CONFIG_PACKAGE_liblucihttp=y
CONFIG_PACKAGE_liblucihttp-lua=y
CONFIG_PACKAGE_libmbedtls=y
CONFIG_PACKAGE_libopenssl=y
CONFIG_PACKAGE_libpcre=y
CONFIG_PACKAGE_librt=y
CONFIG_PACKAGE_libubus-lua=y
CONFIG_PACKAGE_lua=y
CONFIG_PACKAGE_luci=y
CONFIG_PACKAGE_luci-app-commands=y
CONFIG_PACKAGE_luci-app-firewall=y
CONFIG_PACKAGE_luci-app-opkg=y
CONFIG_PACKAGE_luci-base=y
CONFIG_PACKAGE_luci-compat=y
CONFIG_PACKAGE_luci-i18n-base-ja=y
CONFIG_PACKAGE_luci-i18n-commands-ja=y
CONFIG_PACKAGE_luci-i18n-firewall-ja=y
CONFIG_PACKAGE_luci-i18n-opkg-ja=y
CONFIG_PACKAGE_luci-lib-ip=y
CONFIG_PACKAGE_luci-lib-jsonc=y
CONFIG_PACKAGE_luci-lib-nixio=y
CONFIG_PACKAGE_luci-mod-admin-full=y
CONFIG_PACKAGE_luci-mod-network=y
CONFIG_PACKAGE_luci-mod-status=y
CONFIG_PACKAGE_luci-mod-system=y
CONFIG_PACKAGE_luci-proto-ipv6=y
CONFIG_PACKAGE_luci-proto-ppp=y
CONFIG_PACKAGE_luci-theme-bootstrap=y
CONFIG_PACKAGE_rpcd=y
CONFIG_PACKAGE_rpcd-mod-file=y
CONFIG_PACKAGE_rpcd-mod-iwinfo=y
CONFIG_PACKAGE_rpcd-mod-luci=y
CONFIG_PACKAGE_rpcd-mod-rrdns=y
CONFIG_PACKAGE_uhttpd=y
CONFIG_PACKAGE_wget=y
# CONFIG_PACKAGE_wireless-regdb is not set
# CONFIG_PACKAGE_wpad-basic is not set
CONFIG_PACKAGE_zlib=y

I2Cエキスパンダ周辺回路

以下の図の通り構成。改善点あればご指摘ください。

WHR-300HP2-MCP23017.png

MCP23017のスレーブアドレスを 0x20 へ設定するため、A0, A1, A2はブリッジしてGNDに落とす。
最初RESETの接続を忘れ、i2cdetect の際検出されないタイミングがあるなど不安定な状態になった。

DSC_0700.JPG

コンソール

insmod i2c-gpio-custom bus0=0,40,41
指定したGPIOをI2Cとして登録する
ログ:

root@OpenWrt:/tmp# insmod i2c-gpio-custom bus0=0,40,41
[  130.582520] Custom GPIO-based I2C driver version 0.1.1
[  130.593327] i2c-gpio i2c-gpio.0: using pins 40 (SDA) and 41 (SCL)
      
i2cdetect -y 0
指定したI2Cにぶら下がっているスレーブを検出する

root@OpenWrt:/tmp# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --
      
i2cset -y 0 0x20 0x0 0
MCP23017のGPAxのdirectionを全てoutに設定
i2cset -y 0 0x20 0x12 <設定値>
MCP23017のGPAxのうち、HIGHに設定するピンを設定する。ピン番号 (GPA0, GPA1, …) の番号がビット位置に対応する。

例: GPA1をHIGHにする

i2cset -y 0 0x20 0x12 2
      

例: GPA1, GPA2をHIGHにする

i2cset -y 0 0x20 0x12 3
      

その他

雑スクリプト(GPA0からGPA3まで使用している場合)

#!/bin/sh

for i in $(seq 0 100); do
	for j in $(seq 0 7); do
		i2cset -y 0 0x20 0x12 $j
		sleep 1
	done
done

i2cset -y 0 0x20 0x12 0x00

以上。

WG1400HP I2C expanderメモ

WG1400HPでLEDとUSB HubのRESETがぶら下がっているらしいI2C接続のExpander (Texas Instruments TCA6416)がBootloaderから制御できたので、割り当てを確認したメモ。

コマンド実行例

Read value:

boot> debug i2c ioexp read P08

Write value:

boot> debug i2c ioexp write P08 1

割り当て

  • P00: USB Hub (μPD720114) RESET
  • P01: ?
  • P02: ?
  • P03: ?
  • P04: CONVERTER (Red)
  • P05: CONVERTER (Green)
  • P06: TV (Red)
  • P07: TV (Green)
  • P10: 5 GHz (Red)
  • P11: 5 GHZ (Green)
  • P12: 2.4 GHz (Red)
  • P13: 2.4 GHz (Green)
  • P14: ACTIVE (Red)
  • P15: ACTIVE (Green)
  • P16: POWER (Red)
  • P17: POWER (Green)