资料下载
coding无法使用浏览器打开,必须用git工具下载:
git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git
参考资料:
Linux-4.9.88\Documentation\devicetree\bindings\i2c\i2c-gpio.txt
Linux-5.4\Documentation\devicetree\bindings\i2c\i2c-gpio.yaml
Linux-4.9.88\drivers\i2c\busses\i2c-gpio.c
Linux-5.4\drivers\i2c\busses\i2c-gpio.c
Linux-4.9.88\drivers\i2c\busses\i2c-imx.c
Linux-5.4\drivers\i2c\busses\i2c-stm32f7.c
doc_and_source_for_drivers\IMX6ULL\source\04_I2C\05_i2c_adapter_framework
doc_and_source_for_drivers\STM32MP157\source\A7\04_I2C\05_i2c_adapter_framework
atomic context
环境下使用atomic context
环境下使用分配、设置、注册一个i2c_adpater结构体:
在设备树里构造I2C Bus节点:
i2c-bus-virtual {
compatible = "100ask,i2c-bus-virtual";
};
分配、设置、注册platform_driver结构体。
核心是probe函数,它要做这几件事:
i2c_apdater核心是master_xfer函数,它的实现取决于硬件,大概代码如下:
static int xxx_master_xfer(struct i2c_adapter *adapter,
struct i2c_msg *msgs, int num)
{
for (i = 0; i < num; i++) {
struct i2c_msg *msg = msgs[i];
{
// 1. 发出S信号: 设置寄存器发出S信号
CTLREG = S;
// 2. 根据Flag发出设备地址和R/W位: 把这8位数据写入某个DATAREG即可发出信号
// 判断是否有ACK
if (!ACK)
return ERROR;
else {
// 3. read / write
if (read) {
STATUS = XXX; // 这决定读到一个数据后是否发出ACK给对方
val = DATAREG; // 这会发起I2C读操作
} else if(write) {
DATAREG = val; // 这会发起I2C写操作
val = STATUS; // 判断是否收到ACK
if (!ACK)
return ERROR;
}
}
// 4. 发出P信号
CTLREG = P;
}
}
return i;
}