Чтение регистра I2C с помощью regmap_read (), но получение постоянных значений - PullRequest
0 голосов
/ 24 апреля 2018

На самом деле это может быть вопрос о том, как regmap.c работает в целом, но в настоящее время у меня есть конкретный вопрос относительно использования regmap_read().

Я изучаю и изменяю реализацию эталонного драйвера для камеры ov5693, которая будет использоваться в Jetson TX1 (с использованием примера кода nVidia, предоставленного в Руководстве по разработке пакета драйверов NVIDIA Tegra Linux ). Насколько я понимаю, у камеры есть данные 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, которым я пренебрегаю, или что-то о том, как установлена ​​карта регистров моего устройства (если это так, что именно)? Буду благодарен за любые советы, подсказки или советы!

...