[Armadillo:03919] Re: armadillo-500 sysfs経由でI2Cドライバ制御
日本電子システムテクノロジー/高木
email@hidden
2009年 1月 16日 (金) 17:31:47 JST
高木です
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 メーリングリストの案内