[Armadillo:03909] Re: armadillo-500 sysfs経由でI2Cドライバ制御
日本電子システムテクノロジー/高木
email@hidden
2009年 1月 16日 (金) 12:55:06 JST
高木です
以下は私が動作させたI2Cドライバの一部です。
参考になればと思います。
XXX_I2C_ADDRESS
通信相手のデバイスがもつ8bitのアドレスです。
1bit右シフトしているのは、最下位bitがRead/Writeのフラグであり
通信時に自動的に処理されるためです。
I2C_CLIENT_INSMOD;
必ず記述してください。
各種変数を自動的に初期化してくれるおまじないです。
▼▼ ここから ▼▼
static int XXX_attach(struct i2c_adapter *adapter);
static int XXX_detach(struct i2c_client *client);
static struct i2c_driver XXX_i2c_driver =
{
.driver =
{
.owner = THIS_MODULE,
.name = "XXX I2C Client",
},
.id = I2C_DRIVERID_XXXX,
.attach_adapter = XXX_attach,
.detach_client = XXX_detach,
};
static struct i2c_client XXX_i2c_client =
{
.name = "XXX I2C dev",
.driver = &XXX_i2c_driver,
};
static unsigned short normal_i2c[] =
{
(XXX_I2C_ADDRESS >> 1),
I2C_CLIENT_END
};
I2C_CLIENT_INSMOD;
static int XXX_detect_client(struct i2c_adapter *adapter,
int address,
int kind)
{
int ret_val;
XXX_i2c_client.adapter = adapter;
XXX_i2c_client.addr = address;
if (i2c_attach_client(&XXX_i2c_client))
{
XXX_i2c_client.adapter = NULL;
printk(KERN_ERR "XXX_attach: i2c_attach_client failed\n");
return -1;
}
return 0;
}
static int XXX_attach(struct i2c_adapter *adap)
{
err = i2c_probe(adap, &addr_data, &XXX_detect_client);
return err;
}
static __init int XXX_init(void)
{
u8 err;
gpio_sensor_active();
err = i2c_add_driver(&XXX_i2c_driver);
return err;
}
module_init(XXX_init);
▲▲ ここまで ▲▲
以上
> 高木です
> はじめまして
>
> armadillo-500のカーネルではデフォルトでI2Cドライバは
> カーネル組込みの設定になっています。
>
> I2Cのドライバをモジュール設定でコンパイルしなければ
> i2c-core.koやi2c-dev.koは作成されません。
>
> ただしカーネル組込みの設定であっても
> i2c-coreやi2c-devの各関数はカーネルに組込まれおり
> 使用することはできるのでi2c_probe()が成功しない理由は
> 他にあるかと思います。
>
> 私も暫くまえにI2Cのドライバを作成して組込みましたがi2c_probeは成功しています。
>
> ちなみにi2ctest_driverはi2c_add_driver()にて登録していますでしょうか?
>
> 以上
>
>
>> 木原です。
>> いつもお世話になっています。
>>
>> i2c_probe()が成功しない原因を調査中ですが、
>> armadillo-500ボードにて、lsmodすると、
>> i2c-coreやi2c-devモジュールがロードされていない
>> ことがわかりました。modprobeしてもエラーとなりました。
>> また、findしたところ、i2c-core.koやi2c-dev.koが存在しないことが
>> わかりました。これらが原因のように思われます。
>> make menuconfigでみたところ、I2Cのサポートはされているようです。
>> どのようにすればこれらのモジュールをロードできるのでしょうか?
>>
>>
>> 以上
>>
>>
>> ----- Original Message ----- From: "g-kihara"
>> <email@hidden>
>> To: "Armadillo series general discussion list"
>> <email@hidden>
>> Sent: Wednesday, January 14, 2009 5:46 PM
>> Subject: [Armadillo:03900]armadillo-500 sysfs経由でI2Cドライバ制御
>>
>>
>>> 木原です。
>>> いつもお世話になっています。
>>>
>>> 【目的】
>>>
>>> armadillo-500ボードのI2C1モジュールに接続したセンサとI2C通信
>>> を行うソフトを作成しようとしています。
>>> その際、sysfs経由でI2Cドライバ制御を行いたいとおもっています。
>>> 以前ご紹介いただいた、drivers/i2c/chips/tlv320aic.cを
>>> 参考に作成しようと思っています。
>>>
>>> 【質問】
>>>
>>> 下記のように書き換え,まずi2c_probe()が正しく行われるか
>>> 確認しました。
>>> デバイスドライバをinsmodし、動作テストしたところ、
>>> i2ctest_attach( )は呼ばれるものの、
>>> i2c_probe( )の返り値が0以外の値となっており、
>>> i2c_probe()に失敗していることがわかりました。
>>> 構造体変数i2ctest_driverのメンバidには、
>>> i2c-id.hで定義されているI2C_DRIVERID以外の
>>> 値を与えたのですが、 これだけではスキャンしてくれない
>>> ようです。他になにか必要な設定があるのでしょうか?
>>> ご教示宜しくお願い申し上げます。
>>>
>>>
>>>
>>>
>>> #define ID_I2CTEST 102
>>>
>>> ・・・・・
>>>
>>> static int
>>> i2ctest_attach(struct i2c_adapter *adap)
>>> {
>>> int ret;
>>>
>>> DEBUG_FUNC();
>>>
>>> printk("i2ctest_attach is called\n");
>>>
>>> ret = i2c_probe(adap, &addr_data, i2ctest_probe);
>>>
>>> printk("i2c_probe=%d\n");
>>>
>>> }
>>>
>>> ・・・・・
>>>
>>> static struct i2c_driver i2ctest_driver = {
>>> .driver = {
>>> .name = DRIVER_NAME,
>>> },
>>> .id = ID_I2CTEST,
>>> .attach_adapter = i2ctest_attach,
>>> .detach_client = i2ctest_detach,
>>> //.command = i2ctest_command,
>>> };
>>>
>>> ・・・・・
>>>
>>>
>>> 以上
>>>
>>>
>>> _______________________________________________
>>> armadillo mailing list
>>> email@hidden
>>> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>> _______________________________________________
>> armadillo mailing list
>> email@hidden
>> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>>
>>
>
>
--
△▼△▼△▼△▼△▼△▼△▼△▼△▼△
日本電子システムテクノロジー株式会社
第1技術部 高木 健太郎
Tel 042-542-2197
Fax 042-546-3779
Email email@hidden
armadillo メーリングリストの案内