linux下i2c从设备可以主动发数据,Linux Kernel 设备驱动之I2C之host之数据传输

编程入门 行业动态 更新时间:2024-10-26 07:26:27

/* To determine what the adapter supports */ u32 (*functionality) (struct i2c_adapter *);

#if IS_ENABLED(CONFIG_I2C_SLAVE) int (*reg_slave)(struct i2c_client *client); int (*unreg_slave)(struct i2c_client *client);#endif};由于这些跟具体的host相关,所以,在理解host ic之上实现这些函数。

其实根据上面两个函数master_xfer和smbus_xfer就可以明白,I2C支持两个类别的传输。对此

内核封装两个函数:i2c_smbus_xfer和__i2c_transfer(),对于后者,其提供封装接口i2c_transfer()

/** * __i2c_transfer - unlocked flavor of i2c_transfer * @adap: Handle to I2C bus * @msgs: One or more messages to execute before STOP is issued to * terminate the operation; each message begins with a START. * @num: Number of messages to be executed. * * Returns negative errno, else the number of messages executed. * * Adapter lock must be held when calling this function. No debug logging * takes place. adap->algo->master_xfer existence isn't checked. */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++) { ret = adap->algo->master_xfer(adap, msgs, num);  if (ret != -EAGAIN)   break;  if (time_after(jiffies, orig_jiffies + adap->timeout))   break; }

if (static_key_false(&i2c_trace_msg)) {  int i;  for (i = 0; i < ret; i++)   if (msgs[i].flags & I2C_M_RD)    trace_i2c_reply(adap, &msgs[i], i);  trace_i2c_result(adap, i, ret); }

return ret;}

/** * i2c_smbus_xfer - execute SMBus protocol operations * @adapter: Handle to I2C bus * @addr: Address of SMBus slave on that bus * @flags: I2C_CLIENT_* flags (usually zero or I2C_CLIENT_PEC) * @read_write: I2C_SMBUS_READ or I2C_SMBUS_WRITE * @mand: Byte interpreted by slave, for protocols which use such bytes * @protocol: SMBus protocol operation to execute, such as I2C_SMBUS_PROC_CALL * @data: Data to be read or written * * This executes an SMBus protocol operation, and returns a negative * errno code else zero on suess. */s32 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr, unsigned short flags,     char read_write, u8 mand, int protocol,     union i2c_smbus_data *data){ unsigned long orig_jiffies; int try; s32 res;

/* If enabled, the following two tracepoints are conditional on  * read_write and protocol.  */ trace_smbus_write(adapter, addr, flags, read_write,     mand, protocol, data); trace_smbus_read(adapter, addr, flags, read_write,    mand, protocol);

flags &= I2C_M_TEN | I2C_CLIENT_PEC | I2C_CLIENT_SCCB;

if (adapter->algo->smbus_xfer) {  i2c_lock_bus(adapter, I2C_LOCK_SEGMENT);

/* Retry automatically on arbitration loss */  orig_jiffies = jiffies;  for (res = 0, try = 0; try <= adapter->retries; try++) {   res = adapter->algo->smbus_xfer(adapter, addr, flags,       read_write, mand,       protocol, data);   if (res != -EAGAIN)    break;   if (time_after(jiffies,           orig_jiffies + adapter->timeout))    break;  }  i2c_unlock_bus(adapter, I2C_LOCK_SEGMENT);

if (res != -EOPNOTSUPP || !adapter->algo->master_xfer)   goto trace;  /*   * Fall back to i2c_smbus_xfer_emulated if the adapter doesn't   * implement native support for the SMBus operation.   */ }

res = i2c_smbus_xfer_emulated(adapter, addr, flags, read_write,          mand, protocol, data);

trace: /* If enabled, the reply tracepoint is conditional on read_write. */ trace_smbus_reply(adapter, addr, flags, read_write,     mand, protocol, data); trace_smbus_result(adapter, addr, flags, read_write,      mand, protocol, res);

return res;}

更多推荐

设备,数据传输,主动,数据,host

本文发布于:2023-05-20 23:52:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/156748.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:设备   数据传输   主动   数据   host

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!