На самом деле это может быть вопрос о том, как 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
, которым я пренебрегаю, или что-то о том, как установлена карта регистров моего устройства (если это так, что именно)? Буду благодарен за любые советы, подсказки или советы!