RE: [PATCH v2 0/6] HDMI driver for Samsung S5PV310 platform

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all,

As I know, S5P-TV(HDMI) stuff needs more discussion.

I don't want to just merge platform devices which is not used anywhere.
Besides, there are two schemes for it in mailing list now.

I think we have to improve this next time and need to focus more on its
driver now.

Thanks.

Best regards,
Kgene.
--
Kukjin Kim <kgene.kim@xxxxxxxxxxx>, Senior Engineer,
SW Solution Development Team, Samsung Electronics Co., Ltd.

Tomasz Stanislawski wrote:
> 
> From: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx>
> 
> Hello,
> 
> I would like to present the second version of HDMI driver for S5PC210
> platform.
> The driver is under a heavy development. The most recent changes are:
> 
> 1. Minor bugs and fixes:
> - pink line on left side of display
> - premature start of VP's streaming
> - usage of free memory
> - usage of non-initialized variables
> - fixed sequence of power setup
> - dependencies in Kconfig
> 
> 2. Integration with Runtime Power Managment and Power Domain driver.
> 
> 3. The CMA was substituted by the SYSMMU driver.
> 
> 4. Applying existing frameworks:
> - activation of HDMIPHY using clock API
> - control of power on HDMI-5V pin using regulator API
> 
> 5. Moving all clocks and regulator management from platform to the
drivers'
> code.
> 
> 6. Redesigned the control of mixer's debugging.
> 
> 7. Added a watchdog to deal with HW failures.
> 
> Original HDMI driver RFC:
> 
> ==============
>  Introduction
> ==============
> 
> The purpose of this RFC is to discuss the driver for a TV output interface
> available in upcoming Samsung SoC. The HW is able to generate digital and
> analog signals. Current version of the driver supports only digital
output.
> 
> Internally the driver uses videobuf2 framework, and CMA memory allocator.
> Not
> all of them are merged by now, but I decided to post the sources to start
> discussion driver's design.
> 
> ======================
>  Hardware description
> ======================
> 
> The SoC contains a few HW sub-blocks:
> 
> 1. Video Processor (VP). It is used for processing of NV12 data.  An image
> stored in RAM is accessed by DMA. Pixels are cropped, scaled.
Additionally,
> post processing operations like brightness, sharpness and contrast
> adjustments
> could be performed. The output in YCbCr444 format is send to Mixer.
> 
> 2. Mixer (MXR). The piece of hardware responsible for mixing and blending
> multiple data inputs before passing it to an output device.  The MXR is
> capable
> of handling up to three image layers. One is the output of VP.  Other two
are
> images in RGB format (multiple variants are supported).  The layers are
> scaled,
> cropped and blended with background color.  The blending factor, and
layers'
> priority are controlled by MXR's registers. The output is passed either to
> HDMI
> or TVOUT.
> 
> 3. HDMI. The piece of HW responsible for generation of HDMI packets. It
takes
> pixel data from mixer and transforms it into data frames. The output is
send
> to HDMIPHY interface.
> 
> 4. HDMIPHY. Physical interface for HDMI. Its duties are sending HDMI
packets
> to
> HDMI connector. Basically, it contains a PLL that produces source clock
for
> Mixer, VP and HDMI during streaming.
> 
> 5. TVOUT. Generation of TV analog signal. (driver not implemented)
> 
> 6. VideoDAC. Modulator for TVOUT signal. (driver not implemented)
> 
> 
> The diagram below depicts connection between all HW pieces.
>                     +-----------+
> NV12 data ---dma--->|   Video   |
>                     | Processor |
>                     +-----------+
>                           |
>                           V
>                     +-----------+
> RGB data  ---dma--->|           |
>                     |   Mixer   |
> RGB data  ---dma--->|           |
>                     +-----------+
>                           |
>                           * dmux
>                          /
>                   +-----*   *------+
>                   |                |
>                   V                V
>             +-----------+    +-----------+
>             |    HDMI   |    |   TVOUT   |
>             +-----------+    +-----------+
>                   |                |
>                   V                V
>             +-----------+    +-----------+
>             |  HDMIPHY  |    |  VideoDAC |
>             +-----------+    +-----------+
>                   |                |
>                   V                V
>                 HDMI           Composite
>              connector         connector
> 
> 
> ==================
>  Driver interface
> ==================
> 
> The posted driver implements three V4L2 nodes. Every video node implements
> V4L2
> output buffer. One of nodes corresponds to input of Video Processor. The
> other
> two nodes correspond to RGB inputs of Mixer. All nodes share the same
output.
> It is one of the Mixer's outputs: TVOUT or HDMI. Changing output in one
layer
> using S_OUTPUT would change outputs of all other video nodes. The same
thing
> happens if one try to reconfigure output i.e. by calling S_DV_PRESET.
However
> it not possible to change or reconfigure the output while streaming. To
sum
> up,
> all features in posted version of driver goes as follows:
> 
> 1. QUERYCAP
> 2. S_FMT, G_FMT - single and multiplanar API
>   a) node named video0 supports formats NV12, NV12, NV12T (tiled version
of
> NV12), NV12MT (multiplane version of NV12T).
>   b) nodes named graph0 and graph1 support formats RGB565, ARGB1555,
ARGB4444,
> ARGB8888.
> 3. Buffer with USERPTR and MMAP memory.
> 4. Streaming and buffer control. (STREAMON, STREAMOFF, REQBUF, QBUF,
DQBUF)
> 5. OUTPUT enumeration.
> 6. DV preset control (SET, GET, ENUM). Currently modes 480P59_94,
720P59_94,
> 1080P30, 1080P59_94 and 1080P60 work.
> 7. Positioning layer's window on output display using S_CROP, G_GROP,
CROPCAP.
> 8. Positioning and cropping data in buffer using S_CROP, G_GROP, CROPCAP
with
> buffer type OVERLAY. *
> 
> TODOs:
> - add analog TVOUT driver
> - add S_OUTPUT
> - add S_STD ioctl
> - add control of alpha blending / chroma keying via V4L2 controls
> - add controls for luminance curve and sharpness in VP
> - consider exporting all output functionalities to separate video node
> - consider media controller framework
> - better control over debugging
> - fix dependency between all TV drivers
> 
> * The need of cropping in source buffers came from problem with MFC driver
> for
> S5P. The MFC supports only width divisible by 64. If a width of a decoded
> movie
> is not aligned do 64 then padding pixels are filled with zeros. This is an
> ugly
> green color in YCbCr colorspace. Filling it with zeros by a CPU is a waste
of
> resources since an image can be cropped in VP. Is it possible to set crops
> for
> user data for M2M devices. V4L2 lacks such functionality of non-M2M
devices.
> Therefore cropping in buffer V4L2_BUF_TYPE_VIDEO_OVERLAY was used as an
work
> around.
> 
> =====================
>  Device Architecture
> =====================
> 
> Three drivers are added in this patch.
> 
> 1. HDMIPHY. It is an I2C driver for HDMIPHY interface. It exports
following
> callback by V4L2 subdevice:
> - s_power: currently stub
> - s_stream: configures and starts/stops HDMIPHY
> - s_dv_preset: used to choose proper frequency of clock for other TV
devices
> 
> 2. HDMI. The auxiliary driver used to control HDMI interface. It exports
its
> subdev to a subdev pool for use by other drivers. The following callbacks
are
> implemented:
> - s_power: runs HDMI hardware, regulators and clocks.
> - s_stream: runs HDMIPHY and starts generation of video frames.
> - enum_dv_presets
> - s_dv_preset
> - g_mbus_format: returns information on data format expected by on HDMI
input
>   The driver supports an interrupt. It is used to detect plug/unplug
events
> in
> kernel debugs.  The API for detection of such an events in V4L2 API is to
be
> defined.
> 
> 3. Mixer & Video Processor driver. It is called 's5p-mixer' because of
> historical reasons. It was decided combine VP and MXR drivers into one
> because
> of shared interrupt and very similar interface via V4L2 nodes. The driver
is
> a
> realization of many-to-many relation between multiple input layers and
> multiple
> outputs. All shared resources are kept in struct mxr_device. It provides
> utilities for management and synchronization of access to resources and
> reference counting. The outputs are obtained from subdev pool basing on
names
> supplied in platform data. One layer is a single video node. Since layers
> differs simple inheritance is applied. Every layer type implements set of
ops.
> There are different ops for Mixer layers and other for VP layer.
> 
> The videobuf2 framework was used for the management of buffers and
streaming.
> All other V4L2 ioctls are processed in layers common interface. The CMA
was
> used as memory allocator for Mixer's buffers. It could be easily exchanged
> with
> any other allocator integrated with videobuf2 framework.
> 
> Driver is not yet integrated with power domain driver. Moreover one of
> mixer's
> clocks has to change parent while entering streaming mode. Therefore all
> power
> and clock management was moved to platform data until final solutions
emerges.
> 
> ===============
>  Usage summary
> ===============
> 
> Follow steps below to display double-buffered animation on HDMI output.
> 
> 01. Open video node named graph0.
> 02. S_FMT(type = OUTPUT, pixelformat = V4L2_PIX_FMT_RGB*, width, height,
...)
> 03. REQ_BUFS(type = OUTPUT, memory = MMAP, count = 2)
> 04. MMAP(type = OUTPUT, index = 0)
> 05. MMAP(type = OUTPUT, index = 1)
> 06. Fill buffer 0 with data
> 07. QBUF(type = OUTPUT, index = 0)
> 08. STREAM_ON(type = OUTPUT)
> 09. Fill buffer 1 with data
> 10. QBUF(type = OUTPUT, index = 1)
> 11. DQBUF(type = OUTPUT)
> 12. QBUF(type = OUTPUT, index = 0)
> 13. DQBUF(type = OUTPUT)
> 14. Goto 09
> 
> ===============
>  Patch Summary
> ===============
> 
> Tomasz Stanislawski (6):
>   i2c-s3c2410: fix I2C dedicated for hdmiphy
>   universal: i2c: add I2C controller 8 (HDMIPHY)
>   v4l: add macro for 1080p59_54 preset
>   s5p-tv: add driver for HDMI output on S5PC210 platform
>   s5pv310: add s5p-tv to platform devices
>   s5pv310: add s5p-tv to Universal C210 board
> 
>  arch/arm/mach-s5pv310/Kconfig                   |    7 +
>  arch/arm/mach-s5pv310/Makefile                  |    1 +
>  arch/arm/mach-s5pv310/clock.c                   |  138 ++-
>  arch/arm/mach-s5pv310/dev-tv.c                  |  103 ++
>  arch/arm/mach-s5pv310/include/mach/irqs.h       |    8 +
>  arch/arm/mach-s5pv310/include/mach/map.h        |   27 +
>  arch/arm/mach-s5pv310/include/mach/regs-clock.h |    3 +
>  arch/arm/mach-s5pv310/include/mach/regs-pmu.h   |    2 +
>  arch/arm/mach-s5pv310/mach-universal_c210.c     |   54 +
>  arch/arm/plat-samsung/Kconfig                   |    5 +
>  arch/arm/plat-samsung/Makefile                  |    1 +
>  arch/arm/plat-samsung/dev-i2c8.c                |   68 +
>  arch/arm/plat-samsung/include/plat/devs.h       |    3 +
>  arch/arm/plat-samsung/include/plat/iic.h        |    1 +
>  arch/arm/plat-samsung/include/plat/tv.h         |   26 +
>  drivers/i2c/busses/i2c-s3c2410.c                |   36 +-
>  drivers/media/video/Kconfig                     |    8 +
>  drivers/media/video/Makefile                    |    1 +
>  drivers/media/video/s5p-tv/Kconfig              |   58 +
>  drivers/media/video/s5p-tv/Makefile             |   15 +
>  drivers/media/video/s5p-tv/hdmi.h               |   74 +
>  drivers/media/video/s5p-tv/hdmi_drv.c           |  963 ++++++++++++
>  drivers/media/video/s5p-tv/hdmiphy_drv.c        |  247 +++
>  drivers/media/video/s5p-tv/mixer.h              |  314 ++++
>  drivers/media/video/s5p-tv/mixer_drv.c          |  487 ++++++
>  drivers/media/video/s5p-tv/mixer_grp_layer.c    |  180 +++
>  drivers/media/video/s5p-tv/mixer_reg.c          |  523 +++++++
>  drivers/media/video/s5p-tv/mixer_reg.h          |   44 +
>  drivers/media/video/s5p-tv/mixer_video.c        |  863 +++++++++++
>  drivers/media/video/s5p-tv/mixer_vp_layer.c     |  201 +++
>  drivers/media/video/s5p-tv/regs-hdmi.h          | 1849
> +++++++++++++++++++++++
>  drivers/media/video/s5p-tv/regs-vmx.h           |  196 +++
>  drivers/media/video/s5p-tv/regs-vp.h            |  277 ++++
>  drivers/media/video/v4l2-common.c               |    1 +
>  include/linux/videodev2.h                       |    1 +
>  35 files changed, 6783 insertions(+), 2 deletions(-)
>  create mode 100644 arch/arm/mach-s5pv310/dev-tv.c
>  create mode 100644 arch/arm/plat-samsung/dev-i2c8.c
>  create mode 100644 arch/arm/plat-samsung/include/plat/tv.h
>  create mode 100644 drivers/media/video/s5p-tv/Kconfig
>  create mode 100644 drivers/media/video/s5p-tv/Makefile
>  create mode 100644 drivers/media/video/s5p-tv/hdmi.h
>  create mode 100644 drivers/media/video/s5p-tv/hdmi_drv.c
>  create mode 100644 drivers/media/video/s5p-tv/hdmiphy_drv.c
>  create mode 100644 drivers/media/video/s5p-tv/mixer.h
>  create mode 100644 drivers/media/video/s5p-tv/mixer_drv.c
>  create mode 100644 drivers/media/video/s5p-tv/mixer_grp_layer.c
>  create mode 100644 drivers/media/video/s5p-tv/mixer_reg.c
>  create mode 100644 drivers/media/video/s5p-tv/mixer_reg.h
>  create mode 100644 drivers/media/video/s5p-tv/mixer_video.c
>  create mode 100644 drivers/media/video/s5p-tv/mixer_vp_layer.c
>  create mode 100644 drivers/media/video/s5p-tv/regs-hdmi.h
>  create mode 100644 drivers/media/video/s5p-tv/regs-vmx.h
>  create mode 100644 drivers/media/video/s5p-tv/regs-vp.h
> 
> --
> 1.7.1.569.g6f426

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux