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

g-kihara email@hidden
2009年 1月 16日 (金) 17:00:55 JST


木原です。

コメントアウトしたところ、ビルド成功しました。
ご教示頂き誠にありがとうございました。

>I2C_CLIENT_INSMOD;により自動的に初期化されます

ドキュメントには"MAGIC"としかかれていないのに、
なぜこのような働きがあるということをご存知なのですか?
ひょっとしてgrep検索ですか?
linuxディレクトリ下で

grep -r  I2C_CLIENT_INSMOD  .

をかけてみます。


以上



----- Original Message ----- 
From: "日本電子システムテクノロジー/高木" <email@hidden>
To: "Armadillo series general discussion list" 
<email@hidden>
Sent: Friday, January 16, 2009 4:05 PM
Subject: [Armadillo:03915] Re: armadillo-500 sysfs経由でI2Cドライバ制御


> 高木です。
>
>> 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 mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo 




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