"Das U-Boot" Source Tree
at master 434 lines 12 kB view raw
1/* 2 * Video uclass to support displays (see also vidconsole for text) 3 * 4 * Copyright (c) 2015 Google, Inc 5 */ 6 7#ifndef _VIDEO_H_ 8#define _VIDEO_H_ 9 10#include <stdio_dev.h> 11 12struct udevice; 13 14/** 15 * struct video_uc_plat - uclass platform data for a video device 16 * 17 * This holds information that the uclass needs to know about each device. It 18 * is accessed using dev_get_uclass_plat(dev). See 'Theory of operation' at 19 * the top of video-uclass.c for details on how this information is set. 20 * 21 * @align: Frame-buffer alignment, indicating the memory boundary the frame 22 * buffer should start on. If 0, 1MB is assumed 23 * @size: Frame-buffer size, in bytes 24 * @base: Base address of frame buffer, 0 if not yet known. If CONFIG_VIDEO_COPY 25 * is enabled, this is the software copy, so writes to this will not be 26 * visible until vidconsole_sync_copy() is called. If CONFIG_VIDEO_COPY is 27 * disabled, this is the hardware framebuffer. 28 * @copy_base: Base address of a hardware copy of the frame buffer. If 29 * CONFIG_VIDEO_COPY is disabled, this is not used. 30 * @copy_size: Size of copy framebuffer, used if @size is 0 31 * @hide_logo: Hide the logo (used for testing) 32 */ 33struct video_uc_plat { 34 uint align; 35 uint size; 36 ulong base; 37 ulong copy_base; 38 ulong copy_size; 39 bool hide_logo; 40}; 41 42enum video_polarity { 43 VIDEO_ACTIVE_HIGH, /* Pins are active high */ 44 VIDEO_ACTIVE_LOW, /* Pins are active low */ 45}; 46 47/* 48 * Bits per pixel selector. Each value n is such that the bits-per-pixel is 49 * 2 ^ n 50 */ 51enum video_log2_bpp { 52 VIDEO_BPP1 = 0, 53 VIDEO_BPP2, 54 VIDEO_BPP4, 55 VIDEO_BPP8, 56 VIDEO_BPP16, 57 VIDEO_BPP32, 58}; 59 60/* Convert enum video_log2_bpp to bytes and bits */ 61#define VNBYTES(bpix) ((1 << (bpix)) / 8) 62#define VNBITS(bpix) (1 << (bpix)) 63 64enum video_format { 65 VIDEO_UNKNOWN, 66 VIDEO_RGBA8888, 67 VIDEO_X8B8G8R8, 68 VIDEO_X8R8G8B8, 69 VIDEO_X2R10G10B10, 70}; 71 72/** 73 * struct video_priv - Device information used by the video uclass 74 * 75 * @xsize: Number of pixel columns (e.g. 1366) 76 * @ysize: Number of pixels rows (e.g.. 768) 77 * @rot: Display rotation (0=none, 1=90 degrees clockwise, etc.). THis 78 * does not affect @xsize and @ysize 79 * @bpix: Encoded bits per pixel (enum video_log2_bpp) 80 * @format: Pixel format (enum video_format) 81 * @vidconsole_drv_name: Driver to use for the text console, NULL to 82 * select automatically 83 * @font_size: Font size in pixels (0 to use a default value) 84 * @fb: Frame buffer 85 * @fb_size: Frame buffer size 86 * @copy_fb: Copy of the frame buffer to keep up to date; see struct 87 * video_uc_plat 88 * @line_length: Length of each frame buffer line, in bytes. This can be 89 * set by the driver, but if not, the uclass will set it after 90 * probing 91 * @colour_fg: Foreground colour (pixel value) 92 * @colour_bg: Background colour (pixel value) 93 * @flush_dcache: true to enable flushing of the data cache after 94 * the LCD is updated 95 * @fg_col_idx: Foreground color code (bit 3 = bold, bit 0-2 = color) 96 * @bg_col_idx: Background color code (bit 3 = bold, bit 0-2 = color) 97 * @last_sync: Monotonic time of last video sync 98 */ 99struct video_priv { 100 /* Things set up by the driver: */ 101 ushort xsize; 102 ushort ysize; 103 ushort rot; 104 enum video_log2_bpp bpix; 105 enum video_format format; 106 const char *vidconsole_drv_name; 107 int font_size; 108 109 /* 110 * Things that are private to the uclass: don't use these in the 111 * driver 112 */ 113 void *fb; 114 int fb_size; 115 void *copy_fb; 116 int line_length; 117 u32 colour_fg; 118 u32 colour_bg; 119 bool flush_dcache; 120 u8 fg_col_idx; 121 u8 bg_col_idx; 122 ulong last_sync; 123}; 124 125/** 126 * struct video_ops - structure for keeping video operations 127 * @video_sync: Synchronize FB with device. Some device like SPI based LCD 128 * displays needs synchronization when data in an FB is available. 129 * For these devices implement video_sync hook to call a sync 130 * function. vid is pointer to video device udevice. Function 131 * should return 0 on success video_sync and error code otherwise 132 */ 133struct video_ops { 134 int (*video_sync)(struct udevice *vid); 135}; 136 137#define video_get_ops(dev) ((struct video_ops *)(dev)->driver->ops) 138 139/** 140 * struct video_handoff - video information passed from SPL 141 * 142 * This is used when video is set up by SPL, to provide the details to U-Boot 143 * proper. 144 * 145 * @fb: Base address of frame buffer, 0 if not yet known 146 * @size: Frame-buffer size, in bytes 147 * @xsize: Number of pixel columns (e.g. 1366) 148 * @ysize: Number of pixels rows (e.g.. 768) 149 * @line_length: Length of each frame buffer line, in bytes. This can be 150 * set by the driver, but if not, the uclass will set it after 151 * probing 152 * @bpix: Encoded bits per pixel (enum video_log2_bpp) 153 * @format: Video format (enum video_format) 154 */ 155struct video_handoff { 156 u64 fb; 157 u32 size; 158 u16 xsize; 159 u16 ysize; 160 u32 line_length; 161 u8 bpix; 162 u8 format; 163}; 164 165/** enum colour_idx - the 16 colors supported by consoles */ 166enum colour_idx { 167 VID_BLACK = 0, 168 VID_RED, 169 VID_GREEN, 170 VID_BROWN, 171 VID_BLUE, 172 VID_MAGENTA, 173 VID_CYAN, 174 VID_LIGHT_GRAY, 175 VID_GRAY, 176 VID_LIGHT_RED, 177 VID_LIGHT_GREEN, 178 VID_YELLOW, 179 VID_LIGHT_BLUE, 180 VID_LIGHT_MAGENTA, 181 VID_LIGHT_CYAN, 182 VID_WHITE, 183 VID_DARK_GREY, 184 185 VID_COLOUR_COUNT 186}; 187 188/** 189 * video_index_to_colour() - convert a color code to a pixel's internal 190 * representation 191 * 192 * The caller has to guarantee that the color index is less than 193 * VID_COLOR_COUNT. 194 * 195 * @priv private data of the video device (UCLASS_VIDEO) 196 * @idx color index (e.g. VID_YELLOW) 197 * Return: color value 198 */ 199u32 video_index_to_colour(struct video_priv *priv, enum colour_idx idx); 200 201/** 202 * video_reserve() - Reserve frame-buffer memory for video devices 203 * 204 * Note: This function is for internal use. 205 * 206 * This uses the uclass plat's @size and @align members to figure out 207 * a size and position for each frame buffer as part of the pre-relocation 208 * process of determining the post-relocation memory layout. 209 * 210 * gd->video_top is set to the initial value of *@addrp and gd->video_bottom 211 * is set to the final value. 212 * 213 * @addrp: On entry, the top of available memory. On exit, the new top, 214 * after allocating the required memory. 215 * Return: 0 216 */ 217int video_reserve(ulong *addrp); 218 219/** 220 * video_clear() - Clear a device's frame buffer to background colour. 221 * 222 * @dev: Device to clear 223 * Return: 0 on success 224 */ 225int video_clear(struct udevice *dev); 226 227/** 228 * video_fill() - Fill a device's frame buffer to a colour. 229 * 230 * @dev: Device to fill 231 * @colour: Colour to use, in the frame buffer's format 232 * Return: 0 on success 233 */ 234int video_fill(struct udevice *dev, u32 colour); 235 236/** 237 * video_fill_part() - Erase a region 238 * 239 * Erase a rectangle of the display within the given bounds. 240 * 241 * @dev: Device to update 242 * @xstart: X start position in pixels from the left 243 * @ystart: Y start position in pixels from the top 244 * @xend: X end position in pixels from the left 245 * @yend: Y end position in pixels from the top 246 * @colour: Value to write 247 * Return: 0 if OK, -ENOSYS if the display depth is not supported 248 */ 249int video_fill_part(struct udevice *dev, int xstart, int ystart, int xend, 250 int yend, u32 colour); 251 252/** 253 * video_sync() - Sync a device's frame buffer with its hardware 254 * 255 * @vid: Device to sync 256 * @force: True to force a sync even if there was one recently (this is 257 * very expensive on sandbox) 258 * 259 * @return: 0 on success, error code otherwise 260 * 261 * Some frame buffers are cached or have a secondary frame buffer. This 262 * function syncs these up so that the current contents of the U-Boot frame 263 * buffer are displayed to the user. 264 */ 265int video_sync(struct udevice *vid, bool force); 266 267/** 268 * video_sync_all() - Sync all devices' frame buffers with their hardware 269 * 270 * This calls video_sync() on all active video devices. 271 */ 272void video_sync_all(void); 273 274/** 275 * video_bmp_get_info() - Get information about a bitmap image 276 * 277 * @bmp_image: Pointer to BMP image to check 278 * @widthp: Returns width in pixels 279 * @heightp: Returns height in pixels 280 * @bpixp: Returns log2 of bits per pixel 281 */ 282void video_bmp_get_info(void *bmp_image, ulong *widthp, ulong *heightp, 283 uint *bpixp); 284 285/** 286 * video_bmp_display() - Display a BMP file 287 * 288 * @dev: Device to display the bitmap on 289 * @bmp_image: Address of bitmap image to display 290 * @x: X position in pixels from the left 291 * @y: Y position in pixels from the top 292 * @align: true to adjust the coordinates to centre the image. If false 293 * the coordinates are used as is. If true: 294 * 295 * - if a coordinate is 0x7fff then the image will be centred in 296 * that direction 297 * - if a coordinate is -ve then it will be offset to the 298 * left/top of the centre by that many pixels 299 * - if a coordinate is positive it will be used unchanged. 300 * Return: 0 if OK, -ve on error 301 */ 302int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y, 303 bool align); 304 305/** 306 * video_get_xsize() - Get the width of the display in pixels 307 * 308 * @dev: Device to check 309 * Return: device frame buffer width in pixels 310 */ 311int video_get_xsize(struct udevice *dev); 312 313/** 314 * video_get_ysize() - Get the height of the display in pixels 315 * 316 * @dev: Device to check 317 * Return: device frame buffer height in pixels 318 */ 319int video_get_ysize(struct udevice *dev); 320 321/** 322 * Set whether we need to flush the dcache when changing the image. This 323 * defaults to off. 324 * 325 * @param flush non-zero to flush cache after update, 0 to skip 326 */ 327void video_set_flush_dcache(struct udevice *dev, bool flush); 328 329/** 330 * Set default colors and attributes 331 * 332 * @dev: video device 333 * @invert true to invert colours 334 */ 335void video_set_default_colors(struct udevice *dev, bool invert); 336 337/** 338 * video_default_font_height() - Get the default font height 339 * 340 * @dev: video device 341 * Returns: Default font height in pixels, which depends on which console driver 342 * is in use 343 */ 344int video_default_font_height(struct udevice *dev); 345 346#ifdef CONFIG_VIDEO_COPY 347/** 348 * vidconsole_sync_copy() - Sync back to the copy framebuffer 349 * 350 * This ensures that the copy framebuffer has the same data as the framebuffer 351 * for a particular region. It should be called after the framebuffer is updated 352 * 353 * @from and @to can be in either order. The region between them is synced. 354 * 355 * @dev: Vidconsole device being updated 356 * @from: Start/end address within the framebuffer (->fb) 357 * @to: Other address within the frame buffer 358 * Return: 0 if OK, -EFAULT if the start address is before the start of the 359 * frame buffer start 360 */ 361int video_sync_copy(struct udevice *dev, void *from, void *to); 362 363/** 364 * video_sync_copy_all() - Sync the entire framebuffer to the copy 365 * 366 * @dev: Vidconsole device being updated 367 * Return: 0 (always) 368 */ 369int video_sync_copy_all(struct udevice *dev); 370#else 371static inline int video_sync_copy(struct udevice *dev, void *from, void *to) 372{ 373 return 0; 374} 375 376static inline int video_sync_copy_all(struct udevice *dev) 377{ 378 return 0; 379} 380 381#endif 382 383/** 384 * video_is_active() - Test if one video device it active 385 * 386 * Return: true if at least one video device is active, else false. 387 */ 388bool video_is_active(void); 389 390/** 391 * video_get_u_boot_logo() - Get a pointer to the U-Boot logo 392 * 393 * Returns: Pointer to logo 394 */ 395void *video_get_u_boot_logo(void); 396 397/* 398 * bmp_display() - Display BMP (bitmap) data located in memory 399 * 400 * @addr: address of the bmp data 401 * @x: Position of bitmap from the left side, in pixels 402 * @y: Position of bitmap from the top, in pixels 403 */ 404int bmp_display(ulong addr, int x, int y); 405 406/* 407 * bmp_info() - Show information about bmp file 408 * 409 * @addr: address of bmp file 410 * Returns: 0 if OK, else 1 if bmp image not found 411 */ 412int bmp_info(ulong addr); 413 414/* 415 * video_reserve_from_bloblist()- Reserve frame-buffer memory for video devices 416 * using blobs. 417 * 418 * @ho: video information passed from SPL 419 * Returns: 0 (always) 420 */ 421int video_reserve_from_bloblist(struct video_handoff *ho); 422 423/** 424 * video_get_fb() - Get the first framebuffer address 425 * 426 * This function does not probe video devices, so can only be used after a video 427 * device has been activated. 428 * 429 * Return: address of the framebuffer of the first video device found, or 0 if 430 * there is no device 431 */ 432ulong video_get_fb(void); 433 434#endif