ImageVerifierCode 换一换
格式:DOCX , 页数:117 ,大小:64.05KB ,
资源ID:12786259      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12786259.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(i2c驱动程序.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

i2c驱动程序.docx

1、i2c驱动程序目录1 IIC子系统初始化 11.1 IIC子系统初始化i2c_init 11.2 IIC子系统退出函数i2c_exit 12 i2c_bus_type总线 22.1总线的match方法 22.2总线的probe方法 22.3 一些函数 32.3.1 i2c_match_id()函数 33 i2c_driver驱动 33.1 i2c_driver注册 43.1.1 i2c_add_driver添加一个驱动 43.1.2 i2c_register_driver注册一个驱动 43.2 驱动注册中重要函数 54 适配器adapter驱动程序 54.1 i2c_adapter适配器 54

2、.1.1 IIC适配器加载函数 64.1.3 i2c_register_adapter()适配器注册函数 84.1.4 适配器卸载函数i2c_del_adapter() 94.2 s3c24xx_i2c适配器(板子具体扩充) 134.3 适配器通信方法 144.3.1 i2c_msg结构和i2c_transfer 144.3.1.1 i2c_transfer 154.3.2 i2c_algorithm结构 164.3.3 s3c24xx_i2c_algorithm结构体(板子具体扩展) 164.3.4 s3c24xx_i2c_irq中断函数 194.3.5 一些其它通讯函数 235 IIC设备

3、层驱动程序 245.1 IIC设备驱动模块加载和卸载 245.2 platform_device设备 245.2.1 s3c2410_platform_i2c 255.2.2 s3c_i2c0_set_platdata 255.3.3 default_i2c_data0 265.3 platform_driver驱动 265.3.1 probe函数 265.3.2 remove函数 295.4 一些函数 296 i2c_client 316.1 i2c_client_type 326.2 生成i2c_clent 336.2.1 i2c_detect根据驱动上的所有地址数据产生所有的i2c设备

4、336.2.2 i2c_detect_address 根据client和driver产生一个i2c设备 356.2.3 i2c_new_device实例化一个i2c设备 366.2.4 adapter注册时 376.2.5 i2c_driver注册时 386.3 其它函数 396.3.1 i2c_smbus_xfer 396.3.2 i2c_smbus_xfer_emulated 396.4. i2c_board_info 437 i2c-dev.c设备驱动 457.1 i2c_dev_init 457.2 i2c_dev设备 467.3 新增的i2c_driver驱动-i2cdev_driv

5、er 467.3.1 i2cdev_attach_adapter获得一个i2c_dev并注册添加属性 467.3.2 i2cdev_detach_adapter函数 477.3.3属性dev_attr_name 477.4 文件操作 487.4.1 open函数 487.4.2 read函数 497.4.3 write函数 507.4.4 unlocked_ioctl函数- i2cdev_ioctl 517.5 一些函数 547.5.1 get_free_i2c_dev获得一个新的i2c_dev结构并加入i2c_dev_list链表 547.5.2 i2c_dev_get_by_minor遍历

6、i2c_dev_list链表查找此设备号为index的i2c_dev 547.5.3 i2c_get_adapter和i2c_put_adapter 557.5.4 i2c_new_dummy 558 at24驱动非系统 558.1 模块初始化 558.2 数据结构 568.2.1 at24_data 568.2.2 at24_ids 568.3 at24驱动模块at24_driver 578.3.1 驱动的probe函数 578.3.2 驱动的remove函数 608.3.3 at24_bin_read函数 608.3.4 at24_bin_write函数 628.4 一些函数 648.4.

7、1 at24_translate_offset 641 IIC子系统初始化1.1 IIC子系统初始化i2c_initstatic int _init i2c_init(void) int retval; retval = bus_register(&i2c_bus_type); /注册IIC总线i2c_bus_type if (retval) return retval;#ifdef CONFIG_I2C_COMPAT i2c_adapter_compat_class = class_compat_register(i2c-adapter); if (!i2c_adapter_compat_c

8、lass) retval = -ENOMEM; goto bus_err; #endif retval = i2c_add_driver(&dummy_driver);/调用i2c_register_driver(THIS_MODULE, driver),这个dummy_driver是个空驱动 if (retval) goto class_err; return 0;class_err:#ifdef CONFIG_I2C_COMPAT class_compat_unregister(i2c_adapter_compat_class);bus_err:#endif bus_unregister(

9、&i2c_bus_type); return retval;1.2 IIC子系统退出函数i2c_exitstatic void _exit i2c_exit(void) i2c_del_driver(&dummy_driver); /注销IIC设备驱动程序#ifdef CONFIG_I2C_COMPAT class_compat_unregister(i2c_adapter_compat_class);#endif bus_unregister(&i2c_bus_type); /注销IIC总线i2c_bus_typepostcore_initcall(i2c_init);module_exit

10、(i2c_exit);2 i2c_bus_type总线struct bus_type i2c_bus_type = .name = i2c, .match = i2c_device_match, .probe = i2c_device_probe, .remove = i2c_device_remove, .shutdown = i2c_device_shutdown, .suspend = i2c_device_suspend, .resume = i2c_device_resume,;2.1总线的match方法static int i2c_device_match(struct devic

11、e *dev, struct device_driver *drv) struct i2c_client *client = i2c_verify_client(dev);/设备的类型必须是i2c_client_type才能正常获得client/而只有client的device_type是i2c_client_type,adapter的不是i2c_client_type型的。从而若dev是adapter中的dev的话是不会再往下走,直接返回0 struct i2c_driver *driver; if (!client) return 0; driver = to_i2c_driver(drv

12、); /* match on an id table if there is one */ if (driver-id_table) return i2c_match_id(driver-id_table, client) != NULL;/驱动的id和设备的名字是否匹配,匹配返回1 return 0; /match成功后系统就把dev的driver设成driver了static const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id,const struct i2c_client *client) whi

13、le (id-name0) if (strcmp(client-name, id-name) = 0) return id; id+; return NULL;总的来说是i2c_driver驱动的id_table的名字和i2c_client设备的名字匹配。不管adapter设备。 match后系统把i2c_client-dev的driver设成是此i2c_driver-driver。2.2总线的probe方法实际调研i2c_driver的probe函数,由于match方法只有是i2c_client_type类型才能匹配,然后才能调用probe,所以此处的dev也只有是client类型才行。st

14、atic int i2c_device_probe(struct device *dev) struct i2c_client *client = i2c_verify_client(dev); struct i2c_driver *driver; int status; if (!client) return 0; driver = to_i2c_driver(dev-driver); if (!driver-probe | !driver-id_table) return -ENODEV; client-driver = driver; /系统只设置了系统的设备和驱动的关系,自己的关系自己

15、设置 if (!device_can_wakeup(&client-dev) device_init_wakeup(&client-dev,client-flags & I2C_CLIENT_WAKE); dev_dbg(dev, proben);/比较i2c_driver的id_table和i2c_client名字是否匹配 status = driver-probe(client, i2c_match_id(driver-id_table, client); if (status) client-driver = NULL; return status;2.3 一些函数2.3.1 i2c_m

16、atch_id()函数i2c_match_id比较id和i2c_client名字是否匹配static const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id,const struct i2c_client *client) while (id-name0) if (strcmp(client-name, id-name) = 0) return id; id+; return NULL;3 i2c_driver驱动struct i2c_driver unsigned int class; /驱动的类型/注意

17、出现一个新总线或移除一个新总线时的驱动。应该尽量避免使用这个,可能未来会取消 int (*attach_adapter)(struct i2c_adapter *); /检测到适配器时调用(传统驱动),感觉i2c_detect调用后调用attach_adapter函数,或是i2c_new_device后调用的 int (*detach_adapter)(struct i2c_adapter *); /卸载适配器时调用(传统驱动)/标准驱动模型接口,支持动态插入,要么只定义下面的的新类型的设备驱动函数,要么之定义上面两个不可以动态插入和拔出的旧的函数。 int (*probe)(struct i

18、2c_client *, const struct i2c_device_id *); /新类型设备的探测函数 int (*remove)(struct i2c_client *); /新类型设备的移除函数 void (*shutdown)(struct i2c_client *); /关闭设备 int (*suspend)(struct i2c_client *, pm_message_t mesg); /挂起设备 int (*resume)(struct i2c_client *); /恢复设备/使用命令是设备完成特殊的功能,类似ioctl函数 int (*command)(struct

19、i2c_client *client, unsigned int cmd, void *arg); struct device_driver driver; /设备驱动结构体 const struct i2c_device_id *id_table; /设备ID表/自动设备创建调用用的设备检测回调函数 int (*detect)(struct i2c_client *, int kind, struct i2c_board_info *); /自动探测设备的回调函数 const struct i2c_client_address_data *address_data; /设备所在的地址范围 s

20、truct list_head clients; /指向驱动支持的设备;其中设备ID数据结构为:struct i2c_device_id char nameI2C_NAME_SIZE; kernel_ulong_t driver_data /* Data private to the driver */ _attribute_(aligned(sizeof(kernel_ulong_t);struct i2c_driver 代表一个I2C设备驱动,对应一套驱动方法,一个i2c_driver上可以支持多个同等类型的i2c_client。driver.owner应该设定为模块拥有者。driver.

21、name应该设定为驱动的名字。对于自动设备检测,必须定义detect和address_data。应该设置class,否则只会创建强制设定了模块参数的设备。detect函数至少应该填充i2c_board_info的name字段,成功检测后处理,可能也会处理flags字段。若没有detect,则针对列举的设备驱动仍会正常运行。不会支持检测到的设备。传递给detect的i2c_client结构不是一个真正的i2c_client。它只被粗略初始化使得可以调用i2c_smbus_read_byte_data和friends。不要用它做任何事情。通常,不允许调用dev_dbg和它的friends。3.1

22、i2c_driver注册3.1.1 i2c_add_driver添加一个驱动使用i2c_add_driver函数注册一个驱动。static inline int i2c_add_driver(struct i2c_driver *driver) return i2c_register_driver(THIS_MODULE, driver);3.1.2 i2c_register_driver注册一个驱动1. 注册i2c_driver中的driver,会调用总线的probe和match方法,只匹配和探测client设备。2. 初始化驱动支持的设备链表3. 对于drv的总线上的所有设备运行_atta

23、ch_adapter,对于drv的总线上的所有adapter设备根据此驱动上的所有地址数据产生adapter所有的i2c设备;并调用driver的attach_adapter函数。static struct i2c_driver dummy_driver = .driver.name = dummy, .probe = dummy_probe, .remove = dummy_remove, .id_table = dummy_id,;int i2c_register_driver(struct module *owner, struct i2c_driver *driver) int res

24、; if (unlikely(WARN_ON(!i2c_bus_type.p) /总线已经注册过的话则已经定义了私有数据 return -EAGAIN; driver-driver.owner = owner; driver-driver.bus = &i2c_bus_type;/注册返回时,驱动核心已经调用probe匹配未绑定设备/driver_register会对于总线的所有设备(进入match和probe后发现这里的设备只是client设备)调用match和probe/(因为i2c_driver-driver的match和probe没有定义,所以调用总线的match和Probe,而总线的

25、probe调用了i2c_driver的probe函数)/只初始化了owner和bus没有初始化driver中别的函数。 res = driver_register(&driver-driver); if (res) return res; pr_debug(i2c-core: driver %s registeredn, driver-driver.name); INIT_LIST_HEAD(&driver-clients); /初始化驱动支持的设备链表 /* Walk the adapters that are already present */ mutex_lock(&core_lock

26、); bus_for_each_dev(&i2c_bus_type, NULL, driver, _attach_adapter);/对于drv的总线上的所有设备(进入函数里会发现是所有adpter设备)运行_attach_adapter,也就是针对所有总线上的所有adapter设备执行i2c_driver的attach函数,产生对应的i2c_client设备。 mutex_unlock(&core_lock); return 0;3.2 驱动注册中重要函数4 适配器adapter驱动程序4.1 i2c_adapter适配器struct i2c_adapter struct module *o

27、wner; /THIS_MODULE unsigned int id; /定义于i2c_id.h中 unsigned int class; /*允许探测的驱动类型*/ const struct i2c_algorithm *algo; /* 指向适配器的驱动程序*/ void *algo_data; /指向适配器的私有数据,根据不同情况使用的方法不同 /* data fields that are valid for all devices */ u8 level; /* nesting level for lockdep */ struct mutex bus_lock; /获得总线的锁 i

28、nt timeout; /* in jiffies 超时*/ int retries; /重试次数 struct device dev; /*指向适配器设备结构体*/adapter的子设备应该是client中的dev/device_for_each_child(&adapter-dev, &addr, _i2c_check_addr);/之后_i2c_check_addr函数中可以i2c_verify_client();获得子设备对应的client。 int nr; /好像是iic控制器数量,也用于次设备号 char name48; /适配器名称 struct completion dev_r

29、eleased; /用于同步的完成量;i2c_adapter用来辨识一个物理i2c总线控制器,带有必要的访问算法。相当于一个IIC总线的控制器。系统中可以有多个总线适配器。 I2C适配器需要i2c_algorithm中提供的通信函数来控制适配器上产生特定的访问周期。 i2c_adapter通过device结构连接到i2c总线上,aglo指针指向具体的总线通信方法s3c24xx_i2c_algorithm结构体。4.1.1 IIC适配器加载函数4.1.1.1 i2c_add_adapter()函数当驱动开发人员拿到一块新的电路板,并研究了响应的IIC适配器后,就应该使用内核提供的框架函数向IIC

30、子系统中添加一个新的适配器。这个过程如下所示。 声明一个i2c adapter,使用动态bus number。此时bus number不重要。例如,USB链接或PCI插卡动态增加的I2C适配器。 返回0,则分配了新的bus number(实际上分配了一个新的ID号)并存贮到adap-nr,并使制定的adapter对于client来说生效了否则返回负的errno(ENOMEM/ EAGAIN)。int i2c_add_adapter(struct i2c_adapter *adapter) int id, res = 0;retry: if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) = 0) /为ID号分配内存 return -ENOMEM; mutex_lock(&core_lock); res = idr_get_new_above(&i2c_adapter_idr, adapter,_i2c_first_dynamic_bus_num, &id);/使ID号id与指针adapter关联,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1