LINUX.ORG.RU

У кого-нибудь получалось запустить ПЗС-камеру FLI?


0

0

Есть у нас ПЗС-камера «Finger Lakes Instrumentation ProLine CCD», которую нужно заставить полноценно работать. Я скачал с сайта разработчика модуль ядра и библиотеку для разработки. Модуль пришлось чуть пропатчить (т.к. в нем использовались функции для старых ядер). Скомпилировал, загрузил insmod'ом, подключил камеру - вроде работает. Но при запуске тестового приложения для считывания изображений получаю множество ошибок передачи данных.

Может, кто-то работал с такими камерами? Поделитесь, пожалуйста, историей успеха.

Если нет - такой вопрос: возможно ли для отладки «превратить» модуль ядра в обычное приложение. Просто модули ядра я еще никогда не правил...

☆☆☆☆☆

Да, забыл сказать: несмотря на ошибки считывания, картинка с камеры получается (только в тех местах, где были ошибки, она заполнена нулями). Температура пельтье регулируется. Экспозиция тоже. Затвор открывается/закрывается. Но вот часть данных куда-то теряется...

Eddy_Em ☆☆☆☆☆ ()

Если нет - такой вопрос: возможно ли для отладки «превратить» модуль ядра в обычное приложение. Просто модули ядра я еще никогда не правил...

Нет.

Но при запуске тестового приложения для считывания изображений получаю множество ошибок передачи данных.

Камера как подключается?

mv ★★★★★ ()
Ответ на: комментарий от mv

Камера как подключается?

По USB. Данные считываются построчно, но после каждых 10-11 строк получаю ошибку передачи данных и ~20 строк теряются.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от mv

Модуль работает в однопоточном режиме (если так можно выразиться). Информация считывается функцией

static int fliusb_simple_bulk_read(fliusb_t *dev, unsigned int pipe,
				   char __user *userbuffer, size_t count,
				   unsigned int timeout)
{
  int err, cnt;

  if (count > dev->buffersize)
    count = dev->buffersize;

  if (!access_ok(VERIFY_WRITE, userbuffer, count))
    return -EFAULT;

  if (down_interruptible(&dev->buffsem))
    return -ERESTARTSYS;

  /* a simple blocking bulk read */
  if ((err = usb_bulk_msg(dev->usbdev, pipe, dev->buffer, count, &cnt,
			  (timeout * HZ + 500) / 1000)))
  {
    cnt = err;
    goto done;
  }

  if (__copy_to_user(userbuffer, dev->buffer, cnt))
    cnt = -EFAULT;

 done:

  up(&dev->buffsem);

  return cnt;
}
И как можно задать приоритет?

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Модуль работает в однопоточном режиме (если так можно выразиться).

Плохо. Тогда задирай приоритет своей программе.

И как можно задать приоритет?

В юзерспейсе для текущего треда, вместе с установкой рилтаймного шедуллера:

static void set_sched_rr(int prio)
{
    int ret;
    struct sched_param param = { .sched_priority = prio };

    ret = pthread_setschedparam(pthread_self(), SCHED_RR, &param);
    ENSURE((ret == 0), "Cannot set realtime scheduler (not enough permissions?).");
}
Можно getschedparam сначала сделать и поменять только приоритет.

mv ★★★★★ ()
Ответ на: комментарий от mv

Спасибо за помощь, но все оказалось гораздо проще: для каждой строки изображения в модуле выделялось всего лишь 65кБ памяти. Увеличил до 256, и заработало!

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от anonymous

ну разве не ССЗБ ты после этого?

ССЗБ. Потому что еще пару лет назад думал: а не поучиться ли мне писать модули ядра? Вот сейчас понял, что стоило это сделать...

Eddy_Em ☆☆☆☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.