ブログ

Armadillo-440でi2c-gpioを使ってみる

at_kazutaka.bito
2015年4月3日 15時34分

Armadillo-440でGPIOをI2Cにするドライバ(i2c-gpio)を実際に動作させてみた。

1.I2CにするGPIOの選択

Armadillo-400シリーズハードウェアマニュアル5.3.6. CON9(拡張インターフェース1) - 「Armadillo-420/440」 の表5.16 CON9信号マルチプレクス - 「Armadillo-420/440」を参考に CON9_1(GPIO3_17)をSCL CON9_2(GPIO3_14)をSDA にすることにした。

2.board-armadillo400.hの修正

atmark-dist/linux-2.6.x/arch/arm/mach-mx25/board-armadillo400.h に下記を追加。 備考) CPUはI2Cを3系統もっていて、IDは0/1/2が割り当てられており、MX25_NR_I2C_IDS=3になっている。 下記の設定で今回のi2c-gpioによるI2CのIDは3とする。

enum armadillo440_i2c_id {
    ARMADILLO440_EXT_I2C_ID = MX25_NR_I2C_IDS,
};

3.armadillo400.cの修正

atmark-dist/linux-2.6.x/arch/arm/mach-mx25/armadillo400.c 下記を追加。

static struct i2c_gpio_platform_data armadillo440_ext_i2c_data = {
    .sda_pin = GPIO(3,14),
    .scl_pin = GPIO(3,17),
    .scl_is_output_only = 1,
    .udelay = 5,  
    .timeout = HZ,
};
 
static struct platform_device armadillo440_ext_i2c_device = {
    .name = "i2c-gpio",
    .id = ARMADILLO440_EXT_I2C_ID,
};
 
static void __init armadillo440_init_ext_i2c(void)
{
    mxc_register_device(&armadillo440_ext_i2c_device,
                &armadillo440_ext_i2c_data);
}

static struct mxc_ext_gpio gpio_list_revc[] = { 内のGPIO(3, 17)とGPIO(3, 14)の箇所をコメントアウト。

#if defined(CONFIG_ARMADILLO400_CON9_1_GPIO3_17)
/*    {"CON9_1",   GPIO(3, 17), MXC_EXT_GPIO_DIRECTION_INPUT}, */ 
#endif
#if defined(CONFIG_ARMADILLO400_CON9_2_GPIO3_14)
/*    {"CON9_2",   GPIO(3, 14), MXC_EXT_GPIO_DIRECTION_INPUT}, */

static void __init armadillo440_init(void) 内に下記を追加。

    armadillo440_init_ext_i2c(); 

4.カーネルコンフィギュレーションの設定

make menuconfigで、カーネルコンフィギュレーションのデバイスドライバの 設定で、GPIO-based bitbanging I2Cを有効にする。

Device Drivers --->
  <*> I2C support ---> <I2C>
        I2C Hardware Bus support --->
        <*> GPIO-based bitbanging I2C <I2C_GPIO>

以上の手順で、ビルドしたカーネルを使うと、Armadillo-440の拡張I/Fの  CON9の1pin:I2CのSCL  CON9の2pin:I2CのSDA が、I2Cのデバイスファイル /dev/i2c-3 として使える。