Nc3x3
Архитектура nc3x3
nc3x3 разрабатывается с целью унификации работы с камерами на уровне user-space на стороне камеры; реализации "многозадачной" работы - т.е. одновременное вещание потоков с разными настройками, получение одиночных кадров без остановки потоков, работа системы автоэкспозиции в режиме "простоя" камеры etc. Реализация в виде ряда изменений (хаков) в монолитное ядро; вся основная работа осуществляется в двух модулях - nc3x3_io и nc3x3
nc3x3_io реализует ряд служебных (скрытых) интерфейсов в /dev/nc3x3/.xxx, предоставляет интерфейс и настройку в момент запуска io операций с FPGA, SDRAM(к которой нет прямого интерфейса через CPU) и сенсором. После загрузки модуля через .fpga.jtag осуществляется запись прошивки FPGA, и запись через другие интерфейсы ряда других таблиц/настроек.
nc3x3 предоставляет три интерйфеса для приложений - /dev/nc3x3/frame, /dev/nc3x3/stream, /dev/nc3x3/ctrl; предоставляет API для подгружаемых модулей, выполняющих функции автоэкспозиции, автофокусировки etc.
frame позволяет получить одиночный кадр в RAW или JPEG(или ключевой кадр Theora) с настройками "по умолчанию", которые изменяются через интерфейс ctrl, либо конкретно заданными. Сценарий работы с интерфейсом: 1. open() - Открытие файла. Если операция неудачна, значит система по той или иной причине отказывает в обслуживании - через некоторое время можно повторить попытку (т.е. если система перегружена запросами в очереди) 2.1. ioctl() - Опционально. Получение характеристик камеры - т.е. пределы разрешений, параметров экспозиции, формат сжатия - так же доступно через интерфейс ctrl. 2.2. ioctl() - Постановка задачи. Задаются параметры экспозиции, качество сжатия etc. 2.3. ioctl() - Проверка нормализованных параметров (т.е. все параметры запроса буду выровнены на границы значений и допустимый шаг изменения значений). 3. ioctl() - Подтверждение запроса. Приложение подтверждает запрос и переходит в состояние ожидания результата. 4. poll(), ioctl(), read() - приложение ожидает результат. После получения подтверждения о готовности задания, забирает результат. 5.1. read() - чтение данных "классическим" методом; 5.2. работа в "ускоренном" режиме - через mmap или прямой отправке через сокет (UDP или TCP) 5.2. ioctl() - получение описания задания - время начала экспозиции, размер кадра, указатель на области памяти; 5.2.1. mmap() - доступ через область памяти к данным 5.2.2. mmap() - запись заголовков RTP или других непосредственно в память, ioctl() - настройка параметров сокета, send(soket, addr) - отправка через сокет с прямым доступом к памяти (как сейчас реализовано в 323 камере), опционально - ioctl() - сброс сокета в нормальный режим. 6. close() - закрытие файла интерфейса
stream предоставляет практически те же услуги, за исключением того, что после получения первого запрошенного кадра, сразу же будет обрабатываться следующий кадр из потока. При этом через ioctl() можно менять различные настройки потока - экспозицию etc...
ctrl позволяет менять настройки кадра по умолчанию - т.е. какими будут настройки, если приложение сразу после открытия интерфейса выдаст запрос на получение кадра без изменения его параметров - это частично позволит работать по аналогии с нынешним режимом работы камеры; также предоставляет изменять настройки политики многозадачного режима настройки - например, возможно ли одновременное открытие двух интерфейсов stream, как часто в режиме вещания потока можно получать одиночные калры через frame, использовать ли автоэкспозицию, и если да, то какой из зарегестрированных модулей etc.