Передача видеосигнала

Режим передачи видео: В протоколе IIC, через порт ввода-вывода транспортного потока:

способ передачи видео: USB интерфейс для передачи видеопотока:

Драйверы: драйверы устройств символов

Как писать драйверы: строительство file_operations

                             Для того, чтобы сообщить ядру

                             функция входа

                             функция экспорта

v4l2 рама привода: внутренний слой -> file_operations

                         Аппаратные средства, связанные слои:

1, устройство камеры в USB на ПК с виртуальной машиной, dmesg отпечатков нашли информацию об оборудовании камеры USB, Grep, чтобы найти конкретную информацию о местоположении напечатанной в ядре;

2, искать информацию на печать

3, откройте файл с источником прозрения uvc_driver.c или другим программным обеспечением для чтения

      3,1 -> структура uvc_driver

                 -> uvc_probe:

                       v4l2_device_register

                       uvc_register_chains --- uvc_register_video - video_device video_register_device

                                                          --- структура video_device * VDEV;

                                                                       структура uvc_device * DEV,

                                                                 vdev-> v4l2_dev = & dev-> VDEV;
                                                                 vdev-> пижоны = & uvc_fops;

                       media_device_register

4, там v4l2-framework.txt документ может относиться к ядру

5, может анализировать драйвер виртуальной камеры: vivi.c

vivi_init -> vivi_create_instance -> video_device_alloc -> video_register_device -> __ video_register_device -> vdev-> cdev = cdev_alloc (); -> cdev_add ()

6, в ядре уже предоставляет некоторые базовые функции file_operations v4l2_fops, поэтому нам не нужно писать функции устройства символов. Когда слой приложение вызывает функцию IOCTL, то file_operations вызова IOCTL ---. Unlocked_ioctl = v4l2_ioctl,

v4l2_ioctl ------

             если (video_is_registered (VDEV))
                      RET = vdev-> fops-> unlocked_ioctl (Filp, CMD, Arg);

Если video_device уже зарегистрирован, вызов video_device внутри функции FOPS внутри функции unlocked_ioctl.

Функция unlocked_ioctl в ядре было написано, что мы не должны писать --- video_usercopy

---- cmd_input_size (CMD);

---- check_array_args (CMD, PARG, & ARRAY_SIZE, & user_ptr, & kernel_ptr);

---- получить то, что мы хотим

Статические беззнаковые долго cmd_input_size (неподписанный INT CMD) 
{ 
    / * Размер структуры до и включая 'поля' * / 
#define CMDINSIZE (CMD, тип поле) \
     случае VIDIOC _ ## CMD: \
         возвращение offsetof ( STRUCT v4l2 _ ## типа , поле) +      \
             SizeOf ((( структура v4l2 _ ## тип *) 0 ) -> поле); 

    Переключатель (CMD) { 
        CMDINSIZE (ENUM_FMT, fmtdesc, тип); 
        CMDINSIZE (G_FMT, формат, тип);
        CMDINSIZE (QUERYBUF, буфер, длина); 
        CMDINSIZE (G_PARM, streamparm, тип); 
        CMDINSIZE (ENUMSTD, стандарт, индекс); 
        CMDINSIZE (ENUMINPUT, вход, индекс); 
        CMDINSIZE (G_CTRL, контроль, идентификатор); 
        CMDINSIZE (G_TUNER, тюнер, индекс); 
        CMDINSIZE (QUERYCTRL, queryctrl, ID); 
        CMDINSIZE (QUERYMENU, querymenu, индекс); 
        CMDINSIZE (ENUMOUTPUT, выход, индекс); 
        CMDINSIZE (G_MODULATOR, модулятор, индекс); 
        CMDINSIZE (G_FREQUENCY, частота, тюнер); 
        CMDINSIZE (CROPCAP, cropcap, тип);
        CMDINSIZE (G_CROP, растениеводство, тип); 
        CMDINSIZE (ENUMAUDIO, аудио, индекс);
        CMDINSIZE (ENUMAUDOUT, audioout, индекс); 
        CMDINSIZE (ENCODER_CMD, encoder_cmd, флаги); 
        CMDINSIZE (TRY_ENCODER_CMD, encoder_cmd, флаги); 
        CMDINSIZE (G_SLICED_VBI_CAP, sliced_vbi_cap, тип); 
        CMDINSIZE (ENUM_FRAMESIZES, frmsizeenum, pixel_format); 
        CMDINSIZE (ENUM_FRAMEINTERVALS, frmivalenum, высота); 
    по умолчанию :
         возврат _IOC_SIZE (CMD); 
    } 
}

и

статические  INT check_array_args (беззнаковое INT CMD, аннулируются * PARG, size_t * ARRAY_SIZE,
                 пустота * __user * user_ptr, аннулируются *** kernel_ptr) 
{ 
    INT RET = 0 ; 

    Переключатель (CMD) {
     случай VIDIOC_QUERYBUF:
     случай VIDIOC_QBUF:
     случай VIDIOC_DQBUF: {
         структура v4l2_buffer * ЬиЕ = PARG; 

        если (V4L2_TYPE_IS_MULTIPLANAR (buf-> тип) && buf-> длина> 0 ) {
             если (buf-> длина> VIDEO_MAX_PLANES) {
                RET = - EINVAL;
                перерыв ; 
            }
             * User_ptr = ( пустота __user *) buf-> m.planes;
            * kernel_ptr = ( недействительными *) & buf-> m.planes;
            * ARRAY_SIZE = SizeOf ( структура v4l2_plane) * buf-> длина; 
            RET = 1 ; 
        } 
        Перерыв ; 
    } 

    Случай VIDIOC_S_EXT_CTRLS:
     случай VIDIOC_G_EXT_CTRLS:
     случай VIDIOC_TRY_EXT_CTRLS: {
         - структуруv4l2_ext_controls * Ctrls = PARG; 

        если (ctrls-> подсчитывать! = 0 ) {
             если (ctrls-> граф> V4L2_CID_MAX_CTRLS) { 
                RET = - EINVAL;
                перерыв ; 
            }
             * User_ptr = ( пустота __user *) ctrls-> элементы управления;
            * kernel_ptr = ( недействительными *) & ctrls-> элементы управления;
            * ARRAY_SIZE = SizeOf ( структура v4l2_ext_control)
                     * ctrls-> счетчик; 
            RET = 1 ; 
        }
        перерыв  ; 
    }
    } 

    возврата RET; 
}

7, Трассирование можно получить, позвонив в систему во время выполнения программы

Трассирование -o xawtv.log XawTV

XawTV участвует в системный вызов будет записан в xawtv.log

 

 

 

 

 

          

 

 

                                         

 

рекомендация

отwww.cnblogs.com/zhu-g5may/p/9970364.html
рекомендация