Armadillo-IoT開発セットと、RS232アドオンモジュールの未使用のGPIO使って、GPIOをI2C化する方法を確認した。 RS232アドオンモジュールには、Armadillo-IoTとのコネクタ(60pin)の信号がスルーホールに出ているので、 動作確認にはこのスルーホールが活用できる。
ここでは、RS232アドオンモジュールのCON4(テストI/F:スルーホール)の32、33ピンで動作を確認。
1.準備
・機材
本体:Armadillo-IoT(G2)
アドオンモジュール:RS232アドオンモジュール
Armadillo-IoTのCON1またはCON2にRS232アドオンモジュールを接続する。
・ソースコード
カーネル:linux-3.14-at1
ユーザーランド:atmark-dist-20150618.tar.gz
2.I2C化するGPIOの選択
Armadillo-IoTベースボードマルチプレクス表より、
RS232アドオンモジュールが使用していない端子(同表AM列"RS232C RS00")
かつ、Armadillo-IoTのCON1/CON2のどちらに接続してもGPIOとして使用できる端子(同表AT列"CON1,CON2共通機能")より、
CON1/CON2の32pin -> I2CのSCL
CON1/CON2の33pin -> I2CのSDA
をI2Cの機能として使えるようにする。
以降の手順により、
Armadillo-IoTのCON1にRS232アドオンモジュールを接続した場合:
デバイスファイル:/dev/i2c-5
CON1の32pin:GPIO1_5 -> I2CのSCL
CON1の33pin:GPIO1_4 -> I2CのSDA
Armadillo-IoTのCON2にRS232アドオンモジュールを接続した場合:
デバイスファイル:/dev/i2c-6
CON2の32pin:GPIO3_14 -> I2CのSCL
CON2の33pin:GPIO1_26 -> I2CのSDA
のような端子とデバイスファイルでI2C制御できるようにする。
3.ソースコードの修正
カーネルのソースコード atmark-dist/linux-3.x/arch/arm/mach-imx/mach-armadillo_iotg_std.c を修正する。
修正したソースコード:mach-armadillo_iotg_std.c
/**** i2c-gpio: add: begin ****/
/**** i2c-gpio: add: end ****/
の下記箇所(3か所)を追加。
mach-armadillo_iotg_std.cへの追加箇所(その1)
static const struct pinctrl_map armadillo_iotg_std_pinctrl_map[] = { 内に追加。
/**** i2c-gpio: add: begin ****/ /* I2C-GPIO5 */ PIN_MAP_MUX_GROUP_DEFAULT("i2c-gpio.5", "imx25-pinctrl.0", "gpio_f__gpio_1_5", "gpio1"), PIN_MAP_MUX_GROUP_DEFAULT("i2c-gpio.5", "imx25-pinctrl.0", "gpio_e__gpio_1_4", "gpio1"), PIN_MAP_CONFIGS_PIN_DEFAULT("i2c-gpio.5", "imx25-pinctrl.0", "MX25_PAD_GPIO_F", pin_cfgs_100kup), PIN_MAP_CONFIGS_PIN_DEFAULT("i2c-gpio.5", "imx25-pinctrl.0", "MX25_PAD_GPIO_E", pin_cfgs_100kup), /* I2C-GPIO6 */ PIN_MAP_MUX_GROUP_DEFAULT("i2c-gpio.6", "imx25-pinctrl.0", "gpio_f__gpio_1_26", "gpio1"), PIN_MAP_MUX_GROUP_DEFAULT("i2c-gpio.6", "imx25-pinctrl.0", "gpio_e__gpio_3_14", "gpio3"), PIN_MAP_CONFIGS_PIN_DEFAULT("i2c-gpio.6", "imx25-pinctrl.0", "MX25_PAD_PWM", pin_cfgs_100kup), PIN_MAP_CONFIGS_PIN_DEFAULT("i2c-gpio.6", "imx25-pinctrl.0", "MX25_PAD_RTCK", pin_cfgs_100kup), /**** i2c-gpio: add: end ****/
補足)上記追加コード内において、
"gpio_f__gpio_1_5"、"gpio_e__gpio_1_4"などのGPIOの番号は、
Armadillo-IoTベースボードマルチプレクス表のR列"GPIO"を参照し、
CON1の32pin:GPIO1_5
CON1の33pin:GPIO1_4
に相当するGPIO番号にしている。
"MX25_PAD_GPIO_F"、"MX25_PAD_GPIO_E"などのPADの名前については、 atmark-dist/linux-3.x/arch/arm/mach-imx/armadillo_iotg_std_extif.c内の
/* CON1_32 */ #if defined(CONFIG_AIOTG_STD_CON1_32_GPIO1_5) PIN_MAP_MUX_GROUP_HOG_DEFAULT("imx25-pinctrl.0", "gpio_f__gpio_f", "gpio1"), PIN_MAP_CONFIGS_PIN_HOG_DEFAULT("imx25-pinctrl.0", "MX25_PAD_GPIO_F", pin_cfgs_none), #endif /* CON1_33 */ #if defined(CONFIG_AIOTG_STD_CON1_33_GPIO1_4) PIN_MAP_MUX_GROUP_HOG_DEFAULT("imx25-pinctrl.0", "gpio_e__gpio_e", "gpio1"), PIN_MAP_CONFIGS_PIN_HOG_DEFAULT("imx25-pinctrl.0", "MX25_PAD_GPIO_E", pin_cfgs_none), #endif
の定義を参照し、
CON1の32pin: GPIO1_5: "MX25_PAD_GPIO_F"
CON1の33pin: GPIO1_4: "MX25_PAD_GPIO_E"
のようにGPIO番号に相当するPAD名にしている。
mach-armadillo_iotg_std.cへの追加箇所(その2)
static struct i2c_gpio_platform_data i2c_gpio5_pdata
static struct i2c_gpio_platform_data i2c_gpio6_pdata
を追加。
/**** i2c-gpio: add: begin ****/ static struct i2c_gpio_platform_data i2c_gpio5_pdata= { .sda_pin = IMX_GPIO_NR(1, 4), .sda_is_open_drain = 0, .scl_pin = IMX_GPIO_NR(1, 5), .scl_is_open_drain = 0, .udelay = 5, }; static struct i2c_gpio_platform_data i2c_gpio6_pdata= { .sda_pin = IMX_GPIO_NR(1, 26), .sda_is_open_drain = 0, .scl_pin = IMX_GPIO_NR(3, 14), .scl_is_open_drain = 0, .udelay = 5, }; /**** i2c-gpio: add: end ****/
mach-armadillo_iotg_std.cへの追加箇所(その3)
static void __init armadillo_iotg_std_init(void) 内に追加
/**** i2c-gpio: add: begin ****/ imx_add_i2c_gpio(5, &i2c_gpio5_pdata); imx_add_i2c_gpio(6, &i2c_gpio6_pdata); /**** i2c-gpio: add: end ****/
上記3でmach-armadillo_iotg_std.cを変更後にビルドしたカーネルイメージをAramdillo-IoTに書き込んで再起動する。
以上の手順で、RS232アドオンモジュールのCON4(テストI/F:スルーホール)の32、33ピンが、
32pin: I2CのSCL
33pin: I2CのSDA
のようにI2Cとして使用できる。
Armadillo-IoTのCON1にRS232アドオンモジュールを接続した場合、デバイスファイルは、"/dev/i2c-5"で見える。 Armadillo-IoTのCON2にRS232アドオンモジュールを接続した場合、デバイスファイルは、"/dev/i2c-6"で見える。