diff options
author | Muralidharan Karicheri <m-karicheri2@ti.com> | 2009-11-19 10:00:31 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-12-15 21:18:03 -0500 |
commit | b6456c0cfe9d94e6d2bf684e6e6c031fc0b10031 (patch) | |
tree | e5742dc96ec8b2a74708787e6cb4ceefcc3e2bac /include | |
parent | 20d15a200d34cfb7141fb4558895d7d5233db84b (diff) |
V4L/DVB (13571): v4l: Adding Digital Video Timings APIs
This adds the above APIs to the v4l2 core. This is based on version v1.2
of the RFC titled "V4L - Support for video timings at the input/output interface"
Following new ioctls are added:-
- VIDIOC_ENUM_DV_PRESETS
- VIDIOC_S_DV_PRESET
- VIDIOC_G_DV_PRESET
- VIDIOC_QUERY_DV_PRESET
- VIDIOC_S_DV_TIMINGS
- VIDIOC_G_DV_TIMINGS
Please refer to the RFC for the details. This code was tested using vpfe
capture driver on TI's DM365. Following is the test configuration used :-
Blu-Ray HD DVD source -> TVP7002 -> DM365 (VPFE) ->DDR
A draft version of the TVP7002 driver (currently being reviewed in the mailing
list) was used that supports V4L2_DV_1080I60 & V4L2_DV_720P60 presets.
A loopback video capture application was used for testing these APIs. This calls
following IOCTLS :-
- verify the new v4l2_input capabilities flag added
- Enumerate available presets using VIDIOC_ENUM_DV_PRESETS
- Set one of the supported preset using VIDIOC_S_DV_PRESET
- Get current preset using VIDIOC_G_DV_PRESET
- Detect current preset using VIDIOC_QUERY_DV_PRESET
- Using stub functions in tvp7002, verify VIDIOC_S_DV_TIMINGS
and VIDIOC_G_DV_TIMINGS ioctls are received at the sub device.
- Tested on 64bit platform by Hans Verkuil
Signed-off-by: Muralidharan Karicheri <m-karicheri2@ti.com>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Reviewed-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/videodev2.h | 116 | ||||
-rw-r--r-- | include/media/v4l2-ioctl.h | 15 | ||||
-rw-r--r-- | include/media/v4l2-subdev.h | 21 |
3 files changed, 150 insertions, 2 deletions
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index 32b92298fd79..59047ebf452e 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h | |||
@@ -732,6 +732,99 @@ struct v4l2_standard { | |||
732 | }; | 732 | }; |
733 | 733 | ||
734 | /* | 734 | /* |
735 | * V I D E O T I M I N G S D V P R E S E T | ||
736 | */ | ||
737 | struct v4l2_dv_preset { | ||
738 | __u32 preset; | ||
739 | __u32 reserved[4]; | ||
740 | }; | ||
741 | |||
742 | /* | ||
743 | * D V P R E S E T S E N U M E R A T I O N | ||
744 | */ | ||
745 | struct v4l2_dv_enum_preset { | ||
746 | __u32 index; | ||
747 | __u32 preset; | ||
748 | __u8 name[32]; /* Name of the preset timing */ | ||
749 | __u32 width; | ||
750 | __u32 height; | ||
751 | __u32 reserved[4]; | ||
752 | }; | ||
753 | |||
754 | /* | ||
755 | * D V P R E S E T V A L U E S | ||
756 | */ | ||
757 | #define V4L2_DV_INVALID 0 | ||
758 | #define V4L2_DV_480P59_94 1 /* BT.1362 */ | ||
759 | #define V4L2_DV_576P50 2 /* BT.1362 */ | ||
760 | #define V4L2_DV_720P24 3 /* SMPTE 296M */ | ||
761 | #define V4L2_DV_720P25 4 /* SMPTE 296M */ | ||
762 | #define V4L2_DV_720P30 5 /* SMPTE 296M */ | ||
763 | #define V4L2_DV_720P50 6 /* SMPTE 296M */ | ||
764 | #define V4L2_DV_720P59_94 7 /* SMPTE 274M */ | ||
765 | #define V4L2_DV_720P60 8 /* SMPTE 274M/296M */ | ||
766 | #define V4L2_DV_1080I29_97 9 /* BT.1120/ SMPTE 274M */ | ||
767 | #define V4L2_DV_1080I30 10 /* BT.1120/ SMPTE 274M */ | ||
768 | #define V4L2_DV_1080I25 11 /* BT.1120 */ | ||
769 | #define V4L2_DV_1080I50 12 /* SMPTE 296M */ | ||
770 | #define V4L2_DV_1080I60 13 /* SMPTE 296M */ | ||
771 | #define V4L2_DV_1080P24 14 /* SMPTE 296M */ | ||
772 | #define V4L2_DV_1080P25 15 /* SMPTE 296M */ | ||
773 | #define V4L2_DV_1080P30 16 /* SMPTE 296M */ | ||
774 | #define V4L2_DV_1080P50 17 /* BT.1120 */ | ||
775 | #define V4L2_DV_1080P60 18 /* BT.1120 */ | ||
776 | |||
777 | /* | ||
778 | * D V B T T I M I N G S | ||
779 | */ | ||
780 | |||
781 | /* BT.656/BT.1120 timing data */ | ||
782 | struct v4l2_bt_timings { | ||
783 | __u32 width; /* width in pixels */ | ||
784 | __u32 height; /* height in lines */ | ||
785 | __u32 interlaced; /* Interlaced or progressive */ | ||
786 | __u32 polarities; /* Positive or negative polarity */ | ||
787 | __u64 pixelclock; /* Pixel clock in HZ. Ex. 74.25MHz->74250000 */ | ||
788 | __u32 hfrontporch; /* Horizpontal front porch in pixels */ | ||
789 | __u32 hsync; /* Horizontal Sync length in pixels */ | ||
790 | __u32 hbackporch; /* Horizontal back porch in pixels */ | ||
791 | __u32 vfrontporch; /* Vertical front porch in pixels */ | ||
792 | __u32 vsync; /* Vertical Sync length in lines */ | ||
793 | __u32 vbackporch; /* Vertical back porch in lines */ | ||
794 | __u32 il_vfrontporch; /* Vertical front porch for bottom field of | ||
795 | * interlaced field formats | ||
796 | */ | ||
797 | __u32 il_vsync; /* Vertical sync length for bottom field of | ||
798 | * interlaced field formats | ||
799 | */ | ||
800 | __u32 il_vbackporch; /* Vertical back porch for bottom field of | ||
801 | * interlaced field formats | ||
802 | */ | ||
803 | __u32 reserved[16]; | ||
804 | } __attribute__ ((packed)); | ||
805 | |||
806 | /* Interlaced or progressive format */ | ||
807 | #define V4L2_DV_PROGRESSIVE 0 | ||
808 | #define V4L2_DV_INTERLACED 1 | ||
809 | |||
810 | /* Polarities. If bit is not set, it is assumed to be negative polarity */ | ||
811 | #define V4L2_DV_VSYNC_POS_POL 0x00000001 | ||
812 | #define V4L2_DV_HSYNC_POS_POL 0x00000002 | ||
813 | |||
814 | |||
815 | /* DV timings */ | ||
816 | struct v4l2_dv_timings { | ||
817 | __u32 type; | ||
818 | union { | ||
819 | struct v4l2_bt_timings bt; | ||
820 | __u32 reserved[32]; | ||
821 | }; | ||
822 | } __attribute__ ((packed)); | ||
823 | |||
824 | /* Values for the type field */ | ||
825 | #define V4L2_DV_BT_656_1120 0 /* BT.656/1120 timing type */ | ||
826 | |||
827 | /* | ||
735 | * V I D E O I N P U T S | 828 | * V I D E O I N P U T S |
736 | */ | 829 | */ |
737 | struct v4l2_input { | 830 | struct v4l2_input { |
@@ -742,7 +835,8 @@ struct v4l2_input { | |||
742 | __u32 tuner; /* Associated tuner */ | 835 | __u32 tuner; /* Associated tuner */ |
743 | v4l2_std_id std; | 836 | v4l2_std_id std; |
744 | __u32 status; | 837 | __u32 status; |
745 | __u32 reserved[4]; | 838 | __u32 capabilities; |
839 | __u32 reserved[3]; | ||
746 | }; | 840 | }; |
747 | 841 | ||
748 | /* Values for the 'type' field */ | 842 | /* Values for the 'type' field */ |
@@ -773,6 +867,11 @@ struct v4l2_input { | |||
773 | #define V4L2_IN_ST_NO_ACCESS 0x02000000 /* Conditional access denied */ | 867 | #define V4L2_IN_ST_NO_ACCESS 0x02000000 /* Conditional access denied */ |
774 | #define V4L2_IN_ST_VTR 0x04000000 /* VTR time constant */ | 868 | #define V4L2_IN_ST_VTR 0x04000000 /* VTR time constant */ |
775 | 869 | ||
870 | /* capabilities flags */ | ||
871 | #define V4L2_IN_CAP_PRESETS 0x00000001 /* Supports S_DV_PRESET */ | ||
872 | #define V4L2_IN_CAP_CUSTOM_TIMINGS 0x00000002 /* Supports S_DV_TIMINGS */ | ||
873 | #define V4L2_IN_CAP_STD 0x00000004 /* Supports S_STD */ | ||
874 | |||
776 | /* | 875 | /* |
777 | * V I D E O O U T P U T S | 876 | * V I D E O O U T P U T S |
778 | */ | 877 | */ |
@@ -783,13 +882,19 @@ struct v4l2_output { | |||
783 | __u32 audioset; /* Associated audios (bitfield) */ | 882 | __u32 audioset; /* Associated audios (bitfield) */ |
784 | __u32 modulator; /* Associated modulator */ | 883 | __u32 modulator; /* Associated modulator */ |
785 | v4l2_std_id std; | 884 | v4l2_std_id std; |
786 | __u32 reserved[4]; | 885 | __u32 capabilities; |
886 | __u32 reserved[3]; | ||
787 | }; | 887 | }; |
788 | /* Values for the 'type' field */ | 888 | /* Values for the 'type' field */ |
789 | #define V4L2_OUTPUT_TYPE_MODULATOR 1 | 889 | #define V4L2_OUTPUT_TYPE_MODULATOR 1 |
790 | #define V4L2_OUTPUT_TYPE_ANALOG 2 | 890 | #define V4L2_OUTPUT_TYPE_ANALOG 2 |
791 | #define V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY 3 | 891 | #define V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY 3 |
792 | 892 | ||
893 | /* capabilities flags */ | ||
894 | #define V4L2_OUT_CAP_PRESETS 0x00000001 /* Supports S_DV_PRESET */ | ||
895 | #define V4L2_OUT_CAP_CUSTOM_TIMINGS 0x00000002 /* Supports S_DV_TIMINGS */ | ||
896 | #define V4L2_OUT_CAP_STD 0x00000004 /* Supports S_STD */ | ||
897 | |||
793 | /* | 898 | /* |
794 | * C O N T R O L S | 899 | * C O N T R O L S |
795 | */ | 900 | */ |
@@ -1624,6 +1729,13 @@ struct v4l2_dbg_chip_ident { | |||
1624 | #endif | 1729 | #endif |
1625 | 1730 | ||
1626 | #define VIDIOC_S_HW_FREQ_SEEK _IOW('V', 82, struct v4l2_hw_freq_seek) | 1731 | #define VIDIOC_S_HW_FREQ_SEEK _IOW('V', 82, struct v4l2_hw_freq_seek) |
1732 | #define VIDIOC_ENUM_DV_PRESETS _IOWR('V', 83, struct v4l2_dv_enum_preset) | ||
1733 | #define VIDIOC_S_DV_PRESET _IOWR('V', 84, struct v4l2_dv_preset) | ||
1734 | #define VIDIOC_G_DV_PRESET _IOWR('V', 85, struct v4l2_dv_preset) | ||
1735 | #define VIDIOC_QUERY_DV_PRESET _IOR('V', 86, struct v4l2_dv_preset) | ||
1736 | #define VIDIOC_S_DV_TIMINGS _IOWR('V', 87, struct v4l2_dv_timings) | ||
1737 | #define VIDIOC_G_DV_TIMINGS _IOWR('V', 88, struct v4l2_dv_timings) | ||
1738 | |||
1627 | /* Reminder: when adding new ioctls please add support for them to | 1739 | /* Reminder: when adding new ioctls please add support for them to |
1628 | drivers/media/video/v4l2-compat-ioctl32.c as well! */ | 1740 | drivers/media/video/v4l2-compat-ioctl32.c as well! */ |
1629 | 1741 | ||
diff --git a/include/media/v4l2-ioctl.h b/include/media/v4l2-ioctl.h index 7a4529defa88..e8ba0f2efbae 100644 --- a/include/media/v4l2-ioctl.h +++ b/include/media/v4l2-ioctl.h | |||
@@ -239,6 +239,21 @@ struct v4l2_ioctl_ops { | |||
239 | int (*vidioc_enum_frameintervals) (struct file *file, void *fh, | 239 | int (*vidioc_enum_frameintervals) (struct file *file, void *fh, |
240 | struct v4l2_frmivalenum *fival); | 240 | struct v4l2_frmivalenum *fival); |
241 | 241 | ||
242 | /* DV Timings IOCTLs */ | ||
243 | int (*vidioc_enum_dv_presets) (struct file *file, void *fh, | ||
244 | struct v4l2_dv_enum_preset *preset); | ||
245 | |||
246 | int (*vidioc_s_dv_preset) (struct file *file, void *fh, | ||
247 | struct v4l2_dv_preset *preset); | ||
248 | int (*vidioc_g_dv_preset) (struct file *file, void *fh, | ||
249 | struct v4l2_dv_preset *preset); | ||
250 | int (*vidioc_query_dv_preset) (struct file *file, void *fh, | ||
251 | struct v4l2_dv_preset *qpreset); | ||
252 | int (*vidioc_s_dv_timings) (struct file *file, void *fh, | ||
253 | struct v4l2_dv_timings *timings); | ||
254 | int (*vidioc_g_dv_timings) (struct file *file, void *fh, | ||
255 | struct v4l2_dv_timings *timings); | ||
256 | |||
242 | /* For other private ioctls */ | 257 | /* For other private ioctls */ |
243 | long (*vidioc_default) (struct file *file, void *fh, | 258 | long (*vidioc_default) (struct file *file, void *fh, |
244 | int cmd, void *arg); | 259 | int cmd, void *arg); |
diff --git a/include/media/v4l2-subdev.h b/include/media/v4l2-subdev.h index 00bf17608453..7a3408f9d0f2 100644 --- a/include/media/v4l2-subdev.h +++ b/include/media/v4l2-subdev.h | |||
@@ -217,6 +217,19 @@ struct v4l2_subdev_audio_ops { | |||
217 | 217 | ||
218 | s_routing: see s_routing in audio_ops, except this version is for video | 218 | s_routing: see s_routing in audio_ops, except this version is for video |
219 | devices. | 219 | devices. |
220 | |||
221 | s_dv_preset: set dv (Digital Video) preset in the sub device. Similar to | ||
222 | s_std() | ||
223 | |||
224 | query_dv_preset: query dv preset in the sub device. This is similar to | ||
225 | querystd() | ||
226 | |||
227 | s_dv_timings(): Set custom dv timings in the sub device. This is used | ||
228 | when sub device is capable of setting detailed timing information | ||
229 | in the hardware to generate/detect the video signal. | ||
230 | |||
231 | g_dv_timings(): Get custom dv timings in the sub device. | ||
232 | |||
220 | */ | 233 | */ |
221 | struct v4l2_subdev_video_ops { | 234 | struct v4l2_subdev_video_ops { |
222 | int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config); | 235 | int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config); |
@@ -240,6 +253,14 @@ struct v4l2_subdev_video_ops { | |||
240 | int (*s_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param); | 253 | int (*s_parm)(struct v4l2_subdev *sd, struct v4l2_streamparm *param); |
241 | int (*enum_framesizes)(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize); | 254 | int (*enum_framesizes)(struct v4l2_subdev *sd, struct v4l2_frmsizeenum *fsize); |
242 | int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival); | 255 | int (*enum_frameintervals)(struct v4l2_subdev *sd, struct v4l2_frmivalenum *fival); |
256 | int (*s_dv_preset)(struct v4l2_subdev *sd, | ||
257 | struct v4l2_dv_preset *preset); | ||
258 | int (*query_dv_preset)(struct v4l2_subdev *sd, | ||
259 | struct v4l2_dv_preset *preset); | ||
260 | int (*s_dv_timings)(struct v4l2_subdev *sd, | ||
261 | struct v4l2_dv_timings *timings); | ||
262 | int (*g_dv_timings)(struct v4l2_subdev *sd, | ||
263 | struct v4l2_dv_timings *timings); | ||
243 | }; | 264 | }; |
244 | 265 | ||
245 | /* | 266 | /* |