aboutsummaryrefslogtreecommitdiff
path: root/hw/dsi.h
diff options
context:
space:
mode:
Diffstat (limited to 'hw/dsi.h')
-rw-r--r--hw/dsi.h145
1 files changed, 145 insertions, 0 deletions
diff --git a/hw/dsi.h b/hw/dsi.h
new file mode 100644
index 0000000000..21ee6cc300
--- /dev/null
+++ b/hw/dsi.h
@@ -0,0 +1,145 @@
+/*
+ * MIPI DSI interface.
+ *
+ * Copyright (C) 2008-2010 Nokia Corporation
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 or
+ * (at your option) any later version of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+#ifndef HW_DSI_H__
+#define HW_DSI_H__
+#include "qdev.h"
+#include "framebuffer.h"
+
+#define DSI_MAKERETURNBYTE(b) ((((b) & 0xff) << 8) | 0x21)
+#define DSI_MAKERETURNWORD(w) ((((w) & 0xffff) << 8) | 0x22)
+#define DSI_MAKERETURNERROR(e) ((((e) & 0xffff) << 8) | 0x02)
+
+typedef struct DSIDevice DSIDevice;
+typedef struct DSICommonDevice DSICommonDevice;
+typedef struct DSIHost DSIHost;
+
+#define TYPE_DSI_DEVICE "dsi-device"
+#define DSI_DEVICE(obj) \
+ OBJECT_CHECK(DSIDevice, (obj), TYPE_DSI_DEVICE)
+#define DSI_DEVICE_CLASS(klass) \
+ OBJECT_CLASS_CHECK(DSIDeviceClass, (klass), TYPE_DSI_DEVICE)
+#define DSI_DEVICE_GET_CLASS(obj) \
+ OBJECT_GET_CLASS(DSIDeviceClass, (obj), TYPE_DSI_DEVICE)
+
+#define TYPE_DSI_COMMON_DEVICE "dsi-common-device"
+#define DSI_COMMON_DEVICE(obj) \
+ OBJECT_CHECK(DSICommonDevice, (obj), TYPE_DSI_COMMON_DEVICE)
+#define DSI_COMMON_DEVICE_CLASS(klass) \
+ OBJECT_CLASS_CHECK(DSICommonDeviceClass, (klass), TYPE_DSI_COMMON_DEVICE)
+#define DSI_COMMON_DEVICE_GET_CLASS(obj) \
+ OBJECT_GET_CLASS(DSICommonDeviceClass, (obj), TYPE_DSI_COMMON_DEVICE)
+
+
+
+/* device callbacks */
+typedef int (*dsi_device_initfn)(DSIDevice *dev);
+typedef void (*dsi_write_cb)(DSIDevice *dev, uint32_t data, int len);
+typedef uint32_t (*dsi_read_cb)(DSIDevice *dev, uint32_t data, int len);
+typedef int (*dsi_blt_cb)(DSIDevice *dev, void *data, int width, int height,
+ int col_pitch, int row_pitch, int format);
+
+/* common device callbacks */
+typedef void (*dsi_common_write_cb)(DSICommonDevice *dev, uint32_t data,
+ int len);
+typedef uint32_t (*dsi_common_read_cb)(DSICommonDevice *dev, uint32_t data,
+ int len);
+typedef void (*dsi_common_device_resetfn)(DSICommonDevice *dev);
+typedef void (*dsi_powermode_changed_cb)(DSICommonDevice *dev);
+typedef void (*dsi_temode_changed_cb)(DSICommonDevice *dev);
+
+/* host callbacks */
+typedef void (*dsi_te_trigger_cb)(DeviceState *dev, int vc);
+typedef drawfn (*dsi_get_drawfn_cb)(const DeviceState *dev, int format,
+ int bpp);
+
+typedef struct {
+ DeviceClass parent_class;
+ dsi_device_initfn init;
+ dsi_write_cb write;
+ dsi_read_cb read;
+ dsi_blt_cb blt;
+} DSIDeviceClass;
+
+typedef struct {
+ DSIDeviceClass parent_class;
+ dsi_common_write_cb write;
+ dsi_common_read_cb read;
+ dsi_common_device_resetfn reset;
+ dsi_powermode_changed_cb powermode_changed;
+ dsi_temode_changed_cb temode_changed;
+} DSICommonDeviceClass;
+
+struct DSIDevice {
+ DeviceState qdev;
+
+ /* internal fields used by DSI code */
+ DSIHost *host;
+ uint8_t vchannel;
+ uint16_t max_return_size;
+};
+
+struct DSICommonDevice {
+ DSIDevice dsi;
+ enum { bs_cmd, bs_data } bs;
+ uint8_t cmd;
+ uint8_t powermode;
+ uint8_t addrmode;
+ uint8_t bpp_dpi;
+ uint8_t bpp_dbi;
+ uint8_t dr;
+ uint32_t sc;
+ uint32_t ec;
+ uint32_t cc;
+ uint32_t sp;
+ uint32_t ep;
+ uint32_t cp;
+ enum {
+ te_off = -1,
+ te_vsync = 0,
+ te_hvsync = 1
+ } te_mode;
+};
+
+/* host functions */
+DSIHost *dsi_init_host(DeviceState *parent, const char *name,
+ dsi_te_trigger_cb te_trigger_cb,
+ dsi_get_drawfn_cb get_drawfn_cb);
+uint32_t dsi_short_write(DSIHost *host, uint32_t data);
+void dsi_long_write(DSIHost *host, uint32_t header, uint32_t payload,
+ uint32_t counter);
+int dsi_blt(DSIHost *host, int vc, void *data, int width, int height,
+ int col_pitch, int row_pitch, int format);
+
+/* device -> host functions */
+void dsi_te_trigger(const DSIDevice *dev);
+drawfn dsi_get_drawfn(const DSIDevice *dev, int format, int bpp);
+
+#define DSI_DEVICE_FROM_QDEV(dev) DO_UPCAST(DSIDevice, qdev, dev)
+#define DSI_COMMON_DEVICE_FROM_QDEV(dev) DO_UPCAST(DSICommonDevice, dsi, \
+ DSI_DEVICE_FROM_QDEV(dev))
+#define FROM_DSI_DEVICE(type, dev) DO_UPCAST(type, dsi, dev)
+
+DeviceState *dsi_create_device(DSIHost *host, const char *name, int vc);
+DeviceState *dsi_create_device_noinit(DSIHost *host, const char *name, int vc);
+DeviceState *dsi_create_common_device(DSIHost *host, const char *name, int vc);
+DeviceState *dsi_create_common_device_noinit(DSIHost *host, const char *name,
+ int vc);
+
+#endif