X-Git-Url: https://repo.jachan.dev/J-u-boot.git/blobdiff_plain/355d1e24f6143c4839be3c015c191421c4e9449c..ddec4cae624e48c3678ea856fa7d6292a7104238:/include/video.h diff --git a/include/video.h b/include/video.h index f14fb15f84f..5048116a3d5 100644 --- a/include/video.h +++ b/include/video.h @@ -1,13 +1,7 @@ /* - * Video uclass and legacy implementation + * Video uclass to support displays (see also vidconsole for text) * * Copyright (c) 2015 Google, Inc - * - * MPC823 Video Controller - * ======================= - * (C) 2000 by Paolo Scaffardi (arsenio@tin.it) - * AIRVENT SAM s.p.a - RIMINI(ITALY) - * */ #ifndef _VIDEO_H_ @@ -30,12 +24,16 @@ struct udevice; * @base: Base address of frame buffer, 0 if not yet known * @copy_base: Base address of a hardware copy of the frame buffer. See * CONFIG_VIDEO_COPY. + * @copy_size: Size of copy framebuffer, used if @size is 0 + * @hide_logo: Hide the logo (used for testing) */ struct video_uc_plat { uint align; uint size; ulong base; ulong copy_base; + ulong copy_size; + bool hide_logo; }; enum video_polarity { @@ -60,12 +58,13 @@ enum video_log2_bpp { * Convert enum video_log2_bpp to bytes and bits. Note we omit the outer * brackets to allow multiplication by fractional pixels. */ -#define VNBYTES(bpix) (1 << (bpix)) / 8 +#define VNBYTES(bpix) ((1 << (bpix)) / 8) #define VNBITS(bpix) (1 << (bpix)) enum video_format { VIDEO_UNKNOWN, + VIDEO_RGBA8888, VIDEO_X8B8G8R8, VIDEO_X8R8G8B8, VIDEO_X2R10G10B10, @@ -93,7 +92,6 @@ enum video_format { * @colour_bg: Background colour (pixel value) * @flush_dcache: true to enable flushing of the data cache after * the LCD is updated - * @cmap: Colour map for 8-bit-per-pixel displays * @fg_col_idx: Foreground color code (bit 3 = bold, bit 0-2 = color) * @bg_col_idx: Background color code (bit 3 = bold, bit 0-2 = color) */ @@ -118,7 +116,6 @@ struct video_priv { u32 colour_fg; u32 colour_bg; bool flush_dcache; - ushort *cmap; u8 fg_col_idx; u8 bg_col_idx; }; @@ -137,6 +134,65 @@ struct video_ops { #define video_get_ops(dev) ((struct video_ops *)(dev)->driver->ops) +/** + * struct video_handoff - video information passed from SPL + * + * This is used when video is set up by SPL, to provide the details to U-Boot + * proper. + * + * @fb: Base address of frame buffer, 0 if not yet known + * @size: Frame-buffer size, in bytes + * @xsize: Number of pixel columns (e.g. 1366) + * @ysize: Number of pixels rows (e.g.. 768) + * @line_length: Length of each frame buffer line, in bytes. This can be + * set by the driver, but if not, the uclass will set it after + * probing + * @bpix: Encoded bits per pixel (enum video_log2_bpp) + */ +struct video_handoff { + u64 fb; + u32 size; + u16 xsize; + u16 ysize; + u32 line_length; + u8 bpix; +}; + +/** enum colour_idx - the 16 colors supported by consoles */ +enum colour_idx { + VID_BLACK = 0, + VID_RED, + VID_GREEN, + VID_BROWN, + VID_BLUE, + VID_MAGENTA, + VID_CYAN, + VID_LIGHT_GRAY, + VID_GRAY, + VID_LIGHT_RED, + VID_LIGHT_GREEN, + VID_YELLOW, + VID_LIGHT_BLUE, + VID_LIGHT_MAGENTA, + VID_LIGHT_CYAN, + VID_WHITE, + + VID_COLOUR_COUNT +}; + +/** + * video_index_to_colour() - convert a color code to a pixel's internal + * representation + * + * The caller has to guarantee that the color index is less than + * VID_COLOR_COUNT. + * + * @priv private data of the video device (UCLASS_VIDEO) + * @idx color index (e.g. VID_YELLOW) + * Return: color value + */ +u32 video_index_to_colour(struct video_priv *priv, enum colour_idx idx); + /** * video_reserve() - Reserve frame-buffer memory for video devices * @@ -151,19 +207,42 @@ struct video_ops { * * @addrp: On entry, the top of available memory. On exit, the new top, * after allocating the required memory. - * @return 0 + * Return: 0 */ int video_reserve(ulong *addrp); -#ifdef CONFIG_DM_VIDEO /** - * video_clear() - Clear a device's frame buffer to background color. + * video_clear() - Clear a device's frame buffer to background colour. * * @dev: Device to clear - * @return 0 + * Return: 0 on success */ int video_clear(struct udevice *dev); -#endif /* CONFIG_DM_VIDEO */ + +/** + * video_fill() - Fill a device's frame buffer to a colour. + * + * @dev: Device to fill + * @colour: Colour to use, in the frame buffer's format + * Return: 0 on success + */ +int video_fill(struct udevice *dev, u32 colour); + +/** + * video_fill_part() - Erase a region + * + * Erase a rectangle of the display within the given bounds. + * + * @dev: Device to update + * @xstart: X start position in pixels from the left + * @ystart: Y start position in pixels from the top + * @xend: X end position in pixels from the left + * @yend: Y end position in pixels from the top + * @colour: Value to write + * Return: 0 if OK, -ENOSYS if the display depth is not supported + */ +int video_fill_part(struct udevice *dev, int xstart, int ystart, int xend, + int yend, u32 colour); /** * video_sync() - Sync a device's frame buffer with its hardware @@ -181,12 +260,23 @@ int video_clear(struct udevice *dev); int video_sync(struct udevice *vid, bool force); /** - * video_sync_all() - Sync all devices' frame buffers with there hardware + * video_sync_all() - Sync all devices' frame buffers with their hardware * * This calls video_sync() on all active video devices. */ void video_sync_all(void); +/** + * video_bmp_get_info() - Get information about a bitmap image + * + * @bmp_image: Pointer to BMP image to check + * @widthp: Returns width in pixels + * @heightp: Returns height in pixels + * @bpixp: Returns log2 of bits per pixel + */ +void video_bmp_get_info(void *bmp_image, ulong *widthp, ulong *heightp, + uint *bpixp); + /** * video_bmp_display() - Display a BMP file * @@ -201,8 +291,8 @@ void video_sync_all(void); * that direction * - if a coordinate is -ve then it will be offset to the * left/top of the centre by that many pixels - * - if a coordinate is positive it will be used unchnaged. - * @return 0 if OK, -ve on error + * - if a coordinate is positive it will be used unchanged. + * Return: 0 if OK, -ve on error */ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y, bool align); @@ -211,7 +301,7 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y, * video_get_xsize() - Get the width of the display in pixels * * @dev: Device to check - * @return device frame buffer width in pixels + * Return: device frame buffer width in pixels */ int video_get_xsize(struct udevice *dev); @@ -219,7 +309,7 @@ int video_get_xsize(struct udevice *dev); * video_get_ysize() - Get the height of the display in pixels * * @dev: Device to check - * @return device frame buffer height in pixels + * Return: device frame buffer height in pixels */ int video_get_ysize(struct udevice *dev); @@ -239,6 +329,15 @@ void video_set_flush_dcache(struct udevice *dev, bool flush); */ void video_set_default_colors(struct udevice *dev, bool invert); +/** + * video_default_font_height() - Get the default font height + * + * @dev: video device + * Returns: Default font height in pixels, which depends on which console driver + * is in use + */ +int video_default_font_height(struct udevice *dev); + #ifdef CONFIG_VIDEO_COPY /** * vidconsole_sync_copy() - Sync back to the copy framebuffer @@ -251,7 +350,7 @@ void video_set_default_colors(struct udevice *dev, bool invert); * @dev: Vidconsole device being updated * @from: Start/end address within the framebuffer (->fb) * @to: Other address within the frame buffer - * @return 0 if OK, -EFAULT if the start address is before the start of the + * Return: 0 if OK, -EFAULT if the start address is before the start of the * frame buffer start */ int video_sync_copy(struct udevice *dev, void *from, void *to); @@ -260,7 +359,7 @@ int video_sync_copy(struct udevice *dev, void *from, void *to); * video_sync_copy_all() - Sync the entire framebuffer to the copy * * @dev: Vidconsole device being updated - * @return 0 (always) + * Return: 0 (always) */ int video_sync_copy_all(struct udevice *dev); #else @@ -276,78 +375,44 @@ static inline int video_sync_copy_all(struct udevice *dev) #endif -#ifndef CONFIG_DM_VIDEO - -/* Video functions */ - -/** - * Display a BMP format bitmap on the screen - * - * @param bmp_image Address of BMP image - * @param x X position to draw image - * @param y Y position to draw image - */ -int video_display_bitmap(ulong bmp_image, int x, int y); - -/** - * Get the width of the screen in pixels - * - * @return width of screen in pixels - */ -int video_get_pixel_width(void); - /** - * Get the height of the screen in pixels + * video_is_active() - Test if one video device it active * - * @return height of screen in pixels + * Return: true if at least one video device is active, else false. */ -int video_get_pixel_height(void); +bool video_is_active(void); /** - * Get the number of text lines/rows on the screen + * video_get_u_boot_logo() - Get a pointer to the U-Boot logo * - * @return number of rows + * Returns: Pointer to logo */ -int video_get_screen_rows(void); +void *video_get_u_boot_logo(void); -/** - * Get the number of text columns on the screen +/* + * bmp_display() - Display BMP (bitmap) data located in memory * - * @return number of columns + * @addr: address of the bmp data + * @x: Position of bitmap from the left side, in pixels + * @y: Position of bitmap from the top, in pixels */ -int video_get_screen_columns(void); +int bmp_display(ulong addr, int x, int y); -/** - * Set the position of the text cursor +/* + * bmp_info() - Show information about bmp file * - * @param col Column to place cursor (0 = left side) - * @param row Row to place cursor (0 = top line) + * @addr: address of bmp file + * Returns: 0 if OK, else 1 if bmp image not found */ -void video_position_cursor(unsigned col, unsigned row); - -/* Clear the display */ -void video_clear(void); - -#if defined(CONFIG_FORMIKE) -int kwh043st20_f01_spi_startup(unsigned int bus, unsigned int cs, - unsigned int max_hz, unsigned int spi_mode); -#endif -#if defined(CONFIG_LG4573) -int lg4573_spi_startup(unsigned int bus, unsigned int cs, - unsigned int max_hz, unsigned int spi_mode); -#endif +int bmp_info(ulong addr); /* - * video_get_info_str() - obtain a board string: type, speed, etc. - * - * This is called if CONFIG_CONSOLE_EXTRA_INFO is enabled. + * video_reserve_from_bloblist()- Reserve frame-buffer memory for video devices + * using blobs. * - * line_number: location to place info string beside logo - * info: buffer for info string (empty if nothing to display on this - * line) + * @ho: video information passed from SPL + * Returns: 0 (always) */ -void video_get_info_str(int line_number, char *info); - -#endif /* !CONFIG_DM_VIDEO */ +int video_reserve_from_bloblist(struct video_handoff *ho); #endif