[U-Boot] [ v2 03/10] video: add support of MIPI DSI interface
Simon Glass
sjg at chromium.org
Mon Jul 16 05:20:44 UTC 2018
On 13 July 2018 at 06:11, Yannick Fertré <yannick.fertre at st.com> wrote:
> Mipi_display.c contains a set of dsi helpers.
> This file is a copy of file drm_mipi_dsi.c (linux kernel).
>
> Signed-off-by: Yannick Fertré <yannick.fertre at st.com>
> ---
> drivers/video/Kconfig | 9 +
> drivers/video/Makefile | 1 +
> drivers/video/mipi_display.c | 817 +++++++++++++++++++++++++++++++++++++++++++
> include/mipi_display.h | 257 +++++++++++++-
> 4 files changed, 1083 insertions(+), 1 deletion(-)
> create mode 100644 drivers/video/mipi_display.c
>
> diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
> index 5ee9032..560da1a 100644
> --- a/drivers/video/Kconfig
> +++ b/drivers/video/Kconfig
> @@ -73,6 +73,15 @@ config VIDEO_ANSI
> Enable ANSI escape sequence decoding for a more fully functional
> console.
>
> +config VIDEO_MIPI_DSI
> + bool "Support MIPI DSI interface"
> + depends on DM_VIDEO
> + default y if DM_VIDEO
Why default y? Many boards won't use MIPI.
> + help
> + Support MIPI DSI interface for driving a MIPI compatible device.
> + The MIPI Display Serial Interface (MIPI DSI) defines a high-speed
> + serial interface between a host processor and a display module.
> +
> config CONSOLE_NORMAL
[..]
> diff --git a/include/mipi_display.h b/include/mipi_display.h
> index ddcc8ca..5c3dbbe 100644
> --- a/include/mipi_display.h
> +++ b/include/mipi_display.h
> @@ -4,12 +4,16 @@
> *
> * Copyright (C) 2010 Guennadi Liakhovetski <g.liakhovetski at gmx.de>
> * Copyright (C) 2006 Nokia Corporation
> - * Author: Imre Deak <imre.deak at nokia.com>
> + * Copyright (C) 2018 STMicroelectronics - All Rights Reserved
> + * Author(s): Imre Deak <imre.deak at nokia.com>
> + * Yannick Fertre <yannick.fertre at st.com>
> + * Philippe Cornu <philippe.cornu at st.com>
> *
> * This program is free software; you can redistribute it and/or modify
> * it under the terms of the GNU General Public License version 2 as
> * published by the Free Software Foundation.
> */
> +
> #ifndef MIPI_DISPLAY_H
> #define MIPI_DISPLAY_H
>
> @@ -115,6 +119,14 @@ enum {
> MIPI_DCS_READ_MEMORY_CONTINUE = 0x3E,
> MIPI_DCS_SET_TEAR_SCANLINE = 0x44,
> MIPI_DCS_GET_SCANLINE = 0x45,
> + MIPI_DCS_SET_DISPLAY_BRIGHTNESS = 0x51, /* MIPI DCS 1.3 */
> + MIPI_DCS_GET_DISPLAY_BRIGHTNESS = 0x52, /* MIPI DCS 1.3 */
> + MIPI_DCS_WRITE_CONTROL_DISPLAY = 0x53, /* MIPI DCS 1.3 */
> + MIPI_DCS_GET_CONTROL_DISPLAY = 0x54, /* MIPI DCS 1.3 */
> + MIPI_DCS_WRITE_POWER_SAVE = 0x55, /* MIPI DCS 1.3 */
> + MIPI_DCS_GET_POWER_SAVE = 0x56, /* MIPI DCS 1.3 */
> + MIPI_DCS_SET_CABC_MIN_BRIGHTNESS = 0x5E, /* MIPI DCS 1.3 */
> + MIPI_DCS_GET_CABC_MIN_BRIGHTNESS = 0x5F, /* MIPI DCS 1.3 */
> MIPI_DCS_READ_DDB_START = 0xA1,
> MIPI_DCS_READ_DDB_CONTINUE = 0xA8,
> };
> @@ -127,4 +139,247 @@ enum {
> #define MIPI_DCS_PIXEL_FMT_8BIT 2
> #define MIPI_DCS_PIXEL_FMT_3BIT 1
>
> +struct mipi_dsi_host;
> +struct mipi_dsi_device;
> +
> +/* request ACK from peripheral */
> +#define MIPI_DSI_MSG_REQ_ACK BIT(0)
> +/* use Low Power Mode to transmit message */
> +#define MIPI_DSI_MSG_USE_LPM BIT(1)
> +
> +/**
> + * struct mipi_dsi_msg - read/write DSI buffer
> + * @channel: virtual channel id
> + * @type: payload data type
> + * @flags: flags controlling this message transmission
> + * @tx_len: length of @tx_buf
> + * @tx_buf: data to be written
> + * @rx_len: length of @rx_buf
> + * @rx_buf: data to be read, or NULL
> + */
> +struct mipi_dsi_msg {
> + u8 channel;
> + u8 type;
> + u16 flags;
> +
> + size_t tx_len;
> + const void *tx_buf;
> +
> + size_t rx_len;
> + void *rx_buf;
> +};
> +
> +bool mipi_dsi_packet_format_is_short(u8 type);
> +bool mipi_dsi_packet_format_is_long(u8 type);
> +
> +/**
> + * struct mipi_dsi_packet - represents a MIPI DSI packet in protocol format
> + * @size: size (in bytes) of the packet
> + * @header: the four bytes that make up the header (Data ID, Word Count or
> + * Packet Data, and ECC)
> + * @payload_length: number of bytes in the payload
> + * @payload: a pointer to a buffer containing the payload, if any
> + */
> +struct mipi_dsi_packet {
> + size_t size;
> + u8 header[4];
> + size_t payload_length;
> + const u8 *payload;
> +};
> +
> +int mipi_dsi_create_packet(struct mipi_dsi_packet *packet,
> + const struct mipi_dsi_msg *msg);
> +
> +/**
> + * struct mipi_dsi_host_ops - DSI bus operations
> + * @attach: attach DSI device to DSI host
> + * @detach: detach DSI device from DSI host
> + * @transfer: transmit a DSI packet
> + *
> + * DSI packets transmitted by .transfer() are passed in as mipi_dsi_msg
> + * structures. This structure contains information about the type of packet
> + * being transmitted as well as the transmit and receive buffers. When an
> + * error is encountered during transmission, this function will return a
> + * negative error code. On success it shall return the number of bytes
> + * transmitted for write packets or the number of bytes received for read
> + * packets.
> + *
> + * Note that typically DSI packet transmission is atomic, so the .transfer()
> + * function will seldomly return anything other than the number of bytes
> + * contained in the transmit buffer on success.
> + */
> +struct mipi_dsi_host_ops {
> + int (*attach)(struct mipi_dsi_host *host,
> + struct mipi_dsi_device *dsi);
> + int (*detach)(struct mipi_dsi_host *host,
> + struct mipi_dsi_device *dsi);
> + ssize_t (*transfer)(struct mipi_dsi_host *host,
> + const struct mipi_dsi_msg *msg);
This looks like an interface that should use driver model?
> +
> +int mipi_dsi_attach(struct mipi_dsi_device *dsi);
> +int mipi_dsi_detach(struct mipi_dsi_device *dsi);
> +int mipi_dsi_pixel_format_to_bpp(enum mipi_dsi_pixel_format fmt);
Should there be a MIPI uclass?
[..]
> +ssize_t mipi_dsi_dcs_write_buffer(struct mipi_dsi_device *dsi,
> + const void *data, size_t len);
These functions all need full function comments.
> +ssize_t mipi_dsi_dcs_write(struct mipi_dsi_device *dsi, u8 cmd,
> + const void *data, size_t len);
> +ssize_t mipi_dsi_dcs_read(struct mipi_dsi_device *dsi, u8 cmd, void *data,
> + size_t len);
> +int mipi_dsi_dcs_nop(struct mipi_dsi_device *dsi);
> +int mipi_dsi_dcs_soft_reset(struct mipi_dsi_device *dsi);
> +int mipi_dsi_dcs_get_power_mode(struct mipi_dsi_device *dsi, u8 *mode);
> +int mipi_dsi_dcs_get_pixel_format(struct mipi_dsi_device *dsi, u8 *format);
> +int mipi_dsi_dcs_enter_sleep_mode(struct mipi_dsi_device *dsi);
> +int mipi_dsi_dcs_exit_sleep_mode(struct mipi_dsi_device *dsi);
> +int mipi_dsi_dcs_set_display_off(struct mipi_dsi_device *dsi);
> +int mipi_dsi_dcs_set_display_on(struct mipi_dsi_device *dsi);
> +int mipi_dsi_dcs_set_column_address(struct mipi_dsi_device *dsi, u16 start,
> + u16 end);
> +int mipi_dsi_dcs_set_page_address(struct mipi_dsi_device *dsi, u16 start,
> + u16 end);
> +int mipi_dsi_dcs_set_tear_off(struct mipi_dsi_device *dsi);
> +int mipi_dsi_dcs_set_tear_on(struct mipi_dsi_device *dsi,
> + enum mipi_dsi_dcs_tear_mode mode);
> +int mipi_dsi_dcs_set_pixel_format(struct mipi_dsi_device *dsi, u8 format);
> +int mipi_dsi_dcs_set_tear_scanline(struct mipi_dsi_device *dsi, u16 scanline);
> +int mipi_dsi_dcs_set_display_brightness(struct mipi_dsi_device *dsi,
> + u16 brightness);
> +int mipi_dsi_dcs_get_display_brightness(struct mipi_dsi_device *dsi,
> + u16 *brightness);
> +
> #endif
> --
> 1.9.1
>
Regards,
Simon
More information about the U-Boot
mailing list