Merge branch 'patchwork' into v4l_for_linus

* patchwork: (496 commits)
  [media] v4l: tvp5150: Add missing break in set control handler
  [media] v4l: tvp5150: Don't inline the tvp5150_selmux() function
  [media] v4l: tvp5150: Compile tvp5150_link_setup out if !CONFIG_MEDIA_CONTROLLER
  [media] em28xx: don't store usb_device at struct em28xx
  [media] em28xx: use usb_interface for dev_foo() calls
  [media] em28xx: don't change the device's name
  [media] mn88472: fix chip id check on probe
  [media] mn88473: fix chip id check on probe
  [media] lirc: fix error paths in lirc_cdev_add()
  [media] s5p-mfc: Add support for MFC v8 available in Exynos 5433 SoCs
  [media] s5p-mfc: Rework clock handling
  [media] s5p-mfc: Don't keep clock prepared all the time
  [media] s5p-mfc: Kill all IS_ERR_OR_NULL in clocks management code
  [media] s5p-mfc: Remove dead conditional code
  [media] s5p-mfc: Ensure that clock is disabled before turning power off
  [media] s5p-mfc: Remove special clock rate management
  [media] s5p-mfc: Use printk_ratelimited for reporting ioctl errors
  [media] s5p-mfc: Set DMA_ATTR_ALLOC_SINGLE_PAGES
  [media] vivid: Set color_enc on HSV formats
  [media] v4l2-tpg: Init hv_enc field with a valid value
  ...
This commit is contained in:
Mauro Carvalho Chehab 2016-12-15 08:38:35 -02:00
commit 65390ea01c
633 changed files with 27636 additions and 13406 deletions

View File

@ -3,7 +3,8 @@
G-Scaler is used for scaling and color space conversion on EXYNOS5 SoCs. G-Scaler is used for scaling and color space conversion on EXYNOS5 SoCs.
Required properties: Required properties:
- compatible: should be "samsung,exynos5-gsc" - compatible: should be "samsung,exynos5-gsc" (for Exynos 5250, 5420 and
5422 SoCs) or "samsung,exynos5433-gsc" (Exynos 5433)
- reg: should contain G-Scaler physical address location and length. - reg: should contain G-Scaler physical address location and length.
- interrupts: should contain G-Scaler interrupt number - interrupts: should contain G-Scaler interrupt number

View File

@ -8,10 +8,11 @@ Required properties:
the device. The interrupt specifier format depends on the interrupt the device. The interrupt specifier format depends on the interrupt
controller parent. controller parent.
- clocks: clock phandle and specifier pair. - clocks: clock phandle and specifier pair.
- hisilicon,power-syscon: phandle of syscon used to control power.
Optional properties: Optional properties:
- linux,rc-map-name : Remote control map name. - linux,rc-map-name : Remote control map name.
- hisilicon,power-syscon: DEPRECATED. Don't use this in new dts files.
Provide correct clocks instead.
Example node: Example node:
@ -19,7 +20,6 @@ Example node:
compatible = "hisilicon,hix5hd2-ir"; compatible = "hisilicon,hix5hd2-ir";
reg = <0xf8001000 0x1000>; reg = <0xf8001000 0x1000>;
interrupts = <0 47 4>; interrupts = <0 47 4>;
clocks = <&clock HIX5HD2_FIXED_24M>; clocks = <&clock HIX5HD2_IR_CLOCK>;
hisilicon,power-syscon = <&sysctrl>;
linux,rc-map-name = "rc-tivo"; linux,rc-map-name = "rc-tivo";
}; };

View File

@ -34,6 +34,7 @@ The digital output port node must contain at least one endpoint.
Optional Properties: Optional Properties:
- reset-gpios: Reference to the GPIO connected to the device's reset pin. - reset-gpios: Reference to the GPIO connected to the device's reset pin.
- default-input: Select which input is selected after reset.
Optional Endpoint Properties: Optional Endpoint Properties:
@ -47,8 +48,6 @@ Optional Endpoint Properties:
If none of hsync-active, vsync-active and pclk-sample is specified the If none of hsync-active, vsync-active and pclk-sample is specified the
endpoint will use embedded BT.656 synchronization. endpoint will use embedded BT.656 synchronization.
- default-input: Select which input is selected after reset.
Example: Example:
hdmi_receiver@4c { hdmi_receiver@4c {

View File

@ -0,0 +1,109 @@
* Mediatek Media Data Path
Media Data Path is used for scaling and color space conversion.
Required properties (controller (parent) node):
- compatible: "mediatek,mt8173-mdp"
- mediatek,vpu: the node of video processor unit, see
Documentation/devicetree/bindings/media/mediatek-vpu.txt for details.
Required properties (all function blocks, child node):
- compatible: Should be one of
"mediatek,mt8173-mdp-rdma" - read DMA
"mediatek,mt8173-mdp-rsz" - resizer
"mediatek,mt8173-mdp-wdma" - write DMA
"mediatek,mt8173-mdp-wrot" - write DMA with rotation
- reg: Physical base address and length of the function block register space
- clocks: device clocks, see
Documentation/devicetree/bindings/clock/clock-bindings.txt for details.
- power-domains: a phandle to the power domain, see
Documentation/devicetree/bindings/power/power_domain.txt for details.
Required properties (DMA function blocks, child node):
- compatible: Should be one of
"mediatek,mt8173-mdp-rdma"
"mediatek,mt8173-mdp-wdma"
"mediatek,mt8173-mdp-wrot"
- iommus: should point to the respective IOMMU block with master port as
argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.txt
for details.
- mediatek,larb: must contain the local arbiters in the current Socs, see
Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.txt
for details.
Example:
mdp {
compatible = "mediatek,mt8173-mdp";
#address-cells = <2>;
#size-cells = <2>;
ranges;
mediatek,vpu = <&vpu>;
mdp_rdma0: rdma@14001000 {
compatible = "mediatek,mt8173-mdp-rdma";
reg = <0 0x14001000 0 0x1000>;
clocks = <&mmsys CLK_MM_MDP_RDMA0>,
<&mmsys CLK_MM_MUTEX_32K>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
iommus = <&iommu M4U_PORT_MDP_RDMA0>;
mediatek,larb = <&larb0>;
};
mdp_rdma1: rdma@14002000 {
compatible = "mediatek,mt8173-mdp-rdma";
reg = <0 0x14002000 0 0x1000>;
clocks = <&mmsys CLK_MM_MDP_RDMA1>,
<&mmsys CLK_MM_MUTEX_32K>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
iommus = <&iommu M4U_PORT_MDP_RDMA1>;
mediatek,larb = <&larb4>;
};
mdp_rsz0: rsz@14003000 {
compatible = "mediatek,mt8173-mdp-rsz";
reg = <0 0x14003000 0 0x1000>;
clocks = <&mmsys CLK_MM_MDP_RSZ0>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
};
mdp_rsz1: rsz@14004000 {
compatible = "mediatek,mt8173-mdp-rsz";
reg = <0 0x14004000 0 0x1000>;
clocks = <&mmsys CLK_MM_MDP_RSZ1>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
};
mdp_rsz2: rsz@14005000 {
compatible = "mediatek,mt8173-mdp-rsz";
reg = <0 0x14005000 0 0x1000>;
clocks = <&mmsys CLK_MM_MDP_RSZ2>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
};
mdp_wdma0: wdma@14006000 {
compatible = "mediatek,mt8173-mdp-wdma";
reg = <0 0x14006000 0 0x1000>;
clocks = <&mmsys CLK_MM_MDP_WDMA>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
iommus = <&iommu M4U_PORT_MDP_WDMA>;
mediatek,larb = <&larb0>;
};
mdp_wrot0: wrot@14007000 {
compatible = "mediatek,mt8173-mdp-wrot";
reg = <0 0x14007000 0 0x1000>;
clocks = <&mmsys CLK_MM_MDP_WROT0>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
iommus = <&iommu M4U_PORT_MDP_WROT0>;
mediatek,larb = <&larb0>;
};
mdp_wrot1: wrot@14008000 {
compatible = "mediatek,mt8173-mdp-wrot";
reg = <0 0x14008000 0 0x1000>;
clocks = <&mmsys CLK_MM_MDP_WROT1>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
iommus = <&iommu M4U_PORT_MDP_WROT1>;
mediatek,larb = <&larb4>;
};
};

View File

@ -1,25 +1,74 @@
Mediatek Video Codec Mediatek Video Codec
Mediatek Video Codec is the video codec hw present in Mediatek SoCs which Mediatek Video Codec is the video codec hw present in Mediatek SoCs which
supports high resolution encoding functionalities. supports high resolution encoding and decoding functionalities.
Required properties: Required properties:
- compatible : "mediatek,mt8173-vcodec-enc" for encoder - compatible : "mediatek,mt8173-vcodec-enc" for encoder
"mediatek,mt8173-vcodec-dec" for decoder.
- reg : Physical base address of the video codec registers and length of - reg : Physical base address of the video codec registers and length of
memory mapped region. memory mapped region.
- interrupts : interrupt number to the cpu. - interrupts : interrupt number to the cpu.
- mediatek,larb : must contain the local arbiters in the current Socs. - mediatek,larb : must contain the local arbiters in the current Socs.
- clocks : list of clock specifiers, corresponding to entries in - clocks : list of clock specifiers, corresponding to entries in
the clock-names property. the clock-names property.
- clock-names: encoder must contain "venc_sel_src", "venc_sel", - clock-names: encoder must contain "venc_sel_src", "venc_sel",,
- "venc_lt_sel_src", "venc_lt_sel". "venc_lt_sel_src", "venc_lt_sel", decoder must contain "vcodecpll",
"univpll_d2", "clk_cci400_sel", "vdec_sel", "vdecpll", "vencpll",
"venc_lt_sel", "vdec_bus_clk_src".
- iommus : should point to the respective IOMMU block with master port as - iommus : should point to the respective IOMMU block with master port as
argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.txt argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.txt
for details. for details.
- mediatek,vpu : the node of video processor unit - mediatek,vpu : the node of video processor unit
Example: Example:
vcodec_enc: vcodec@0x18002000 {
vcodec_dec: vcodec@16000000 {
compatible = "mediatek,mt8173-vcodec-dec";
reg = <0 0x16000000 0 0x100>, /*VDEC_SYS*/
<0 0x16020000 0 0x1000>, /*VDEC_MISC*/
<0 0x16021000 0 0x800>, /*VDEC_LD*/
<0 0x16021800 0 0x800>, /*VDEC_TOP*/
<0 0x16022000 0 0x1000>, /*VDEC_CM*/
<0 0x16023000 0 0x1000>, /*VDEC_AD*/
<0 0x16024000 0 0x1000>, /*VDEC_AV*/
<0 0x16025000 0 0x1000>, /*VDEC_PP*/
<0 0x16026800 0 0x800>, /*VP8_VD*/
<0 0x16027000 0 0x800>, /*VP6_VD*/
<0 0x16027800 0 0x800>, /*VP8_VL*/
<0 0x16028400 0 0x400>; /*VP9_VD*/
interrupts = <GIC_SPI 204 IRQ_TYPE_LEVEL_LOW>;
mediatek,larb = <&larb1>;
iommus = <&iommu M4U_PORT_HW_VDEC_MC_EXT>,
<&iommu M4U_PORT_HW_VDEC_PP_EXT>,
<&iommu M4U_PORT_HW_VDEC_AVC_MV_EXT>,
<&iommu M4U_PORT_HW_VDEC_PRED_RD_EXT>,
<&iommu M4U_PORT_HW_VDEC_PRED_WR_EXT>,
<&iommu M4U_PORT_HW_VDEC_UFO_EXT>,
<&iommu M4U_PORT_HW_VDEC_VLD_EXT>,
<&iommu M4U_PORT_HW_VDEC_VLD2_EXT>;
mediatek,vpu = <&vpu>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_VDEC>;
clocks = <&apmixedsys CLK_APMIXED_VCODECPLL>,
<&topckgen CLK_TOP_UNIVPLL_D2>,
<&topckgen CLK_TOP_CCI400_SEL>,
<&topckgen CLK_TOP_VDEC_SEL>,
<&topckgen CLK_TOP_VCODECPLL>,
<&apmixedsys CLK_APMIXED_VENCPLL>,
<&topckgen CLK_TOP_VENC_LT_SEL>,
<&topckgen CLK_TOP_VCODECPLL_370P5>;
clock-names = "vcodecpll",
"univpll_d2",
"clk_cci400_sel",
"vdec_sel",
"vdecpll",
"vencpll",
"venc_lt_sel",
"vdec_bus_clk_src";
};
vcodec_enc: vcodec@0x18002000 {
compatible = "mediatek,mt8173-vcodec-enc"; compatible = "mediatek,mt8173-vcodec-enc";
reg = <0 0x18002000 0 0x1000>, /*VENC_SYS*/ reg = <0 0x18002000 0 0x1000>, /*VENC_SYS*/
<0 0x19002000 0 0x1000>; /*VENC_LT_SYS*/ <0 0x19002000 0 0x1000>; /*VENC_LT_SYS*/

View File

@ -0,0 +1,37 @@
Renesas R-Car Fine Display Processor (FDP1)
-------------------------------------------
The FDP1 is a de-interlacing module which converts interlaced video to
progressive video. It is capable of performing pixel format conversion between
YCbCr/YUV formats and RGB formats. Only YCbCr/YUV formats are supported as
an input to the module.
Required properties:
- compatible: must be "renesas,fdp1"
- reg: the register base and size for the device registers
- interrupts : interrupt specifier for the FDP1 instance
- clocks: reference to the functional clock
Optional properties:
- power-domains: reference to the power domain that the FDP1 belongs to, if
any.
- renesas,fcp: a phandle referencing the FCP that handles memory accesses
for the FDP1. Not needed on Gen2, mandatory on Gen3.
Please refer to the binding documentation for the clock and/or power domain
providers for more details.
Device node example
-------------------
fdp1@fe940000 {
compatible = "renesas,fdp1";
reg = <0 0xfe940000 0 0x2400>;
interrupts = <GIC_SPI 262 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cpg CPG_MOD 119>;
power-domains = <&sysc R8A7795_PD_A3VP>;
renesas,fcp = <&fcpf0>;
};

View File

@ -12,6 +12,7 @@ Required properties:
(b) "samsung,mfc-v6" for MFC v6 present in Exynos5 SoCs (b) "samsung,mfc-v6" for MFC v6 present in Exynos5 SoCs
(c) "samsung,mfc-v7" for MFC v7 present in Exynos5420 SoC (c) "samsung,mfc-v7" for MFC v7 present in Exynos5420 SoC
(d) "samsung,mfc-v8" for MFC v8 present in Exynos5800 SoC (d) "samsung,mfc-v8" for MFC v8 present in Exynos5800 SoC
(e) "samsung,exynos5433-mfc" for MFC v8 present in Exynos5433 SoC
- reg : Physical base address of the IP registers and length of memory - reg : Physical base address of the IP registers and length of memory
mapped region. mapped region.

View File

@ -88,7 +88,7 @@ $(BUILDDIR)/videodev2.h.rst: ${UAPI}/videodev2.h ${PARSER} $(SRC_DIR)/videodev2.
$(BUILDDIR)/media.h.rst: ${UAPI}/media.h ${PARSER} $(SRC_DIR)/media.h.rst.exceptions $(BUILDDIR)/media.h.rst: ${UAPI}/media.h ${PARSER} $(SRC_DIR)/media.h.rst.exceptions
@$($(quiet)gen_rst) @$($(quiet)gen_rst)
$(BUILDDIR)/cec.h.rst: ${KAPI}/cec.h ${PARSER} $(SRC_DIR)/cec.h.rst.exceptions $(BUILDDIR)/cec.h.rst: ${UAPI}/cec.h ${PARSER} $(SRC_DIR)/cec.h.rst.exceptions
@$($(quiet)gen_rst) @$($(quiet)gen_rst)
$(BUILDDIR)/lirc.h.rst: ${UAPI}/lirc.h ${PARSER} $(SRC_DIR)/lirc.h.rst.exceptions $(BUILDDIR)/lirc.h.rst: ${UAPI}/lirc.h ${PARSER} $(SRC_DIR)/lirc.h.rst.exceptions

View File

@ -37,9 +37,8 @@ The struct cec_adapter represents the CEC adapter hardware. It is created by
calling cec_allocate_adapter() and deleted by calling cec_delete_adapter(): calling cec_allocate_adapter() and deleted by calling cec_delete_adapter():
.. c:function:: .. c:function::
struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops, struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops, void *priv,
void *priv, const char *name, u32 caps, u8 available_las, const char *name, u32 caps, u8 available_las);
struct device *parent);
.. c:function:: .. c:function::
void cec_delete_adapter(struct cec_adapter *adap); void cec_delete_adapter(struct cec_adapter *adap);
@ -66,20 +65,19 @@ available_las:
the number of simultaneous logical addresses that this the number of simultaneous logical addresses that this
adapter can handle. Must be 1 <= available_las <= CEC_MAX_LOG_ADDRS. adapter can handle. Must be 1 <= available_las <= CEC_MAX_LOG_ADDRS.
parent:
the parent device.
To register the /dev/cecX device node and the remote control device (if To register the /dev/cecX device node and the remote control device (if
CEC_CAP_RC is set) you call: CEC_CAP_RC is set) you call:
.. c:function:: .. c:function::
int cec_register_adapter(struct cec_adapter \*adap); int cec_register_adapter(struct cec_adapter *adap, struct device *parent);
where parent is the parent device.
To unregister the devices call: To unregister the devices call:
.. c:function:: .. c:function::
void cec_unregister_adapter(struct cec_adapter \*adap); void cec_unregister_adapter(struct cec_adapter *adap);
Note: if cec_register_adapter() fails, then call cec_delete_adapter() to Note: if cec_register_adapter() fails, then call cec_delete_adapter() to
clean up. But if cec_register_adapter() succeeded, then only call clean up. But if cec_register_adapter() succeeded, then only call
@ -106,13 +104,13 @@ your driver:
int (*adap_log_addr)(struct cec_adapter *adap, u8 logical_addr); int (*adap_log_addr)(struct cec_adapter *adap, u8 logical_addr);
int (*adap_transmit)(struct cec_adapter *adap, u8 attempts, int (*adap_transmit)(struct cec_adapter *adap, u8 attempts,
u32 signal_free_time, struct cec_msg *msg); u32 signal_free_time, struct cec_msg *msg);
void (\*adap_log_status)(struct cec_adapter *adap); void (*adap_status)(struct cec_adapter *adap, struct seq_file *file);
/* High-level callbacks */ /* High-level callbacks */
... ...
}; };
The three low-level ops deal with various aspects of controlling the CEC adapter The five low-level ops deal with various aspects of controlling the CEC adapter
hardware: hardware:
@ -238,6 +236,18 @@ When a CEC message was received:
Speaks for itself. Speaks for itself.
Implementing the interrupt handler
----------------------------------
Typically the CEC hardware provides interrupts that signal when a transmit
finished and whether it was successful or not, and it provides and interrupt
when a CEC message was received.
The CEC driver should always process the transmit interrupts first before
handling the receive interrupt. The framework expects to see the cec_transmit_done
call before the cec_received_msg call, otherwise it can get confused if the
received message was in reply to the transmitted message.
Implementing the High-Level CEC Adapter Implementing the High-Level CEC Adapter
--------------------------------------- ---------------------------------------
@ -247,11 +257,11 @@ CEC protocol driven. The following high-level callbacks are available:
.. code-block:: none .. code-block:: none
struct cec_adap_ops { struct cec_adap_ops {
/\* Low-level callbacks \*/ /* Low-level callbacks */
... ...
/\* High-level CEC message callback \*/ /* High-level CEC message callback */
int (\*received)(struct cec_adapter \*adap, struct cec_msg \*msg); int (*received)(struct cec_adapter *adap, struct cec_msg *msg);
}; };
The received() callback allows the driver to optionally handle a newly The received() callback allows the driver to optionally handle a newly
@ -263,7 +273,7 @@ received CEC message
If the driver wants to process a CEC message, then it can implement this If the driver wants to process a CEC message, then it can implement this
callback. If it doesn't want to handle this message, then it should return callback. If it doesn't want to handle this message, then it should return
-ENOMSG, otherwise the CEC framework assumes it processed this message and -ENOMSG, otherwise the CEC framework assumes it processed this message and
it will not no anything with it. it will not do anything with it.
CEC framework functions CEC framework functions

View File

@ -0,0 +1,61 @@
MIPI CSI-2
==========
CSI-2 is a data bus intended for transferring images from cameras to
the host SoC. It is defined by the `MIPI alliance`_.
.. _`MIPI alliance`: http://www.mipi.org/
Transmitter drivers
-------------------
CSI-2 transmitter, such as a sensor or a TV tuner, drivers need to
provide the CSI-2 receiver with information on the CSI-2 bus
configuration. These include the V4L2_CID_LINK_FREQ and
V4L2_CID_PIXEL_RATE controls and
(:c:type:`v4l2_subdev_video_ops`->s_stream() callback). These
interface elements must be present on the sub-device represents the
CSI-2 transmitter.
The V4L2_CID_LINK_FREQ control is used to tell the receiver driver the
frequency (and not the symbol rate) of the link. The
V4L2_CID_PIXEL_RATE is may be used by the receiver to obtain the pixel
rate the transmitter uses. The
:c:type:`v4l2_subdev_video_ops`->s_stream() callback provides an
ability to start and stop the stream.
The value of the V4L2_CID_PIXEL_RATE is calculated as follows::
pixel_rate = link_freq * 2 * nr_of_lanes / bits_per_sample
where
.. list-table:: variables in pixel rate calculation
:header-rows: 1
* - variable or constant
- description
* - link_freq
- The value of the V4L2_CID_LINK_FREQ integer64 menu item.
* - nr_of_lanes
- Number of data lanes used on the CSI-2 link. This can
be obtained from the OF endpoint configuration.
* - 2
- Two bits are transferred per clock cycle per lane.
* - bits_per_sample
- Number of bits per sample.
The transmitter drivers must configure the CSI-2 transmitter to *LP-11
mode* whenever the transmitter is powered on but not active. Some
transmitters do this automatically but some have to be explicitly
programmed to do so.
Receiver drivers
----------------
Before the receiver driver may enable the CSI-2 transmitter by using
the :c:type:`v4l2_subdev_video_ops`->s_stream(), it must have powered
the transmitter up by using the
:c:type:`v4l2_subdev_core_ops`->s_power() callback. This may take
place either indirectly by using :c:func:`v4l2_pipeline_pm_use` or
directly.

View File

@ -8,14 +8,6 @@ Digital TV Common functions
.. kernel-doc:: drivers/media/dvb-core/dvbdev.h .. kernel-doc:: drivers/media/dvb-core/dvbdev.h
.. kernel-doc:: drivers/media/dvb-core/dvb_math.h
:export: drivers/media/dvb-core/dvb_math.c
.. kernel-doc:: drivers/media/dvb-core/dvbdev.h
:export: drivers/media/dvb-core/dvbdev.c
Digital TV Ring buffer Digital TV Ring buffer
---------------------- ----------------------

View File

@ -33,3 +33,4 @@ For more details see the file COPYING in the source distribution of Linux.
kapi/rc-core kapi/rc-core
kapi/mc-core kapi/mc-core
kapi/cec-core kapi/cec-core
kapi/csi2

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 119 KiB

View File

@ -48,41 +48,21 @@ returns the information to the application. The ioctl never fails.
:stub-columns: 0 :stub-columns: 0
:widths: 1 1 16 :widths: 1 1 16
* - char
- .. row 1 - ``driver[32]``
- The name of the cec adapter driver.
- char * - char
- ``name[32]``
- ``driver[32]`` - The name of this CEC adapter. The combination ``driver`` and
``name`` must be unique.
- The name of the cec adapter driver. * - __u32
- ``capabilities``
- .. row 2 - The capabilities of the CEC adapter, see
:ref:`cec-capabilities`.
- char * - __u32
- ``version``
- ``name[32]`` - CEC Framework API version, formatted with the ``KERNEL_VERSION()``
macro.
- The name of this CEC adapter. The combination ``driver`` and
``name`` must be unique.
- .. row 3
- __u32
- ``capabilities``
- The capabilities of the CEC adapter, see
:ref:`cec-capabilities`.
- .. row 4
- __u32
- ``version``
- CEC Framework API version, formatted with the ``KERNEL_VERSION()``
macro.
.. tabularcolumns:: |p{4.4cm}|p{2.5cm}|p{10.6cm}| .. tabularcolumns:: |p{4.4cm}|p{2.5cm}|p{10.6cm}|
@ -94,68 +74,50 @@ returns the information to the application. The ioctl never fails.
:stub-columns: 0 :stub-columns: 0
:widths: 3 1 8 :widths: 3 1 8
* .. _`CEC-CAP-PHYS-ADDR`:
- .. _`CEC-CAP-PHYS-ADDR`: - ``CEC_CAP_PHYS_ADDR``
- 0x00000001
- Userspace has to configure the physical address by calling
:ref:`ioctl CEC_ADAP_S_PHYS_ADDR <CEC_ADAP_S_PHYS_ADDR>`. If
this capability isn't set, then setting the physical address is
handled by the kernel whenever the EDID is set (for an HDMI
receiver) or read (for an HDMI transmitter).
* .. _`CEC-CAP-LOG-ADDRS`:
- ``CEC_CAP_PHYS_ADDR`` - ``CEC_CAP_LOG_ADDRS``
- 0x00000002
- Userspace has to configure the logical addresses by calling
:ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`. If
this capability isn't set, then the kernel will have configured
this.
* .. _`CEC-CAP-TRANSMIT`:
- 0x00000001 - ``CEC_CAP_TRANSMIT``
- 0x00000004
- Userspace can transmit CEC messages by calling
:ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>`. This implies that
userspace can be a follower as well, since being able to transmit
messages is a prerequisite of becoming a follower. If this
capability isn't set, then the kernel will handle all CEC
transmits and process all CEC messages it receives.
* .. _`CEC-CAP-PASSTHROUGH`:
- Userspace has to configure the physical address by calling - ``CEC_CAP_PASSTHROUGH``
:ref:`ioctl CEC_ADAP_S_PHYS_ADDR <CEC_ADAP_S_PHYS_ADDR>`. If - 0x00000008
this capability isn't set, then setting the physical address is - Userspace can use the passthrough mode by calling
handled by the kernel whenever the EDID is set (for an HDMI :ref:`ioctl CEC_S_MODE <CEC_S_MODE>`.
receiver) or read (for an HDMI transmitter). * .. _`CEC-CAP-RC`:
- .. _`CEC-CAP-LOG-ADDRS`: - ``CEC_CAP_RC``
- 0x00000010
- This adapter supports the remote control protocol.
* .. _`CEC-CAP-MONITOR-ALL`:
- ``CEC_CAP_LOG_ADDRS`` - ``CEC_CAP_MONITOR_ALL``
- 0x00000020
- 0x00000002 - The CEC hardware can monitor all messages, not just directed and
broadcast messages.
- Userspace has to configure the logical addresses by calling
:ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`. If
this capability isn't set, then the kernel will have configured
this.
- .. _`CEC-CAP-TRANSMIT`:
- ``CEC_CAP_TRANSMIT``
- 0x00000004
- Userspace can transmit CEC messages by calling
:ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>`. This implies that
userspace can be a follower as well, since being able to transmit
messages is a prerequisite of becoming a follower. If this
capability isn't set, then the kernel will handle all CEC
transmits and process all CEC messages it receives.
- .. _`CEC-CAP-PASSTHROUGH`:
- ``CEC_CAP_PASSTHROUGH``
- 0x00000008
- Userspace can use the passthrough mode by calling
:ref:`ioctl CEC_S_MODE <CEC_S_MODE>`.
- .. _`CEC-CAP-RC`:
- ``CEC_CAP_RC``
- 0x00000010
- This adapter supports the remote control protocol.
- .. _`CEC-CAP-MONITOR-ALL`:
- ``CEC_CAP_MONITOR_ALL``
- 0x00000020
- The CEC hardware can monitor all messages, not just directed and
broadcast messages.

View File

@ -77,134 +77,79 @@ logical address types are already defined will return with error ``EBUSY``.
:stub-columns: 0 :stub-columns: 0
:widths: 1 1 16 :widths: 1 1 16
* - __u8
- .. row 1 - ``log_addr[CEC_MAX_LOG_ADDRS]``
- The actual logical addresses that were claimed. This is set by the
- __u8 driver. If no logical address could be claimed, then it is set to
``CEC_LOG_ADDR_INVALID``. If this adapter is Unregistered, then
- ``log_addr[CEC_MAX_LOG_ADDRS]`` ``log_addr[0]`` is set to 0xf and all others to
``CEC_LOG_ADDR_INVALID``.
- The actual logical addresses that were claimed. This is set by the * - __u16
driver. If no logical address could be claimed, then it is set to - ``log_addr_mask``
``CEC_LOG_ADDR_INVALID``. If this adapter is Unregistered, then - The bitmask of all logical addresses this adapter has claimed. If
``log_addr[0]`` is set to 0xf and all others to this adapter is Unregistered then ``log_addr_mask`` sets bit 15
``CEC_LOG_ADDR_INVALID``. and clears all other bits. If this adapter is not configured at
all, then ``log_addr_mask`` is set to 0. Set by the driver.
- .. row 2 * - __u8
- ``cec_version``
- __u16 - The CEC version that this adapter shall use. See
:ref:`cec-versions`. Used to implement the
- ``log_addr_mask`` ``CEC_MSG_CEC_VERSION`` and ``CEC_MSG_REPORT_FEATURES`` messages.
Note that :ref:`CEC_OP_CEC_VERSION_1_3A <CEC-OP-CEC-VERSION-1-3A>` is not allowed by the CEC
- The bitmask of all logical addresses this adapter has claimed. If framework.
this adapter is Unregistered then ``log_addr_mask`` sets bit 15 * - __u8
and clears all other bits. If this adapter is not configured at - ``num_log_addrs``
all, then ``log_addr_mask`` is set to 0. Set by the driver. - Number of logical addresses to set up. Must be ≤
``available_log_addrs`` as returned by
- .. row 3 :ref:`CEC_ADAP_G_CAPS`. All arrays in
this structure are only filled up to index
- __u8 ``available_log_addrs``-1. The remaining array elements will be
ignored. Note that the CEC 2.0 standard allows for a maximum of 2
- ``cec_version`` logical addresses, although some hardware has support for more.
``CEC_MAX_LOG_ADDRS`` is 4. The driver will return the actual
- The CEC version that this adapter shall use. See number of logical addresses it could claim, which may be less than
:ref:`cec-versions`. Used to implement the what was requested. If this field is set to 0, then the CEC
``CEC_MSG_CEC_VERSION`` and ``CEC_MSG_REPORT_FEATURES`` messages. adapter shall clear all claimed logical addresses and all other
Note that :ref:`CEC_OP_CEC_VERSION_1_3A <CEC-OP-CEC-VERSION-1-3A>` is not allowed by the CEC fields will be ignored.
framework. * - __u32
- ``vendor_id``
- .. row 4 - The vendor ID is a 24-bit number that identifies the specific
vendor or entity. Based on this ID vendor specific commands may be
- __u8 defined. If you do not want a vendor ID then set it to
``CEC_VENDOR_ID_NONE``.
- ``num_log_addrs`` * - __u32
- ``flags``
- Number of logical addresses to set up. Must be ≤ - Flags. See :ref:`cec-log-addrs-flags` for a list of available flags.
``available_log_addrs`` as returned by * - char
:ref:`CEC_ADAP_G_CAPS`. All arrays in - ``osd_name[15]``
this structure are only filled up to index - The On-Screen Display name as is returned by the
``available_log_addrs``-1. The remaining array elements will be ``CEC_MSG_SET_OSD_NAME`` message.
ignored. Note that the CEC 2.0 standard allows for a maximum of 2 * - __u8
logical addresses, although some hardware has support for more. - ``primary_device_type[CEC_MAX_LOG_ADDRS]``
``CEC_MAX_LOG_ADDRS`` is 4. The driver will return the actual - Primary device type for each logical address. See
number of logical addresses it could claim, which may be less than :ref:`cec-prim-dev-types` for possible types.
what was requested. If this field is set to 0, then the CEC * - __u8
adapter shall clear all claimed logical addresses and all other - ``log_addr_type[CEC_MAX_LOG_ADDRS]``
fields will be ignored. - Logical address types. See :ref:`cec-log-addr-types` for
possible types. The driver will update this with the actual
- .. row 5 logical address type that it claimed (e.g. it may have to fallback
to :ref:`CEC_LOG_ADDR_TYPE_UNREGISTERED <CEC-LOG-ADDR-TYPE-UNREGISTERED>`).
- __u32 * - __u8
- ``all_device_types[CEC_MAX_LOG_ADDRS]``
- ``vendor_id`` - CEC 2.0 specific: the bit mask of all device types. See
:ref:`cec-all-dev-types-flags`. It is used in the CEC 2.0
- The vendor ID is a 24-bit number that identifies the specific ``CEC_MSG_REPORT_FEATURES`` message. For CEC 1.4 you can either leave
vendor or entity. Based on this ID vendor specific commands may be this field to 0, or fill it in according to the CEC 2.0 guidelines to
defined. If you do not want a vendor ID then set it to give the CEC framework more information about the device type, even
``CEC_VENDOR_ID_NONE``. though the framework won't use it directly in the CEC message.
* - __u8
- .. row 6 - ``features[CEC_MAX_LOG_ADDRS][12]``
- Features for each logical address. It is used in the CEC 2.0
- __u32 ``CEC_MSG_REPORT_FEATURES`` message. The 12 bytes include both the
RC Profile and the Device Features. For CEC 1.4 you can either leave
- ``flags`` this field to all 0, or fill it in according to the CEC 2.0 guidelines to
give the CEC framework more information about the device type, even
- Flags. See :ref:`cec-log-addrs-flags` for a list of available flags. though the framework won't use it directly in the CEC message.
- .. row 7
- char
- ``osd_name[15]``
- The On-Screen Display name as is returned by the
``CEC_MSG_SET_OSD_NAME`` message.
- .. row 8
- __u8
- ``primary_device_type[CEC_MAX_LOG_ADDRS]``
- Primary device type for each logical address. See
:ref:`cec-prim-dev-types` for possible types.
- .. row 9
- __u8
- ``log_addr_type[CEC_MAX_LOG_ADDRS]``
- Logical address types. See :ref:`cec-log-addr-types` for
possible types. The driver will update this with the actual
logical address type that it claimed (e.g. it may have to fallback
to :ref:`CEC_LOG_ADDR_TYPE_UNREGISTERED <CEC-LOG-ADDR-TYPE-UNREGISTERED>`).
- .. row 10
- __u8
- ``all_device_types[CEC_MAX_LOG_ADDRS]``
- CEC 2.0 specific: the bit mask of all device types. See
:ref:`cec-all-dev-types-flags`. It is used in the CEC 2.0
``CEC_MSG_REPORT_FEATURES`` message. For CEC 1.4 you can either leave
this field to 0, or fill it in according to the CEC 2.0 guidelines to
give the CEC framework more information about the device type, even
though the framework won't use it directly in the CEC message.
- .. row 11
- __u8
- ``features[CEC_MAX_LOG_ADDRS][12]``
- Features for each logical address. It is used in the CEC 2.0
``CEC_MSG_REPORT_FEATURES`` message. The 12 bytes include both the
RC Profile and the Device Features. For CEC 1.4 you can either leave
this field to all 0, or fill it in according to the CEC 2.0 guidelines to
give the CEC framework more information about the device type, even
though the framework won't use it directly in the CEC message.
.. _cec-log-addrs-flags: .. _cec-log-addrs-flags:
@ -213,17 +158,33 @@ logical address types are already defined will return with error ``EBUSY``.
:stub-columns: 0 :stub-columns: 0
:widths: 3 1 4 :widths: 3 1 4
* .. _`CEC-LOG-ADDRS-FL-ALLOW-UNREG-FALLBACK`:
- .. _`CEC-LOG-ADDRS-FL-ALLOW-UNREG-FALLBACK`: - ``CEC_LOG_ADDRS_FL_ALLOW_UNREG_FALLBACK``
- 1
- By default if no logical address of the requested type can be claimed, then
it will go back to the unconfigured state. If this flag is set, then it will
fallback to the Unregistered logical address. Note that if the Unregistered
logical address was explicitly requested, then this flag has no effect.
* .. _`CEC-LOG-ADDRS-FL-ALLOW-RC-PASSTHRU`:
- ``CEC_LOG_ADDRS_FL_ALLOW_UNREG_FALLBACK`` - ``CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU``
- 2
- By default the ``CEC_MSG_USER_CONTROL_PRESSED`` and ``CEC_MSG_USER_CONTROL_RELEASED``
messages are only passed on to the follower(s), if any. If this flag is set,
then these messages are also passed on to the remote control input subsystem
and will appear as keystrokes. This features needs to be enabled explicitly.
If CEC is used to enter e.g. passwords, then you may not want to enable this
to avoid trivial snooping of the keystrokes.
* .. _`CEC-LOG-ADDRS-FL-CDC-ONLY`:
- 1 - `CEC_LOG_ADDRS_FL_CDC_ONLY`
- 4
- If this flag is set, then the device is CDC-Only. CDC-Only CEC devices
are CEC devices that can only handle CDC messages.
All other messages are ignored.
- By default if no logical address of the requested type can be claimed, then
it will go back to the unconfigured state. If this flag is set, then it will
fallback to the Unregistered logical address. Note that if the Unregistered
logical address was explicitly requested, then this flag has no effect.
.. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}| .. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}|
@ -234,30 +195,21 @@ logical address types are already defined will return with error ``EBUSY``.
:stub-columns: 0 :stub-columns: 0
:widths: 3 1 4 :widths: 3 1 4
* .. _`CEC-OP-CEC-VERSION-1-3A`:
- .. _`CEC-OP-CEC-VERSION-1-3A`: - ``CEC_OP_CEC_VERSION_1_3A``
- 4
- CEC version according to the HDMI 1.3a standard.
* .. _`CEC-OP-CEC-VERSION-1-4B`:
- ``CEC_OP_CEC_VERSION_1_3A`` - ``CEC_OP_CEC_VERSION_1_4B``
- 5
- CEC version according to the HDMI 1.4b standard.
* .. _`CEC-OP-CEC-VERSION-2-0`:
- 4 - ``CEC_OP_CEC_VERSION_2_0``
- 6
- CEC version according to the HDMI 1.3a standard. - CEC version according to the HDMI 2.0 standard.
- .. _`CEC-OP-CEC-VERSION-1-4B`:
- ``CEC_OP_CEC_VERSION_1_4B``
- 5
- CEC version according to the HDMI 1.4b standard.
- .. _`CEC-OP-CEC-VERSION-2-0`:
- ``CEC_OP_CEC_VERSION_2_0``
- 6
- CEC version according to the HDMI 2.0 standard.
.. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}| .. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}|
@ -269,62 +221,41 @@ logical address types are already defined will return with error ``EBUSY``.
:stub-columns: 0 :stub-columns: 0
:widths: 3 1 4 :widths: 3 1 4
* .. _`CEC-OP-PRIM-DEVTYPE-TV`:
- .. _`CEC-OP-PRIM-DEVTYPE-TV`: - ``CEC_OP_PRIM_DEVTYPE_TV``
- 0
- Use for a TV.
* .. _`CEC-OP-PRIM-DEVTYPE-RECORD`:
- ``CEC_OP_PRIM_DEVTYPE_TV`` - ``CEC_OP_PRIM_DEVTYPE_RECORD``
- 1
- Use for a recording device.
* .. _`CEC-OP-PRIM-DEVTYPE-TUNER`:
- 0 - ``CEC_OP_PRIM_DEVTYPE_TUNER``
- 3
- Use for a device with a tuner.
* .. _`CEC-OP-PRIM-DEVTYPE-PLAYBACK`:
- Use for a TV. - ``CEC_OP_PRIM_DEVTYPE_PLAYBACK``
- 4
- Use for a playback device.
* .. _`CEC-OP-PRIM-DEVTYPE-AUDIOSYSTEM`:
- .. _`CEC-OP-PRIM-DEVTYPE-RECORD`: - ``CEC_OP_PRIM_DEVTYPE_AUDIOSYSTEM``
- 5
- Use for an audio system (e.g. an audio/video receiver).
* .. _`CEC-OP-PRIM-DEVTYPE-SWITCH`:
- ``CEC_OP_PRIM_DEVTYPE_RECORD`` - ``CEC_OP_PRIM_DEVTYPE_SWITCH``
- 6
- Use for a CEC switch.
* .. _`CEC-OP-PRIM-DEVTYPE-VIDEOPROC`:
- 1 - ``CEC_OP_PRIM_DEVTYPE_VIDEOPROC``
- 7
- Use for a recording device. - Use for a video processor device.
- .. _`CEC-OP-PRIM-DEVTYPE-TUNER`:
- ``CEC_OP_PRIM_DEVTYPE_TUNER``
- 3
- Use for a device with a tuner.
- .. _`CEC-OP-PRIM-DEVTYPE-PLAYBACK`:
- ``CEC_OP_PRIM_DEVTYPE_PLAYBACK``
- 4
- Use for a playback device.
- .. _`CEC-OP-PRIM-DEVTYPE-AUDIOSYSTEM`:
- ``CEC_OP_PRIM_DEVTYPE_AUDIOSYSTEM``
- 5
- Use for an audio system (e.g. an audio/video receiver).
- .. _`CEC-OP-PRIM-DEVTYPE-SWITCH`:
- ``CEC_OP_PRIM_DEVTYPE_SWITCH``
- 6
- Use for a CEC switch.
- .. _`CEC-OP-PRIM-DEVTYPE-VIDEOPROC`:
- ``CEC_OP_PRIM_DEVTYPE_VIDEOPROC``
- 7
- Use for a video processor device.
.. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}| .. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}|
@ -336,64 +267,43 @@ logical address types are already defined will return with error ``EBUSY``.
:stub-columns: 0 :stub-columns: 0
:widths: 3 1 16 :widths: 3 1 16
* .. _`CEC-LOG-ADDR-TYPE-TV`:
- .. _`CEC-LOG-ADDR-TYPE-TV`: - ``CEC_LOG_ADDR_TYPE_TV``
- 0
- Use for a TV.
* .. _`CEC-LOG-ADDR-TYPE-RECORD`:
- ``CEC_LOG_ADDR_TYPE_TV`` - ``CEC_LOG_ADDR_TYPE_RECORD``
- 1
- Use for a recording device.
* .. _`CEC-LOG-ADDR-TYPE-TUNER`:
- 0 - ``CEC_LOG_ADDR_TYPE_TUNER``
- 2
- Use for a tuner device.
* .. _`CEC-LOG-ADDR-TYPE-PLAYBACK`:
- Use for a TV. - ``CEC_LOG_ADDR_TYPE_PLAYBACK``
- 3
- Use for a playback device.
* .. _`CEC-LOG-ADDR-TYPE-AUDIOSYSTEM`:
- .. _`CEC-LOG-ADDR-TYPE-RECORD`: - ``CEC_LOG_ADDR_TYPE_AUDIOSYSTEM``
- 4
- Use for an audio system device.
* .. _`CEC-LOG-ADDR-TYPE-SPECIFIC`:
- ``CEC_LOG_ADDR_TYPE_RECORD`` - ``CEC_LOG_ADDR_TYPE_SPECIFIC``
- 5
- Use for a second TV or for a video processor device.
* .. _`CEC-LOG-ADDR-TYPE-UNREGISTERED`:
- 1 - ``CEC_LOG_ADDR_TYPE_UNREGISTERED``
- 6
- Use for a recording device. - Use this if you just want to remain unregistered. Used for pure
CEC switches or CDC-only devices (CDC: Capability Discovery and
- .. _`CEC-LOG-ADDR-TYPE-TUNER`: Control).
- ``CEC_LOG_ADDR_TYPE_TUNER``
- 2
- Use for a tuner device.
- .. _`CEC-LOG-ADDR-TYPE-PLAYBACK`:
- ``CEC_LOG_ADDR_TYPE_PLAYBACK``
- 3
- Use for a playback device.
- .. _`CEC-LOG-ADDR-TYPE-AUDIOSYSTEM`:
- ``CEC_LOG_ADDR_TYPE_AUDIOSYSTEM``
- 4
- Use for an audio system device.
- .. _`CEC-LOG-ADDR-TYPE-SPECIFIC`:
- ``CEC_LOG_ADDR_TYPE_SPECIFIC``
- 5
- Use for a second TV or for a video processor device.
- .. _`CEC-LOG-ADDR-TYPE-UNREGISTERED`:
- ``CEC_LOG_ADDR_TYPE_UNREGISTERED``
- 6
- Use this if you just want to remain unregistered. Used for pure
CEC switches or CDC-only devices (CDC: Capability Discovery and
Control).
@ -406,54 +316,36 @@ logical address types are already defined will return with error ``EBUSY``.
:stub-columns: 0 :stub-columns: 0
:widths: 3 1 4 :widths: 3 1 4
* .. _`CEC-OP-ALL-DEVTYPE-TV`:
- .. _`CEC-OP-ALL-DEVTYPE-TV`: - ``CEC_OP_ALL_DEVTYPE_TV``
- 0x80
- This supports the TV type.
* .. _`CEC-OP-ALL-DEVTYPE-RECORD`:
- ``CEC_OP_ALL_DEVTYPE_TV`` - ``CEC_OP_ALL_DEVTYPE_RECORD``
- 0x40
- This supports the Recording type.
* .. _`CEC-OP-ALL-DEVTYPE-TUNER`:
- 0x80 - ``CEC_OP_ALL_DEVTYPE_TUNER``
- 0x20
- This supports the Tuner type.
* .. _`CEC-OP-ALL-DEVTYPE-PLAYBACK`:
- This supports the TV type. - ``CEC_OP_ALL_DEVTYPE_PLAYBACK``
- 0x10
- This supports the Playback type.
* .. _`CEC-OP-ALL-DEVTYPE-AUDIOSYSTEM`:
- .. _`CEC-OP-ALL-DEVTYPE-RECORD`: - ``CEC_OP_ALL_DEVTYPE_AUDIOSYSTEM``
- 0x08
- This supports the Audio System type.
* .. _`CEC-OP-ALL-DEVTYPE-SWITCH`:
- ``CEC_OP_ALL_DEVTYPE_RECORD`` - ``CEC_OP_ALL_DEVTYPE_SWITCH``
- 0x04
- 0x40 - This supports the CEC Switch or Video Processing type.
- This supports the Recording type.
- .. _`CEC-OP-ALL-DEVTYPE-TUNER`:
- ``CEC_OP_ALL_DEVTYPE_TUNER``
- 0x20
- This supports the Tuner type.
- .. _`CEC-OP-ALL-DEVTYPE-PLAYBACK`:
- ``CEC_OP_ALL_DEVTYPE_PLAYBACK``
- 0x10
- This supports the Playback type.
- .. _`CEC-OP-ALL-DEVTYPE-AUDIOSYSTEM`:
- ``CEC_OP_ALL_DEVTYPE_AUDIOSYSTEM``
- 0x08
- This supports the Audio System type.
- .. _`CEC-OP-ALL-DEVTYPE-SWITCH`:
- ``CEC_OP_ALL_DEVTYPE_SWITCH``
- 0x04
- This supports the CEC Switch or Video Processing type.

View File

@ -58,26 +58,16 @@ it is guaranteed that the state did change in between the two events.
:stub-columns: 0 :stub-columns: 0
:widths: 1 1 8 :widths: 1 1 8
* - __u16
- .. row 1 - ``phys_addr``
- The current physical address. This is ``CEC_PHYS_ADDR_INVALID`` if no
- __u16
- ``phys_addr``
- The current physical address. This is ``CEC_PHYS_ADDR_INVALID`` if no
valid physical address is set. valid physical address is set.
* - __u16
- .. row 2 - ``log_addr_mask``
- The current set of claimed logical addresses. This is 0 if no logical
- __u16 addresses are claimed or if ``phys_addr`` is ``CEC_PHYS_ADDR_INVALID``.
If bit 15 is set (``1 << CEC_LOG_ADDR_UNREGISTERED``) then this device
- ``log_addr_mask`` has the unregistered logical address. In that case all other bits are 0.
- The current set of claimed logical addresses. This is 0 if no logical
addresses are claimed or if ``phys_addr`` is ``CEC_PHYS_ADDR_INVALID``.
If bit 15 is set (``1 << CEC_LOG_ADDR_UNREGISTERED``) then this device
has the unregistered logical address. In that case all other bits are 0.
.. c:type:: cec_event_lost_msgs .. c:type:: cec_event_lost_msgs
@ -89,22 +79,17 @@ it is guaranteed that the state did change in between the two events.
:stub-columns: 0 :stub-columns: 0
:widths: 1 1 16 :widths: 1 1 16
* - __u32
- .. row 1 - ``lost_msgs``
- Set to the number of lost messages since the filehandle was opened
- __u32 or since the last time this event was dequeued for this
filehandle. The messages lost are the oldest messages. So when a
- ``lost_msgs`` new message arrives and there is no more room, then the oldest
message is discarded to make room for the new one. The internal
- Set to the number of lost messages since the filehandle was opened size of the message queue guarantees that all messages received in
or since the last time this event was dequeued for this the last two seconds will be stored. Since messages should be
filehandle. The messages lost are the oldest messages. So when a replied to within a second according to the CEC specification,
new message arrives and there is no more room, then the oldest this is more than enough.
message is discarded to make room for the new one. The internal
size of the message queue guarantees that all messages received in
the last two seconds will be stored. Since messages should be
replied to within a second according to the CEC specification,
this is more than enough.
.. tabularcolumns:: |p{1.0cm}|p{4.2cm}|p{2.5cm}|p{8.8cm}| .. tabularcolumns:: |p{1.0cm}|p{4.2cm}|p{2.5cm}|p{8.8cm}|
@ -116,62 +101,32 @@ it is guaranteed that the state did change in between the two events.
:stub-columns: 0 :stub-columns: 0
:widths: 1 1 1 8 :widths: 1 1 1 8
* - __u64
- ``ts``
- :cspan:`1` Timestamp of the event in ns.
- .. row 1 The timestamp has been taken from the ``CLOCK_MONOTONIC`` clock. To access
the same clock from userspace use :c:func:`clock_gettime`.
- __u64 * - __u32
- ``event``
- ``ts`` - :cspan:`1` The CEC event type, see :ref:`cec-events`.
* - __u32
- :cspan:`1` Timestamp of the event in ns. - ``flags``
- :cspan:`1` Event flags, see :ref:`cec-event-flags`.
The timestamp has been taken from the ``CLOCK_MONOTONIC`` clock. To access * - union
the same clock from userspace use :c:func:`clock_gettime`. - (anonymous)
-
- .. row 2 -
* -
- __u32 - struct cec_event_state_change
- ``state_change``
- ``event`` - The new adapter state as sent by the :ref:`CEC_EVENT_STATE_CHANGE <CEC-EVENT-STATE-CHANGE>`
event.
- :cspan:`1` The CEC event type, see :ref:`cec-events`. * -
- struct cec_event_lost_msgs
- .. row 3 - ``lost_msgs``
- The number of lost messages as sent by the :ref:`CEC_EVENT_LOST_MSGS <CEC-EVENT-LOST-MSGS>`
- __u32 event.
- ``flags``
- :cspan:`1` Event flags, see :ref:`cec-event-flags`.
- .. row 4
- union
- (anonymous)
-
-
- .. row 5
-
- struct cec_event_state_change
- ``state_change``
- The new adapter state as sent by the :ref:`CEC_EVENT_STATE_CHANGE <CEC-EVENT-STATE-CHANGE>`
event.
- .. row 6
-
- struct cec_event_lost_msgs
- ``lost_msgs``
- The number of lost messages as sent by the :ref:`CEC_EVENT_LOST_MSGS <CEC-EVENT-LOST-MSGS>`
event.
.. tabularcolumns:: |p{5.6cm}|p{0.9cm}|p{11.0cm}| .. tabularcolumns:: |p{5.6cm}|p{0.9cm}|p{11.0cm}|
@ -183,25 +138,19 @@ it is guaranteed that the state did change in between the two events.
:stub-columns: 0 :stub-columns: 0
:widths: 3 1 16 :widths: 3 1 16
* .. _`CEC-EVENT-STATE-CHANGE`:
- .. _`CEC-EVENT-STATE-CHANGE`: - ``CEC_EVENT_STATE_CHANGE``
- 1
- Generated when the CEC Adapter's state changes. When open() is
called an initial event will be generated for that filehandle with
the CEC Adapter's state at that time.
* .. _`CEC-EVENT-LOST-MSGS`:
- ``CEC_EVENT_STATE_CHANGE`` - ``CEC_EVENT_LOST_MSGS``
- 2
- 1 - Generated if one or more CEC messages were lost because the
application didn't dequeue CEC messages fast enough.
- Generated when the CEC Adapter's state changes. When open() is
called an initial event will be generated for that filehandle with
the CEC Adapter's state at that time.
- .. _`CEC-EVENT-LOST-MSGS`:
- ``CEC_EVENT_LOST_MSGS``
- 2
- Generated if one or more CEC messages were lost because the
application didn't dequeue CEC messages fast enough.
.. tabularcolumns:: |p{6.0cm}|p{0.6cm}|p{10.9cm}| .. tabularcolumns:: |p{6.0cm}|p{0.6cm}|p{10.9cm}|
@ -213,17 +162,14 @@ it is guaranteed that the state did change in between the two events.
:stub-columns: 0 :stub-columns: 0
:widths: 3 1 8 :widths: 3 1 8
* .. _`CEC-EVENT-FL-INITIAL-VALUE`:
- .. _`CEC-EVENT-FL-INITIAL-VALUE`: - ``CEC_EVENT_FL_INITIAL_VALUE``
- 1
- ``CEC_EVENT_FL_INITIAL_VALUE`` - Set for the initial events that are generated when the device is
opened. See the table above for which events do this. This allows
- 1 applications to learn the initial state of the CEC adapter at
open() time.
- Set for the initial events that are generated when the device is
opened. See the table above for which events do this. This allows
applications to learn the initial state of the CEC adapter at
open() time.

View File

@ -83,37 +83,28 @@ Available initiator modes are:
:stub-columns: 0 :stub-columns: 0
:widths: 3 1 16 :widths: 3 1 16
* .. _`CEC-MODE-NO-INITIATOR`:
- .. _`CEC-MODE-NO-INITIATOR`: - ``CEC_MODE_NO_INITIATOR``
- 0x0
- This is not an initiator, i.e. it cannot transmit CEC messages or
make any other changes to the CEC adapter.
* .. _`CEC-MODE-INITIATOR`:
- ``CEC_MODE_NO_INITIATOR`` - ``CEC_MODE_INITIATOR``
- 0x1
- This is an initiator (the default when the device is opened) and
it can transmit CEC messages and make changes to the CEC adapter,
unless there is an exclusive initiator.
* .. _`CEC-MODE-EXCL-INITIATOR`:
- 0x0 - ``CEC_MODE_EXCL_INITIATOR``
- 0x2
- This is not an initiator, i.e. it cannot transmit CEC messages or - This is an exclusive initiator and this file descriptor is the
make any other changes to the CEC adapter. only one that can transmit CEC messages and make changes to the
CEC adapter. If someone else is already the exclusive initiator
- .. _`CEC-MODE-INITIATOR`: then an attempt to become one will return the ``EBUSY`` error code
error.
- ``CEC_MODE_INITIATOR``
- 0x1
- This is an initiator (the default when the device is opened) and
it can transmit CEC messages and make changes to the CEC adapter,
unless there is an exclusive initiator.
- .. _`CEC-MODE-EXCL-INITIATOR`:
- ``CEC_MODE_EXCL_INITIATOR``
- 0x2
- This is an exclusive initiator and this file descriptor is the
only one that can transmit CEC messages and make changes to the
CEC adapter. If someone else is already the exclusive initiator
then an attempt to become one will return the ``EBUSY`` error code
error.
Available follower modes are: Available follower modes are:
@ -127,86 +118,68 @@ Available follower modes are:
:stub-columns: 0 :stub-columns: 0
:widths: 3 1 16 :widths: 3 1 16
* .. _`CEC-MODE-NO-FOLLOWER`:
- .. _`CEC-MODE-NO-FOLLOWER`: - ``CEC_MODE_NO_FOLLOWER``
- 0x00
- This is not a follower (the default when the device is opened).
* .. _`CEC-MODE-FOLLOWER`:
- ``CEC_MODE_NO_FOLLOWER`` - ``CEC_MODE_FOLLOWER``
- 0x10
- This is a follower and it will receive CEC messages unless there
is an exclusive follower. You cannot become a follower if
:ref:`CEC_CAP_TRANSMIT <CEC-CAP-TRANSMIT>` is not set or if :ref:`CEC_MODE_NO_INITIATOR <CEC-MODE-NO-INITIATOR>`
was specified, the ``EINVAL`` error code is returned in that case.
* .. _`CEC-MODE-EXCL-FOLLOWER`:
- 0x00 - ``CEC_MODE_EXCL_FOLLOWER``
- 0x20
- This is an exclusive follower and only this file descriptor will
receive CEC messages for processing. If someone else is already
the exclusive follower then an attempt to become one will return
the ``EBUSY`` error code. You cannot become a follower if
:ref:`CEC_CAP_TRANSMIT <CEC-CAP-TRANSMIT>` is not set or if :ref:`CEC_MODE_NO_INITIATOR <CEC-MODE-NO-INITIATOR>`
was specified, the ``EINVAL`` error code is returned in that case.
* .. _`CEC-MODE-EXCL-FOLLOWER-PASSTHRU`:
- This is not a follower (the default when the device is opened). - ``CEC_MODE_EXCL_FOLLOWER_PASSTHRU``
- 0x30
- This is an exclusive follower and only this file descriptor will
receive CEC messages for processing. In addition it will put the
CEC device into passthrough mode, allowing the exclusive follower
to handle most core messages instead of relying on the CEC
framework for that. If someone else is already the exclusive
follower then an attempt to become one will return the ``EBUSY`` error
code. You cannot become a follower if :ref:`CEC_CAP_TRANSMIT <CEC-CAP-TRANSMIT>`
is not set or if :ref:`CEC_MODE_NO_INITIATOR <CEC-MODE-NO-INITIATOR>` was specified,
the ``EINVAL`` error code is returned in that case.
* .. _`CEC-MODE-MONITOR`:
- .. _`CEC-MODE-FOLLOWER`: - ``CEC_MODE_MONITOR``
- 0xe0
- Put the file descriptor into monitor mode. Can only be used in
combination with :ref:`CEC_MODE_NO_INITIATOR <CEC-MODE-NO-INITIATOR>`, otherwise EINVAL error
code will be returned. In monitor mode all messages this CEC
device transmits and all messages it receives (both broadcast
messages and directed messages for one its logical addresses) will
be reported. This is very useful for debugging. This is only
allowed if the process has the ``CAP_NET_ADMIN`` capability. If
that is not set, then the ``EPERM`` error code is returned.
* .. _`CEC-MODE-MONITOR-ALL`:
- ``CEC_MODE_FOLLOWER`` - ``CEC_MODE_MONITOR_ALL``
- 0xf0
- 0x10 - Put the file descriptor into 'monitor all' mode. Can only be used
in combination with :ref:`CEC_MODE_NO_INITIATOR <CEC-MODE-NO-INITIATOR>`, otherwise
- This is a follower and it will receive CEC messages unless there the ``EINVAL`` error code will be returned. In 'monitor all' mode all messages
is an exclusive follower. You cannot become a follower if this CEC device transmits and all messages it receives, including
:ref:`CEC_CAP_TRANSMIT <CEC-CAP-TRANSMIT>` is not set or if :ref:`CEC_MODE_NO_INITIATOR <CEC-MODE-NO-INITIATOR>` directed messages for other CEC devices will be reported. This is
was specified, the ``EINVAL`` error code is returned in that case. very useful for debugging, but not all devices support this. This
mode requires that the :ref:`CEC_CAP_MONITOR_ALL <CEC-CAP-MONITOR-ALL>` capability is set,
- .. _`CEC-MODE-EXCL-FOLLOWER`: otherwise the ``EINVAL`` error code is returned. This is only allowed if
the process has the ``CAP_NET_ADMIN`` capability. If that is not
- ``CEC_MODE_EXCL_FOLLOWER`` set, then the ``EPERM`` error code is returned.
- 0x20
- This is an exclusive follower and only this file descriptor will
receive CEC messages for processing. If someone else is already
the exclusive follower then an attempt to become one will return
the ``EBUSY`` error code. You cannot become a follower if
:ref:`CEC_CAP_TRANSMIT <CEC-CAP-TRANSMIT>` is not set or if :ref:`CEC_MODE_NO_INITIATOR <CEC-MODE-NO-INITIATOR>`
was specified, the ``EINVAL`` error code is returned in that case.
- .. _`CEC-MODE-EXCL-FOLLOWER-PASSTHRU`:
- ``CEC_MODE_EXCL_FOLLOWER_PASSTHRU``
- 0x30
- This is an exclusive follower and only this file descriptor will
receive CEC messages for processing. In addition it will put the
CEC device into passthrough mode, allowing the exclusive follower
to handle most core messages instead of relying on the CEC
framework for that. If someone else is already the exclusive
follower then an attempt to become one will return the ``EBUSY`` error
code. You cannot become a follower if :ref:`CEC_CAP_TRANSMIT <CEC-CAP-TRANSMIT>`
is not set or if :ref:`CEC_MODE_NO_INITIATOR <CEC-MODE-NO-INITIATOR>` was specified,
the ``EINVAL`` error code is returned in that case.
- .. _`CEC-MODE-MONITOR`:
- ``CEC_MODE_MONITOR``
- 0xe0
- Put the file descriptor into monitor mode. Can only be used in
combination with :ref:`CEC_MODE_NO_INITIATOR <CEC-MODE-NO-INITIATOR>`, otherwise EINVAL error
code will be returned. In monitor mode all messages this CEC
device transmits and all messages it receives (both broadcast
messages and directed messages for one its logical addresses) will
be reported. This is very useful for debugging. This is only
allowed if the process has the ``CAP_NET_ADMIN`` capability. If
that is not set, then the ``EPERM`` error code is returned.
- .. _`CEC-MODE-MONITOR-ALL`:
- ``CEC_MODE_MONITOR_ALL``
- 0xf0
- Put the file descriptor into 'monitor all' mode. Can only be used
in combination with :ref:`CEC_MODE_NO_INITIATOR <CEC-MODE-NO-INITIATOR>`, otherwise
the ``EINVAL`` error code will be returned. In 'monitor all' mode all messages
this CEC device transmits and all messages it receives, including
directed messages for other CEC devices will be reported. This is
very useful for debugging, but not all devices support this. This
mode requires that the :ref:`CEC_CAP_MONITOR_ALL <CEC-CAP-MONITOR-ALL>` capability is set,
otherwise the ``EINVAL`` error code is returned. This is only allowed if
the process has the ``CAP_NET_ADMIN`` capability. If that is not
set, then the ``EPERM`` error code is returned.
Core message processing details: Core message processing details:
@ -220,76 +193,58 @@ Core message processing details:
:stub-columns: 0 :stub-columns: 0
:widths: 1 8 :widths: 1 8
* .. _`CEC-MSG-GET-CEC-VERSION`:
- .. _`CEC-MSG-GET-CEC-VERSION`: - ``CEC_MSG_GET_CEC_VERSION``
- When in passthrough mode this message has to be handled by
userspace, otherwise the core will return the CEC version that was
set with :ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`.
* .. _`CEC-MSG-GIVE-DEVICE-VENDOR-ID`:
- ``CEC_MSG_GET_CEC_VERSION`` - ``CEC_MSG_GIVE_DEVICE_VENDOR_ID``
- When in passthrough mode this message has to be handled by
userspace, otherwise the core will return the vendor ID that was
set with :ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`.
* .. _`CEC-MSG-ABORT`:
- When in passthrough mode this message has to be handled by - ``CEC_MSG_ABORT``
userspace, otherwise the core will return the CEC version that was - When in passthrough mode this message has to be handled by
set with :ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`. userspace, otherwise the core will return a feature refused
message as per the specification.
* .. _`CEC-MSG-GIVE-PHYSICAL-ADDR`:
- .. _`CEC-MSG-GIVE-DEVICE-VENDOR-ID`: - ``CEC_MSG_GIVE_PHYSICAL_ADDR``
- When in passthrough mode this message has to be handled by
userspace, otherwise the core will report the current physical
address.
* .. _`CEC-MSG-GIVE-OSD-NAME`:
- ``CEC_MSG_GIVE_DEVICE_VENDOR_ID`` - ``CEC_MSG_GIVE_OSD_NAME``
- When in passthrough mode this message has to be handled by
userspace, otherwise the core will report the current OSD name as
was set with :ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`.
* .. _`CEC-MSG-GIVE-FEATURES`:
- When in passthrough mode this message has to be handled by - ``CEC_MSG_GIVE_FEATURES``
userspace, otherwise the core will return the vendor ID that was - When in passthrough mode this message has to be handled by
set with :ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`. userspace, otherwise the core will report the current features as
was set with :ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`
or the message is ignored if the CEC version was older than 2.0.
* .. _`CEC-MSG-USER-CONTROL-PRESSED`:
- .. _`CEC-MSG-ABORT`: - ``CEC_MSG_USER_CONTROL_PRESSED``
- If :ref:`CEC_CAP_RC <CEC-CAP-RC>` is set, then generate a remote control key
press. This message is always passed on to userspace.
* .. _`CEC-MSG-USER-CONTROL-RELEASED`:
- ``CEC_MSG_ABORT`` - ``CEC_MSG_USER_CONTROL_RELEASED``
- If :ref:`CEC_CAP_RC <CEC-CAP-RC>` is set, then generate a remote control key
release. This message is always passed on to userspace.
* .. _`CEC-MSG-REPORT-PHYSICAL-ADDR`:
- When in passthrough mode this message has to be handled by - ``CEC_MSG_REPORT_PHYSICAL_ADDR``
userspace, otherwise the core will return a feature refused - The CEC framework will make note of the reported physical address
message as per the specification. and then just pass the message on to userspace.
- .. _`CEC-MSG-GIVE-PHYSICAL-ADDR`:
- ``CEC_MSG_GIVE_PHYSICAL_ADDR``
- When in passthrough mode this message has to be handled by
userspace, otherwise the core will report the current physical
address.
- .. _`CEC-MSG-GIVE-OSD-NAME`:
- ``CEC_MSG_GIVE_OSD_NAME``
- When in passthrough mode this message has to be handled by
userspace, otherwise the core will report the current OSD name as
was set with :ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`.
- .. _`CEC-MSG-GIVE-FEATURES`:
- ``CEC_MSG_GIVE_FEATURES``
- When in passthrough mode this message has to be handled by
userspace, otherwise the core will report the current features as
was set with :ref:`ioctl CEC_ADAP_S_LOG_ADDRS <CEC_ADAP_S_LOG_ADDRS>`
or the message is ignored if the CEC version was older than 2.0.
- .. _`CEC-MSG-USER-CONTROL-PRESSED`:
- ``CEC_MSG_USER_CONTROL_PRESSED``
- If :ref:`CEC_CAP_RC <CEC-CAP-RC>` is set, then generate a remote control key
press. This message is always passed on to userspace.
- .. _`CEC-MSG-USER-CONTROL-RELEASED`:
- ``CEC_MSG_USER_CONTROL_RELEASED``
- If :ref:`CEC_CAP_RC <CEC-CAP-RC>` is set, then generate a remote control key
release. This message is always passed on to userspace.
- .. _`CEC-MSG-REPORT-PHYSICAL-ADDR`:
- ``CEC_MSG_REPORT_PHYSICAL_ADDR``
- The CEC framework will make note of the reported physical address
and then just pass the message on to userspace.

View File

@ -86,173 +86,126 @@ result.
:stub-columns: 0 :stub-columns: 0
:widths: 1 1 16 :widths: 1 1 16
* - __u64
- ``tx_ts``
- Timestamp in ns of when the last byte of the message was transmitted.
The timestamp has been taken from the ``CLOCK_MONOTONIC`` clock. To access
the same clock from userspace use :c:func:`clock_gettime`.
* - __u64
- ``rx_ts``
- Timestamp in ns of when the last byte of the message was received.
The timestamp has been taken from the ``CLOCK_MONOTONIC`` clock. To access
the same clock from userspace use :c:func:`clock_gettime`.
* - __u32
- ``len``
- The length of the message. For :ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>` this is filled in
by the application. The driver will fill this in for
:ref:`ioctl CEC_RECEIVE <CEC_RECEIVE>`. For :ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>` it will be
filled in by the driver with the length of the reply message if ``reply`` was set.
* - __u32
- ``timeout``
- The timeout in milliseconds. This is the time the device will wait
for a message to be received before timing out. If it is set to 0,
then it will wait indefinitely when it is called by :ref:`ioctl CEC_RECEIVE <CEC_RECEIVE>`.
If it is 0 and it is called by :ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>`,
then it will be replaced by 1000 if the ``reply`` is non-zero or
ignored if ``reply`` is 0.
* - __u32
- ``sequence``
- A non-zero sequence number is automatically assigned by the CEC framework
for all transmitted messages. It is used by the CEC framework when it queues
the transmit result (when transmit was called in non-blocking mode). This
allows the application to associate the received message with the original
transmit.
* - __u32
- ``flags``
- Flags. See :ref:`cec-msg-flags` for a list of available flags.
* - __u8
- ``tx_status``
- The status bits of the transmitted message. See
:ref:`cec-tx-status` for the possible status values. It is 0 if
this messages was received, not transmitted.
* - __u8
- ``msg[16]``
- The message payload. For :ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>` this is filled in by the
application. The driver will fill this in for :ref:`ioctl CEC_RECEIVE <CEC_RECEIVE>`.
For :ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>` it will be filled in by the driver with
the payload of the reply message if ``timeout`` was set.
* - __u8
- ``reply``
- Wait until this message is replied. If ``reply`` is 0 and the
``timeout`` is 0, then don't wait for a reply but return after
transmitting the message. Ignored by :ref:`ioctl CEC_RECEIVE <CEC_RECEIVE>`.
The case where ``reply`` is 0 (this is the opcode for the Feature Abort
message) and ``timeout`` is non-zero is specifically allowed to make it
possible to send a message and wait up to ``timeout`` milliseconds for a
Feature Abort reply. In this case ``rx_status`` will either be set
to :ref:`CEC_RX_STATUS_TIMEOUT <CEC-RX-STATUS-TIMEOUT>` or
:ref:`CEC_RX_STATUS_FEATURE_ABORT <CEC-RX-STATUS-FEATURE-ABORT>`.
- .. row 1 If the transmitter message is ``CEC_MSG_INITIATE_ARC`` then the ``reply``
values ``CEC_MSG_REPORT_ARC_INITIATED`` and ``CEC_MSG_REPORT_ARC_TERMINATED``
are processed differently: either value will match both possible replies.
The reason is that the ``CEC_MSG_INITIATE_ARC`` message is the only CEC
message that has two possible replies other than Feature Abort. The
``reply`` field will be updated with the actual reply so that it is
synchronized with the contents of the received message.
* - __u8
- ``rx_status``
- The status bits of the received message. See
:ref:`cec-rx-status` for the possible status values. It is 0 if
this message was transmitted, not received, unless this is the
reply to a transmitted message. In that case both ``rx_status``
and ``tx_status`` are set.
* - __u8
- ``tx_status``
- The status bits of the transmitted message. See
:ref:`cec-tx-status` for the possible status values. It is 0 if
this messages was received, not transmitted.
* - __u8
- ``tx_arb_lost_cnt``
- A counter of the number of transmit attempts that resulted in the
Arbitration Lost error. This is only set if the hardware supports
this, otherwise it is always 0. This counter is only valid if the
:ref:`CEC_TX_STATUS_ARB_LOST <CEC-TX-STATUS-ARB-LOST>` status bit is set.
* - __u8
- ``tx_nack_cnt``
- A counter of the number of transmit attempts that resulted in the
Not Acknowledged error. This is only set if the hardware supports
this, otherwise it is always 0. This counter is only valid if the
:ref:`CEC_TX_STATUS_NACK <CEC-TX-STATUS-NACK>` status bit is set.
* - __u8
- ``tx_low_drive_cnt``
- A counter of the number of transmit attempts that resulted in the
Arbitration Lost error. This is only set if the hardware supports
this, otherwise it is always 0. This counter is only valid if the
:ref:`CEC_TX_STATUS_LOW_DRIVE <CEC-TX-STATUS-LOW-DRIVE>` status bit is set.
* - __u8
- ``tx_error_cnt``
- A counter of the number of transmit errors other than Arbitration
Lost or Not Acknowledged. This is only set if the hardware
supports this, otherwise it is always 0. This counter is only
valid if the :ref:`CEC_TX_STATUS_ERROR <CEC-TX-STATUS-ERROR>` status bit is set.
- __u64
- ``tx_ts`` .. _cec-msg-flags:
- Timestamp in ns of when the last byte of the message was transmitted. .. flat-table:: Flags for struct cec_msg
The timestamp has been taken from the ``CLOCK_MONOTONIC`` clock. To access :header-rows: 0
the same clock from userspace use :c:func:`clock_gettime`. :stub-columns: 0
:widths: 3 1 4
- .. row 2 * .. _`CEC-MSG-FL-REPLY-TO-FOLLOWERS`:
- __u64 - ``CEC_MSG_FL_REPLY_TO_FOLLOWERS``
- 1
- ``rx_ts`` - If a CEC transmit expects a reply, then by default that reply is only sent to
the filehandle that called :ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>`. If this
- Timestamp in ns of when the last byte of the message was received. flag is set, then the reply is also sent to all followers, if any. If the
The timestamp has been taken from the ``CLOCK_MONOTONIC`` clock. To access filehandle that called :ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>` is also a
the same clock from userspace use :c:func:`clock_gettime`. follower, then that filehandle will receive the reply twice: once as the
result of the :ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>`, and once via
- .. row 3 :ref:`ioctl CEC_RECEIVE <CEC_RECEIVE>`.
- __u32
- ``len``
- The length of the message. For :ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>` this is filled in
by the application. The driver will fill this in for
:ref:`ioctl CEC_RECEIVE <CEC_RECEIVE>`. For :ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>` it will be
filled in by the driver with the length of the reply message if ``reply`` was set.
- .. row 4
- __u32
- ``timeout``
- The timeout in milliseconds. This is the time the device will wait
for a message to be received before timing out. If it is set to 0,
then it will wait indefinitely when it is called by :ref:`ioctl CEC_RECEIVE <CEC_RECEIVE>`.
If it is 0 and it is called by :ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>`,
then it will be replaced by 1000 if the ``reply`` is non-zero or
ignored if ``reply`` is 0.
- .. row 5
- __u32
- ``sequence``
- A non-zero sequence number is automatically assigned by the CEC framework
for all transmitted messages. It is used by the CEC framework when it queues
the transmit result (when transmit was called in non-blocking mode). This
allows the application to associate the received message with the original
transmit.
- .. row 6
- __u32
- ``flags``
- Flags. No flags are defined yet, so set this to 0.
- .. row 7
- __u8
- ``tx_status``
- The status bits of the transmitted message. See
:ref:`cec-tx-status` for the possible status values. It is 0 if
this messages was received, not transmitted.
- .. row 8
- __u8
- ``msg[16]``
- The message payload. For :ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>` this is filled in by the
application. The driver will fill this in for :ref:`ioctl CEC_RECEIVE <CEC_RECEIVE>`.
For :ref:`ioctl CEC_TRANSMIT <CEC_TRANSMIT>` it will be filled in by the driver with
the payload of the reply message if ``timeout`` was set.
- .. row 8
- __u8
- ``reply``
- Wait until this message is replied. If ``reply`` is 0 and the
``timeout`` is 0, then don't wait for a reply but return after
transmitting the message. Ignored by :ref:`ioctl CEC_RECEIVE <CEC_RECEIVE>`.
The case where ``reply`` is 0 (this is the opcode for the Feature Abort
message) and ``timeout`` is non-zero is specifically allowed to make it
possible to send a message and wait up to ``timeout`` milliseconds for a
Feature Abort reply. In this case ``rx_status`` will either be set
to :ref:`CEC_RX_STATUS_TIMEOUT <CEC-RX-STATUS-TIMEOUT>` or
:ref:`CEC_RX_STATUS_FEATURE_ABORT <CEC-RX-STATUS-FEATURE-ABORT>`.
- .. row 9
- __u8
- ``rx_status``
- The status bits of the received message. See
:ref:`cec-rx-status` for the possible status values. It is 0 if
this message was transmitted, not received, unless this is the
reply to a transmitted message. In that case both ``rx_status``
and ``tx_status`` are set.
- .. row 10
- __u8
- ``tx_status``
- The status bits of the transmitted message. See
:ref:`cec-tx-status` for the possible status values. It is 0 if
this messages was received, not transmitted.
- .. row 11
- __u8
- ``tx_arb_lost_cnt``
- A counter of the number of transmit attempts that resulted in the
Arbitration Lost error. This is only set if the hardware supports
this, otherwise it is always 0. This counter is only valid if the
:ref:`CEC_TX_STATUS_ARB_LOST <CEC-TX-STATUS-ARB-LOST>` status bit is set.
- .. row 12
- __u8
- ``tx_nack_cnt``
- A counter of the number of transmit attempts that resulted in the
Not Acknowledged error. This is only set if the hardware supports
this, otherwise it is always 0. This counter is only valid if the
:ref:`CEC_TX_STATUS_NACK <CEC-TX-STATUS-NACK>` status bit is set.
- .. row 13
- __u8
- ``tx_low_drive_cnt``
- A counter of the number of transmit attempts that resulted in the
Arbitration Lost error. This is only set if the hardware supports
this, otherwise it is always 0. This counter is only valid if the
:ref:`CEC_TX_STATUS_LOW_DRIVE <CEC-TX-STATUS-LOW-DRIVE>` status bit is set.
- .. row 14
- __u8
- ``tx_error_cnt``
- A counter of the number of transmit errors other than Arbitration
Lost or Not Acknowledged. This is only set if the hardware
supports this, otherwise it is always 0. This counter is only
valid if the :ref:`CEC_TX_STATUS_ERROR <CEC-TX-STATUS-ERROR>` status bit is set.
.. tabularcolumns:: |p{5.6cm}|p{0.9cm}|p{11.0cm}| .. tabularcolumns:: |p{5.6cm}|p{0.9cm}|p{11.0cm}|
@ -264,64 +217,46 @@ result.
:stub-columns: 0 :stub-columns: 0
:widths: 3 1 16 :widths: 3 1 16
* .. _`CEC-TX-STATUS-OK`:
- .. _`CEC-TX-STATUS-OK`: - ``CEC_TX_STATUS_OK``
- 0x01
- The message was transmitted successfully. This is mutually
exclusive with :ref:`CEC_TX_STATUS_MAX_RETRIES <CEC-TX-STATUS-MAX-RETRIES>`. Other bits can still
be set if earlier attempts met with failure before the transmit
was eventually successful.
* .. _`CEC-TX-STATUS-ARB-LOST`:
- ``CEC_TX_STATUS_OK`` - ``CEC_TX_STATUS_ARB_LOST``
- 0x02
- CEC line arbitration was lost.
* .. _`CEC-TX-STATUS-NACK`:
- 0x01 - ``CEC_TX_STATUS_NACK``
- 0x04
- Message was not acknowledged.
* .. _`CEC-TX-STATUS-LOW-DRIVE`:
- The message was transmitted successfully. This is mutually - ``CEC_TX_STATUS_LOW_DRIVE``
exclusive with :ref:`CEC_TX_STATUS_MAX_RETRIES <CEC-TX-STATUS-MAX-RETRIES>`. Other bits can still - 0x08
be set if earlier attempts met with failure before the transmit - Low drive was detected on the CEC bus. This indicates that a
was eventually successful. follower detected an error on the bus and requests a
retransmission.
* .. _`CEC-TX-STATUS-ERROR`:
- .. _`CEC-TX-STATUS-ARB-LOST`: - ``CEC_TX_STATUS_ERROR``
- 0x10
- Some error occurred. This is used for any errors that do not fit
the previous two, either because the hardware could not tell which
error occurred, or because the hardware tested for other
conditions besides those two.
* .. _`CEC-TX-STATUS-MAX-RETRIES`:
- ``CEC_TX_STATUS_ARB_LOST`` - ``CEC_TX_STATUS_MAX_RETRIES``
- 0x20
- 0x02 - The transmit failed after one or more retries. This status bit is
mutually exclusive with :ref:`CEC_TX_STATUS_OK <CEC-TX-STATUS-OK>`. Other bits can still
- CEC line arbitration was lost. be set to explain which failures were seen.
- .. _`CEC-TX-STATUS-NACK`:
- ``CEC_TX_STATUS_NACK``
- 0x04
- Message was not acknowledged.
- .. _`CEC-TX-STATUS-LOW-DRIVE`:
- ``CEC_TX_STATUS_LOW_DRIVE``
- 0x08
- Low drive was detected on the CEC bus. This indicates that a
follower detected an error on the bus and requests a
retransmission.
- .. _`CEC-TX-STATUS-ERROR`:
- ``CEC_TX_STATUS_ERROR``
- 0x10
- Some error occurred. This is used for any errors that do not fit
the previous two, either because the hardware could not tell which
error occurred, or because the hardware tested for other
conditions besides those two.
- .. _`CEC-TX-STATUS-MAX-RETRIES`:
- ``CEC_TX_STATUS_MAX_RETRIES``
- 0x20
- The transmit failed after one or more retries. This status bit is
mutually exclusive with :ref:`CEC_TX_STATUS_OK <CEC-TX-STATUS-OK>`. Other bits can still
be set to explain which failures were seen.
.. tabularcolumns:: |p{5.6cm}|p{0.9cm}|p{11.0cm}| .. tabularcolumns:: |p{5.6cm}|p{0.9cm}|p{11.0cm}|
@ -333,32 +268,23 @@ result.
:stub-columns: 0 :stub-columns: 0
:widths: 3 1 16 :widths: 3 1 16
* .. _`CEC-RX-STATUS-OK`:
- .. _`CEC-RX-STATUS-OK`: - ``CEC_RX_STATUS_OK``
- 0x01
- The message was received successfully.
* .. _`CEC-RX-STATUS-TIMEOUT`:
- ``CEC_RX_STATUS_OK`` - ``CEC_RX_STATUS_TIMEOUT``
- 0x02
- The reply to an earlier transmitted message timed out.
* .. _`CEC-RX-STATUS-FEATURE-ABORT`:
- 0x01 - ``CEC_RX_STATUS_FEATURE_ABORT``
- 0x04
- The message was received successfully. - The message was received successfully but the reply was
``CEC_MSG_FEATURE_ABORT``. This status is only set if this message
- .. _`CEC-RX-STATUS-TIMEOUT`: was the reply to an earlier transmitted message.
- ``CEC_RX_STATUS_TIMEOUT``
- 0x02
- The reply to an earlier transmitted message timed out.
- .. _`CEC-RX-STATUS-FEATURE-ABORT`:
- ``CEC_RX_STATUS_FEATURE_ABORT``
- 0x04
- The message was received successfully but the reply was
``CEC_MSG_FEATURE_ABORT``. This status is only set if this message
was the reply to an earlier transmitted message.

View File

@ -312,21 +312,20 @@ more menu type controls.
.. _enum_all_controls: .. _enum_all_controls:
Example: Enumerating all user controls Example: Enumerating all controls
====================================== =================================
.. code-block:: c .. code-block:: c
struct v4l2_queryctrl queryctrl; struct v4l2_queryctrl queryctrl;
struct v4l2_querymenu querymenu; struct v4l2_querymenu querymenu;
static void enumerate_menu(void) static void enumerate_menu(__u32 id)
{ {
printf(" Menu items:\\n"); printf(" Menu items:\\n");
memset(&querymenu, 0, sizeof(querymenu)); memset(&querymenu, 0, sizeof(querymenu));
querymenu.id = queryctrl.id; querymenu.id = id;
for (querymenu.index = queryctrl.minimum; for (querymenu.index = queryctrl.minimum;
querymenu.index <= queryctrl.maximum; querymenu.index <= queryctrl.maximum;
@ -337,6 +336,55 @@ Example: Enumerating all user controls
} }
} }
memset(&queryctrl, 0, sizeof(queryctrl));
queryctrl.id = V4L2_CTRL_FLAG_NEXT_CTRL;
while (0 == ioctl(fd, VIDIOC_QUERYCTRL, &queryctrl)) {
if (!(queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)) {
printf("Control %s\\n", queryctrl.name);
if (queryctrl.type == V4L2_CTRL_TYPE_MENU)
enumerate_menu(queryctrl.id);
}
queryctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
}
if (errno != EINVAL) {
perror("VIDIOC_QUERYCTRL");
exit(EXIT_FAILURE);
}
Example: Enumerating all controls including compound controls
=============================================================
.. code-block:: c
struct v4l2_query_ext_ctrl query_ext_ctrl;
memset(&query_ext_ctrl, 0, sizeof(query_ext_ctrl));
query_ext_ctrl.id = V4L2_CTRL_FLAG_NEXT_CTRL | V4L2_CTRL_FLAG_NEXT_COMPOUND;
while (0 == ioctl(fd, VIDIOC_QUERY_EXT_CTRL, &query_ext_ctrl)) {
if (!(query_ext_ctrl.flags & V4L2_CTRL_FLAG_DISABLED)) {
printf("Control %s\\n", query_ext_ctrl.name);
if (query_ext_ctrl.type == V4L2_CTRL_TYPE_MENU)
enumerate_menu(query_ext_ctrl.id);
}
query_ext_ctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL | V4L2_CTRL_FLAG_NEXT_COMPOUND;
}
if (errno != EINVAL) {
perror("VIDIOC_QUERY_EXT_CTRL");
exit(EXIT_FAILURE);
}
Example: Enumerating all user controls (old style)
==================================================
.. code-block:: c
memset(&queryctrl, 0, sizeof(queryctrl)); memset(&queryctrl, 0, sizeof(queryctrl));
for (queryctrl.id = V4L2_CID_BASE; for (queryctrl.id = V4L2_CID_BASE;
@ -349,7 +397,7 @@ Example: Enumerating all user controls
printf("Control %s\\n", queryctrl.name); printf("Control %s\\n", queryctrl.name);
if (queryctrl.type == V4L2_CTRL_TYPE_MENU) if (queryctrl.type == V4L2_CTRL_TYPE_MENU)
enumerate_menu(); enumerate_menu(queryctrl.id);
} else { } else {
if (errno == EINVAL) if (errno == EINVAL)
continue; continue;
@ -368,7 +416,7 @@ Example: Enumerating all user controls
printf("Control %s\\n", queryctrl.name); printf("Control %s\\n", queryctrl.name);
if (queryctrl.type == V4L2_CTRL_TYPE_MENU) if (queryctrl.type == V4L2_CTRL_TYPE_MENU)
enumerate_menu(); enumerate_menu(queryctrl.id);
} else { } else {
if (errno == EINVAL) if (errno == EINVAL)
break; break;
@ -379,32 +427,6 @@ Example: Enumerating all user controls
} }
Example: Enumerating all user controls (alternative)
====================================================
.. code-block:: c
memset(&queryctrl, 0, sizeof(queryctrl));
queryctrl.id = V4L2_CTRL_CLASS_USER | V4L2_CTRL_FLAG_NEXT_CTRL;
while (0 == ioctl(fd, VIDIOC_QUERYCTRL, &queryctrl)) {
if (V4L2_CTRL_ID2CLASS(queryctrl.id) != V4L2_CTRL_CLASS_USER)
break;
if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
continue;
printf("Control %s\\n", queryctrl.name);
if (queryctrl.type == V4L2_CTRL_TYPE_MENU)
enumerate_menu();
queryctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
}
if (errno != EINVAL) {
perror("VIDIOC_QUERYCTRL");
exit(EXIT_FAILURE);
}
Example: Changing controls Example: Changing controls
========================== ==========================

View File

@ -26,7 +26,7 @@ parameters
The MPEG controls actually support many more codecs than The MPEG controls actually support many more codecs than
just MPEG. See :ref:`mpeg-controls`. just MPEG. See :ref:`mpeg-controls`.
Memory-to-memory devices can often be used as a shared resource: you can Memory-to-memory devices function as a shared resource: you can
open the video node multiple times, each application setting up their open the video node multiple times, each application setting up their
own codec properties that are local to the file handle, and each can use own codec properties that are local to the file handle, and each can use
it independently from the others. The driver will arbitrate access to it independently from the others. The driver will arbitrate access to

View File

@ -2846,7 +2846,7 @@ JPEG Control IDs
input image is sampled, in respect to maximum sample rate in each input image is sampled, in respect to maximum sample rate in each
spatial dimension. See :ref:`itu-t81`, clause A.1.1. for more spatial dimension. See :ref:`itu-t81`, clause A.1.1. for more
details. The ``V4L2_CID_JPEG_CHROMA_SUBSAMPLING`` control determines details. The ``V4L2_CID_JPEG_CHROMA_SUBSAMPLING`` control determines
how Cb and Cr components are downsampled after coverting an input how Cb and Cr components are downsampled after converting an input
image from RGB to Y'CbCr color space. image from RGB to Y'CbCr color space.
.. tabularcolumns:: |p{7.0cm}|p{10.5cm}| .. tabularcolumns:: |p{7.0cm}|p{10.5cm}|
@ -3017,6 +3017,10 @@ Image Process Control IDs
test pattern images. These hardware specific test patterns can be test pattern images. These hardware specific test patterns can be
used to test if a device is working properly. used to test if a device is working properly.
``V4L2_CID_DEINTERLACING_MODE (menu)``
The video deinterlacing mode (such as Bob, Weave, ...). The menu items are
driver specific and are documented in :ref:`v4l-drivers`.
.. _dv-controls: .. _dv-controls:

View File

@ -0,0 +1,19 @@
.. -*- coding: utf-8; mode: rst -*-
.. _hsv-formats:
***********
HSV Formats
***********
These formats store the color information of the image
in a geometrical representation. The colors are mapped into a
cylinder, where the angle is the HUE, the height is the VALUE
and the distance to the center is the SATURATION. This is a very
useful format for image segmentation algorithms.
.. toctree::
:maxdepth: 1
pixfmt-packed-hsv

View File

@ -121,6 +121,11 @@ Single-planar format structure
- This information supplements the ``colorspace`` and must be set by - This information supplements the ``colorspace`` and must be set by
the driver for capture streams and by the application for output the driver for capture streams and by the application for output
streams, see :ref:`colorspaces`. streams, see :ref:`colorspaces`.
* - enum :c:type:`v4l2_hsv_encoding`
- ``hsv_enc``
- This information supplements the ``colorspace`` and must be set by
the driver for capture streams and by the application for output
streams, see :ref:`colorspaces`.
* - enum :c:type:`v4l2_quantization` * - enum :c:type:`v4l2_quantization`
- ``quantization`` - ``quantization``
- This information supplements the ``colorspace`` and must be set by - This information supplements the ``colorspace`` and must be set by

View File

@ -78,6 +78,11 @@ describing all planes of that format.
- This information supplements the ``colorspace`` and must be set by - This information supplements the ``colorspace`` and must be set by
the driver for capture streams and by the application for output the driver for capture streams and by the application for output
streams, see :ref:`colorspaces`. streams, see :ref:`colorspaces`.
* - enum :c:type:`v4l2_hsv_encoding`
- ``hsv_enc``
- This information supplements the ``colorspace`` and must be set by
the driver for capture streams and by the application for output
streams, see :ref:`colorspaces`.
* - enum :c:type:`v4l2_quantization` * - enum :c:type:`v4l2_quantization`
- ``quantization`` - ``quantization``
- This information supplements the ``colorspace`` and must be set by - This information supplements the ``colorspace`` and must be set by

View File

@ -19,9 +19,16 @@ colorspace field of struct :c:type:`v4l2_pix_format`
or struct :c:type:`v4l2_pix_format_mplane` or struct :c:type:`v4l2_pix_format_mplane`
needs to be filled in. needs to be filled in.
.. note:: .. _hsv-colorspace:
The default R'G'B' quantization is full range for all On :ref:`HSV formats <hsv-formats>` the *Hue* is defined as the angle on
the cylindrical color representation. Usually this angle is measured in
degrees, i.e. 0-360. When we map this angle value into 8 bits, there are
two basic ways to do it: Divide the angular value by 2 (0-179), or use the
whole range, 0-255, dividing the angular value by 1.41. The enum
:c:type:`v4l2_hsv_encoding` specifies which encoding is used.
.. note:: The default R'G'B' quantization is full range for all
colorspaces except for BT.2020 which uses limited range R'G'B' colorspaces except for BT.2020 which uses limited range R'G'B'
quantization. quantization.
@ -123,6 +130,24 @@ needs to be filled in.
.. c:type:: v4l2_hsv_encoding
.. tabularcolumns:: |p{6.5cm}|p{11.0cm}|
.. flat-table:: V4L2 HSV Encodings
:header-rows: 1
:stub-columns: 0
* - Identifier
- Details
* - ``V4L2_HSV_ENC_180``
- For the Hue, each LSB is two degrees.
* - ``V4L2_HSV_ENC_256``
- For the Hue, the 360 degrees are mapped into 8 bits, i.e. each
LSB is roughly 1.41 degrees.
.. c:type:: v4l2_quantization .. c:type:: v4l2_quantization
.. tabularcolumns:: |p{6.5cm}|p{11.0cm}| .. tabularcolumns:: |p{6.5cm}|p{11.0cm}|
@ -136,7 +161,7 @@ needs to be filled in.
* - ``V4L2_QUANTIZATION_DEFAULT`` * - ``V4L2_QUANTIZATION_DEFAULT``
- Use the default quantization encoding as defined by the - Use the default quantization encoding as defined by the
colorspace. This is always full range for R'G'B' (except for the colorspace. This is always full range for R'G'B' (except for the
BT.2020 colorspace) and usually limited range for Y'CbCr. BT.2020 colorspace) and HSV. It is usually limited range for Y'CbCr.
* - ``V4L2_QUANTIZATION_FULL_RANGE`` * - ``V4L2_QUANTIZATION_FULL_RANGE``
- Use the full range quantization encoding. I.e. the range [0…1] is - Use the full range quantization encoding. I.e. the range [0…1] is
mapped to [0…255] (with possible clipping to [1…254] to avoid the mapped to [0…255] (with possible clipping to [1…254] to avoid the

View File

@ -85,3 +85,8 @@ Compressed Formats
- ``V4L2_PIX_FMT_VP8`` - ``V4L2_PIX_FMT_VP8``
- 'VP80' - 'VP80'
- VP8 video elementary stream. - VP8 video elementary stream.
* .. _V4L2-PIX-FMT-VP9:
- ``V4L2_PIX_FMT_VP9``
- 'VP90'
- VP9 video elementary stream.

View File

@ -0,0 +1,157 @@
.. -*- coding: utf-8; mode: rst -*-
.. _packed-hsv:
******************
Packed HSV formats
******************
Description
===========
The *hue* (h) is measured in degrees, the equivalence between degrees and LSBs
depends on the hsv-encoding used, see :ref:`colorspaces`.
The *saturation* (s) and the *value* (v) are measured in percentage of the
cylinder: 0 being the smallest value and 255 the maximum.
The values are packed in 24 or 32 bit formats.
.. raw:: latex
\newline\begin{adjustbox}{width=\columnwidth}
.. tabularcolumns:: |p{4.2cm}|p{1.0cm}|p{0.7cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.2cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.2cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.2cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{0.4cm}|p{1.7cm}|
.. _packed-hsv-formats:
.. flat-table:: Packed HSV Image Formats
:header-rows: 2
:stub-columns: 0
* - Identifier
- Code
-
- :cspan:`7` Byte 0 in memory
-
- :cspan:`7` Byte 1
-
- :cspan:`7` Byte 2
-
- :cspan:`7` Byte 3
* -
-
- Bit
- 7
- 6
- 5
- 4
- 3
- 2
- 1
- 0
-
- 7
- 6
- 5
- 4
- 3
- 2
- 1
- 0
-
- 7
- 6
- 5
- 4
- 3
- 2
- 1
- 0
-
- 7
- 6
- 5
- 4
- 3
- 2
- 1
- 0
* .. _V4L2-PIX-FMT-HSV32:
- ``V4L2_PIX_FMT_HSV32``
- 'HSV4'
-
-
-
-
-
-
-
-
-
-
- h\ :sub:`7`
- h\ :sub:`6`
- h\ :sub:`5`
- h\ :sub:`4`
- h\ :sub:`3`
- h\ :sub:`2`
- h\ :sub:`1`
- h\ :sub:`0`
-
- s\ :sub:`7`
- s\ :sub:`6`
- s\ :sub:`5`
- s\ :sub:`4`
- s\ :sub:`3`
- s\ :sub:`2`
- s\ :sub:`1`
- s\ :sub:`0`
-
- v\ :sub:`7`
- v\ :sub:`6`
- v\ :sub:`5`
- v\ :sub:`4`
- v\ :sub:`3`
- v\ :sub:`2`
- v\ :sub:`1`
- v\ :sub:`0`
* .. _V4L2-PIX-FMT-HSV24:
- ``V4L2_PIX_FMT_HSV24``
- 'HSV3'
-
- h\ :sub:`7`
- h\ :sub:`6`
- h\ :sub:`5`
- h\ :sub:`4`
- h\ :sub:`3`
- h\ :sub:`2`
- h\ :sub:`1`
- h\ :sub:`0`
-
- s\ :sub:`7`
- s\ :sub:`6`
- s\ :sub:`5`
- s\ :sub:`4`
- s\ :sub:`3`
- s\ :sub:`2`
- s\ :sub:`1`
- s\ :sub:`0`
-
- v\ :sub:`7`
- v\ :sub:`6`
- v\ :sub:`5`
- v\ :sub:`4`
- v\ :sub:`3`
- v\ :sub:`2`
- v\ :sub:`1`
- v\ :sub:`0`
-
-
.. raw:: latex
\end{adjustbox}\newline\newline
Bit 7 is the most significant bit.

View File

@ -234,7 +234,15 @@ please make a proposal on the linux-media mailing list.
repeated for each line, i.e. the number of entries in the pointer repeated for each line, i.e. the number of entries in the pointer
array. Anything what's in between the UYVY lines is JPEG data and array. Anything what's in between the UYVY lines is JPEG data and
should be concatenated to form the JPEG stream. should be concatenated to form the JPEG stream.
* .. _V4L2-PIX-FMT-MT21C:
- ``V4L2_PIX_FMT_MT21C``
- 'MT21'
- Compressed two-planar YVU420 format used by Mediatek MT8173.
The compression is lossless.
It is an opaque intermediate format and the MDP hardware must be
used to convert ``V4L2_PIX_FMT_MT21C`` to ``V4L2_PIX_FMT_NV12M``,
``V4L2_PIX_FMT_YUV420M`` or ``V4L2_PIX_FMT_YVU420``.
.. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}| .. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}|

View File

@ -12,9 +12,9 @@ RGB Formats
pixfmt-packed-rgb pixfmt-packed-rgb
pixfmt-srggb8 pixfmt-srggb8
pixfmt-sbggr16
pixfmt-srggb10 pixfmt-srggb10
pixfmt-srggb10p pixfmt-srggb10p
pixfmt-srggb10alaw8 pixfmt-srggb10alaw8
pixfmt-srggb10dpcm8 pixfmt-srggb10dpcm8
pixfmt-srggb12 pixfmt-srggb12
pixfmt-srggb16

View File

@ -28,7 +28,7 @@ bits of each pixel, in the same order.
Each n-pixel row contains n/2 green samples and n/2 blue or red samples, Each n-pixel row contains n/2 green samples and n/2 blue or red samples,
with alternating green-red and green-blue rows. They are conventionally with alternating green-red and green-blue rows. They are conventionally
described as GRGR... BGBG..., RGRG... GBGB..., etc. Below is an example described as GRGR... BGBG..., RGRG... GBGB..., etc. Below is an example
of one of these formats: of a small V4L2_PIX_FMT_SBGGR10P image:
**Byte Order.** **Byte Order.**
Each cell is one byte. Each cell is one byte.

View File

@ -26,7 +26,7 @@ high bits filled with zeros. Each n-pixel row contains n/2 green samples
and n/2 blue or red samples, with alternating red and blue rows. Bytes and n/2 blue or red samples, with alternating red and blue rows. Bytes
are stored in memory in little endian order. They are conventionally are stored in memory in little endian order. They are conventionally
described as GRGR... BGBG..., RGRG... GBGB..., etc. Below is an example described as GRGR... BGBG..., RGRG... GBGB..., etc. Below is an example
of one of these formats: of a small V4L2_PIX_FMT_SBGGR12 image:
**Byte Order.** **Byte Order.**
Each cell is one byte, the 4 most significant bits in the high bytes are Each cell is one byte, the 4 most significant bits in the high bytes are

View File

@ -1,21 +1,28 @@
.. -*- coding: utf-8; mode: rst -*- .. -*- coding: utf-8; mode: rst -*-
.. _V4L2-PIX-FMT-SBGGR16: .. _V4L2-PIX-FMT-SRGGB16:
.. _v4l2-pix-fmt-sbggr16:
.. _v4l2-pix-fmt-sgbrg16:
.. _v4l2-pix-fmt-sgrbg16:
*****************************
V4L2_PIX_FMT_SBGGR16 ('BYR2')
*****************************
Bayer RGB format ***************************************************************************************************************************
V4L2_PIX_FMT_SRGGB16 ('RG16'), V4L2_PIX_FMT_SGRBG16 ('GR16'), V4L2_PIX_FMT_SGBRG16 ('GB16'), V4L2_PIX_FMT_SBGGR16 ('BYR2'),
***************************************************************************************************************************
16-bit Bayer formats
Description Description
=========== ===========
This format is similar to These four pixel formats are raw sRGB / Bayer formats with 16 bits per
:ref:`V4L2_PIX_FMT_SBGGR8 <V4L2-PIX-FMT-SBGGR8>`, except each pixel sample. Each sample is stored in a 16-bit word. Each n-pixel row contains
has a depth of 16 bits. The least significant byte is stored at lower n/2 green samples and n/2 blue or red samples, with alternating red and blue
memory addresses (little-endian). rows. Bytes are stored in memory in little endian order. They are
conventionally described as GRGR... BGBG..., RGRG... GBGB..., etc. Below is
an example of a small V4L2_PIX_FMT_SBGGR16 image:
**Byte Order.** **Byte Order.**
Each cell is one byte. Each cell is one byte.

View File

@ -20,7 +20,7 @@ These four pixel formats are raw sRGB / Bayer formats with 8 bits per
sample. Each sample is stored in a byte. Each n-pixel row contains n/2 sample. Each sample is stored in a byte. Each n-pixel row contains n/2
green samples and n/2 blue or red samples, with alternating red and green samples and n/2 blue or red samples, with alternating red and
blue rows. They are conventionally described as GRGR... BGBG..., blue rows. They are conventionally described as GRGR... BGBG...,
RGRG... GBGB..., etc. Below is an example of one of these formats: RGRG... GBGB..., etc. Below is an example of a small V4L2_PIX_FMT_SBGGR8 image:
**Byte Order.** **Byte Order.**
Each cell is one byte. Each cell is one byte.

View File

@ -29,6 +29,7 @@ see also :ref:`VIDIOC_G_FBUF <VIDIOC_G_FBUF>`.)
pixfmt-indexed pixfmt-indexed
pixfmt-rgb pixfmt-rgb
yuv-formats yuv-formats
hsv-formats
depth-formats depth-formats
pixfmt-013 pixfmt-013
sdr-formats sdr-formats

View File

@ -7,9 +7,9 @@
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="43cm" width="42.799767cm"
height="10cm" height="9.9348345cm"
viewBox="-194 128 844 196" viewBox="-194 128 840.06984 194.72276"
id="svg2" id="svg2"
version="1.1" version="1.1"
inkscape:version="0.91 r13725" inkscape:version="0.91 r13725"
@ -22,6 +22,7 @@
<dc:format>image/svg+xml</dc:format> <dc:format>image/svg+xml</dc:format>
<dc:type <dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work> </cc:Work>
</rdf:RDF> </rdf:RDF>
</metadata> </metadata>
@ -40,23 +41,27 @@
inkscape:window-height="997" inkscape:window-height="997"
id="namedview96" id="namedview96"
showgrid="false" showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.3649199" inkscape:zoom="0.3649199"
inkscape:cx="767.29168" inkscape:cx="764.40286"
inkscape:cy="177.16535" inkscape:cy="176.91347"
inkscape:window-x="1920" inkscape:window-x="1920"
inkscape:window-y="30" inkscape:window-y="30"
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:current-layer="svg2" /> inkscape:current-layer="svg2" />
<rect <rect
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
x="-8" x="-9.6002426"
y="130" y="128.86047"
width="469.774" width="469.77399"
height="193" height="193"
id="rect4" /> id="rect4" />
<g <g
id="g6" id="g6"
style=""> transform="translate(-1.6002426,-1.1395339)">
<rect <rect
style="fill:#ffffff" style="fill:#ffffff"
x="4.5" x="4.5"
@ -65,7 +70,7 @@
height="104" height="104"
id="rect8" /> id="rect8" />
<rect <rect
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#a52a2a" style="fill:none;fill-opacity:0;stroke:#a52a2a;stroke-width:2"
x="4.5" x="4.5"
y="189" y="189"
width="159" width="159"
@ -74,7 +79,7 @@
</g> </g>
<g <g
id="g12" id="g12"
style=""> transform="translate(-1.6002426,-1.1395339)">
<rect <rect
style="fill:#ffffff" style="fill:#ffffff"
x="63.5" x="63.5"
@ -83,7 +88,7 @@
height="77" height="77"
id="rect14" /> id="rect14" />
<rect <rect
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#0000ff" style="fill:none;fill-opacity:0;stroke:#0000ff;stroke-width:2"
x="63.5" x="63.5"
y="211" y="211"
width="94" width="94"
@ -91,223 +96,207 @@
id="rect16" /> id="rect16" />
</g> </g>
<text <text
style="fill:#0000ff;text-anchor:start;font-size:12.8;font-family:sans-serif;font-style:normal;font-weight:normal;-inkscape-font-specification:sans-serif;font-stretch:normal;font-variant:normal;" style="font-style:normal;font-weight:normal;font-size:12.80000019px;font-family:sanserif;text-anchor:start;fill:#0000ff"
x="74.5" x="72.899757"
y="227.75" y="226.61047"
id="text18"> id="text18">
<tspan <tspan
x="74.5" x="72.899757"
y="227.75" y="226.61047"
id="tspan20" id="tspan20">sink</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">sink</tspan>
<tspan <tspan
x="74.5" x="72.899757"
y="243.75" y="242.61047"
id="tspan22" id="tspan22">crop</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">crop</tspan>
<tspan <tspan
x="74.5" x="72.899757"
y="259.75" y="258.61047"
id="tspan24" id="tspan24">selection</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">selection</tspan>
</text> </text>
<text <text
style="fill:#000000;text-anchor:start;font-size:12.8;font-family:sans-serif;font-style:normal;font-weight:normal;-inkscape-font-specification:sans-serif;font-stretch:normal;font-variant:normal;" style="font-style:normal;font-weight:normal;font-size:12.80000019px;font-family:sanserif;text-anchor:start;fill:#000000"
x="29.5" x="27.899757"
y="158" y="156.86047"
id="text26"> id="text26">
<tspan <tspan
x="29.5" x="27.899757"
y="158" y="156.86047"
id="tspan28" id="tspan28" />
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;" />
</text> </text>
<text <text
style="fill:#a52a2a;text-anchor:start;font-size:12.8;font-family:sans-serif;font-style:normal;font-weight:normal;-inkscape-font-specification:sans-serif;font-stretch:normal;font-variant:normal;" style="font-style:normal;font-weight:normal;font-size:12.80000019px;font-family:sanserif;text-anchor:start;fill:#a52a2a"
x="8.53836" x="6.938117"
y="157.914" y="156.77448"
id="text30"> id="text30">
<tspan <tspan
x="8.53836" x="6.938117"
y="157.914" y="156.77448"
id="tspan32" id="tspan32">sink media</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">sink media</tspan>
<tspan <tspan
x="8.53836" x="6.938117"
y="173.914" y="172.77448"
id="tspan34" id="tspan34">bus format</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">bus format</tspan>
</text> </text>
<text <text
style="fill:#8b6914;text-anchor:start;font-size:12.8;font-family:sans-serif;font-style:normal;font-weight:normal;-inkscape-font-specification:sans-serif;font-stretch:normal;font-variant:normal;" style="font-style:normal;font-weight:normal;font-size:12.80000019px;font-family:sanserif;text-anchor:start;fill:#8b6914"
x="349.774" x="348.17374"
y="155" y="153.86047"
id="text36"> id="text36">
<tspan <tspan
x="349.774" x="348.17374"
y="155" y="153.86047"
id="tspan38" id="tspan38">source media</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">source media</tspan>
<tspan <tspan
x="349.774" x="348.17374"
y="171" y="169.86047"
id="tspan40" id="tspan40">bus format</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">bus format</tspan>
</text> </text>
<g <g
id="g42" id="g42"
style=""> transform="translate(-1.6002426,-1.1395339)">
<rect <rect
style="fill:#ffffff" style="fill:#ffffff"
x="350.488" x="350.48801"
y="190.834" y="190.834"
width="93.2863" width="93.286301"
height="75.166" height="75.166"
id="rect44" /> id="rect44" />
<rect <rect
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#8b6914" style="fill:none;fill-opacity:0;stroke:#8b6914;stroke-width:2"
x="350.488" x="350.48801"
y="190.834" y="190.834"
width="93.2863" width="93.286301"
height="75.166" height="75.166"
id="rect46" /> id="rect46" />
</g> </g>
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke-dasharray:4;stroke:#e60505" style="fill:none;fill-opacity:0;stroke:#e60505;stroke-width:2;stroke-dasharray:4"
x1="350.488" x1="348.88776"
y1="266" y1="264.86047"
x2="63.5" x2="61.899757"
y2="288" y2="286.86047"
id="line48" /> id="line48" />
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke-dasharray:4;stroke:#e60505" style="fill:none;fill-opacity:0;stroke:#e60505;stroke-width:2;stroke-dasharray:4"
x1="350.488" x1="348.88776"
y1="190.834" y1="189.69447"
x2="63.5" x2="61.899757"
y2="211" y2="209.86047"
id="line50" /> id="line50" />
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke-dasharray:4;stroke:#e60505" style="fill:none;fill-opacity:0;stroke:#e60505;stroke-width:2;stroke-dasharray:4"
x1="443.774" x1="442.17374"
y1="266" y1="264.86047"
x2="157.5" x2="155.89977"
y2="288" y2="286.86047"
id="line52" /> id="line52" />
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke-dasharray:4;stroke:#e60505" style="fill:none;fill-opacity:0;stroke:#e60505;stroke-width:2;stroke-dasharray:4"
x1="443.774" x1="442.17374"
y1="190.834" y1="189.69447"
x2="157.5" x2="155.89977"
y2="211" y2="209.86047"
id="line54" /> id="line54" />
<g <g
id="g56" id="g56"
style=""> transform="translate(-1.6002426,-1.1395339)">
<ellipse <circle
style="fill:#ffffff" style="fill:#ffffff"
cx="473.1" cx="473.10001"
cy="219.984" cy="219.98399"
rx="8.5" id="ellipse58"
ry="8.5" r="8.5" />
id="ellipse58" /> <circle
<ellipse style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" cx="473.10001"
cx="473.1" cy="219.98399"
cy="219.984" id="ellipse60"
rx="8.5" r="8.5" />
ry="8.5" <circle
id="ellipse60" /> style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
<ellipse cx="473.10001"
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" cy="219.98399"
cx="473.1" id="ellipse62"
cy="219.984" r="8.5" />
rx="8.5"
ry="8.5"
id="ellipse62" />
</g> </g>
<g <g
id="g64" id="g64"
style=""> transform="translate(-1.6002426,-1.1395339)">
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
x1="481.6" x1="481.60001"
y1="219.984" y1="219.98399"
x2="637.934" x2="637.93402"
y2="220.012" y2="220.01199"
id="line66" /> id="line66" />
<polygon <polygon
style="fill:#000000" style="fill:#000000"
points="645.434,220.014 635.433,225.012 637.934,220.012 635.435,215.012 " points="635.435,215.012 645.434,220.014 635.433,225.012 637.934,220.012 "
id="polygon68" /> id="polygon68" />
<polygon <polygon
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
points="645.434,220.014 635.433,225.012 637.934,220.012 635.435,215.012 " points="635.435,215.012 645.434,220.014 635.433,225.012 637.934,220.012 "
id="polygon70" /> id="polygon70" />
</g> </g>
<text <text
style="fill:#000000;text-anchor:start;font-size:12.8;font-family:sans-serif;font-style:normal;font-weight:normal;-inkscape-font-specification:sans-serif;font-stretch:normal;font-variant:normal;" style="font-style:normal;font-weight:normal;font-size:12.80000019px;font-family:sanserif;text-anchor:start;fill:#000000"
x="506.908" x="505.30774"
y="209.8" y="208.66048"
id="text72"> id="text72">
<tspan <tspan
x="506.908" x="505.30774"
y="209.8" y="208.66048"
id="tspan74" id="tspan74">pad 1 (source)</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">pad 1 (source)</tspan>
</text> </text>
<g <g
id="g76" id="g76"
style=""> transform="translate(-1.6002426,-1.1395339)">
<ellipse <circle
style="fill:#ffffff" style="fill:#ffffff"
cx="-20.3982" cx="-20.398199"
cy="241.512" cy="241.51199"
rx="8.5" id="ellipse78"
ry="8.5" r="8.5" />
id="ellipse78" /> <circle
<ellipse style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" cx="-20.398199"
cx="-20.3982" cy="241.51199"
cy="241.512" id="ellipse80"
rx="8.5" r="8.5" />
ry="8.5" <circle
id="ellipse80" /> style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
<ellipse cx="-20.398199"
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" cy="241.51199"
cx="-20.3982" id="ellipse82"
cy="241.512" r="8.5" />
rx="8.5"
ry="8.5"
id="ellipse82" />
</g> </g>
<g <g
id="g84" id="g84"
style=""> transform="translate(-1.6002426,-1.1395339)">
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
x1="-192.398" x1="-192.39799"
y1="241.8" y1="241.8"
x2="-38.6343" x2="-38.6343"
y2="241.529" y2="241.52901"
id="line86" /> id="line86" />
<polygon <polygon
style="fill:#000000" style="fill:#000000"
points="-31.1343,241.516 -41.1254,246.534 -38.6343,241.529 -41.1431,236.534 " points="-41.1431,236.534 -31.1343,241.516 -41.1254,246.534 -38.6343,241.529 "
id="polygon88" /> id="polygon88" />
<polygon <polygon
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
points="-31.1343,241.516 -41.1254,246.534 -38.6343,241.529 -41.1431,236.534 " points="-41.1431,236.534 -31.1343,241.516 -41.1254,246.534 -38.6343,241.529 "
id="polygon90" /> id="polygon90" />
</g> </g>
<text <text
style="fill:#000000;text-anchor:start;font-size:12.8;font-family:sans-serif;font-style:normal;font-weight:normal;-inkscape-font-specification:sans-serif;font-stretch:normal;font-variant:normal;" style="font-style:normal;font-weight:normal;font-size:12.80000019px;font-family:sanserif;text-anchor:start;fill:#000000"
x="-147.858" x="-149.45824"
y="229.8" y="228.66048"
id="text92"> id="text92">
<tspan <tspan
x="-147.858" x="-149.45824"
y="229.8" y="228.66048"
id="tspan94" id="tspan94">pad 0 (sink)</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">pad 0 (sink)</tspan>
</text> </text>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -7,9 +7,9 @@
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="59cm" width="58.803326cm"
height="17cm" height="16.463955cm"
viewBox="-194 128 1179 330" viewBox="-194 128 1175.0698 319.59442"
id="svg2" id="svg2"
version="1.1" version="1.1"
inkscape:version="0.91 r13725" inkscape:version="0.91 r13725"
@ -22,6 +22,7 @@
<dc:format>image/svg+xml</dc:format> <dc:format>image/svg+xml</dc:format>
<dc:type <dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work> </cc:Work>
</rdf:RDF> </rdf:RDF>
</metadata> </metadata>
@ -40,23 +41,27 @@
inkscape:window-height="997" inkscape:window-height="997"
id="namedview182" id="namedview182"
showgrid="false" showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.26595857" inkscape:zoom="0.26595857"
inkscape:cx="1052.7956" inkscape:cx="1049.9581"
inkscape:cy="301.1811" inkscape:cy="292.5708"
inkscape:window-x="1920" inkscape:window-x="1920"
inkscape:window-y="30" inkscape:window-y="30"
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:current-layer="svg2" /> inkscape:current-layer="svg2" />
<rect <rect
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
x="-8" x="-9.6002426"
y="130" y="124.14409"
width="806" width="806"
height="327" height="327"
id="rect4" /> id="rect4" />
<g <g
id="g6" id="g6"
style=""> transform="translate(-1.6002426,-5.8559115)">
<rect <rect
style="fill:#ffffff" style="fill:#ffffff"
x="4.5" x="4.5"
@ -65,7 +70,7 @@
height="104" height="104"
id="rect8" /> id="rect8" />
<rect <rect
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#a52a2a" style="fill:none;fill-opacity:0;stroke:#a52a2a;stroke-width:2"
x="4.5" x="4.5"
y="189" y="189"
width="159" width="159"
@ -74,7 +79,7 @@
</g> </g>
<g <g
id="g12" id="g12"
style=""> transform="translate(-1.6002426,-5.8559115)">
<rect <rect
style="fill:#ffffff" style="fill:#ffffff"
x="49.5" x="49.5"
@ -83,7 +88,7 @@
height="77" height="77"
id="rect14" /> id="rect14" />
<rect <rect
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#0000ff" style="fill:none;fill-opacity:0;stroke:#0000ff;stroke-width:2"
x="49.5" x="49.5"
y="204" y="204"
width="94" width="94"
@ -91,470 +96,445 @@
id="rect16" /> id="rect16" />
</g> </g>
<text <text
style="fill:#0000ff;text-anchor:start;font-size:12.8;font-family:sans-serif;font-style:normal;font-weight:normal;-inkscape-font-specification:sans-serif;font-stretch:normal;font-variant:normal;" style="font-style:normal;font-weight:normal;font-size:12.80000019px;font-family:sanserif;text-anchor:start;fill:#0000ff"
x="60" x="58.399757"
y="224" y="218.14409"
id="text18"> id="text18">
<tspan <tspan
x="60" x="58.399757"
y="224" y="218.14409"
id="tspan20" id="tspan20">sink</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">sink</tspan>
<tspan <tspan
x="60" x="58.399757"
y="240" y="234.14409"
id="tspan22" id="tspan22">crop</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">crop</tspan>
<tspan <tspan
x="60" x="58.399757"
y="256" y="250.14409"
id="tspan24" id="tspan24">selection</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">selection</tspan>
</text> </text>
<text <text
style="fill:#000000;text-anchor:start;font-size:12.8;font-family:sans-serif;font-style:normal;font-weight:normal;-inkscape-font-specification:sans-serif;font-stretch:normal;font-variant:normal;" style="font-style:normal;font-weight:normal;font-size:12.80000019px;font-family:sanserif;text-anchor:start;fill:#000000"
x="29.5" x="27.899757"
y="158" y="152.14409"
id="text26"> id="text26">
<tspan <tspan
x="29.5" x="27.899757"
y="158" y="152.14409"
id="tspan28" id="tspan28" />
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;" />
</text> </text>
<text <text
style="fill:#a52a2a;text-anchor:start;font-size:12.8;font-family:sans-serif;font-style:normal;font-weight:normal;-inkscape-font-specification:sans-serif;font-stretch:normal;font-variant:normal;" style="font-style:normal;font-weight:normal;font-size:12.80000019px;font-family:sanserif;text-anchor:start;fill:#a52a2a"
x="8.53836" x="6.938117"
y="157.914" y="152.05809"
id="text30"> id="text30">
<tspan <tspan
x="8.53836" x="6.938117"
y="157.914" y="152.05809"
id="tspan32" id="tspan32">sink media</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">sink media</tspan>
<tspan <tspan
x="8.53836" x="6.938117"
y="173.914" y="168.05809"
id="tspan34" id="tspan34">bus format</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">bus format</tspan>
</text> </text>
<g <g
id="g36" id="g36"
style=""> transform="translate(-1.6002426,-5.8559115)">
<rect <rect
style="fill:#ffffff" style="fill:#ffffff"
x="333.644" x="333.64401"
y="185.65" y="185.64999"
width="165.2" width="165.2"
height="172.478" height="172.478"
id="rect38" /> id="rect38" />
<rect <rect
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#00ff00" style="fill:none;fill-opacity:0;stroke:#00ff00;stroke-width:2"
x="333.644" x="333.64401"
y="185.65" y="185.64999"
width="165.2" width="165.2"
height="172.478" height="172.478"
id="rect40" /> id="rect40" />
</g> </g>
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke-dasharray:4;stroke:#e60505" style="fill:none;fill-opacity:0;stroke:#e60505;stroke-width:2;stroke-dasharray:4"
x1="333.644" x1="332.04376"
y1="358.128" y1="352.27206"
x2="49.5" x2="47.899757"
y2="281" y2="275.14407"
id="line42" /> id="line42" />
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke-dasharray:4;stroke:#e60505" style="fill:none;fill-opacity:0;stroke:#e60505;stroke-width:2;stroke-dasharray:4"
x1="333.644" x1="332.04376"
y1="185.65" y1="179.79408"
x2="49.5" x2="47.899757"
y2="204" y2="198.14409"
id="line44" /> id="line44" />
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke-dasharray:4;stroke:#e60505" style="fill:none;fill-opacity:0;stroke:#e60505;stroke-width:2;stroke-dasharray:4"
x1="498.844" x1="497.24374"
y1="358.128" y1="352.27206"
x2="143.5" x2="141.89977"
y2="281" y2="275.14407"
id="line46" /> id="line46" />
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke-dasharray:4;stroke:#e60505" style="fill:none;fill-opacity:0;stroke:#e60505;stroke-width:2;stroke-dasharray:4"
x1="498.844" x1="497.24374"
y1="185.65" y1="179.79408"
x2="143.5" x2="141.89977"
y2="204" y2="198.14409"
id="line48" /> id="line48" />
<text <text
style="fill:#00ff00;text-anchor:start;font-size:12.8;font-family:sans-serif;font-style:normal;font-weight:normal;-inkscape-font-specification:sans-serif;font-stretch:normal;font-variant:normal;" style="font-style:normal;font-weight:normal;font-size:12.80000019px;font-family:sanserif;text-anchor:start;fill:#00ff00"
x="334.704" x="333.10376"
y="149.442" y="143.58609"
id="text50"> id="text50">
<tspan <tspan
x="334.704" x="333.10376"
y="149.442" y="143.58609"
id="tspan52" id="tspan52">sink compose</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">sink compose</tspan>
<tspan <tspan
x="334.704" x="333.10376"
y="165.442" y="159.58609"
id="tspan54" id="tspan54">selection (scaling)</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">selection (scaling)</tspan>
</text> </text>
<g <g
id="g56" id="g56"
style=""> transform="translate(-1.6002426,-5.8559115)">
<rect <rect
style="fill:#ffffff" style="fill:#ffffff"
x="382.322" x="382.32199"
y="199.565" y="199.565"
width="100.186" width="100.186"
height="71.4523" height="71.452301"
id="rect58" /> id="rect58" />
<rect <rect
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#a020f0" style="fill:none;fill-opacity:0;stroke:#a020f0;stroke-width:2"
x="382.322" x="382.32199"
y="199.565" y="199.565"
width="100.186" width="100.186"
height="71.4523" height="71.452301"
id="rect60" /> id="rect60" />
</g> </g>
<text <text
style="fill:#a020f0;text-anchor:start;font-size:12.8;font-family:sans-serif;font-style:normal;font-weight:normal;-inkscape-font-specification:sans-serif;font-stretch:normal;font-variant:normal;" style="font-style:normal;font-weight:normal;font-size:12.80000019px;font-family:sanserif;text-anchor:start;fill:#a020f0"
x="543.322" x="541.7218"
y="149.442" y="143.58609"
id="text62"> id="text62">
<tspan <tspan
x="543.322" x="541.7218"
y="149.442" y="143.58609"
id="tspan64" id="tspan64">source</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">source</tspan>
<tspan <tspan
x="543.322" x="541.7218"
y="165.442" y="159.58609"
id="tspan66" id="tspan66">crop</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">crop</tspan>
<tspan <tspan
x="543.322" x="541.7218"
y="181.442" y="175.58609"
id="tspan68" id="tspan68">selection</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">selection</tspan>
</text> </text>
<text <text
style="fill:#8b6914;text-anchor:start;font-size:12.8;font-family:sans-serif;font-style:normal;font-weight:normal;-inkscape-font-specification:sans-serif;font-stretch:normal;font-variant:normal;" style="font-style:normal;font-weight:normal;font-size:12.80000019px;font-family:sanserif;text-anchor:start;fill:#8b6914"
x="691.5" x="689.89978"
y="157.128" y="151.27209"
id="text70"> id="text70">
<tspan <tspan
x="691.5" x="689.89978"
y="157.128" y="151.27209"
id="tspan72" id="tspan72">source media</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">source media</tspan>
<tspan <tspan
x="691.5" x="689.89978"
y="173.128" y="167.27209"
id="tspan74" id="tspan74">bus format</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">bus format</tspan>
</text> </text>
<g <g
id="g76" id="g76"
style=""> transform="translate(-1.6002426,-5.8559115)">
<rect <rect
style="fill:#ffffff" style="fill:#ffffff"
x="690.488" x="690.48798"
y="225.834" y="225.834"
width="100.186" width="100.186"
height="71.4523" height="71.452301"
id="rect78" /> id="rect78" />
<rect <rect
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#8b6914" style="fill:none;fill-opacity:0;stroke:#8b6914;stroke-width:2"
x="690.488" x="690.48798"
y="225.834" y="225.834"
width="100.186" width="100.186"
height="71.4523" height="71.452301"
id="rect80" /> id="rect80" />
</g> </g>
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke-dasharray:4;stroke:#e60505" style="fill:none;fill-opacity:0;stroke:#e60505;stroke-width:2;stroke-dasharray:4"
x1="690.488" x1="688.88776"
y1="297.286" y1="291.43008"
x2="382.322" x2="380.72174"
y2="271.018" y2="265.16208"
id="line82" /> id="line82" />
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke-dasharray:4;stroke:#e60505" style="fill:none;fill-opacity:0;stroke:#e60505;stroke-width:2;stroke-dasharray:4"
x1="690.488" x1="688.88776"
y1="225.834" y1="219.97809"
x2="382.322" x2="380.72174"
y2="199.565" y2="193.70909"
id="line84" /> id="line84" />
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke-dasharray:4;stroke:#e60505" style="fill:none;fill-opacity:0;stroke:#e60505;stroke-width:2;stroke-dasharray:4"
x1="790.674" x1="789.07379"
y1="297.286" y1="291.43008"
x2="482.508" x2="480.90775"
y2="271.018" y2="265.16208"
id="line86" /> id="line86" />
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke-dasharray:4;stroke:#e60505" style="fill:none;fill-opacity:0;stroke:#e60505;stroke-width:2;stroke-dasharray:4"
x1="790.674" x1="789.07379"
y1="225.834" y1="219.97809"
x2="482.508" x2="480.90775"
y2="199.565" y2="193.70909"
id="line88" /> id="line88" />
<g <g
id="g90" id="g90"
style=""> transform="translate(-1.6002426,-5.8559115)">
<ellipse <circle
style="fill:#ffffff" style="fill:#ffffff"
cx="808.1" cx="808.09998"
cy="249.984" cy="249.98399"
rx="8.5" id="ellipse92"
ry="8.5" r="8.5" />
id="ellipse92" /> <circle
<ellipse style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" cx="808.09998"
cx="808.1" cy="249.98399"
cy="249.984" id="ellipse94"
rx="8.5" r="8.5" />
ry="8.5" <circle
id="ellipse94" /> style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
<ellipse cx="808.09998"
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" cy="249.98399"
cx="808.1" id="ellipse96"
cy="249.984" r="8.5" />
rx="8.5"
ry="8.5"
id="ellipse96" />
</g> </g>
<g <g
id="g98" id="g98"
style=""> transform="translate(-1.6002426,-5.8559115)">
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
x1="816.6" x1="816.59998"
y1="249.984" y1="249.98399"
x2="972.934" x2="972.93402"
y2="250.012" y2="250.01199"
id="line100" /> id="line100" />
<polygon <polygon
style="fill:#000000" style="fill:#000000"
points="980.434,250.014 970.433,255.012 972.934,250.012 970.435,245.012 " points="970.435,245.012 980.434,250.014 970.433,255.012 972.934,250.012 "
id="polygon102" /> id="polygon102" />
<polygon <polygon
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
points="980.434,250.014 970.433,255.012 972.934,250.012 970.435,245.012 " points="970.435,245.012 980.434,250.014 970.433,255.012 972.934,250.012 "
id="polygon104" /> id="polygon104" />
</g> </g>
<text <text
style="fill:#000000;text-anchor:start;font-size:12.8;font-family:sans-serif;font-style:normal;font-weight:normal;-inkscape-font-specification:sans-serif;font-stretch:normal;font-variant:normal;" style="font-style:normal;font-weight:normal;font-size:12.80000019px;font-family:sanserif;text-anchor:start;fill:#000000"
x="841.908" x="840.3078"
y="239.8" y="233.94409"
id="text106"> id="text106">
<tspan <tspan
x="841.908" x="840.3078"
y="239.8" y="233.94409"
id="tspan108" id="tspan108">pad 1 (source)</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">pad 1 (source)</tspan>
</text> </text>
<g <g
id="g110" id="g110"
style=""> transform="translate(-1.6002426,-5.8559115)">
<ellipse <circle
style="fill:#ffffff" style="fill:#ffffff"
cx="-20.3982" cx="-20.398199"
cy="241.512" cy="241.51199"
rx="8.5" id="ellipse112"
ry="8.5" r="8.5" />
id="ellipse112" /> <circle
<ellipse style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" cx="-20.398199"
cx="-20.3982" cy="241.51199"
cy="241.512" id="ellipse114"
rx="8.5" r="8.5" />
ry="8.5" <circle
id="ellipse114" /> style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
<ellipse cx="-20.398199"
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" cy="241.51199"
cx="-20.3982" id="ellipse116"
cy="241.512" r="8.5" />
rx="8.5"
ry="8.5"
id="ellipse116" />
</g> </g>
<g <g
id="g118" id="g118"
style=""> transform="translate(-1.6002426,-5.8559115)">
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
x1="-192.398" x1="-192.39799"
y1="241.8" y1="241.8"
x2="-38.6343" x2="-38.6343"
y2="241.529" y2="241.52901"
id="line120" /> id="line120" />
<polygon <polygon
style="fill:#000000" style="fill:#000000"
points="-31.1343,241.516 -41.1254,246.534 -38.6343,241.529 -41.1431,236.534 " points="-41.1431,236.534 -31.1343,241.516 -41.1254,246.534 -38.6343,241.529 "
id="polygon122" /> id="polygon122" />
<polygon <polygon
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
points="-31.1343,241.516 -41.1254,246.534 -38.6343,241.529 -41.1431,236.534 " points="-41.1431,236.534 -31.1343,241.516 -41.1254,246.534 -38.6343,241.529 "
id="polygon124" /> id="polygon124" />
</g> </g>
<text <text
style="fill:#000000;text-anchor:start;font-size:12.8;font-family:sans-serif;font-style:normal;font-weight:normal;-inkscape-font-specification:sans-serif;font-stretch:normal;font-variant:normal;" style="font-style:normal;font-weight:normal;font-size:12.80000019px;font-family:sanserif;text-anchor:start;fill:#000000"
x="-147.858" x="-149.45824"
y="229.8" y="223.94409"
id="text126"> id="text126">
<tspan <tspan
x="-147.858" x="-149.45824"
y="229.8" y="223.94409"
id="tspan128" id="tspan128">pad 0 (sink)</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">pad 0 (sink)</tspan>
</text> </text>
<rect <rect
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#a020f0" style="fill:none;fill-opacity:0;stroke:#a020f0;stroke-width:2"
x="389.822" x="388.22174"
y="276.666" y="270.81006"
width="100.186" width="100.186"
height="71.4523" height="71.452301"
id="rect130" /> id="rect130" />
<g <g
id="g132" id="g132"
style=""> transform="translate(-1.6002426,-5.8559115)">
<rect <rect
style="fill:#ffffff" style="fill:#ffffff"
x="689.988" x="689.98798"
y="345.934" y="345.93399"
width="100.186" width="100.186"
height="71.4523" height="71.452301"
id="rect134" /> id="rect134" />
<rect <rect
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#8b6914" style="fill:none;fill-opacity:0;stroke:#8b6914;stroke-width:2"
x="689.988" x="689.98798"
y="345.934" y="345.93399"
width="100.186" width="100.186"
height="71.4523" height="71.452301"
id="rect136" /> id="rect136" />
</g> </g>
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke-dasharray:4;stroke:#e60505" style="fill:none;fill-opacity:0;stroke:#e60505;stroke-width:2;stroke-dasharray:4"
x1="689.988" x1="688.38776"
y1="417.386" y1="411.53006"
x2="389.822" x2="388.22174"
y2="348.118" y2="342.26208"
id="line138" /> id="line138" />
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke-dasharray:4;stroke:#e60505" style="fill:none;fill-opacity:0;stroke:#e60505;stroke-width:2;stroke-dasharray:4"
x1="689.988" x1="688.38776"
y1="345.934" y1="340.07806"
x2="389.822" x2="388.22174"
y2="276.666" y2="270.81006"
id="line140" /> id="line140" />
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke-dasharray:4;stroke:#e60505" style="fill:none;fill-opacity:0;stroke:#e60505;stroke-width:2;stroke-dasharray:4"
x1="790.174" x1="788.57379"
y1="417.386" y1="411.53006"
x2="490.008" x2="488.40775"
y2="348.118" y2="342.26208"
id="line142" /> id="line142" />
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke-dasharray:4;stroke:#e60505" style="fill:none;fill-opacity:0;stroke:#e60505;stroke-width:2;stroke-dasharray:4"
x1="790.174" x1="788.57379"
y1="345.934" y1="340.07806"
x2="490.008" x2="488.40775"
y2="276.666" y2="270.81006"
id="line144" /> id="line144" />
<g <g
id="g146" id="g146"
style=""> transform="translate(-1.6002426,-5.8559115)">
<ellipse <circle
style="fill:#ffffff" style="fill:#ffffff"
cx="805.6" cx="805.59998"
cy="384.084" cy="384.08401"
rx="8.5" id="ellipse148"
ry="8.5" r="8.5" />
id="ellipse148" /> <circle
<ellipse style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" cx="805.59998"
cx="805.6" cy="384.08401"
cy="384.084" id="ellipse150"
rx="8.5" r="8.5" />
ry="8.5" <circle
id="ellipse150" /> style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
<ellipse cx="805.59998"
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" cy="384.08401"
cx="805.6" id="ellipse152"
cy="384.084" r="8.5" />
rx="8.5"
ry="8.5"
id="ellipse152" />
</g> </g>
<g <g
id="g154" id="g154"
style=""> transform="translate(-1.6002426,-5.8559115)">
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
x1="814.1" x1="814.09998"
y1="384.084" y1="384.08401"
x2="970.434" x2="970.43402"
y2="384.112" y2="384.112"
id="line156" /> id="line156" />
<polygon <polygon
style="fill:#000000" style="fill:#000000"
points="977.934,384.114 967.933,389.112 970.434,384.112 967.935,379.112 " points="967.935,379.112 977.934,384.114 967.933,389.112 970.434,384.112 "
id="polygon158" /> id="polygon158" />
<polygon <polygon
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#000000" style="fill:none;fill-opacity:0;stroke:#000000;stroke-width:2"
points="977.934,384.114 967.933,389.112 970.434,384.112 967.935,379.112 " points="967.935,379.112 977.934,384.114 967.933,389.112 970.434,384.112 "
id="polygon160" /> id="polygon160" />
</g> </g>
<text <text
style="fill:#000000;text-anchor:start;font-size:12.8;font-family:sans-serif;font-style:normal;font-weight:normal;-inkscape-font-specification:sans-serif;font-stretch:normal;font-variant:normal;" style="font-style:normal;font-weight:normal;font-size:12.80000019px;font-family:sanserif;text-anchor:start;fill:#000000"
x="839.408" x="837.8078"
y="373.9" y="368.04407"
id="text162"> id="text162">
<tspan <tspan
x="839.408" x="837.8078"
y="373.9" y="368.04407"
id="tspan164" id="tspan164">pad 2 (source)</tspan>
style="-inkscape-font-specification:sans-serif;font-family:sans-serif;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;">pad 2 (source)</tspan>
</text> </text>
<g <g
id="g166" id="g166"
style=""> transform="translate(-1.6002426,-5.8559115)">
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#a020f0" style="fill:none;fill-opacity:0;stroke:#a020f0;stroke-width:2"
x1="546" x1="546"
y1="191" y1="191"
x2="492.157" x2="492.15701"
y2="198.263" y2="198.263"
id="line168" /> id="line168" />
<polygon <polygon
style="fill:#a020f0" style="fill:#a020f0"
points="484.724,199.266 493.966,192.974 492.157,198.263 495.303,202.884 " points="495.303,202.884 484.724,199.266 493.966,192.974 492.157,198.263 "
id="polygon170" /> id="polygon170" />
<polygon <polygon
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#a020f0" style="fill:none;fill-opacity:0;stroke:#a020f0;stroke-width:2"
points="484.724,199.266 493.966,192.974 492.157,198.263 495.303,202.884 " points="495.303,202.884 484.724,199.266 493.966,192.974 492.157,198.263 "
id="polygon172" /> id="polygon172" />
</g> </g>
<g <g
id="g174" id="g174"
style=""> transform="translate(-1.6002426,-5.8559115)">
<line <line
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#a020f0" style="fill:none;fill-opacity:0;stroke:#a020f0;stroke-width:2"
x1="546.908" x1="546.90802"
y1="190.725" y1="190.72501"
x2="495.383" x2="495.383"
y2="268.548" y2="268.548"
id="line176" /> id="line176" />
<polygon <polygon
style="fill:#a020f0" style="fill:#a020f0"
points="491.242,274.802 492.594,263.703 495.383,268.548 500.932,269.224 " points="500.932,269.224 491.242,274.802 492.594,263.703 495.383,268.548 "
id="polygon178" /> id="polygon178" />
<polygon <polygon
style="fill:none;fill-opacity:0;stroke-width:2;stroke:#a020f0" style="fill:none;fill-opacity:0;stroke:#a020f0;stroke-width:2"
points="491.242,274.802 492.594,263.703 495.383,268.548 500.932,269.224 " points="500.932,269.224 491.242,274.802 492.594,263.703 495.383,268.548 "
id="polygon180" /> id="polygon180" />
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -68,6 +68,10 @@ Authors, in alphabetical order:
- SDR API. - SDR API.
- Ribalda, Ricardo
- Introduce HSV formats and other minor changes.
- Rubli, Martin - Rubli, Martin
- Designed and documented the VIDIOC_ENUM_FRAMESIZES and VIDIOC_ENUM_FRAMEINTERVALS ioctls. - Designed and documented the VIDIOC_ENUM_FRAMESIZES and VIDIOC_ENUM_FRAMEINTERVALS ioctls.
@ -89,6 +93,11 @@ part can be used and distributed without restrictions.
Revision History Revision History
**************** ****************
:revision: 4.10 / 2016-07-15 (*rr*)
Introduce HSV formats.
:revision: 4.5 / 2015-10-29 (*rr*) :revision: 4.5 / 2015-10-29 (*rr*)
Extend VIDIOC_G_EXT_CTRLS;. Replace ctrl_class with a new union with Extend VIDIOC_G_EXT_CTRLS;. Replace ctrl_class with a new union with

View File

@ -270,3 +270,14 @@ EBUSY
- Some formats like SMPTE-125M have an interlaced signal with a odd - Some formats like SMPTE-125M have an interlaced signal with a odd
total height. For these formats, if this flag is set, the first total height. For these formats, if this flag is set, the first
field has the extra line. Else, it is the second field. field has the extra line. Else, it is the second field.
* - ``V4L2_DV_FL_HAS_PICTURE_ASPECT``
- If set, then the picture_aspect field is valid. Otherwise assume that
the pixels are square, so the picture aspect ratio is the same as the
width to height ratio.
* - ``V4L2_DV_FL_HAS_CEA861_VIC``
- If set, then the cea861_vic field is valid and contains the Video
Identification Code as per the CEA-861 standard.
* - ``V4L2_DV_FL_HAS_HDMI_VIC``
- If set, then the hdmi_vic field is valid and contains the Video
Identification Code as per the HDMI standard (HDMI Vendor Specific
InfoFrame).

View File

@ -201,10 +201,10 @@ To change the radio frequency the
* - ``V4L2_TUNER_SDR`` * - ``V4L2_TUNER_SDR``
- 4 - 4
- Tuner controls the A/D and/or D/A block of a - Tuner controls the A/D and/or D/A block of a
Sofware Digital Radio (SDR) Software Digital Radio (SDR)
* - ``V4L2_TUNER_RF`` * - ``V4L2_TUNER_RF``
- 5 - 5
- Tuner controls the RF part of a Sofware Digital Radio (SDR) - Tuner controls the RF part of a Software Digital Radio (SDR)
.. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}| .. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}|

View File

@ -1,11 +1,13 @@
AU0828 cards list AU0828 cards list
================= =================
.. code-block:: none =========== ========================== =======================================================================================================================
Card number Card name USB IDs
0 -> Unknown board (au0828) =========== ========================== =======================================================================================================================
1 -> Hauppauge HVR950Q (au0828) [2040:7200,2040:7210,2040:7217,2040:721b,2040:721e,2040:721f,2040:7280,0fd9:0008,2040:7260,2040:7213,2040:7270] 0 Unknown board
2 -> Hauppauge HVR850 (au0828) [2040:7240] 1 Hauppauge HVR950Q 2040:7200, 2040:7210, 2040:7217, 2040:721b, 2040:721e, 2040:721f, 2040:7280, 0fd9:0008, 2040:7260, 2040:7213, 2040:7270
3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620] 2 Hauppauge HVR850 2040:7240
4 -> Hauppauge HVR950Q rev xxF8 (au0828) [2040:7201,2040:7211,2040:7281] 3 DViCO FusionHDTV USB 0fe9:d620
5 -> Hauppauge Woodbury (au0828) [05e1:0480,2040:8200] 4 Hauppauge HVR950Q rev xxF8 2040:7201, 2040:7211, 2040:7281
5 Hauppauge Woodbury 05e1:0480, 2040:8200
=========== ========================== =======================================================================================================================

View File

@ -1,172 +1,174 @@
BTTV cards list BTTV cards list
=============== ===============
.. code-block:: none =========== ================================================================================= ==============================================================================================================================================================================
Card number Card name PCI IDs
0 -> *** UNKNOWN/GENERIC *** =========== ================================================================================= ==============================================================================================================================================================================
1 -> MIRO PCTV 0 *** UNKNOWN/GENERIC ***
2 -> Hauppauge (bt848) 1 MIRO PCTV
3 -> STB, Gateway P/N 6000699 (bt848) 2 Hauppauge (bt848)
4 -> Intel Create and Share PCI/ Smart Video Recorder III 3 STB, Gateway P/N 6000699 (bt848)
5 -> Diamond DTV2000 4 Intel Create and Share PCI/ Smart Video Recorder III
6 -> AVerMedia TVPhone 5 Diamond DTV2000
7 -> MATRIX-Vision MV-Delta 6 AVerMedia TVPhone
8 -> Lifeview FlyVideo II (Bt848) LR26 / MAXI TV Video PCI2 LR26 7 MATRIX-Vision MV-Delta
9 -> IMS/IXmicro TurboTV 8 Lifeview FlyVideo II (Bt848) LR26 / MAXI TV Video PCI2 LR26
10 -> Hauppauge (bt878) [0070:13eb,0070:3900,2636:10b4] 9 IMS/IXmicro TurboTV
11 -> MIRO PCTV pro 10 Hauppauge (bt878) 0070:13eb, 0070:3900, 2636:10b4
12 -> ADS Technologies Channel Surfer TV (bt848) 11 MIRO PCTV pro
13 -> AVerMedia TVCapture 98 [1461:0002,1461:0004,1461:0300] 12 ADS Technologies Channel Surfer TV (bt848)
14 -> Aimslab Video Highway Xtreme (VHX) 13 AVerMedia TVCapture 98 1461:0002, 1461:0004, 1461:0300
15 -> Zoltrix TV-Max [a1a0:a0fc] 14 Aimslab Video Highway Xtreme (VHX)
16 -> Prolink Pixelview PlayTV (bt878) 15 Zoltrix TV-Max a1a0:a0fc
17 -> Leadtek WinView 601 16 Prolink Pixelview PlayTV (bt878)
18 -> AVEC Intercapture 17 Leadtek WinView 601
19 -> Lifeview FlyVideo II EZ /FlyKit LR38 Bt848 (capture only) 18 AVEC Intercapture
20 -> CEI Raffles Card 19 Lifeview FlyVideo II EZ /FlyKit LR38 Bt848 (capture only)
21 -> Lifeview FlyVideo 98/ Lucky Star Image World ConferenceTV LR50 20 CEI Raffles Card
22 -> Askey CPH050/ Phoebe Tv Master + FM [14ff:3002] 21 Lifeview FlyVideo 98/ Lucky Star Image World ConferenceTV LR50
23 -> Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV, bt878 [14c7:0101] 22 Askey CPH050/ Phoebe Tv Master + FM 14ff:3002
24 -> Askey CPH05X/06X (bt878) [many vendors] [144f:3002,144f:3005,144f:5000,14ff:3000] 23 Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV, bt878 14c7:0101
25 -> Terratec TerraTV+ Version 1.0 (Bt848)/ Terra TValue Version 1.0/ Vobis TV-Boostar 24 Askey CPH05X/06X (bt878) [many vendors] 144f:3002, 144f:3005, 144f:5000, 14ff:3000
26 -> Hauppauge WinCam newer (bt878) 25 Terratec TerraTV+ Version 1.0 (Bt848)/ Terra TValue Version 1.0/ Vobis TV-Boostar
27 -> Lifeview FlyVideo 98/ MAXI TV Video PCI2 LR50 26 Hauppauge WinCam newer (bt878)
28 -> Terratec TerraTV+ Version 1.1 (bt878) [153b:1127,1852:1852] 27 Lifeview FlyVideo 98/ MAXI TV Video PCI2 LR50
29 -> Imagenation PXC200 [1295:200a] 28 Terratec TerraTV+ Version 1.1 (bt878) 153b:1127, 1852:1852
30 -> Lifeview FlyVideo 98 LR50 [1f7f:1850] 29 Imagenation PXC200 1295:200a
31 -> Formac iProTV, Formac ProTV I (bt848) 30 Lifeview FlyVideo 98 LR50 1f7f:1850
32 -> Intel Create and Share PCI/ Smart Video Recorder III 31 Formac iProTV, Formac ProTV I (bt848)
33 -> Terratec TerraTValue Version Bt878 [153b:1117,153b:1118,153b:1119,153b:111a,153b:1134,153b:5018] 32 Intel Create and Share PCI/ Smart Video Recorder III
34 -> Leadtek WinFast 2000/ WinFast 2000 XP [107d:6606,107d:6609,6606:217d,f6ff:fff6] 33 Terratec TerraTValue Version Bt878 153b:1117, 153b:1118, 153b:1119, 153b:111a, 153b:1134, 153b:5018
35 -> Lifeview FlyVideo 98 LR50 / Chronos Video Shuttle II [1851:1850,1851:a050] 34 Leadtek WinFast 2000/ WinFast 2000 XP 107d:6606, 107d:6609, 6606:217d, f6ff:fff6
36 -> Lifeview FlyVideo 98FM LR50 / Typhoon TView TV/FM Tuner [1852:1852] 35 Lifeview FlyVideo 98 LR50 / Chronos Video Shuttle II 1851:1850, 1851:a050
37 -> Prolink PixelView PlayTV pro 36 Lifeview FlyVideo 98FM LR50 / Typhoon TView TV/FM Tuner 1852:1852
38 -> Askey CPH06X TView99 [144f:3000,144f:a005,a04f:a0fc] 37 Prolink PixelView PlayTV pro
39 -> Pinnacle PCTV Studio/Rave [11bd:0012,bd11:1200,bd11:ff00,11bd:ff12] 38 Askey CPH06X TView99 144f:3000, 144f:a005, a04f:a0fc
40 -> STB TV PCI FM, Gateway P/N 6000704 (bt878), 3Dfx VoodooTV 100 [10b4:2636,10b4:2645,121a:3060] 39 Pinnacle PCTV Studio/Rave 11bd:0012, bd11:1200, bd11:ff00, 11bd:ff12
41 -> AVerMedia TVPhone 98 [1461:0001,1461:0003] 40 STB TV PCI FM, Gateway P/N 6000704 (bt878), 3Dfx VoodooTV 100 10b4:2636, 10b4:2645, 121a:3060
42 -> ProVideo PV951 [aa0c:146c] 41 AVerMedia TVPhone 98 1461:0001, 1461:0003
43 -> Little OnAir TV 42 ProVideo PV951 aa0c:146c
44 -> Sigma TVII-FM 43 Little OnAir TV
45 -> MATRIX-Vision MV-Delta 2 44 Sigma TVII-FM
46 -> Zoltrix Genie TV/FM [15b0:4000,15b0:400a,15b0:400d,15b0:4010,15b0:4016] 45 MATRIX-Vision MV-Delta 2
47 -> Terratec TV/Radio+ [153b:1123] 46 Zoltrix Genie TV/FM 15b0:4000, 15b0:400a, 15b0:400d, 15b0:4010, 15b0:4016
48 -> Askey CPH03x/ Dynalink Magic TView 47 Terratec TV/Radio+ 153b:1123
49 -> IODATA GV-BCTV3/PCI [10fc:4020] 48 Askey CPH03x/ Dynalink Magic TView
50 -> Prolink PV-BT878P+4E / PixelView PlayTV PAK / Lenco MXTV-9578 CP 49 IODATA GV-BCTV3/PCI 10fc:4020
51 -> Eagle Wireless Capricorn2 (bt878A) 50 Prolink PV-BT878P+4E / PixelView PlayTV PAK / Lenco MXTV-9578 CP
52 -> Pinnacle PCTV Studio Pro 51 Eagle Wireless Capricorn2 (bt878A)
53 -> Typhoon TView RDS + FM Stereo / KNC1 TV Station RDS 52 Pinnacle PCTV Studio Pro
54 -> Lifeview FlyVideo 2000 /FlyVideo A2/ Lifetec LT 9415 TV [LR90] 53 Typhoon TView RDS + FM Stereo / KNC1 TV Station RDS
55 -> Askey CPH031/ BESTBUY Easy TV 54 Lifeview FlyVideo 2000 /FlyVideo A2/ Lifetec LT 9415 TV [LR90]
56 -> Lifeview FlyVideo 98FM LR50 [a051:41a0] 55 Askey CPH031/ BESTBUY Easy TV
57 -> GrandTec 'Grand Video Capture' (Bt848) [4344:4142] 56 Lifeview FlyVideo 98FM LR50 a051:41a0
58 -> Askey CPH060/ Phoebe TV Master Only (No FM) 57 GrandTec 'Grand Video Capture' (Bt848) 4344:4142
59 -> Askey CPH03x TV Capturer 58 Askey CPH060/ Phoebe TV Master Only (No FM)
60 -> Modular Technology MM100PCTV 59 Askey CPH03x TV Capturer
61 -> AG Electronics GMV1 [15cb:0101] 60 Modular Technology MM100PCTV
62 -> Askey CPH061/ BESTBUY Easy TV (bt878) 61 AG Electronics GMV1 15cb:0101
63 -> ATI TV-Wonder [1002:0001] 62 Askey CPH061/ BESTBUY Easy TV (bt878)
64 -> ATI TV-Wonder VE [1002:0003] 63 ATI TV-Wonder 1002:0001
65 -> Lifeview FlyVideo 2000S LR90 64 ATI TV-Wonder VE 1002:0003
66 -> Terratec TValueRadio [153b:1135,153b:ff3b] 65 Lifeview FlyVideo 2000S LR90
67 -> IODATA GV-BCTV4/PCI [10fc:4050] 66 Terratec TValueRadio 153b:1135, 153b:ff3b
68 -> 3Dfx VoodooTV FM (Euro) [10b4:2637] 67 IODATA GV-BCTV4/PCI 10fc:4050
69 -> Active Imaging AIMMS 68 3Dfx VoodooTV FM (Euro) 10b4:2637
70 -> Prolink Pixelview PV-BT878P+ (Rev.4C,8E) 69 Active Imaging AIMMS
71 -> Lifeview FlyVideo 98EZ (capture only) LR51 [1851:1851] 70 Prolink Pixelview PV-BT878P+ (Rev.4C,8E)
72 -> Prolink Pixelview PV-BT878P+9B (PlayTV Pro rev.9B FM+NICAM) [1554:4011] 71 Lifeview FlyVideo 98EZ (capture only) LR51 1851:1851
73 -> Sensoray 311/611 [6000:0311,6000:0611] 72 Prolink Pixelview PV-BT878P+9B (PlayTV Pro rev.9B FM+NICAM) 1554:4011
74 -> RemoteVision MX (RV605) 73 Sensoray 311/611 6000:0311, 6000:0611
75 -> Powercolor MTV878/ MTV878R/ MTV878F 74 RemoteVision MX (RV605)
76 -> Canopus WinDVR PCI (COMPAQ Presario 3524JP, 5112JP) [0e11:0079] 75 Powercolor MTV878/ MTV878R/ MTV878F
77 -> GrandTec Multi Capture Card (Bt878) 76 Canopus WinDVR PCI (COMPAQ Presario 3524JP, 5112JP) 0e11:0079
78 -> Jetway TV/Capture JW-TV878-FBK, Kworld KW-TV878RF [0a01:17de] 77 GrandTec Multi Capture Card (Bt878)
79 -> DSP Design TCVIDEO 78 Jetway TV/Capture JW-TV878-FBK, Kworld KW-TV878RF 0a01:17de
80 -> Hauppauge WinTV PVR [0070:4500] 79 DSP Design TCVIDEO
81 -> IODATA GV-BCTV5/PCI [10fc:4070,10fc:d018] 80 Hauppauge WinTV PVR 0070:4500
82 -> Osprey 100/150 (878) [0070:ff00] 81 IODATA GV-BCTV5/PCI 10fc:4070, 10fc:d018
83 -> Osprey 100/150 (848) 82 Osprey 100/150 (878) 0070:ff00
84 -> Osprey 101 (848) 83 Osprey 100/150 (848)
85 -> Osprey 101/151 84 Osprey 101 (848)
86 -> Osprey 101/151 w/ svid 85 Osprey 101/151
87 -> Osprey 200/201/250/251 86 Osprey 101/151 w/ svid
88 -> Osprey 200/250 [0070:ff01] 87 Osprey 200/201/250/251
89 -> Osprey 210/220/230 88 Osprey 200/250 0070:ff01
90 -> Osprey 500 [0070:ff02] 89 Osprey 210/220/230
91 -> Osprey 540 [0070:ff04] 90 Osprey 500 0070:ff02
92 -> Osprey 2000 [0070:ff03] 91 Osprey 540 0070:ff04
93 -> IDS Eagle 92 Osprey 2000 0070:ff03
94 -> Pinnacle PCTV Sat [11bd:001c] 93 IDS Eagle
95 -> Formac ProTV II (bt878) 94 Pinnacle PCTV Sat 11bd:001c
96 -> MachTV 95 Formac ProTV II (bt878)
97 -> Euresys Picolo 96 MachTV
98 -> ProVideo PV150 [aa00:1460,aa01:1461,aa02:1462,aa03:1463,aa04:1464,aa05:1465,aa06:1466,aa07:1467] 97 Euresys Picolo
99 -> AD-TVK503 98 ProVideo PV150 aa00:1460, aa01:1461, aa02:1462, aa03:1463, aa04:1464, aa05:1465, aa06:1466, aa07:1467
100 -> Hercules Smart TV Stereo 99 AD-TVK503
101 -> Pace TV & Radio Card 100 Hercules Smart TV Stereo
102 -> IVC-200 [0000:a155,0001:a155,0002:a155,0003:a155,0100:a155,0101:a155,0102:a155,0103:a155,0800:a155,0801:a155,0802:a155,0803:a155] 101 Pace TV & Radio Card
103 -> Grand X-Guard / Trust 814PCI [0304:0102] 102 IVC-200 0000:a155, 0001:a155, 0002:a155, 0003:a155, 0100:a155, 0101:a155, 0102:a155, 0103:a155, 0800:a155, 0801:a155, 0802:a155, 0803:a155
104 -> Nebula Electronics DigiTV [0071:0101] 103 Grand X-Guard / Trust 814PCI 0304:0102
105 -> ProVideo PV143 [aa00:1430,aa00:1431,aa00:1432,aa00:1433,aa03:1433] 104 Nebula Electronics DigiTV 0071:0101
106 -> PHYTEC VD-009-X1 VD-011 MiniDIN (bt878) 105 ProVideo PV143 aa00:1430, aa00:1431, aa00:1432, aa00:1433, aa03:1433
107 -> PHYTEC VD-009-X1 VD-011 Combi (bt878) 106 PHYTEC VD-009-X1 VD-011 MiniDIN (bt878)
108 -> PHYTEC VD-009 MiniDIN (bt878) 107 PHYTEC VD-009-X1 VD-011 Combi (bt878)
109 -> PHYTEC VD-009 Combi (bt878) 108 PHYTEC VD-009 MiniDIN (bt878)
110 -> IVC-100 [ff00:a132] 109 PHYTEC VD-009 Combi (bt878)
111 -> IVC-120G [ff00:a182,ff01:a182,ff02:a182,ff03:a182,ff04:a182,ff05:a182,ff06:a182,ff07:a182,ff08:a182,ff09:a182,ff0a:a182,ff0b:a182,ff0c:a182,ff0d:a182,ff0e:a182,ff0f:a182] 110 IVC-100 ff00:a132
112 -> pcHDTV HD-2000 TV [7063:2000] 111 IVC-120G ff00:a182, ff01:a182, ff02:a182, ff03:a182, ff04:a182, ff05:a182, ff06:a182, ff07:a182, ff08:a182, ff09:a182, ff0a:a182, ff0b:a182, ff0c:a182, ff0d:a182, ff0e:a182, ff0f:a182
113 -> Twinhan DST + clones [11bd:0026,1822:0001,270f:fc00,1822:0026] 112 pcHDTV HD-2000 TV 7063:2000
114 -> Winfast VC100 [107d:6607] 113 Twinhan DST + clones 11bd:0026, 1822:0001, 270f:fc00, 1822:0026
115 -> Teppro TEV-560/InterVision IV-560 114 Winfast VC100 107d:6607
116 -> SIMUS GVC1100 [aa6a:82b2] 115 Teppro TEV-560/InterVision IV-560
117 -> NGS NGSTV+ 116 SIMUS GVC1100 aa6a:82b2
118 -> LMLBT4 117 NGS NGSTV+
119 -> Tekram M205 PRO 118 LMLBT4
120 -> Conceptronic CONTVFMi 119 Tekram M205 PRO
121 -> Euresys Picolo Tetra [1805:0105,1805:0106,1805:0107,1805:0108] 120 Conceptronic CONTVFMi
122 -> Spirit TV Tuner 121 Euresys Picolo Tetra 1805:0105, 1805:0106, 1805:0107, 1805:0108
123 -> AVerMedia AVerTV DVB-T 771 [1461:0771] 122 Spirit TV Tuner
124 -> AverMedia AverTV DVB-T 761 [1461:0761] 123 AVerMedia AVerTV DVB-T 771 1461:0771
125 -> MATRIX Vision Sigma-SQ 124 AverMedia AverTV DVB-T 761 1461:0761
126 -> MATRIX Vision Sigma-SLC 125 MATRIX Vision Sigma-SQ
127 -> APAC Viewcomp 878(AMAX) 126 MATRIX Vision Sigma-SLC
128 -> DViCO FusionHDTV DVB-T Lite [18ac:db10,18ac:db11] 127 APAC Viewcomp 878(AMAX)
129 -> V-Gear MyVCD 128 DViCO FusionHDTV DVB-T Lite 18ac:db10, 18ac:db11
130 -> Super TV Tuner 129 V-Gear MyVCD
131 -> Tibet Systems 'Progress DVR' CS16 130 Super TV Tuner
132 -> Kodicom 4400R (master) 131 Tibet Systems 'Progress DVR' CS16
133 -> Kodicom 4400R (slave) 132 Kodicom 4400R (master)
134 -> Adlink RTV24 133 Kodicom 4400R (slave)
135 -> DViCO FusionHDTV 5 Lite [18ac:d500] 134 Adlink RTV24
136 -> Acorp Y878F [9511:1540] 135 DViCO FusionHDTV 5 Lite 18ac:d500
137 -> Conceptronic CTVFMi v2 [036e:109e] 136 Acorp Y878F 9511:1540
138 -> Prolink Pixelview PV-BT878P+ (Rev.2E) 137 Conceptronic CTVFMi v2 036e:109e
139 -> Prolink PixelView PlayTV MPEG2 PV-M4900 138 Prolink Pixelview PV-BT878P+ (Rev.2E)
140 -> Osprey 440 [0070:ff07] 139 Prolink PixelView PlayTV MPEG2 PV-M4900
141 -> Asound Skyeye PCTV 140 Osprey 440 0070:ff07
142 -> Sabrent TV-FM (bttv version) 141 Asound Skyeye PCTV
143 -> Hauppauge ImpactVCB (bt878) [0070:13eb] 142 Sabrent TV-FM (bttv version)
144 -> MagicTV 143 Hauppauge ImpactVCB (bt878) 0070:13eb
145 -> SSAI Security Video Interface [4149:5353] 144 MagicTV
146 -> SSAI Ultrasound Video Interface [414a:5353] 145 SSAI Security Video Interface 4149:5353
147 -> VoodooTV 200 (USA) [121a:3000] 146 SSAI Ultrasound Video Interface 414a:5353
148 -> DViCO FusionHDTV 2 [dbc0:d200] 147 VoodooTV 200 (USA) 121a:3000
149 -> Typhoon TV-Tuner PCI (50684) 148 DViCO FusionHDTV 2 dbc0:d200
150 -> Geovision GV-600 [008a:763c] 149 Typhoon TV-Tuner PCI (50684)
151 -> Kozumi KTV-01C 150 Geovision GV-600 008a:763c
152 -> Encore ENL TV-FM-2 [1000:1801] 151 Kozumi KTV-01C
153 -> PHYTEC VD-012 (bt878) 152 Encore ENL TV-FM-2 1000:1801
154 -> PHYTEC VD-012-X1 (bt878) 153 PHYTEC VD-012 (bt878)
155 -> PHYTEC VD-012-X2 (bt878) 154 PHYTEC VD-012-X1 (bt878)
156 -> IVCE-8784 [0000:f050,0001:f050,0002:f050,0003:f050] 155 PHYTEC VD-012-X2 (bt878)
157 -> Geovision GV-800(S) (master) [800a:763d] 156 IVCE-8784 0000:f050, 0001:f050, 0002:f050, 0003:f050
158 -> Geovision GV-800(S) (slave) [800b:763d,800c:763d,800d:763d] 157 Geovision GV-800(S) (master) 800a:763d
159 -> ProVideo PV183 [1830:1540,1831:1540,1832:1540,1833:1540,1834:1540,1835:1540,1836:1540,1837:1540] 158 Geovision GV-800(S) (slave) 800b:763d, 800c:763d, 800d:763d
160 -> Tongwei Video Technology TD-3116 [f200:3116] 159 ProVideo PV183 1830:1540, 1831:1540, 1832:1540, 1833:1540, 1834:1540, 1835:1540, 1836:1540, 1837:1540
161 -> Aposonic W-DVR [0279:0228] 160 Tongwei Video Technology TD-3116 f200:3116
162 -> Adlink MPG24 161 Aposonic W-DVR 0279:0228
163 -> Bt848 Capture 14MHz 162 Adlink MPG24
164 -> CyberVision CV06 (SV) 163 Bt848 Capture 14MHz
165 -> Kworld V-Stream Xpert TV PVR878 164 CyberVision CV06 (SV)
166 -> PCI-8604PW 165 Kworld V-Stream Xpert TV PVR878
166 PCI-8604PW
=========== ================================================================================= ==============================================================================================================================================================================

View File

@ -1,63 +1,65 @@
cx23885 cards list cx23885 cards list
================== ==================
.. code-block:: none =========== ==================================== ======================================================================================
Card number Card name PCI IDs
0 -> UNKNOWN/GENERIC [0070:3400] =========== ==================================== ======================================================================================
1 -> Hauppauge WinTV-HVR1800lp [0070:7600] 0 UNKNOWN/GENERIC 0070:3400
2 -> Hauppauge WinTV-HVR1800 [0070:7800,0070:7801,0070:7809] 1 Hauppauge WinTV-HVR1800lp 0070:7600
3 -> Hauppauge WinTV-HVR1250 [0070:7911] 2 Hauppauge WinTV-HVR1800 0070:7800, 0070:7801, 0070:7809
4 -> DViCO FusionHDTV5 Express [18ac:d500] 3 Hauppauge WinTV-HVR1250 0070:7911
5 -> Hauppauge WinTV-HVR1500Q [0070:7790,0070:7797] 4 DViCO FusionHDTV5 Express 18ac:d500
6 -> Hauppauge WinTV-HVR1500 [0070:7710,0070:7717] 5 Hauppauge WinTV-HVR1500Q 0070:7790, 0070:7797
7 -> Hauppauge WinTV-HVR1200 [0070:71d1,0070:71d3] 6 Hauppauge WinTV-HVR1500 0070:7710, 0070:7717
8 -> Hauppauge WinTV-HVR1700 [0070:8101] 7 Hauppauge WinTV-HVR1200 0070:71d1, 0070:71d3
9 -> Hauppauge WinTV-HVR1400 [0070:8010] 8 Hauppauge WinTV-HVR1700 0070:8101
10 -> DViCO FusionHDTV7 Dual Express [18ac:d618] 9 Hauppauge WinTV-HVR1400 0070:8010
11 -> DViCO FusionHDTV DVB-T Dual Express [18ac:db78] 10 DViCO FusionHDTV7 Dual Express 18ac:d618
12 -> Leadtek Winfast PxDVR3200 H [107d:6681] 11 DViCO FusionHDTV DVB-T Dual Express 18ac:db78
13 -> Compro VideoMate E650F [185b:e800] 12 Leadtek Winfast PxDVR3200 H 107d:6681
14 -> TurboSight TBS 6920 [6920:8888] 13 Compro VideoMate E650F 185b:e800
15 -> TeVii S470 [d470:9022] 14 TurboSight TBS 6920 6920:8888
16 -> DVBWorld DVB-S2 2005 [0001:2005] 15 TeVii S470 d470:9022
17 -> NetUP Dual DVB-S2 CI [1b55:2a2c] 16 DVBWorld DVB-S2 2005 0001:2005
18 -> Hauppauge WinTV-HVR1270 [0070:2211] 17 NetUP Dual DVB-S2 CI 1b55:2a2c
19 -> Hauppauge WinTV-HVR1275 [0070:2215,0070:221d,0070:22f2] 18 Hauppauge WinTV-HVR1270 0070:2211
20 -> Hauppauge WinTV-HVR1255 [0070:2251,0070:22f1] 19 Hauppauge WinTV-HVR1275 0070:2215, 0070:221d, 0070:22f2
21 -> Hauppauge WinTV-HVR1210 [0070:2291,0070:2295,0070:2299,0070:229d,0070:22f0,0070:22f3,0070:22f4,0070:22f5] 20 Hauppauge WinTV-HVR1255 0070:2251, 0070:22f1
22 -> Mygica X8506 DMB-TH [14f1:8651] 21 Hauppauge WinTV-HVR1210 0070:2291, 0070:2295, 0070:2299, 0070:229d, 0070:22f0, 0070:22f3, 0070:22f4, 0070:22f5
23 -> Magic-Pro ProHDTV Extreme 2 [14f1:8657] 22 Mygica X8506 DMB-TH 14f1:8651
24 -> Hauppauge WinTV-HVR1850 [0070:8541] 23 Magic-Pro ProHDTV Extreme 2 14f1:8657
25 -> Compro VideoMate E800 [1858:e800] 24 Hauppauge WinTV-HVR1850 0070:8541
26 -> Hauppauge WinTV-HVR1290 [0070:8551] 25 Compro VideoMate E800 1858:e800
27 -> Mygica X8558 PRO DMB-TH [14f1:8578] 26 Hauppauge WinTV-HVR1290 0070:8551
28 -> LEADTEK WinFast PxTV1200 [107d:6f22] 27 Mygica X8558 PRO DMB-TH 14f1:8578
29 -> GoTView X5 3D Hybrid [5654:2390] 28 LEADTEK WinFast PxTV1200 107d:6f22
30 -> NetUP Dual DVB-T/C-CI RF [1b55:e2e4] 29 GoTView X5 3D Hybrid 5654:2390
31 -> Leadtek Winfast PxDVR3200 H XC4000 [107d:6f39] 30 NetUP Dual DVB-T/C-CI RF 1b55:e2e4
32 -> MPX-885 31 Leadtek Winfast PxDVR3200 H XC4000 107d:6f39
33 -> Mygica X8502/X8507 ISDB-T [14f1:8502] 32 MPX-885
34 -> TerraTec Cinergy T PCIe Dual [153b:117e] 33 Mygica X8502/X8507 ISDB-T 14f1:8502
35 -> TeVii S471 [d471:9022] 34 TerraTec Cinergy T PCIe Dual 153b:117e
36 -> Hauppauge WinTV-HVR1255 [0070:2259] 35 TeVii S471 d471:9022
37 -> Prof Revolution DVB-S2 8000 [8000:3034] 36 Hauppauge WinTV-HVR1255 0070:2259
38 -> Hauppauge WinTV-HVR4400/HVR5500 [0070:c108,0070:c138,0070:c1f8] 37 Prof Revolution DVB-S2 8000 8000:3034
39 -> AVerTV Hybrid Express Slim HC81R [1461:d939] 38 Hauppauge WinTV-HVR4400/HVR5500 0070:c108, 0070:c138, 0070:c1f8
40 -> TurboSight TBS 6981 [6981:8888] 39 AVerTV Hybrid Express Slim HC81R 1461:d939
41 -> TurboSight TBS 6980 [6980:8888] 40 TurboSight TBS 6981 6981:8888
42 -> Leadtek Winfast PxPVR2200 [107d:6f21] 41 TurboSight TBS 6980 6980:8888
43 -> Hauppauge ImpactVCB-e [0070:7133] 42 Leadtek Winfast PxPVR2200 107d:6f21
44 -> DViCO FusionHDTV DVB-T Dual Express2 [18ac:db98] 43 Hauppauge ImpactVCB-e 0070:7133
45 -> DVBSky T9580 [4254:9580] 44 DViCO FusionHDTV DVB-T Dual Express2 18ac:db98
46 -> DVBSky T980C [4254:980c] 45 DVBSky T9580 4254:9580
47 -> DVBSky S950C [4254:950c] 46 DVBSky T980C 4254:980c
48 -> Technotrend TT-budget CT2-4500 CI [13c2:3013] 47 DVBSky S950C 4254:950c
49 -> DVBSky S950 [4254:0950] 48 Technotrend TT-budget CT2-4500 CI 13c2:3013
50 -> DVBSky S952 [4254:0952] 49 DVBSky S950 4254:0950
51 -> DVBSky T982 [4254:0982] 50 DVBSky S952 4254:0952
52 -> Hauppauge WinTV-HVR5525 [0070:f038] 51 DVBSky T982 4254:0982
53 -> Hauppauge WinTV Starburst [0070:c12a] 52 Hauppauge WinTV-HVR5525 0070:f038
54 -> ViewCast 260e [1576:0260] 53 Hauppauge WinTV Starburst 0070:c12a
55 -> ViewCast 460e [1576:0460] 54 ViewCast 260e 1576:0260
56 -> Hauppauge WinTV-QuadHD-DVB [0070:6a28,0070:6b28] 55 ViewCast 460e 1576:0460
57 -> Hauppauge WinTV-QuadHD-ATSC [0070:6a18,0070:6b18] 56 Hauppauge WinTV-QuadHD-DVB 0070:6a28, 0070:6b28
57 Hauppauge WinTV-QuadHD-ATSC 0070:6a18, 0070:6b18
=========== ==================================== ======================================================================================

View File

@ -1,96 +1,98 @@
CX88 cards list CX88 cards list
=============== ===============
.. code-block:: none =========== =================================================== ======================================================================================
Card number Card name PCI IDs
0 -> UNKNOWN/GENERIC =========== =================================================== ======================================================================================
1 -> Hauppauge WinTV 34xxx models [0070:3400,0070:3401] 0 UNKNOWN/GENERIC
2 -> GDI Black Gold [14c7:0106,14c7:0107] 1 Hauppauge WinTV 34xxx models 0070:3400, 0070:3401
3 -> PixelView [1554:4811] 2 GDI Black Gold 14c7:0106, 14c7:0107
4 -> ATI TV Wonder Pro [1002:00f8,1002:00f9] 3 PixelView 1554:4811
5 -> Leadtek Winfast 2000XP Expert [107d:6611,107d:6613] 4 ATI TV Wonder Pro 1002:00f8, 1002:00f9
6 -> AverTV Studio 303 (M126) [1461:000b] 5 Leadtek Winfast 2000XP Expert 107d:6611, 107d:6613
7 -> MSI TV-@nywhere Master [1462:8606] 6 AverTV Studio 303 (M126) 1461:000b
8 -> Leadtek Winfast DV2000 [107d:6620,107d:6621] 7 MSI TV-@nywhere Master 1462:8606
9 -> Leadtek PVR 2000 [107d:663b,107d:663c,107d:6632,107d:6630,107d:6638,107d:6631,107d:6637,107d:663d] 8 Leadtek Winfast DV2000 107d:6620, 107d:6621
10 -> IODATA GV-VCP3/PCI [10fc:d003] 9 Leadtek PVR 2000 107d:663b, 107d:663c, 107d:6632, 107d:6630, 107d:6638, 107d:6631, 107d:6637, 107d:663d
11 -> Prolink PlayTV PVR 10 IODATA GV-VCP3/PCI 10fc:d003
12 -> ASUS PVR-416 [1043:4823,1461:c111] 11 Prolink PlayTV PVR
13 -> MSI TV-@nywhere 12 ASUS PVR-416 1043:4823, 1461:c111
14 -> KWorld/VStream XPert DVB-T [17de:08a6] 13 MSI TV-@nywhere
15 -> DViCO FusionHDTV DVB-T1 [18ac:db00] 14 KWorld/VStream XPert DVB-T 17de:08a6
16 -> KWorld LTV883RF 15 DViCO FusionHDTV DVB-T1 18ac:db00
17 -> DViCO FusionHDTV 3 Gold-Q [18ac:d810,18ac:d800] 16 KWorld LTV883RF
18 -> Hauppauge Nova-T DVB-T [0070:9002,0070:9001,0070:9000] 17 DViCO FusionHDTV 3 Gold-Q 18ac:d810, 18ac:d800
19 -> Conexant DVB-T reference design [14f1:0187] 18 Hauppauge Nova-T DVB-T 0070:9002, 0070:9001, 0070:9000
20 -> Provideo PV259 [1540:2580] 19 Conexant DVB-T reference design 14f1:0187
21 -> DViCO FusionHDTV DVB-T Plus [18ac:db10,18ac:db11] 20 Provideo PV259 1540:2580
22 -> pcHDTV HD3000 HDTV [7063:3000] 21 DViCO FusionHDTV DVB-T Plus 18ac:db10, 18ac:db11
23 -> digitalnow DNTV Live! DVB-T [17de:a8a6] 22 pcHDTV HD3000 HDTV 7063:3000
24 -> Hauppauge WinTV 28xxx (Roslyn) models [0070:2801] 23 digitalnow DNTV Live! DVB-T 17de:a8a6
25 -> Digital-Logic MICROSPACE Entertainment Center (MEC) [14f1:0342] 24 Hauppauge WinTV 28xxx (Roslyn) models 0070:2801
26 -> IODATA GV/BCTV7E [10fc:d035] 25 Digital-Logic MICROSPACE Entertainment Center (MEC) 14f1:0342
27 -> PixelView PlayTV Ultra Pro (Stereo) 26 IODATA GV/BCTV7E 10fc:d035
28 -> DViCO FusionHDTV 3 Gold-T [18ac:d820] 27 PixelView PlayTV Ultra Pro (Stereo)
29 -> ADS Tech Instant TV DVB-T PCI [1421:0334] 28 DViCO FusionHDTV 3 Gold-T 18ac:d820
30 -> TerraTec Cinergy 1400 DVB-T [153b:1166] 29 ADS Tech Instant TV DVB-T PCI 1421:0334
31 -> DViCO FusionHDTV 5 Gold [18ac:d500] 30 TerraTec Cinergy 1400 DVB-T 153b:1166
32 -> AverMedia UltraTV Media Center PCI 550 [1461:8011] 31 DViCO FusionHDTV 5 Gold 18ac:d500
33 -> Kworld V-Stream Xpert DVD 32 AverMedia UltraTV Media Center PCI 550 1461:8011
34 -> ATI HDTV Wonder [1002:a101] 33 Kworld V-Stream Xpert DVD
35 -> WinFast DTV1000-T [107d:665f] 34 ATI HDTV Wonder 1002:a101
36 -> AVerTV 303 (M126) [1461:000a] 35 WinFast DTV1000-T 107d:665f
37 -> Hauppauge Nova-S-Plus DVB-S [0070:9201,0070:9202] 36 AVerTV 303 (M126) 1461:000a
38 -> Hauppauge Nova-SE2 DVB-S [0070:9200] 37 Hauppauge Nova-S-Plus DVB-S 0070:9201, 0070:9202
39 -> KWorld DVB-S 100 [17de:08b2,1421:0341] 38 Hauppauge Nova-SE2 DVB-S 0070:9200
40 -> Hauppauge WinTV-HVR1100 DVB-T/Hybrid [0070:9400,0070:9402] 39 KWorld DVB-S 100 17de:08b2, 1421:0341
41 -> Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile) [0070:9800,0070:9802] 40 Hauppauge WinTV-HVR1100 DVB-T/Hybrid 0070:9400, 0070:9402
42 -> digitalnow DNTV Live! DVB-T Pro [1822:0025,1822:0019] 41 Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile) 0070:9800, 0070:9802
43 -> KWorld/VStream XPert DVB-T with cx22702 [17de:08a1,12ab:2300] 42 digitalnow DNTV Live! DVB-T Pro 1822:0025, 1822:0019
44 -> DViCO FusionHDTV DVB-T Dual Digital [18ac:db50,18ac:db54] 43 KWorld/VStream XPert DVB-T with cx22702 17de:08a1, 12ab:2300
45 -> KWorld HardwareMpegTV XPert [17de:0840,1421:0305] 44 DViCO FusionHDTV DVB-T Dual Digital 18ac:db50, 18ac:db54
46 -> DViCO FusionHDTV DVB-T Hybrid [18ac:db40,18ac:db44] 45 KWorld HardwareMpegTV XPert 17de:0840, 1421:0305
47 -> pcHDTV HD5500 HDTV [7063:5500] 46 DViCO FusionHDTV DVB-T Hybrid 18ac:db40, 18ac:db44
48 -> Kworld MCE 200 Deluxe [17de:0841] 47 pcHDTV HD5500 HDTV 7063:5500
49 -> PixelView PlayTV P7000 [1554:4813] 48 Kworld MCE 200 Deluxe 17de:0841
50 -> NPG Tech Real TV FM Top 10 [14f1:0842] 49 PixelView PlayTV P7000 1554:4813
51 -> WinFast DTV2000 H [107d:665e] 50 NPG Tech Real TV FM Top 10 14f1:0842
52 -> Geniatech DVB-S [14f1:0084] 51 WinFast DTV2000 H 107d:665e
53 -> Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T [0070:1404,0070:1400,0070:1401,0070:1402] 52 Geniatech DVB-S 14f1:0084
54 -> Norwood Micro TV Tuner 53 Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T 0070:1404, 0070:1400, 0070:1401, 0070:1402
55 -> Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM [c180:c980] 54 Norwood Micro TV Tuner
56 -> Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder [0070:9600,0070:9601,0070:9602] 55 Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM c180:c980
57 -> ADS Tech Instant Video PCI [1421:0390] 56 Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder 0070:9600, 0070:9601, 0070:9602
58 -> Pinnacle PCTV HD 800i [11bd:0051] 57 ADS Tech Instant Video PCI 1421:0390
59 -> DViCO FusionHDTV 5 PCI nano [18ac:d530] 58 Pinnacle PCTV HD 800i 11bd:0051
60 -> Pinnacle Hybrid PCTV [12ab:1788] 59 DViCO FusionHDTV 5 PCI nano 18ac:d530
61 -> Leadtek TV2000 XP Global [107d:6f18,107d:6618,107d:6619] 60 Pinnacle Hybrid PCTV 12ab:1788
62 -> PowerColor RA330 [14f1:ea3d] 61 Leadtek TV2000 XP Global 107d:6f18, 107d:6618, 107d:6619
63 -> Geniatech X8000-MT DVBT [14f1:8852] 62 PowerColor RA330 14f1:ea3d
64 -> DViCO FusionHDTV DVB-T PRO [18ac:db30] 63 Geniatech X8000-MT DVBT 14f1:8852
65 -> DViCO FusionHDTV 7 Gold [18ac:d610] 64 DViCO FusionHDTV DVB-T PRO 18ac:db30
66 -> Prolink Pixelview MPEG 8000GT [1554:4935] 65 DViCO FusionHDTV 7 Gold 18ac:d610
67 -> Kworld PlusTV HD PCI 120 (ATSC 120) [17de:08c1] 66 Prolink Pixelview MPEG 8000GT 1554:4935
68 -> Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid [0070:6900,0070:6904,0070:6902] 67 Kworld PlusTV HD PCI 120 (ATSC 120) 17de:08c1
69 -> Hauppauge WinTV-HVR4000(Lite) DVB-S/S2 [0070:6905,0070:6906] 68 Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid 0070:6900, 0070:6904, 0070:6902
70 -> TeVii S460 DVB-S/S2 [d460:9022] 69 Hauppauge WinTV-HVR4000(Lite) DVB-S/S2 0070:6905, 0070:6906
71 -> Omicom SS4 DVB-S/S2 PCI [A044:2011] 70 TeVii S460 DVB-S/S2 d460:9022
72 -> TBS 8920 DVB-S/S2 [8920:8888] 71 Omicom SS4 DVB-S/S2 PCI A044:2011
73 -> TeVii S420 DVB-S [d420:9022] 72 TBS 8920 DVB-S/S2 8920:8888
74 -> Prolink Pixelview Global Extreme [1554:4976] 73 TeVii S420 DVB-S d420:9022
75 -> PROF 7300 DVB-S/S2 [B033:3033] 74 Prolink Pixelview Global Extreme 1554:4976
76 -> SATTRADE ST4200 DVB-S/S2 [b200:4200] 75 PROF 7300 DVB-S/S2 B033:3033
77 -> TBS 8910 DVB-S [8910:8888] 76 SATTRADE ST4200 DVB-S/S2 b200:4200
78 -> Prof 6200 DVB-S [b022:3022] 77 TBS 8910 DVB-S 8910:8888
79 -> Terratec Cinergy HT PCI MKII [153b:1177] 78 Prof 6200 DVB-S b022:3022
80 -> Hauppauge WinTV-IR Only [0070:9290] 79 Terratec Cinergy HT PCI MKII 153b:1177
81 -> Leadtek WinFast DTV1800 Hybrid [107d:6654] 80 Hauppauge WinTV-IR Only 0070:9290
82 -> WinFast DTV2000 H rev. J [107d:6f2b] 81 Leadtek WinFast DTV1800 Hybrid 107d:6654
83 -> Prof 7301 DVB-S/S2 [b034:3034] 82 WinFast DTV2000 H rev. J 107d:6f2b
84 -> Samsung SMT 7020 DVB-S [18ac:dc00,18ac:dccd] 83 Prof 7301 DVB-S/S2 b034:3034
85 -> Twinhan VP-1027 DVB-S [1822:0023] 84 Samsung SMT 7020 DVB-S 18ac:dc00, 18ac:dccd
86 -> TeVii S464 DVB-S/S2 [d464:9022] 85 Twinhan VP-1027 DVB-S 1822:0023
87 -> Leadtek WinFast DTV2000 H PLUS [107d:6f42] 86 TeVii S464 DVB-S/S2 d464:9022
88 -> Leadtek WinFast DTV1800 H (XC4000) [107d:6f38] 87 Leadtek WinFast DTV2000 H PLUS 107d:6f42
89 -> Leadtek TV2000 XP Global (SC4100) [107d:6f36] 88 Leadtek WinFast DTV1800 H (XC4000) 107d:6f38
90 -> Leadtek TV2000 XP Global (XC4100) [107d:6f43] 89 Leadtek TV2000 XP Global (SC4100) 107d:6f36
90 Leadtek TV2000 XP Global (XC4100) 107d:6f43
=========== =================================================== ======================================================================================

View File

@ -1,105 +1,107 @@
EM28xx cards list EM28xx cards list
================= =================
.. code-block:: none =========== ==================================================================== ================ ==================================================================================================================================
Card number Card name Empia Chip USB IDs
0 -> Unknown EM2800 video grabber (em2800) [eb1a:2800] =========== ==================================================================== ================ ==================================================================================================================================
1 -> Unknown EM2750/28xx video grabber (em2820/em2840) [eb1a:2710,eb1a:2820,eb1a:2821,eb1a:2860,eb1a:2861,eb1a:2862,eb1a:2863,eb1a:2870,eb1a:2881,eb1a:2883,eb1a:2868,eb1a:2875] 0 Unknown EM2800 video grabber em2800 eb1a:2800
2 -> Terratec Cinergy 250 USB (em2820/em2840) [0ccd:0036] 1 Unknown EM2750/28xx video grabber em2820 or em2840 eb1a:2710, eb1a:2820, eb1a:2821, eb1a:2860, eb1a:2861, eb1a:2862, eb1a:2863, eb1a:2870, eb1a:2881, eb1a:2883, eb1a:2868, eb1a:2875
3 -> Pinnacle PCTV USB 2 (em2820/em2840) [2304:0208] 2 Terratec Cinergy 250 USB em2820 or em2840 0ccd:0036
4 -> Hauppauge WinTV USB 2 (em2820/em2840) [2040:4200,2040:4201] 3 Pinnacle PCTV USB 2 em2820 or em2840 2304:0208
5 -> MSI VOX USB 2.0 (em2820/em2840) 4 Hauppauge WinTV USB 2 em2820 or em2840 2040:4200, 2040:4201
6 -> Terratec Cinergy 200 USB (em2800) 5 MSI VOX USB 2.0 em2820 or em2840
7 -> Leadtek Winfast USB II (em2800) [0413:6023] 6 Terratec Cinergy 200 USB em2800
8 -> Kworld USB2800 (em2800) 7 Leadtek Winfast USB II em2800 0413:6023
9 -> Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker (em2820/em2840) [1b80:e302,1b80:e304,2304:0207,2304:021a,093b:a003] 8 Kworld USB2800 em2800
10 -> Hauppauge WinTV HVR 900 (em2880) [2040:6500] 9 Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker em2820 or em2840 1b80:e302, 1b80:e304, 2304:0207, 2304:021a, 093b:a003
11 -> Terratec Hybrid XS (em2880) 10 Hauppauge WinTV HVR 900 em2880 2040:6500
12 -> Kworld PVR TV 2800 RF (em2820/em2840) 11 Terratec Hybrid XS em2880
13 -> Terratec Prodigy XS (em2880) 12 Kworld PVR TV 2800 RF em2820 or em2840
14 -> SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0 (em2820/em2840) 13 Terratec Prodigy XS em2880
15 -> V-Gear PocketTV (em2800) 14 SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0 em2820 or em2840
16 -> Hauppauge WinTV HVR 950 (em2883) [2040:6513,2040:6517,2040:651b] 15 V-Gear PocketTV em2800
17 -> Pinnacle PCTV HD Pro Stick (em2880) [2304:0227] 16 Hauppauge WinTV HVR 950 em2883 2040:6513, 2040:6517, 2040:651b
18 -> Hauppauge WinTV HVR 900 (R2) (em2880) [2040:6502] 17 Pinnacle PCTV HD Pro Stick em2880 2304:0227
19 -> EM2860/SAA711X Reference Design (em2860) 18 Hauppauge WinTV HVR 900 (R2) em2880 2040:6502
20 -> AMD ATI TV Wonder HD 600 (em2880) [0438:b002] 19 EM2860/SAA711X Reference Design em2860
21 -> eMPIA Technology, Inc. GrabBeeX+ Video Encoder (em2800) [eb1a:2801] 20 AMD ATI TV Wonder HD 600 em2880 0438:b002
22 -> EM2710/EM2750/EM2751 webcam grabber (em2750) [eb1a:2750,eb1a:2751] 21 eMPIA Technology, Inc. GrabBeeX+ Video Encoder em2800 eb1a:2801
23 -> Huaqi DLCW-130 (em2750) 22 EM2710/EM2750/EM2751 webcam grabber em2750 eb1a:2750, eb1a:2751
24 -> D-Link DUB-T210 TV Tuner (em2820/em2840) [2001:f112] 23 Huaqi DLCW-130 em2750
25 -> Gadmei UTV310 (em2820/em2840) 24 D-Link DUB-T210 TV Tuner em2820 or em2840 2001:f112
26 -> Hercules Smart TV USB 2.0 (em2820/em2840) 25 Gadmei UTV310 em2820 or em2840
27 -> Pinnacle PCTV USB 2 (Philips FM1216ME) (em2820/em2840) 26 Hercules Smart TV USB 2.0 em2820 or em2840
28 -> Leadtek Winfast USB II Deluxe (em2820/em2840) 27 Pinnacle PCTV USB 2 (Philips FM1216ME) em2820 or em2840
29 -> EM2860/TVP5150 Reference Design (em2860) 28 Leadtek Winfast USB II Deluxe em2820 or em2840
30 -> Videology 20K14XUSB USB2.0 (em2820/em2840) 29 EM2860/TVP5150 Reference Design em2860
31 -> Usbgear VD204v9 (em2821) 30 Videology 20K14XUSB USB2.0 em2820 or em2840
32 -> Supercomp USB 2.0 TV (em2821) 31 Usbgear VD204v9 em2821
33 -> Elgato Video Capture (em2860) [0fd9:0033] 32 Supercomp USB 2.0 TV em2821
34 -> Terratec Cinergy A Hybrid XS (em2860) [0ccd:004f] 33 Elgato Video Capture em2860 0fd9:0033
35 -> Typhoon DVD Maker (em2860) 34 Terratec Cinergy A Hybrid XS em2860 0ccd:004f
36 -> NetGMBH Cam (em2860) 35 Typhoon DVD Maker em2860
37 -> Gadmei UTV330 (em2860) [eb1a:50a6] 36 NetGMBH Cam em2860
38 -> Yakumo MovieMixer (em2861) 37 Gadmei UTV330 em2860 eb1a:50a6
39 -> KWorld PVRTV 300U (em2861) [eb1a:e300] 38 Yakumo MovieMixer em2861
40 -> Plextor ConvertX PX-TV100U (em2861) [093b:a005] 39 KWorld PVRTV 300U em2861 eb1a:e300
41 -> Kworld 350 U DVB-T (em2870) [eb1a:e350] 40 Plextor ConvertX PX-TV100U em2861 093b:a005
42 -> Kworld 355 U DVB-T (em2870) [eb1a:e355,eb1a:e357,eb1a:e359] 41 Kworld 350 U DVB-T em2870 eb1a:e350
43 -> Terratec Cinergy T XS (em2870) 42 Kworld 355 U DVB-T em2870 eb1a:e355, eb1a:e357, eb1a:e359
44 -> Terratec Cinergy T XS (MT2060) (em2870) [0ccd:0043] 43 Terratec Cinergy T XS em2870
45 -> Pinnacle PCTV DVB-T (em2870) 44 Terratec Cinergy T XS (MT2060) em2870 0ccd:0043
46 -> Compro, VideoMate U3 (em2870) [185b:2870] 45 Pinnacle PCTV DVB-T em2870
47 -> KWorld DVB-T 305U (em2880) [eb1a:e305] 46 Compro, VideoMate U3 em2870 185b:2870
48 -> KWorld DVB-T 310U (em2880) 47 KWorld DVB-T 305U em2880 eb1a:e305
49 -> MSI DigiVox A/D (em2880) [eb1a:e310] 48 KWorld DVB-T 310U em2880
50 -> MSI DigiVox A/D II (em2880) [eb1a:e320] 49 MSI DigiVox A/D em2880 eb1a:e310
51 -> Terratec Hybrid XS Secam (em2880) [0ccd:004c] 50 MSI DigiVox A/D II em2880 eb1a:e320
52 -> DNT DA2 Hybrid (em2881) 51 Terratec Hybrid XS Secam em2880 0ccd:004c
53 -> Pinnacle Hybrid Pro (em2881) 52 DNT DA2 Hybrid em2881
54 -> Kworld VS-DVB-T 323UR (em2882) [eb1a:e323] 53 Pinnacle Hybrid Pro em2881
55 -> Terratec Cinnergy Hybrid T USB XS (em2882) (em2882) [0ccd:005e,0ccd:0042] 54 Kworld VS-DVB-T 323UR em2882 eb1a:e323
56 -> Pinnacle Hybrid Pro (330e) (em2882) [2304:0226] 55 Terratec Cinnergy Hybrid T USB XS (em2882) em2882 0ccd:005e, 0ccd:0042
57 -> Kworld PlusTV HD Hybrid 330 (em2883) [eb1a:a316] 56 Pinnacle Hybrid Pro (330e) em2882 2304:0226
58 -> Compro VideoMate ForYou/Stereo (em2820/em2840) [185b:2041] 57 Kworld PlusTV HD Hybrid 330 em2883 eb1a:a316
59 -> Pinnacle PCTV HD Mini (em2874) [2304:023f] 58 Compro VideoMate ForYou/Stereo em2820 or em2840 185b:2041
60 -> Hauppauge WinTV HVR 850 (em2883) [2040:651f] 59 Pinnacle PCTV HD Mini em2874 2304:023f
61 -> Pixelview PlayTV Box 4 USB 2.0 (em2820/em2840) 60 Hauppauge WinTV HVR 850 em2883 2040:651f
62 -> Gadmei TVR200 (em2820/em2840) 61 Pixelview PlayTV Box 4 USB 2.0 em2820 or em2840
63 -> Kaiomy TVnPC U2 (em2860) [eb1a:e303] 62 Gadmei TVR200 em2820 or em2840
64 -> Easy Cap Capture DC-60 (em2860) [1b80:e309] 63 Kaiomy TVnPC U2 em2860 eb1a:e303
65 -> IO-DATA GV-MVP/SZ (em2820/em2840) [04bb:0515] 64 Easy Cap Capture DC-60 em2860 1b80:e309
66 -> Empire dual TV (em2880) 65 IO-DATA GV-MVP/SZ em2820 or em2840 04bb:0515
67 -> Terratec Grabby (em2860) [0ccd:0096,0ccd:10AF] 66 Empire dual TV em2880
68 -> Terratec AV350 (em2860) [0ccd:0084] 67 Terratec Grabby em2860 0ccd:0096, 0ccd:10AF
69 -> KWorld ATSC 315U HDTV TV Box (em2882) [eb1a:a313] 68 Terratec AV350 em2860 0ccd:0084
70 -> Evga inDtube (em2882) 69 KWorld ATSC 315U HDTV TV Box em2882 eb1a:a313
71 -> Silvercrest Webcam 1.3mpix (em2820/em2840) 70 Evga inDtube em2882
72 -> Gadmei UTV330+ (em2861) 71 Silvercrest Webcam 1.3mpix em2820 or em2840
73 -> Reddo DVB-C USB TV Box (em2870) 72 Gadmei UTV330+ em2861
74 -> Actionmaster/LinXcel/Digitus VC211A (em2800) 73 Reddo DVB-C USB TV Box em2870
75 -> Dikom DK300 (em2882) 74 Actionmaster/LinXcel/Digitus VC211A em2800
76 -> KWorld PlusTV 340U or UB435-Q (ATSC) (em2870) [1b80:a340] 75 Dikom DK300 em2882
77 -> EM2874 Leadership ISDBT (em2874) 76 KWorld PlusTV 340U or UB435-Q (ATSC) em2870 1b80:a340
78 -> PCTV nanoStick T2 290e (em28174) [2013:024f] 77 EM2874 Leadership ISDBT em2874
79 -> Terratec Cinergy H5 (em2884) [eb1a:2885,0ccd:10a2,0ccd:10ad,0ccd:10b6] 78 PCTV nanoStick T2 290e em28174 2013:024f
80 -> PCTV DVB-S2 Stick (460e) (em28174) [2013:024c] 79 Terratec Cinergy H5 em2884 eb1a:2885, 0ccd:10a2, 0ccd:10ad, 0ccd:10b6
81 -> Hauppauge WinTV HVR 930C (em2884) [2040:1605] 80 PCTV DVB-S2 Stick (460e) em28174 2013:024c
82 -> Terratec Cinergy HTC Stick (em2884) [0ccd:00b2] 81 Hauppauge WinTV HVR 930C em2884 2040:1605
83 -> Honestech Vidbox NW03 (em2860) [eb1a:5006] 82 Terratec Cinergy HTC Stick em2884 0ccd:00b2
84 -> MaxMedia UB425-TC (em2874) [1b80:e425] 83 Honestech Vidbox NW03 em2860 eb1a:5006
85 -> PCTV QuatroStick (510e) (em2884) [2304:0242] 84 MaxMedia UB425-TC em2874 1b80:e425
86 -> PCTV QuatroStick nano (520e) (em2884) [2013:0251] 85 PCTV QuatroStick (510e) em2884 2304:0242
87 -> Terratec Cinergy HTC USB XS (em2884) [0ccd:008e,0ccd:00ac] 86 PCTV QuatroStick nano (520e) em2884 2013:0251
88 -> C3 Tech Digital Duo HDTV/SDTV USB (em2884) [1b80:e755] 87 Terratec Cinergy HTC USB XS em2884 0ccd:008e, 0ccd:00ac
89 -> Delock 61959 (em2874) [1b80:e1cc] 88 C3 Tech Digital Duo HDTV/SDTV USB em2884 1b80:e755
90 -> KWorld USB ATSC TV Stick UB435-Q V2 (em2874) [1b80:e346] 89 Delock 61959 em2874 1b80:e1cc
91 -> SpeedLink Vicious And Devine Laplace webcam (em2765) [1ae7:9003,1ae7:9004] 90 KWorld USB ATSC TV Stick UB435-Q V2 em2874 1b80:e346
92 -> PCTV DVB-S2 Stick (461e) (em28178) [2013:0258] 91 SpeedLink Vicious And Devine Laplace webcam em2765 1ae7:9003, 1ae7:9004
93 -> KWorld USB ATSC TV Stick UB435-Q V3 (em2874) [1b80:e34c] 92 PCTV DVB-S2 Stick (461e) em28178 2013:0258
94 -> PCTV tripleStick (292e) (em28178) [2013:025f,2040:0264] 93 KWorld USB ATSC TV Stick UB435-Q V3 em2874 1b80:e34c
95 -> Leadtek VC100 (em2861) [0413:6f07] 94 PCTV tripleStick (292e) em28178 2013:025f, 2040:0264
96 -> Terratec Cinergy T2 Stick HD (em28178) [eb1a:8179] 95 Leadtek VC100 em2861 0413:6f07
97 -> Elgato EyeTV Hybrid 2008 INT (em2884) [0fd9:0018] 96 Terratec Cinergy T2 Stick HD em28178 eb1a:8179
98 -> PLEX PX-BCUD (em28178) [3275:0085] 97 Elgato EyeTV Hybrid 2008 INT em2884 0fd9:0018
99 -> Hauppauge WinTV-dualHD DVB (em28174) [2040:0265] 98 PLEX PX-BCUD em28178 3275:0085
99 Hauppauge WinTV-dualHD DVB em28174 2040:0265
=========== ==================================================================== ================ ==================================================================================================================================

View File

@ -6,407 +6,444 @@ The modules for the gspca webcam drivers are:
- gspca_main: main driver - gspca_main: main driver
- gspca\_\ *driver*: subdriver module with *driver* as follows - gspca\_\ *driver*: subdriver module with *driver* as follows
========= ========= ==================================================================== ========= ========= ===================================================================
*driver* vend:prod Device *driver* vend:prod Device
========= ========= ==================================================================== ========= ========= ===================================================================
spca501 0000:0000 MystFromOri Unknown Camera spca501 0000:0000 MystFromOri Unknown Camera
spca508 0130:0130 Clone Digital Webcam 11043 spca508 0130:0130 Clone Digital Webcam 11043
zc3xx 03f0:1b07 HP Premium Starter Cam se401 03e8:0004 Endpoints/AoxSE401
m5602 0402:5602 ALi Video Camera Controller zc3xx 03f0:1b07 HP Premium Starter Cam
spca501 040a:0002 Kodak DVC-325 m5602 0402:5602 ALi Video Camera Controller
spca500 040a:0300 Kodak EZ200 spca501 040a:0002 Kodak DVC-325
zc3xx 041e:041e Creative WebCam Live! spca500 040a:0300 Kodak EZ200
ov519 041e:4003 Video Blaster WebCam Go Plus zc3xx 041e:041e Creative WebCam Live!
spca500 041e:400a Creative PC-CAM 300 ov519 041e:4003 Video Blaster WebCam Go Plus
sunplus 041e:400b Creative PC-CAM 600 stv0680 041e:4007 Go Mini
sunplus 041e:4012 PC-Cam350 spca500 041e:400a Creative PC-CAM 300
sunplus 041e:4013 Creative Pccam750 sunplus 041e:400b Creative PC-CAM 600
zc3xx 041e:4017 Creative Webcam Mobile PD1090 sunplus 041e:4012 PC-Cam350
spca508 041e:4018 Creative Webcam Vista (PD1100) sunplus 041e:4013 Creative Pccam750
spca561 041e:401a Creative Webcam Vista (PD1100) zc3xx 041e:4017 Creative Webcam Mobile PD1090
zc3xx 041e:401c Creative NX spca508 041e:4018 Creative Webcam Vista (PD1100)
spca505 041e:401d Creative Webcam NX ULTRA spca561 041e:401a Creative Webcam Vista (PD1100)
zc3xx 041e:401e Creative Nx Pro zc3xx 041e:401c Creative NX
zc3xx 041e:401f Creative Webcam Notebook PD1171 spca505 041e:401d Creative Webcam NX ULTRA
pac207 041e:4028 Creative Webcam Vista Plus zc3xx 041e:401e Creative Nx Pro
zc3xx 041e:4029 Creative WebCam Vista Pro zc3xx 041e:401f Creative Webcam Notebook PD1171
zc3xx 041e:4034 Creative Instant P0620 zc3xx 041e:4022 Webcam NX Pro
zc3xx 041e:4035 Creative Instant P0620D pac207 041e:4028 Creative Webcam Vista Plus
zc3xx 041e:4036 Creative Live ! zc3xx 041e:4029 Creative WebCam Vista Pro
sq930x 041e:4038 Creative Joy-IT zc3xx 041e:4034 Creative Instant P0620
zc3xx 041e:403a Creative Nx Pro 2 zc3xx 041e:4035 Creative Instant P0620D
spca561 041e:403b Creative Webcam Vista (VF0010) zc3xx 041e:4036 Creative Live !
sq930x 041e:403c Creative Live! Ultra sq930x 041e:4038 Creative Joy-IT
sq930x 041e:403d Creative Live! Ultra for Notebooks zc3xx 041e:403a Creative Nx Pro 2
sq930x 041e:4041 Creative Live! Motion spca561 041e:403b Creative Webcam Vista (VF0010)
zc3xx 041e:4051 Creative Live!Cam Notebook Pro (VF0250) sq930x 041e:403c Creative Live! Ultra
ov519 041e:4052 Creative Live! VISTA IM sq930x 041e:403d Creative Live! Ultra for Notebooks
zc3xx 041e:4053 Creative Live!Cam Video IM sq930x 041e:4041 Creative Live! Motion
vc032x 041e:405b Creative Live! Cam Notebook Ultra (VC0130) zc3xx 041e:4051 Creative Live!Cam Notebook Pro (VF0250)
ov519 041e:405f Creative Live! VISTA VF0330 ov519 041e:4052 Creative Live! VISTA IM
ov519 041e:4060 Creative Live! VISTA VF0350 zc3xx 041e:4053 Creative Live!Cam Video IM
ov519 041e:4061 Creative Live! VISTA VF0400 vc032x 041e:405b Creative Live! Cam Notebook Ultra (VC0130)
ov519 041e:4064 Creative Live! VISTA VF0420 ov519 041e:405f Creative Live! VISTA VF0330
ov519 041e:4067 Creative Live! Cam Video IM (VF0350) ov519 041e:4060 Creative Live! VISTA VF0350
ov519 041e:4068 Creative Live! VISTA VF0470 ov519 041e:4061 Creative Live! VISTA VF0400
spca561 0458:7004 Genius VideoCAM Express V2 ov519 041e:4064 Creative Live! VISTA VF0420
sn9c2028 0458:7005 Genius Smart 300, version 2 ov519 041e:4067 Creative Live! Cam Video IM (VF0350)
sunplus 0458:7006 Genius Dsc 1.3 Smart ov519 041e:4068 Creative Live! VISTA VF0470
zc3xx 0458:7007 Genius VideoCam V2 sn9c2028 0458:7003 GeniusVideocam Live v2
zc3xx 0458:700c Genius VideoCam V3 spca561 0458:7004 Genius VideoCAM Express V2
zc3xx 0458:700f Genius VideoCam Web V2 sn9c2028 0458:7005 Genius Smart 300, version 2
sonixj 0458:7025 Genius Eye 311Q sunplus 0458:7006 Genius Dsc 1.3 Smart
sn9c20x 0458:7029 Genius Look 320s zc3xx 0458:7007 Genius VideoCam V2
sonixj 0458:702e Genius Slim 310 NB zc3xx 0458:700c Genius VideoCam V3
sn9c20x 0458:7045 Genius Look 1320 V2 zc3xx 0458:700f Genius VideoCam Web V2
sn9c20x 0458:704a Genius Slim 1320 sonixj 0458:7025 Genius Eye 311Q
sn9c20x 0458:704c Genius i-Look 1321 sn9c20x 0458:7029 Genius Look 320s
sn9c20x 045e:00f4 LifeCam VX-6000 (SN9C20x + OV9650) sonixj 0458:702e Genius Slim 310 NB
sonixj 045e:00f5 MicroSoft VX3000 sn9c20x 0458:7045 Genius Look 1320 V2
sonixj 045e:00f7 MicroSoft VX1000 sn9c20x 0458:704a Genius Slim 1320
ov519 045e:028c Micro$oft xbox cam sn9c20x 0458:704c Genius i-Look 1321
spca508 0461:0815 Micro Innovation IC200 sn9c20x 045e:00f4 LifeCam VX-6000 (SN9C20x + OV9650)
sunplus 0461:0821 Fujifilm MV-1 sonixj 045e:00f5 MicroSoft VX3000
zc3xx 0461:0a00 MicroInnovation WebCam320 sonixj 045e:00f7 MicroSoft VX1000
stv06xx 046d:0840 QuickCam Express ov519 045e:028c Micro$oft xbox cam
stv06xx 046d:0850 LEGO cam / QuickCam Web kinect 045e:02ae Xbox NUI Camera
stv06xx 046d:0870 Dexxa WebCam USB kinect 045e:02bf Kinect for Windows NUI Camera
spca500 046d:0890 Logitech QuickCam traveler spca561 0461:0815 Micro Innovations IC200 Webcam
vc032x 046d:0892 Logitech Orbicam sunplus 0461:0821 Fujifilm MV-1
vc032x 046d:0896 Logitech Orbicam zc3xx 0461:0a00 MicroInnovation WebCam320
vc032x 046d:0897 Logitech QuickCam for Dell notebooks stv06xx 046D:08F0 QuickCamMessenger
zc3xx 046d:089d Logitech QuickCam E2500 stv06xx 046D:08F5 QuickCamCommunicate
zc3xx 046d:08a0 Logitech QC IM stv06xx 046D:08F6 QuickCamMessenger (new)
zc3xx 046d:08a1 Logitech QC IM 0x08A1 +sound stv06xx 046d:0840 QuickCamExpress
zc3xx 046d:08a2 Labtec Webcam Pro stv06xx 046d:0850 LEGOcam / QuickCam Web
zc3xx 046d:08a3 Logitech QC Chat stv06xx 046d:0870 DexxaWebCam USB
zc3xx 046d:08a6 Logitech QCim spca500 046d:0890 Logitech QuickCam traveler
zc3xx 046d:08a7 Logitech QuickCam Image vc032x 046d:0892 Logitech Orbicam
zc3xx 046d:08a9 Logitech Notebook Deluxe vc032x 046d:0896 Logitech Orbicam
zc3xx 046d:08aa Labtec Webcam Notebook vc032x 046d:0897 Logitech QuickCam for Dell notebooks
zc3xx 046d:08ac Logitech QuickCam Cool zc3xx 046d:089d Logitech QuickCam E2500
zc3xx 046d:08ad Logitech QCCommunicate STX zc3xx 046d:08a0 Logitech QC IM
zc3xx 046d:08ae Logitech QuickCam for Notebooks zc3xx 046d:08a1 Logitech QC IM 0x08A1 +sound
zc3xx 046d:08af Logitech QuickCam Cool zc3xx 046d:08a2 Labtec Webcam Pro
zc3xx 046d:08b9 Logitech QuickCam Express zc3xx 046d:08a3 Logitech QC Chat
zc3xx 046d:08d7 Logitech QCam STX zc3xx 046d:08a6 Logitech QCim
zc3xx 046d:08d9 Logitech QuickCam IM/Connect zc3xx 046d:08a7 Logitech QuickCam Image
zc3xx 046d:08d8 Logitech Notebook Deluxe zc3xx 046d:08a9 Logitech Notebook Deluxe
zc3xx 046d:08da Logitech QuickCam Messenger zc3xx 046d:08aa Labtec Webcam Notebook
zc3xx 046d:08dd Logitech QuickCam for Notebooks zc3xx 046d:08ac Logitech QuickCam Cool
spca500 046d:0900 Logitech Inc. ClickSmart 310 zc3xx 046d:08ad Logitech QCCommunicate STX
spca500 046d:0901 Logitech Inc. ClickSmart 510 zc3xx 046d:08ae Logitech QuickCam for Notebooks
sunplus 046d:0905 Logitech ClickSmart 820 zc3xx 046d:08af Logitech QuickCam Cool
tv8532 046d:0920 Logitech QuickCam Express zc3xx 046d:08b9 Logitech QuickCam Express
tv8532 046d:0921 Labtec Webcam zc3xx 046d:08d7 Logitech QCam STX
spca561 046d:0928 Logitech QC Express Etch2 zc3xx 046d:08d8 Logitech Notebook Deluxe
spca561 046d:0929 Labtec Webcam Elch2 zc3xx 046d:08d9 Logitech QuickCam IM/Connect
spca561 046d:092a Logitech QC for Notebook zc3xx 046d:08da Logitech QuickCam Messenger
spca561 046d:092b Labtec Webcam Plus zc3xx 046d:08dd Logitech QuickCam for Notebooks
spca561 046d:092c Logitech QC chat Elch2 spca500 046d:0900 Logitech Inc. ClickSmart 310
spca561 046d:092d Logitech QC Elch2 spca500 046d:0901 Logitech Inc. ClickSmart 510
spca561 046d:092e Logitech QC Elch2 sunplus 046d:0905 Logitech ClickSmart 820
spca561 046d:092f Logitech QuickCam Express Plus tv8532 046d:0920 Logitech QuickCam Express
sunplus 046d:0960 Logitech ClickSmart 420 tv8532 046d:0921 Labtec Webcam
nw80x 046d:d001 Logitech QuickCam Pro (dark focus ring) spca561 046d:0928 Logitech QC Express Etch2
sunplus 0471:0322 Philips DMVC1300K spca561 046d:0929 Labtec Webcam Elch2
zc3xx 0471:0325 Philips SPC 200 NC spca561 046d:092a Logitech QC for Notebook
zc3xx 0471:0326 Philips SPC 300 NC spca561 046d:092b Labtec Webcam Plus
sonixj 0471:0327 Philips SPC 600 NC spca561 046d:092c Logitech QC chat Elch2
sonixj 0471:0328 Philips SPC 700 NC spca561 046d:092d Logitech QC Elch2
zc3xx 0471:032d Philips SPC 210 NC spca561 046d:092e Logitech QC Elch2
zc3xx 0471:032e Philips SPC 315 NC spca561 046d:092f Logitech QuickCam Express Plus
sonixj 0471:0330 Philips SPC 710 NC sunplus 046d:0960 Logitech ClickSmart 420
spca501 0497:c001 Smile International nw80x 046d:d001 Logitech QuickCam Pro (dark focus ring)
sunplus 04a5:3003 Benq DC 1300 se401 0471:030b PhilipsPCVC665K
sunplus 04a5:3008 Benq DC 1500 sunplus 0471:0322 Philips DMVC1300K
sunplus 04a5:300a Benq DC 3410 zc3xx 0471:0325 Philips SPC 200 NC
spca500 04a5:300c Benq DC 1016 zc3xx 0471:0326 Philips SPC 300 NC
benq 04a5:3035 Benq DC E300 sonixj 0471:0327 Philips SPC 600 NC
finepix 04cb:0104 Fujifilm FinePix 4800 sonixj 0471:0328 Philips SPC 700 NC
finepix 04cb:0109 Fujifilm FinePix A202 zc3xx 0471:032d Philips SPC 210 NC
finepix 04cb:010b Fujifilm FinePix A203 zc3xx 0471:032e Philips SPC 315 NC
finepix 04cb:010f Fujifilm FinePix A204 sonixj 0471:0330 Philips SPC 710 NC
finepix 04cb:0111 Fujifilm FinePix A205 se401 047d:5001 Kensington67014
finepix 04cb:0113 Fujifilm FinePix A210 se401 047d:5002 Kensington6701(5/7)
finepix 04cb:0115 Fujifilm FinePix A303 se401 047d:5003 Kensington67016
finepix 04cb:0117 Fujifilm FinePix A310 spca501 0497:c001 Smile International
finepix 04cb:0119 Fujifilm FinePix F401 sunplus 04a5:3003 Benq DC 1300
finepix 04cb:011b Fujifilm FinePix F402 sunplus 04a5:3008 Benq DC 1500
finepix 04cb:011d Fujifilm FinePix F410 sunplus 04a5:300a Benq DC 3410
finepix 04cb:0121 Fujifilm FinePix F601 spca500 04a5:300c Benq DC 1016
finepix 04cb:0123 Fujifilm FinePix F700 benq 04a5:3035 Benq DC E300
finepix 04cb:0125 Fujifilm FinePix M603 vicam 04c1:009d HomeConnect Webcam [vicam]
finepix 04cb:0127 Fujifilm FinePix S300 konica 04c8:0720 IntelYC 76
finepix 04cb:0129 Fujifilm FinePix S304 finepix 04cb:0104 Fujifilm FinePix 4800
finepix 04cb:012b Fujifilm FinePix S500 finepix 04cb:0109 Fujifilm FinePix A202
finepix 04cb:012d Fujifilm FinePix S602 finepix 04cb:010b Fujifilm FinePix A203
finepix 04cb:012f Fujifilm FinePix S700 finepix 04cb:010f Fujifilm FinePix A204
finepix 04cb:0131 Fujifilm FinePix unknown model finepix 04cb:0111 Fujifilm FinePix A205
finepix 04cb:013b Fujifilm FinePix unknown model finepix 04cb:0113 Fujifilm FinePix A210
finepix 04cb:013d Fujifilm FinePix unknown model finepix 04cb:0115 Fujifilm FinePix A303
finepix 04cb:013f Fujifilm FinePix F420 finepix 04cb:0117 Fujifilm FinePix A310
sunplus 04f1:1001 JVC GC A50 finepix 04cb:0119 Fujifilm FinePix F401
spca561 04fc:0561 Flexcam 100 finepix 04cb:011b Fujifilm FinePix F402
spca1528 04fc:1528 Sunplus MD80 clone finepix 04cb:011d Fujifilm FinePix F410
sunplus 04fc:500c Sunplus CA500C finepix 04cb:0121 Fujifilm FinePix F601
sunplus 04fc:504a Aiptek Mini PenCam 1.3 finepix 04cb:0123 Fujifilm FinePix F700
sunplus 04fc:504b Maxell MaxPocket LE 1.3 finepix 04cb:0125 Fujifilm FinePix M603
sunplus 04fc:5330 Digitrex 2110 finepix 04cb:0127 Fujifilm FinePix S300
sunplus 04fc:5360 Sunplus Generic finepix 04cb:0129 Fujifilm FinePix S304
spca500 04fc:7333 PalmPixDC85 finepix 04cb:012b Fujifilm FinePix S500
sunplus 04fc:ffff Pure DigitalDakota finepix 04cb:012d Fujifilm FinePix S602
nw80x 0502:d001 DVC V6 finepix 04cb:012f Fujifilm FinePix S700
spca501 0506:00df 3Com HomeConnect Lite finepix 04cb:0131 Fujifilm FinePix unknown model
sunplus 052b:1507 Megapixel 5 Pretec DC-1007 finepix 04cb:013b Fujifilm FinePix unknown model
sunplus 052b:1513 Megapix V4 finepix 04cb:013d Fujifilm FinePix unknown model
sunplus 052b:1803 MegaImage VI finepix 04cb:013f Fujifilm FinePix F420
nw80x 052b:d001 EZCam Pro p35u sunplus 04f1:1001 JVC GC A50
tv8532 0545:808b Veo Stingray spca561 04fc:0561 Flexcam 100
tv8532 0545:8333 Veo Stingray spca1528 04fc:1528 Sunplus MD80 clone
sunplus 0546:3155 Polaroid PDC3070 sunplus 04fc:500c Sunplus CA500C
sunplus 0546:3191 Polaroid Ion 80 sunplus 04fc:504a Aiptek Mini PenCam 1.3
sunplus 0546:3273 Polaroid PDC2030 sunplus 04fc:504b Maxell MaxPocket LE 1.3
ov519 054c:0154 Sonny toy4 sunplus 04fc:5330 Digitrex 2110
ov519 054c:0155 Sonny toy5 sunplus 04fc:5360 Sunplus Generic
cpia1 0553:0002 CPIA CPiA (version1) based cameras spca500 04fc:7333 PalmPixDC85
zc3xx 055f:c005 Mustek Wcam300A sunplus 04fc:ffff Pure DigitalDakota
spca500 055f:c200 Mustek Gsmart 300 nw80x 0502:d001 DVC V6
sunplus 055f:c211 Kowa Bs888e Microcamera spca501 0506:00df 3Com HomeConnect Lite
spca500 055f:c220 Gsmart Mini sunplus 052b:1507 Megapixel 5 Pretec DC-1007
sunplus 055f:c230 Mustek Digicam 330K sunplus 052b:1513 Megapix V4
sunplus 055f:c232 Mustek MDC3500 sunplus 052b:1803 MegaImage VI
sunplus 055f:c360 Mustek DV4000 Mpeg4 nw80x 052b:d001 EZCam Pro p35u
sunplus 055f:c420 Mustek gSmart Mini 2 tv8532 0545:808b Veo Stingray
sunplus 055f:c430 Mustek Gsmart LCD 2 tv8532 0545:8333 Veo Stingray
sunplus 055f:c440 Mustek DV 3000 sunplus 0546:3155 Polaroid PDC3070
sunplus 055f:c520 Mustek gSmart Mini 3 sunplus 0546:3191 Polaroid Ion 80
sunplus 055f:c530 Mustek Gsmart LCD 3 sunplus 0546:3273 Polaroid PDC2030
sunplus 055f:c540 Gsmart D30 touptek 0547:6801 TTUCMOS08000KPB, AS MU800
sunplus 055f:c630 Mustek MDC4000 dtcs033 0547:7303 Anchor Chips, Inc
sunplus 055f:c650 Mustek MDC5500Z ov519 054c:0154 Sonny toy4
nw80x 055f:d001 Mustek Wcam 300 mini ov519 054c:0155 Sonny toy5
zc3xx 055f:d003 Mustek WCam300A cpia1 0553:0002 CPIA CPiA (version1) based cameras
zc3xx 055f:d004 Mustek WCam300 AN stv0680 0553:0202 STV0680 Camera
conex 0572:0041 Creative Notebook cx11646 zc3xx 055f:c005 Mustek Wcam300A
ov519 05a9:0511 Video Blaster WebCam 3/WebCam Plus, D-Link USB Digital Video Camera spca500 055f:c200 Mustek Gsmart 300
ov519 05a9:0518 Creative WebCam sunplus 055f:c211 Kowa Bs888e Microcamera
ov519 05a9:0519 OV519 Microphone spca500 055f:c220 Gsmart Mini
ov519 05a9:0530 OmniVision sunplus 055f:c230 Mustek Digicam 330K
ov534_9 05a9:1550 OmniVision VEHO Filmscanner sunplus 055f:c232 Mustek MDC3500
ov519 05a9:2800 OmniVision SuperCAM sunplus 055f:c360 Mustek DV4000 Mpeg4
ov519 05a9:4519 Webcam Classic sunplus 055f:c420 Mustek gSmart Mini 2
ov534_9 05a9:8065 OmniVision test kit ov538+ov9712 sunplus 055f:c430 Mustek Gsmart LCD 2
ov519 05a9:8519 OmniVision sunplus 055f:c440 Mustek DV 3000
ov519 05a9:a511 D-Link USB Digital Video Camera sunplus 055f:c520 Mustek gSmart Mini 3
ov519 05a9:a518 D-Link DSB-C310 Webcam sunplus 055f:c530 Mustek Gsmart LCD 3
sunplus 05da:1018 Digital Dream Enigma 1.3 sunplus 055f:c540 Gsmart D30
stk014 05e1:0893 Syntek DV4000 sunplus 055f:c630 Mustek MDC4000
gl860 05e3:0503 Genesys Logic PC Camera sunplus 055f:c650 Mustek MDC5500Z
gl860 05e3:f191 Genesys Logic PC Camera nw80x 055f:d001 Mustek Wcam 300 mini
spca561 060b:a001 Maxell Compact Pc PM3 zc3xx 055f:d003 Mustek WCam300A
zc3xx 0698:2003 CTX M730V built in zc3xx 055f:d004 Mustek WCam300 AN
topro 06a2:0003 TP6800 PC Camera, CmoX CX0342 webcam conex 0572:0041 Creative Notebook cx11646
topro 06a2:6810 Creative Qmax ov519 05a9:0511 Video Blaster WebCam 3/WebCam Plus, D-Link USB Digital Video Camera
nw80x 06a5:0000 Typhoon Webcam 100 USB ov519 05a9:0518 Creative WebCam
nw80x 06a5:d001 Divio based webcams ov519 05a9:0519 OV519 Microphone
nw80x 06a5:d800 Divio Chicony TwinkleCam, Trust SpaceCam ov519 05a9:0530 OmniVision
spca500 06bd:0404 Agfa CL20 ov534_9 05a9:1550 OmniVision VEHO Filmscanner
spca500 06be:0800 Optimedia ov519 05a9:2800 OmniVision SuperCAM
nw80x 06be:d001 EZCam Pro p35u ov519 05a9:4519 Webcam Classic
sunplus 06d6:0031 Trust 610 LCD PowerC@m Zoom ov534_9 05a9:8065 OmniVision test kit ov538+ov9712
spca506 06e1:a190 ADS Instant VCD ov519 05a9:8519 OmniVision
ov534 06f8:3002 Hercules Blog Webcam ov519 05a9:a511 D-Link USB Digital Video Camera
ov534_9 06f8:3003 Hercules Dualpix HD Weblog ov519 05a9:a518 D-Link DSB-C310 Webcam
sonixj 06f8:3004 Hercules Classic Silver sunplus 05da:1018 Digital Dream Enigma 1.3
sonixj 06f8:3008 Hercules Deluxe Optical Glass stk014 05e1:0893 Syntek DV4000
pac7302 06f8:3009 Hercules Classic Link gl860 05e3:0503 Genesys Logic PC Camera
pac7302 06f8:301b Hercules Link gl860 05e3:f191 Genesys Logic PC Camera
nw80x 0728:d001 AVerMedia Camguard vicam 0602:1001 ViCam Webcam
spca508 0733:0110 ViewQuest VQ110 spca561 060b:a001 Maxell Compact Pc PM3
spca501 0733:0401 Intel Create and Share zc3xx 0698:2003 CTX M730V built in
spca501 0733:0402 ViewQuest M318B topro 06a2:0003 TP6800 PC Camera, CmoX CX0342 webcam
spca505 0733:0430 Intel PC Camera Pro topro 06a2:6810 Creative Qmax
sunplus 0733:1311 Digital Dream Epsilon 1.3 nw80x 06a5:0000 Typhoon Webcam 100 USB
sunplus 0733:1314 Mercury 2.1MEG Deluxe Classic Cam nw80x 06a5:d001 Divio based webcams
sunplus 0733:2211 Jenoptik jdc 21 LCD nw80x 06a5:d800 Divio Chicony TwinkleCam, Trust SpaceCam
sunplus 0733:2221 Mercury Digital Pro 3.1p spca500 06bd:0404 Agfa CL20
sunplus 0733:3261 Concord 3045 spca536a spca500 06be:0800 Optimedia
sunplus 0733:3281 Cyberpix S550V nw80x 06be:d001 EZCam Pro p35u
spca506 0734:043b 3DeMon USB Capture aka sunplus 06d6:0031 Trust 610 LCD PowerC@m Zoom
cpia1 0813:0001 QX3 camera sunplus 06d6:0041 Aashima Technology B.V.
ov519 0813:0002 Dual Mode USB Camera Plus spca506 06e1:a190 ADS Instant VCD
spca500 084d:0003 D-Link DSC-350 ov534 06f8:3002 Hercules Blog Webcam
spca500 08ca:0103 Aiptek PocketDV ov534_9 06f8:3003 Hercules Dualpix HD Weblog
sunplus 08ca:0104 Aiptek PocketDVII 1.3 sonixj 06f8:3004 Hercules Classic Silver
sunplus 08ca:0106 Aiptek Pocket DV3100+ sonixj 06f8:3008 Hercules Deluxe Optical Glass
mr97310a 08ca:0110 Trust Spyc@m 100 pac7302 06f8:3009 Hercules Classic Link
mr97310a 08ca:0111 Aiptek PenCam VGA+ pac7302 06f8:301b Hercules Link
sunplus 08ca:2008 Aiptek Mini PenCam 2 M nw80x 0728:d001 AVerMedia Camguard
sunplus 08ca:2010 Aiptek PocketCam 3M spca508 0733:0110 ViewQuest VQ110
sunplus 08ca:2016 Aiptek PocketCam 2 Mega spca501 0733:0401 Intel Create and Share
sunplus 08ca:2018 Aiptek Pencam SD 2M spca501 0733:0402 ViewQuest M318B
sunplus 08ca:2020 Aiptek Slim 3000F spca505 0733:0430 Intel PC Camera Pro
sunplus 08ca:2022 Aiptek Slim 3200 sunplus 0733:1311 Digital Dream Epsilon 1.3
sunplus 08ca:2024 Aiptek DV3500 Mpeg4 sunplus 0733:1314 Mercury 2.1MEG Deluxe Classic Cam
sunplus 08ca:2028 Aiptek PocketCam4M sunplus 0733:2211 Jenoptik jdc 21 LCD
sunplus 08ca:2040 Aiptek PocketDV4100M sunplus 0733:2221 Mercury Digital Pro 3.1p
sunplus 08ca:2042 Aiptek PocketDV5100 sunplus 0733:3261 Concord 3045 spca536a
sunplus 08ca:2050 Medion MD 41437 sunplus 0733:3281 Cyberpix S550V
sunplus 08ca:2060 Aiptek PocketDV5300 spca506 0734:043b 3DeMon USB Capture aka
tv8532 0923:010f ICM532 cams cpia1 0813:0001 QX3 camera
mars 093a:050f Mars-Semi Pc-Camera ov519 0813:0002 Dual Mode USB Camera Plus
mr97310a 093a:010e All known CIF cams with this ID spca500 084d:0003 D-Link DSC-350
mr97310a 093a:010f All known VGA cams with this ID spca500 08ca:0103 Aiptek PocketDV
pac207 093a:2460 Qtec Webcam 100 sunplus 08ca:0104 Aiptek PocketDVII 1.3
pac207 093a:2461 HP Webcam sunplus 08ca:0106 Aiptek Pocket DV3100+
pac207 093a:2463 Philips SPC 220 NC mr97310a 08ca:0110 Trust Spyc@m 100
pac207 093a:2464 Labtec Webcam 1200 mr97310a 08ca:0111 Aiptek PenCam VGA+
pac207 093a:2468 Webcam WB-1400T sunplus 08ca:2008 Aiptek Mini PenCam 2 M
pac207 093a:2470 Genius GF112 sunplus 08ca:2010 Aiptek PocketCam 3M
pac207 093a:2471 Genius VideoCam ge111 sunplus 08ca:2016 Aiptek PocketCam 2 Mega
pac207 093a:2472 Genius VideoCam ge110 sunplus 08ca:2018 Aiptek Pencam SD 2M
pac207 093a:2474 Genius iLook 111 sunplus 08ca:2020 Aiptek Slim 3000F
pac207 093a:2476 Genius e-Messenger 112 sunplus 08ca:2022 Aiptek Slim 3200
pac7311 093a:2600 PAC7311 Typhoon sunplus 08ca:2024 Aiptek DV3500 Mpeg4
pac7311 093a:2601 Philips SPC 610 NC sunplus 08ca:2028 Aiptek PocketCam4M
pac7311 093a:2603 Philips SPC 500 NC sunplus 08ca:2040 Aiptek PocketDV4100M
pac7311 093a:2608 Trust WB-3300p sunplus 08ca:2042 Aiptek PocketDV5100
pac7311 093a:260e Gigaware VGA PC Camera, Trust WB-3350p, SIGMA cam 2350 sunplus 08ca:2050 Medion MD 41437
pac7311 093a:260f SnakeCam sunplus 08ca:2060 Aiptek PocketDV5300
pac7302 093a:2620 Apollo AC-905 tv8532 0923:010f ICM532 cams
pac7302 093a:2621 PAC731x mr97310a 093a:010e All known CIF cams with this ID
pac7302 093a:2622 Genius Eye 312 mr97310a 093a:010f All known VGA cams with this ID
pac7302 093a:2624 PAC7302 mars 093a:050f Mars-Semi Pc-Camera
pac7302 093a:2625 Genius iSlim 310 pac207 093a:2460 Qtec Webcam 100
pac7302 093a:2626 Labtec 2200 pac207 093a:2461 HP Webcam
pac7302 093a:2627 Genius FaceCam 300 pac207 093a:2463 Philips SPC 220 NC
pac7302 093a:2628 Genius iLook 300 pac207 093a:2464 Labtec Webcam 1200
pac7302 093a:2629 Genious iSlim 300 pac207 093a:2468 Webcam WB-1400T
pac7302 093a:262a Webcam 300k pac207 093a:2470 Genius GF112
pac7302 093a:262c Philips SPC 230 NC pac207 093a:2471 Genius VideoCam ge111
jl2005bcd 0979:0227 Various brands, 19 known cameras supported pac207 093a:2472 Genius VideoCam ge110
jeilinj 0979:0280 Sakar 57379 pac207 093a:2474 Genius iLook 111
jeilinj 0979:0280 Sportscam DV15 pac207 093a:2476 Genius e-Messenger 112
zc3xx 0ac8:0302 Z-star Vimicro zc0302 pac7311 093a:2600 PAC7311 Typhoon
vc032x 0ac8:0321 Vimicro generic vc0321 pac7311 093a:2601 Philips SPC 610 NC
vc032x 0ac8:0323 Vimicro Vc0323 pac7311 093a:2603 Philips SPC 500 NC
vc032x 0ac8:0328 A4Tech PK-130MG pac7311 093a:2608 Trust WB-3300p
zc3xx 0ac8:301b Z-Star zc301b pac7311 093a:260e Gigaware VGA PC Camera, Trust WB-3350p, SIGMA cam 2350
zc3xx 0ac8:303b Vimicro 0x303b pac7311 093a:260f SnakeCam
zc3xx 0ac8:305b Z-star Vimicro zc0305b pac7302 093a:2620 Apollo AC-905
zc3xx 0ac8:307b PC Camera (ZS0211) pac7302 093a:2621 PAC731x
vc032x 0ac8:c001 Sony embedded vimicro pac7302 093a:2622 Genius Eye 312
vc032x 0ac8:c002 Sony embedded vimicro pac7302 093a:2623 Pixart Imaging, Inc.
vc032x 0ac8:c301 Samsung Q1 Ultra Premium pac7302 093a:2624 PAC7302
spca508 0af9:0010 Hama USB Sightcam 100 pac7302 093a:2625 Genius iSlim 310
spca508 0af9:0011 Hama USB Sightcam 100 pac7302 093a:2626 Labtec 2200
ov519 0b62:0059 iBOT2 Webcam pac7302 093a:2627 Genius FaceCam 300
sonixb 0c45:6001 Genius VideoCAM NB pac7302 093a:2628 Genius iLook 300
sonixb 0c45:6005 Microdia Sweex Mini Webcam pac7302 093a:2629 Genious iSlim 300
sonixb 0c45:6007 Sonix sn9c101 + Tas5110D pac7302 093a:262a Webcam 300k
sonixb 0c45:6009 spcaCam@120 pac7302 093a:262c Philips SPC 230 NC
sonixb 0c45:600d spcaCam@120 jl2005bcd 0979:0227 Various brands, 19 known cameras supported
sonixb 0c45:6011 Microdia PC Camera (SN9C102) jeilinj 0979:0270 Sakar 57379
sonixb 0c45:6019 Generic Sonix OV7630 jeilinj 0979:0280 Sportscam DV15, Sakar 57379
sonixb 0c45:6024 Generic Sonix Tas5130c zc3xx 0ac8:0301 Web Camera
sonixb 0c45:6025 Xcam Shanga zc3xx 0ac8:0302 Z-star Vimicro zc0302
sonixb 0c45:6028 Sonix Btc Pc380 vc032x 0ac8:0321 Vimicro generic vc0321
sonixb 0c45:6029 spcaCam@150 vc032x 0ac8:0323 Vimicro Vc0323
sonixb 0c45:602c Generic Sonix OV7630 vc032x 0ac8:0328 A4Tech PK-130MG
sonixb 0c45:602d LIC-200 LG zc3xx 0ac8:301b Z-Star zc301b
sonixb 0c45:602e Genius VideoCam Messenger zc3xx 0ac8:303b Vimicro 0x303b
sonixj 0c45:6040 Speed NVC 350K zc3xx 0ac8:305b Z-star Vimicro zc0305b
sonixj 0c45:607c Sonix sn9c102p Hv7131R zc3xx 0ac8:307b PC Camera (ZS0211)
sonixj 0c45:60c0 Sangha Sn535 vc032x 0ac8:c001 Sony embedded vimicro
sonixj 0c45:60ce USB-PC-Camera-168 (TALK-5067) vc032x 0ac8:c002 Sony embedded vimicro
sonixj 0c45:60ec SN9C105+MO4000 vc032x 0ac8:c301 Samsung Q1 Ultra Premium
sonixj 0c45:60fb Surfer NoName spca508 0af9:0010 Hama USB Sightcam 100
sonixj 0c45:60fc LG-LIC300 spca508 0af9:0011 Hama USB Sightcam 100
sonixj 0c45:60fe Microdia Audio ov519 0b62:0059 iBOT2 Webcam
sonixj 0c45:6100 PC Camera (SN9C128) sonixb 0c45:6001 Genius VideoCAM NB
sonixj 0c45:6102 PC Camera (SN9C128) sonixb 0c45:6005 Microdia Sweex Mini Webcam
sonixj 0c45:610a PC Camera (SN9C128) sonixb 0c45:6007 Sonix sn9c101 + Tas5110D
sonixj 0c45:610b PC Camera (SN9C128) sonixb 0c45:6009 spcaCam@120
sonixj 0c45:610c PC Camera (SN9C128) sonixb 0c45:600d spcaCam@120
sonixj 0c45:610e PC Camera (SN9C128) sonixb 0c45:6011 Microdia PC Camera (SN9C102)
sonixj 0c45:6128 Microdia/Sonix SNP325 sonixb 0c45:6019 Generic Sonix OV7630
sonixj 0c45:612a Avant Camera sonixb 0c45:6024 Generic Sonix Tas5130c
sonixj 0c45:612b Speed-Link REFLECT2 sonixb 0c45:6025 Xcam Shanga
sonixj 0c45:612c Typhoon Rasy Cam 1.3MPix sonixb 0c45:6027 GeniusEye 310
sonixj 0c45:6130 Sonix Pccam sonixb 0c45:6028 Sonix Btc Pc380
sonixj 0c45:6138 Sn9c120 Mo4000 sonixb 0c45:6029 spcaCam@150
sonixj 0c45:613a Microdia Sonix PC Camera sonixb 0c45:602a Meade ETX-105EC Camera
sonixj 0c45:613b Surfer SN-206 sonixb 0c45:602c Generic Sonix OV7630
sonixj 0c45:613c Sonix Pccam168 sonixb 0c45:602d LIC-200 LG
sonixj 0c45:6142 Hama PC-Webcam AC-150 sonixb 0c45:602e Genius VideoCam Messenger
sonixj 0c45:6143 Sonix Pccam168 sonixj 0c45:6040 Speed NVC 350K
sonixj 0c45:6148 Digitus DA-70811/ZSMC USB PC Camera ZS211/Microdia sonixj 0c45:607c Sonix sn9c102p Hv7131R
sonixj 0c45:614a Frontech E-Ccam (JIL-2225) sonixb 0c45:6083 VideoCAM Look
sn9c20x 0c45:6240 PC Camera (SN9C201 + MT9M001) sonixb 0c45:608c VideoCAM Look
sn9c20x 0c45:6242 PC Camera (SN9C201 + MT9M111) sonixb 0c45:608f PC Camera (SN9C103 + OV7630)
sn9c20x 0c45:6248 PC Camera (SN9C201 + OV9655) sonixb 0c45:60a8 VideoCAM Look
sn9c20x 0c45:624c PC Camera (SN9C201 + MT9M112) sonixb 0c45:60aa VideoCAM Look
sn9c20x 0c45:624e PC Camera (SN9C201 + SOI968) sonixb 0c45:60af VideoCAM Look
sn9c20x 0c45:624f PC Camera (SN9C201 + OV9650) sonixb 0c45:60b0 Genius VideoCam Look
sn9c20x 0c45:6251 PC Camera (SN9C201 + OV9650) sonixj 0c45:60c0 Sangha Sn535
sn9c20x 0c45:6253 PC Camera (SN9C201 + OV9650) sonixj 0c45:60ce USB-PC-Camera-168 (TALK-5067)
sn9c20x 0c45:6260 PC Camera (SN9C201 + OV7670) sonixj 0c45:60ec SN9C105+MO4000
sn9c20x 0c45:6270 PC Camera (SN9C201 + MT9V011/MT9V111/MT9V112) sonixj 0c45:60fb Surfer NoName
sn9c20x 0c45:627b PC Camera (SN9C201 + OV7660) sonixj 0c45:60fc LG-LIC300
sn9c20x 0c45:627c PC Camera (SN9C201 + HV7131R) sonixj 0c45:60fe Microdia Audio
sn9c20x 0c45:627f PC Camera (SN9C201 + OV9650) sonixj 0c45:6100 PC Camera (SN9C128)
sn9c20x 0c45:6280 PC Camera (SN9C202 + MT9M001) sonixj 0c45:6102 PC Camera (SN9C128)
sn9c20x 0c45:6282 PC Camera (SN9C202 + MT9M111) sonixj 0c45:610a PC Camera (SN9C128)
sn9c20x 0c45:6288 PC Camera (SN9C202 + OV9655) sonixj 0c45:610b PC Camera (SN9C128)
sn9c20x 0c45:628c PC Camera (SN9C201 + MT9M112) sonixj 0c45:610c PC Camera (SN9C128)
sn9c20x 0c45:628e PC Camera (SN9C202 + SOI968) sonixj 0c45:610e PC Camera (SN9C128)
sn9c20x 0c45:628f PC Camera (SN9C202 + OV9650) sonixj 0c45:6128 Microdia/Sonix SNP325
sn9c20x 0c45:62a0 PC Camera (SN9C202 + OV7670) sonixj 0c45:612a Avant Camera
sn9c20x 0c45:62b0 PC Camera (SN9C202 + MT9V011/MT9V111/MT9V112) sonixj 0c45:612b Speed-Link REFLECT2
sn9c20x 0c45:62b3 PC Camera (SN9C202 + OV9655) sonixj 0c45:612c Typhoon Rasy Cam 1.3MPix
sn9c20x 0c45:62bb PC Camera (SN9C202 + OV7660) sonixj 0c45:612e PC Camera (SN9C110)
sn9c20x 0c45:62bc PC Camera (SN9C202 + HV7131R) sonixj 0c45:6130 Sonix Pccam
sn9c2028 0c45:8001 Wild Planet Digital Spy Camera sonixj 0c45:6138 Sn9c120 Mo4000
sn9c2028 0c45:8003 Sakar #11199, #6637x, #67480 keychain cams sonixj 0c45:613a Microdia Sonix PC Camera
sn9c2028 0c45:8008 Mini-Shotz ms-350 sonixj 0c45:613b Surfer SN-206
sn9c2028 0c45:800a Vivitar Vivicam 3350B sonixj 0c45:613c Sonix Pccam168
sunplus 0d64:0303 Sunplus FashionCam DXG sonixj 0c45:613e PC Camera (SN9C120)
ov519 0e96:c001 TRUST 380 USB2 SPACEC@M sonixj 0c45:6142 Hama PC-Webcam AC-150
etoms 102c:6151 Qcam Sangha CIF sonixj 0c45:6143 Sonix Pccam168
etoms 102c:6251 Qcam xxxxxx VGA sonixj 0c45:6148 Digitus DA-70811/ZSMC USB PC Camera ZS211/Microdia
ov519 1046:9967 W9967CF/W9968CF WebCam IC, Video Blaster WebCam Go sonixj 0c45:614a Frontech E-Ccam (JIL-2225)
zc3xx 10fd:0128 Typhoon Webshot II USB 300k 0x0128 sn9c20x 0c45:6240 PC Camera (SN9C201 + MT9M001)
spca561 10fd:7e50 FlyCam Usb 100 sn9c20x 0c45:6242 PC Camera (SN9C201 + MT9M111)
zc3xx 10fd:8050 Typhoon Webshot II USB 300k sn9c20x 0c45:6248 PC Camera (SN9C201 + OV9655)
ov534 1415:2000 Sony HD Eye for PS3 (SLEH 00201) sn9c20x 0c45:624c PC Camera (SN9C201 + MT9M112)
pac207 145f:013a Trust WB-1300N sn9c20x 0c45:624e PC Camera (SN9C201 + SOI968)
sn9c20x 145f:013d Trust WB-3600R sn9c20x 0c45:624f PC Camera (SN9C201 + OV9650)
vc032x 15b8:6001 HP 2.0 Megapixel sn9c20x 0c45:6251 PC Camera (SN9C201 + OV9650)
vc032x 15b8:6002 HP 2.0 Megapixel rz406aa sn9c20x 0c45:6253 PC Camera (SN9C201 + OV9650)
spca501 1776:501c Arowana 300K CMOS Camera sn9c20x 0c45:6260 PC Camera (SN9C201 + OV7670)
t613 17a1:0128 TASCORP JPEG Webcam, NGS Cyclops sn9c20x 0c45:6270 PC Camera (SN9C201 + MT9V011/MT9V111/MT9V112)
vc032x 17ef:4802 Lenovo Vc0323+MI1310_SOC sn9c20x 0c45:627b PC Camera (SN9C201 + OV7660)
pac207 2001:f115 D-Link DSB-C120 sn9c20x 0c45:627c PC Camera (SN9C201 + HV7131R)
sq905c 2770:9050 Disney pix micro (CIF) sn9c20x 0c45:627f PC Camera (SN9C201 + OV9650)
sq905c 2770:9051 Lego Bionicle sn9c20x 0c45:6280 PC Camera (SN9C202 + MT9M001)
sq905c 2770:9052 Disney pix micro 2 (VGA) sn9c20x 0c45:6282 PC Camera (SN9C202 + MT9M111)
sq905c 2770:905c All 11 known cameras with this ID sn9c20x 0c45:6288 PC Camera (SN9C202 + OV9655)
sq905 2770:9120 All 24 known cameras with this ID sn9c20x 0c45:628c PC Camera (SN9C201 + MT9M112)
sq905c 2770:913d All 4 known cameras with this ID sn9c20x 0c45:628e PC Camera (SN9C202 + SOI968)
sq930x 2770:930b Sweex Motion Tracking / I-Tec iCam Tracer sn9c20x 0c45:628f PC Camera (SN9C202 + OV9650)
sq930x 2770:930c Trust WB-3500T / NSG Robbie 2.0 sn9c20x 0c45:62a0 PC Camera (SN9C202 + OV7670)
spca500 2899:012c Toptro Industrial sn9c20x 0c45:62b0 PC Camera (SN9C202 + MT9V011/MT9V111/MT9V112)
ov519 8020:ef04 ov519 sn9c20x 0c45:62b3 PC Camera (SN9C202 + OV9655)
spca508 8086:0110 Intel Easy PC Camera sn9c20x 0c45:62bb PC Camera (SN9C202 + OV7660)
spca500 8086:0630 Intel Pocket PC Camera sn9c20x 0c45:62bc PC Camera (SN9C202 + HV7131R)
spca506 99fa:8988 Grandtec V.cap sn9c2028 0c45:8001 Wild Planet Digital Spy Camera
sn9c20x a168:0610 Dino-Lite Digital Microscope (SN9C201 + HV7131R) sn9c2028 0c45:8003 Sakar #11199, #6637x, #67480 keychain cams
sn9c20x a168:0611 Dino-Lite Digital Microscope (SN9C201 + HV7131R) sn9c2028 0c45:8008 Mini-Shotz ms-350
sn9c20x a168:0613 Dino-Lite Digital Microscope (SN9C201 + HV7131R) sn9c2028 0c45:800a Vivitar Vivicam 3350B
sn9c20x a168:0618 Dino-Lite Digital Microscope (SN9C201 + HV7131R) sunplus 0d64:0303 Sunplus FashionCam DXG
sn9c20x a168:0614 Dino-Lite Digital Microscope (SN9C201 + MT9M111) ov519 0e96:c001 TRUST 380 USB2 SPACEC@M
sn9c20x a168:0615 Dino-Lite Digital Microscope (SN9C201 + MT9M111) etoms 102c:6151 Qcam Sangha CIF
sn9c20x a168:0617 Dino-Lite Digital Microscope (SN9C201 + MT9M111) etoms 102c:6251 Qcam xxxxxx VGA
spca561 abcd:cdee Petcam ov519 1046:9967 W9967CF/W9968CF WebCam IC, Video Blaster WebCam Go
========= ========= ==================================================================== zc3xx 10fd:0128 Typhoon Webshot II USB 300k 0x0128
spca561 10fd:7e50 FlyCam Usb 100
zc3xx 10fd:804d Typhoon Webshot II Webcam [zc0301]
zc3xx 10fd:8050 Typhoon Webshot II USB 300k
ov534 1415:2000 Sony HD Eye for PS3 (SLEH 00201)
pac207 145f:013a Trust WB-1300N
pac7302 145f:013c Trust
sn9c20x 145f:013d Trust WB-3600R
vc032x 15b8:6001 HP 2.0 Megapixel
vc032x 15b8:6002 HP 2.0 Megapixel rz406aa
stk1135 174f:6a31 ASUSlaptop, MT9M112 sensor
spca501 1776:501c Arowana 300K CMOS Camera
t613 17a1:0128 TASCORP JPEG Webcam, NGS Cyclops
vc032x 17ef:4802 Lenovo Vc0323+MI1310_SOC
pac7302 1ae7:2001 SpeedLinkSnappy Mic SL-6825-SBK
pac207 2001:f115 D-Link DSB-C120
sq905c 2770:9050 Disney pix micro (CIF)
sq905c 2770:9051 Lego Bionicle
sq905c 2770:9052 Disney pix micro 2 (VGA)
sq905c 2770:905c All 11 known cameras with this ID
sq905 2770:9120 All 24 known cameras with this ID
sq905c 2770:913d All 4 known cameras with this ID
sq930x 2770:930b Sweex Motion Tracking / I-Tec iCam Tracer
sq930x 2770:930c Trust WB-3500T / NSG Robbie 2.0
spca500 2899:012c Toptro Industrial
ov519 8020:ef04 ov519
spca508 8086:0110 Intel Easy PC Camera
spca500 8086:0630 Intel Pocket PC Camera
spca506 99fa:8988 Grandtec V.cap
sn9c20x a168:0610 Dino-Lite Digital Microscope (SN9C201 + HV7131R)
sn9c20x a168:0611 Dino-Lite Digital Microscope (SN9C201 + HV7131R)
sn9c20x a168:0613 Dino-Lite Digital Microscope (SN9C201 + HV7131R)
sn9c20x a168:0614 Dino-Lite Digital Microscope (SN9C201 + MT9M111)
sn9c20x a168:0615 Dino-Lite Digital Microscope (SN9C201 + MT9M111)
sn9c20x a168:0617 Dino-Lite Digital Microscope (SN9C201 + MT9M111)
sn9c20x a168:0618 Dino-Lite Digital Microscope (SN9C201 + HV7131R)
spca561 abcd:cdee Petcam
========= ========= ===================================================================

View File

@ -2,6 +2,8 @@
.. include:: <isonum.txt> .. include:: <isonum.txt>
.. _v4l-drivers:
################################################ ################################################
Video4Linux (V4L) driver-specific documentation Video4Linux (V4L) driver-specific documentation
################################################ ################################################
@ -46,6 +48,7 @@ For more details see the file COPYING in the source distribution of Linux.
pvrusb2 pvrusb2
pxa_camera pxa_camera
radiotrack radiotrack
rcar-fdp1
saa7134 saa7134
sh_mobile_ceu_camera sh_mobile_ceu_camera
si470x si470x

View File

@ -1,29 +1,38 @@
IVTV cards list IVTV cards list
=============== ===============
.. code-block:: none =========== ============================================================= ====================================================
Card number Card name PCI IDs
1 -> Hauppauge WinTV PVR-250 =========== ============================================================= ====================================================
2 -> Hauppauge WinTV PVR-350 0 Hauppauge WinTV PVR-250 IVTV16 104d:813d
3 -> Hauppauge WinTV PVR-150 or PVR-500 1 Hauppauge WinTV PVR-350 IVTV16 104d:813d
4 -> AVerMedia M179 [1461:a3ce,1461:a3cf] 2 Hauppauge WinTV PVR-150 IVTV16 104d:813d
5 -> Yuan MPG600/Kuroutoshikou iTVC16-STVLP [12ab:fff3,12ab:ffff] 3 AVerMedia M179 IVTV15 1461:a3cf, IVTV15 1461:a3ce
6 -> Yuan MPG160/Kuroutoshikou iTVC15-STVLP [12ab:0000,10fc:40a0] 4 Yuan MPG600, Kuroutoshikou ITVC16-STVLP IVTV16 12ab:fff3, IVTV16 12ab:ffff
7 -> Yuan PG600/DiamondMM PVR-550 [ff92:0070,ffab:0600] 5 YUAN MPG160, Kuroutoshikou ITVC15-STVLP, I/O Data GV-M2TV/PCI IVTV15 10fc:40a0
8 -> Adaptec AVC-2410 [9005:0093] 6 Yuan PG600, Diamond PVR-550 IVTV16 ff92:0070, IVTV16 ffab:0600
9 -> Adaptec AVC-2010 [9005:0092] 7 Adaptec VideOh! AVC-2410 IVTV16 9005:0093
10 -> NAGASE TRANSGEAR 5000TV [1461:bfff] 8 Adaptec VideOh! AVC-2010 IVTV16 9005:0092
11 -> AOpen VA2000MAX-STN6 [0000:ff5f] 9 Nagase Transgear 5000TV IVTV16 1461:bfff
12 -> YUAN MPG600GR/Kuroutoshikou CX23416GYC-STVLP [12ab:0600,fbab:0600,1154:0523] 10 AOpen VA2000MAX-SNT6 IVTV16 0000:ff5f
13 -> I/O Data GV-MVP/RX [10fc:d01e,10fc:d038,10fc:d039] 11 Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLP IVTV16 12ab:0600, IVTV16 fbab:0600, IVTV16 1154:0523
14 -> I/O Data GV-MVP/RX2E [10fc:d025] 12 I/O Data GV-MVP/RX, GV-MVP/RX2W (dual tuner) IVTV16 10fc:d01e, IVTV16 10fc:d038, IVTV16 10fc:d039
15 -> GOTVIEW PCI DVD (partial support only) [12ab:0600] 13 I/O Data GV-MVP/RX2E IVTV16 10fc:d025
16 -> GOTVIEW PCI DVD2 Deluxe [ffac:0600] 14 GotView PCI DVD IVTV16 12ab:0600
17 -> Yuan MPC622 [ff01:d998] 15 GotView PCI DVD2 Deluxe IVTV16 ffac:0600
18 -> Digital Cowboy DCT-MTVP1 [1461:bfff] 16 Yuan MPC622 IVTV16 ff01:d998
19 -> Yuan PG600V2/GotView PCI DVD Lite [ffab:0600,ffad:0600] 17 Digital Cowboy DCT-MTVP1 IVTV16 1461:bfff
20 -> Club3D ZAP-TV1x01 [ffab:0600] 18 Yuan PG600-2, GotView PCI DVD Lite IVTV16 ffab:0600, IVTV16 ffad:0600
21 -> AverTV MCE 116 Plus [1461:c439] 19 Club3D ZAP-TV1x01 IVTV16 ffab:0600
22 -> ASUS Falcon2 [1043:4b66,1043:462e,1043:4b2e] 20 AVerTV MCE 116 Plus IVTV16 1461:c439
23 -> AverMedia PVR-150 Plus [1461:c035] 21 ASUS Falcon2 IVTV16 1043:4b66, IVTV16 1043:462e, IVTV16 1043:4b2e
24 -> AverMedia EZMaker PCI Deluxe [1461:c03f] 22 AVerMedia PVR-150 Plus / AVerTV M113 Partsnic (Daewoo) Tuner IVTV16 1461:c034, IVTV16 1461:c035
23 AVerMedia EZMaker PCI Deluxe IVTV16 1461:c03f
24 AVerMedia M104 IVTV16 1461:c136
25 Buffalo PC-MV5L/PCI IVTV16 1154:052b
26 AVerMedia UltraTV 1500 MCE / AVerTV M113 Philips Tuner IVTV16 1461:c019, IVTV16 1461:c01b
27 Sony VAIO Giga Pocket (ENX Kikyou) IVTV16 104d:813d
28 Hauppauge WinTV PVR-350 (V1) IVTV16 104d:813d
29 Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLP (no GR) IVTV16 104d:813d
30 Yuan MPG600GR, Kuroutoshikou CX23416GYC-STVLP (no GR/YCS) IVTV16 104d:813d
=========== ============================================================= ====================================================

View File

@ -0,0 +1,37 @@
Renesas R-Car Fine Display Processor (FDP1) Driver
==================================================
The R-Car FDP1 driver implements driver-specific controls as follows.
``V4L2_CID_DEINTERLACING_MODE (menu)``
The video deinterlacing mode (such as Bob, Weave, ...). The R-Car FDP1
driver implements the following modes.
.. flat-table::
:header-rows: 0
:stub-columns: 0
:widths: 1 4
* - ``"Progressive" (0)``
- The input image video stream is progressive (not interlaced). No
deinterlacing is performed. Apart from (optional) format and encoding
conversion output frames are identical to the input frames.
* - ``"Adaptive 2D/3D" (1)``
- Motion adaptive version of 2D and 3D deinterlacing. Use 3D deinterlacing
in the presence of fast motion and 2D deinterlacing with diagonal
interpolation otherwise.
* - ``"Fixed 2D" (2)``
- The current field is scaled vertically by averaging adjacent lines to
recover missing lines. This method is also known as blending or Line
Averaging (LAV).
* - ``"Fixed 3D" (3)``
- The previous and next fields are averaged to recover lines missing from
the current field. This method is also known as Field Averaging (FAV).
* - ``"Previous field" (4)``
- The current field is weaved with the previous field, i.e. the previous
field is used to fill missing lines from the current field. This method
is also known as weave deinterlacing.
* - ``"Next field" (5)``
- The current field is weaved with the next field, i.e. the next field is
used to fill missing lines from the current field. This method is also
known as weave deinterlacing.

View File

@ -1,202 +1,204 @@
SAA7134 cards list SAA7134 cards list
================== ==================
.. code-block:: none =========== ======================================================= ================================================================
Card number Card name PCI IDs
0 -> UNKNOWN/GENERIC =========== ======================================================= ================================================================
1 -> Proteus Pro [philips reference design] [1131:2001,1131:2001] 0 UNKNOWN/GENERIC
2 -> LifeView FlyVIDEO3000 [5168:0138,4e42:0138] 1 Proteus Pro [philips reference design] 1131:2001, 1131:2001
3 -> LifeView/Typhoon FlyVIDEO2000 [5168:0138,4e42:0138] 2 LifeView FlyVIDEO3000 5168:0138, 4e42:0138
4 -> EMPRESS [1131:6752] 3 LifeView/Typhoon FlyVIDEO2000 5168:0138, 4e42:0138
5 -> SKNet Monster TV [1131:4e85] 4 EMPRESS 1131:6752
6 -> Tevion MD 9717 5 SKNet Monster TV 1131:4e85
7 -> KNC One TV-Station RDS / Typhoon TV Tuner RDS [1131:fe01,1894:fe01] 6 Tevion MD 9717
8 -> Terratec Cinergy 400 TV [153b:1142] 7 KNC One TV-Station RDS / Typhoon TV Tuner RDS 1131:fe01, 1894:fe01
9 -> Medion 5044 8 Terratec Cinergy 400 TV 153b:1142
10 -> Kworld/KuroutoShikou SAA7130-TVPCI 9 Medion 5044
11 -> Terratec Cinergy 600 TV [153b:1143] 10 Kworld/KuroutoShikou SAA7130-TVPCI
12 -> Medion 7134 [16be:0003,16be:5000] 11 Terratec Cinergy 600 TV 153b:1143
13 -> Typhoon TV+Radio 90031 12 Medion 7134 16be:0003, 16be:5000
14 -> ELSA EX-VISION 300TV [1048:226b] 13 Typhoon TV+Radio 90031
15 -> ELSA EX-VISION 500TV [1048:226a] 14 ELSA EX-VISION 300TV 1048:226b
16 -> ASUS TV-FM 7134 [1043:4842,1043:4830,1043:4840] 15 ELSA EX-VISION 500TV 1048:226a
17 -> AOPEN VA1000 POWER [1131:7133] 16 ASUS TV-FM 7134 1043:4842, 1043:4830, 1043:4840
18 -> BMK MPEX No Tuner 17 AOPEN VA1000 POWER 1131:7133
19 -> Compro VideoMate TV [185b:c100] 18 BMK MPEX No Tuner
20 -> Matrox CronosPlus [102B:48d0] 19 Compro VideoMate TV 185b:c100
21 -> 10MOONS PCI TV CAPTURE CARD [1131:2001] 20 Matrox CronosPlus 102B:48d0
22 -> AverMedia M156 / Medion 2819 [1461:a70b] 21 10MOONS PCI TV CAPTURE CARD 1131:2001
23 -> BMK MPEX Tuner 22 AverMedia M156 / Medion 2819 1461:a70b
24 -> KNC One TV-Station DVR [1894:a006] 23 BMK MPEX Tuner
25 -> ASUS TV-FM 7133 [1043:4843] 24 KNC One TV-Station DVR 1894:a006
26 -> Pinnacle PCTV Stereo (saa7134) [11bd:002b] 25 ASUS TV-FM 7133 1043:4843
27 -> Manli MuchTV M-TV002 26 Pinnacle PCTV Stereo (saa7134) 11bd:002b
28 -> Manli MuchTV M-TV001 27 Manli MuchTV M-TV002
29 -> Nagase Sangyo TransGear 3000TV [1461:050c] 28 Manli MuchTV M-TV001
30 -> Elitegroup ECS TVP3XP FM1216 Tuner Card(PAL-BG,FM) [1019:4cb4] 29 Nagase Sangyo TransGear 3000TV 1461:050c
31 -> Elitegroup ECS TVP3XP FM1236 Tuner Card (NTSC,FM) [1019:4cb5] 30 Elitegroup ECS TVP3XP FM1216 Tuner Card(PAL-BG,FM) 1019:4cb4
32 -> AVACS SmartTV 31 Elitegroup ECS TVP3XP FM1236 Tuner Card (NTSC,FM) 1019:4cb5
33 -> AVerMedia DVD EZMaker [1461:10ff] 32 AVACS SmartTV
34 -> Noval Prime TV 7133 33 AVerMedia DVD EZMaker 1461:10ff
35 -> AverMedia AverTV Studio 305 [1461:2115] 34 Noval Prime TV 7133
36 -> UPMOST PURPLE TV [12ab:0800] 35 AverMedia AverTV Studio 305 1461:2115
37 -> Items MuchTV Plus / IT-005 36 UPMOST PURPLE TV 12ab:0800
38 -> Terratec Cinergy 200 TV [153b:1152] 37 Items MuchTV Plus / IT-005
39 -> LifeView FlyTV Platinum Mini [5168:0212,4e42:0212,5169:1502] 38 Terratec Cinergy 200 TV 153b:1152
40 -> Compro VideoMate TV PVR/FM [185b:c100] 39 LifeView FlyTV Platinum Mini 5168:0212, 4e42:0212, 5169:1502
41 -> Compro VideoMate TV Gold+ [185b:c100] 40 Compro VideoMate TV PVR/FM 185b:c100
42 -> Sabrent SBT-TVFM (saa7130) 41 Compro VideoMate TV Gold+ 185b:c100
43 -> :Zolid Xpert TV7134 42 Sabrent SBT-TVFM (saa7130)
44 -> Empire PCI TV-Radio LE 43 :Zolid Xpert TV7134
45 -> Avermedia AVerTV Studio 307 [1461:9715] 44 Empire PCI TV-Radio LE
46 -> AVerMedia Cardbus TV/Radio (E500) [1461:d6ee] 45 Avermedia AVerTV Studio 307 1461:9715
47 -> Terratec Cinergy 400 mobile [153b:1162] 46 AVerMedia Cardbus TV/Radio (E500) 1461:d6ee
48 -> Terratec Cinergy 600 TV MK3 [153b:1158] 47 Terratec Cinergy 400 mobile 153b:1162
49 -> Compro VideoMate Gold+ Pal [185b:c200] 48 Terratec Cinergy 600 TV MK3 153b:1158
50 -> Pinnacle PCTV 300i DVB-T + PAL [11bd:002d] 49 Compro VideoMate Gold+ Pal 185b:c200
51 -> ProVideo PV952 [1540:9524] 50 Pinnacle PCTV 300i DVB-T + PAL 11bd:002d
52 -> AverMedia AverTV/305 [1461:2108] 51 ProVideo PV952 1540:9524
53 -> ASUS TV-FM 7135 [1043:4845] 52 AverMedia AverTV/305 1461:2108
54 -> LifeView FlyTV Platinum FM / Gold [5168:0214,5168:5214,1489:0214,5168:0304] 53 ASUS TV-FM 7135 1043:4845
55 -> LifeView FlyDVB-T DUO / MSI TV@nywhere Duo [5168:0306,4E42:0306] 54 LifeView FlyTV Platinum FM / Gold 5168:0214, 5168:5214, 1489:0214, 5168:0304
56 -> Avermedia AVerTV 307 [1461:a70a] 55 LifeView FlyDVB-T DUO / MSI TV@nywhere Duo 5168:0306, 4E42:0306
57 -> Avermedia AVerTV GO 007 FM [1461:f31f] 56 Avermedia AVerTV 307 1461:a70a
58 -> ADS Tech Instant TV (saa7135) [1421:0350,1421:0351,1421:0370,1421:1370] 57 Avermedia AVerTV GO 007 FM 1461:f31f
59 -> Kworld/Tevion V-Stream Xpert TV PVR7134 58 ADS Tech Instant TV (saa7135) 1421:0350, 1421:0351, 1421:0370, 1421:1370
60 -> LifeView/Typhoon/Genius FlyDVB-T Duo Cardbus [5168:0502,4e42:0502,1489:0502] 59 Kworld/Tevion V-Stream Xpert TV PVR7134
61 -> Philips TOUGH DVB-T reference design [1131:2004] 60 LifeView/Typhoon/Genius FlyDVB-T Duo Cardbus 5168:0502, 4e42:0502, 1489:0502
62 -> Compro VideoMate TV Gold+II 61 Philips TOUGH DVB-T reference design 1131:2004
63 -> Kworld Xpert TV PVR7134 62 Compro VideoMate TV Gold+II
64 -> FlyTV mini Asus Digimatrix [1043:0210] 63 Kworld Xpert TV PVR7134
65 -> V-Stream Studio TV Terminator 64 FlyTV mini Asus Digimatrix 1043:0210
66 -> Yuan TUN-900 (saa7135) 65 V-Stream Studio TV Terminator
67 -> Beholder BeholdTV 409 FM [0000:4091] 66 Yuan TUN-900 (saa7135)
68 -> GoTView 7135 PCI [5456:7135] 67 Beholder BeholdTV 409 FM 0000:4091
69 -> Philips EUROPA V3 reference design [1131:2004] 68 GoTView 7135 PCI 5456:7135
70 -> Compro Videomate DVB-T300 [185b:c900] 69 Philips EUROPA V3 reference design 1131:2004
71 -> Compro Videomate DVB-T200 [185b:c901] 70 Compro Videomate DVB-T300 185b:c900
72 -> RTD Embedded Technologies VFG7350 [1435:7350] 71 Compro Videomate DVB-T200 185b:c901
73 -> RTD Embedded Technologies VFG7330 [1435:7330] 72 RTD Embedded Technologies VFG7350 1435:7350
74 -> LifeView FlyTV Platinum Mini2 [14c0:1212] 73 RTD Embedded Technologies VFG7330 1435:7330
75 -> AVerMedia AVerTVHD MCE A180 [1461:1044] 74 LifeView FlyTV Platinum Mini2 14c0:1212
76 -> SKNet MonsterTV Mobile [1131:4ee9] 75 AVerMedia AVerTVHD MCE A180 1461:1044
77 -> Pinnacle PCTV 40i/50i/110i (saa7133) [11bd:002e] 76 SKNet MonsterTV Mobile 1131:4ee9
78 -> ASUSTeK P7131 Dual [1043:4862] 77 Pinnacle PCTV 40i/50i/110i (saa7133) 11bd:002e
79 -> Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B) 78 ASUSTeK P7131 Dual 1043:4862
80 -> ASUS Digimatrix TV [1043:0210] 79 Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B)
81 -> Philips Tiger reference design [1131:2018] 80 ASUS Digimatrix TV 1043:0210
82 -> MSI TV@Anywhere plus [1462:6231,1462:8624] 81 Philips Tiger reference design 1131:2018
83 -> Terratec Cinergy 250 PCI TV [153b:1160] 82 MSI TV@Anywhere plus 1462:6231, 1462:8624
84 -> LifeView FlyDVB Trio [5168:0319] 83 Terratec Cinergy 250 PCI TV 153b:1160
85 -> AverTV DVB-T 777 [1461:2c05,1461:2c05] 84 LifeView FlyDVB Trio 5168:0319
86 -> LifeView FlyDVB-T / Genius VideoWonder DVB-T [5168:0301,1489:0301] 85 AverTV DVB-T 777 1461:2c05, 1461:2c05
87 -> ADS Instant TV Duo Cardbus PTV331 [0331:1421] 86 LifeView FlyDVB-T / Genius VideoWonder DVB-T 5168:0301, 1489:0301
88 -> Tevion/KWorld DVB-T 220RF [17de:7201] 87 ADS Instant TV Duo Cardbus PTV331 0331:1421
89 -> ELSA EX-VISION 700TV [1048:226c] 88 Tevion/KWorld DVB-T 220RF 17de:7201
90 -> Kworld ATSC110/115 [17de:7350,17de:7352] 89 ELSA EX-VISION 700TV 1048:226c
91 -> AVerMedia A169 B [1461:7360] 90 Kworld ATSC110/115 17de:7350, 17de:7352
92 -> AVerMedia A169 B1 [1461:6360] 91 AVerMedia A169 B 1461:7360
93 -> Medion 7134 Bridge #2 [16be:0005] 92 AVerMedia A169 B1 1461:6360
94 -> LifeView FlyDVB-T Hybrid Cardbus/MSI TV @nywhere A/D NB [5168:3306,5168:3502,5168:3307,4e42:3502] 93 Medion 7134 Bridge #2 16be:0005
95 -> LifeView FlyVIDEO3000 (NTSC) [5169:0138] 94 LifeView FlyDVB-T Hybrid Cardbus/MSI TV @nywhere A/D NB 5168:3306, 5168:3502, 5168:3307, 4e42:3502
96 -> Medion Md8800 Quadro [16be:0007,16be:0008,16be:000d] 95 LifeView FlyVIDEO3000 (NTSC) 5169:0138
97 -> LifeView FlyDVB-S /Acorp TV134DS [5168:0300,4e42:0300] 96 Medion Md8800 Quadro 16be:0007, 16be:0008, 16be:000d
98 -> Proteus Pro 2309 [0919:2003] 97 LifeView FlyDVB-S /Acorp TV134DS 5168:0300, 4e42:0300
99 -> AVerMedia TV Hybrid A16AR [1461:2c00] 98 Proteus Pro 2309 0919:2003
100 -> Asus Europa2 OEM [1043:4860] 99 AVerMedia TV Hybrid A16AR 1461:2c00
101 -> Pinnacle PCTV 310i [11bd:002f] 100 Asus Europa2 OEM 1043:4860
102 -> Avermedia AVerTV Studio 507 [1461:9715] 101 Pinnacle PCTV 310i 11bd:002f
103 -> Compro Videomate DVB-T200A 102 Avermedia AVerTV Studio 507 1461:9715
104 -> Hauppauge WinTV-HVR1110 DVB-T/Hybrid [0070:6700,0070:6701,0070:6702,0070:6703,0070:6704,0070:6705] 103 Compro Videomate DVB-T200A
105 -> Terratec Cinergy HT PCMCIA [153b:1172] 104 Hauppauge WinTV-HVR1110 DVB-T/Hybrid 0070:6700, 0070:6701, 0070:6702, 0070:6703, 0070:6704, 0070:6705
106 -> Encore ENLTV [1131:2342,1131:2341,3016:2344] 105 Terratec Cinergy HT PCMCIA 153b:1172
107 -> Encore ENLTV-FM [1131:230f] 106 Encore ENLTV 1131:2342, 1131:2341, 3016:2344
108 -> Terratec Cinergy HT PCI [153b:1175] 107 Encore ENLTV-FM 1131:230f
109 -> Philips Tiger - S Reference design 108 Terratec Cinergy HT PCI 153b:1175
110 -> Avermedia M102 [1461:f31e] 109 Philips Tiger - S Reference design
111 -> ASUS P7131 4871 [1043:4871] 110 Avermedia M102 1461:f31e
112 -> ASUSTeK P7131 Hybrid [1043:4876] 111 ASUS P7131 4871 1043:4871
113 -> Elitegroup ECS TVP3XP FM1246 Tuner Card (PAL,FM) [1019:4cb6] 112 ASUSTeK P7131 Hybrid 1043:4876
114 -> KWorld DVB-T 210 [17de:7250] 113 Elitegroup ECS TVP3XP FM1246 Tuner Card (PAL,FM) 1019:4cb6
115 -> Sabrent PCMCIA TV-PCB05 [0919:2003] 114 KWorld DVB-T 210 17de:7250
116 -> 10MOONS TM300 TV Card [1131:2304] 115 Sabrent PCMCIA TV-PCB05 0919:2003
117 -> Avermedia Super 007 [1461:f01d] 116 10MOONS TM300 TV Card 1131:2304
118 -> Beholder BeholdTV 401 [0000:4016] 117 Avermedia Super 007 1461:f01d
119 -> Beholder BeholdTV 403 [0000:4036] 118 Beholder BeholdTV 401 0000:4016
120 -> Beholder BeholdTV 403 FM [0000:4037] 119 Beholder BeholdTV 403 0000:4036
121 -> Beholder BeholdTV 405 [0000:4050] 120 Beholder BeholdTV 403 FM 0000:4037
122 -> Beholder BeholdTV 405 FM [0000:4051] 121 Beholder BeholdTV 405 0000:4050
123 -> Beholder BeholdTV 407 [0000:4070] 122 Beholder BeholdTV 405 FM 0000:4051
124 -> Beholder BeholdTV 407 FM [0000:4071] 123 Beholder BeholdTV 407 0000:4070
125 -> Beholder BeholdTV 409 [0000:4090] 124 Beholder BeholdTV 407 FM 0000:4071
126 -> Beholder BeholdTV 505 FM [5ace:5050] 125 Beholder BeholdTV 409 0000:4090
127 -> Beholder BeholdTV 507 FM / BeholdTV 509 FM [5ace:5070,5ace:5090] 126 Beholder BeholdTV 505 FM 5ace:5050
128 -> Beholder BeholdTV Columbus TV/FM [0000:5201] 127 Beholder BeholdTV 507 FM / BeholdTV 509 FM 5ace:5070, 5ace:5090
129 -> Beholder BeholdTV 607 FM [5ace:6070] 128 Beholder BeholdTV Columbus TV/FM 0000:5201
130 -> Beholder BeholdTV M6 [5ace:6190] 129 Beholder BeholdTV 607 FM 5ace:6070
131 -> Twinhan Hybrid DTV-DVB 3056 PCI [1822:0022] 130 Beholder BeholdTV M6 5ace:6190
132 -> Genius TVGO AM11MCE 131 Twinhan Hybrid DTV-DVB 3056 PCI 1822:0022
133 -> NXP Snake DVB-S reference design 132 Genius TVGO AM11MCE
134 -> Medion/Creatix CTX953 Hybrid [16be:0010] 133 NXP Snake DVB-S reference design
135 -> MSI TV@nywhere A/D v1.1 [1462:8625] 134 Medion/Creatix CTX953 Hybrid 16be:0010
136 -> AVerMedia Cardbus TV/Radio (E506R) [1461:f436] 135 MSI TV@nywhere A/D v1.1 1462:8625
137 -> AVerMedia Hybrid TV/Radio (A16D) [1461:f936] 136 AVerMedia Cardbus TV/Radio (E506R) 1461:f436
138 -> Avermedia M115 [1461:a836] 137 AVerMedia Hybrid TV/Radio (A16D) 1461:f936
139 -> Compro VideoMate T750 [185b:c900] 138 Avermedia M115 1461:a836
140 -> Avermedia DVB-S Pro A700 [1461:a7a1] 139 Compro VideoMate T750 185b:c900
141 -> Avermedia DVB-S Hybrid+FM A700 [1461:a7a2] 140 Avermedia DVB-S Pro A700 1461:a7a1
142 -> Beholder BeholdTV H6 [5ace:6290] 141 Avermedia DVB-S Hybrid+FM A700 1461:a7a2
143 -> Beholder BeholdTV M63 [5ace:6191] 142 Beholder BeholdTV H6 5ace:6290
144 -> Beholder BeholdTV M6 Extra [5ace:6193] 143 Beholder BeholdTV M63 5ace:6191
145 -> AVerMedia MiniPCI DVB-T Hybrid M103 [1461:f636,1461:f736] 144 Beholder BeholdTV M6 Extra 5ace:6193
146 -> ASUSTeK P7131 Analog 145 AVerMedia MiniPCI DVB-T Hybrid M103 1461:f636, 1461:f736
147 -> Asus Tiger 3in1 [1043:4878] 146 ASUSTeK P7131 Analog
148 -> Encore ENLTV-FM v5.3 [1a7f:2008] 147 Asus Tiger 3in1 1043:4878
149 -> Avermedia PCI pure analog (M135A) [1461:f11d] 148 Encore ENLTV-FM v5.3 1a7f:2008
150 -> Zogis Real Angel 220 149 Avermedia PCI pure analog (M135A) 1461:f11d
151 -> ADS Tech Instant HDTV [1421:0380] 150 Zogis Real Angel 220
152 -> Asus Tiger Rev:1.00 [1043:4857] 151 ADS Tech Instant HDTV 1421:0380
153 -> Kworld Plus TV Analog Lite PCI [17de:7128] 152 Asus Tiger Rev:1.00 1043:4857
154 -> Avermedia AVerTV GO 007 FM Plus [1461:f31d] 153 Kworld Plus TV Analog Lite PCI 17de:7128
155 -> Hauppauge WinTV-HVR1150 ATSC/QAM-Hybrid [0070:6706,0070:6708] 154 Avermedia AVerTV GO 007 FM Plus 1461:f31d
156 -> Hauppauge WinTV-HVR1120 DVB-T/Hybrid [0070:6707,0070:6709,0070:670a] 155 Hauppauge WinTV-HVR1150 ATSC/QAM-Hybrid 0070:6706, 0070:6708
157 -> Avermedia AVerTV Studio 507UA [1461:a11b] 156 Hauppauge WinTV-HVR1120 DVB-T/Hybrid 0070:6707, 0070:6709, 0070:670a
158 -> AVerMedia Cardbus TV/Radio (E501R) [1461:b7e9] 157 Avermedia AVerTV Studio 507UA 1461:a11b
159 -> Beholder BeholdTV 505 RDS [0000:505B] 158 AVerMedia Cardbus TV/Radio (E501R) 1461:b7e9
160 -> Beholder BeholdTV 507 RDS [0000:5071] 159 Beholder BeholdTV 505 RDS 0000:505B
161 -> Beholder BeholdTV 507 RDS [0000:507B] 160 Beholder BeholdTV 507 RDS 0000:5071
162 -> Beholder BeholdTV 607 FM [5ace:6071] 161 Beholder BeholdTV 507 RDS 0000:507B
163 -> Beholder BeholdTV 609 FM [5ace:6090] 162 Beholder BeholdTV 607 FM 5ace:6071
164 -> Beholder BeholdTV 609 FM [5ace:6091] 163 Beholder BeholdTV 609 FM 5ace:6090
165 -> Beholder BeholdTV 607 RDS [5ace:6072] 164 Beholder BeholdTV 609 FM 5ace:6091
166 -> Beholder BeholdTV 607 RDS [5ace:6073] 165 Beholder BeholdTV 607 RDS 5ace:6072
167 -> Beholder BeholdTV 609 RDS [5ace:6092] 166 Beholder BeholdTV 607 RDS 5ace:6073
168 -> Beholder BeholdTV 609 RDS [5ace:6093] 167 Beholder BeholdTV 609 RDS 5ace:6092
169 -> Compro VideoMate S350/S300 [185b:c900] 168 Beholder BeholdTV 609 RDS 5ace:6093
170 -> AverMedia AverTV Studio 505 [1461:a115] 169 Compro VideoMate S350/S300 185b:c900
171 -> Beholder BeholdTV X7 [5ace:7595] 170 AverMedia AverTV Studio 505 1461:a115
172 -> RoverMedia TV Link Pro FM [19d1:0138] 171 Beholder BeholdTV X7 5ace:7595
173 -> Zolid Hybrid TV Tuner PCI [1131:2004] 172 RoverMedia TV Link Pro FM 19d1:0138
174 -> Asus Europa Hybrid OEM [1043:4847] 173 Zolid Hybrid TV Tuner PCI 1131:2004
175 -> Leadtek Winfast DTV1000S [107d:6655] 174 Asus Europa Hybrid OEM 1043:4847
176 -> Beholder BeholdTV 505 RDS [0000:5051] 175 Leadtek Winfast DTV1000S 107d:6655
177 -> Hawell HW-404M7 176 Beholder BeholdTV 505 RDS 0000:5051
178 -> Beholder BeholdTV H7 [5ace:7190] 177 Hawell HW-404M7
179 -> Beholder BeholdTV A7 [5ace:7090] 178 Beholder BeholdTV H7 5ace:7190
180 -> Avermedia PCI M733A [1461:4155,1461:4255] 179 Beholder BeholdTV A7 5ace:7090
181 -> TechoTrend TT-budget T-3000 [13c2:2804] 180 Avermedia PCI M733A 1461:4155, 1461:4255
182 -> Kworld PCI SBTVD/ISDB-T Full-Seg Hybrid [17de:b136] 181 TechoTrend TT-budget T-3000 13c2:2804
183 -> Compro VideoMate Vista M1F [185b:c900] 182 Kworld PCI SBTVD/ISDB-T Full-Seg Hybrid 17de:b136
184 -> Encore ENLTV-FM 3 [1a7f:2108] 183 Compro VideoMate Vista M1F 185b:c900
185 -> MagicPro ProHDTV Pro2 DMB-TH/Hybrid [17de:d136] 184 Encore ENLTV-FM 3 1a7f:2108
186 -> Beholder BeholdTV 501 [5ace:5010] 185 MagicPro ProHDTV Pro2 DMB-TH/Hybrid 17de:d136
187 -> Beholder BeholdTV 503 FM [5ace:5030] 186 Beholder BeholdTV 501 5ace:5010
188 -> Sensoray 811/911 [6000:0811,6000:0911] 187 Beholder BeholdTV 503 FM 5ace:5030
189 -> Kworld PC150-U [17de:a134] 188 Sensoray 811/911 6000:0811, 6000:0911
190 -> Asus My Cinema PS3-100 [1043:48cd] 189 Kworld PC150-U 17de:a134
191 -> Hawell HW-9004V1 190 Asus My Cinema PS3-100 1043:48cd
192 -> AverMedia AverTV Satellite Hybrid+FM A706 [1461:2055] 191 Hawell HW-9004V1
193 -> WIS Voyager or compatible [1905:7007] 192 AverMedia AverTV Satellite Hybrid+FM A706 1461:2055
194 -> AverMedia AverTV/505 [1461:a10a] 193 WIS Voyager or compatible 1905:7007
195 -> Leadtek Winfast TV2100 FM [107d:6f3a] 194 AverMedia AverTV/505 1461:a10a
196 -> SnaZio* TVPVR PRO [1779:13cf] 195 Leadtek Winfast TV2100 FM 107d:6f3a
196 SnaZio* TVPVR PRO 1779:13cf
=========== ======================================================= ================================================================

View File

@ -1,19 +1,21 @@
SAA7134 cards list SAA7164 cards list
================== ==================
.. code-block:: none =========== ==================================== ====================
Card number Card name PCI IDs
0 -> Unknown =========== ==================================== ====================
1 -> Generic Rev2 0 Unknown
2 -> Generic Rev3 1 Generic Rev2
3 -> Hauppauge WinTV-HVR2250 [0070:8880,0070:8810] 2 Generic Rev3
4 -> Hauppauge WinTV-HVR2200 [0070:8980] 3 Hauppauge WinTV-HVR2250 0070:8880, 0070:8810
5 -> Hauppauge WinTV-HVR2200 [0070:8900] 4 Hauppauge WinTV-HVR2200 0070:8980
6 -> Hauppauge WinTV-HVR2200 [0070:8901] 5 Hauppauge WinTV-HVR2200 0070:8900
7 -> Hauppauge WinTV-HVR2250 [0070:8891,0070:8851] 6 Hauppauge WinTV-HVR2200 0070:8901
8 -> Hauppauge WinTV-HVR2250 [0070:88A1] 7 Hauppauge WinTV-HVR2250 0070:8891, 0070:8851
9 -> Hauppauge WinTV-HVR2200 [0070:8940] 8 Hauppauge WinTV-HVR2250 0070:88A1
10 -> Hauppauge WinTV-HVR2200 [0070:8953] 9 Hauppauge WinTV-HVR2200 0070:8940
11 -> Hauppauge WinTV-HVR2255(proto) 10 Hauppauge WinTV-HVR2200 0070:8953
12 -> Hauppauge WinTV-HVR2255 [0070:f111] 11 Hauppauge WinTV-HVR2255(proto) 0070:f111
13 -> Hauppauge WinTV-HVR2205 [0070:f123,0070:f120] 12 Hauppauge WinTV-HVR2255 0070:f111
13 Hauppauge WinTV-HVR2205 0070:f123, 0070:f120
=========== ==================================== ====================

View File

@ -1,21 +1,24 @@
TM6000 cards list TM6000 cards list
================= =================
.. code-block:: none =========== ================================================= ==========================================
Card number Card name USB IDs
1 -> Generic tm5600 board (tm5600) [6000:0001] =========== ================================================= ==========================================
2 -> Generic tm6000 board (tm6000) [6000:0001] 0 Unknown tm6000 video grabber
3 -> Generic tm6010 board (tm6010) [6000:0002] 1 Generic tm5600 board 6000:0001
4 -> 10Moons UT821 (tm5600) [6000:0001] 2 Generic tm6000 board
5 -> 10Moons UT330 (tm5600) 3 Generic tm6010 board 6000:0002
6 -> ADSTech Dual TV (tm6000) [06e1:f332] 4 10Moons UT 821
7 -> FreeCom and similar (tm6000) [14aa:0620] 5 10Moons UT 330
8 -> ADSTech Mini Dual TV (tm6000) [06e1:b339] 6 ADSTECH Dual TV USB 06e1:f332
9 -> Hauppauge WinTV HVR-900H/USB2 Stick (tm6010) [2040:6600,2040:6601,2040:6610,2040:6611] 7 Freecom Hybrid Stick / Moka DVB-T Receiver Dual 14aa:0620
10 -> Beholder Wander (tm6010) [6000:dec0] 8 ADSTECH Mini Dual TV USB 06e1:b339
11 -> Beholder Voyager (tm6010) [6000:dec1] 9 Hauppauge WinTV HVR-900H / WinTV USB2-Stick 2040:6600, 2040:6601, 2040:6610, 2040:6611
12 -> TerraTec Cinergy Hybrid XE/Cinergy Hybrid Stick (tm6010) [0ccd:0086,0ccd:00a5] 10 Beholder Wander DVB-T/TV/FM USB2.0 6000:dec0
13 -> TwinHan TU501 (tm6010) [13d3:3240,13d3:3241,13d3:3243,13d3:3264] 11 Beholder Voyager TV/FM USB2.0 6000:dec1
14 -> Beholder Wander Lite (tm6010) [6000:dec2] 12 Terratec Cinergy Hybrid XE / Cinergy Hybrid-Stick 0ccd:0086, 0ccd:00A5
15 -> Beholder Voyager Lite (tm6010) [6000:dec3] 13 Twinhan TU501(704D1) 13d3:3240, 13d3:3241, 13d3:3243, 13d3:3264
14 Beholder Wander Lite DVB-T/TV/FM USB2.0 6000:dec2
15 Beholder Voyager Lite TV/FM USB2.0 6000:dec3
16 Terratec Grabster AV 150/250 MX 0ccd:0079
=========== ================================================= ==========================================

View File

@ -1,96 +1,98 @@
Tuner cards list Tuner cards list
================ ================
.. code-block:: none ============ =====================================================
Tuner number Card name
tuner=0 - Temic PAL (4002 FH5) ============ =====================================================
tuner=1 - Philips PAL_I (FI1246 and compatibles) 0 Temic PAL (4002 FH5)
tuner=2 - Philips NTSC (FI1236,FM1236 and compatibles) 1 Philips PAL_I (FI1246 and compatibles)
tuner=3 - Philips (SECAM+PAL_BG) (FI1216MF, FM1216MF, FR1216MF) 2 Philips NTSC (FI1236,FM1236 and compatibles)
tuner=4 - NoTuner 3 Philips (SECAM+PAL_BG) (FI1216MF, FM1216MF, FR1216MF)
tuner=5 - Philips PAL_BG (FI1216 and compatibles) 4 NoTuner
tuner=6 - Temic NTSC (4032 FY5) 5 Philips PAL_BG (FI1216 and compatibles)
tuner=7 - Temic PAL_I (4062 FY5) 6 Temic NTSC (4032 FY5)
tuner=8 - Temic NTSC (4036 FY5) 7 Temic PAL_I (4062 FY5)
tuner=9 - Alps HSBH1 8 Temic NTSC (4036 FY5)
tuner=10 - Alps TSBE1 9 Alps HSBH1
tuner=11 - Alps TSBB5 10 Alps TSBE1
tuner=12 - Alps TSBE5 11 Alps TSBB5
tuner=13 - Alps TSBC5 12 Alps TSBE5
tuner=14 - Temic PAL_BG (4006FH5) 13 Alps TSBC5
tuner=15 - Alps TSCH6 14 Temic PAL_BG (4006FH5)
tuner=16 - Temic PAL_DK (4016 FY5) 15 Alps TSCH6
tuner=17 - Philips NTSC_M (MK2) 16 Temic PAL_DK (4016 FY5)
tuner=18 - Temic PAL_I (4066 FY5) 17 Philips NTSC_M (MK2)
tuner=19 - Temic PAL* auto (4006 FN5) 18 Temic PAL_I (4066 FY5)
tuner=20 - Temic PAL_BG (4009 FR5) or PAL_I (4069 FR5) 19 Temic PAL* auto (4006 FN5)
tuner=21 - Temic NTSC (4039 FR5) 20 Temic PAL_BG (4009 FR5) or PAL_I (4069 FR5)
tuner=22 - Temic PAL/SECAM multi (4046 FM5) 21 Temic NTSC (4039 FR5)
tuner=23 - Philips PAL_DK (FI1256 and compatibles) 22 Temic PAL/SECAM multi (4046 FM5)
tuner=24 - Philips PAL/SECAM multi (FQ1216ME) 23 Philips PAL_DK (FI1256 and compatibles)
tuner=25 - LG PAL_I+FM (TAPC-I001D) 24 Philips PAL/SECAM multi (FQ1216ME)
tuner=26 - LG PAL_I (TAPC-I701D) 25 LG PAL_I+FM (TAPC-I001D)
tuner=27 - LG NTSC+FM (TPI8NSR01F) 26 LG PAL_I (TAPC-I701D)
tuner=28 - LG PAL_BG+FM (TPI8PSB01D) 27 LG NTSC+FM (TPI8NSR01F)
tuner=29 - LG PAL_BG (TPI8PSB11D) 28 LG PAL_BG+FM (TPI8PSB01D)
tuner=30 - Temic PAL* auto + FM (4009 FN5) 29 LG PAL_BG (TPI8PSB11D)
tuner=31 - SHARP NTSC_JP (2U5JF5540) 30 Temic PAL* auto + FM (4009 FN5)
tuner=32 - Samsung PAL TCPM9091PD27 31 SHARP NTSC_JP (2U5JF5540)
tuner=33 - MT20xx universal 32 Samsung PAL TCPM9091PD27
tuner=34 - Temic PAL_BG (4106 FH5) 33 MT20xx universal
tuner=35 - Temic PAL_DK/SECAM_L (4012 FY5) 34 Temic PAL_BG (4106 FH5)
tuner=36 - Temic NTSC (4136 FY5) 35 Temic PAL_DK/SECAM_L (4012 FY5)
tuner=37 - LG PAL (newer TAPC series) 36 Temic NTSC (4136 FY5)
tuner=38 - Philips PAL/SECAM multi (FM1216ME MK3) 37 LG PAL (newer TAPC series)
tuner=39 - LG NTSC (newer TAPC series) 38 Philips PAL/SECAM multi (FM1216ME MK3)
tuner=40 - HITACHI V7-J180AT 39 LG NTSC (newer TAPC series)
tuner=41 - Philips PAL_MK (FI1216 MK) 40 HITACHI V7-J180AT
tuner=42 - Philips FCV1236D ATSC/NTSC dual in 41 Philips PAL_MK (FI1216 MK)
tuner=43 - Philips NTSC MK3 (FM1236MK3 or FM1236/F) 42 Philips FCV1236D ATSC/NTSC dual in
tuner=44 - Philips 4 in 1 (ATI TV Wonder Pro/Conexant) 43 Philips NTSC MK3 (FM1236MK3 or FM1236/F)
tuner=45 - Microtune 4049 FM5 44 Philips 4 in 1 (ATI TV Wonder Pro/Conexant)
tuner=46 - Panasonic VP27s/ENGE4324D 45 Microtune 4049 FM5
tuner=47 - LG NTSC (TAPE series) 46 Panasonic VP27s/ENGE4324D
tuner=48 - Tenna TNF 8831 BGFF) 47 LG NTSC (TAPE series)
tuner=49 - Microtune 4042 FI5 ATSC/NTSC dual in 48 Tenna TNF 8831 BGFF)
tuner=50 - TCL 2002N 49 Microtune 4042 FI5 ATSC/NTSC dual in
tuner=51 - Philips PAL/SECAM_D (FM 1256 I-H3) 50 TCL 2002N
tuner=52 - Thomson DTT 7610 (ATSC/NTSC) 51 Philips PAL/SECAM_D (FM 1256 I-H3)
tuner=53 - Philips FQ1286 52 Thomson DTT 7610 (ATSC/NTSC)
tuner=54 - Philips/NXP TDA 8290/8295 + 8275/8275A/18271 53 Philips FQ1286
tuner=55 - TCL 2002MB 54 Philips/NXP TDA 8290/8295 + 8275/8275A/18271
tuner=56 - Philips PAL/SECAM multi (FQ1216AME MK4) 55 TCL 2002MB
tuner=57 - Philips FQ1236A MK4 56 Philips PAL/SECAM multi (FQ1216AME MK4)
tuner=58 - Ymec TVision TVF-8531MF/8831MF/8731MF 57 Philips FQ1236A MK4
tuner=59 - Ymec TVision TVF-5533MF 58 Ymec TVision TVF-8531MF/8831MF/8731MF
tuner=60 - Thomson DTT 761X (ATSC/NTSC) 59 Ymec TVision TVF-5533MF
tuner=61 - Tena TNF9533-D/IF/TNF9533-B/DF 60 Thomson DTT 761X (ATSC/NTSC)
tuner=62 - Philips TEA5767HN FM Radio 61 Tena TNF9533-D/IF/TNF9533-B/DF
tuner=63 - Philips FMD1216ME MK3 Hybrid Tuner 62 Philips TEA5767HN FM Radio
tuner=64 - LG TDVS-H06xF 63 Philips FMD1216ME MK3 Hybrid Tuner
tuner=65 - Ymec TVF66T5-B/DFF 64 LG TDVS-H06xF
tuner=66 - LG TALN series 65 Ymec TVF66T5-B/DFF
tuner=67 - Philips TD1316 Hybrid Tuner 66 LG TALN series
tuner=68 - Philips TUV1236D ATSC/NTSC dual in 67 Philips TD1316 Hybrid Tuner
tuner=69 - Tena TNF 5335 and similar models 68 Philips TUV1236D ATSC/NTSC dual in
tuner=70 - Samsung TCPN 2121P30A 69 Tena TNF 5335 and similar models
tuner=71 - Xceive xc2028/xc3028 tuner 70 Samsung TCPN 2121P30A
tuner=72 - Thomson FE6600 71 Xceive xc2028/xc3028 tuner
tuner=73 - Samsung TCPG 6121P30A 72 Thomson FE6600
tuner=75 - Philips TEA5761 FM Radio 73 Samsung TCPG 6121P30A
tuner=76 - Xceive 5000 tuner 75 Philips TEA5761 FM Radio
tuner=77 - TCL tuner MF02GIP-5N-E 76 Xceive 5000 tuner
tuner=78 - Philips FMD1216MEX MK3 Hybrid Tuner 77 TCL tuner MF02GIP-5N-E
tuner=79 - Philips PAL/SECAM multi (FM1216 MK5) 78 Philips FMD1216MEX MK3 Hybrid Tuner
tuner=80 - Philips FQ1216LME MK3 PAL/SECAM w/active loopthrough 79 Philips PAL/SECAM multi (FM1216 MK5)
tuner=81 - Partsnic (Daewoo) PTI-5NF05 80 Philips FQ1216LME MK3 PAL/SECAM w/active loopthrough
tuner=82 - Philips CU1216L 81 Partsnic (Daewoo) PTI-5NF05
tuner=83 - NXP TDA18271 82 Philips CU1216L
tuner=84 - Sony BTF-Pxn01Z 83 NXP TDA18271
tuner=85 - Philips FQ1236 MK5 84 Sony BTF-Pxn01Z
tuner=86 - Tena TNF5337 MFD 85 Philips FQ1236 MK5
tuner=87 - Xceive 4000 tuner 86 Tena TNF5337 MFD
tuner=88 - Xceive 5000C tuner 87 Xceive 4000 tuner
tuner=89 - Sony BTF-PG472Z PAL/SECAM 88 Xceive 5000C tuner
tuner=90 - Sony BTF-PK467Z NTSC-M-JP 89 Sony BTF-PG472Z PAL/SECAM
tuner=91 - Sony BTF-PB463Z NTSC-M 90 Sony BTF-PK467Z NTSC-M-JP
91 Sony BTF-PB463Z NTSC-M
============ =====================================================

View File

@ -1,72 +1,74 @@
Usbvision cards list USBvision cards list
==================== ====================
.. code-block:: none =========== ======================================================== =========
Card number Card name USB IDs
0 -> Xanboo [0a6f:0400] =========== ======================================================== =========
1 -> Belkin USB VideoBus II Adapter [050d:0106] 0 Xanboo 0a6f:0400
2 -> Belkin Components USB VideoBus [050d:0207] 1 Belkin USB VideoBus II Adapter 050d:0106
3 -> Belkin USB VideoBus II [050d:0208] 2 Belkin Components USB VideoBus 050d:0207
4 -> echoFX InterView Lite [0571:0002] 3 Belkin USB VideoBus II 050d:0208
5 -> USBGear USBG-V1 resp. HAMA USB [0573:0003] 4 echoFX InterView Lite 0571:0002
6 -> D-Link V100 [0573:0400] 5 USBGear USBG-V1 resp. HAMA USB 0573:0003
7 -> X10 USB Camera [0573:2000] 6 D-Link V100 0573:0400
8 -> Hauppauge WinTV USB Live (PAL B/G) [0573:2d00] 7 X10 USB Camera 0573:2000
9 -> Hauppauge WinTV USB Live Pro (NTSC M/N) [0573:2d01] 8 Hauppauge WinTV USB Live (PAL B/G) 0573:2d00
10 -> Zoran Co. PMD (Nogatech) AV-grabber Manhattan [0573:2101] 9 Hauppauge WinTV USB Live Pro (NTSC M/N) 0573:2d01
11 -> Nogatech USB-TV (NTSC) FM [0573:4100] 10 Zoran Co. PMD (Nogatech) AV-grabber Manhattan 0573:2101
12 -> PNY USB-TV (NTSC) FM [0573:4110] 11 Nogatech USB-TV (NTSC) FM 0573:4100
13 -> PixelView PlayTv-USB PRO (PAL) FM [0573:4450] 12 PNY USB-TV (NTSC) FM 0573:4110
14 -> ZTV ZT-721 2.4GHz USB A/V Receiver [0573:4550] 13 PixelView PlayTv-USB PRO (PAL) FM 0573:4450
15 -> Hauppauge WinTV USB (NTSC M/N) [0573:4d00] 14 ZTV ZT-721 2.4GHz USB A/V Receiver 0573:4550
16 -> Hauppauge WinTV USB (PAL B/G) [0573:4d01] 15 Hauppauge WinTV USB (NTSC M/N) 0573:4d00
17 -> Hauppauge WinTV USB (PAL I) [0573:4d02] 16 Hauppauge WinTV USB (PAL B/G) 0573:4d01
18 -> Hauppauge WinTV USB (PAL/SECAM L) [0573:4d03] 17 Hauppauge WinTV USB (PAL I) 0573:4d02
19 -> Hauppauge WinTV USB (PAL D/K) [0573:4d04] 18 Hauppauge WinTV USB (PAL/SECAM L) 0573:4d03
20 -> Hauppauge WinTV USB (NTSC FM) [0573:4d10] 19 Hauppauge WinTV USB (PAL D/K) 0573:4d04
21 -> Hauppauge WinTV USB (PAL B/G FM) [0573:4d11] 20 Hauppauge WinTV USB (NTSC FM) 0573:4d10
22 -> Hauppauge WinTV USB (PAL I FM) [0573:4d12] 21 Hauppauge WinTV USB (PAL B/G FM) 0573:4d11
23 -> Hauppauge WinTV USB (PAL D/K FM) [0573:4d14] 22 Hauppauge WinTV USB (PAL I FM) 0573:4d12
24 -> Hauppauge WinTV USB Pro (NTSC M/N) [0573:4d2a] 23 Hauppauge WinTV USB (PAL D/K FM) 0573:4d14
25 -> Hauppauge WinTV USB Pro (NTSC M/N) V2 [0573:4d2b] 24 Hauppauge WinTV USB Pro (NTSC M/N) 0573:4d2a
26 -> Hauppauge WinTV USB Pro (PAL/SECAM B/G/I/D/K/L) [0573:4d2c] 25 Hauppauge WinTV USB Pro (NTSC M/N) V2 0573:4d2b
27 -> Hauppauge WinTV USB Pro (NTSC M/N) V3 [0573:4d20] 26 Hauppauge WinTV USB Pro (PAL/SECAM B/G/I/D/K/L) 0573:4d2c
28 -> Hauppauge WinTV USB Pro (PAL B/G) [0573:4d21] 27 Hauppauge WinTV USB Pro (NTSC M/N) V3 0573:4d20
29 -> Hauppauge WinTV USB Pro (PAL I) [0573:4d22] 28 Hauppauge WinTV USB Pro (PAL B/G) 0573:4d21
30 -> Hauppauge WinTV USB Pro (PAL/SECAM L) [0573:4d23] 29 Hauppauge WinTV USB Pro (PAL I) 0573:4d22
31 -> Hauppauge WinTV USB Pro (PAL D/K) [0573:4d24] 30 Hauppauge WinTV USB Pro (PAL/SECAM L) 0573:4d23
32 -> Hauppauge WinTV USB Pro (PAL/SECAM BGDK/I/L) [0573:4d25] 31 Hauppauge WinTV USB Pro (PAL D/K) 0573:4d24
33 -> Hauppauge WinTV USB Pro (PAL/SECAM BGDK/I/L) V2 [0573:4d26] 32 Hauppauge WinTV USB Pro (PAL/SECAM BGDK/I/L) 0573:4d25
34 -> Hauppauge WinTV USB Pro (PAL B/G) V2 [0573:4d27] 33 Hauppauge WinTV USB Pro (PAL/SECAM BGDK/I/L) V2 0573:4d26
35 -> Hauppauge WinTV USB Pro (PAL B/G,D/K) [0573:4d28] 34 Hauppauge WinTV USB Pro (PAL B/G) V2 0573:4d27
36 -> Hauppauge WinTV USB Pro (PAL I,D/K) [0573:4d29] 35 Hauppauge WinTV USB Pro (PAL B/G,D/K) 0573:4d28
37 -> Hauppauge WinTV USB Pro (NTSC M/N FM) [0573:4d30] 36 Hauppauge WinTV USB Pro (PAL I,D/K) 0573:4d29
38 -> Hauppauge WinTV USB Pro (PAL B/G FM) [0573:4d31] 37 Hauppauge WinTV USB Pro (NTSC M/N FM) 0573:4d30
39 -> Hauppauge WinTV USB Pro (PAL I FM) [0573:4d32] 38 Hauppauge WinTV USB Pro (PAL B/G FM) 0573:4d31
40 -> Hauppauge WinTV USB Pro (PAL D/K FM) [0573:4d34] 39 Hauppauge WinTV USB Pro (PAL I FM) 0573:4d32
41 -> Hauppauge WinTV USB Pro (Temic PAL/SECAM B/G/I/D/K/L FM) [0573:4d35] 40 Hauppauge WinTV USB Pro (PAL D/K FM) 0573:4d34
42 -> Hauppauge WinTV USB Pro (Temic PAL B/G FM) [0573:4d36] 41 Hauppauge WinTV USB Pro (Temic PAL/SECAM B/G/I/D/K/L FM) 0573:4d35
43 -> Hauppauge WinTV USB Pro (PAL/SECAM B/G/I/D/K/L FM) [0573:4d37] 42 Hauppauge WinTV USB Pro (Temic PAL B/G FM) 0573:4d36
44 -> Hauppauge WinTV USB Pro (NTSC M/N FM) V2 [0573:4d38] 43 Hauppauge WinTV USB Pro (PAL/SECAM B/G/I/D/K/L FM) 0573:4d37
45 -> Camtel Technology USB TV Genie Pro FM Model TVB330 [0768:0006] 44 Hauppauge WinTV USB Pro (NTSC M/N FM) V2 0573:4d38
46 -> Digital Video Creator I [07d0:0001] 45 Camtel Technology USB TV Genie Pro FM Model TVB330 0768:0006
47 -> Global Village GV-007 (NTSC) [07d0:0002] 46 Digital Video Creator I 07d0:0001
48 -> Dazzle Fusion Model DVC-50 Rev 1 (NTSC) [07d0:0003] 47 Global Village GV-007 (NTSC) 07d0:0002
49 -> Dazzle Fusion Model DVC-80 Rev 1 (PAL) [07d0:0004] 48 Dazzle Fusion Model DVC-50 Rev 1 (NTSC) 07d0:0003
50 -> Dazzle Fusion Model DVC-90 Rev 1 (SECAM) [07d0:0005] 49 Dazzle Fusion Model DVC-80 Rev 1 (PAL) 07d0:0004
51 -> Eskape Labs MyTV2Go [07f8:9104] 50 Dazzle Fusion Model DVC-90 Rev 1 (SECAM) 07d0:0005
52 -> Pinnacle Studio PCTV USB (PAL) [2304:010d] 51 Eskape Labs MyTV2Go 07f8:9104
53 -> Pinnacle Studio PCTV USB (SECAM) [2304:0109] 52 Pinnacle Studio PCTV USB (PAL) 2304:010d
54 -> Pinnacle Studio PCTV USB (PAL) FM [2304:0110] 53 Pinnacle Studio PCTV USB (SECAM) 2304:0109
55 -> Miro PCTV USB [2304:0111] 54 Pinnacle Studio PCTV USB (PAL) FM 2304:0110
56 -> Pinnacle Studio PCTV USB (NTSC) FM [2304:0112] 55 Miro PCTV USB 2304:0111
57 -> Pinnacle Studio PCTV USB (PAL) FM V2 [2304:0210] 56 Pinnacle Studio PCTV USB (NTSC) FM 2304:0112
58 -> Pinnacle Studio PCTV USB (NTSC) FM V2 [2304:0212] 57 Pinnacle Studio PCTV USB (PAL) FM V2 2304:0210
59 -> Pinnacle Studio PCTV USB (PAL) FM V3 [2304:0214] 58 Pinnacle Studio PCTV USB (NTSC) FM V2 2304:0212
60 -> Pinnacle Studio Linx Video input cable (NTSC) [2304:0300] 59 Pinnacle Studio PCTV USB (PAL) FM V3 2304:0214
61 -> Pinnacle Studio Linx Video input cable (PAL) [2304:0301] 60 Pinnacle Studio Linx Video input cable (NTSC) 2304:0300
62 -> Pinnacle PCTV Bungee USB (PAL) FM [2304:0419] 61 Pinnacle Studio Linx Video input cable (PAL) 2304:0301
63 -> Hauppauge WinTv-USB [2400:4200] 62 Pinnacle PCTV Bungee USB (PAL) FM 2304:0419
64 -> Pinnacle Studio PCTV USB (NTSC) FM V3 [2304:0113] 63 Hauppauge WinTv-USB 2400:4200
65 -> Nogatech USB MicroCam NTSC (NV3000N) [0573:3000] 64 Pinnacle Studio PCTV USB (NTSC) FM V3 2304:0113
66 -> Nogatech USB MicroCam PAL (NV3001P) [0573:3001] 65 Nogatech USB MicroCam NTSC (NV3000N) 0573:3000
66 Nogatech USB MicroCam PAL (NV3001P) 0573:3001
=========== ======================================================== =========

View File

@ -87,6 +87,10 @@ replace symbol V4L2_YCBCR_ENC_XV601 :c:type:`v4l2_ycbcr_encoding`
replace symbol V4L2_YCBCR_ENC_XV709 :c:type:`v4l2_ycbcr_encoding` replace symbol V4L2_YCBCR_ENC_XV709 :c:type:`v4l2_ycbcr_encoding`
replace symbol V4L2_YCBCR_ENC_SMPTE240M :c:type:`v4l2_ycbcr_encoding` replace symbol V4L2_YCBCR_ENC_SMPTE240M :c:type:`v4l2_ycbcr_encoding`
# Documented enum v4l2_hsv_encoding
replace symbol V4L2_HSV_ENC_180 :c:type:`v4l2_hsv_encoding`
replace symbol V4L2_HSV_ENC_256 :c:type:`v4l2_hsv_encoding`
# Documented enum v4l2_quantization # Documented enum v4l2_quantization
replace symbol V4L2_QUANTIZATION_DEFAULT :c:type:`v4l2_quantization` replace symbol V4L2_QUANTIZATION_DEFAULT :c:type:`v4l2_quantization`
replace symbol V4L2_QUANTIZATION_FULL_RANGE :c:type:`v4l2_quantization` replace symbol V4L2_QUANTIZATION_FULL_RANGE :c:type:`v4l2_quantization`
@ -276,6 +280,9 @@ replace define V4L2_DV_FL_REDUCED_FPS dv-bt-standards
replace define V4L2_DV_FL_HALF_LINE dv-bt-standards replace define V4L2_DV_FL_HALF_LINE dv-bt-standards
replace define V4L2_DV_FL_IS_CE_VIDEO dv-bt-standards replace define V4L2_DV_FL_IS_CE_VIDEO dv-bt-standards
replace define V4L2_DV_FL_FIRST_FIELD_EXTRA_LINE dv-bt-standards replace define V4L2_DV_FL_FIRST_FIELD_EXTRA_LINE dv-bt-standards
replace define V4L2_DV_FL_HAS_PICTURE_ASPECT dv-bt-standards
replace define V4L2_DV_FL_HAS_CEA861_VIC dv-bt-standards
replace define V4L2_DV_FL_HAS_HDMI_VIC dv-bt-standards
replace define V4L2_DV_BT_656_1120 dv-timing-types replace define V4L2_DV_BT_656_1120 dv-timing-types

View File

@ -2982,15 +2982,15 @@ L: linux-media@vger.kernel.org
T: git git://linuxtv.org/media_tree.git T: git git://linuxtv.org/media_tree.git
W: http://linuxtv.org W: http://linuxtv.org
S: Supported S: Supported
F: Documentation/cec.txt F: Documentation/media/kapi/cec-core.rst
F: Documentation/media/uapi/cec F: Documentation/media/uapi/cec
F: drivers/staging/media/cec/ F: drivers/media/cec/
F: drivers/media/cec-edid.c F: drivers/media/cec-edid.c
F: drivers/media/rc/keymaps/rc-cec.c F: drivers/media/rc/keymaps/rc-cec.c
F: include/media/cec.h F: include/media/cec.h
F: include/media/cec-edid.h F: include/media/cec-edid.h
F: include/linux/cec.h F: include/uapi/linux/cec.h
F: include/linux/cec-funcs.h F: include/uapi/linux/cec-funcs.h
CELL BROADBAND ENGINE ARCHITECTURE CELL BROADBAND ENGINE ARCHITECTURE
M: Arnd Bergmann <arnd@arndb.de> M: Arnd Bergmann <arnd@arndb.de>
@ -7748,6 +7748,15 @@ F: Documentation/devicetree/bindings/media/renesas,fcp.txt
F: drivers/media/platform/rcar-fcp.c F: drivers/media/platform/rcar-fcp.c
F: include/media/rcar-fcp.h F: include/media/rcar-fcp.h
MEDIA DRIVERS FOR RENESAS - FDP1
M: Kieran Bingham <kieran@bingham.xyz>
L: linux-media@vger.kernel.org
L: linux-renesas-soc@vger.kernel.org
T: git git://linuxtv.org/media_tree.git
S: Supported
F: Documentation/devicetree/bindings/media/renesas,fdp1.txt
F: drivers/media/platform/rcar_fdp1.c
MEDIA DRIVERS FOR RENESAS - VIN MEDIA DRIVERS FOR RENESAS - VIN
M: Niklas Söderlund <niklas.soderlund@ragnatech.se> M: Niklas Söderlund <niklas.soderlund@ragnatech.se>
L: linux-media@vger.kernel.org L: linux-media@vger.kernel.org
@ -7854,6 +7863,24 @@ L: netdev@vger.kernel.org
S: Maintained S: Maintained
F: drivers/net/ethernet/mediatek/ F: drivers/net/ethernet/mediatek/
MEDIATEK MEDIA DRIVER
M: Tiffany Lin <tiffany.lin@mediatek.com>
M: Andrew-CT Chen <andrew-ct.chen@mediatek.com>
S: Supported
F: drivers/media/platform/mtk-vcodec/
F: drivers/media/platform/mtk-vpu/
F: Documentation/devicetree/bindings/media/mediatek-vcodec.txt
F: Documentation/devicetree/bindings/media/mediatek-vpu.txt
MEDIATEK MDP DRIVER
M: Minghsiu Tsai <minghsiu.tsai@mediatek.com>
M: Houlong Wei <houlong.wei@mediatek.com>
M: Andrew-CT Chen <andrew-ct.chen@mediatek.com>
S: Supported
F: drivers/media/platform/mtk-mdp/
F: drivers/media/platform/mtk-vpu/
F: Documentation/devicetree/bindings/media/mediatek-mdp.txt
MEDIATEK MT7601U WIRELESS LAN DRIVER MEDIATEK MT7601U WIRELESS LAN DRIVER
M: Jakub Kicinski <kubakici@wp.pl> M: Jakub Kicinski <kubakici@wp.pl>
L: linux-wireless@vger.kernel.org L: linux-wireless@vger.kernel.org
@ -9803,7 +9830,7 @@ M: Hans Verkuil <hverkuil@xs4all.nl>
L: linux-media@vger.kernel.org L: linux-media@vger.kernel.org
T: git git://linuxtv.org/media_tree.git T: git git://linuxtv.org/media_tree.git
S: Maintained S: Maintained
F: drivers/staging/media/pulse8-cec F: drivers/media/usb/pulse8-cec/*
PVRUSB2 VIDEO4LINUX DRIVER PVRUSB2 VIDEO4LINUX DRIVER
M: Mike Isely <isely@pobox.com> M: Mike Isely <isely@pobox.com>
@ -10623,6 +10650,12 @@ S: Maintained
F: Documentation/devicetree/bindings/serial/ F: Documentation/devicetree/bindings/serial/
F: drivers/tty/serial/ F: drivers/tty/serial/
SERIAL IR RECEIVER
M: Sean Young <sean@mess.org>
L: linux-media@vger.kernel.org
S: Maintained
F: drivers/media/rc/serial_ir.c
STI CEC DRIVER STI CEC DRIVER
M: Benjamin Gaignard <benjamin.gaignard@linaro.org> M: Benjamin Gaignard <benjamin.gaignard@linaro.org>
L: kernel@stlinux.com L: kernel@stlinux.com

View File

@ -41,6 +41,14 @@
dpi0 = &dpi0; dpi0 = &dpi0;
dsi0 = &dsi0; dsi0 = &dsi0;
dsi1 = &dsi1; dsi1 = &dsi1;
mdp_rdma0 = &mdp_rdma0;
mdp_rdma1 = &mdp_rdma1;
mdp_rsz0 = &mdp_rsz0;
mdp_rsz1 = &mdp_rsz1;
mdp_rsz2 = &mdp_rsz2;
mdp_wdma0 = &mdp_wdma0;
mdp_wrot0 = &mdp_wrot0;
mdp_wrot1 = &mdp_wrot1;
}; };
cpus { cpus {
@ -755,6 +763,82 @@
#clock-cells = <1>; #clock-cells = <1>;
}; };
mdp {
compatible = "mediatek,mt8173-mdp";
#address-cells = <2>;
#size-cells = <2>;
ranges;
mediatek,vpu = <&vpu>;
mdp_rdma0: rdma@14001000 {
compatible = "mediatek,mt8173-mdp-rdma";
reg = <0 0x14001000 0 0x1000>;
clocks = <&mmsys CLK_MM_MDP_RDMA0>,
<&mmsys CLK_MM_MUTEX_32K>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
iommus = <&iommu M4U_PORT_MDP_RDMA0>;
mediatek,larb = <&larb0>;
};
mdp_rdma1: rdma@14002000 {
compatible = "mediatek,mt8173-mdp-rdma";
reg = <0 0x14002000 0 0x1000>;
clocks = <&mmsys CLK_MM_MDP_RDMA1>,
<&mmsys CLK_MM_MUTEX_32K>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
iommus = <&iommu M4U_PORT_MDP_RDMA1>;
mediatek,larb = <&larb4>;
};
mdp_rsz0: rsz@14003000 {
compatible = "mediatek,mt8173-mdp-rsz";
reg = <0 0x14003000 0 0x1000>;
clocks = <&mmsys CLK_MM_MDP_RSZ0>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
};
mdp_rsz1: rsz@14004000 {
compatible = "mediatek,mt8173-mdp-rsz";
reg = <0 0x14004000 0 0x1000>;
clocks = <&mmsys CLK_MM_MDP_RSZ1>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
};
mdp_rsz2: rsz@14005000 {
compatible = "mediatek,mt8173-mdp-rsz";
reg = <0 0x14005000 0 0x1000>;
clocks = <&mmsys CLK_MM_MDP_RSZ2>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
};
mdp_wdma0: wdma@14006000 {
compatible = "mediatek,mt8173-mdp-wdma";
reg = <0 0x14006000 0 0x1000>;
clocks = <&mmsys CLK_MM_MDP_WDMA>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
iommus = <&iommu M4U_PORT_MDP_WDMA>;
mediatek,larb = <&larb0>;
};
mdp_wrot0: wrot@14007000 {
compatible = "mediatek,mt8173-mdp-wrot";
reg = <0 0x14007000 0 0x1000>;
clocks = <&mmsys CLK_MM_MDP_WROT0>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
iommus = <&iommu M4U_PORT_MDP_WROT0>;
mediatek,larb = <&larb0>;
};
mdp_wrot1: wrot@14008000 {
compatible = "mediatek,mt8173-mdp-wrot";
reg = <0 0x14008000 0 0x1000>;
clocks = <&mmsys CLK_MM_MDP_WROT1>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
iommus = <&iommu M4U_PORT_MDP_WROT1>;
mediatek,larb = <&larb4>;
};
};
ovl0: ovl@1400c000 { ovl0: ovl@1400c000 {
compatible = "mediatek,mt8173-disp-ovl"; compatible = "mediatek,mt8173-disp-ovl";
reg = <0 0x1400c000 0 0x1000>; reg = <0 0x1400c000 0 0x1000>;
@ -1051,6 +1135,50 @@
#clock-cells = <1>; #clock-cells = <1>;
}; };
vcodec_dec: vcodec@16000000 {
compatible = "mediatek,mt8173-vcodec-dec";
reg = <0 0x16000000 0 0x100>, /* VDEC_SYS */
<0 0x16020000 0 0x1000>, /* VDEC_MISC */
<0 0x16021000 0 0x800>, /* VDEC_LD */
<0 0x16021800 0 0x800>, /* VDEC_TOP */
<0 0x16022000 0 0x1000>, /* VDEC_CM */
<0 0x16023000 0 0x1000>, /* VDEC_AD */
<0 0x16024000 0 0x1000>, /* VDEC_AV */
<0 0x16025000 0 0x1000>, /* VDEC_PP */
<0 0x16026800 0 0x800>, /* VDEC_HWD */
<0 0x16027000 0 0x800>, /* VDEC_HWQ */
<0 0x16027800 0 0x800>, /* VDEC_HWB */
<0 0x16028400 0 0x400>; /* VDEC_HWG */
interrupts = <GIC_SPI 204 IRQ_TYPE_LEVEL_LOW>;
mediatek,larb = <&larb1>;
iommus = <&iommu M4U_PORT_HW_VDEC_MC_EXT>,
<&iommu M4U_PORT_HW_VDEC_PP_EXT>,
<&iommu M4U_PORT_HW_VDEC_AVC_MV_EXT>,
<&iommu M4U_PORT_HW_VDEC_PRED_RD_EXT>,
<&iommu M4U_PORT_HW_VDEC_PRED_WR_EXT>,
<&iommu M4U_PORT_HW_VDEC_UFO_EXT>,
<&iommu M4U_PORT_HW_VDEC_VLD_EXT>,
<&iommu M4U_PORT_HW_VDEC_VLD2_EXT>;
mediatek,vpu = <&vpu>;
power-domains = <&scpsys MT8173_POWER_DOMAIN_VDEC>;
clocks = <&apmixedsys CLK_APMIXED_VCODECPLL>,
<&topckgen CLK_TOP_UNIVPLL_D2>,
<&topckgen CLK_TOP_CCI400_SEL>,
<&topckgen CLK_TOP_VDEC_SEL>,
<&topckgen CLK_TOP_VCODECPLL>,
<&apmixedsys CLK_APMIXED_VENCPLL>,
<&topckgen CLK_TOP_VENC_LT_SEL>,
<&topckgen CLK_TOP_VCODECPLL_370P5>;
clock-names = "vcodecpll",
"univpll_d2",
"clk_cci400_sel",
"vdec_sel",
"vdecpll",
"vencpll",
"venc_lt_sel",
"vdec_bus_clk_src";
};
larb1: larb@16010000 { larb1: larb@16010000 {
compatible = "mediatek,mt8173-smi-larb"; compatible = "mediatek,mt8173-smi-larb";
reg = <0 0x16010000 0 0x1000>; reg = <0 0x16010000 0 0x1000>;

View File

@ -80,6 +80,22 @@ config MEDIA_RC_SUPPORT
Say Y when you have a TV or an IR device. Say Y when you have a TV or an IR device.
config MEDIA_CEC_SUPPORT
bool "HDMI CEC support"
select MEDIA_CEC_EDID
---help---
Enable support for HDMI CEC (Consumer Electronics Control),
which is an optional HDMI feature.
Say Y when you have an HDMI receiver, transmitter or a USB CEC
adapter that supports HDMI CEC.
config MEDIA_CEC_DEBUG
bool "HDMI CEC debugfs interface"
depends on MEDIA_CEC_SUPPORT && DEBUG_FS
---help---
Turns on the DebugFS interface for CEC devices.
config MEDIA_CEC_EDID config MEDIA_CEC_EDID
bool bool
@ -99,7 +115,7 @@ config MEDIA_CONTROLLER
config MEDIA_CONTROLLER_DVB config MEDIA_CONTROLLER_DVB
bool "Enable Media controller for DVB (EXPERIMENTAL)" bool "Enable Media controller for DVB (EXPERIMENTAL)"
depends on MEDIA_CONTROLLER depends on MEDIA_CONTROLLER && DVB_CORE
---help--- ---help---
Enable the media controller API support for DVB. Enable the media controller API support for DVB.

View File

@ -6,6 +6,10 @@ ifeq ($(CONFIG_MEDIA_CEC_EDID),y)
obj-$(CONFIG_MEDIA_SUPPORT) += cec-edid.o obj-$(CONFIG_MEDIA_SUPPORT) += cec-edid.o
endif endif
ifeq ($(CONFIG_MEDIA_CEC_SUPPORT),y)
obj-$(CONFIG_MEDIA_SUPPORT) += cec/
endif
media-objs := media-device.o media-devnode.o media-entity.o media-objs := media-device.o media-devnode.o media-entity.o
# #

View File

@ -1,5 +1,5 @@
cec-objs := cec-core.o cec-adap.o cec-api.o cec-objs := cec-core.o cec-adap.o cec-api.o
ifeq ($(CONFIG_MEDIA_CEC),y) ifeq ($(CONFIG_MEDIA_CEC_SUPPORT),y)
obj-$(CONFIG_MEDIA_SUPPORT) += cec.o obj-$(CONFIG_MEDIA_SUPPORT) += cec.o
endif endif

View File

@ -587,7 +587,6 @@ int cec_transmit_msg_fh(struct cec_adapter *adap, struct cec_msg *msg,
msg->tx_nack_cnt = 0; msg->tx_nack_cnt = 0;
msg->tx_low_drive_cnt = 0; msg->tx_low_drive_cnt = 0;
msg->tx_error_cnt = 0; msg->tx_error_cnt = 0;
msg->flags = 0;
msg->sequence = ++adap->sequence; msg->sequence = ++adap->sequence;
if (!msg->sequence) if (!msg->sequence)
msg->sequence = ++adap->sequence; msg->sequence = ++adap->sequence;
@ -596,6 +595,10 @@ int cec_transmit_msg_fh(struct cec_adapter *adap, struct cec_msg *msg,
/* Make sure the timeout isn't 0. */ /* Make sure the timeout isn't 0. */
msg->timeout = 1000; msg->timeout = 1000;
} }
if (msg->timeout)
msg->flags &= CEC_MSG_FL_REPLY_TO_FOLLOWERS;
else
msg->flags = 0;
/* Sanity checks */ /* Sanity checks */
if (msg->len == 0 || msg->len > CEC_MAX_MSG_SIZE) { if (msg->len == 0 || msg->len > CEC_MAX_MSG_SIZE) {
@ -763,23 +766,133 @@ EXPORT_SYMBOL_GPL(cec_transmit_msg);
static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg, static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
bool is_reply); bool is_reply);
#define DIRECTED 0x80
#define BCAST1_4 0x40
#define BCAST2_0 0x20 /* broadcast only allowed for >= 2.0 */
#define BCAST (BCAST1_4 | BCAST2_0)
#define BOTH (BCAST | DIRECTED)
/*
* Specify minimum length and whether the message is directed, broadcast
* or both. Messages that do not match the criteria are ignored as per
* the CEC specification.
*/
static const u8 cec_msg_size[256] = {
[CEC_MSG_ACTIVE_SOURCE] = 4 | BCAST,
[CEC_MSG_IMAGE_VIEW_ON] = 2 | DIRECTED,
[CEC_MSG_TEXT_VIEW_ON] = 2 | DIRECTED,
[CEC_MSG_INACTIVE_SOURCE] = 4 | DIRECTED,
[CEC_MSG_REQUEST_ACTIVE_SOURCE] = 2 | BCAST,
[CEC_MSG_ROUTING_CHANGE] = 6 | BCAST,
[CEC_MSG_ROUTING_INFORMATION] = 4 | BCAST,
[CEC_MSG_SET_STREAM_PATH] = 4 | BCAST,
[CEC_MSG_STANDBY] = 2 | BOTH,
[CEC_MSG_RECORD_OFF] = 2 | DIRECTED,
[CEC_MSG_RECORD_ON] = 3 | DIRECTED,
[CEC_MSG_RECORD_STATUS] = 3 | DIRECTED,
[CEC_MSG_RECORD_TV_SCREEN] = 2 | DIRECTED,
[CEC_MSG_CLEAR_ANALOGUE_TIMER] = 13 | DIRECTED,
[CEC_MSG_CLEAR_DIGITAL_TIMER] = 16 | DIRECTED,
[CEC_MSG_CLEAR_EXT_TIMER] = 13 | DIRECTED,
[CEC_MSG_SET_ANALOGUE_TIMER] = 13 | DIRECTED,
[CEC_MSG_SET_DIGITAL_TIMER] = 16 | DIRECTED,
[CEC_MSG_SET_EXT_TIMER] = 13 | DIRECTED,
[CEC_MSG_SET_TIMER_PROGRAM_TITLE] = 2 | DIRECTED,
[CEC_MSG_TIMER_CLEARED_STATUS] = 3 | DIRECTED,
[CEC_MSG_TIMER_STATUS] = 3 | DIRECTED,
[CEC_MSG_CEC_VERSION] = 3 | DIRECTED,
[CEC_MSG_GET_CEC_VERSION] = 2 | DIRECTED,
[CEC_MSG_GIVE_PHYSICAL_ADDR] = 2 | DIRECTED,
[CEC_MSG_GET_MENU_LANGUAGE] = 2 | DIRECTED,
[CEC_MSG_REPORT_PHYSICAL_ADDR] = 5 | BCAST,
[CEC_MSG_SET_MENU_LANGUAGE] = 5 | BCAST,
[CEC_MSG_REPORT_FEATURES] = 6 | BCAST,
[CEC_MSG_GIVE_FEATURES] = 2 | DIRECTED,
[CEC_MSG_DECK_CONTROL] = 3 | DIRECTED,
[CEC_MSG_DECK_STATUS] = 3 | DIRECTED,
[CEC_MSG_GIVE_DECK_STATUS] = 3 | DIRECTED,
[CEC_MSG_PLAY] = 3 | DIRECTED,
[CEC_MSG_GIVE_TUNER_DEVICE_STATUS] = 3 | DIRECTED,
[CEC_MSG_SELECT_ANALOGUE_SERVICE] = 6 | DIRECTED,
[CEC_MSG_SELECT_DIGITAL_SERVICE] = 9 | DIRECTED,
[CEC_MSG_TUNER_DEVICE_STATUS] = 7 | DIRECTED,
[CEC_MSG_TUNER_STEP_DECREMENT] = 2 | DIRECTED,
[CEC_MSG_TUNER_STEP_INCREMENT] = 2 | DIRECTED,
[CEC_MSG_DEVICE_VENDOR_ID] = 5 | BCAST,
[CEC_MSG_GIVE_DEVICE_VENDOR_ID] = 2 | DIRECTED,
[CEC_MSG_VENDOR_COMMAND] = 2 | DIRECTED,
[CEC_MSG_VENDOR_COMMAND_WITH_ID] = 5 | BOTH,
[CEC_MSG_VENDOR_REMOTE_BUTTON_DOWN] = 2 | BOTH,
[CEC_MSG_VENDOR_REMOTE_BUTTON_UP] = 2 | BOTH,
[CEC_MSG_SET_OSD_STRING] = 3 | DIRECTED,
[CEC_MSG_GIVE_OSD_NAME] = 2 | DIRECTED,
[CEC_MSG_SET_OSD_NAME] = 2 | DIRECTED,
[CEC_MSG_MENU_REQUEST] = 3 | DIRECTED,
[CEC_MSG_MENU_STATUS] = 3 | DIRECTED,
[CEC_MSG_USER_CONTROL_PRESSED] = 3 | DIRECTED,
[CEC_MSG_USER_CONTROL_RELEASED] = 2 | DIRECTED,
[CEC_MSG_GIVE_DEVICE_POWER_STATUS] = 2 | DIRECTED,
[CEC_MSG_REPORT_POWER_STATUS] = 3 | DIRECTED | BCAST2_0,
[CEC_MSG_FEATURE_ABORT] = 4 | DIRECTED,
[CEC_MSG_ABORT] = 2 | DIRECTED,
[CEC_MSG_GIVE_AUDIO_STATUS] = 2 | DIRECTED,
[CEC_MSG_GIVE_SYSTEM_AUDIO_MODE_STATUS] = 2 | DIRECTED,
[CEC_MSG_REPORT_AUDIO_STATUS] = 3 | DIRECTED,
[CEC_MSG_REPORT_SHORT_AUDIO_DESCRIPTOR] = 2 | DIRECTED,
[CEC_MSG_REQUEST_SHORT_AUDIO_DESCRIPTOR] = 2 | DIRECTED,
[CEC_MSG_SET_SYSTEM_AUDIO_MODE] = 3 | BOTH,
[CEC_MSG_SYSTEM_AUDIO_MODE_REQUEST] = 2 | DIRECTED,
[CEC_MSG_SYSTEM_AUDIO_MODE_STATUS] = 3 | DIRECTED,
[CEC_MSG_SET_AUDIO_RATE] = 3 | DIRECTED,
[CEC_MSG_INITIATE_ARC] = 2 | DIRECTED,
[CEC_MSG_REPORT_ARC_INITIATED] = 2 | DIRECTED,
[CEC_MSG_REPORT_ARC_TERMINATED] = 2 | DIRECTED,
[CEC_MSG_REQUEST_ARC_INITIATION] = 2 | DIRECTED,
[CEC_MSG_REQUEST_ARC_TERMINATION] = 2 | DIRECTED,
[CEC_MSG_TERMINATE_ARC] = 2 | DIRECTED,
[CEC_MSG_REQUEST_CURRENT_LATENCY] = 4 | BCAST,
[CEC_MSG_REPORT_CURRENT_LATENCY] = 7 | BCAST,
[CEC_MSG_CDC_MESSAGE] = 2 | BCAST,
};
/* Called by the CEC adapter if a message is received */ /* Called by the CEC adapter if a message is received */
void cec_received_msg(struct cec_adapter *adap, struct cec_msg *msg) void cec_received_msg(struct cec_adapter *adap, struct cec_msg *msg)
{ {
struct cec_data *data; struct cec_data *data;
u8 msg_init = cec_msg_initiator(msg); u8 msg_init = cec_msg_initiator(msg);
u8 msg_dest = cec_msg_destination(msg); u8 msg_dest = cec_msg_destination(msg);
u8 cmd = msg->msg[1];
bool is_reply = false; bool is_reply = false;
bool valid_la = true; bool valid_la = true;
u8 min_len = 0;
if (WARN_ON(!msg->len || msg->len > CEC_MAX_MSG_SIZE)) if (WARN_ON(!msg->len || msg->len > CEC_MAX_MSG_SIZE))
return; return;
/*
* Some CEC adapters will receive the messages that they transmitted.
* This test filters out those messages by checking if we are the
* initiator, and just returning in that case.
*
* Note that this won't work if this is an Unregistered device.
*
* It is bad practice if the hardware receives the message that it
* transmitted and luckily most CEC adapters behave correctly in this
* respect.
*/
if (msg_init != CEC_LOG_ADDR_UNREGISTERED &&
cec_has_log_addr(adap, msg_init))
return;
msg->rx_ts = ktime_get_ns(); msg->rx_ts = ktime_get_ns();
msg->rx_status = CEC_RX_STATUS_OK; msg->rx_status = CEC_RX_STATUS_OK;
msg->sequence = msg->reply = msg->timeout = 0; msg->sequence = msg->reply = msg->timeout = 0;
msg->tx_status = 0; msg->tx_status = 0;
msg->tx_ts = 0; msg->tx_ts = 0;
msg->tx_arb_lost_cnt = 0;
msg->tx_nack_cnt = 0;
msg->tx_low_drive_cnt = 0;
msg->tx_error_cnt = 0;
msg->flags = 0; msg->flags = 0;
memset(msg->msg + msg->len, 0, sizeof(msg->msg) - msg->len); memset(msg->msg + msg->len, 0, sizeof(msg->msg) - msg->len);
@ -790,9 +903,71 @@ void cec_received_msg(struct cec_adapter *adap, struct cec_msg *msg)
if (!cec_msg_is_broadcast(msg)) if (!cec_msg_is_broadcast(msg))
valid_la = cec_has_log_addr(adap, msg_dest); valid_la = cec_has_log_addr(adap, msg_dest);
/*
* Check if the length is not too short or if the message is a
* broadcast message where a directed message was expected or
* vice versa. If so, then the message has to be ignored (according
* to section CEC 7.3 and CEC 12.2).
*/
if (valid_la && msg->len > 1 && cec_msg_size[cmd]) {
u8 dir_fl = cec_msg_size[cmd] & BOTH;
min_len = cec_msg_size[cmd] & 0x1f;
if (msg->len < min_len)
valid_la = false;
else if (!cec_msg_is_broadcast(msg) && !(dir_fl & DIRECTED))
valid_la = false;
else if (cec_msg_is_broadcast(msg) && !(dir_fl & BCAST1_4))
valid_la = false;
else if (cec_msg_is_broadcast(msg) &&
adap->log_addrs.cec_version >= CEC_OP_CEC_VERSION_2_0 &&
!(dir_fl & BCAST2_0))
valid_la = false;
}
if (valid_la && min_len) {
/* These messages have special length requirements */
switch (cmd) {
case CEC_MSG_TIMER_STATUS:
if (msg->msg[2] & 0x10) {
switch (msg->msg[2] & 0xf) {
case CEC_OP_PROG_INFO_NOT_ENOUGH_SPACE:
case CEC_OP_PROG_INFO_MIGHT_NOT_BE_ENOUGH_SPACE:
if (msg->len < 5)
valid_la = false;
break;
}
} else if ((msg->msg[2] & 0xf) == CEC_OP_PROG_ERROR_DUPLICATE) {
if (msg->len < 5)
valid_la = false;
}
break;
case CEC_MSG_RECORD_ON:
switch (msg->msg[2]) {
case CEC_OP_RECORD_SRC_OWN:
break;
case CEC_OP_RECORD_SRC_DIGITAL:
if (msg->len < 10)
valid_la = false;
break;
case CEC_OP_RECORD_SRC_ANALOG:
if (msg->len < 7)
valid_la = false;
break;
case CEC_OP_RECORD_SRC_EXT_PLUG:
if (msg->len < 4)
valid_la = false;
break;
case CEC_OP_RECORD_SRC_EXT_PHYS_ADDR:
if (msg->len < 5)
valid_la = false;
break;
}
break;
}
}
/* It's a valid message and not a poll or CDC message */ /* It's a valid message and not a poll or CDC message */
if (valid_la && msg->len > 1 && msg->msg[1] != CEC_MSG_CDC_MESSAGE) { if (valid_la && msg->len > 1 && cmd != CEC_MSG_CDC_MESSAGE) {
u8 cmd = msg->msg[1];
bool abort = cmd == CEC_MSG_FEATURE_ABORT; bool abort = cmd == CEC_MSG_FEATURE_ABORT;
/* The aborted command is in msg[2] */ /* The aborted command is in msg[2] */
@ -806,6 +981,18 @@ void cec_received_msg(struct cec_adapter *adap, struct cec_msg *msg)
list_for_each_entry(data, &adap->wait_queue, list) { list_for_each_entry(data, &adap->wait_queue, list) {
struct cec_msg *dst = &data->msg; struct cec_msg *dst = &data->msg;
/*
* The *only* CEC message that has two possible replies
* is CEC_MSG_INITIATE_ARC.
* In this case allow either of the two replies.
*/
if (!abort && dst->msg[1] == CEC_MSG_INITIATE_ARC &&
(cmd == CEC_MSG_REPORT_ARC_INITIATED ||
cmd == CEC_MSG_REPORT_ARC_TERMINATED) &&
(dst->reply == CEC_MSG_REPORT_ARC_INITIATED ||
dst->reply == CEC_MSG_REPORT_ARC_TERMINATED))
dst->reply = cmd;
/* Does the command match? */ /* Does the command match? */
if ((abort && cmd != dst->msg[1]) || if ((abort && cmd != dst->msg[1]) ||
(!abort && cmd != dst->reply)) (!abort && cmd != dst->reply))
@ -823,6 +1010,7 @@ void cec_received_msg(struct cec_adapter *adap, struct cec_msg *msg)
dst->rx_status = msg->rx_status; dst->rx_status = msg->rx_status;
if (abort) if (abort)
dst->rx_status |= CEC_RX_STATUS_FEATURE_ABORT; dst->rx_status |= CEC_RX_STATUS_FEATURE_ABORT;
msg->flags = dst->flags;
/* Remove it from the wait_queue */ /* Remove it from the wait_queue */
list_del_init(&data->list); list_del_init(&data->list);
@ -1068,7 +1256,8 @@ configured:
mutex_unlock(&adap->lock); mutex_unlock(&adap->lock);
for (i = 0; i < las->num_log_addrs; i++) { for (i = 0; i < las->num_log_addrs; i++) {
if (las->log_addr[i] == CEC_LOG_ADDR_INVALID) if (las->log_addr[i] == CEC_LOG_ADDR_INVALID ||
(las->flags & CEC_LOG_ADDRS_FL_CDC_ONLY))
continue; continue;
/* /*
@ -1190,6 +1379,29 @@ int __cec_s_log_addrs(struct cec_adapter *adap,
return 0; return 0;
} }
if (log_addrs->flags & CEC_LOG_ADDRS_FL_CDC_ONLY) {
/*
* Sanitize log_addrs fields if a CDC-Only device is
* requested.
*/
log_addrs->num_log_addrs = 1;
log_addrs->osd_name[0] = '\0';
log_addrs->vendor_id = CEC_VENDOR_ID_NONE;
log_addrs->log_addr_type[0] = CEC_LOG_ADDR_TYPE_UNREGISTERED;
/*
* This is just an internal convention since a CDC-Only device
* doesn't have to be a switch. But switches already use
* unregistered, so it makes some kind of sense to pick this
* as the primary device. Since a CDC-Only device never sends
* any 'normal' CEC messages this primary device type is never
* sent over the CEC bus.
*/
log_addrs->primary_device_type[0] = CEC_OP_PRIM_DEVTYPE_SWITCH;
log_addrs->all_device_types[0] = 0;
log_addrs->features[0][0] = 0;
log_addrs->features[0][1] = 0;
}
/* Ensure the osd name is 0-terminated */ /* Ensure the osd name is 0-terminated */
log_addrs->osd_name[sizeof(log_addrs->osd_name) - 1] = '\0'; log_addrs->osd_name[sizeof(log_addrs->osd_name) - 1] = '\0';
@ -1223,6 +1435,7 @@ int __cec_s_log_addrs(struct cec_adapter *adap,
const u8 feature_sz = ARRAY_SIZE(log_addrs->features[0]); const u8 feature_sz = ARRAY_SIZE(log_addrs->features[0]);
u8 *features = log_addrs->features[i]; u8 *features = log_addrs->features[i];
bool op_is_dev_features = false; bool op_is_dev_features = false;
unsigned j;
log_addrs->log_addr[i] = CEC_LOG_ADDR_INVALID; log_addrs->log_addr[i] = CEC_LOG_ADDR_INVALID;
if (type_mask & (1 << log_addrs->log_addr_type[i])) { if (type_mask & (1 << log_addrs->log_addr_type[i])) {
@ -1249,19 +1462,19 @@ int __cec_s_log_addrs(struct cec_adapter *adap,
dprintk(1, "unknown logical address type\n"); dprintk(1, "unknown logical address type\n");
return -EINVAL; return -EINVAL;
} }
for (i = 0; i < feature_sz; i++) { for (j = 0; j < feature_sz; j++) {
if ((features[i] & 0x80) == 0) { if ((features[j] & 0x80) == 0) {
if (op_is_dev_features) if (op_is_dev_features)
break; break;
op_is_dev_features = true; op_is_dev_features = true;
} }
} }
if (!op_is_dev_features || i == feature_sz) { if (!op_is_dev_features || j == feature_sz) {
dprintk(1, "malformed features\n"); dprintk(1, "malformed features\n");
return -EINVAL; return -EINVAL;
} }
/* Zero unused part of the feature array */ /* Zero unused part of the feature array */
memset(features + i + 1, 0, feature_sz - i - 1); memset(features + j + 1, 0, feature_sz - j - 1);
} }
if (log_addrs->cec_version >= CEC_OP_CEC_VERSION_2_0) { if (log_addrs->cec_version >= CEC_OP_CEC_VERSION_2_0) {
@ -1410,6 +1623,11 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
dprintk(1, "cec_receive_notify: %*ph\n", msg->len, msg->msg); dprintk(1, "cec_receive_notify: %*ph\n", msg->len, msg->msg);
/* If this is a CDC-Only device, then ignore any non-CDC messages */
if (cec_is_cdc_only(&adap->log_addrs) &&
msg->msg[1] != CEC_MSG_CDC_MESSAGE)
return 0;
if (adap->ops->received) { if (adap->ops->received) {
/* Allow drivers to process the message first */ /* Allow drivers to process the message first */
if (adap->ops->received(adap, msg) != -ENOMSG) if (adap->ops->received(adap, msg) != -ENOMSG)
@ -1478,7 +1696,8 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
} }
case CEC_MSG_USER_CONTROL_PRESSED: case CEC_MSG_USER_CONTROL_PRESSED:
if (!(adap->capabilities & CEC_CAP_RC)) if (!(adap->capabilities & CEC_CAP_RC) ||
!(adap->log_addrs.flags & CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU))
break; break;
#if IS_REACHABLE(CONFIG_RC_CORE) #if IS_REACHABLE(CONFIG_RC_CORE)
@ -1515,7 +1734,8 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
break; break;
case CEC_MSG_USER_CONTROL_RELEASED: case CEC_MSG_USER_CONTROL_RELEASED:
if (!(adap->capabilities & CEC_CAP_RC)) if (!(adap->capabilities & CEC_CAP_RC) ||
!(adap->log_addrs.flags & CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU))
break; break;
#if IS_REACHABLE(CONFIG_RC_CORE) #if IS_REACHABLE(CONFIG_RC_CORE)
rc_keyup(adap->rc); rc_keyup(adap->rc);
@ -1573,8 +1793,8 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
} }
skip_processing: skip_processing:
/* If this was a reply, then we're done */ /* If this was a reply, then we're done, unless otherwise specified */
if (is_reply) if (is_reply && !(msg->flags & CEC_MSG_FL_REPLY_TO_FOLLOWERS))
return 0; return 0;
/* /*

View File

@ -88,7 +88,7 @@ static long cec_adap_g_caps(struct cec_adapter *adap,
{ {
struct cec_caps caps = {}; struct cec_caps caps = {};
strlcpy(caps.driver, adap->devnode.parent->driver->name, strlcpy(caps.driver, adap->devnode.dev.parent->driver->name,
sizeof(caps.driver)); sizeof(caps.driver));
strlcpy(caps.name, adap->name, sizeof(caps.name)); strlcpy(caps.name, adap->name, sizeof(caps.name));
caps.available_log_addrs = adap->available_log_addrs; caps.available_log_addrs = adap->available_log_addrs;
@ -162,7 +162,9 @@ static long cec_adap_s_log_addrs(struct cec_adapter *adap, struct cec_fh *fh,
return -ENOTTY; return -ENOTTY;
if (copy_from_user(&log_addrs, parg, sizeof(log_addrs))) if (copy_from_user(&log_addrs, parg, sizeof(log_addrs)))
return -EFAULT; return -EFAULT;
log_addrs.flags &= CEC_LOG_ADDRS_FL_ALLOW_UNREG_FALLBACK; log_addrs.flags &= CEC_LOG_ADDRS_FL_ALLOW_UNREG_FALLBACK |
CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU |
CEC_LOG_ADDRS_FL_CDC_ONLY;
mutex_lock(&adap->lock); mutex_lock(&adap->lock);
if (!adap->is_configuring && if (!adap->is_configuring &&
(!log_addrs.num_log_addrs || !adap->is_configured) && (!log_addrs.num_log_addrs || !adap->is_configured) &&
@ -189,6 +191,12 @@ static long cec_transmit(struct cec_adapter *adap, struct cec_fh *fh,
return -ENOTTY; return -ENOTTY;
if (copy_from_user(&msg, parg, sizeof(msg))) if (copy_from_user(&msg, parg, sizeof(msg)))
return -EFAULT; return -EFAULT;
/* A CDC-Only device can only send CDC messages */
if ((adap->log_addrs.flags & CEC_LOG_ADDRS_FL_CDC_ONLY) &&
(msg.len == 1 || msg.msg[1] != CEC_MSG_CDC_MESSAGE))
return -EINVAL;
mutex_lock(&adap->lock); mutex_lock(&adap->lock);
if (!adap->is_configured) if (!adap->is_configured)
err = -ENONET; err = -ENONET;
@ -273,6 +281,7 @@ static long cec_receive(struct cec_adapter *adap, struct cec_fh *fh,
err = cec_receive_msg(fh, &msg, block); err = cec_receive_msg(fh, &msg, block);
if (err) if (err)
return err; return err;
msg.flags = 0;
if (copy_to_user(parg, &msg, sizeof(msg))) if (copy_to_user(parg, &msg, sizeof(msg)))
return -EFAULT; return -EFAULT;
return 0; return 0;

View File

@ -132,7 +132,6 @@ static int __must_check cec_devnode_register(struct cec_devnode *devnode,
devnode->dev.bus = &cec_bus_type; devnode->dev.bus = &cec_bus_type;
devnode->dev.devt = MKDEV(MAJOR(cec_dev_t), minor); devnode->dev.devt = MKDEV(MAJOR(cec_dev_t), minor);
devnode->dev.release = cec_devnode_release; devnode->dev.release = cec_devnode_release;
devnode->dev.parent = devnode->parent;
dev_set_name(&devnode->dev, "cec%d", devnode->minor); dev_set_name(&devnode->dev, "cec%d", devnode->minor);
device_initialize(&devnode->dev); device_initialize(&devnode->dev);
@ -198,13 +197,11 @@ static void cec_devnode_unregister(struct cec_devnode *devnode)
struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops, struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
void *priv, const char *name, u32 caps, void *priv, const char *name, u32 caps,
u8 available_las, struct device *parent) u8 available_las)
{ {
struct cec_adapter *adap; struct cec_adapter *adap;
int res; int res;
if (WARN_ON(!parent))
return ERR_PTR(-EINVAL);
if (WARN_ON(!caps)) if (WARN_ON(!caps))
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
if (WARN_ON(!ops)) if (WARN_ON(!ops))
@ -214,8 +211,6 @@ struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
adap = kzalloc(sizeof(*adap), GFP_KERNEL); adap = kzalloc(sizeof(*adap), GFP_KERNEL);
if (!adap) if (!adap)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
adap->owner = parent->driver->owner;
adap->devnode.parent = parent;
strlcpy(adap->name, name, sizeof(adap->name)); strlcpy(adap->name, name, sizeof(adap->name));
adap->phys_addr = CEC_PHYS_ADDR_INVALID; adap->phys_addr = CEC_PHYS_ADDR_INVALID;
adap->log_addrs.cec_version = CEC_OP_CEC_VERSION_2_0; adap->log_addrs.cec_version = CEC_OP_CEC_VERSION_2_0;
@ -264,7 +259,6 @@ struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
adap->rc->input_id.vendor = 0; adap->rc->input_id.vendor = 0;
adap->rc->input_id.product = 0; adap->rc->input_id.product = 0;
adap->rc->input_id.version = 1; adap->rc->input_id.version = 1;
adap->rc->dev.parent = parent;
adap->rc->driver_type = RC_DRIVER_SCANCODE; adap->rc->driver_type = RC_DRIVER_SCANCODE;
adap->rc->driver_name = CEC_NAME; adap->rc->driver_name = CEC_NAME;
adap->rc->allowed_protocols = RC_BIT_CEC; adap->rc->allowed_protocols = RC_BIT_CEC;
@ -278,14 +272,22 @@ struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
} }
EXPORT_SYMBOL_GPL(cec_allocate_adapter); EXPORT_SYMBOL_GPL(cec_allocate_adapter);
int cec_register_adapter(struct cec_adapter *adap) int cec_register_adapter(struct cec_adapter *adap,
struct device *parent)
{ {
int res; int res;
if (IS_ERR_OR_NULL(adap)) if (IS_ERR_OR_NULL(adap))
return 0; return 0;
if (WARN_ON(!parent))
return -EINVAL;
adap->owner = parent->driver->owner;
adap->devnode.dev.parent = parent;
#if IS_REACHABLE(CONFIG_RC_CORE) #if IS_REACHABLE(CONFIG_RC_CORE)
adap->rc->dev.parent = parent;
if (adap->capabilities & CEC_CAP_RC) { if (adap->capabilities & CEC_CAP_RC) {
res = rc_register_device(adap->rc); res = rc_register_device(adap->rc);

View File

@ -14,7 +14,6 @@
#include "dmxdev.h" #include "dmxdev.h"
#include "dvb_demux.h" #include "dvb_demux.h"
#include "dvb_filter.h"
#include "dvb_net.h" #include "dvb_net.h"
#include "dvb_frontend.h" #include "dvb_frontend.h"

View File

@ -136,8 +136,7 @@ int flexcop_eeprom_check_mac_addr(struct flexcop_device *fc, int extended)
if ((ret = flexcop_eeprom_lrc_read(fc,0x3f8,buf,8,4)) == 0) { if ((ret = flexcop_eeprom_lrc_read(fc,0x3f8,buf,8,4)) == 0) {
if (extended != 0) { if (extended != 0) {
err("TODO: extended (EUI64) MAC addresses aren't " err("TODO: extended (EUI64) MAC addresses aren't completely supported yet");
"completely supported yet");
ret = -EINVAL; ret = -EINVAL;
} else } else
memcpy(fc->dvb_adapter.proposed_mac,buf,6); memcpy(fc->dvb_adapter.proposed_mac,buf,6);

View File

@ -33,8 +33,8 @@ static int flexcop_i2c_operation(struct flexcop_device *fc,
return -EREMOTEIO; return -EREMOTEIO;
} }
} }
deb_i2c("tried %d times i2c operation, " deb_i2c("tried %d times i2c operation, never finished or too many ack errors.\n",
"never finished or too many ack errors.\n", i); i);
return -EREMOTEIO; return -EREMOTEIO;
} }
@ -124,10 +124,10 @@ int flexcop_i2c_request(struct flexcop_i2c_adapter *i2c,
#ifdef DUMP_I2C_MESSAGES #ifdef DUMP_I2C_MESSAGES
printk(KERN_DEBUG "%d ", i2c->port); printk(KERN_DEBUG "%d ", i2c->port);
if (op == FC_READ) if (op == FC_READ)
printk("rd("); printk(KERN_CONT "rd(");
else else
printk("wr("); printk(KERN_CONT "wr(");
printk("%02x): %02x ", chipaddr, addr); printk(KERN_CONT "%02x): %02x ", chipaddr, addr);
#endif #endif
/* in that case addr is the only value -> /* in that case addr is the only value ->
@ -151,7 +151,7 @@ int flexcop_i2c_request(struct flexcop_i2c_adapter *i2c,
#ifdef DUMP_I2C_MESSAGES #ifdef DUMP_I2C_MESSAGES
for (i = 0; i < bytes_to_transfer; i++) for (i = 0; i < bytes_to_transfer; i++)
printk("%02x ", buf[i]); printk(KERN_CONT "%02x ", buf[i]);
#endif #endif
if (ret < 0) if (ret < 0)
@ -163,7 +163,7 @@ int flexcop_i2c_request(struct flexcop_i2c_adapter *i2c,
} }
#ifdef DUMP_I2C_MESSAGES #ifdef DUMP_I2C_MESSAGES
printk("\n"); printk(KERN_CONT "\n");
#endif #endif
return 0; return 0;

View File

@ -23,18 +23,15 @@ void flexcop_determine_revision(struct flexcop_device *fc)
fc->rev = FLEXCOP_III; fc->rev = FLEXCOP_III;
break; break;
default: default:
err("unknown FlexCop Revision: %x. Please report this to " err("unknown FlexCop Revision: %x. Please report this to linux-dvb@linuxtv.org.",
"linux-dvb@linuxtv.org.",
v.misc_204.Rev_N_sig_revision_hi); v.misc_204.Rev_N_sig_revision_hi);
break; break;
} }
if ((fc->has_32_hw_pid_filter = v.misc_204.Rev_N_sig_caps)) if ((fc->has_32_hw_pid_filter = v.misc_204.Rev_N_sig_caps))
deb_info("this FlexCop has " deb_info("this FlexCop has the additional 32 hardware pid filter.\n");
"the additional 32 hardware pid filter.\n");
else else
deb_info("this FlexCop has " deb_info("this FlexCop has the 6 basic main hardware pid filter.\n");
"the 6 basic main hardware pid filter.\n");
/* bus parts have to decide if hw pid filtering is used or not. */ /* bus parts have to decide if hw pid filtering is used or not. */
} }

View File

@ -46,8 +46,7 @@ int b2c2_flexcop_debug;
EXPORT_SYMBOL_GPL(b2c2_flexcop_debug); EXPORT_SYMBOL_GPL(b2c2_flexcop_debug);
module_param_named(debug, b2c2_flexcop_debug, int, 0644); module_param_named(debug, b2c2_flexcop_debug, int, 0644);
MODULE_PARM_DESC(debug, MODULE_PARM_DESC(debug,
"set debug level (1=info,2=tuner,4=i2c,8=ts," "set debug level (1=info,2=tuner,4=i2c,8=ts,16=sram,32=reg (|-able))."
"16=sram,32=reg (|-able))."
DEBSTATUS); DEBSTATUS);
#undef DEBSTATUS #undef DEBSTATUS

View File

@ -1190,8 +1190,8 @@ void cx2341x_log_status(const struct cx2341x_mpeg_params *p, const char *prefix)
prefix, prefix,
cx2341x_menu_item(p, V4L2_CID_MPEG_STREAM_TYPE)); cx2341x_menu_item(p, V4L2_CID_MPEG_STREAM_TYPE));
if (p->stream_insert_nav_packets) if (p->stream_insert_nav_packets)
printk(" (with navigation packets)"); printk(KERN_CONT " (with navigation packets)");
printk("\n"); printk(KERN_CONT "\n");
printk(KERN_INFO "%s: VBI Format: %s\n", printk(KERN_INFO "%s: VBI Format: %s\n",
prefix, prefix,
cx2341x_menu_item(p, V4L2_CID_MPEG_STREAM_VBI_FMT)); cx2341x_menu_item(p, V4L2_CID_MPEG_STREAM_VBI_FMT));
@ -1209,8 +1209,8 @@ void cx2341x_log_status(const struct cx2341x_mpeg_params *p, const char *prefix)
cx2341x_menu_item(p, V4L2_CID_MPEG_VIDEO_BITRATE_MODE), cx2341x_menu_item(p, V4L2_CID_MPEG_VIDEO_BITRATE_MODE),
p->video_bitrate); p->video_bitrate);
if (p->video_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) if (p->video_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR)
printk(", Peak %d", p->video_bitrate_peak); printk(KERN_CONT ", Peak %d", p->video_bitrate_peak);
printk("\n"); printk(KERN_CONT "\n");
printk(KERN_INFO printk(KERN_INFO
"%s: Video: GOP Size %d, %d B-Frames, %sGOP Closure\n", "%s: Video: GOP Size %d, %d B-Frames, %sGOP Closure\n",
prefix, prefix,
@ -1232,9 +1232,9 @@ void cx2341x_log_status(const struct cx2341x_mpeg_params *p, const char *prefix)
cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_MODE), cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_MODE),
p->audio_mute ? " (muted)" : ""); p->audio_mute ? " (muted)" : "");
if (p->audio_mode == V4L2_MPEG_AUDIO_MODE_JOINT_STEREO) if (p->audio_mode == V4L2_MPEG_AUDIO_MODE_JOINT_STEREO)
printk(", %s", cx2341x_menu_item(p, printk(KERN_CONT ", %s", cx2341x_menu_item(p,
V4L2_CID_MPEG_AUDIO_MODE_EXTENSION)); V4L2_CID_MPEG_AUDIO_MODE_EXTENSION));
printk(", %s, %s\n", printk(KERN_CONT ", %s, %s\n",
cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_EMPHASIS), cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_EMPHASIS),
cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_CRC)); cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_CRC));

View File

@ -390,6 +390,7 @@ static int video_end(struct saa7146_fh *fh, struct file *file)
{ {
struct saa7146_dev *dev = fh->dev; struct saa7146_dev *dev = fh->dev;
struct saa7146_vv *vv = dev->vv_data; struct saa7146_vv *vv = dev->vv_data;
struct saa7146_dmaqueue *q = &vv->video_dmaq;
struct saa7146_format *fmt = NULL; struct saa7146_format *fmt = NULL;
unsigned long flags; unsigned long flags;
unsigned int resource; unsigned int resource;
@ -428,6 +429,9 @@ static int video_end(struct saa7146_fh *fh, struct file *file)
/* shut down all used video dma transfers */ /* shut down all used video dma transfers */
saa7146_write(dev, MC1, dmas); saa7146_write(dev, MC1, dmas);
if (q->curr)
saa7146_buffer_finish(dev, q, VIDEOBUF_DONE);
spin_unlock_irqrestore(&dev->slock, flags); spin_unlock_irqrestore(&dev->slock, flags);
vv->video_fh = NULL; vv->video_fh = NULL;

View File

@ -1044,7 +1044,7 @@ static void smsdvb_release(struct dvb_frontend *fe)
/* do nothing */ /* do nothing */
} }
static struct dvb_frontend_ops smsdvb_fe_ops = { static const struct dvb_frontend_ops smsdvb_fe_ops = {
.info = { .info = {
.name = "Siano Mobile Digital MDTV Receiver", .name = "Siano Mobile Digital MDTV Receiver",
.frequency_min = 44250000, .frequency_min = 44250000,

View File

@ -28,6 +28,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h> #include <linux/module.h>
#include <linux/errno.h> #include <linux/errno.h>
@ -45,22 +46,9 @@ MODULE_DESCRIPTION("i2c Hauppauge eeprom decoder driver");
MODULE_AUTHOR("John Klar"); MODULE_AUTHOR("John Klar");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
static int debug;
module_param(debug, int, 0644);
MODULE_PARM_DESC(debug, "Debug level (0-1)");
#define STRM(array, i) \ #define STRM(array, i) \
(i < sizeof(array) / sizeof(char *) ? array[i] : "unknown") (i < sizeof(array) / sizeof(char *) ? array[i] : "unknown")
#define tveeprom_info(fmt, arg...) \
v4l_printk(KERN_INFO, "tveeprom", c->adapter, c->addr, fmt , ## arg)
#define tveeprom_warn(fmt, arg...) \
v4l_printk(KERN_WARNING, "tveeprom", c->adapter, c->addr, fmt , ## arg)
#define tveeprom_dbg(fmt, arg...) do { \
if (debug) \
v4l_printk(KERN_DEBUG, "tveeprom", \
c->adapter, c->addr, fmt , ## arg); \
} while (0)
/* /*
* The Hauppauge eeprom uses an 8bit field to determine which * The Hauppauge eeprom uses an 8bit field to determine which
@ -510,19 +498,13 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
len = eeprom_data[i] & 0x07; len = eeprom_data[i] & 0x07;
++i; ++i;
} else { } else {
tveeprom_warn("Encountered bad packet header [%02x]. " pr_warn("Encountered bad packet header [%02x]. Corrupt or not a Hauppauge eeprom.\n",
"Corrupt or not a Hauppauge eeprom.\n",
eeprom_data[i]); eeprom_data[i]);
return; return;
} }
if (debug) { pr_debug("Tag [%02x] + %d bytes: %*ph\n",
tveeprom_info("Tag [%02x] + %d bytes:", eeprom_data[i], len - 1, len, &eeprom_data[i]);
eeprom_data[i], len - 1);
for (j = 1; j < len; j++)
printk(KERN_CONT " %02x", eeprom_data[i + j]);
printk(KERN_CONT "\n");
}
/* process by tag */ /* process by tag */
tag = eeprom_data[i]; tag = eeprom_data[i];
@ -662,14 +644,14 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
/* case 0x12: tag 'InfoBits' */ /* case 0x12: tag 'InfoBits' */
default: default:
tveeprom_dbg("Not sure what to do with tag [%02x]\n", pr_debug("Not sure what to do with tag [%02x]\n",
tag); tag);
/* dump the rest of the packet? */ /* dump the rest of the packet? */
} }
} }
if (!done) { if (!done) {
tveeprom_warn("Ran out of data!\n"); pr_warn("Ran out of data!\n");
return; return;
} }
@ -682,8 +664,8 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
} }
if (hasRadioTuner(tuner1) && !tvee->has_radio) { if (hasRadioTuner(tuner1) && !tvee->has_radio) {
tveeprom_info("The eeprom says no radio is present, but the tuner type\n"); pr_info("The eeprom says no radio is present, but the tuner type\n");
tveeprom_info("indicates otherwise. I will assume that radio is present.\n"); pr_info("indicates otherwise. I will assume that radio is present.\n");
tvee->has_radio = 1; tvee->has_radio = 1;
} }
@ -718,46 +700,46 @@ void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,
} }
} }
tveeprom_info("Hauppauge model %d, rev %s, serial# %u\n", pr_info("Hauppauge model %d, rev %s, serial# %u\n",
tvee->model, tvee->rev_str, tvee->serial_number); tvee->model, tvee->rev_str, tvee->serial_number);
if (tvee->has_MAC_address == 1) if (tvee->has_MAC_address == 1)
tveeprom_info("MAC address is %pM\n", tvee->MAC_address); pr_info("MAC address is %pM\n", tvee->MAC_address);
tveeprom_info("tuner model is %s (idx %d, type %d)\n", pr_info("tuner model is %s (idx %d, type %d)\n",
t_name1, tuner1, tvee->tuner_type); t_name1, tuner1, tvee->tuner_type);
tveeprom_info("TV standards%s%s%s%s%s%s%s%s (eeprom 0x%02x)\n", pr_info("TV standards%s%s%s%s%s%s%s%s (eeprom 0x%02x)\n",
t_fmt_name1[0], t_fmt_name1[1], t_fmt_name1[2], t_fmt_name1[0], t_fmt_name1[1], t_fmt_name1[2],
t_fmt_name1[3], t_fmt_name1[4], t_fmt_name1[5], t_fmt_name1[3], t_fmt_name1[4], t_fmt_name1[5],
t_fmt_name1[6], t_fmt_name1[7], t_format1); t_fmt_name1[6], t_fmt_name1[7], t_format1);
if (tuner2) if (tuner2)
tveeprom_info("second tuner model is %s (idx %d, type %d)\n", pr_info("second tuner model is %s (idx %d, type %d)\n",
t_name2, tuner2, tvee->tuner2_type); t_name2, tuner2, tvee->tuner2_type);
if (t_format2) if (t_format2)
tveeprom_info("TV standards%s%s%s%s%s%s%s%s (eeprom 0x%02x)\n", pr_info("TV standards%s%s%s%s%s%s%s%s (eeprom 0x%02x)\n",
t_fmt_name2[0], t_fmt_name2[1], t_fmt_name2[2], t_fmt_name2[0], t_fmt_name2[1], t_fmt_name2[2],
t_fmt_name2[3], t_fmt_name2[4], t_fmt_name2[5], t_fmt_name2[3], t_fmt_name2[4], t_fmt_name2[5],
t_fmt_name2[6], t_fmt_name2[7], t_format2); t_fmt_name2[6], t_fmt_name2[7], t_format2);
if (audioic < 0) { if (audioic < 0) {
tveeprom_info("audio processor is unknown (no idx)\n"); pr_info("audio processor is unknown (no idx)\n");
tvee->audio_processor = TVEEPROM_AUDPROC_OTHER; tvee->audio_processor = TVEEPROM_AUDPROC_OTHER;
} else { } else {
if (audioic < ARRAY_SIZE(audio_ic)) if (audioic < ARRAY_SIZE(audio_ic))
tveeprom_info("audio processor is %s (idx %d)\n", pr_info("audio processor is %s (idx %d)\n",
audio_ic[audioic].name, audioic); audio_ic[audioic].name, audioic);
else else
tveeprom_info("audio processor is unknown (idx %d)\n", pr_info("audio processor is unknown (idx %d)\n",
audioic); audioic);
} }
if (tvee->decoder_processor) if (tvee->decoder_processor)
tveeprom_info("decoder processor is %s (idx %d)\n", pr_info("decoder processor is %s (idx %d)\n",
STRM(decoderIC, tvee->decoder_processor), STRM(decoderIC, tvee->decoder_processor),
tvee->decoder_processor); tvee->decoder_processor);
if (tvee->has_ir) if (tvee->has_ir)
tveeprom_info("has %sradio, has %sIR receiver, has %sIR transmitter\n", pr_info("has %sradio, has %sIR receiver, has %sIR transmitter\n",
tvee->has_radio ? "" : "no ", tvee->has_radio ? "" : "no ",
(tvee->has_ir & 2) ? "" : "no ", (tvee->has_ir & 2) ? "" : "no ",
(tvee->has_ir & 4) ? "" : "no "); (tvee->has_ir & 4) ? "" : "no ");
else else
tveeprom_info("has %sradio\n", pr_info("has %sradio\n",
tvee->has_radio ? "" : "no "); tvee->has_radio ? "" : "no ");
} }
EXPORT_SYMBOL(tveeprom_hauppauge_analog); EXPORT_SYMBOL(tveeprom_hauppauge_analog);
@ -773,26 +755,17 @@ int tveeprom_read(struct i2c_client *c, unsigned char *eedata, int len)
buf = 0; buf = 0;
err = i2c_master_send(c, &buf, 1); err = i2c_master_send(c, &buf, 1);
if (err != 1) { if (err != 1) {
tveeprom_info("Huh, no eeprom present (err=%d)?\n", err); pr_info("Huh, no eeprom present (err=%d)?\n", err);
return -1; return -1;
} }
err = i2c_master_recv(c, eedata, len); err = i2c_master_recv(c, eedata, len);
if (err != len) { if (err != len) {
tveeprom_warn("i2c eeprom read error (err=%d)\n", err); pr_warn("i2c eeprom read error (err=%d)\n", err);
return -1; return -1;
} }
if (debug) {
int i;
tveeprom_info("full 256-byte eeprom dump:\n"); print_hex_dump_debug("full 256-byte eeprom dump:", DUMP_PREFIX_NONE,
for (i = 0; i < len; i++) { 16, 1, eedata, len, true);
if (0 == (i % 16))
tveeprom_info("%02x:", i);
printk(KERN_CONT " %02x", eedata[i]);
if (15 == (i % 16))
printk(KERN_CONT "\n");
}
}
return 0; return 0;
} }
EXPORT_SYMBOL(tveeprom_read); EXPORT_SYMBOL(tveeprom_read);

View File

@ -117,6 +117,7 @@ void tpg_init(struct tpg_data *tpg, unsigned w, unsigned h)
tpg_s_fourcc(tpg, V4L2_PIX_FMT_RGB24); tpg_s_fourcc(tpg, V4L2_PIX_FMT_RGB24);
tpg->colorspace = V4L2_COLORSPACE_SRGB; tpg->colorspace = V4L2_COLORSPACE_SRGB;
tpg->perc_fill = 100; tpg->perc_fill = 100;
tpg->hsv_enc = V4L2_HSV_ENC_180;
} }
EXPORT_SYMBOL_GPL(tpg_init); EXPORT_SYMBOL_GPL(tpg_init);
@ -234,16 +235,18 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc)
case V4L2_PIX_FMT_XBGR32: case V4L2_PIX_FMT_XBGR32:
case V4L2_PIX_FMT_ARGB32: case V4L2_PIX_FMT_ARGB32:
case V4L2_PIX_FMT_ABGR32: case V4L2_PIX_FMT_ABGR32:
tpg->color_enc = TGP_COLOR_ENC_RGB;
break;
case V4L2_PIX_FMT_GREY: case V4L2_PIX_FMT_GREY:
case V4L2_PIX_FMT_Y16: case V4L2_PIX_FMT_Y16:
case V4L2_PIX_FMT_Y16_BE: case V4L2_PIX_FMT_Y16_BE:
tpg->is_yuv = false; tpg->color_enc = TGP_COLOR_ENC_LUMA;
break; break;
case V4L2_PIX_FMT_YUV444: case V4L2_PIX_FMT_YUV444:
case V4L2_PIX_FMT_YUV555: case V4L2_PIX_FMT_YUV555:
case V4L2_PIX_FMT_YUV565: case V4L2_PIX_FMT_YUV565:
case V4L2_PIX_FMT_YUV32: case V4L2_PIX_FMT_YUV32:
tpg->is_yuv = true; tpg->color_enc = TGP_COLOR_ENC_YCBCR;
break; break;
case V4L2_PIX_FMT_YUV420M: case V4L2_PIX_FMT_YUV420M:
case V4L2_PIX_FMT_YVU420M: case V4L2_PIX_FMT_YVU420M:
@ -256,7 +259,7 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc)
tpg->hdownsampling[1] = 2; tpg->hdownsampling[1] = 2;
tpg->hdownsampling[2] = 2; tpg->hdownsampling[2] = 2;
tpg->planes = 3; tpg->planes = 3;
tpg->is_yuv = true; tpg->color_enc = TGP_COLOR_ENC_YCBCR;
break; break;
case V4L2_PIX_FMT_YUV422M: case V4L2_PIX_FMT_YUV422M:
case V4L2_PIX_FMT_YVU422M: case V4L2_PIX_FMT_YVU422M:
@ -268,7 +271,7 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc)
tpg->hdownsampling[1] = 2; tpg->hdownsampling[1] = 2;
tpg->hdownsampling[2] = 2; tpg->hdownsampling[2] = 2;
tpg->planes = 3; tpg->planes = 3;
tpg->is_yuv = true; tpg->color_enc = TGP_COLOR_ENC_YCBCR;
break; break;
case V4L2_PIX_FMT_NV16M: case V4L2_PIX_FMT_NV16M:
case V4L2_PIX_FMT_NV61M: case V4L2_PIX_FMT_NV61M:
@ -280,7 +283,7 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc)
tpg->hdownsampling[1] = 1; tpg->hdownsampling[1] = 1;
tpg->hmask[1] = ~1; tpg->hmask[1] = ~1;
tpg->planes = 2; tpg->planes = 2;
tpg->is_yuv = true; tpg->color_enc = TGP_COLOR_ENC_YCBCR;
break; break;
case V4L2_PIX_FMT_NV12M: case V4L2_PIX_FMT_NV12M:
case V4L2_PIX_FMT_NV21M: case V4L2_PIX_FMT_NV21M:
@ -292,7 +295,7 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc)
tpg->hdownsampling[1] = 1; tpg->hdownsampling[1] = 1;
tpg->hmask[1] = ~1; tpg->hmask[1] = ~1;
tpg->planes = 2; tpg->planes = 2;
tpg->is_yuv = true; tpg->color_enc = TGP_COLOR_ENC_YCBCR;
break; break;
case V4L2_PIX_FMT_YUV444M: case V4L2_PIX_FMT_YUV444M:
case V4L2_PIX_FMT_YVU444M: case V4L2_PIX_FMT_YVU444M:
@ -302,21 +305,25 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc)
tpg->vdownsampling[2] = 1; tpg->vdownsampling[2] = 1;
tpg->hdownsampling[1] = 1; tpg->hdownsampling[1] = 1;
tpg->hdownsampling[2] = 1; tpg->hdownsampling[2] = 1;
tpg->is_yuv = true; tpg->color_enc = TGP_COLOR_ENC_YCBCR;
break; break;
case V4L2_PIX_FMT_NV24: case V4L2_PIX_FMT_NV24:
case V4L2_PIX_FMT_NV42: case V4L2_PIX_FMT_NV42:
tpg->vdownsampling[1] = 1; tpg->vdownsampling[1] = 1;
tpg->hdownsampling[1] = 1; tpg->hdownsampling[1] = 1;
tpg->planes = 2; tpg->planes = 2;
tpg->is_yuv = true; tpg->color_enc = TGP_COLOR_ENC_YCBCR;
break; break;
case V4L2_PIX_FMT_YUYV: case V4L2_PIX_FMT_YUYV:
case V4L2_PIX_FMT_UYVY: case V4L2_PIX_FMT_UYVY:
case V4L2_PIX_FMT_YVYU: case V4L2_PIX_FMT_YVYU:
case V4L2_PIX_FMT_VYUY: case V4L2_PIX_FMT_VYUY:
tpg->hmask[0] = ~1; tpg->hmask[0] = ~1;
tpg->is_yuv = true; tpg->color_enc = TGP_COLOR_ENC_YCBCR;
break;
case V4L2_PIX_FMT_HSV24:
case V4L2_PIX_FMT_HSV32:
tpg->color_enc = TGP_COLOR_ENC_HSV;
break; break;
default: default:
return false; return false;
@ -351,6 +358,7 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc)
break; break;
case V4L2_PIX_FMT_RGB24: case V4L2_PIX_FMT_RGB24:
case V4L2_PIX_FMT_BGR24: case V4L2_PIX_FMT_BGR24:
case V4L2_PIX_FMT_HSV24:
tpg->twopixelsize[0] = 2 * 3; tpg->twopixelsize[0] = 2 * 3;
break; break;
case V4L2_PIX_FMT_BGR666: case V4L2_PIX_FMT_BGR666:
@ -361,6 +369,7 @@ bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc)
case V4L2_PIX_FMT_ARGB32: case V4L2_PIX_FMT_ARGB32:
case V4L2_PIX_FMT_ABGR32: case V4L2_PIX_FMT_ABGR32:
case V4L2_PIX_FMT_YUV32: case V4L2_PIX_FMT_YUV32:
case V4L2_PIX_FMT_HSV32:
tpg->twopixelsize[0] = 2 * 4; tpg->twopixelsize[0] = 2 * 4;
break; break;
case V4L2_PIX_FMT_NV12: case V4L2_PIX_FMT_NV12:
@ -490,6 +499,71 @@ static inline int linear_to_rec709(int v)
return tpg_linear_to_rec709[v]; return tpg_linear_to_rec709[v];
} }
static void color_to_hsv(struct tpg_data *tpg, int r, int g, int b,
int *h, int *s, int *v)
{
int max_rgb, min_rgb, diff_rgb;
int aux;
int third;
int third_size;
r >>= 4;
g >>= 4;
b >>= 4;
/* Value */
max_rgb = max3(r, g, b);
*v = max_rgb;
if (!max_rgb) {
*h = 0;
*s = 0;
return;
}
/* Saturation */
min_rgb = min3(r, g, b);
diff_rgb = max_rgb - min_rgb;
aux = 255 * diff_rgb;
aux += max_rgb / 2;
aux /= max_rgb;
*s = aux;
if (!aux) {
*h = 0;
return;
}
third_size = (tpg->real_hsv_enc == V4L2_HSV_ENC_180) ? 60 : 85;
/* Hue */
if (max_rgb == r) {
aux = g - b;
third = 0;
} else if (max_rgb == g) {
aux = b - r;
third = third_size;
} else {
aux = r - g;
third = third_size * 2;
}
aux *= third_size / 2;
aux += diff_rgb / 2;
aux /= diff_rgb;
aux += third;
/* Clamp Hue */
if (tpg->real_hsv_enc == V4L2_HSV_ENC_180) {
if (aux < 0)
aux += 180;
else if (aux > 180)
aux -= 180;
} else {
aux = aux & 0xff;
}
*h = aux;
}
static void rgb2ycbcr(const int m[3][3], int r, int g, int b, static void rgb2ycbcr(const int m[3][3], int r, int g, int b,
int y_offset, int *y, int *cb, int *cr) int y_offset, int *y, int *cb, int *cr)
{ {
@ -729,6 +803,8 @@ static void precalculate_color(struct tpg_data *tpg, int k)
int r = tpg_colors[col].r; int r = tpg_colors[col].r;
int g = tpg_colors[col].g; int g = tpg_colors[col].g;
int b = tpg_colors[col].b; int b = tpg_colors[col].b;
int y, cb, cr;
bool ycbcr_valid = false;
if (k == TPG_COLOR_TEXTBG) { if (k == TPG_COLOR_TEXTBG) {
col = tpg_get_textbg_color(tpg); col = tpg_get_textbg_color(tpg);
@ -759,9 +835,9 @@ static void precalculate_color(struct tpg_data *tpg, int k)
g <<= 4; g <<= 4;
b <<= 4; b <<= 4;
} }
if (tpg->qual == TPG_QUAL_GRAY || tpg->fourcc == V4L2_PIX_FMT_GREY ||
tpg->fourcc == V4L2_PIX_FMT_Y16 || if (tpg->qual == TPG_QUAL_GRAY ||
tpg->fourcc == V4L2_PIX_FMT_Y16_BE) { tpg->color_enc == TGP_COLOR_ENC_LUMA) {
/* Rec. 709 Luma function */ /* Rec. 709 Luma function */
/* (0.2126, 0.7152, 0.0722) * (255 * 256) */ /* (0.2126, 0.7152, 0.0722) * (255 * 256) */
r = g = b = (13879 * r + 46688 * g + 4713 * b) >> 16; r = g = b = (13879 * r + 46688 * g + 4713 * b) >> 16;
@ -775,7 +851,8 @@ static void precalculate_color(struct tpg_data *tpg, int k)
* Remember that r, g and b are still in the 0 - 0xff0 range. * Remember that r, g and b are still in the 0 - 0xff0 range.
*/ */
if (tpg->real_rgb_range == V4L2_DV_RGB_RANGE_LIMITED && if (tpg->real_rgb_range == V4L2_DV_RGB_RANGE_LIMITED &&
tpg->rgb_range == V4L2_DV_RGB_RANGE_FULL && !tpg->is_yuv) { tpg->rgb_range == V4L2_DV_RGB_RANGE_FULL &&
tpg->color_enc == TGP_COLOR_ENC_RGB) {
/* /*
* Convert from full range (which is what r, g and b are) * Convert from full range (which is what r, g and b are)
* to limited range (which is the 'real' RGB range), which * to limited range (which is the 'real' RGB range), which
@ -785,7 +862,9 @@ static void precalculate_color(struct tpg_data *tpg, int k)
g = (g * 219) / 255 + (16 << 4); g = (g * 219) / 255 + (16 << 4);
b = (b * 219) / 255 + (16 << 4); b = (b * 219) / 255 + (16 << 4);
} else if (tpg->real_rgb_range != V4L2_DV_RGB_RANGE_LIMITED && } else if (tpg->real_rgb_range != V4L2_DV_RGB_RANGE_LIMITED &&
tpg->rgb_range == V4L2_DV_RGB_RANGE_LIMITED && !tpg->is_yuv) { tpg->rgb_range == V4L2_DV_RGB_RANGE_LIMITED &&
tpg->color_enc == TGP_COLOR_ENC_RGB) {
/* /*
* Clamp r, g and b to the limited range and convert to full * Clamp r, g and b to the limited range and convert to full
* range since that's what we deliver. * range since that's what we deliver.
@ -798,10 +877,10 @@ static void precalculate_color(struct tpg_data *tpg, int k)
b = (b - (16 << 4)) * 255 / 219; b = (b - (16 << 4)) * 255 / 219;
} }
if (tpg->brightness != 128 || tpg->contrast != 128 || if ((tpg->brightness != 128 || tpg->contrast != 128 ||
tpg->saturation != 128 || tpg->hue) { tpg->saturation != 128 || tpg->hue) &&
tpg->color_enc != TGP_COLOR_ENC_LUMA) {
/* Implement these operations */ /* Implement these operations */
int y, cb, cr;
int tmp_cb, tmp_cr; int tmp_cb, tmp_cr;
/* First convert to YCbCr */ /* First convert to YCbCr */
@ -818,29 +897,45 @@ static void precalculate_color(struct tpg_data *tpg, int k)
cb = (128 << 4) + (tmp_cb * tpg->contrast * tpg->saturation) / (128 * 128); cb = (128 << 4) + (tmp_cb * tpg->contrast * tpg->saturation) / (128 * 128);
cr = (128 << 4) + (tmp_cr * tpg->contrast * tpg->saturation) / (128 * 128); cr = (128 << 4) + (tmp_cr * tpg->contrast * tpg->saturation) / (128 * 128);
if (tpg->is_yuv) { if (tpg->color_enc == TGP_COLOR_ENC_YCBCR)
tpg->colors[k][0] = clamp(y >> 4, 1, 254); ycbcr_valid = true;
tpg->colors[k][1] = clamp(cb >> 4, 1, 254); else
tpg->colors[k][2] = clamp(cr >> 4, 1, 254); ycbcr_to_color(tpg, y, cb, cr, &r, &g, &b);
return; } else if ((tpg->brightness != 128 || tpg->contrast != 128) &&
} tpg->color_enc == TGP_COLOR_ENC_LUMA) {
ycbcr_to_color(tpg, y, cb, cr, &r, &g, &b); r = (16 << 4) + ((r - (16 << 4)) * tpg->contrast) / 128;
r += (tpg->brightness << 4) - (128 << 4);
} }
if (tpg->is_yuv) { switch (tpg->color_enc) {
case TGP_COLOR_ENC_HSV:
{
int h, s, v;
color_to_hsv(tpg, r, g, b, &h, &s, &v);
tpg->colors[k][0] = h;
tpg->colors[k][1] = s;
tpg->colors[k][2] = v;
break;
}
case TGP_COLOR_ENC_YCBCR:
{
/* Convert to YCbCr */ /* Convert to YCbCr */
int y, cb, cr; if (!ycbcr_valid)
color_to_ycbcr(tpg, r, g, b, &y, &cb, &cr);
color_to_ycbcr(tpg, r, g, b, &y, &cb, &cr);
y >>= 4;
cb >>= 4;
cr >>= 4;
if (tpg->real_quantization == V4L2_QUANTIZATION_LIM_RANGE) { if (tpg->real_quantization == V4L2_QUANTIZATION_LIM_RANGE) {
y = clamp(y, 16 << 4, 235 << 4); y = clamp(y, 16, 235);
cb = clamp(cb, 16 << 4, 240 << 4); cb = clamp(cb, 16, 240);
cr = clamp(cr, 16 << 4, 240 << 4); cr = clamp(cr, 16, 240);
} else {
y = clamp(y, 1, 254);
cb = clamp(cb, 1, 254);
cr = clamp(cr, 1, 254);
} }
y = clamp(y >> 4, 1, 254);
cb = clamp(cb >> 4, 1, 254);
cr = clamp(cr >> 4, 1, 254);
switch (tpg->fourcc) { switch (tpg->fourcc) {
case V4L2_PIX_FMT_YUV444: case V4L2_PIX_FMT_YUV444:
y >>= 4; y >>= 4;
@ -861,7 +956,15 @@ static void precalculate_color(struct tpg_data *tpg, int k)
tpg->colors[k][0] = y; tpg->colors[k][0] = y;
tpg->colors[k][1] = cb; tpg->colors[k][1] = cb;
tpg->colors[k][2] = cr; tpg->colors[k][2] = cr;
} else { break;
}
case TGP_COLOR_ENC_LUMA:
{
tpg->colors[k][0] = r >> 4;
break;
}
case TGP_COLOR_ENC_RGB:
{
if (tpg->real_quantization == V4L2_QUANTIZATION_LIM_RANGE) { if (tpg->real_quantization == V4L2_QUANTIZATION_LIM_RANGE) {
r = (r * 219) / 255 + (16 << 4); r = (r * 219) / 255 + (16 << 4);
g = (g * 219) / 255 + (16 << 4); g = (g * 219) / 255 + (16 << 4);
@ -911,6 +1014,8 @@ static void precalculate_color(struct tpg_data *tpg, int k)
tpg->colors[k][0] = r; tpg->colors[k][0] = r;
tpg->colors[k][1] = g; tpg->colors[k][1] = g;
tpg->colors[k][2] = b; tpg->colors[k][2] = b;
break;
}
} }
} }
@ -928,7 +1033,7 @@ static void gen_twopix(struct tpg_data *tpg,
{ {
unsigned offset = odd * tpg->twopixelsize[0] / 2; unsigned offset = odd * tpg->twopixelsize[0] / 2;
u8 alpha = tpg->alpha_component; u8 alpha = tpg->alpha_component;
u8 r_y, g_u, b_v; u8 r_y_h, g_u_s, b_v;
if (tpg->alpha_red_only && color != TPG_COLOR_CSC_RED && if (tpg->alpha_red_only && color != TPG_COLOR_CSC_RED &&
color != TPG_COLOR_100_RED && color != TPG_COLOR_100_RED &&
@ -936,161 +1041,161 @@ static void gen_twopix(struct tpg_data *tpg,
alpha = 0; alpha = 0;
if (color == TPG_COLOR_RANDOM) if (color == TPG_COLOR_RANDOM)
precalculate_color(tpg, color); precalculate_color(tpg, color);
r_y = tpg->colors[color][0]; /* R or precalculated Y */ r_y_h = tpg->colors[color][0]; /* R or precalculated Y, H */
g_u = tpg->colors[color][1]; /* G or precalculated U */ g_u_s = tpg->colors[color][1]; /* G or precalculated U, V */
b_v = tpg->colors[color][2]; /* B or precalculated V */ b_v = tpg->colors[color][2]; /* B or precalculated V */
switch (tpg->fourcc) { switch (tpg->fourcc) {
case V4L2_PIX_FMT_GREY: case V4L2_PIX_FMT_GREY:
buf[0][offset] = r_y; buf[0][offset] = r_y_h;
break; break;
case V4L2_PIX_FMT_Y16: case V4L2_PIX_FMT_Y16:
/* /*
* Ideally both bytes should be set to r_y, but then you won't * Ideally both bytes should be set to r_y_h, but then you won't
* be able to detect endian problems. So keep it 0 except for * be able to detect endian problems. So keep it 0 except for
* the corner case where r_y is 0xff so white really will be * the corner case where r_y_h is 0xff so white really will be
* white (0xffff). * white (0xffff).
*/ */
buf[0][offset] = r_y == 0xff ? r_y : 0; buf[0][offset] = r_y_h == 0xff ? r_y_h : 0;
buf[0][offset+1] = r_y; buf[0][offset+1] = r_y_h;
break; break;
case V4L2_PIX_FMT_Y16_BE: case V4L2_PIX_FMT_Y16_BE:
/* See comment for V4L2_PIX_FMT_Y16 above */ /* See comment for V4L2_PIX_FMT_Y16 above */
buf[0][offset] = r_y; buf[0][offset] = r_y_h;
buf[0][offset+1] = r_y == 0xff ? r_y : 0; buf[0][offset+1] = r_y_h == 0xff ? r_y_h : 0;
break; break;
case V4L2_PIX_FMT_YUV422M: case V4L2_PIX_FMT_YUV422M:
case V4L2_PIX_FMT_YUV422P: case V4L2_PIX_FMT_YUV422P:
case V4L2_PIX_FMT_YUV420: case V4L2_PIX_FMT_YUV420:
case V4L2_PIX_FMT_YUV420M: case V4L2_PIX_FMT_YUV420M:
buf[0][offset] = r_y; buf[0][offset] = r_y_h;
if (odd) { if (odd) {
buf[1][0] = (buf[1][0] + g_u) / 2; buf[1][0] = (buf[1][0] + g_u_s) / 2;
buf[2][0] = (buf[2][0] + b_v) / 2; buf[2][0] = (buf[2][0] + b_v) / 2;
buf[1][1] = buf[1][0]; buf[1][1] = buf[1][0];
buf[2][1] = buf[2][0]; buf[2][1] = buf[2][0];
break; break;
} }
buf[1][0] = g_u; buf[1][0] = g_u_s;
buf[2][0] = b_v; buf[2][0] = b_v;
break; break;
case V4L2_PIX_FMT_YVU422M: case V4L2_PIX_FMT_YVU422M:
case V4L2_PIX_FMT_YVU420: case V4L2_PIX_FMT_YVU420:
case V4L2_PIX_FMT_YVU420M: case V4L2_PIX_FMT_YVU420M:
buf[0][offset] = r_y; buf[0][offset] = r_y_h;
if (odd) { if (odd) {
buf[1][0] = (buf[1][0] + b_v) / 2; buf[1][0] = (buf[1][0] + b_v) / 2;
buf[2][0] = (buf[2][0] + g_u) / 2; buf[2][0] = (buf[2][0] + g_u_s) / 2;
buf[1][1] = buf[1][0]; buf[1][1] = buf[1][0];
buf[2][1] = buf[2][0]; buf[2][1] = buf[2][0];
break; break;
} }
buf[1][0] = b_v; buf[1][0] = b_v;
buf[2][0] = g_u; buf[2][0] = g_u_s;
break; break;
case V4L2_PIX_FMT_NV12: case V4L2_PIX_FMT_NV12:
case V4L2_PIX_FMT_NV12M: case V4L2_PIX_FMT_NV12M:
case V4L2_PIX_FMT_NV16: case V4L2_PIX_FMT_NV16:
case V4L2_PIX_FMT_NV16M: case V4L2_PIX_FMT_NV16M:
buf[0][offset] = r_y; buf[0][offset] = r_y_h;
if (odd) { if (odd) {
buf[1][0] = (buf[1][0] + g_u) / 2; buf[1][0] = (buf[1][0] + g_u_s) / 2;
buf[1][1] = (buf[1][1] + b_v) / 2; buf[1][1] = (buf[1][1] + b_v) / 2;
break; break;
} }
buf[1][0] = g_u; buf[1][0] = g_u_s;
buf[1][1] = b_v; buf[1][1] = b_v;
break; break;
case V4L2_PIX_FMT_NV21: case V4L2_PIX_FMT_NV21:
case V4L2_PIX_FMT_NV21M: case V4L2_PIX_FMT_NV21M:
case V4L2_PIX_FMT_NV61: case V4L2_PIX_FMT_NV61:
case V4L2_PIX_FMT_NV61M: case V4L2_PIX_FMT_NV61M:
buf[0][offset] = r_y; buf[0][offset] = r_y_h;
if (odd) { if (odd) {
buf[1][0] = (buf[1][0] + b_v) / 2; buf[1][0] = (buf[1][0] + b_v) / 2;
buf[1][1] = (buf[1][1] + g_u) / 2; buf[1][1] = (buf[1][1] + g_u_s) / 2;
break; break;
} }
buf[1][0] = b_v; buf[1][0] = b_v;
buf[1][1] = g_u; buf[1][1] = g_u_s;
break; break;
case V4L2_PIX_FMT_YUV444M: case V4L2_PIX_FMT_YUV444M:
buf[0][offset] = r_y; buf[0][offset] = r_y_h;
buf[1][offset] = g_u; buf[1][offset] = g_u_s;
buf[2][offset] = b_v; buf[2][offset] = b_v;
break; break;
case V4L2_PIX_FMT_YVU444M: case V4L2_PIX_FMT_YVU444M:
buf[0][offset] = r_y; buf[0][offset] = r_y_h;
buf[1][offset] = b_v; buf[1][offset] = b_v;
buf[2][offset] = g_u; buf[2][offset] = g_u_s;
break; break;
case V4L2_PIX_FMT_NV24: case V4L2_PIX_FMT_NV24:
buf[0][offset] = r_y; buf[0][offset] = r_y_h;
buf[1][2 * offset] = g_u; buf[1][2 * offset] = g_u_s;
buf[1][2 * offset + 1] = b_v; buf[1][2 * offset + 1] = b_v;
break; break;
case V4L2_PIX_FMT_NV42: case V4L2_PIX_FMT_NV42:
buf[0][offset] = r_y; buf[0][offset] = r_y_h;
buf[1][2 * offset] = b_v; buf[1][2 * offset] = b_v;
buf[1][2 * offset + 1] = g_u; buf[1][2 * offset + 1] = g_u_s;
break; break;
case V4L2_PIX_FMT_YUYV: case V4L2_PIX_FMT_YUYV:
buf[0][offset] = r_y; buf[0][offset] = r_y_h;
if (odd) { if (odd) {
buf[0][1] = (buf[0][1] + g_u) / 2; buf[0][1] = (buf[0][1] + g_u_s) / 2;
buf[0][3] = (buf[0][3] + b_v) / 2; buf[0][3] = (buf[0][3] + b_v) / 2;
break; break;
} }
buf[0][1] = g_u; buf[0][1] = g_u_s;
buf[0][3] = b_v; buf[0][3] = b_v;
break; break;
case V4L2_PIX_FMT_UYVY: case V4L2_PIX_FMT_UYVY:
buf[0][offset + 1] = r_y; buf[0][offset + 1] = r_y_h;
if (odd) { if (odd) {
buf[0][0] = (buf[0][0] + g_u) / 2; buf[0][0] = (buf[0][0] + g_u_s) / 2;
buf[0][2] = (buf[0][2] + b_v) / 2; buf[0][2] = (buf[0][2] + b_v) / 2;
break; break;
} }
buf[0][0] = g_u; buf[0][0] = g_u_s;
buf[0][2] = b_v; buf[0][2] = b_v;
break; break;
case V4L2_PIX_FMT_YVYU: case V4L2_PIX_FMT_YVYU:
buf[0][offset] = r_y; buf[0][offset] = r_y_h;
if (odd) { if (odd) {
buf[0][1] = (buf[0][1] + b_v) / 2; buf[0][1] = (buf[0][1] + b_v) / 2;
buf[0][3] = (buf[0][3] + g_u) / 2; buf[0][3] = (buf[0][3] + g_u_s) / 2;
break; break;
} }
buf[0][1] = b_v; buf[0][1] = b_v;
buf[0][3] = g_u; buf[0][3] = g_u_s;
break; break;
case V4L2_PIX_FMT_VYUY: case V4L2_PIX_FMT_VYUY:
buf[0][offset + 1] = r_y; buf[0][offset + 1] = r_y_h;
if (odd) { if (odd) {
buf[0][0] = (buf[0][0] + b_v) / 2; buf[0][0] = (buf[0][0] + b_v) / 2;
buf[0][2] = (buf[0][2] + g_u) / 2; buf[0][2] = (buf[0][2] + g_u_s) / 2;
break; break;
} }
buf[0][0] = b_v; buf[0][0] = b_v;
buf[0][2] = g_u; buf[0][2] = g_u_s;
break; break;
case V4L2_PIX_FMT_RGB332: case V4L2_PIX_FMT_RGB332:
buf[0][offset] = (r_y << 5) | (g_u << 2) | b_v; buf[0][offset] = (r_y_h << 5) | (g_u_s << 2) | b_v;
break; break;
case V4L2_PIX_FMT_YUV565: case V4L2_PIX_FMT_YUV565:
case V4L2_PIX_FMT_RGB565: case V4L2_PIX_FMT_RGB565:
buf[0][offset] = (g_u << 5) | b_v; buf[0][offset] = (g_u_s << 5) | b_v;
buf[0][offset + 1] = (r_y << 3) | (g_u >> 3); buf[0][offset + 1] = (r_y_h << 3) | (g_u_s >> 3);
break; break;
case V4L2_PIX_FMT_RGB565X: case V4L2_PIX_FMT_RGB565X:
buf[0][offset] = (r_y << 3) | (g_u >> 3); buf[0][offset] = (r_y_h << 3) | (g_u_s >> 3);
buf[0][offset + 1] = (g_u << 5) | b_v; buf[0][offset + 1] = (g_u_s << 5) | b_v;
break; break;
case V4L2_PIX_FMT_RGB444: case V4L2_PIX_FMT_RGB444:
case V4L2_PIX_FMT_XRGB444: case V4L2_PIX_FMT_XRGB444:
@ -1098,8 +1203,8 @@ static void gen_twopix(struct tpg_data *tpg,
/* fall through */ /* fall through */
case V4L2_PIX_FMT_YUV444: case V4L2_PIX_FMT_YUV444:
case V4L2_PIX_FMT_ARGB444: case V4L2_PIX_FMT_ARGB444:
buf[0][offset] = (g_u << 4) | b_v; buf[0][offset] = (g_u_s << 4) | b_v;
buf[0][offset + 1] = (alpha & 0xf0) | r_y; buf[0][offset + 1] = (alpha & 0xf0) | r_y_h;
break; break;
case V4L2_PIX_FMT_RGB555: case V4L2_PIX_FMT_RGB555:
case V4L2_PIX_FMT_XRGB555: case V4L2_PIX_FMT_XRGB555:
@ -1107,42 +1212,45 @@ static void gen_twopix(struct tpg_data *tpg,
/* fall through */ /* fall through */
case V4L2_PIX_FMT_YUV555: case V4L2_PIX_FMT_YUV555:
case V4L2_PIX_FMT_ARGB555: case V4L2_PIX_FMT_ARGB555:
buf[0][offset] = (g_u << 5) | b_v; buf[0][offset] = (g_u_s << 5) | b_v;
buf[0][offset + 1] = (alpha & 0x80) | (r_y << 2) | (g_u >> 3); buf[0][offset + 1] = (alpha & 0x80) | (r_y_h << 2)
| (g_u_s >> 3);
break; break;
case V4L2_PIX_FMT_RGB555X: case V4L2_PIX_FMT_RGB555X:
case V4L2_PIX_FMT_XRGB555X: case V4L2_PIX_FMT_XRGB555X:
alpha = 0; alpha = 0;
/* fall through */ /* fall through */
case V4L2_PIX_FMT_ARGB555X: case V4L2_PIX_FMT_ARGB555X:
buf[0][offset] = (alpha & 0x80) | (r_y << 2) | (g_u >> 3); buf[0][offset] = (alpha & 0x80) | (r_y_h << 2) | (g_u_s >> 3);
buf[0][offset + 1] = (g_u << 5) | b_v; buf[0][offset + 1] = (g_u_s << 5) | b_v;
break; break;
case V4L2_PIX_FMT_RGB24: case V4L2_PIX_FMT_RGB24:
buf[0][offset] = r_y; case V4L2_PIX_FMT_HSV24:
buf[0][offset + 1] = g_u; buf[0][offset] = r_y_h;
buf[0][offset + 1] = g_u_s;
buf[0][offset + 2] = b_v; buf[0][offset + 2] = b_v;
break; break;
case V4L2_PIX_FMT_BGR24: case V4L2_PIX_FMT_BGR24:
buf[0][offset] = b_v; buf[0][offset] = b_v;
buf[0][offset + 1] = g_u; buf[0][offset + 1] = g_u_s;
buf[0][offset + 2] = r_y; buf[0][offset + 2] = r_y_h;
break; break;
case V4L2_PIX_FMT_BGR666: case V4L2_PIX_FMT_BGR666:
buf[0][offset] = (b_v << 2) | (g_u >> 4); buf[0][offset] = (b_v << 2) | (g_u_s >> 4);
buf[0][offset + 1] = (g_u << 4) | (r_y >> 2); buf[0][offset + 1] = (g_u_s << 4) | (r_y_h >> 2);
buf[0][offset + 2] = r_y << 6; buf[0][offset + 2] = r_y_h << 6;
buf[0][offset + 3] = 0; buf[0][offset + 3] = 0;
break; break;
case V4L2_PIX_FMT_RGB32: case V4L2_PIX_FMT_RGB32:
case V4L2_PIX_FMT_XRGB32: case V4L2_PIX_FMT_XRGB32:
case V4L2_PIX_FMT_HSV32:
alpha = 0; alpha = 0;
/* fall through */ /* fall through */
case V4L2_PIX_FMT_YUV32: case V4L2_PIX_FMT_YUV32:
case V4L2_PIX_FMT_ARGB32: case V4L2_PIX_FMT_ARGB32:
buf[0][offset] = alpha; buf[0][offset] = alpha;
buf[0][offset + 1] = r_y; buf[0][offset + 1] = r_y_h;
buf[0][offset + 2] = g_u; buf[0][offset + 2] = g_u_s;
buf[0][offset + 3] = b_v; buf[0][offset + 3] = b_v;
break; break;
case V4L2_PIX_FMT_BGR32: case V4L2_PIX_FMT_BGR32:
@ -1151,87 +1259,87 @@ static void gen_twopix(struct tpg_data *tpg,
/* fall through */ /* fall through */
case V4L2_PIX_FMT_ABGR32: case V4L2_PIX_FMT_ABGR32:
buf[0][offset] = b_v; buf[0][offset] = b_v;
buf[0][offset + 1] = g_u; buf[0][offset + 1] = g_u_s;
buf[0][offset + 2] = r_y; buf[0][offset + 2] = r_y_h;
buf[0][offset + 3] = alpha; buf[0][offset + 3] = alpha;
break; break;
case V4L2_PIX_FMT_SBGGR8: case V4L2_PIX_FMT_SBGGR8:
buf[0][offset] = odd ? g_u : b_v; buf[0][offset] = odd ? g_u_s : b_v;
buf[1][offset] = odd ? r_y : g_u; buf[1][offset] = odd ? r_y_h : g_u_s;
break; break;
case V4L2_PIX_FMT_SGBRG8: case V4L2_PIX_FMT_SGBRG8:
buf[0][offset] = odd ? b_v : g_u; buf[0][offset] = odd ? b_v : g_u_s;
buf[1][offset] = odd ? g_u : r_y; buf[1][offset] = odd ? g_u_s : r_y_h;
break; break;
case V4L2_PIX_FMT_SGRBG8: case V4L2_PIX_FMT_SGRBG8:
buf[0][offset] = odd ? r_y : g_u; buf[0][offset] = odd ? r_y_h : g_u_s;
buf[1][offset] = odd ? g_u : b_v; buf[1][offset] = odd ? g_u_s : b_v;
break; break;
case V4L2_PIX_FMT_SRGGB8: case V4L2_PIX_FMT_SRGGB8:
buf[0][offset] = odd ? g_u : r_y; buf[0][offset] = odd ? g_u_s : r_y_h;
buf[1][offset] = odd ? b_v : g_u; buf[1][offset] = odd ? b_v : g_u_s;
break; break;
case V4L2_PIX_FMT_SBGGR10: case V4L2_PIX_FMT_SBGGR10:
buf[0][offset] = odd ? g_u << 2 : b_v << 2; buf[0][offset] = odd ? g_u_s << 2 : b_v << 2;
buf[0][offset + 1] = odd ? g_u >> 6 : b_v >> 6; buf[0][offset + 1] = odd ? g_u_s >> 6 : b_v >> 6;
buf[1][offset] = odd ? r_y << 2 : g_u << 2; buf[1][offset] = odd ? r_y_h << 2 : g_u_s << 2;
buf[1][offset + 1] = odd ? r_y >> 6 : g_u >> 6; buf[1][offset + 1] = odd ? r_y_h >> 6 : g_u_s >> 6;
buf[0][offset] |= (buf[0][offset] >> 2) & 3; buf[0][offset] |= (buf[0][offset] >> 2) & 3;
buf[1][offset] |= (buf[1][offset] >> 2) & 3; buf[1][offset] |= (buf[1][offset] >> 2) & 3;
break; break;
case V4L2_PIX_FMT_SGBRG10: case V4L2_PIX_FMT_SGBRG10:
buf[0][offset] = odd ? b_v << 2 : g_u << 2; buf[0][offset] = odd ? b_v << 2 : g_u_s << 2;
buf[0][offset + 1] = odd ? b_v >> 6 : g_u >> 6; buf[0][offset + 1] = odd ? b_v >> 6 : g_u_s >> 6;
buf[1][offset] = odd ? g_u << 2 : r_y << 2; buf[1][offset] = odd ? g_u_s << 2 : r_y_h << 2;
buf[1][offset + 1] = odd ? g_u >> 6 : r_y >> 6; buf[1][offset + 1] = odd ? g_u_s >> 6 : r_y_h >> 6;
buf[0][offset] |= (buf[0][offset] >> 2) & 3; buf[0][offset] |= (buf[0][offset] >> 2) & 3;
buf[1][offset] |= (buf[1][offset] >> 2) & 3; buf[1][offset] |= (buf[1][offset] >> 2) & 3;
break; break;
case V4L2_PIX_FMT_SGRBG10: case V4L2_PIX_FMT_SGRBG10:
buf[0][offset] = odd ? r_y << 2 : g_u << 2; buf[0][offset] = odd ? r_y_h << 2 : g_u_s << 2;
buf[0][offset + 1] = odd ? r_y >> 6 : g_u >> 6; buf[0][offset + 1] = odd ? r_y_h >> 6 : g_u_s >> 6;
buf[1][offset] = odd ? g_u << 2 : b_v << 2; buf[1][offset] = odd ? g_u_s << 2 : b_v << 2;
buf[1][offset + 1] = odd ? g_u >> 6 : b_v >> 6; buf[1][offset + 1] = odd ? g_u_s >> 6 : b_v >> 6;
buf[0][offset] |= (buf[0][offset] >> 2) & 3; buf[0][offset] |= (buf[0][offset] >> 2) & 3;
buf[1][offset] |= (buf[1][offset] >> 2) & 3; buf[1][offset] |= (buf[1][offset] >> 2) & 3;
break; break;
case V4L2_PIX_FMT_SRGGB10: case V4L2_PIX_FMT_SRGGB10:
buf[0][offset] = odd ? g_u << 2 : r_y << 2; buf[0][offset] = odd ? g_u_s << 2 : r_y_h << 2;
buf[0][offset + 1] = odd ? g_u >> 6 : r_y >> 6; buf[0][offset + 1] = odd ? g_u_s >> 6 : r_y_h >> 6;
buf[1][offset] = odd ? b_v << 2 : g_u << 2; buf[1][offset] = odd ? b_v << 2 : g_u_s << 2;
buf[1][offset + 1] = odd ? b_v >> 6 : g_u >> 6; buf[1][offset + 1] = odd ? b_v >> 6 : g_u_s >> 6;
buf[0][offset] |= (buf[0][offset] >> 2) & 3; buf[0][offset] |= (buf[0][offset] >> 2) & 3;
buf[1][offset] |= (buf[1][offset] >> 2) & 3; buf[1][offset] |= (buf[1][offset] >> 2) & 3;
break; break;
case V4L2_PIX_FMT_SBGGR12: case V4L2_PIX_FMT_SBGGR12:
buf[0][offset] = odd ? g_u << 4 : b_v << 4; buf[0][offset] = odd ? g_u_s << 4 : b_v << 4;
buf[0][offset + 1] = odd ? g_u >> 4 : b_v >> 4; buf[0][offset + 1] = odd ? g_u_s >> 4 : b_v >> 4;
buf[1][offset] = odd ? r_y << 4 : g_u << 4; buf[1][offset] = odd ? r_y_h << 4 : g_u_s << 4;
buf[1][offset + 1] = odd ? r_y >> 4 : g_u >> 4; buf[1][offset + 1] = odd ? r_y_h >> 4 : g_u_s >> 4;
buf[0][offset] |= (buf[0][offset] >> 4) & 0xf; buf[0][offset] |= (buf[0][offset] >> 4) & 0xf;
buf[1][offset] |= (buf[1][offset] >> 4) & 0xf; buf[1][offset] |= (buf[1][offset] >> 4) & 0xf;
break; break;
case V4L2_PIX_FMT_SGBRG12: case V4L2_PIX_FMT_SGBRG12:
buf[0][offset] = odd ? b_v << 4 : g_u << 4; buf[0][offset] = odd ? b_v << 4 : g_u_s << 4;
buf[0][offset + 1] = odd ? b_v >> 4 : g_u >> 4; buf[0][offset + 1] = odd ? b_v >> 4 : g_u_s >> 4;
buf[1][offset] = odd ? g_u << 4 : r_y << 4; buf[1][offset] = odd ? g_u_s << 4 : r_y_h << 4;
buf[1][offset + 1] = odd ? g_u >> 4 : r_y >> 4; buf[1][offset + 1] = odd ? g_u_s >> 4 : r_y_h >> 4;
buf[0][offset] |= (buf[0][offset] >> 4) & 0xf; buf[0][offset] |= (buf[0][offset] >> 4) & 0xf;
buf[1][offset] |= (buf[1][offset] >> 4) & 0xf; buf[1][offset] |= (buf[1][offset] >> 4) & 0xf;
break; break;
case V4L2_PIX_FMT_SGRBG12: case V4L2_PIX_FMT_SGRBG12:
buf[0][offset] = odd ? r_y << 4 : g_u << 4; buf[0][offset] = odd ? r_y_h << 4 : g_u_s << 4;
buf[0][offset + 1] = odd ? r_y >> 4 : g_u >> 4; buf[0][offset + 1] = odd ? r_y_h >> 4 : g_u_s >> 4;
buf[1][offset] = odd ? g_u << 4 : b_v << 4; buf[1][offset] = odd ? g_u_s << 4 : b_v << 4;
buf[1][offset + 1] = odd ? g_u >> 4 : b_v >> 4; buf[1][offset + 1] = odd ? g_u_s >> 4 : b_v >> 4;
buf[0][offset] |= (buf[0][offset] >> 4) & 0xf; buf[0][offset] |= (buf[0][offset] >> 4) & 0xf;
buf[1][offset] |= (buf[1][offset] >> 4) & 0xf; buf[1][offset] |= (buf[1][offset] >> 4) & 0xf;
break; break;
case V4L2_PIX_FMT_SRGGB12: case V4L2_PIX_FMT_SRGGB12:
buf[0][offset] = odd ? g_u << 4 : r_y << 4; buf[0][offset] = odd ? g_u_s << 4 : r_y_h << 4;
buf[0][offset + 1] = odd ? g_u >> 4 : r_y >> 4; buf[0][offset + 1] = odd ? g_u_s >> 4 : r_y_h >> 4;
buf[1][offset] = odd ? b_v << 4 : g_u << 4; buf[1][offset] = odd ? b_v << 4 : g_u_s << 4;
buf[1][offset + 1] = odd ? b_v >> 4 : g_u >> 4; buf[1][offset + 1] = odd ? b_v >> 4 : g_u_s >> 4;
buf[0][offset] |= (buf[0][offset] >> 4) & 0xf; buf[0][offset] |= (buf[0][offset] >> 4) & 0xf;
buf[1][offset] |= (buf[1][offset] >> 4) & 0xf; buf[1][offset] |= (buf[1][offset] >> 4) & 0xf;
break; break;
@ -1828,6 +1936,7 @@ static void tpg_recalc(struct tpg_data *tpg)
tpg->recalc_lines = true; tpg->recalc_lines = true;
tpg->real_xfer_func = tpg->xfer_func; tpg->real_xfer_func = tpg->xfer_func;
tpg->real_ycbcr_enc = tpg->ycbcr_enc; tpg->real_ycbcr_enc = tpg->ycbcr_enc;
tpg->real_hsv_enc = tpg->hsv_enc;
tpg->real_quantization = tpg->quantization; tpg->real_quantization = tpg->quantization;
if (tpg->xfer_func == V4L2_XFER_FUNC_DEFAULT) if (tpg->xfer_func == V4L2_XFER_FUNC_DEFAULT)
@ -1840,7 +1949,8 @@ static void tpg_recalc(struct tpg_data *tpg)
if (tpg->quantization == V4L2_QUANTIZATION_DEFAULT) if (tpg->quantization == V4L2_QUANTIZATION_DEFAULT)
tpg->real_quantization = tpg->real_quantization =
V4L2_MAP_QUANTIZATION_DEFAULT(!tpg->is_yuv, V4L2_MAP_QUANTIZATION_DEFAULT(
tpg->color_enc != TGP_COLOR_ENC_YCBCR,
tpg->colorspace, tpg->real_ycbcr_enc); tpg->colorspace, tpg->real_ycbcr_enc);
tpg_precalculate_colors(tpg); tpg_precalculate_colors(tpg);
@ -1887,11 +1997,28 @@ static int tpg_pattern_avg(const struct tpg_data *tpg,
return -1; return -1;
} }
static const char *tpg_color_enc_str(enum tgp_color_enc
color_enc)
{
switch (color_enc) {
case TGP_COLOR_ENC_HSV:
return "HSV";
case TGP_COLOR_ENC_YCBCR:
return "Y'CbCr";
case TGP_COLOR_ENC_LUMA:
return "Luma";
case TGP_COLOR_ENC_RGB:
default:
return "R'G'B";
}
}
void tpg_log_status(struct tpg_data *tpg) void tpg_log_status(struct tpg_data *tpg)
{ {
pr_info("tpg source WxH: %ux%u (%s)\n", pr_info("tpg source WxH: %ux%u (%s)\n",
tpg->src_width, tpg->src_height, tpg->src_width, tpg->src_height,
tpg->is_yuv ? "YCbCr" : "RGB"); tpg_color_enc_str(tpg->color_enc));
pr_info("tpg field: %u\n", tpg->field); pr_info("tpg field: %u\n", tpg->field);
pr_info("tpg crop: %ux%u@%dx%d\n", tpg->crop.width, tpg->crop.height, pr_info("tpg crop: %ux%u@%dx%d\n", tpg->crop.width, tpg->crop.height,
tpg->crop.left, tpg->crop.top); tpg->crop.left, tpg->crop.top);
@ -1900,6 +2027,7 @@ void tpg_log_status(struct tpg_data *tpg)
pr_info("tpg colorspace: %d\n", tpg->colorspace); pr_info("tpg colorspace: %d\n", tpg->colorspace);
pr_info("tpg transfer function: %d/%d\n", tpg->xfer_func, tpg->real_xfer_func); pr_info("tpg transfer function: %d/%d\n", tpg->xfer_func, tpg->real_xfer_func);
pr_info("tpg Y'CbCr encoding: %d/%d\n", tpg->ycbcr_enc, tpg->real_ycbcr_enc); pr_info("tpg Y'CbCr encoding: %d/%d\n", tpg->ycbcr_enc, tpg->real_ycbcr_enc);
pr_info("tpg HSV encoding: %d/%d\n", tpg->hsv_enc, tpg->real_hsv_enc);
pr_info("tpg quantization: %d/%d\n", tpg->quantization, tpg->real_quantization); pr_info("tpg quantization: %d/%d\n", tpg->quantization, tpg->real_quantization);
pr_info("tpg RGB range: %d/%d\n", tpg->rgb_range, tpg->real_rgb_range); pr_info("tpg RGB range: %d/%d\n", tpg->rgb_range, tpg->real_rgb_range);
} }

View File

@ -5,7 +5,7 @@
config DVB_MAX_ADAPTERS config DVB_MAX_ADAPTERS
int "maximum number of DVB/ATSC adapters" int "maximum number of DVB/ATSC adapters"
depends on DVB_CORE depends on DVB_CORE
default 8 default 16
range 1 255 range 1 255
help help
Maximum number of DVB/ATSC adapters. Increasing this number Maximum number of DVB/ATSC adapters. Increasing this number
@ -13,7 +13,7 @@ config DVB_MAX_ADAPTERS
if a much lower number of DVB/ATSC adapters is present. if a much lower number of DVB/ATSC adapters is present.
Only values in the range 4-32 are tested. Only values in the range 4-32 are tested.
If you are unsure about this, use the default value 8 If you are unsure about this, use the default value 16
config DVB_DYNAMIC_MINORS config DVB_DYNAMIC_MINORS
bool "Dynamic DVB minor allocation" bool "Dynamic DVB minor allocation"
@ -27,3 +27,16 @@ config DVB_DYNAMIC_MINORS
will be required to manage the device nodes. will be required to manage the device nodes.
If you are unsure about this, say N here. If you are unsure about this, say N here.
config DVB_DEMUX_SECTION_LOSS_LOG
bool "Enable DVB demux section packet loss log"
depends on DVB_CORE
default n
help
Enable extra log messages meant to detect packet loss
inside the Kernel.
Should not be enabled on normal cases, as logs can
be very verbose.
If you are unsure about this, say N here.

View File

@ -4,7 +4,7 @@
dvb-net-$(CONFIG_DVB_NET) := dvb_net.o dvb-net-$(CONFIG_DVB_NET) := dvb_net.o
dvb-core-objs := dvbdev.o dmxdev.o dvb_demux.o dvb_filter.o \ dvb-core-objs := dvbdev.o dmxdev.o dvb_demux.o \
dvb_ca_en50221.o dvb_frontend.o \ dvb_ca_en50221.o dvb_frontend.o \
$(dvb-net-y) dvb_ringbuffer.o dvb_math.o $(dvb-net-y) dvb_ringbuffer.o dvb_math.o

View File

@ -103,7 +103,6 @@ struct dmx_ts_feed {
u16 pid, u16 pid,
int type, int type,
enum dmx_ts_pes pes_type, enum dmx_ts_pes pes_type,
size_t circular_buffer_size,
ktime_t timeout); ktime_t timeout);
int (*start_filtering)(struct dmx_ts_feed *feed); int (*start_filtering)(struct dmx_ts_feed *feed);
int (*stop_filtering)(struct dmx_ts_feed *feed); int (*stop_filtering)(struct dmx_ts_feed *feed);
@ -181,7 +180,6 @@ struct dmx_section_feed {
/* public: */ /* public: */
int (*set)(struct dmx_section_feed *feed, int (*set)(struct dmx_section_feed *feed,
u16 pid, u16 pid,
size_t circular_buffer_size,
int check_crc); int check_crc);
int (*allocate_filter)(struct dmx_section_feed *feed, int (*allocate_filter)(struct dmx_section_feed *feed,
struct dmx_section_filter **filter); struct dmx_section_filter **filter);
@ -206,8 +204,7 @@ struct dmx_section_feed {
* the &dmx_demux. * the &dmx_demux.
* Any TS packets that match the filter settings are copied to a circular * Any TS packets that match the filter settings are copied to a circular
* buffer. The filtered TS packets are delivered to the client using this * buffer. The filtered TS packets are delivered to the client using this
* callback function. The size of the circular buffer is controlled by the * callback function.
* circular_buffer_size parameter of the &dmx_ts_feed.@set function.
* It is expected that the @buffer1 and @buffer2 callback parameters point to * It is expected that the @buffer1 and @buffer2 callback parameters point to
* addresses within the circular buffer, but other implementations are also * addresses within the circular buffer, but other implementations are also
* possible. Note that the called party should not try to free the memory * possible. Note that the called party should not try to free the memory

View File

@ -20,6 +20,8 @@
* *
*/ */
#define pr_fmt(fmt) "dmxdev: " fmt
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/slab.h> #include <linux/slab.h>
@ -36,7 +38,11 @@ static int debug;
module_param(debug, int, 0644); module_param(debug, int, 0644);
MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off)."); MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
#define dprintk if (debug) printk #define dprintk(fmt, arg...) do { \
if (debug) \
printk(KERN_DEBUG pr_fmt("%s: " fmt), \
__func__, ##arg); \
} while (0)
static int dvb_dmxdev_buffer_write(struct dvb_ringbuffer *buf, static int dvb_dmxdev_buffer_write(struct dvb_ringbuffer *buf,
const u8 *src, size_t len) const u8 *src, size_t len)
@ -50,7 +56,7 @@ static int dvb_dmxdev_buffer_write(struct dvb_ringbuffer *buf,
free = dvb_ringbuffer_free(buf); free = dvb_ringbuffer_free(buf);
if (len > free) { if (len > free) {
dprintk("dmxdev: buffer overflow\n"); dprintk("buffer overflow\n");
return -EOVERFLOW; return -EOVERFLOW;
} }
@ -126,7 +132,7 @@ static int dvb_dvr_open(struct inode *inode, struct file *file)
struct dmxdev *dmxdev = dvbdev->priv; struct dmxdev *dmxdev = dvbdev->priv;
struct dmx_frontend *front; struct dmx_frontend *front;
dprintk("function : %s\n", __func__); dprintk("%s\n", __func__);
if (mutex_lock_interruptible(&dmxdev->mutex)) if (mutex_lock_interruptible(&dmxdev->mutex))
return -ERESTARTSYS; return -ERESTARTSYS;
@ -258,7 +264,7 @@ static int dvb_dvr_set_buffer_size(struct dmxdev *dmxdev,
void *newmem; void *newmem;
void *oldmem; void *oldmem;
dprintk("function : %s\n", __func__); dprintk("%s\n", __func__);
if (buf->size == size) if (buf->size == size)
return 0; return 0;
@ -367,7 +373,7 @@ static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len,
return 0; return 0;
} }
del_timer(&dmxdevfilter->timer); del_timer(&dmxdevfilter->timer);
dprintk("dmxdev: section callback %*ph\n", 6, buffer1); dprintk("section callback %*ph\n", 6, buffer1);
ret = dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer1, ret = dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer1,
buffer1_len); buffer1_len);
if (ret == buffer1_len) { if (ret == buffer1_len) {
@ -589,7 +595,7 @@ static int dvb_dmxdev_start_feed(struct dmxdev *dmxdev,
tsfeed = feed->ts; tsfeed = feed->ts;
tsfeed->priv = filter; tsfeed->priv = filter;
ret = tsfeed->set(tsfeed, feed->pid, ts_type, ts_pes, 32768, timeout); ret = tsfeed->set(tsfeed, feed->pid, ts_type, ts_pes, timeout);
if (ret < 0) { if (ret < 0) {
dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed); dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed);
return ret; return ret;
@ -655,15 +661,15 @@ static int dvb_dmxdev_filter_start(struct dmxdev_filter *filter)
secfeed, secfeed,
dvb_dmxdev_section_callback); dvb_dmxdev_section_callback);
if (ret < 0) { if (ret < 0) {
printk("DVB (%s): could not alloc feed\n", pr_err("DVB (%s): could not alloc feed\n",
__func__); __func__);
return ret; return ret;
} }
ret = (*secfeed)->set(*secfeed, para->pid, 32768, ret = (*secfeed)->set(*secfeed, para->pid,
(para->flags & DMX_CHECK_CRC) ? 1 : 0); (para->flags & DMX_CHECK_CRC) ? 1 : 0);
if (ret < 0) { if (ret < 0) {
printk("DVB (%s): could not set feed\n", pr_err("DVB (%s): could not set feed\n",
__func__); __func__);
dvb_dmxdev_feed_restart(filter); dvb_dmxdev_feed_restart(filter);
return ret; return ret;
@ -844,7 +850,7 @@ static int dvb_dmxdev_filter_set(struct dmxdev *dmxdev,
struct dmxdev_filter *dmxdevfilter, struct dmxdev_filter *dmxdevfilter,
struct dmx_sct_filter_params *params) struct dmx_sct_filter_params *params)
{ {
dprintk("function : %s, PID=0x%04x, flags=%02x, timeout=%d\n", dprintk("%s: PID=0x%04x, flags=%02x, timeout=%d\n",
__func__, params->pid, params->flags, params->timeout); __func__, params->pid, params->flags, params->timeout);
dvb_dmxdev_filter_stop(dmxdevfilter); dvb_dmxdev_filter_stop(dmxdevfilter);
@ -1184,7 +1190,7 @@ static unsigned int dvb_dvr_poll(struct file *file, poll_table *wait)
struct dmxdev *dmxdev = dvbdev->priv; struct dmxdev *dmxdev = dvbdev->priv;
unsigned int mask = 0; unsigned int mask = 0;
dprintk("function : %s\n", __func__); dprintk("%s\n", __func__);
if (dmxdev->exit) if (dmxdev->exit)
return POLLERR; return POLLERR;

View File

@ -262,6 +262,7 @@
#define USB_PID_TECHNOTREND_CONNECT_CT2_4650_CI 0x3012 #define USB_PID_TECHNOTREND_CONNECT_CT2_4650_CI 0x3012
#define USB_PID_TECHNOTREND_CONNECT_CT2_4650_CI_2 0x3015 #define USB_PID_TECHNOTREND_CONNECT_CT2_4650_CI_2 0x3015
#define USB_PID_TECHNOTREND_TVSTICK_CT2_4400 0x3014 #define USB_PID_TECHNOTREND_TVSTICK_CT2_4400 0x3014
#define USB_PID_TECHNOTREND_CONNECT_S2_4650_CI 0x3017
#define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY 0x005a #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY 0x005a
#define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2 0x0081 #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2 0x0081
#define USB_PID_TERRATEC_CINERGY_HT_USB_XE 0x0058 #define USB_PID_TERRATEC_CINERGY_HT_USB_XE 0x0058
@ -411,4 +412,5 @@
#define USB_PID_SVEON_STV27 0xd3af #define USB_PID_SVEON_STV27 0xd3af
#define USB_PID_TURBOX_DTT_2000 0xd3a4 #define USB_PID_TURBOX_DTT_2000 0xd3a4
#define USB_PID_WINTV_SOLOHD 0x0264 #define USB_PID_WINTV_SOLOHD 0x0264
#define USB_PID_EVOLVEO_XTRATV_STICK 0xa115
#endif #endif

View File

@ -28,6 +28,8 @@
* Or, point your browser to http://www.gnu.org/copyleft/gpl.html * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
*/ */
#define pr_fmt(fmt) "dvb_ca_en50221: " fmt
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/list.h> #include <linux/list.h>
@ -46,7 +48,10 @@ static int dvb_ca_en50221_debug;
module_param_named(cam_debug, dvb_ca_en50221_debug, int, 0644); module_param_named(cam_debug, dvb_ca_en50221_debug, int, 0644);
MODULE_PARM_DESC(cam_debug, "enable verbose debug messages"); MODULE_PARM_DESC(cam_debug, "enable verbose debug messages");
#define dprintk if (dvb_ca_en50221_debug) printk #define dprintk(fmt, arg...) do { \
if (dvb_ca_en50221_debug) \
printk(KERN_DEBUG pr_fmt("%s: " fmt), __func__, ##arg);\
} while (0)
#define INIT_TIMEOUT_SECS 10 #define INIT_TIMEOUT_SECS 10
@ -166,7 +171,7 @@ static void dvb_ca_private_free(struct dvb_ca_private *ca)
{ {
unsigned int i; unsigned int i;
dvb_unregister_device(ca->dvbdev); dvb_free_device(ca->dvbdev);
for (i = 0; i < ca->slot_count; i++) for (i = 0; i < ca->slot_count; i++)
vfree(ca->slot_info[i].rx_buffer.data); vfree(ca->slot_info[i].rx_buffer.data);
@ -298,7 +303,8 @@ static int dvb_ca_en50221_wait_if_status(struct dvb_ca_private *ca, int slot,
/* if we got the flags, it was successful! */ /* if we got the flags, it was successful! */
if (res & waitfor) { if (res & waitfor) {
dprintk("%s succeeded timeout:%lu\n", __func__, jiffies - start); dprintk("%s succeeded timeout:%lu\n",
__func__, jiffies - start);
return 0; return 0;
} }
@ -519,8 +525,9 @@ static int dvb_ca_en50221_parse_attributes(struct dvb_ca_private *ca, int slot)
/* is it a version we support? */ /* is it a version we support? */
if (strncmp(dvb_str + 8, "1.00", 4)) { if (strncmp(dvb_str + 8, "1.00", 4)) {
printk("dvb_ca adapter %d: Unsupported DVB CAM module version %c%c%c%c\n", pr_err("dvb_ca adapter %d: Unsupported DVB CAM module version %c%c%c%c\n",
ca->dvbdev->adapter->num, dvb_str[8], dvb_str[9], dvb_str[10], dvb_str[11]); ca->dvbdev->adapter->num, dvb_str[8], dvb_str[9],
dvb_str[10], dvb_str[11]);
return -EINVAL; return -EINVAL;
} }
@ -557,8 +564,8 @@ static int dvb_ca_en50221_parse_attributes(struct dvb_ca_private *ca, int slot)
break; break;
default: /* Unknown tuple type - just skip this tuple and move to the next one */ default: /* Unknown tuple type - just skip this tuple and move to the next one */
dprintk("dvb_ca: Skipping unknown tuple type:0x%x length:0x%x\n", tupleType, dprintk("dvb_ca: Skipping unknown tuple type:0x%x length:0x%x\n",
tupleLength); tupleType, tupleLength);
break; break;
} }
} }
@ -567,7 +574,8 @@ static int dvb_ca_en50221_parse_attributes(struct dvb_ca_private *ca, int slot)
return -EINVAL; return -EINVAL;
dprintk("Valid DVB CAM detected MANID:%x DEVID:%x CONFIGBASE:0x%x CONFIGOPTION:0x%x\n", dprintk("Valid DVB CAM detected MANID:%x DEVID:%x CONFIGBASE:0x%x CONFIGOPTION:0x%x\n",
manfid, devid, ca->slot_info[slot].config_base, ca->slot_info[slot].config_option); manfid, devid, ca->slot_info[slot].config_base,
ca->slot_info[slot].config_option);
// success! // success!
return 0; return 0;
@ -661,14 +669,15 @@ static int dvb_ca_en50221_read_data(struct dvb_ca_private *ca, int slot, u8 * eb
/* check it will fit */ /* check it will fit */
if (ebuf == NULL) { if (ebuf == NULL) {
if (bytes_read > ca->slot_info[slot].link_buf_size) { if (bytes_read > ca->slot_info[slot].link_buf_size) {
printk("dvb_ca adapter %d: CAM tried to send a buffer larger than the link buffer size (%i > %i)!\n", pr_err("dvb_ca adapter %d: CAM tried to send a buffer larger than the link buffer size (%i > %i)!\n",
ca->dvbdev->adapter->num, bytes_read, ca->slot_info[slot].link_buf_size); ca->dvbdev->adapter->num, bytes_read,
ca->slot_info[slot].link_buf_size);
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_LINKINIT; ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_LINKINIT;
status = -EIO; status = -EIO;
goto exit; goto exit;
} }
if (bytes_read < 2) { if (bytes_read < 2) {
printk("dvb_ca adapter %d: CAM sent a buffer that was less than 2 bytes!\n", pr_err("dvb_ca adapter %d: CAM sent a buffer that was less than 2 bytes!\n",
ca->dvbdev->adapter->num); ca->dvbdev->adapter->num);
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_LINKINIT; ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_LINKINIT;
status = -EIO; status = -EIO;
@ -676,7 +685,7 @@ static int dvb_ca_en50221_read_data(struct dvb_ca_private *ca, int slot, u8 * eb
} }
} else { } else {
if (bytes_read > ecount) { if (bytes_read > ecount) {
printk("dvb_ca adapter %d: CAM tried to send a buffer larger than the ecount size!\n", pr_err("dvb_ca adapter %d: CAM tried to send a buffer larger than the ecount size!\n",
ca->dvbdev->adapter->num); ca->dvbdev->adapter->num);
status = -EIO; status = -EIO;
goto exit; goto exit;
@ -1062,7 +1071,7 @@ static int dvb_ca_en50221_thread(void *data)
case DVB_CA_SLOTSTATE_WAITREADY: case DVB_CA_SLOTSTATE_WAITREADY:
if (time_after(jiffies, ca->slot_info[slot].timeout)) { if (time_after(jiffies, ca->slot_info[slot].timeout)) {
printk("dvb_ca adaptor %d: PC card did not respond :(\n", pr_err("dvb_ca adaptor %d: PC card did not respond :(\n",
ca->dvbdev->adapter->num); ca->dvbdev->adapter->num);
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID; ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
dvb_ca_en50221_thread_update_delay(ca); dvb_ca_en50221_thread_update_delay(ca);
@ -1084,14 +1093,14 @@ static int dvb_ca_en50221_thread(void *data)
} }
} }
printk("dvb_ca adapter %d: Invalid PC card inserted :(\n", pr_err("dvb_ca adapter %d: Invalid PC card inserted :(\n",
ca->dvbdev->adapter->num); ca->dvbdev->adapter->num);
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID; ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
dvb_ca_en50221_thread_update_delay(ca); dvb_ca_en50221_thread_update_delay(ca);
break; break;
} }
if (dvb_ca_en50221_set_configoption(ca, slot) != 0) { if (dvb_ca_en50221_set_configoption(ca, slot) != 0) {
printk("dvb_ca adapter %d: Unable to initialise CAM :(\n", pr_err("dvb_ca adapter %d: Unable to initialise CAM :(\n",
ca->dvbdev->adapter->num); ca->dvbdev->adapter->num);
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID; ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
dvb_ca_en50221_thread_update_delay(ca); dvb_ca_en50221_thread_update_delay(ca);
@ -1099,7 +1108,7 @@ static int dvb_ca_en50221_thread(void *data)
} }
if (ca->pub->write_cam_control(ca->pub, slot, if (ca->pub->write_cam_control(ca->pub, slot,
CTRLIF_COMMAND, CMDREG_RS) != 0) { CTRLIF_COMMAND, CMDREG_RS) != 0) {
printk("dvb_ca adapter %d: Unable to reset CAM IF\n", pr_err("dvb_ca adapter %d: Unable to reset CAM IF\n",
ca->dvbdev->adapter->num); ca->dvbdev->adapter->num);
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID; ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
dvb_ca_en50221_thread_update_delay(ca); dvb_ca_en50221_thread_update_delay(ca);
@ -1114,7 +1123,7 @@ static int dvb_ca_en50221_thread(void *data)
case DVB_CA_SLOTSTATE_WAITFR: case DVB_CA_SLOTSTATE_WAITFR:
if (time_after(jiffies, ca->slot_info[slot].timeout)) { if (time_after(jiffies, ca->slot_info[slot].timeout)) {
printk("dvb_ca adapter %d: DVB CAM did not respond :(\n", pr_err("dvb_ca adapter %d: DVB CAM did not respond :(\n",
ca->dvbdev->adapter->num); ca->dvbdev->adapter->num);
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID; ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
dvb_ca_en50221_thread_update_delay(ca); dvb_ca_en50221_thread_update_delay(ca);
@ -1141,7 +1150,8 @@ static int dvb_ca_en50221_thread(void *data)
} }
} }
printk("dvb_ca adapter %d: DVB CAM link initialisation failed :(\n", ca->dvbdev->adapter->num); pr_err("dvb_ca adapter %d: DVB CAM link initialisation failed :(\n",
ca->dvbdev->adapter->num);
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID; ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
dvb_ca_en50221_thread_update_delay(ca); dvb_ca_en50221_thread_update_delay(ca);
break; break;
@ -1150,7 +1160,8 @@ static int dvb_ca_en50221_thread(void *data)
if (ca->slot_info[slot].rx_buffer.data == NULL) { if (ca->slot_info[slot].rx_buffer.data == NULL) {
rxbuf = vmalloc(RX_BUFFER_SIZE); rxbuf = vmalloc(RX_BUFFER_SIZE);
if (rxbuf == NULL) { if (rxbuf == NULL) {
printk("dvb_ca adapter %d: Unable to allocate CAM rx buffer :(\n", ca->dvbdev->adapter->num); pr_err("dvb_ca adapter %d: Unable to allocate CAM rx buffer :(\n",
ca->dvbdev->adapter->num);
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID; ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_INVALID;
dvb_ca_en50221_thread_update_delay(ca); dvb_ca_en50221_thread_update_delay(ca);
break; break;
@ -1161,7 +1172,8 @@ static int dvb_ca_en50221_thread(void *data)
ca->pub->slot_ts_enable(ca->pub, slot); ca->pub->slot_ts_enable(ca->pub, slot);
ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_RUNNING; ca->slot_info[slot].slot_state = DVB_CA_SLOTSTATE_RUNNING;
dvb_ca_en50221_thread_update_delay(ca); dvb_ca_en50221_thread_update_delay(ca);
printk("dvb_ca adapter %d: DVB CAM detected and initialised successfully\n", ca->dvbdev->adapter->num); pr_err("dvb_ca adapter %d: DVB CAM detected and initialised successfully\n",
ca->dvbdev->adapter->num);
break; break;
case DVB_CA_SLOTSTATE_RUNNING: case DVB_CA_SLOTSTATE_RUNNING:
@ -1497,7 +1509,8 @@ static ssize_t dvb_ca_en50221_io_read(struct file *file, char __user * buf,
pktlen = 2; pktlen = 2;
do { do {
if (idx == -1) { if (idx == -1) {
printk("dvb_ca adapter %d: BUG: read packet ended before last_fragment encountered\n", ca->dvbdev->adapter->num); pr_err("dvb_ca adapter %d: BUG: read packet ended before last_fragment encountered\n",
ca->dvbdev->adapter->num);
status = -EIO; status = -EIO;
goto exit; goto exit;
} }
@ -1755,8 +1768,8 @@ int dvb_ca_en50221_init(struct dvb_adapter *dvb_adapter,
ca->dvbdev->adapter->num, ca->dvbdev->id); ca->dvbdev->adapter->num, ca->dvbdev->id);
if (IS_ERR(ca->thread)) { if (IS_ERR(ca->thread)) {
ret = PTR_ERR(ca->thread); ret = PTR_ERR(ca->thread);
printk("dvb_ca_init: failed to start kernel_thread (%d)\n", pr_err("dvb_ca_init: failed to start kernel_thread (%d)\n",
ret); ret);
goto unregister_device; goto unregister_device;
} }
return 0; return 0;
@ -1794,6 +1807,7 @@ void dvb_ca_en50221_release(struct dvb_ca_en50221 *pubca)
for (i = 0; i < ca->slot_count; i++) { for (i = 0; i < ca->slot_count; i++) {
dvb_ca_en50221_slot_shutdown(ca, i); dvb_ca_en50221_slot_shutdown(ca, i);
} }
dvb_remove_device(ca->dvbdev);
dvb_ca_private_put(ca); dvb_ca_private_put(ca);
pubca->private = NULL; pubca->private = NULL;
} }

View File

@ -21,6 +21,8 @@
* *
*/ */
#define pr_fmt(fmt) "dvb_demux: " fmt
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/slab.h> #include <linux/slab.h>
@ -34,12 +36,6 @@
#include "dvb_demux.h" #include "dvb_demux.h"
#define NOBUFS
/*
** #define DVB_DEMUX_SECTION_LOSS_LOG to monitor payload loss in the syslog
*/
// #define DVB_DEMUX_SECTION_LOSS_LOG
static int dvb_demux_tscheck; static int dvb_demux_tscheck;
module_param(dvb_demux_tscheck, int, 0644); module_param(dvb_demux_tscheck, int, 0644);
MODULE_PARM_DESC(dvb_demux_tscheck, MODULE_PARM_DESC(dvb_demux_tscheck,
@ -55,10 +51,13 @@ module_param(dvb_demux_feed_err_pkts, int, 0644);
MODULE_PARM_DESC(dvb_demux_feed_err_pkts, MODULE_PARM_DESC(dvb_demux_feed_err_pkts,
"when set to 0, drop packets with the TEI bit set (1 by default)"); "when set to 0, drop packets with the TEI bit set (1 by default)");
#define dprintk_tscheck(x...) do { \ #define dprintk(fmt, arg...) \
if (dvb_demux_tscheck && printk_ratelimit()) \ printk(KERN_DEBUG pr_fmt("%s: " fmt), __func__, ##arg)
printk(x); \
} while (0) #define dprintk_tscheck(x...) do { \
if (dvb_demux_tscheck && printk_ratelimit()) \
dprintk(x); \
} while (0)
/****************************************************************************** /******************************************************************************
* static inlined helper functions * static inlined helper functions
@ -109,21 +108,23 @@ static inline int dvb_dmx_swfilter_payload(struct dvb_demux_feed *feed,
{ {
int count = payload(buf); int count = payload(buf);
int p; int p;
//int ccok; #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG
//u8 cc; int ccok;
u8 cc;
#endif
if (count == 0) if (count == 0)
return -1; return -1;
p = 188 - count; p = 188 - count;
/* #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG
cc = buf[3] & 0x0f; cc = buf[3] & 0x0f;
ccok = ((feed->cc + 1) & 0x0f) == cc; ccok = ((feed->cc + 1) & 0x0f) == cc;
feed->cc = cc; feed->cc = cc;
if (!ccok) if (!ccok)
printk("missed packet!\n"); dprintk("missed packet!\n");
*/ #endif
if (buf[1] & 0x40) // PUSI ? if (buf[1] & 0x40) // PUSI ?
feed->peslen = 0xfffa; feed->peslen = 0xfffa;
@ -189,7 +190,7 @@ static void dvb_dmx_swfilter_section_new(struct dvb_demux_feed *feed)
{ {
struct dmx_section_feed *sec = &feed->feed.sec; struct dmx_section_feed *sec = &feed->feed.sec;
#ifdef DVB_DEMUX_SECTION_LOSS_LOG #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG
if (sec->secbufp < sec->tsfeedp) { if (sec->secbufp < sec->tsfeedp) {
int i, n = sec->tsfeedp - sec->secbufp; int i, n = sec->tsfeedp - sec->secbufp;
@ -199,12 +200,12 @@ static void dvb_dmx_swfilter_section_new(struct dvb_demux_feed *feed)
* but just first and last. * but just first and last.
*/ */
if (sec->secbuf[0] != 0xff || sec->secbuf[n - 1] != 0xff) { if (sec->secbuf[0] != 0xff || sec->secbuf[n - 1] != 0xff) {
printk("dvb_demux.c section ts padding loss: %d/%d\n", dprintk("dvb_demux.c section ts padding loss: %d/%d\n",
n, sec->tsfeedp); n, sec->tsfeedp);
printk("dvb_demux.c pad data:"); dprintk("dvb_demux.c pad data:");
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
printk(" %02x", sec->secbuf[i]); pr_cont(" %02x", sec->secbuf[i]);
printk("\n"); pr_cont("\n");
} }
} }
#endif #endif
@ -242,8 +243,8 @@ static int dvb_dmx_swfilter_section_copy_dump(struct dvb_demux_feed *feed,
return 0; return 0;
if (sec->tsfeedp + len > DMX_MAX_SECFEED_SIZE) { if (sec->tsfeedp + len > DMX_MAX_SECFEED_SIZE) {
#ifdef DVB_DEMUX_SECTION_LOSS_LOG #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG
printk("dvb_demux.c section buffer full loss: %d/%d\n", dprintk("dvb_demux.c section buffer full loss: %d/%d\n",
sec->tsfeedp + len - DMX_MAX_SECFEED_SIZE, sec->tsfeedp + len - DMX_MAX_SECFEED_SIZE,
DMX_MAX_SECFEED_SIZE); DMX_MAX_SECFEED_SIZE);
#endif #endif
@ -276,9 +277,9 @@ static int dvb_dmx_swfilter_section_copy_dump(struct dvb_demux_feed *feed,
/* dump [secbuf .. secbuf+seclen) */ /* dump [secbuf .. secbuf+seclen) */
if (feed->pusi_seen) if (feed->pusi_seen)
dvb_dmx_swfilter_section_feed(feed); dvb_dmx_swfilter_section_feed(feed);
#ifdef DVB_DEMUX_SECTION_LOSS_LOG #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG
else else
printk("dvb_demux.c pusi not seen, discarding section data\n"); dprintk("dvb_demux.c pusi not seen, discarding section data\n");
#endif #endif
sec->secbufp += seclen; /* secbufp and secbuf moving together is */ sec->secbufp += seclen; /* secbufp and secbuf moving together is */
sec->secbuf += seclen; /* redundant but saves pointer arithmetic */ sec->secbuf += seclen; /* redundant but saves pointer arithmetic */
@ -312,9 +313,9 @@ static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed,
} }
if (!ccok || dc_i) { if (!ccok || dc_i) {
#ifdef DVB_DEMUX_SECTION_LOSS_LOG #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG
printk("dvb_demux.c discontinuity detected %d bytes lost\n", dprintk("dvb_demux.c discontinuity detected %d bytes lost\n",
count); count);
/* /*
* those bytes under sume circumstances will again be reported * those bytes under sume circumstances will again be reported
* in the following dvb_dmx_swfilter_section_new * in the following dvb_dmx_swfilter_section_new
@ -344,9 +345,10 @@ static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed,
dvb_dmx_swfilter_section_copy_dump(feed, after, dvb_dmx_swfilter_section_copy_dump(feed, after,
after_len); after_len);
} }
#ifdef DVB_DEMUX_SECTION_LOSS_LOG #ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG
else if (count > 0) else if (count > 0)
printk("dvb_demux.c PUSI=1 but %d bytes lost\n", count); dprintk("dvb_demux.c PUSI=1 but %d bytes lost\n",
count);
#endif #endif
} else { } else {
/* PUSI=0 (is not set), no section boundary */ /* PUSI=0 (is not set), no section boundary */
@ -415,9 +417,9 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
1024); 1024);
speed_timedelta = ktime_ms_delta(cur_time, speed_timedelta = ktime_ms_delta(cur_time,
demux->speed_last_time); demux->speed_last_time);
printk(KERN_INFO "TS speed %llu Kbits/sec \n", dprintk("TS speed %llu Kbits/sec \n",
div64_u64(speed_bytes, div64_u64(speed_bytes,
speed_timedelta)); speed_timedelta));
} }
demux->speed_last_time = cur_time; demux->speed_last_time = cur_time;
@ -426,8 +428,7 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
} }
if (buf[1] & 0x80) { if (buf[1] & 0x80) {
dprintk_tscheck("TEI detected. " dprintk_tscheck("TEI detected. PID=0x%x data1=0x%x\n",
"PID=0x%x data1=0x%x\n",
pid, buf[1]); pid, buf[1]);
/* data in this packet can't be trusted - drop it unless /* data in this packet can't be trusted - drop it unless
* module option dvb_demux_feed_err_pkts is set */ * module option dvb_demux_feed_err_pkts is set */
@ -635,7 +636,7 @@ static void dvb_demux_feed_add(struct dvb_demux_feed *feed)
{ {
spin_lock_irq(&feed->demux->lock); spin_lock_irq(&feed->demux->lock);
if (dvb_demux_feed_find(feed)) { if (dvb_demux_feed_find(feed)) {
printk(KERN_ERR "%s: feed already in list (type=%x state=%x pid=%x)\n", pr_err("%s: feed already in list (type=%x state=%x pid=%x)\n",
__func__, feed->type, feed->state, feed->pid); __func__, feed->type, feed->state, feed->pid);
goto out; goto out;
} }
@ -649,7 +650,7 @@ static void dvb_demux_feed_del(struct dvb_demux_feed *feed)
{ {
spin_lock_irq(&feed->demux->lock); spin_lock_irq(&feed->demux->lock);
if (!(dvb_demux_feed_find(feed))) { if (!(dvb_demux_feed_find(feed))) {
printk(KERN_ERR "%s: feed not in list (type=%x state=%x pid=%x)\n", pr_err("%s: feed not in list (type=%x state=%x pid=%x)\n",
__func__, feed->type, feed->state, feed->pid); __func__, feed->type, feed->state, feed->pid);
goto out; goto out;
} }
@ -660,8 +661,7 @@ out:
} }
static int dmx_ts_feed_set(struct dmx_ts_feed *ts_feed, u16 pid, int ts_type, static int dmx_ts_feed_set(struct dmx_ts_feed *ts_feed, u16 pid, int ts_type,
enum dmx_ts_pes pes_type, enum dmx_ts_pes pes_type, ktime_t timeout)
size_t circular_buffer_size, ktime_t timeout)
{ {
struct dvb_demux_feed *feed = (struct dvb_demux_feed *)ts_feed; struct dvb_demux_feed *feed = (struct dvb_demux_feed *)ts_feed;
struct dvb_demux *demux = feed->demux; struct dvb_demux *demux = feed->demux;
@ -691,23 +691,10 @@ static int dmx_ts_feed_set(struct dmx_ts_feed *ts_feed, u16 pid, int ts_type,
dvb_demux_feed_add(feed); dvb_demux_feed_add(feed);
feed->pid = pid; feed->pid = pid;
feed->buffer_size = circular_buffer_size;
feed->timeout = timeout; feed->timeout = timeout;
feed->ts_type = ts_type; feed->ts_type = ts_type;
feed->pes_type = pes_type; feed->pes_type = pes_type;
if (feed->buffer_size) {
#ifdef NOBUFS
feed->buffer = NULL;
#else
feed->buffer = vmalloc(feed->buffer_size);
if (!feed->buffer) {
mutex_unlock(&demux->mutex);
return -ENOMEM;
}
#endif
}
feed->state = DMX_STATE_READY; feed->state = DMX_STATE_READY;
mutex_unlock(&demux->mutex); mutex_unlock(&demux->mutex);
@ -796,7 +783,6 @@ static int dvbdmx_allocate_ts_feed(struct dmx_demux *dmx,
feed->demux = demux; feed->demux = demux;
feed->pid = 0xffff; feed->pid = 0xffff;
feed->peslen = 0xfffa; feed->peslen = 0xfffa;
feed->buffer = NULL;
(*ts_feed) = &feed->feed.ts; (*ts_feed) = &feed->feed.ts;
(*ts_feed)->parent = dmx; (*ts_feed)->parent = dmx;
@ -833,10 +819,6 @@ static int dvbdmx_release_ts_feed(struct dmx_demux *dmx,
mutex_unlock(&demux->mutex); mutex_unlock(&demux->mutex);
return -EINVAL; return -EINVAL;
} }
#ifndef NOBUFS
vfree(feed->buffer);
feed->buffer = NULL;
#endif
feed->state = DMX_STATE_FREE; feed->state = DMX_STATE_FREE;
feed->filter->state = DMX_STATE_FREE; feed->filter->state = DMX_STATE_FREE;
@ -888,8 +870,7 @@ static int dmx_section_feed_allocate_filter(struct dmx_section_feed *feed,
} }
static int dmx_section_feed_set(struct dmx_section_feed *feed, static int dmx_section_feed_set(struct dmx_section_feed *feed,
u16 pid, size_t circular_buffer_size, u16 pid, int check_crc)
int check_crc)
{ {
struct dvb_demux_feed *dvbdmxfeed = (struct dvb_demux_feed *)feed; struct dvb_demux_feed *dvbdmxfeed = (struct dvb_demux_feed *)feed;
struct dvb_demux *dvbdmx = dvbdmxfeed->demux; struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
@ -903,19 +884,8 @@ static int dmx_section_feed_set(struct dmx_section_feed *feed,
dvb_demux_feed_add(dvbdmxfeed); dvb_demux_feed_add(dvbdmxfeed);
dvbdmxfeed->pid = pid; dvbdmxfeed->pid = pid;
dvbdmxfeed->buffer_size = circular_buffer_size;
dvbdmxfeed->feed.sec.check_crc = check_crc; dvbdmxfeed->feed.sec.check_crc = check_crc;
#ifdef NOBUFS
dvbdmxfeed->buffer = NULL;
#else
dvbdmxfeed->buffer = vmalloc(dvbdmxfeed->buffer_size);
if (!dvbdmxfeed->buffer) {
mutex_unlock(&dvbdmx->mutex);
return -ENOMEM;
}
#endif
dvbdmxfeed->state = DMX_STATE_READY; dvbdmxfeed->state = DMX_STATE_READY;
mutex_unlock(&dvbdmx->mutex); mutex_unlock(&dvbdmx->mutex);
return 0; return 0;
@ -1074,7 +1044,6 @@ static int dvbdmx_allocate_section_feed(struct dmx_demux *demux,
dvbdmxfeed->feed.sec.secbufp = dvbdmxfeed->feed.sec.seclen = 0; dvbdmxfeed->feed.sec.secbufp = dvbdmxfeed->feed.sec.seclen = 0;
dvbdmxfeed->feed.sec.tsfeedp = 0; dvbdmxfeed->feed.sec.tsfeedp = 0;
dvbdmxfeed->filter = NULL; dvbdmxfeed->filter = NULL;
dvbdmxfeed->buffer = NULL;
(*feed) = &dvbdmxfeed->feed.sec; (*feed) = &dvbdmxfeed->feed.sec;
(*feed)->is_filtering = 0; (*feed)->is_filtering = 0;
@ -1103,10 +1072,6 @@ static int dvbdmx_release_section_feed(struct dmx_demux *demux,
mutex_unlock(&dvbdmx->mutex); mutex_unlock(&dvbdmx->mutex);
return -EINVAL; return -EINVAL;
} }
#ifndef NOBUFS
vfree(dvbdmxfeed->buffer);
dvbdmxfeed->buffer = NULL;
#endif
dvbdmxfeed->state = DMX_STATE_FREE; dvbdmxfeed->state = DMX_STATE_FREE;
dvb_demux_feed_del(dvbdmxfeed); dvb_demux_feed_del(dvbdmxfeed);
@ -1268,7 +1233,7 @@ int dvb_dmx_init(struct dvb_demux *dvbdemux)
dvbdemux->cnt_storage = vmalloc(MAX_PID + 1); dvbdemux->cnt_storage = vmalloc(MAX_PID + 1);
if (!dvbdemux->cnt_storage) if (!dvbdemux->cnt_storage)
printk(KERN_WARNING "Couldn't allocate memory for TS/TEI check. Disabling it\n"); pr_warn("Couldn't allocate memory for TS/TEI check. Disabling it\n");
INIT_LIST_HEAD(&dvbdemux->frontend_list); INIT_LIST_HEAD(&dvbdemux->frontend_list);

View File

@ -80,8 +80,6 @@ struct dvb_demux_feed {
int type; int type;
int state; int state;
u16 pid; u16 pid;
u8 *buffer;
int buffer_size;
ktime_t timeout; ktime_t timeout;
struct dvb_demux_filter *filter; struct dvb_demux_filter *filter;

View File

@ -1,603 +0,0 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/string.h>
#include "dvb_filter.h"
#if 0
static unsigned int bitrates[3][16] =
{{0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,0},
{0,32,48,56,64,80,96,112,128,160,192,224,256,320,384,0},
{0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0}};
#endif
static u32 freq[4] = {480, 441, 320, 0};
static unsigned int ac3_bitrates[32] =
{32,40,48,56,64,80,96,112,128,160,192,224,256,320,384,448,512,576,640,
0,0,0,0,0,0,0,0,0,0,0,0,0};
static u32 ac3_frames[3][32] =
{{64,80,96,112,128,160,192,224,256,320,384,448,512,640,768,896,1024,
1152,1280,0,0,0,0,0,0,0,0,0,0,0,0,0},
{69,87,104,121,139,174,208,243,278,348,417,487,557,696,835,975,1114,
1253,1393,0,0,0,0,0,0,0,0,0,0,0,0,0},
{96,120,144,168,192,240,288,336,384,480,576,672,768,960,1152,1344,
1536,1728,1920,0,0,0,0,0,0,0,0,0,0,0,0,0}};
#if 0
static void setup_ts2pes(ipack *pa, ipack *pv, u16 *pida, u16 *pidv,
void (*pes_write)(u8 *buf, int count, void *data),
void *priv)
{
dvb_filter_ipack_init(pa, IPACKS, pes_write);
dvb_filter_ipack_init(pv, IPACKS, pes_write);
pa->pid = pida;
pv->pid = pidv;
pa->data = priv;
pv->data = priv;
}
#endif
#if 0
static void ts_to_pes(ipack *p, u8 *buf) // don't need count (=188)
{
u8 off = 0;
if (!buf || !p ){
printk("NULL POINTER IDIOT\n");
return;
}
if (buf[1]&PAY_START) {
if (p->plength == MMAX_PLENGTH-6 && p->found>6){
p->plength = p->found-6;
p->found = 0;
send_ipack(p);
dvb_filter_ipack_reset(p);
}
}
if (buf[3] & ADAPT_FIELD) { // adaptation field?
off = buf[4] + 1;
if (off+4 > 187) return;
}
dvb_filter_instant_repack(buf+4+off, TS_SIZE-4-off, p);
}
#endif
#if 0
/* needs 5 byte input, returns picture coding type*/
static int read_picture_header(u8 *headr, struct mpg_picture *pic, int field, int pr)
{
u8 pct;
if (pr) printk( "Pic header: ");
pic->temporal_reference[field] = (( headr[0] << 2 ) |
(headr[1] & 0x03) )& 0x03ff;
if (pr) printk( " temp ref: 0x%04x", pic->temporal_reference[field]);
pct = ( headr[1] >> 2 ) & 0x07;
pic->picture_coding_type[field] = pct;
if (pr) {
switch(pct){
case I_FRAME:
printk( " I-FRAME");
break;
case B_FRAME:
printk( " B-FRAME");
break;
case P_FRAME:
printk( " P-FRAME");
break;
}
}
pic->vinfo.vbv_delay = (( headr[1] >> 5 ) | ( headr[2] << 3) |
( (headr[3] & 0x1F) << 11) ) & 0xffff;
if (pr) printk( " vbv delay: 0x%04x", pic->vinfo.vbv_delay);
pic->picture_header_parameter = ( headr[3] & 0xe0 ) |
((headr[4] & 0x80) >> 3);
if ( pct == B_FRAME ){
pic->picture_header_parameter |= ( headr[4] >> 3 ) & 0x0f;
}
if (pr) printk( " pic head param: 0x%x",
pic->picture_header_parameter);
return pct;
}
#endif
#if 0
/* needs 4 byte input */
static int read_gop_header(u8 *headr, struct mpg_picture *pic, int pr)
{
if (pr) printk("GOP header: ");
pic->time_code = (( headr[0] << 17 ) | ( headr[1] << 9) |
( headr[2] << 1 ) | (headr[3] &0x01)) & 0x1ffffff;
if (pr) printk(" time: %d:%d.%d ", (headr[0]>>2)& 0x1F,
((headr[0]<<4)& 0x30)| ((headr[1]>>4)& 0x0F),
((headr[1]<<3)& 0x38)| ((headr[2]>>5)& 0x0F));
if ( ( headr[3] & 0x40 ) != 0 ){
pic->closed_gop = 1;
} else {
pic->closed_gop = 0;
}
if (pr) printk("closed: %d", pic->closed_gop);
if ( ( headr[3] & 0x20 ) != 0 ){
pic->broken_link = 1;
} else {
pic->broken_link = 0;
}
if (pr) printk(" broken: %d\n", pic->broken_link);
return 0;
}
#endif
#if 0
/* needs 8 byte input */
static int read_sequence_header(u8 *headr, struct dvb_video_info *vi, int pr)
{
int sw;
int form = -1;
if (pr) printk("Reading sequence header\n");
vi->horizontal_size = ((headr[1] &0xF0) >> 4) | (headr[0] << 4);
vi->vertical_size = ((headr[1] &0x0F) << 8) | (headr[2]);
sw = (int)((headr[3]&0xF0) >> 4) ;
switch( sw ){
case 1:
if (pr)
printk("Videostream: ASPECT: 1:1");
vi->aspect_ratio = 100;
break;
case 2:
if (pr)
printk("Videostream: ASPECT: 4:3");
vi->aspect_ratio = 133;
break;
case 3:
if (pr)
printk("Videostream: ASPECT: 16:9");
vi->aspect_ratio = 177;
break;
case 4:
if (pr)
printk("Videostream: ASPECT: 2.21:1");
vi->aspect_ratio = 221;
break;
case 5 ... 15:
if (pr)
printk("Videostream: ASPECT: reserved");
vi->aspect_ratio = 0;
break;
default:
vi->aspect_ratio = 0;
return -1;
}
if (pr)
printk(" Size = %dx%d",vi->horizontal_size,vi->vertical_size);
sw = (int)(headr[3]&0x0F);
switch ( sw ) {
case 1:
if (pr)
printk(" FRate: 23.976 fps");
vi->framerate = 23976;
form = -1;
break;
case 2:
if (pr)
printk(" FRate: 24 fps");
vi->framerate = 24000;
form = -1;
break;
case 3:
if (pr)
printk(" FRate: 25 fps");
vi->framerate = 25000;
form = VIDEO_MODE_PAL;
break;
case 4:
if (pr)
printk(" FRate: 29.97 fps");
vi->framerate = 29970;
form = VIDEO_MODE_NTSC;
break;
case 5:
if (pr)
printk(" FRate: 30 fps");
vi->framerate = 30000;
form = VIDEO_MODE_NTSC;
break;
case 6:
if (pr)
printk(" FRate: 50 fps");
vi->framerate = 50000;
form = VIDEO_MODE_PAL;
break;
case 7:
if (pr)
printk(" FRate: 60 fps");
vi->framerate = 60000;
form = VIDEO_MODE_NTSC;
break;
}
vi->bit_rate = (headr[4] << 10) | (headr[5] << 2) | (headr[6] & 0x03);
vi->vbv_buffer_size
= (( headr[6] & 0xF8) >> 3 ) | (( headr[7] & 0x1F )<< 5);
if (pr){
printk(" BRate: %d Mbit/s",4*(vi->bit_rate)/10000);
printk(" vbvbuffer %d",16*1024*(vi->vbv_buffer_size));
printk("\n");
}
vi->video_format = form;
return 0;
}
#endif
#if 0
static int get_vinfo(u8 *mbuf, int count, struct dvb_video_info *vi, int pr)
{
u8 *headr;
int found = 0;
int c = 0;
while (found < 4 && c+4 < count){
u8 *b;
b = mbuf+c;
if ( b[0] == 0x00 && b[1] == 0x00 && b[2] == 0x01
&& b[3] == 0xb3) found = 4;
else {
c++;
}
}
if (! found) return -1;
c += 4;
if (c+12 >= count) return -1;
headr = mbuf+c;
if (read_sequence_header(headr, vi, pr) < 0) return -1;
vi->off = c-4;
return 0;
}
#endif
#if 0
static int get_ainfo(u8 *mbuf, int count, struct dvb_audio_info *ai, int pr)
{
u8 *headr;
int found = 0;
int c = 0;
int fr = 0;
while (found < 2 && c < count){
u8 b[2];
memcpy( b, mbuf+c, 2);
if ( b[0] == 0xff && (b[1] & 0xf8) == 0xf8)
found = 2;
else {
c++;
}
}
if (!found) return -1;
if (c+3 >= count) return -1;
headr = mbuf+c;
ai->layer = (headr[1] & 0x06) >> 1;
if (pr)
printk("Audiostream: Layer: %d", 4-ai->layer);
ai->bit_rate = bitrates[(3-ai->layer)][(headr[2] >> 4 )]*1000;
if (pr){
if (ai->bit_rate == 0)
printk(" Bit rate: free");
else if (ai->bit_rate == 0xf)
printk(" BRate: reserved");
else
printk(" BRate: %d kb/s", ai->bit_rate/1000);
}
fr = (headr[2] & 0x0c ) >> 2;
ai->frequency = freq[fr]*100;
if (pr){
if (ai->frequency == 3)
printk(" Freq: reserved\n");
else
printk(" Freq: %d kHz\n",ai->frequency);
}
ai->off = c;
return 0;
}
#endif
int dvb_filter_get_ac3info(u8 *mbuf, int count, struct dvb_audio_info *ai, int pr)
{
u8 *headr;
int found = 0;
int c = 0;
u8 frame = 0;
int fr = 0;
while ( !found && c < count){
u8 *b = mbuf+c;
if ( b[0] == 0x0b && b[1] == 0x77 )
found = 1;
else {
c++;
}
}
if (!found) return -1;
if (pr)
printk("Audiostream: AC3");
ai->off = c;
if (c+5 >= count) return -1;
ai->layer = 0; // 0 for AC3
headr = mbuf+c+2;
frame = (headr[2]&0x3f);
ai->bit_rate = ac3_bitrates[frame >> 1]*1000;
if (pr)
printk(" BRate: %d kb/s", (int) ai->bit_rate/1000);
ai->frequency = (headr[2] & 0xc0 ) >> 6;
fr = (headr[2] & 0xc0 ) >> 6;
ai->frequency = freq[fr]*100;
if (pr) printk (" Freq: %d Hz\n", (int) ai->frequency);
ai->framesize = ac3_frames[fr][frame >> 1];
if ((frame & 1) && (fr == 1)) ai->framesize++;
ai->framesize = ai->framesize << 1;
if (pr) printk (" Framesize %d\n",(int) ai->framesize);
return 0;
}
EXPORT_SYMBOL(dvb_filter_get_ac3info);
#if 0
static u8 *skip_pes_header(u8 **bufp)
{
u8 *inbuf = *bufp;
u8 *buf = inbuf;
u8 *pts = NULL;
int skip = 0;
static const int mpeg1_skip_table[16] = {
1, 0xffff, 5, 10, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
};
if ((inbuf[6] & 0xc0) == 0x80){ /* mpeg2 */
if (buf[7] & PTS_ONLY)
pts = buf+9;
else pts = NULL;
buf = inbuf + 9 + inbuf[8];
} else { /* mpeg1 */
for (buf = inbuf + 6; *buf == 0xff; buf++)
if (buf == inbuf + 6 + 16) {
break;
}
if ((*buf & 0xc0) == 0x40)
buf += 2;
skip = mpeg1_skip_table [*buf >> 4];
if (skip == 5 || skip == 10) pts = buf;
else pts = NULL;
buf += mpeg1_skip_table [*buf >> 4];
}
*bufp = buf;
return pts;
}
#endif
#if 0
static void initialize_quant_matrix( u32 *matrix )
{
int i;
matrix[0] = 0x08101013;
matrix[1] = 0x10131616;
matrix[2] = 0x16161616;
matrix[3] = 0x1a181a1b;
matrix[4] = 0x1b1b1a1a;
matrix[5] = 0x1a1a1b1b;
matrix[6] = 0x1b1d1d1d;
matrix[7] = 0x2222221d;
matrix[8] = 0x1d1d1b1b;
matrix[9] = 0x1d1d2020;
matrix[10] = 0x22222526;
matrix[11] = 0x25232322;
matrix[12] = 0x23262628;
matrix[13] = 0x28283030;
matrix[14] = 0x2e2e3838;
matrix[15] = 0x3a454553;
for ( i = 16 ; i < 32 ; i++ )
matrix[i] = 0x10101010;
}
#endif
#if 0
static void initialize_mpg_picture(struct mpg_picture *pic)
{
int i;
/* set MPEG1 */
pic->mpeg1_flag = 1;
pic->profile_and_level = 0x4A ; /* MP@LL */
pic->progressive_sequence = 1;
pic->low_delay = 0;
pic->sequence_display_extension_flag = 0;
for ( i = 0 ; i < 4 ; i++ ){
pic->frame_centre_horizontal_offset[i] = 0;
pic->frame_centre_vertical_offset[i] = 0;
}
pic->last_frame_centre_horizontal_offset = 0;
pic->last_frame_centre_vertical_offset = 0;
pic->picture_display_extension_flag[0] = 0;
pic->picture_display_extension_flag[1] = 0;
pic->sequence_header_flag = 0;
pic->gop_flag = 0;
pic->sequence_end_flag = 0;
}
#endif
#if 0
static void mpg_set_picture_parameter( int32_t field_type, struct mpg_picture *pic )
{
int16_t last_h_offset;
int16_t last_v_offset;
int16_t *p_h_offset;
int16_t *p_v_offset;
if ( pic->mpeg1_flag ){
pic->picture_structure[field_type] = VIDEO_FRAME_PICTURE;
pic->top_field_first = 0;
pic->repeat_first_field = 0;
pic->progressive_frame = 1;
pic->picture_coding_parameter = 0x000010;
}
/* Reset flag */
pic->picture_display_extension_flag[field_type] = 0;
last_h_offset = pic->last_frame_centre_horizontal_offset;
last_v_offset = pic->last_frame_centre_vertical_offset;
if ( field_type == FIRST_FIELD ){
p_h_offset = pic->frame_centre_horizontal_offset;
p_v_offset = pic->frame_centre_vertical_offset;
*p_h_offset = last_h_offset;
*(p_h_offset + 1) = last_h_offset;
*(p_h_offset + 2) = last_h_offset;
*p_v_offset = last_v_offset;
*(p_v_offset + 1) = last_v_offset;
*(p_v_offset + 2) = last_v_offset;
} else {
pic->frame_centre_horizontal_offset[3] = last_h_offset;
pic->frame_centre_vertical_offset[3] = last_v_offset;
}
}
#endif
#if 0
static void init_mpg_picture( struct mpg_picture *pic, int chan, int32_t field_type)
{
pic->picture_header = 0;
pic->sequence_header_data
= ( INIT_HORIZONTAL_SIZE << 20 )
| ( INIT_VERTICAL_SIZE << 8 )
| ( INIT_ASPECT_RATIO << 4 )
| ( INIT_FRAME_RATE );
pic->mpeg1_flag = 0;
pic->vinfo.horizontal_size
= INIT_DISP_HORIZONTAL_SIZE;
pic->vinfo.vertical_size
= INIT_DISP_VERTICAL_SIZE;
pic->picture_display_extension_flag[field_type]
= 0;
pic->pts_flag[field_type] = 0;
pic->sequence_gop_header = 0;
pic->picture_header = 0;
pic->sequence_header_flag = 0;
pic->gop_flag = 0;
pic->sequence_end_flag = 0;
pic->sequence_display_extension_flag = 0;
pic->last_frame_centre_horizontal_offset = 0;
pic->last_frame_centre_vertical_offset = 0;
pic->channel = chan;
}
#endif
void dvb_filter_pes2ts_init(struct dvb_filter_pes2ts *p2ts, unsigned short pid,
dvb_filter_pes2ts_cb_t *cb, void *priv)
{
unsigned char *buf=p2ts->buf;
buf[0]=0x47;
buf[1]=(pid>>8);
buf[2]=pid&0xff;
p2ts->cc=0;
p2ts->cb=cb;
p2ts->priv=priv;
}
EXPORT_SYMBOL(dvb_filter_pes2ts_init);
int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes,
int len, int payload_start)
{
unsigned char *buf=p2ts->buf;
int ret=0, rest;
//len=6+((pes[4]<<8)|pes[5]);
if (payload_start)
buf[1]|=0x40;
else
buf[1]&=~0x40;
while (len>=184) {
buf[3]=0x10|((p2ts->cc++)&0x0f);
memcpy(buf+4, pes, 184);
if ((ret=p2ts->cb(p2ts->priv, buf)))
return ret;
len-=184; pes+=184;
buf[1]&=~0x40;
}
if (!len)
return 0;
buf[3]=0x30|((p2ts->cc++)&0x0f);
rest=183-len;
if (rest) {
buf[5]=0x00;
if (rest-1)
memset(buf+6, 0xff, rest-1);
}
buf[4]=rest;
memcpy(buf+5+rest, pes, len);
return p2ts->cb(p2ts->priv, buf);
}
EXPORT_SYMBOL(dvb_filter_pes2ts);

View File

@ -28,6 +28,8 @@
/* Enables DVBv3 compatibility bits at the headers */ /* Enables DVBv3 compatibility bits at the headers */
#define __DVB_CORE__ #define __DVB_CORE__
#define pr_fmt(fmt) "dvb_frontend: " fmt
#include <linux/string.h> #include <linux/string.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
@ -67,6 +69,9 @@ MODULE_PARM_DESC(dvb_powerdown_on_sleep, "0: do not power down, 1: turn LNB volt
module_param(dvb_mfe_wait_time, int, 0644); module_param(dvb_mfe_wait_time, int, 0644);
MODULE_PARM_DESC(dvb_mfe_wait_time, "Wait up to <mfe_wait_time> seconds on open() for multi-frontend to become available (default:5 seconds)"); MODULE_PARM_DESC(dvb_mfe_wait_time, "Wait up to <mfe_wait_time> seconds on open() for multi-frontend to become available (default:5 seconds)");
#define dprintk(fmt, arg...) \
printk(KERN_DEBUG pr_fmt("%s: " fmt), __func__, ##arg)
#define FESTATE_IDLE 1 #define FESTATE_IDLE 1
#define FESTATE_RETUNE 2 #define FESTATE_RETUNE 2
#define FESTATE_TUNING_FAST 4 #define FESTATE_TUNING_FAST 4
@ -99,8 +104,6 @@ MODULE_PARM_DESC(dvb_mfe_wait_time, "Wait up to <mfe_wait_time> seconds on open(
static DEFINE_MUTEX(frontend_mutex); static DEFINE_MUTEX(frontend_mutex);
struct dvb_frontend_private { struct dvb_frontend_private {
struct kref refcount;
/* thread/frontend values */ /* thread/frontend values */
struct dvb_device *dvbdev; struct dvb_device *dvbdev;
struct dvb_frontend_parameters parameters_out; struct dvb_frontend_parameters parameters_out;
@ -138,21 +141,30 @@ struct dvb_frontend_private {
#endif #endif
}; };
static void dvb_frontend_private_free(struct kref *ref) static void dvb_frontend_invoke_release(struct dvb_frontend *fe,
void (*release)(struct dvb_frontend *fe));
static void dvb_frontend_free(struct kref *ref)
{ {
struct dvb_frontend_private *fepriv = struct dvb_frontend *fe =
container_of(ref, struct dvb_frontend_private, refcount); container_of(ref, struct dvb_frontend, refcount);
struct dvb_frontend_private *fepriv = fe->frontend_priv;
dvb_free_device(fepriv->dvbdev);
dvb_frontend_invoke_release(fe, fe->ops.release);
kfree(fepriv); kfree(fepriv);
} }
static void dvb_frontend_private_put(struct dvb_frontend_private *fepriv) static void dvb_frontend_put(struct dvb_frontend *fe)
{ {
kref_put(&fepriv->refcount, dvb_frontend_private_free); kref_put(&fe->refcount, dvb_frontend_free);
} }
static void dvb_frontend_private_get(struct dvb_frontend_private *fepriv) static void dvb_frontend_get(struct dvb_frontend *fe)
{ {
kref_get(&fepriv->refcount); kref_get(&fe->refcount);
} }
static void dvb_frontend_wakeup(struct dvb_frontend *fe); static void dvb_frontend_wakeup(struct dvb_frontend *fe);
@ -1515,12 +1527,8 @@ static int dtv_set_frontend(struct dvb_frontend *fe);
static bool is_dvbv3_delsys(u32 delsys) static bool is_dvbv3_delsys(u32 delsys)
{ {
bool status; return (delsys == SYS_DVBT) || (delsys == SYS_DVBC_ANNEX_A) ||
(delsys == SYS_DVBS) || (delsys == SYS_ATSC);
status = (delsys == SYS_DVBT) || (delsys == SYS_DVBC_ANNEX_A) ||
(delsys == SYS_DVBS) || (delsys == SYS_ATSC);
return status;
} }
/** /**
@ -2356,7 +2364,8 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
int i; int i;
u8 last = 1; u8 last = 1;
if (dvb_frontend_debug) if (dvb_frontend_debug)
printk("%s switch command: 0x%04lx\n", __func__, swcmd); dprintk("%s switch command: 0x%04lx\n",
__func__, swcmd);
nexttime = ktime_get_boottime(); nexttime = ktime_get_boottime();
if (dvb_frontend_debug) if (dvb_frontend_debug)
tv[0] = nexttime; tv[0] = nexttime;
@ -2379,10 +2388,10 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
dvb_frontend_sleep_until(&nexttime, 8000); dvb_frontend_sleep_until(&nexttime, 8000);
} }
if (dvb_frontend_debug) { if (dvb_frontend_debug) {
printk("%s(%d): switch delay (should be 32k followed by all 8k\n", dprintk("%s(%d): switch delay (should be 32k followed by all 8k)\n",
__func__, fe->dvb->num); __func__, fe->dvb->num);
for (i = 1; i < 10; i++) for (i = 1; i < 10; i++)
printk("%d: %d\n", i, pr_info("%d: %d\n", i,
(int) ktime_us_delta(tv[i], tv[i-1])); (int) ktime_us_delta(tv[i], tv[i-1]));
} }
err = 0; err = 0;
@ -2545,7 +2554,7 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
fepriv->events.eventr = fepriv->events.eventw = 0; fepriv->events.eventr = fepriv->events.eventw = 0;
} }
dvb_frontend_private_get(fepriv); dvb_frontend_get(fe);
if (adapter->mfe_shared) if (adapter->mfe_shared)
mutex_unlock (&adapter->mfe_lock); mutex_unlock (&adapter->mfe_lock);
@ -2595,7 +2604,7 @@ static int dvb_frontend_release(struct inode *inode, struct file *file)
fe->ops.ts_bus_ctrl(fe, 0); fe->ops.ts_bus_ctrl(fe, 0);
} }
dvb_frontend_private_put(fepriv); dvb_frontend_put(fe);
return ret; return ret;
} }
@ -2685,7 +2694,14 @@ int dvb_register_frontend(struct dvb_adapter* dvb,
} }
fepriv = fe->frontend_priv; fepriv = fe->frontend_priv;
kref_init(&fepriv->refcount); kref_init(&fe->refcount);
/*
* After initialization, there need to be two references: one
* for dvb_unregister_frontend(), and another one for
* dvb_frontend_detach().
*/
dvb_frontend_get(fe);
sema_init(&fepriv->sem, 1); sema_init(&fepriv->sem, 1);
init_waitqueue_head (&fepriv->wait_queue); init_waitqueue_head (&fepriv->wait_queue);
@ -2720,50 +2736,33 @@ int dvb_unregister_frontend(struct dvb_frontend* fe)
dev_dbg(fe->dvb->device, "%s:\n", __func__); dev_dbg(fe->dvb->device, "%s:\n", __func__);
mutex_lock(&frontend_mutex); mutex_lock(&frontend_mutex);
dvb_frontend_stop (fe); dvb_frontend_stop(fe);
dvb_unregister_device (fepriv->dvbdev); dvb_remove_device(fepriv->dvbdev);
/* fe is invalid now */ /* fe is invalid now */
mutex_unlock(&frontend_mutex); mutex_unlock(&frontend_mutex);
dvb_frontend_private_put(fepriv); dvb_frontend_put(fe);
return 0; return 0;
} }
EXPORT_SYMBOL(dvb_unregister_frontend); EXPORT_SYMBOL(dvb_unregister_frontend);
static void dvb_frontend_invoke_release(struct dvb_frontend *fe,
void (*release)(struct dvb_frontend *fe))
{
if (release) {
release(fe);
#ifdef CONFIG_MEDIA_ATTACH #ifdef CONFIG_MEDIA_ATTACH
void dvb_frontend_detach(struct dvb_frontend* fe) dvb_detach(release);
{
void *ptr;
if (fe->ops.release_sec) {
fe->ops.release_sec(fe);
dvb_detach(fe->ops.release_sec);
}
if (fe->ops.tuner_ops.release) {
fe->ops.tuner_ops.release(fe);
dvb_detach(fe->ops.tuner_ops.release);
}
if (fe->ops.analog_ops.release) {
fe->ops.analog_ops.release(fe);
dvb_detach(fe->ops.analog_ops.release);
}
ptr = (void*)fe->ops.release;
if (ptr) {
fe->ops.release(fe);
dvb_detach(ptr);
}
}
#else
void dvb_frontend_detach(struct dvb_frontend* fe)
{
if (fe->ops.release_sec)
fe->ops.release_sec(fe);
if (fe->ops.tuner_ops.release)
fe->ops.tuner_ops.release(fe);
if (fe->ops.analog_ops.release)
fe->ops.analog_ops.release(fe);
if (fe->ops.release)
fe->ops.release(fe);
}
#endif #endif
}
}
void dvb_frontend_detach(struct dvb_frontend* fe)
{
dvb_frontend_invoke_release(fe, fe->ops.release_sec);
dvb_frontend_invoke_release(fe, fe->ops.tuner_ops.release);
dvb_frontend_invoke_release(fe, fe->ops.analog_ops.release);
dvb_frontend_invoke_release(fe, fe->ops.detach);
dvb_frontend_put(fe);
}
EXPORT_SYMBOL(dvb_frontend_detach); EXPORT_SYMBOL(dvb_frontend_detach);

View File

@ -225,7 +225,7 @@ struct dvb_tuner_ops {
struct dvb_tuner_info info; struct dvb_tuner_info info;
int (*release)(struct dvb_frontend *fe); void (*release)(struct dvb_frontend *fe);
int (*init)(struct dvb_frontend *fe); int (*init)(struct dvb_frontend *fe);
int (*sleep)(struct dvb_frontend *fe); int (*sleep)(struct dvb_frontend *fe);
int (*suspend)(struct dvb_frontend *fe); int (*suspend)(struct dvb_frontend *fe);
@ -323,7 +323,11 @@ struct dtv_frontend_properties;
* *
* @info: embedded struct dvb_tuner_info with tuner properties * @info: embedded struct dvb_tuner_info with tuner properties
* @delsys: Delivery systems supported by the frontend * @delsys: Delivery systems supported by the frontend
* @release: callback function called when frontend is dettached. * @detach: callback function called when frontend is detached.
* drivers should clean up, but not yet free the struct
* dvb_frontend allocation.
* @release: callback function called when frontend is ready to be
* freed.
* drivers should free any allocated memory. * drivers should free any allocated memory.
* @release_sec: callback function requesting that the Satelite Equipment * @release_sec: callback function requesting that the Satelite Equipment
* Control (SEC) driver to release and free any memory * Control (SEC) driver to release and free any memory
@ -408,6 +412,7 @@ struct dvb_frontend_ops {
u8 delsys[MAX_DELSYS]; u8 delsys[MAX_DELSYS];
void (*detach)(struct dvb_frontend *fe);
void (*release)(struct dvb_frontend* fe); void (*release)(struct dvb_frontend* fe);
void (*release_sec)(struct dvb_frontend* fe); void (*release_sec)(struct dvb_frontend* fe);
@ -655,6 +660,7 @@ struct dtv_frontend_properties {
*/ */
struct dvb_frontend { struct dvb_frontend {
struct kref refcount;
struct dvb_frontend_ops ops; struct dvb_frontend_ops ops;
struct dvb_adapter *dvb; struct dvb_adapter *dvb;
void *demodulator_priv; void *demodulator_priv;

File diff suppressed because it is too large Load Diff

View File

@ -21,6 +21,8 @@
* *
*/ */
#define pr_fmt(fmt) "dvbdev: " fmt
#include <linux/types.h> #include <linux/types.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/string.h> #include <linux/string.h>
@ -43,7 +45,11 @@ static int dvbdev_debug;
module_param(dvbdev_debug, int, 0644); module_param(dvbdev_debug, int, 0644);
MODULE_PARM_DESC(dvbdev_debug, "Turn on/off device debugging (default:off)."); MODULE_PARM_DESC(dvbdev_debug, "Turn on/off device debugging (default:off).");
#define dprintk if (dvbdev_debug) printk #define dprintk(fmt, arg...) do { \
if (dvbdev_debug) \
printk(KERN_DEBUG pr_fmt("%s: " fmt), \
__func__, ##arg); \
} while (0)
static LIST_HEAD(dvb_adapter_list); static LIST_HEAD(dvb_adapter_list);
static DEFINE_MUTEX(dvbdev_register_lock); static DEFINE_MUTEX(dvbdev_register_lock);
@ -354,7 +360,7 @@ static int dvb_create_media_entity(struct dvb_device *dvbdev,
if (ret) if (ret)
return ret; return ret;
printk(KERN_DEBUG "%s: media entity '%s' registered.\n", pr_info("%s: media entity '%s' registered.\n",
__func__, dvbdev->entity->name); __func__, dvbdev->entity->name);
return 0; return 0;
@ -438,7 +444,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
if ((id = dvbdev_get_free_id (adap, type)) < 0){ if ((id = dvbdev_get_free_id (adap, type)) < 0){
mutex_unlock(&dvbdev_register_lock); mutex_unlock(&dvbdev_register_lock);
*pdvbdev = NULL; *pdvbdev = NULL;
printk(KERN_ERR "%s: couldn't find free device id\n", __func__); pr_err("%s: couldn't find free device id\n", __func__);
return -ENFILE; return -ENFILE;
} }
@ -493,8 +499,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
ret = dvb_register_media_device(dvbdev, type, minor, demux_sink_pads); ret = dvb_register_media_device(dvbdev, type, minor, demux_sink_pads);
if (ret) { if (ret) {
printk(KERN_ERR pr_err("%s: dvb_register_media_device failed to create the mediagraph\n",
"%s: dvb_register_media_device failed to create the mediagraph\n",
__func__); __func__);
dvb_media_device_free(dvbdev); dvb_media_device_free(dvbdev);
@ -511,11 +516,11 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
MKDEV(DVB_MAJOR, minor), MKDEV(DVB_MAJOR, minor),
dvbdev, "dvb%d.%s%d", adap->num, dnames[type], id); dvbdev, "dvb%d.%s%d", adap->num, dnames[type], id);
if (IS_ERR(clsdev)) { if (IS_ERR(clsdev)) {
printk(KERN_ERR "%s: failed to create device dvb%d.%s%d (%ld)\n", pr_err("%s: failed to create device dvb%d.%s%d (%ld)\n",
__func__, adap->num, dnames[type], id, PTR_ERR(clsdev)); __func__, adap->num, dnames[type], id, PTR_ERR(clsdev));
return PTR_ERR(clsdev); return PTR_ERR(clsdev);
} }
dprintk(KERN_DEBUG "DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n", dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
adap->num, dnames[type], id, minor, minor); adap->num, dnames[type], id, minor, minor);
return 0; return 0;
@ -523,7 +528,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
EXPORT_SYMBOL(dvb_register_device); EXPORT_SYMBOL(dvb_register_device);
void dvb_unregister_device(struct dvb_device *dvbdev) void dvb_remove_device(struct dvb_device *dvbdev)
{ {
if (!dvbdev) if (!dvbdev)
return; return;
@ -537,9 +542,26 @@ void dvb_unregister_device(struct dvb_device *dvbdev)
device_destroy(dvb_class, MKDEV(DVB_MAJOR, dvbdev->minor)); device_destroy(dvb_class, MKDEV(DVB_MAJOR, dvbdev->minor));
list_del (&dvbdev->list_head); list_del (&dvbdev->list_head);
}
EXPORT_SYMBOL(dvb_remove_device);
void dvb_free_device(struct dvb_device *dvbdev)
{
if (!dvbdev)
return;
kfree (dvbdev->fops); kfree (dvbdev->fops);
kfree (dvbdev); kfree (dvbdev);
} }
EXPORT_SYMBOL(dvb_free_device);
void dvb_unregister_device(struct dvb_device *dvbdev)
{
dvb_remove_device(dvbdev);
dvb_free_device(dvbdev);
}
EXPORT_SYMBOL(dvb_unregister_device); EXPORT_SYMBOL(dvb_unregister_device);
@ -808,7 +830,7 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name,
memset (adap, 0, sizeof(struct dvb_adapter)); memset (adap, 0, sizeof(struct dvb_adapter));
INIT_LIST_HEAD (&adap->device_list); INIT_LIST_HEAD (&adap->device_list);
printk(KERN_INFO "DVB: registering new adapter (%s)\n", name); pr_info("DVB: registering new adapter (%s)\n", name);
adap->num = num; adap->num = num;
adap->name = name; adap->name = name;
@ -926,13 +948,13 @@ static int __init init_dvbdev(void)
dev_t dev = MKDEV(DVB_MAJOR, 0); dev_t dev = MKDEV(DVB_MAJOR, 0);
if ((retval = register_chrdev_region(dev, MAX_DVB_MINORS, "DVB")) != 0) { if ((retval = register_chrdev_region(dev, MAX_DVB_MINORS, "DVB")) != 0) {
printk(KERN_ERR "dvb-core: unable to get major %d\n", DVB_MAJOR); pr_err("dvb-core: unable to get major %d\n", DVB_MAJOR);
return retval; return retval;
} }
cdev_init(&dvb_device_cdev, &dvb_device_fops); cdev_init(&dvb_device_cdev, &dvb_device_fops);
if ((retval = cdev_add(&dvb_device_cdev, dev, MAX_DVB_MINORS)) != 0) { if ((retval = cdev_add(&dvb_device_cdev, dev, MAX_DVB_MINORS)) != 0) {
printk(KERN_ERR "dvb-core: unable register character device\n"); pr_err("dvb-core: unable register character device\n");
goto error; goto error;
} }

View File

@ -34,7 +34,7 @@
#if defined(CONFIG_DVB_MAX_ADAPTERS) && CONFIG_DVB_MAX_ADAPTERS > 0 #if defined(CONFIG_DVB_MAX_ADAPTERS) && CONFIG_DVB_MAX_ADAPTERS > 0
#define DVB_MAX_ADAPTERS CONFIG_DVB_MAX_ADAPTERS #define DVB_MAX_ADAPTERS CONFIG_DVB_MAX_ADAPTERS
#else #else
#define DVB_MAX_ADAPTERS 8 #define DVB_MAX_ADAPTERS 16
#endif #endif
#define DVB_UNSET (-1) #define DVB_UNSET (-1)
@ -211,9 +211,32 @@ int dvb_register_device(struct dvb_adapter *adap,
int type, int type,
int demux_sink_pads); int demux_sink_pads);
/**
* dvb_remove_device - Remove a registered DVB device
*
* This does not free memory. To do that, call dvb_free_device().
*
* @dvbdev: pointer to struct dvb_device
*/
void dvb_remove_device(struct dvb_device *dvbdev);
/**
* dvb_free_device - Free memory occupied by a DVB device.
*
* Call dvb_unregister_device() before calling this function.
*
* @dvbdev: pointer to struct dvb_device
*/
void dvb_free_device(struct dvb_device *dvbdev);
/** /**
* dvb_unregister_device - Unregisters a DVB device * dvb_unregister_device - Unregisters a DVB device
* *
* This is a combination of dvb_remove_device() and dvb_free_device().
* Using this function is usually a mistake, and is often an indicator
* for a use-after-free bug (when a userspace process keeps a file
* handle to a detached device).
*
* @dvbdev: pointer to struct dvb_device * @dvbdev: pointer to struct dvb_device
*/ */
void dvb_unregister_device(struct dvb_device *dvbdev); void dvb_unregister_device(struct dvb_device *dvbdev);

View File

@ -642,7 +642,7 @@ config DVB_S5H1409
to support this frontend. to support this frontend.
config DVB_AU8522 config DVB_AU8522
depends on I2C depends on DVB_CORE && I2C
tristate tristate
config DVB_AU8522_DTV config DVB_AU8522_DTV
@ -656,7 +656,7 @@ config DVB_AU8522_DTV
config DVB_AU8522_V4L config DVB_AU8522_V4L
tristate "Auvitek AU8522 based ATV demod" tristate "Auvitek AU8522 based ATV demod"
depends on VIDEO_V4L2 && I2C depends on VIDEO_V4L2 && DVB_CORE && I2C
select DVB_AU8522 select DVB_AU8522
default m if !MEDIA_SUBDRV_AUTOSELECT default m if !MEDIA_SUBDRV_AUTOSELECT
help help
@ -722,7 +722,7 @@ config DVB_PLL
config DVB_TUNER_DIB0070 config DVB_TUNER_DIB0070
tristate "DiBcom DiB0070 silicon base-band tuner" tristate "DiBcom DiB0070 silicon base-band tuner"
depends on I2C depends on DVB_CORE && I2C
default m if !MEDIA_SUBDRV_AUTOSELECT default m if !MEDIA_SUBDRV_AUTOSELECT
help help
A driver for the silicon baseband tuner DiB0070 from DiBcom. A driver for the silicon baseband tuner DiB0070 from DiBcom.
@ -731,7 +731,7 @@ config DVB_TUNER_DIB0070
config DVB_TUNER_DIB0090 config DVB_TUNER_DIB0090
tristate "DiBcom DiB0090 silicon base-band tuner" tristate "DiBcom DiB0090 silicon base-band tuner"
depends on I2C depends on DVB_CORE && I2C
default m if !MEDIA_SUBDRV_AUTOSELECT default m if !MEDIA_SUBDRV_AUTOSELECT
help help
A driver for the silicon baseband tuner DiB0090 from DiBcom. A driver for the silicon baseband tuner DiB0090 from DiBcom.
@ -879,5 +879,6 @@ comment "Tools to develop new frontends"
config DVB_DUMMY_FE config DVB_DUMMY_FE
tristate "Dummy frontend driver" tristate "Dummy frontend driver"
depends on DVB_CORE
default n default n
endmenu endmenu

View File

@ -1351,7 +1351,7 @@ static void af9013_release(struct dvb_frontend *fe)
kfree(state); kfree(state);
} }
static struct dvb_frontend_ops af9013_ops; static const struct dvb_frontend_ops af9013_ops;
static int af9013_download_firmware(struct af9013_state *state) static int af9013_download_firmware(struct af9013_state *state)
{ {
@ -1516,7 +1516,7 @@ err:
} }
EXPORT_SYMBOL(af9013_attach); EXPORT_SYMBOL(af9013_attach);
static struct dvb_frontend_ops af9013_ops = { static const struct dvb_frontend_ops af9013_ops = {
.delsys = { SYS_DVBT }, .delsys = { SYS_DVBT },
.info = { .info = {
.name = "Afatech AF9013", .name = "Afatech AF9013",

View File

@ -1198,7 +1198,7 @@ err:
return ret; return ret;
} }
static struct dvb_frontend_ops af9033_ops = { static const struct dvb_frontend_ops af9033_ops = {
.delsys = { SYS_DVBT }, .delsys = { SYS_DVBT },
.info = { .info = {
.name = "Afatech AF9033 (DVB-T)", .name = "Afatech AF9033 (DVB-T)",

View File

@ -415,7 +415,7 @@ static void as102_fe_release(struct dvb_frontend *fe)
} }
static struct dvb_frontend_ops as102_fe_ops = { static const struct dvb_frontend_ops as102_fe_ops = {
.delsys = { SYS_DVBT }, .delsys = { SYS_DVBT },
.info = { .info = {
.name = "Abilis AS102 DVB-T", .name = "Abilis AS102 DVB-T",

View File

@ -254,14 +254,13 @@ static int ascot2e_init(struct dvb_frontend *fe)
return ascot2e_leave_power_save(priv); return ascot2e_leave_power_save(priv);
} }
static int ascot2e_release(struct dvb_frontend *fe) static void ascot2e_release(struct dvb_frontend *fe)
{ {
struct ascot2e_priv *priv = fe->tuner_priv; struct ascot2e_priv *priv = fe->tuner_priv;
dev_dbg(&priv->i2c->dev, "%s()\n", __func__); dev_dbg(&priv->i2c->dev, "%s()\n", __func__);
kfree(fe->tuner_priv); kfree(fe->tuner_priv);
fe->tuner_priv = NULL; fe->tuner_priv = NULL;
return 0;
} }
static int ascot2e_sleep(struct dvb_frontend *fe) static int ascot2e_sleep(struct dvb_frontend *fe)

View File

@ -428,7 +428,7 @@ static int atbm8830_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
return atbm8830_write_reg(priv, REG_I2C_GATE, enable ? 1 : 0); return atbm8830_write_reg(priv, REG_I2C_GATE, enable ? 1 : 0);
} }
static struct dvb_frontend_ops atbm8830_ops = { static const struct dvb_frontend_ops atbm8830_ops = {
.delsys = { SYS_DTMB }, .delsys = { SYS_DTMB },
.info = { .info = {
.name = "AltoBeam ATBM8830/8831 DMB-TH", .name = "AltoBeam ATBM8830/8831 DMB-TH",

View File

@ -50,8 +50,8 @@ int au8522_writereg(struct au8522_state *state, u16 reg, u8 data)
ret = i2c_transfer(state->i2c, &msg, 1); ret = i2c_transfer(state->i2c, &msg, 1);
if (ret != 1) if (ret != 1)
printk("%s: writereg error (reg == 0x%02x, val == 0x%04x, " printk("%s: writereg error (reg == 0x%02x, val == 0x%04x, ret == %i)\n",
"ret == %i)\n", __func__, reg, data, ret); __func__, reg, data, ret);
return (ret != 1) ? -1 : 0; return (ret != 1) ? -1 : 0;
} }

View File

@ -834,7 +834,7 @@ static int au8522_get_tune_settings(struct dvb_frontend *fe,
return 0; return 0;
} }
static struct dvb_frontend_ops au8522_ops; static const struct dvb_frontend_ops au8522_ops;
static void au8522_release(struct dvb_frontend *fe) static void au8522_release(struct dvb_frontend *fe)
@ -894,7 +894,7 @@ error:
} }
EXPORT_SYMBOL(au8522_attach); EXPORT_SYMBOL(au8522_attach);
static struct dvb_frontend_ops au8522_ops = { static const struct dvb_frontend_ops au8522_ops = {
.delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B }, .delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
.info = { .info = {
.name = "Auvitek AU8522 QAM/8VSB Frontend", .name = "Auvitek AU8522 QAM/8VSB Frontend",

View File

@ -788,7 +788,7 @@ static int bcm3510_init(struct dvb_frontend* fe)
} }
static struct dvb_frontend_ops bcm3510_ops; static const struct dvb_frontend_ops bcm3510_ops;
struct dvb_frontend* bcm3510_attach(const struct bcm3510_config *config, struct dvb_frontend* bcm3510_attach(const struct bcm3510_config *config,
struct i2c_adapter *i2c) struct i2c_adapter *i2c)
@ -834,7 +834,7 @@ error:
} }
EXPORT_SYMBOL(bcm3510_attach); EXPORT_SYMBOL(bcm3510_attach);
static struct dvb_frontend_ops bcm3510_ops = { static const struct dvb_frontend_ops bcm3510_ops = {
.delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B }, .delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
.info = { .info = {
.name = "Broadcom BCM3510 VSB/QAM frontend", .name = "Broadcom BCM3510 VSB/QAM frontend",

View File

@ -380,7 +380,7 @@ static void cx22700_release(struct dvb_frontend* fe)
kfree(state); kfree(state);
} }
static struct dvb_frontend_ops cx22700_ops; static const struct dvb_frontend_ops cx22700_ops;
struct dvb_frontend* cx22700_attach(const struct cx22700_config* config, struct dvb_frontend* cx22700_attach(const struct cx22700_config* config,
struct i2c_adapter* i2c) struct i2c_adapter* i2c)
@ -408,7 +408,7 @@ error:
return NULL; return NULL;
} }
static struct dvb_frontend_ops cx22700_ops = { static const struct dvb_frontend_ops cx22700_ops = {
.delsys = { SYS_DVBT }, .delsys = { SYS_DVBT },
.info = { .info = {
.name = "Conexant CX22700 DVB-T", .name = "Conexant CX22700 DVB-T",

View File

@ -120,8 +120,8 @@ static int cx24110_writereg (struct cx24110_state* state, int reg, int data)
int err; int err;
if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) { if ((err = i2c_transfer(state->i2c, &msg, 1)) != 1) {
dprintk ("%s: writereg error (err == %i, reg == 0x%02x," dprintk("%s: writereg error (err == %i, reg == 0x%02x, data == 0x%02x)\n",
" data == 0x%02x)\n", __func__, err, reg, data); __func__, err, reg, data);
return -EREMOTEIO; return -EREMOTEIO;
} }
@ -592,7 +592,7 @@ static void cx24110_release(struct dvb_frontend* fe)
kfree(state); kfree(state);
} }
static struct dvb_frontend_ops cx24110_ops; static const struct dvb_frontend_ops cx24110_ops;
struct dvb_frontend* cx24110_attach(const struct cx24110_config* config, struct dvb_frontend* cx24110_attach(const struct cx24110_config* config,
struct i2c_adapter* i2c) struct i2c_adapter* i2c)
@ -625,7 +625,7 @@ error:
return NULL; return NULL;
} }
static struct dvb_frontend_ops cx24110_ops = { static const struct dvb_frontend_ops cx24110_ops = {
.delsys = { SYS_DVBS }, .delsys = { SYS_DVBS },
.info = { .info = {
.name = "Conexant CX24110 DVB-S", .name = "Conexant CX24110 DVB-S",

View File

@ -108,8 +108,8 @@ static int cx24113_writereg(struct cx24113_state *state, int reg, int data)
.flags = 0, .buf = buf, .len = 2 }; .flags = 0, .buf = buf, .len = 2 };
int err = i2c_transfer(state->i2c, &msg, 1); int err = i2c_transfer(state->i2c, &msg, 1);
if (err != 1) { if (err != 1) {
printk(KERN_DEBUG "%s: writereg error(err == %i, reg == 0x%02x," printk(KERN_DEBUG "%s: writereg error(err == %i, reg == 0x%02x, data == 0x%02x)\n",
" data == 0x%02x)\n", __func__, err, reg, data); __func__, err, reg, data);
return err; return err;
} }
@ -527,13 +527,12 @@ static int cx24113_get_frequency(struct dvb_frontend *fe, u32 *frequency)
return 0; return 0;
} }
static int cx24113_release(struct dvb_frontend *fe) static void cx24113_release(struct dvb_frontend *fe)
{ {
struct cx24113_state *state = fe->tuner_priv; struct cx24113_state *state = fe->tuner_priv;
dprintk("\n"); dprintk("\n");
fe->tuner_priv = NULL; fe->tuner_priv = NULL;
kfree(state); kfree(state);
return 0;
} }
static const struct dvb_tuner_ops cx24113_tuner_ops = { static const struct dvb_tuner_ops cx24113_tuner_ops = {

Some files were not shown because too many files have changed in this diff Show More