Управляем чем угодно откуда угодно

"Зеленое" видео

Общие вопросы

"Зеленое" видео

Сообщение phoenix367 » 29 июн 2014, 23:34

На просторах интернета нашел патч для I2C драйвера, который позволяет более эффективно восстанавливать шину после сбоев. Для того, чтобы его накатить пришлось выкачать и заново собрать всю прошивку. После сборки и заливки на SD карточку виртурилка стартовала, но в процессе запуска уходила в ребут через некоторое время. Чтобы это как-то полечить скачал прошивку от 18 июня и накатил на нее патченное ядро и модули. Самое интересное, что падать перестало. Но зато теперь есть другая неприятность. При запуске видеотрансляции с разрешением 640 на 480 видео идет, но картинка вся в зеленых тонах и сжата по горизонтали. При запуске трансляции с разрешением 1280 на 720 видео не идет вообще. Как это можно полечить? И еще интересно знать, какие изменения в коде прошивке надо сделать, чтобы из не-HD она превратилась в HD и наоборот.

ЗЫ:А после патча I2C-шина умирать таки перестала.
phoenix367
 
Сообщения: 193
Зарегистрирован: 09 сен 2013, 00:19

Re: "Зеленое" видео

Сообщение EXpoison » 04 июл 2014, 14:39

Собрал образ из свежих исходников и получил аналогичную ошибку. Что нужно изменить и как переключать режимы камеры?
EXpoison
 
Сообщения: 38
Зарегистрирован: 11 окт 2013, 14:51

Re: "Зеленое" видео

Сообщение eagafonov » 04 июл 2014, 23:54

phoenix367 писал(а):На просторах интернета нашел патч для I2C драйвера


"Слайды! Слайды!" (ц)
Ссылочку/патч/коммит можно получить?
Аватара пользователя
eagafonov
 
Сообщения: 175
Зарегистрирован: 18 сен 2013, 23:39
Откуда: Нижненовгородск

Re: "Зеленое" видео

Сообщение phoenix367 » 05 июл 2014, 14:28

eagafonov писал(а):
"Слайды! Слайды!" (ц)
Ссылочку/патч/коммит можно получить?


Собственно патч
Код: Выделить всё
diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c
index 7d1e590..6728d76 100644
--- a/drivers/i2c/busses/i2c-davinci.c
+++ b/drivers/i2c/busses/i2c-davinci.c
@@ -67,6 +67,10 @@
 #define DAVINCI_I2C_IVR_REG   0x28
 #define DAVINCI_I2C_EMDR_REG   0x2c
 #define DAVINCI_I2C_PSC_REG   0x30
+#define DAVINCI_I2C_FUNC_REG   0x48
+#define DAVINCI_I2C_DIR_REG   0x4c
+#define DAVINCI_I2C_DIN_REG   0x50
+#define DAVINCI_I2C_DOUT_REG   0x54
 
 #define DAVINCI_I2C_IVR_AAS   0x07
 #define DAVINCI_I2C_IVR_SCD   0x06
@@ -136,43 +140,6 @@ static inline u16 davinci_i2c_read_reg(struct davinci_i2c_dev *i2c_dev, int reg)
    return __raw_readw(i2c_dev->base + reg);
 }
 
-/* Generate a pulse on the i2c clock pin. */
-static void generic_i2c_clock_pulse(unsigned int scl_pin)
-{
-   u16 i;
-
-   if (scl_pin) {
-      /* Send high and low on the SCL line */
-      for (i = 0; i < 9; i++) {
-         gpio_set_value(scl_pin, 0);
-         udelay(20);
-         gpio_set_value(scl_pin, 1);
-         udelay(20);
-      }
-   }
-}
-
-/* This routine does i2c bus recovery as specified in the
- * i2c protocol Rev. 03 section 3.16 titled "Bus clear"
- */
-static void i2c_recover_bus(struct davinci_i2c_dev *dev)
-{
-   u32 flag = 0;
-   struct davinci_i2c_platform_data *pdata = dev->pdata;
-
-   dev_err(dev->dev, "initiating i2c bus recovery\n");
-   /* Send NACK to the slave */
-   flag = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);
-   flag |=  DAVINCI_I2C_MDR_NACK;
-   /* write the data into mode register */
-   davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag);
-   generic_i2c_clock_pulse(pdata->scl_pin);
-   /* Send STOP */
-   flag = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG);
-   flag |= DAVINCI_I2C_MDR_STP;
-   davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag);
-}
-
 static inline void davinci_i2c_reset_ctrl(struct davinci_i2c_dev *i2c_dev,
                         int val)
 {
@@ -269,6 +236,46 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev)
    return 0;
 }
 
+/* This routine does i2c bus recovery as specified in the
+ * i2c protocol Rev. 03 section 3.16 titled "Bus clear"
+ */
+static void i2c_recover_bus(struct davinci_i2c_dev *dev)
+{
+   u32 flag = 0;
+   int i;
+   struct davinci_i2c_platform_data *pdata = dev->dev->platform_data;
+   flag = davinci_i2c_read_reg(dev, DAVINCI_I2C_DIN_REG);
+   if ((flag & 0x01) == 0)
+      dev_err(dev->dev, "SCL stuck at zero.\n");
+   dev_err(dev->dev, "initiating i2c bus recovery\n");
+   /* Disable interrupts */
+   davinci_i2c_write_reg(dev, DAVINCI_I2C_IMR_REG, 0);
+   /* put I2C into reset */
+   davinci_i2c_reset_ctrl(dev, 0);
+   /* Set GPIO mode */
+   davinci_i2c_write_reg(dev, DAVINCI_I2C_FUNC_REG, 0x1);
+    /* Set scl=1 sda=1 */
+   davinci_i2c_write_reg(dev, DAVINCI_I2C_DOUT_REG, 0x03);
+   /* Set SCL pin as output, SDA as input */
+   davinci_i2c_write_reg(dev, DAVINCI_I2C_DIR_REG, 0x1);
+   /* Send up to 9 clock pulses until SDA is high */
+   for (i = 0; i < 9; ++i) {
+      davinci_i2c_write_reg(dev, DAVINCI_I2C_DOUT_REG, 0x02); /* scl=0 sda=1 */
+      udelay(10);
+      davinci_i2c_write_reg(dev, DAVINCI_I2C_DOUT_REG, 0x03);
+      udelay(10);
+      /* Register DIN reads actual state on line */
+      flag = davinci_i2c_read_reg(dev, DAVINCI_I2C_DIN_REG);
+      if ((flag & 0x3) == 0x3) {
+         dev_info(dev->dev, "SDA and SCL high again (i=%d), resume.\n", i);
+         break;
+      }
+   }
+   /* Resume operation */
+   davinci_i2c_write_reg(dev, DAVINCI_I2C_FUNC_REG, 0x0);
+   i2c_davinci_init(dev);
+}
+
 /*
  * Waiting for bus not busy
  */
@@ -290,7 +297,6 @@ static int i2c_davinci_wait_bus_not_busy(struct davinci_i2c_dev *dev,
          } else {
             to_cnt = 0;
             i2c_recover_bus(dev);
-            i2c_davinci_init(dev);
          }
       }
       if (allow_sleep)
@@ -380,7 +386,6 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop)
    if (r == 0) {
       dev_err(dev->dev, "controller timed out\n");
       i2c_recover_bus(dev);
-      i2c_davinci_init(dev);
       dev->buf_len = 0;
       return -ETIMEDOUT;
    }


А вообще гораздо сильнее помогает установка дросселей на концах линий SDA и SCL. Можно и более хитрые штуки соорудить для борьбы с помехами на шине.
phoenix367
 
Сообщения: 193
Зарегистрирован: 09 сен 2013, 00:19

Re: "Зеленое" видео

Сообщение EXpoison » 07 июл 2014, 17:59

Господа разработчики, есть решение проблемы с зелёным видео?
EXpoison
 
Сообщения: 38
Зарегистрирован: 11 окт 2013, 14:51

Re: "Зеленое" видео

Сообщение realizator » 08 июл 2014, 17:31

EXpoison писал(а):Господа разработчики, есть решение проблемы с зелёным видео?

Серега Гол как освободится отпишет. Я так понимаю в основную ветку утекли патчи по включению видеоподсистемы в формате YUV, которая нужна для работы модуля захвата аналогового видео. Сейчас видео у нас с камеры в RAW берется. Он поправит или скажет как собрать чтобы этот режим не задействовать.
Аватара пользователя
realizator
virt2real team
 
Сообщения: 650
Зарегистрирован: 17 фев 2012, 23:18

Re: "Зеленое" видео

Сообщение Gol » 09 июл 2014, 03:08

Сделал бранч под названием HD https://github.com/virt2real/linux-davinci
Зелёное видео было из-за несоответствия форматов видео (в обычной прошивке камера работает в YUV, а в прошивке HD - в RAW), в бранче изменено на нужный режим.
Аватара пользователя
Gol
 
Сообщения: 507
Зарегистрирован: 17 фев 2012, 01:44
Откуда: Тула-Свободный-Щёкино-Тула-Москва

Re: "Зеленое" видео

Сообщение EXpoison » 09 июл 2014, 16:07

Попробую пере собрать!
EXpoison
 
Сообщения: 38
Зарегистрирован: 11 окт 2013, 14:51


Вернуться в Общий раздел ("не знаю куда написать")

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron