gpt4 book ai didi

c - 此代码片段如何在 I2C Controller 中工作

转载 作者:太空宇宙 更新时间:2023-11-04 08:36:03 25 4
gpt4 key购买 nike

我试图理解 i2c-mpc.c I2C Controller 中的以下代码片段。

https://github.com/torvalds/linux/blob/master/drivers/i2c/busses/i2c-mpc.c#L440

static int mpc_write(struct mpc_i2c *i2c, int target,
const u8 *data, int length, int restart)
{

int i, result;
unsigned timeout = i2c->adap.timeout;
u32 flags = restart ? CCR_RSTA : 0;

/* Start as master */
writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags);
/* Write target byte */
writeb((target << 1), i2c->base + MPC_I2C_DR);

result = i2c_wait(i2c, timeout, 1);
if (result < 0)
return result;

for (i = 0; i < length; i++) {
/* Write data byte */
writeb(data[i], i2c->base + MPC_I2C_DR);

result = i2c_wait(i2c, timeout, 1);
if (result < 0)
return result;
}

return 0;
}

谁能告诉我我们到底在做什么第 440 行 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags);

是否所有四个寄存器都设置为值 1 以及 flag varibales 究竟包含什么?

最佳答案

如果您想编写不可读和不可维护的代码(例如,在 ucontroller 代码中经常发现),那么有问题的语句可以写成:

if (restart)
CCR = 0xF4;
else
CCR = 0xF0;

但是可读和可维护的代码对外围寄存器中的每个控制位(或字段/选项)使用符号名称。
因此对于 CCR 寄存器,驱动程序在第 45:50 行定义了这些符号:

#define CCR_MEN 0x80
#define CCR_MIEN 0x40
#define CCR_MSTA 0x20
#define CCR_MTX 0x10
#define CCR_TXAK 0x08
#define CCR_RSTA 0x04

标准做法是为寄存器使用助记符作为前缀,并为每个控制位名称的其余部分重复使用硬件名称(如数据表中所见)。
因此函数中的第二个参数是四个常量和一个变量的按位或运算,该变量将产生 0xF4 或 0xF0,具体取决于传递的参数 restart 的值。


请注意,*NIX 内核(即结构良好的代码)通常将内存映射外围寄存器定义为简单地址,并使用函数(或宏)来执行写入(或读取)操作,与 ucontroller 代码通常使用赋值语句的方式不同。此约定避免了寄存器名称的重载,因此仍可以执行地址运算。
例如,驱动程序为控制寄存器定义了一个寄存器偏移量

#define MPC_I2C_CR 0x08

然后驱动中定义的writeccr()写入CCR寄存器是

static inline void writeccr(struct mpc_i2c *i2c, u32 x)
{
writeb(x, i2c->base + MPC_I2C_CR);
}

base 变量将包含外围寄存器映射到的虚拟地址,使用具有物理地址范围的 ioremap() 调用。
而 ucontroller 代码通常只是取消引用(物理)地址:

#define  CCR  (volatile u8 *)0x000003008

what exactly flag varibales contains?

第437行的声明和初始化:

    u32 flags = restart ? CCR_RSTA : 0;

相当于

u32 flags;
if (restart != 0) {
flags = 0x04; /* CCR_RSTA */
} else {
flags = 0;
}

关于c - 此代码片段如何在 I2C Controller 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26193344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com