日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

New Linux2.6 I2C Driver Model Example

發布時間:2024/4/14 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 New Linux2.6 I2C Driver Model Example 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? 閑話不說,先給出完整的示例代碼,加好注釋,后面再進一步解釋。

  • //????
  • //??COPYRIGHT?NOTICE????
  • //??Copyright?(c)?2012,?華中科技大學?盧俊(版權聲明)????
  • //??All?rights?reserved.????
  • //?????
  • ///?@file????mydev.c??????
  • ///?@brief???i2c?driver示例代碼??
  • ///????
  • ///?Linux2.6.32?new?i2c?driver?model?example??
  • ///????
  • ///?@version?1.0???????
  • ///?@author??lujun?????
  • ///?@E-mail??lujun.hust@gmail.com????
  • ///?@date????2012/08/24????
  • //????
  • //????
  • //??修訂說明:????
  • //????
  • ??
  • #include?<linux/kernel.h>??
  • #include?<linux/module.h>??
  • #include?<linux/fs.h>??
  • #include?<linux/slab.h>??
  • #include?<linux/init.h>??
  • #include?<linux/list.h>??
  • #include?<linux/i2c.h>??
  • #include?<linux/i2c-dev.h>??
  • #include?<linux/smp_lock.h>??
  • #include?<linux/jiffies.h>??
  • #include?<asm/uaccess.h>??
  • #include?<linux/delay.h>??
  • ??
  • #define?I2C_DEV_NAME?"MyDevice"?//這個名字要跟board_info中的名字一致,才會與I2C_Client匹配??
  • ??
  • static?struct?i2c_device_id?my_id[]?=?{??
  • ????{I2C_DEV_NAME,0},?//作為i2c?client?與?driver?匹配的關鍵詞??
  • ????{}??
  • };??
  • ??
  • MODULE_DEVICE_TABLE(i2c,?my_id);??
  • ??
  • //I2c?client對象指針,給本模塊i2c?read/write提供參數,在probe成功后獲取?
  • static?struct?i2c_client?*my_client;??
  • ??
  • //新的I2C?Client模型采用probe方式,老的接口采用的是attach_adapter??
  • static?int?my_i2c_probe(struct?i2c_client?*client,?const?struct?i2c_device_id?*id)??
  • {??
  • ????//系統探測到了本模塊的i2c設備,保存得到的i2c對象指針,供read/write參數??
  • ????my_client?=?client;??
  • ??
  • ????return?0;??
  • }??
  • ??
  • static int my_i2c_remove(struct i2c_client *client)
  • {
  • //釋放I2C Client對象
  • if( my_client != NULL ) {
  • i2c_unregister_device(my_client);
  • }
  • return?0;??
  • }
  • ??
  • static?struct?i2c_driver?my_driver?=?{??
  • ????.driver???=?{??
  • ????????.name??=?"my?i2c?driver",??
  • ????????.owner?=?THIS_MODULE,??
  • ????},??
  • ????.probe????=?my_i2c_probe,??
  • ????.remove???=?__devexit_p(my_i2c_remove),??
  • ????.id_table?=?my_id,??
  • };??
  • ??
  • static?int?__init?my_i2c_init(void)??
  • {??
  • ????//i2c_add_driver函數內部會根據my_driver提供的id_table在注冊到系統中的boardinfo列表中找到匹配的client,然后調用my_driver的probe函數,將構造出來的i2c?client傳遞過來??
  • ????return?i2c_add_driver(&my_driver);??
  • }??
  • ??
  • static?void?__exit?my_i2c_exit(void)??
  • {??
  • ????//刪除驅動,解除綁定??
  • ????i2c_del_driver(&my_driver);??
  • }??
  • ??
  • int?my_i2c_write(?uint8_t?reg,uint8_t?data?)??
  • {??
  • ????unsigned?char?buffer[2];??
  • ????buffer[0]?=?reg;??
  • ????buffer[1]?=?data;??
  • ??
  • ????if(?2!=?i2c_master_send(my_client,buffer,2)?)?{??
  • ????????printk(?KERN_ERR?"my?i2c?send?fail!?\n"?);??
  • ????????return?-1;??
  • ????}??
  • ????return?0;??
  • }??
  • ??
  • int?my_i2c_read(?uint8_t?reg,uint8_t?*data?)??
  • {??
  • ????//?write?reg?addr??
  • ????if(?1!=?i2c_master_send(my_client,&reg,1)?)?{??
  • ????????printk(?KERN_ERR?"my?i2c?recv?fail!?\n"?);??
  • ????????return?-1;??
  • ????}??
  • ????//?wait??
  • ????msleep(10);??
  • ????//?read??
  • ????if(?1!=?i2c_master_recv(my_client,data,1)?)?{??
  • ????????printk(?KERN_ERR?"my?i2c?recv?fail!?\n"?);??
  • ????????return?-1;??
  • ????}??
  • ??
  • ????return?0;??
  • }??
  • ??
  • MODULE_DESCRIPTION("my?i2c?driver");??
  • MODULE_AUTHOR("Lujun?@HUST");??
  • MODULE_LICENSE("GPL");??
  • ??
  • module_init(my_i2c_init);??
  • module_exit(my_i2c_exit);??
  • ? ? 上面的代碼還不能完全成功運行,因為還沒有添加自己的I2C設備信息到系統中,模塊Probe函數不會被調用執行。注釋中已經提到,i2c_add_driver的時候會掃描本模塊的 id_table 中的名稱是否與注冊到系統中的boardinfo列表中有名稱匹配的client,如果有,則會構造 i2c_client 對象,并調用本模塊的 probe 函數。

    ? ??那么,如何注冊自己的i2c設備信息到系統的 boardinfo 列表中呢?Linux內核文檔:Documentation/i2c/instantiating-devices 中講了多種方式,我在此只說2種方式。

    ? ??第一種方式,在內核的初始化中定義你的I2C設備的信息。比如在/arch/arm/mach-xxxx/board_xxxx.c 中添加一個新的 Boardinfo信息:

  • static?struct?i2c_board_info?__initdata?i2c_info[]?=??{?
  • ????????{?
  • ????????????????I2C_BOARD_INFO("24c256",?0x50),?
  • ????????????????.platform_data??=?&eeprom_info,?
  • ????????},?
  • ????????{?
  • ????????????????I2C_BOARD_INFO("MyDevice",?(0xbc>>1)),?
  • ????????????????.platform_data??=?NULL,?
  • ????????},?
  • };?
  • ? ? ?注意,添加的新的 I2C_BOARD_INFO的名稱一定要與本模塊的driver的名稱字符串一致,地址是I2C設備地址右移1位以后的地址。

    ? ? ?第二種方式,使用i2c_new_device()。相關函數如下:

  • //這個函數將會使用info提供的信息建立一個i2c_client并與第一個參數指向的i2c_adapter綁定。返回的參數是一個i2c_client指針。?
  • struct?i2c_client?*?i2c_new_device(struct?i2c_adapter?*adap,?struct?i2c_board_info?const?*info);?
  • ?
  • //獲取i2c_adapter的函數如下,它的參數是i2c總線編號。?
  • struct?i2c_adapter*?i2c_get_adapter(int?id);?
  • ?
  • //如何知道i2c總線編號呢?
  • ls?/sys/class/i2c-adapter/??
  • //即可看到對應的I2C?adapter編號,i2c-0代表編號為0,i2c-1代表編號為1?
  • ? ? ?那么,使用第二種方式的示例代碼如下,在?my_i2c_init 函數開頭,添加如下代碼,動態注冊 I2C 設備信息到內核 Boardinfo 列表中。? ? ?

  • //自定義boardinfo信息??
  • static?struct?i2c_board_info?my_dev_info[]?__initdata?=?{??
  • ????{??
  • ????????I2C_BOARD_INFO(I2C_DEV_NAME,I2C_DEV_ADDR),??//設備名稱和地址(很關鍵)??
  • ????????.platform_data=?NULL,????//?傳遞私有數據,賦值給client->dev->platform_data??
  • ????},??
  • };??
  • ??
  • //ls?/sys/class/i2c-adapter/得到的編號??
  • static?int?sys_adap_bus_num?=?0;???
  • ??
  • static?int?__init?my_i2c_init(void)??
  • {??
  • ????struct?i2c_adapter*?adap?=?i2c_get_adapter(sys_adap_bus_num);??
  • ???
  • ????if(adap==NULL)?{??
  • ????????printk("[LUJUN-DEBUG]?i2c_get_adapter?fail!\n");??
  • ????????return?-1;??
  • ????}??
  • ??
  • ????//動態構造i2c?client對象?
  • ????my_client?=?i2c_new_device(adap,?&my_dev_info[0]);??
  • ????if(?my_client==NULL?){??
  • ????????printk("[LUJUN-DEBUG]?i2c_new_device?fail!\n");??
  • ????????return?-1;??
  • ????}??
  • ??????
  • ????//釋放資源??
  • ????i2c_put_adapter(adap);??
  • ??
  • ????//函數內部會找到匹配的driver和client,然后調用probe??
  • ????return?i2c_add_driver(&my_driver);??
  • }??
  • 本文轉自 Jhuster 51CTO博客,原文鏈接:http://blog.51cto.com/ticktick/971738,如需轉載請自行聯系原作者

    總結

    以上是生活随笔為你收集整理的New Linux2.6 I2C Driver Model Example的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。