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

g-kihara email@hidden
2009年 1月 22日 (木) 17:10:59 JST


木原です。
お世話になっています。

i2c_probe()に成功し、現在I2C通信テストを
行っているところです。
armadillo-500ボードのI2C1に弊社のセンサを接続し、
センサのレジスタの0xE1にデータ0x23を書き込んだあと、
このレジスタを読みにいって、0x23を受信できるか
テストをおこなっています。送信時、受信時ともに
i2c_transfer()は成功しているのですが、
受信データが、書き込んだデータ(0x23)と異なっているのです。

ここでおききしたいのですが、
i2c_msg構造体変数のメンバbufについて、
buf[0]にはレジスタアドレスを与えているのですが、
i2c_transfer()がcallされた後には、
buf[0]にはレジスタアドレス、
buf[1]には受信データが
入っているという理解でよろしいでしょうか?

i2c_msg構造体のメンバflagsですが、
i2c.hのi2c_msg構造体のコメントを読んだところ、どれにも該当
しないので0としました。
チップアドレスは8ビットであり、
受信時は、マスター(armadillo)がスレーブ(弊社のセンサー)
をよみとります。

-------------------------------------------
【テスト】
static int
i2ctest_attach(struct i2c_adapter *adap)
{
 int ret;
 char tx[2];
 char rx[2];

 DEBUG_FUNC();

 printk("kihara i2ctest_attach is called\n");

 ret = i2c_probe(adap, &addr_data, &i2ctest_detect_client);
 printk("kihara i2c_probe=%d\n", ret);

 // 送信
 tx[0] = 0xE1;
 tx[1] = 0x23;
 i2ctest_TxData(tx, 2);

 // 受信
 rx[0] = 0xE1;
 i2ctest_RxData(rx, 1);
 printk("rx=%x\n", rx[0]);
 printk("rx=%x\n", rx[1]);

 return ret;
}

-------------------------------------------
【受信】

int
i2ctest_RxData(char *rxData, int length)
{
 int ret;
 u8 buf[2];
 struct i2c_msg msgs[2];

 msgs[0].addr = test_i2c_client.addr;
 msgs[0].flags = 0;
 msgs[0].len   = 1;
 msgs[0].buf   = rxData;

 down(&mutex);
 ret = i2c_transfer(test_i2c_client.adapter, msgs, 1);

 printk("RxData msgs[0].buf[0]=%x\n", msgs[0].buf[0]);
 printk("RxData msgs[0].buf[1]=%x\n", msgs[0].buf[1]);

 if(ret == 1){
  printk("RxData succedded!!!\n");
 }else if (ret >= 0){
  ret = -1;
  printk("RxData failed!!!\n");
 }
 up(&mutex);

 return ret;
}
-------------------------------------------------
【送信】

int
i2ctest_TxData(char *txData, int length)
{
 int ret;
 u8 buf[2];
 struct i2c_msg msgs[1];

 msgs[0].addr = test_i2c_client.addr;
 msgs[0].flags = 0;
 msgs[0].len   = length;
 msgs[0].buf   = txData;

 down(&mutex);
 ret = i2c_transfer(test_i2c_client.adapter, msgs, 1);
 if(ret == 1){
  printk("TxData succedded!!!\n");
 }else if (ret >= 0){
  ret = -1;
  printk("TxData failed!!!\n");
 }
 up(&mutex);

 return ret;
}



以上


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


> 高木です
>
> I2C_CLIENT_INSMODについては
> linux-2.6.18-at8/Documentation/i2c/writing-clientsに説明があります。
>
> 以下、一部抜粋
> ▼▼ ここから ▼▼
>
> Fortunately, as a module writer, you just have to define the `normal_i2c'
> parameter. The complete declaration could look like this:
>
>  /* Scan 0x37, and 0x48 to 0x4f */
>  static unsigned short normal_i2c[] = { 0x37, 0x48, 0x49, 0x4a, 0x4b, 
> 0x4c,
>                                         0x4d, 0x4e, 0x4f, 
> I2C_CLIENT_END };
>
>  /* Magic definition of all other variables and things */
>  I2C_CLIENT_INSMOD;
>  /* Or, if your driver supports, say, 2 kind of devices: */
>  I2C_CLIENT_INSMOD_2(foo, bar);
>
>
> ▲▲ ここまで ▲▲
>
>
> 最初のところにモジュールの作成者はnormal_i2cを定義するだけでよいとされています。
> そしてI2C_CLIENT_INSMOD;の説明に「他の変数などの魔法の定義」と書かれています。 
> 
>
> 後はlinux-2.6.18-at8/include/linux/i2c.hでI2C_CLIENT_INSMODの定義を調べました。
>
>
> 自動的に初期化という表現はあまり適切ではなかったですね。
> 申し訳ありません。
>
> 以上
>
>> 木原です。
>>
>> コメントアウトしたところ、ビルド成功しました。
>> ご教示頂き誠にありがとうございました。
>>
>>> 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 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 メーリングリストの案内