рд▓рд┐рдирдХреНрд╕ рдореЗрдВ usb рдХреИрдордХреЙрд░реНрдбрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред рднрд╛рдЧ 1

рдХреИрдордХреЙрд░реНрдбрд░ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛, рдЖрдЬ рдорд╛рдЗрдХреНрд░реЛрдлреЛрди рдФрд░ рд╣реЗрдбрдлрд╝реЛрди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╡рд╕реНрддреБ рдорд╛рдиреНрдпрддрд╛, рд╕рдВрд╡рд░реНрдзрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛, рд╡реАрдбрд┐рдпреЛ рдХреЙрдиреНрдлреНрд░реЗрдВрд╕рд┐рдВрдЧ рдФрд░ рдХрдИ рдЕрдиреНрдпред рд▓реЗрдХрд┐рди рдЗрди рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдХреНрдпрд╛ рдЫрд┐рдкрд╛ рд╣реИ? рдХреИрдордХреЙрд░реНрдбрд░ рд╕реЗ рд╣рдореЗрдВ рддрд╕реНрд╡реАрд░ рдХреИрд╕реЗ рдорд┐рд▓рддреА рд╣реИ? рд▓реЗрдЦреЛрдВ рдХреА рдпрд╣ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЖрдкрдХреЛ рд╡реАрдбрд┐рдпреЛ рдХреИрдорд░рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рд░рд▓рддрд╛ рдХреЛ рдХрдо рд╕реНрддрд░ рдкрд░ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧреА, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЫрд╡рд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рд▓рд┐рдирдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реАред рдирд┐рдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВред рдХреБрдЫ рдбрд┐рд╡рд╛рдЗрд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╣рдо рдирд┐рдпрдорд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

~$ cat /dev/sda 
рдпрд╣ рдХрдорд╛рдВрдб рдкреВрд░реЗ рдПрд╕рдбреА рдбреНрд░рд╛рдЗрд╡ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред

рдРрд╕реЗ рдЙрдкрдХрд░рдг рд╣реИрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЖрдк рд╕реАрдзреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рд╡реАрдбрд┐рдпреЛ рдХреИрдорд░рд╛ рдЙрдирдХрд╛ рд╣реИред рдЬрдм рд╣рдо рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рд╕реНрдЯрдо рдорд┐рд▓рддреЗ рд╣реИрдВ:

 ~$ cat: /dev/video0:   
* рдХрд╣рд╛рдВ / рджреЗрд╡ / рд╡реАрдбрд┐рдпреЛ 0 рд╣рдорд╛рд░реЗ рдХреИрдордХреЙрд░реНрдбрд░ рдХреА рдлрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рд╣реИ

рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ ioctl рд╕рд┐рд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА; рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ [1] ред рдЖрдЗрдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдпрд╣рд╛рдВ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ (рд╡реАрдбрд┐рдпреЛ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрд▓реА рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк):

рдпрд╣рд╛рдБ рдХреЛрдб
 #include <fcntl.h> #include <errno.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <linux/videodev2.h> int main (int argc,char* argv[]) { /*Read Params*/ char *device_name; if(argc > 1) {  device_name = argv[1]; } else {  device_name = "/dev/video0"; } /*Open Device*/ int file_device = open(device_name, O_RDWR, 0); if (file_device == -1) {  printf ("%s error %d, %s\n",device_name, errno, strerror(errno));  exit(EXIT_FAILURE); } /*Read Params From Device*/ struct v4l2_capability device_params; if (ioctl(file_device, VIDIOC_QUERYCAP, &device_params) == -1) {  printf ("\"VIDIOC_QUERYCAP\" error %d, %s\n", errno, strerror(errno));  exit(EXIT_FAILURE); } printf("driver : %s\n",device_params.driver); printf("card : %s\n",device_params.card); printf("bus_info : %s\n",device_params.bus_info); printf("version : %d.%d.%d\n",     ((device_params.version >> 16) & 0xFF),     ((device_params.version >> 8) & 0xFF),     (device_params.version & 0xFF)); printf("capabilities: 0x%08x\n", device_params.capabilities); printf("device capabilities: 0x%08x\n", device_params.device_caps); /* Close Device */ if (-1 == close (file_device)) {  printf ("\"close\" error %d, %s\n", errno, strerror(errno));  exit(EXIT_FAILURE); } file_device = -1; return 0; } 




рдХреЛрдб рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЙрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрдврд╝рддреА рд╣реИрдВ рдЬрд┐рдирд╕реЗ рдЖрд╡реЗрджрди рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ device_name рдорд╛рдирдХ рдорд╛рди "/ dev / video0" рд▓реЗрддрд╛ рд╣реИред

"рдУрдкрди рдбрд┐рд╡рд╛рдЗрд╕" рдмреНрд▓реЙрдХ рдореЗрдВ, рдбрд┐рд╡рд╛рдЗрд╕ рдУрдкрди рд╕рд┐рд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЦреЛрд▓рд╛ рдЧрдпрд╛ рд╣реИ (рдЖрдкрдХреЛ рд╣реЗрдбрд░ fcntl.h рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ O_RDWR рдкрд╛рдардХ / рд▓реЗрдЦрдХ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдпрджрд┐ рдХрдиреЗрдХреНрд╢рди рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдЦреБрд▓рд╛ рдлрд╝рдВрдХреНрд╢рди -1 рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред

рдбрд┐рд╡рд╛рдЗрд╕ рдмреНрд▓реЙрдХ рд╕реЗ рд░реАрдб рдкрд░рдореЗрд╕ рд╣рдорд╛рд░реЗ рдЫреЛрдЯреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рджрд┐рд▓ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
 <linux/videodev2.h> 
рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рддрд░рдг рдХрд╛ рдЕрдкрдирд╛ рдкреИрдХреЗрдЬ рд╣реИ
Ioctl рд╕рд┐рд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддреАрди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ:
file_device - рд╣рдорд╛рд░реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИ
VIDIOC_QUERYCAP рдХрд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╣рдо рдЕрдкрдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
device_params - рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди "VIDIOC_QUERYCAP" рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдбрдВрдк рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

device_params рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

 struct v4l2_capability {  __u8  driver[16]; //    -     __u8  card[32]; //    __u8  bus_info[32]; //      (   usb-)  __u32 version; //     __u32 capabilities; // (/)    __u32 device_caps; //      __u32 reserved[3]; //   }; 

рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ рддреЛ ioctl -1 рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛

"рдХреНрд▓реЛрдЬ рдбрд┐рд╡рд╛рдЗрд╕" рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдПрдХреНрд╢рди рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред

рд╕рдВрдХрд▓рди
 gcc catvd.c -o catdv 


рдЪрд▓реЛ рджреМрдбрд╝реЛ
 ./catvd /dev/video0 /dev/video0 error 2, No such file or directory 

рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдХреНрд▓реАрдирд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдЕрдирд╛рд╡рд╢реНрдпрдХ рддрд╛рд░ рдЦреАрдВрдЪреЗ рдЬрд╛ рд╕рдХреЗрдВ ред
рд╣рдо рдХрдиреЗрдХреНрдЯ рдФрд░ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓рддреА рд╣реИ:
 ./catvd /dev/video0 driver : uvcvideo card : UVC Camera (046d:0804) bus_info : usb-0000:00:12.2-3 version : 3.11.10 capabilities: 0x84000001 device capabilities: 0x04000001 


рдХреНрд╖рдорддрд╛рдУрдВ рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдХреНрд╖рдорддрд╛ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╡реАрдбрд┐рдпреЛрдбреЗрд╡ 2.рд╣ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 V4L2_CAP_DEVICE_CAPS 0x80000000 //      . V4L2_CAP_STREAMING 0x04000000 //    i/o ioctls. V4L2_CAP_VIDEO_CAPTURE 0x00000001 //    . 


рдпрд╣ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд▓реЗрдЦ рдХрд╛ рд╕рдорд╛рдкрди рдХрд░рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдореЗрдореЛрд░реА-рдореИрдкрд┐рдВрдЧ, рдЫрд╡рд┐ рд╡реАрдбрд┐рдпреЛ рдкреНрд░рд╛рд░реВрдк, рдХреИрдорд░рд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдХрдИ рдХреИрдорд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдЬреИрд╕реЗ рд╡рд┐рд╖рдп рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред

рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рд╕рдВрд╕рд╛рдзрди:

  1. ioctl рдХрд╛рд░реНрдп рд▓реЗрдЦ
  2. рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╡реАрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рдереЛрдбрд╝реА рдкреБрд░рд╛рдиреА рдЬрд╛рдирдХрд╛рд░реА)

рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб ред

Source: https://habr.com/ru/post/In211608/


All Articles