В этой статье описывается процесс отладки драйвера камеры. Одна из наиболее распространенных проблем заключается в том, что драйвер не может быть зарегистрирован из-за сбоя i2c. Как устранить неполадку. Общие журналы ошибок следующие:
[ 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. В целом последовательность включения не соответствует требованиям. Ниже представлены общие рекомендации по устранению неполадок.
Как правило, в таблице данных датчика четко указан адрес i2c. Следует отметить, что большинство датчиков имеют контакты выбора SID. Аппаратное обеспечение должно подтвердить, какой адрес выбран.
Необходимо уточнить, на какой шине i2c установлен i2c согласно аппаратной принципиальной схеме, и правильно настроить ее в DTS.
Адрес i2c, настроенный в DTS, представляет собой 7-битный адрес, исключая последний бит чтения и записи. Проверьте, настроен ли он как 8-битный адрес. Как показано на рисунке выше, датчик имеет адрес i2c 0x6c и 0x20. Это 8-битный адрес. В dts нужно настроить как 0x36 или 0x10. следующее:
ov16a10: ov16a10@36 {
compatible = "ovti,ov16a10";
status = "okay";
reg = <0x36>;
Вам необходимо проверить, правильно ли указаны контакты i2c. Вы можете сначала посмотреть gpio, соответствующий принципиальной схеме, а затем проверить, правильно ли указаны dts. В следующем примере цитируется i2c6m4_xfer.
&i2c6 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&i2c6m4_xfer>;
Проверку времени включения и часов можно выполнить вместе. Давайте поговорим о том, как проверить такие проблемы. Драйвер датчика обычно включает mclk и источник питания, когда он используется. Поэтому при возникновении проблемы половина mclk и источник питания отключаются или напрямую. застрял в процессе выключения, а затем перезапустите. Подтвердите проблемы с часами и питанием:
Обычно датчик имеет значение clk 24M или 27M. Используйте осциллограф, чтобы проверить правильность частоты clk. Если значение mclk 24M не может быть измерено, вы можете подозревать следующие причины:
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;
}
Обычно используется трехходовой источник питания avdd, dvdd, diovdd. Используйте мультиметр, чтобы убедиться в исправности трехходового источника питания. Если вход ненормальный, вы можете проверить, включил ли код драйвера соответствующий источник питания или неправильная конструкция оборудования.
Вы можете проверить описание этого контакта в таблице данных датчика, чтобы определить, активен ли он на высоком уровне или активен на низком уровне: Например, описание датчика ниже показывает, что и сброс, и PWDN активны на низком уровне, что означает, что он будет сброс или вход при низком уровне питания, поэтому, если он должен работать нормально, оба контакта должны быть на высоком уровне.
Если статус контакта неправильный, обычно это связано с тем, что код драйвера и конфигурация dts не унифицированы. Просто измените одну из конфигураций.
Вот объяснение областей, подверженных ошибкам: GPIO_ACTIVE_HIGH gpio, настроенного dts, не имеет ничего общего с тем, что указано в таблице данных. Высокий/низкий эффект конфигурации dts используется кодом драйвера, если он высокий и эффективный. , то код драйвера записывает 1 на высокий выход. Запись 0 на выходной уровень низкий, и наоборот.
Если и dts, и код драйвера работают корректно, но изменить gpio невозможно, необходимо подтвердить:
В техническом описании датчика будет описано время включения, необходимое для датчика. Управление драйвером должно соответствовать требованиям к времени включения. Для строгих датчиков здесь более вероятны ошибки:
Функция включения драйвера:
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;
}
Иногда мы используем небольшую плату адаптера для камеры, и нам нужно использовать материнскую плату для питания платы адаптера. В это время после выполнения функции включения материнская плата медленно подает питание на небольшую плату, что может привести к сбою. проверка идентификатора не удалась. В это время вы можете. Функция включения питания драйвера (power_on) соответствующим образом добавляет некоторую задержку, чтобы гарантировать, что небольшая плата успешно включается перед выполнением операции проверки идентификатора.
Ссылка: https://blog.csdn.net/qq_34341546/article/details/129030535.