mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-15 09:55:36 +00:00
media updates for v5.5-rc1
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE+QmuaPwR3wnBdVwACF8+vY7k4RUFAl3dKsYACgkQCF8+vY7k 4RWmzBAAnIL1V0Jb6vJo9AJUmntDiO/3lVGjz+6bzvlhsjbPD0/6r1AY2ZRZxO97 U3TTnB9m1nRjtJaaZ5Lmx9kc9suB8u1s9HziTcKIQ971goSZapmrx3IKPK64jt5D Uw6nzfinvAgRw0Rt0t6yd+yciw5bsqmGR5iIz/A29BXHnVu5P2TcGE8IM/oloxqV ZQkff30jieSM3CXq9hQSoekJkipyCXN3xbKncVVHc4TEonvXSCcAQxC6tRulKpi/ Y/MOxB3v7Vh3snVe5lI3fBYPr8Iw8xpBTMXg7s5e4Sb9aCeZioF0cb2nLJFG8tw8 2TviW1Fktt/N1nwZreRgVMkl19fGm3IdVd+1ukWgXS4EvV3FFsx3FZMFgAebhvKZ 1SHxhGyC5yc5yDl8f9/yo/cyKRzeDj7h6SSD2TUKRmnKXWBin9cNr3CPNJDvTk6Q rgb2B/Sbs00fZFihRdkt8n6SmHpARS4QBZiAKpHECZhmBKNqFLg050v0uzB1Z7D8 r7gK8NIWQORnmLWmHCa/kCAB8syUm8cW6LibWAvCbfN0FEaYdujFtvC+v0BQSTVJ f9BNFwUs3mCJ6x30F2DN60f2z3G1ehuNPMxFBFJpa9sLgh2wEPVaqEakGWE2iMUP Rv/cz0CJQweJutdhIAHtk3nVOQZeiAcqZMeHYemX9lL62Mjprmo= =VN90 -----END PGP SIGNATURE----- Merge tag 'media/v5.5-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media Pull media updates from Mauro Carvalho Chehab: - uAPI documentation for stateless decoders - Added a new CEC ioctl together with its documentation - Improved IPU3 documentation - New i2c drivers: hi556 and imx290 - Added support on Vivid driver for meta streams - Added de-interlace support for sunxi subdriver - Added a few new remote controler keymaps - Added H.265 support for Sunxi Cedrus driver - Another round of random driver cleanups, fixes and improvements * tag 'media/v5.5-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (361 commits) media: Revert "media: mtk-vcodec: Remove extra area allocation in an input buffer on encoding" media: hantro: Set H264 FIELDPIC_FLAG_E flag correctly media: hantro: Remove now unused H264 pic_size media: hantro: Use output buffer width and height for H264 decoding media: hantro: Reduce H264 extra space for motion vectors media: hantro: Fix H264 motion vector buffer offset media: ti-vpe: vpe: fix compatible to match bindings media: dt-bindings: media: ti-vpe: Document VPE driver media: zr364xx: remove redundant assigmnent to idx, clean up code media: Documentation: media: *_DEFAULT targets for subdevs media: hantro: Fix s_fmt for dynamic resolution changes media: i2c: Use the correct style for SPDX License Identifier media: siano: Use the correct style for SPDX License Identifier media: vicodec: media_device_cleanup was called too early media: vim2m: media_device_cleanup was called too early media: cedrus: Increase maximum supported size media: cedrus: Fix H264 4k support media: cedrus: Properly signal size in mode register media: v4l2-ctrl: Lock main_hdl on operations of requests_queued. media: si470x-i2c: add missed operations in remove ...
This commit is contained in:
commit
89d57dddd7
@ -0,0 +1,76 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/media/allwinner,sun8i-h3-deinterlace.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Allwinner H3 Deinterlace Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
- Chen-Yu Tsai <wens@csie.org>
|
||||
- Maxime Ripard <mripard@kernel.org>
|
||||
|
||||
description: |-
|
||||
The Allwinner H3 and later has a deinterlace core used for
|
||||
deinterlacing interlaced video content.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: allwinner,sun8i-h3-deinterlace
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: Deinterlace interface clock
|
||||
- description: Deinterlace module clock
|
||||
- description: Deinterlace DRAM clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: bus
|
||||
- const: mod
|
||||
- const: ram
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
interconnects:
|
||||
maxItems: 1
|
||||
|
||||
interconnect-names:
|
||||
const: dma-mem
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clocks
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/sun8i-h3-ccu.h>
|
||||
#include <dt-bindings/reset/sun8i-h3-ccu.h>
|
||||
|
||||
deinterlace: deinterlace@1400000 {
|
||||
compatible = "allwinner,sun8i-h3-deinterlace";
|
||||
reg = <0x01400000 0x20000>;
|
||||
clocks = <&ccu CLK_BUS_DEINTERLACE>,
|
||||
<&ccu CLK_DEINTERLACE>,
|
||||
<&ccu CLK_DRAM_DEINTERLACE>;
|
||||
clock-names = "bus", "mod", "ram";
|
||||
resets = <&ccu RST_BUS_DEINTERLACE>;
|
||||
interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interconnects = <&mbus 9>;
|
||||
interconnect-names = "dma-mem";
|
||||
};
|
||||
|
||||
...
|
@ -2,12 +2,20 @@
|
||||
|
||||
Required Properties:
|
||||
|
||||
- compatible: Must contain "adi,ad5820"
|
||||
- compatible: Must contain one of:
|
||||
- "adi,ad5820"
|
||||
- "adi,ad5821"
|
||||
- "adi,ad5823"
|
||||
|
||||
- reg: I2C slave address
|
||||
|
||||
- VANA-supply: supply of voltage for VANA pin
|
||||
|
||||
Optional properties:
|
||||
|
||||
- enable-gpios : GPIO spec for the XSHUTDOWN pin. The XSHUTDOWN signal is
|
||||
active low, a high level on the pin enables the device.
|
||||
|
||||
Example:
|
||||
|
||||
ad5820: coil@c {
|
||||
@ -15,5 +23,6 @@ Example:
|
||||
reg = <0x0c>;
|
||||
|
||||
VANA-supply = <&vaux4>;
|
||||
enable-gpios = <&msmgpio 26 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
|
57
Documentation/devicetree/bindings/media/i2c/imx290.txt
Normal file
57
Documentation/devicetree/bindings/media/i2c/imx290.txt
Normal file
@ -0,0 +1,57 @@
|
||||
* Sony IMX290 1/2.8-Inch CMOS Image Sensor
|
||||
|
||||
The Sony IMX290 is a 1/2.8-Inch CMOS Solid-state image sensor with
|
||||
Square Pixel for Color Cameras. It is programmable through I2C and 4-wire
|
||||
interfaces. The sensor output is available via CMOS logic parallel SDR output,
|
||||
Low voltage LVDS DDR output and CSI-2 serial data output. The CSI-2 bus is the
|
||||
default. No bindings have been defined for the other busses.
|
||||
|
||||
Required Properties:
|
||||
- compatible: Should be "sony,imx290"
|
||||
- reg: I2C bus address of the device
|
||||
- clocks: Reference to the xclk clock.
|
||||
- clock-names: Should be "xclk".
|
||||
- clock-frequency: Frequency of the xclk clock in Hz.
|
||||
- vdddo-supply: Sensor digital IO regulator.
|
||||
- vdda-supply: Sensor analog regulator.
|
||||
- vddd-supply: Sensor digital core regulator.
|
||||
|
||||
Optional Properties:
|
||||
- reset-gpios: Sensor reset GPIO
|
||||
|
||||
The imx290 device node should contain one 'port' child node with
|
||||
an 'endpoint' subnode. For further reading on port node refer to
|
||||
Documentation/devicetree/bindings/media/video-interfaces.txt.
|
||||
|
||||
Required Properties on endpoint:
|
||||
- data-lanes: check ../video-interfaces.txt
|
||||
- link-frequencies: check ../video-interfaces.txt
|
||||
- remote-endpoint: check ../video-interfaces.txt
|
||||
|
||||
Example:
|
||||
&i2c1 {
|
||||
...
|
||||
imx290: camera-sensor@1a {
|
||||
compatible = "sony,imx290";
|
||||
reg = <0x1a>;
|
||||
|
||||
reset-gpios = <&msmgpio 35 GPIO_ACTIVE_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&camera_rear_default>;
|
||||
|
||||
clocks = <&gcc GCC_CAMSS_MCLK0_CLK>;
|
||||
clock-names = "xclk";
|
||||
clock-frequency = <37125000>;
|
||||
|
||||
vdddo-supply = <&camera_vdddo_1v8>;
|
||||
vdda-supply = <&camera_vdda_2v8>;
|
||||
vddd-supply = <&camera_vddd_1v5>;
|
||||
|
||||
port {
|
||||
imx290_ep: endpoint {
|
||||
data-lanes = <1 2 3 4>;
|
||||
link-frequencies = /bits/ 64 <445500000>;
|
||||
remote-endpoint = <&csiphy0_ep>;
|
||||
};
|
||||
};
|
||||
};
|
@ -27,8 +27,6 @@ Mandatory properties
|
||||
Optional properties
|
||||
-------------------
|
||||
|
||||
- nokia,nvm-size: The size of the NVM, in bytes. If the size is not given,
|
||||
the NVM contents will not be read.
|
||||
- reset-gpios: XSHUTDOWN GPIO
|
||||
- flash-leds: See ../video-interfaces.txt
|
||||
- lens-focus: See ../video-interfaces.txt
|
||||
|
@ -12,6 +12,12 @@ Required Properties:
|
||||
- clock-names: should be "xvclk".
|
||||
- link-frequencies: target pixel clock frequency.
|
||||
|
||||
Optional Properties:
|
||||
- powerdown-gpios: reference to the GPIO connected to the pwdn pin, if any.
|
||||
Active high with internal pull down resistor.
|
||||
- reset-gpios: reference to the GPIO connected to the resetb pin, if any.
|
||||
Active low with internal pull up resistor.
|
||||
|
||||
For further reading on port node refer to
|
||||
Documentation/devicetree/bindings/media/video-interfaces.txt.
|
||||
|
||||
@ -27,6 +33,9 @@ Example:
|
||||
clocks = <&clk_ov2659 0>;
|
||||
clock-names = "xvclk";
|
||||
|
||||
powerdown-gpios = <&gpio6 14 GPIO_ACTIVE_HIGH>;
|
||||
reset-gpios = <&gpio6 15 GPIO_ACTIVE_LOW>;
|
||||
|
||||
port {
|
||||
ov2659_0: endpoint {
|
||||
remote-endpoint = <&vpfe_ep>;
|
||||
|
@ -39,6 +39,7 @@ properties:
|
||||
- rc-avermedia-rm-ks
|
||||
- rc-avertv-303
|
||||
- rc-azurewave-ad-tu700
|
||||
- rc-beelink-gs1
|
||||
- rc-behold
|
||||
- rc-behold-columbus
|
||||
- rc-budget-ci-old
|
||||
|
@ -9,6 +9,7 @@ Mandatory properties
|
||||
--------------------
|
||||
- compatible: Must be one or more of the following
|
||||
- "renesas,r8a774a1-csi2" for the R8A774A1 device.
|
||||
- "renesas,r8a774b1-csi2" for the R8A774B1 device.
|
||||
- "renesas,r8a774c0-csi2" for the R8A774C0 device.
|
||||
- "renesas,r8a7795-csi2" for the R8A7795 device.
|
||||
- "renesas,r8a7796-csi2" for the R8A7796 device.
|
||||
|
@ -14,6 +14,7 @@ on Gen3 and RZ/G2 platforms to a CSI-2 receiver.
|
||||
- "renesas,vin-r8a7744" for the R8A7744 device
|
||||
- "renesas,vin-r8a7745" for the R8A7745 device
|
||||
- "renesas,vin-r8a774a1" for the R8A774A1 device
|
||||
- "renesas,vin-r8a774b1" for the R8A774B1 device
|
||||
- "renesas,vin-r8a774c0" for the R8A774C0 device
|
||||
- "renesas,vin-r8a7778" for the R8A7778 device
|
||||
- "renesas,vin-r8a7779" for the R8A7779 device
|
||||
@ -43,7 +44,7 @@ on Gen3 and RZ/G2 platforms to a CSI-2 receiver.
|
||||
Additionally, an alias named vinX will need to be created to specify
|
||||
which video input device this is.
|
||||
|
||||
The per-board settings Gen2 platforms:
|
||||
The per-board settings for Gen2 and RZ/G1 platforms:
|
||||
|
||||
- port - sub-node describing a single endpoint connected to the VIN
|
||||
from external SoC pins as described in video-interfaces.txt[1].
|
||||
@ -63,7 +64,7 @@ The per-board settings Gen2 platforms:
|
||||
- data-enable-active: polarity of CLKENB signal, see [1] for
|
||||
description. Default is active high.
|
||||
|
||||
The per-board settings Gen3 and RZ/G2 platforms:
|
||||
The per-board settings for Gen3 and RZ/G2 platforms:
|
||||
|
||||
Gen3 and RZ/G2 platforms can support both a single connected parallel input
|
||||
source from external SoC pins (port@0) and/or multiple parallel input sources
|
||||
|
@ -1,17 +0,0 @@
|
||||
Bindings, specific for the sh_mobile_ceu_camera.c driver:
|
||||
- compatible: Should be "renesas,sh-mobile-ceu"
|
||||
- reg: register base and size
|
||||
- interrupts: the interrupt number
|
||||
- renesas,max-width: maximum image width, supported on this SoC
|
||||
- renesas,max-height: maximum image height, supported on this SoC
|
||||
|
||||
Example:
|
||||
|
||||
ceu0: ceu@fe910000 {
|
||||
compatible = "renesas,sh-mobile-ceu";
|
||||
reg = <0xfe910000 0xa0>;
|
||||
interrupt-parent = <&intcs>;
|
||||
interrupts = <0x880>;
|
||||
renesas,max-width = <8188>;
|
||||
renesas,max-height = <8188>;
|
||||
};
|
64
Documentation/devicetree/bindings/media/ti,vpe.yaml
Normal file
64
Documentation/devicetree/bindings/media/ti,vpe.yaml
Normal file
@ -0,0 +1,64 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/media/ti,vpe.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Texas Instruments DRA7x Video Processing Engine (VPE) Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Benoit Parrot <bparrot@ti.com>
|
||||
|
||||
description: |-
|
||||
The Video Processing Engine (VPE) is a key component for image post
|
||||
processing applications. VPE consist of a single memory to memory
|
||||
path which can perform chroma up/down sampling, deinterlacing,
|
||||
scaling and color space conversion.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: ti,dra7-vpe
|
||||
|
||||
reg:
|
||||
items:
|
||||
- description: The VPE main register region
|
||||
- description: Scaler (SC) register region
|
||||
- description: Color Space Conversion (CSC) register region
|
||||
- description: Video Port Direct Memory Access (VPDMA) register region
|
||||
|
||||
reg-names:
|
||||
items:
|
||||
- const: vpe_top
|
||||
- const: sc
|
||||
- const: csc
|
||||
- const: vpdma
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- reg-names
|
||||
- interrupts
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
vpe: vpe@489d0000 {
|
||||
compatible = "ti,dra7-vpe";
|
||||
reg = <0x489d0000 0x120>,
|
||||
<0x489d0700 0x80>,
|
||||
<0x489d5700 0x18>,
|
||||
<0x489dd000 0x400>;
|
||||
reg-names = "vpe_top",
|
||||
"sc",
|
||||
"csc",
|
||||
"vpdma";
|
||||
interrupts = <GIC_SPI 354 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
...
|
@ -335,6 +335,95 @@ ignore define CEC_OP_MENU_STATE_DEACTIVATED
|
||||
|
||||
ignore define CEC_MSG_USER_CONTROL_PRESSED
|
||||
|
||||
ignore define CEC_OP_UI_CMD_SELECT
|
||||
ignore define CEC_OP_UI_CMD_UP
|
||||
ignore define CEC_OP_UI_CMD_DOWN
|
||||
ignore define CEC_OP_UI_CMD_LEFT
|
||||
ignore define CEC_OP_UI_CMD_RIGHT
|
||||
ignore define CEC_OP_UI_CMD_RIGHT_UP
|
||||
ignore define CEC_OP_UI_CMD_RIGHT_DOWN
|
||||
ignore define CEC_OP_UI_CMD_LEFT_UP
|
||||
ignore define CEC_OP_UI_CMD_LEFT_DOWN
|
||||
ignore define CEC_OP_UI_CMD_DEVICE_ROOT_MENU
|
||||
ignore define CEC_OP_UI_CMD_DEVICE_SETUP_MENU
|
||||
ignore define CEC_OP_UI_CMD_CONTENTS_MENU
|
||||
ignore define CEC_OP_UI_CMD_FAVORITE_MENU
|
||||
ignore define CEC_OP_UI_CMD_BACK
|
||||
ignore define CEC_OP_UI_CMD_MEDIA_TOP_MENU
|
||||
ignore define CEC_OP_UI_CMD_MEDIA_CONTEXT_SENSITIVE_MENU
|
||||
ignore define CEC_OP_UI_CMD_NUMBER_ENTRY_MODE
|
||||
ignore define CEC_OP_UI_CMD_NUMBER_11
|
||||
ignore define CEC_OP_UI_CMD_NUMBER_12
|
||||
ignore define CEC_OP_UI_CMD_NUMBER_0_OR_NUMBER_10
|
||||
ignore define CEC_OP_UI_CMD_NUMBER_1
|
||||
ignore define CEC_OP_UI_CMD_NUMBER_2
|
||||
ignore define CEC_OP_UI_CMD_NUMBER_3
|
||||
ignore define CEC_OP_UI_CMD_NUMBER_4
|
||||
ignore define CEC_OP_UI_CMD_NUMBER_5
|
||||
ignore define CEC_OP_UI_CMD_NUMBER_6
|
||||
ignore define CEC_OP_UI_CMD_NUMBER_7
|
||||
ignore define CEC_OP_UI_CMD_NUMBER_8
|
||||
ignore define CEC_OP_UI_CMD_NUMBER_9
|
||||
ignore define CEC_OP_UI_CMD_DOT
|
||||
ignore define CEC_OP_UI_CMD_ENTER
|
||||
ignore define CEC_OP_UI_CMD_CLEAR
|
||||
ignore define CEC_OP_UI_CMD_NEXT_FAVORITE
|
||||
ignore define CEC_OP_UI_CMD_CHANNEL_UP
|
||||
ignore define CEC_OP_UI_CMD_CHANNEL_DOWN
|
||||
ignore define CEC_OP_UI_CMD_PREVIOUS_CHANNEL
|
||||
ignore define CEC_OP_UI_CMD_SOUND_SELECT
|
||||
ignore define CEC_OP_UI_CMD_INPUT_SELECT
|
||||
ignore define CEC_OP_UI_CMD_DISPLAY_INFORMATION
|
||||
ignore define CEC_OP_UI_CMD_HELP
|
||||
ignore define CEC_OP_UI_CMD_PAGE_UP
|
||||
ignore define CEC_OP_UI_CMD_PAGE_DOWN
|
||||
ignore define CEC_OP_UI_CMD_POWER
|
||||
ignore define CEC_OP_UI_CMD_VOLUME_UP
|
||||
ignore define CEC_OP_UI_CMD_VOLUME_DOWN
|
||||
ignore define CEC_OP_UI_CMD_MUTE
|
||||
ignore define CEC_OP_UI_CMD_PLAY
|
||||
ignore define CEC_OP_UI_CMD_STOP
|
||||
ignore define CEC_OP_UI_CMD_PAUSE
|
||||
ignore define CEC_OP_UI_CMD_RECORD
|
||||
ignore define CEC_OP_UI_CMD_REWIND
|
||||
ignore define CEC_OP_UI_CMD_FAST_FORWARD
|
||||
ignore define CEC_OP_UI_CMD_EJECT
|
||||
ignore define CEC_OP_UI_CMD_SKIP_FORWARD
|
||||
ignore define CEC_OP_UI_CMD_SKIP_BACKWARD
|
||||
ignore define CEC_OP_UI_CMD_STOP_RECORD
|
||||
ignore define CEC_OP_UI_CMD_PAUSE_RECORD
|
||||
ignore define CEC_OP_UI_CMD_ANGLE
|
||||
ignore define CEC_OP_UI_CMD_SUB_PICTURE
|
||||
ignore define CEC_OP_UI_CMD_VIDEO_ON_DEMAND
|
||||
ignore define CEC_OP_UI_CMD_ELECTRONIC_PROGRAM_GUIDE
|
||||
ignore define CEC_OP_UI_CMD_TIMER_PROGRAMMING
|
||||
ignore define CEC_OP_UI_CMD_INITIAL_CONFIGURATION
|
||||
ignore define CEC_OP_UI_CMD_SELECT_BROADCAST_TYPE
|
||||
ignore define CEC_OP_UI_CMD_SELECT_SOUND_PRESENTATION
|
||||
ignore define CEC_OP_UI_CMD_AUDIO_DESCRIPTION
|
||||
ignore define CEC_OP_UI_CMD_INTERNET
|
||||
ignore define CEC_OP_UI_CMD_3D_MODE
|
||||
ignore define CEC_OP_UI_CMD_PLAY_FUNCTION
|
||||
ignore define CEC_OP_UI_CMD_PAUSE_PLAY_FUNCTION
|
||||
ignore define CEC_OP_UI_CMD_RECORD_FUNCTION
|
||||
ignore define CEC_OP_UI_CMD_PAUSE_RECORD_FUNCTION
|
||||
ignore define CEC_OP_UI_CMD_STOP_FUNCTION
|
||||
ignore define CEC_OP_UI_CMD_MUTE_FUNCTION
|
||||
ignore define CEC_OP_UI_CMD_RESTORE_VOLUME_FUNCTION
|
||||
ignore define CEC_OP_UI_CMD_TUNE_FUNCTION
|
||||
ignore define CEC_OP_UI_CMD_SELECT_MEDIA_FUNCTION
|
||||
ignore define CEC_OP_UI_CMD_SELECT_AV_INPUT_FUNCTION
|
||||
ignore define CEC_OP_UI_CMD_SELECT_AUDIO_INPUT_FUNCTION
|
||||
ignore define CEC_OP_UI_CMD_POWER_TOGGLE_FUNCTION
|
||||
ignore define CEC_OP_UI_CMD_POWER_OFF_FUNCTION
|
||||
ignore define CEC_OP_UI_CMD_POWER_ON_FUNCTION
|
||||
ignore define CEC_OP_UI_CMD_F1_BLUE
|
||||
ignore define CEC_OP_UI_CMD_F2_RED
|
||||
ignore define CEC_OP_UI_CMD_F3_GREEN
|
||||
ignore define CEC_OP_UI_CMD_F4_YELLOW
|
||||
ignore define CEC_OP_UI_CMD_F5
|
||||
ignore define CEC_OP_UI_CMD_DATA
|
||||
|
||||
ignore define CEC_OP_UI_BCAST_TYPE_TOGGLE_ALL
|
||||
ignore define CEC_OP_UI_BCAST_TYPE_TOGGLE_DIG_ANA
|
||||
ignore define CEC_OP_UI_BCAST_TYPE_ANALOGUE
|
||||
|
@ -140,6 +140,15 @@ Menu controls with a driver specific menu are added by calling
|
||||
const struct v4l2_ctrl_ops *ops, u32 id, s32 max,
|
||||
s32 skip_mask, s32 def, const char * const *qmenu);
|
||||
|
||||
Standard compound controls can be added by calling
|
||||
:c:func:`v4l2_ctrl_new_std_compound`:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
struct v4l2_ctrl *v4l2_ctrl_new_std_compound(struct v4l2_ctrl_handler *hdl,
|
||||
const struct v4l2_ctrl_ops *ops, u32 id,
|
||||
const union v4l2_ctrl_ptr p_def);
|
||||
|
||||
Integer menu controls with a driver specific menu can be added by calling
|
||||
:c:func:`v4l2_ctrl_new_int_menu`:
|
||||
|
||||
|
@ -24,6 +24,7 @@ Function Reference
|
||||
cec-ioc-adap-g-caps
|
||||
cec-ioc-adap-g-log-addrs
|
||||
cec-ioc-adap-g-phys-addr
|
||||
cec-ioc-adap-g-conn-info
|
||||
cec-ioc-dqevent
|
||||
cec-ioc-g-mode
|
||||
cec-ioc-receive
|
||||
|
@ -135,8 +135,12 @@ returns the information to the application. The ioctl never fails.
|
||||
- The CEC hardware can monitor CEC pin changes from low to high voltage
|
||||
and vice versa. When in pin monitoring mode the application will
|
||||
receive ``CEC_EVENT_PIN_CEC_LOW`` and ``CEC_EVENT_PIN_CEC_HIGH`` events.
|
||||
* .. _`CEC-CAP-CONNECTOR-INFO`:
|
||||
|
||||
|
||||
- ``CEC_CAP_CONNECTOR_INFO``
|
||||
- 0x00000100
|
||||
- If this capability is set, then :ref:`CEC_ADAP_G_CONNECTOR_INFO` can
|
||||
be used.
|
||||
|
||||
Return Value
|
||||
============
|
||||
|
105
Documentation/media/uapi/cec/cec-ioc-adap-g-conn-info.rst
Normal file
105
Documentation/media/uapi/cec/cec-ioc-adap-g-conn-info.rst
Normal file
@ -0,0 +1,105 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
..
|
||||
.. Copyright 2019 Google LLC
|
||||
..
|
||||
.. _CEC_ADAP_G_CONNECTOR_INFO:
|
||||
|
||||
*******************************
|
||||
ioctl CEC_ADAP_G_CONNECTOR_INFO
|
||||
*******************************
|
||||
|
||||
Name
|
||||
====
|
||||
|
||||
CEC_ADAP_G_CONNECTOR_INFO - Query HDMI connector information
|
||||
|
||||
Synopsis
|
||||
========
|
||||
|
||||
.. c:function:: int ioctl( int fd, CEC_ADAP_G_CONNECTOR_INFO, struct cec_connector_info *argp )
|
||||
:name: CEC_ADAP_G_CONNECTOR_INFO
|
||||
|
||||
Arguments
|
||||
=========
|
||||
|
||||
``fd``
|
||||
File descriptor returned by :c:func:`open() <cec-open>`.
|
||||
|
||||
``argp``
|
||||
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
Using this ioctl an application can learn which HDMI connector this CEC
|
||||
device corresponds to. While calling this ioctl the application should
|
||||
provide a pointer to a cec_connector_info struct which will be populated
|
||||
by the kernel with the info provided by the adapter's driver. This ioctl
|
||||
is only available if the ``CEC_CAP_CONNECTOR_INFO`` capability is set.
|
||||
|
||||
.. tabularcolumns:: |p{1.0cm}|p{4.4cm}|p{2.5cm}|p{9.6cm}|
|
||||
|
||||
.. c:type:: cec_connector_info
|
||||
|
||||
.. flat-table:: struct cec_connector_info
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 1 8
|
||||
|
||||
* - __u32
|
||||
- ``type``
|
||||
- The type of connector this adapter is associated with.
|
||||
* - union
|
||||
- ``(anonymous)``
|
||||
-
|
||||
* -
|
||||
- ``struct cec_drm_connector_info``
|
||||
- drm
|
||||
- :ref:`cec-drm-connector-info`
|
||||
|
||||
|
||||
.. tabularcolumns:: |p{4.4cm}|p{2.5cm}|p{10.6cm}|
|
||||
|
||||
.. _connector-type:
|
||||
|
||||
.. flat-table:: Connector types
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 3 1 8
|
||||
|
||||
* .. _`CEC-CONNECTOR-TYPE-NO-CONNECTOR`:
|
||||
|
||||
- ``CEC_CONNECTOR_TYPE_NO_CONNECTOR``
|
||||
- 0
|
||||
- No connector is associated with the adapter/the information is not
|
||||
provided by the driver.
|
||||
* .. _`CEC-CONNECTOR-TYPE-DRM`:
|
||||
|
||||
- ``CEC_CONNECTOR_TYPE_DRM``
|
||||
- 1
|
||||
- Indicates that a DRM connector is associated with this adapter.
|
||||
Information about the connector can be found in
|
||||
:ref:`cec-drm-connector-info`.
|
||||
|
||||
.. tabularcolumns:: |p{4.4cm}|p{2.5cm}|p{10.6cm}|
|
||||
|
||||
.. c:type:: cec_drm_connector_info
|
||||
|
||||
.. _cec-drm-connector-info:
|
||||
|
||||
.. flat-table:: struct cec_drm_connector_info
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 3 1 8
|
||||
|
||||
* .. _`CEC-DRM-CONNECTOR-TYPE-CARD-NO`:
|
||||
|
||||
- __u32
|
||||
- ``card_no``
|
||||
- DRM card number: the number from a card's path, e.g. 0 in case of
|
||||
/dev/card0.
|
||||
* .. _`CEC-DRM-CONNECTOR-TYPE-CONNECTOR_ID`:
|
||||
|
||||
- __u32
|
||||
- ``connector_id``
|
||||
- DRM connector ID.
|
@ -70,6 +70,14 @@ it is guaranteed that the state did change in between the two events.
|
||||
addresses are claimed or if ``phys_addr`` is ``CEC_PHYS_ADDR_INVALID``.
|
||||
If bit 15 is set (``1 << CEC_LOG_ADDR_UNREGISTERED``) then this device
|
||||
has the unregistered logical address. In that case all other bits are 0.
|
||||
* - __u16
|
||||
- ``have_conn_info``
|
||||
- If non-zero, then HDMI connector information is available.
|
||||
This field is only valid if ``CEC_CAP_CONNECTOR_INFO`` is set. If that
|
||||
capability is set and ``have_conn_info`` is zero, then that indicates
|
||||
that the HDMI connector device is not instantiated, either because
|
||||
the HDMI driver is still configuring the device or because the HDMI
|
||||
device was unbound.
|
||||
|
||||
|
||||
.. c:type:: cec_event_lost_msgs
|
||||
|
@ -53,8 +53,8 @@ with different configurations in advance, knowing that the configuration will be
|
||||
applied when needed to get the expected result. Configuration values at the time
|
||||
of request completion are also available for reading.
|
||||
|
||||
Usage
|
||||
=====
|
||||
General Usage
|
||||
-------------
|
||||
|
||||
The Request API extends the Media Controller API and cooperates with
|
||||
subsystem-specific APIs to support request usage. At the Media Controller
|
||||
|
@ -131,6 +131,15 @@ ITU-T Rec. H.264 Specification (04/2017 Edition)
|
||||
|
||||
:author: International Telecommunication Union (http://www.itu.ch)
|
||||
|
||||
.. _hevc:
|
||||
|
||||
ITU H.265/HEVC
|
||||
==============
|
||||
|
||||
:title: ITU-T Rec. H.265 | ISO/IEC 23008-2 "High Efficiency Video Coding"
|
||||
|
||||
:author: International Telecommunication Union (http://www.itu.ch), International Organisation for Standardisation (http://www.iso.ch)
|
||||
|
||||
.. _jfif:
|
||||
|
||||
JFIF
|
||||
|
@ -607,6 +607,19 @@ Buffer Flags
|
||||
applications shall use this flag for output buffers if the data in
|
||||
this buffer has not been created by the CPU but by some
|
||||
DMA-capable unit, in which case caches have not been used.
|
||||
* .. _`V4L2-BUF-FLAG-M2M-HOLD-CAPTURE-BUF`:
|
||||
|
||||
- ``V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF``
|
||||
- 0x00000200
|
||||
- Only valid if ``V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF`` is
|
||||
set. It is typically used with stateless decoders where multiple
|
||||
output buffers each decode to a slice of the decoded frame.
|
||||
Applications can set this flag when queueing the output buffer
|
||||
to prevent the driver from dequeueing the capture buffer after
|
||||
the output buffer has been decoded (i.e. the capture buffer is
|
||||
'held'). If the timestamp of this output buffer differs from that
|
||||
of the previous output buffer, then that indicates the start of a
|
||||
new frame and the previously held capture buffer is dequeued.
|
||||
* .. _`V4L2-BUF-FLAG-LAST`:
|
||||
|
||||
- ``V4L2_BUF_FLAG_LAST``
|
||||
|
@ -46,3 +46,4 @@ devices are given in the following sections.
|
||||
:maxdepth: 1
|
||||
|
||||
dev-decoder
|
||||
dev-stateless-decoder
|
||||
|
424
Documentation/media/uapi/v4l/dev-stateless-decoder.rst
Normal file
424
Documentation/media/uapi/v4l/dev-stateless-decoder.rst
Normal file
@ -0,0 +1,424 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
.. _stateless_decoder:
|
||||
|
||||
**************************************************
|
||||
Memory-to-memory Stateless Video Decoder Interface
|
||||
**************************************************
|
||||
|
||||
A stateless decoder is a decoder that works without retaining any kind of state
|
||||
between processed frames. This means that each frame is decoded independently
|
||||
of any previous and future frames, and that the client is responsible for
|
||||
maintaining the decoding state and providing it to the decoder with each
|
||||
decoding request. This is in contrast to the stateful video decoder interface,
|
||||
where the hardware and driver maintain the decoding state and all the client
|
||||
has to do is to provide the raw encoded stream and dequeue decoded frames in
|
||||
display order.
|
||||
|
||||
This section describes how user-space ("the client") is expected to communicate
|
||||
with stateless decoders in order to successfully decode an encoded stream.
|
||||
Compared to stateful codecs, the decoder/client sequence is simpler, but the
|
||||
cost of this simplicity is extra complexity in the client which is responsible
|
||||
for maintaining a consistent decoding state.
|
||||
|
||||
Stateless decoders make use of the :ref:`media-request-api`. A stateless
|
||||
decoder must expose the ``V4L2_BUF_CAP_SUPPORTS_REQUESTS`` capability on its
|
||||
``OUTPUT`` queue when :c:func:`VIDIOC_REQBUFS` or :c:func:`VIDIOC_CREATE_BUFS`
|
||||
are invoked.
|
||||
|
||||
Depending on the encoded formats supported by the decoder, a single decoded
|
||||
frame may be the result of several decode requests (for instance, H.264 streams
|
||||
with multiple slices per frame). Decoders that support such formats must also
|
||||
expose the ``V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF`` capability on their
|
||||
``OUTPUT`` queue.
|
||||
|
||||
Querying capabilities
|
||||
=====================
|
||||
|
||||
1. To enumerate the set of coded formats supported by the decoder, the client
|
||||
calls :c:func:`VIDIOC_ENUM_FMT` on the ``OUTPUT`` queue.
|
||||
|
||||
* The driver must always return the full set of supported ``OUTPUT`` formats,
|
||||
irrespective of the format currently set on the ``CAPTURE`` queue.
|
||||
|
||||
* Simultaneously, the driver must restrain the set of values returned by
|
||||
codec-specific capability controls (such as H.264 profiles) to the set
|
||||
actually supported by the hardware.
|
||||
|
||||
2. To enumerate the set of supported raw formats, the client calls
|
||||
:c:func:`VIDIOC_ENUM_FMT` on the ``CAPTURE`` queue.
|
||||
|
||||
* The driver must return only the formats supported for the format currently
|
||||
active on the ``OUTPUT`` queue.
|
||||
|
||||
* Depending on the currently set ``OUTPUT`` format, the set of supported raw
|
||||
formats may depend on the value of some codec-dependent controls.
|
||||
The client is responsible for making sure that these controls are set
|
||||
before querying the ``CAPTURE`` queue. Failure to do so will result in the
|
||||
default values for these controls being used, and a returned set of formats
|
||||
that may not be usable for the media the client is trying to decode.
|
||||
|
||||
3. The client may use :c:func:`VIDIOC_ENUM_FRAMESIZES` to detect supported
|
||||
resolutions for a given format, passing desired pixel format in
|
||||
:c:type:`v4l2_frmsizeenum`'s ``pixel_format``.
|
||||
|
||||
4. Supported profiles and levels for the current ``OUTPUT`` format, if
|
||||
applicable, may be queried using their respective controls via
|
||||
:c:func:`VIDIOC_QUERYCTRL`.
|
||||
|
||||
Initialization
|
||||
==============
|
||||
|
||||
1. Set the coded format on the ``OUTPUT`` queue via :c:func:`VIDIOC_S_FMT`.
|
||||
|
||||
* **Required fields:**
|
||||
|
||||
``type``
|
||||
a ``V4L2_BUF_TYPE_*`` enum appropriate for ``OUTPUT``.
|
||||
|
||||
``pixelformat``
|
||||
a coded pixel format.
|
||||
|
||||
``width``, ``height``
|
||||
coded width and height parsed from the stream.
|
||||
|
||||
other fields
|
||||
follow standard semantics.
|
||||
|
||||
.. note::
|
||||
|
||||
Changing the ``OUTPUT`` format may change the currently set ``CAPTURE``
|
||||
format. The driver will derive a new ``CAPTURE`` format from the
|
||||
``OUTPUT`` format being set, including resolution, colorimetry
|
||||
parameters, etc. If the client needs a specific ``CAPTURE`` format,
|
||||
it must adjust it afterwards.
|
||||
|
||||
2. Call :c:func:`VIDIOC_S_EXT_CTRLS` to set all the controls (parsed headers,
|
||||
etc.) required by the ``OUTPUT`` format to enumerate the ``CAPTURE`` formats.
|
||||
|
||||
3. Call :c:func:`VIDIOC_G_FMT` for ``CAPTURE`` queue to get the format for the
|
||||
destination buffers parsed/decoded from the bytestream.
|
||||
|
||||
* **Required fields:**
|
||||
|
||||
``type``
|
||||
a ``V4L2_BUF_TYPE_*`` enum appropriate for ``CAPTURE``.
|
||||
|
||||
* **Returned fields:**
|
||||
|
||||
``width``, ``height``
|
||||
frame buffer resolution for the decoded frames.
|
||||
|
||||
``pixelformat``
|
||||
pixel format for decoded frames.
|
||||
|
||||
``num_planes`` (for _MPLANE ``type`` only)
|
||||
number of planes for pixelformat.
|
||||
|
||||
``sizeimage``, ``bytesperline``
|
||||
as per standard semantics; matching frame buffer format.
|
||||
|
||||
.. note::
|
||||
|
||||
The value of ``pixelformat`` may be any pixel format supported for the
|
||||
``OUTPUT`` format, based on the hardware capabilities. It is suggested
|
||||
that the driver chooses the preferred/optimal format for the current
|
||||
configuration. For example, a YUV format may be preferred over an RGB
|
||||
format, if an additional conversion step would be required for RGB.
|
||||
|
||||
4. *[optional]* Enumerate ``CAPTURE`` formats via :c:func:`VIDIOC_ENUM_FMT` on
|
||||
the ``CAPTURE`` queue. The client may use this ioctl to discover which
|
||||
alternative raw formats are supported for the current ``OUTPUT`` format and
|
||||
select one of them via :c:func:`VIDIOC_S_FMT`.
|
||||
|
||||
.. note::
|
||||
|
||||
The driver will return only formats supported for the currently selected
|
||||
``OUTPUT`` format and currently set controls, even if more formats may be
|
||||
supported by the decoder in general.
|
||||
|
||||
For example, a decoder may support YUV and RGB formats for
|
||||
resolutions 1920x1088 and lower, but only YUV for higher resolutions (due
|
||||
to hardware limitations). After setting a resolution of 1920x1088 or lower
|
||||
as the ``OUTPUT`` format, :c:func:`VIDIOC_ENUM_FMT` may return a set of
|
||||
YUV and RGB pixel formats, but after setting a resolution higher than
|
||||
1920x1088, the driver will not return RGB pixel formats, since they are
|
||||
unsupported for this resolution.
|
||||
|
||||
5. *[optional]* Choose a different ``CAPTURE`` format than suggested via
|
||||
:c:func:`VIDIOC_S_FMT` on ``CAPTURE`` queue. It is possible for the client to
|
||||
choose a different format than selected/suggested by the driver in
|
||||
:c:func:`VIDIOC_G_FMT`.
|
||||
|
||||
* **Required fields:**
|
||||
|
||||
``type``
|
||||
a ``V4L2_BUF_TYPE_*`` enum appropriate for ``CAPTURE``.
|
||||
|
||||
``pixelformat``
|
||||
a raw pixel format.
|
||||
|
||||
``width``, ``height``
|
||||
frame buffer resolution of the decoded stream; typically unchanged from
|
||||
what was returned with :c:func:`VIDIOC_G_FMT`, but it may be different
|
||||
if the hardware supports composition and/or scaling.
|
||||
|
||||
After performing this step, the client must perform step 3 again in order
|
||||
to obtain up-to-date information about the buffers size and layout.
|
||||
|
||||
6. Allocate source (bytestream) buffers via :c:func:`VIDIOC_REQBUFS` on
|
||||
``OUTPUT`` queue.
|
||||
|
||||
* **Required fields:**
|
||||
|
||||
``count``
|
||||
requested number of buffers to allocate; greater than zero.
|
||||
|
||||
``type``
|
||||
a ``V4L2_BUF_TYPE_*`` enum appropriate for ``OUTPUT``.
|
||||
|
||||
``memory``
|
||||
follows standard semantics.
|
||||
|
||||
* **Return fields:**
|
||||
|
||||
``count``
|
||||
actual number of buffers allocated.
|
||||
|
||||
* If required, the driver will adjust ``count`` to be equal or bigger to the
|
||||
minimum of required number of ``OUTPUT`` buffers for the given format and
|
||||
requested count. The client must check this value after the ioctl returns
|
||||
to get the actual number of buffers allocated.
|
||||
|
||||
7. Allocate destination (raw format) buffers via :c:func:`VIDIOC_REQBUFS` on the
|
||||
``CAPTURE`` queue.
|
||||
|
||||
* **Required fields:**
|
||||
|
||||
``count``
|
||||
requested number of buffers to allocate; greater than zero. The client
|
||||
is responsible for deducing the minimum number of buffers required
|
||||
for the stream to be properly decoded (taking e.g. reference frames
|
||||
into account) and pass an equal or bigger number.
|
||||
|
||||
``type``
|
||||
a ``V4L2_BUF_TYPE_*`` enum appropriate for ``CAPTURE``.
|
||||
|
||||
``memory``
|
||||
follows standard semantics. ``V4L2_MEMORY_USERPTR`` is not supported
|
||||
for ``CAPTURE`` buffers.
|
||||
|
||||
* **Return fields:**
|
||||
|
||||
``count``
|
||||
adjusted to allocated number of buffers, in case the codec requires
|
||||
more buffers than requested.
|
||||
|
||||
* The driver must adjust count to the minimum of required number of
|
||||
``CAPTURE`` buffers for the current format, stream configuration and
|
||||
requested count. The client must check this value after the ioctl
|
||||
returns to get the number of buffers allocated.
|
||||
|
||||
8. Allocate requests (likely one per ``OUTPUT`` buffer) via
|
||||
:c:func:`MEDIA_IOC_REQUEST_ALLOC` on the media device.
|
||||
|
||||
9. Start streaming on both ``OUTPUT`` and ``CAPTURE`` queues via
|
||||
:c:func:`VIDIOC_STREAMON`.
|
||||
|
||||
Decoding
|
||||
========
|
||||
|
||||
For each frame, the client is responsible for submitting at least one request to
|
||||
which the following is attached:
|
||||
|
||||
* The amount of encoded data expected by the codec for its current
|
||||
configuration, as a buffer submitted to the ``OUTPUT`` queue. Typically, this
|
||||
corresponds to one frame worth of encoded data, but some formats may allow (or
|
||||
require) different amounts per unit.
|
||||
* All the metadata needed to decode the submitted encoded data, in the form of
|
||||
controls relevant to the format being decoded.
|
||||
|
||||
The amount of data and contents of the source ``OUTPUT`` buffer, as well as the
|
||||
controls that must be set on the request, depend on the active coded pixel
|
||||
format and might be affected by codec-specific extended controls, as stated in
|
||||
documentation of each format.
|
||||
|
||||
If there is a possibility that the decoded frame will require one or more
|
||||
decode requests after the current one in order to be produced, then the client
|
||||
must set the ``V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF`` flag on the ``OUTPUT``
|
||||
buffer. This will result in the (potentially partially) decoded ``CAPTURE``
|
||||
buffer not being made available for dequeueing, and reused for the next decode
|
||||
request if the timestamp of the next ``OUTPUT`` buffer has not changed.
|
||||
|
||||
A typical frame would thus be decoded using the following sequence:
|
||||
|
||||
1. Queue an ``OUTPUT`` buffer containing one unit of encoded bytestream data for
|
||||
the decoding request, using :c:func:`VIDIOC_QBUF`.
|
||||
|
||||
* **Required fields:**
|
||||
|
||||
``index``
|
||||
index of the buffer being queued.
|
||||
|
||||
``type``
|
||||
type of the buffer.
|
||||
|
||||
``bytesused``
|
||||
number of bytes taken by the encoded data frame in the buffer.
|
||||
|
||||
``flags``
|
||||
the ``V4L2_BUF_FLAG_REQUEST_FD`` flag must be set. Additionally, if
|
||||
we are not sure that the current decode request is the last one needed
|
||||
to produce a fully decoded frame, then
|
||||
``V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF`` must also be set.
|
||||
|
||||
``request_fd``
|
||||
must be set to the file descriptor of the decoding request.
|
||||
|
||||
``timestamp``
|
||||
must be set to a unique value per frame. This value will be propagated
|
||||
into the decoded frame's buffer and can also be used to use this frame
|
||||
as the reference of another. If using multiple decode requests per
|
||||
frame, then the timestamps of all the ``OUTPUT`` buffers for a given
|
||||
frame must be identical. If the timestamp changes, then the currently
|
||||
held ``CAPTURE`` buffer will be made available for dequeuing and the
|
||||
current request will work on a new ``CAPTURE`` buffer.
|
||||
|
||||
2. Set the codec-specific controls for the decoding request, using
|
||||
:c:func:`VIDIOC_S_EXT_CTRLS`.
|
||||
|
||||
* **Required fields:**
|
||||
|
||||
``which``
|
||||
must be ``V4L2_CTRL_WHICH_REQUEST_VAL``.
|
||||
|
||||
``request_fd``
|
||||
must be set to the file descriptor of the decoding request.
|
||||
|
||||
other fields
|
||||
other fields are set as usual when setting controls. The ``controls``
|
||||
array must contain all the codec-specific controls required to decode
|
||||
a frame.
|
||||
|
||||
.. note::
|
||||
|
||||
It is possible to specify the controls in different invocations of
|
||||
:c:func:`VIDIOC_S_EXT_CTRLS`, or to overwrite a previously set control, as
|
||||
long as ``request_fd`` and ``which`` are properly set. The controls state
|
||||
at the moment of request submission is the one that will be considered.
|
||||
|
||||
.. note::
|
||||
|
||||
The order in which steps 1 and 2 take place is interchangeable.
|
||||
|
||||
3. Submit the request by invoking :c:func:`MEDIA_REQUEST_IOC_QUEUE` on the
|
||||
request FD.
|
||||
|
||||
If the request is submitted without an ``OUTPUT`` buffer, or if some of the
|
||||
required controls are missing from the request, then
|
||||
:c:func:`MEDIA_REQUEST_IOC_QUEUE` will return ``-ENOENT``. If more than one
|
||||
``OUTPUT`` buffer is queued, then it will return ``-EINVAL``.
|
||||
:c:func:`MEDIA_REQUEST_IOC_QUEUE` returning non-zero means that no
|
||||
``CAPTURE`` buffer will be produced for this request.
|
||||
|
||||
``CAPTURE`` buffers must not be part of the request, and are queued
|
||||
independently. They are returned in decode order (i.e. the same order as coded
|
||||
frames were submitted to the ``OUTPUT`` queue).
|
||||
|
||||
Runtime decoding errors are signaled by the dequeued ``CAPTURE`` buffers
|
||||
carrying the ``V4L2_BUF_FLAG_ERROR`` flag. If a decoded reference frame has an
|
||||
error, then all following decoded frames that refer to it also have the
|
||||
``V4L2_BUF_FLAG_ERROR`` flag set, although the decoder will still try to
|
||||
produce (likely corrupted) frames.
|
||||
|
||||
Buffer management while decoding
|
||||
================================
|
||||
Contrary to stateful decoders, a stateless decoder does not perform any kind of
|
||||
buffer management: it only guarantees that dequeued ``CAPTURE`` buffers can be
|
||||
used by the client for as long as they are not queued again. "Used" here
|
||||
encompasses using the buffer for compositing or display.
|
||||
|
||||
A dequeued capture buffer can also be used as the reference frame of another
|
||||
buffer.
|
||||
|
||||
A frame is specified as reference by converting its timestamp into nanoseconds,
|
||||
and storing it into the relevant member of a codec-dependent control structure.
|
||||
The :c:func:`v4l2_timeval_to_ns` function must be used to perform that
|
||||
conversion. The timestamp of a frame can be used to reference it as soon as all
|
||||
its units of encoded data are successfully submitted to the ``OUTPUT`` queue.
|
||||
|
||||
A decoded buffer containing a reference frame must not be reused as a decoding
|
||||
target until all the frames referencing it have been decoded. The safest way to
|
||||
achieve this is to refrain from queueing a reference buffer until all the
|
||||
decoded frames referencing it have been dequeued. However, if the driver can
|
||||
guarantee that buffers queued to the ``CAPTURE`` queue are processed in queued
|
||||
order, then user-space can take advantage of this guarantee and queue a
|
||||
reference buffer when the following conditions are met:
|
||||
|
||||
1. All the requests for frames affected by the reference frame have been
|
||||
queued, and
|
||||
|
||||
2. A sufficient number of ``CAPTURE`` buffers to cover all the decoded
|
||||
referencing frames have been queued.
|
||||
|
||||
When queuing a decoding request, the driver will increase the reference count of
|
||||
all the resources associated with reference frames. This means that the client
|
||||
can e.g. close the DMABUF file descriptors of reference frame buffers if it
|
||||
won't need them afterwards.
|
||||
|
||||
Seeking
|
||||
=======
|
||||
In order to seek, the client just needs to submit requests using input buffers
|
||||
corresponding to the new stream position. It must however be aware that
|
||||
resolution may have changed and follow the dynamic resolution change sequence in
|
||||
that case. Also depending on the codec used, picture parameters (e.g. SPS/PPS
|
||||
for H.264) may have changed and the client is responsible for making sure that a
|
||||
valid state is sent to the decoder.
|
||||
|
||||
The client is then free to ignore any returned ``CAPTURE`` buffer that comes
|
||||
from the pre-seek position.
|
||||
|
||||
Pausing
|
||||
=======
|
||||
|
||||
In order to pause, the client can just cease queuing buffers onto the ``OUTPUT``
|
||||
queue. Without source bytestream data, there is no data to process and the codec
|
||||
will remain idle.
|
||||
|
||||
Dynamic resolution change
|
||||
=========================
|
||||
|
||||
If the client detects a resolution change in the stream, it will need to perform
|
||||
the initialization sequence again with the new resolution:
|
||||
|
||||
1. If the last submitted request resulted in a ``CAPTURE`` buffer being
|
||||
held by the use of the ``V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF`` flag, then the
|
||||
last frame is not available on the ``CAPTURE`` queue. In this case, a
|
||||
``V4L2_DEC_CMD_FLUSH`` command shall be sent. This will make the driver
|
||||
dequeue the held ``CAPTURE`` buffer.
|
||||
|
||||
2. Wait until all submitted requests have completed and dequeue the
|
||||
corresponding output buffers.
|
||||
|
||||
3. Call :c:func:`VIDIOC_STREAMOFF` on both the ``OUTPUT`` and ``CAPTURE``
|
||||
queues.
|
||||
|
||||
4. Free all ``CAPTURE`` buffers by calling :c:func:`VIDIOC_REQBUFS` on the
|
||||
``CAPTURE`` queue with a buffer count of zero.
|
||||
|
||||
5. Perform the initialization sequence again (minus the allocation of
|
||||
``OUTPUT`` buffers), with the new resolution set on the ``OUTPUT`` queue.
|
||||
Note that due to resolution constraints, a different format may need to be
|
||||
picked on the ``CAPTURE`` queue.
|
||||
|
||||
Drain
|
||||
=====
|
||||
|
||||
If the last submitted request resulted in a ``CAPTURE`` buffer being
|
||||
held by the use of the ``V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF`` flag, then the
|
||||
last frame is not available on the ``CAPTURE`` queue. In this case, a
|
||||
``V4L2_DEC_CMD_FLUSH`` command shall be sent. This will make the driver
|
||||
dequeue the held ``CAPTURE`` buffer.
|
||||
|
||||
After that, in order to drain the stream on a stateless decoder, the client
|
||||
just needs to wait until all the submitted requests are completed.
|
@ -1713,10 +1713,14 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
|
||||
|
||||
* - __u8
|
||||
- ``scaling_list_4x4[6][16]``
|
||||
-
|
||||
- Scaling matrix after applying the inverse scanning process.
|
||||
Expected list order is Intra Y, Intra Cb, Intra Cr, Inter Y,
|
||||
Inter Cb, Inter Cr.
|
||||
* - __u8
|
||||
- ``scaling_list_8x8[6][64]``
|
||||
-
|
||||
- Scaling matrix after applying the inverse scanning process.
|
||||
Expected list order is Intra Y, Inter Y, Intra Cb, Inter Cb,
|
||||
Intra Cr, Inter Cr.
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS (struct)``
|
||||
Specifies the slice parameters (as extracted from the bitstream)
|
||||
@ -1796,7 +1800,7 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
|
||||
-
|
||||
* - __u32
|
||||
- ``dec_ref_pic_marking_bit_size``
|
||||
-
|
||||
- Size in bits of the dec_ref_pic_marking() syntax element.
|
||||
* - __u32
|
||||
- ``pic_order_cnt_bit_size``
|
||||
-
|
||||
@ -1820,10 +1824,12 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
|
||||
-
|
||||
* - __u8
|
||||
- ``num_ref_idx_l0_active_minus1``
|
||||
-
|
||||
- If num_ref_idx_active_override_flag is not set, this field must be
|
||||
set to the value of num_ref_idx_l0_default_active_minus1.
|
||||
* - __u8
|
||||
- ``num_ref_idx_l1_active_minus1``
|
||||
-
|
||||
- If num_ref_idx_active_override_flag is not set, this field must be
|
||||
set to the value of num_ref_idx_l1_default_active_minus1.
|
||||
* - __u32
|
||||
- ``slice_group_change_cycle``
|
||||
-
|
||||
@ -1983,9 +1989,9 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
|
||||
- ``reference_ts``
|
||||
- Timestamp of the V4L2 capture buffer to use as reference, used
|
||||
with B-coded and P-coded frames. The timestamp refers to the
|
||||
``timestamp`` field in struct :c:type:`v4l2_buffer`. Use the
|
||||
:c:func:`v4l2_timeval_to_ns()` function to convert the struct
|
||||
:c:type:`timeval` in struct :c:type:`v4l2_buffer` to a __u64.
|
||||
``timestamp`` field in struct :c:type:`v4l2_buffer`. Use the
|
||||
:c:func:`v4l2_timeval_to_ns()` function to convert the struct
|
||||
:c:type:`timeval` in struct :c:type:`v4l2_buffer` to a __u64.
|
||||
* - __u16
|
||||
- ``frame_num``
|
||||
-
|
||||
@ -3693,3 +3699,550 @@ enum v4l2_mpeg_video_hevc_size_of_length_field -
|
||||
Indicates whether to generate SPS and PPS at every IDR. Setting it to 0
|
||||
disables generating SPS and PPS at every IDR. Setting it to one enables
|
||||
generating SPS and PPS at every IDR.
|
||||
|
||||
.. _v4l2-mpeg-hevc:
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_HEVC_SPS (struct)``
|
||||
Specifies the Sequence Parameter Set fields (as extracted from the
|
||||
bitstream) for the associated HEVC slice data.
|
||||
These bitstream parameters are defined according to :ref:`hevc`.
|
||||
They are described in section 7.4.3.2 "Sequence parameter set RBSP
|
||||
semantics" of the specification.
|
||||
|
||||
.. c:type:: v4l2_ctrl_hevc_sps
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table:: struct v4l2_ctrl_hevc_sps
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u16
|
||||
- ``pic_width_in_luma_samples``
|
||||
-
|
||||
* - __u16
|
||||
- ``pic_height_in_luma_samples``
|
||||
-
|
||||
* - __u8
|
||||
- ``bit_depth_luma_minus8``
|
||||
-
|
||||
* - __u8
|
||||
- ``bit_depth_chroma_minus8``
|
||||
-
|
||||
* - __u8
|
||||
- ``log2_max_pic_order_cnt_lsb_minus4``
|
||||
-
|
||||
* - __u8
|
||||
- ``sps_max_dec_pic_buffering_minus1``
|
||||
-
|
||||
* - __u8
|
||||
- ``sps_max_num_reorder_pics``
|
||||
-
|
||||
* - __u8
|
||||
- ``sps_max_latency_increase_plus1``
|
||||
-
|
||||
* - __u8
|
||||
- ``log2_min_luma_coding_block_size_minus3``
|
||||
-
|
||||
* - __u8
|
||||
- ``log2_diff_max_min_luma_coding_block_size``
|
||||
-
|
||||
* - __u8
|
||||
- ``log2_min_luma_transform_block_size_minus2``
|
||||
-
|
||||
* - __u8
|
||||
- ``log2_diff_max_min_luma_transform_block_size``
|
||||
-
|
||||
* - __u8
|
||||
- ``max_transform_hierarchy_depth_inter``
|
||||
-
|
||||
* - __u8
|
||||
- ``max_transform_hierarchy_depth_intra``
|
||||
-
|
||||
* - __u8
|
||||
- ``pcm_sample_bit_depth_luma_minus1``
|
||||
-
|
||||
* - __u8
|
||||
- ``pcm_sample_bit_depth_chroma_minus1``
|
||||
-
|
||||
* - __u8
|
||||
- ``log2_min_pcm_luma_coding_block_size_minus3``
|
||||
-
|
||||
* - __u8
|
||||
- ``log2_diff_max_min_pcm_luma_coding_block_size``
|
||||
-
|
||||
* - __u8
|
||||
- ``num_short_term_ref_pic_sets``
|
||||
-
|
||||
* - __u8
|
||||
- ``num_long_term_ref_pics_sps``
|
||||
-
|
||||
* - __u8
|
||||
- ``chroma_format_idc``
|
||||
-
|
||||
* - __u64
|
||||
- ``flags``
|
||||
- See :ref:`Sequence Parameter Set Flags <hevc_sps_flags>`
|
||||
|
||||
.. _hevc_sps_flags:
|
||||
|
||||
``Sequence Parameter Set Flags``
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - ``V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE``
|
||||
- 0x00000001
|
||||
-
|
||||
* - ``V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED``
|
||||
- 0x00000002
|
||||
-
|
||||
* - ``V4L2_HEVC_SPS_FLAG_AMP_ENABLED``
|
||||
- 0x00000004
|
||||
-
|
||||
* - ``V4L2_HEVC_SPS_FLAG_SAMPLE_ADAPTIVE_OFFSET``
|
||||
- 0x00000008
|
||||
-
|
||||
* - ``V4L2_HEVC_SPS_FLAG_PCM_ENABLED``
|
||||
- 0x00000010
|
||||
-
|
||||
* - ``V4L2_HEVC_SPS_FLAG_PCM_LOOP_FILTER_DISABLED``
|
||||
- 0x00000020
|
||||
-
|
||||
* - ``V4L2_HEVC_SPS_FLAG_LONG_TERM_REF_PICS_PRESENT``
|
||||
- 0x00000040
|
||||
-
|
||||
* - ``V4L2_HEVC_SPS_FLAG_SPS_TEMPORAL_MVP_ENABLED``
|
||||
- 0x00000080
|
||||
-
|
||||
* - ``V4L2_HEVC_SPS_FLAG_STRONG_INTRA_SMOOTHING_ENABLED``
|
||||
- 0x00000100
|
||||
-
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_HEVC_PPS (struct)``
|
||||
Specifies the Picture Parameter Set fields (as extracted from the
|
||||
bitstream) for the associated HEVC slice data.
|
||||
These bitstream parameters are defined according to :ref:`hevc`.
|
||||
They are described in section 7.4.3.3 "Picture parameter set RBSP
|
||||
semantics" of the specification.
|
||||
|
||||
.. c:type:: v4l2_ctrl_hevc_pps
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table:: struct v4l2_ctrl_hevc_pps
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u8
|
||||
- ``num_extra_slice_header_bits``
|
||||
-
|
||||
* - __s8
|
||||
- ``init_qp_minus26``
|
||||
-
|
||||
* - __u8
|
||||
- ``diff_cu_qp_delta_depth``
|
||||
-
|
||||
* - __s8
|
||||
- ``pps_cb_qp_offset``
|
||||
-
|
||||
* - __s8
|
||||
- ``pps_cr_qp_offset``
|
||||
-
|
||||
* - __u8
|
||||
- ``num_tile_columns_minus1``
|
||||
-
|
||||
* - __u8
|
||||
- ``num_tile_rows_minus1``
|
||||
-
|
||||
* - __u8
|
||||
- ``column_width_minus1[20]``
|
||||
-
|
||||
* - __u8
|
||||
- ``row_height_minus1[22]``
|
||||
-
|
||||
* - __s8
|
||||
- ``pps_beta_offset_div2``
|
||||
-
|
||||
* - __s8
|
||||
- ``pps_tc_offset_div2``
|
||||
-
|
||||
* - __u8
|
||||
- ``log2_parallel_merge_level_minus2``
|
||||
-
|
||||
* - __u8
|
||||
- ``padding[4]``
|
||||
- Applications and drivers must set this to zero.
|
||||
* - __u64
|
||||
- ``flags``
|
||||
- See :ref:`Picture Parameter Set Flags <hevc_pps_flags>`
|
||||
|
||||
.. _hevc_pps_flags:
|
||||
|
||||
``Picture Parameter Set Flags``
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - ``V4L2_HEVC_PPS_FLAG_DEPENDENT_SLICE_SEGMENT``
|
||||
- 0x00000001
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT``
|
||||
- 0x00000002
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_SIGN_DATA_HIDING_ENABLED``
|
||||
- 0x00000004
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_CABAC_INIT_PRESENT``
|
||||
- 0x00000008
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_CONSTRAINED_INTRA_PRED``
|
||||
- 0x00000010
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_TRANSFORM_SKIP_ENABLED``
|
||||
- 0x00000020
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_CU_QP_DELTA_ENABLED``
|
||||
- 0x00000040
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_PPS_SLICE_CHROMA_QP_OFFSETS_PRESENT``
|
||||
- 0x00000080
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_WEIGHTED_PRED``
|
||||
- 0x00000100
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_WEIGHTED_BIPRED``
|
||||
- 0x00000200
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_TRANSQUANT_BYPASS_ENABLED``
|
||||
- 0x00000400
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_TILES_ENABLED``
|
||||
- 0x00000800
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_ENTROPY_CODING_SYNC_ENABLED``
|
||||
- 0x00001000
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_LOOP_FILTER_ACROSS_TILES_ENABLED``
|
||||
- 0x00002000
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED``
|
||||
- 0x00004000
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_DEBLOCKING_FILTER_OVERRIDE_ENABLED``
|
||||
- 0x00008000
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_PPS_DISABLE_DEBLOCKING_FILTER``
|
||||
- 0x00010000
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_LISTS_MODIFICATION_PRESENT``
|
||||
- 0x00020000
|
||||
-
|
||||
* - ``V4L2_HEVC_PPS_FLAG_SLICE_SEGMENT_HEADER_EXTENSION_PRESENT``
|
||||
- 0x00040000
|
||||
-
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (struct)``
|
||||
Specifies various slice-specific parameters, especially from the NAL unit
|
||||
header, general slice segment header and weighted prediction parameter
|
||||
parts of the bitstream.
|
||||
These bitstream parameters are defined according to :ref:`hevc`.
|
||||
They are described in section 7.4.7 "General slice segment header
|
||||
semantics" of the specification.
|
||||
|
||||
.. c:type:: v4l2_ctrl_hevc_slice_params
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table:: struct v4l2_ctrl_hevc_slice_params
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u32
|
||||
- ``bit_size``
|
||||
- Size (in bits) of the current slice data.
|
||||
* - __u32
|
||||
- ``data_bit_offset``
|
||||
- Offset (in bits) to the video data in the current slice data.
|
||||
* - __u8
|
||||
- ``nal_unit_type``
|
||||
-
|
||||
* - __u8
|
||||
- ``nuh_temporal_id_plus1``
|
||||
-
|
||||
* - __u8
|
||||
- ``slice_type``
|
||||
-
|
||||
(V4L2_HEVC_SLICE_TYPE_I, V4L2_HEVC_SLICE_TYPE_P or
|
||||
V4L2_HEVC_SLICE_TYPE_B).
|
||||
* - __u8
|
||||
- ``colour_plane_id``
|
||||
-
|
||||
* - __u16
|
||||
- ``slice_pic_order_cnt``
|
||||
-
|
||||
* - __u8
|
||||
- ``num_ref_idx_l0_active_minus1``
|
||||
-
|
||||
* - __u8
|
||||
- ``num_ref_idx_l1_active_minus1``
|
||||
-
|
||||
* - __u8
|
||||
- ``collocated_ref_idx``
|
||||
-
|
||||
* - __u8
|
||||
- ``five_minus_max_num_merge_cand``
|
||||
-
|
||||
* - __s8
|
||||
- ``slice_qp_delta``
|
||||
-
|
||||
* - __s8
|
||||
- ``slice_cb_qp_offset``
|
||||
-
|
||||
* - __s8
|
||||
- ``slice_cr_qp_offset``
|
||||
-
|
||||
* - __s8
|
||||
- ``slice_act_y_qp_offset``
|
||||
-
|
||||
* - __s8
|
||||
- ``slice_act_cb_qp_offset``
|
||||
-
|
||||
* - __s8
|
||||
- ``slice_act_cr_qp_offset``
|
||||
-
|
||||
* - __s8
|
||||
- ``slice_beta_offset_div2``
|
||||
-
|
||||
* - __s8
|
||||
- ``slice_tc_offset_div2``
|
||||
-
|
||||
* - __u8
|
||||
- ``pic_struct``
|
||||
-
|
||||
* - __u8
|
||||
- ``num_active_dpb_entries``
|
||||
- The number of entries in ``dpb``.
|
||||
* - __u8
|
||||
- ``ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]``
|
||||
- The list of L0 reference elements as indices in the DPB.
|
||||
* - __u8
|
||||
- ``ref_idx_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]``
|
||||
- The list of L1 reference elements as indices in the DPB.
|
||||
* - __u8
|
||||
- ``num_rps_poc_st_curr_before``
|
||||
- The number of reference pictures in the short-term set that come before
|
||||
the current frame.
|
||||
* - __u8
|
||||
- ``num_rps_poc_st_curr_after``
|
||||
- The number of reference pictures in the short-term set that come after
|
||||
the current frame.
|
||||
* - __u8
|
||||
- ``num_rps_poc_lt_curr``
|
||||
- The number of reference pictures in the long-term set.
|
||||
* - __u8
|
||||
- ``padding[7]``
|
||||
- Applications and drivers must set this to zero.
|
||||
* - struct :c:type:`v4l2_hevc_dpb_entry`
|
||||
- ``dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]``
|
||||
- The decoded picture buffer, for meta-data about reference frames.
|
||||
* - struct :c:type:`v4l2_hevc_pred_weight_table`
|
||||
- ``pred_weight_table``
|
||||
- The prediction weight coefficients for inter-picture prediction.
|
||||
* - __u64
|
||||
- ``flags``
|
||||
- See :ref:`Slice Parameters Flags <hevc_slice_params_flags>`
|
||||
|
||||
.. _hevc_slice_params_flags:
|
||||
|
||||
``Slice Parameters Flags``
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - ``V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_LUMA``
|
||||
- 0x00000001
|
||||
-
|
||||
* - ``V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_SAO_CHROMA``
|
||||
- 0x00000002
|
||||
-
|
||||
* - ``V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_TEMPORAL_MVP_ENABLED``
|
||||
- 0x00000004
|
||||
-
|
||||
* - ``V4L2_HEVC_SLICE_PARAMS_FLAG_MVD_L1_ZERO``
|
||||
- 0x00000008
|
||||
-
|
||||
* - ``V4L2_HEVC_SLICE_PARAMS_FLAG_CABAC_INIT``
|
||||
- 0x00000010
|
||||
-
|
||||
* - ``V4L2_HEVC_SLICE_PARAMS_FLAG_COLLOCATED_FROM_L0``
|
||||
- 0x00000020
|
||||
-
|
||||
* - ``V4L2_HEVC_SLICE_PARAMS_FLAG_USE_INTEGER_MV``
|
||||
- 0x00000040
|
||||
-
|
||||
* - ``V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_DEBLOCKING_FILTER_DISABLED``
|
||||
- 0x00000080
|
||||
-
|
||||
* - ``V4L2_HEVC_SLICE_PARAMS_FLAG_SLICE_LOOP_FILTER_ACROSS_SLICES_ENABLED``
|
||||
- 0x00000100
|
||||
-
|
||||
|
||||
.. c:type:: v4l2_hevc_dpb_entry
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table:: struct v4l2_hevc_dpb_entry
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u64
|
||||
- ``timestamp``
|
||||
- Timestamp of the V4L2 capture buffer to use as reference, used
|
||||
with B-coded and P-coded frames. The timestamp refers to the
|
||||
``timestamp`` field in struct :c:type:`v4l2_buffer`. Use the
|
||||
:c:func:`v4l2_timeval_to_ns()` function to convert the struct
|
||||
:c:type:`timeval` in struct :c:type:`v4l2_buffer` to a __u64.
|
||||
* - __u8
|
||||
- ``rps``
|
||||
- The reference set for the reference frame
|
||||
(V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_BEFORE,
|
||||
V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_AFTER or
|
||||
V4L2_HEVC_DPB_ENTRY_RPS_LT_CURR)
|
||||
* - __u8
|
||||
- ``field_pic``
|
||||
- Whether the reference is a field picture or a frame.
|
||||
* - __u16
|
||||
- ``pic_order_cnt[2]``
|
||||
- The picture order count of the reference. Only the first element of the
|
||||
array is used for frame pictures, while the first element identifies the
|
||||
top field and the second the bottom field in field-coded pictures.
|
||||
* - __u8
|
||||
- ``padding[2]``
|
||||
- Applications and drivers must set this to zero.
|
||||
|
||||
.. c:type:: v4l2_hevc_pred_weight_table
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table:: struct v4l2_hevc_pred_weight_table
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - __u8
|
||||
- ``luma_log2_weight_denom``
|
||||
-
|
||||
* - __s8
|
||||
- ``delta_chroma_log2_weight_denom``
|
||||
-
|
||||
* - __s8
|
||||
- ``delta_luma_weight_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]``
|
||||
-
|
||||
* - __s8
|
||||
- ``luma_offset_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]``
|
||||
-
|
||||
* - __s8
|
||||
- ``delta_chroma_weight_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]``
|
||||
-
|
||||
* - __s8
|
||||
- ``chroma_offset_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]``
|
||||
-
|
||||
* - __s8
|
||||
- ``delta_luma_weight_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]``
|
||||
-
|
||||
* - __s8
|
||||
- ``luma_offset_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]``
|
||||
-
|
||||
* - __s8
|
||||
- ``delta_chroma_weight_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]``
|
||||
-
|
||||
* - __s8
|
||||
- ``chroma_offset_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]``
|
||||
-
|
||||
* - __u8
|
||||
- ``padding[6]``
|
||||
- Applications and drivers must set this to zero.
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE (enum)``
|
||||
Specifies the decoding mode to use. Currently exposes slice-based and
|
||||
frame-based decoding but new modes might be added later on.
|
||||
This control is used as a modifier for V4L2_PIX_FMT_HEVC_SLICE
|
||||
pixel format. Applications that support V4L2_PIX_FMT_HEVC_SLICE
|
||||
are required to set this control in order to specify the decoding mode
|
||||
that is expected for the buffer.
|
||||
Drivers may expose a single or multiple decoding modes, depending
|
||||
on what they can support.
|
||||
|
||||
.. note::
|
||||
|
||||
This menu control is not yet part of the public kernel API and
|
||||
it is expected to change.
|
||||
|
||||
.. c:type:: v4l2_mpeg_video_hevc_decode_mode
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - ``V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_SLICE_BASED``
|
||||
- 0
|
||||
- Decoding is done at the slice granularity.
|
||||
The OUTPUT buffer must contain a single slice.
|
||||
* - ``V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_FRAME_BASED``
|
||||
- 1
|
||||
- Decoding is done at the frame granularity.
|
||||
The OUTPUT buffer must contain all slices needed to decode the
|
||||
frame. The OUTPUT buffer must also contain both fields.
|
||||
|
||||
``V4L2_CID_MPEG_VIDEO_HEVC_START_CODE (enum)``
|
||||
Specifies the HEVC slice start code expected for each slice.
|
||||
This control is used as a modifier for V4L2_PIX_FMT_HEVC_SLICE
|
||||
pixel format. Applications that support V4L2_PIX_FMT_HEVC_SLICE
|
||||
are required to set this control in order to specify the start code
|
||||
that is expected for the buffer.
|
||||
Drivers may expose a single or multiple start codes, depending
|
||||
on what they can support.
|
||||
|
||||
.. note::
|
||||
|
||||
This menu control is not yet part of the public kernel API and
|
||||
it is expected to change.
|
||||
|
||||
.. c:type:: v4l2_mpeg_video_hevc_start_code
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
.. flat-table::
|
||||
:header-rows: 0
|
||||
:stub-columns: 0
|
||||
:widths: 1 1 2
|
||||
|
||||
* - ``V4L2_MPEG_VIDEO_HEVC_START_CODE_NONE``
|
||||
- 0
|
||||
- Selecting this value specifies that HEVC slices are passed
|
||||
to the driver without any start code.
|
||||
* - ``V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B``
|
||||
- 1
|
||||
- Selecting this value specifies that HEVC slices are expected
|
||||
to be prefixed by Annex B start codes. According to :ref:`hevc`
|
||||
valid start codes can be 3-bytes 0x000001 or 4-bytes 0x00000001.
|
||||
|
@ -98,7 +98,7 @@ Flash Control IDs
|
||||
V4L2_CID_FLASH_STROBE control.
|
||||
* - ``V4L2_FLASH_STROBE_SOURCE_EXTERNAL``
|
||||
- The flash strobe is triggered by an external source. Typically
|
||||
this is a sensor, which makes it possible to synchronises the
|
||||
this is a sensor, which makes it possible to synchronise the
|
||||
flash strobe start to exposure start.
|
||||
|
||||
|
||||
|
@ -55,3 +55,13 @@ Image Source Control IDs
|
||||
|
||||
``V4L2_CID_TEST_PATTERN_GREENB (integer)``
|
||||
Test pattern green (next to blue) colour component.
|
||||
|
||||
``V4L2_CID_UNIT_CELL_SIZE (struct)``
|
||||
This control returns the unit cell size in nanometers. The struct
|
||||
:c:type:`v4l2_area` provides the width and the height in separate
|
||||
fields to take into consideration asymmetric pixels.
|
||||
This control does not take into consideration any possible hardware
|
||||
binning.
|
||||
The unit cell consists of the whole area of the pixel, sensitive and
|
||||
non-sensitive.
|
||||
This control is required for automatic calibration of sensors/cameras.
|
||||
|
@ -24,3 +24,4 @@ These formats are used for the :ref:`metadata` interface only.
|
||||
pixfmt-meta-uvc
|
||||
pixfmt-meta-vsp1-hgo
|
||||
pixfmt-meta-vsp1-hgt
|
||||
pixfmt-meta-vivid
|
||||
|
@ -61,10 +61,10 @@ Compressed Formats
|
||||
|
||||
- ``V4L2_PIX_FMT_H264_SLICE``
|
||||
- 'S264'
|
||||
- H264 parsed slice data, without the start code and as
|
||||
extracted from the H264 bitstream. This format is adapted for
|
||||
stateless video decoders that implement an H264 pipeline
|
||||
(using the :ref:`mem2mem` and :ref:`media-request-api`).
|
||||
- H264 parsed slice data, including slice headers, either with or
|
||||
without the start code, as extracted from the H264 bitstream.
|
||||
This format is adapted for stateless video decoders that implement an
|
||||
H264 pipeline (using the :ref:`mem2mem` and :ref:`media-request-api`).
|
||||
This pixelformat has two modifiers that must be set at least once
|
||||
through the ``V4L2_CID_MPEG_VIDEO_H264_DECODE_MODE``
|
||||
and ``V4L2_CID_MPEG_VIDEO_H264_START_CODE`` controls.
|
||||
@ -80,6 +80,10 @@ Compressed Formats
|
||||
appropriate number of macroblocks to decode a full
|
||||
corresponding frame to the matching capture buffer.
|
||||
|
||||
The syntax for this format is documented in :ref:`h264`, section
|
||||
7.3.2.8 "Slice layer without partitioning RBSP syntax" and the following
|
||||
sections.
|
||||
|
||||
.. note::
|
||||
|
||||
This format is not yet part of the public kernel API and it
|
||||
@ -188,6 +192,29 @@ Compressed Formats
|
||||
If :ref:`VIDIOC_ENUM_FMT` reports ``V4L2_FMT_FLAG_CONTINUOUS_BYTESTREAM``
|
||||
then the decoder has no requirements since it can parse all the
|
||||
information from the raw bytestream.
|
||||
* .. _V4L2-PIX-FMT-HEVC-SLICE:
|
||||
|
||||
- ``V4L2_PIX_FMT_HEVC_SLICE``
|
||||
- 'S265'
|
||||
- HEVC parsed slice data, as extracted from the HEVC bitstream.
|
||||
This format is adapted for stateless video decoders that implement a
|
||||
HEVC pipeline (using the :ref:`mem2mem` and :ref:`media-request-api`).
|
||||
This pixelformat has two modifiers that must be set at least once
|
||||
through the ``V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE``
|
||||
and ``V4L2_CID_MPEG_VIDEO_HEVC_START_CODE`` controls.
|
||||
Metadata associated with the frame to decode is required to be passed
|
||||
through the following controls :
|
||||
* ``V4L2_CID_MPEG_VIDEO_HEVC_SPS``
|
||||
* ``V4L2_CID_MPEG_VIDEO_HEVC_PPS``
|
||||
* ``V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS``
|
||||
See the :ref:`associated Codec Control IDs <v4l2-mpeg-hevc>`.
|
||||
Buffers associated with this pixel format must contain the appropriate
|
||||
number of macroblocks to decode a full corresponding frame.
|
||||
|
||||
.. note::
|
||||
|
||||
This format is not yet part of the public kernel API and it
|
||||
is expected to change.
|
||||
* .. _V4L2-PIX-FMT-FWHT:
|
||||
|
||||
- ``V4L2_PIX_FMT_FWHT``
|
||||
|
60
Documentation/media/uapi/v4l/pixfmt-meta-vivid.rst
Normal file
60
Documentation/media/uapi/v4l/pixfmt-meta-vivid.rst
Normal file
@ -0,0 +1,60 @@
|
||||
.. This file is dual-licensed: you can use it either under the terms
|
||||
.. of the GPL 2.0 or the GFDL 1.1+ license, at your option. Note that this
|
||||
.. dual licensing only applies to this file, and not this project as a
|
||||
.. whole.
|
||||
..
|
||||
.. a) This file 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 version 2 of
|
||||
.. the License.
|
||||
..
|
||||
.. This file 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.
|
||||
..
|
||||
.. Or, alternatively,
|
||||
..
|
||||
.. b) Permission is granted to copy, distribute and/or modify this
|
||||
.. document under the terms of the GNU Free Documentation License,
|
||||
.. Version 1.1 or any later version published by the Free Software
|
||||
.. Foundation, with no Invariant Sections, no Front-Cover Texts
|
||||
.. and no Back-Cover Texts. A copy of the license is included at
|
||||
.. Documentation/media/uapi/fdl-appendix.rst.
|
||||
..
|
||||
.. TODO: replace it to GPL-2.0 OR GFDL-1.1-or-later WITH no-invariant-sections
|
||||
|
||||
.. _v4l2-meta-fmt-vivid:
|
||||
|
||||
*******************************
|
||||
V4L2_META_FMT_VIVID ('VIVD')
|
||||
*******************************
|
||||
|
||||
VIVID Metadata Format
|
||||
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
This describes metadata format used by the vivid driver.
|
||||
|
||||
It sets Brightness, Saturation, Contrast and Hue, each of which maps to
|
||||
corresponding controls of the vivid driver with respect to the range and default values.
|
||||
|
||||
It contains the following fields:
|
||||
|
||||
.. flat-table:: VIVID Metadata
|
||||
:widths: 1 4
|
||||
:header-rows: 1
|
||||
:stub-columns: 0
|
||||
|
||||
* - Field
|
||||
- Description
|
||||
* - u16 brightness;
|
||||
- Image brightness, the value is in the range 0 to 255, with the default value as 128.
|
||||
* - u16 contrast;
|
||||
- Image contrast, the value is in the range 0 to 255, with the default value as 128.
|
||||
* - u16 saturation;
|
||||
- Image color saturation, the value is in the range 0 to 255, with the default value as 128.
|
||||
* - s16 hue;
|
||||
- Image color balance, the value is in the range -128 to 128, with the default value as 0.
|
@ -38,8 +38,10 @@ of the two interfaces they are used.
|
||||
* - ``V4L2_SEL_TGT_CROP_DEFAULT``
|
||||
- 0x0001
|
||||
- Suggested cropping rectangle that covers the "whole picture".
|
||||
This includes only active pixels and excludes other non-active
|
||||
pixels such as black pixels.
|
||||
- Yes
|
||||
- Yes
|
||||
- No
|
||||
* - ``V4L2_SEL_TGT_CROP_BOUNDS``
|
||||
- 0x0002
|
||||
- Bounds of the crop rectangle. All valid crop rectangles fit inside
|
||||
|
@ -208,7 +208,15 @@ introduced in Linux 3.3. They are, however, mandatory for stateful mem2mem decod
|
||||
been started yet, the driver will return an ``EPERM`` error code. When
|
||||
the decoder is already running, this command does nothing. No
|
||||
flags are defined for this command.
|
||||
|
||||
* - ``V4L2_DEC_CMD_FLUSH``
|
||||
- 4
|
||||
- Flush any held capture buffers. Only valid for stateless decoders.
|
||||
This command is typically used when the application reached the
|
||||
end of the stream and the last output buffer had the
|
||||
``V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF`` flag set. This would prevent
|
||||
dequeueing the capture buffer containing the last decoded frame.
|
||||
So this command can be used to explicitly flush that final decoded
|
||||
frame. This command does nothing if there are no held capture buffers.
|
||||
|
||||
Return Value
|
||||
============
|
||||
|
@ -198,6 +198,11 @@ still cause this situation.
|
||||
- ``p_u32``
|
||||
- A pointer to a matrix control of unsigned 32-bit values. Valid if
|
||||
this control is of type ``V4L2_CTRL_TYPE_U32``.
|
||||
* -
|
||||
- :c:type:`v4l2_area` *
|
||||
- ``p_area``
|
||||
- A pointer to a struct :c:type:`v4l2_area`. Valid if this control is
|
||||
of type ``V4L2_CTRL_TYPE_AREA``.
|
||||
* -
|
||||
- void *
|
||||
- ``ptr``
|
||||
|
@ -63,7 +63,7 @@ EINVAL error code when overlays are not supported.
|
||||
|
||||
To set the parameters for a *Video Output Overlay*, applications must
|
||||
initialize the ``flags`` field of a struct
|
||||
struct :c:type:`v4l2_framebuffer`. Since the framebuffer is
|
||||
:c:type:`v4l2_framebuffer`. Since the framebuffer is
|
||||
implemented on the TV card all other parameters are determined by the
|
||||
driver. When an application calls :ref:`VIDIOC_S_FBUF <VIDIOC_G_FBUF>` with a pointer to
|
||||
this structure, the driver prepares for the overlay and returns the
|
||||
|
@ -443,6 +443,12 @@ See also the examples in :ref:`control`.
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_mpeg2_quantization`, containing MPEG-2
|
||||
quantization matrices for stateless video decoders.
|
||||
* - ``V4L2_CTRL_TYPE_AREA``
|
||||
- n/a
|
||||
- n/a
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_area`, containing the width and the height
|
||||
of a rectangular area. Units depend on the use case.
|
||||
* - ``V4L2_CTRL_TYPE_H264_SPS``
|
||||
- n/a
|
||||
- n/a
|
||||
@ -473,6 +479,24 @@ See also the examples in :ref:`control`.
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_h264_decode_params`, containing H264
|
||||
decode parameters for stateless video decoders.
|
||||
* - ``V4L2_CTRL_TYPE_HEVC_SPS``
|
||||
- n/a
|
||||
- n/a
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_hevc_sps`, containing HEVC Sequence
|
||||
Parameter Set for stateless video decoders.
|
||||
* - ``V4L2_CTRL_TYPE_HEVC_PPS``
|
||||
- n/a
|
||||
- n/a
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_hevc_pps`, containing HEVC Picture
|
||||
Parameter Set for stateless video decoders.
|
||||
* - ``V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS``
|
||||
- n/a
|
||||
- n/a
|
||||
- n/a
|
||||
- A struct :c:type:`v4l2_ctrl_hevc_slice_params`, containing HEVC
|
||||
slice parameters for stateless video decoders.
|
||||
|
||||
.. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}|
|
||||
|
||||
|
@ -125,6 +125,7 @@ aborting or finishing any DMA in progress, an implicit
|
||||
.. _V4L2-BUF-CAP-SUPPORTS-DMABUF:
|
||||
.. _V4L2-BUF-CAP-SUPPORTS-REQUESTS:
|
||||
.. _V4L2-BUF-CAP-SUPPORTS-ORPHANED-BUFS:
|
||||
.. _V4L2-BUF-CAP-SUPPORTS-M2M-HOLD-CAPTURE-BUF:
|
||||
|
||||
.. cssclass:: longtable
|
||||
|
||||
@ -150,6 +151,11 @@ aborting or finishing any DMA in progress, an implicit
|
||||
- The kernel allows calling :ref:`VIDIOC_REQBUFS` while buffers are still
|
||||
mapped or exported via DMABUF. These orphaned buffers will be freed
|
||||
when they are unmapped or when the exported DMABUF fds are closed.
|
||||
* - ``V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF``
|
||||
- 0x00000020
|
||||
- Only valid for stateless decoders. If set, then userspace can set the
|
||||
``V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF`` flag to hold off on returning the
|
||||
capture buffer until the OUTPUT timestamp changes.
|
||||
|
||||
Return Value
|
||||
============
|
||||
|
@ -515,10 +515,10 @@ Streaming can then begin independently on the capture device nodes
|
||||
be used to select any supported YUV pixelformat on the capture device
|
||||
nodes, including planar.
|
||||
|
||||
SabreAuto with ADV7180 decoder
|
||||
------------------------------
|
||||
i.MX6Q SabreAuto with ADV7180 decoder
|
||||
-------------------------------------
|
||||
|
||||
On the SabreAuto, an on-board ADV7180 SD decoder is connected to the
|
||||
On the i.MX6Q SabreAuto, an on-board ADV7180 SD decoder is connected to the
|
||||
parallel bus input on the internal video mux to IPU1 CSI0.
|
||||
|
||||
The following example configures a pipeline to capture from the ADV7180
|
||||
@ -547,8 +547,6 @@ This example configures a pipeline to capture from the ADV7180
|
||||
video decoder, assuming PAL 720x576 input signals, with Motion
|
||||
Compensated de-interlacing. The adv7180 must output sequential or
|
||||
alternating fields (field type 'seq-tb' for PAL, or 'alternate').
|
||||
$outputfmt can be any format supported by the ipu1_ic_prpvf entity
|
||||
at its output pad:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
@ -565,11 +563,70 @@ at its output pad:
|
||||
media-ctl -V "'ipu1_csi0':1 [fmt:AYUV32/720x576]"
|
||||
media-ctl -V "'ipu1_vdic':2 [fmt:AYUV32/720x576 field:none]"
|
||||
media-ctl -V "'ipu1_ic_prp':2 [fmt:AYUV32/720x576 field:none]"
|
||||
media-ctl -V "'ipu1_ic_prpvf':1 [fmt:$outputfmt field:none]"
|
||||
media-ctl -V "'ipu1_ic_prpvf':1 [fmt:AYUV32/720x576 field:none]"
|
||||
# Configure "ipu1_ic_prpvf capture" interface (assumed at /dev/video2)
|
||||
v4l2-ctl -d2 --set-fmt-video=field=none
|
||||
|
||||
Streaming can then begin on the capture device node at
|
||||
"ipu1_ic_prpvf capture". The v4l2-ctl tool can be used to select any
|
||||
supported YUV or RGB pixelformat on the capture device node.
|
||||
Streaming can then begin on /dev/video2. The v4l2-ctl tool can also be
|
||||
used to select any supported YUV pixelformat on /dev/video2.
|
||||
|
||||
This platform accepts Composite Video analog inputs to the ADV7180 on
|
||||
Ain1 (connector J42).
|
||||
|
||||
i.MX6DL SabreAuto with ADV7180 decoder
|
||||
--------------------------------------
|
||||
|
||||
On the i.MX6DL SabreAuto, an on-board ADV7180 SD decoder is connected to the
|
||||
parallel bus input on the internal video mux to IPU1 CSI0.
|
||||
|
||||
The following example configures a pipeline to capture from the ADV7180
|
||||
video decoder, assuming NTSC 720x480 input signals, using simple
|
||||
interweave (unconverted and without motion compensation). The adv7180
|
||||
must output sequential or alternating fields (field type 'seq-bt' for
|
||||
NTSC, or 'alternate'):
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
# Setup links
|
||||
media-ctl -l "'adv7180 4-0021':0 -> 'ipu1_csi0_mux':4[1]"
|
||||
media-ctl -l "'ipu1_csi0_mux':5 -> 'ipu1_csi0':0[1]"
|
||||
media-ctl -l "'ipu1_csi0':2 -> 'ipu1_csi0 capture':0[1]"
|
||||
# Configure pads
|
||||
media-ctl -V "'adv7180 4-0021':0 [fmt:UYVY2X8/720x480 field:seq-bt]"
|
||||
media-ctl -V "'ipu1_csi0_mux':5 [fmt:UYVY2X8/720x480]"
|
||||
media-ctl -V "'ipu1_csi0':2 [fmt:AYUV32/720x480]"
|
||||
# Configure "ipu1_csi0 capture" interface (assumed at /dev/video0)
|
||||
v4l2-ctl -d0 --set-fmt-video=field=interlaced_bt
|
||||
|
||||
Streaming can then begin on /dev/video0. The v4l2-ctl tool can also be
|
||||
used to select any supported YUV pixelformat on /dev/video0.
|
||||
|
||||
This example configures a pipeline to capture from the ADV7180
|
||||
video decoder, assuming PAL 720x576 input signals, with Motion
|
||||
Compensated de-interlacing. The adv7180 must output sequential or
|
||||
alternating fields (field type 'seq-tb' for PAL, or 'alternate').
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
# Setup links
|
||||
media-ctl -l "'adv7180 4-0021':0 -> 'ipu1_csi0_mux':4[1]"
|
||||
media-ctl -l "'ipu1_csi0_mux':5 -> 'ipu1_csi0':0[1]"
|
||||
media-ctl -l "'ipu1_csi0':1 -> 'ipu1_vdic':0[1]"
|
||||
media-ctl -l "'ipu1_vdic':2 -> 'ipu1_ic_prp':0[1]"
|
||||
media-ctl -l "'ipu1_ic_prp':2 -> 'ipu1_ic_prpvf':0[1]"
|
||||
media-ctl -l "'ipu1_ic_prpvf':1 -> 'ipu1_ic_prpvf capture':0[1]"
|
||||
# Configure pads
|
||||
media-ctl -V "'adv7180 4-0021':0 [fmt:UYVY2X8/720x576 field:seq-tb]"
|
||||
media-ctl -V "'ipu1_csi0_mux':5 [fmt:UYVY2X8/720x576]"
|
||||
media-ctl -V "'ipu1_csi0':1 [fmt:AYUV32/720x576]"
|
||||
media-ctl -V "'ipu1_vdic':2 [fmt:AYUV32/720x576 field:none]"
|
||||
media-ctl -V "'ipu1_ic_prp':2 [fmt:AYUV32/720x576 field:none]"
|
||||
media-ctl -V "'ipu1_ic_prpvf':1 [fmt:AYUV32/720x576 field:none]"
|
||||
# Configure "ipu1_ic_prpvf capture" interface (assumed at /dev/video2)
|
||||
v4l2-ctl -d2 --set-fmt-video=field=none
|
||||
|
||||
Streaming can then begin on /dev/video2. The v4l2-ctl tool can also be
|
||||
used to select any supported YUV pixelformat on /dev/video2.
|
||||
|
||||
This platform accepts Composite Video analog inputs to the ADV7180 on
|
||||
Ain1 (connector J42).
|
||||
|
@ -265,19 +265,56 @@ below.
|
||||
|
||||
yavta -w "0x009819A1 1" /dev/v4l-subdev7
|
||||
|
||||
RAW Bayer frames go through the following ImgU pipeline HW blocks to have the
|
||||
Certain hardware blocks in ImgU pipeline can change the frame resolution by
|
||||
cropping or scaling, these hardware blocks include Input Feeder(IF), Bayer Down
|
||||
Scaler (BDS) and Geometric Distortion Correction (GDC).
|
||||
There is also a block which can change the frame resolution - YUV Scaler, it is
|
||||
only applicable to the secondary output.
|
||||
|
||||
RAW Bayer frames go through these ImgU pipeline hardware blocks and the final
|
||||
processed image output to the DDR memory.
|
||||
|
||||
RAW Bayer frame -> Input Feeder -> Bayer Down Scaling (BDS) -> Geometric
|
||||
Distortion Correction (GDC) -> DDR
|
||||
.. kernel-figure:: ipu3_rcb.svg
|
||||
:alt: ipu3 resolution blocks image
|
||||
|
||||
IPU3 resolution change hardware blocks
|
||||
|
||||
**Input Feeder**
|
||||
|
||||
Input Feeder gets the Bayer frame data from the sensor, it can enable cropping
|
||||
of lines and columns from the frame and then store pixels into device's internal
|
||||
pixel buffer which are ready to readout by following blocks.
|
||||
|
||||
**Bayer Down Scaler**
|
||||
|
||||
Bayer Down Scaler is capable of performing image scaling in Bayer domain, the
|
||||
downscale factor can be configured from 1X to 1/4X in each axis with
|
||||
configuration steps of 0.03125 (1/32).
|
||||
|
||||
**Geometric Distortion Correction**
|
||||
|
||||
Geometric Distortion Correction is used to performe correction of distortions
|
||||
and image filtering. It needs some extra filter and envelop padding pixels to
|
||||
work, so the input resolution of GDC should be larger than the output
|
||||
resolution.
|
||||
|
||||
**YUV Scaler**
|
||||
|
||||
YUV Scaler which similar with BDS, but it is mainly do image down scaling in
|
||||
YUV domain, it can support up to 1/12X down scaling, but it can not be applied
|
||||
to the main output.
|
||||
|
||||
The ImgU V4L2 subdev has to be configured with the supported resolutions in all
|
||||
the above HW blocks, for a given input resolution.
|
||||
|
||||
the above hardware blocks, for a given input resolution.
|
||||
For a given supported resolution for an input frame, the Input Feeder, Bayer
|
||||
Down Scaling and GDC blocks should be configured with the supported resolutions.
|
||||
This information can be obtained by looking at the following IPU3 ImgU
|
||||
configuration table.
|
||||
Down Scaler and GDC blocks should be configured with the supported resolutions
|
||||
as each hardware block has its own alignment requirement.
|
||||
|
||||
You must configure the output resolution of the hardware blocks smartly to meet
|
||||
the hardware requirement along with keeping the maximum field of view.
|
||||
The intermediate resolutions can be generated by specific tool and this
|
||||
information can be obtained by looking at the following IPU3 ImgU configuration
|
||||
table.
|
||||
|
||||
https://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/master
|
||||
|
||||
|
331
Documentation/media/v4l-drivers/ipu3_rcb.svg
Normal file
331
Documentation/media/v4l-drivers/ipu3_rcb.svg
Normal file
@ -0,0 +1,331 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="774pt" height="152pt" viewBox="0 0 774 152" version="1.1">
|
||||
<defs>
|
||||
<g>
|
||||
<symbol overflow="visible" id="glyph0-0">
|
||||
<path style="stroke:none;" d="M 1 0 L 1 -15 L 9 -15 L 9 0 Z M 8 -1 L 8 -14 L 2 -14 L 2 -1 Z M 8 -1 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-1">
|
||||
<path style="stroke:none;" d="M 4.6875 -1.15625 C 5.519531 -1.15625 6.15625 -1.316406 6.59375 -1.640625 C 7.039062 -1.960938 7.265625 -2.441406 7.265625 -3.078125 C 7.265625 -3.460938 7.179688 -3.789062 7.015625 -4.0625 C 6.859375 -4.34375 6.644531 -4.582031 6.375 -4.78125 C 6.113281 -4.988281 5.816406 -5.171875 5.484375 -5.328125 C 5.148438 -5.484375 4.804688 -5.628906 4.453125 -5.765625 C 4.054688 -5.921875 3.675781 -6.097656 3.3125 -6.296875 C 2.945312 -6.492188 2.617188 -6.726562 2.328125 -7 C 2.046875 -7.269531 1.820312 -7.582031 1.65625 -7.9375 C 1.488281 -8.300781 1.40625 -8.726562 1.40625 -9.21875 C 1.40625 -10.300781 1.742188 -11.144531 2.421875 -11.75 C 3.097656 -12.351562 4.046875 -12.65625 5.265625 -12.65625 C 5.597656 -12.65625 5.925781 -12.628906 6.25 -12.578125 C 6.570312 -12.535156 6.875 -12.476562 7.15625 -12.40625 C 7.4375 -12.34375 7.6875 -12.265625 7.90625 -12.171875 C 8.125 -12.085938 8.300781 -12 8.4375 -11.90625 L 7.921875 -10.515625 C 7.648438 -10.679688 7.28125 -10.84375 6.8125 -11 C 6.351562 -11.15625 5.835938 -11.234375 5.265625 -11.234375 C 4.660156 -11.234375 4.140625 -11.082031 3.703125 -10.78125 C 3.265625 -10.488281 3.046875 -10.039062 3.046875 -9.4375 C 3.046875 -9.09375 3.109375 -8.800781 3.234375 -8.5625 C 3.359375 -8.320312 3.53125 -8.109375 3.75 -7.921875 C 3.96875 -7.742188 4.222656 -7.582031 4.515625 -7.4375 C 4.804688 -7.289062 5.128906 -7.144531 5.484375 -7 C 5.984375 -6.789062 6.441406 -6.578125 6.859375 -6.359375 C 7.285156 -6.148438 7.648438 -5.894531 7.953125 -5.59375 C 8.253906 -5.300781 8.488281 -4.953125 8.65625 -4.546875 C 8.820312 -4.148438 8.90625 -3.664062 8.90625 -3.09375 C 8.90625 -2.019531 8.539062 -1.191406 7.8125 -0.609375 C 7.082031 -0.0234375 6.039062 0.265625 4.6875 0.265625 C 4.238281 0.265625 3.820312 0.234375 3.4375 0.171875 C 3.050781 0.109375 2.707031 0.03125 2.40625 -0.0625 C 2.101562 -0.15625 1.835938 -0.25 1.609375 -0.34375 C 1.390625 -0.4375 1.21875 -0.519531 1.09375 -0.59375 L 1.59375 -1.953125 C 1.863281 -1.804688 2.257812 -1.632812 2.78125 -1.4375 C 3.300781 -1.25 3.9375 -1.15625 4.6875 -1.15625 Z M 4.6875 -1.15625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-2">
|
||||
<path style="stroke:none;" d="M 5.1875 -9.5 C 6.4375 -9.5 7.398438 -9.109375 8.078125 -8.328125 C 8.753906 -7.546875 9.09375 -6.363281 9.09375 -4.78125 L 9.09375 -4.203125 L 2.453125 -4.203125 C 2.523438 -3.242188 2.84375 -2.515625 3.40625 -2.015625 C 3.976562 -1.515625 4.773438 -1.265625 5.796875 -1.265625 C 6.390625 -1.265625 6.890625 -1.3125 7.296875 -1.40625 C 7.710938 -1.5 8.023438 -1.597656 8.234375 -1.703125 L 8.453125 -0.296875 C 8.253906 -0.191406 7.894531 -0.0820312 7.375 0.03125 C 6.851562 0.15625 6.269531 0.21875 5.625 0.21875 C 4.820312 0.21875 4.113281 0.0976562 3.5 -0.140625 C 2.894531 -0.390625 2.394531 -0.726562 2 -1.15625 C 1.601562 -1.582031 1.300781 -2.09375 1.09375 -2.6875 C 0.894531 -3.28125 0.796875 -3.925781 0.796875 -4.625 C 0.796875 -5.445312 0.921875 -6.164062 1.171875 -6.78125 C 1.429688 -7.394531 1.765625 -7.898438 2.171875 -8.296875 C 2.585938 -8.703125 3.054688 -9.003906 3.578125 -9.203125 C 4.097656 -9.398438 4.632812 -9.5 5.1875 -9.5 Z M 7.421875 -5.546875 C 7.421875 -6.328125 7.210938 -6.945312 6.796875 -7.40625 C 6.390625 -7.863281 5.84375 -8.09375 5.15625 -8.09375 C 4.769531 -8.09375 4.421875 -8.019531 4.109375 -7.875 C 3.796875 -7.726562 3.523438 -7.535156 3.296875 -7.296875 C 3.066406 -7.054688 2.882812 -6.78125 2.75 -6.46875 C 2.625 -6.164062 2.539062 -5.859375 2.5 -5.546875 Z M 7.421875 -5.546875 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-3">
|
||||
<path style="stroke:none;" d="M 1.421875 -9.015625 C 2.015625 -9.160156 2.609375 -9.273438 3.203125 -9.359375 C 3.796875 -9.441406 4.351562 -9.484375 4.875 -9.484375 C 6.113281 -9.484375 7.050781 -9.160156 7.6875 -8.515625 C 8.320312 -7.878906 8.640625 -6.851562 8.640625 -5.4375 L 8.640625 0 L 7 0 L 7 -5.140625 C 7 -5.742188 6.945312 -6.226562 6.84375 -6.59375 C 6.738281 -6.96875 6.585938 -7.257812 6.390625 -7.46875 C 6.191406 -7.675781 5.957031 -7.816406 5.6875 -7.890625 C 5.414062 -7.972656 5.117188 -8.015625 4.796875 -8.015625 C 4.535156 -8.015625 4.253906 -8 3.953125 -7.96875 C 3.648438 -7.9375 3.359375 -7.894531 3.078125 -7.84375 L 3.078125 0 L 1.421875 0 Z M 1.421875 -9.015625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-4">
|
||||
<path style="stroke:none;" d="M 7.015625 -2.3125 C 7.015625 -2.644531 6.878906 -2.914062 6.609375 -3.125 C 6.335938 -3.34375 6 -3.53125 5.59375 -3.6875 C 5.1875 -3.851562 4.742188 -4.015625 4.265625 -4.171875 C 3.785156 -4.328125 3.335938 -4.515625 2.921875 -4.734375 C 2.515625 -4.960938 2.175781 -5.242188 1.90625 -5.578125 C 1.632812 -5.910156 1.5 -6.34375 1.5 -6.875 C 1.5 -7.625 1.800781 -8.25 2.40625 -8.75 C 3.007812 -9.25 3.960938 -9.5 5.265625 -9.5 C 5.765625 -9.5 6.285156 -9.460938 6.828125 -9.390625 C 7.367188 -9.316406 7.832031 -9.21875 8.21875 -9.09375 L 7.921875 -7.625 C 7.816406 -7.675781 7.671875 -7.726562 7.484375 -7.78125 C 7.296875 -7.84375 7.082031 -7.894531 6.84375 -7.9375 C 6.601562 -7.988281 6.34375 -8.023438 6.0625 -8.046875 C 5.789062 -8.078125 5.53125 -8.09375 5.28125 -8.09375 C 3.84375 -8.09375 3.125 -7.703125 3.125 -6.921875 C 3.125 -6.640625 3.257812 -6.398438 3.53125 -6.203125 C 3.800781 -6.015625 4.144531 -5.835938 4.5625 -5.671875 C 4.976562 -5.515625 5.425781 -5.351562 5.90625 -5.1875 C 6.382812 -5.019531 6.828125 -4.816406 7.234375 -4.578125 C 7.648438 -4.335938 7.992188 -4.046875 8.265625 -3.703125 C 8.546875 -3.367188 8.6875 -2.941406 8.6875 -2.421875 C 8.6875 -1.578125 8.359375 -0.925781 7.703125 -0.46875 C 7.046875 -0.0078125 6.007812 0.21875 4.59375 0.21875 C 3.957031 0.21875 3.375 0.164062 2.84375 0.0625 C 2.3125 -0.0390625 1.800781 -0.203125 1.3125 -0.421875 L 1.640625 -1.921875 C 2.109375 -1.703125 2.597656 -1.523438 3.109375 -1.390625 C 3.617188 -1.253906 4.171875 -1.1875 4.765625 -1.1875 C 6.265625 -1.1875 7.015625 -1.5625 7.015625 -2.3125 Z M 7.015625 -2.3125 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-5">
|
||||
<path style="stroke:none;" d="M 9.203125 -4.640625 C 9.203125 -3.910156 9.097656 -3.25 8.890625 -2.65625 C 8.679688 -2.0625 8.390625 -1.550781 8.015625 -1.125 C 7.640625 -0.695312 7.191406 -0.363281 6.671875 -0.125 C 6.160156 0.101562 5.597656 0.21875 4.984375 0.21875 C 4.378906 0.21875 3.820312 0.101562 3.3125 -0.125 C 2.800781 -0.363281 2.359375 -0.695312 1.984375 -1.125 C 1.609375 -1.550781 1.316406 -2.0625 1.109375 -2.65625 C 0.898438 -3.25 0.796875 -3.910156 0.796875 -4.640625 C 0.796875 -5.367188 0.898438 -6.035156 1.109375 -6.640625 C 1.316406 -7.242188 1.609375 -7.753906 1.984375 -8.171875 C 2.359375 -8.585938 2.800781 -8.910156 3.3125 -9.140625 C 3.820312 -9.378906 4.378906 -9.5 4.984375 -9.5 C 5.597656 -9.5 6.160156 -9.378906 6.671875 -9.140625 C 7.191406 -8.910156 7.640625 -8.585938 8.015625 -8.171875 C 8.390625 -7.753906 8.679688 -7.242188 8.890625 -6.640625 C 9.097656 -6.035156 9.203125 -5.367188 9.203125 -4.640625 Z M 7.5 -4.640625 C 7.5 -5.691406 7.269531 -6.519531 6.8125 -7.125 C 6.363281 -7.738281 5.753906 -8.046875 4.984375 -8.046875 C 4.222656 -8.046875 3.617188 -7.738281 3.171875 -7.125 C 2.722656 -6.519531 2.5 -5.691406 2.5 -4.640625 C 2.5 -3.597656 2.722656 -2.773438 3.171875 -2.171875 C 3.617188 -1.566406 4.222656 -1.265625 4.984375 -1.265625 C 5.753906 -1.265625 6.363281 -1.566406 6.8125 -2.171875 C 7.269531 -2.773438 7.5 -3.597656 7.5 -4.640625 Z M 7.5 -4.640625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-6">
|
||||
<path style="stroke:none;" d="M 2.140625 0 L 2.140625 -8.78125 C 3.503906 -9.25 4.878906 -9.484375 6.265625 -9.484375 C 6.691406 -9.484375 7.097656 -9.460938 7.484375 -9.421875 C 7.867188 -9.390625 8.296875 -9.320312 8.765625 -9.21875 L 8.453125 -7.765625 C 8.023438 -7.878906 7.648438 -7.953125 7.328125 -7.984375 C 7.003906 -8.023438 6.648438 -8.046875 6.265625 -8.046875 C 5.453125 -8.046875 4.625 -7.929688 3.78125 -7.703125 L 3.78125 0 Z M 2.140625 0 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-7">
|
||||
<path style="stroke:none;" d="M 5.8125 -10.984375 L 5.8125 -1.40625 L 8.21875 -1.40625 L 8.21875 0 L 1.78125 0 L 1.78125 -1.40625 L 4.1875 -1.40625 L 4.1875 -10.984375 L 1.78125 -10.984375 L 1.78125 -12.375 L 8.21875 -12.375 L 8.21875 -10.984375 Z M 5.8125 -10.984375 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-8">
|
||||
<path style="stroke:none;" d="M 1.8125 0 L 1.8125 -12.375 L 8.84375 -12.375 L 8.84375 -10.984375 L 3.453125 -10.984375 L 3.453125 -7.125 L 8.203125 -7.125 L 8.203125 -5.734375 L 3.453125 -5.734375 L 3.453125 0 Z M 1.8125 0 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-9">
|
||||
<path style="stroke:none;" d="M 4.078125 0.09375 C 3.878906 0.09375 3.644531 0.0859375 3.375 0.078125 C 3.113281 0.0664062 2.847656 0.0507812 2.578125 0.03125 C 2.316406 0.0078125 2.050781 -0.0195312 1.78125 -0.0625 C 1.507812 -0.101562 1.273438 -0.148438 1.078125 -0.203125 L 1.078125 -12.203125 C 1.273438 -12.253906 1.503906 -12.300781 1.765625 -12.34375 C 2.023438 -12.382812 2.289062 -12.410156 2.5625 -12.421875 C 2.84375 -12.441406 3.113281 -12.457031 3.375 -12.46875 C 3.632812 -12.488281 3.867188 -12.5 4.078125 -12.5 C 4.691406 -12.5 5.265625 -12.445312 5.796875 -12.34375 C 6.328125 -12.238281 6.789062 -12.054688 7.1875 -11.796875 C 7.582031 -11.546875 7.890625 -11.210938 8.109375 -10.796875 C 8.328125 -10.390625 8.4375 -9.878906 8.4375 -9.265625 C 8.4375 -8.960938 8.390625 -8.675781 8.296875 -8.40625 C 8.203125 -8.132812 8.070312 -7.878906 7.90625 -7.640625 C 7.738281 -7.398438 7.546875 -7.1875 7.328125 -7 C 7.109375 -6.820312 6.875 -6.6875 6.625 -6.59375 C 7.300781 -6.40625 7.867188 -6.0625 8.328125 -5.5625 C 8.785156 -5.0625 9.015625 -4.414062 9.015625 -3.625 C 9.015625 -2.394531 8.617188 -1.46875 7.828125 -0.84375 C 7.046875 -0.21875 5.796875 0.09375 4.078125 0.09375 Z M 2.71875 -5.78125 L 2.71875 -1.359375 C 2.75 -1.347656 2.898438 -1.332031 3.171875 -1.3125 C 3.441406 -1.289062 3.785156 -1.28125 4.203125 -1.28125 C 4.609375 -1.28125 5 -1.3125 5.375 -1.375 C 5.757812 -1.445312 6.097656 -1.570312 6.390625 -1.75 C 6.691406 -1.925781 6.929688 -2.160156 7.109375 -2.453125 C 7.285156 -2.753906 7.375 -3.132812 7.375 -3.59375 C 7.375 -4.007812 7.289062 -4.359375 7.125 -4.640625 C 6.957031 -4.921875 6.738281 -5.144531 6.46875 -5.3125 C 6.195312 -5.476562 5.878906 -5.597656 5.515625 -5.671875 C 5.160156 -5.742188 4.789062 -5.78125 4.40625 -5.78125 Z M 2.71875 -7.140625 L 4.015625 -7.140625 C 4.347656 -7.140625 4.679688 -7.171875 5.015625 -7.234375 C 5.347656 -7.304688 5.644531 -7.414062 5.90625 -7.5625 C 6.175781 -7.707031 6.390625 -7.90625 6.546875 -8.15625 C 6.710938 -8.414062 6.796875 -8.738281 6.796875 -9.125 C 6.796875 -9.476562 6.722656 -9.78125 6.578125 -10.03125 C 6.429688 -10.289062 6.238281 -10.5 6 -10.65625 C 5.757812 -10.820312 5.484375 -10.9375 5.171875 -11 C 4.859375 -11.0625 4.53125 -11.09375 4.1875 -11.09375 C 3.832031 -11.09375 3.523438 -11.085938 3.265625 -11.078125 C 3.003906 -11.078125 2.820312 -11.066406 2.71875 -11.046875 Z M 2.71875 -7.140625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-10">
|
||||
<path style="stroke:none;" d="M 9.203125 -6.203125 C 9.203125 -5.054688 9.054688 -4.082031 8.765625 -3.28125 C 8.484375 -2.476562 8.09375 -1.828125 7.59375 -1.328125 C 7.09375 -0.828125 6.5 -0.460938 5.8125 -0.234375 C 5.125 -0.015625 4.378906 0.09375 3.578125 0.09375 C 2.753906 0.09375 1.921875 -0.00390625 1.078125 -0.203125 L 1.078125 -12.203125 C 1.921875 -12.398438 2.753906 -12.5 3.578125 -12.5 C 4.378906 -12.5 5.125 -12.382812 5.8125 -12.15625 C 6.5 -11.925781 7.09375 -11.554688 7.59375 -11.046875 C 8.09375 -10.546875 8.484375 -9.894531 8.765625 -9.09375 C 9.054688 -8.300781 9.203125 -7.335938 9.203125 -6.203125 Z M 2.71875 -1.375 C 3.050781 -1.332031 3.390625 -1.3125 3.734375 -1.3125 C 4.335938 -1.3125 4.875 -1.398438 5.34375 -1.578125 C 5.8125 -1.765625 6.203125 -2.054688 6.515625 -2.453125 C 6.835938 -2.847656 7.082031 -3.351562 7.25 -3.96875 C 7.425781 -4.59375 7.515625 -5.335938 7.515625 -6.203125 C 7.515625 -7.878906 7.191406 -9.109375 6.546875 -9.890625 C 5.898438 -10.679688 4.945312 -11.078125 3.6875 -11.078125 C 3.507812 -11.078125 3.335938 -11.070312 3.171875 -11.0625 C 3.003906 -11.0625 2.851562 -11.046875 2.71875 -11.015625 Z M 2.71875 -1.375 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-11">
|
||||
<path style="stroke:none;" d="M 7.453125 -6.09375 L 9.09375 -6.09375 L 9.09375 -0.296875 C 8.84375 -0.203125 8.4375 -0.0859375 7.875 0.046875 C 7.320312 0.191406 6.664062 0.265625 5.90625 0.265625 C 5.15625 0.265625 4.472656 0.125 3.859375 -0.15625 C 3.242188 -0.445312 2.71875 -0.863281 2.28125 -1.40625 C 1.851562 -1.957031 1.519531 -2.632812 1.28125 -3.4375 C 1.039062 -4.25 0.921875 -5.171875 0.921875 -6.203125 C 0.921875 -7.242188 1.050781 -8.160156 1.3125 -8.953125 C 1.582031 -9.753906 1.945312 -10.425781 2.40625 -10.96875 C 2.863281 -11.519531 3.398438 -11.9375 4.015625 -12.21875 C 4.628906 -12.507812 5.289062 -12.65625 6 -12.65625 C 6.457031 -12.65625 6.859375 -12.617188 7.203125 -12.546875 C 7.546875 -12.484375 7.835938 -12.40625 8.078125 -12.3125 C 8.328125 -12.226562 8.53125 -12.132812 8.6875 -12.03125 C 8.851562 -11.925781 8.976562 -11.847656 9.0625 -11.796875 L 8.515625 -10.421875 C 8.210938 -10.660156 7.847656 -10.851562 7.421875 -11 C 7.003906 -11.15625 6.5625 -11.234375 6.09375 -11.234375 C 5.59375 -11.234375 5.125 -11.113281 4.6875 -10.875 C 4.257812 -10.632812 3.890625 -10.296875 3.578125 -9.859375 C 3.273438 -9.421875 3.035156 -8.890625 2.859375 -8.265625 C 2.679688 -7.648438 2.59375 -6.960938 2.59375 -6.203125 C 2.59375 -5.453125 2.671875 -4.769531 2.828125 -4.15625 C 2.984375 -3.539062 3.207031 -3.015625 3.5 -2.578125 C 3.789062 -2.140625 4.148438 -1.796875 4.578125 -1.546875 C 5.015625 -1.304688 5.515625 -1.1875 6.078125 -1.1875 C 6.460938 -1.1875 6.757812 -1.210938 6.96875 -1.265625 C 7.1875 -1.316406 7.347656 -1.367188 7.453125 -1.421875 Z M 7.453125 -6.09375 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph0-12">
|
||||
<path style="stroke:none;" d="M 9.203125 -0.515625 C 8.734375 -0.253906 8.234375 -0.0625 7.703125 0.0625 C 7.179688 0.195312 6.617188 0.265625 6.015625 0.265625 C 5.285156 0.265625 4.609375 0.132812 3.984375 -0.125 C 3.367188 -0.382812 2.832031 -0.773438 2.375 -1.296875 C 1.925781 -1.828125 1.570312 -2.5 1.3125 -3.3125 C 1.050781 -4.132812 0.921875 -5.097656 0.921875 -6.203125 C 0.921875 -7.253906 1.054688 -8.179688 1.328125 -8.984375 C 1.597656 -9.785156 1.96875 -10.457031 2.4375 -11 C 2.90625 -11.539062 3.453125 -11.953125 4.078125 -12.234375 C 4.703125 -12.515625 5.367188 -12.65625 6.078125 -12.65625 C 6.566406 -12.65625 7.066406 -12.585938 7.578125 -12.453125 C 8.097656 -12.328125 8.601562 -12.109375 9.09375 -11.796875 L 8.625 -10.4375 C 7.738281 -10.945312 6.910156 -11.203125 6.140625 -11.203125 C 5.585938 -11.203125 5.09375 -11.082031 4.65625 -10.84375 C 4.226562 -10.613281 3.859375 -10.28125 3.546875 -9.84375 C 3.242188 -9.40625 3.007812 -8.878906 2.84375 -8.265625 C 2.675781 -7.648438 2.59375 -6.960938 2.59375 -6.203125 C 2.59375 -5.347656 2.679688 -4.609375 2.859375 -3.984375 C 3.046875 -3.359375 3.296875 -2.835938 3.609375 -2.421875 C 3.929688 -2.003906 4.316406 -1.695312 4.765625 -1.5 C 5.210938 -1.300781 5.695312 -1.203125 6.21875 -1.203125 C 6.601562 -1.203125 7.007812 -1.25 7.4375 -1.34375 C 7.863281 -1.445312 8.304688 -1.625 8.765625 -1.875 Z M 9.203125 -0.515625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-0">
|
||||
<path style="stroke:none;" d="M 0.59375 0 L 0.59375 -9 L 5.40625 -9 L 5.40625 0 Z M 4.796875 -0.59375 L 4.796875 -8.40625 L 1.203125 -8.40625 L 1.203125 -0.59375 Z M 4.796875 -0.59375 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-1">
|
||||
<path style="stroke:none;" d="M 2.515625 0 L 2.515625 -2.765625 C 2.023438 -3.554688 1.582031 -4.332031 1.1875 -5.09375 C 0.789062 -5.851562 0.445312 -6.628906 0.15625 -7.421875 L 1.265625 -7.421875 C 1.492188 -6.753906 1.757812 -6.113281 2.0625 -5.5 C 2.363281 -4.882812 2.6875 -4.253906 3.03125 -3.609375 C 3.394531 -4.285156 3.71875 -4.929688 4 -5.546875 C 4.28125 -6.160156 4.539062 -6.785156 4.78125 -7.421875 L 5.859375 -7.421875 C 5.554688 -6.640625 5.207031 -5.875 4.8125 -5.125 C 4.414062 -4.382812 3.976562 -3.601562 3.5 -2.78125 L 3.5 0 Z M 2.515625 0 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-2">
|
||||
<path style="stroke:none;" d="M 3 0.15625 C 2.5625 0.15625 2.1875 0.09375 1.875 -0.03125 C 1.570312 -0.164062 1.320312 -0.347656 1.125 -0.578125 C 0.9375 -0.804688 0.796875 -1.085938 0.703125 -1.421875 C 0.617188 -1.765625 0.578125 -2.144531 0.578125 -2.5625 L 0.578125 -7.421875 L 1.5625 -7.421875 L 1.5625 -2.65625 C 1.5625 -2.28125 1.59375 -1.96875 1.65625 -1.71875 C 1.726562 -1.46875 1.828125 -1.265625 1.953125 -1.109375 C 2.078125 -0.960938 2.222656 -0.859375 2.390625 -0.796875 C 2.566406 -0.734375 2.769531 -0.703125 3 -0.703125 C 3.226562 -0.703125 3.425781 -0.734375 3.59375 -0.796875 C 3.769531 -0.859375 3.921875 -0.960938 4.046875 -1.109375 C 4.171875 -1.265625 4.265625 -1.46875 4.328125 -1.71875 C 4.398438 -1.96875 4.4375 -2.28125 4.4375 -2.65625 L 4.4375 -7.421875 L 5.421875 -7.421875 L 5.421875 -2.5625 C 5.421875 -2.144531 5.375 -1.765625 5.28125 -1.421875 C 5.195312 -1.085938 5.054688 -0.804688 4.859375 -0.578125 C 4.671875 -0.347656 4.421875 -0.164062 4.109375 -0.03125 C 3.804688 0.09375 3.4375 0.15625 3 0.15625 Z M 3 0.15625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-3">
|
||||
<path style="stroke:none;" d="M 1.21875 -7.421875 C 1.320312 -6.921875 1.445312 -6.375 1.59375 -5.78125 C 1.738281 -5.1875 1.890625 -4.585938 2.046875 -3.984375 C 2.210938 -3.390625 2.378906 -2.820312 2.546875 -2.28125 C 2.722656 -1.738281 2.882812 -1.265625 3.03125 -0.859375 C 3.15625 -1.265625 3.300781 -1.742188 3.46875 -2.296875 C 3.644531 -2.847656 3.816406 -3.421875 3.984375 -4.015625 C 4.148438 -4.609375 4.304688 -5.203125 4.453125 -5.796875 C 4.609375 -6.390625 4.734375 -6.929688 4.828125 -7.421875 L 5.859375 -7.421875 C 5.796875 -7.109375 5.691406 -6.679688 5.546875 -6.140625 C 5.398438 -5.597656 5.226562 -4.992188 5.03125 -4.328125 C 4.832031 -3.660156 4.609375 -2.953125 4.359375 -2.203125 C 4.117188 -1.453125 3.863281 -0.71875 3.59375 0 L 2.375 0 C 2.125 -0.71875 1.878906 -1.445312 1.640625 -2.1875 C 1.410156 -2.9375 1.195312 -3.644531 1 -4.3125 C 0.800781 -4.976562 0.628906 -5.582031 0.484375 -6.125 C 0.335938 -6.675781 0.226562 -7.109375 0.15625 -7.421875 Z M 1.21875 -7.421875 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-4">
|
||||
<path style="stroke:none;" d=""/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-5">
|
||||
<path style="stroke:none;" d="M 5.515625 -3.71875 C 5.515625 -3.03125 5.425781 -2.445312 5.25 -1.96875 C 5.082031 -1.488281 4.847656 -1.097656 4.546875 -0.796875 C 4.253906 -0.492188 3.898438 -0.273438 3.484375 -0.140625 C 3.078125 -0.00390625 2.628906 0.0625 2.140625 0.0625 C 1.648438 0.0625 1.148438 0 0.640625 -0.125 L 0.640625 -7.3125 C 1.148438 -7.4375 1.648438 -7.5 2.140625 -7.5 C 2.628906 -7.5 3.078125 -7.429688 3.484375 -7.296875 C 3.898438 -7.160156 4.253906 -6.941406 4.546875 -6.640625 C 4.847656 -6.335938 5.082031 -5.941406 5.25 -5.453125 C 5.425781 -4.972656 5.515625 -4.394531 5.515625 -3.71875 Z M 1.625 -0.828125 C 1.832031 -0.804688 2.039062 -0.796875 2.25 -0.796875 C 2.601562 -0.796875 2.921875 -0.847656 3.203125 -0.953125 C 3.484375 -1.054688 3.71875 -1.226562 3.90625 -1.46875 C 4.101562 -1.707031 4.253906 -2.007812 4.359375 -2.375 C 4.460938 -2.75 4.515625 -3.195312 4.515625 -3.71875 C 4.515625 -4.726562 4.316406 -5.46875 3.921875 -5.9375 C 3.535156 -6.40625 2.960938 -6.640625 2.203125 -6.640625 C 2.097656 -6.640625 1.992188 -6.640625 1.890625 -6.640625 C 1.796875 -6.640625 1.707031 -6.628906 1.625 -6.609375 Z M 1.625 -0.828125 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-6">
|
||||
<path style="stroke:none;" d="M 5.515625 -2.78125 C 5.515625 -2.34375 5.453125 -1.945312 5.328125 -1.59375 C 5.203125 -1.238281 5.023438 -0.929688 4.796875 -0.671875 C 4.578125 -0.410156 4.3125 -0.210938 4 -0.078125 C 3.695312 0.0546875 3.359375 0.125 2.984375 0.125 C 2.628906 0.125 2.296875 0.0546875 1.984375 -0.078125 C 1.679688 -0.210938 1.414062 -0.410156 1.1875 -0.671875 C 0.96875 -0.929688 0.796875 -1.238281 0.671875 -1.59375 C 0.546875 -1.945312 0.484375 -2.34375 0.484375 -2.78125 C 0.484375 -3.21875 0.546875 -3.617188 0.671875 -3.984375 C 0.796875 -4.347656 0.96875 -4.65625 1.1875 -4.90625 C 1.414062 -5.15625 1.679688 -5.347656 1.984375 -5.484375 C 2.296875 -5.628906 2.628906 -5.703125 2.984375 -5.703125 C 3.359375 -5.703125 3.695312 -5.628906 4 -5.484375 C 4.3125 -5.347656 4.578125 -5.15625 4.796875 -4.90625 C 5.023438 -4.65625 5.203125 -4.347656 5.328125 -3.984375 C 5.453125 -3.617188 5.515625 -3.21875 5.515625 -2.78125 Z M 4.5 -2.78125 C 4.5 -3.414062 4.363281 -3.914062 4.09375 -4.28125 C 3.820312 -4.644531 3.453125 -4.828125 2.984375 -4.828125 C 2.523438 -4.828125 2.160156 -4.644531 1.890625 -4.28125 C 1.628906 -3.914062 1.5 -3.414062 1.5 -2.78125 C 1.5 -2.15625 1.628906 -1.660156 1.890625 -1.296875 C 2.160156 -0.929688 2.523438 -0.75 2.984375 -0.75 C 3.453125 -0.75 3.820312 -0.929688 4.09375 -1.296875 C 4.363281 -1.660156 4.5 -2.15625 4.5 -2.78125 Z M 4.5 -2.78125 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-7">
|
||||
<path style="stroke:none;" d="M 4.109375 0 C 3.992188 -0.269531 3.890625 -0.515625 3.796875 -0.734375 C 3.710938 -0.960938 3.628906 -1.1875 3.546875 -1.40625 C 3.460938 -1.632812 3.378906 -1.867188 3.296875 -2.109375 C 3.210938 -2.359375 3.113281 -2.640625 3 -2.953125 C 2.882812 -2.640625 2.78125 -2.359375 2.6875 -2.109375 C 2.601562 -1.867188 2.519531 -1.632812 2.4375 -1.40625 C 2.351562 -1.1875 2.265625 -0.960938 2.171875 -0.734375 C 2.085938 -0.515625 1.984375 -0.269531 1.859375 0 L 1.109375 0 C 0.890625 -0.976562 0.707031 -1.953125 0.5625 -2.921875 C 0.414062 -3.890625 0.304688 -4.769531 0.234375 -5.5625 L 1.15625 -5.5625 C 1.1875 -5.25 1.210938 -4.941406 1.234375 -4.640625 C 1.265625 -4.347656 1.300781 -4.035156 1.34375 -3.703125 C 1.382812 -3.378906 1.429688 -3.023438 1.484375 -2.640625 C 1.535156 -2.253906 1.59375 -1.820312 1.65625 -1.34375 C 1.78125 -1.664062 1.882812 -1.945312 1.96875 -2.1875 C 2.0625 -2.425781 2.144531 -2.648438 2.21875 -2.859375 C 2.289062 -3.078125 2.359375 -3.296875 2.421875 -3.515625 C 2.492188 -3.742188 2.570312 -4 2.65625 -4.28125 L 3.390625 -4.28125 C 3.472656 -4 3.546875 -3.742188 3.609375 -3.515625 C 3.671875 -3.296875 3.738281 -3.078125 3.8125 -2.859375 C 3.882812 -2.648438 3.957031 -2.425781 4.03125 -2.1875 C 4.113281 -1.945312 4.21875 -1.671875 4.34375 -1.359375 C 4.414062 -1.796875 4.476562 -2.203125 4.53125 -2.578125 C 4.59375 -2.953125 4.640625 -3.304688 4.671875 -3.640625 C 4.710938 -3.972656 4.75 -4.296875 4.78125 -4.609375 C 4.820312 -4.921875 4.851562 -5.238281 4.875 -5.5625 L 5.765625 -5.5625 C 5.734375 -5.164062 5.6875 -4.738281 5.625 -4.28125 C 5.570312 -3.820312 5.503906 -3.351562 5.421875 -2.875 C 5.335938 -2.394531 5.25 -1.910156 5.15625 -1.421875 C 5.0625 -0.929688 4.960938 -0.457031 4.859375 0 Z M 4.109375 0 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-8">
|
||||
<path style="stroke:none;" d="M 0.859375 -5.40625 C 1.210938 -5.5 1.566406 -5.566406 1.921875 -5.609375 C 2.273438 -5.660156 2.609375 -5.6875 2.921875 -5.6875 C 3.671875 -5.6875 4.234375 -5.492188 4.609375 -5.109375 C 4.992188 -4.722656 5.1875 -4.109375 5.1875 -3.265625 L 5.1875 0 L 4.203125 0 L 4.203125 -3.078125 C 4.203125 -3.441406 4.171875 -3.734375 4.109375 -3.953125 C 4.046875 -4.179688 3.953125 -4.359375 3.828125 -4.484375 C 3.710938 -4.609375 3.570312 -4.691406 3.40625 -4.734375 C 3.25 -4.785156 3.070312 -4.8125 2.875 -4.8125 C 2.71875 -4.8125 2.546875 -4.800781 2.359375 -4.78125 C 2.179688 -4.757812 2.007812 -4.734375 1.84375 -4.703125 L 1.84375 0 L 0.859375 0 Z M 0.859375 -5.40625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-9">
|
||||
<path style="stroke:none;" d="M 4.21875 -1.390625 C 4.21875 -1.585938 4.132812 -1.75 3.96875 -1.875 C 3.800781 -2.007812 3.59375 -2.125 3.34375 -2.21875 C 3.101562 -2.3125 2.835938 -2.40625 2.546875 -2.5 C 2.265625 -2.59375 2 -2.707031 1.75 -2.84375 C 1.507812 -2.976562 1.304688 -3.144531 1.140625 -3.34375 C 0.984375 -3.539062 0.90625 -3.800781 0.90625 -4.125 C 0.90625 -4.570312 1.082031 -4.945312 1.4375 -5.25 C 1.800781 -5.550781 2.375 -5.703125 3.15625 -5.703125 C 3.457031 -5.703125 3.769531 -5.675781 4.09375 -5.625 C 4.414062 -5.582031 4.695312 -5.523438 4.9375 -5.453125 L 4.75 -4.578125 C 4.6875 -4.609375 4.597656 -4.640625 4.484375 -4.671875 C 4.367188 -4.710938 4.238281 -4.742188 4.09375 -4.765625 C 3.957031 -4.796875 3.804688 -4.816406 3.640625 -4.828125 C 3.472656 -4.847656 3.316406 -4.859375 3.171875 -4.859375 C 2.304688 -4.859375 1.875 -4.625 1.875 -4.15625 C 1.875 -3.988281 1.953125 -3.84375 2.109375 -3.71875 C 2.273438 -3.601562 2.484375 -3.5 2.734375 -3.40625 C 2.984375 -3.3125 3.25 -3.210938 3.53125 -3.109375 C 3.820312 -3.015625 4.09375 -2.894531 4.34375 -2.75 C 4.59375 -2.601562 4.796875 -2.425781 4.953125 -2.21875 C 5.117188 -2.019531 5.203125 -1.765625 5.203125 -1.453125 C 5.203125 -0.953125 5.003906 -0.5625 4.609375 -0.28125 C 4.222656 -0.0078125 3.609375 0.125 2.765625 0.125 C 2.378906 0.125 2.023438 0.09375 1.703125 0.03125 C 1.378906 -0.03125 1.078125 -0.125 0.796875 -0.25 L 0.984375 -1.15625 C 1.265625 -1.019531 1.554688 -0.910156 1.859375 -0.828125 C 2.171875 -0.742188 2.503906 -0.703125 2.859375 -0.703125 C 3.765625 -0.703125 4.21875 -0.929688 4.21875 -1.390625 Z M 4.21875 -1.390625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-10">
|
||||
<path style="stroke:none;" d="M 0.59375 -2.765625 C 0.59375 -3.273438 0.671875 -3.710938 0.828125 -4.078125 C 0.984375 -4.441406 1.203125 -4.742188 1.484375 -4.984375 C 1.765625 -5.234375 2.09375 -5.414062 2.46875 -5.53125 C 2.84375 -5.644531 3.238281 -5.703125 3.65625 -5.703125 C 3.925781 -5.703125 4.195312 -5.679688 4.46875 -5.640625 C 4.738281 -5.609375 5.023438 -5.546875 5.328125 -5.453125 L 5.09375 -4.59375 C 4.832031 -4.6875 4.59375 -4.75 4.375 -4.78125 C 4.15625 -4.8125 3.929688 -4.828125 3.703125 -4.828125 C 3.421875 -4.828125 3.148438 -4.785156 2.890625 -4.703125 C 2.640625 -4.628906 2.414062 -4.507812 2.21875 -4.34375 C 2.03125 -4.1875 1.878906 -3.976562 1.765625 -3.71875 C 1.660156 -3.457031 1.609375 -3.140625 1.609375 -2.765625 C 1.609375 -2.421875 1.660156 -2.117188 1.765625 -1.859375 C 1.867188 -1.609375 2.015625 -1.398438 2.203125 -1.234375 C 2.390625 -1.078125 2.613281 -0.957031 2.875 -0.875 C 3.144531 -0.789062 3.4375 -0.75 3.75 -0.75 C 4.007812 -0.75 4.253906 -0.765625 4.484375 -0.796875 C 4.722656 -0.828125 4.984375 -0.890625 5.265625 -0.984375 L 5.40625 -0.15625 C 5.125 -0.0507812 4.835938 0.0195312 4.546875 0.0625 C 4.265625 0.101562 3.957031 0.125 3.625 0.125 C 3.175781 0.125 2.765625 0.0664062 2.390625 -0.046875 C 2.023438 -0.171875 1.707031 -0.351562 1.4375 -0.59375 C 1.164062 -0.832031 0.957031 -1.132812 0.8125 -1.5 C 0.664062 -1.863281 0.59375 -2.285156 0.59375 -2.765625 Z M 0.59375 -2.765625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-11">
|
||||
<path style="stroke:none;" d="M 3.0625 -0.703125 C 3.3125 -0.703125 3.53125 -0.707031 3.71875 -0.71875 C 3.914062 -0.738281 4.082031 -0.765625 4.21875 -0.796875 L 4.21875 -2.453125 C 4.082031 -2.492188 3.925781 -2.523438 3.75 -2.546875 C 3.570312 -2.566406 3.382812 -2.578125 3.1875 -2.578125 C 3 -2.578125 2.816406 -2.5625 2.640625 -2.53125 C 2.460938 -2.507812 2.304688 -2.460938 2.171875 -2.390625 C 2.035156 -2.316406 1.921875 -2.222656 1.828125 -2.109375 C 1.742188 -1.992188 1.703125 -1.847656 1.703125 -1.671875 C 1.703125 -1.304688 1.820312 -1.050781 2.0625 -0.90625 C 2.3125 -0.769531 2.644531 -0.703125 3.0625 -0.703125 Z M 2.96875 -5.703125 C 3.382812 -5.703125 3.734375 -5.648438 4.015625 -5.546875 C 4.296875 -5.441406 4.523438 -5.296875 4.703125 -5.109375 C 4.878906 -4.929688 5.003906 -4.707031 5.078125 -4.4375 C 5.148438 -4.175781 5.1875 -3.890625 5.1875 -3.578125 L 5.1875 -0.09375 C 4.957031 -0.0507812 4.648438 -0.00390625 4.265625 0.046875 C 3.890625 0.0976562 3.5 0.125 3.09375 0.125 C 2.789062 0.125 2.492188 0.0976562 2.203125 0.046875 C 1.921875 -0.00390625 1.664062 -0.09375 1.4375 -0.21875 C 1.21875 -0.351562 1.039062 -0.535156 0.90625 -0.765625 C 0.769531 -0.992188 0.703125 -1.289062 0.703125 -1.65625 C 0.703125 -1.976562 0.769531 -2.25 0.90625 -2.46875 C 1.039062 -2.6875 1.21875 -2.863281 1.4375 -3 C 1.664062 -3.132812 1.921875 -3.234375 2.203125 -3.296875 C 2.484375 -3.359375 2.769531 -3.390625 3.0625 -3.390625 C 3.445312 -3.390625 3.832031 -3.34375 4.21875 -3.25 L 4.21875 -3.53125 C 4.21875 -3.695312 4.195312 -3.859375 4.15625 -4.015625 C 4.125 -4.171875 4.054688 -4.3125 3.953125 -4.4375 C 3.847656 -4.5625 3.707031 -4.660156 3.53125 -4.734375 C 3.363281 -4.816406 3.144531 -4.859375 2.875 -4.859375 C 2.53125 -4.859375 2.226562 -4.832031 1.96875 -4.78125 C 1.71875 -4.738281 1.523438 -4.691406 1.390625 -4.640625 L 1.265625 -5.453125 C 1.398438 -5.523438 1.625 -5.582031 1.9375 -5.625 C 2.257812 -5.675781 2.601562 -5.703125 2.96875 -5.703125 Z M 2.96875 -5.703125 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-12">
|
||||
<path style="stroke:none;" d="M 4.0625 0.125 C 3.707031 0.125 3.410156 0.078125 3.171875 -0.015625 C 2.941406 -0.109375 2.757812 -0.25 2.625 -0.4375 C 2.488281 -0.632812 2.390625 -0.875 2.328125 -1.15625 C 2.273438 -1.4375 2.25 -1.765625 2.25 -2.140625 L 2.25 -7.421875 L 0.640625 -7.421875 L 0.640625 -8.25 L 3.234375 -8.25 L 3.234375 -2.140625 C 3.234375 -1.867188 3.25 -1.644531 3.28125 -1.46875 C 3.320312 -1.289062 3.378906 -1.144531 3.453125 -1.03125 C 3.535156 -0.925781 3.628906 -0.851562 3.734375 -0.8125 C 3.847656 -0.769531 3.984375 -0.75 4.140625 -0.75 C 4.367188 -0.75 4.582031 -0.773438 4.78125 -0.828125 C 4.988281 -0.890625 5.144531 -0.953125 5.25 -1.015625 L 5.40625 -0.1875 C 5.351562 -0.15625 5.28125 -0.117188 5.1875 -0.078125 C 5.101562 -0.046875 5 -0.015625 4.875 0.015625 C 4.757812 0.046875 4.628906 0.0703125 4.484375 0.09375 C 4.347656 0.113281 4.207031 0.125 4.0625 0.125 Z M 4.0625 0.125 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-13">
|
||||
<path style="stroke:none;" d="M 2.515625 -6.4375 C 2.304688 -6.4375 2.125 -6.503906 1.96875 -6.640625 C 1.8125 -6.785156 1.734375 -6.984375 1.734375 -7.234375 C 1.734375 -7.484375 1.8125 -7.679688 1.96875 -7.828125 C 2.125 -7.972656 2.304688 -8.046875 2.515625 -8.046875 C 2.722656 -8.046875 2.898438 -7.972656 3.046875 -7.828125 C 3.203125 -7.679688 3.28125 -7.484375 3.28125 -7.234375 C 3.28125 -6.984375 3.203125 -6.785156 3.046875 -6.640625 C 2.898438 -6.503906 2.722656 -6.4375 2.515625 -6.4375 Z M 2.25 -4.734375 L 0.640625 -4.734375 L 0.640625 -5.5625 L 3.234375 -5.5625 L 3.234375 -2.140625 C 3.234375 -1.585938 3.3125 -1.21875 3.46875 -1.03125 C 3.625 -0.84375 3.851562 -0.75 4.15625 -0.75 C 4.382812 -0.75 4.597656 -0.773438 4.796875 -0.828125 C 4.992188 -0.890625 5.144531 -0.953125 5.25 -1.015625 L 5.40625 -0.1875 C 5.351562 -0.15625 5.28125 -0.117188 5.1875 -0.078125 C 5.101562 -0.046875 5.003906 -0.015625 4.890625 0.015625 C 4.773438 0.046875 4.644531 0.0703125 4.5 0.09375 C 4.363281 0.113281 4.21875 0.125 4.0625 0.125 C 3.71875 0.125 3.425781 0.078125 3.1875 -0.015625 C 2.957031 -0.109375 2.769531 -0.25 2.625 -0.4375 C 2.488281 -0.632812 2.390625 -0.875 2.328125 -1.15625 C 2.273438 -1.4375 2.25 -1.765625 2.25 -2.140625 Z M 2.25 -4.734375 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-14">
|
||||
<path style="stroke:none;" d="M 4.15625 -0.515625 C 4.039062 -0.453125 3.863281 -0.382812 3.625 -0.3125 C 3.394531 -0.238281 3.128906 -0.203125 2.828125 -0.203125 C 2.503906 -0.203125 2.195312 -0.253906 1.90625 -0.359375 C 1.625 -0.472656 1.378906 -0.640625 1.171875 -0.859375 C 0.960938 -1.078125 0.796875 -1.351562 0.671875 -1.6875 C 0.546875 -2.03125 0.484375 -2.4375 0.484375 -2.90625 C 0.484375 -3.3125 0.539062 -3.679688 0.65625 -4.015625 C 0.769531 -4.359375 0.9375 -4.65625 1.15625 -4.90625 C 1.375 -5.15625 1.644531 -5.347656 1.96875 -5.484375 C 2.289062 -5.628906 2.65625 -5.703125 3.0625 -5.703125 C 3.539062 -5.703125 3.945312 -5.664062 4.28125 -5.59375 C 4.625 -5.53125 4.910156 -5.46875 5.140625 -5.40625 L 5.140625 -0.4375 C 5.140625 0.425781 4.921875 1.050781 4.484375 1.4375 C 4.054688 1.820312 3.398438 2.015625 2.515625 2.015625 C 2.160156 2.015625 1.835938 1.984375 1.546875 1.921875 C 1.253906 1.867188 0.992188 1.804688 0.765625 1.734375 L 0.953125 0.859375 C 1.160156 0.941406 1.394531 1.007812 1.65625 1.0625 C 1.925781 1.125 2.222656 1.15625 2.546875 1.15625 C 3.117188 1.15625 3.53125 1.035156 3.78125 0.796875 C 4.03125 0.566406 4.15625 0.191406 4.15625 -0.328125 Z M 4.15625 -4.6875 C 4.0625 -4.71875 3.925781 -4.75 3.75 -4.78125 C 3.582031 -4.8125 3.359375 -4.828125 3.078125 -4.828125 C 2.554688 -4.828125 2.160156 -4.648438 1.890625 -4.296875 C 1.628906 -3.941406 1.5 -3.472656 1.5 -2.890625 C 1.5 -2.566406 1.535156 -2.289062 1.609375 -2.0625 C 1.691406 -1.84375 1.796875 -1.65625 1.921875 -1.5 C 2.054688 -1.351562 2.207031 -1.242188 2.375 -1.171875 C 2.539062 -1.109375 2.722656 -1.078125 2.921875 -1.078125 C 3.160156 -1.078125 3.390625 -1.113281 3.609375 -1.1875 C 3.835938 -1.257812 4.019531 -1.34375 4.15625 -1.4375 Z M 4.15625 -4.6875 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-15">
|
||||
<path style="stroke:none;" d="M 2.8125 -0.703125 C 3.3125 -0.703125 3.691406 -0.796875 3.953125 -0.984375 C 4.222656 -1.171875 4.359375 -1.457031 4.359375 -1.84375 C 4.359375 -2.082031 4.304688 -2.28125 4.203125 -2.4375 C 4.109375 -2.601562 3.984375 -2.75 3.828125 -2.875 C 3.671875 -3 3.488281 -3.109375 3.28125 -3.203125 C 3.082031 -3.296875 2.878906 -3.378906 2.671875 -3.453125 C 2.429688 -3.546875 2.203125 -3.648438 1.984375 -3.765625 C 1.765625 -3.890625 1.566406 -4.03125 1.390625 -4.1875 C 1.222656 -4.351562 1.085938 -4.546875 0.984375 -4.765625 C 0.890625 -4.984375 0.84375 -5.238281 0.84375 -5.53125 C 0.84375 -6.175781 1.046875 -6.679688 1.453125 -7.046875 C 1.859375 -7.410156 2.425781 -7.59375 3.15625 -7.59375 C 3.351562 -7.59375 3.550781 -7.578125 3.75 -7.546875 C 3.945312 -7.523438 4.128906 -7.492188 4.296875 -7.453125 C 4.460938 -7.410156 4.609375 -7.359375 4.734375 -7.296875 C 4.867188 -7.242188 4.976562 -7.191406 5.0625 -7.140625 L 4.75 -6.3125 C 4.59375 -6.40625 4.375 -6.5 4.09375 -6.59375 C 3.8125 -6.695312 3.5 -6.75 3.15625 -6.75 C 2.789062 -6.75 2.476562 -6.65625 2.21875 -6.46875 C 1.957031 -6.289062 1.828125 -6.019531 1.828125 -5.65625 C 1.828125 -5.457031 1.863281 -5.285156 1.9375 -5.140625 C 2.007812 -4.992188 2.113281 -4.863281 2.25 -4.75 C 2.382812 -4.644531 2.535156 -4.546875 2.703125 -4.453125 C 2.878906 -4.367188 3.070312 -4.285156 3.28125 -4.203125 C 3.59375 -4.078125 3.875 -3.945312 4.125 -3.8125 C 4.375 -3.6875 4.585938 -3.535156 4.765625 -3.359375 C 4.953125 -3.179688 5.09375 -2.972656 5.1875 -2.734375 C 5.289062 -2.492188 5.34375 -2.203125 5.34375 -1.859375 C 5.34375 -1.210938 5.125 -0.710938 4.6875 -0.359375 C 4.25 -0.015625 3.625 0.15625 2.8125 0.15625 C 2.539062 0.15625 2.289062 0.132812 2.0625 0.09375 C 1.832031 0.0625 1.625 0.0195312 1.4375 -0.03125 C 1.257812 -0.09375 1.101562 -0.148438 0.96875 -0.203125 C 0.832031 -0.253906 0.726562 -0.304688 0.65625 -0.359375 L 0.953125 -1.171875 C 1.117188 -1.085938 1.359375 -0.988281 1.671875 -0.875 C 1.984375 -0.757812 2.363281 -0.703125 2.8125 -0.703125 Z M 2.8125 -0.703125 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-16">
|
||||
<path style="stroke:none;" d="M 3.109375 -5.703125 C 3.859375 -5.703125 4.4375 -5.46875 4.84375 -5 C 5.25 -4.53125 5.453125 -3.820312 5.453125 -2.875 L 5.453125 -2.515625 L 1.46875 -2.515625 C 1.507812 -1.941406 1.703125 -1.503906 2.046875 -1.203125 C 2.390625 -0.898438 2.867188 -0.75 3.484375 -0.75 C 3.835938 -0.75 4.132812 -0.773438 4.375 -0.828125 C 4.625 -0.890625 4.8125 -0.953125 4.9375 -1.015625 L 5.078125 -0.1875 C 4.953125 -0.113281 4.734375 -0.046875 4.421875 0.015625 C 4.109375 0.0859375 3.757812 0.125 3.375 0.125 C 2.894531 0.125 2.472656 0.0507812 2.109375 -0.09375 C 1.742188 -0.238281 1.441406 -0.4375 1.203125 -0.6875 C 0.960938 -0.945312 0.78125 -1.253906 0.65625 -1.609375 C 0.539062 -1.960938 0.484375 -2.347656 0.484375 -2.765625 C 0.484375 -3.265625 0.554688 -3.695312 0.703125 -4.0625 C 0.859375 -4.4375 1.0625 -4.742188 1.3125 -4.984375 C 1.5625 -5.222656 1.835938 -5.398438 2.140625 -5.515625 C 2.453125 -5.640625 2.773438 -5.703125 3.109375 -5.703125 Z M 4.453125 -3.328125 C 4.453125 -3.796875 4.328125 -4.164062 4.078125 -4.4375 C 3.828125 -4.71875 3.5 -4.859375 3.09375 -4.859375 C 2.863281 -4.859375 2.65625 -4.8125 2.46875 -4.71875 C 2.28125 -4.632812 2.117188 -4.519531 1.984375 -4.375 C 1.847656 -4.226562 1.738281 -4.0625 1.65625 -3.875 C 1.570312 -3.695312 1.519531 -3.515625 1.5 -3.328125 Z M 4.453125 -3.328125 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-17">
|
||||
<path style="stroke:none;" d="M 4.15625 -4.390625 C 4.039062 -4.492188 3.875 -4.59375 3.65625 -4.6875 C 3.445312 -4.78125 3.222656 -4.828125 2.984375 -4.828125 C 2.722656 -4.828125 2.5 -4.773438 2.3125 -4.671875 C 2.125 -4.566406 1.96875 -4.421875 1.84375 -4.234375 C 1.726562 -4.054688 1.640625 -3.84375 1.578125 -3.59375 C 1.523438 -3.34375 1.5 -3.070312 1.5 -2.78125 C 1.5 -2.132812 1.648438 -1.632812 1.953125 -1.28125 C 2.253906 -0.925781 2.648438 -0.75 3.140625 -0.75 C 3.390625 -0.75 3.597656 -0.757812 3.765625 -0.78125 C 3.941406 -0.8125 4.070312 -0.835938 4.15625 -0.859375 Z M 4.15625 -8.140625 L 5.140625 -8.3125 L 5.140625 -0.15625 C 4.929688 -0.09375 4.65625 -0.03125 4.3125 0.03125 C 3.976562 0.09375 3.585938 0.125 3.140625 0.125 C 2.742188 0.125 2.378906 0.0546875 2.046875 -0.078125 C 1.722656 -0.210938 1.441406 -0.40625 1.203125 -0.65625 C 0.972656 -0.90625 0.796875 -1.207031 0.671875 -1.5625 C 0.546875 -1.925781 0.484375 -2.332031 0.484375 -2.78125 C 0.484375 -3.21875 0.535156 -3.613281 0.640625 -3.96875 C 0.742188 -4.320312 0.898438 -4.625 1.109375 -4.875 C 1.316406 -5.132812 1.566406 -5.335938 1.859375 -5.484375 C 2.148438 -5.628906 2.488281 -5.703125 2.875 -5.703125 C 3.164062 -5.703125 3.421875 -5.664062 3.640625 -5.59375 C 3.867188 -5.519531 4.039062 -5.441406 4.15625 -5.359375 Z M 4.15625 -8.140625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-18">
|
||||
<path style="stroke:none;" d="M 1.28125 0 L 1.28125 -5.265625 C 2.101562 -5.546875 2.925781 -5.6875 3.75 -5.6875 C 4.007812 -5.6875 4.253906 -5.675781 4.484375 -5.65625 C 4.722656 -5.632812 4.976562 -5.59375 5.25 -5.53125 L 5.078125 -4.65625 C 4.816406 -4.726562 4.585938 -4.773438 4.390625 -4.796875 C 4.203125 -4.816406 3.988281 -4.828125 3.75 -4.828125 C 3.269531 -4.828125 2.773438 -4.757812 2.265625 -4.625 L 2.265625 0 Z M 1.28125 0 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-19">
|
||||
<path style="stroke:none;" d="M 0.609375 1.046875 C 0.679688 1.085938 0.78125 1.117188 0.90625 1.140625 C 1.039062 1.160156 1.164062 1.171875 1.28125 1.171875 C 1.675781 1.171875 1.984375 1.082031 2.203125 0.90625 C 2.421875 0.738281 2.625 0.460938 2.8125 0.078125 C 2.363281 -0.773438 1.941406 -1.6875 1.546875 -2.65625 C 1.148438 -3.625 0.828125 -4.59375 0.578125 -5.5625 L 1.65625 -5.5625 C 1.738281 -5.25 1.832031 -4.90625 1.9375 -4.53125 C 2.039062 -4.15625 2.160156 -3.769531 2.296875 -3.375 C 2.441406 -2.988281 2.585938 -2.597656 2.734375 -2.203125 C 2.890625 -1.804688 3.054688 -1.425781 3.234375 -1.0625 C 3.367188 -1.4375 3.488281 -1.800781 3.59375 -2.15625 C 3.707031 -2.519531 3.8125 -2.882812 3.90625 -3.25 C 4.007812 -3.613281 4.109375 -3.984375 4.203125 -4.359375 C 4.296875 -4.742188 4.394531 -5.144531 4.5 -5.5625 L 5.53125 -5.5625 C 5.269531 -4.53125 4.984375 -3.523438 4.671875 -2.546875 C 4.359375 -1.566406 4.019531 -0.660156 3.65625 0.171875 C 3.519531 0.484375 3.375 0.753906 3.21875 0.984375 C 3.0625 1.222656 2.890625 1.414062 2.703125 1.5625 C 2.523438 1.71875 2.316406 1.832031 2.078125 1.90625 C 1.847656 1.976562 1.585938 2.015625 1.296875 2.015625 C 1.140625 2.015625 0.972656 1.992188 0.796875 1.953125 C 0.617188 1.910156 0.5 1.875 0.4375 1.84375 Z M 0.609375 1.046875 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-20">
|
||||
<path style="stroke:none;" d="M 0.34375 -3.71875 C 0.34375 -4.382812 0.40625 -4.960938 0.53125 -5.453125 C 0.664062 -5.941406 0.847656 -6.34375 1.078125 -6.65625 C 1.304688 -6.96875 1.582031 -7.203125 1.90625 -7.359375 C 2.238281 -7.515625 2.601562 -7.59375 3 -7.59375 C 3.394531 -7.59375 3.753906 -7.515625 4.078125 -7.359375 C 4.410156 -7.203125 4.691406 -6.96875 4.921875 -6.65625 C 5.148438 -6.34375 5.328125 -5.941406 5.453125 -5.453125 C 5.585938 -4.960938 5.65625 -4.382812 5.65625 -3.71875 C 5.65625 -3.050781 5.585938 -2.472656 5.453125 -1.984375 C 5.328125 -1.503906 5.148438 -1.101562 4.921875 -0.78125 C 4.691406 -0.457031 4.410156 -0.21875 4.078125 -0.0625 C 3.753906 0.0820312 3.394531 0.15625 3 0.15625 C 2.601562 0.15625 2.238281 0.0820312 1.90625 -0.0625 C 1.582031 -0.21875 1.304688 -0.457031 1.078125 -0.78125 C 0.847656 -1.101562 0.664062 -1.503906 0.53125 -1.984375 C 0.40625 -2.472656 0.34375 -3.050781 0.34375 -3.71875 Z M 1.359375 -3.71875 C 1.359375 -2.738281 1.488281 -1.988281 1.75 -1.46875 C 2.007812 -0.957031 2.414062 -0.703125 2.96875 -0.703125 C 3.53125 -0.703125 3.953125 -0.957031 4.234375 -1.46875 C 4.515625 -1.988281 4.65625 -2.738281 4.65625 -3.71875 C 4.65625 -4.695312 4.515625 -5.445312 4.234375 -5.96875 C 3.953125 -6.488281 3.53125 -6.75 2.96875 -6.75 C 2.414062 -6.75 2.007812 -6.488281 1.75 -5.96875 C 1.488281 -5.445312 1.359375 -4.695312 1.359375 -3.71875 Z M 1.359375 -3.71875 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-21">
|
||||
<path style="stroke:none;" d="M 5.140625 -0.15625 C 4.929688 -0.101562 4.644531 -0.046875 4.28125 0.015625 C 3.925781 0.0859375 3.507812 0.125 3.03125 0.125 C 2.613281 0.125 2.265625 0.0625 1.984375 -0.0625 C 1.703125 -0.1875 1.472656 -0.363281 1.296875 -0.59375 C 1.117188 -0.820312 0.992188 -1.09375 0.921875 -1.40625 C 0.847656 -1.71875 0.8125 -2.0625 0.8125 -2.4375 L 0.8125 -5.5625 L 1.796875 -5.5625 L 1.796875 -2.65625 C 1.796875 -1.96875 1.894531 -1.476562 2.09375 -1.1875 C 2.300781 -0.894531 2.644531 -0.75 3.125 -0.75 C 3.226562 -0.75 3.332031 -0.753906 3.4375 -0.765625 C 3.550781 -0.773438 3.65625 -0.785156 3.75 -0.796875 C 3.851562 -0.804688 3.9375 -0.816406 4 -0.828125 C 4.070312 -0.847656 4.125 -0.859375 4.15625 -0.859375 L 4.15625 -5.5625 L 5.140625 -5.5625 Z M 5.140625 -0.15625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-22">
|
||||
<path style="stroke:none;" d="M 2.921875 -5.5625 L 5.265625 -5.5625 L 5.265625 -4.734375 L 2.921875 -4.734375 L 2.921875 -2.140625 C 2.921875 -1.867188 2.9375 -1.644531 2.96875 -1.46875 C 3.007812 -1.289062 3.078125 -1.144531 3.171875 -1.03125 C 3.265625 -0.925781 3.382812 -0.851562 3.53125 -0.8125 C 3.675781 -0.769531 3.851562 -0.75 4.0625 -0.75 C 4.34375 -0.75 4.570312 -0.773438 4.75 -0.828125 C 4.925781 -0.878906 5.09375 -0.941406 5.25 -1.015625 L 5.40625 -0.1875 C 5.289062 -0.132812 5.109375 -0.0703125 4.859375 0 C 4.617188 0.0820312 4.316406 0.125 3.953125 0.125 C 3.546875 0.125 3.207031 0.078125 2.9375 -0.015625 C 2.675781 -0.109375 2.46875 -0.25 2.3125 -0.4375 C 2.164062 -0.632812 2.066406 -0.875 2.015625 -1.15625 C 1.960938 -1.4375 1.9375 -1.765625 1.9375 -2.140625 L 1.9375 -4.734375 L 0.75 -4.734375 L 0.75 -5.5625 L 1.9375 -5.5625 L 1.9375 -7.125 L 2.921875 -7.296875 Z M 2.921875 -5.5625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-23">
|
||||
<path style="stroke:none;" d="M 4.5 -2.765625 C 4.5 -3.421875 4.347656 -3.925781 4.046875 -4.28125 C 3.742188 -4.632812 3.347656 -4.8125 2.859375 -4.8125 C 2.585938 -4.8125 2.375 -4.796875 2.21875 -4.765625 C 2.0625 -4.742188 1.9375 -4.71875 1.84375 -4.6875 L 1.84375 -1.171875 C 1.957031 -1.066406 2.117188 -0.96875 2.328125 -0.875 C 2.546875 -0.789062 2.773438 -0.75 3.015625 -0.75 C 3.273438 -0.75 3.5 -0.800781 3.6875 -0.90625 C 3.875 -1.007812 4.023438 -1.148438 4.140625 -1.328125 C 4.265625 -1.515625 4.351562 -1.726562 4.40625 -1.96875 C 4.46875 -2.21875 4.5 -2.484375 4.5 -2.765625 Z M 5.515625 -2.765625 C 5.515625 -2.347656 5.460938 -1.957031 5.359375 -1.59375 C 5.253906 -1.238281 5.097656 -0.929688 4.890625 -0.671875 C 4.679688 -0.421875 4.429688 -0.222656 4.140625 -0.078125 C 3.847656 0.0546875 3.507812 0.125 3.125 0.125 C 2.832031 0.125 2.570312 0.0859375 2.34375 0.015625 C 2.125 -0.046875 1.957031 -0.125 1.84375 -0.21875 L 1.84375 1.984375 L 0.859375 1.984375 L 0.859375 -5.40625 C 1.066406 -5.46875 1.34375 -5.53125 1.6875 -5.59375 C 2.03125 -5.65625 2.421875 -5.6875 2.859375 -5.6875 C 3.253906 -5.6875 3.613281 -5.617188 3.9375 -5.484375 C 4.269531 -5.347656 4.550781 -5.15625 4.78125 -4.90625 C 5.019531 -4.65625 5.203125 -4.347656 5.328125 -3.984375 C 5.453125 -3.617188 5.515625 -3.210938 5.515625 -2.765625 Z M 5.515625 -2.765625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph1-24">
|
||||
<path style="stroke:none;" d="M 3.015625 -3.734375 L 4.15625 -7.421875 L 5.09375 -7.421875 C 5.25 -6.253906 5.359375 -5.054688 5.421875 -3.828125 C 5.492188 -2.609375 5.554688 -1.332031 5.609375 0 L 4.65625 0 C 4.644531 -0.425781 4.632812 -0.890625 4.625 -1.390625 C 4.625 -1.898438 4.613281 -2.421875 4.59375 -2.953125 C 4.582031 -3.492188 4.570312 -4.039062 4.5625 -4.59375 C 4.550781 -5.144531 4.539062 -5.679688 4.53125 -6.203125 L 3.4375 -2.8125 L 2.578125 -2.8125 L 1.46875 -6.203125 C 1.46875 -5.679688 1.457031 -5.144531 1.4375 -4.59375 C 1.425781 -4.050781 1.414062 -3.507812 1.40625 -2.96875 C 1.394531 -2.425781 1.382812 -1.898438 1.375 -1.390625 C 1.363281 -0.890625 1.351562 -0.425781 1.34375 0 L 0.390625 0 C 0.410156 -0.601562 0.4375 -1.222656 0.46875 -1.859375 C 0.5 -2.503906 0.535156 -3.144531 0.578125 -3.78125 C 0.617188 -4.414062 0.671875 -5.039062 0.734375 -5.65625 C 0.796875 -6.269531 0.863281 -6.859375 0.9375 -7.421875 L 1.84375 -7.421875 Z M 3.015625 -3.734375 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-0">
|
||||
<path style="stroke:none;" d="M 0.640625 2.296875 L 0.640625 -9.171875 L 7.140625 -9.171875 L 7.140625 2.296875 Z M 1.375 1.578125 L 6.421875 1.578125 L 6.421875 -8.4375 L 1.375 -8.4375 Z M 1.375 1.578125 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-1">
|
||||
<path style="stroke:none;" d="M 6.34375 -6.84375 L 6.34375 -5.75 C 6.007812 -5.925781 5.675781 -6.0625 5.34375 -6.15625 C 5.007812 -6.25 4.675781 -6.296875 4.34375 -6.296875 C 3.582031 -6.296875 2.992188 -6.050781 2.578125 -5.5625 C 2.160156 -5.082031 1.953125 -4.410156 1.953125 -3.546875 C 1.953125 -2.679688 2.160156 -2.007812 2.578125 -1.53125 C 2.992188 -1.050781 3.582031 -0.8125 4.34375 -0.8125 C 4.675781 -0.8125 5.007812 -0.851562 5.34375 -0.9375 C 5.675781 -1.03125 6.007812 -1.171875 6.34375 -1.359375 L 6.34375 -0.265625 C 6.019531 -0.117188 5.679688 -0.0078125 5.328125 0.0625 C 4.984375 0.144531 4.613281 0.1875 4.21875 0.1875 C 3.144531 0.1875 2.289062 -0.144531 1.65625 -0.8125 C 1.03125 -1.488281 0.71875 -2.398438 0.71875 -3.546875 C 0.71875 -4.703125 1.035156 -5.613281 1.671875 -6.28125 C 2.304688 -6.945312 3.179688 -7.28125 4.296875 -7.28125 C 4.648438 -7.28125 5 -7.242188 5.34375 -7.171875 C 5.6875 -7.097656 6.019531 -6.988281 6.34375 -6.84375 Z M 6.34375 -6.84375 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-2">
|
||||
<path style="stroke:none;" d="M 5.34375 -6.015625 C 5.207031 -6.085938 5.0625 -6.140625 4.90625 -6.171875 C 4.757812 -6.210938 4.59375 -6.234375 4.40625 -6.234375 C 3.75 -6.234375 3.242188 -6.019531 2.890625 -5.59375 C 2.535156 -5.164062 2.359375 -4.550781 2.359375 -3.75 L 2.359375 0 L 1.1875 0 L 1.1875 -7.109375 L 2.359375 -7.109375 L 2.359375 -6 C 2.597656 -6.4375 2.914062 -6.757812 3.3125 -6.96875 C 3.707031 -7.175781 4.1875 -7.28125 4.75 -7.28125 C 4.832031 -7.28125 4.921875 -7.273438 5.015625 -7.265625 C 5.109375 -7.253906 5.21875 -7.238281 5.34375 -7.21875 Z M 5.34375 -6.015625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-3">
|
||||
<path style="stroke:none;" d="M 3.984375 -6.296875 C 3.359375 -6.296875 2.863281 -6.050781 2.5 -5.5625 C 2.132812 -5.070312 1.953125 -4.398438 1.953125 -3.546875 C 1.953125 -2.691406 2.128906 -2.019531 2.484375 -1.53125 C 2.847656 -1.050781 3.347656 -0.8125 3.984375 -0.8125 C 4.597656 -0.8125 5.085938 -1.054688 5.453125 -1.546875 C 5.816406 -2.035156 6 -2.703125 6 -3.546875 C 6 -4.390625 5.816406 -5.054688 5.453125 -5.546875 C 5.085938 -6.046875 4.597656 -6.296875 3.984375 -6.296875 Z M 3.984375 -7.28125 C 4.992188 -7.28125 5.789062 -6.945312 6.375 -6.28125 C 6.957031 -5.625 7.25 -4.710938 7.25 -3.546875 C 7.25 -2.378906 6.957031 -1.460938 6.375 -0.796875 C 5.789062 -0.140625 4.992188 0.1875 3.984375 0.1875 C 2.960938 0.1875 2.160156 -0.140625 1.578125 -0.796875 C 1.003906 -1.460938 0.71875 -2.378906 0.71875 -3.546875 C 0.71875 -4.710938 1.003906 -5.625 1.578125 -6.28125 C 2.160156 -6.945312 2.960938 -7.28125 3.984375 -7.28125 Z M 3.984375 -7.28125 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-4">
|
||||
<path style="stroke:none;" d="M 2.359375 -1.0625 L 2.359375 2.703125 L 1.1875 2.703125 L 1.1875 -7.109375 L 2.359375 -7.109375 L 2.359375 -6.03125 C 2.597656 -6.457031 2.90625 -6.769531 3.28125 -6.96875 C 3.65625 -7.175781 4.101562 -7.28125 4.625 -7.28125 C 5.488281 -7.28125 6.191406 -6.9375 6.734375 -6.25 C 7.273438 -5.5625 7.546875 -4.660156 7.546875 -3.546875 C 7.546875 -2.429688 7.273438 -1.53125 6.734375 -0.84375 C 6.191406 -0.15625 5.488281 0.1875 4.625 0.1875 C 4.101562 0.1875 3.65625 0.0820312 3.28125 -0.125 C 2.90625 -0.332031 2.597656 -0.644531 2.359375 -1.0625 Z M 6.328125 -3.546875 C 6.328125 -4.410156 6.148438 -5.082031 5.796875 -5.5625 C 5.441406 -6.050781 4.957031 -6.296875 4.34375 -6.296875 C 3.726562 -6.296875 3.242188 -6.050781 2.890625 -5.5625 C 2.535156 -5.082031 2.359375 -4.410156 2.359375 -3.546875 C 2.359375 -2.691406 2.535156 -2.019531 2.890625 -1.53125 C 3.242188 -1.039062 3.726562 -0.796875 4.34375 -0.796875 C 4.957031 -0.796875 5.441406 -1.039062 5.796875 -1.53125 C 6.148438 -2.019531 6.328125 -2.691406 6.328125 -3.546875 Z M 6.328125 -3.546875 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-5">
|
||||
<path style="stroke:none;" d="M 5.75 -6.90625 L 5.75 -5.796875 C 5.425781 -5.960938 5.085938 -6.085938 4.734375 -6.171875 C 4.378906 -6.253906 4.007812 -6.296875 3.625 -6.296875 C 3.039062 -6.296875 2.601562 -6.207031 2.3125 -6.03125 C 2.03125 -5.851562 1.890625 -5.585938 1.890625 -5.234375 C 1.890625 -4.960938 1.988281 -4.75 2.1875 -4.59375 C 2.394531 -4.445312 2.816406 -4.300781 3.453125 -4.15625 L 3.84375 -4.0625 C 4.675781 -3.882812 5.265625 -3.632812 5.609375 -3.3125 C 5.960938 -2.988281 6.140625 -2.539062 6.140625 -1.96875 C 6.140625 -1.300781 5.878906 -0.773438 5.359375 -0.390625 C 4.835938 -0.00390625 4.117188 0.1875 3.203125 0.1875 C 2.816406 0.1875 2.414062 0.148438 2 0.078125 C 1.59375 0.00390625 1.160156 -0.109375 0.703125 -0.265625 L 0.703125 -1.46875 C 1.140625 -1.238281 1.566406 -1.066406 1.984375 -0.953125 C 2.398438 -0.847656 2.8125 -0.796875 3.21875 -0.796875 C 3.769531 -0.796875 4.191406 -0.890625 4.484375 -1.078125 C 4.785156 -1.265625 4.9375 -1.53125 4.9375 -1.875 C 4.9375 -2.1875 4.828125 -2.425781 4.609375 -2.59375 C 4.398438 -2.769531 3.9375 -2.9375 3.21875 -3.09375 L 2.8125 -3.1875 C 2.082031 -3.34375 1.554688 -3.578125 1.234375 -3.890625 C 0.910156 -4.203125 0.75 -4.632812 0.75 -5.1875 C 0.75 -5.851562 0.984375 -6.367188 1.453125 -6.734375 C 1.929688 -7.097656 2.609375 -7.28125 3.484375 -7.28125 C 3.910156 -7.28125 4.316406 -7.25 4.703125 -7.1875 C 5.085938 -7.125 5.4375 -7.03125 5.75 -6.90625 Z M 5.75 -6.90625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-6">
|
||||
<path style="stroke:none;" d="M 4.453125 -3.578125 C 3.515625 -3.578125 2.863281 -3.46875 2.5 -3.25 C 2.132812 -3.03125 1.953125 -2.660156 1.953125 -2.140625 C 1.953125 -1.734375 2.085938 -1.40625 2.359375 -1.15625 C 2.628906 -0.914062 3 -0.796875 3.46875 -0.796875 C 4.113281 -0.796875 4.632812 -1.023438 5.03125 -1.484375 C 5.425781 -1.941406 5.625 -2.550781 5.625 -3.3125 L 5.625 -3.578125 Z M 6.78125 -4.0625 L 6.78125 0 L 5.625 0 L 5.625 -1.078125 C 5.351562 -0.648438 5.019531 -0.332031 4.625 -0.125 C 4.226562 0.0820312 3.738281 0.1875 3.15625 0.1875 C 2.425781 0.1875 1.847656 -0.015625 1.421875 -0.421875 C 0.992188 -0.835938 0.78125 -1.382812 0.78125 -2.0625 C 0.78125 -2.863281 1.046875 -3.46875 1.578125 -3.875 C 2.117188 -4.28125 2.921875 -4.484375 3.984375 -4.484375 L 5.625 -4.484375 L 5.625 -4.609375 C 5.625 -5.140625 5.445312 -5.550781 5.09375 -5.84375 C 4.738281 -6.144531 4.238281 -6.296875 3.59375 -6.296875 C 3.1875 -6.296875 2.789062 -6.242188 2.40625 -6.140625 C 2.019531 -6.046875 1.648438 -5.898438 1.296875 -5.703125 L 1.296875 -6.78125 C 1.722656 -6.945312 2.140625 -7.070312 2.546875 -7.15625 C 2.953125 -7.238281 3.34375 -7.28125 3.71875 -7.28125 C 4.75 -7.28125 5.515625 -7.015625 6.015625 -6.484375 C 6.523438 -5.953125 6.78125 -5.144531 6.78125 -4.0625 Z M 6.78125 -4.0625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-7">
|
||||
<path style="stroke:none;" d="M 1.21875 -9.875 L 2.390625 -9.875 L 2.390625 0 L 1.21875 0 Z M 1.21875 -9.875 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-8">
|
||||
<path style="stroke:none;" d="M 7.3125 -3.84375 L 7.3125 -3.28125 L 1.9375 -3.28125 C 1.988281 -2.46875 2.226562 -1.851562 2.65625 -1.4375 C 3.09375 -1.019531 3.695312 -0.8125 4.46875 -0.8125 C 4.914062 -0.8125 5.347656 -0.863281 5.765625 -0.96875 C 6.191406 -1.082031 6.613281 -1.25 7.03125 -1.46875 L 7.03125 -0.359375 C 6.613281 -0.179688 6.179688 -0.046875 5.734375 0.046875 C 5.296875 0.140625 4.851562 0.1875 4.40625 0.1875 C 3.269531 0.1875 2.367188 -0.140625 1.703125 -0.796875 C 1.046875 -1.460938 0.71875 -2.359375 0.71875 -3.484375 C 0.71875 -4.648438 1.03125 -5.570312 1.65625 -6.25 C 2.289062 -6.9375 3.140625 -7.28125 4.203125 -7.28125 C 5.160156 -7.28125 5.914062 -6.972656 6.46875 -6.359375 C 7.03125 -5.742188 7.3125 -4.90625 7.3125 -3.84375 Z M 6.140625 -4.1875 C 6.128906 -4.820312 5.945312 -5.332031 5.59375 -5.71875 C 5.25 -6.101562 4.789062 -6.296875 4.21875 -6.296875 C 3.5625 -6.296875 3.035156 -6.109375 2.640625 -5.734375 C 2.253906 -5.367188 2.03125 -4.851562 1.96875 -4.1875 Z M 6.140625 -4.1875 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-9">
|
||||
<path style="stroke:none;" d="M 6.328125 -3.546875 C 6.328125 -4.410156 6.148438 -5.082031 5.796875 -5.5625 C 5.441406 -6.050781 4.957031 -6.296875 4.34375 -6.296875 C 3.726562 -6.296875 3.242188 -6.050781 2.890625 -5.5625 C 2.535156 -5.082031 2.359375 -4.410156 2.359375 -3.546875 C 2.359375 -2.691406 2.535156 -2.019531 2.890625 -1.53125 C 3.242188 -1.039062 3.726562 -0.796875 4.34375 -0.796875 C 4.957031 -0.796875 5.441406 -1.039062 5.796875 -1.53125 C 6.148438 -2.019531 6.328125 -2.691406 6.328125 -3.546875 Z M 2.359375 -6.03125 C 2.597656 -6.457031 2.90625 -6.769531 3.28125 -6.96875 C 3.65625 -7.175781 4.101562 -7.28125 4.625 -7.28125 C 5.488281 -7.28125 6.191406 -6.9375 6.734375 -6.25 C 7.273438 -5.5625 7.546875 -4.660156 7.546875 -3.546875 C 7.546875 -2.429688 7.273438 -1.53125 6.734375 -0.84375 C 6.191406 -0.15625 5.488281 0.1875 4.625 0.1875 C 4.101562 0.1875 3.65625 0.0820312 3.28125 -0.125 C 2.90625 -0.332031 2.597656 -0.644531 2.359375 -1.0625 L 2.359375 0 L 1.1875 0 L 1.1875 -9.875 L 2.359375 -9.875 Z M 2.359375 -6.03125 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-10">
|
||||
<path style="stroke:none;" d="M 1.21875 -7.109375 L 2.390625 -7.109375 L 2.390625 0 L 1.21875 0 Z M 1.21875 -9.875 L 2.390625 -9.875 L 2.390625 -8.390625 L 1.21875 -8.390625 Z M 1.21875 -9.875 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-11">
|
||||
<path style="stroke:none;" d="M 7.140625 -4.296875 L 7.140625 0 L 5.96875 0 L 5.96875 -4.25 C 5.96875 -4.925781 5.835938 -5.429688 5.578125 -5.765625 C 5.316406 -6.097656 4.921875 -6.265625 4.390625 -6.265625 C 3.765625 -6.265625 3.269531 -6.0625 2.90625 -5.65625 C 2.539062 -5.257812 2.359375 -4.710938 2.359375 -4.015625 L 2.359375 0 L 1.1875 0 L 1.1875 -7.109375 L 2.359375 -7.109375 L 2.359375 -6 C 2.640625 -6.425781 2.96875 -6.742188 3.34375 -6.953125 C 3.71875 -7.171875 4.15625 -7.28125 4.65625 -7.28125 C 5.46875 -7.28125 6.082031 -7.023438 6.5 -6.515625 C 6.925781 -6.015625 7.140625 -5.273438 7.140625 -4.296875 Z M 7.140625 -4.296875 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-12">
|
||||
<path style="stroke:none;" d="M 5.90625 -3.640625 C 5.90625 -4.484375 5.726562 -5.132812 5.375 -5.59375 C 5.03125 -6.0625 4.539062 -6.296875 3.90625 -6.296875 C 3.28125 -6.296875 2.789062 -6.0625 2.4375 -5.59375 C 2.09375 -5.132812 1.921875 -4.484375 1.921875 -3.640625 C 1.921875 -2.796875 2.09375 -2.140625 2.4375 -1.671875 C 2.789062 -1.210938 3.28125 -0.984375 3.90625 -0.984375 C 4.539062 -0.984375 5.03125 -1.210938 5.375 -1.671875 C 5.726562 -2.140625 5.90625 -2.796875 5.90625 -3.640625 Z M 7.078125 -0.875 C 7.078125 0.332031 6.804688 1.226562 6.265625 1.8125 C 5.722656 2.40625 4.898438 2.703125 3.796875 2.703125 C 3.390625 2.703125 3.003906 2.671875 2.640625 2.609375 C 2.273438 2.546875 1.921875 2.453125 1.578125 2.328125 L 1.578125 1.1875 C 1.921875 1.375 2.257812 1.507812 2.59375 1.59375 C 2.925781 1.6875 3.265625 1.734375 3.609375 1.734375 C 4.378906 1.734375 4.953125 1.535156 5.328125 1.140625 C 5.710938 0.742188 5.90625 0.140625 5.90625 -0.671875 L 5.90625 -1.25 C 5.664062 -0.832031 5.351562 -0.519531 4.96875 -0.3125 C 4.59375 -0.101562 4.144531 0 3.625 0 C 2.75 0 2.046875 -0.332031 1.515625 -1 C 0.984375 -1.664062 0.71875 -2.546875 0.71875 -3.640625 C 0.71875 -4.734375 0.984375 -5.613281 1.515625 -6.28125 C 2.046875 -6.945312 2.75 -7.28125 3.625 -7.28125 C 4.144531 -7.28125 4.59375 -7.175781 4.96875 -6.96875 C 5.351562 -6.757812 5.664062 -6.445312 5.90625 -6.03125 L 5.90625 -7.109375 L 7.078125 -7.109375 Z M 7.078125 -0.875 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-13">
|
||||
<path style="stroke:none;" d="M 5.125 -8.609375 C 4.1875 -8.609375 3.441406 -8.257812 2.890625 -7.5625 C 2.347656 -6.875 2.078125 -5.929688 2.078125 -4.734375 C 2.078125 -3.535156 2.347656 -2.585938 2.890625 -1.890625 C 3.441406 -1.203125 4.1875 -0.859375 5.125 -0.859375 C 6.050781 -0.859375 6.785156 -1.203125 7.328125 -1.890625 C 7.878906 -2.585938 8.15625 -3.535156 8.15625 -4.734375 C 8.15625 -5.929688 7.878906 -6.875 7.328125 -7.5625 C 6.785156 -8.257812 6.050781 -8.609375 5.125 -8.609375 Z M 5.125 -9.65625 C 6.445312 -9.65625 7.503906 -9.207031 8.296875 -8.3125 C 9.097656 -7.414062 9.5 -6.222656 9.5 -4.734375 C 9.5 -3.234375 9.097656 -2.035156 8.296875 -1.140625 C 7.503906 -0.253906 6.445312 0.1875 5.125 0.1875 C 3.789062 0.1875 2.722656 -0.253906 1.921875 -1.140625 C 1.128906 -2.035156 0.734375 -3.234375 0.734375 -4.734375 C 0.734375 -6.222656 1.128906 -7.414062 1.921875 -8.3125 C 2.722656 -9.207031 3.789062 -9.65625 5.125 -9.65625 Z M 5.125 -9.65625 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-14">
|
||||
<path style="stroke:none;" d="M 1.109375 -2.8125 L 1.109375 -7.109375 L 2.265625 -7.109375 L 2.265625 -2.84375 C 2.265625 -2.175781 2.394531 -1.671875 2.65625 -1.328125 C 2.925781 -0.992188 3.320312 -0.828125 3.84375 -0.828125 C 4.476562 -0.828125 4.976562 -1.023438 5.34375 -1.421875 C 5.707031 -1.828125 5.890625 -2.378906 5.890625 -3.078125 L 5.890625 -7.109375 L 7.0625 -7.109375 L 7.0625 0 L 5.890625 0 L 5.890625 -1.09375 C 5.609375 -0.65625 5.28125 -0.332031 4.90625 -0.125 C 4.53125 0.0820312 4.09375 0.1875 3.59375 0.1875 C 2.78125 0.1875 2.160156 -0.0664062 1.734375 -0.578125 C 1.316406 -1.085938 1.109375 -1.832031 1.109375 -2.8125 Z M 4.046875 -7.28125 Z M 4.046875 -7.28125 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-15">
|
||||
<path style="stroke:none;" d="M 2.375 -9.125 L 2.375 -7.109375 L 4.78125 -7.109375 L 4.78125 -6.203125 L 2.375 -6.203125 L 2.375 -2.34375 C 2.375 -1.757812 2.453125 -1.382812 2.609375 -1.21875 C 2.773438 -1.0625 3.101562 -0.984375 3.59375 -0.984375 L 4.78125 -0.984375 L 4.78125 0 L 3.59375 0 C 2.6875 0 2.0625 -0.164062 1.71875 -0.5 C 1.375 -0.84375 1.203125 -1.457031 1.203125 -2.34375 L 1.203125 -6.203125 L 0.34375 -6.203125 L 0.34375 -7.109375 L 1.203125 -7.109375 L 1.203125 -9.125 Z M 2.375 -9.125 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-16">
|
||||
<path style="stroke:none;" d=""/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-17">
|
||||
<path style="stroke:none;" d="M 1.28125 -9.484375 L 6.71875 -9.484375 L 6.71875 -8.390625 L 2.5625 -8.390625 L 2.5625 -5.609375 L 6.3125 -5.609375 L 6.3125 -4.53125 L 2.5625 -4.53125 L 2.5625 0 L 1.28125 0 Z M 1.28125 -9.484375 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-18">
|
||||
<path style="stroke:none;" d="M 6.765625 -5.75 C 7.054688 -6.269531 7.40625 -6.65625 7.8125 -6.90625 C 8.21875 -7.15625 8.695312 -7.28125 9.25 -7.28125 C 9.988281 -7.28125 10.554688 -7.019531 10.953125 -6.5 C 11.359375 -5.976562 11.5625 -5.242188 11.5625 -4.296875 L 11.5625 0 L 10.390625 0 L 10.390625 -4.25 C 10.390625 -4.9375 10.265625 -5.441406 10.015625 -5.765625 C 9.773438 -6.097656 9.410156 -6.265625 8.921875 -6.265625 C 8.316406 -6.265625 7.835938 -6.0625 7.484375 -5.65625 C 7.128906 -5.257812 6.953125 -4.710938 6.953125 -4.015625 L 6.953125 0 L 5.78125 0 L 5.78125 -4.25 C 5.78125 -4.9375 5.660156 -5.441406 5.421875 -5.765625 C 5.179688 -6.097656 4.804688 -6.265625 4.296875 -6.265625 C 3.703125 -6.265625 3.226562 -6.0625 2.875 -5.65625 C 2.53125 -5.25 2.359375 -4.703125 2.359375 -4.015625 L 2.359375 0 L 1.1875 0 L 1.1875 -7.109375 L 2.359375 -7.109375 L 2.359375 -6 C 2.617188 -6.4375 2.9375 -6.757812 3.3125 -6.96875 C 3.6875 -7.175781 4.128906 -7.28125 4.640625 -7.28125 C 5.160156 -7.28125 5.597656 -7.148438 5.953125 -6.890625 C 6.316406 -6.628906 6.585938 -6.25 6.765625 -5.75 Z M 6.765625 -5.75 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-19">
|
||||
<path style="stroke:none;" d="M 6.953125 -9.171875 L 6.953125 -7.921875 C 6.472656 -8.148438 6.015625 -8.320312 5.578125 -8.4375 C 5.148438 -8.550781 4.734375 -8.609375 4.328125 -8.609375 C 3.628906 -8.609375 3.085938 -8.472656 2.703125 -8.203125 C 2.328125 -7.929688 2.140625 -7.546875 2.140625 -7.046875 C 2.140625 -6.628906 2.265625 -6.3125 2.515625 -6.09375 C 2.773438 -5.882812 3.253906 -5.710938 3.953125 -5.578125 L 4.734375 -5.421875 C 5.679688 -5.234375 6.382812 -4.910156 6.84375 -4.453125 C 7.300781 -3.992188 7.53125 -3.378906 7.53125 -2.609375 C 7.53125 -1.691406 7.222656 -0.992188 6.609375 -0.515625 C 5.992188 -0.046875 5.085938 0.1875 3.890625 0.1875 C 3.441406 0.1875 2.960938 0.132812 2.453125 0.03125 C 1.953125 -0.0703125 1.429688 -0.222656 0.890625 -0.421875 L 0.890625 -1.734375 C 1.410156 -1.441406 1.921875 -1.222656 2.421875 -1.078125 C 2.921875 -0.929688 3.410156 -0.859375 3.890625 -0.859375 C 4.628906 -0.859375 5.195312 -1 5.59375 -1.28125 C 5.988281 -1.570312 6.1875 -1.984375 6.1875 -2.515625 C 6.1875 -2.984375 6.039062 -3.347656 5.75 -3.609375 C 5.46875 -3.867188 5.003906 -4.066406 4.359375 -4.203125 L 3.578125 -4.359375 C 2.617188 -4.546875 1.925781 -4.84375 1.5 -5.25 C 1.070312 -5.65625 0.859375 -6.21875 0.859375 -6.9375 C 0.859375 -7.78125 1.148438 -8.441406 1.734375 -8.921875 C 2.328125 -9.410156 3.144531 -9.65625 4.1875 -9.65625 C 4.625 -9.65625 5.070312 -9.613281 5.53125 -9.53125 C 6 -9.445312 6.472656 -9.328125 6.953125 -9.171875 Z M 6.953125 -9.171875 "/>
|
||||
</symbol>
|
||||
<symbol overflow="visible" id="glyph2-20">
|
||||
<path style="stroke:none;" d="M 4.1875 0.65625 C 3.851562 1.507812 3.53125 2.0625 3.21875 2.3125 C 2.90625 2.570312 2.488281 2.703125 1.96875 2.703125 L 1.03125 2.703125 L 1.03125 1.734375 L 1.71875 1.734375 C 2.039062 1.734375 2.289062 1.65625 2.46875 1.5 C 2.644531 1.34375 2.835938 0.984375 3.046875 0.421875 L 3.265625 -0.109375 L 0.390625 -7.109375 L 1.625 -7.109375 L 3.84375 -1.546875 L 6.0625 -7.109375 L 7.3125 -7.109375 Z M 4.1875 0.65625 "/>
|
||||
</symbol>
|
||||
</g>
|
||||
</defs>
|
||||
<g id="surface268880">
|
||||
<rect x="0" y="0" width="774" height="152" style="fill:rgb(100%,100%,100%);fill-opacity:1;stroke:none;"/>
|
||||
<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 21.75297 10.408118 L 26.433829 10.408118 L 26.433829 12.281165 L 21.75297 12.281165 Z M 21.75297 10.408118 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 29.079728 10.51222 L 32.829728 10.51222 L 32.829728 12.149915 L 29.079728 12.149915 Z M 29.079728 10.51222 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
|
||||
<use xlink:href="#glyph0-1" x="20.171875" y="57.705621"/>
|
||||
<use xlink:href="#glyph0-2" x="30.171875" y="57.705621"/>
|
||||
<use xlink:href="#glyph0-3" x="40.171875" y="57.705621"/>
|
||||
<use xlink:href="#glyph0-4" x="50.171875" y="57.705621"/>
|
||||
<use xlink:href="#glyph0-5" x="60.171875" y="57.705621"/>
|
||||
<use xlink:href="#glyph0-6" x="70.171875" y="57.705621"/>
|
||||
</g>
|
||||
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
|
||||
<use xlink:href="#glyph0-7" x="174.203125" y="60.053277"/>
|
||||
<use xlink:href="#glyph0-8" x="184.203125" y="60.053277"/>
|
||||
</g>
|
||||
<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 40.925236 10.544446 L 44.675236 10.544446 L 44.675236 12.090345 L 40.925236 12.090345 Z M 40.925236 10.544446 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 34.883439 10.536634 L 38.633439 10.536634 L 38.633439 12.120032 L 34.883439 12.120032 Z M 34.883439 10.536634 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 47.084806 10.484876 L 52.045743 10.484876 L 52.045743 12.130774 L 47.084806 12.130774 Z M 47.084806 10.484876 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 53.980118 10.376868 L 59.866642 10.376868 L 59.866642 12.279603 L 53.980118 12.279603 Z M 53.980118 10.376868 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<path style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 54.048478 13.825501 L 59.868009 13.825501 L 59.868009 15.490345 L 54.048478 15.490345 Z M 54.048478 13.825501 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 26.481876 11.338001 L 28.593009 11.332337 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 28.968009 11.33136 L 28.468595 11.582728 L 28.593009 11.332337 L 28.467228 11.082728 Z M 28.968009 11.33136 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 32.876798 11.329798 L 34.396525 11.328626 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 34.771525 11.328431 L 34.27172 11.578821 L 34.396525 11.328626 L 34.271329 11.078821 Z M 34.771525 11.328431 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 38.633439 11.328431 L 40.438517 11.319642 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 40.813517 11.317884 L 40.314689 11.570228 L 40.438517 11.319642 L 40.312345 11.070423 Z M 40.813517 11.317884 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 44.675236 11.317298 L 46.597892 11.309876 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 46.972892 11.308313 L 46.473868 11.560267 L 46.597892 11.309876 L 46.471915 11.060267 Z M 46.972892 11.308313 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 52.045743 11.307923 L 53.4934 11.323157 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 53.8684 11.327063 L 53.365861 11.57179 L 53.4934 11.323157 L 53.370939 11.07179 Z M 53.8684 11.327063 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
|
||||
<use xlink:href="#glyph0-9" x="286.757813" y="60.611871"/>
|
||||
<use xlink:href="#glyph0-10" x="296.757813" y="60.611871"/>
|
||||
<use xlink:href="#glyph0-1" x="306.757813" y="60.611871"/>
|
||||
</g>
|
||||
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
|
||||
<use xlink:href="#glyph0-11" x="405.660156" y="59.904839"/>
|
||||
<use xlink:href="#glyph0-10" x="415.660156" y="59.904839"/>
|
||||
<use xlink:href="#glyph0-12" x="425.660156" y="59.904839"/>
|
||||
</g>
|
||||
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
|
||||
<use xlink:href="#glyph1-1" x="511.308594" y="58.064616"/>
|
||||
<use xlink:href="#glyph1-2" x="517.308757" y="58.064616"/>
|
||||
<use xlink:href="#glyph1-3" x="523.308919" y="58.064616"/>
|
||||
<use xlink:href="#glyph1-4" x="529.309082" y="58.064616"/>
|
||||
<use xlink:href="#glyph1-5" x="535.309245" y="58.064616"/>
|
||||
<use xlink:href="#glyph1-6" x="541.309408" y="58.064616"/>
|
||||
<use xlink:href="#glyph1-7" x="547.30957" y="58.064616"/>
|
||||
<use xlink:href="#glyph1-8" x="553.309733" y="58.064616"/>
|
||||
<use xlink:href="#glyph1-9" x="559.309896" y="58.064616"/>
|
||||
<use xlink:href="#glyph1-10" x="565.310059" y="58.064616"/>
|
||||
<use xlink:href="#glyph1-11" x="571.310221" y="58.064616"/>
|
||||
<use xlink:href="#glyph1-12" x="577.310384" y="58.064616"/>
|
||||
<use xlink:href="#glyph1-13" x="583.310547" y="58.064616"/>
|
||||
<use xlink:href="#glyph1-8" x="589.31071" y="58.064616"/>
|
||||
<use xlink:href="#glyph1-14" x="595.310872" y="58.064616"/>
|
||||
</g>
|
||||
<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 45.671915 11.342298 L 45.655704 11.342298 L 45.655704 14.657923 L 53.561759 14.657923 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<path style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 53.936759 14.657923 L 53.436759 14.907923 L 53.561759 14.657923 L 53.436759 14.407923 Z M 53.936759 14.657923 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
|
||||
<use xlink:href="#glyph1-15" x="657.078125" y="57.724772"/>
|
||||
<use xlink:href="#glyph1-16" x="663.078288" y="57.724772"/>
|
||||
<use xlink:href="#glyph1-10" x="669.078451" y="57.724772"/>
|
||||
<use xlink:href="#glyph1-6" x="675.078613" y="57.724772"/>
|
||||
<use xlink:href="#glyph1-8" x="681.078776" y="57.724772"/>
|
||||
<use xlink:href="#glyph1-17" x="687.078939" y="57.724772"/>
|
||||
<use xlink:href="#glyph1-11" x="693.079102" y="57.724772"/>
|
||||
<use xlink:href="#glyph1-18" x="699.079264" y="57.724772"/>
|
||||
<use xlink:href="#glyph1-19" x="705.079427" y="57.724772"/>
|
||||
<use xlink:href="#glyph1-4" x="711.07959" y="57.724772"/>
|
||||
<use xlink:href="#glyph1-20" x="717.079753" y="57.724772"/>
|
||||
<use xlink:href="#glyph1-21" x="723.079915" y="57.724772"/>
|
||||
<use xlink:href="#glyph1-22" x="729.080078" y="57.724772"/>
|
||||
<use xlink:href="#glyph1-23" x="735.080241" y="57.724772"/>
|
||||
<use xlink:href="#glyph1-21" x="741.080404" y="57.724772"/>
|
||||
<use xlink:href="#glyph1-22" x="747.080566" y="57.724772"/>
|
||||
</g>
|
||||
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
|
||||
<use xlink:href="#glyph1-24" x="673.335938" y="124.170085"/>
|
||||
<use xlink:href="#glyph1-11" x="679.3361" y="124.170085"/>
|
||||
<use xlink:href="#glyph1-13" x="685.336263" y="124.170085"/>
|
||||
<use xlink:href="#glyph1-8" x="691.336426" y="124.170085"/>
|
||||
<use xlink:href="#glyph1-4" x="697.336589" y="124.170085"/>
|
||||
<use xlink:href="#glyph1-20" x="703.336751" y="124.170085"/>
|
||||
<use xlink:href="#glyph1-21" x="709.336914" y="124.170085"/>
|
||||
<use xlink:href="#glyph1-22" x="715.337077" y="124.170085"/>
|
||||
<use xlink:href="#glyph1-23" x="721.33724" y="124.170085"/>
|
||||
<use xlink:href="#glyph1-21" x="727.337402" y="124.170085"/>
|
||||
<use xlink:href="#glyph1-22" x="733.337565" y="124.170085"/>
|
||||
</g>
|
||||
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
|
||||
<use xlink:href="#glyph2-1" x="168.71875" y="31.959093"/>
|
||||
<use xlink:href="#glyph2-2" x="175.866102" y="31.959093"/>
|
||||
<use xlink:href="#glyph2-3" x="180.92551" y="31.959093"/>
|
||||
<use xlink:href="#glyph2-4" x="188.879069" y="31.959093"/>
|
||||
</g>
|
||||
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
|
||||
<use xlink:href="#glyph2-5" x="288.109375" y="31.681749"/>
|
||||
<use xlink:href="#glyph2-1" x="294.882378" y="31.681749"/>
|
||||
<use xlink:href="#glyph2-6" x="302.029731" y="31.681749"/>
|
||||
<use xlink:href="#glyph2-7" x="309.996039" y="31.681749"/>
|
||||
<use xlink:href="#glyph2-8" x="313.607964" y="31.681749"/>
|
||||
</g>
|
||||
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
|
||||
<use xlink:href="#glyph2-5" x="535.988281" y="33.365343"/>
|
||||
<use xlink:href="#glyph2-1" x="542.761285" y="33.365343"/>
|
||||
<use xlink:href="#glyph2-6" x="549.908637" y="33.365343"/>
|
||||
<use xlink:href="#glyph2-7" x="557.874946" y="33.365343"/>
|
||||
<use xlink:href="#glyph2-8" x="561.486871" y="33.365343"/>
|
||||
</g>
|
||||
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
|
||||
<use xlink:href="#glyph2-9" x="26.695313" y="32.365343"/>
|
||||
<use xlink:href="#glyph2-10" x="34.947266" y="32.365343"/>
|
||||
<use xlink:href="#glyph2-11" x="38.559191" y="32.365343"/>
|
||||
<use xlink:href="#glyph2-11" x="46.798394" y="32.365343"/>
|
||||
<use xlink:href="#glyph2-10" x="55.037598" y="32.365343"/>
|
||||
<use xlink:href="#glyph2-11" x="58.649523" y="32.365343"/>
|
||||
<use xlink:href="#glyph2-12" x="66.888726" y="32.365343"/>
|
||||
</g>
|
||||
<path style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-dasharray:0.14,0.14;stroke-miterlimit:10;" d="M 45.300431 9.486438 L 60.373478 9.486438 L 60.373478 16.175696 L 45.300431 16.175696 Z M 45.300431 9.486438 " transform="matrix(20,0,0,20,-434.059401,-172.47877)"/>
|
||||
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
|
||||
<use xlink:href="#glyph2-13" x="532.003906" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-14" x="542.236382" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-15" x="550.475586" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-4" x="555.5727" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-14" x="563.824653" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-15" x="572.063856" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-16" x="577.16097" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-17" x="581.293186" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-3" x="588.307346" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-2" x="596.260905" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-18" x="601.377279" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-6" x="614.040853" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-15" x="622.007161" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-15" x="627.104275" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-8" x="632.201389" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-2" x="640.199436" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-16" x="645.544217" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-19" x="649.676432" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-20" x="657.928385" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-5" x="665.621799" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-15" x="672.394803" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-8" x="677.491916" y="11.904405"/>
|
||||
<use xlink:href="#glyph2-18" x="685.489963" y="11.904405"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 76 KiB |
@ -76,27 +76,19 @@ vimc-capture:
|
||||
* 1 Pad sink
|
||||
* 1 Pad source
|
||||
|
||||
|
||||
Module options
|
||||
---------------
|
||||
--------------
|
||||
|
||||
Vimc has a few module parameters to configure the driver. You should pass
|
||||
those arguments to each subdevice, not to the vimc module. For example::
|
||||
Vimc has a module parameter to configure the driver.
|
||||
|
||||
vimc_subdevice.param=value
|
||||
|
||||
* ``vimc_scaler.sca_mult=<unsigned int>``
|
||||
* ``sca_mult=<unsigned int>``
|
||||
|
||||
Image size multiplier factor to be used to multiply both width and
|
||||
height, so the image size will be ``sca_mult^2`` bigger than the
|
||||
original one. Currently, only supports scaling up (the default value
|
||||
is 3).
|
||||
|
||||
* ``vimc_debayer.deb_mean_win_size=<unsigned int>``
|
||||
|
||||
Window size to calculate the mean. Note: the window size needs to be an
|
||||
odd number, as the main pixel stays in the center of the window,
|
||||
otherwise the next odd number is considered (the default value is 3).
|
||||
|
||||
Source code documentation
|
||||
-------------------------
|
||||
|
||||
|
@ -141,6 +141,10 @@ replace symbol V4L2_CTRL_TYPE_H264_PPS :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_H264_SCALING_MATRIX :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_H264_SLICE_PARAMS :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_H264_DECODE_PARAMS :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_HEVC_SPS :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_HEVC_PPS :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS :c:type:`v4l2_ctrl_type`
|
||||
replace symbol V4L2_CTRL_TYPE_AREA :c:type:`v4l2_ctrl_type`
|
||||
|
||||
# V4L2 capability defines
|
||||
replace define V4L2_CAP_VIDEO_CAPTURE device-capabilities
|
||||
@ -434,6 +438,7 @@ replace define V4L2_DEC_CMD_START decoder-cmds
|
||||
replace define V4L2_DEC_CMD_STOP decoder-cmds
|
||||
replace define V4L2_DEC_CMD_PAUSE decoder-cmds
|
||||
replace define V4L2_DEC_CMD_RESUME decoder-cmds
|
||||
replace define V4L2_DEC_CMD_FLUSH decoder-cmds
|
||||
|
||||
replace define V4L2_DEC_CMD_START_MUTE_AUDIO decoder-cmds
|
||||
replace define V4L2_DEC_CMD_PAUSE_TO_BLACK decoder-cmds
|
||||
|
32
MAINTAINERS
32
MAINTAINERS
@ -4650,6 +4650,14 @@ M: "Maciej W. Rozycki" <macro@linux-mips.org>
|
||||
S: Maintained
|
||||
F: drivers/net/fddi/defxx.*
|
||||
|
||||
DEINTERLACE DRIVERS FOR ALLWINNER H3
|
||||
M: Jernej Skrabec <jernej.skrabec@siol.net>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/platform/sunxi/sun8i-di/
|
||||
F: Documentation/devicetree/bindings/media/allwinner,sun8i-h3-deinterlace.yaml
|
||||
|
||||
DELL SMBIOS DRIVER
|
||||
M: Pali Rohár <pali.rohar@gmail.com>
|
||||
M: Mario Limonciello <mario.limonciello@dell.com>
|
||||
@ -7588,6 +7596,13 @@ L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: arch/x86/kernel/cpu/hygon.c
|
||||
|
||||
HYNIX HI556 SENSOR DRIVER
|
||||
M: Shawn Tu <shawnx.tu@intel.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/hi556.c
|
||||
|
||||
Hyper-V CORE AND DRIVERS
|
||||
M: "K. Y. Srinivasan" <kys@microsoft.com>
|
||||
M: Haiyang Zhang <haiyangz@microsoft.com>
|
||||
@ -8378,6 +8393,7 @@ S: Maintained
|
||||
F: drivers/staging/media/ipu3/
|
||||
F: Documentation/media/uapi/v4l/pixfmt-meta-intel-ipu3.rst
|
||||
F: Documentation/media/v4l-drivers/ipu3.rst
|
||||
F: Documentation/media/v4l-drivers/ipu3_rcb.svg
|
||||
|
||||
INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT
|
||||
M: Krzysztof Halasa <khalasa@piap.pl>
|
||||
@ -9933,7 +9949,7 @@ F: Documentation/hwmon/max16065.rst
|
||||
F: drivers/hwmon/max16065.c
|
||||
|
||||
MAX2175 SDR TUNER DRIVER
|
||||
M: Ramesh Shanmugasundaram <ramesh.shanmugasundaram@bp.renesas.com>
|
||||
M: Ramesh Shanmugasundaram <rashanmu@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
@ -10195,7 +10211,7 @@ F: drivers/media/platform/renesas-ceu.c
|
||||
F: include/media/drv-intf/renesas-ceu.h
|
||||
|
||||
MEDIA DRIVERS FOR RENESAS - DRIF
|
||||
M: Ramesh Shanmugasundaram <ramesh.shanmugasundaram@bp.renesas.com>
|
||||
M: Ramesh Shanmugasundaram <rashanmu@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
L: linux-renesas-soc@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
@ -10656,7 +10672,7 @@ W: http://linux-meson.com/
|
||||
S: Supported
|
||||
F: drivers/media/platform/meson/ao-cec.c
|
||||
F: drivers/media/platform/meson/ao-cec-g12a.c
|
||||
F: Documentation/devicetree/bindings/media/meson-ao-cec.txt
|
||||
F: Documentation/devicetree/bindings/media/amlogic,meson-gx-ao-cec.yaml
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
|
||||
MESON NAND CONTROLLER DRIVER FOR AMLOGIC SOCS
|
||||
@ -15235,6 +15251,14 @@ S: Maintained
|
||||
F: drivers/media/i2c/imx274.c
|
||||
F: Documentation/devicetree/bindings/media/i2c/imx274.txt
|
||||
|
||||
SONY IMX290 SENSOR DRIVER
|
||||
M: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
S: Maintained
|
||||
F: drivers/media/i2c/imx290.c
|
||||
F: Documentation/devicetree/bindings/media/i2c/imx290.txt
|
||||
|
||||
SONY IMX319 SENSOR DRIVER
|
||||
M: Bingbu Cao <bingbu.cao@intel.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
@ -16397,6 +16421,7 @@ W: http://linuxtv.org/
|
||||
Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
||||
S: Maintained
|
||||
F: drivers/media/platform/ti-vpe/
|
||||
F: Documentation/devicetree/bindings/media/ti,vpe.yaml
|
||||
|
||||
TI WILINK WIRELESS DRIVERS
|
||||
L: linux-wireless@vger.kernel.org
|
||||
@ -17286,6 +17311,7 @@ F: include/media/videobuf2-*
|
||||
|
||||
VIMC VIRTUAL MEDIA CONTROLLER DRIVER
|
||||
M: Helen Koike <helen.koike@collabora.com>
|
||||
R: Shuah Khan <skhan@linuxfoundation.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
T: git git://linuxtv.org/media_tree.git
|
||||
W: https://linuxtv.org
|
||||
|
@ -252,6 +252,7 @@
|
||||
};
|
||||
|
||||
&r_ir {
|
||||
linux,rc-map-name = "rc-beelink-gs1";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
@ -319,6 +319,8 @@ static void cec_post_state_event(struct cec_adapter *adap)
|
||||
|
||||
ev.state_change.phys_addr = adap->phys_addr;
|
||||
ev.state_change.log_addr_mask = adap->log_addrs.log_addr_mask;
|
||||
ev.state_change.have_conn_info =
|
||||
adap->conn_info.type != CEC_CONNECTOR_TYPE_NO_CONNECTOR;
|
||||
cec_queue_event(adap, &ev);
|
||||
}
|
||||
|
||||
@ -1976,7 +1978,7 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
|
||||
* Play function, this message can have variable length
|
||||
* depending on the specific play function that is used.
|
||||
*/
|
||||
case 0x60:
|
||||
case CEC_OP_UI_CMD_PLAY_FUNCTION:
|
||||
if (msg->len == 2)
|
||||
rc_keydown(adap->rc, RC_PROTO_CEC,
|
||||
msg->msg[2], 0);
|
||||
@ -1993,8 +1995,12 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
|
||||
* For the time being these messages are not processed by the
|
||||
* framework and are simply forwarded to the user space.
|
||||
*/
|
||||
case 0x56: case 0x57:
|
||||
case 0x67: case 0x68: case 0x69: case 0x6a:
|
||||
case CEC_OP_UI_CMD_SELECT_BROADCAST_TYPE:
|
||||
case CEC_OP_UI_CMD_SELECT_SOUND_PRESENTATION:
|
||||
case CEC_OP_UI_CMD_TUNE_FUNCTION:
|
||||
case CEC_OP_UI_CMD_SELECT_MEDIA_FUNCTION:
|
||||
case CEC_OP_UI_CMD_SELECT_AV_INPUT_FUNCTION:
|
||||
case CEC_OP_UI_CMD_SELECT_AUDIO_INPUT_FUNCTION:
|
||||
break;
|
||||
default:
|
||||
rc_keydown(adap->rc, RC_PROTO_CEC, msg->msg[2], 0);
|
||||
|
@ -187,6 +187,21 @@ static long cec_adap_s_log_addrs(struct cec_adapter *adap, struct cec_fh *fh,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long cec_adap_g_connector_info(struct cec_adapter *adap,
|
||||
struct cec_log_addrs __user *parg)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (!(adap->capabilities & CEC_CAP_CONNECTOR_INFO))
|
||||
return -ENOTTY;
|
||||
|
||||
mutex_lock(&adap->lock);
|
||||
if (copy_to_user(parg, &adap->conn_info, sizeof(adap->conn_info)))
|
||||
ret = -EFAULT;
|
||||
mutex_unlock(&adap->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static long cec_transmit(struct cec_adapter *adap, struct cec_fh *fh,
|
||||
bool block, struct cec_msg __user *parg)
|
||||
{
|
||||
@ -506,6 +521,9 @@ static long cec_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
case CEC_ADAP_S_LOG_ADDRS:
|
||||
return cec_adap_s_log_addrs(adap, fh, block, parg);
|
||||
|
||||
case CEC_ADAP_G_CONNECTOR_INFO:
|
||||
return cec_adap_g_connector_info(adap, parg);
|
||||
|
||||
case CEC_TRANSMIT:
|
||||
return cec_transmit(adap, fh, block, parg);
|
||||
|
||||
@ -578,6 +596,8 @@ static int cec_open(struct inode *inode, struct file *filp)
|
||||
/* Queue up initial state events */
|
||||
ev.state_change.phys_addr = adap->phys_addr;
|
||||
ev.state_change.log_addr_mask = adap->log_addrs.log_addr_mask;
|
||||
ev.state_change.have_conn_info =
|
||||
adap->conn_info.type != CEC_CONNECTOR_TYPE_NO_CONNECTOR;
|
||||
cec_queue_event_fh(fh, &ev, 0);
|
||||
#ifdef CONFIG_CEC_PIN
|
||||
if (adap->pin && adap->pin->ops->read_hpd) {
|
||||
|
@ -257,11 +257,6 @@ struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
|
||||
struct cec_adapter *adap;
|
||||
int res;
|
||||
|
||||
/*
|
||||
* Disable this capability until the connector info public API
|
||||
* is ready.
|
||||
*/
|
||||
caps &= ~CEC_CAP_CONNECTOR_INFO;
|
||||
#ifndef CONFIG_MEDIA_CEC_RC
|
||||
caps &= ~CEC_CAP_RC;
|
||||
#endif
|
||||
|
@ -1279,6 +1279,15 @@ static void cec_pin_adap_free(struct cec_adapter *adap)
|
||||
kfree(pin);
|
||||
}
|
||||
|
||||
static int cec_pin_received(struct cec_adapter *adap, struct cec_msg *msg)
|
||||
{
|
||||
struct cec_pin *pin = adap->pin;
|
||||
|
||||
if (pin->ops->received)
|
||||
return pin->ops->received(adap, msg);
|
||||
return -ENOMSG;
|
||||
}
|
||||
|
||||
void cec_pin_changed(struct cec_adapter *adap, bool value)
|
||||
{
|
||||
struct cec_pin *pin = adap->pin;
|
||||
@ -1301,6 +1310,7 @@ static const struct cec_adap_ops cec_pin_adap_ops = {
|
||||
.error_inj_parse_line = cec_pin_error_inj_parse_line,
|
||||
.error_inj_show = cec_pin_error_inj_show,
|
||||
#endif
|
||||
.received = cec_pin_received,
|
||||
};
|
||||
|
||||
struct cec_adapter *cec_pin_allocate_adapter(const struct cec_pin_ops *pin_ops,
|
||||
|
@ -230,8 +230,8 @@ static char *siano_msgs[] = {
|
||||
[MSG_SMS_FLASH_DL_REQ - MSG_TYPE_BASE_VAL] = "MSG_SMS_FLASH_DL_REQ",
|
||||
[MSG_SMS_EXEC_TEST_1_REQ - MSG_TYPE_BASE_VAL] = "MSG_SMS_EXEC_TEST_1_REQ",
|
||||
[MSG_SMS_EXEC_TEST_1_RES - MSG_TYPE_BASE_VAL] = "MSG_SMS_EXEC_TEST_1_RES",
|
||||
[MSG_SMS_ENBALE_TS_INTERFACE_REQ - MSG_TYPE_BASE_VAL] = "MSG_SMS_ENBALE_TS_INTERFACE_REQ",
|
||||
[MSG_SMS_ENBALE_TS_INTERFACE_RES - MSG_TYPE_BASE_VAL] = "MSG_SMS_ENBALE_TS_INTERFACE_RES",
|
||||
[MSG_SMS_ENABLE_TS_INTERFACE_REQ - MSG_TYPE_BASE_VAL] = "MSG_SMS_ENABLE_TS_INTERFACE_REQ",
|
||||
[MSG_SMS_ENABLE_TS_INTERFACE_RES - MSG_TYPE_BASE_VAL] = "MSG_SMS_ENABLE_TS_INTERFACE_RES",
|
||||
[MSG_SMS_SPI_SET_BUS_WIDTH_REQ - MSG_TYPE_BASE_VAL] = "MSG_SMS_SPI_SET_BUS_WIDTH_REQ",
|
||||
[MSG_SMS_SPI_SET_BUS_WIDTH_RES - MSG_TYPE_BASE_VAL] = "MSG_SMS_SPI_SET_BUS_WIDTH_RES",
|
||||
[MSG_SMS_SEND_EMM_REQ - MSG_TYPE_BASE_VAL] = "MSG_SMS_SEND_EMM_REQ",
|
||||
|
@ -434,8 +434,8 @@ enum msg_types {
|
||||
MSG_SMS_FLASH_DL_REQ = 732,
|
||||
MSG_SMS_EXEC_TEST_1_REQ = 734,
|
||||
MSG_SMS_EXEC_TEST_1_RES = 735,
|
||||
MSG_SMS_ENBALE_TS_INTERFACE_REQ = 736,
|
||||
MSG_SMS_ENBALE_TS_INTERFACE_RES = 737,
|
||||
MSG_SMS_ENABLE_TS_INTERFACE_REQ = 736,
|
||||
MSG_SMS_ENABLE_TS_INTERFACE_RES = 737,
|
||||
MSG_SMS_SPI_SET_BUS_WIDTH_REQ = 738,
|
||||
MSG_SMS_SPI_SET_BUS_WIDTH_RES = 739,
|
||||
MSG_SMS_SEND_EMM_REQ = 740,
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*
|
||||
* Siano Mobile Silicon, Inc.
|
||||
* MDTV receiver kernel modules.
|
||||
|
@ -49,8 +49,11 @@ module_param(debug, int, 0644);
|
||||
V4L2_BUF_FLAG_REQUEST_FD | \
|
||||
V4L2_BUF_FLAG_TIMESTAMP_MASK)
|
||||
/* Output buffer flags that should be passed on to the driver */
|
||||
#define V4L2_BUFFER_OUT_FLAGS (V4L2_BUF_FLAG_PFRAME | V4L2_BUF_FLAG_BFRAME | \
|
||||
V4L2_BUF_FLAG_KEYFRAME | V4L2_BUF_FLAG_TIMECODE)
|
||||
#define V4L2_BUFFER_OUT_FLAGS (V4L2_BUF_FLAG_PFRAME | \
|
||||
V4L2_BUF_FLAG_BFRAME | \
|
||||
V4L2_BUF_FLAG_KEYFRAME | \
|
||||
V4L2_BUF_FLAG_TIMECODE | \
|
||||
V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF)
|
||||
|
||||
/*
|
||||
* __verify_planes_array() - verify that the planes array passed in struct
|
||||
@ -194,6 +197,7 @@ static int vb2_fill_vb2_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b
|
||||
}
|
||||
vbuf->sequence = 0;
|
||||
vbuf->request_fd = -1;
|
||||
vbuf->is_held = false;
|
||||
|
||||
if (V4L2_TYPE_IS_MULTIPLANAR(b->type)) {
|
||||
switch (b->memory) {
|
||||
@ -321,6 +325,8 @@ static int vb2_fill_vb2_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b
|
||||
*/
|
||||
vbuf->flags &= ~V4L2_BUF_FLAG_TIMECODE;
|
||||
vbuf->field = b->field;
|
||||
if (!(q->subsystem_flags & VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF))
|
||||
vbuf->flags &= ~V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF;
|
||||
} else {
|
||||
/* Zero any output buffer flags as this is a capture buffer */
|
||||
vbuf->flags &= ~V4L2_BUFFER_OUT_FLAGS;
|
||||
@ -654,6 +660,8 @@ static void fill_buf_caps(struct vb2_queue *q, u32 *caps)
|
||||
*caps |= V4L2_BUF_CAP_SUPPORTS_USERPTR;
|
||||
if (q->io_modes & VB2_DMABUF)
|
||||
*caps |= V4L2_BUF_CAP_SUPPORTS_DMABUF;
|
||||
if (q->subsystem_flags & VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF)
|
||||
*caps |= V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF;
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER_REQUEST_API
|
||||
if (q->supports_requests)
|
||||
*caps |= V4L2_BUF_CAP_SUPPORTS_REQUESTS;
|
||||
|
@ -298,7 +298,7 @@ int cxd2820r_sleep_c(struct dvb_frontend *fe)
|
||||
struct cxd2820r_priv *priv = fe->demodulator_priv;
|
||||
struct i2c_client *client = priv->client[0];
|
||||
int ret;
|
||||
struct reg_val_mask tab[] = {
|
||||
static const struct reg_val_mask tab[] = {
|
||||
{ 0x000ff, 0x1f, 0xff },
|
||||
{ 0x00085, 0x00, 0xff },
|
||||
{ 0x00088, 0x01, 0xff },
|
||||
|
@ -392,7 +392,7 @@ int cxd2820r_sleep_t(struct dvb_frontend *fe)
|
||||
struct cxd2820r_priv *priv = fe->demodulator_priv;
|
||||
struct i2c_client *client = priv->client[0];
|
||||
int ret;
|
||||
struct reg_val_mask tab[] = {
|
||||
static struct reg_val_mask tab[] = {
|
||||
{ 0x000ff, 0x1f, 0xff },
|
||||
{ 0x00085, 0x00, 0xff },
|
||||
{ 0x00088, 0x01, 0xff },
|
||||
|
@ -386,7 +386,7 @@ int cxd2820r_sleep_t2(struct dvb_frontend *fe)
|
||||
struct cxd2820r_priv *priv = fe->demodulator_priv;
|
||||
struct i2c_client *client = priv->client[0];
|
||||
int ret;
|
||||
struct reg_val_mask tab[] = {
|
||||
static const struct reg_val_mask tab[] = {
|
||||
{ 0x000ff, 0x1f, 0xff },
|
||||
{ 0x00085, 0x00, 0xff },
|
||||
{ 0x00088, 0x01, 0xff },
|
||||
|
@ -60,6 +60,7 @@ struct cxd2841er_priv {
|
||||
enum cxd2841er_xtal xtal;
|
||||
enum fe_caps caps;
|
||||
u32 flags;
|
||||
unsigned long stats_time;
|
||||
};
|
||||
|
||||
static const struct cxd2841er_cnr_data s_cn_data[] = {
|
||||
@ -3279,9 +3280,15 @@ static int cxd2841er_get_frontend(struct dvb_frontend *fe,
|
||||
p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
|
||||
|
||||
if (status & FE_HAS_LOCK) {
|
||||
if (priv->stats_time &&
|
||||
(!time_after(jiffies, priv->stats_time)))
|
||||
return 0;
|
||||
|
||||
/* Prevent retrieving stats faster than once per second */
|
||||
priv->stats_time = jiffies + msecs_to_jiffies(1000);
|
||||
|
||||
cxd2841er_read_snr(fe);
|
||||
cxd2841er_read_ucblocks(fe);
|
||||
|
||||
cxd2841er_read_ber(fe);
|
||||
} else {
|
||||
p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
|
||||
@ -3360,6 +3367,9 @@ done:
|
||||
p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
|
||||
p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
|
||||
|
||||
/* Reset the wait for jiffies logic */
|
||||
priv->stats_time = 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -4201,7 +4201,7 @@ int drxj_dap_scu_atomic_read_reg16(struct i2c_device_addr *dev_addr,
|
||||
u16 *data, u32 flags)
|
||||
{
|
||||
u8 buf[2] = { 0 };
|
||||
int rc = -EIO;
|
||||
int rc;
|
||||
u16 word = 0;
|
||||
|
||||
if (!data)
|
||||
|
@ -517,7 +517,7 @@ static void mb86a20s_reset_frontend_cache(struct dvb_frontend *fe)
|
||||
* Estimates the bit rate using the per-segment bit rate given by
|
||||
* ABNT/NBR 15601 spec (table 4).
|
||||
*/
|
||||
static u32 isdbt_rate[3][5][4] = {
|
||||
static const u32 isdbt_rate[3][5][4] = {
|
||||
{ /* DQPSK/QPSK */
|
||||
{ 280850, 312060, 330420, 340430 }, /* 1/2 */
|
||||
{ 374470, 416080, 440560, 453910 }, /* 2/3 */
|
||||
@ -539,13 +539,9 @@ static u32 isdbt_rate[3][5][4] = {
|
||||
}
|
||||
};
|
||||
|
||||
static void mb86a20s_layer_bitrate(struct dvb_frontend *fe, u32 layer,
|
||||
u32 modulation, u32 forward_error_correction,
|
||||
u32 guard_interval,
|
||||
u32 segment)
|
||||
static u32 isdbt_layer_min_bitrate(struct dtv_frontend_properties *c,
|
||||
u32 layer)
|
||||
{
|
||||
struct mb86a20s_state *state = fe->demodulator_priv;
|
||||
u32 rate;
|
||||
int mod, fec, guard;
|
||||
|
||||
/*
|
||||
@ -553,7 +549,7 @@ static void mb86a20s_layer_bitrate(struct dvb_frontend *fe, u32 layer,
|
||||
* to consider the lowest bit rate, to avoid taking too long time
|
||||
* to get BER.
|
||||
*/
|
||||
switch (modulation) {
|
||||
switch (c->layer[layer].modulation) {
|
||||
case DQPSK:
|
||||
case QPSK:
|
||||
default:
|
||||
@ -567,7 +563,7 @@ static void mb86a20s_layer_bitrate(struct dvb_frontend *fe, u32 layer,
|
||||
break;
|
||||
}
|
||||
|
||||
switch (forward_error_correction) {
|
||||
switch (c->layer[layer].fec) {
|
||||
default:
|
||||
case FEC_1_2:
|
||||
case FEC_AUTO:
|
||||
@ -587,7 +583,7 @@ static void mb86a20s_layer_bitrate(struct dvb_frontend *fe, u32 layer,
|
||||
break;
|
||||
}
|
||||
|
||||
switch (guard_interval) {
|
||||
switch (c->guard_interval) {
|
||||
default:
|
||||
case GUARD_INTERVAL_1_4:
|
||||
guard = 0;
|
||||
@ -603,29 +599,14 @@ static void mb86a20s_layer_bitrate(struct dvb_frontend *fe, u32 layer,
|
||||
break;
|
||||
}
|
||||
|
||||
/* Samples BER at BER_SAMPLING_RATE seconds */
|
||||
rate = isdbt_rate[mod][fec][guard] * segment * BER_SAMPLING_RATE;
|
||||
|
||||
/* Avoids sampling too quickly or to overflow the register */
|
||||
if (rate < 256)
|
||||
rate = 256;
|
||||
else if (rate > (1 << 24) - 1)
|
||||
rate = (1 << 24) - 1;
|
||||
|
||||
dev_dbg(&state->i2c->dev,
|
||||
"%s: layer %c bitrate: %d kbps; counter = %d (0x%06x)\n",
|
||||
__func__, 'A' + layer,
|
||||
segment * isdbt_rate[mod][fec][guard]/1000,
|
||||
rate, rate);
|
||||
|
||||
state->estimated_rate[layer] = rate;
|
||||
return isdbt_rate[mod][fec][guard] * c->layer[layer].segment_count;
|
||||
}
|
||||
|
||||
static int mb86a20s_get_frontend(struct dvb_frontend *fe)
|
||||
{
|
||||
struct mb86a20s_state *state = fe->demodulator_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int layer, rc;
|
||||
int layer, rc, rate, counter;
|
||||
|
||||
dev_dbg(&state->i2c->dev, "%s called.\n", __func__);
|
||||
|
||||
@ -676,10 +657,21 @@ static int mb86a20s_get_frontend(struct dvb_frontend *fe)
|
||||
dev_dbg(&state->i2c->dev, "%s: interleaving %d.\n",
|
||||
__func__, rc);
|
||||
c->layer[layer].interleaving = rc;
|
||||
mb86a20s_layer_bitrate(fe, layer, c->layer[layer].modulation,
|
||||
c->layer[layer].fec,
|
||||
c->guard_interval,
|
||||
c->layer[layer].segment_count);
|
||||
|
||||
rate = isdbt_layer_min_bitrate(c, layer);
|
||||
counter = rate * BER_SAMPLING_RATE;
|
||||
|
||||
/* Avoids sampling too quickly or to overflow the register */
|
||||
if (counter < 256)
|
||||
counter = 256;
|
||||
else if (counter > (1 << 24) - 1)
|
||||
counter = (1 << 24) - 1;
|
||||
|
||||
dev_dbg(&state->i2c->dev,
|
||||
"%s: layer %c bitrate: %d kbps; counter = %d (0x%06x)\n",
|
||||
__func__, 'A' + layer, rate / 1000, counter, counter);
|
||||
|
||||
state->estimated_rate[layer] = counter;
|
||||
}
|
||||
|
||||
rc = mb86a20s_writereg(state, 0x6d, 0x84);
|
||||
|
@ -135,11 +135,6 @@ static inline int mt312_writereg(struct mt312_state *state,
|
||||
return mt312_write(state, reg, &tmp, 1);
|
||||
}
|
||||
|
||||
static inline u32 mt312_div(u32 a, u32 b)
|
||||
{
|
||||
return (a + (b / 2)) / b;
|
||||
}
|
||||
|
||||
static int mt312_reset(struct mt312_state *state, const u8 full)
|
||||
{
|
||||
return mt312_writereg(state, RESET, full ? 0x80 : 0x40);
|
||||
@ -187,7 +182,7 @@ static int mt312_get_symbol_rate(struct mt312_state *state, u32 *sr)
|
||||
monitor = (buf[0] << 8) | buf[1];
|
||||
|
||||
dprintk("sr(auto) = %u\n",
|
||||
mt312_div(monitor * 15625, 4));
|
||||
DIV_ROUND_CLOSEST(monitor * 15625, 4));
|
||||
} else {
|
||||
ret = mt312_writereg(state, MON_CTRL, 0x05);
|
||||
if (ret < 0)
|
||||
@ -291,10 +286,10 @@ static int mt312_initfe(struct dvb_frontend *fe)
|
||||
}
|
||||
|
||||
/* SYS_CLK */
|
||||
buf[0] = mt312_div(state->xtal * state->freq_mult * 2, 1000000);
|
||||
buf[0] = DIV_ROUND_CLOSEST(state->xtal * state->freq_mult * 2, 1000000);
|
||||
|
||||
/* DISEQC_RATIO */
|
||||
buf[1] = mt312_div(state->xtal, 22000 * 4);
|
||||
buf[1] = DIV_ROUND_CLOSEST(state->xtal, 22000 * 4);
|
||||
|
||||
ret = mt312_write(state, SYS_CLK, buf, sizeof(buf));
|
||||
if (ret < 0)
|
||||
@ -610,7 +605,7 @@ static int mt312_set_frontend(struct dvb_frontend *fe)
|
||||
}
|
||||
|
||||
/* sr = (u16)(sr * 256.0 / 1000000.0) */
|
||||
sr = mt312_div(p->symbol_rate * 4, 15625);
|
||||
sr = DIV_ROUND_CLOSEST(p->symbol_rate * 4, 15625);
|
||||
|
||||
/* SYM_RATE */
|
||||
buf[0] = (sr >> 8) & 0x3f;
|
||||
|
@ -9,38 +9,43 @@
|
||||
#define SI2168_H
|
||||
|
||||
#include <linux/dvb/frontend.h>
|
||||
/*
|
||||
* I2C address
|
||||
* 0x64
|
||||
/**
|
||||
* struct si2168_config - configuration parameters for si2168
|
||||
*
|
||||
* @fe:
|
||||
* frontend returned by driver
|
||||
* @i2c_adapter:
|
||||
* tuner I2C adapter returned by driver
|
||||
* @ts_mode:
|
||||
* Transport Stream mode. Can be:
|
||||
* - %SI2168_TS_PARALLEL
|
||||
* - %SI2168_TS_SERIAL
|
||||
* - %SI2168_TS_TRISTATE
|
||||
* - %SI2168_TS_CLK_MANUAL
|
||||
* @ts_clock_inv:
|
||||
* TS clock inverted
|
||||
* @ts_clock_gapped:
|
||||
* TS clock gapped
|
||||
* @spectral_inversion:
|
||||
* Inverted spectrum
|
||||
*
|
||||
* Note:
|
||||
* The I2C address of this demod is 0x64.
|
||||
*/
|
||||
struct si2168_config {
|
||||
/*
|
||||
* frontend
|
||||
* returned by driver
|
||||
*/
|
||||
struct dvb_frontend **fe;
|
||||
|
||||
/*
|
||||
* tuner I2C adapter
|
||||
* returned by driver
|
||||
*/
|
||||
struct i2c_adapter **i2c_adapter;
|
||||
|
||||
/* TS mode */
|
||||
#define SI2168_TS_PARALLEL 0x06
|
||||
#define SI2168_TS_SERIAL 0x03
|
||||
#define SI2168_TS_TRISTATE 0x00
|
||||
#define SI2168_TS_CLK_MANUAL 0x20
|
||||
u8 ts_mode;
|
||||
|
||||
/* TS clock inverted */
|
||||
bool ts_clock_inv;
|
||||
|
||||
/* TS clock gapped */
|
||||
bool ts_clock_gapped;
|
||||
|
||||
/* Inverted spectrum */
|
||||
bool spectral_inversion;
|
||||
/* Flags */
|
||||
unsigned int ts_clock_inv:1;
|
||||
unsigned int ts_clock_gapped:1;
|
||||
unsigned int spectral_inversion:1;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -34,12 +34,12 @@ struct si2168_dev {
|
||||
unsigned int chip_id;
|
||||
unsigned int version;
|
||||
const char *firmware_name;
|
||||
bool active;
|
||||
bool warm;
|
||||
u8 ts_mode;
|
||||
bool ts_clock_inv;
|
||||
bool ts_clock_gapped;
|
||||
bool spectral_inversion;
|
||||
unsigned int active:1;
|
||||
unsigned int warm:1;
|
||||
unsigned int ts_clock_inv:1;
|
||||
unsigned int ts_clock_gapped:1;
|
||||
unsigned int spectral_inversion:1;
|
||||
};
|
||||
|
||||
/* firmware command struct */
|
||||
|
@ -685,10 +685,33 @@ tc90522_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
|
||||
p += new_msgs[j].len;
|
||||
}
|
||||
|
||||
if (i < num)
|
||||
if (i < num) {
|
||||
ret = -ENOMEM;
|
||||
else
|
||||
} else if (!state->cfg.split_tuner_read_i2c || rd_num == 0) {
|
||||
ret = i2c_transfer(state->i2c_client->adapter, new_msgs, j);
|
||||
} else {
|
||||
/*
|
||||
* Split transactions at each I2C_M_RD message.
|
||||
* Some of the parent device require this,
|
||||
* such as Friio (see. dvb-usb-gl861).
|
||||
*/
|
||||
int from, to;
|
||||
|
||||
ret = 0;
|
||||
from = 0;
|
||||
do {
|
||||
int r;
|
||||
|
||||
to = from + 1;
|
||||
while (to < j && !(new_msgs[to].flags & I2C_M_RD))
|
||||
to++;
|
||||
r = i2c_transfer(state->i2c_client->adapter,
|
||||
&new_msgs[from], to - from);
|
||||
ret = (r <= 0) ? r : ret + r;
|
||||
from = to;
|
||||
} while (from < j && ret > 0);
|
||||
}
|
||||
|
||||
if (ret >= 0 && ret < j)
|
||||
ret = -EIO;
|
||||
kfree(new_msgs);
|
||||
|
@ -28,6 +28,9 @@ struct tc90522_config {
|
||||
|
||||
/* [OUT] tuner I2C adapter returned by driver */
|
||||
struct i2c_adapter *tuner_i2c;
|
||||
|
||||
/* [IN] use two separate I2C transactions for one tuner read */
|
||||
bool split_tuner_read_i2c;
|
||||
};
|
||||
|
||||
#endif /* TC90522_H */
|
||||
|
@ -566,10 +566,23 @@ config VIDEO_APTINA_PLL
|
||||
config VIDEO_SMIAPP_PLL
|
||||
tristate
|
||||
|
||||
if MEDIA_CAMERA_SUPPORT
|
||||
|
||||
config VIDEO_HI556
|
||||
tristate "Hynix Hi-556 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CONTROLLER
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Hynix
|
||||
Hi-556 camera.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called hi556.
|
||||
|
||||
config VIDEO_IMX214
|
||||
tristate "Sony IMX214 sensor support"
|
||||
depends on GPIOLIB && I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
depends on V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Sony
|
||||
@ -581,7 +594,6 @@ config VIDEO_IMX214
|
||||
config VIDEO_IMX258
|
||||
tristate "Sony IMX258 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Sony
|
||||
IMX258 camera.
|
||||
@ -592,16 +604,25 @@ config VIDEO_IMX258
|
||||
config VIDEO_IMX274
|
||||
tristate "Sony IMX274 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select REGMAP_I2C
|
||||
help
|
||||
This is a V4L2 sensor driver for the Sony IMX274
|
||||
CMOS image sensor.
|
||||
|
||||
config VIDEO_IMX290
|
||||
tristate "Sony IMX290 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Sony
|
||||
IMX290 camera sensor.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called imx290.
|
||||
|
||||
config VIDEO_IMX319
|
||||
tristate "Sony IMX319 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Sony
|
||||
IMX319 camera.
|
||||
@ -612,7 +633,6 @@ config VIDEO_IMX319
|
||||
config VIDEO_IMX355
|
||||
tristate "Sony IMX355 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Sony
|
||||
IMX355 camera.
|
||||
@ -623,7 +643,6 @@ config VIDEO_IMX355
|
||||
config VIDEO_OV2640
|
||||
tristate "OmniVision OV2640 sensor support"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV2640 camera.
|
||||
@ -633,8 +652,7 @@ config VIDEO_OV2640
|
||||
|
||||
config VIDEO_OV2659
|
||||
tristate "OmniVision OV2659 sensor support"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
depends on VIDEO_V4L2 && I2C && GPIOLIB
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
@ -646,7 +664,6 @@ config VIDEO_OV2659
|
||||
config VIDEO_OV2680
|
||||
tristate "OmniVision OV2680 sensor support"
|
||||
depends on VIDEO_V4L2 && I2C && MEDIA_CONTROLLER
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
@ -658,7 +675,6 @@ config VIDEO_OV2680
|
||||
config VIDEO_OV2685
|
||||
tristate "OmniVision OV2685 sensor support"
|
||||
depends on VIDEO_V4L2 && I2C && MEDIA_CONTROLLER
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
@ -671,7 +687,6 @@ config VIDEO_OV5640
|
||||
tristate "OmniVision OV5640 sensor support"
|
||||
depends on OF
|
||||
depends on GPIOLIB && VIDEO_V4L2 && I2C && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Omnivision
|
||||
@ -681,7 +696,6 @@ config VIDEO_OV5645
|
||||
tristate "OmniVision OV5645 sensor support"
|
||||
depends on OF
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
@ -693,7 +707,6 @@ config VIDEO_OV5645
|
||||
config VIDEO_OV5647
|
||||
tristate "OmniVision OV5647 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
@ -705,7 +718,6 @@ config VIDEO_OV5647
|
||||
config VIDEO_OV6650
|
||||
tristate "OmniVision OV6650 sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV6650 camera.
|
||||
@ -716,7 +728,6 @@ config VIDEO_OV6650
|
||||
config VIDEO_OV5670
|
||||
tristate "OmniVision OV5670 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
depends on MEDIA_CONTROLLER
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
@ -729,7 +740,6 @@ config VIDEO_OV5670
|
||||
config VIDEO_OV5675
|
||||
tristate "OmniVision OV5675 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
depends on MEDIA_CONTROLLER
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
@ -742,7 +752,7 @@ config VIDEO_OV5675
|
||||
config VIDEO_OV5695
|
||||
tristate "OmniVision OV5695 sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV5695 camera.
|
||||
@ -753,7 +763,6 @@ config VIDEO_OV5695
|
||||
config VIDEO_OV7251
|
||||
tristate "OmniVision OV7251 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
@ -765,7 +774,6 @@ config VIDEO_OV7251
|
||||
config VIDEO_OV772X
|
||||
tristate "OmniVision OV772x sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select REGMAP_SCCB
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
@ -777,7 +785,6 @@ config VIDEO_OV772X
|
||||
config VIDEO_OV7640
|
||||
tristate "OmniVision OV7640 sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV7640 camera.
|
||||
@ -788,7 +795,6 @@ config VIDEO_OV7640
|
||||
config VIDEO_OV7670
|
||||
tristate "OmniVision OV7670 sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
@ -798,7 +804,6 @@ config VIDEO_OV7670
|
||||
config VIDEO_OV7740
|
||||
tristate "OmniVision OV7740 sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
OV7740 VGA camera sensor.
|
||||
@ -806,7 +811,6 @@ config VIDEO_OV7740
|
||||
config VIDEO_OV8856
|
||||
tristate "OmniVision OV8856 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
@ -833,7 +837,6 @@ config VIDEO_OV9650
|
||||
config VIDEO_OV13858
|
||||
tristate "OmniVision OV13858 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the OmniVision
|
||||
@ -842,7 +845,6 @@ config VIDEO_OV13858
|
||||
config VIDEO_VS6624
|
||||
tristate "ST VS6624 sensor support"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the ST VS6624
|
||||
camera.
|
||||
@ -853,7 +855,6 @@ config VIDEO_VS6624
|
||||
config VIDEO_MT9M001
|
||||
tristate "mt9m001 support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This driver supports MT9M001 cameras from Micron, monochrome
|
||||
and colour models.
|
||||
@ -861,7 +862,6 @@ config VIDEO_MT9M001
|
||||
config VIDEO_MT9M032
|
||||
tristate "MT9M032 camera sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select VIDEO_APTINA_PLL
|
||||
help
|
||||
This driver supports MT9M032 camera sensors from Aptina, monochrome
|
||||
@ -878,7 +878,6 @@ config VIDEO_MT9M111
|
||||
config VIDEO_MT9P031
|
||||
tristate "Aptina MT9P031 support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select VIDEO_APTINA_PLL
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Aptina
|
||||
@ -887,7 +886,6 @@ config VIDEO_MT9P031
|
||||
config VIDEO_MT9T001
|
||||
tristate "Aptina MT9T001 support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Aptina
|
||||
(Micron) mt0t001 3 Mpixel camera.
|
||||
@ -895,7 +893,6 @@ config VIDEO_MT9T001
|
||||
config VIDEO_MT9T112
|
||||
tristate "Aptina MT9T111/MT9T112 support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Aptina
|
||||
(Micron) MT9T111 and MT9T112 3 Mpixel camera.
|
||||
@ -906,7 +903,6 @@ config VIDEO_MT9T112
|
||||
config VIDEO_MT9V011
|
||||
tristate "Micron mt9v011 sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Micron
|
||||
mt0v011 1.3 Mpixel camera. It currently only works with the
|
||||
@ -915,7 +911,6 @@ config VIDEO_MT9V011
|
||||
config VIDEO_MT9V032
|
||||
tristate "Micron MT9V032 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select REGMAP_I2C
|
||||
select V4L2_FWNODE
|
||||
help
|
||||
@ -925,7 +920,6 @@ config VIDEO_MT9V032
|
||||
config VIDEO_MT9V111
|
||||
tristate "Aptina MT9V111 sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This is a Video4Linux2 sensor driver for the Aptina/Micron
|
||||
MT9V111 sensor.
|
||||
@ -936,14 +930,12 @@ config VIDEO_MT9V111
|
||||
config VIDEO_SR030PC30
|
||||
tristate "Siliconfile SR030PC30 sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This driver supports SR030PC30 VGA camera from Siliconfile
|
||||
|
||||
config VIDEO_NOON010PC30
|
||||
tristate "Siliconfile NOON010PC30 sensor support"
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This driver supports NOON010PC30 CIF camera from Siliconfile
|
||||
|
||||
@ -952,7 +944,6 @@ source "drivers/media/i2c/m5mols/Kconfig"
|
||||
config VIDEO_RJ54N1
|
||||
tristate "Sharp RJ54N1CB0C sensor support"
|
||||
depends on I2C && VIDEO_V4L2
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This is a V4L2 sensor driver for Sharp RJ54N1CB0C CMOS image
|
||||
sensor.
|
||||
@ -962,7 +953,6 @@ config VIDEO_RJ54N1
|
||||
|
||||
config VIDEO_S5K6AA
|
||||
tristate "Samsung S5K6AAFX sensor support"
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
help
|
||||
This is a V4L2 sensor driver for Samsung S5K6AA(FX) 1.3M
|
||||
@ -970,7 +960,6 @@ config VIDEO_S5K6AA
|
||||
|
||||
config VIDEO_S5K6A3
|
||||
tristate "Samsung S5K6A3 sensor support"
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API
|
||||
help
|
||||
This is a V4L2 sensor driver for Samsung S5K6A3 raw
|
||||
@ -1002,12 +991,15 @@ config VIDEO_S5C73M3
|
||||
help
|
||||
This is a V4L2 sensor driver for Samsung S5C73M3
|
||||
8 Mpixel camera.
|
||||
endif
|
||||
|
||||
comment "Lens drivers"
|
||||
|
||||
if MEDIA_CAMERA_SUPPORT
|
||||
|
||||
config VIDEO_AD5820
|
||||
tristate "AD5820 lens voice coil support"
|
||||
depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
depends on GPIOLIB && I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
help
|
||||
This is a driver for the AD5820 camera lens voice coil.
|
||||
It is used for example in Nokia N900 (RX-51).
|
||||
@ -1042,12 +1034,15 @@ config VIDEO_DW9807_VCM
|
||||
capability. This is designed for linear control of
|
||||
voice coil motors, controlled via I2C serial interface.
|
||||
|
||||
endif
|
||||
|
||||
comment "Flash devices"
|
||||
|
||||
if MEDIA_CAMERA_SUPPORT
|
||||
|
||||
config VIDEO_ADP1653
|
||||
tristate "ADP1653 flash support"
|
||||
depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
help
|
||||
This is a driver for the ADP1653 flash controller. It is used for
|
||||
example in Nokia N900.
|
||||
@ -1055,7 +1050,6 @@ config VIDEO_ADP1653
|
||||
config VIDEO_LM3560
|
||||
tristate "LM3560 dual flash driver support"
|
||||
depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select REGMAP_I2C
|
||||
help
|
||||
This is a driver for the lm3560 dual flash controllers. It controls
|
||||
@ -1064,12 +1058,13 @@ config VIDEO_LM3560
|
||||
config VIDEO_LM3646
|
||||
tristate "LM3646 dual flash driver support"
|
||||
depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
depends on MEDIA_CAMERA_SUPPORT
|
||||
select REGMAP_I2C
|
||||
help
|
||||
This is a driver for the lm3646 dual flash controllers. It controls
|
||||
flash, torch LEDs.
|
||||
|
||||
endif
|
||||
|
||||
comment "Video improvement chips"
|
||||
|
||||
config VIDEO_UPD64031A
|
||||
@ -1113,6 +1108,7 @@ comment "SDR tuner chips"
|
||||
config SDR_MAX2175
|
||||
tristate "Maxim 2175 RF to Bits tuner"
|
||||
depends on VIDEO_V4L2 && MEDIA_SDR_SUPPORT && I2C
|
||||
select REGMAP_I2C
|
||||
help
|
||||
Support for Maxim 2175 tuner. It is an advanced analog/digital
|
||||
radio receiver with RF-to-Bits front-end designed for SDR solutions.
|
||||
|
@ -109,9 +109,11 @@ obj-$(CONFIG_VIDEO_I2C) += video-i2c.o
|
||||
obj-$(CONFIG_VIDEO_ML86V7667) += ml86v7667.o
|
||||
obj-$(CONFIG_VIDEO_OV2659) += ov2659.o
|
||||
obj-$(CONFIG_VIDEO_TC358743) += tc358743.o
|
||||
obj-$(CONFIG_VIDEO_HI556) += hi556.o
|
||||
obj-$(CONFIG_VIDEO_IMX214) += imx214.o
|
||||
obj-$(CONFIG_VIDEO_IMX258) += imx258.o
|
||||
obj-$(CONFIG_VIDEO_IMX274) += imx274.o
|
||||
obj-$(CONFIG_VIDEO_IMX290) += imx290.o
|
||||
obj-$(CONFIG_VIDEO_IMX319) += imx319.o
|
||||
obj-$(CONFIG_VIDEO_IMX355) += imx355.o
|
||||
obj-$(CONFIG_VIDEO_ST_MIPID02) += st-mipid02.o
|
||||
|
@ -19,13 +19,12 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
|
||||
#include <media/v4l2-ctrls.h>
|
||||
#include <media/v4l2-device.h>
|
||||
#include <media/v4l2-subdev.h>
|
||||
|
||||
#define AD5820_NAME "ad5820"
|
||||
|
||||
/* Register definitions */
|
||||
#define AD5820_POWER_DOWN (1 << 15)
|
||||
#define AD5820_DAC_SHIFT 4
|
||||
@ -47,6 +46,8 @@ struct ad5820_device {
|
||||
u32 focus_ramp_time;
|
||||
u32 focus_ramp_mode;
|
||||
|
||||
struct gpio_desc *enable_gpio;
|
||||
|
||||
struct mutex power_lock;
|
||||
int power_count;
|
||||
|
||||
@ -114,6 +115,8 @@ static int ad5820_power_off(struct ad5820_device *coil, bool standby)
|
||||
ret = ad5820_update_hw(coil);
|
||||
}
|
||||
|
||||
gpiod_set_value_cansleep(coil->enable_gpio, 0);
|
||||
|
||||
ret2 = regulator_disable(coil->vana);
|
||||
if (ret)
|
||||
return ret;
|
||||
@ -128,6 +131,8 @@ static int ad5820_power_on(struct ad5820_device *coil, bool restore)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
gpiod_set_value_cansleep(coil->enable_gpio, 1);
|
||||
|
||||
if (restore) {
|
||||
/* Restore the hardware settings. */
|
||||
coil->standby = false;
|
||||
@ -138,6 +143,7 @@ static int ad5820_power_on(struct ad5820_device *coil, bool restore)
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
gpiod_set_value_cansleep(coil->enable_gpio, 0);
|
||||
coil->standby = true;
|
||||
regulator_disable(coil->vana);
|
||||
|
||||
@ -304,11 +310,21 @@ static int ad5820_probe(struct i2c_client *client,
|
||||
return ret;
|
||||
}
|
||||
|
||||
coil->enable_gpio = devm_gpiod_get_optional(&client->dev, "enable",
|
||||
GPIOD_OUT_LOW);
|
||||
if (IS_ERR(coil->enable_gpio)) {
|
||||
ret = PTR_ERR(coil->enable_gpio);
|
||||
if (ret != -EPROBE_DEFER)
|
||||
dev_err(&client->dev, "could not get enable gpio\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
mutex_init(&coil->power_lock);
|
||||
|
||||
v4l2_i2c_subdev_init(&coil->subdev, client, &ad5820_ops);
|
||||
coil->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
|
||||
coil->subdev.internal_ops = &ad5820_internal_ops;
|
||||
coil->subdev.entity.function = MEDIA_ENT_F_LENS;
|
||||
strscpy(coil->subdev.name, "ad5820 focus", sizeof(coil->subdev.name));
|
||||
|
||||
ret = media_entity_pads_init(&coil->subdev.entity, 0, NULL);
|
||||
@ -341,17 +357,28 @@ static int ad5820_remove(struct i2c_client *client)
|
||||
}
|
||||
|
||||
static const struct i2c_device_id ad5820_id_table[] = {
|
||||
{ AD5820_NAME, 0 },
|
||||
{ "ad5820", 0 },
|
||||
{ "ad5821", 0 },
|
||||
{ "ad5823", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, ad5820_id_table);
|
||||
|
||||
static const struct of_device_id ad5820_of_table[] = {
|
||||
{ .compatible = "adi,ad5820" },
|
||||
{ .compatible = "adi,ad5821" },
|
||||
{ .compatible = "adi,ad5823" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ad5820_of_table);
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(ad5820_pm, ad5820_suspend, ad5820_resume);
|
||||
|
||||
static struct i2c_driver ad5820_i2c_driver = {
|
||||
.driver = {
|
||||
.name = AD5820_NAME,
|
||||
.name = "ad5820",
|
||||
.pm = &ad5820_pm,
|
||||
.of_match_table = ad5820_of_table,
|
||||
},
|
||||
.probe = ad5820_probe,
|
||||
.remove = ad5820_remove,
|
||||
|
@ -1309,9 +1309,6 @@ static int adv7180_probe(struct i2c_client *client,
|
||||
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
|
||||
return -EIO;
|
||||
|
||||
v4l_info(client, "chip found @ 0x%02x (%s)\n",
|
||||
client->addr, client->adapter->name);
|
||||
|
||||
state = devm_kzalloc(&client->dev, sizeof(*state), GFP_KERNEL);
|
||||
if (state == NULL)
|
||||
return -ENOMEM;
|
||||
@ -1382,6 +1379,9 @@ static int adv7180_probe(struct i2c_client *client,
|
||||
if (ret)
|
||||
goto err_free_irq;
|
||||
|
||||
v4l_info(client, "chip found @ 0x%02x (%s)\n",
|
||||
client->addr, client->adapter->name);
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_irq:
|
||||
|
@ -2547,7 +2547,7 @@ struct adv7842_cfg_read_infoframe {
|
||||
u8 payload_addr;
|
||||
};
|
||||
|
||||
static void log_infoframe(struct v4l2_subdev *sd, struct adv7842_cfg_read_infoframe *cri)
|
||||
static void log_infoframe(struct v4l2_subdev *sd, const struct adv7842_cfg_read_infoframe *cri)
|
||||
{
|
||||
int i;
|
||||
u8 buffer[32];
|
||||
@ -2585,7 +2585,7 @@ static void log_infoframe(struct v4l2_subdev *sd, struct adv7842_cfg_read_infofr
|
||||
static void adv7842_log_infoframes(struct v4l2_subdev *sd)
|
||||
{
|
||||
int i;
|
||||
struct adv7842_cfg_read_infoframe cri[] = {
|
||||
static const struct adv7842_cfg_read_infoframe cri[] = {
|
||||
{ "AVI", 0x01, 0xe0, 0x00 },
|
||||
{ "Audio", 0x02, 0xe3, 0x1c },
|
||||
{ "SDP", 0x04, 0xe6, 0x2a },
|
||||
|
@ -157,7 +157,7 @@ static int bt819_init(struct v4l2_subdev *sd)
|
||||
0x12, 0x04, /* 0x12 Output Format */
|
||||
0x13, 0x20, /* 0x13 Vertical Scaling msb 0x00
|
||||
chroma comb OFF, line drop scaling, interlace scaling
|
||||
BUG? Why does turning the chroma comb on fuck up color?
|
||||
BUG? Why does turning the chroma comb on screw up color?
|
||||
Bug in the bt819 stepping on my board?
|
||||
*/
|
||||
0x14, 0x00, /* 0x14 Vertical Scaling lsb */
|
||||
|
1200
drivers/media/i2c/hi556.c
Normal file
1200
drivers/media/i2c/hi556.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -47,6 +47,7 @@ struct imx214 {
|
||||
struct v4l2_ctrl *pixel_rate;
|
||||
struct v4l2_ctrl *link_freq;
|
||||
struct v4l2_ctrl *exposure;
|
||||
struct v4l2_ctrl *unit_size;
|
||||
|
||||
struct regulator_bulk_data supplies[IMX214_NUM_SUPPLIES];
|
||||
|
||||
@ -948,6 +949,10 @@ static int imx214_probe(struct i2c_client *client)
|
||||
static const s64 link_freq[] = {
|
||||
IMX214_DEFAULT_LINK_FREQ,
|
||||
};
|
||||
static const struct v4l2_area unit_size = {
|
||||
.width = 1120,
|
||||
.height = 1120,
|
||||
};
|
||||
int ret;
|
||||
|
||||
ret = imx214_parse_fwnode(dev);
|
||||
@ -1029,6 +1034,10 @@ static int imx214_probe(struct i2c_client *client)
|
||||
V4L2_CID_EXPOSURE,
|
||||
0, 3184, 1, 0x0c70);
|
||||
|
||||
imx214->unit_size = v4l2_ctrl_new_std_compound(&imx214->ctrls,
|
||||
NULL,
|
||||
V4L2_CID_UNIT_CELL_SIZE,
|
||||
v4l2_ctrl_ptr_create((void *)&unit_size));
|
||||
ret = imx214->ctrls.error;
|
||||
if (ret) {
|
||||
dev_err(&client->dev, "%s control init failed (%d)\n",
|
||||
|
884
drivers/media/i2c/imx290.c
Normal file
884
drivers/media/i2c/imx290.c
Normal file
@ -0,0 +1,884 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Sony IMX290 CMOS Image Sensor Driver
|
||||
*
|
||||
* Copyright (C) 2019 FRAMOS GmbH.
|
||||
*
|
||||
* Copyright (C) 2019 Linaro Ltd.
|
||||
* Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <media/media-entity.h>
|
||||
#include <media/v4l2-ctrls.h>
|
||||
#include <media/v4l2-device.h>
|
||||
#include <media/v4l2-fwnode.h>
|
||||
#include <media/v4l2-subdev.h>
|
||||
|
||||
#define IMX290_STANDBY 0x3000
|
||||
#define IMX290_REGHOLD 0x3001
|
||||
#define IMX290_XMSTA 0x3002
|
||||
#define IMX290_GAIN 0x3014
|
||||
|
||||
#define IMX290_DEFAULT_LINK_FREQ 445500000
|
||||
|
||||
static const char * const imx290_supply_name[] = {
|
||||
"vdda",
|
||||
"vddd",
|
||||
"vdddo",
|
||||
};
|
||||
|
||||
#define IMX290_NUM_SUPPLIES ARRAY_SIZE(imx290_supply_name)
|
||||
|
||||
struct imx290_regval {
|
||||
u16 reg;
|
||||
u8 val;
|
||||
};
|
||||
|
||||
struct imx290_mode {
|
||||
u32 width;
|
||||
u32 height;
|
||||
u32 pixel_rate;
|
||||
u32 link_freq_index;
|
||||
|
||||
const struct imx290_regval *data;
|
||||
u32 data_size;
|
||||
};
|
||||
|
||||
struct imx290 {
|
||||
struct device *dev;
|
||||
struct clk *xclk;
|
||||
struct regmap *regmap;
|
||||
|
||||
struct v4l2_subdev sd;
|
||||
struct v4l2_fwnode_endpoint ep;
|
||||
struct media_pad pad;
|
||||
struct v4l2_mbus_framefmt current_format;
|
||||
const struct imx290_mode *current_mode;
|
||||
|
||||
struct regulator_bulk_data supplies[IMX290_NUM_SUPPLIES];
|
||||
struct gpio_desc *rst_gpio;
|
||||
|
||||
struct v4l2_ctrl_handler ctrls;
|
||||
struct v4l2_ctrl *link_freq;
|
||||
struct v4l2_ctrl *pixel_rate;
|
||||
|
||||
struct mutex lock;
|
||||
};
|
||||
|
||||
struct imx290_pixfmt {
|
||||
u32 code;
|
||||
};
|
||||
|
||||
static const struct imx290_pixfmt imx290_formats[] = {
|
||||
{ MEDIA_BUS_FMT_SRGGB10_1X10 },
|
||||
};
|
||||
|
||||
static const struct regmap_config imx290_regmap_config = {
|
||||
.reg_bits = 16,
|
||||
.val_bits = 8,
|
||||
.cache_type = REGCACHE_RBTREE,
|
||||
};
|
||||
|
||||
static const struct imx290_regval imx290_global_init_settings[] = {
|
||||
{ 0x3007, 0x00 },
|
||||
{ 0x3009, 0x00 },
|
||||
{ 0x3018, 0x65 },
|
||||
{ 0x3019, 0x04 },
|
||||
{ 0x301a, 0x00 },
|
||||
{ 0x3443, 0x03 },
|
||||
{ 0x3444, 0x20 },
|
||||
{ 0x3445, 0x25 },
|
||||
{ 0x3407, 0x03 },
|
||||
{ 0x303a, 0x0c },
|
||||
{ 0x3040, 0x00 },
|
||||
{ 0x3041, 0x00 },
|
||||
{ 0x303c, 0x00 },
|
||||
{ 0x303d, 0x00 },
|
||||
{ 0x3042, 0x9c },
|
||||
{ 0x3043, 0x07 },
|
||||
{ 0x303e, 0x49 },
|
||||
{ 0x303f, 0x04 },
|
||||
{ 0x304b, 0x0a },
|
||||
{ 0x300f, 0x00 },
|
||||
{ 0x3010, 0x21 },
|
||||
{ 0x3012, 0x64 },
|
||||
{ 0x3016, 0x09 },
|
||||
{ 0x3070, 0x02 },
|
||||
{ 0x3071, 0x11 },
|
||||
{ 0x309b, 0x10 },
|
||||
{ 0x309c, 0x22 },
|
||||
{ 0x30a2, 0x02 },
|
||||
{ 0x30a6, 0x20 },
|
||||
{ 0x30a8, 0x20 },
|
||||
{ 0x30aa, 0x20 },
|
||||
{ 0x30ac, 0x20 },
|
||||
{ 0x30b0, 0x43 },
|
||||
{ 0x3119, 0x9e },
|
||||
{ 0x311c, 0x1e },
|
||||
{ 0x311e, 0x08 },
|
||||
{ 0x3128, 0x05 },
|
||||
{ 0x313d, 0x83 },
|
||||
{ 0x3150, 0x03 },
|
||||
{ 0x317e, 0x00 },
|
||||
{ 0x32b8, 0x50 },
|
||||
{ 0x32b9, 0x10 },
|
||||
{ 0x32ba, 0x00 },
|
||||
{ 0x32bb, 0x04 },
|
||||
{ 0x32c8, 0x50 },
|
||||
{ 0x32c9, 0x10 },
|
||||
{ 0x32ca, 0x00 },
|
||||
{ 0x32cb, 0x04 },
|
||||
{ 0x332c, 0xd3 },
|
||||
{ 0x332d, 0x10 },
|
||||
{ 0x332e, 0x0d },
|
||||
{ 0x3358, 0x06 },
|
||||
{ 0x3359, 0xe1 },
|
||||
{ 0x335a, 0x11 },
|
||||
{ 0x3360, 0x1e },
|
||||
{ 0x3361, 0x61 },
|
||||
{ 0x3362, 0x10 },
|
||||
{ 0x33b0, 0x50 },
|
||||
{ 0x33b2, 0x1a },
|
||||
{ 0x33b3, 0x04 },
|
||||
};
|
||||
|
||||
static const struct imx290_regval imx290_1080p_settings[] = {
|
||||
/* mode settings */
|
||||
{ 0x3007, 0x00 },
|
||||
{ 0x303a, 0x0c },
|
||||
{ 0x3414, 0x0a },
|
||||
{ 0x3472, 0x80 },
|
||||
{ 0x3473, 0x07 },
|
||||
{ 0x3418, 0x38 },
|
||||
{ 0x3419, 0x04 },
|
||||
{ 0x3012, 0x64 },
|
||||
{ 0x3013, 0x00 },
|
||||
{ 0x305c, 0x18 },
|
||||
{ 0x305d, 0x03 },
|
||||
{ 0x305e, 0x20 },
|
||||
{ 0x305f, 0x01 },
|
||||
{ 0x315e, 0x1a },
|
||||
{ 0x3164, 0x1a },
|
||||
{ 0x3480, 0x49 },
|
||||
/* data rate settings */
|
||||
{ 0x3009, 0x01 },
|
||||
{ 0x3405, 0x10 },
|
||||
{ 0x3446, 0x57 },
|
||||
{ 0x3447, 0x00 },
|
||||
{ 0x3448, 0x37 },
|
||||
{ 0x3449, 0x00 },
|
||||
{ 0x344a, 0x1f },
|
||||
{ 0x344b, 0x00 },
|
||||
{ 0x344c, 0x1f },
|
||||
{ 0x344d, 0x00 },
|
||||
{ 0x344e, 0x1f },
|
||||
{ 0x344f, 0x00 },
|
||||
{ 0x3450, 0x77 },
|
||||
{ 0x3451, 0x00 },
|
||||
{ 0x3452, 0x1f },
|
||||
{ 0x3453, 0x00 },
|
||||
{ 0x3454, 0x17 },
|
||||
{ 0x3455, 0x00 },
|
||||
{ 0x301c, 0x98 },
|
||||
{ 0x301d, 0x08 },
|
||||
};
|
||||
|
||||
static const struct imx290_regval imx290_720p_settings[] = {
|
||||
/* mode settings */
|
||||
{ 0x3007, 0x10 },
|
||||
{ 0x303a, 0x06 },
|
||||
{ 0x3414, 0x04 },
|
||||
{ 0x3472, 0x00 },
|
||||
{ 0x3473, 0x05 },
|
||||
{ 0x3418, 0xd0 },
|
||||
{ 0x3419, 0x02 },
|
||||
{ 0x3012, 0x64 },
|
||||
{ 0x3013, 0x00 },
|
||||
{ 0x305c, 0x20 },
|
||||
{ 0x305d, 0x00 },
|
||||
{ 0x305e, 0x20 },
|
||||
{ 0x305f, 0x01 },
|
||||
{ 0x315e, 0x1a },
|
||||
{ 0x3164, 0x1a },
|
||||
{ 0x3480, 0x49 },
|
||||
/* data rate settings */
|
||||
{ 0x3009, 0x01 },
|
||||
{ 0x3405, 0x10 },
|
||||
{ 0x3446, 0x4f },
|
||||
{ 0x3447, 0x00 },
|
||||
{ 0x3448, 0x2f },
|
||||
{ 0x3449, 0x00 },
|
||||
{ 0x344a, 0x17 },
|
||||
{ 0x344b, 0x00 },
|
||||
{ 0x344c, 0x17 },
|
||||
{ 0x344d, 0x00 },
|
||||
{ 0x344e, 0x17 },
|
||||
{ 0x344f, 0x00 },
|
||||
{ 0x3450, 0x57 },
|
||||
{ 0x3451, 0x00 },
|
||||
{ 0x3452, 0x17 },
|
||||
{ 0x3453, 0x00 },
|
||||
{ 0x3454, 0x17 },
|
||||
{ 0x3455, 0x00 },
|
||||
{ 0x301c, 0xe4 },
|
||||
{ 0x301d, 0x0c },
|
||||
};
|
||||
|
||||
static const struct imx290_regval imx290_10bit_settings[] = {
|
||||
{ 0x3005, 0x00},
|
||||
{ 0x3046, 0x00},
|
||||
{ 0x3129, 0x1d},
|
||||
{ 0x317c, 0x12},
|
||||
{ 0x31ec, 0x37},
|
||||
{ 0x3441, 0x0a},
|
||||
{ 0x3442, 0x0a},
|
||||
{ 0x300a, 0x3c},
|
||||
{ 0x300b, 0x00},
|
||||
};
|
||||
|
||||
/* supported link frequencies */
|
||||
static const s64 imx290_link_freq[] = {
|
||||
IMX290_DEFAULT_LINK_FREQ,
|
||||
};
|
||||
|
||||
/* Mode configs */
|
||||
static const struct imx290_mode imx290_modes[] = {
|
||||
{
|
||||
.width = 1920,
|
||||
.height = 1080,
|
||||
.data = imx290_1080p_settings,
|
||||
.data_size = ARRAY_SIZE(imx290_1080p_settings),
|
||||
.pixel_rate = 178200000,
|
||||
.link_freq_index = 0,
|
||||
},
|
||||
{
|
||||
.width = 1280,
|
||||
.height = 720,
|
||||
.data = imx290_720p_settings,
|
||||
.data_size = ARRAY_SIZE(imx290_720p_settings),
|
||||
.pixel_rate = 178200000,
|
||||
.link_freq_index = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static inline struct imx290 *to_imx290(struct v4l2_subdev *_sd)
|
||||
{
|
||||
return container_of(_sd, struct imx290, sd);
|
||||
}
|
||||
|
||||
static inline int imx290_read_reg(struct imx290 *imx290, u16 addr, u8 *value)
|
||||
{
|
||||
unsigned int regval;
|
||||
int ret;
|
||||
|
||||
ret = regmap_read(imx290->regmap, addr, ®val);
|
||||
if (ret) {
|
||||
dev_err(imx290->dev, "I2C read failed for addr: %x\n", addr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
*value = regval & 0xff;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int imx290_write_reg(struct imx290 *imx290, u16 addr, u8 value)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = regmap_write(imx290->regmap, addr, value);
|
||||
if (ret) {
|
||||
dev_err(imx290->dev, "I2C write failed for addr: %x\n", addr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int imx290_set_register_array(struct imx290 *imx290,
|
||||
const struct imx290_regval *settings,
|
||||
unsigned int num_settings)
|
||||
{
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
for (i = 0; i < num_settings; ++i, ++settings) {
|
||||
ret = imx290_write_reg(imx290, settings->reg, settings->val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Settle time is 10ms for all registers */
|
||||
msleep(10);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int imx290_write_buffered_reg(struct imx290 *imx290, u16 address_low,
|
||||
u8 nr_regs, u32 value)
|
||||
{
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
ret = imx290_write_reg(imx290, IMX290_REGHOLD, 0x01);
|
||||
if (ret) {
|
||||
dev_err(imx290->dev, "Error setting hold register\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
for (i = 0; i < nr_regs; i++) {
|
||||
ret = imx290_write_reg(imx290, address_low + i,
|
||||
(u8)(value >> (i * 8)));
|
||||
if (ret) {
|
||||
dev_err(imx290->dev, "Error writing buffered registers\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
ret = imx290_write_reg(imx290, IMX290_REGHOLD, 0x00);
|
||||
if (ret) {
|
||||
dev_err(imx290->dev, "Error setting hold register\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int imx290_set_gain(struct imx290 *imx290, u32 value)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = imx290_write_buffered_reg(imx290, IMX290_GAIN, 1, value);
|
||||
if (ret)
|
||||
dev_err(imx290->dev, "Unable to write gain\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Stop streaming */
|
||||
static int imx290_stop_streaming(struct imx290 *imx290)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = imx290_write_reg(imx290, IMX290_STANDBY, 0x01);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
msleep(30);
|
||||
|
||||
return imx290_write_reg(imx290, IMX290_XMSTA, 0x01);
|
||||
}
|
||||
|
||||
static int imx290_set_ctrl(struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
struct imx290 *imx290 = container_of(ctrl->handler,
|
||||
struct imx290, ctrls);
|
||||
int ret = 0;
|
||||
|
||||
/* V4L2 controls values will be applied only when power is already up */
|
||||
if (!pm_runtime_get_if_in_use(imx290->dev))
|
||||
return 0;
|
||||
|
||||
switch (ctrl->id) {
|
||||
case V4L2_CID_GAIN:
|
||||
ret = imx290_set_gain(imx290, ctrl->val);
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
pm_runtime_put(imx290->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct v4l2_ctrl_ops imx290_ctrl_ops = {
|
||||
.s_ctrl = imx290_set_ctrl,
|
||||
};
|
||||
|
||||
static int imx290_enum_mbus_code(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_mbus_code_enum *code)
|
||||
{
|
||||
if (code->index >= ARRAY_SIZE(imx290_formats))
|
||||
return -EINVAL;
|
||||
|
||||
code->code = imx290_formats[code->index].code;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int imx290_get_fmt(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_format *fmt)
|
||||
{
|
||||
struct imx290 *imx290 = to_imx290(sd);
|
||||
struct v4l2_mbus_framefmt *framefmt;
|
||||
|
||||
mutex_lock(&imx290->lock);
|
||||
|
||||
if (fmt->which == V4L2_SUBDEV_FORMAT_TRY)
|
||||
framefmt = v4l2_subdev_get_try_format(&imx290->sd, cfg,
|
||||
fmt->pad);
|
||||
else
|
||||
framefmt = &imx290->current_format;
|
||||
|
||||
fmt->format = *framefmt;
|
||||
|
||||
mutex_unlock(&imx290->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int imx290_set_fmt(struct v4l2_subdev *sd,
|
||||
struct v4l2_subdev_pad_config *cfg,
|
||||
struct v4l2_subdev_format *fmt)
|
||||
{
|
||||
struct imx290 *imx290 = to_imx290(sd);
|
||||
const struct imx290_mode *mode;
|
||||
struct v4l2_mbus_framefmt *format;
|
||||
unsigned int i;
|
||||
|
||||
mutex_lock(&imx290->lock);
|
||||
|
||||
mode = v4l2_find_nearest_size(imx290_modes,
|
||||
ARRAY_SIZE(imx290_modes),
|
||||
width, height,
|
||||
fmt->format.width, fmt->format.height);
|
||||
|
||||
fmt->format.width = mode->width;
|
||||
fmt->format.height = mode->height;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(imx290_formats); i++)
|
||||
if (imx290_formats[i].code == fmt->format.code)
|
||||
break;
|
||||
|
||||
if (i >= ARRAY_SIZE(imx290_formats))
|
||||
i = 0;
|
||||
|
||||
fmt->format.code = imx290_formats[i].code;
|
||||
fmt->format.field = V4L2_FIELD_NONE;
|
||||
|
||||
if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
|
||||
format = v4l2_subdev_get_try_format(sd, cfg, fmt->pad);
|
||||
} else {
|
||||
format = &imx290->current_format;
|
||||
__v4l2_ctrl_s_ctrl(imx290->link_freq, mode->link_freq_index);
|
||||
__v4l2_ctrl_s_ctrl_int64(imx290->pixel_rate, mode->pixel_rate);
|
||||
|
||||
imx290->current_mode = mode;
|
||||
}
|
||||
|
||||
*format = fmt->format;
|
||||
|
||||
mutex_unlock(&imx290->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int imx290_entity_init_cfg(struct v4l2_subdev *subdev,
|
||||
struct v4l2_subdev_pad_config *cfg)
|
||||
{
|
||||
struct v4l2_subdev_format fmt = { 0 };
|
||||
|
||||
fmt.which = cfg ? V4L2_SUBDEV_FORMAT_TRY : V4L2_SUBDEV_FORMAT_ACTIVE;
|
||||
fmt.format.width = 1920;
|
||||
fmt.format.height = 1080;
|
||||
|
||||
imx290_set_fmt(subdev, cfg, &fmt);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int imx290_write_current_format(struct imx290 *imx290,
|
||||
struct v4l2_mbus_framefmt *format)
|
||||
{
|
||||
int ret;
|
||||
|
||||
switch (format->code) {
|
||||
case MEDIA_BUS_FMT_SRGGB10_1X10:
|
||||
ret = imx290_set_register_array(imx290, imx290_10bit_settings,
|
||||
ARRAY_SIZE(
|
||||
imx290_10bit_settings));
|
||||
if (ret < 0) {
|
||||
dev_err(imx290->dev, "Could not set format registers\n");
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
dev_err(imx290->dev, "Unknown pixel format\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Start streaming */
|
||||
static int imx290_start_streaming(struct imx290 *imx290)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Set init register settings */
|
||||
ret = imx290_set_register_array(imx290, imx290_global_init_settings,
|
||||
ARRAY_SIZE(
|
||||
imx290_global_init_settings));
|
||||
if (ret < 0) {
|
||||
dev_err(imx290->dev, "Could not set init registers\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Set current frame format */
|
||||
ret = imx290_write_current_format(imx290, &imx290->current_format);
|
||||
if (ret < 0) {
|
||||
dev_err(imx290->dev, "Could not set frame format\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Apply default values of current mode */
|
||||
ret = imx290_set_register_array(imx290, imx290->current_mode->data,
|
||||
imx290->current_mode->data_size);
|
||||
if (ret < 0) {
|
||||
dev_err(imx290->dev, "Could not set current mode\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Apply customized values from user */
|
||||
ret = v4l2_ctrl_handler_setup(imx290->sd.ctrl_handler);
|
||||
if (ret) {
|
||||
dev_err(imx290->dev, "Could not sync v4l2 controls\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = imx290_write_reg(imx290, IMX290_STANDBY, 0x00);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
msleep(30);
|
||||
|
||||
/* Start streaming */
|
||||
return imx290_write_reg(imx290, IMX290_XMSTA, 0x00);
|
||||
}
|
||||
|
||||
static int imx290_set_stream(struct v4l2_subdev *sd, int enable)
|
||||
{
|
||||
struct imx290 *imx290 = to_imx290(sd);
|
||||
int ret = 0;
|
||||
|
||||
if (enable) {
|
||||
ret = pm_runtime_get_sync(imx290->dev);
|
||||
if (ret < 0) {
|
||||
pm_runtime_put_noidle(imx290->dev);
|
||||
goto unlock_and_return;
|
||||
}
|
||||
|
||||
ret = imx290_start_streaming(imx290);
|
||||
if (ret) {
|
||||
dev_err(imx290->dev, "Start stream failed\n");
|
||||
pm_runtime_put(imx290->dev);
|
||||
goto unlock_and_return;
|
||||
}
|
||||
} else {
|
||||
imx290_stop_streaming(imx290);
|
||||
pm_runtime_put(imx290->dev);
|
||||
}
|
||||
|
||||
unlock_and_return:
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int imx290_get_regulators(struct device *dev, struct imx290 *imx290)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < IMX290_NUM_SUPPLIES; i++)
|
||||
imx290->supplies[i].supply = imx290_supply_name[i];
|
||||
|
||||
return devm_regulator_bulk_get(dev, IMX290_NUM_SUPPLIES,
|
||||
imx290->supplies);
|
||||
}
|
||||
|
||||
static int imx290_power_on(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct v4l2_subdev *sd = i2c_get_clientdata(client);
|
||||
struct imx290 *imx290 = to_imx290(sd);
|
||||
int ret;
|
||||
|
||||
ret = clk_prepare_enable(imx290->xclk);
|
||||
if (ret) {
|
||||
dev_err(imx290->dev, "Failed to enable clock\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = regulator_bulk_enable(IMX290_NUM_SUPPLIES, imx290->supplies);
|
||||
if (ret) {
|
||||
dev_err(imx290->dev, "Failed to enable regulators\n");
|
||||
clk_disable_unprepare(imx290->xclk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
usleep_range(1, 2);
|
||||
gpiod_set_value_cansleep(imx290->rst_gpio, 1);
|
||||
usleep_range(30000, 31000);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int imx290_power_off(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct v4l2_subdev *sd = i2c_get_clientdata(client);
|
||||
struct imx290 *imx290 = to_imx290(sd);
|
||||
|
||||
clk_disable_unprepare(imx290->xclk);
|
||||
gpiod_set_value_cansleep(imx290->rst_gpio, 0);
|
||||
regulator_bulk_disable(IMX290_NUM_SUPPLIES, imx290->supplies);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops imx290_pm_ops = {
|
||||
SET_RUNTIME_PM_OPS(imx290_power_on, imx290_power_off, NULL)
|
||||
};
|
||||
|
||||
static const struct v4l2_subdev_video_ops imx290_video_ops = {
|
||||
.s_stream = imx290_set_stream,
|
||||
};
|
||||
|
||||
static const struct v4l2_subdev_pad_ops imx290_pad_ops = {
|
||||
.init_cfg = imx290_entity_init_cfg,
|
||||
.enum_mbus_code = imx290_enum_mbus_code,
|
||||
.get_fmt = imx290_get_fmt,
|
||||
.set_fmt = imx290_set_fmt,
|
||||
};
|
||||
|
||||
static const struct v4l2_subdev_ops imx290_subdev_ops = {
|
||||
.video = &imx290_video_ops,
|
||||
.pad = &imx290_pad_ops,
|
||||
};
|
||||
|
||||
static const struct media_entity_operations imx290_subdev_entity_ops = {
|
||||
.link_validate = v4l2_subdev_link_validate,
|
||||
};
|
||||
|
||||
static int imx290_probe(struct i2c_client *client)
|
||||
{
|
||||
struct device *dev = &client->dev;
|
||||
struct fwnode_handle *endpoint;
|
||||
struct imx290 *imx290;
|
||||
u32 xclk_freq;
|
||||
int ret;
|
||||
|
||||
imx290 = devm_kzalloc(dev, sizeof(*imx290), GFP_KERNEL);
|
||||
if (!imx290)
|
||||
return -ENOMEM;
|
||||
|
||||
imx290->dev = dev;
|
||||
imx290->regmap = devm_regmap_init_i2c(client, &imx290_regmap_config);
|
||||
if (IS_ERR(imx290->regmap)) {
|
||||
dev_err(dev, "Unable to initialize I2C\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
endpoint = fwnode_graph_get_next_endpoint(dev_fwnode(dev), NULL);
|
||||
if (!endpoint) {
|
||||
dev_err(dev, "Endpoint node not found\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = v4l2_fwnode_endpoint_alloc_parse(endpoint, &imx290->ep);
|
||||
fwnode_handle_put(endpoint);
|
||||
if (ret) {
|
||||
dev_err(dev, "Parsing endpoint node failed\n");
|
||||
goto free_err;
|
||||
}
|
||||
|
||||
if (!imx290->ep.nr_of_link_frequencies) {
|
||||
dev_err(dev, "link-frequency property not found in DT\n");
|
||||
ret = -EINVAL;
|
||||
goto free_err;
|
||||
}
|
||||
|
||||
if (imx290->ep.link_frequencies[0] != IMX290_DEFAULT_LINK_FREQ) {
|
||||
dev_err(dev, "Unsupported link frequency\n");
|
||||
ret = -EINVAL;
|
||||
goto free_err;
|
||||
}
|
||||
|
||||
/* Only CSI2 is supported for now */
|
||||
if (imx290->ep.bus_type != V4L2_MBUS_CSI2_DPHY) {
|
||||
dev_err(dev, "Unsupported bus type, should be CSI2\n");
|
||||
ret = -EINVAL;
|
||||
goto free_err;
|
||||
}
|
||||
|
||||
/* Set default mode to max resolution */
|
||||
imx290->current_mode = &imx290_modes[0];
|
||||
|
||||
/* get system clock (xclk) */
|
||||
imx290->xclk = devm_clk_get(dev, "xclk");
|
||||
if (IS_ERR(imx290->xclk)) {
|
||||
dev_err(dev, "Could not get xclk");
|
||||
ret = PTR_ERR(imx290->xclk);
|
||||
goto free_err;
|
||||
}
|
||||
|
||||
ret = fwnode_property_read_u32(dev_fwnode(dev), "clock-frequency",
|
||||
&xclk_freq);
|
||||
if (ret) {
|
||||
dev_err(dev, "Could not get xclk frequency\n");
|
||||
goto free_err;
|
||||
}
|
||||
|
||||
/* external clock must be 37.125 MHz */
|
||||
if (xclk_freq != 37125000) {
|
||||
dev_err(dev, "External clock frequency %u is not supported\n",
|
||||
xclk_freq);
|
||||
ret = -EINVAL;
|
||||
goto free_err;
|
||||
}
|
||||
|
||||
ret = clk_set_rate(imx290->xclk, xclk_freq);
|
||||
if (ret) {
|
||||
dev_err(dev, "Could not set xclk frequency\n");
|
||||
goto free_err;
|
||||
}
|
||||
|
||||
ret = imx290_get_regulators(dev, imx290);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Cannot get regulators\n");
|
||||
goto free_err;
|
||||
}
|
||||
|
||||
imx290->rst_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_ASIS);
|
||||
if (IS_ERR(imx290->rst_gpio)) {
|
||||
dev_err(dev, "Cannot get reset gpio\n");
|
||||
ret = PTR_ERR(imx290->rst_gpio);
|
||||
goto free_err;
|
||||
}
|
||||
|
||||
mutex_init(&imx290->lock);
|
||||
|
||||
v4l2_ctrl_handler_init(&imx290->ctrls, 3);
|
||||
|
||||
v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops,
|
||||
V4L2_CID_GAIN, 0, 72, 1, 0);
|
||||
imx290->link_freq =
|
||||
v4l2_ctrl_new_int_menu(&imx290->ctrls,
|
||||
&imx290_ctrl_ops,
|
||||
V4L2_CID_LINK_FREQ,
|
||||
ARRAY_SIZE(imx290_link_freq) - 1,
|
||||
0, imx290_link_freq);
|
||||
if (imx290->link_freq)
|
||||
imx290->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
|
||||
|
||||
imx290->pixel_rate = v4l2_ctrl_new_std(&imx290->ctrls, &imx290_ctrl_ops,
|
||||
V4L2_CID_PIXEL_RATE, 1,
|
||||
INT_MAX, 1,
|
||||
imx290_modes[0].pixel_rate);
|
||||
|
||||
imx290->sd.ctrl_handler = &imx290->ctrls;
|
||||
|
||||
if (imx290->ctrls.error) {
|
||||
dev_err(dev, "Control initialization error %d\n",
|
||||
imx290->ctrls.error);
|
||||
ret = imx290->ctrls.error;
|
||||
goto free_ctrl;
|
||||
}
|
||||
|
||||
v4l2_i2c_subdev_init(&imx290->sd, client, &imx290_subdev_ops);
|
||||
imx290->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
|
||||
imx290->sd.dev = &client->dev;
|
||||
imx290->sd.entity.ops = &imx290_subdev_entity_ops;
|
||||
imx290->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
|
||||
|
||||
imx290->pad.flags = MEDIA_PAD_FL_SOURCE;
|
||||
ret = media_entity_pads_init(&imx290->sd.entity, 1, &imx290->pad);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Could not register media entity\n");
|
||||
goto free_ctrl;
|
||||
}
|
||||
|
||||
ret = v4l2_async_register_subdev(&imx290->sd);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Could not register v4l2 device\n");
|
||||
goto free_entity;
|
||||
}
|
||||
|
||||
/* Power on the device to match runtime PM state below */
|
||||
ret = imx290_power_on(dev);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Could not power on the device\n");
|
||||
goto free_entity;
|
||||
}
|
||||
|
||||
pm_runtime_set_active(dev);
|
||||
pm_runtime_enable(dev);
|
||||
pm_runtime_idle(dev);
|
||||
|
||||
v4l2_fwnode_endpoint_free(&imx290->ep);
|
||||
|
||||
return 0;
|
||||
|
||||
free_entity:
|
||||
media_entity_cleanup(&imx290->sd.entity);
|
||||
free_ctrl:
|
||||
v4l2_ctrl_handler_free(&imx290->ctrls);
|
||||
mutex_destroy(&imx290->lock);
|
||||
free_err:
|
||||
v4l2_fwnode_endpoint_free(&imx290->ep);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int imx290_remove(struct i2c_client *client)
|
||||
{
|
||||
struct v4l2_subdev *sd = i2c_get_clientdata(client);
|
||||
struct imx290 *imx290 = to_imx290(sd);
|
||||
|
||||
v4l2_async_unregister_subdev(sd);
|
||||
media_entity_cleanup(&sd->entity);
|
||||
v4l2_ctrl_handler_free(sd->ctrl_handler);
|
||||
|
||||
mutex_destroy(&imx290->lock);
|
||||
|
||||
pm_runtime_disable(imx290->dev);
|
||||
if (!pm_runtime_status_suspended(imx290->dev))
|
||||
imx290_power_off(imx290->dev);
|
||||
pm_runtime_set_suspended(imx290->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id imx290_of_match[] = {
|
||||
{ .compatible = "sony,imx290" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, imx290_of_match);
|
||||
|
||||
static struct i2c_driver imx290_i2c_driver = {
|
||||
.probe_new = imx290_probe,
|
||||
.remove = imx290_remove,
|
||||
.driver = {
|
||||
.name = "imx290",
|
||||
.pm = &imx290_pm_ops,
|
||||
.of_match_table = of_match_ptr(imx290_of_match),
|
||||
},
|
||||
};
|
||||
|
||||
module_i2c_driver(imx290_i2c_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Sony IMX290 CMOS Image Sensor Driver");
|
||||
MODULE_AUTHOR("FRAMOS GmbH");
|
||||
MODULE_AUTHOR("Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>");
|
||||
MODULE_LICENSE("GPL v2");
|
@ -134,7 +134,7 @@ static int lm3646_set_ctrl(struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
struct lm3646_flash *flash = to_lm3646_flash(ctrl);
|
||||
unsigned int reg_val;
|
||||
int rval = -EINVAL;
|
||||
int rval;
|
||||
|
||||
switch (ctrl->id) {
|
||||
case V4L2_CID_FLASH_LED_MODE:
|
||||
|
@ -591,8 +591,8 @@ static int max2175_set_lo_freq(struct max2175 *ctx, u32 lo_freq)
|
||||
lo_freq *= lo_mult;
|
||||
|
||||
int_desired = lo_freq / ctx->xtal_freq;
|
||||
frac_desired = div_u64((u64)(lo_freq % ctx->xtal_freq) << 20,
|
||||
ctx->xtal_freq);
|
||||
frac_desired = div64_ul((u64)(lo_freq % ctx->xtal_freq) << 20,
|
||||
ctx->xtal_freq);
|
||||
|
||||
/* Check CSM is not busy */
|
||||
ret = max2175_poll_csm_ready(ctx);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Maxim Integrated MAX2175 RF to Bits tuner driver
|
||||
*
|
||||
* This driver & most of the hard coded values are based on the reference
|
||||
|
@ -167,7 +167,7 @@ static int multi_reg_write(struct i2c_client *client,
|
||||
|
||||
static int mt9m001_init(struct i2c_client *client)
|
||||
{
|
||||
const struct mt9m001_reg init_regs[] = {
|
||||
static const struct mt9m001_reg init_regs[] = {
|
||||
/*
|
||||
* Issue a soft reset. This returns all registers to their
|
||||
* default values.
|
||||
|
@ -1,3 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Omnivision OV2659 CMOS Image Sensor driver
|
||||
*
|
||||
@ -5,46 +6,21 @@
|
||||
*
|
||||
* Benoit Parrot <bparrot@ti.com>
|
||||
* Lad, Prabhakar <prabhakar.csengg@gmail.com>
|
||||
*
|
||||
* This program is free software; you may redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/media.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_graph.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include <media/media-entity.h>
|
||||
#include <media/i2c/ov2659.h>
|
||||
#include <media/v4l2-common.h>
|
||||
#include <media/v4l2-ctrls.h>
|
||||
#include <media/v4l2-device.h>
|
||||
#include <media/v4l2-event.h>
|
||||
#include <media/v4l2-fwnode.h>
|
||||
#include <media/v4l2-image-sizes.h>
|
||||
#include <media/v4l2-mediabus.h>
|
||||
#include <media/v4l2-subdev.h>
|
||||
|
||||
#define DRIVER_NAME "ov2659"
|
||||
@ -232,6 +208,10 @@ struct ov2659 {
|
||||
struct sensor_register *format_ctrl_regs;
|
||||
struct ov2659_pll_ctrl pll;
|
||||
int streaming;
|
||||
/* used to control the sensor PWDN pin */
|
||||
struct gpio_desc *pwdn_gpio;
|
||||
/* used to control the sensor RESETB pin */
|
||||
struct gpio_desc *resetb_gpio;
|
||||
};
|
||||
|
||||
static const struct sensor_register ov2659_init_regs[] = {
|
||||
@ -419,10 +399,14 @@ static struct sensor_register ov2659_720p[] = {
|
||||
{ REG_TIMING_YINC, 0x11 },
|
||||
{ REG_TIMING_VERT_FORMAT, 0x80 },
|
||||
{ REG_TIMING_HORIZ_FORMAT, 0x00 },
|
||||
{ 0x370a, 0x12 },
|
||||
{ 0x3a03, 0xe8 },
|
||||
{ 0x3a09, 0x6f },
|
||||
{ 0x3a0b, 0x5d },
|
||||
{ 0x3a15, 0x9a },
|
||||
{ REG_VFIFO_READ_START_H, 0x00 },
|
||||
{ REG_VFIFO_READ_START_L, 0x80 },
|
||||
{ REG_ISP_CTRL02, 0x00 },
|
||||
{ REG_NULL, 0x00 },
|
||||
};
|
||||
|
||||
@ -661,7 +645,7 @@ static struct sensor_register ov2659_vga[] = {
|
||||
{ REG_TIMING_HORIZ_FORMAT, 0x01 },
|
||||
{ 0x370a, 0x52 },
|
||||
{ REG_VFIFO_READ_START_H, 0x00 },
|
||||
{ REG_VFIFO_READ_START_L, 0x80 },
|
||||
{ REG_VFIFO_READ_START_L, 0xa0 },
|
||||
{ REG_ISP_CTRL02, 0x10 },
|
||||
{ REG_NULL, 0x00 },
|
||||
};
|
||||
@ -709,7 +693,7 @@ static struct sensor_register ov2659_qvga[] = {
|
||||
{ REG_TIMING_HORIZ_FORMAT, 0x01 },
|
||||
{ 0x370a, 0x52 },
|
||||
{ REG_VFIFO_READ_START_H, 0x00 },
|
||||
{ REG_VFIFO_READ_START_L, 0x80 },
|
||||
{ REG_VFIFO_READ_START_L, 0xa0 },
|
||||
{ REG_ISP_CTRL02, 0x10 },
|
||||
{ REG_NULL, 0x00 },
|
||||
};
|
||||
@ -1198,14 +1182,27 @@ static int ov2659_s_stream(struct v4l2_subdev *sd, int on)
|
||||
/* Stop Streaming Sequence */
|
||||
ov2659_set_streaming(ov2659, 0);
|
||||
ov2659->streaming = on;
|
||||
pm_runtime_put(&client->dev);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
ov2659_set_pixel_clock(ov2659);
|
||||
ov2659_set_frame_size(ov2659);
|
||||
ov2659_set_format(ov2659);
|
||||
ov2659_set_streaming(ov2659, 1);
|
||||
ov2659->streaming = on;
|
||||
ret = pm_runtime_get_sync(&client->dev);
|
||||
if (ret < 0) {
|
||||
pm_runtime_put_noidle(&client->dev);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
ret = ov2659_init(sd, 0);
|
||||
if (!ret)
|
||||
ret = ov2659_set_pixel_clock(ov2659);
|
||||
if (!ret)
|
||||
ret = ov2659_set_frame_size(ov2659);
|
||||
if (!ret)
|
||||
ret = ov2659_set_format(ov2659);
|
||||
if (!ret) {
|
||||
ov2659_set_streaming(ov2659, 1);
|
||||
ov2659->streaming = on;
|
||||
}
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&ov2659->lock);
|
||||
@ -1239,12 +1236,18 @@ static int ov2659_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
struct ov2659 *ov2659 =
|
||||
container_of(ctrl->handler, struct ov2659, ctrls);
|
||||
struct i2c_client *client = ov2659->client;
|
||||
|
||||
/* V4L2 controls values will be applied only when power is already up */
|
||||
if (!pm_runtime_get_if_in_use(&client->dev))
|
||||
return 0;
|
||||
|
||||
switch (ctrl->id) {
|
||||
case V4L2_CID_TEST_PATTERN:
|
||||
return ov2659_set_test_pattern(ov2659, ctrl->val);
|
||||
}
|
||||
|
||||
pm_runtime_put(&client->dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1257,6 +1260,39 @@ static const char * const ov2659_test_pattern_menu[] = {
|
||||
"Vertical Color Bars",
|
||||
};
|
||||
|
||||
static int ov2659_power_off(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct v4l2_subdev *sd = i2c_get_clientdata(client);
|
||||
struct ov2659 *ov2659 = to_ov2659(sd);
|
||||
|
||||
dev_dbg(&client->dev, "%s:\n", __func__);
|
||||
|
||||
gpiod_set_value(ov2659->pwdn_gpio, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ov2659_power_on(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct v4l2_subdev *sd = i2c_get_clientdata(client);
|
||||
struct ov2659 *ov2659 = to_ov2659(sd);
|
||||
|
||||
dev_dbg(&client->dev, "%s:\n", __func__);
|
||||
|
||||
gpiod_set_value(ov2659->pwdn_gpio, 0);
|
||||
|
||||
if (ov2659->resetb_gpio) {
|
||||
gpiod_set_value(ov2659->resetb_gpio, 1);
|
||||
usleep_range(500, 1000);
|
||||
gpiod_set_value(ov2659->resetb_gpio, 0);
|
||||
usleep_range(3000, 5000);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* V4L2 subdev internal operations
|
||||
*/
|
||||
@ -1330,13 +1366,13 @@ static int ov2659_detect(struct v4l2_subdev *sd)
|
||||
unsigned short id;
|
||||
|
||||
id = OV265X_ID(pid, ver);
|
||||
if (id != OV2659_ID)
|
||||
if (id != OV2659_ID) {
|
||||
dev_err(&client->dev,
|
||||
"Sensor detection failed (%04X, %d)\n",
|
||||
id, ret);
|
||||
else {
|
||||
ret = -ENODEV;
|
||||
} else {
|
||||
dev_info(&client->dev, "Found OV%04X sensor\n", id);
|
||||
ret = ov2659_init(sd, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1413,6 +1449,18 @@ static int ov2659_probe(struct i2c_client *client)
|
||||
ov2659->xvclk_frequency > 27000000)
|
||||
return -EINVAL;
|
||||
|
||||
/* Optional gpio don't fail if not present */
|
||||
ov2659->pwdn_gpio = devm_gpiod_get_optional(&client->dev, "powerdown",
|
||||
GPIOD_OUT_LOW);
|
||||
if (IS_ERR(ov2659->pwdn_gpio))
|
||||
return PTR_ERR(ov2659->pwdn_gpio);
|
||||
|
||||
/* Optional gpio don't fail if not present */
|
||||
ov2659->resetb_gpio = devm_gpiod_get_optional(&client->dev, "reset",
|
||||
GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(ov2659->resetb_gpio))
|
||||
return PTR_ERR(ov2659->resetb_gpio);
|
||||
|
||||
v4l2_ctrl_handler_init(&ov2659->ctrls, 2);
|
||||
ov2659->link_frequency =
|
||||
v4l2_ctrl_new_std(&ov2659->ctrls, &ov2659_ctrl_ops,
|
||||
@ -1458,6 +1506,8 @@ static int ov2659_probe(struct i2c_client *client)
|
||||
ov2659->frame_size = &ov2659_framesizes[2];
|
||||
ov2659->format_ctrl_regs = ov2659_formats[0].format_ctrl_regs;
|
||||
|
||||
ov2659_power_on(&client->dev);
|
||||
|
||||
ret = ov2659_detect(sd);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
@ -1471,10 +1521,15 @@ static int ov2659_probe(struct i2c_client *client)
|
||||
|
||||
dev_info(&client->dev, "%s sensor driver registered !!\n", sd->name);
|
||||
|
||||
pm_runtime_set_active(&client->dev);
|
||||
pm_runtime_enable(&client->dev);
|
||||
pm_runtime_idle(&client->dev);
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
v4l2_ctrl_handler_free(&ov2659->ctrls);
|
||||
ov2659_power_off(&client->dev);
|
||||
media_entity_cleanup(&sd->entity);
|
||||
mutex_destroy(&ov2659->lock);
|
||||
return ret;
|
||||
@ -1490,9 +1545,18 @@ static int ov2659_remove(struct i2c_client *client)
|
||||
media_entity_cleanup(&sd->entity);
|
||||
mutex_destroy(&ov2659->lock);
|
||||
|
||||
pm_runtime_disable(&client->dev);
|
||||
if (!pm_runtime_status_suspended(&client->dev))
|
||||
ov2659_power_off(&client->dev);
|
||||
pm_runtime_set_suspended(&client->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops ov2659_pm_ops = {
|
||||
SET_RUNTIME_PM_OPS(ov2659_power_off, ov2659_power_on, NULL)
|
||||
};
|
||||
|
||||
static const struct i2c_device_id ov2659_id[] = {
|
||||
{ "ov2659", 0 },
|
||||
{ /* sentinel */ },
|
||||
@ -1510,6 +1574,7 @@ MODULE_DEVICE_TABLE(of, ov2659_of_match);
|
||||
static struct i2c_driver ov2659_i2c_driver = {
|
||||
.driver = {
|
||||
.name = DRIVER_NAME,
|
||||
.pm = &ov2659_pm_ops,
|
||||
.of_match_table = of_match_ptr(ov2659_of_match),
|
||||
},
|
||||
.probe_new = ov2659_probe,
|
||||
|
@ -193,6 +193,7 @@ struct ov5640_mode_info {
|
||||
|
||||
struct ov5640_ctrls {
|
||||
struct v4l2_ctrl_handler handler;
|
||||
struct v4l2_ctrl *pixel_rate;
|
||||
struct {
|
||||
struct v4l2_ctrl *auto_exp;
|
||||
struct v4l2_ctrl *exposure;
|
||||
@ -489,7 +490,6 @@ static const struct reg_value ov5640_setting_720P_1280_720[] = {
|
||||
};
|
||||
|
||||
static const struct reg_value ov5640_setting_1080P_1920_1080[] = {
|
||||
{0x3008, 0x42, 0, 0},
|
||||
{0x3c07, 0x08, 0, 0},
|
||||
{0x3c09, 0x1c, 0, 0}, {0x3c0a, 0x9c, 0, 0}, {0x3c0b, 0x40, 0, 0},
|
||||
{0x3814, 0x11, 0, 0},
|
||||
@ -517,7 +517,7 @@ static const struct reg_value ov5640_setting_1080P_1920_1080[] = {
|
||||
{0x3a0e, 0x03, 0, 0}, {0x3a0d, 0x04, 0, 0}, {0x3a14, 0x04, 0, 0},
|
||||
{0x3a15, 0x60, 0, 0}, {0x4407, 0x04, 0, 0},
|
||||
{0x460b, 0x37, 0, 0}, {0x460c, 0x20, 0, 0}, {0x3824, 0x04, 0, 0},
|
||||
{0x4005, 0x1a, 0, 0}, {0x3008, 0x02, 0, 0},
|
||||
{0x4005, 0x1a, 0, 0},
|
||||
};
|
||||
|
||||
static const struct reg_value ov5640_setting_QSXGA_2592_1944[] = {
|
||||
@ -1611,9 +1611,24 @@ ov5640_find_mode(struct ov5640_dev *sensor, enum ov5640_frame_rate fr,
|
||||
!(mode->hact == 640 && mode->vact == 480))
|
||||
return NULL;
|
||||
|
||||
/* 2592x1944 only works at 15fps max */
|
||||
if ((mode->hact == 2592 && mode->vact == 1944) &&
|
||||
fr > OV5640_15_FPS)
|
||||
return NULL;
|
||||
|
||||
return mode;
|
||||
}
|
||||
|
||||
static u64 ov5640_calc_pixel_rate(struct ov5640_dev *sensor)
|
||||
{
|
||||
u64 rate;
|
||||
|
||||
rate = sensor->current_mode->vtot * sensor->current_mode->htot;
|
||||
rate *= ov5640_framerates[sensor->current_fr];
|
||||
|
||||
return rate;
|
||||
}
|
||||
|
||||
/*
|
||||
* sensor changes between scaling and subsampling, go through
|
||||
* exposure calculation
|
||||
@ -1818,8 +1833,7 @@ static int ov5640_set_mode(struct ov5640_dev *sensor)
|
||||
* All the formats we support have 16 bits per pixel, seems to require
|
||||
* the same rate than YUV, so we can just use 16 bpp all the time.
|
||||
*/
|
||||
rate = mode->vtot * mode->htot * 16;
|
||||
rate *= ov5640_framerates[sensor->current_fr];
|
||||
rate = ov5640_calc_pixel_rate(sensor) * 16;
|
||||
if (sensor->ep.bus_type == V4L2_MBUS_CSI2_DPHY) {
|
||||
rate = rate / sensor->ep.bus.mipi_csi2.num_data_lanes;
|
||||
ret = ov5640_set_mipi_pclk(sensor, rate);
|
||||
@ -2233,6 +2247,8 @@ static int ov5640_set_fmt(struct v4l2_subdev *sd,
|
||||
if (mbus_fmt->code != sensor->fmt.code)
|
||||
sensor->pending_fmt_change = true;
|
||||
|
||||
__v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate,
|
||||
ov5640_calc_pixel_rate(sensor));
|
||||
out:
|
||||
mutex_unlock(&sensor->lock);
|
||||
return ret;
|
||||
@ -2657,6 +2673,11 @@ static int ov5640_init_controls(struct ov5640_dev *sensor)
|
||||
/* we can use our own mutex for the ctrl lock */
|
||||
hdl->lock = &sensor->lock;
|
||||
|
||||
/* Clock related controls */
|
||||
ctrls->pixel_rate = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_PIXEL_RATE,
|
||||
0, INT_MAX, 1,
|
||||
ov5640_calc_pixel_rate(sensor));
|
||||
|
||||
/* Auto/manual white balance */
|
||||
ctrls->auto_wb = v4l2_ctrl_new_std(hdl, ops,
|
||||
V4L2_CID_AUTO_WHITE_BALANCE,
|
||||
@ -2704,6 +2725,7 @@ static int ov5640_init_controls(struct ov5640_dev *sensor)
|
||||
goto free_ctrls;
|
||||
}
|
||||
|
||||
ctrls->pixel_rate->flags |= V4L2_CTRL_FLAG_READ_ONLY;
|
||||
ctrls->gain->flags |= V4L2_CTRL_FLAG_VOLATILE;
|
||||
ctrls->exposure->flags |= V4L2_CTRL_FLAG_VOLATILE;
|
||||
|
||||
@ -2816,6 +2838,9 @@ static int ov5640_s_frame_interval(struct v4l2_subdev *sd,
|
||||
sensor->frame_interval = fi->interval;
|
||||
sensor->current_mode = mode;
|
||||
sensor->pending_mode_change = true;
|
||||
|
||||
__v4l2_ctrl_s_ctrl_int64(sensor->ctrls.pixel_rate,
|
||||
ov5640_calc_pixel_rate(sensor));
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&sensor->lock);
|
||||
|
@ -1325,7 +1325,7 @@ static int ov5695_probe(struct i2c_client *client,
|
||||
goto err_power_off;
|
||||
#endif
|
||||
|
||||
ret = v4l2_async_register_subdev(sd);
|
||||
ret = v4l2_async_register_subdev_sensor_common(sd);
|
||||
if (ret) {
|
||||
dev_err(dev, "v4l2 async register subdev failed\n");
|
||||
goto err_clean_entity;
|
||||
|
@ -124,12 +124,13 @@
|
||||
|
||||
#define DEF_AECH 0x4D
|
||||
|
||||
#define CLKRC_6MHz 0x00
|
||||
#define CLKRC_8MHz 0x00
|
||||
#define CLKRC_12MHz 0x40
|
||||
#define CLKRC_16MHz 0x80
|
||||
#define CLKRC_24MHz 0xc0
|
||||
#define CLKRC_DIV_MASK 0x3f
|
||||
#define GET_CLKRC_DIV(x) (((x) & CLKRC_DIV_MASK) + 1)
|
||||
#define DEF_CLKRC 0x00
|
||||
|
||||
#define COMA_RESET BIT(7)
|
||||
#define COMA_QCIF BIT(5)
|
||||
@ -196,13 +197,33 @@ struct ov6650 {
|
||||
struct v4l2_clk *clk;
|
||||
bool half_scale; /* scale down output by 2 */
|
||||
struct v4l2_rect rect; /* sensor cropping window */
|
||||
unsigned long pclk_limit; /* from host */
|
||||
unsigned long pclk_max; /* from resolution and format */
|
||||
struct v4l2_fract tpf; /* as requested with s_frame_interval */
|
||||
u32 code;
|
||||
enum v4l2_colorspace colorspace;
|
||||
};
|
||||
|
||||
struct ov6650_xclk {
|
||||
unsigned long rate;
|
||||
u8 clkrc;
|
||||
};
|
||||
|
||||
static const struct ov6650_xclk ov6650_xclk[] = {
|
||||
{
|
||||
.rate = 8000000,
|
||||
.clkrc = CLKRC_8MHz,
|
||||
},
|
||||
{
|
||||
.rate = 12000000,
|
||||
.clkrc = CLKRC_12MHz,
|
||||
},
|
||||
{
|
||||
.rate = 16000000,
|
||||
.clkrc = CLKRC_16MHz,
|
||||
},
|
||||
{
|
||||
.rate = 24000000,
|
||||
.clkrc = CLKRC_24MHz,
|
||||
},
|
||||
};
|
||||
|
||||
static u32 ov6650_codes[] = {
|
||||
MEDIA_BUS_FMT_YUYV8_2X8,
|
||||
@ -213,6 +234,17 @@ static u32 ov6650_codes[] = {
|
||||
MEDIA_BUS_FMT_Y8_1X8,
|
||||
};
|
||||
|
||||
static const struct v4l2_mbus_framefmt ov6650_def_fmt = {
|
||||
.width = W_CIF,
|
||||
.height = H_CIF,
|
||||
.code = MEDIA_BUS_FMT_SBGGR8_1X8,
|
||||
.colorspace = V4L2_COLORSPACE_SRGB,
|
||||
.field = V4L2_FIELD_NONE,
|
||||
.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT,
|
||||
.quantization = V4L2_QUANTIZATION_DEFAULT,
|
||||
.xfer_func = V4L2_XFER_FUNC_DEFAULT,
|
||||
};
|
||||
|
||||
/* read a register */
|
||||
static int ov6650_reg_read(struct i2c_client *client, u8 reg, u8 *val)
|
||||
{
|
||||
@ -465,38 +497,39 @@ static int ov6650_set_selection(struct v4l2_subdev *sd,
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct ov6650 *priv = to_ov6650(client);
|
||||
struct v4l2_rect rect = sel->r;
|
||||
int ret;
|
||||
|
||||
if (sel->which != V4L2_SUBDEV_FORMAT_ACTIVE ||
|
||||
sel->target != V4L2_SEL_TGT_CROP)
|
||||
return -EINVAL;
|
||||
|
||||
v4l_bound_align_image(&rect.width, 2, W_CIF, 1,
|
||||
&rect.height, 2, H_CIF, 1, 0);
|
||||
v4l_bound_align_image(&rect.left, DEF_HSTRT << 1,
|
||||
(DEF_HSTRT << 1) + W_CIF - (__s32)rect.width, 1,
|
||||
&rect.top, DEF_VSTRT << 1,
|
||||
(DEF_VSTRT << 1) + H_CIF - (__s32)rect.height, 1,
|
||||
0);
|
||||
v4l_bound_align_image(&sel->r.width, 2, W_CIF, 1,
|
||||
&sel->r.height, 2, H_CIF, 1, 0);
|
||||
v4l_bound_align_image(&sel->r.left, DEF_HSTRT << 1,
|
||||
(DEF_HSTRT << 1) + W_CIF - (__s32)sel->r.width, 1,
|
||||
&sel->r.top, DEF_VSTRT << 1,
|
||||
(DEF_VSTRT << 1) + H_CIF - (__s32)sel->r.height,
|
||||
1, 0);
|
||||
|
||||
ret = ov6650_reg_write(client, REG_HSTRT, rect.left >> 1);
|
||||
ret = ov6650_reg_write(client, REG_HSTRT, sel->r.left >> 1);
|
||||
if (!ret) {
|
||||
priv->rect.left = rect.left;
|
||||
priv->rect.width += priv->rect.left - sel->r.left;
|
||||
priv->rect.left = sel->r.left;
|
||||
ret = ov6650_reg_write(client, REG_HSTOP,
|
||||
(rect.left + rect.width) >> 1);
|
||||
(sel->r.left + sel->r.width) >> 1);
|
||||
}
|
||||
if (!ret) {
|
||||
priv->rect.width = rect.width;
|
||||
ret = ov6650_reg_write(client, REG_VSTRT, rect.top >> 1);
|
||||
priv->rect.width = sel->r.width;
|
||||
ret = ov6650_reg_write(client, REG_VSTRT, sel->r.top >> 1);
|
||||
}
|
||||
if (!ret) {
|
||||
priv->rect.top = rect.top;
|
||||
priv->rect.height += priv->rect.top - sel->r.top;
|
||||
priv->rect.top = sel->r.top;
|
||||
ret = ov6650_reg_write(client, REG_VSTOP,
|
||||
(rect.top + rect.height) >> 1);
|
||||
(sel->r.top + sel->r.height) >> 1);
|
||||
}
|
||||
if (!ret)
|
||||
priv->rect.height = rect.height;
|
||||
priv->rect.height = sel->r.height;
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -512,12 +545,20 @@ static int ov6650_get_fmt(struct v4l2_subdev *sd,
|
||||
if (format->pad)
|
||||
return -EINVAL;
|
||||
|
||||
mf->width = priv->rect.width >> priv->half_scale;
|
||||
mf->height = priv->rect.height >> priv->half_scale;
|
||||
mf->code = priv->code;
|
||||
mf->colorspace = priv->colorspace;
|
||||
mf->field = V4L2_FIELD_NONE;
|
||||
/* initialize response with default media bus frame format */
|
||||
*mf = ov6650_def_fmt;
|
||||
|
||||
/* update media bus format code and frame size */
|
||||
if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
|
||||
mf->width = cfg->try_fmt.width;
|
||||
mf->height = cfg->try_fmt.height;
|
||||
mf->code = cfg->try_fmt.code;
|
||||
|
||||
} else {
|
||||
mf->width = priv->rect.width >> priv->half_scale;
|
||||
mf->height = priv->rect.height >> priv->half_scale;
|
||||
mf->code = priv->code;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -526,22 +567,7 @@ static bool is_unscaled_ok(int width, int height, struct v4l2_rect *rect)
|
||||
return width > rect->width >> 1 || height > rect->height >> 1;
|
||||
}
|
||||
|
||||
static u8 to_clkrc(struct v4l2_fract *timeperframe,
|
||||
unsigned long pclk_limit, unsigned long pclk_max)
|
||||
{
|
||||
unsigned long pclk;
|
||||
|
||||
if (timeperframe->numerator && timeperframe->denominator)
|
||||
pclk = pclk_max * timeperframe->denominator /
|
||||
(FRAME_RATE_MAX * timeperframe->numerator);
|
||||
else
|
||||
pclk = pclk_max;
|
||||
|
||||
if (pclk_limit && pclk_limit < pclk)
|
||||
pclk = pclk_limit;
|
||||
|
||||
return (pclk_max - 1) / pclk;
|
||||
}
|
||||
#define to_clkrc(div) ((div) - 1)
|
||||
|
||||
/* set the format we will capture in */
|
||||
static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
||||
@ -560,8 +586,7 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
||||
.r.height = mf->height << half_scale,
|
||||
};
|
||||
u32 code = mf->code;
|
||||
unsigned long mclk, pclk;
|
||||
u8 coma_set = 0, coma_mask = 0, coml_set, coml_mask, clkrc;
|
||||
u8 coma_set = 0, coma_mask = 0, coml_set, coml_mask;
|
||||
int ret;
|
||||
|
||||
/* select color matrix configuration for given color encoding */
|
||||
@ -610,58 +635,35 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
||||
dev_err(&client->dev, "Pixel format not handled: 0x%x\n", code);
|
||||
return -EINVAL;
|
||||
}
|
||||
priv->code = code;
|
||||
|
||||
if (code == MEDIA_BUS_FMT_Y8_1X8 ||
|
||||
code == MEDIA_BUS_FMT_SBGGR8_1X8) {
|
||||
coml_mask = COML_ONE_CHANNEL;
|
||||
coml_set = 0;
|
||||
priv->pclk_max = 4000000;
|
||||
} else {
|
||||
coml_mask = 0;
|
||||
coml_set = COML_ONE_CHANNEL;
|
||||
priv->pclk_max = 8000000;
|
||||
}
|
||||
|
||||
if (code == MEDIA_BUS_FMT_SBGGR8_1X8)
|
||||
priv->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
else if (code != 0)
|
||||
priv->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
|
||||
if (half_scale) {
|
||||
dev_dbg(&client->dev, "max resolution: QCIF\n");
|
||||
coma_set |= COMA_QCIF;
|
||||
priv->pclk_max /= 2;
|
||||
} else {
|
||||
dev_dbg(&client->dev, "max resolution: CIF\n");
|
||||
coma_mask |= COMA_QCIF;
|
||||
}
|
||||
priv->half_scale = half_scale;
|
||||
|
||||
clkrc = CLKRC_12MHz;
|
||||
mclk = 12000000;
|
||||
priv->pclk_limit = 1334000;
|
||||
dev_dbg(&client->dev, "using 12MHz input clock\n");
|
||||
|
||||
clkrc |= to_clkrc(&priv->tpf, priv->pclk_limit, priv->pclk_max);
|
||||
|
||||
pclk = priv->pclk_max / GET_CLKRC_DIV(clkrc);
|
||||
dev_dbg(&client->dev, "pixel clock divider: %ld.%ld\n",
|
||||
mclk / pclk, 10 * mclk % pclk / pclk);
|
||||
|
||||
ret = ov6650_set_selection(sd, NULL, &sel);
|
||||
if (!ret)
|
||||
ret = ov6650_reg_rmw(client, REG_COMA, coma_set, coma_mask);
|
||||
if (!ret)
|
||||
ret = ov6650_reg_write(client, REG_CLKRC, clkrc);
|
||||
if (!ret)
|
||||
ret = ov6650_reg_rmw(client, REG_COML, coml_set, coml_mask);
|
||||
|
||||
if (!ret) {
|
||||
mf->colorspace = priv->colorspace;
|
||||
mf->width = priv->rect.width >> half_scale;
|
||||
mf->height = priv->rect.height >> half_scale;
|
||||
priv->half_scale = half_scale;
|
||||
|
||||
ret = ov6650_reg_rmw(client, REG_COML, coml_set, coml_mask);
|
||||
}
|
||||
if (!ret)
|
||||
priv->code = code;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -680,8 +682,6 @@ static int ov6650_set_fmt(struct v4l2_subdev *sd,
|
||||
v4l_bound_align_image(&mf->width, 2, W_CIF, 1,
|
||||
&mf->height, 2, H_CIF, 1, 0);
|
||||
|
||||
mf->field = V4L2_FIELD_NONE;
|
||||
|
||||
switch (mf->code) {
|
||||
case MEDIA_BUS_FMT_Y10_1X10:
|
||||
mf->code = MEDIA_BUS_FMT_Y8_1X8;
|
||||
@ -691,20 +691,39 @@ static int ov6650_set_fmt(struct v4l2_subdev *sd,
|
||||
case MEDIA_BUS_FMT_YUYV8_2X8:
|
||||
case MEDIA_BUS_FMT_VYUY8_2X8:
|
||||
case MEDIA_BUS_FMT_UYVY8_2X8:
|
||||
mf->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
break;
|
||||
default:
|
||||
mf->code = MEDIA_BUS_FMT_SBGGR8_1X8;
|
||||
/* fall through */
|
||||
case MEDIA_BUS_FMT_SBGGR8_1X8:
|
||||
mf->colorspace = V4L2_COLORSPACE_SRGB;
|
||||
break;
|
||||
}
|
||||
|
||||
if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE)
|
||||
return ov6650_s_fmt(sd, mf);
|
||||
cfg->try_fmt = *mf;
|
||||
if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
|
||||
/* store media bus format code and frame size in pad config */
|
||||
cfg->try_fmt.width = mf->width;
|
||||
cfg->try_fmt.height = mf->height;
|
||||
cfg->try_fmt.code = mf->code;
|
||||
|
||||
/* return default mbus frame format updated with pad config */
|
||||
*mf = ov6650_def_fmt;
|
||||
mf->width = cfg->try_fmt.width;
|
||||
mf->height = cfg->try_fmt.height;
|
||||
mf->code = cfg->try_fmt.code;
|
||||
|
||||
} else {
|
||||
/* apply new media bus format code and frame size */
|
||||
int ret = ov6650_s_fmt(sd, mf);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* return default format updated with active size and code */
|
||||
*mf = ov6650_def_fmt;
|
||||
mf->width = priv->rect.width >> priv->half_scale;
|
||||
mf->height = priv->rect.height >> priv->half_scale;
|
||||
mf->code = priv->code;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -725,9 +744,7 @@ static int ov6650_g_frame_interval(struct v4l2_subdev *sd,
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct ov6650 *priv = to_ov6650(client);
|
||||
|
||||
ival->interval.numerator = GET_CLKRC_DIV(to_clkrc(&priv->tpf,
|
||||
priv->pclk_limit, priv->pclk_max));
|
||||
ival->interval.denominator = FRAME_RATE_MAX;
|
||||
ival->interval = priv->tpf;
|
||||
|
||||
dev_dbg(&client->dev, "Frame interval: %u/%u s\n",
|
||||
ival->interval.numerator, ival->interval.denominator);
|
||||
@ -742,7 +759,6 @@ static int ov6650_s_frame_interval(struct v4l2_subdev *sd,
|
||||
struct ov6650 *priv = to_ov6650(client);
|
||||
struct v4l2_fract *tpf = &ival->interval;
|
||||
int div, ret;
|
||||
u8 clkrc;
|
||||
|
||||
if (tpf->numerator == 0 || tpf->denominator == 0)
|
||||
div = 1; /* Reset to full rate */
|
||||
@ -754,19 +770,12 @@ static int ov6650_s_frame_interval(struct v4l2_subdev *sd,
|
||||
else if (div > GET_CLKRC_DIV(CLKRC_DIV_MASK))
|
||||
div = GET_CLKRC_DIV(CLKRC_DIV_MASK);
|
||||
|
||||
/*
|
||||
* Keep result to be used as tpf limit
|
||||
* for subsequent clock divider calculations
|
||||
*/
|
||||
priv->tpf.numerator = div;
|
||||
priv->tpf.denominator = FRAME_RATE_MAX;
|
||||
|
||||
clkrc = to_clkrc(&priv->tpf, priv->pclk_limit, priv->pclk_max);
|
||||
|
||||
ret = ov6650_reg_rmw(client, REG_CLKRC, clkrc, CLKRC_DIV_MASK);
|
||||
ret = ov6650_reg_rmw(client, REG_CLKRC, to_clkrc(div), CLKRC_DIV_MASK);
|
||||
if (!ret) {
|
||||
tpf->numerator = GET_CLKRC_DIV(clkrc);
|
||||
tpf->denominator = FRAME_RATE_MAX;
|
||||
priv->tpf.numerator = div;
|
||||
priv->tpf.denominator = FRAME_RATE_MAX;
|
||||
|
||||
*tpf = priv->tpf;
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -788,13 +797,15 @@ static int ov6650_reset(struct i2c_client *client)
|
||||
}
|
||||
|
||||
/* program default register values */
|
||||
static int ov6650_prog_dflt(struct i2c_client *client)
|
||||
static int ov6650_prog_dflt(struct i2c_client *client, u8 clkrc)
|
||||
{
|
||||
int ret;
|
||||
|
||||
dev_dbg(&client->dev, "initializing\n");
|
||||
|
||||
ret = ov6650_reg_write(client, REG_COMA, 0); /* ~COMA_RESET */
|
||||
if (!ret)
|
||||
ret = ov6650_reg_write(client, REG_CLKRC, clkrc);
|
||||
if (!ret)
|
||||
ret = ov6650_reg_rmw(client, REG_COMB, 0, COMB_BAND_FILTER);
|
||||
|
||||
@ -805,8 +816,10 @@ static int ov6650_video_probe(struct v4l2_subdev *sd)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct ov6650 *priv = to_ov6650(client);
|
||||
u8 pidh, pidl, midh, midl;
|
||||
int ret;
|
||||
const struct ov6650_xclk *xclk = NULL;
|
||||
unsigned long rate;
|
||||
u8 pidh, pidl, midh, midl;
|
||||
int i, ret = 0;
|
||||
|
||||
priv->clk = v4l2_clk_get(&client->dev, NULL);
|
||||
if (IS_ERR(priv->clk)) {
|
||||
@ -815,6 +828,33 @@ static int ov6650_video_probe(struct v4l2_subdev *sd)
|
||||
return ret;
|
||||
}
|
||||
|
||||
rate = v4l2_clk_get_rate(priv->clk);
|
||||
for (i = 0; rate && i < ARRAY_SIZE(ov6650_xclk); i++) {
|
||||
if (rate != ov6650_xclk[i].rate)
|
||||
continue;
|
||||
|
||||
xclk = &ov6650_xclk[i];
|
||||
dev_info(&client->dev, "using host default clock rate %lukHz\n",
|
||||
rate / 1000);
|
||||
break;
|
||||
}
|
||||
for (i = 0; !xclk && i < ARRAY_SIZE(ov6650_xclk); i++) {
|
||||
ret = v4l2_clk_set_rate(priv->clk, ov6650_xclk[i].rate);
|
||||
if (ret || v4l2_clk_get_rate(priv->clk) != ov6650_xclk[i].rate)
|
||||
continue;
|
||||
|
||||
xclk = &ov6650_xclk[i];
|
||||
dev_info(&client->dev, "using negotiated clock rate %lukHz\n",
|
||||
xclk->rate / 1000);
|
||||
break;
|
||||
}
|
||||
if (!xclk) {
|
||||
dev_err(&client->dev, "unable to get supported clock rate\n");
|
||||
if (!ret)
|
||||
ret = -EINVAL;
|
||||
goto eclkput;
|
||||
}
|
||||
|
||||
ret = ov6650_s_power(sd, 1);
|
||||
if (ret < 0)
|
||||
goto eclkput;
|
||||
@ -848,7 +888,12 @@ static int ov6650_video_probe(struct v4l2_subdev *sd)
|
||||
|
||||
ret = ov6650_reset(client);
|
||||
if (!ret)
|
||||
ret = ov6650_prog_dflt(client);
|
||||
ret = ov6650_prog_dflt(client, xclk->clkrc);
|
||||
if (!ret) {
|
||||
struct v4l2_mbus_framefmt mf = ov6650_def_fmt;
|
||||
|
||||
ret = ov6650_s_fmt(sd, &mf);
|
||||
}
|
||||
if (!ret)
|
||||
ret = v4l2_ctrl_handler_setup(&priv->hdl);
|
||||
|
||||
@ -989,8 +1034,10 @@ static int ov6650_probe(struct i2c_client *client,
|
||||
V4L2_CID_GAMMA, 0, 0xff, 1, 0x12);
|
||||
|
||||
priv->subdev.ctrl_handler = &priv->hdl;
|
||||
if (priv->hdl.error)
|
||||
return priv->hdl.error;
|
||||
if (priv->hdl.error) {
|
||||
ret = priv->hdl.error;
|
||||
goto ectlhdlfree;
|
||||
}
|
||||
|
||||
v4l2_ctrl_auto_cluster(2, &priv->autogain, 0, true);
|
||||
v4l2_ctrl_auto_cluster(3, &priv->autowb, 0, true);
|
||||
@ -1001,15 +1048,18 @@ static int ov6650_probe(struct i2c_client *client,
|
||||
priv->rect.top = DEF_VSTRT << 1;
|
||||
priv->rect.width = W_CIF;
|
||||
priv->rect.height = H_CIF;
|
||||
priv->half_scale = false;
|
||||
priv->code = MEDIA_BUS_FMT_YUYV8_2X8;
|
||||
priv->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
|
||||
/* Hardware default frame interval */
|
||||
priv->tpf.numerator = GET_CLKRC_DIV(DEF_CLKRC);
|
||||
priv->tpf.denominator = FRAME_RATE_MAX;
|
||||
|
||||
priv->subdev.internal_ops = &ov6650_internal_ops;
|
||||
|
||||
ret = v4l2_async_register_subdev(&priv->subdev);
|
||||
if (ret)
|
||||
v4l2_ctrl_handler_free(&priv->hdl);
|
||||
if (!ret)
|
||||
return 0;
|
||||
ectlhdlfree:
|
||||
v4l2_ctrl_handler_free(&priv->hdl);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -1041,6 +1091,6 @@ static struct i2c_driver ov6650_i2c_driver = {
|
||||
|
||||
module_i2c_driver(ov6650_i2c_driver);
|
||||
|
||||
MODULE_DESCRIPTION("SoC Camera driver for OmniVision OV6650");
|
||||
MODULE_AUTHOR("Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>");
|
||||
MODULE_DESCRIPTION("V4L2 subdevice driver for OmniVision OV6650 camera sensor");
|
||||
MODULE_AUTHOR("Janusz Krzysztofik <jmkrzyszt@gmail.com");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
* saa711x - Philips SAA711x video decoder register specifications
|
||||
*
|
||||
* Copyright (c) 2006 Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||
|
@ -682,66 +682,6 @@ static int smiapp_get_all_limits(struct smiapp_sensor *sensor)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int smiapp_get_limits_binning(struct smiapp_sensor *sensor)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
|
||||
static u32 const limits[] = {
|
||||
SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES_BIN,
|
||||
SMIAPP_LIMIT_MAX_FRAME_LENGTH_LINES_BIN,
|
||||
SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN,
|
||||
SMIAPP_LIMIT_MAX_LINE_LENGTH_PCK_BIN,
|
||||
SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK_BIN,
|
||||
SMIAPP_LIMIT_FINE_INTEGRATION_TIME_MIN_BIN,
|
||||
SMIAPP_LIMIT_FINE_INTEGRATION_TIME_MAX_MARGIN_BIN,
|
||||
};
|
||||
static u32 const limits_replace[] = {
|
||||
SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES,
|
||||
SMIAPP_LIMIT_MAX_FRAME_LENGTH_LINES,
|
||||
SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK,
|
||||
SMIAPP_LIMIT_MAX_LINE_LENGTH_PCK,
|
||||
SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK,
|
||||
SMIAPP_LIMIT_FINE_INTEGRATION_TIME_MIN,
|
||||
SMIAPP_LIMIT_FINE_INTEGRATION_TIME_MAX_MARGIN,
|
||||
};
|
||||
unsigned int i;
|
||||
int rval;
|
||||
|
||||
if (sensor->limits[SMIAPP_LIMIT_BINNING_CAPABILITY] ==
|
||||
SMIAPP_BINNING_CAPABILITY_NO) {
|
||||
for (i = 0; i < ARRAY_SIZE(limits); i++)
|
||||
sensor->limits[limits[i]] =
|
||||
sensor->limits[limits_replace[i]];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
rval = smiapp_get_limits(sensor, limits, ARRAY_SIZE(limits));
|
||||
if (rval < 0)
|
||||
return rval;
|
||||
|
||||
/*
|
||||
* Sanity check whether the binning limits are valid. If not,
|
||||
* use the non-binning ones.
|
||||
*/
|
||||
if (sensor->limits[SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES_BIN]
|
||||
&& sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN]
|
||||
&& sensor->limits[SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK_BIN])
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(limits); i++) {
|
||||
dev_dbg(&client->dev,
|
||||
"replace limit 0x%8.8x \"%s\" = %d, 0x%x\n",
|
||||
smiapp_reg_limits[limits[i]].addr,
|
||||
smiapp_reg_limits[limits[i]].what,
|
||||
sensor->limits[limits_replace[i]],
|
||||
sensor->limits[limits_replace[i]]);
|
||||
sensor->limits[limits[i]] =
|
||||
sensor->limits[limits_replace[i]];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int smiapp_get_mbus_formats(struct smiapp_sensor *sensor)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
|
||||
@ -891,60 +831,47 @@ static void smiapp_update_blanking(struct smiapp_sensor *sensor)
|
||||
{
|
||||
struct v4l2_ctrl *vblank = sensor->vblank;
|
||||
struct v4l2_ctrl *hblank = sensor->hblank;
|
||||
uint16_t min_fll, max_fll, min_llp, max_llp, min_lbp;
|
||||
int min, max;
|
||||
|
||||
if (sensor->binning_vertical > 1 || sensor->binning_horizontal > 1) {
|
||||
min_fll = sensor->limits[SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES_BIN];
|
||||
max_fll = sensor->limits[SMIAPP_LIMIT_MAX_FRAME_LENGTH_LINES_BIN];
|
||||
min_llp = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN];
|
||||
max_llp = sensor->limits[SMIAPP_LIMIT_MAX_LINE_LENGTH_PCK_BIN];
|
||||
min_lbp = sensor->limits[SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK_BIN];
|
||||
} else {
|
||||
min_fll = sensor->limits[SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES];
|
||||
max_fll = sensor->limits[SMIAPP_LIMIT_MAX_FRAME_LENGTH_LINES];
|
||||
min_llp = sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK];
|
||||
max_llp = sensor->limits[SMIAPP_LIMIT_MAX_LINE_LENGTH_PCK];
|
||||
min_lbp = sensor->limits[SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK];
|
||||
}
|
||||
|
||||
min = max_t(int,
|
||||
sensor->limits[SMIAPP_LIMIT_MIN_FRAME_BLANKING_LINES],
|
||||
sensor->limits[SMIAPP_LIMIT_MIN_FRAME_LENGTH_LINES_BIN] -
|
||||
min_fll -
|
||||
sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height);
|
||||
max = sensor->limits[SMIAPP_LIMIT_MAX_FRAME_LENGTH_LINES_BIN] -
|
||||
sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height;
|
||||
max = max_fll - sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].height;
|
||||
|
||||
__v4l2_ctrl_modify_range(vblank, min, max, vblank->step, min);
|
||||
|
||||
min = max_t(int,
|
||||
sensor->limits[SMIAPP_LIMIT_MIN_LINE_LENGTH_PCK_BIN] -
|
||||
min_llp -
|
||||
sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width,
|
||||
sensor->limits[SMIAPP_LIMIT_MIN_LINE_BLANKING_PCK_BIN]);
|
||||
max = sensor->limits[SMIAPP_LIMIT_MAX_LINE_LENGTH_PCK_BIN] -
|
||||
sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width;
|
||||
min_lbp);
|
||||
max = max_llp - sensor->pixel_array->crop[SMIAPP_PA_PAD_SRC].width;
|
||||
|
||||
__v4l2_ctrl_modify_range(hblank, min, max, hblank->step, min);
|
||||
|
||||
__smiapp_update_exposure_limits(sensor);
|
||||
}
|
||||
|
||||
static int smiapp_update_mode(struct smiapp_sensor *sensor)
|
||||
static int smiapp_pll_blanking_update(struct smiapp_sensor *sensor)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
|
||||
unsigned int binning_mode;
|
||||
int rval;
|
||||
|
||||
/* Binning has to be set up here; it affects limits */
|
||||
if (sensor->binning_horizontal == 1 &&
|
||||
sensor->binning_vertical == 1) {
|
||||
binning_mode = 0;
|
||||
} else {
|
||||
u8 binning_type =
|
||||
(sensor->binning_horizontal << 4)
|
||||
| sensor->binning_vertical;
|
||||
|
||||
rval = smiapp_write(
|
||||
sensor, SMIAPP_REG_U8_BINNING_TYPE, binning_type);
|
||||
if (rval < 0)
|
||||
return rval;
|
||||
|
||||
binning_mode = 1;
|
||||
}
|
||||
rval = smiapp_write(sensor, SMIAPP_REG_U8_BINNING_MODE, binning_mode);
|
||||
if (rval < 0)
|
||||
return rval;
|
||||
|
||||
/* Get updated limits due to binning */
|
||||
rval = smiapp_get_limits_binning(sensor);
|
||||
if (rval < 0)
|
||||
return rval;
|
||||
|
||||
rval = smiapp_pll_update(sensor);
|
||||
if (rval < 0)
|
||||
return rval;
|
||||
@ -970,62 +897,91 @@ static int smiapp_update_mode(struct smiapp_sensor *sensor)
|
||||
* SMIA++ NVM handling
|
||||
*
|
||||
*/
|
||||
static int smiapp_read_nvm(struct smiapp_sensor *sensor,
|
||||
unsigned char *nvm)
|
||||
|
||||
static int smiapp_read_nvm_page(struct smiapp_sensor *sensor, u32 p, u8 *nvm,
|
||||
u8 *status)
|
||||
{
|
||||
u32 i, s, p, np, v;
|
||||
int rval = 0, rval2;
|
||||
unsigned int i;
|
||||
int rval;
|
||||
u32 s;
|
||||
|
||||
np = sensor->nvm_size / SMIAPP_NVM_PAGE_SIZE;
|
||||
for (p = 0; p < np; p++) {
|
||||
rval = smiapp_write(
|
||||
sensor,
|
||||
SMIAPP_REG_U8_DATA_TRANSFER_IF_1_PAGE_SELECT, p);
|
||||
if (rval)
|
||||
goto out;
|
||||
*status = 0;
|
||||
|
||||
rval = smiapp_write(sensor,
|
||||
SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL,
|
||||
SMIAPP_DATA_TRANSFER_IF_1_CTRL_EN |
|
||||
SMIAPP_DATA_TRANSFER_IF_1_CTRL_RD_EN);
|
||||
if (rval)
|
||||
goto out;
|
||||
rval = smiapp_write(sensor,
|
||||
SMIAPP_REG_U8_DATA_TRANSFER_IF_1_PAGE_SELECT, p);
|
||||
if (rval)
|
||||
return rval;
|
||||
|
||||
rval = smiapp_write(sensor, SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL,
|
||||
SMIAPP_DATA_TRANSFER_IF_1_CTRL_EN);
|
||||
if (rval)
|
||||
return rval;
|
||||
|
||||
rval = smiapp_read(sensor, SMIAPP_REG_U8_DATA_TRANSFER_IF_1_STATUS,
|
||||
&s);
|
||||
if (rval)
|
||||
return rval;
|
||||
|
||||
if (s & SMIAPP_DATA_TRANSFER_IF_1_STATUS_EUSAGE) {
|
||||
*status = s;
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
if (sensor->limits[SMIAPP_LIMIT_DATA_TRANSFER_IF_CAPABILITY] &
|
||||
SMIAPP_DATA_TRANSFER_IF_CAPABILITY_POLL) {
|
||||
for (i = 1000; i > 0; i--) {
|
||||
rval = smiapp_read(
|
||||
sensor,
|
||||
SMIAPP_REG_U8_DATA_TRANSFER_IF_1_STATUS, &s);
|
||||
|
||||
if (rval)
|
||||
goto out;
|
||||
|
||||
if (s & SMIAPP_DATA_TRANSFER_IF_1_STATUS_RD_READY)
|
||||
break;
|
||||
|
||||
}
|
||||
if (!i) {
|
||||
rval = -ETIMEDOUT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
for (i = 0; i < SMIAPP_NVM_PAGE_SIZE; i++) {
|
||||
rval = smiapp_read(
|
||||
sensor,
|
||||
SMIAPP_REG_U8_DATA_TRANSFER_IF_1_DATA_0 + i,
|
||||
&v);
|
||||
if (rval)
|
||||
goto out;
|
||||
SMIAPP_REG_U8_DATA_TRANSFER_IF_1_STATUS,
|
||||
&s);
|
||||
|
||||
*nvm++ = v;
|
||||
if (rval)
|
||||
return rval;
|
||||
}
|
||||
|
||||
if (!i)
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
out:
|
||||
for (i = 0; i < SMIAPP_NVM_PAGE_SIZE; i++) {
|
||||
u32 v;
|
||||
|
||||
rval = smiapp_read(sensor,
|
||||
SMIAPP_REG_U8_DATA_TRANSFER_IF_1_DATA_0 + i,
|
||||
&v);
|
||||
if (rval)
|
||||
return rval;
|
||||
|
||||
*nvm++ = v;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int smiapp_read_nvm(struct smiapp_sensor *sensor, unsigned char *nvm,
|
||||
size_t nvm_size)
|
||||
{
|
||||
u8 status = 0;
|
||||
u32 p;
|
||||
int rval = 0, rval2;
|
||||
|
||||
for (p = 0; p < nvm_size / SMIAPP_NVM_PAGE_SIZE && !rval; p++) {
|
||||
rval = smiapp_read_nvm_page(sensor, p, nvm, &status);
|
||||
nvm += SMIAPP_NVM_PAGE_SIZE;
|
||||
}
|
||||
|
||||
if (rval == -ENODATA &&
|
||||
status & SMIAPP_DATA_TRANSFER_IF_1_STATUS_EUSAGE)
|
||||
rval = 0;
|
||||
|
||||
rval2 = smiapp_write(sensor, SMIAPP_REG_U8_DATA_TRANSFER_IF_1_CTRL, 0);
|
||||
if (rval < 0)
|
||||
return rval;
|
||||
else
|
||||
return rval2;
|
||||
return rval2 ?: p * SMIAPP_NVM_PAGE_SIZE;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1324,10 +1280,6 @@ static int smiapp_power_on(struct device *dev)
|
||||
rval = __v4l2_ctrl_handler_setup(&sensor->src->ctrl_handler);
|
||||
if (rval)
|
||||
goto out_cci_addr_fail;
|
||||
|
||||
rval = smiapp_update_mode(sensor);
|
||||
if (rval < 0)
|
||||
goto out_cci_addr_fail;
|
||||
}
|
||||
|
||||
mutex_unlock(&sensor->mutex);
|
||||
@ -1387,6 +1339,7 @@ static int smiapp_power_off(struct device *dev)
|
||||
static int smiapp_start_streaming(struct smiapp_sensor *sensor)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(&sensor->src->sd);
|
||||
unsigned int binning_mode;
|
||||
int rval;
|
||||
|
||||
mutex_lock(&sensor->mutex);
|
||||
@ -1397,6 +1350,27 @@ static int smiapp_start_streaming(struct smiapp_sensor *sensor)
|
||||
if (rval)
|
||||
goto out;
|
||||
|
||||
/* Binning configuration */
|
||||
if (sensor->binning_horizontal == 1 &&
|
||||
sensor->binning_vertical == 1) {
|
||||
binning_mode = 0;
|
||||
} else {
|
||||
u8 binning_type =
|
||||
(sensor->binning_horizontal << 4)
|
||||
| sensor->binning_vertical;
|
||||
|
||||
rval = smiapp_write(
|
||||
sensor, SMIAPP_REG_U8_BINNING_TYPE, binning_type);
|
||||
if (rval < 0)
|
||||
goto out;
|
||||
|
||||
binning_mode = 1;
|
||||
}
|
||||
rval = smiapp_write(sensor, SMIAPP_REG_U8_BINNING_MODE, binning_mode);
|
||||
if (rval < 0)
|
||||
goto out;
|
||||
|
||||
/* Set up PLL */
|
||||
rval = smiapp_pll_configure(sensor);
|
||||
if (rval)
|
||||
goto out;
|
||||
@ -2073,7 +2047,7 @@ static int smiapp_set_compose(struct v4l2_subdev *subdev,
|
||||
smiapp_propagate(subdev, cfg, sel->which, V4L2_SEL_TGT_COMPOSE);
|
||||
|
||||
if (sel->which == V4L2_SUBDEV_FORMAT_ACTIVE)
|
||||
return smiapp_update_mode(sensor);
|
||||
return smiapp_pll_blanking_update(sensor);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -2312,41 +2286,34 @@ smiapp_sysfs_nvm_read(struct device *dev, struct device_attribute *attr,
|
||||
struct v4l2_subdev *subdev = i2c_get_clientdata(to_i2c_client(dev));
|
||||
struct i2c_client *client = v4l2_get_subdevdata(subdev);
|
||||
struct smiapp_sensor *sensor = to_smiapp_sensor(subdev);
|
||||
unsigned int nbytes;
|
||||
int rval;
|
||||
|
||||
if (!sensor->dev_init_done)
|
||||
return -EBUSY;
|
||||
|
||||
if (!sensor->nvm_size) {
|
||||
int rval;
|
||||
|
||||
/* NVM not read yet - read it now */
|
||||
sensor->nvm_size = sensor->hwcfg->nvm_size;
|
||||
|
||||
rval = pm_runtime_get_sync(&client->dev);
|
||||
if (rval < 0) {
|
||||
if (rval != -EBUSY && rval != -EAGAIN)
|
||||
pm_runtime_set_active(&client->dev);
|
||||
pm_runtime_put(&client->dev);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (smiapp_read_nvm(sensor, sensor->nvm)) {
|
||||
dev_err(&client->dev, "nvm read failed\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
pm_runtime_mark_last_busy(&client->dev);
|
||||
pm_runtime_put_autosuspend(&client->dev);
|
||||
rval = pm_runtime_get_sync(&client->dev);
|
||||
if (rval < 0) {
|
||||
if (rval != -EBUSY && rval != -EAGAIN)
|
||||
pm_runtime_set_active(&client->dev);
|
||||
pm_runtime_put_noidle(&client->dev);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
rval = smiapp_read_nvm(sensor, buf, PAGE_SIZE);
|
||||
if (rval < 0) {
|
||||
pm_runtime_put(&client->dev);
|
||||
dev_err(&client->dev, "nvm read failed\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
pm_runtime_mark_last_busy(&client->dev);
|
||||
pm_runtime_put_autosuspend(&client->dev);
|
||||
|
||||
/*
|
||||
* NVM is still way below a PAGE_SIZE, so we can safely
|
||||
* assume this for now.
|
||||
*/
|
||||
nbytes = min_t(unsigned int, sensor->nvm_size, PAGE_SIZE);
|
||||
memcpy(buf, sensor->nvm, nbytes);
|
||||
|
||||
return nbytes;
|
||||
return rval;
|
||||
}
|
||||
static DEVICE_ATTR(nvm, S_IRUGO, smiapp_sysfs_nvm_read, NULL);
|
||||
|
||||
@ -2810,16 +2777,13 @@ static struct smiapp_hwconfig *smiapp_get_hwconfig(struct device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
/* NVM size is not mandatory */
|
||||
fwnode_property_read_u32(fwnode, "nokia,nvm-size", &hwcfg->nvm_size);
|
||||
|
||||
rval = fwnode_property_read_u32(dev_fwnode(dev), "clock-frequency",
|
||||
&hwcfg->ext_clk);
|
||||
if (rval)
|
||||
dev_info(dev, "can't get clock-frequency\n");
|
||||
|
||||
dev_dbg(dev, "nvm %d, clk %d, mode %d\n",
|
||||
hwcfg->nvm_size, hwcfg->ext_clk, hwcfg->csi_signalling_mode);
|
||||
dev_dbg(dev, "clk %d, mode %d\n", hwcfg->ext_clk,
|
||||
hwcfg->csi_signalling_mode);
|
||||
|
||||
if (!bus_cfg.nr_of_link_frequencies) {
|
||||
dev_warn(dev, "no link frequencies defined\n");
|
||||
@ -2862,7 +2826,6 @@ static int smiapp_probe(struct i2c_client *client)
|
||||
return -ENOMEM;
|
||||
|
||||
sensor->hwcfg = hwcfg;
|
||||
mutex_init(&sensor->mutex);
|
||||
sensor->src = &sensor->ssds[sensor->ssds_used];
|
||||
|
||||
v4l2_i2c_subdev_init(&sensor->src->sd, client, &smiapp_ops);
|
||||
@ -2926,6 +2889,8 @@ static int smiapp_probe(struct i2c_client *client)
|
||||
if (rval < 0)
|
||||
return rval;
|
||||
|
||||
mutex_init(&sensor->mutex);
|
||||
|
||||
rval = smiapp_identify_module(sensor);
|
||||
if (rval) {
|
||||
rval = -ENODEV;
|
||||
@ -3003,17 +2968,10 @@ static int smiapp_probe(struct i2c_client *client)
|
||||
rval = -ENOENT;
|
||||
goto out_power_off;
|
||||
}
|
||||
/* SMIA++ NVM initialization - it will be read from the sensor
|
||||
* when it is first requested by userspace.
|
||||
*/
|
||||
if (sensor->minfo.smiapp_version && sensor->hwcfg->nvm_size) {
|
||||
sensor->nvm = devm_kzalloc(&client->dev,
|
||||
sensor->hwcfg->nvm_size, GFP_KERNEL);
|
||||
if (sensor->nvm == NULL) {
|
||||
rval = -ENOMEM;
|
||||
goto out_cleanup;
|
||||
}
|
||||
|
||||
if (sensor->minfo.smiapp_version &&
|
||||
sensor->limits[SMIAPP_LIMIT_DATA_TRANSFER_IF_CAPABILITY] &
|
||||
SMIAPP_DATA_TRANSFER_IF_CAPABILITY_SUPPORTED) {
|
||||
if (device_create_file(&client->dev, &dev_attr_nvm) != 0) {
|
||||
dev_err(&client->dev, "sysfs nvm entry failed\n");
|
||||
rval = -EBUSY;
|
||||
@ -3086,7 +3044,7 @@ static int smiapp_probe(struct i2c_client *client)
|
||||
}
|
||||
|
||||
mutex_lock(&sensor->mutex);
|
||||
rval = smiapp_update_mode(sensor);
|
||||
rval = smiapp_pll_blanking_update(sensor);
|
||||
mutex_unlock(&sensor->mutex);
|
||||
if (rval) {
|
||||
dev_err(&client->dev, "update mode failed\n");
|
||||
@ -3101,19 +3059,23 @@ static int smiapp_probe(struct i2c_client *client)
|
||||
if (rval < 0)
|
||||
goto out_media_entity_cleanup;
|
||||
|
||||
rval = v4l2_async_register_subdev_sensor_common(&sensor->src->sd);
|
||||
if (rval < 0)
|
||||
goto out_media_entity_cleanup;
|
||||
|
||||
pm_runtime_set_active(&client->dev);
|
||||
pm_runtime_get_noresume(&client->dev);
|
||||
pm_runtime_enable(&client->dev);
|
||||
|
||||
rval = v4l2_async_register_subdev_sensor_common(&sensor->src->sd);
|
||||
if (rval < 0)
|
||||
goto out_disable_runtime_pm;
|
||||
|
||||
pm_runtime_set_autosuspend_delay(&client->dev, 1000);
|
||||
pm_runtime_use_autosuspend(&client->dev);
|
||||
pm_runtime_put_autosuspend(&client->dev);
|
||||
|
||||
return 0;
|
||||
|
||||
out_disable_runtime_pm:
|
||||
pm_runtime_disable(&client->dev);
|
||||
|
||||
out_media_entity_cleanup:
|
||||
media_entity_cleanup(&sensor->src->sd.entity);
|
||||
|
||||
@ -3122,6 +3084,7 @@ out_cleanup:
|
||||
|
||||
out_power_off:
|
||||
smiapp_power_off(&client->dev);
|
||||
mutex_destroy(&sensor->mutex);
|
||||
|
||||
return rval;
|
||||
}
|
||||
@ -3144,6 +3107,7 @@ static int smiapp_remove(struct i2c_client *client)
|
||||
media_entity_cleanup(&sensor->ssds[i].sd.entity);
|
||||
}
|
||||
smiapp_cleanup(sensor);
|
||||
mutex_destroy(&sensor->mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -11,25 +11,29 @@
|
||||
#ifndef __SMIAPP_REG_H_
|
||||
#define __SMIAPP_REG_H_
|
||||
|
||||
#include <linux/bits.h>
|
||||
|
||||
#include "smiapp-reg-defs.h"
|
||||
|
||||
/* Bits for above register */
|
||||
#define SMIAPP_IMAGE_ORIENTATION_HFLIP (1 << 0)
|
||||
#define SMIAPP_IMAGE_ORIENTATION_VFLIP (1 << 1)
|
||||
#define SMIAPP_IMAGE_ORIENTATION_HFLIP BIT(0)
|
||||
#define SMIAPP_IMAGE_ORIENTATION_VFLIP BIT(1)
|
||||
|
||||
#define SMIAPP_DATA_TRANSFER_IF_1_CTRL_EN (1 << 0)
|
||||
#define SMIAPP_DATA_TRANSFER_IF_1_CTRL_RD_EN (0 << 1)
|
||||
#define SMIAPP_DATA_TRANSFER_IF_1_CTRL_WR_EN (1 << 1)
|
||||
#define SMIAPP_DATA_TRANSFER_IF_1_CTRL_ERR_CLEAR (1 << 2)
|
||||
#define SMIAPP_DATA_TRANSFER_IF_1_STATUS_RD_READY (1 << 0)
|
||||
#define SMIAPP_DATA_TRANSFER_IF_1_STATUS_WR_READY (1 << 1)
|
||||
#define SMIAPP_DATA_TRANSFER_IF_1_STATUS_EDATA (1 << 2)
|
||||
#define SMIAPP_DATA_TRANSFER_IF_1_STATUS_EUSAGE (1 << 3)
|
||||
#define SMIAPP_DATA_TRANSFER_IF_1_CTRL_EN BIT(0)
|
||||
#define SMIAPP_DATA_TRANSFER_IF_1_CTRL_WR_EN BIT(1)
|
||||
#define SMIAPP_DATA_TRANSFER_IF_1_CTRL_ERR_CLEAR BIT(2)
|
||||
#define SMIAPP_DATA_TRANSFER_IF_1_STATUS_RD_READY BIT(0)
|
||||
#define SMIAPP_DATA_TRANSFER_IF_1_STATUS_WR_READY BIT(1)
|
||||
#define SMIAPP_DATA_TRANSFER_IF_1_STATUS_EDATA BIT(2)
|
||||
#define SMIAPP_DATA_TRANSFER_IF_1_STATUS_EUSAGE BIT(3)
|
||||
|
||||
#define SMIAPP_SOFTWARE_RESET (1 << 0)
|
||||
#define SMIAPP_DATA_TRANSFER_IF_CAPABILITY_SUPPORTED BIT(0)
|
||||
#define SMIAPP_DATA_TRANSFER_IF_CAPABILITY_POLL BIT(2)
|
||||
|
||||
#define SMIAPP_FLASH_MODE_CAPABILITY_SINGLE_STROBE (1 << 0)
|
||||
#define SMIAPP_FLASH_MODE_CAPABILITY_MULTIPLE_STROBE (1 << 1)
|
||||
#define SMIAPP_SOFTWARE_RESET BIT(0)
|
||||
|
||||
#define SMIAPP_FLASH_MODE_CAPABILITY_SINGLE_STROBE BIT(0)
|
||||
#define SMIAPP_FLASH_MODE_CAPABILITY_MULTIPLE_STROBE BIT(1)
|
||||
|
||||
#define SMIAPP_DPHY_CTRL_AUTOMATIC 0
|
||||
/* DPHY control based on REQUESTED_LINK_BIT_RATE_MBPS */
|
||||
|
@ -208,9 +208,6 @@ struct smiapp_sensor {
|
||||
bool dev_init_done;
|
||||
u8 compressed_min_bpp;
|
||||
|
||||
u8 *nvm; /* nvm memory buffer */
|
||||
unsigned int nvm_size; /* bytes */
|
||||
|
||||
struct smiapp_module_info minfo;
|
||||
|
||||
struct smiapp_pll pll;
|
||||
|
@ -971,6 +971,11 @@ static int mipid02_probe(struct i2c_client *client)
|
||||
bridge->reset_gpio = devm_gpiod_get_optional(dev, "reset",
|
||||
GPIOD_OUT_HIGH);
|
||||
|
||||
if (IS_ERR(bridge->reset_gpio)) {
|
||||
dev_err(dev, "failed to get reset GPIO\n");
|
||||
return PTR_ERR(bridge->reset_gpio);
|
||||
}
|
||||
|
||||
ret = mipid02_get_regulators(bridge);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to get regulators %d", ret);
|
||||
|
@ -1,4 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2018 Gateworks Corporation
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* tvp5150 - Texas Instruments TVP5150A/AM1 video decoder registers
|
||||
*
|
||||
|
@ -375,7 +375,7 @@ static int vpx3220_s_routing(struct v4l2_subdev *sd,
|
||||
input = 1: COMPOSITE input
|
||||
input = 2: SVHS input */
|
||||
|
||||
const int input_vals[3][2] = {
|
||||
static const int input_vals[3][2] = {
|
||||
{0x0c, 0},
|
||||
{0x0d, 0},
|
||||
{0x0e, 1}
|
||||
|
@ -575,6 +575,38 @@ static void media_device_release(struct media_devnode *devnode)
|
||||
dev_dbg(devnode->parent, "Media device released\n");
|
||||
}
|
||||
|
||||
static void __media_device_unregister_entity(struct media_entity *entity)
|
||||
{
|
||||
struct media_device *mdev = entity->graph_obj.mdev;
|
||||
struct media_link *link, *tmp;
|
||||
struct media_interface *intf;
|
||||
unsigned int i;
|
||||
|
||||
ida_free(&mdev->entity_internal_idx, entity->internal_idx);
|
||||
|
||||
/* Remove all interface links pointing to this entity */
|
||||
list_for_each_entry(intf, &mdev->interfaces, graph_obj.list) {
|
||||
list_for_each_entry_safe(link, tmp, &intf->links, list) {
|
||||
if (link->entity == entity)
|
||||
__media_remove_intf_link(link);
|
||||
}
|
||||
}
|
||||
|
||||
/* Remove all data links that belong to this entity */
|
||||
__media_entity_remove_links(entity);
|
||||
|
||||
/* Remove all pads that belong to this entity */
|
||||
for (i = 0; i < entity->num_pads; i++)
|
||||
media_gobj_destroy(&entity->pads[i].graph_obj);
|
||||
|
||||
/* Remove the entity */
|
||||
media_gobj_destroy(&entity->graph_obj);
|
||||
|
||||
/* invoke entity_notify callbacks to handle entity removal?? */
|
||||
|
||||
entity->graph_obj.mdev = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* media_device_register_entity - Register an entity with a media device
|
||||
* @mdev: The media device
|
||||
@ -632,6 +664,7 @@ int __must_check media_device_register_entity(struct media_device *mdev,
|
||||
*/
|
||||
ret = media_graph_walk_init(&new, mdev);
|
||||
if (ret) {
|
||||
__media_device_unregister_entity(entity);
|
||||
mutex_unlock(&mdev->graph_mutex);
|
||||
return ret;
|
||||
}
|
||||
@ -644,38 +677,6 @@ int __must_check media_device_register_entity(struct media_device *mdev,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(media_device_register_entity);
|
||||
|
||||
static void __media_device_unregister_entity(struct media_entity *entity)
|
||||
{
|
||||
struct media_device *mdev = entity->graph_obj.mdev;
|
||||
struct media_link *link, *tmp;
|
||||
struct media_interface *intf;
|
||||
unsigned int i;
|
||||
|
||||
ida_free(&mdev->entity_internal_idx, entity->internal_idx);
|
||||
|
||||
/* Remove all interface links pointing to this entity */
|
||||
list_for_each_entry(intf, &mdev->interfaces, graph_obj.list) {
|
||||
list_for_each_entry_safe(link, tmp, &intf->links, list) {
|
||||
if (link->entity == entity)
|
||||
__media_remove_intf_link(link);
|
||||
}
|
||||
}
|
||||
|
||||
/* Remove all data links that belong to this entity */
|
||||
__media_entity_remove_links(entity);
|
||||
|
||||
/* Remove all pads that belong to this entity */
|
||||
for (i = 0; i < entity->num_pads; i++)
|
||||
media_gobj_destroy(&entity->pads[i].graph_obj);
|
||||
|
||||
/* Remove the entity */
|
||||
media_gobj_destroy(&entity->graph_obj);
|
||||
|
||||
/* invoke entity_notify callbacks to handle entity removal?? */
|
||||
|
||||
entity->graph_obj.mdev = NULL;
|
||||
}
|
||||
|
||||
void media_device_unregister_entity(struct media_entity *entity)
|
||||
{
|
||||
struct media_device *mdev = entity->graph_obj.mdev;
|
||||
|
@ -664,7 +664,7 @@ static int _cx18_process_idx_data(struct cx18_buffer *buf,
|
||||
struct cx18_enc_idx_entry *e_buf;
|
||||
|
||||
/* Frame type lookup: 1=I, 2=P, 4=B */
|
||||
const int mapping[8] = {
|
||||
static const int mapping[8] = {
|
||||
-1, V4L2_ENC_IDX_FRAME_I, V4L2_ENC_IDX_FRAME_P,
|
||||
-1, V4L2_ENC_IDX_FRAME_B, -1, -1, -1
|
||||
};
|
||||
|
@ -1167,8 +1167,11 @@ int cx23888_ir_probe(struct cx23885_dev *dev)
|
||||
return -ENOMEM;
|
||||
|
||||
spin_lock_init(&state->rx_kfifo_lock);
|
||||
if (kfifo_alloc(&state->rx_kfifo, CX23888_IR_RX_KFIFO_SIZE, GFP_KERNEL))
|
||||
if (kfifo_alloc(&state->rx_kfifo, CX23888_IR_RX_KFIFO_SIZE,
|
||||
GFP_KERNEL)) {
|
||||
kfree(state);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
state->dev = dev;
|
||||
sd = &state->sd;
|
||||
|
@ -1781,6 +1781,41 @@ static const struct cx88_board cx88_boards[] = {
|
||||
},
|
||||
.mpeg = CX88_MPEG_DVB,
|
||||
},
|
||||
[CX88_BOARD_NOTONLYTV_LV3H] = {
|
||||
.name = "NotOnlyTV LV3H",
|
||||
.tuner_type = TUNER_XC2028,
|
||||
.radio_type = UNSET,
|
||||
.tuner_addr = 0x61,
|
||||
.radio_addr = ADDR_UNSET,
|
||||
/* if gpio1:bit9 is enabled, DVB-T won't work */
|
||||
|
||||
.input = { {
|
||||
.type = CX88_VMUX_TELEVISION,
|
||||
.vmux = 0,
|
||||
.gpio0 = 0x0000,
|
||||
.gpio1 = 0xa141,
|
||||
.gpio2 = 0x0000,
|
||||
}, {
|
||||
.type = CX88_VMUX_COMPOSITE1,
|
||||
.vmux = 1,
|
||||
.gpio0 = 0x0000,
|
||||
.gpio1 = 0xa161,
|
||||
.gpio2 = 0x0000,
|
||||
}, {
|
||||
.type = CX88_VMUX_SVIDEO,
|
||||
.vmux = 2,
|
||||
.gpio0 = 0x0000,
|
||||
.gpio1 = 0xa161,
|
||||
.gpio2 = 0x0000,
|
||||
} },
|
||||
.radio = {
|
||||
.type = CX88_RADIO,
|
||||
.gpio0 = 0x0000,
|
||||
.gpio1 = 0xa141,
|
||||
.gpio2 = 0x0000,
|
||||
},
|
||||
.mpeg = CX88_MPEG_DVB,
|
||||
},
|
||||
[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO] = {
|
||||
.name = "DViCO FusionHDTV DVB-T PRO",
|
||||
.tuner_type = TUNER_XC2028,
|
||||
@ -2654,6 +2689,7 @@ static const struct cx88_subid cx88_subids[] = {
|
||||
.subdevice = 0x6f18,
|
||||
.card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
|
||||
}, {
|
||||
/* Also NotOnlyTV LV3H (version 1.11 is silkscreened on the board) */
|
||||
.subvendor = 0x14f1,
|
||||
.subdevice = 0x8852,
|
||||
.card = CX88_BOARD_GENIATECH_X8000_MT,
|
||||
@ -3121,6 +3157,7 @@ static int cx88_xc2028_tuner_callback(struct cx88_core *core,
|
||||
case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
|
||||
case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
|
||||
return cx88_dvico_xc2028_callback(core, command, arg);
|
||||
case CX88_BOARD_NOTONLYTV_LV3H:
|
||||
case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
|
||||
case CX88_BOARD_WINFAST_DTV1800H:
|
||||
return cx88_xc3028_winfast1800h_callback(core, command, arg);
|
||||
@ -3322,6 +3359,7 @@ static void cx88_card_setup_pre_i2c(struct cx88_core *core)
|
||||
udelay(1000);
|
||||
break;
|
||||
|
||||
case CX88_BOARD_NOTONLYTV_LV3H:
|
||||
case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
|
||||
case CX88_BOARD_WINFAST_DTV1800H:
|
||||
cx88_xc3028_winfast1800h_callback(core, XC2028_TUNER_RESET, 0);
|
||||
@ -3378,6 +3416,11 @@ void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl)
|
||||
*/
|
||||
ctl->disable_power_mgmt = 1;
|
||||
break;
|
||||
case CX88_BOARD_NOTONLYTV_LV3H:
|
||||
ctl->demod = XC3028_FE_ZARLINK456;
|
||||
ctl->fname = XC3028L_DEFAULT_FIRMWARE;
|
||||
ctl->read_not_reliable = 1;
|
||||
break;
|
||||
case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
|
||||
case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
|
||||
case CX88_BOARD_PROLINK_PV_8000GT:
|
||||
|
@ -1378,6 +1378,7 @@ static int dvb_register(struct cx8802_dev *dev)
|
||||
fe->ops.tuner_ops.set_config(fe, &ctl);
|
||||
}
|
||||
break;
|
||||
case CX88_BOARD_NOTONLYTV_LV3H:
|
||||
case CX88_BOARD_PINNACLE_HYBRID_PCTV:
|
||||
case CX88_BOARD_WINFAST_DTV1800H:
|
||||
fe0->dvb.frontend = dvb_attach(zl10353_attach,
|
||||
|
@ -1277,7 +1277,7 @@ static int cx8800_initdev(struct pci_dev *pci_dev,
|
||||
core = cx88_core_get(dev->pci);
|
||||
if (!core) {
|
||||
err = -EINVAL;
|
||||
goto fail_free;
|
||||
goto fail_disable;
|
||||
}
|
||||
dev->core = core;
|
||||
|
||||
@ -1323,7 +1323,7 @@ static int cx8800_initdev(struct pci_dev *pci_dev,
|
||||
cc->step, cc->default_value);
|
||||
if (!vc) {
|
||||
err = core->audio_hdl.error;
|
||||
goto fail_core;
|
||||
goto fail_irq;
|
||||
}
|
||||
vc->priv = (void *)cc;
|
||||
}
|
||||
@ -1337,7 +1337,7 @@ static int cx8800_initdev(struct pci_dev *pci_dev,
|
||||
cc->step, cc->default_value);
|
||||
if (!vc) {
|
||||
err = core->video_hdl.error;
|
||||
goto fail_core;
|
||||
goto fail_irq;
|
||||
}
|
||||
vc->priv = (void *)cc;
|
||||
if (vc->id == V4L2_CID_CHROMA_AGC)
|
||||
@ -1509,11 +1509,14 @@ static int cx8800_initdev(struct pci_dev *pci_dev,
|
||||
|
||||
fail_unreg:
|
||||
cx8800_unregister_video(dev);
|
||||
free_irq(pci_dev->irq, dev);
|
||||
mutex_unlock(&core->lock);
|
||||
fail_irq:
|
||||
free_irq(pci_dev->irq, dev);
|
||||
fail_core:
|
||||
core->v4ldev = NULL;
|
||||
cx88_core_put(core, dev->pci);
|
||||
fail_disable:
|
||||
pci_disable_device(pci_dev);
|
||||
fail_free:
|
||||
kfree(dev);
|
||||
return err;
|
||||
|
@ -228,6 +228,7 @@ extern const struct sram_channel cx88_sram_channels[];
|
||||
#define CX88_BOARD_WINFAST_DTV1800H_XC4000 88
|
||||
#define CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36 89
|
||||
#define CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43 90
|
||||
#define CX88_BOARD_NOTONLYTV_LV3H 91
|
||||
|
||||
enum cx88_itype {
|
||||
CX88_VMUX_COMPOSITE1 = 1,
|
||||
|
@ -11,7 +11,6 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/slab.h>
|
||||
|
@ -325,7 +325,7 @@ static u32 compress_raw_buf(struct ivtv *itv, u8 *buf, u32 size)
|
||||
static u32 compress_sliced_buf(struct ivtv *itv, u32 line, u8 *buf, u32 size, u8 sav)
|
||||
{
|
||||
u32 line_size = itv->vbi.sliced_decoder_line_size;
|
||||
struct v4l2_decode_vbi_line vbi;
|
||||
struct v4l2_decode_vbi_line vbi = {};
|
||||
int i;
|
||||
unsigned lines = 0;
|
||||
|
||||
|
@ -60,10 +60,8 @@ static irqreturn_t hopper_irq_handler(int irq, void *dev_id)
|
||||
struct mantis_ca *ca;
|
||||
|
||||
mantis = (struct mantis_pci *) dev_id;
|
||||
if (unlikely(!mantis)) {
|
||||
dprintk(MANTIS_ERROR, 1, "Mantis == NULL");
|
||||
if (unlikely(!mantis))
|
||||
return IRQ_NONE;
|
||||
}
|
||||
ca = mantis->mantis_ca;
|
||||
|
||||
stat = mmread(MANTIS_INT_STAT);
|
||||
|
@ -69,10 +69,8 @@ static irqreturn_t mantis_irq_handler(int irq, void *dev_id)
|
||||
struct mantis_ca *ca;
|
||||
|
||||
mantis = (struct mantis_pci *) dev_id;
|
||||
if (unlikely(mantis == NULL)) {
|
||||
dprintk(MANTIS_ERROR, 1, "Mantis == NULL");
|
||||
if (unlikely(!mantis))
|
||||
return IRQ_NONE;
|
||||
}
|
||||
ca = mantis->mantis_ca;
|
||||
|
||||
stat = mmread(MANTIS_INT_STAT);
|
||||
|
@ -13,12 +13,10 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/delay.h>
|
||||
#include <asm/div64.h>
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#include <linux/proc_fs.h>
|
||||
#endif
|
||||
#include "saa7164.h"
|
||||
|
||||
MODULE_DESCRIPTION("Driver for NXP SAA7164 based TV cards");
|
||||
@ -1045,92 +1043,138 @@ static void saa7164_dev_unregister(struct saa7164_dev *dev)
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static int saa7164_proc_show(struct seq_file *m, void *v)
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
static void *saa7164_seq_start(struct seq_file *s, loff_t *pos)
|
||||
{
|
||||
struct saa7164_dev *dev;
|
||||
loff_t index = *pos;
|
||||
|
||||
mutex_lock(&devlist);
|
||||
list_for_each_entry(dev, &saa7164_devlist, devlist) {
|
||||
if (index-- == 0) {
|
||||
mutex_unlock(&devlist);
|
||||
return dev;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&devlist);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void *saa7164_seq_next(struct seq_file *s, void *v, loff_t *pos)
|
||||
{
|
||||
struct saa7164_dev *dev = v;
|
||||
void *ret;
|
||||
|
||||
mutex_lock(&devlist);
|
||||
if (list_is_last(&dev->devlist, &saa7164_devlist))
|
||||
ret = NULL;
|
||||
else
|
||||
ret = list_next_entry(dev, devlist);
|
||||
mutex_unlock(&devlist);
|
||||
|
||||
++*pos;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void saa7164_seq_stop(struct seq_file *s, void *v)
|
||||
{
|
||||
}
|
||||
|
||||
static int saa7164_seq_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct saa7164_dev *dev = v;
|
||||
struct tmComResBusInfo *b;
|
||||
struct list_head *list;
|
||||
int i, c;
|
||||
|
||||
if (saa7164_devcount == 0)
|
||||
return 0;
|
||||
seq_printf(m, "%s = %p\n", dev->name, dev);
|
||||
|
||||
list_for_each(list, &saa7164_devlist) {
|
||||
dev = list_entry(list, struct saa7164_dev, devlist);
|
||||
seq_printf(m, "%s = %p\n", dev->name, dev);
|
||||
/* Lock the bus from any other access */
|
||||
b = &dev->bus;
|
||||
mutex_lock(&b->lock);
|
||||
|
||||
/* Lock the bus from any other access */
|
||||
b = &dev->bus;
|
||||
mutex_lock(&b->lock);
|
||||
seq_printf(m, " .m_pdwSetWritePos = 0x%x (0x%08x)\n",
|
||||
b->m_dwSetReadPos, saa7164_readl(b->m_dwSetReadPos));
|
||||
|
||||
seq_printf(m, " .m_pdwSetWritePos = 0x%x (0x%08x)\n",
|
||||
b->m_dwSetReadPos, saa7164_readl(b->m_dwSetReadPos));
|
||||
seq_printf(m, " .m_pdwSetReadPos = 0x%x (0x%08x)\n",
|
||||
b->m_dwSetWritePos, saa7164_readl(b->m_dwSetWritePos));
|
||||
|
||||
seq_printf(m, " .m_pdwSetReadPos = 0x%x (0x%08x)\n",
|
||||
b->m_dwSetWritePos, saa7164_readl(b->m_dwSetWritePos));
|
||||
seq_printf(m, " .m_pdwGetWritePos = 0x%x (0x%08x)\n",
|
||||
b->m_dwGetReadPos, saa7164_readl(b->m_dwGetReadPos));
|
||||
|
||||
seq_printf(m, " .m_pdwGetWritePos = 0x%x (0x%08x)\n",
|
||||
b->m_dwGetReadPos, saa7164_readl(b->m_dwGetReadPos));
|
||||
seq_printf(m, " .m_pdwGetReadPos = 0x%x (0x%08x)\n",
|
||||
b->m_dwGetWritePos, saa7164_readl(b->m_dwGetWritePos));
|
||||
c = 0;
|
||||
seq_puts(m, "\n Set Ring:\n");
|
||||
seq_puts(m, "\n addr 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n");
|
||||
for (i = 0; i < b->m_dwSizeSetRing; i++) {
|
||||
if (c == 0)
|
||||
seq_printf(m, " %04x:", i);
|
||||
|
||||
seq_printf(m, " .m_pdwGetReadPos = 0x%x (0x%08x)\n",
|
||||
b->m_dwGetWritePos, saa7164_readl(b->m_dwGetWritePos));
|
||||
c = 0;
|
||||
seq_printf(m, "\n Set Ring:\n");
|
||||
seq_printf(m, "\n addr 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n");
|
||||
for (i = 0; i < b->m_dwSizeSetRing; i++) {
|
||||
if (c == 0)
|
||||
seq_printf(m, " %04x:", i);
|
||||
seq_printf(m, " %02x", readb(b->m_pdwSetRing + i));
|
||||
|
||||
seq_printf(m, " %02x", readb(b->m_pdwSetRing + i));
|
||||
|
||||
if (++c == 16) {
|
||||
seq_printf(m, "\n");
|
||||
c = 0;
|
||||
}
|
||||
if (++c == 16) {
|
||||
seq_puts(m, "\n");
|
||||
c = 0;
|
||||
}
|
||||
|
||||
c = 0;
|
||||
seq_printf(m, "\n Get Ring:\n");
|
||||
seq_printf(m, "\n addr 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n");
|
||||
for (i = 0; i < b->m_dwSizeGetRing; i++) {
|
||||
if (c == 0)
|
||||
seq_printf(m, " %04x:", i);
|
||||
|
||||
seq_printf(m, " %02x", readb(b->m_pdwGetRing + i));
|
||||
|
||||
if (++c == 16) {
|
||||
seq_printf(m, "\n");
|
||||
c = 0;
|
||||
}
|
||||
}
|
||||
|
||||
mutex_unlock(&b->lock);
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
c = 0;
|
||||
seq_puts(m, "\n Get Ring:\n");
|
||||
seq_puts(m, "\n addr 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n");
|
||||
for (i = 0; i < b->m_dwSizeGetRing; i++) {
|
||||
if (c == 0)
|
||||
seq_printf(m, " %04x:", i);
|
||||
|
||||
static struct proc_dir_entry *saa7164_pe;
|
||||
seq_printf(m, " %02x", readb(b->m_pdwGetRing + i));
|
||||
|
||||
static int saa7164_proc_create(void)
|
||||
{
|
||||
saa7164_pe = proc_create_single("saa7164", 0444, NULL, saa7164_proc_show);
|
||||
if (!saa7164_pe)
|
||||
return -ENOMEM;
|
||||
if (++c == 16) {
|
||||
seq_puts(m, "\n");
|
||||
c = 0;
|
||||
}
|
||||
}
|
||||
|
||||
mutex_unlock(&b->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void saa7164_proc_destroy(void)
|
||||
static const struct seq_operations saa7164_seq_ops = {
|
||||
.start = saa7164_seq_start,
|
||||
.next = saa7164_seq_next,
|
||||
.stop = saa7164_seq_stop,
|
||||
.show = saa7164_seq_show,
|
||||
};
|
||||
|
||||
static int saa7164_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
if (saa7164_pe)
|
||||
remove_proc_entry("saa7164", NULL);
|
||||
return seq_open(file, &saa7164_seq_ops);
|
||||
}
|
||||
|
||||
static const struct file_operations saa7164_operations = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = saa7164_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
static struct dentry *saa7614_dentry;
|
||||
|
||||
static void __init saa7164_debugfs_create(void)
|
||||
{
|
||||
saa7614_dentry = debugfs_create_file("saa7164", 0444, NULL, NULL,
|
||||
&saa7164_operations);
|
||||
}
|
||||
|
||||
static void __exit saa7164_debugfs_remove(void)
|
||||
{
|
||||
debugfs_remove(saa7614_dentry);
|
||||
}
|
||||
#else
|
||||
static int saa7164_proc_create(void) { return 0; }
|
||||
static void saa7164_proc_destroy(void) {}
|
||||
static void saa7164_debugfs_create(void) { }
|
||||
static void saa7164_debugfs_remove(void) { }
|
||||
#endif
|
||||
|
||||
static int saa7164_thread_function(void *data)
|
||||
@ -1507,7 +1551,7 @@ static int __init saa7164_init(void)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
saa7164_proc_create();
|
||||
saa7164_debugfs_create();
|
||||
|
||||
pr_info("saa7164 driver loaded\n");
|
||||
|
||||
@ -1516,7 +1560,7 @@ static int __init saa7164_init(void)
|
||||
|
||||
static void __exit saa7164_fini(void)
|
||||
{
|
||||
saa7164_proc_destroy();
|
||||
saa7164_debugfs_remove();
|
||||
pci_unregister_driver(&saa7164_pci_driver);
|
||||
}
|
||||
|
||||
|
@ -14,7 +14,6 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/slab.h>
|
||||
|
@ -483,6 +483,7 @@ config VIDEO_QCOM_VENUS
|
||||
tristate "Qualcomm Venus V4L2 encoder/decoder driver"
|
||||
depends on VIDEO_DEV && VIDEO_V4L2
|
||||
depends on (ARCH_QCOM && IOMMU_DMA) || COMPILE_TEST
|
||||
depends on INTERCONNECT || !INTERCONNECT
|
||||
select QCOM_MDT_LOADER if ARCH_QCOM
|
||||
select QCOM_SCM if ARCH_QCOM
|
||||
select VIDEOBUF2_DMA_SG
|
||||
@ -493,6 +494,19 @@ config VIDEO_QCOM_VENUS
|
||||
on various Qualcomm SoCs.
|
||||
To compile this driver as a module choose m here.
|
||||
|
||||
config VIDEO_SUN8I_DEINTERLACE
|
||||
tristate "Allwinner Deinterlace driver"
|
||||
depends on VIDEO_DEV && VIDEO_V4L2
|
||||
depends on ARCH_SUNXI || COMPILE_TEST
|
||||
depends on COMMON_CLK && OF
|
||||
depends on PM
|
||||
select VIDEOBUF2_DMA_CONTIG
|
||||
select V4L2_MEM2MEM_DEV
|
||||
help
|
||||
Support for the Allwinner deinterlace unit with scaling
|
||||
capability found on some SoCs, like H3.
|
||||
To compile this driver as a module choose m here.
|
||||
|
||||
endif # V4L_MEM2MEM_DRIVERS
|
||||
|
||||
# TI VIDEO PORT Helper Modules
|
||||
@ -585,9 +599,10 @@ config VIDEO_MESON_G12A_AO_CEC
|
||||
|
||||
config CEC_GPIO
|
||||
tristate "Generic GPIO-based CEC driver"
|
||||
depends on PREEMPT || COMPILE_TEST
|
||||
depends on PREEMPTION || COMPILE_TEST
|
||||
select CEC_CORE
|
||||
select CEC_PIN
|
||||
select CEC_NOTIFIER
|
||||
select GPIOLIB
|
||||
help
|
||||
This is a generic GPIO-based CEC driver.
|
||||
|
@ -19,9 +19,7 @@ obj-$(CONFIG_VIDEO_VIVID) += vivid/
|
||||
obj-$(CONFIG_VIDEO_VIM2M) += vim2m.o
|
||||
obj-$(CONFIG_VIDEO_VICODEC) += vicodec/
|
||||
|
||||
obj-$(CONFIG_VIDEO_TI_VPE) += ti-vpe/
|
||||
|
||||
obj-$(CONFIG_VIDEO_TI_CAL) += ti-vpe/
|
||||
obj-y += ti-vpe/
|
||||
|
||||
obj-$(CONFIG_VIDEO_MX2_EMMAPRP) += mx2_emmaprp.o
|
||||
obj-$(CONFIG_VIDEO_CODA) += coda/
|
||||
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user