使用regmap_read()读取I2C寄存器但获取常量值

时间:2018-04-24 18:03:31

标签: c linux-kernel linux-device-driver embedded-linux

这可能实际上是关于regmap.c一般如何运作的问题,但目前,我确实对regmap_read()的用法有疑问。

我正在研究和修改用于Jetson TX1的ov5693相机的参考驱动程序实现(使用 NVIDIA Tegra Linux Driver Package Development Guide 中提供的nVidia代码示例)。我理解的方式是,相机具有MIPI CSI-2数据,由nVidia的驱动程序"其他地方"处理。我正在修改的部分是驱动程序的I2C部分,它被定义为V4L2子设备并将我的摄像机注册为I2C设备,在那里,我还能够实现一些外部V4L2命令来调用通过ioctl()

司机的主要功能正在按照我的预期运作。我能够捕获帧并将(通过write_reg())不同的值写入与“增益”相关的寄存器中。在传感器中确实会导致我捕获的图像发生变化。

然后,我写了一个简单的函数,通过自定义V4L2 ioctl命令调用,以打印给定地址的寄存器值(在dmesg读取)。我所做的大致是

之类的内容
test_function(struct camera_common_data *s_data, unsigned int val){
    struct ov5693 *priv = (struct ov5693 *)s_data->priv;
    int err;
    u16 address;
    u8 value;

    address = (u16)(val & 0xffff);
    err = read_reg(priv->regmap, (unsigned int)address, (unsigned int *)(&value));
    printk("debug: %s: addr=0x%04X, val=0x%02X\n", __func__, address, value);
}

结构ov5693包含各种V4L2结构和其他变量,并且regmap具有要传递给read_reg()的正确类型。

因此,此函数的打印值大多数与传感器数据表中指定的默认值相匹配。

这就是我的麻烦开始的地方即使我知道我确实能够将值写入I2C寄存器(正如我之前提到过的,我为其写了不同的值与传感器的“增益”相关的注册,我能够捕获不同的图像,每个图像都以预期的方式改变,适当地增加“增益”值我尝试读取相同的寄存器,即使写入不同的值后,它总是显示相同的(初始)值

在我看来,我似乎从某种缓存版本的寄存器(?)中读取。如果是这样的话,我无法理解它是如何发生的或原因。或者我甚至可能误解了regmap.c如何运作的整个过程。

我想要做的就是能够读取存储在寄存器中的实际值,但到目前为止,我认为我没有接近它。

有人碰巧知道这个吗?关于我设备的注册地图的设置方式(如果是这样,究竟是什么),我可能忽略了regmap.c的某些内容?我会很感激任何提示,线索或建议!

0 个答案:

没有答案