input子系统——i2c设备

一、I2C体系结构        
          Linux的I2C体系结构分为3个组成部分:I2C核心、I2C总线驱动、I2C设备驱动,如下图所示。I2C核心提供总线驱动和设备驱动的注册、注销方法、I2C通信方法(简称algorithm);I2C总线驱动对硬件体系结构中适配器的实现,主要包括适配器i2c_adapter、适配器通信算法i2c_algorithm,如果CPU集成了I2C控制器并且linux内核支持这个CPU,那么总线驱动就不用管,比如S3C2440就属于这类情况,在后文中我们将分析它的总线驱动;I2C设备驱动是具体的一个设备(如AT24C02),挂接在CPU控制的I2C适配器的设备驱动,有了这部分驱动才能使用控制器操作该设备,设备驱动主要包括i2c_driver 和i2c_client数据结构。

二、具体描叙

1、I2C核心

       I2C核心是总线驱动和设备驱动的纽带,源码位于drivers/i2c/i2c-core.c,它并不依赖于硬件平台的接口函数,I2C核心中一些重要函数如下:

        增加/删除i2c_adapter

                int i2c_add_adapter(struct i2c_adapter *adapter)

                int i2c_del_adapter(struct i2c_adapter *adapter)

        增加/删除i2c_driver

                int i2c_register_driver(struct module *owner, struct i2c_driver *driver)

                int i2c_add_driver(struct i2c_driver *driver)         //调用i2c_register_driver

                void i2c_del_driver(struct i2c_driver *driver)

        增加/删除i2c_client

                struct i2c_client *i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)

                void i2c_unregister_device(struct i2c_client *client)

        I2C传输、发送接收

                int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)

                int i2c_master_send(struct i2c_client *client,const char *buf ,int count)

                int i2c_master_recv(struct i2c_client *client, char *buf ,int count)

             i2c_transfer()函数用于进行I2C 适配器和I2C 设备之间的一组消息交互,i2c_master_send()函数和i2c_master_recv()函数内部会调用i2c_transfer()函数分别完成一条写消息和一条读消息,i2c_transfer()本身不能和硬件完成消息交互,它寻找i2c_adapter对应的i2c_algorithm,要实现数据传送就要实现i2c_algorithm的master_xfer(),在总线驱动中就是重点。


2、I2C总线驱动

        I2C总线驱动模块的加载函数要完成两个工作:
            1)初始化I2C适配器所使用的硬件资源,如申请I/O地址、终端号;
            2)通过I2C核心提供的i2c_add_adapter()添加i2c_adapter的数据结构,当然这个i2c_adaper数据结构的成员已经被xxx适配器的相应函数指针所初始化;
        I2C总线驱动模块的卸载函数要完n成的工作与加载函数刚好相反;
            1)释放i2c适配器所使用的硬件资源,如释放I/O地址、中断号等;
            2)通过i2c_del_adapter()删除i2c_adapter删除i2c_adapter的数据结构;

3、I2C总线通信方法

        我们需要为特定的I2C适配器实现其通信方法,主要实现i2c_algorithm的master_xfer()函数和functionality()函数。
        functionality函数非常简单,用于返回algorithm所支持的通信协议,如:I2C_FUNC_I2C、I2C_FUNC_10BIT_ADDR、I2C_FUNC_SMBUS_READ_BYTE等。
        master_xfer()函数在I2C适配器上完成传递给它的i2c_msg数组中的每个i2c消息。
   
static int i2c_adapter_xxx_xfer(structi2c_adapter *adap, struct i2c_msg *msgs, int num)  
{  
   ......  
   for (i = 0; i < num; i++) {  
       i2c_adapter_xxx_start();         /*产生起始位*/  
       if (msgs[i]->
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值