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