欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    i2c驱动程序.docx

    • 资源ID:12786259       资源大小:64.05KB        全文页数:117页
    • 资源格式: DOCX        下载积分:10金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    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关联,


    注意事项

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

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

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

    收起
    展开