mirror of https://gitee.com/openkylin/linux.git
media updates for v4.16-rc1
-----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJacX62AAoJEAhfPr2O5OEVjKYP/R3v+c8ztiHzaeibcZZ8IFNl 58E0Y0yGa8OpoGJx9uqtEOamQmZoHhACfId7joIp/Jv38bgWAdbxOmk3Y4FDCFqG 1bRrpnnmvlfabiMMfLpURLqKhf7rJMtErZkrnmmqg9P/lEMohaZUJAsgBZNfJM8l fZeacSnCSpzlxVcUb9Bf4vWhLk39R+xFzvFrwzbVUIHf3bDVpf4S4kNorMkhSZSF HaISYXqVMhpKca7CngVKytbfacUStUY01cXcjdMuB/sD7ySwdtKogbPMvrOSaexz G/8MB+sGT1JKUgIlh6Qv8hX805KuxBgfP19XSOH46nNU8KbYegdGhN5QXlokwI1m dAOiozkU93r5yBZl6QzkN3uwXe492PoLgczifg97pzAJP0BfWeFStkYqlugLTwwC Slmr7g3FZVJajbPl6WyioAGW7xfqBF7ftScZOHYxmhy41CWCGKJctmsJOjncyz5O GInEIP3KR4CgjR+iM1LoKvE+OvVo4kRc7hrcUsjQNsbfBn6xiixjwH+5M+UVvezA 6UQpmtWGg4pX1djb8j8f6mKF8KZM12Pp3jb4Rl1cLsytN5BOBKaMEKdV3rgL+19P Yo0x/1wK/unkI20Om71vYyQ0nXVF9j7Tpeij5u0M57TeTVYCwloQgHmrcvQJdo8+ Pqw5XEUiDpAIjvKp0XGh =H9AS -----END PGP SIGNATURE----- Merge tag 'media/v4.16-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media Pull media updates from Mauro Carvalho Chehab: - videobuf2 was moved to a media/common dir, as it is now used by the DVB subsystem too - Digital TV core memory mapped support interface - new sensor driver: ov7740 - several improvements at ddbridge driver - new V4L2 driver: IPU3 CIO2 CSI-2 receiver unit, found on some Intel SoCs - new tuner driver: tda18250 - finally got rid of all LIRC staging drivers - as we don't have old lirc drivers anymore, restruct the lirc device code - add support for UVC metadata - add a new staging driver for NVIDIA Tegra Video Decoder Engine - DVB kAPI headers moved to include/media - synchronize the kAPI and uAPI for the DVB subsystem, removing the gap for non-legacy APIs - reduce the kAPI gap for V4L2 - lots of other driver enhancements, cleanups, etc. * tag 'media/v4.16-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (407 commits) media: v4l2-compat-ioctl32.c: make ctrl_is_pointer work for subdevs media: v4l2-compat-ioctl32.c: refactor compat ioctl32 logic media: v4l2-compat-ioctl32.c: don't copy back the result for certain errors media: v4l2-compat-ioctl32.c: drop pr_info for unknown buffer type media: v4l2-compat-ioctl32.c: copy clip list in put_v4l2_window32 media: v4l2-compat-ioctl32.c: fix ctrl_is_pointer media: v4l2-compat-ioctl32.c: copy m.userptr in put_v4l2_plane32 media: v4l2-compat-ioctl32.c: avoid sizeof(type) media: v4l2-compat-ioctl32.c: move 'helper' functions to __get/put_v4l2_format32 media: v4l2-compat-ioctl32.c: fix the indentation media: v4l2-compat-ioctl32.c: add missing VIDIOC_PREPARE_BUF media: v4l2-ioctl.c: don't copy back the result for -ENOTTY media: v4l2-ioctl.c: use check_fmt for enum/g/s/try_fmt media: vivid: fix module load error when enabling fb and no_error_inj=1 media: dvb_demux: improve debug messages media: dvb_demux: Better handle discontinuity errors media: cxusb, dib0700: ignore XC2028_I2C_FLUSH media: ts2020: avoid integer overflows on 32 bit machines media: i2c: ov7740: use gpio/consumer.h instead of gpio.h media: entity: Add a nop variant of media_entity_cleanup ...
This commit is contained in:
commit
68c5735eaa
|
@ -4,6 +4,10 @@ The HDMI CEC GPIO module supports CEC implementations where the CEC line
|
|||
is hooked up to a pull-up GPIO line and - optionally - the HPD line is
|
||||
hooked up to another GPIO line.
|
||||
|
||||
Please note: the maximum voltage for the CEC line is 3.63V, for the HPD
|
||||
line it is 5.3V. So you may need some sort of level conversion circuitry
|
||||
when connecting them to a GPIO line.
|
||||
|
||||
Required properties:
|
||||
- compatible: value must be "cec-gpio".
|
||||
- cec-gpios: gpio that the CEC line is connected to. The line should be
|
||||
|
@ -21,7 +25,7 @@ the following property is optional:
|
|||
|
||||
Example for the Raspberry Pi 3 where the CEC line is connected to
|
||||
pin 26 aka BCM7 aka CE1 on the GPIO pin header and the HPD line is
|
||||
connected to pin 11 aka BCM17:
|
||||
connected to pin 11 aka BCM17 (some level shifter is needed for this!):
|
||||
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
|
|
|
@ -6,6 +6,8 @@ interface.
|
|||
|
||||
Required Properties:
|
||||
- compatible: value should be "micron,mt9m111"
|
||||
- clocks: reference to the master clock.
|
||||
- clock-names: shall be "mclk".
|
||||
|
||||
For further reading on port node refer to
|
||||
Documentation/devicetree/bindings/media/video-interfaces.txt.
|
||||
|
@ -16,6 +18,8 @@ Example:
|
|||
mt9m111@5d {
|
||||
compatible = "micron,mt9m111";
|
||||
reg = <0x5d>;
|
||||
clocks = <&mclk>;
|
||||
clock-names = "mclk";
|
||||
|
||||
remote = <&pxa_camera>;
|
||||
port {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
* Omnivision OV5640 MIPI CSI-2 sensor
|
||||
* Omnivision OV5640 MIPI CSI-2 / parallel sensor
|
||||
|
||||
Required Properties:
|
||||
- compatible: should be "ovti,ov5640"
|
||||
|
@ -18,7 +18,25 @@ The device node must contain one 'port' child node for its digital output
|
|||
video port, in accordance with the video interface bindings defined in
|
||||
Documentation/devicetree/bindings/media/video-interfaces.txt.
|
||||
|
||||
Example:
|
||||
OV5640 can be connected to a MIPI CSI-2 bus or a parallel bus endpoint.
|
||||
|
||||
Endpoint node required properties for CSI-2 connection are:
|
||||
- remote-endpoint: a phandle to the bus receiver's endpoint node.
|
||||
- clock-lanes: should be set to <0> (clock lane on hardware lane 0)
|
||||
- data-lanes: should be set to <1> or <1 2> (one or two CSI-2 lanes supported)
|
||||
|
||||
Endpoint node required properties for parallel connection are:
|
||||
- remote-endpoint: a phandle to the bus receiver's endpoint node.
|
||||
- bus-width: shall be set to <8> for 8 bits parallel bus
|
||||
or <10> for 10 bits parallel bus
|
||||
- data-shift: shall be set to <2> for 8 bits parallel bus
|
||||
(lines 9:2 are used) or <0> for 10 bits parallel bus
|
||||
- hsync-active: active state of the HSYNC signal, 0/1 for LOW/HIGH respectively.
|
||||
- vsync-active: active state of the VSYNC signal, 0/1 for LOW/HIGH respectively.
|
||||
- pclk-sample: sample data on rising (1) or falling (0) edge of the pixel clock
|
||||
signal.
|
||||
|
||||
Examples:
|
||||
|
||||
&i2c1 {
|
||||
ov5640: camera@3c {
|
||||
|
@ -35,6 +53,7 @@ Example:
|
|||
reset-gpios = <&gpio1 20 GPIO_ACTIVE_LOW>;
|
||||
|
||||
port {
|
||||
/* MIPI CSI-2 bus endpoint */
|
||||
ov5640_to_mipi_csi2: endpoint {
|
||||
remote-endpoint = <&mipi_csi2_from_ov5640>;
|
||||
clock-lanes = <0>;
|
||||
|
@ -43,3 +62,26 @@ Example:
|
|||
};
|
||||
};
|
||||
};
|
||||
|
||||
&i2c1 {
|
||||
ov5640: camera@3c {
|
||||
compatible = "ovti,ov5640";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_ov5640>;
|
||||
reg = <0x3c>;
|
||||
clocks = <&clk_ext_camera>;
|
||||
clock-names = "xclk";
|
||||
|
||||
port {
|
||||
/* Parallel bus endpoint */
|
||||
ov5640_to_parallel: endpoint {
|
||||
remote-endpoint = <¶llel_from_ov5640>;
|
||||
bus-width = <8>;
|
||||
data-shift = <2>; /* lines 9:2 are used */
|
||||
hsync-active = <0>;
|
||||
vsync-active = <0>;
|
||||
pclk-sample = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
* Omnivision OV7740 CMOS image sensor
|
||||
|
||||
The Omnivision OV7740 image sensor supports multiple output image
|
||||
size, such as VGA, and QVGA, CIF and any size smaller. It also
|
||||
supports the RAW RGB and YUV output formats.
|
||||
|
||||
The common video interfaces bindings (see video-interfaces.txt) should
|
||||
be used to specify link to the image data receiver. The OV7740 device
|
||||
node should contain one 'port' child node with an 'endpoint' subnode.
|
||||
|
||||
Required Properties:
|
||||
- compatible: "ovti,ov7740".
|
||||
- reg: I2C slave address of the sensor.
|
||||
- clocks: Reference to the xvclk input clock.
|
||||
- clock-names: "xvclk".
|
||||
|
||||
Optional Properties:
|
||||
- reset-gpios: Rreference to the GPIO connected to the reset_b pin,
|
||||
if any. Active low with pull-ip resistor.
|
||||
- powerdown-gpios: Reference to the GPIO connected to the pwdn pin,
|
||||
if any. Active high with pull-down resistor.
|
||||
|
||||
Endpoint node mandatory properties:
|
||||
- remote-endpoint: A phandle to the bus receiver's endpoint node.
|
||||
|
||||
Example:
|
||||
|
||||
i2c1: i2c@fc028000 {
|
||||
ov7740: camera@21 {
|
||||
compatible = "ovti,ov7740";
|
||||
reg = <0x21>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_sensor_power &pinctrl_sensor_reset>;
|
||||
clocks = <&isc>;
|
||||
clock-names = "xvclk";
|
||||
assigned-clocks = <&isc>;
|
||||
assigned-clock-rates = <24000000>;
|
||||
reset-gpios = <&pioA 43 GPIO_ACTIVE_LOW>;
|
||||
powerdown-gpios = <&pioA 44 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
port {
|
||||
ov7740_0: endpoint {
|
||||
remote-endpoint = <&isc_0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
|
@ -20,6 +20,13 @@ Mandatory properties
|
|||
is in hardware standby mode when the signal is in the low state.
|
||||
|
||||
|
||||
Optional properties
|
||||
-------------------
|
||||
|
||||
- flash-leds: See ../video-interfaces.txt
|
||||
- lens-focus: See ../video-interfaces.txt
|
||||
|
||||
|
||||
Endpoint node mandatory properties
|
||||
----------------------------------
|
||||
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
NVIDIA Tegra Video Decoder Engine
|
||||
|
||||
Required properties:
|
||||
- compatible : Must contain one of the following values:
|
||||
- "nvidia,tegra20-vde"
|
||||
- "nvidia,tegra30-vde"
|
||||
- "nvidia,tegra114-vde"
|
||||
- "nvidia,tegra124-vde"
|
||||
- "nvidia,tegra132-vde"
|
||||
- reg : Must contain an entry for each entry in reg-names.
|
||||
- reg-names : Must include the following entries:
|
||||
- sxe
|
||||
- bsev
|
||||
- mbe
|
||||
- ppe
|
||||
- mce
|
||||
- tfe
|
||||
- ppb
|
||||
- vdma
|
||||
- frameid
|
||||
- iram : Must contain phandle to the mmio-sram device node that represents
|
||||
IRAM region used by VDE.
|
||||
- interrupts : Must contain an entry for each entry in interrupt-names.
|
||||
- interrupt-names : Must include the following entries:
|
||||
- sync-token
|
||||
- bsev
|
||||
- sxe
|
||||
- clocks : Must include the following entries:
|
||||
- vde
|
||||
- resets : Must include the following entries:
|
||||
- vde
|
||||
|
||||
Example:
|
||||
|
||||
video-codec@6001a000 {
|
||||
compatible = "nvidia,tegra20-vde";
|
||||
reg = <0x6001a000 0x1000 /* Syntax Engine */
|
||||
0x6001b000 0x1000 /* Video Bitstream Engine */
|
||||
0x6001c000 0x100 /* Macroblock Engine */
|
||||
0x6001c200 0x100 /* Post-processing Engine */
|
||||
0x6001c400 0x100 /* Motion Compensation Engine */
|
||||
0x6001c600 0x100 /* Transform Engine */
|
||||
0x6001c800 0x100 /* Pixel prediction block */
|
||||
0x6001ca00 0x100 /* Video DMA */
|
||||
0x6001d800 0x300 /* Video frame controls */>;
|
||||
reg-names = "sxe", "bsev", "mbe", "ppe", "mce",
|
||||
"tfe", "ppb", "vdma", "frameid";
|
||||
iram = <&vde_pool>; /* IRAM region */
|
||||
interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>, /* Sync token interrupt */
|
||||
<GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>, /* BSE-V interrupt */
|
||||
<GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>; /* SXE interrupt */
|
||||
interrupt-names = "sync-token", "bsev", "sxe";
|
||||
clocks = <&tegra_car TEGRA20_CLK_VDE>;
|
||||
resets = <&tegra_car 61>;
|
||||
};
|
|
@ -66,6 +66,6 @@ Example:
|
|||
tpg1_out: endpoint {
|
||||
remote-endpoint = <&switch_in0>;
|
||||
};
|
||||
}:
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -54,3 +54,5 @@ ignore symbol DMX_OUT_DECODER
|
|||
ignore symbol DMX_OUT_TAP
|
||||
ignore symbol DMX_OUT_TS_TAP
|
||||
ignore symbol DMX_OUT_TSDEMUX_TAP
|
||||
|
||||
replace ioctl DMX_DQBUF dmx_qbuf
|
||||
|
|
|
@ -103,6 +103,7 @@ your driver:
|
|||
/* Low-level callbacks */
|
||||
int (*adap_enable)(struct cec_adapter *adap, bool enable);
|
||||
int (*adap_monitor_all_enable)(struct cec_adapter *adap, bool enable);
|
||||
int (*adap_monitor_pin_enable)(struct cec_adapter *adap, bool enable);
|
||||
int (*adap_log_addr)(struct cec_adapter *adap, u8 logical_addr);
|
||||
int (*adap_transmit)(struct cec_adapter *adap, u8 attempts,
|
||||
u32 signal_free_time, struct cec_msg *msg);
|
||||
|
@ -144,6 +145,19 @@ called if the CEC_CAP_MONITOR_ALL capability is set. This callback is optional
|
|||
Note that adap_monitor_all_enable must return 0 if enable is false.
|
||||
|
||||
|
||||
To enable/disable the 'monitor pin' mode:
|
||||
|
||||
.. c:function::
|
||||
int (*adap_monitor_pin_enable)(struct cec_adapter *adap, bool enable);
|
||||
|
||||
If enabled, then the adapter should be put in a mode to also monitor CEC pin
|
||||
changes. Not all hardware supports this and this function is only called if
|
||||
the CEC_CAP_MONITOR_PIN capability is set. This callback is optional
|
||||
(some hardware may always be in 'monitor pin' mode).
|
||||
|
||||
Note that adap_monitor_pin_enable must return 0 if enable is false.
|
||||
|
||||
|
||||
To program a new logical address:
|
||||
|
||||
.. c:function::
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
Digital TV Conditional Access kABI
|
||||
----------------------------------
|
||||
|
||||
.. kernel-doc:: drivers/media/dvb-core/dvb_ca_en50221.h
|
||||
.. kernel-doc:: include/media/dvb_ca_en50221.h
|
||||
|
|
|
@ -7,7 +7,7 @@ Math functions
|
|||
Provide some commonly-used math functions, usually required in order to
|
||||
estimate signal strength and signal to noise measurements in dB.
|
||||
|
||||
.. kernel-doc:: drivers/media/dvb-core/dvb_math.h
|
||||
.. kernel-doc:: include/media/dvb_math.h
|
||||
|
||||
|
||||
DVB devices
|
||||
|
@ -15,7 +15,7 @@ DVB devices
|
|||
|
||||
Those functions are responsible for handling the DVB device nodes.
|
||||
|
||||
.. kernel-doc:: drivers/media/dvb-core/dvbdev.h
|
||||
.. kernel-doc:: include/media/dvbdev.h
|
||||
|
||||
Digital TV Ring buffer
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
@ -52,4 +52,9 @@ copy it from/to userspace.
|
|||
Resetting the buffer counts as a read and write operation.
|
||||
Two or more writers must be locked against each other.
|
||||
|
||||
.. kernel-doc:: drivers/media/dvb-core/dvb_ringbuffer.h
|
||||
.. kernel-doc:: include/media/dvb_ringbuffer.h
|
||||
|
||||
Digital TV VB2 handler
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. kernel-doc:: include/media/dvb_vb2.h
|
||||
|
|
|
@ -8,7 +8,7 @@ The Kernel Digital TV Demux kABI defines a driver-internal interface for
|
|||
registering low-level, hardware specific driver to a hardware independent
|
||||
demux layer. It is only of interest for Digital TV device driver writers.
|
||||
The header file for this kABI is named ``demux.h`` and located in
|
||||
``drivers/media/dvb-core``.
|
||||
``include/media``.
|
||||
|
||||
The demux kABI should be implemented for each demux in the system. It is
|
||||
used to select the TS source of a demux and to manage the demux resources.
|
||||
|
@ -69,14 +69,14 @@ callbacks.
|
|||
Digital TV Demux device registration functions and data structures
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. kernel-doc:: drivers/media/dvb-core/dmxdev.h
|
||||
.. kernel-doc:: include/media/dmxdev.h
|
||||
|
||||
High-level Digital TV demux interface
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. kernel-doc:: drivers/media/dvb-core/dvb_demux.h
|
||||
.. kernel-doc:: include/media/dvb_demux.h
|
||||
|
||||
Driver-internal low-level hardware specific driver demux interface
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. kernel-doc:: drivers/media/dvb-core/demux.h
|
||||
.. kernel-doc:: include/media/demux.h
|
||||
|
|
|
@ -8,7 +8,7 @@ The Digital TV Frontend kABI defines a driver-internal interface for
|
|||
registering low-level, hardware specific driver to a hardware independent
|
||||
frontend layer. It is only of interest for Digital TV device driver writers.
|
||||
The header file for this API is named ``dvb_frontend.h`` and located in
|
||||
``drivers/media/dvb-core``.
|
||||
``include/media/``.
|
||||
|
||||
Demodulator driver
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
|
@ -17,7 +17,7 @@ The demodulator driver is responsible to talk with the decoding part of the
|
|||
hardware. Such driver should implement :c:type:`dvb_frontend_ops`, with
|
||||
tells what type of digital TV standards are supported, and points to a
|
||||
series of functions that allow the DVB core to command the hardware via
|
||||
the code under ``drivers/media/dvb-core/dvb_frontend.c``.
|
||||
the code under ``include/media/dvb_frontend.c``.
|
||||
|
||||
A typical example of such struct in a driver ``foo`` is::
|
||||
|
||||
|
@ -118,7 +118,7 @@ Satellite TV reception is::
|
|||
|
||||
.. |delta| unicode:: U+00394
|
||||
|
||||
The ``drivers/media/dvb-core/dvb_frontend.c`` has a kernel thread with is
|
||||
The ``include/media/dvb_frontend.c`` has a kernel thread with is
|
||||
responsible for tuning the device. It supports multiple algorithms to
|
||||
detect a channel, as defined at enum :c:func:`dvbfe_algo`.
|
||||
|
||||
|
@ -440,4 +440,4 @@ monotonic stats at the right time.
|
|||
Digital TV Frontend functions and types
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. kernel-doc:: drivers/media/dvb-core/dvb_frontend.h
|
||||
.. kernel-doc:: include/media/dvb_frontend.h
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
Digital TV Network kABI
|
||||
-----------------------
|
||||
|
||||
.. kernel-doc:: drivers/media/dvb-core/dvb_net.h
|
||||
.. kernel-doc:: include/media/dvb_net.h
|
||||
|
|
|
@ -4,11 +4,83 @@ Remote Controller devices
|
|||
Remote Controller core
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The remote controller core implements infrastructure to receive and send
|
||||
remote controller keyboard keystrokes and mouse events.
|
||||
|
||||
Every time a key is pressed on a remote controller, a scan code is produced.
|
||||
Also, on most hardware, keeping a key pressed for more than a few dozens of
|
||||
milliseconds produce a repeat key event. That's somewhat similar to what
|
||||
a normal keyboard or mouse is handled internally on Linux\ [#f1]_. So, the
|
||||
remote controller core is implemented on the top of the linux input/evdev
|
||||
interface.
|
||||
|
||||
.. [#f1]
|
||||
|
||||
The main difference is that, on keyboard events, the keyboard controller
|
||||
produces one event for a key press and another one for key release. On
|
||||
infrared-based remote controllers, there's no key release event. Instead,
|
||||
an extra code is produced to indicate key repeats.
|
||||
|
||||
However, most of the remote controllers use infrared (IR) to transmit signals.
|
||||
As there are several protocols used to modulate infrared signals, one
|
||||
important part of the core is dedicated to adjust the driver and the core
|
||||
system to support the infrared protocol used by the emitter.
|
||||
|
||||
The infrared transmission is done by blinking a infrared emitter using a
|
||||
carrier. The carrier can be switched on or off by the IR transmitter
|
||||
hardware. When the carrier is switched on, it is called *PULSE*.
|
||||
When the carrier is switched off, it is called *SPACE*.
|
||||
|
||||
In other words, a typical IR transmission can be viewed as a sequence of
|
||||
*PULSE* and *SPACE* events, each with a given duration.
|
||||
|
||||
The carrier parameters (frequency, duty cycle) and the intervals for
|
||||
*PULSE* and *SPACE* events depend on the protocol.
|
||||
For example, the NEC protocol uses a carrier of 38kHz, and transmissions
|
||||
start with a 9ms *PULSE* and a 4.5ms SPACE. It then transmits 16 bits of
|
||||
scan code, being 8 bits for address (usually it is a fixed number for a
|
||||
given remote controller), followed by 8 bits of code. A bit "1" is modulated
|
||||
with 560µs *PULSE* followed by 1690µs *SPACE* and a bit "0" is modulated
|
||||
with 560µs *PULSE* followed by 560µs *SPACE*.
|
||||
|
||||
At receiver, a simple low-pass filter can be used to convert the received
|
||||
signal in a sequence of *PULSE/SPACE* events, filtering out the carrier
|
||||
frequency. Due to that, the receiver doesn't care about the carrier's
|
||||
actual frequency parameters: all it has to do is to measure the amount
|
||||
of time it receives *PULSE/SPACE* events.
|
||||
So, a simple IR receiver hardware will just provide a sequence of timings
|
||||
for those events to the Kernel. The drivers for hardware with such kind of
|
||||
receivers are identified by ``RC_DRIVER_IR_RAW``, as defined by
|
||||
:c:type:`rc_driver_type`\ [#f2]_. Other hardware come with a
|
||||
microcontroller that decode the *PULSE/SPACE* sequence and return scan
|
||||
codes to the Kernel. Such kind of receivers are identified
|
||||
by ``RC_DRIVER_SCANCODE``.
|
||||
|
||||
.. [#f2]
|
||||
|
||||
The RC core also supports devices that have just IR emitters,
|
||||
without any receivers. Right now, all such devices work only in
|
||||
raw TX mode. Such kind of hardware is identified as
|
||||
``RC_DRIVER_IR_RAW_TX``.
|
||||
|
||||
When the RC core receives events produced by ``RC_DRIVER_IR_RAW`` IR
|
||||
receivers, it needs to decode the IR protocol, in order to obtain the
|
||||
corresponding scan code. The protocols supported by the RC core are
|
||||
defined at enum :c:type:`rc_proto`.
|
||||
|
||||
When the RC code receives a scan code (either directly, by a driver
|
||||
of the type ``RC_DRIVER_SCANCODE``, or via its IR decoders), it needs
|
||||
to convert into a Linux input event code. This is done via a mapping
|
||||
table.
|
||||
|
||||
The Kernel has support for mapping tables available on most media
|
||||
devices. It also supports loading a table in runtime, via some
|
||||
sysfs nodes. See the :ref:`RC userspace API <Remote_controllers_Intro>`
|
||||
for more details.
|
||||
|
||||
Remote controller data structures and functions
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. kernel-doc:: include/media/rc-core.h
|
||||
|
||||
.. kernel-doc:: include/media/rc-map.h
|
||||
|
||||
LIRC
|
||||
~~~~
|
||||
|
||||
.. kernel-doc:: include/media/lirc_dev.h
|
||||
|
|
|
@ -196,11 +196,18 @@ device.
|
|||
Which device is registered depends on the type argument. The following
|
||||
types exist:
|
||||
|
||||
- ``VFL_TYPE_GRABBER``: ``/dev/videoX`` for video input/output devices
|
||||
- ``VFL_TYPE_VBI``: ``/dev/vbiX`` for vertical blank data (i.e. closed captions, teletext)
|
||||
- ``VFL_TYPE_RADIO``: ``/dev/radioX`` for radio tuners
|
||||
- ``VFL_TYPE_SDR``: ``/dev/swradioX`` for Software Defined Radio tuners
|
||||
- ``VFL_TYPE_TOUCH``: ``/dev/v4l-touchX`` for touch sensors
|
||||
========================== ==================== ==============================
|
||||
:c:type:`vfl_devnode_type` Device name Usage
|
||||
========================== ==================== ==============================
|
||||
``VFL_TYPE_GRABBER`` ``/dev/videoX`` for video input/output devices
|
||||
``VFL_TYPE_VBI`` ``/dev/vbiX`` for vertical blank data (i.e.
|
||||
closed captions, teletext)
|
||||
``VFL_TYPE_RADIO`` ``/dev/radioX`` for radio tuners
|
||||
``VFL_TYPE_SUBDEV`` ``/dev/v4l-subdevX`` for V4L2 subdevices
|
||||
``VFL_TYPE_SDR`` ``/dev/swradioX`` for Software Defined Radio
|
||||
(SDR) tuners
|
||||
``VFL_TYPE_TOUCH`` ``/dev/v4l-touchX`` for touch sensors
|
||||
========================== ==================== ==============================
|
||||
|
||||
The last argument gives you a certain amount of control over the device
|
||||
device node number used (i.e. the X in ``videoX``). Normally you will pass -1
|
||||
|
|
|
@ -5,27 +5,68 @@ V4L2 events
|
|||
The V4L2 events provide a generic way to pass events to user space.
|
||||
The driver must use :c:type:`v4l2_fh` to be able to support V4L2 events.
|
||||
|
||||
Events are defined by a type and an optional ID. The ID may refer to a V4L2
|
||||
object such as a control ID. If unused, then the ID is 0.
|
||||
Events are subscribed per-filehandle. An event specification consists of a
|
||||
``type`` and is optionally associated with an object identified through the
|
||||
``id`` field. If unused, then the ``id`` is 0. So an event is uniquely
|
||||
identified by the ``(type, id)`` tuple.
|
||||
|
||||
When the user subscribes to an event the driver will allocate a number of
|
||||
kevent structs for that event. So every (type, ID) event tuple will have
|
||||
its own set of kevent structs. This guarantees that if a driver is generating
|
||||
lots of events of one type in a short time, then that will not overwrite
|
||||
events of another type.
|
||||
The :c:type:`v4l2_fh` struct has a list of subscribed events on its
|
||||
``subscribed`` field.
|
||||
|
||||
But if you get more events of one type than the number of kevents that were
|
||||
reserved, then the oldest event will be dropped and the new one added.
|
||||
When the user subscribes to an event, a :c:type:`v4l2_subscribed_event`
|
||||
struct is added to :c:type:`v4l2_fh`\ ``.subscribed``, one for every
|
||||
subscribed event.
|
||||
|
||||
Each :c:type:`v4l2_subscribed_event` struct ends with a
|
||||
:c:type:`v4l2_kevent` ringbuffer, with the size given by the caller
|
||||
of :c:func:`v4l2_event_subscribe`. This ringbuffer is used to store any events
|
||||
raised by the driver.
|
||||
|
||||
So every ``(type, ID)`` event tuple will have its own
|
||||
:c:type:`v4l2_kevent` ringbuffer. This guarantees that if a driver is
|
||||
generating lots of events of one type in a short time, then that will
|
||||
not overwrite events of another type.
|
||||
|
||||
But if you get more events of one type than the size of the
|
||||
:c:type:`v4l2_kevent` ringbuffer, then the oldest event will be dropped
|
||||
and the new one added.
|
||||
|
||||
The :c:type:`v4l2_kevent` struct links into the ``available``
|
||||
list of the :c:type:`v4l2_fh` struct so :ref:`VIDIOC_DQEVENT` will
|
||||
know which event to dequeue first.
|
||||
|
||||
Finally, if the event subscription is associated with a particular object
|
||||
such as a V4L2 control, then that object needs to know about that as well
|
||||
so that an event can be raised by that object. So the ``node`` field can
|
||||
be used to link the :c:type:`v4l2_subscribed_event` struct into a list of
|
||||
such objects.
|
||||
|
||||
So to summarize:
|
||||
|
||||
- struct :c:type:`v4l2_fh` has two lists: one of the ``subscribed`` events,
|
||||
and one of the ``available`` events.
|
||||
|
||||
- struct :c:type:`v4l2_subscribed_event` has a ringbuffer of raised
|
||||
(pending) events of that particular type.
|
||||
|
||||
- If struct :c:type:`v4l2_subscribed_event` is associated with a specific
|
||||
object, then that object will have an internal list of
|
||||
struct :c:type:`v4l2_subscribed_event` so it knows who subscribed an
|
||||
event to that object.
|
||||
|
||||
Furthermore, the internal struct :c:type:`v4l2_subscribed_event` has
|
||||
``merge()`` and ``replace()`` callbacks which drivers can set. These
|
||||
callbacks are called when a new event is raised and there is no more room.
|
||||
|
||||
The ``replace()`` callback allows you to replace the payload of the old event
|
||||
with that of the new event, merging any relevant data from the old payload
|
||||
into the new payload that replaces it. It is called when this event type has
|
||||
only one kevent struct allocated. The ``merge()`` callback allows you to merge
|
||||
the oldest event payload into that of the second-oldest event payload. It is
|
||||
called when there are two or more kevent structs allocated.
|
||||
a ringbuffer with size is one, i.e. only one event can be stored in the
|
||||
ringbuffer.
|
||||
|
||||
The ``merge()`` callback allows you to merge the oldest event payload into
|
||||
that of the second-oldest event payload. It is called when
|
||||
the ringbuffer has size is greater than one.
|
||||
|
||||
This way no status information is lost, just the intermediate steps leading
|
||||
up to that state.
|
||||
|
@ -73,7 +114,7 @@ The ops argument allows the driver to specify a number of callbacks:
|
|||
Callback Description
|
||||
======== ==============================================================
|
||||
add called when a new listener gets added (subscribing to the same
|
||||
event twice will only cause this callback to get called once)
|
||||
event twice will only cause this callback to get called once)
|
||||
del called when a listener stops listening
|
||||
replace replace event 'old' with event 'new'.
|
||||
merge merge event 'old' into event 'new'.
|
||||
|
|
|
@ -28,6 +28,36 @@ ignore define LIRC_CAN_SEND_MASK
|
|||
ignore define LIRC_CAN_REC_MASK
|
||||
ignore define LIRC_CAN_SET_REC_DUTY_CYCLE
|
||||
|
||||
# Obsolete ioctls
|
||||
|
||||
ignore ioctl LIRC_GET_LENGTH
|
||||
|
||||
# rc protocols
|
||||
|
||||
ignore symbol RC_PROTO_UNKNOWN
|
||||
ignore symbol RC_PROTO_OTHER
|
||||
ignore symbol RC_PROTO_RC5
|
||||
ignore symbol RC_PROTO_RC5X_20
|
||||
ignore symbol RC_PROTO_RC5_SZ
|
||||
ignore symbol RC_PROTO_JVC
|
||||
ignore symbol RC_PROTO_SONY12
|
||||
ignore symbol RC_PROTO_SONY15
|
||||
ignore symbol RC_PROTO_SONY20
|
||||
ignore symbol RC_PROTO_NEC
|
||||
ignore symbol RC_PROTO_NECX
|
||||
ignore symbol RC_PROTO_NEC32
|
||||
ignore symbol RC_PROTO_SANYO
|
||||
ignore symbol RC_PROTO_MCIR2_KBD
|
||||
ignore symbol RC_PROTO_MCIR2_MSE
|
||||
ignore symbol RC_PROTO_RC6_0
|
||||
ignore symbol RC_PROTO_RC6_6A_20
|
||||
ignore symbol RC_PROTO_RC6_6A_24
|
||||
ignore symbol RC_PROTO_RC6_6A_32
|
||||
ignore symbol RC_PROTO_RC6_MCE
|
||||
ignore symbol RC_PROTO_SHARP
|
||||
ignore symbol RC_PROTO_XMP
|
||||
ignore symbol RC_PROTO_CEC
|
||||
|
||||
# Undocumented macros
|
||||
|
||||
ignore define PULSE_BIT
|
||||
|
@ -40,3 +70,4 @@ ignore define LIRC_VALUE_MASK
|
|||
ignore define LIRC_MODE2_MASK
|
||||
|
||||
ignore define LIRC_MODE_RAW
|
||||
ignore define LIRC_MODE_LIRCCODE
|
||||
|
|
|
@ -0,0 +1,88 @@
|
|||
.. _DMX_EXPBUF:
|
||||
|
||||
****************
|
||||
ioctl DMX_EXPBUF
|
||||
****************
|
||||
|
||||
Name
|
||||
====
|
||||
|
||||
DMX_EXPBUF - Export a buffer as a DMABUF file descriptor.
|
||||
|
||||
.. warning:: this API is still experimental
|
||||
|
||||
|
||||
Synopsis
|
||||
========
|
||||
|
||||
.. c:function:: int ioctl( int fd, DMX_EXPBUF, struct dmx_exportbuffer *argp )
|
||||
:name: DMX_EXPBUF
|
||||
|
||||
|
||||
Arguments
|
||||
=========
|
||||
|
||||
``fd``
|
||||
File descriptor returned by :ref:`open() <dmx_fopen>`.
|
||||
|
||||
``argp``
|
||||
Pointer to struct :c:type:`dmx_exportbuffer`.
|
||||
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
This ioctl is an extension to the memory mapping I/O method.
|
||||
It can be used to export a buffer as a DMABUF file at any time after
|
||||
buffers have been allocated with the :ref:`DMX_REQBUFS` ioctl.
|
||||
|
||||
To export a buffer, applications fill struct :c:type:`dmx_exportbuffer`.
|
||||
Applications must set the ``index`` field. Valid index numbers
|
||||
range from zero to the number of buffers allocated with :ref:`DMX_REQBUFS`
|
||||
(struct :c:type:`dmx_requestbuffers` ``count``) minus one.
|
||||
Additional flags may be posted in the ``flags`` field. Refer to a manual
|
||||
for open() for details. Currently only O_CLOEXEC, O_RDONLY, O_WRONLY,
|
||||
and O_RDWR are supported.
|
||||
All other fields must be set to zero. In the
|
||||
case of multi-planar API, every plane is exported separately using
|
||||
multiple :ref:`DMX_EXPBUF` calls.
|
||||
|
||||
After calling :ref:`DMX_EXPBUF` the ``fd`` field will be set by a
|
||||
driver, on success. This is a DMABUF file descriptor. The application may
|
||||
pass it to other DMABUF-aware devices. It is recommended to close a DMABUF
|
||||
file when it is no longer used to allow the associated memory to be reclaimed.
|
||||
|
||||
|
||||
Examples
|
||||
========
|
||||
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
int buffer_export(int v4lfd, enum dmx_buf_type bt, int index, int *dmafd)
|
||||
{
|
||||
struct dmx_exportbuffer expbuf;
|
||||
|
||||
memset(&expbuf, 0, sizeof(expbuf));
|
||||
expbuf.type = bt;
|
||||
expbuf.index = index;
|
||||
if (ioctl(v4lfd, DMX_EXPBUF, &expbuf) == -1) {
|
||||
perror("DMX_EXPBUF");
|
||||
return -1;
|
||||
}
|
||||
|
||||
*dmafd = expbuf.fd;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Return Value
|
||||
============
|
||||
|
||||
On success 0 is returned, on error -1 and the ``errno`` variable is set
|
||||
appropriately. The generic error codes are described at the
|
||||
:ref:`Generic Error Codes <gen-errors>` chapter.
|
||||
|
||||
EINVAL
|
||||
A queue is not in MMAP mode or DMABUF exporting is not supported or
|
||||
``flags`` or ``index`` fields are invalid.
|
|
@ -0,0 +1,116 @@
|
|||
.. _dmx-mmap:
|
||||
|
||||
*****************
|
||||
Digital TV mmap()
|
||||
*****************
|
||||
|
||||
Name
|
||||
====
|
||||
|
||||
dmx-mmap - Map device memory into application address space
|
||||
|
||||
.. warning:: this API is still experimental
|
||||
|
||||
Synopsis
|
||||
========
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
|
||||
.. c:function:: void *mmap( void *start, size_t length, int prot, int flags, int fd, off_t offset )
|
||||
:name: dmx-mmap
|
||||
|
||||
Arguments
|
||||
=========
|
||||
|
||||
``start``
|
||||
Map the buffer to this address in the application's address space.
|
||||
When the ``MAP_FIXED`` flag is specified, ``start`` must be a
|
||||
multiple of the pagesize and mmap will fail when the specified
|
||||
address cannot be used. Use of this option is discouraged;
|
||||
applications should just specify a ``NULL`` pointer here.
|
||||
|
||||
``length``
|
||||
Length of the memory area to map. This must be a multiple of the
|
||||
DVB packet length (188, on most drivers).
|
||||
|
||||
``prot``
|
||||
The ``prot`` argument describes the desired memory protection.
|
||||
Regardless of the device type and the direction of data exchange it
|
||||
should be set to ``PROT_READ`` | ``PROT_WRITE``, permitting read
|
||||
and write access to image buffers. Drivers should support at least
|
||||
this combination of flags.
|
||||
|
||||
``flags``
|
||||
The ``flags`` parameter specifies the type of the mapped object,
|
||||
mapping options and whether modifications made to the mapped copy of
|
||||
the page are private to the process or are to be shared with other
|
||||
references.
|
||||
|
||||
``MAP_FIXED`` requests that the driver selects no other address than
|
||||
the one specified. If the specified address cannot be used,
|
||||
:ref:`mmap() <dmx-mmap>` will fail. If ``MAP_FIXED`` is specified,
|
||||
``start`` must be a multiple of the pagesize. Use of this option is
|
||||
discouraged.
|
||||
|
||||
One of the ``MAP_SHARED`` or ``MAP_PRIVATE`` flags must be set.
|
||||
``MAP_SHARED`` allows applications to share the mapped memory with
|
||||
other (e. g. child-) processes.
|
||||
|
||||
.. note::
|
||||
|
||||
The Linux Digital TV applications should not set the
|
||||
``MAP_PRIVATE``, ``MAP_DENYWRITE``, ``MAP_EXECUTABLE`` or ``MAP_ANON``
|
||||
flags.
|
||||
|
||||
``fd``
|
||||
File descriptor returned by :ref:`open() <dmx_fopen>`.
|
||||
|
||||
``offset``
|
||||
Offset of the buffer in device memory, as returned by
|
||||
:ref:`DMX_QUERYBUF` ioctl.
|
||||
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
The :ref:`mmap() <dmx-mmap>` function asks to map ``length`` bytes starting at
|
||||
``offset`` in the memory of the device specified by ``fd`` into the
|
||||
application address space, preferably at address ``start``. This latter
|
||||
address is a hint only, and is usually specified as 0.
|
||||
|
||||
Suitable length and offset parameters are queried with the
|
||||
:ref:`DMX_QUERYBUF` ioctl. Buffers must be allocated with the
|
||||
:ref:`DMX_REQBUFS` ioctl before they can be queried.
|
||||
|
||||
To unmap buffers the :ref:`munmap() <dmx-munmap>` function is used.
|
||||
|
||||
|
||||
Return Value
|
||||
============
|
||||
|
||||
On success :ref:`mmap() <dmx-mmap>` returns a pointer to the mapped buffer. On
|
||||
error ``MAP_FAILED`` (-1) is returned, and the ``errno`` variable is set
|
||||
appropriately. Possible error codes are:
|
||||
|
||||
EBADF
|
||||
``fd`` is not a valid file descriptor.
|
||||
|
||||
EACCES
|
||||
``fd`` is not open for reading and writing.
|
||||
|
||||
EINVAL
|
||||
The ``start`` or ``length`` or ``offset`` are not suitable. (E. g.
|
||||
they are too large, or not aligned on a ``PAGESIZE`` boundary.)
|
||||
|
||||
The ``flags`` or ``prot`` value is not supported.
|
||||
|
||||
No buffers have been allocated with the
|
||||
:ref:`DMX_REQBUFS` ioctl.
|
||||
|
||||
ENOMEM
|
||||
Not enough physical or virtual memory was available to complete the
|
||||
request.
|
|
@ -0,0 +1,54 @@
|
|||
.. _dmx-munmap:
|
||||
|
||||
************
|
||||
DVB munmap()
|
||||
************
|
||||
|
||||
Name
|
||||
====
|
||||
|
||||
dmx-munmap - Unmap device memory
|
||||
|
||||
.. warning:: This API is still experimental.
|
||||
|
||||
|
||||
Synopsis
|
||||
========
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
|
||||
.. c:function:: int munmap( void *start, size_t length )
|
||||
:name: dmx-munmap
|
||||
|
||||
Arguments
|
||||
=========
|
||||
|
||||
``start``
|
||||
Address of the mapped buffer as returned by the
|
||||
:ref:`mmap() <dmx-mmap>` function.
|
||||
|
||||
``length``
|
||||
Length of the mapped buffer. This must be the same value as given to
|
||||
:ref:`mmap() <dmx-mmap>`.
|
||||
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
Unmaps a previously with the :ref:`mmap() <dmx-mmap>` function mapped
|
||||
buffer and frees it, if possible.
|
||||
|
||||
|
||||
Return Value
|
||||
============
|
||||
|
||||
On success :ref:`munmap() <dmx-munmap>` returns 0, on failure -1 and the
|
||||
``errno`` variable is set appropriately:
|
||||
|
||||
EINVAL
|
||||
The ``start`` or ``length`` is incorrect, or no buffers have been
|
||||
mapped yet.
|
|
@ -0,0 +1,83 @@
|
|||
.. _DMX_QBUF:
|
||||
|
||||
*************************
|
||||
ioctl DMX_QBUF, DMX_DQBUF
|
||||
*************************
|
||||
|
||||
Name
|
||||
====
|
||||
|
||||
DMX_QBUF - DMX_DQBUF - Exchange a buffer with the driver
|
||||
|
||||
.. warning:: this API is still experimental
|
||||
|
||||
|
||||
Synopsis
|
||||
========
|
||||
|
||||
.. c:function:: int ioctl( int fd, DMX_QBUF, struct dmx_buffer *argp )
|
||||
:name: DMX_QBUF
|
||||
|
||||
.. c:function:: int ioctl( int fd, DMX_DQBUF, struct dmx_buffer *argp )
|
||||
:name: DMX_DQBUF
|
||||
|
||||
|
||||
Arguments
|
||||
=========
|
||||
|
||||
``fd``
|
||||
File descriptor returned by :ref:`open() <dmx_fopen>`.
|
||||
|
||||
``argp``
|
||||
Pointer to struct :c:type:`dmx_buffer`.
|
||||
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
Applications call the ``DMX_QBUF`` ioctl to enqueue an empty
|
||||
(capturing) or filled (output) buffer in the driver's incoming queue.
|
||||
The semantics depend on the selected I/O method.
|
||||
|
||||
To enqueue a buffer applications set the ``index`` field. Valid index
|
||||
numbers range from zero to the number of buffers allocated with
|
||||
:ref:`DMX_REQBUFS` (struct :c:type:`dmx_requestbuffers` ``count``) minus
|
||||
one. The contents of the struct :c:type:`dmx_buffer` returned
|
||||
by a :ref:`DMX_QUERYBUF` ioctl will do as well.
|
||||
|
||||
When ``DMX_QBUF`` is called with a pointer to this structure, it locks the
|
||||
memory pages of the buffer in physical memory, so they cannot be swapped
|
||||
out to disk. Buffers remain locked until dequeued, until the
|
||||
the device is closed.
|
||||
|
||||
Applications call the ``DMX_DQBUF`` ioctl to dequeue a filled
|
||||
(capturing) buffer from the driver's outgoing queue. They just set the ``reserved`` field array to zero. When ``DMX_DQBUF`` is called with a
|
||||
pointer to this structure, the driver fills the remaining fields or
|
||||
returns an error code.
|
||||
|
||||
By default ``DMX_DQBUF`` blocks when no buffer is in the outgoing
|
||||
queue. When the ``O_NONBLOCK`` flag was given to the
|
||||
:ref:`open() <dmx_fopen>` function, ``DMX_DQBUF`` returns
|
||||
immediately with an ``EAGAIN`` error code when no buffer is available.
|
||||
|
||||
The struct :c:type:`dmx_buffer` structure is specified in
|
||||
:ref:`buffer`.
|
||||
|
||||
|
||||
Return Value
|
||||
============
|
||||
|
||||
On success 0 is returned, on error -1 and the ``errno`` variable is set
|
||||
appropriately. The generic error codes are described at the
|
||||
:ref:`Generic Error Codes <gen-errors>` chapter.
|
||||
|
||||
EAGAIN
|
||||
Non-blocking I/O has been selected using ``O_NONBLOCK`` and no
|
||||
buffer was in the outgoing queue.
|
||||
|
||||
EINVAL
|
||||
The ``index`` is out of bounds, or no buffers have been allocated yet.
|
||||
|
||||
EIO
|
||||
``DMX_DQBUF`` failed due to an internal error. Can also indicate
|
||||
temporary problems like signal loss or CRC errors.
|
|
@ -0,0 +1,63 @@
|
|||
.. _DMX_QUERYBUF:
|
||||
|
||||
******************
|
||||
ioctl DMX_QUERYBUF
|
||||
******************
|
||||
|
||||
Name
|
||||
====
|
||||
|
||||
DMX_QUERYBUF - Query the status of a buffer
|
||||
|
||||
.. warning:: this API is still experimental
|
||||
|
||||
|
||||
Synopsis
|
||||
========
|
||||
|
||||
.. c:function:: int ioctl( int fd, DMX_QUERYBUF, struct dvb_buffer *argp )
|
||||
:name: DMX_QUERYBUF
|
||||
|
||||
|
||||
Arguments
|
||||
=========
|
||||
|
||||
``fd``
|
||||
File descriptor returned by :ref:`open() <dmx_fopen>`.
|
||||
|
||||
``argp``
|
||||
Pointer to struct :c:type:`dvb_buffer`.
|
||||
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
This ioctl is part of the mmap streaming I/O method. It can
|
||||
be used to query the status of a buffer at any time after buffers have
|
||||
been allocated with the :ref:`DMX_REQBUFS` ioctl.
|
||||
|
||||
Applications set the ``index`` field. Valid index numbers range from zero
|
||||
to the number of buffers allocated with :ref:`DMX_REQBUFS`
|
||||
(struct :c:type:`dvb_requestbuffers` ``count``) minus one.
|
||||
|
||||
After calling :ref:`DMX_QUERYBUF` with a pointer to this structure,
|
||||
drivers return an error code or fill the rest of the structure.
|
||||
|
||||
On success, the ``offset`` will contain the offset of the buffer from the
|
||||
start of the device memory, the ``length`` field its size, and the
|
||||
``bytesused`` the number of bytes occupied by data in the buffer (payload).
|
||||
|
||||
Return Value
|
||||
============
|
||||
|
||||
On success 0 is returned, the ``offset`` will contain the offset of the
|
||||
buffer from the start of the device memory, the ``length`` field its size,
|
||||
and the ``bytesused`` the number of bytes occupied by data in the buffer
|
||||
(payload).
|
||||
|
||||
On error it returns -1 and the ``errno`` variable is set
|
||||
appropriately. The generic error codes are described at the
|
||||
:ref:`Generic Error Codes <gen-errors>` chapter.
|
||||
|
||||
EINVAL
|
||||
The ``index`` is out of bounds.
|
|
@ -0,0 +1,74 @@
|
|||
.. _DMX_REQBUFS:
|
||||
|
||||
*****************
|
||||
ioctl DMX_REQBUFS
|
||||
*****************
|
||||
|
||||
Name
|
||||
====
|
||||
|
||||
DMX_REQBUFS - Initiate Memory Mapping and/or DMA buffer I/O
|
||||
|
||||
.. warning:: this API is still experimental
|
||||
|
||||
|
||||
Synopsis
|
||||
========
|
||||
|
||||
.. c:function:: int ioctl( int fd, DMX_REQBUFS, struct dmx_requestbuffers *argp )
|
||||
:name: DMX_REQBUFS
|
||||
|
||||
|
||||
Arguments
|
||||
=========
|
||||
|
||||
``fd``
|
||||
File descriptor returned by :ref:`open() <dmx_fopen>`.
|
||||
|
||||
``argp``
|
||||
Pointer to struct :c:type:`dmx_requestbuffers`.
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
This ioctl is used to initiate a memory mapped or DMABUF based demux I/O.
|
||||
|
||||
Memory mapped buffers are located in device memory and must be allocated
|
||||
with this ioctl before they can be mapped into the application's address
|
||||
space. User buffers are allocated by applications themselves, and this
|
||||
ioctl is merely used to switch the driver into user pointer I/O mode and
|
||||
to setup some internal structures. Similarly, DMABUF buffers are
|
||||
allocated by applications through a device driver, and this ioctl only
|
||||
configures the driver into DMABUF I/O mode without performing any direct
|
||||
allocation.
|
||||
|
||||
To allocate device buffers applications initialize all fields of the
|
||||
struct :c:type:`dmx_requestbuffers` structure. They set the ``count`` field
|
||||
to the desired number of buffers, and ``size`` to the size of each
|
||||
buffer.
|
||||
|
||||
When the ioctl is called with a pointer to this structure, the driver will
|
||||
attempt to allocate the requested number of buffers and it stores the actual
|
||||
number allocated in the ``count`` field. The ``count`` can be smaller than the number requested, even zero, when the driver runs out of free memory. A larger
|
||||
number is also possible when the driver requires more buffers to
|
||||
function correctly. The actual allocated buffer size can is returned
|
||||
at ``size``, and can be smaller than what's requested.
|
||||
|
||||
When this I/O method is not supported, the ioctl returns an ``EOPNOTSUPP``
|
||||
error code.
|
||||
|
||||
Applications can call :ref:`DMX_REQBUFS` again to change the number of
|
||||
buffers, however this cannot succeed when any buffers are still mapped.
|
||||
A ``count`` value of zero frees all buffers, after aborting or finishing
|
||||
any DMA in progress.
|
||||
|
||||
|
||||
Return Value
|
||||
============
|
||||
|
||||
On success 0 is returned, on error -1 and the ``errno`` variable is set
|
||||
appropriately. The generic error codes are described at the
|
||||
:ref:`Generic Error Codes <gen-errors>` chapter.
|
||||
|
||||
EOPNOTSUPP
|
||||
The the requested I/O method is not supported.
|
|
@ -13,6 +13,8 @@ Demux Function Calls
|
|||
dmx-fclose
|
||||
dmx-fread
|
||||
dmx-fwrite
|
||||
dmx-mmap
|
||||
dmx-munmap
|
||||
dmx-start
|
||||
dmx-stop
|
||||
dmx-set-filter
|
||||
|
@ -22,3 +24,7 @@ Demux Function Calls
|
|||
dmx-get-pes-pids
|
||||
dmx-add-pid
|
||||
dmx-remove-pid
|
||||
dmx-reqbufs
|
||||
dmx-querybuf
|
||||
dmx-expbuf
|
||||
dmx-qbuf
|
||||
|
|
|
@ -987,3 +987,21 @@ Possible values: 0, 1, LNA_AUTO
|
|||
1, LNA on
|
||||
|
||||
use the special macro LNA_AUTO to set LNA auto
|
||||
|
||||
|
||||
.. _DTV-SCRAMBLING-SEQUENCE-INDEX:
|
||||
|
||||
DTV_SCRAMBLING_SEQUENCE_INDEX
|
||||
=============================
|
||||
|
||||
Used on DVB-S2.
|
||||
|
||||
This 18 bit field, when present, carries the index of the DVB-S2 physical
|
||||
layer scrambling sequence as defined in clause 5.5.4 of EN 302 307.
|
||||
There is no explicit signalling method to convey scrambling sequence index
|
||||
to the receiver. If S2 satellite delivery system descriptor is available
|
||||
it can be used to read the scrambling sequence index (EN 300 468 table 41).
|
||||
|
||||
By default, gold scrambling sequence index 0 is used.
|
||||
|
||||
The valid scrambling sequence index range is from 0 to 262142.
|
||||
|
|
|
@ -60,6 +60,8 @@ following parameters:
|
|||
|
||||
- :ref:`DTV_STREAM_ID <DTV-STREAM-ID>`
|
||||
|
||||
- :ref:`DTV_SCRAMBLING_SEQUENCE_INDEX <DTV-SCRAMBLING-SEQUENCE-INDEX>`
|
||||
|
||||
In addition, the :ref:`DTV QoS statistics <frontend-stat-properties>`
|
||||
are also valid.
|
||||
|
||||
|
|
|
@ -6,11 +6,12 @@
|
|||
Introduction
|
||||
************
|
||||
|
||||
The LIRC device interface is a bi-directional interface for transporting
|
||||
raw IR data between userspace and kernelspace. Fundamentally, it is just
|
||||
a chardev (/dev/lircX, for X = 0, 1, 2, ...), with a number of standard
|
||||
struct file_operations defined on it. With respect to transporting raw
|
||||
IR data to and fro, the essential fops are read, write and ioctl.
|
||||
LIRC stands for Linux Infrared Remote Control. The LIRC device interface is
|
||||
a bi-directional interface for transporting raw IR and decoded scancodes
|
||||
data between userspace and kernelspace. Fundamentally, it is just a chardev
|
||||
(/dev/lircX, for X = 0, 1, 2, ...), with a number of standard struct
|
||||
file_operations defined on it. With respect to transporting raw IR and
|
||||
decoded scancodes to and fro, the essential fops are read, write and ioctl.
|
||||
|
||||
Example dmesg output upon a driver registering w/LIRC:
|
||||
|
||||
|
@ -18,7 +19,7 @@ Example dmesg output upon a driver registering w/LIRC:
|
|||
|
||||
$ dmesg |grep lirc_dev
|
||||
lirc_dev: IR Remote Control driver registered, major 248
|
||||
rc rc0: lirc_dev: driver ir-lirc-codec (mceusb) registered at minor = 0
|
||||
rc rc0: lirc_dev: driver mceusb registered at minor = 0
|
||||
|
||||
What you should see for a chardev:
|
||||
|
||||
|
@ -36,6 +37,43 @@ LIRC modes
|
|||
LIRC supports some modes of receiving and sending IR codes, as shown
|
||||
on the following table.
|
||||
|
||||
.. _lirc-mode-scancode:
|
||||
.. _lirc-scancode-flag-toggle:
|
||||
.. _lirc-scancode-flag-repeat:
|
||||
|
||||
``LIRC_MODE_SCANCODE``
|
||||
|
||||
This mode is for both sending and receiving IR.
|
||||
|
||||
For transmitting (aka sending), create a ``struct lirc_scancode`` with
|
||||
the desired scancode set in the ``scancode`` member, :c:type:`rc_proto`
|
||||
set the IR protocol, and all other members set to 0. Write this struct to
|
||||
the lirc device.
|
||||
|
||||
For receiving, you read ``struct lirc_scancode`` from the lirc device,
|
||||
with ``scancode`` set to the received scancode and the IR protocol
|
||||
:c:type:`rc_proto`. If the scancode maps to a valid key code, this is set
|
||||
in the ``keycode`` field, else it is set to ``KEY_RESERVED``.
|
||||
|
||||
The ``flags`` can have ``LIRC_SCANCODE_FLAG_TOGGLE`` set if the toggle
|
||||
bit is set in protocols that support it (e.g. rc-5 and rc-6), or
|
||||
``LIRC_SCANCODE_FLAG_REPEAT`` for when a repeat is received for protocols
|
||||
that support it (e.g. nec).
|
||||
|
||||
In the Sanyo and NEC protocol, if you hold a button on remote, rather than
|
||||
repeating the entire scancode, the remote sends a shorter message with
|
||||
no scancode, which just means button is held, a "repeat". When this is
|
||||
received, the ``LIRC_SCANCODE_FLAG_REPEAT`` is set and the scancode and
|
||||
keycode is repeated.
|
||||
|
||||
With nec, there is no way to distinguish "button hold" from "repeatedly
|
||||
pressing the same button". The rc-5 and rc-6 protocols have a toggle bit.
|
||||
When a button is released and pressed again, the toggle bit is inverted.
|
||||
If the toggle bit is set, the ``LIRC_SCANCODE_FLAG_TOGGLE`` is set.
|
||||
|
||||
The ``timestamp`` field is filled with the time nanoseconds
|
||||
(in ``CLOCK_MONOTONIC``) when the scancode was decoded.
|
||||
|
||||
.. _lirc-mode-mode2:
|
||||
|
||||
``LIRC_MODE_MODE2``
|
||||
|
@ -72,21 +110,6 @@ on the following table.
|
|||
this packet will be sent, with the number of microseconds with
|
||||
no IR.
|
||||
|
||||
.. _lirc-mode-lirccode:
|
||||
|
||||
``LIRC_MODE_LIRCCODE``
|
||||
|
||||
This mode can be used for IR receive and send.
|
||||
|
||||
The IR signal is decoded internally by the receiver, or encoded by the
|
||||
transmitter. The LIRC interface represents the scancode as byte string,
|
||||
which might not be a u32, it can be any length. The value is entirely
|
||||
driver dependent. This mode is used by some older lirc drivers.
|
||||
|
||||
The length of each code depends on the driver, which can be retrieved
|
||||
with :ref:`lirc_get_length`. This length is used both
|
||||
for transmitting and receiving IR.
|
||||
|
||||
.. _lirc-mode-pulse:
|
||||
|
||||
``LIRC_MODE_PULSE``
|
||||
|
@ -99,3 +122,13 @@ on the following table.
|
|||
of entries.
|
||||
|
||||
This mode is used only for IR send.
|
||||
|
||||
|
||||
**************************
|
||||
Remote Controller protocol
|
||||
**************************
|
||||
|
||||
An enum :c:type:`rc_proto` in the :ref:`lirc_header` lists all the
|
||||
supported IR protocols:
|
||||
|
||||
.. kernel-doc:: include/uapi/linux/lirc.h
|
||||
|
|
|
@ -18,7 +18,6 @@ LIRC Function Reference
|
|||
lirc-set-send-duty-cycle
|
||||
lirc-get-timeout
|
||||
lirc-set-rec-timeout
|
||||
lirc-get-length
|
||||
lirc-set-rec-carrier
|
||||
lirc-set-rec-carrier-range
|
||||
lirc-set-send-carrier
|
||||
|
|
|
@ -55,15 +55,24 @@ LIRC features
|
|||
|
||||
``LIRC_CAN_REC_MODE2``
|
||||
|
||||
The driver is capable of receiving using
|
||||
:ref:`LIRC_MODE_MODE2 <lirc-mode-MODE2>`.
|
||||
This is raw IR driver for receiving. This means that
|
||||
:ref:`LIRC_MODE_MODE2 <lirc-mode-MODE2>` is used. This also implies
|
||||
that :ref:`LIRC_MODE_SCANCODE <lirc-mode-SCANCODE>` is also supported,
|
||||
as long as the kernel is recent enough. Use the
|
||||
:ref:`lirc_set_rec_mode` to switch modes.
|
||||
|
||||
.. _LIRC-CAN-REC-LIRCCODE:
|
||||
|
||||
``LIRC_CAN_REC_LIRCCODE``
|
||||
|
||||
The driver is capable of receiving using
|
||||
:ref:`LIRC_MODE_LIRCCODE <lirc-mode-LIRCCODE>`.
|
||||
Unused. Kept just to avoid breaking uAPI.
|
||||
|
||||
.. _LIRC-CAN-REC-SCANCODE:
|
||||
|
||||
``LIRC_CAN_REC_SCANCODE``
|
||||
|
||||
This is a scancode driver for receiving. This means that
|
||||
:ref:`LIRC_MODE_SCANCODE <lirc-mode-SCANCODE>` is used.
|
||||
|
||||
.. _LIRC-CAN-SET-SEND-CARRIER:
|
||||
|
||||
|
@ -157,7 +166,10 @@ LIRC features
|
|||
``LIRC_CAN_SEND_PULSE``
|
||||
|
||||
The driver supports sending (also called as IR blasting or IR TX) using
|
||||
:ref:`LIRC_MODE_PULSE <lirc-mode-pulse>`.
|
||||
:ref:`LIRC_MODE_PULSE <lirc-mode-pulse>`. This implies that
|
||||
:ref:`LIRC_MODE_SCANCODE <lirc-mode-SCANCODE>` is also supported for
|
||||
transmit, as long as the kernel is recent enough. Use the
|
||||
:ref:`lirc_set_send_mode` to switch modes.
|
||||
|
||||
.. _LIRC-CAN-SEND-MODE2:
|
||||
|
||||
|
@ -170,8 +182,7 @@ LIRC features
|
|||
|
||||
``LIRC_CAN_SEND_LIRCCODE``
|
||||
|
||||
The driver supports sending (also called as IR blasting or IR TX) using
|
||||
:ref:`LIRC_MODE_LIRCCODE <lirc-mode-LIRCCODE>`.
|
||||
Unused. Kept just to avoid breaking uAPI.
|
||||
|
||||
|
||||
Return Value
|
||||
|
|
|
@ -1,44 +0,0 @@
|
|||
.. -*- coding: utf-8; mode: rst -*-
|
||||
|
||||
.. _lirc_get_length:
|
||||
|
||||
*********************
|
||||
ioctl LIRC_GET_LENGTH
|
||||
*********************
|
||||
|
||||
Name
|
||||
====
|
||||
|
||||
LIRC_GET_LENGTH - Retrieves the code length in bits.
|
||||
|
||||
Synopsis
|
||||
========
|
||||
|
||||
.. c:function:: int ioctl( int fd, LIRC_GET_LENGTH, __u32 *length )
|
||||
:name: LIRC_GET_LENGTH
|
||||
|
||||
Arguments
|
||||
=========
|
||||
|
||||
``fd``
|
||||
File descriptor returned by open().
|
||||
|
||||
``length``
|
||||
length, in bits
|
||||
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
Retrieves the code length in bits (only for
|
||||
:ref:`LIRC_MODE_LIRCCODE <lirc-mode-lirccode>`).
|
||||
Reads on the device must be done in blocks matching the bit count.
|
||||
The bit could should be rounded up so that it matches full bytes.
|
||||
|
||||
|
||||
Return Value
|
||||
============
|
||||
|
||||
On success 0 is returned, on error -1 and the ``errno`` variable is set
|
||||
appropriately. The generic error codes are described at the
|
||||
:ref:`Generic Error Codes <gen-errors>` chapter.
|
|
@ -10,15 +10,15 @@ ioctls LIRC_GET_REC_MODE and LIRC_SET_REC_MODE
|
|||
Name
|
||||
====
|
||||
|
||||
LIRC_GET_REC_MODE/LIRC_SET_REC_MODE - Get/set supported receive modes.
|
||||
LIRC_GET_REC_MODE/LIRC_SET_REC_MODE - Get/set current receive mode.
|
||||
|
||||
Synopsis
|
||||
========
|
||||
|
||||
.. c:function:: int ioctl( int fd, LIRC_GET_REC_MODE, __u32 rx_modes)
|
||||
.. c:function:: int ioctl( int fd, LIRC_GET_REC_MODE, __u32 *mode)
|
||||
:name: LIRC_GET_REC_MODE
|
||||
|
||||
.. c:function:: int ioctl( int fd, LIRC_SET_REC_MODE, __u32 rx_modes)
|
||||
.. c:function:: int ioctl( int fd, LIRC_SET_REC_MODE, __u32 *mode)
|
||||
:name: LIRC_SET_REC_MODE
|
||||
|
||||
Arguments
|
||||
|
@ -27,20 +27,41 @@ Arguments
|
|||
``fd``
|
||||
File descriptor returned by open().
|
||||
|
||||
``rx_modes``
|
||||
Bitmask with the supported transmit modes.
|
||||
``mode``
|
||||
Mode used for receive.
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
Get/set supported receive modes. Only :ref:`LIRC_MODE_MODE2 <lirc-mode-mode2>`
|
||||
and :ref:`LIRC_MODE_LIRCCODE <lirc-mode-lirccode>` are supported for IR
|
||||
receive. Use :ref:`lirc_get_features` to find out which modes the driver
|
||||
supports.
|
||||
Get and set the current receive mode. Only
|
||||
:ref:`LIRC_MODE_MODE2 <lirc-mode-mode2>` and
|
||||
:ref:`LIRC_MODE_SCANCODE <lirc-mode-scancode>` are supported.
|
||||
Use :ref:`lirc_get_features` to find out which modes the driver supports.
|
||||
|
||||
Return Value
|
||||
============
|
||||
|
||||
On success 0 is returned, on error -1 and the ``errno`` variable is set
|
||||
appropriately. The generic error codes are described at the
|
||||
:ref:`Generic Error Codes <gen-errors>` chapter.
|
||||
.. tabularcolumns:: |p{2.5cm}|p{15.0cm}|
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
|
||||
|
||||
- .. row 1
|
||||
|
||||
- ``ENODEV``
|
||||
|
||||
- Device not available.
|
||||
|
||||
- .. row 2
|
||||
|
||||
- ``ENOTTY``
|
||||
|
||||
- Device does not support receiving.
|
||||
|
||||
- .. row 3
|
||||
|
||||
- ``EINVAL``
|
||||
|
||||
- Invalid mode or invalid mode for this device.
|
||||
|
|
|
@ -10,15 +10,15 @@ ioctls LIRC_GET_SEND_MODE and LIRC_SET_SEND_MODE
|
|||
Name
|
||||
====
|
||||
|
||||
LIRC_GET_SEND_MODE/LIRC_SET_SEND_MODE - Get/set supported transmit mode.
|
||||
LIRC_GET_SEND_MODE/LIRC_SET_SEND_MODE - Get/set current transmit mode.
|
||||
|
||||
Synopsis
|
||||
========
|
||||
|
||||
.. c:function:: int ioctl( int fd, LIRC_GET_SEND_MODE, __u32 *tx_modes )
|
||||
.. c:function:: int ioctl( int fd, LIRC_GET_SEND_MODE, __u32 *mode )
|
||||
:name: LIRC_GET_SEND_MODE
|
||||
|
||||
.. c:function:: int ioctl( int fd, LIRC_SET_SEND_MODE, __u32 *tx_modes )
|
||||
.. c:function:: int ioctl( int fd, LIRC_SET_SEND_MODE, __u32 *mode )
|
||||
:name: LIRC_SET_SEND_MODE
|
||||
|
||||
Arguments
|
||||
|
@ -27,8 +27,8 @@ Arguments
|
|||
``fd``
|
||||
File descriptor returned by open().
|
||||
|
||||
``tx_modes``
|
||||
Bitmask with the supported transmit modes.
|
||||
``mode``
|
||||
The mode used for transmitting.
|
||||
|
||||
|
||||
Description
|
||||
|
@ -37,13 +37,35 @@ Description
|
|||
Get/set current transmit mode.
|
||||
|
||||
Only :ref:`LIRC_MODE_PULSE <lirc-mode-pulse>` and
|
||||
:ref:`LIRC_MODE_LIRCCODE <lirc-mode-lirccode>` is supported by for IR send,
|
||||
:ref:`LIRC_MODE_SCANCODE <lirc-mode-scancode>` are supported by for IR send,
|
||||
depending on the driver. Use :ref:`lirc_get_features` to find out which
|
||||
modes the driver supports.
|
||||
|
||||
Return Value
|
||||
============
|
||||
|
||||
On success 0 is returned, on error -1 and the ``errno`` variable is set
|
||||
appropriately. The generic error codes are described at the
|
||||
:ref:`Generic Error Codes <gen-errors>` chapter.
|
||||
|
||||
.. tabularcolumns:: |p{2.5cm}|p{15.0cm}|
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
|
||||
|
||||
- .. row 1
|
||||
|
||||
- ``ENODEV``
|
||||
|
||||
- Device not available.
|
||||
|
||||
- .. row 2
|
||||
|
||||
- ``ENOTTY``
|
||||
|
||||
- Device does not support transmitting.
|
||||
|
||||
- .. row 3
|
||||
|
||||
- ``EINVAL``
|
||||
|
||||
- Invalid mode or invalid mode for this device.
|
||||
|
|
|
@ -45,13 +45,20 @@ descriptor ``fd`` into the buffer starting at ``buf``. If ``count`` is zero,
|
|||
is greater than ``SSIZE_MAX``, the result is unspecified.
|
||||
|
||||
The exact format of the data depends on what :ref:`lirc_modes` a driver
|
||||
uses. Use :ref:`lirc_get_features` to get the supported mode.
|
||||
uses. Use :ref:`lirc_get_features` to get the supported mode, and use
|
||||
:ref:`lirc_set_rec_mode` set the current active mode.
|
||||
|
||||
The generally preferred mode for receive is
|
||||
:ref:`LIRC_MODE_MODE2 <lirc-mode-mode2>`,
|
||||
in which packets containing an int value describing an IR signal are
|
||||
The mode :ref:`LIRC_MODE_MODE2 <lirc-mode-mode2>` is for raw IR,
|
||||
in which packets containing an unsigned int value describing an IR signal are
|
||||
read from the chardev.
|
||||
|
||||
Alternatively, :ref:`LIRC_MODE_SCANCODE <lirc-mode-scancode>` can be available,
|
||||
in this mode scancodes which are either decoded by software decoders, or
|
||||
by hardware decoders. The :c:type:`rc_proto` member is set to the
|
||||
protocol used for transmission, and ``scancode`` to the decoded scancode,
|
||||
and the ``keycode`` set to the keycode or ``KEY_RESERVED``.
|
||||
|
||||
|
||||
Return Value
|
||||
============
|
||||
|
||||
|
|
|
@ -42,21 +42,32 @@ Description
|
|||
referenced by the file descriptor ``fd`` from the buffer starting at
|
||||
``buf``.
|
||||
|
||||
The exact format of the data depends on what mode a driver uses, use
|
||||
:ref:`lirc_get_features` to get the supported mode.
|
||||
The exact format of the data depends on what mode a driver is in, use
|
||||
:ref:`lirc_get_features` to get the supported modes and use
|
||||
:ref:`lirc_set_send_mode` set the mode.
|
||||
|
||||
When in :ref:`LIRC_MODE_PULSE <lirc-mode-PULSE>` mode, the data written to
|
||||
the chardev is a pulse/space sequence of integer values. Pulses and spaces
|
||||
are only marked implicitly by their position. The data must start and end
|
||||
with a pulse, therefore, the data must always include an uneven number of
|
||||
samples. The write function must block until the data has been transmitted
|
||||
samples. The write function blocks until the data has been transmitted
|
||||
by the hardware. If more data is provided than the hardware can send, the
|
||||
driver returns ``EINVAL``.
|
||||
|
||||
When in :ref:`LIRC_MODE_SCANCODE <lirc-mode-scancode>` mode, one
|
||||
``struct lirc_scancode`` must be written to the chardev at a time, else
|
||||
``EINVAL`` is returned. Set the desired scancode in the ``scancode`` member,
|
||||
and the protocol in the :c:type:`rc_proto`: member. All other members must be
|
||||
set to 0, else ``EINVAL`` is returned. If there is no protocol encoder
|
||||
for the protocol or the scancode is not valid for the specified protocol,
|
||||
``EINVAL`` is returned. The write function blocks until the scancode
|
||||
is transmitted by the hardware.
|
||||
|
||||
|
||||
Return Value
|
||||
============
|
||||
|
||||
On success, the number of bytes read is returned. It is not an error if
|
||||
On success, the number of bytes written is returned. It is not an error if
|
||||
this number is smaller than the number of bytes requested, or the amount
|
||||
of data required for one frame. On error, -1 is returned, and the ``errno``
|
||||
variable is set appropriately. The generic error codes are described at the
|
||||
|
|
|
@ -12,5 +12,6 @@ These formats are used for the :ref:`metadata` interface only.
|
|||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
pixfmt-meta-uvc
|
||||
pixfmt-meta-vsp1-hgo
|
||||
pixfmt-meta-vsp1-hgt
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
.. -*- coding: utf-8; mode: rst -*-
|
||||
|
||||
.. _v4l2-meta-fmt-uvc:
|
||||
|
||||
*******************************
|
||||
V4L2_META_FMT_UVC ('UVCH')
|
||||
*******************************
|
||||
|
||||
UVC Payload Header Data
|
||||
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
This format describes standard UVC metadata, extracted from UVC packet headers
|
||||
and provided by the UVC driver through metadata video nodes. That data includes
|
||||
exact copies of the standard part of UVC Payload Header contents and auxiliary
|
||||
timing information, required for precise interpretation of timestamps, contained
|
||||
in those headers. See section "2.4.3.3 Video and Still Image Payload Headers" of
|
||||
the "UVC 1.5 Class specification" for details.
|
||||
|
||||
Each UVC payload header can be between 2 and 12 bytes large. Buffers can
|
||||
contain multiple headers, if multiple such headers have been transmitted by the
|
||||
camera for the respective frame. However, the driver may drop headers when the
|
||||
buffer is full, when they contain no useful information (e.g. those without the
|
||||
SCR field or with that field identical to the previous header), or generally to
|
||||
perform rate limiting when the device sends a large number of headers.
|
||||
|
||||
Each individual block contains the following fields:
|
||||
|
||||
.. flat-table:: UVC Metadata Block
|
||||
:widths: 1 4
|
||||
:header-rows: 1
|
||||
:stub-columns: 0
|
||||
|
||||
* - Field
|
||||
- Description
|
||||
* - __u64 ts;
|
||||
- system timestamp in host byte order, measured by the driver upon
|
||||
reception of the payload
|
||||
* - __u16 sof;
|
||||
- USB Frame Number in host byte order, also obtained by the driver as
|
||||
close as possible to the above timestamp to enable correlation between
|
||||
them
|
||||
* - :cspan:`1` *The rest is an exact copy of the UVC payload header:*
|
||||
* - __u8 length;
|
||||
- length of the rest of the block, including this field
|
||||
* - __u8 flags;
|
||||
- Flags, indicating presence of other standard UVC fields
|
||||
* - __u8 buf[];
|
||||
- The rest of the header, possibly including UVC PTS and SCR fields
|
|
@ -16,6 +16,7 @@ RGB Formats
|
|||
pixfmt-srggb10p
|
||||
pixfmt-srggb10alaw8
|
||||
pixfmt-srggb10dpcm8
|
||||
pixfmt-srggb10-ipu3
|
||||
pixfmt-srggb12
|
||||
pixfmt-srggb12p
|
||||
pixfmt-srggb16
|
||||
|
|
|
@ -0,0 +1,335 @@
|
|||
.. -*- coding: utf-8; mode: rst -*-
|
||||
|
||||
.. _v4l2-pix-fmt-ipu3-sbggr10:
|
||||
.. _v4l2-pix-fmt-ipu3-sgbrg10:
|
||||
.. _v4l2-pix-fmt-ipu3-sgrbg10:
|
||||
.. _v4l2-pix-fmt-ipu3-srggb10:
|
||||
|
||||
**********************************************************************************************************************************************
|
||||
V4L2_PIX_FMT_IPU3_SBGGR10 ('ip3b'), V4L2_PIX_FMT_IPU3_SGBRG10 ('ip3g'), V4L2_PIX_FMT_IPU3_SGRBG10 ('ip3G'), V4L2_PIX_FMT_IPU3_SRGGB10 ('ip3r')
|
||||
**********************************************************************************************************************************************
|
||||
|
||||
10-bit Bayer formats
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
These four pixel formats are used by Intel IPU3 driver, they are raw
|
||||
sRGB / Bayer formats with 10 bits per sample with every 25 pixels packed
|
||||
to 32 bytes leaving 6 most significant bits padding in the last byte.
|
||||
The format is little endian.
|
||||
|
||||
In other respects this format is similar to :ref:`V4L2-PIX-FMT-SRGGB10`.
|
||||
Below is an example of a small image in V4L2_PIX_FMT_IPU3_SBGGR10 format.
|
||||
|
||||
**Byte Order.**
|
||||
Each cell is one byte.
|
||||
|
||||
.. tabularcolumns:: |p{0.8cm}|p{4.0cm}|p{4.0cm}|p{4.0cm}|p{4.0cm}|
|
||||
|
||||
.. flat-table::
|
||||
|
||||
* - start + 0:
|
||||
- B\ :sub:`0000low`
|
||||
- G\ :sub:`0001low`\ (bits 7--2)
|
||||
|
||||
B\ :sub:`0000high`\ (bits 1--0)
|
||||
- B\ :sub:`0002low`\ (bits 7--4)
|
||||
|
||||
G\ :sub:`0001high`\ (bits 3--0)
|
||||
- G\ :sub:`0003low`\ (bits 7--6)
|
||||
|
||||
B\ :sub:`0002high`\ (bits 5--0)
|
||||
* - start + 4:
|
||||
- G\ :sub:`0003high`
|
||||
- B\ :sub:`0004low`
|
||||
- G\ :sub:`0005low`\ (bits 7--2)
|
||||
|
||||
B\ :sub:`0004high`\ (bits 1--0)
|
||||
- B\ :sub:`0006low`\ (bits 7--4)
|
||||
|
||||
G\ :sub:`0005high`\ (bits 3--0)
|
||||
* - start + 8:
|
||||
- G\ :sub:`0007low`\ (bits 7--6)
|
||||
|
||||
B\ :sub:`0006high`\ (bits 5--0)
|
||||
- G\ :sub:`0007high`
|
||||
- B\ :sub:`0008low`
|
||||
- G\ :sub:`0009low`\ (bits 7--2)
|
||||
|
||||
B\ :sub:`0008high`\ (bits 1--0)
|
||||
* - start + 12:
|
||||
- B\ :sub:`0010low`\ (bits 7--4)
|
||||
|
||||
G\ :sub:`0009high`\ (bits 3--0)
|
||||
- G\ :sub:`0011low`\ (bits 7--6)
|
||||
|
||||
B\ :sub:`0010high`\ (bits 5--0)
|
||||
- G\ :sub:`0011high`
|
||||
- B\ :sub:`0012low`
|
||||
* - start + 16:
|
||||
- G\ :sub:`0013low`\ (bits 7--2)
|
||||
|
||||
B\ :sub:`0012high`\ (bits 1--0)
|
||||
- B\ :sub:`0014low`\ (bits 7--4)
|
||||
|
||||
G\ :sub:`0013high`\ (bits 3--0)
|
||||
- G\ :sub:`0015low`\ (bits 7--6)
|
||||
|
||||
B\ :sub:`0014high`\ (bits 5--0)
|
||||
- G\ :sub:`0015high`
|
||||
* - start + 20
|
||||
- B\ :sub:`0016low`
|
||||
- G\ :sub:`0017low`\ (bits 7--2)
|
||||
|
||||
B\ :sub:`0016high`\ (bits 1--0)
|
||||
- B\ :sub:`0018low`\ (bits 7--4)
|
||||
|
||||
G\ :sub:`0017high`\ (bits 3--0)
|
||||
- G\ :sub:`0019low`\ (bits 7--6)
|
||||
|
||||
B\ :sub:`0018high`\ (bits 5--0)
|
||||
* - start + 24:
|
||||
- G\ :sub:`0019high`
|
||||
- B\ :sub:`0020low`
|
||||
- G\ :sub:`0021low`\ (bits 7--2)
|
||||
|
||||
B\ :sub:`0020high`\ (bits 1--0)
|
||||
- B\ :sub:`0022low`\ (bits 7--4)
|
||||
|
||||
G\ :sub:`0021high`\ (bits 3--0)
|
||||
* - start + 28:
|
||||
- G\ :sub:`0023low`\ (bits 7--6)
|
||||
|
||||
B\ :sub:`0022high`\ (bits 5--0)
|
||||
- G\ :sub:`0023high`
|
||||
- B\ :sub:`0024low`
|
||||
- B\ :sub:`0024high`\ (bits 1--0)
|
||||
* - start + 32:
|
||||
- G\ :sub:`0100low`
|
||||
- R\ :sub:`0101low`\ (bits 7--2)
|
||||
|
||||
G\ :sub:`0100high`\ (bits 1--0)
|
||||
- G\ :sub:`0102low`\ (bits 7--4)
|
||||
|
||||
R\ :sub:`0101high`\ (bits 3--0)
|
||||
- R\ :sub:`0103low`\ (bits 7--6)
|
||||
|
||||
G\ :sub:`0102high`\ (bits 5--0)
|
||||
* - start + 36:
|
||||
- R\ :sub:`0103high`
|
||||
- G\ :sub:`0104low`
|
||||
- R\ :sub:`0105low`\ (bits 7--2)
|
||||
|
||||
G\ :sub:`0104high`\ (bits 1--0)
|
||||
- G\ :sub:`0106low`\ (bits 7--4)
|
||||
|
||||
R\ :sub:`0105high`\ (bits 3--0)
|
||||
* - start + 40:
|
||||
- R\ :sub:`0107low`\ (bits 7--6)
|
||||
|
||||
G\ :sub:`0106high`\ (bits 5--0)
|
||||
- R\ :sub:`0107high`
|
||||
- G\ :sub:`0108low`
|
||||
- R\ :sub:`0109low`\ (bits 7--2)
|
||||
|
||||
G\ :sub:`0108high`\ (bits 1--0)
|
||||
* - start + 44:
|
||||
- G\ :sub:`0110low`\ (bits 7--4)
|
||||
|
||||
R\ :sub:`0109high`\ (bits 3--0)
|
||||
- R\ :sub:`0111low`\ (bits 7--6)
|
||||
|
||||
G\ :sub:`0110high`\ (bits 5--0)
|
||||
- R\ :sub:`0111high`
|
||||
- G\ :sub:`0112low`
|
||||
* - start + 48:
|
||||
- R\ :sub:`0113low`\ (bits 7--2)
|
||||
|
||||
G\ :sub:`0112high`\ (bits 1--0)
|
||||
- G\ :sub:`0114low`\ (bits 7--4)
|
||||
|
||||
R\ :sub:`0113high`\ (bits 3--0)
|
||||
- R\ :sub:`0115low`\ (bits 7--6)
|
||||
|
||||
G\ :sub:`0114high`\ (bits 5--0)
|
||||
- R\ :sub:`0115high`
|
||||
* - start + 52:
|
||||
- G\ :sub:`0116low`
|
||||
- R\ :sub:`0117low`\ (bits 7--2)
|
||||
|
||||
G\ :sub:`0116high`\ (bits 1--0)
|
||||
- G\ :sub:`0118low`\ (bits 7--4)
|
||||
|
||||
R\ :sub:`0117high`\ (bits 3--0)
|
||||
- R\ :sub:`0119low`\ (bits 7--6)
|
||||
|
||||
G\ :sub:`0118high`\ (bits 5--0)
|
||||
* - start + 56:
|
||||
- R\ :sub:`0119high`
|
||||
- G\ :sub:`0120low`
|
||||
- R\ :sub:`0121low`\ (bits 7--2)
|
||||
|
||||
G\ :sub:`0120high`\ (bits 1--0)
|
||||
- G\ :sub:`0122low`\ (bits 7--4)
|
||||
|
||||
R\ :sub:`0121high`\ (bits 3--0)
|
||||
* - start + 60:
|
||||
- R\ :sub:`0123low`\ (bits 7--6)
|
||||
|
||||
G\ :sub:`0122high`\ (bits 5--0)
|
||||
- R\ :sub:`0123high`
|
||||
- G\ :sub:`0124low`
|
||||
- G\ :sub:`0124high`\ (bits 1--0)
|
||||
* - start + 64:
|
||||
- B\ :sub:`0200low`
|
||||
- G\ :sub:`0201low`\ (bits 7--2)
|
||||
|
||||
B\ :sub:`0200high`\ (bits 1--0)
|
||||
- B\ :sub:`0202low`\ (bits 7--4)
|
||||
|
||||
G\ :sub:`0201high`\ (bits 3--0)
|
||||
- G\ :sub:`0203low`\ (bits 7--6)
|
||||
|
||||
B\ :sub:`0202high`\ (bits 5--0)
|
||||
* - start + 68:
|
||||
- G\ :sub:`0203high`
|
||||
- B\ :sub:`0204low`
|
||||
- G\ :sub:`0205low`\ (bits 7--2)
|
||||
|
||||
B\ :sub:`0204high`\ (bits 1--0)
|
||||
- B\ :sub:`0206low`\ (bits 7--4)
|
||||
|
||||
G\ :sub:`0205high`\ (bits 3--0)
|
||||
* - start + 72:
|
||||
- G\ :sub:`0207low`\ (bits 7--6)
|
||||
|
||||
B\ :sub:`0206high`\ (bits 5--0)
|
||||
- G\ :sub:`0207high`
|
||||
- B\ :sub:`0208low`
|
||||
- G\ :sub:`0209low`\ (bits 7--2)
|
||||
|
||||
B\ :sub:`0208high`\ (bits 1--0)
|
||||
* - start + 76:
|
||||
- B\ :sub:`0210low`\ (bits 7--4)
|
||||
|
||||
G\ :sub:`0209high`\ (bits 3--0)
|
||||
- G\ :sub:`0211low`\ (bits 7--6)
|
||||
|
||||
B\ :sub:`0210high`\ (bits 5--0)
|
||||
- G\ :sub:`0211high`
|
||||
- B\ :sub:`0212low`
|
||||
* - start + 80:
|
||||
- G\ :sub:`0213low`\ (bits 7--2)
|
||||
|
||||
B\ :sub:`0212high`\ (bits 1--0)
|
||||
- B\ :sub:`0214low`\ (bits 7--4)
|
||||
|
||||
G\ :sub:`0213high`\ (bits 3--0)
|
||||
- G\ :sub:`0215low`\ (bits 7--6)
|
||||
|
||||
B\ :sub:`0214high`\ (bits 5--0)
|
||||
- G\ :sub:`0215high`
|
||||
* - start + 84:
|
||||
- B\ :sub:`0216low`
|
||||
- G\ :sub:`0217low`\ (bits 7--2)
|
||||
|
||||
B\ :sub:`0216high`\ (bits 1--0)
|
||||
- B\ :sub:`0218low`\ (bits 7--4)
|
||||
|
||||
G\ :sub:`0217high`\ (bits 3--0)
|
||||
- G\ :sub:`0219low`\ (bits 7--6)
|
||||
|
||||
B\ :sub:`0218high`\ (bits 5--0)
|
||||
* - start + 88:
|
||||
- G\ :sub:`0219high`
|
||||
- B\ :sub:`0220low`
|
||||
- G\ :sub:`0221low`\ (bits 7--2)
|
||||
|
||||
B\ :sub:`0220high`\ (bits 1--0)
|
||||
- B\ :sub:`0222low`\ (bits 7--4)
|
||||
|
||||
G\ :sub:`0221high`\ (bits 3--0)
|
||||
* - start + 92:
|
||||
- G\ :sub:`0223low`\ (bits 7--6)
|
||||
|
||||
B\ :sub:`0222high`\ (bits 5--0)
|
||||
- G\ :sub:`0223high`
|
||||
- B\ :sub:`0224low`
|
||||
- B\ :sub:`0224high`\ (bits 1--0)
|
||||
* - start + 96:
|
||||
- G\ :sub:`0300low`
|
||||
- R\ :sub:`0301low`\ (bits 7--2)
|
||||
|
||||
G\ :sub:`0300high`\ (bits 1--0)
|
||||
- G\ :sub:`0302low`\ (bits 7--4)
|
||||
|
||||
R\ :sub:`0301high`\ (bits 3--0)
|
||||
- R\ :sub:`0303low`\ (bits 7--6)
|
||||
|
||||
G\ :sub:`0302high`\ (bits 5--0)
|
||||
* - start + 100:
|
||||
- R\ :sub:`0303high`
|
||||
- G\ :sub:`0304low`
|
||||
- R\ :sub:`0305low`\ (bits 7--2)
|
||||
|
||||
G\ :sub:`0304high`\ (bits 1--0)
|
||||
- G\ :sub:`0306low`\ (bits 7--4)
|
||||
|
||||
R\ :sub:`0305high`\ (bits 3--0)
|
||||
* - start + 104:
|
||||
- R\ :sub:`0307low`\ (bits 7--6)
|
||||
|
||||
G\ :sub:`0306high`\ (bits 5--0)
|
||||
- R\ :sub:`0307high`
|
||||
- G\ :sub:`0308low`
|
||||
- R\ :sub:`0309low`\ (bits 7--2)
|
||||
|
||||
G\ :sub:`0308high`\ (bits 1--0)
|
||||
* - start + 108:
|
||||
- G\ :sub:`0310low`\ (bits 7--4)
|
||||
|
||||
R\ :sub:`0309high`\ (bits 3--0)
|
||||
- R\ :sub:`0311low`\ (bits 7--6)
|
||||
|
||||
G\ :sub:`0310high`\ (bits 5--0)
|
||||
- R\ :sub:`0311high`
|
||||
- G\ :sub:`0312low`
|
||||
* - start + 112:
|
||||
- R\ :sub:`0313low`\ (bits 7--2)
|
||||
|
||||
G\ :sub:`0312high`\ (bits 1--0)
|
||||
- G\ :sub:`0314low`\ (bits 7--4)
|
||||
|
||||
R\ :sub:`0313high`\ (bits 3--0)
|
||||
- R\ :sub:`0315low`\ (bits 7--6)
|
||||
|
||||
G\ :sub:`0314high`\ (bits 5--0)
|
||||
- R\ :sub:`0315high`
|
||||
* - start + 116:
|
||||
- G\ :sub:`0316low`
|
||||
- R\ :sub:`0317low`\ (bits 7--2)
|
||||
|
||||
G\ :sub:`0316high`\ (bits 1--0)
|
||||
- G\ :sub:`0318low`\ (bits 7--4)
|
||||
|
||||
R\ :sub:`0317high`\ (bits 3--0)
|
||||
- R\ :sub:`0319low`\ (bits 7--6)
|
||||
|
||||
G\ :sub:`0318high`\ (bits 5--0)
|
||||
* - start + 120:
|
||||
- R\ :sub:`0319high`
|
||||
- G\ :sub:`0320low`
|
||||
- R\ :sub:`0321low`\ (bits 7--2)
|
||||
|
||||
G\ :sub:`0320high`\ (bits 1--0)
|
||||
- G\ :sub:`0322low`\ (bits 7--4)
|
||||
|
||||
R\ :sub:`0321high`\ (bits 3--0)
|
||||
* - start + 124:
|
||||
- R\ :sub:`0323low`\ (bits 7--6)
|
||||
|
||||
G\ :sub:`0322high`\ (bits 5--0)
|
||||
- R\ :sub:`0323high`
|
||||
- G\ :sub:`0324low`
|
||||
- G\ :sub:`0324high`\ (bits 1--0)
|
|
@ -267,7 +267,7 @@ EBUSY
|
|||
will also be cleared.
|
||||
* - ``V4L2_DV_FL_HALF_LINE``
|
||||
- Specific to interlaced formats: if set, then the vertical
|
||||
frontporch of field 1 (aka the odd field) is really one half-line
|
||||
backporch of field 1 (aka the odd field) is really one half-line
|
||||
longer and the vertical backporch of field 2 (aka the even field)
|
||||
is really one half-line shorter, so each field has exactly the
|
||||
same number of half-lines. Whether half-lines can be detected or
|
||||
|
|
56
MAINTAINERS
56
MAINTAINERS
|
@ -2228,14 +2228,6 @@ L: linux-leds@vger.kernel.org
|
|||
S: Maintained
|
||||
F: drivers/leds/leds-as3645a.c
|
||||
|
||||
AS3645A LED FLASH CONTROLLER DRIVER
|
||||
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/as3645a.c
|
||||
F: include/media/i2c/as3645a.h
|
||||
|
||||
ASAHI KASEI AK8974 DRIVER
|
||||
M: Linus Walleij <linus.walleij@linaro.org>
|
||||
L: linux-iio@vger.kernel.org
|
||||
|
@ -7136,6 +7128,14 @@ R: Dan Williams <dan.j.williams@intel.com>
|
|||
S: Odd fixes
|
||||
F: drivers/dma/iop-adma.c
|
||||
|
||||
INTEL IPU3 CSI-2 CIO2 DRIVER
|
||||
M: Yong Zhi <yong.zhi@intel.com>
|
||||
M: Sakari Ailus <sakari.ailus@linux.intel.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/media/pci/intel/ipu3/
|
||||
F: Documentation/media/uapi/v4l/pixfmt-srggb10-ipu3.rst
|
||||
|
||||
INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT
|
||||
M: Krzysztof Halasa <khalasa@piap.pl>
|
||||
S: Maintained
|
||||
|
@ -8749,6 +8749,15 @@ T: git git://linuxtv.org/media_tree.git
|
|||
S: Maintained
|
||||
F: drivers/media/dvb-frontends/stv6111*
|
||||
|
||||
MEDIA DRIVERS FOR NVIDIA TEGRA - VDE
|
||||
M: Dmitry Osipenko <digetx@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
L: linux-tegra@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/media/nvidia,tegra-vde.txt
|
||||
F: drivers/staging/media/tegra-vde/
|
||||
|
||||
MEDIA INPUT INFRASTRUCTURE (V4L/DVB)
|
||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||
|
@ -10165,6 +10174,14 @@ S: Maintained
|
|||
F: drivers/media/i2c/ov7670.c
|
||||
F: Documentation/devicetree/bindings/media/i2c/ov7670.txt
|
||||
|
||||
OMNIVISION OV7740 SENSOR DRIVER
|
||||
M: Wenyou Yang <wenyou.yang@microchip.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/ov7740.c
|
||||
F: Documentation/devicetree/bindings/media/i2c/ov7740.txt
|
||||
|
||||
ONENAND FLASH DRIVER
|
||||
M: Kyungmin Park <kyungmin.park@samsung.com>
|
||||
L: linux-mtd@lists.infradead.org
|
||||
|
@ -12471,6 +12488,14 @@ T: git git://linuxtv.org/anttip/media_tree.git
|
|||
S: Maintained
|
||||
F: drivers/media/tuners/si2157*
|
||||
|
||||
SI2165 MEDIA DRIVER
|
||||
M: Matthias Schwarzott <zzam@gentoo.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: https://linuxtv.org
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
S: Maintained
|
||||
F: drivers/media/dvb-frontends/si2165*
|
||||
|
||||
SI2168 MEDIA DRIVER
|
||||
M: Antti Palosaari <crope@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
|
@ -13048,12 +13073,6 @@ S: Odd Fixes
|
|||
F: Documentation/devicetree/bindings/staging/iio/
|
||||
F: drivers/staging/iio/
|
||||
|
||||
STAGING - LIRC (LINUX INFRARED REMOTE CONTROL) DRIVERS
|
||||
M: Jarod Wilson <jarod@wilsonet.com>
|
||||
W: http://www.lirc.org/
|
||||
S: Odd Fixes
|
||||
F: drivers/staging/media/lirc/
|
||||
|
||||
STAGING - LUSTRE PARALLEL FILESYSTEM
|
||||
M: Oleg Drokin <oleg.drokin@intel.com>
|
||||
M: Andreas Dilger <andreas.dilger@intel.com>
|
||||
|
@ -13440,6 +13459,15 @@ T: git git://linuxtv.org/anttip/media_tree.git
|
|||
S: Maintained
|
||||
F: drivers/media/tuners/tda18218*
|
||||
|
||||
TDA18250 MEDIA DRIVER
|
||||
M: Olli Salonen <olli.salonen@iki.fi>
|
||||
L: linux-media@vger.kernel.org
|
||||
W: https://linuxtv.org
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/tuners/tda18250*
|
||||
|
||||
TDA18271 MEDIA DRIVER
|
||||
M: Michael Krufky <mkrufky@linuxtv.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
|
|
|
@ -780,6 +780,8 @@ cam1: camera@3e {
|
|||
|
||||
reset-gpio = <&gpio4 6 GPIO_ACTIVE_HIGH>; /* 102 */
|
||||
|
||||
lens-focus = <&ad5820>;
|
||||
|
||||
port {
|
||||
csi_cam1: endpoint {
|
||||
bus-type = <3>; /* CCP2 */
|
||||
|
|
|
@ -80,11 +80,11 @@ config MEDIA_SDR_SUPPORT
|
|||
config MEDIA_CEC_SUPPORT
|
||||
bool "HDMI CEC support"
|
||||
---help---
|
||||
Enable support for HDMI CEC (Consumer Electronics Control),
|
||||
which is an optional HDMI feature.
|
||||
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.
|
||||
Say Y when you have an HDMI receiver, transmitter or a USB CEC
|
||||
adapter that supports HDMI CEC.
|
||||
|
||||
source "drivers/media/cec/Kconfig"
|
||||
|
||||
|
@ -144,6 +144,18 @@ config DVB_CORE
|
|||
default y
|
||||
select CRC32
|
||||
|
||||
config DVB_MMAP
|
||||
bool "Enable DVB memory-mapped API (EXPERIMENTAL)"
|
||||
depends on DVB_CORE
|
||||
default n
|
||||
help
|
||||
This option enables DVB experimental memory-mapped API, with
|
||||
reduces the number of context switches to read DVB buffers, as
|
||||
the buffers can use mmap() syscalls.
|
||||
|
||||
Support for it is experimental. Use with care. If unsure,
|
||||
say N.
|
||||
|
||||
config DVB_NET
|
||||
bool "DVB Network Support"
|
||||
default (NET && INET)
|
||||
|
|
|
@ -540,7 +540,7 @@ void cec_transmit_done_ts(struct cec_adapter *adap, u8 status,
|
|||
unsigned int attempts_made = arb_lost_cnt + nack_cnt +
|
||||
low_drive_cnt + error_cnt;
|
||||
|
||||
dprintk(2, "%s: status %02x\n", __func__, status);
|
||||
dprintk(2, "%s: status 0x%02x\n", __func__, status);
|
||||
if (attempts_made < 1)
|
||||
attempts_made = 1;
|
||||
|
||||
|
@ -1788,9 +1788,6 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
|
|||
int la_idx = cec_log_addr2idx(adap, dest_laddr);
|
||||
bool from_unregistered = init_laddr == 0xf;
|
||||
struct cec_msg tx_cec_msg = { };
|
||||
#ifdef CONFIG_MEDIA_CEC_RC
|
||||
int scancode;
|
||||
#endif
|
||||
|
||||
dprintk(2, "%s: %*ph\n", __func__, msg->len, msg->msg);
|
||||
|
||||
|
@ -1886,9 +1883,11 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
|
|||
*/
|
||||
case 0x60:
|
||||
if (msg->len == 2)
|
||||
scancode = msg->msg[2];
|
||||
rc_keydown(adap->rc, RC_PROTO_CEC,
|
||||
msg->msg[2], 0);
|
||||
else
|
||||
scancode = msg->msg[2] << 8 | msg->msg[3];
|
||||
rc_keydown(adap->rc, RC_PROTO_CEC,
|
||||
msg->msg[2] << 8 | msg->msg[3], 0);
|
||||
break;
|
||||
/*
|
||||
* Other function messages that are not handled.
|
||||
|
@ -1901,54 +1900,11 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
|
|||
*/
|
||||
case 0x56: case 0x57:
|
||||
case 0x67: case 0x68: case 0x69: case 0x6a:
|
||||
scancode = -1;
|
||||
break;
|
||||
default:
|
||||
scancode = msg->msg[2];
|
||||
rc_keydown(adap->rc, RC_PROTO_CEC, msg->msg[2], 0);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Was repeating, but keypress timed out */
|
||||
if (adap->rc_repeating && !adap->rc->keypressed) {
|
||||
adap->rc_repeating = false;
|
||||
adap->rc_last_scancode = -1;
|
||||
}
|
||||
/* Different keypress from last time, ends repeat mode */
|
||||
if (adap->rc_last_scancode != scancode) {
|
||||
rc_keyup(adap->rc);
|
||||
adap->rc_repeating = false;
|
||||
}
|
||||
/* We can't handle this scancode */
|
||||
if (scancode < 0) {
|
||||
adap->rc_last_scancode = scancode;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Send key press */
|
||||
rc_keydown(adap->rc, RC_PROTO_CEC, scancode, 0);
|
||||
|
||||
/* When in repeating mode, we're done */
|
||||
if (adap->rc_repeating)
|
||||
break;
|
||||
|
||||
/*
|
||||
* We are not repeating, but the new scancode is
|
||||
* the same as the last one, and this second key press is
|
||||
* within 550 ms (the 'Follower Safety Timeout') from the
|
||||
* previous key press, so we now enable the repeating mode.
|
||||
*/
|
||||
if (adap->rc_last_scancode == scancode &&
|
||||
msg->rx_ts - adap->rc_last_keypress < 550 * NSEC_PER_MSEC) {
|
||||
adap->rc_repeating = true;
|
||||
break;
|
||||
}
|
||||
/*
|
||||
* Not in repeating mode, so avoid triggering repeat mode
|
||||
* by calling keyup.
|
||||
*/
|
||||
rc_keyup(adap->rc);
|
||||
adap->rc_last_scancode = scancode;
|
||||
adap->rc_last_keypress = msg->rx_ts;
|
||||
#endif
|
||||
break;
|
||||
|
||||
|
@ -1958,8 +1914,6 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
|
|||
break;
|
||||
#ifdef CONFIG_MEDIA_CEC_RC
|
||||
rc_keyup(adap->rc);
|
||||
adap->rc_repeating = false;
|
||||
adap->rc_last_scancode = -1;
|
||||
#endif
|
||||
break;
|
||||
|
||||
|
@ -2053,6 +2007,29 @@ void cec_monitor_all_cnt_dec(struct cec_adapter *adap)
|
|||
WARN_ON(call_op(adap, adap_monitor_all_enable, 0));
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper functions to keep track of the 'monitor pin' use count.
|
||||
*
|
||||
* These functions are called with adap->lock held.
|
||||
*/
|
||||
int cec_monitor_pin_cnt_inc(struct cec_adapter *adap)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (adap->monitor_pin_cnt == 0)
|
||||
ret = call_op(adap, adap_monitor_pin_enable, 1);
|
||||
if (ret == 0)
|
||||
adap->monitor_pin_cnt++;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void cec_monitor_pin_cnt_dec(struct cec_adapter *adap)
|
||||
{
|
||||
adap->monitor_pin_cnt--;
|
||||
if (adap->monitor_pin_cnt == 0)
|
||||
WARN_ON(call_op(adap, adap_monitor_pin_enable, 0));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
/*
|
||||
* Log the current state of the CEC adapter.
|
||||
|
|
|
@ -46,12 +46,11 @@ static inline struct cec_devnode *cec_devnode_data(struct file *filp)
|
|||
static __poll_t cec_poll(struct file *filp,
|
||||
struct poll_table_struct *poll)
|
||||
{
|
||||
struct cec_devnode *devnode = cec_devnode_data(filp);
|
||||
struct cec_fh *fh = filp->private_data;
|
||||
struct cec_adapter *adap = fh->adap;
|
||||
__poll_t res = 0;
|
||||
|
||||
if (!devnode->registered)
|
||||
if (!cec_is_registered(adap))
|
||||
return POLLERR | POLLHUP;
|
||||
mutex_lock(&adap->lock);
|
||||
if (adap->is_configured &&
|
||||
|
@ -354,6 +353,7 @@ static long cec_s_mode(struct cec_adapter *adap, struct cec_fh *fh,
|
|||
u32 mode;
|
||||
u8 mode_initiator;
|
||||
u8 mode_follower;
|
||||
bool send_pin_event = false;
|
||||
long err = 0;
|
||||
|
||||
if (copy_from_user(&mode, parg, sizeof(mode)))
|
||||
|
@ -433,6 +433,19 @@ static long cec_s_mode(struct cec_adapter *adap, struct cec_fh *fh,
|
|||
}
|
||||
}
|
||||
|
||||
if (!err) {
|
||||
bool old_mon_pin = fh->mode_follower == CEC_MODE_MONITOR_PIN;
|
||||
bool new_mon_pin = mode_follower == CEC_MODE_MONITOR_PIN;
|
||||
|
||||
if (old_mon_pin != new_mon_pin) {
|
||||
send_pin_event = new_mon_pin;
|
||||
if (new_mon_pin)
|
||||
err = cec_monitor_pin_cnt_inc(adap);
|
||||
else
|
||||
cec_monitor_pin_cnt_dec(adap);
|
||||
}
|
||||
}
|
||||
|
||||
if (err) {
|
||||
mutex_unlock(&adap->lock);
|
||||
return err;
|
||||
|
@ -440,11 +453,9 @@ static long cec_s_mode(struct cec_adapter *adap, struct cec_fh *fh,
|
|||
|
||||
if (fh->mode_follower == CEC_MODE_FOLLOWER)
|
||||
adap->follower_cnt--;
|
||||
if (fh->mode_follower == CEC_MODE_MONITOR_PIN)
|
||||
adap->monitor_pin_cnt--;
|
||||
if (mode_follower == CEC_MODE_FOLLOWER)
|
||||
adap->follower_cnt++;
|
||||
if (mode_follower == CEC_MODE_MONITOR_PIN) {
|
||||
if (send_pin_event) {
|
||||
struct cec_event ev = {
|
||||
.flags = CEC_EVENT_FL_INITIAL_STATE,
|
||||
};
|
||||
|
@ -452,7 +463,6 @@ static long cec_s_mode(struct cec_adapter *adap, struct cec_fh *fh,
|
|||
ev.event = adap->cec_pin_is_high ? CEC_EVENT_PIN_CEC_HIGH :
|
||||
CEC_EVENT_PIN_CEC_LOW;
|
||||
cec_queue_event_fh(fh, &ev, 0);
|
||||
adap->monitor_pin_cnt++;
|
||||
}
|
||||
if (mode_follower == CEC_MODE_EXCL_FOLLOWER ||
|
||||
mode_follower == CEC_MODE_EXCL_FOLLOWER_PASSTHRU) {
|
||||
|
@ -475,13 +485,12 @@ static long cec_s_mode(struct cec_adapter *adap, struct cec_fh *fh,
|
|||
|
||||
static long cec_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct cec_devnode *devnode = cec_devnode_data(filp);
|
||||
struct cec_fh *fh = filp->private_data;
|
||||
struct cec_adapter *adap = fh->adap;
|
||||
bool block = !(filp->f_flags & O_NONBLOCK);
|
||||
void __user *parg = (void __user *)arg;
|
||||
|
||||
if (!devnode->registered)
|
||||
if (!cec_is_registered(adap))
|
||||
return -ENODEV;
|
||||
|
||||
switch (cmd) {
|
||||
|
@ -608,16 +617,15 @@ static int cec_release(struct inode *inode, struct file *filp)
|
|||
if (fh->mode_follower == CEC_MODE_FOLLOWER)
|
||||
adap->follower_cnt--;
|
||||
if (fh->mode_follower == CEC_MODE_MONITOR_PIN)
|
||||
adap->monitor_pin_cnt--;
|
||||
cec_monitor_pin_cnt_dec(adap);
|
||||
if (fh->mode_follower == CEC_MODE_MONITOR_ALL)
|
||||
cec_monitor_all_cnt_dec(adap);
|
||||
mutex_unlock(&adap->lock);
|
||||
|
||||
mutex_lock(&devnode->lock);
|
||||
list_del(&fh->list);
|
||||
if (list_empty(&devnode->fhs) &&
|
||||
!adap->needs_hpd &&
|
||||
adap->phys_addr == CEC_PHYS_ADDR_INVALID) {
|
||||
if (cec_is_registered(adap) && list_empty(&devnode->fhs) &&
|
||||
!adap->needs_hpd && adap->phys_addr == CEC_PHYS_ADDR_INVALID) {
|
||||
WARN_ON(adap->ops->adap_enable(adap, false));
|
||||
}
|
||||
mutex_unlock(&devnode->lock);
|
||||
|
|
|
@ -160,8 +160,9 @@ static int __must_check cec_devnode_register(struct cec_devnode *devnode,
|
|||
* This function can safely be called if the device node has never been
|
||||
* registered or has already been unregistered.
|
||||
*/
|
||||
static void cec_devnode_unregister(struct cec_devnode *devnode)
|
||||
static void cec_devnode_unregister(struct cec_adapter *adap)
|
||||
{
|
||||
struct cec_devnode *devnode = &adap->devnode;
|
||||
struct cec_fh *fh;
|
||||
|
||||
mutex_lock(&devnode->lock);
|
||||
|
@ -179,6 +180,11 @@ static void cec_devnode_unregister(struct cec_devnode *devnode)
|
|||
devnode->unregistered = true;
|
||||
mutex_unlock(&devnode->lock);
|
||||
|
||||
mutex_lock(&adap->lock);
|
||||
__cec_s_phys_addr(adap, CEC_PHYS_ADDR_INVALID, false);
|
||||
__cec_s_log_addrs(adap, NULL, false);
|
||||
mutex_unlock(&adap->lock);
|
||||
|
||||
cdev_device_del(&devnode->cdev, &devnode->dev);
|
||||
put_device(&devnode->dev);
|
||||
}
|
||||
|
@ -192,7 +198,7 @@ static void cec_cec_notify(struct cec_adapter *adap, u16 pa)
|
|||
void cec_register_cec_notifier(struct cec_adapter *adap,
|
||||
struct cec_notifier *notifier)
|
||||
{
|
||||
if (WARN_ON(!adap->devnode.registered))
|
||||
if (WARN_ON(!cec_is_registered(adap)))
|
||||
return;
|
||||
|
||||
adap->notifier = notifier;
|
||||
|
@ -280,7 +286,6 @@ struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
|
|||
adap->rc->priv = adap;
|
||||
adap->rc->map_name = RC_MAP_CEC;
|
||||
adap->rc->timeout = MS_TO_NS(100);
|
||||
adap->rc_last_scancode = -1;
|
||||
#endif
|
||||
return adap;
|
||||
}
|
||||
|
@ -312,17 +317,6 @@ int cec_register_adapter(struct cec_adapter *adap,
|
|||
adap->rc = NULL;
|
||||
return res;
|
||||
}
|
||||
/*
|
||||
* The REP_DELAY for CEC is really the time between the initial
|
||||
* 'User Control Pressed' message and the second. The first
|
||||
* keypress is always seen as non-repeating, the second
|
||||
* (provided it has the same UI Command) will start the 'Press
|
||||
* and Hold' (aka repeat) behavior. By setting REP_DELAY to the
|
||||
* same value as REP_PERIOD the expected CEC behavior is
|
||||
* reproduced.
|
||||
*/
|
||||
adap->rc->input_dev->rep[REP_DELAY] =
|
||||
adap->rc->input_dev->rep[REP_PERIOD];
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -373,7 +367,7 @@ void cec_unregister_adapter(struct cec_adapter *adap)
|
|||
if (adap->notifier)
|
||||
cec_notifier_unregister(adap->notifier);
|
||||
#endif
|
||||
cec_devnode_unregister(&adap->devnode);
|
||||
cec_devnode_unregister(adap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cec_unregister_adapter);
|
||||
|
||||
|
@ -381,9 +375,6 @@ void cec_delete_adapter(struct cec_adapter *adap)
|
|||
{
|
||||
if (IS_ERR_OR_NULL(adap))
|
||||
return;
|
||||
mutex_lock(&adap->lock);
|
||||
__cec_s_phys_addr(adap, CEC_PHYS_ADDR_INVALID, false);
|
||||
mutex_unlock(&adap->lock);
|
||||
kthread_stop(adap->kthread);
|
||||
if (adap->kthread_config)
|
||||
kthread_stop(adap->kthread_config);
|
||||
|
|
|
@ -40,6 +40,8 @@ void cec_put_device(struct cec_devnode *devnode);
|
|||
/* cec-adap.c */
|
||||
int cec_monitor_all_cnt_inc(struct cec_adapter *adap);
|
||||
void cec_monitor_all_cnt_dec(struct cec_adapter *adap);
|
||||
int cec_monitor_pin_cnt_inc(struct cec_adapter *adap);
|
||||
void cec_monitor_pin_cnt_dec(struct cec_adapter *adap);
|
||||
int cec_adap_status(struct seq_file *file, void *priv);
|
||||
int cec_thread_func(void *_adap);
|
||||
void __cec_s_phys_addr(struct cec_adapter *adap, u16 phys_addr, bool block);
|
||||
|
|
|
@ -16,6 +16,7 @@ config CYPRESS_FIRMWARE
|
|||
tristate "Cypress firmware helper routines"
|
||||
depends on USB
|
||||
|
||||
source "drivers/media/common/videobuf2/Kconfig"
|
||||
source "drivers/media/common/b2c2/Kconfig"
|
||||
source "drivers/media/common/saa7146/Kconfig"
|
||||
source "drivers/media/common/siano/Kconfig"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
obj-y += b2c2/ saa7146/ siano/ v4l2-tpg/
|
||||
obj-y += b2c2/ saa7146/ siano/ v4l2-tpg/ videobuf2/
|
||||
obj-$(CONFIG_VIDEO_CX2341X) += cx2341x.o
|
||||
obj-$(CONFIG_VIDEO_TVEEPROM) += tveeprom.o
|
||||
obj-$(CONFIG_CYPRESS_FIRMWARE) += cypress_firmware.o
|
||||
|
|
|
@ -4,6 +4,5 @@ b2c2-flexcop-objs += flexcop-sram.o flexcop-eeprom.o flexcop-misc.o
|
|||
b2c2-flexcop-objs += flexcop-hw-filter.o
|
||||
obj-$(CONFIG_DVB_B2C2_FLEXCOP) += b2c2-flexcop.o
|
||||
|
||||
ccflags-y += -Idrivers/media/dvb-core/
|
||||
ccflags-y += -Idrivers/media/dvb-frontends/
|
||||
ccflags-y += -Idrivers/media/tuners/
|
||||
|
|
|
@ -13,10 +13,10 @@
|
|||
|
||||
#include "flexcop-reg.h"
|
||||
|
||||
#include "dmxdev.h"
|
||||
#include "dvb_demux.h"
|
||||
#include "dvb_net.h"
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dmxdev.h>
|
||||
#include <media/dvb_demux.h>
|
||||
#include <media/dvb_net.h>
|
||||
#include <media/dvb_frontend.h>
|
||||
|
||||
#define FC_MAX_FEED 256
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <media/v4l2-event.h>
|
||||
#include <media/v4l2-ctrls.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
static int max_memory = 32;
|
||||
|
||||
|
@ -86,13 +87,11 @@ static struct saa7146_format formats[] = {
|
|||
due to this, it's impossible to provide additional *packed* formats, which are simply byte swapped
|
||||
(like V4L2_PIX_FMT_YUYV) ... 8-( */
|
||||
|
||||
static int NUM_FORMATS = sizeof(formats)/sizeof(struct saa7146_format);
|
||||
|
||||
struct saa7146_format* saa7146_format_by_fourcc(struct saa7146_dev *dev, int fourcc)
|
||||
{
|
||||
int i, j = NUM_FORMATS;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < j; i++) {
|
||||
for (i = 0; i < ARRAY_SIZE(formats); i++) {
|
||||
if (formats[i].pixelformat == fourcc) {
|
||||
return formats+i;
|
||||
}
|
||||
|
@ -524,7 +523,7 @@ static int vidioc_s_fbuf(struct file *file, void *fh, const struct v4l2_framebuf
|
|||
|
||||
static int vidioc_enum_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fmtdesc *f)
|
||||
{
|
||||
if (f->index >= NUM_FORMATS)
|
||||
if (f->index >= ARRAY_SIZE(formats))
|
||||
return -EINVAL;
|
||||
strlcpy((char *)f->description, formats[f->index].name,
|
||||
sizeof(f->description));
|
||||
|
@ -1002,9 +1001,9 @@ const struct v4l2_ioctl_ops saa7146_video_ioctl_ops = {
|
|||
.vidioc_try_fmt_vid_overlay = vidioc_try_fmt_vid_overlay,
|
||||
.vidioc_s_fmt_vid_overlay = vidioc_s_fmt_vid_overlay,
|
||||
|
||||
.vidioc_overlay = vidioc_overlay,
|
||||
.vidioc_g_fbuf = vidioc_g_fbuf,
|
||||
.vidioc_s_fbuf = vidioc_s_fbuf,
|
||||
.vidioc_overlay = vidioc_overlay,
|
||||
.vidioc_g_fbuf = vidioc_g_fbuf,
|
||||
.vidioc_s_fbuf = vidioc_s_fbuf,
|
||||
.vidioc_reqbufs = vidioc_reqbufs,
|
||||
.vidioc_querybuf = vidioc_querybuf,
|
||||
.vidioc_qbuf = vidioc_qbuf,
|
||||
|
@ -1013,7 +1012,7 @@ const struct v4l2_ioctl_ops saa7146_video_ioctl_ops = {
|
|||
.vidioc_s_std = vidioc_s_std,
|
||||
.vidioc_streamon = vidioc_streamon,
|
||||
.vidioc_streamoff = vidioc_streamoff,
|
||||
.vidioc_g_parm = vidioc_g_parm,
|
||||
.vidioc_g_parm = vidioc_g_parm,
|
||||
.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
|
||||
.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
|
||||
};
|
||||
|
|
|
@ -11,7 +11,3 @@ endif
|
|||
ifeq ($(CONFIG_SMS_SIANO_DEBUGFS),y)
|
||||
smsdvb-objs += smsdvb-debugfs.o
|
||||
endif
|
||||
|
||||
ccflags-y += -Idrivers/media/dvb-core
|
||||
ccflags-y += $(extra-cflags-y) $(extra-cflags-m)
|
||||
|
||||
|
|
|
@ -1,21 +1,6 @@
|
|||
/***********************************************************************
|
||||
*
|
||||
* Copyright(c) 2013 Mauro Carvalho Chehab
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
***********************************************************************/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// Copyright(c) 2013 Mauro Carvalho Chehab
|
||||
|
||||
#include "smscoreapi.h"
|
||||
|
||||
|
@ -26,10 +11,10 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/usb.h>
|
||||
|
||||
#include "dmxdev.h"
|
||||
#include "dvbdev.h"
|
||||
#include "dvb_demux.h"
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dmxdev.h>
|
||||
#include <media/dvbdev.h>
|
||||
#include <media/dvb_demux.h>
|
||||
#include <media/dvb_frontend.h>
|
||||
|
||||
#include "smsdvb.h"
|
||||
|
||||
|
|
|
@ -26,10 +26,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include <linux/init.h>
|
||||
#include <asm/div64.h>
|
||||
|
||||
#include "dmxdev.h"
|
||||
#include "dvbdev.h"
|
||||
#include "dvb_demux.h"
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dmxdev.h>
|
||||
#include <media/dvbdev.h>
|
||||
#include <media/dvb_demux.h>
|
||||
#include <media/dvb_frontend.h>
|
||||
|
||||
#include "sms-cards.h"
|
||||
|
||||
|
@ -271,7 +271,7 @@ static void smsdvb_update_per_slices(struct smsdvb_client_t *client,
|
|||
c->post_bit_count.stat[0].uvalue += p->ber_bit_count;
|
||||
|
||||
/* Legacy PER/BER */
|
||||
tmp = p->ets_packets * 65535;
|
||||
tmp = p->ets_packets * 65535ULL;
|
||||
if (p->ts_packets + p->ets_packets)
|
||||
do_div(tmp, p->ts_packets + p->ets_packets);
|
||||
client->legacy_per = tmp;
|
||||
|
|
|
@ -1,28 +1,13 @@
|
|||
/****************************************************************
|
||||
|
||||
Siano Mobile Silicon, Inc.
|
||||
MDTV receiver kernel modules.
|
||||
Copyright (C) 2006-2009, Uri Shkolnik
|
||||
|
||||
Copyright (c) 2010 - Mauro Carvalho Chehab
|
||||
- Ported the driver to use rc-core
|
||||
- IR raw event decoding is now done at rc-core
|
||||
- Code almost re-written
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
****************************************************************/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// Siano Mobile Silicon, Inc.
|
||||
// MDTV receiver kernel modules.
|
||||
// Copyright (C) 2006-2009, Uri Shkolnik
|
||||
//
|
||||
// Copyright (c) 2010 - Mauro Carvalho Chehab
|
||||
// - Ported the driver to use rc-core
|
||||
// - IR raw event decoding is now done at rc-core
|
||||
// - Code almost re-written
|
||||
|
||||
|
||||
#include "smscoreapi.h"
|
||||
|
|
|
@ -1,28 +1,15 @@
|
|||
/****************************************************************
|
||||
|
||||
Siano Mobile Silicon, Inc.
|
||||
MDTV receiver kernel modules.
|
||||
Copyright (C) 2006-2009, Uri Shkolnik
|
||||
|
||||
Copyright (c) 2010 - Mauro Carvalho Chehab
|
||||
- Ported the driver to use rc-core
|
||||
- IR raw event decoding is now done at rc-core
|
||||
- Code almost re-written
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
****************************************************************/
|
||||
/*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*
|
||||
* Siano Mobile Silicon, Inc.
|
||||
* MDTV receiver kernel modules.
|
||||
* Copyright (C) 2006-2009, Uri Shkolnik
|
||||
*
|
||||
* Copyright (c) 2010 - Mauro Carvalho Chehab
|
||||
* - Ported the driver to use rc-core
|
||||
* - IR raw event decoding is now done at rc-core
|
||||
* - Code almost re-written
|
||||
*/
|
||||
|
||||
#ifndef __SMS_IR_H__
|
||||
#define __SMS_IR_H__
|
||||
|
|
|
@ -36,10 +36,10 @@
|
|||
*/
|
||||
|
||||
#include <linux/videodev2.h>
|
||||
#include <media/v4l2-tpg-colors.h>
|
||||
#include <media/tpg/v4l2-tpg.h>
|
||||
|
||||
/* sRGB colors with range [0-255] */
|
||||
const struct color tpg_colors[TPG_COLOR_MAX] = {
|
||||
const struct tpg_rbg_color8 tpg_colors[TPG_COLOR_MAX] = {
|
||||
/*
|
||||
* Colors to test colorspace conversion: converting these colors
|
||||
* to other colorspaces will never lead to out-of-gamut colors.
|
||||
|
@ -597,7 +597,7 @@ const unsigned short tpg_linear_to_rec709[255 * 16 + 1] = {
|
|||
};
|
||||
|
||||
/* Generated table */
|
||||
const struct color16 tpg_csc_colors[V4L2_COLORSPACE_DCI_P3 + 1][V4L2_XFER_FUNC_SMPTE2084 + 1][TPG_COLOR_CSC_BLACK + 1] = {
|
||||
const struct tpg_rbg_color16 tpg_csc_colors[V4L2_COLORSPACE_DCI_P3 + 1][V4L2_XFER_FUNC_SMPTE2084 + 1][TPG_COLOR_CSC_BLACK + 1] = {
|
||||
[V4L2_COLORSPACE_SMPTE170M][V4L2_XFER_FUNC_709][0] = { 2939, 2939, 2939 },
|
||||
[V4L2_COLORSPACE_SMPTE170M][V4L2_XFER_FUNC_709][1] = { 2953, 2963, 586 },
|
||||
[V4L2_COLORSPACE_SMPTE170M][V4L2_XFER_FUNC_709][2] = { 0, 2967, 2937 },
|
||||
|
@ -1392,7 +1392,7 @@ int main(int argc, char **argv)
|
|||
printf("\n};\n\n");
|
||||
|
||||
printf("/* Generated table */\n");
|
||||
printf("const struct color16 tpg_csc_colors[V4L2_COLORSPACE_DCI_P3 + 1][V4L2_XFER_FUNC_SMPTE2084 + 1][TPG_COLOR_CSC_BLACK + 1] = {\n");
|
||||
printf("const struct tpg_rbg_color16 tpg_csc_colors[V4L2_COLORSPACE_DCI_P3 + 1][V4L2_XFER_FUNC_SMPTE2084 + 1][TPG_COLOR_CSC_BLACK + 1] = {\n");
|
||||
for (c = 0; c <= V4L2_COLORSPACE_DCI_P3; c++) {
|
||||
for (x = 1; x <= V4L2_XFER_FUNC_SMPTE2084; x++) {
|
||||
for (i = 0; i <= TPG_COLOR_CSC_BLACK; i++) {
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <media/v4l2-tpg.h>
|
||||
#include <media/tpg/v4l2-tpg.h>
|
||||
|
||||
/* Must remain in sync with enum tpg_pattern */
|
||||
const char * const tpg_pattern_strings[] = {
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
# Used by drivers that need Videobuf2 modules
|
||||
config VIDEOBUF2_CORE
|
||||
select DMA_SHARED_BUFFER
|
||||
tristate
|
||||
|
||||
config VIDEOBUF2_MEMOPS
|
||||
tristate
|
||||
select FRAME_VECTOR
|
||||
|
||||
config VIDEOBUF2_DMA_CONTIG
|
||||
tristate
|
||||
depends on HAS_DMA
|
||||
select VIDEOBUF2_CORE
|
||||
select VIDEOBUF2_MEMOPS
|
||||
select DMA_SHARED_BUFFER
|
||||
|
||||
config VIDEOBUF2_VMALLOC
|
||||
tristate
|
||||
select VIDEOBUF2_CORE
|
||||
select VIDEOBUF2_MEMOPS
|
||||
select DMA_SHARED_BUFFER
|
||||
|
||||
config VIDEOBUF2_DMA_SG
|
||||
tristate
|
||||
depends on HAS_DMA
|
||||
select VIDEOBUF2_CORE
|
||||
select VIDEOBUF2_MEMOPS
|
||||
|
||||
config VIDEOBUF2_DVB
|
||||
tristate
|
||||
select VIDEOBUF2_CORE
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
obj-$(CONFIG_VIDEOBUF2_CORE) += videobuf2-core.o videobuf2-v4l2.o
|
||||
obj-$(CONFIG_VIDEOBUF2_MEMOPS) += videobuf2-memops.o
|
||||
obj-$(CONFIG_VIDEOBUF2_VMALLOC) += videobuf2-vmalloc.o
|
||||
obj-$(CONFIG_VIDEOBUF2_DMA_CONTIG) += videobuf2-dma-contig.o
|
||||
obj-$(CONFIG_VIDEOBUF2_DMA_SG) += videobuf2-dma-sg.o
|
||||
obj-$(CONFIG_VIDEOBUF2_DVB) += videobuf2-dvb.o
|
|
@ -14,6 +14,8 @@
|
|||
* the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
|
@ -32,10 +34,10 @@
|
|||
static int debug;
|
||||
module_param(debug, int, 0644);
|
||||
|
||||
#define dprintk(level, fmt, arg...) \
|
||||
do { \
|
||||
if (debug >= level) \
|
||||
pr_info("vb2-core: %s: " fmt, __func__, ## arg); \
|
||||
#define dprintk(level, fmt, arg...) \
|
||||
do { \
|
||||
if (debug >= level) \
|
||||
pr_info("%s: " fmt, __func__, ## arg); \
|
||||
} while (0)
|
||||
|
||||
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
||||
|
@ -332,6 +334,10 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory,
|
|||
struct vb2_buffer *vb;
|
||||
int ret;
|
||||
|
||||
/* Ensure that q->num_buffers+num_buffers is below VB2_MAX_FRAME */
|
||||
num_buffers = min_t(unsigned int, num_buffers,
|
||||
VB2_MAX_FRAME - q->num_buffers);
|
||||
|
||||
for (buffer = 0; buffer < num_buffers; ++buffer) {
|
||||
/* Allocate videobuf buffer structures */
|
||||
vb = kzalloc(q->buf_struct_size, GFP_KERNEL);
|
||||
|
@ -460,12 +466,12 @@ static int __vb2_queue_free(struct vb2_queue *q, unsigned int buffers)
|
|||
q->cnt_wait_prepare != q->cnt_wait_finish;
|
||||
|
||||
if (unbalanced || debug) {
|
||||
pr_info("vb2: counters for queue %p:%s\n", q,
|
||||
pr_info("counters for queue %p:%s\n", q,
|
||||
unbalanced ? " UNBALANCED!" : "");
|
||||
pr_info("vb2: setup: %u start_streaming: %u stop_streaming: %u\n",
|
||||
pr_info(" setup: %u start_streaming: %u stop_streaming: %u\n",
|
||||
q->cnt_queue_setup, q->cnt_start_streaming,
|
||||
q->cnt_stop_streaming);
|
||||
pr_info("vb2: wait_prepare: %u wait_finish: %u\n",
|
||||
pr_info(" wait_prepare: %u wait_finish: %u\n",
|
||||
q->cnt_wait_prepare, q->cnt_wait_finish);
|
||||
}
|
||||
q->cnt_queue_setup = 0;
|
||||
|
@ -486,23 +492,23 @@ static int __vb2_queue_free(struct vb2_queue *q, unsigned int buffers)
|
|||
vb->cnt_buf_init != vb->cnt_buf_cleanup;
|
||||
|
||||
if (unbalanced || debug) {
|
||||
pr_info("vb2: counters for queue %p, buffer %d:%s\n",
|
||||
pr_info(" counters for queue %p, buffer %d:%s\n",
|
||||
q, buffer, unbalanced ? " UNBALANCED!" : "");
|
||||
pr_info("vb2: buf_init: %u buf_cleanup: %u buf_prepare: %u buf_finish: %u\n",
|
||||
pr_info(" buf_init: %u buf_cleanup: %u buf_prepare: %u buf_finish: %u\n",
|
||||
vb->cnt_buf_init, vb->cnt_buf_cleanup,
|
||||
vb->cnt_buf_prepare, vb->cnt_buf_finish);
|
||||
pr_info("vb2: buf_queue: %u buf_done: %u\n",
|
||||
pr_info(" buf_queue: %u buf_done: %u\n",
|
||||
vb->cnt_buf_queue, vb->cnt_buf_done);
|
||||
pr_info("vb2: alloc: %u put: %u prepare: %u finish: %u mmap: %u\n",
|
||||
pr_info(" alloc: %u put: %u prepare: %u finish: %u mmap: %u\n",
|
||||
vb->cnt_mem_alloc, vb->cnt_mem_put,
|
||||
vb->cnt_mem_prepare, vb->cnt_mem_finish,
|
||||
vb->cnt_mem_mmap);
|
||||
pr_info("vb2: get_userptr: %u put_userptr: %u\n",
|
||||
pr_info(" get_userptr: %u put_userptr: %u\n",
|
||||
vb->cnt_mem_get_userptr, vb->cnt_mem_put_userptr);
|
||||
pr_info("vb2: attach_dmabuf: %u detach_dmabuf: %u map_dmabuf: %u unmap_dmabuf: %u\n",
|
||||
pr_info(" attach_dmabuf: %u detach_dmabuf: %u map_dmabuf: %u unmap_dmabuf: %u\n",
|
||||
vb->cnt_mem_attach_dmabuf, vb->cnt_mem_detach_dmabuf,
|
||||
vb->cnt_mem_map_dmabuf, vb->cnt_mem_unmap_dmabuf);
|
||||
pr_info("vb2: get_dmabuf: %u num_users: %u vaddr: %u cookie: %u\n",
|
||||
pr_info(" get_dmabuf: %u num_users: %u vaddr: %u cookie: %u\n",
|
||||
vb->cnt_mem_get_dmabuf,
|
||||
vb->cnt_mem_num_users,
|
||||
vb->cnt_mem_vaddr,
|
||||
|
@ -520,7 +526,7 @@ static int __vb2_queue_free(struct vb2_queue *q, unsigned int buffers)
|
|||
|
||||
q->num_buffers -= buffers;
|
||||
if (!q->num_buffers) {
|
||||
q->memory = 0;
|
||||
q->memory = VB2_MEMORY_UNKNOWN;
|
||||
INIT_LIST_HEAD(&q->queued_list);
|
||||
}
|
||||
return 0;
|
||||
|
@ -662,7 +668,8 @@ int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory,
|
|||
return -EBUSY;
|
||||
}
|
||||
|
||||
if (*count == 0 || q->num_buffers != 0 || q->memory != memory) {
|
||||
if (*count == 0 || q->num_buffers != 0 ||
|
||||
(q->memory != VB2_MEMORY_UNKNOWN && q->memory != memory)) {
|
||||
/*
|
||||
* We already have buffers allocated, so first check if they
|
||||
* are not in use and can be freed.
|
||||
|
@ -696,8 +703,9 @@ int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory,
|
|||
/*
|
||||
* Make sure the requested values and current defaults are sane.
|
||||
*/
|
||||
num_buffers = min_t(unsigned int, *count, VB2_MAX_FRAME);
|
||||
num_buffers = max_t(unsigned int, num_buffers, q->min_buffers_needed);
|
||||
WARN_ON(q->min_buffers_needed > VB2_MAX_FRAME);
|
||||
num_buffers = max_t(unsigned int, *count, q->min_buffers_needed);
|
||||
num_buffers = min_t(unsigned int, num_buffers, VB2_MAX_FRAME);
|
||||
memset(q->alloc_devs, 0, sizeof(q->alloc_devs));
|
||||
q->memory = memory;
|
||||
|
||||
|
@ -1650,8 +1658,11 @@ static void __vb2_queue_cancel(struct vb2_queue *q)
|
|||
*/
|
||||
if (WARN_ON(atomic_read(&q->owned_by_drv_count))) {
|
||||
for (i = 0; i < q->num_buffers; ++i)
|
||||
if (q->bufs[i]->state == VB2_BUF_STATE_ACTIVE)
|
||||
if (q->bufs[i]->state == VB2_BUF_STATE_ACTIVE) {
|
||||
pr_warn("driver bug: stop_streaming operation is leaving buf %p in active state\n",
|
||||
q->bufs[i]);
|
||||
vb2_buffer_done(q->bufs[i], VB2_BUF_STATE_ERROR);
|
||||
}
|
||||
/* Must be zero now */
|
||||
WARN_ON(atomic_read(&q->owned_by_drv_count));
|
||||
}
|
||||
|
@ -1994,6 +2005,8 @@ int vb2_core_queue_init(struct vb2_queue *q)
|
|||
mutex_init(&q->mmap_lock);
|
||||
init_waitqueue_head(&q->done_wq);
|
||||
|
||||
q->memory = VB2_MEMORY_UNKNOWN;
|
||||
|
||||
if (q->buf_struct_size == 0)
|
||||
q->buf_struct_size = sizeof(struct vb2_buffer);
|
||||
|
||||
|
@ -2522,7 +2535,7 @@ static int vb2_thread(void *data)
|
|||
break;
|
||||
call_void_qop(q, wait_finish, q);
|
||||
if (copy_timestamp)
|
||||
vb->timestamp = ktime_get_ns();;
|
||||
vb->timestamp = ktime_get_ns();
|
||||
if (!threadio->stop)
|
||||
ret = vb2_core_qbuf(q, vb->index, NULL);
|
||||
call_void_qop(q, wait_prepare, q);
|
|
@ -434,8 +434,10 @@ static void vb2_dc_put_userptr(void *buf_priv)
|
|||
pages = frame_vector_pages(buf->vec);
|
||||
/* sgt should exist only if vector contains pages... */
|
||||
BUG_ON(IS_ERR(pages));
|
||||
for (i = 0; i < frame_vector_count(buf->vec); i++)
|
||||
set_page_dirty_lock(pages[i]);
|
||||
if (buf->dma_dir == DMA_FROM_DEVICE ||
|
||||
buf->dma_dir == DMA_BIDIRECTIONAL)
|
||||
for (i = 0; i < frame_vector_count(buf->vec); i++)
|
||||
set_page_dirty_lock(pages[i]);
|
||||
sg_free_table(sgt);
|
||||
kfree(sgt);
|
||||
}
|
|
@ -292,11 +292,10 @@ static void vb2_dma_sg_put_userptr(void *buf_priv)
|
|||
if (buf->vaddr)
|
||||
vm_unmap_ram(buf->vaddr, buf->num_pages);
|
||||
sg_free_table(buf->dma_sgt);
|
||||
while (--i >= 0) {
|
||||
if (buf->dma_dir == DMA_FROM_DEVICE ||
|
||||
buf->dma_dir == DMA_BIDIRECTIONAL)
|
||||
if (buf->dma_dir == DMA_FROM_DEVICE ||
|
||||
buf->dma_dir == DMA_BIDIRECTIONAL)
|
||||
while (--i >= 0)
|
||||
set_page_dirty_lock(buf->pages[i]);
|
||||
}
|
||||
vb2_destroy_framevec(buf->vec);
|
||||
kfree(buf);
|
||||
}
|
|
@ -434,6 +434,8 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb,
|
|||
} else {
|
||||
/* Zero any output buffer flags as this is a capture buffer */
|
||||
vbuf->flags &= ~V4L2_BUFFER_OUT_FLAGS;
|
||||
/* Zero last flag, this is a signal from driver to userspace */
|
||||
vbuf->flags &= ~V4L2_BUF_FLAG_LAST;
|
||||
}
|
||||
|
||||
return 0;
|
|
@ -40,3 +40,16 @@ config DVB_DEMUX_SECTION_LOSS_LOG
|
|||
be very verbose.
|
||||
|
||||
If you are unsure about this, say N here.
|
||||
|
||||
config DVB_ULE_DEBUG
|
||||
bool "Enable DVB net ULE packet debug messages"
|
||||
depends on DVB_CORE
|
||||
default n
|
||||
help
|
||||
Enable extra log messages meant to detect problems while
|
||||
handling DVB network ULE 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.
|
||||
|
|
|
@ -4,9 +4,10 @@
|
|||
#
|
||||
|
||||
dvb-net-$(CONFIG_DVB_NET) := dvb_net.o
|
||||
dvb-vb2-$(CONFIG_DVB_MMSP) := dvb_vb2.o
|
||||
|
||||
dvb-core-objs := dvbdev.o dmxdev.o dvb_demux.o \
|
||||
dvb_ca_en50221.o dvb_frontend.o \
|
||||
$(dvb-net-y) dvb_ringbuffer.o dvb_math.o
|
||||
dvb-core-objs := dvbdev.o dmxdev.o dvb_demux.o \
|
||||
dvb_ca_en50221.o dvb_frontend.o \
|
||||
$(dvb-net-y) dvb_ringbuffer.o $(dvb-vb2-y) dvb_math.o
|
||||
|
||||
obj-$(CONFIG_DVB_CORE) += dvb-core.o
|
||||
|
|
|
@ -27,7 +27,8 @@
|
|||
#include <linux/ioctl.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include "dmxdev.h"
|
||||
#include <media/dmxdev.h>
|
||||
#include <media/dvb_vb2.h>
|
||||
|
||||
static int debug;
|
||||
|
||||
|
@ -127,6 +128,11 @@ static int dvb_dvr_open(struct inode *inode, struct file *file)
|
|||
struct dvb_device *dvbdev = file->private_data;
|
||||
struct dmxdev *dmxdev = dvbdev->priv;
|
||||
struct dmx_frontend *front;
|
||||
#ifndef DVB_MMAP
|
||||
bool need_ringbuffer = false;
|
||||
#else
|
||||
const bool need_ringbuffer = true;
|
||||
#endif
|
||||
|
||||
dprintk("%s\n", __func__);
|
||||
|
||||
|
@ -138,14 +144,19 @@ static int dvb_dvr_open(struct inode *inode, struct file *file)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
#ifndef DVB_MMAP
|
||||
if ((file->f_flags & O_ACCMODE) == O_RDONLY)
|
||||
need_ringbuffer = true;
|
||||
#else
|
||||
if ((file->f_flags & O_ACCMODE) == O_RDWR) {
|
||||
if (!(dmxdev->capabilities & DMXDEV_CAP_DUPLEX)) {
|
||||
mutex_unlock(&dmxdev->mutex);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
|
||||
if (need_ringbuffer) {
|
||||
void *mem;
|
||||
|
||||
if (!dvbdev->readers) {
|
||||
|
@ -158,6 +169,8 @@ static int dvb_dvr_open(struct inode *inode, struct file *file)
|
|||
return -ENOMEM;
|
||||
}
|
||||
dvb_ringbuffer_init(&dmxdev->dvr_buffer, mem, DVR_BUFFER_SIZE);
|
||||
dvb_vb2_init(&dmxdev->dvr_vb2_ctx, "dvr",
|
||||
file->f_flags & O_NONBLOCK);
|
||||
dvbdev->readers--;
|
||||
}
|
||||
|
||||
|
@ -187,6 +200,11 @@ static int dvb_dvr_release(struct inode *inode, struct file *file)
|
|||
{
|
||||
struct dvb_device *dvbdev = file->private_data;
|
||||
struct dmxdev *dmxdev = dvbdev->priv;
|
||||
#ifndef DVB_MMAP
|
||||
bool need_ringbuffer = false;
|
||||
#else
|
||||
const bool need_ringbuffer = true;
|
||||
#endif
|
||||
|
||||
mutex_lock(&dmxdev->mutex);
|
||||
|
||||
|
@ -195,7 +213,15 @@ static int dvb_dvr_release(struct inode *inode, struct file *file)
|
|||
dmxdev->demux->connect_frontend(dmxdev->demux,
|
||||
dmxdev->dvr_orig_fe);
|
||||
}
|
||||
if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
|
||||
#ifndef DVB_MMAP
|
||||
if ((file->f_flags & O_ACCMODE) == O_RDONLY)
|
||||
need_ringbuffer = true;
|
||||
#endif
|
||||
|
||||
if (need_ringbuffer) {
|
||||
if (dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx))
|
||||
dvb_vb2_stream_off(&dmxdev->dvr_vb2_ctx);
|
||||
dvb_vb2_release(&dmxdev->dvr_vb2_ctx);
|
||||
dvbdev->readers++;
|
||||
if (dmxdev->dvr_buffer.data) {
|
||||
void *mem = dmxdev->dvr_buffer.data;
|
||||
|
@ -359,7 +385,8 @@ static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len,
|
|||
struct dmxdev_filter *dmxdevfilter = filter->priv;
|
||||
int ret;
|
||||
|
||||
if (dmxdevfilter->buffer.error) {
|
||||
if (!dvb_vb2_is_streaming(&dmxdevfilter->vb2_ctx) &&
|
||||
dmxdevfilter->buffer.error) {
|
||||
wake_up(&dmxdevfilter->buffer.queue);
|
||||
return 0;
|
||||
}
|
||||
|
@ -370,11 +397,19 @@ static int dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len,
|
|||
}
|
||||
del_timer(&dmxdevfilter->timer);
|
||||
dprintk("section callback %*ph\n", 6, buffer1);
|
||||
ret = dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer1,
|
||||
buffer1_len);
|
||||
if (ret == buffer1_len) {
|
||||
ret = dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer2,
|
||||
buffer2_len);
|
||||
if (dvb_vb2_is_streaming(&dmxdevfilter->vb2_ctx)) {
|
||||
ret = dvb_vb2_fill_buffer(&dmxdevfilter->vb2_ctx,
|
||||
buffer1, buffer1_len);
|
||||
if (ret == buffer1_len)
|
||||
ret = dvb_vb2_fill_buffer(&dmxdevfilter->vb2_ctx,
|
||||
buffer2, buffer2_len);
|
||||
} else {
|
||||
ret = dvb_dmxdev_buffer_write(&dmxdevfilter->buffer,
|
||||
buffer1, buffer1_len);
|
||||
if (ret == buffer1_len) {
|
||||
ret = dvb_dmxdev_buffer_write(&dmxdevfilter->buffer,
|
||||
buffer2, buffer2_len);
|
||||
}
|
||||
}
|
||||
if (ret < 0)
|
||||
dmxdevfilter->buffer.error = ret;
|
||||
|
@ -391,6 +426,9 @@ static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len,
|
|||
{
|
||||
struct dmxdev_filter *dmxdevfilter = feed->priv;
|
||||
struct dvb_ringbuffer *buffer;
|
||||
#ifdef DVB_MMAP
|
||||
struct dvb_vb2_ctx *ctx;
|
||||
#endif
|
||||
int ret;
|
||||
|
||||
spin_lock(&dmxdevfilter->dev->lock);
|
||||
|
@ -399,19 +437,34 @@ static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (dmxdevfilter->params.pes.output == DMX_OUT_TAP
|
||||
|| dmxdevfilter->params.pes.output == DMX_OUT_TSDEMUX_TAP)
|
||||
if (dmxdevfilter->params.pes.output == DMX_OUT_TAP ||
|
||||
dmxdevfilter->params.pes.output == DMX_OUT_TSDEMUX_TAP) {
|
||||
buffer = &dmxdevfilter->buffer;
|
||||
else
|
||||
#ifdef DVB_MMAP
|
||||
ctx = &dmxdevfilter->vb2_ctx;
|
||||
#endif
|
||||
} else {
|
||||
buffer = &dmxdevfilter->dev->dvr_buffer;
|
||||
if (buffer->error) {
|
||||
spin_unlock(&dmxdevfilter->dev->lock);
|
||||
wake_up(&buffer->queue);
|
||||
return 0;
|
||||
#ifdef DVB_MMAP
|
||||
ctx = &dmxdevfilter->dev->dvr_vb2_ctx;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (dvb_vb2_is_streaming(ctx)) {
|
||||
ret = dvb_vb2_fill_buffer(ctx, buffer1, buffer1_len);
|
||||
if (ret == buffer1_len)
|
||||
ret = dvb_vb2_fill_buffer(ctx, buffer2, buffer2_len);
|
||||
} else {
|
||||
if (buffer->error) {
|
||||
spin_unlock(&dmxdevfilter->dev->lock);
|
||||
wake_up(&buffer->queue);
|
||||
return 0;
|
||||
}
|
||||
ret = dvb_dmxdev_buffer_write(buffer, buffer1, buffer1_len);
|
||||
if (ret == buffer1_len)
|
||||
ret = dvb_dmxdev_buffer_write(buffer,
|
||||
buffer2, buffer2_len);
|
||||
}
|
||||
ret = dvb_dmxdev_buffer_write(buffer, buffer1, buffer1_len);
|
||||
if (ret == buffer1_len)
|
||||
ret = dvb_dmxdev_buffer_write(buffer, buffer2, buffer2_len);
|
||||
if (ret < 0)
|
||||
buffer->error = ret;
|
||||
spin_unlock(&dmxdevfilter->dev->lock);
|
||||
|
@ -750,6 +803,8 @@ static int dvb_demux_open(struct inode *inode, struct file *file)
|
|||
file->private_data = dmxdevfilter;
|
||||
|
||||
dvb_ringbuffer_init(&dmxdevfilter->buffer, NULL, 8192);
|
||||
dvb_vb2_init(&dmxdevfilter->vb2_ctx, "demux_filter",
|
||||
file->f_flags & O_NONBLOCK);
|
||||
dmxdevfilter->type = DMXDEV_TYPE_NONE;
|
||||
dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_ALLOCATED);
|
||||
timer_setup(&dmxdevfilter->timer, dvb_dmxdev_filter_timeout, 0);
|
||||
|
@ -765,6 +820,10 @@ static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev,
|
|||
{
|
||||
mutex_lock(&dmxdev->mutex);
|
||||
mutex_lock(&dmxdevfilter->mutex);
|
||||
if (dvb_vb2_is_streaming(&dmxdevfilter->vb2_ctx))
|
||||
dvb_vb2_stream_off(&dmxdevfilter->vb2_ctx);
|
||||
dvb_vb2_release(&dmxdevfilter->vb2_ctx);
|
||||
|
||||
|
||||
dvb_dmxdev_filter_stop(dmxdevfilter);
|
||||
dvb_dmxdev_filter_reset(dmxdevfilter);
|
||||
|
@ -1052,6 +1111,54 @@ static int dvb_demux_do_ioctl(struct file *file,
|
|||
mutex_unlock(&dmxdevfilter->mutex);
|
||||
break;
|
||||
|
||||
#ifdef DVB_MMAP
|
||||
case DMX_REQBUFS:
|
||||
if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
|
||||
mutex_unlock(&dmxdev->mutex);
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
ret = dvb_vb2_reqbufs(&dmxdevfilter->vb2_ctx, parg);
|
||||
mutex_unlock(&dmxdevfilter->mutex);
|
||||
break;
|
||||
|
||||
case DMX_QUERYBUF:
|
||||
if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
|
||||
mutex_unlock(&dmxdev->mutex);
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
ret = dvb_vb2_querybuf(&dmxdevfilter->vb2_ctx, parg);
|
||||
mutex_unlock(&dmxdevfilter->mutex);
|
||||
break;
|
||||
|
||||
case DMX_EXPBUF:
|
||||
if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
|
||||
mutex_unlock(&dmxdev->mutex);
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
ret = dvb_vb2_expbuf(&dmxdevfilter->vb2_ctx, parg);
|
||||
mutex_unlock(&dmxdevfilter->mutex);
|
||||
break;
|
||||
|
||||
case DMX_QBUF:
|
||||
if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
|
||||
mutex_unlock(&dmxdev->mutex);
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
ret = dvb_vb2_qbuf(&dmxdevfilter->vb2_ctx, parg);
|
||||
if (ret == 0 && !dvb_vb2_is_streaming(&dmxdevfilter->vb2_ctx))
|
||||
ret = dvb_vb2_stream_on(&dmxdevfilter->vb2_ctx);
|
||||
mutex_unlock(&dmxdevfilter->mutex);
|
||||
break;
|
||||
|
||||
case DMX_DQBUF:
|
||||
if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
|
||||
mutex_unlock(&dmxdev->mutex);
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
ret = dvb_vb2_dqbuf(&dmxdevfilter->vb2_ctx, parg);
|
||||
mutex_unlock(&dmxdevfilter->mutex);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
|
@ -1073,6 +1180,8 @@ static __poll_t dvb_demux_poll(struct file *file, poll_table *wait)
|
|||
|
||||
if ((!dmxdevfilter) || dmxdevfilter->dev->exit)
|
||||
return POLLERR;
|
||||
if (dvb_vb2_is_streaming(&dmxdevfilter->vb2_ctx))
|
||||
return dvb_vb2_poll(&dmxdevfilter->vb2_ctx, file, wait);
|
||||
|
||||
poll_wait(file, &dmxdevfilter->buffer.queue, wait);
|
||||
|
||||
|
@ -1090,11 +1199,33 @@ static __poll_t dvb_demux_poll(struct file *file, poll_table *wait)
|
|||
return mask;
|
||||
}
|
||||
|
||||
#ifdef DVB_MMAP
|
||||
static int dvb_demux_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
{
|
||||
struct dmxdev_filter *dmxdevfilter = file->private_data;
|
||||
struct dmxdev *dmxdev = dmxdevfilter->dev;
|
||||
int ret;
|
||||
|
||||
if (mutex_lock_interruptible(&dmxdev->mutex))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
|
||||
mutex_unlock(&dmxdev->mutex);
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
ret = dvb_vb2_mmap(&dmxdevfilter->vb2_ctx, vma);
|
||||
|
||||
mutex_unlock(&dmxdevfilter->mutex);
|
||||
mutex_unlock(&dmxdev->mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int dvb_demux_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct dmxdev_filter *dmxdevfilter = file->private_data;
|
||||
struct dmxdev *dmxdev = dmxdevfilter->dev;
|
||||
|
||||
int ret;
|
||||
|
||||
ret = dvb_dmxdev_filter_free(dmxdev, dmxdevfilter);
|
||||
|
@ -1118,6 +1249,9 @@ static const struct file_operations dvb_demux_fops = {
|
|||
.release = dvb_demux_release,
|
||||
.poll = dvb_demux_poll,
|
||||
.llseek = default_llseek,
|
||||
#ifdef DVB_MMAP
|
||||
.mmap = dvb_demux_mmap,
|
||||
#endif
|
||||
};
|
||||
|
||||
static const struct dvb_device dvbdev_demux = {
|
||||
|
@ -1146,6 +1280,29 @@ static int dvb_dvr_do_ioctl(struct file *file,
|
|||
ret = dvb_dvr_set_buffer_size(dmxdev, arg);
|
||||
break;
|
||||
|
||||
#ifdef DVB_MMAP
|
||||
case DMX_REQBUFS:
|
||||
ret = dvb_vb2_reqbufs(&dmxdev->dvr_vb2_ctx, parg);
|
||||
break;
|
||||
|
||||
case DMX_QUERYBUF:
|
||||
ret = dvb_vb2_querybuf(&dmxdev->dvr_vb2_ctx, parg);
|
||||
break;
|
||||
|
||||
case DMX_EXPBUF:
|
||||
ret = dvb_vb2_expbuf(&dmxdev->dvr_vb2_ctx, parg);
|
||||
break;
|
||||
|
||||
case DMX_QBUF:
|
||||
ret = dvb_vb2_qbuf(&dmxdev->dvr_vb2_ctx, parg);
|
||||
if (ret == 0 && !dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx))
|
||||
ret = dvb_vb2_stream_on(&dmxdev->dvr_vb2_ctx);
|
||||
break;
|
||||
|
||||
case DMX_DQBUF:
|
||||
ret = dvb_vb2_dqbuf(&dmxdev->dvr_vb2_ctx, parg);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
|
@ -1165,15 +1322,26 @@ static __poll_t dvb_dvr_poll(struct file *file, poll_table *wait)
|
|||
struct dvb_device *dvbdev = file->private_data;
|
||||
struct dmxdev *dmxdev = dvbdev->priv;
|
||||
__poll_t mask = 0;
|
||||
#ifndef DVB_MMAP
|
||||
bool need_ringbuffer = false;
|
||||
#else
|
||||
const bool need_ringbuffer = true;
|
||||
#endif
|
||||
|
||||
dprintk("%s\n", __func__);
|
||||
|
||||
if (dmxdev->exit)
|
||||
return POLLERR;
|
||||
if (dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx))
|
||||
return dvb_vb2_poll(&dmxdev->dvr_vb2_ctx, file, wait);
|
||||
|
||||
poll_wait(file, &dmxdev->dvr_buffer.queue, wait);
|
||||
|
||||
if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
|
||||
#ifndef DVB_MMAP
|
||||
if ((file->f_flags & O_ACCMODE) == O_RDONLY)
|
||||
need_ringbuffer = true;
|
||||
#endif
|
||||
if (need_ringbuffer) {
|
||||
if (dmxdev->dvr_buffer.error)
|
||||
mask |= (POLLIN | POLLRDNORM | POLLPRI | POLLERR);
|
||||
|
||||
|
@ -1185,6 +1353,25 @@ static __poll_t dvb_dvr_poll(struct file *file, poll_table *wait)
|
|||
return mask;
|
||||
}
|
||||
|
||||
#ifdef DVB_MMAP
|
||||
static int dvb_dvr_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
{
|
||||
struct dvb_device *dvbdev = file->private_data;
|
||||
struct dmxdev *dmxdev = dvbdev->priv;
|
||||
int ret;
|
||||
|
||||
if (dmxdev->exit)
|
||||
return -ENODEV;
|
||||
|
||||
if (mutex_lock_interruptible(&dmxdev->mutex))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
ret = dvb_vb2_mmap(&dmxdev->dvr_vb2_ctx, vma);
|
||||
mutex_unlock(&dmxdev->mutex);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct file_operations dvb_dvr_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = dvb_dvr_read,
|
||||
|
@ -1194,6 +1381,9 @@ static const struct file_operations dvb_dvr_fops = {
|
|||
.release = dvb_dvr_release,
|
||||
.poll = dvb_dvr_poll,
|
||||
.llseek = default_llseek,
|
||||
#ifdef DVB_MMAP
|
||||
.mmap = dvb_dvr_mmap,
|
||||
#endif
|
||||
};
|
||||
|
||||
static const struct dvb_device dvbdev_dvr = {
|
||||
|
|
|
@ -37,8 +37,8 @@
|
|||
#include <linux/sched/signal.h>
|
||||
#include <linux/kthread.h>
|
||||
|
||||
#include "dvb_ca_en50221.h"
|
||||
#include "dvb_ringbuffer.h"
|
||||
#include <media/dvb_ca_en50221.h>
|
||||
#include <media/dvb_ringbuffer.h>
|
||||
|
||||
static int dvb_ca_en50221_debug;
|
||||
|
||||
|
@ -786,7 +786,7 @@ static int dvb_ca_en50221_read_data(struct dvb_ca_private *ca, int slot,
|
|||
* @ca: CA instance.
|
||||
* @slot: Slot to write to.
|
||||
* @buf: The data in this buffer is treated as a complete link-level packet to
|
||||
* be written.
|
||||
* be written.
|
||||
* @bytes_write: Size of ebuf.
|
||||
*
|
||||
* return: Number of bytes written, or < 0 on error.
|
||||
|
@ -1473,6 +1473,9 @@ static ssize_t dvb_ca_en50221_io_write(struct file *file,
|
|||
return -EFAULT;
|
||||
buf += 2;
|
||||
count -= 2;
|
||||
|
||||
if (slot >= ca->slot_count)
|
||||
return -EINVAL;
|
||||
sl = &ca->slot_info[slot];
|
||||
|
||||
/* check if the slot is actually running */
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
#include <linux/uaccess.h>
|
||||
#include <asm/div64.h>
|
||||
|
||||
#include "dvb_demux.h"
|
||||
#include <media/dvb_demux.h>
|
||||
|
||||
static int dvb_demux_tscheck;
|
||||
module_param(dvb_demux_tscheck, int, 0644);
|
||||
|
@ -119,7 +119,8 @@ static inline int dvb_dmx_swfilter_payload(struct dvb_demux_feed *feed,
|
|||
ccok = ((feed->cc + 1) & 0x0f) == cc;
|
||||
feed->cc = cc;
|
||||
if (!ccok)
|
||||
dprintk("missed packet!\n");
|
||||
dprintk("missed packet: %d instead of %d!\n",
|
||||
cc, (feed->cc + 1) & 0x0f);
|
||||
#endif
|
||||
|
||||
if (buf[1] & 0x40) // PUSI ?
|
||||
|
@ -188,7 +189,7 @@ static void dvb_dmx_swfilter_section_new(struct dvb_demux_feed *feed)
|
|||
|
||||
#ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG
|
||||
if (sec->secbufp < sec->tsfeedp) {
|
||||
int i, n = sec->tsfeedp - sec->secbufp;
|
||||
int n = sec->tsfeedp - sec->secbufp;
|
||||
|
||||
/*
|
||||
* Section padding is done with 0xff bytes entirely.
|
||||
|
@ -196,12 +197,9 @@ static void dvb_dmx_swfilter_section_new(struct dvb_demux_feed *feed)
|
|||
* but just first and last.
|
||||
*/
|
||||
if (sec->secbuf[0] != 0xff || sec->secbuf[n - 1] != 0xff) {
|
||||
dprintk("dvb_demux.c section ts padding loss: %d/%d\n",
|
||||
dprintk("section ts padding loss: %d/%d\n",
|
||||
n, sec->tsfeedp);
|
||||
dprintk("dvb_demux.c pad data:");
|
||||
for (i = 0; i < n; i++)
|
||||
pr_cont(" %02x", sec->secbuf[i]);
|
||||
pr_cont("\n");
|
||||
dprintk("pad data: %*ph\n", n, sec->secbuf);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -240,9 +238,9 @@ static int dvb_dmx_swfilter_section_copy_dump(struct dvb_demux_feed *feed,
|
|||
|
||||
if (sec->tsfeedp + len > DMX_MAX_SECFEED_SIZE) {
|
||||
#ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG
|
||||
dprintk("dvb_demux.c section buffer full loss: %d/%d\n",
|
||||
sec->tsfeedp + len - DMX_MAX_SECFEED_SIZE,
|
||||
DMX_MAX_SECFEED_SIZE);
|
||||
dprintk("section buffer full loss: %d/%d\n",
|
||||
sec->tsfeedp + len - DMX_MAX_SECFEED_SIZE,
|
||||
DMX_MAX_SECFEED_SIZE);
|
||||
#endif
|
||||
len = DMX_MAX_SECFEED_SIZE - sec->tsfeedp;
|
||||
}
|
||||
|
@ -275,7 +273,7 @@ static int dvb_dmx_swfilter_section_copy_dump(struct dvb_demux_feed *feed,
|
|||
dvb_dmx_swfilter_section_feed(feed);
|
||||
#ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG
|
||||
else
|
||||
dprintk("dvb_demux.c pusi not seen, discarding section data\n");
|
||||
dprintk("pusi not seen, discarding section data\n");
|
||||
#endif
|
||||
sec->secbufp += seclen; /* secbufp and secbuf moving together is */
|
||||
sec->secbuf += seclen; /* redundant but saves pointer arithmetic */
|
||||
|
@ -310,8 +308,12 @@ static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed,
|
|||
|
||||
if (!ccok || dc_i) {
|
||||
#ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG
|
||||
dprintk("dvb_demux.c discontinuity detected %d bytes lost\n",
|
||||
count);
|
||||
if (dc_i)
|
||||
dprintk("%d frame with disconnect indicator\n",
|
||||
cc);
|
||||
else
|
||||
dprintk("discontinuity: %d instead of %d. %d bytes lost\n",
|
||||
cc, (feed->cc + 1) & 0x0f, count + 4);
|
||||
/*
|
||||
* those bytes under sume circumstances will again be reported
|
||||
* in the following dvb_dmx_swfilter_section_new
|
||||
|
@ -320,6 +322,9 @@ static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed,
|
|||
/*
|
||||
* Discontinuity detected. Reset pusi_seen to
|
||||
* stop feeding of suspicious data until next PUSI=1 arrives
|
||||
*
|
||||
* FIXME: does it make sense if the MPEG-TS is the one
|
||||
* reporting discontinuity?
|
||||
*/
|
||||
feed->pusi_seen = false;
|
||||
dvb_dmx_swfilter_section_new(feed);
|
||||
|
@ -343,8 +348,7 @@ static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed,
|
|||
}
|
||||
#ifdef CONFIG_DVB_DEMUX_SECTION_LOSS_LOG
|
||||
else if (count > 0)
|
||||
dprintk("dvb_demux.c PUSI=1 but %d bytes lost\n",
|
||||
count);
|
||||
dprintk("PUSI=1 but %d bytes lost\n", count);
|
||||
#endif
|
||||
} else {
|
||||
/* PUSI=0 (is not set), no section boundary */
|
||||
|
@ -414,9 +418,10 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
|
|||
1024);
|
||||
speed_timedelta = ktime_ms_delta(cur_time,
|
||||
demux->speed_last_time);
|
||||
dprintk("TS speed %llu Kbits/sec \n",
|
||||
div64_u64(speed_bytes,
|
||||
speed_timedelta));
|
||||
if (speed_timedelta)
|
||||
dprintk("TS speed %llu Kbits/sec \n",
|
||||
div64_u64(speed_bytes,
|
||||
speed_timedelta));
|
||||
}
|
||||
|
||||
demux->speed_last_time = cur_time;
|
||||
|
@ -441,8 +446,8 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
|
|||
|
||||
if ((buf[3] & 0xf) != demux->cnt_storage[pid]) {
|
||||
dprintk_tscheck("TS packet counter mismatch. PID=0x%x expected 0x%x got 0x%x\n",
|
||||
pid, demux->cnt_storage[pid],
|
||||
buf[3] & 0xf);
|
||||
pid, demux->cnt_storage[pid],
|
||||
buf[3] & 0xf);
|
||||
demux->cnt_storage[pid] = buf[3] & 0xf;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,10 +40,11 @@
|
|||
#include <linux/jiffies.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/compat.h>
|
||||
#include <asm/processor.h>
|
||||
|
||||
#include "dvb_frontend.h"
|
||||
#include "dvbdev.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
#include <media/dvbdev.h>
|
||||
#include <linux/dvb/version.h>
|
||||
|
||||
static int dvb_frontend_debug;
|
||||
|
@ -150,8 +151,7 @@ static void __dvb_frontend_free(struct dvb_frontend *fe)
|
|||
|
||||
dvb_frontend_invoke_release(fe, fe->ops.release);
|
||||
|
||||
if (fepriv)
|
||||
kfree(fepriv);
|
||||
kfree(fepriv);
|
||||
}
|
||||
|
||||
static void dvb_frontend_free(struct kref *ref)
|
||||
|
@ -982,6 +982,7 @@ static int dvb_frontend_clear_cache(struct dvb_frontend *fe)
|
|||
}
|
||||
|
||||
c->stream_id = NO_STREAM_ID_FILTER;
|
||||
c->scrambling_sequence_index = 0;/* default sequence */
|
||||
|
||||
switch (c->delivery_system) {
|
||||
case SYS_DVBS:
|
||||
|
@ -1072,6 +1073,7 @@ static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = {
|
|||
|
||||
_DTV_CMD(DTV_STREAM_ID, 1, 0),
|
||||
_DTV_CMD(DTV_DVBT2_PLP_ID_LEGACY, 1, 0),
|
||||
_DTV_CMD(DTV_SCRAMBLING_SEQUENCE_INDEX, 1, 0),
|
||||
_DTV_CMD(DTV_LNA, 1, 0),
|
||||
|
||||
/* Get */
|
||||
|
@ -1417,6 +1419,11 @@ static int dtv_property_process_get(struct dvb_frontend *fe,
|
|||
tvp->u.data = c->stream_id;
|
||||
break;
|
||||
|
||||
/* Physical layer scrambling support */
|
||||
case DTV_SCRAMBLING_SEQUENCE_INDEX:
|
||||
tvp->u.data = c->scrambling_sequence_index;
|
||||
break;
|
||||
|
||||
/* ATSC-MH */
|
||||
case DTV_ATSCMH_FIC_VER:
|
||||
tvp->u.data = fe->dtv_property_cache.atscmh_fic_ver;
|
||||
|
@ -1900,6 +1907,11 @@ static int dtv_property_process_set(struct dvb_frontend *fe,
|
|||
c->stream_id = data;
|
||||
break;
|
||||
|
||||
/* Physical layer scrambling support */
|
||||
case DTV_SCRAMBLING_SEQUENCE_INDEX:
|
||||
c->scrambling_sequence_index = data;
|
||||
break;
|
||||
|
||||
/* ATSC-MH */
|
||||
case DTV_ATSCMH_PARADE_ID:
|
||||
fe->dtv_property_cache.atscmh_parade_id = data;
|
||||
|
@ -1923,7 +1935,8 @@ static int dtv_property_process_set(struct dvb_frontend *fe,
|
|||
return r;
|
||||
}
|
||||
|
||||
static int dvb_frontend_ioctl(struct file *file, unsigned int cmd, void *parg)
|
||||
static int dvb_frontend_do_ioctl(struct file *file, unsigned int cmd,
|
||||
void *parg)
|
||||
{
|
||||
struct dvb_device *dvbdev = file->private_data;
|
||||
struct dvb_frontend *fe = dvbdev->priv;
|
||||
|
@ -1966,6 +1979,156 @@ static int dvb_frontend_ioctl(struct file *file, unsigned int cmd, void *parg)
|
|||
return err;
|
||||
}
|
||||
|
||||
static long dvb_frontend_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
struct dvb_device *dvbdev = file->private_data;
|
||||
|
||||
if (!dvbdev)
|
||||
return -ENODEV;
|
||||
|
||||
return dvb_usercopy(file, cmd, arg, dvb_frontend_do_ioctl);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
struct compat_dtv_property {
|
||||
__u32 cmd;
|
||||
__u32 reserved[3];
|
||||
union {
|
||||
__u32 data;
|
||||
struct dtv_fe_stats st;
|
||||
struct {
|
||||
__u8 data[32];
|
||||
__u32 len;
|
||||
__u32 reserved1[3];
|
||||
compat_uptr_t reserved2;
|
||||
} buffer;
|
||||
} u;
|
||||
int result;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct compat_dtv_properties {
|
||||
__u32 num;
|
||||
compat_uptr_t props;
|
||||
};
|
||||
|
||||
#define COMPAT_FE_SET_PROPERTY _IOW('o', 82, struct compat_dtv_properties)
|
||||
#define COMPAT_FE_GET_PROPERTY _IOR('o', 83, struct compat_dtv_properties)
|
||||
|
||||
static int dvb_frontend_handle_compat_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
struct dvb_device *dvbdev = file->private_data;
|
||||
struct dvb_frontend *fe = dvbdev->priv;
|
||||
struct dvb_frontend_private *fepriv = fe->frontend_priv;
|
||||
int i, err = 0;
|
||||
|
||||
if (cmd == COMPAT_FE_SET_PROPERTY) {
|
||||
struct compat_dtv_properties prop, *tvps = NULL;
|
||||
struct compat_dtv_property *tvp = NULL;
|
||||
|
||||
if (copy_from_user(&prop, compat_ptr(arg), sizeof(prop)))
|
||||
return -EFAULT;
|
||||
|
||||
tvps = ∝
|
||||
|
||||
/*
|
||||
* Put an arbitrary limit on the number of messages that can
|
||||
* be sent at once
|
||||
*/
|
||||
if (!tvps->num || (tvps->num > DTV_IOCTL_MAX_MSGS))
|
||||
return -EINVAL;
|
||||
|
||||
tvp = memdup_user(compat_ptr(tvps->props), tvps->num * sizeof(*tvp));
|
||||
if (IS_ERR(tvp))
|
||||
return PTR_ERR(tvp);
|
||||
|
||||
for (i = 0; i < tvps->num; i++) {
|
||||
err = dtv_property_process_set(fe, file,
|
||||
(tvp + i)->cmd,
|
||||
(tvp + i)->u.data);
|
||||
if (err < 0) {
|
||||
kfree(tvp);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
kfree(tvp);
|
||||
} else if (cmd == COMPAT_FE_GET_PROPERTY) {
|
||||
struct compat_dtv_properties prop, *tvps = NULL;
|
||||
struct compat_dtv_property *tvp = NULL;
|
||||
struct dtv_frontend_properties getp = fe->dtv_property_cache;
|
||||
|
||||
if (copy_from_user(&prop, compat_ptr(arg), sizeof(prop)))
|
||||
return -EFAULT;
|
||||
|
||||
tvps = ∝
|
||||
|
||||
/*
|
||||
* Put an arbitrary limit on the number of messages that can
|
||||
* be sent at once
|
||||
*/
|
||||
if (!tvps->num || (tvps->num > DTV_IOCTL_MAX_MSGS))
|
||||
return -EINVAL;
|
||||
|
||||
tvp = memdup_user(compat_ptr(tvps->props), tvps->num * sizeof(*tvp));
|
||||
if (IS_ERR(tvp))
|
||||
return PTR_ERR(tvp);
|
||||
|
||||
/*
|
||||
* Let's use our own copy of property cache, in order to
|
||||
* avoid mangling with DTV zigzag logic, as drivers might
|
||||
* return crap, if they don't check if the data is available
|
||||
* before updating the properties cache.
|
||||
*/
|
||||
if (fepriv->state != FESTATE_IDLE) {
|
||||
err = dtv_get_frontend(fe, &getp, NULL);
|
||||
if (err < 0) {
|
||||
kfree(tvp);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < tvps->num; i++) {
|
||||
err = dtv_property_process_get(
|
||||
fe, &getp, (struct dtv_property *)tvp + i, file);
|
||||
if (err < 0) {
|
||||
kfree(tvp);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
if (copy_to_user((void __user *)compat_ptr(tvps->props), tvp,
|
||||
tvps->num * sizeof(struct compat_dtv_property))) {
|
||||
kfree(tvp);
|
||||
return -EFAULT;
|
||||
}
|
||||
kfree(tvp);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static long dvb_frontend_compat_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
struct dvb_device *dvbdev = file->private_data;
|
||||
struct dvb_frontend *fe = dvbdev->priv;
|
||||
struct dvb_frontend_private *fepriv = fe->frontend_priv;
|
||||
int err;
|
||||
|
||||
if (cmd == COMPAT_FE_SET_PROPERTY || cmd == COMPAT_FE_GET_PROPERTY) {
|
||||
if (down_interruptible(&fepriv->sem))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
err = dvb_frontend_handle_compat_ioctl(file, cmd, arg);
|
||||
|
||||
up(&fepriv->sem);
|
||||
return err;
|
||||
}
|
||||
|
||||
return dvb_frontend_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
|
||||
}
|
||||
#endif
|
||||
|
||||
static int dtv_set_frontend(struct dvb_frontend *fe)
|
||||
{
|
||||
struct dvb_frontend_private *fepriv = fe->frontend_priv;
|
||||
|
@ -2110,7 +2273,7 @@ static int dvb_frontend_handle_ioctl(struct file *file,
|
|||
struct dvb_frontend *fe = dvbdev->priv;
|
||||
struct dvb_frontend_private *fepriv = fe->frontend_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int i, err;
|
||||
int i, err = -ENOTSUPP;
|
||||
|
||||
dev_dbg(fe->dvb->device, "%s:\n", __func__);
|
||||
|
||||
|
@ -2145,6 +2308,7 @@ static int dvb_frontend_handle_ioctl(struct file *file,
|
|||
}
|
||||
}
|
||||
kfree(tvp);
|
||||
err = 0;
|
||||
break;
|
||||
}
|
||||
case FE_GET_PROPERTY: {
|
||||
|
@ -2196,6 +2360,7 @@ static int dvb_frontend_handle_ioctl(struct file *file,
|
|||
return -EFAULT;
|
||||
}
|
||||
kfree(tvp);
|
||||
err = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2647,7 +2812,10 @@ static int dvb_frontend_release(struct inode *inode, struct file *file)
|
|||
|
||||
static const struct file_operations dvb_frontend_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.unlocked_ioctl = dvb_generic_ioctl,
|
||||
.unlocked_ioctl = dvb_frontend_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = dvb_frontend_compat_ioctl,
|
||||
#endif
|
||||
.poll = dvb_frontend_poll,
|
||||
.open = dvb_frontend_open,
|
||||
.release = dvb_frontend_release,
|
||||
|
@ -2715,7 +2883,6 @@ int dvb_register_frontend(struct dvb_adapter* dvb,
|
|||
#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
|
||||
.name = fe->ops.info.name,
|
||||
#endif
|
||||
.kernel_ioctl = dvb_frontend_ioctl
|
||||
};
|
||||
|
||||
dev_dbg(dvb->device, "%s:\n", __func__);
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/bug.h>
|
||||
#include "dvb_math.h"
|
||||
#include <media/dvb_math.h>
|
||||
|
||||
static const unsigned short logtable[256] = {
|
||||
0x0000, 0x0171, 0x02e0, 0x044e, 0x05ba, 0x0725, 0x088e, 0x09f7,
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
* Competence Center for Advanced Satellite Communications.
|
||||
* Bugfixes and robustness improvements.
|
||||
* Filtering on dest MAC addresses, if present (D-Bit = 0)
|
||||
* ULE_DEBUG compile-time option.
|
||||
* DVB_ULE_DEBUG compile-time option.
|
||||
* Apr 2006: cp v3: Bugfixes and compliency with RFC 4326 (ULE) by
|
||||
* Christian Praehauser <cpraehaus@cosy.sbg.ac.at>,
|
||||
* Paris Lodron University of Salzburg.
|
||||
|
@ -64,8 +64,8 @@
|
|||
#include <linux/mutex.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#include "dvb_demux.h"
|
||||
#include "dvb_net.h"
|
||||
#include <media/dvb_demux.h>
|
||||
#include <media/dvb_net.h>
|
||||
|
||||
static inline __u32 iov_crc32( __u32 c, struct kvec *iov, unsigned int cnt )
|
||||
{
|
||||
|
@ -78,15 +78,18 @@ static inline __u32 iov_crc32( __u32 c, struct kvec *iov, unsigned int cnt )
|
|||
|
||||
#define DVB_NET_MULTICAST_MAX 10
|
||||
|
||||
#undef ULE_DEBUG
|
||||
|
||||
#ifdef ULE_DEBUG
|
||||
#ifdef DVB_ULE_DEBUG
|
||||
/*
|
||||
* The code inside DVB_ULE_DEBUG keeps a history of the
|
||||
* last 100 TS cells processed.
|
||||
*/
|
||||
static unsigned char ule_hist[100*TS_SZ] = { 0 };
|
||||
static unsigned char *ule_where = ule_hist, ule_dump;
|
||||
|
||||
static void hexdump(const unsigned char *buf, unsigned short len)
|
||||
{
|
||||
print_hex_dump_debug("", DUMP_PREFIX_OFFSET, 16, 1, buf, len, true);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
struct dvb_net_priv {
|
||||
|
@ -280,11 +283,9 @@ static int handle_ule_extensions( struct dvb_net_priv *p )
|
|||
if (l < 0)
|
||||
return l; /* Stop extension header processing and discard SNDU. */
|
||||
total_ext_len += l;
|
||||
#ifdef ULE_DEBUG
|
||||
pr_debug("ule_next_hdr=%p, ule_sndu_type=%i, l=%i, total_ext_len=%i\n",
|
||||
p->ule_next_hdr, (int)p->ule_sndu_type,
|
||||
l, total_ext_len);
|
||||
#endif
|
||||
|
||||
} while (p->ule_sndu_type < ETH_P_802_3_MIN);
|
||||
|
||||
|
@ -320,29 +321,21 @@ struct dvb_net_ule_handle {
|
|||
const u8 *ts, *ts_end, *from_where;
|
||||
u8 ts_remain, how_much, new_ts;
|
||||
bool error;
|
||||
#ifdef ULE_DEBUG
|
||||
/*
|
||||
* The code inside ULE_DEBUG keeps a history of the
|
||||
* last 100 TS cells processed.
|
||||
*/
|
||||
static unsigned char ule_hist[100*TS_SZ];
|
||||
static unsigned char *ule_where = ule_hist, ule_dump;
|
||||
#endif
|
||||
};
|
||||
|
||||
static int dvb_net_ule_new_ts_cell(struct dvb_net_ule_handle *h)
|
||||
{
|
||||
/* We are about to process a new TS cell. */
|
||||
|
||||
#ifdef ULE_DEBUG
|
||||
if (h->ule_where >= &h->ule_hist[100*TS_SZ])
|
||||
h->ule_where = h->ule_hist;
|
||||
memcpy(h->ule_where, h->ts, TS_SZ);
|
||||
if (h->ule_dump) {
|
||||
hexdump(h->ule_where, TS_SZ);
|
||||
h->ule_dump = 0;
|
||||
#ifdef DVB_ULE_DEBUG
|
||||
if (ule_where >= &ule_hist[100*TS_SZ])
|
||||
ule_where = ule_hist;
|
||||
memcpy(ule_where, h->ts, TS_SZ);
|
||||
if (ule_dump) {
|
||||
hexdump(ule_where, TS_SZ);
|
||||
ule_dump = 0;
|
||||
}
|
||||
h->ule_where += TS_SZ;
|
||||
ule_where += TS_SZ;
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -660,6 +653,7 @@ static int dvb_net_ule_should_drop(struct dvb_net_ule_handle *h)
|
|||
|
||||
|
||||
static void dvb_net_ule_check_crc(struct dvb_net_ule_handle *h,
|
||||
struct kvec iov[3],
|
||||
u32 ule_crc, u32 expected_crc)
|
||||
{
|
||||
u8 dest_addr[ETH_ALEN];
|
||||
|
@ -672,22 +666,22 @@ static void dvb_net_ule_check_crc(struct dvb_net_ule_handle *h,
|
|||
h->ts_remain > 2 ?
|
||||
*(unsigned short *)h->from_where : 0);
|
||||
|
||||
#ifdef ULE_DEBUG
|
||||
#ifdef DVB_ULE_DEBUG
|
||||
hexdump(iov[0].iov_base, iov[0].iov_len);
|
||||
hexdump(iov[1].iov_base, iov[1].iov_len);
|
||||
hexdump(iov[2].iov_base, iov[2].iov_len);
|
||||
|
||||
if (h->ule_where == h->ule_hist) {
|
||||
hexdump(&h->ule_hist[98*TS_SZ], TS_SZ);
|
||||
hexdump(&h->ule_hist[99*TS_SZ], TS_SZ);
|
||||
} else if (h->ule_where == &h->ule_hist[TS_SZ]) {
|
||||
hexdump(&h->ule_hist[99*TS_SZ], TS_SZ);
|
||||
hexdump(h->ule_hist, TS_SZ);
|
||||
if (ule_where == ule_hist) {
|
||||
hexdump(&ule_hist[98*TS_SZ], TS_SZ);
|
||||
hexdump(&ule_hist[99*TS_SZ], TS_SZ);
|
||||
} else if (ule_where == &ule_hist[TS_SZ]) {
|
||||
hexdump(&ule_hist[99*TS_SZ], TS_SZ);
|
||||
hexdump(ule_hist, TS_SZ);
|
||||
} else {
|
||||
hexdump(h->ule_where - TS_SZ - TS_SZ, TS_SZ);
|
||||
hexdump(h->ule_where - TS_SZ, TS_SZ);
|
||||
hexdump(ule_where - TS_SZ - TS_SZ, TS_SZ);
|
||||
hexdump(ule_where - TS_SZ, TS_SZ);
|
||||
}
|
||||
h->ule_dump = 1;
|
||||
ule_dump = 1;
|
||||
#endif
|
||||
|
||||
h->dev->stats.rx_errors++;
|
||||
|
@ -705,11 +699,9 @@ static void dvb_net_ule_check_crc(struct dvb_net_ule_handle *h,
|
|||
|
||||
if (!h->priv->ule_dbit) {
|
||||
if (dvb_net_ule_should_drop(h)) {
|
||||
#ifdef ULE_DEBUG
|
||||
netdev_dbg(h->dev,
|
||||
"Dropping SNDU: MAC destination address does not match: dest addr: %pM, h->dev addr: %pM\n",
|
||||
h->priv->ule_skb->data, h->dev->dev_addr);
|
||||
#endif
|
||||
dev_kfree_skb(h->priv->ule_skb);
|
||||
return;
|
||||
}
|
||||
|
@ -779,6 +771,8 @@ static void dvb_net_ule(struct net_device *dev, const u8 *buf, size_t buf_len)
|
|||
int ret;
|
||||
struct dvb_net_ule_handle h = {
|
||||
.dev = dev,
|
||||
.priv = netdev_priv(dev),
|
||||
.ethh = NULL,
|
||||
.buf = buf,
|
||||
.buf_len = buf_len,
|
||||
.skipped = 0L,
|
||||
|
@ -788,11 +782,7 @@ static void dvb_net_ule(struct net_device *dev, const u8 *buf, size_t buf_len)
|
|||
.ts_remain = 0,
|
||||
.how_much = 0,
|
||||
.new_ts = 1,
|
||||
.ethh = NULL,
|
||||
.error = false,
|
||||
#ifdef ULE_DEBUG
|
||||
.ule_where = ule_hist,
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -860,7 +850,7 @@ static void dvb_net_ule(struct net_device *dev, const u8 *buf, size_t buf_len)
|
|||
*(tail - 2) << 8 |
|
||||
*(tail - 1);
|
||||
|
||||
dvb_net_ule_check_crc(&h, ule_crc, expected_crc);
|
||||
dvb_net_ule_check_crc(&h, iov, ule_crc, expected_crc);
|
||||
|
||||
/* Prepare for next SNDU. */
|
||||
reset_ule(h.priv);
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
#include <linux/string.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
#include "dvb_ringbuffer.h"
|
||||
#include <media/dvb_ringbuffer.h>
|
||||
|
||||
#define PKT_READY 0
|
||||
#define PKT_DISPOSED 1
|
||||
|
|
|
@ -0,0 +1,430 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* dvb-vb2.c - dvb-vb2
|
||||
*
|
||||
* Copyright (C) 2015 Samsung Electronics
|
||||
*
|
||||
* Author: jh1009.sung@samsung.com
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
#include <media/dvbdev.h>
|
||||
#include <media/dvb_vb2.h>
|
||||
|
||||
#define DVB_V2_MAX_SIZE (4096 * 188)
|
||||
|
||||
static int vb2_debug;
|
||||
module_param(vb2_debug, int, 0644);
|
||||
|
||||
#define dprintk(level, fmt, arg...) \
|
||||
do { \
|
||||
if (vb2_debug >= level) \
|
||||
pr_info("vb2: %s: " fmt, __func__, ## arg); \
|
||||
} while (0)
|
||||
|
||||
static int _queue_setup(struct vb2_queue *vq,
|
||||
unsigned int *nbuffers, unsigned int *nplanes,
|
||||
unsigned int sizes[], struct device *alloc_devs[])
|
||||
{
|
||||
struct dvb_vb2_ctx *ctx = vb2_get_drv_priv(vq);
|
||||
|
||||
ctx->buf_cnt = *nbuffers;
|
||||
*nplanes = 1;
|
||||
sizes[0] = ctx->buf_siz;
|
||||
|
||||
/*
|
||||
* videobuf2-vmalloc allocator is context-less so no need to set
|
||||
* alloc_ctxs array.
|
||||
*/
|
||||
|
||||
dprintk(3, "[%s] count=%d, size=%d\n", ctx->name,
|
||||
*nbuffers, sizes[0]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int _buffer_prepare(struct vb2_buffer *vb)
|
||||
{
|
||||
struct dvb_vb2_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
|
||||
unsigned long size = ctx->buf_siz;
|
||||
|
||||
if (vb2_plane_size(vb, 0) < size) {
|
||||
dprintk(1, "[%s] data will not fit into plane (%lu < %lu)\n",
|
||||
ctx->name, vb2_plane_size(vb, 0), size);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
vb2_set_plane_payload(vb, 0, size);
|
||||
dprintk(3, "[%s]\n", ctx->name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void _buffer_queue(struct vb2_buffer *vb)
|
||||
{
|
||||
struct dvb_vb2_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
|
||||
struct dvb_buffer *buf = container_of(vb, struct dvb_buffer, vb);
|
||||
unsigned long flags = 0;
|
||||
|
||||
spin_lock_irqsave(&ctx->slock, flags);
|
||||
list_add_tail(&buf->list, &ctx->dvb_q);
|
||||
spin_unlock_irqrestore(&ctx->slock, flags);
|
||||
|
||||
dprintk(3, "[%s]\n", ctx->name);
|
||||
}
|
||||
|
||||
static int _start_streaming(struct vb2_queue *vq, unsigned int count)
|
||||
{
|
||||
struct dvb_vb2_ctx *ctx = vb2_get_drv_priv(vq);
|
||||
|
||||
dprintk(3, "[%s] count=%d\n", ctx->name, count);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void _stop_streaming(struct vb2_queue *vq)
|
||||
{
|
||||
struct dvb_vb2_ctx *ctx = vb2_get_drv_priv(vq);
|
||||
struct dvb_buffer *buf;
|
||||
unsigned long flags = 0;
|
||||
|
||||
dprintk(3, "[%s]\n", ctx->name);
|
||||
|
||||
spin_lock_irqsave(&ctx->slock, flags);
|
||||
while (!list_empty(&ctx->dvb_q)) {
|
||||
buf = list_entry(ctx->dvb_q.next,
|
||||
struct dvb_buffer, list);
|
||||
vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
|
||||
list_del(&buf->list);
|
||||
}
|
||||
spin_unlock_irqrestore(&ctx->slock, flags);
|
||||
}
|
||||
|
||||
static void _dmxdev_lock(struct vb2_queue *vq)
|
||||
{
|
||||
struct dvb_vb2_ctx *ctx = vb2_get_drv_priv(vq);
|
||||
|
||||
mutex_lock(&ctx->mutex);
|
||||
dprintk(3, "[%s]\n", ctx->name);
|
||||
}
|
||||
|
||||
static void _dmxdev_unlock(struct vb2_queue *vq)
|
||||
{
|
||||
struct dvb_vb2_ctx *ctx = vb2_get_drv_priv(vq);
|
||||
|
||||
if (mutex_is_locked(&ctx->mutex))
|
||||
mutex_unlock(&ctx->mutex);
|
||||
dprintk(3, "[%s]\n", ctx->name);
|
||||
}
|
||||
|
||||
static const struct vb2_ops dvb_vb2_qops = {
|
||||
.queue_setup = _queue_setup,
|
||||
.buf_prepare = _buffer_prepare,
|
||||
.buf_queue = _buffer_queue,
|
||||
.start_streaming = _start_streaming,
|
||||
.stop_streaming = _stop_streaming,
|
||||
.wait_prepare = _dmxdev_unlock,
|
||||
.wait_finish = _dmxdev_lock,
|
||||
};
|
||||
|
||||
static void _fill_dmx_buffer(struct vb2_buffer *vb, void *pb)
|
||||
{
|
||||
struct dvb_vb2_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
|
||||
struct dmx_buffer *b = pb;
|
||||
|
||||
b->index = vb->index;
|
||||
b->length = vb->planes[0].length;
|
||||
b->bytesused = vb->planes[0].bytesused;
|
||||
b->offset = vb->planes[0].m.offset;
|
||||
dprintk(3, "[%s]\n", ctx->name);
|
||||
}
|
||||
|
||||
static int _fill_vb2_buffer(struct vb2_buffer *vb,
|
||||
const void *pb, struct vb2_plane *planes)
|
||||
{
|
||||
struct dvb_vb2_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
|
||||
|
||||
planes[0].bytesused = 0;
|
||||
dprintk(3, "[%s]\n", ctx->name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct vb2_buf_ops dvb_vb2_buf_ops = {
|
||||
.fill_user_buffer = _fill_dmx_buffer,
|
||||
.fill_vb2_buffer = _fill_vb2_buffer,
|
||||
};
|
||||
|
||||
/*
|
||||
* Videobuf operations
|
||||
*/
|
||||
int dvb_vb2_init(struct dvb_vb2_ctx *ctx, const char *name, int nonblocking)
|
||||
{
|
||||
struct vb2_queue *q = &ctx->vb_q;
|
||||
int ret;
|
||||
|
||||
memset(ctx, 0, sizeof(struct dvb_vb2_ctx));
|
||||
q->type = DVB_BUF_TYPE_CAPTURE;
|
||||
/**capture type*/
|
||||
q->is_output = 0;
|
||||
/**only mmap is supported currently*/
|
||||
q->io_modes = VB2_MMAP;
|
||||
q->drv_priv = ctx;
|
||||
q->buf_struct_size = sizeof(struct dvb_buffer);
|
||||
q->min_buffers_needed = 1;
|
||||
q->ops = &dvb_vb2_qops;
|
||||
q->mem_ops = &vb2_vmalloc_memops;
|
||||
q->buf_ops = &dvb_vb2_buf_ops;
|
||||
q->num_buffers = 0;
|
||||
ret = vb2_core_queue_init(q);
|
||||
if (ret) {
|
||||
ctx->state = DVB_VB2_STATE_NONE;
|
||||
dprintk(1, "[%s] errno=%d\n", ctx->name, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
mutex_init(&ctx->mutex);
|
||||
spin_lock_init(&ctx->slock);
|
||||
INIT_LIST_HEAD(&ctx->dvb_q);
|
||||
|
||||
strlcpy(ctx->name, name, DVB_VB2_NAME_MAX);
|
||||
ctx->nonblocking = nonblocking;
|
||||
ctx->state = DVB_VB2_STATE_INIT;
|
||||
|
||||
dprintk(3, "[%s]\n", ctx->name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dvb_vb2_release(struct dvb_vb2_ctx *ctx)
|
||||
{
|
||||
struct vb2_queue *q = (struct vb2_queue *)&ctx->vb_q;
|
||||
|
||||
if (ctx->state & DVB_VB2_STATE_INIT)
|
||||
vb2_core_queue_release(q);
|
||||
|
||||
ctx->state = DVB_VB2_STATE_NONE;
|
||||
dprintk(3, "[%s]\n", ctx->name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dvb_vb2_stream_on(struct dvb_vb2_ctx *ctx)
|
||||
{
|
||||
struct vb2_queue *q = &ctx->vb_q;
|
||||
int ret;
|
||||
|
||||
ret = vb2_core_streamon(q, q->type);
|
||||
if (ret) {
|
||||
ctx->state = DVB_VB2_STATE_NONE;
|
||||
dprintk(1, "[%s] errno=%d\n", ctx->name, ret);
|
||||
return ret;
|
||||
}
|
||||
ctx->state |= DVB_VB2_STATE_STREAMON;
|
||||
dprintk(3, "[%s]\n", ctx->name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dvb_vb2_stream_off(struct dvb_vb2_ctx *ctx)
|
||||
{
|
||||
struct vb2_queue *q = (struct vb2_queue *)&ctx->vb_q;
|
||||
int ret;
|
||||
|
||||
ctx->state &= ~DVB_VB2_STATE_STREAMON;
|
||||
ret = vb2_core_streamoff(q, q->type);
|
||||
if (ret) {
|
||||
ctx->state = DVB_VB2_STATE_NONE;
|
||||
dprintk(1, "[%s] errno=%d\n", ctx->name, ret);
|
||||
return ret;
|
||||
}
|
||||
dprintk(3, "[%s]\n", ctx->name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dvb_vb2_is_streaming(struct dvb_vb2_ctx *ctx)
|
||||
{
|
||||
return (ctx->state & DVB_VB2_STATE_STREAMON);
|
||||
}
|
||||
|
||||
int dvb_vb2_fill_buffer(struct dvb_vb2_ctx *ctx,
|
||||
const unsigned char *src, int len)
|
||||
{
|
||||
unsigned long flags = 0;
|
||||
void *vbuf = NULL;
|
||||
int todo = len;
|
||||
unsigned char *psrc = (unsigned char *)src;
|
||||
int ll = 0;
|
||||
|
||||
dprintk(3, "[%s] %d bytes are rcvd\n", ctx->name, len);
|
||||
if (!src) {
|
||||
dprintk(3, "[%s]:NULL pointer src\n", ctx->name);
|
||||
/**normal case: This func is called twice from demux driver
|
||||
* once with valid src pointer, second time with NULL pointer
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
spin_lock_irqsave(&ctx->slock, flags);
|
||||
while (todo) {
|
||||
if (!ctx->buf) {
|
||||
if (list_empty(&ctx->dvb_q)) {
|
||||
dprintk(3, "[%s] Buffer overflow!!!\n",
|
||||
ctx->name);
|
||||
break;
|
||||
}
|
||||
|
||||
ctx->buf = list_entry(ctx->dvb_q.next,
|
||||
struct dvb_buffer, list);
|
||||
ctx->remain = vb2_plane_size(&ctx->buf->vb, 0);
|
||||
ctx->offset = 0;
|
||||
}
|
||||
|
||||
if (!dvb_vb2_is_streaming(ctx)) {
|
||||
vb2_buffer_done(&ctx->buf->vb, VB2_BUF_STATE_ERROR);
|
||||
list_del(&ctx->buf->list);
|
||||
ctx->buf = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Fill buffer */
|
||||
ll = min(todo, ctx->remain);
|
||||
vbuf = vb2_plane_vaddr(&ctx->buf->vb, 0);
|
||||
memcpy(vbuf + ctx->offset, psrc, ll);
|
||||
todo -= ll;
|
||||
psrc += ll;
|
||||
|
||||
ctx->remain -= ll;
|
||||
ctx->offset += ll;
|
||||
|
||||
if (ctx->remain == 0) {
|
||||
vb2_buffer_done(&ctx->buf->vb, VB2_BUF_STATE_DONE);
|
||||
list_del(&ctx->buf->list);
|
||||
ctx->buf = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (ctx->nonblocking && ctx->buf) {
|
||||
vb2_set_plane_payload(&ctx->buf->vb, 0, ll);
|
||||
vb2_buffer_done(&ctx->buf->vb, VB2_BUF_STATE_DONE);
|
||||
list_del(&ctx->buf->list);
|
||||
ctx->buf = NULL;
|
||||
}
|
||||
spin_unlock_irqrestore(&ctx->slock, flags);
|
||||
|
||||
if (todo)
|
||||
dprintk(1, "[%s] %d bytes are dropped.\n", ctx->name, todo);
|
||||
else
|
||||
dprintk(3, "[%s]\n", ctx->name);
|
||||
|
||||
dprintk(3, "[%s] %d bytes are copied\n", ctx->name, len - todo);
|
||||
return (len - todo);
|
||||
}
|
||||
|
||||
int dvb_vb2_reqbufs(struct dvb_vb2_ctx *ctx, struct dmx_requestbuffers *req)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Adjust size to a sane value */
|
||||
if (req->size > DVB_V2_MAX_SIZE)
|
||||
req->size = DVB_V2_MAX_SIZE;
|
||||
|
||||
/* FIXME: round req->size to a 188 or 204 multiple */
|
||||
|
||||
ctx->buf_siz = req->size;
|
||||
ctx->buf_cnt = req->count;
|
||||
ret = vb2_core_reqbufs(&ctx->vb_q, VB2_MEMORY_MMAP, &req->count);
|
||||
if (ret) {
|
||||
ctx->state = DVB_VB2_STATE_NONE;
|
||||
dprintk(1, "[%s] count=%d size=%d errno=%d\n", ctx->name,
|
||||
ctx->buf_cnt, ctx->buf_siz, ret);
|
||||
return ret;
|
||||
}
|
||||
ctx->state |= DVB_VB2_STATE_REQBUFS;
|
||||
dprintk(3, "[%s] count=%d size=%d\n", ctx->name,
|
||||
ctx->buf_cnt, ctx->buf_siz);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dvb_vb2_querybuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b)
|
||||
{
|
||||
vb2_core_querybuf(&ctx->vb_q, b->index, b);
|
||||
dprintk(3, "[%s] index=%d\n", ctx->name, b->index);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dvb_vb2_expbuf(struct dvb_vb2_ctx *ctx, struct dmx_exportbuffer *exp)
|
||||
{
|
||||
struct vb2_queue *q = &ctx->vb_q;
|
||||
int ret;
|
||||
|
||||
ret = vb2_core_expbuf(&ctx->vb_q, &exp->fd, q->type, exp->index,
|
||||
0, exp->flags);
|
||||
if (ret) {
|
||||
dprintk(1, "[%s] index=%d errno=%d\n", ctx->name,
|
||||
exp->index, ret);
|
||||
return ret;
|
||||
}
|
||||
dprintk(3, "[%s] index=%d fd=%d\n", ctx->name, exp->index, exp->fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dvb_vb2_qbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = vb2_core_qbuf(&ctx->vb_q, b->index, b);
|
||||
if (ret) {
|
||||
dprintk(1, "[%s] index=%d errno=%d\n", ctx->name,
|
||||
b->index, ret);
|
||||
return ret;
|
||||
}
|
||||
dprintk(5, "[%s] index=%d\n", ctx->name, b->index);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dvb_vb2_dqbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = vb2_core_dqbuf(&ctx->vb_q, &b->index, b, ctx->nonblocking);
|
||||
if (ret) {
|
||||
dprintk(1, "[%s] errno=%d\n", ctx->name, ret);
|
||||
return ret;
|
||||
}
|
||||
dprintk(5, "[%s] index=%d\n", ctx->name, b->index);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int dvb_vb2_mmap(struct dvb_vb2_ctx *ctx, struct vm_area_struct *vma)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = vb2_mmap(&ctx->vb_q, vma);
|
||||
if (ret) {
|
||||
dprintk(1, "[%s] errno=%d\n", ctx->name, ret);
|
||||
return ret;
|
||||
}
|
||||
dprintk(3, "[%s] ret=%d\n", ctx->name, ret);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int dvb_vb2_poll(struct dvb_vb2_ctx *ctx, struct file *file,
|
||||
poll_table *wait)
|
||||
{
|
||||
dprintk(3, "[%s]\n", ctx->name);
|
||||
return vb2_core_poll(&ctx->vb_q, file, wait);
|
||||
}
|
||||
|
|
@ -30,7 +30,7 @@
|
|||
#include <linux/fs.h>
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/mutex.h>
|
||||
#include "dvbdev.h"
|
||||
#include <media/dvbdev.h>
|
||||
|
||||
/* Due to enum tuner_pad_index */
|
||||
#include <media/tuner.h>
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
# Makefile for the kernel DVB frontend device drivers.
|
||||
#
|
||||
|
||||
ccflags-y += -I$(srctree)/drivers/media/dvb-core/
|
||||
ccflags-y += -I$(srctree)/drivers/media/tuners/
|
||||
|
||||
# FIXME: RTL2832 SDR driver uses power management directly from USB IF driver
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
#ifndef A8293_H
|
||||
#define A8293_H
|
||||
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
|
||||
/*
|
||||
* I2C address
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#ifndef AF9013_PRIV_H
|
||||
#define AF9013_PRIV_H
|
||||
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "af9013.h"
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/math64.h>
|
||||
|
|
|
@ -18,12 +18,12 @@
|
|||
#ifndef AF9033_PRIV_H
|
||||
#define AF9033_PRIV_H
|
||||
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "af9033.h"
|
||||
#include <linux/math64.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/kernel.h>
|
||||
#include "dvb_math.h"
|
||||
#include <media/dvb_math.h>
|
||||
|
||||
struct reg_val {
|
||||
u32 reg;
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <dvb_frontend.h>
|
||||
#include <media/dvb_frontend.h>
|
||||
|
||||
#include "as102_fe.h"
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#include <linux/dvb/frontend.h>
|
||||
#include <linux/types.h>
|
||||
#include "ascot2e.h"
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
|
||||
#define MAX_WRITE_REGSIZE 10
|
||||
|
||||
|
@ -155,7 +155,9 @@ static int ascot2e_write_regs(struct ascot2e_priv *priv,
|
|||
|
||||
static int ascot2e_write_reg(struct ascot2e_priv *priv, u8 reg, u8 val)
|
||||
{
|
||||
return ascot2e_write_regs(priv, reg, &val, 1);
|
||||
u8 tmp = val; /* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */
|
||||
|
||||
return ascot2e_write_regs(priv, reg, &tmp, 1);
|
||||
}
|
||||
|
||||
static int ascot2e_read_regs(struct ascot2e_priv *priv,
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
*/
|
||||
|
||||
#include <asm/div64.h>
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
|
||||
#include "atbm8830.h"
|
||||
#include "atbm8830_priv.h"
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/i2c.h>
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "au8522_priv.h"
|
||||
|
||||
static int debug;
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/delay.h>
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "au8522.h"
|
||||
#include "au8522_priv.h"
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
#include <media/v4l2-ctrls.h>
|
||||
#include <media/v4l2-mc.h>
|
||||
#include <linux/i2c.h>
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "au8522.h"
|
||||
#include "tuner-i2c.h"
|
||||
|
||||
|
@ -99,7 +99,7 @@ int au8522_led_ctrl(struct au8522_state *state, int led);
|
|||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H 0x0A5
|
||||
#define AU8522_AGC_CONTROL_RANGE_REG0A6H 0x0A6
|
||||
#define AU8522_SYSTEM_GAIN_CONTROL_REG0A7H 0x0A7
|
||||
#define AU8522_TUNER_AGC_RF_STOP_REG0A8H 0x0A8
|
||||
#define AU8522_TUNER_AGC_RF_STOP_REG0A8H 0x0A8
|
||||
#define AU8522_TUNER_AGC_RF_START_REG0A9H 0x0A9
|
||||
#define AU8522_TUNER_RF_AGC_DEFAULT_REG0AAH 0x0AA
|
||||
#define AU8522_TUNER_AGC_IF_STOP_REG0ABH 0x0AB
|
||||
|
@ -110,18 +110,18 @@ int au8522_led_ctrl(struct au8522_state *state, int led);
|
|||
|
||||
/* Receiver registers */
|
||||
#define AU8522_FRMREGTHRD1_REG0B0H 0x0B0
|
||||
#define AU8522_FRMREGAGC1H_REG0B1H 0x0B1
|
||||
#define AU8522_FRMREGSHIFT1_REG0B2H 0x0B2
|
||||
#define AU8522_TOREGAGC1_REG0B3H 0x0B3
|
||||
#define AU8522_TOREGASHIFT1_REG0B4H 0x0B4
|
||||
#define AU8522_FRMREGAGC1H_REG0B1H 0x0B1
|
||||
#define AU8522_FRMREGSHIFT1_REG0B2H 0x0B2
|
||||
#define AU8522_TOREGAGC1_REG0B3H 0x0B3
|
||||
#define AU8522_TOREGASHIFT1_REG0B4H 0x0B4
|
||||
#define AU8522_FRMREGBBH_REG0B5H 0x0B5
|
||||
#define AU8522_FRMREGBBM_REG0B6H 0x0B6
|
||||
#define AU8522_FRMREGBBL_REG0B7H 0x0B7
|
||||
#define AU8522_FRMREGBBM_REG0B6H 0x0B6
|
||||
#define AU8522_FRMREGBBL_REG0B7H 0x0B7
|
||||
/* 0xB8 TO 0xD7 are the filter coefficients */
|
||||
#define AU8522_FRMREGTHRD2_REG0D8H 0x0D8
|
||||
#define AU8522_FRMREGAGC2H_REG0D9H 0x0D9
|
||||
#define AU8522_TOREGAGC2_REG0DAH 0x0DA
|
||||
#define AU8522_TOREGSHIFT2_REG0DBH 0x0DB
|
||||
#define AU8522_FRMREGTHRD2_REG0D8H 0x0D8
|
||||
#define AU8522_FRMREGAGC2H_REG0D9H 0x0D9
|
||||
#define AU8522_TOREGAGC2_REG0DAH 0x0DA
|
||||
#define AU8522_TOREGSHIFT2_REG0DBH 0x0DB
|
||||
#define AU8522_FRMREGPILOTH_REG0DCH 0x0DC
|
||||
#define AU8522_FRMREGPILOTM_REG0DDH 0x0DD
|
||||
#define AU8522_FRMREGPILOTL_REG0DEH 0x0DE
|
||||
|
@ -134,9 +134,9 @@ int au8522_led_ctrl(struct au8522_state *state, int led);
|
|||
#define AU8522_CHIP_MODE_REG0FEH 0x0FE
|
||||
|
||||
/* I2C bus control registers */
|
||||
#define AU8522_I2C_CONTROL_REG0_REG090H 0x090
|
||||
#define AU8522_I2C_CONTROL_REG1_REG091H 0x091
|
||||
#define AU8522_I2C_STATUS_REG092H 0x092
|
||||
#define AU8522_I2C_CONTROL_REG0_REG090H 0x090
|
||||
#define AU8522_I2C_CONTROL_REG1_REG091H 0x091
|
||||
#define AU8522_I2C_STATUS_REG092H 0x092
|
||||
#define AU8522_I2C_WR_DATA0_REG093H 0x093
|
||||
#define AU8522_I2C_WR_DATA1_REG094H 0x094
|
||||
#define AU8522_I2C_WR_DATA2_REG095H 0x095
|
||||
|
@ -156,48 +156,48 @@ int au8522_led_ctrl(struct au8522_state *state, int led);
|
|||
|
||||
#define AU8522_ENA_USB_REG101H 0x101
|
||||
|
||||
#define AU8522_I2S_CTRL_0_REG110H 0x110
|
||||
#define AU8522_I2S_CTRL_1_REG111H 0x111
|
||||
#define AU8522_I2S_CTRL_2_REG112H 0x112
|
||||
#define AU8522_I2S_CTRL_0_REG110H 0x110
|
||||
#define AU8522_I2S_CTRL_1_REG111H 0x111
|
||||
#define AU8522_I2S_CTRL_2_REG112H 0x112
|
||||
|
||||
#define AU8522_FRMREGFFECONTROL_REG121H 0x121
|
||||
#define AU8522_FRMREGDFECONTROL_REG122H 0x122
|
||||
#define AU8522_FRMREGFFECONTROL_REG121H 0x121
|
||||
#define AU8522_FRMREGDFECONTROL_REG122H 0x122
|
||||
|
||||
#define AU8522_CARRFREQOFFSET0_REG201H 0x201
|
||||
#define AU8522_CARRFREQOFFSET0_REG201H 0x201
|
||||
#define AU8522_CARRFREQOFFSET1_REG202H 0x202
|
||||
|
||||
#define AU8522_DECIMATION_GAIN_REG21AH 0x21A
|
||||
#define AU8522_FRMREGIFSLP_REG21BH 0x21B
|
||||
#define AU8522_FRMREGTHRDL2_REG21CH 0x21C
|
||||
#define AU8522_FRMREGSTEP3DB_REG21DH 0x21D
|
||||
#define AU8522_FRMREGIFSLP_REG21BH 0x21B
|
||||
#define AU8522_FRMREGTHRDL2_REG21CH 0x21C
|
||||
#define AU8522_FRMREGSTEP3DB_REG21DH 0x21D
|
||||
#define AU8522_DAGC_GAIN_ADJUSTMENT_REG21EH 0x21E
|
||||
#define AU8522_FRMREGPLLMODE_REG21FH 0x21F
|
||||
#define AU8522_FRMREGCSTHRD_REG220H 0x220
|
||||
#define AU8522_FRMREGCRLOCKDMAX_REG221H 0x221
|
||||
#define AU8522_FRMREGCRPERIODMASK_REG222H 0x222
|
||||
#define AU8522_FRMREGCRLOCK0THH_REG223H 0x223
|
||||
#define AU8522_FRMREGCRLOCK1THH_REG224H 0x224
|
||||
#define AU8522_FRMREGCRLOCK0THL_REG225H 0x225
|
||||
#define AU8522_FRMREGCRLOCK1THL_REG226H 0x226
|
||||
#define AU8522_FRMREGPLLMODE_REG21FH 0x21F
|
||||
#define AU8522_FRMREGCSTHRD_REG220H 0x220
|
||||
#define AU8522_FRMREGCRLOCKDMAX_REG221H 0x221
|
||||
#define AU8522_FRMREGCRPERIODMASK_REG222H 0x222
|
||||
#define AU8522_FRMREGCRLOCK0THH_REG223H 0x223
|
||||
#define AU8522_FRMREGCRLOCK1THH_REG224H 0x224
|
||||
#define AU8522_FRMREGCRLOCK0THL_REG225H 0x225
|
||||
#define AU8522_FRMREGCRLOCK1THL_REG226H 0x226
|
||||
#define AU_FRMREGPLLACQPHASESCL_REG227H 0x227
|
||||
#define AU8522_FRMREGFREQFBCTRL_REG228H 0x228
|
||||
#define AU8522_FRMREGFREQFBCTRL_REG228H 0x228
|
||||
|
||||
/* Analog TV Decoder */
|
||||
#define AU8522_TVDEC_STATUS_REG000H 0x000
|
||||
#define AU8522_TVDEC_INT_STATUS_REG001H 0x001
|
||||
#define AU8522_TVDEC_MACROVISION_STATUS_REG002H 0x002
|
||||
#define AU8522_TVDEC_MACROVISION_STATUS_REG002H 0x002
|
||||
#define AU8522_TVDEC_SHARPNESSREG009H 0x009
|
||||
#define AU8522_TVDEC_BRIGHTNESS_REG00AH 0x00A
|
||||
#define AU8522_TVDEC_CONTRAST_REG00BH 0x00B
|
||||
#define AU8522_TVDEC_SATURATION_CB_REG00CH 0x00C
|
||||
#define AU8522_TVDEC_SATURATION_CR_REG00DH 0x00D
|
||||
#define AU8522_TVDEC_HUE_H_REG00EH 0x00E
|
||||
#define AU8522_TVDEC_HUE_L_REG00FH 0x00F
|
||||
#define AU8522_TVDEC_HUE_L_REG00FH 0x00F
|
||||
#define AU8522_TVDEC_INT_MASK_REG010H 0x010
|
||||
#define AU8522_VIDEO_MODE_REG011H 0x011
|
||||
#define AU8522_TVDEC_PGA_REG012H 0x012
|
||||
#define AU8522_TVDEC_COMB_MODE_REG015H 0x015
|
||||
#define AU8522_REG016H 0x016
|
||||
#define AU8522_REG016H 0x016
|
||||
#define AU8522_TVDED_DBG_MODE_REG060H 0x060
|
||||
#define AU8522_TVDEC_FORMAT_CTRL1_REG061H 0x061
|
||||
#define AU8522_TVDEC_FORMAT_CTRL2_REG062H 0x062
|
||||
|
@ -207,13 +207,13 @@ int au8522_led_ctrl(struct au8522_state *state, int led);
|
|||
#define AU8522_TVDEC_COMB_VDIF_THR2_REG066H 0x066
|
||||
#define AU8522_TVDEC_COMB_VDIF_THR3_REG067H 0x067
|
||||
#define AU8522_TVDEC_COMB_NOTCH_THR_REG068H 0x068
|
||||
#define AU8522_TVDEC_COMB_HDIF_THR1_REG069H 0x069
|
||||
#define AU8522_TVDEC_COMB_HDIF_THR1_REG069H 0x069
|
||||
#define AU8522_TVDEC_COMB_HDIF_THR2_REG06AH 0x06A
|
||||
#define AU8522_TVDEC_COMB_HDIF_THR3_REG06BH 0x06B
|
||||
#define AU8522_TVDEC_COMB_DCDIF_THR1_REG06CH 0x06C
|
||||
#define AU8522_TVDEC_COMB_DCDIF_THR2_REG06DH 0x06D
|
||||
#define AU8522_TVDEC_COMB_DCDIF_THR3_REG06EH 0x06E
|
||||
#define AU8522_TVDEC_UV_SEP_THR_REG06FH 0x06F
|
||||
#define AU8522_TVDEC_COMB_HDIF_THR3_REG06BH 0x06B
|
||||
#define AU8522_TVDEC_COMB_DCDIF_THR1_REG06CH 0x06C
|
||||
#define AU8522_TVDEC_COMB_DCDIF_THR2_REG06DH 0x06D
|
||||
#define AU8522_TVDEC_COMB_DCDIF_THR3_REG06EH 0x06E
|
||||
#define AU8522_TVDEC_UV_SEP_THR_REG06FH 0x06F
|
||||
#define AU8522_TVDEC_COMB_DC_THR1_NTSC_REG070H 0x070
|
||||
#define AU8522_TVDEC_COMB_DC_THR2_NTSC_REG073H 0x073
|
||||
#define AU8522_TVDEC_DCAGC_CTRL_REG077H 0x077
|
||||
|
@ -229,42 +229,42 @@ int au8522_led_ctrl(struct au8522_state *state, int led);
|
|||
|
||||
#define AU8522_TVDEC_CHROMA_AGC_REG401H 0x401
|
||||
#define AU8522_TVDEC_CHROMA_SFT_REG402H 0x402
|
||||
#define AU8522_FILTER_COEF_R410 0x410
|
||||
#define AU8522_FILTER_COEF_R411 0x411
|
||||
#define AU8522_FILTER_COEF_R412 0x412
|
||||
#define AU8522_FILTER_COEF_R413 0x413
|
||||
#define AU8522_FILTER_COEF_R414 0x414
|
||||
#define AU8522_FILTER_COEF_R415 0x415
|
||||
#define AU8522_FILTER_COEF_R416 0x416
|
||||
#define AU8522_FILTER_COEF_R417 0x417
|
||||
#define AU8522_FILTER_COEF_R418 0x418
|
||||
#define AU8522_FILTER_COEF_R419 0x419
|
||||
#define AU8522_FILTER_COEF_R41A 0x41A
|
||||
#define AU8522_FILTER_COEF_R41B 0x41B
|
||||
#define AU8522_FILTER_COEF_R41C 0x41C
|
||||
#define AU8522_FILTER_COEF_R41D 0x41D
|
||||
#define AU8522_FILTER_COEF_R41E 0x41E
|
||||
#define AU8522_FILTER_COEF_R41F 0x41F
|
||||
#define AU8522_FILTER_COEF_R420 0x420
|
||||
#define AU8522_FILTER_COEF_R421 0x421
|
||||
#define AU8522_FILTER_COEF_R422 0x422
|
||||
#define AU8522_FILTER_COEF_R423 0x423
|
||||
#define AU8522_FILTER_COEF_R424 0x424
|
||||
#define AU8522_FILTER_COEF_R425 0x425
|
||||
#define AU8522_FILTER_COEF_R426 0x426
|
||||
#define AU8522_FILTER_COEF_R427 0x427
|
||||
#define AU8522_FILTER_COEF_R428 0x428
|
||||
#define AU8522_FILTER_COEF_R429 0x429
|
||||
#define AU8522_FILTER_COEF_R42A 0x42A
|
||||
#define AU8522_FILTER_COEF_R42B 0x42B
|
||||
#define AU8522_FILTER_COEF_R42C 0x42C
|
||||
#define AU8522_FILTER_COEF_R42D 0x42D
|
||||
#define AU8522_FILTER_COEF_R410 0x410
|
||||
#define AU8522_FILTER_COEF_R411 0x411
|
||||
#define AU8522_FILTER_COEF_R412 0x412
|
||||
#define AU8522_FILTER_COEF_R413 0x413
|
||||
#define AU8522_FILTER_COEF_R414 0x414
|
||||
#define AU8522_FILTER_COEF_R415 0x415
|
||||
#define AU8522_FILTER_COEF_R416 0x416
|
||||
#define AU8522_FILTER_COEF_R417 0x417
|
||||
#define AU8522_FILTER_COEF_R418 0x418
|
||||
#define AU8522_FILTER_COEF_R419 0x419
|
||||
#define AU8522_FILTER_COEF_R41A 0x41A
|
||||
#define AU8522_FILTER_COEF_R41B 0x41B
|
||||
#define AU8522_FILTER_COEF_R41C 0x41C
|
||||
#define AU8522_FILTER_COEF_R41D 0x41D
|
||||
#define AU8522_FILTER_COEF_R41E 0x41E
|
||||
#define AU8522_FILTER_COEF_R41F 0x41F
|
||||
#define AU8522_FILTER_COEF_R420 0x420
|
||||
#define AU8522_FILTER_COEF_R421 0x421
|
||||
#define AU8522_FILTER_COEF_R422 0x422
|
||||
#define AU8522_FILTER_COEF_R423 0x423
|
||||
#define AU8522_FILTER_COEF_R424 0x424
|
||||
#define AU8522_FILTER_COEF_R425 0x425
|
||||
#define AU8522_FILTER_COEF_R426 0x426
|
||||
#define AU8522_FILTER_COEF_R427 0x427
|
||||
#define AU8522_FILTER_COEF_R428 0x428
|
||||
#define AU8522_FILTER_COEF_R429 0x429
|
||||
#define AU8522_FILTER_COEF_R42A 0x42A
|
||||
#define AU8522_FILTER_COEF_R42B 0x42B
|
||||
#define AU8522_FILTER_COEF_R42C 0x42C
|
||||
#define AU8522_FILTER_COEF_R42D 0x42D
|
||||
|
||||
/* VBI Control Registers */
|
||||
#define AU8522_TVDEC_VBI_RX_FIFO_CONTAIN_REG004H 0x004
|
||||
#define AU8522_TVDEC_VBI_TX_FIFO_CONTAIN_REG005H 0x005
|
||||
#define AU8522_TVDEC_VBI_RX_FIFO_READ_REG006H 0x006
|
||||
#define AU8522_TVDEC_VBI_FIFO_STATUS_REG007H 0x007
|
||||
#define AU8522_TVDEC_VBI_RX_FIFO_CONTAIN_REG004H 0x004
|
||||
#define AU8522_TVDEC_VBI_TX_FIFO_CONTAIN_REG005H 0x005
|
||||
#define AU8522_TVDEC_VBI_RX_FIFO_READ_REG006H 0x006
|
||||
#define AU8522_TVDEC_VBI_FIFO_STATUS_REG007H 0x007
|
||||
#define AU8522_TVDEC_VBI_CTRL_H_REG017H 0x017
|
||||
#define AU8522_TVDEC_VBI_CTRL_L_REG018H 0x018
|
||||
#define AU8522_TVDEC_VBI_USER_TOTAL_BITS_REG019H 0x019
|
||||
|
@ -272,10 +272,10 @@ int au8522_led_ctrl(struct au8522_state *state, int led);
|
|||
#define AU8522_TVDEC_VBI_USER_TUNIT_L_REG01BH 0x01B
|
||||
#define AU8522_TVDEC_VBI_USER_THRESH1_REG01CH 0x01C
|
||||
#define AU8522_TVDEC_VBI_USER_FRAME_PAT2_REG01EH 0x01E
|
||||
#define AU8522_TVDEC_VBI_USER_FRAME_PAT1_REG01FH 0x01F
|
||||
#define AU8522_TVDEC_VBI_USER_FRAME_PAT0_REG020H 0x020
|
||||
#define AU8522_TVDEC_VBI_USER_FRAME_MASK2_REG021H 0x021
|
||||
#define AU8522_TVDEC_VBI_USER_FRAME_MASK1_REG022H 0x022
|
||||
#define AU8522_TVDEC_VBI_USER_FRAME_PAT1_REG01FH 0x01F
|
||||
#define AU8522_TVDEC_VBI_USER_FRAME_PAT0_REG020H 0x020
|
||||
#define AU8522_TVDEC_VBI_USER_FRAME_MASK2_REG021H 0x021
|
||||
#define AU8522_TVDEC_VBI_USER_FRAME_MASK1_REG022H 0x022
|
||||
#define AU8522_TVDEC_VBI_USER_FRAME_MASK0_REG023H 0x023
|
||||
|
||||
#define AU8522_REG071H 0x071
|
||||
|
@ -315,17 +315,17 @@ int au8522_led_ctrl(struct au8522_state *state, int led);
|
|||
#define AU8522_GPIO_DATA_REG0E2H 0x0E2
|
||||
|
||||
/* Audio Control Registers */
|
||||
#define AU8522_AUDIOAGC_REG0EEH 0x0EE
|
||||
#define AU8522_AUDIO_STATUS_REG0F0H 0x0F0
|
||||
#define AU8522_AUDIO_MODE_REG0F1H 0x0F1
|
||||
#define AU8522_AUDIO_VOLUME_L_REG0F2H 0x0F2
|
||||
#define AU8522_AUDIO_VOLUME_R_REG0F3H 0x0F3
|
||||
#define AU8522_AUDIO_VOLUME_REG0F4H 0x0F4
|
||||
#define AU8522_FRMREGAUPHASE_REG0F7H 0x0F7
|
||||
#define AU8522_AUDIOAGC_REG0EEH 0x0EE
|
||||
#define AU8522_AUDIO_STATUS_REG0F0H 0x0F0
|
||||
#define AU8522_AUDIO_MODE_REG0F1H 0x0F1
|
||||
#define AU8522_AUDIO_VOLUME_L_REG0F2H 0x0F2
|
||||
#define AU8522_AUDIO_VOLUME_R_REG0F3H 0x0F3
|
||||
#define AU8522_AUDIO_VOLUME_REG0F4H 0x0F4
|
||||
#define AU8522_FRMREGAUPHASE_REG0F7H 0x0F7
|
||||
#define AU8522_REG0F9H 0x0F9
|
||||
|
||||
#define AU8522_AUDIOAGC2_REG605H 0x605
|
||||
#define AU8522_AUDIOFREQ_REG606H 0x606
|
||||
#define AU8522_AUDIOAGC2_REG605H 0x605
|
||||
#define AU8522_AUDIOFREQ_REG606H 0x606
|
||||
|
||||
|
||||
/**************************************************************/
|
||||
|
@ -356,53 +356,53 @@ int au8522_led_ctrl(struct au8522_state *state, int led);
|
|||
#define AU8522_TVDEC_FORMAT_CTRL2_REG062H_STD_PAL_M 0x02
|
||||
|
||||
|
||||
#define AU8522_INPUT_CONTROL_REG081H_ATSC 0xC4
|
||||
#define AU8522_INPUT_CONTROL_REG081H_ATSC 0xC4
|
||||
#define AU8522_INPUT_CONTROL_REG081H_ATVRF 0xC4
|
||||
#define AU8522_INPUT_CONTROL_REG081H_ATVRF13 0xC4
|
||||
#define AU8522_INPUT_CONTROL_REG081H_J83B64 0xC4
|
||||
#define AU8522_INPUT_CONTROL_REG081H_J83B256 0xC4
|
||||
#define AU8522_INPUT_CONTROL_REG081H_CVBS 0x20
|
||||
#define AU8522_INPUT_CONTROL_REG081H_J83B64 0xC4
|
||||
#define AU8522_INPUT_CONTROL_REG081H_J83B256 0xC4
|
||||
#define AU8522_INPUT_CONTROL_REG081H_CVBS 0x20
|
||||
#define AU8522_INPUT_CONTROL_REG081H_CVBS_CH1 0xA2
|
||||
#define AU8522_INPUT_CONTROL_REG081H_CVBS_CH2 0xA0
|
||||
#define AU8522_INPUT_CONTROL_REG081H_CVBS_CH3 0x69
|
||||
#define AU8522_INPUT_CONTROL_REG081H_CVBS_CH4 0x68
|
||||
#define AU8522_INPUT_CONTROL_REG081H_CVBS_CH4_SIF 0x28
|
||||
#define AU8522_INPUT_CONTROL_REG081H_CVBS_CH4_SIF 0x28
|
||||
/* CH1 AS Y,CH3 AS C */
|
||||
#define AU8522_INPUT_CONTROL_REG081H_SVIDEO_CH13 0x23
|
||||
#define AU8522_INPUT_CONTROL_REG081H_SVIDEO_CH13 0x23
|
||||
/* CH2 AS Y,CH4 AS C */
|
||||
#define AU8522_INPUT_CONTROL_REG081H_SVIDEO_CH24 0x20
|
||||
#define AU8522_MODULE_CLOCK_CONTROL_REG0A3H_ATSC 0x0C
|
||||
#define AU8522_MODULE_CLOCK_CONTROL_REG0A3H_J83B64 0x09
|
||||
#define AU8522_MODULE_CLOCK_CONTROL_REG0A3H_J83B256 0x09
|
||||
#define AU8522_MODULE_CLOCK_CONTROL_REG0A3H_CVBS 0x12
|
||||
#define AU8522_MODULE_CLOCK_CONTROL_REG0A3H_ATVRF 0x1A
|
||||
#define AU8522_INPUT_CONTROL_REG081H_SVIDEO_CH24 0x20
|
||||
#define AU8522_MODULE_CLOCK_CONTROL_REG0A3H_ATSC 0x0C
|
||||
#define AU8522_MODULE_CLOCK_CONTROL_REG0A3H_J83B64 0x09
|
||||
#define AU8522_MODULE_CLOCK_CONTROL_REG0A3H_J83B256 0x09
|
||||
#define AU8522_MODULE_CLOCK_CONTROL_REG0A3H_CVBS 0x12
|
||||
#define AU8522_MODULE_CLOCK_CONTROL_REG0A3H_ATVRF 0x1A
|
||||
#define AU8522_MODULE_CLOCK_CONTROL_REG0A3H_ATVRF13 0x1A
|
||||
#define AU8522_MODULE_CLOCK_CONTROL_REG0A3H_SVIDEO 0x02
|
||||
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H_CLEAR 0x00
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H_SVIDEO 0x9C
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H_CVBS 0x9D
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H_CVBS 0x9D
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H_ATSC 0xE8
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H_J83B256 0xCA
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H_J83B64 0xCA
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H_ATVRF 0xDD
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H_J83B256 0xCA
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H_J83B64 0xCA
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H_ATVRF 0xDD
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H_ATVRF13 0xDD
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H_PAL 0xDD
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_0_REG0A4H_FM 0xDD
|
||||
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_ATSC 0x80
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_J83B256 0x80
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_J83B64 0x80
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_J83B256 0x80
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_J83B64 0x80
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_DONGLE_ATSC 0x40
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_DONGLE_J83B256 0x40
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_DONGLE_J83B64 0x40
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_DONGLE_CLEAR 0x00
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_ATVRF 0x01
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_ATVRF13 0x01
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_SVIDEO 0x04
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_SVIDEO 0x04
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_CVBS 0x01
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_PWM 0x03
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_IIS 0x09
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_PWM 0x03
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_IIS 0x09
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_PAL 0x01
|
||||
#define AU8522_SYSTEM_MODULE_CONTROL_1_REG0A5H_FM 0x01
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "bcm3510.h"
|
||||
#include "bcm3510_priv.h"
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/slab.h>
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "cx22700.h"
|
||||
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
#include <linux/string.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/delay.h>
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "cx22702.h"
|
||||
|
||||
struct cx22702_state {
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "cx24110.h"
|
||||
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "cx24113.h"
|
||||
|
||||
static int debug;
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/firmware.h>
|
||||
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "cx24116.h"
|
||||
|
||||
static int debug;
|
||||
|
@ -963,7 +963,7 @@ static int cx24116_send_diseqc_msg(struct dvb_frontend *fe,
|
|||
|
||||
/* Validate length */
|
||||
if (d->msg_len > sizeof(d->msg))
|
||||
return -EINVAL;
|
||||
return -EINVAL;
|
||||
|
||||
/* Dump DiSEqC message */
|
||||
if (debug) {
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
#include <linux/firmware.h>
|
||||
|
||||
#include "tuner-i2c.h"
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "cx24117.h"
|
||||
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
#include <linux/moduleparam.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/firmware.h>
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "cx24120.h"
|
||||
|
||||
#define CX24120_SEARCH_RANGE_KHZ 5000
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <asm/div64.h>
|
||||
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "cx24123.h"
|
||||
|
||||
#define XTAL 10111000
|
||||
|
|
|
@ -23,8 +23,8 @@
|
|||
#define CXD2820R_PRIV_H
|
||||
|
||||
#include <linux/dvb/version.h>
|
||||
#include "dvb_frontend.h"
|
||||
#include "dvb_math.h"
|
||||
#include <media/dvb_frontend.h>
|
||||
#include <media/dvb_math.h>
|
||||
#include "cxd2820r.h"
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/math64.h>
|
||||
|
|
|
@ -29,9 +29,10 @@
|
|||
#include <linux/math64.h>
|
||||
#include <linux/log2.h>
|
||||
#include <linux/dynamic_debug.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include "dvb_math.h"
|
||||
#include "dvb_frontend.h"
|
||||
#include <media/dvb_math.h>
|
||||
#include <media/dvb_frontend.h>
|
||||
#include "cxd2841er.h"
|
||||
#include "cxd2841er_priv.h"
|
||||
|
||||
|
@ -257,7 +258,9 @@ static int cxd2841er_write_regs(struct cxd2841er_priv *priv,
|
|||
static int cxd2841er_write_reg(struct cxd2841er_priv *priv,
|
||||
u8 addr, u8 reg, u8 val)
|
||||
{
|
||||
return cxd2841er_write_regs(priv, addr, reg, &val, 1);
|
||||
u8 tmp = val; /* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */
|
||||
|
||||
return cxd2841er_write_regs(priv, addr, reg, &tmp, 1);
|
||||
}
|
||||
|
||||
static int cxd2841er_read_regs(struct cxd2841er_priv *priv,
|
||||
|
@ -1696,12 +1699,10 @@ static u32 cxd2841er_dvbs_read_snr(struct cxd2841er_priv *priv,
|
|||
min_index = 0;
|
||||
if (delsys == SYS_DVBS) {
|
||||
cn_data = s_cn_data;
|
||||
max_index = sizeof(s_cn_data) /
|
||||
sizeof(s_cn_data[0]) - 1;
|
||||
max_index = ARRAY_SIZE(s_cn_data) - 1;
|
||||
} else {
|
||||
cn_data = s2_cn_data;
|
||||
max_index = sizeof(s2_cn_data) /
|
||||
sizeof(s2_cn_data[0]) - 1;
|
||||
max_index = ARRAY_SIZE(s2_cn_data) - 1;
|
||||
}
|
||||
if (value >= cn_data[min_index].value) {
|
||||
res = cn_data[min_index].cnr_x1000;
|
||||
|
@ -3340,13 +3341,17 @@ static int cxd2841er_set_frontend_s(struct dvb_frontend *fe)
|
|||
|
||||
cxd2841er_tune_done(priv);
|
||||
timeout = ((3000000 + (symbol_rate - 1)) / symbol_rate) + 150;
|
||||
for (i = 0; i < timeout / CXD2841ER_DVBS_POLLING_INVL; i++) {
|
||||
|
||||
i = 0;
|
||||
do {
|
||||
usleep_range(CXD2841ER_DVBS_POLLING_INVL*1000,
|
||||
(CXD2841ER_DVBS_POLLING_INVL + 2) * 1000);
|
||||
cxd2841er_read_status_s(fe, &status);
|
||||
if (status & FE_HAS_LOCK)
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
} while (i < timeout / CXD2841ER_DVBS_POLLING_INVL);
|
||||
|
||||
if (status & FE_HAS_LOCK) {
|
||||
if (cxd2841er_get_carrier_offset_s_s2(
|
||||
priv, &carr_offset)) {
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue