Отладка камеры: как устранить сбой i2c?
Отладка камеры: как устранить сбой i2c?

Предисловие:

В этой статье описывается процесс отладки драйвера камеры. Одна из наиболее распространенных проблем заключается в том, что драйвер не может быть зарегистрирован из-за сбоя i2c. Как устранить неполадку. Общие журналы ошибок следующие:

Язык кода:javascript
копировать
[    1.973566][    T1] gc8034 4-0037: driver version: 00.01.09
[    1.973648][    T1] gc8034 4-0037: Failed to get power-gpios, maybe no use
[    1.973682][    T1] gc8034 4-0037: Failed to get reset-gpios
[    1.974133][    T1] gc8034 4-0037: lane_num(2)  pixel_rate(319887360)
[    1.979292][    T1] gc8034 4-0037: gc8034 read reg:0xf0 failed !
[    1.979461][    T1] gc8034 4-0037: gc8034 read reg:0xf1 failed !
[    1.979477][    T1] gc8034 4-0037: Unexpected sensor id(000000), ret(-6)

Сбой i2c модуля камеры не имеет отношения к основным модулям контроллера CIF и ISP. В целом последовательность включения не соответствует требованиям. Ниже представлены общие рекомендации по устранению неполадок.

1. Проблема с адресом i2c:

①Подтвердите, правильно ли настроен адрес i2c:

Как правило, в таблице данных датчика четко указан адрес i2c. Следует отметить, что большинство датчиков имеют контакты выбора SID. Аппаратное обеспечение должно подтвердить, какой адрес выбран.

②Правильен ли адрес шины i2c?

Необходимо уточнить, на какой шине i2c установлен i2c согласно аппаратной принципиальной схеме, и правильно настроить ее в DTS.

③Настроен ли он как 8-битный адрес:

Адрес i2c, настроенный в DTS, представляет собой 7-битный адрес, исключая последний бит чтения и записи. Проверьте, настроен ли он как 8-битный адрес. Как показано на рисунке выше, датчик имеет адрес i2c 0x6c и 0x20. Это 8-битный адрес. В dts нужно настроить как 0x36 или 0x10. следующее:

Язык кода:javascript
копировать
 ov16a10: ov16a10@36 {
  compatible = "ovti,ov16a10";
  status = "okay";
  reg = <0x36>;

④Правильно ли шина i2c ссылается на pinctrl:

Вам необходимо проверить, правильно ли указаны контакты i2c. Вы можете сначала посмотреть gpio, соответствующий принципиальной схеме, а затем проверить, правильно ли указаны dts. В следующем примере цитируется i2c6m4_xfer.

Язык кода:javascript
копировать
&i2c6 {
 status = "okay";
 pinctrl-names = "default";
 pinctrl-0 = <&i2c6m4_xfer>;

2. Проблемы с синхронизацией включения и часами MCLK:

Проверку времени включения и часов можно выполнить вместе. Давайте поговорим о том, как проверить такие проблемы. Драйвер датчика обычно включает mclk и источник питания, когда он используется. Поэтому при возникновении проблемы половина mclk и источник питания отключаются или напрямую. застрял в процессе выключения, а затем перезапустите. Подтвердите проблемы с часами и питанием:

① Проверьте, в порядке ли MCLK и правильна ли амплитуда напряжения.

Обычно датчик имеет значение clk 24M или 27M. Используйте осциллограф, чтобы проверить правильность частоты clk. Если значение mclk 24M не может быть измерено, вы можете подозревать следующие причины:

  • Проверьте, правильно ли открывается clk, когда драйвер датчика включен. См. следующее:
Язык кода:javascript
копировать
 ret = clk_set_rate(ov16a10->xvclk, OV16A10_XVCLK_FREQ);
 if (ret < 0)
  dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
 if (clk_get_rate(ov16a10->xvclk) != OV16A10_XVCLK_FREQ)
  dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
 ret = clk_prepare_enable(ov16a10->xvclk);
 if (ret < 0) {
  dev_err(dev, "Failed to enable xvclk\n");
  return ret;
 }
  • Если gpio занят другими модулями, вы можете использовать команду io, чтобы проверить правильность повторного использования iomux. Как правило, журнал последовательного порта также печатает соответствующие ошибки.
  • Амплитуда напряжения MCLK неправильная.,Большая вероятность состоит в том, что конфигурация io-domain домена мощности неверна.,Есть 1,8В и 3,3В.,Конфигурацию домена необходимо осуществлять на основе реальной принципиальной схемы.

②Проверьте источник питания

Обычно используется трехходовой источник питания avdd, dvdd, diovdd. Используйте мультиметр, чтобы убедиться в исправности трехходового источника питания. Если вход ненормальный, вы можете проверить, включил ли код драйвера соответствующий источник питания или неправильная конструкция оборудования.

③Проверьте сброс и состояние контакта Powdn:

Вы можете проверить описание этого контакта в таблице данных датчика, чтобы определить, активен ли он на высоком уровне или активен на низком уровне: Например, описание датчика ниже показывает, что и сброс, и PWDN активны на низком уровне, что означает, что он будет сброс или вход при низком уровне питания, поэтому, если он должен работать нормально, оба контакта должны быть на высоком уровне.

Если статус контакта неправильный, обычно это связано с тем, что код драйвера и конфигурация dts не унифицированы. Просто измените одну из конфигураций.

Вот объяснение областей, подверженных ошибкам: GPIO_ACTIVE_HIGH gpio, настроенного dts, не имеет ничего общего с тем, что указано в таблице данных. Высокий/низкий эффект конфигурации dts используется кодом драйвера, если он высокий и эффективный. , то код драйвера записывает 1 на высокий выход. Запись 0 на выходной уровень низкий, и наоборот.

  • dtsКонфигурацияGPIO_ACTIVE_HIGH,Режим привода установлен на 1,финальный Выходной высокий уровень
  • dtsКонфигурацияGPIO_ACTIVE_HIGH,Операция привода установлена ​​на 0,Выходной низкий уровень
  • dtsКонфигурацияGPIO_ACTIVE_LOW,Режим привода установлен на 1,Выходной низкий уровень
  • dtsКонфигурацияGPIO_ACTIVE_LOW,Операция привода установлена ​​на 0,Выходной высокий уровень

Если и dts, и код драйвера работают корректно, но изменить gpio невозможно, необходимо подтвердить:

  • Используется ли gpio другими модулями повторно
  • По умолчанию gpio использует подтягивание или понижение,Требуется конфигурация в pcfg_pull_none.

④Проверьте последовательность включения:

В техническом описании датчика будет описано время включения, необходимое для датчика. Управление драйвером должно соответствовать требованиям к времени включения. Для строгих датчиков здесь более вероятны ошибки:

Функция включения драйвера:

Язык кода:javascript
копировать
static int __ov13855_power_on(struct ov13855 *ov13855)
{
 int ret;
 u32 delay_us;
 struct device *dev = &ov13855->client->dev;
 
 if (!IS_ERR(ov13855->power_gpio))
  gpiod_set_value_cansleep(ov13855->power_gpio, 1);
 
 usleep_range(1000, 2000);
 
 if (!IS_ERR_OR_NULL(ov13855->pins_default)) {
  ret = pinctrl_select_state(ov13855->pinctrl,
        ov13855->pins_default);
  if (ret < 0)
   dev_err(dev, "could not set pins\n");
 }
 ret = clk_set_rate(ov13855->xvclk, OV13855_XVCLK_FREQ);
 if (ret < 0)
  dev_warn(dev, "Failed to set xvclk rate (24MHz)\n");
 if (clk_get_rate(ov13855->xvclk) != OV13855_XVCLK_FREQ)
  dev_warn(dev, "xvclk mismatched, modes are based on 24MHz\n");
 ret = clk_prepare_enable(ov13855->xvclk);
 if (ret < 0) {
  dev_err(dev, "Failed to enable xvclk\n");
  return ret;
 }
 if (!IS_ERR(ov13855->reset_gpio))
  gpiod_set_value_cansleep(ov13855->reset_gpio, 0);
 
 ret = regulator_bulk_enable(OV13855_NUM_SUPPLIES, ov13855->supplies);
 if (ret < 0) {
  dev_err(dev, "Failed to enable regulators\n");
  goto disable_clk;
 }
 
 if (!IS_ERR(ov13855->reset_gpio))
  gpiod_set_value_cansleep(ov13855->reset_gpio, 1);
 
 usleep_range(5000, 6000);
 if (!IS_ERR(ov13855->pwdn_gpio))
  gpiod_set_value_cansleep(ov13855->pwdn_gpio, 1);
 
 /* 8192 cycles prior to first SCCB transaction */
 delay_us = ov13855_cal_delay(8192);
 usleep_range(delay_us * 2, delay_us * 3);
 
 return 0;
 
disable_clk:
 clk_disable_unprepare(ov13855->xvclk);
 
 return ret;
}

⑤Источник питания, CLK и т. д. в порядке, но i2c по-прежнему заблокирован.

Иногда мы используем небольшую плату адаптера для камеры, и нам нужно использовать материнскую плату для питания платы адаптера. В это время после выполнения функции включения материнская плата медленно подает питание на небольшую плату, что может привести к сбою. проверка идентификатора не удалась. В это время вы можете. Функция включения питания драйвера (power_on) соответствующим образом добавляет некоторую задержку, чтобы гарантировать, что небольшая плата успешно включается перед выполнением операции проверки идентификатора.

Ссылка: https://blog.csdn.net/qq_34341546/article/details/129030535.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose