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 として使える。