i2c关键结构体分析

原创 2012年03月22日 16:21:00
1、总线配置结构体:
struct s3c2410_platform_i2c {
    int        bus_num; //总线条数
    unsigned int    flags;
    unsigned int    slave_addr;//从机地址
    unsigned long    frequency;//频率
    unsigned int    sda_delay;//sda传送延时

    void    (*cfg_gpio)(struct platform_device *dev);
};

2、总线描述结构体:
struct s3c24xx_i2c {
        spinlock_t              lock;        //自选锁(防止总线资源被并发访问)
        wait_queue_head_t       wait;        //等待队列(当有数据需要收/发时启动总线,然后守候在等待队列,直到数据收/发结束后被唤醒返回)

        struct i2c_msg          *msg;        //i2c信息指针
        unsigned int            msg_num;    //需要传输的i2c msg数
        unsigned int            msg_idx;    //成功传输的i2c msg数
        unsigned int            msg_ptr;    //当前i2c msg内指针

        unsigned int            tx_setup;    //延时值(保证总线启动时数据已经传输到总线上)

        enum s3c24xx_i2c_state  state;        //i2c总线状态

        void __iomem            *regs;:
        struct clk              *clk;
        struct device           *dev;
        struct resource         *irq;
        struct resource         *ioarea;
        struct i2c_adapter      adap;        //总线适配器(个人觉得它更像设备驱动中的设备而非驱动)
};

3、总线适配器:
struct i2c_adapter {
        struct module *owner;
        unsigned int id;
        unsigned int class;
        const struct i2c_algorithm *algo;             //i2c总线访问算法
        void *algo_data;                    //用来保存struct s3c24xx_i2c结构指针

        /* --- administration stuff. */
        int (*client_register)(struct i2c_client *);
        int (*client_unregister)(struct i2c_client *);

        /* data fields that are valid for all devices   */
        u8 level;                                   //nesting level for lockdep
        struct mutex bus_lock;
        struct mutex clist_lock;

        int timeout;
        int retries;
        struct device dev;                          //the adapter device

        int nr;
        struct list_head clients;
        struct list_head list;
        char name[48];
        struct completion dev_released;
};

4、总线访问算法:
struct i2c_algorithm {
        /* If an adapter algorithm can't do I2C-level access, set master_xfer
           to NULL. If an adapter algorithm can do SMBus access, set
           smbus_xfer. If set to NULL, the SMBus protocol is simulated
           using common I2C messages */
        /* master_xfer should return the number of messages successfully
           processed, or a negative value on error */
        int (*master_xfer)(struct i2c_adapter *adap,struct i2c_msg *msgs,    //i2c msg发送函数
                           int num);
        int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr,
                           unsigned short flags, char read_write,
                           u8 command, int size, union i2c_smbus_data * data);

        /* --- ioctl like call to set div. parameters. */
        int (*algo_control)(struct i2c_adapter *, unsigned int, unsigned long);

        /* To determine what the adapter supports */
        u32 (*functionality) (struct i2c_adapter *);                //标志i2c适配器所支持的功能
};

struct i2c_msg {
        __u16 addr;     /* slave address                        */
        __u16 flags;
#define I2C_M_TEN       0x10    /* we have a ten bit chip address       */
#define I2C_M_RD        0x01
#define I2C_M_NOSTART   0x4000
#define I2C_M_REV_DIR_ADDR      0x2000
#define I2C_M_IGNORE_NAK        0x1000
#define I2C_M_NO_RD_ACK         0x0800
#define I2C_M_RECV_LEN          0x0400 /* length will be first received byte */
        __u16 len;              /* msg length                           */
        __u8 *buf;              /* pointer to msg data                  */
};

相关文章推荐

linux i2c驱动相关结构体

i2c驱动看下来感觉就像一张找不到头的网,繁复错杂,千丝万缕,很难理清。这还只是一个简单的子系统,还有复杂的USB总线,更别提内核的复杂了,哎,路漫漫其修远兮...anyway,加油! 函数指针和链表...

Linux I2C 几个结构体间的关系

在Linux内核源代码中的drivers目录下包含一个i2c目录,而在i2c目录下又包含如下文件和文件夹: •  i2c-core.c 这个文件实现了I2C核心的功能以及/proc/bus/i2c...
  • Yulay01
  • Yulay01
  • 2012年08月21日 16:16
  • 3842

I2C 的 4 个结构体

1, struct i2c_driver {  int id;  unsigned int class;  /* Notifies the driver that a new bus has ...

linux内核I2C体系结构(注意结构体原型)

http://www.cnblogs.com/yuanfang/archive/2010/12/24/1916234.html一、概述谈到在linux 系统下编写I2C驱动,目前主要有两种方式,一种...
  • sydnash
  • sydnash
  • 2011年01月18日 08:33
  • 861

/sys/bus/i2c/devices下的内容与i2c_board_info结构体

在目录/sys/bus/i2c/devices下能发现系统中的I2C设备,如下:view plaincopy to clipboardprint?# ls   0-0034   0-0030   0-...
  • sfrysh
  • sfrysh
  • 2011年01月14日 16:51
  • 2851

C结构体边界对齐2

C语言结构体对齐也是老生常谈的话题了。基本上是面试题的必考题。结构体到底怎样对齐?下面总结了对齐原则,在没有#pragma pack宏的情况下: 原则1、普通数据成员对齐规则:第一个数据成员放在...
  • B_H_L
  • B_H_L
  • 2012年07月11日 22:12
  • 4533

struct2json -- C结构体与 JSON 快速互转库V1.0发布

http://blog.csdn.net/arminkztl/article/details/49861223 struct2json struct2json 是一个开源的C结构体...

结构体存储文件 C 深入理解2 直接存储,有大端和端的问题。

结构体存储文件 C 深入理解2 直接存储,有大端和端的问题。...

C结构体边界对齐2

点击打开链接 C语言结构体对齐也是老生常谈的话题了。基本上是面试题的必考题。结构体到底怎样对齐?下面总结了对齐原则,在没有#pragma pack宏的情况下: 原则1、普通数据成员对齐...

struct2json -- C结构体与 JSON 快速互转库V1.0发布

struct2json 是一个开源的C结构体与 JSON 快速互转库,它可以快速实现 结构体对象 与 JSON 对象 之间序列化及反序列化要求。快速、简洁的 API 设计,大大降低直接使用 JSON ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:i2c关键结构体分析
举报原因:
原因补充:

(最多只允许输入30个字)