ブログ

Armadillo-IoT(G2):RS232アドオンモジュールでGPIOをI2C化してみる

at_kazutaka.bito
2015年7月24日 19時22分

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"で見える。