1/*- 2 * Copyright (c) 2012 Robert N. M. Watson 3 * All rights reserved. 4 * 5 * This software was developed by SRI International and the University of 6 * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237) 7 * ("CTSRD"), as part of the DARPA CRASH research programme. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 * 30 * $FreeBSD$ 31 */ 32 33#ifndef _DEV_TERASIC_MTL_H_ 34#define _DEV_TERASIC_MTL_H_ 35 36#include "opt_syscons.h" 37 38struct terasic_mtl_softc { 39#if defined(DEV_SC) 40 /* 41 * syscons requires that its video_adapter_t be at the front of the 42 * softc, so place syscons fields first, which we otherwise would 43 * probably not do. 44 */ 45 video_adapter_t mtl_va; 46#endif 47 48 /* 49 * Bus-related fields. 50 */ 51 device_t mtl_dev; 52 int mtl_unit; 53 54 /* 55 * The MTL driver doesn't require a lot of synchronisation; however, 56 * the lock is used to protect read-modify-write operations on MTL 57 * registers. 58 */ 59 struct mtx mtl_lock; 60 61 /* 62 * Control register device -- mappable from userspace. 63 */ 64 struct cdev *mtl_reg_cdev; 65 struct resource *mtl_reg_res; 66 int mtl_reg_rid; 67 68 /* 69 * Graphics frame buffer device -- mappable from userspace, and used 70 * by the vt framebuffer interface. 71 */ 72 struct cdev *mtl_pixel_cdev; 73 struct resource *mtl_pixel_res; 74 int mtl_pixel_rid; 75 76 /* 77 * Text frame buffer device -- mappable from userspace, and syscons 78 * hookup. 79 */ 80 struct cdev *mtl_text_cdev; 81 struct resource *mtl_text_res; 82 int mtl_text_rid; 83 uint16_t *mtl_text_soft; 84 85 /* 86 * Framebuffer hookup for vt(4). 87 */ 88 struct fb_info mtl_fb_info; 89}; 90 91#define TERASIC_MTL_LOCK(sc) mtx_lock(&(sc)->mtl_lock) 92#define TERASIC_MTL_LOCK_ASSERT(sc) mtx_assert(&(sc)->mtl_lock, MA_OWNED) 93#define TERASIC_MTL_LOCK_DESTROY(sc) mtx_destroy(&(sc)->mtl_lock) 94#define TERASIC_MTL_LOCK_INIT(sc) mtx_init(&(sc)->mtl_lock, \ 95 "terasic_mtl", NULL, MTX_DEF) 96#define TERASIC_MTL_UNLOCK(sc) mtx_unlock(&(sc)->mtl_lock) 97 98/* 99 * Constant properties of the MTL text frame buffer. 100 */ 101#define TERASIC_MTL_COLS 100 102#define TERASIC_MTL_ROWS 40 103 104/* 105 * MTL control register offsets. 106 */ 107#define TERASIC_MTL_OFF_BLEND 0 108#define TERASIC_MTL_OFF_TEXTCURSOR 4 109#define TERASIC_MTL_OFF_TEXTFRAMEBUFADDR 8 110#define TERASIC_MTL_OFF_TOUCHPOINT_X1 12 111#define TERASIC_MTL_OFF_TOUCHPOINT_Y1 16 112#define TERASIC_MTL_OFF_TOUCHPOINT_X2 20 113#define TERASIC_MTL_OFF_TOUCHPOINT_Y2 24 114#define TERASIC_MTL_OFF_TOUCHGESTURE 28 115 116/* 117 * Constants to help interpret various control registers. 118 */ 119#define TERASIC_MTL_BLEND_PIXEL_ENDIAN_SWAP 0x10000000 120#define TERASIC_MTL_BLEND_DEFAULT_MASK 0x0f000000 121#define TERASIC_MTL_BLEND_DEFAULT_SHIFT 24 122#define TERASIC_MTL_BLEND_PIXEL_MASK 0x00ff0000 123#define TERASIC_MTL_BLEND_PIXEL_SHIFT 16 124#define TERASIC_MTL_BLEND_TEXTFG_MASK 0x0000ff00 125#define TERASIC_MTL_BLEND_TEXTFG_SHIFT 8 126#define TERASIC_MTL_BLEND_TEXTBG_MASK 0x000000ff 127#define TERASIC_MTL_BLEND_TEXTBG_SHIFT 0 128#define TERASIC_MTL_TEXTCURSOR_COL_MASK 0xff00 129#define TERASIC_MTL_TEXTCURSOR_COL_SHIFT 8 130#define TERASIC_MTL_TEXTCURSOR_ROW_MASK 0xff 131 132/* 133 * Colours used both by VGA-like text rendering, and for the default display 134 * colour. 135 */ 136#define TERASIC_MTL_COLOR_BLACK 0 137#define TERASIC_MTL_COLOR_DARKBLUE 1 138#define TERASIC_MTL_COLOR_DARKGREEN 2 139#define TERASIC_MTL_COLOR_DARKCYAN 3 140#define TERASIC_MTL_COLOR_DARKRED 4 141#define TERASIC_MTL_COLOR_DARKMAGENTA 5 142#define TERASIC_MTL_COLOR_BROWN 6 143#define TERASIC_MTL_COLOR_LIGHTGREY 7 144#define TERASIC_MTL_COLOR_DARKGREY 8 145#define TERASIC_MTL_COLOR_LIGHTBLUE 9 146#define TERASIC_MTL_COLOR_LIGHTGREEN 10 147#define TERASIC_MTL_COLOR_LIGHTCYAN 11 148#define TERASIC_MTL_COLOR_LIGHTRED 12 149#define TERASIC_MTL_COLOR_LIGHTMAGENTA 13 150#define TERASIC_MTL_COLOR_LIGHTYELLOW 14 151#define TERASIC_MTL_COLOR_WHITE 15 152#define TERASIC_MTL_COLORMASK_BLINK 0x80 153 154/* 155 * Constants to help interpret the text frame buffer. 156 */ 157#define TERASIC_MTL_TEXTFRAMEBUF_EXPECTED_ADDR 0x0177000 158#define TERASIC_MTL_TEXTFRAMEBUF_CHAR_SHIFT 0 159#define TERASIC_MTL_TEXTFRAMEBUF_ATTR_SHIFT 8 160 161/* 162 * Framebuffer constants. 163 */ 164#define TERASIC_MTL_FB_WIDTH 800 165#define TERASIC_MTL_FB_HEIGHT 640 166 167/* 168 * Alpha-blending constants. 169 */ 170#define TERASIC_MTL_ALPHA_TRANSPARENT 0 171#define TERASIC_MTL_ALPHA_OPAQUE 255 172 173/* 174 * Driver setup routines from the bus attachment/teardown. 175 */ 176int terasic_mtl_attach(struct terasic_mtl_softc *sc); 177void terasic_mtl_detach(struct terasic_mtl_softc *sc); 178 179extern devclass_t terasic_mtl_devclass; 180 181/* 182 * Sub-driver setup routines. 183 */ 184int terasic_mtl_fbd_attach(struct terasic_mtl_softc *sc); 185void terasic_mtl_fbd_detach(struct terasic_mtl_softc *sc); 186int terasic_mtl_pixel_attach(struct terasic_mtl_softc *sc); 187void terasic_mtl_pixel_detach(struct terasic_mtl_softc *sc); 188int terasic_mtl_reg_attach(struct terasic_mtl_softc *sc); 189void terasic_mtl_reg_detach(struct terasic_mtl_softc *sc); 190int terasic_mtl_syscons_attach(struct terasic_mtl_softc *sc); 191void terasic_mtl_syscons_detach(struct terasic_mtl_softc *sc); 192int terasic_mtl_text_attach(struct terasic_mtl_softc *sc); 193void terasic_mtl_text_detach(struct terasic_mtl_softc *sc); 194 195/* 196 * Control register I/O routines. 197 */ 198void terasic_mtl_reg_blank(struct terasic_mtl_softc *sc); 199 200void terasic_mtl_reg_blend_get(struct terasic_mtl_softc *sc, 201 uint32_t *blendp); 202void terasic_mtl_reg_blend_set(struct terasic_mtl_softc *sc, 203 uint32_t blend); 204void terasic_mtl_reg_textcursor_get(struct terasic_mtl_softc *sc, 205 uint8_t *colp, uint8_t *rowp); 206void terasic_mtl_reg_textcursor_set(struct terasic_mtl_softc *sc, 207 uint8_t col, uint8_t row); 208void terasic_mtl_reg_textframebufaddr_get(struct terasic_mtl_softc *sc, 209 uint32_t *addrp); 210void terasic_mtl_reg_textframebufaddr_set(struct terasic_mtl_softc *sc, 211 uint32_t addr); 212 213/* 214 * Read-modify-write updates of sub-bytes of the blend register. 215 */ 216void terasic_mtl_blend_default_set(struct terasic_mtl_softc *sc, 217 uint8_t colour); 218void terasic_mtl_blend_pixel_set(struct terasic_mtl_softc *sc, 219 uint8_t alpha); 220void terasic_mtl_blend_textfg_set(struct terasic_mtl_softc *sc, 221 uint8_t alpha); 222void terasic_mtl_blend_textbg_set(struct terasic_mtl_softc *sc, 223 uint8_t alpha); 224void terasic_mtl_reg_pixel_endian_set(struct terasic_mtl_softc *sc, 225 int endian_swap); 226 227/* 228 * Text frame buffer I/O routines. 229 */ 230void terasic_mtl_text_putc(struct terasic_mtl_softc *sc, u_int x, u_int y, 231 uint8_t c, uint8_t a); 232 233#endif /* _DEV_TERASIC_MTL_H_ */ 234