Режим передачи видео: В протоколе 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