Home | History | Annotate | Download | only in include
      1 /* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file.
      4  *
      5  * Data structure definitions for firmware screen block (BMPBLOCK).
      6  *
      7  * The BmpBlock structure looks like:
      8  *  +-----------------------------------------+
      9  *  |             BmpBlock Header             |
     10  *  +-----------------------------------------+
     11  *  |             ScreenLayout[0]             | \
     12  *  +-----------------------------------------+  |
     13  *  |             ScreenLayout[1]             |  |
     14  *  +-----------------------------------------+  Localization[0]
     15  *  |                  ...                    |  |
     16  *  +-----------------------------------------+  |
     17  *  | ScreenLayout[number_of_screenlayouts-1] | /
     18  *  +-----------------------------------------+
     19  *  |             ScreenLayout[0]             | \
     20  *  +-----------------------------------------+  Localization[1]
     21  *  |                  ...                    | /
     22  *  +-----------------------------------------+        ...
     23  *  |             ScreenLayout[0]             | \
     24  *  +-----------------------------------------+  Localization[
     25  *  |                  ...                    | /   number_of_localizations-1]
     26  *  +-----------------------------------------+
     27  *  |              ImageInfo[0]               |
     28  *  +-----------------------------------------+
     29  *  |              Image Content              |
     30  *  +-----------------------------------------+
     31  *  |              ImageInfo[2]               |  ImageInfo is 4-byte aligned.
     32  *  +-----------------------------------------+
     33  *  |              Image Content              |
     34  *  +-----------------------------------------+
     35  *  |                  ...                    |
     36  *  +-----------------------------------------+
     37  *  |      ImageInfo[number_fo_images-1]      |
     38  *  +-----------------------------------------+
     39  *  |              Image Content              |
     40  *  +-----------------------------------------+
     41  *  |        List of locale names             |
     42  *  +-----------------------------------------+
     43  */
     44 #ifndef VBOOT_REFERENCE_BMPBLK_HEADER_H_
     45 #define VBOOT_REFERENCE_BMPBLK_HEADER_H_
     46 #include <stdint.h>
     47 
     48 #define BMPBLOCK_SIGNATURE      "$BMP"
     49 #define BMPBLOCK_SIGNATURE_SIZE (4)
     50 
     51 #define BMPBLOCK_MAJOR_VERSION  (0x0002)
     52 #define BMPBLOCK_MINOR_VERSION  (0x0000)
     53 
     54 #define MAX_IMAGE_IN_LAYOUT     (16)
     55 
     56 /* BMPBLOCK header, describing how many screen layouts and image infos */
     57 typedef struct BmpBlockHeader {
     58 	/* BMPBLOCK_SIGNATURE $BMP */
     59 	uint8_t  signature[BMPBLOCK_SIGNATURE_SIZE];
     60 	uint16_t major_version;            /* see BMPBLOCK_MAJOR_VER */
     61 	uint16_t minor_version;            /* see BMPBLOCK_MINOR_VER */
     62 	uint32_t number_of_localizations;  /* Number of localizations */
     63 	/* Number of screen layouts in each localization */
     64 	uint32_t number_of_screenlayouts;
     65 	uint32_t number_of_imageinfos;     /* Number of image infos */
     66 	/* Offset of locale-translation string */
     67 	uint32_t locale_string_offset;
     68 	uint32_t reserved[2];
     69 } __attribute__((packed)) BmpBlockHeader;
     70 
     71 /* Screen layout, describing how to stack multiple images on screen */
     72 typedef struct ScreenLayout {
     73 	/*
     74 	 * Images contained in the screen. Will be rendered from 0 to
     75 	 * (number_of_images-1).
     76 	 */
     77 	struct {
     78 		/* (X,Y) offset of image to be rendered */
     79 		uint32_t x;
     80 		uint32_t y;
     81 		/* Offset of image info from start of BMPBLOCK; 0=end it. */
     82 		uint32_t image_info_offset;
     83 	} images[MAX_IMAGE_IN_LAYOUT];
     84 } __attribute__((packed)) ScreenLayout;
     85 
     86 /* Constants for screen index */
     87 typedef enum ScreenIndex {
     88 	SCREEN_DEVELOPER_WARNING = 0,
     89 	SCREEN_RECOVERY_REMOVE,
     90 	SCREEN_RECOVERY_NO_GOOD,
     91 	SCREEN_RECOVERY_INSERT,
     92 	SCREEN_RECOVERY_TO_DEV,
     93 	SCREEN_DEVELOPER_TO_NORM,
     94 	SCREEN_WAIT,
     95 	SCREEN_TO_NORM_CONFIRMED,
     96 	MAX_VALID_SCREEN_INDEX,
     97 	SCREEN_BLANK = ~0UL,
     98 } ScreenIndex;
     99 
    100 /* Image info, describing the information of the image block */
    101 typedef struct ImageInfo {
    102 	uint32_t tag;              /* Tag it as a special image, like HWID */
    103 	uint32_t width;            /* Width of the image */
    104 	uint32_t height;           /* Height of the image */
    105 	uint32_t format;           /* File format of the image */
    106 	uint32_t compression;      /* Compression method for the image file */
    107 	uint32_t original_size;    /* Size of the original uncompressed image */
    108 	/*
    109 	 * Size of the compressed image; if image is not compressed, this will
    110 	 * be the same as the original size.
    111 	 */
    112 	uint32_t compressed_size;
    113 	uint32_t reserved;
    114   /* NOTE: The actual image content (if any) follows immediately. */
    115 } __attribute__((packed)) ImageInfo;
    116 
    117 /* Constants for ImageInfo.tag */
    118 typedef enum ImageTag {
    119 	TAG_NONE = 0,
    120 	TAG_HWID,
    121 	TAG_HWID_RTOL,  /* "right-to-left", ie, right-justified HWID */
    122 } ImageTag;
    123 
    124 /* Constants for ImageInfo.format */
    125 typedef enum ImageFormat {
    126 	FORMAT_INVALID = 0,
    127 	FORMAT_BMP,
    128 	FORMAT_FONT,
    129 } ImageFormat;
    130 
    131 /*
    132  * These magic image names can be used in the .yaml file to indicate that the
    133  * ASCII HWID should be displayed. For RENDER_HWID, the image coordinates
    134  * specify upper-left corner of the HWID string. For RENDER_HWID_RTOL, they
    135  * indicate the upper-right corner (handy for right-to-left languages).
    136  */
    137 #define RENDER_HWID       "$HWID"
    138 #define RENDER_HWID_RTOL  "$HWID.rtol"
    139 
    140 #endif  /* VBOOT_REFERENCE_BMPBLK_HEADER_H_ */
    141