Synopsys DesignWareI2C master 数据的发送和接收

在i2c_dw_probe 中会对i2c_adapter的重要成员变量algo赋值
int i2c_dw_probe(struct dw_i2c_dev *dev)
{
    struct i2c_adapter *adap = &dev->adapter;
    int r;

    init_completion(&dev->cmd_complete);

    r = i2c_dw_init(dev);
    if (r)
        return r;

    snprintf(adap->name, sizeof(adap->name),
         "Synopsys DesignWare I2C adapter");
    adap->retries = 3;
    adap->algo = &i2c_dw_algo;
    adap->dev.parent = dev->dev;
    i2c_set_adapdata(adap, dev);
}
这里的i2c_dw_algo 定义如下:
static struct i2c_algorithm i2c_dw_algo = {
    .master_xfer    = i2c_dw_xfer,
    .functionality    = i2c_dw_func,
};

这样在i2c_detect_address 中就会调用i2c_default_probe->i2c_smbus_xfer->i2c_smbus_xfer_emulated->i2c_transfer->__i2c_transfer
int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
{
    unsigned long orig_jiffies;
    int ret, try;

    if (adap->quirks && i2c_check_for_quirks(adap, msgs, num))
        return -EOPNOTSUPP;

    /* i2c_trace_msg gets enabled when tracepoint i2c_transfer gets
     * enabled.  This is an efficient way of keeping the for-loop from
     * being executed when not needed.
     */
    if (static_key_false(&i2c_trace_msg)) {
        int i;
        for (i = 0; i < num; i++)
            if (msgs[i].flags & I2C_M_RD)
                trace_i2c_read(adap, &msgs[i], i);
            else
                trace_i2c_write(adap, &msgs[i], i);
    }

    /* Retry automatically on arbitration loss */
    orig_jiffies = jiffies;
    for (ret = 0, try = 0; try <= adap->retries; try++) {
//关键的一句这里的algo->master_xfer 就是对应i2c_dw_algo中的master_xfer
        ret = adap->algo->master_xfer(adap, msgs, num);
        if (ret != -EAGAIN)
            break;
        if (time_after(jiffies, orig_jiffies + adap->timeout))
            break;
    }


}
所以在__i2c_transfer 中最终调用master_xfer来发送数据
static int
i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
{
    struct dw_i2c_dev *dev = i2c_get_adapdata(adap);
    int ret;

    dev_dbg(dev->dev, "%s: msgs: %d\n", __func__, num);

    pm_runtime_get_sync(dev->dev);
//重新初始化完成量,从这里也可以看出完成量是一次性的,第二次使用之前必须调用reinit_completion 来重新初始化
    reinit_completion(&dev->cmd_complete);
    dev->msgs = msgs;
    dev->msgs_num = num;
    dev->cmd_err = 0;
    dev->msg_write_idx = 0;
    dev->msg_read_idx = 0;
    dev->msg_err = 0;
    dev->status = STATUS_IDLE;
    dev->abort_source = 0;
    dev->rx_outstanding = 0;

    ret = i2c_dw_acquire_lock(dev);
    if (ret)
        goto done_nolock;

    ret = i2c_dw_wait_bus_not_busy(dev);
    if (ret < 0)
        goto done;
// 发送数据,这里主要设置平台相关的寄存器
    /* start the transfers */
    i2c_dw_xfer_init(dev);
//等待释放完成量
    /* wait for tx to complete */
    if (!wait_for_completion_timeout(&dev->cmd_complete, adap->timeout)) {
        dev_err(dev->dev, "controller timed out\n");
        /* i2c_dw_init implicitly disables the adapter */
        i2c_dw_init(dev);
        ret = -ETIMEDOUT;
        goto done;
    }

    /*
     * We must disable the adapter before returning and signaling the end
     * of the current transfer. Otherwise the hardware might continue
     * generating interrupts which in turn causes a race condition with
     * the following transfer.  Needs some more investigation if the
     * additional interrupts are a hardware bug or this driver doesn't
     * handle them correctly yet.
     */
    __i2c_dw_enable(dev, false);

    if (dev->msg_err) {
        ret = dev->msg_err;
        goto done;
    }
    return ret;
}
那完成量是在哪里释放的呢?
答案是在中断的处理函数i2c_dw_isr
static irqreturn_t i2c_dw_isr(int this_irq, void *dev_id)
{
    struct dw_i2c_dev *dev = dev_id;
    u32 stat, enabled;

    enabled = dw_readl(dev, DW_IC_ENABLE);
    stat = dw_readl(dev, DW_IC_RAW_INTR_STAT);
    dev_dbg(dev->dev, "%s: enabled=%#x stat=%#x\n", __func__, enabled, stat);
    if (!enabled || !(stat & ~DW_IC_INTR_ACTIVITY))
        return IRQ_NONE;

    stat = i2c_dw_read_clear_intrbits(dev);

    if (stat & DW_IC_INTR_TX_ABRT) {
        dev->cmd_err |= DW_IC_ERR_TX_ABRT;
        dev->status = STATUS_IDLE;

        /*
         * Anytime TX_ABRT is set, the contents of the tx/rx
         * buffers are flushed.  Make sure to skip them.
         */
        dw_writel(dev, 0, DW_IC_INTR_MASK);
        goto tx_aborted;
    }

    if (stat & DW_IC_INTR_RX_FULL)
        i2c_dw_read(dev);

    if (stat & DW_IC_INTR_TX_EMPTY)
        i2c_dw_xfer_msg(dev);

    /*
     * No need to modify or disable the interrupt mask here.
     * i2c_dw_xfer_msg() will take care of it according to
     * the current transmit status.
     */

tx_aborted:
    //正常情况下这里就会释放完成量
    if ((stat & (DW_IC_INTR_TX_ABRT | DW_IC_INTR_STOP_DET)) || dev->msg_err)
        complete(&dev->cmd_complete);
    else if (unlikely(dev->accessor_flags & ACCESS_INTR_MASK)) {
        /* workaround to trigger pending interrupt */
        stat = dw_readl(dev, DW_IC_INTR_MASK);
        i2c_dw_disable_int(dev);
        dw_writel(dev, stat, DW_IC_INTR_MASK);
    }

    return IRQ_HANDLED;
}

序言........................................................................................................................ 3 1.1 版本1.0-1992 .................................................................................................................... 3 1.2 版本2.0-1998 .................................................................................................................... 3 1.3 版本2.1-2000 .................................................................................................................... 3 1.4 购买Philips 的I2C 总线元件.............................................................................................. 3 2 I2C 总线使设计人员厂商都得益.......................................................................... 3 2.1 设计人员的得益................................................................................................................. 4 2.2 厂商的得益......................................................................................................................... 5 3 介绍I2C 总线规范................................................................................................... 6 4 I2C 总线的概念....................................................................................................... 6 5 总体特征................................................................................................................. 7 6 位传输..................................................................................................................... 7 6.1 数据的有效性..................................................................................................................... 7 6.2 起始停止条件................................................................................................................. 8 7 传输数据................................................................................................................. 9 7.1 字节格式............................................................................................................................ 9 7.2 响应.................................................................................................................................. 9 8 仲裁时钟发生.................................................................................................... 10 8.1 同步................................................................................................................................ 10 8.2 仲裁................................................................................................................................ 10 8.3 用时钟同步机制作为握手..................................................................................................11 9 7 位的地址格式..................................................................................................... 12 10 7 位寻址.............................................................................................................. 13 10.1 第一个字节的位定义...................................................................................................... 13 10.1.1 广播呼叫地址....................................................................................................... 14 10.1.2 起始字节.............................................................................................................. 15 10.1.3 CBUS 的兼容性................................................................................................... 16 11 标准模式I2C 总线规范的扩展............................................................................. 16 12 快速模式............................................................................................................. 17 13 Hs 模式............................................................................................................... 17 13.1 高速传输........................................................................................................................ 17 13.2 Hs 模式的串行数据传输格式.......................................................................................... 19 13.3 从F/S 模式切换到Hs 模式以及返回.............................................................................. 20 13.4 低速模式中的快速模式器件............................................................................................ 21 13.5 串行总线系统的混合速度模式........................................................................................ 21 13.5.1 在混合速度总线系统中的F/S 模式传输............................................................... 22 13.5.2 在混合速度总线系统中的Hs 模式传输................................................................. 22 13.5.3 混合速度总线系统中电桥的时序要求................................................................... 24 广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax:38730925 http://www.zlgmcu.com - 2 - 14 10 位寻址............................................................................................................ 24 14.1 头两个字节位的定义...................................................................................................... 24 14.2 10 位寻址的格式............................................................................................................ 24 14.3 广播呼叫地址10 位寻址的起始字节........................................................................... 26 15 I/O 级总线线路的电气规范时序................................................................... 26 15.1 标准快速模式器件...................................................................................................... 26 15.2 Hs 模式器件................................................................................................................... 28 16 I2C 总线器件到总线线路的电气连接................................................................... 30 16.1 标准模式I2C 总线器件电阻Rp RS 的最大最小值.................................................... 31 17 应用信息............................................................................................................. 33 17.1 快速模式I2C 总线器件的斜率控制输出级....................................................................... 33 17.2 快速模式I2C 总线器件的开关上拉电路.......................................................................... 34 17.3 总线线路的配线方式...................................................................................................... 34 17.4 快速模式I2C 总线器件电阻Rp RS 的最大最小值.................................................... 35 17.5 Hs 模式I2C 总线器件的电阻Rp RS 的最大最小值................................................... 35 18 F/S 模式I2C 总线系统的双向电平转换器........................................................... 35 18.1 连接逻辑电平不同的器件............................................................................................... 36 18.1.1 电平转换器的操作................................................................................................ 36 19 Philips 提供的开发工具...................................................................................... 37 20 支持的文献......................................................................................................... 37
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值