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