我试图使用regmap API访问I2 C设备,但完全不清楚瓦尔指针的预期类型。
Cfr:int regmap_read(struct regmap *map,unsigned int reg,unsigned int * 瓦尔)
我看到的两个选项是(两个都是坏的BTW IMHO):
[1]它实际上是一个指向unsigned int类型的指针,当你阅读它时,你必须使用一个中间变量。因为你不知道bitsize和unsigned int类型是什么,你永远不能确定它将容纳32位。
[2]它被认为是一个指向一个类型的指针,该类型对应于你在regmap_config中传入的瓦尔_bits(并且你必须错误地将指向该类型的指针重新转换为API期望使其可编译的类型)。
这篇文章没有任何帮助(令人惊讶):
/**
...
* @val: Pointer to store read value
...
*/
字符串
像https://patchwork.kernel.org/patch/9378201/这样的东西似乎表明它是[1],但我看到其他驱动程序,我认为它们可以做[2],例如:
static inline int
ar1335_read_reg(struct ar1335_info *info, u16 addr, u16 *val)
{
return regmap_read(info->regmap, addr, (unsigned int *) val);
}
型
(https://github.com/Bogdacutu/STLinux-Kernel/blob/master/drivers/media/platform/tegra/ar1335.c)
如果我尝试遵循实际上分配给read的函数(我认为,它是完全抽象和更多抽象),我认为我最终会在
static int regmap_i2c_read(void *context,
const void *reg, size_t reg_size,
void *val, size_t val_size)
{
struct device *dev = context;
struct i2c_client *i2c = to_i2c_client(dev);
struct i2c_msg xfer[2];
int ret;
xfer[0].addr = i2c->addr;
xfer[0].flags = 0;
xfer[0].len = reg_size;
xfer[0].buf = (void *)reg;
xfer[1].addr = i2c->addr;
xfer[1].flags = I2C_M_RD;
xfer[1].len = val_size;
xfer[1].buf = val;
ret = i2c_transfer(i2c->adapter, xfer, 2);
if (ret == 2)
return 0;
else if (ret < 0)
return ret;
else
return -EIO;
}
型
这将表明它必须是指向真实的数据类型的指针,因此例如在瓦尔_bits = 16的情况下是U16 *。
有人有什么见解吗?如果是[2],为什么不使用void * 指针来避免像i2c read那样丑陋的强制转换?历史混乱?
谢谢你,
Bram
1条答案
按热度按时间7vhp5slm1#
根据AR1335 Register Reference,看起来AR1335上的所有寄存器都是16位,也就是uint16