3.4.2内核下的I2C驱动.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
3.4.2内核下的I2C驱动

3.4.2内核下的I2C驱动 1. 框架 1.1 硬件协议简介 1.2 驱动框架 1.3 bus-drv-dev模型及写程序 a. 设备的4种构建方法 a.1 定义一个i2c_board_info, 里面有:名字, 设备地址 然后i2c_register_board_info(busnum, ...) (把它们放入__i2c_board_list链表) list_add_tail(devinfo-list, __i2c_board_list); 链表何时使用: i2c_register_adapter i2c_scan_static_board_info i2c_new_device 使用限制:必须在 i2c_register_adapter 之前 i2c_register_board_info 所以:不适合我们动态加载insmod a.2 直接i2c_new_device, i2c_new_probed_device a.2.1 i2c_new_device : 认为设备肯定存在 a.2.2 i2c_new_probed_device :对于已经识别出来的设备(probed_device),才会创建(new) i2c_new_probed_device probe(adap, addr_list[i]) /* 确定设备是否真实存在 */ info-addr = addr_list[i]; i2c_new_device(adap, info); a.3 从用户空间创建设备 创建设备 echo at24c08 0x50 /sys/class/i2c-adapter/i2c-0/new_device 导致i2c_new_device被调用 删除设备 echo 0x50 /sys/class/i2c-adapter/i2c-0/delete_device 导致i2c_unregister_device a.4 前面的3种方法都要事先确定适配器(I2C总线,I2C控制器) 如果我事先并不知道这个I2C设备在哪个适配器上,怎么办?去class表示的所有的适配器上查找 有上一些I2C设备的地址是一样,怎么继续分配它是哪一款?用detect函数 static struct i2c_driver at24cxx_driver = { .class = I2C_CLASS_HWMON, /* 表示去哪些适配器上找设备 */ .driver = { .name = 100ask, .owner = THIS_MODULE, }, .probe = at24cxx_probe, .remove = __devexit_p(at24cxx_remove), .id_table = at24cxx_id_table, .detect = at24cxx_detect, /* 用这个函数来检测设备确实存在 */ .address_list = addr_list, /* 这些设备的地址 */ }; 去class表示的这一类I2C适配器,用detect函数来确定能否找到address_list里的设备, 如果能找到就调用i2c_new_device来注册i2c_client, 这会和i2c_driver的id_table比较, 如果匹配,调用probe i2c_add_driver i2c_register_driver a. at24cxx_driver放入i2c_bus_type的drv链表 并且从dev链表里取出能匹配的i2c_client并调用probe driver_register b. 对于每一个适配器,调用__process_new_driver 对于每一个适配器,调用它的函数确定address_list里的设备是否存在 如果存在,再调用detect进一步确定、设置,然后i2c_new_device /* Walk the adapters that are already present */ i2c_for_each_dev(driver, __process_new_driver); __process_new_driver i2c_do_add_adapter /* Detect supported devices on that bus, and instantiate them */ i2c_detect(adap, driver); for (i = 0; ad

文档评论(0)

jgx3536 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档