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 概述   I2C是philips提出的外设总线.   I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL ,使用SCL,SDA这两根信号线就实现了设备之间的数据交互,它方便了工程...
  • wangpengqi
  • wangpengqi
  • 2013年12月31日 11:04
  • 19622

Linux设备驱动程序架构分析之一个I2C驱动实例

作者:刘昊昱  博客:http://blog.csdn.net/liuhaoyutz 内核版本:3.10.1   编写一个I2C设备驱动程序的工作可分为两部分,一是定义和注册I2C设备,即i2c_cl...
  • liuhaoyutz
  • liuhaoyutz
  • 2013年12月12日 14:50
  • 12244

i2c驱动架构(史上最全) davinc dm368 i2c驱动分析

预备知识 在阅读本文最好先熟悉一种i2c设备的驱动程序,并且浏览一下i2c-core.c以及芯片提供商的提供的i2c总线驱动(i2c-davinci.c)。标题党请见谅! 其实i2c接口非...
  • ljzcom
  • ljzcom
  • 2013年07月16日 14:50
  • 4212

linux内核的I2C子系统详解2——关键结构体、关键文件

以下内容源于朱有鹏《物联网大讲堂》课程的学习,如有侵权,请告知删除。 3、I2C子系统的4个关键结构体 (1)struct i2c_adapter :I2C适配器 用来描述I2C...
  • oqqHuTu12345678
  • oqqHuTu12345678
  • 2017年12月17日 17:46
  • 52

Linux I2C 几个结构体间的关系

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

linux i2c驱动相关结构体

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

I2C 的 4 个结构体

1, struct i2c_driver {  int id;  unsigned int class;  /* Notifies the driver that a new bus has ...
  • lifeiaidajia
  • lifeiaidajia
  • 2012年07月19日 16:48
  • 749

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

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

/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
  • 2897

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

http://blog.csdn.net/arminkztl/article/details/49861223 struct2json struct2json 是一个开源的C结构体...
  • mydriverc2
  • mydriverc2
  • 2016年04月22日 11:18
  • 1038
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:i2c关键结构体分析
举报原因:
原因补充:

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