[Armadillo:03915] Re: armadillo-500 sysfs経由でI2Cドライバ制御

日本電子システムテクノロジー/高木 email@hidden
2009年 1月 16日 (金) 16:05:03 JST


高木です。

> static unsigned short ignore[ ] = { I2C_CLIENT_END };
>
> static struct i2c_client_address_data addr_data = {
> .normal_i2c = normal_i2c,
> .probe  = ignore,
> .ignore  = ignore,
> };

この部分をコメントアウトしてください。

addr_dataはI2C_CLIENT_INSMOD;により自動的に初期化されます。

以上、よろしくお願いします。


> 木原です。
> 
> 早速、高木さんのドライバをベースに作成してビルドしたところ、
> conflicting types for 'ignore'
> などというエラーが出力されました。
> 
> I2C_CLIENT_INSMOD;の挿入場所に問題があるのでしょうか?
> 
> static int i2ctest_attach(struct i2c_adapter *adap);
> static int i2ctest_detach(struct i2c_client *client);
> 
> static struct i2c_driver test_i2c_driver = {
> .driver = {
>   .owner  = THIS_MODULE,
>    .name = DRIVER_NAME,
> },
> .id  = 102,
> .attach_adapter = i2ctest_attach,
> .detach_client = i2ctest_detach,
> };
> 
> static struct i2c_client test_i2c_client =
> {
> .name = "TEST I2C dev",
> .driver = &test_i2c_driver,
> };
> 
> static unsigned short normal_i2c[] =
> {
> 0x1c,
> I2C_CLIENT_END
> };
> 
> static unsigned short ignore[ ] = { I2C_CLIENT_END };
> 
> static struct i2c_client_address_data addr_data = {
> .normal_i2c = normal_i2c,
> .probe  = ignore,
> .ignore  = ignore,
> };
> 
> I2C_CLIENT_INSMOD;
> 
> 
> 以上
> 
> 
> 
> 
> ----- Original Message ----- From: "日本電子システムテクノロジー/高木" 
> <email@hidden>
> To: "Armadillo series general discussion list" 
> <email@hidden>
> Sent: Friday, January 16, 2009 12:55 PM
> Subject: [Armadillo:03909] Re: armadillo-500 sysfs経由でI2Cドライバ制御
> 
> 
>> 高木です
>>
>> 以下は私が動作させた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
>>>>
>>>>
>>>
>>>
>>
>>




armadillo メーリングリストの案内