I2C函数之s3c24xx_i2c_xfer解析(一)

 这是一个I2C总线传输函数的示例,来源于Linux设备驱动开发详解.pdf。

// 1. 定义一个名为`s3c24xx_i2c_xfer`的函数,它是一个静态函数,用于执行I2C数据传输。
//   参数包括:
//   - `struct i2c_adapter *adap`: 指向I2C适配器结构的指针。
//   - `struct i2c_msg *msgs`: 指向I2C消息数组的指针。
//   - `int num`: 消息数组中消息的数量。
static int s3c24xx_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)

{
    // 4. 从I2C适配器中获取私有数据,该数据通常用于存储特定于设备的上下文信息。
    struct s3c24xx_i2c *i2c = (struct s3c24xx_i2c *)adap->algo_data;

    // 5-6. 定义两个整数变量`retry`和`ret`,用于重试计数和函数返回值。
    int retry;
    int ret;

    // 8. 设置重试次数的初始值。
    //    `max_retries`是一个未在代码段中显示的宏或常量,表示最大重试次数。
    retry = max_retries;

    // 9. 调用实际执行I2C传输的函数`s3c24xx_i2c_do_xfer`。
    //    参数包括设备上下文`i2c`,消息数组`msgs`和消息数量`num`。
    ret = s3c24xx_i2c_do_xfer(i2c, msgs, num);

    // 10-11. 如果传输函数返回`-EAGAIN`错误码,表示需要重试。
    //        则跳出循环,返回错误码。
    if (ret == -EAGAIN) {
        return ret;
    }

    // 12. 如果传输失败,延迟一段时间,然后重试传输。
    //     `udelay`函数用于在微秒级别上延迟。
    udelay(100);

    // 15. 如果传输函数返回`-ERESTARTSYS`错误码,表示系统需要重启。
    if (ret == -ERESTARTSYS) {
        // 代码段结束,没有显示完整的错误处理逻辑。
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值