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

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

 



On Wed, Mar 9, 2011 at 9:11 PM, Kukjin Kim <kgene.kim@xxxxxxxxxxx> wrote:
> 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.
It's different one, which scheme is used at multimedia, platform
devices are same.
>
> I think we have to improve this next time and need to focus more on its
> driver now.

As you said, arch supports the platform devices, we focus on only driver itself.
>
> 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-samsung-soc" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux SoC Development]     [Linux Rockchip Development]     [Linux USB Development]     [Video for Linux]     [Linux Audio Users]     [Linux SCSI]     [Yosemite News]

  Powered by Linux