Home | History | Annotate | Download | only in Hii
      1 /*++
      2 
      3 Copyright (c) 2004 - 2006, Intel Corporation. All rights reserved.<BR>
      4 This program and the accompanying materials
      5 are licensed and made available under the terms and conditions of the BSD License
      6 which accompanies this distribution.  The full text of the license may be found at
      7 http://opensource.org/licenses/bsd-license.php
      8 
      9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     11 
     12 Module Name:
     13 
     14   Hii.h
     15 
     16 Abstract:
     17 
     18   This file defines the Human Interface Infrastructure protocol which will
     19   be used by resources which want to publish IFR/Font/String data and have it
     20   collected by the Configuration engine.
     21 
     22 --*/
     23 
     24 #ifndef _HII_H_
     25 #define _HII_H_
     26 
     27 #include "EfiInternalFormRepresentation.h"
     28 #include EFI_PROTOCOL_DEFINITION (UgaDraw)
     29 #include EFI_PROTOCOL_DEFINITION (GraphicsOutput)
     30 
     31 //
     32 // EFI_HII_PROTOCOL_GUID has been changed from the one defined in Framework HII 0.92 as the
     33 // Framework HII protocol produced by HII Thunk Layer support the UEF IFR and UEFI String Package
     34 // format.
     35 //
     36 #define EFI_HII_PROTOCOL_GUID \
     37   { \
     38     0x5542cce1, 0xdf5c, 0x4d1b, { 0xab, 0xca, 0x36, 0x4f, 0x77, 0xd3, 0x99, 0xfb } \
     39   }
     40 
     41 /*
     42 #define EFI_HII_PROTOCOL_GUID \
     43   { \
     44     0xd7ad636e, 0xb997, 0x459b, {0xbf, 0x3f, 0x88, 0x46, 0x89, 0x79, 0x80, 0xe1} \
     45   }
     46 */
     47 
     48 //
     49 // Forward reference for pure ANSI compatability
     50 //
     51 typedef struct _EFI_HII_PROTOCOL  EFI_HII_PROTOCOL;
     52 
     53 //
     54 // Global definition
     55 //
     56 #define NARROW_CHAR         0xFFF0
     57 #define WIDE_CHAR           0xFFF1
     58 #define NON_BREAKING_CHAR   0xFFF2
     59 #define GLYPH_WIDTH         8
     60 #define GLYPH_HEIGHT        19
     61 
     62 #define EFI_HII_FONT        1
     63 #define EFI_HII_STRING      2
     64 #define EFI_HII_IFR         3
     65 #define EFI_HII_KEYBOARD    4
     66 #define EFI_HII_HANDLES     5
     67 #define EFI_HII_VARIABLE    6
     68 #define EFI_HII_DEVICE_PATH 7
     69 
     70 #define HANG(foo) { \
     71     volatile INT32  __iii; \
     72     __iii = foo; \
     73     while (__iii) \
     74       ; \
     75   }
     76 //
     77 // #define HANG(foo)
     78 //
     79 // References to string tokens must use this macro to enable scanning for
     80 // token usages.
     81 //
     82 #define STRING_TOKEN(t) t
     83 
     84 //
     85 // The following types are currently defined:
     86 //
     87 typedef UINT16  EFI_FORM_ID;
     88 typedef UINT16  EFI_FORM_LABEL;
     89 typedef UINT16  EFI_HII_HANDLE;
     90 
     91 #pragma pack(1)
     92 
     93 typedef struct {
     94   UINT32  Length;
     95   UINT16  Type;
     96 } EFI_HII_PACK_HEADER;
     97 
     98 //
     99 // A form list consists of a large variety of structure
    100 // possibilities so to represent the binary blob of data
    101 // associated with a package of forms, we will assume a
    102 // pointer to a self-describing data buffer.
    103 //
    104 typedef struct {
    105   EFI_HII_PACK_HEADER Header;
    106 } EFI_HII_IFR_PACK;
    107 
    108 typedef struct {
    109   EFI_HII_PACK_HEADER Header;           // Must be filled in
    110   EFI_HANDLE          ImageHandle;      // Must be filled in
    111   EFI_HANDLE          DeviceHandle;     // Optional
    112   EFI_HANDLE          ControllerHandle; // Optional
    113   EFI_HANDLE          CallbackHandle;   // Optional
    114   EFI_HANDLE          COBExportHandle;  // Optional
    115 } EFI_HII_HANDLE_PACK;
    116 
    117 //
    118 // ********************************************************
    119 // EFI_VARIABLE_CONTENTS
    120 // ********************************************************
    121 //
    122 typedef struct {
    123   EFI_HII_PACK_HEADER Header;
    124   EFI_GUID            VariableGuid;
    125   UINT32              VariableNameLength;
    126   UINT16              VariableId;
    127   //
    128   //  CHAR16                VariableName[]; //Null-terminated
    129   //
    130 } EFI_HII_VARIABLE_PACK;
    131 
    132 //
    133 // ********************************************************
    134 // EFI_DEVICE_PATH_PACK
    135 // ********************************************************
    136 //
    137 typedef struct {
    138   EFI_HII_PACK_HEADER Header;
    139   //
    140   //  EFI_DEVICE_PATH       DevicePath[];
    141   //
    142 } EFI_HII_DEVICE_PATH_PACK;
    143 
    144 //
    145 // ********************************************************
    146 // EFI_HII_DATA_TABLE
    147 // ********************************************************
    148 //
    149 typedef struct {
    150   EFI_HII_HANDLE  HiiHandle;
    151   EFI_GUID        PackageGuid;
    152   UINT32          DataTableSize;
    153   UINT32          IfrDataOffset;
    154   UINT32          StringDataOffset;
    155   UINT32          VariableDataOffset;
    156   UINT32          DevicePathOffset;
    157   UINT32          NumberOfVariableData;
    158   UINT32          NumberOfLanguages;
    159   //
    160   // EFI_HII_DEVICE_PATH_PACK DevicePath[];
    161   // EFI_HII_VARIABLE_PACK VariableData[];
    162   // EFI_HII_IFR_PACK IfrData;
    163   // EFI_HII_STRING_PACK StringData[];
    164   //
    165 } EFI_HII_DATA_TABLE;
    166 
    167 //
    168 // ********************************************************
    169 // EFI_HII_EXPORT_TABLE
    170 // ********************************************************
    171 //
    172 typedef struct {
    173   UINT16    NumberOfHiiDataTables;
    174   EFI_GUID  Revision;
    175   //
    176   // EFI_HII_DATA_TABLE HiiDataTable[];
    177   //
    178 } EFI_HII_EXPORT_TABLE;
    179 
    180 typedef struct {
    181   BOOLEAN               FormSetUpdate;      // If TRUE, next variable is significant
    182   EFI_PHYSICAL_ADDRESS  FormCallbackHandle; // If not 0, will update Formset with this info
    183   BOOLEAN               FormUpdate;         // If TRUE, next variable is significant
    184   UINT16                FormValue;          // specify which form is to be updated if FormUpdate value is TRUE.
    185   STRING_REF            FormTitle;          // If not 0, will update Form with this info
    186   UINT16                DataCount;          // The number of Data entries in this structure
    187   UINT8                 *Data;              // An array of 1+ op-codes, specified by DataCount
    188 } EFI_HII_UPDATE_DATA;
    189 
    190 //
    191 // String attributes
    192 //
    193 #define LANG_RIGHT_TO_LEFT  0x00000001
    194 
    195 //
    196 // A string package is used to localize strings to a particular
    197 // language.  The package is associated with a particular driver
    198 // or set of drivers.  Tools are used to associate tokens with
    199 // string references in forms and in programs.  These tokens are
    200 // language agnostic.  When paired with a language pack (directly
    201 // or indirectly), the string token resolves into an actual
    202 // UNICODE string.  The NumStringPointers determines how many
    203 // StringPointers (offset values) there are as well as the total
    204 // number of Strings that are defined.
    205 //
    206 typedef struct {
    207   EFI_HII_PACK_HEADER Header;
    208   RELOFST             LanguageNameString;
    209   RELOFST             PrintableLanguageName;
    210   UINT32              NumStringPointers;
    211   UINT32              Attributes;
    212   //
    213   //  RELOFST               StringPointers[];
    214   //  EFI_STRING            Strings[];
    215   //
    216 } EFI_HII_STRING_PACK;
    217 
    218 //
    219 // We use this one to get the real size of the header
    220 //
    221 typedef struct {
    222   EFI_HII_PACK_HEADER Header;
    223   RELOFST             LanguageNameString;
    224   RELOFST             PrintableLanguageName;
    225   UINT32              NumStringPointers;
    226   UINT32              Attributes;
    227 } EFI_HII_STRING_PACK_HEADER;
    228 
    229 //
    230 // Glyph Attributes
    231 //
    232 #define GLYPH_NON_SPACING   1
    233 #define GLYPH_NON_BREAKING  2
    234 
    235 typedef struct {
    236   CHAR16  UnicodeWeight;
    237   UINT8   Attributes;
    238   UINT8   GlyphCol1[GLYPH_HEIGHT];
    239 } EFI_NARROW_GLYPH;
    240 
    241 typedef struct {
    242   CHAR16  UnicodeWeight;
    243   UINT8   Attributes;
    244   UINT8   GlyphCol1[GLYPH_HEIGHT];
    245   UINT8   GlyphCol2[GLYPH_HEIGHT];
    246   UINT8   Pad[3];
    247 } EFI_WIDE_GLYPH;
    248 
    249 //
    250 // A font list consists of a font header followed by a series
    251 // of glyph structures.  Note that fonts are not language specific.
    252 //
    253 typedef struct {
    254   EFI_HII_PACK_HEADER Header;
    255   UINT16              NumberOfNarrowGlyphs;
    256   UINT16              NumberOfWideGlyphs;
    257 } EFI_HII_FONT_PACK;
    258 
    259 //
    260 // The IfrData in the EFI_HII_IFR_PACK structure definition
    261 // is variable length, and not really part of the header. To
    262 // simplify from code the size of the header, define an
    263 // identical structure that does not include the IfrData field.
    264 // Then use sizeof() this new structure to determine the
    265 // actual size of the header.
    266 //
    267 typedef struct {
    268   EFI_HII_PACK_HEADER Header;
    269 } EFI_HII_IFR_PACK_HEADER;
    270 
    271 //
    272 // pedef EFI_HII_PACK_HEADER EFI_HII_IFR_PACK_HEADER;
    273 //
    274 typedef enum {
    275   EfiKeyLCtrl,
    276   EfiKeyA0,
    277   EfiKeyLAlt,
    278   EfiKeySpaceBar,
    279   EfiKeyA2,
    280   EfiKeyA3,
    281   EfiKeyA4,
    282   EfiKeyRCtrl,
    283   EfiKeyLeftArrow,
    284   EfiKeyDownArrow,
    285   EfiKeyRightArrow,
    286   EfiKeyZero,
    287   EfiKeyPeriod,
    288   EfiKeyEnter,
    289   EfiKeyLShift,
    290   EfiKeyB0,
    291   EfiKeyB1,
    292   EfiKeyB2,
    293   EfiKeyB3,
    294   EfiKeyB4,
    295   EfiKeyB5,
    296   EfiKeyB6,
    297   EfiKeyB7,
    298   EfiKeyB8,
    299   EfiKeyB9,
    300   EfiKeyB10,
    301   EfiKeyRshift,
    302   EfiKeyUpArrow,
    303   EfiKeyOne,
    304   EfiKeyTwo,
    305   EfiKeyThree,
    306   EfiKeyCapsLock,
    307   EfiKeyC1,
    308   EfiKeyC2,
    309   EfiKeyC3,
    310   EfiKeyC4,
    311   EfiKeyC5,
    312   EfiKeyC6,
    313   EfiKeyC7,
    314   EfiKeyC8,
    315   EfiKeyC9,
    316   EfiKeyC10,
    317   EfiKeyC11,
    318   EfiKeyC12,
    319   EfiKeyFour,
    320   EfiKeyFive,
    321   EfiKeySix,
    322   EfiKeyPlus,
    323   EfiKeyTab,
    324   EfiKeyD1,
    325   EfiKeyD2,
    326   EfiKeyD3,
    327   EfiKeyD4,
    328   EfiKeyD5,
    329   EfiKeyD6,
    330   EfiKeyD7,
    331   EfiKeyD8,
    332   EfiKeyD9,
    333   EfiKeyD10,
    334   EfiKeyD11,
    335   EfiKeyD12,
    336   EfiKeyD13,
    337   EfiKeyDel,
    338   EfiKeyEnd,
    339   EfiKeyPgDn,
    340   EfiKeySeven,
    341   EfiKeyEight,
    342   EfiKeyNine,
    343   EfiKeyE0,
    344   EfiKeyE1,
    345   EfiKeyE2,
    346   EfiKeyE3,
    347   EfiKeyE4,
    348   EfiKeyE5,
    349   EfiKeyE6,
    350   EfiKeyE7,
    351   EfiKeyE8,
    352   EfiKeyE9,
    353   EfiKeyE10,
    354   EfiKeyE11,
    355   EfiKeyE12,
    356   EfiKeyBackSpace,
    357   EfiKeyIns,
    358   EfiKeyHome,
    359   EfiKeyPgUp,
    360   EfiKeyNLck,
    361   EfiKeySlash,
    362   EfiKeyAsterisk,
    363   EfiKeyMinus,
    364   EfiKeyEsc,
    365   EfiKeyF1,
    366   EfiKeyF2,
    367   EfiKeyF3,
    368   EfiKeyF4,
    369   EfiKeyF5,
    370   EfiKeyF6,
    371   EfiKeyF7,
    372   EfiKeyF8,
    373   EfiKeyF9,
    374   EfiKeyF10,
    375   EfiKeyF11,
    376   EfiKeyF12,
    377   EfiKeyPrint,
    378   EfiKeySLck,
    379   EfiKeyPause
    380 } EFI_KEY;
    381 
    382 typedef struct {
    383   EFI_KEY Key;
    384   CHAR16  Unicode;
    385   CHAR16  ShiftedUnicode;
    386   CHAR16  AltGrUnicode;
    387   CHAR16  ShiftedAltGrUnicode;
    388   UINT16  Modifier;
    389 } EFI_KEY_DESCRIPTOR;
    390 
    391 //
    392 // This structure allows a sparse set of keys to be redefined
    393 // or a complete redefinition of the keyboard layout.  Most
    394 // keyboards have a lot of commonality in their layouts, therefore
    395 // only defining those keys that need to change from the default
    396 // minimizes the passed in information.
    397 //
    398 // Additionally, when an update occurs, the active keyboard layout
    399 // will be switched to the newly updated keyboard layout.  This
    400 // allows for situations that when a keyboard layout driver is
    401 // loaded as part of system initialization, the system will default
    402 // the keyboard behavior to the new layout.
    403 //
    404 // Each call to update the keyboard mapping should contain the
    405 // complete set of key descriptors to be updated, since every
    406 // call to the HII which contains an EFI_HII_KEYBOARD_PACK will
    407 // wipe the previous set of overrides.  A call to
    408 //
    409 typedef struct {
    410   EFI_HII_PACK_HEADER Header;
    411   EFI_KEY_DESCRIPTOR  *Descriptor;
    412   UINT8               DescriptorCount;
    413 } EFI_HII_KEYBOARD_PACK;
    414 
    415 //
    416 // The EFI_HII_PACKAGES can contain different types of packages just
    417 // after the structure as inline data.
    418 //
    419 typedef struct {
    420   UINTN     NumberOfPackages;
    421   EFI_GUID  *GuidId;
    422   //
    423   // EFI_HII_HANDLE_PACK    *HandlePack;        // Only one pack.
    424   // EFI_HII_IFR_PACK       *IfrPack;           // Only one pack.
    425   // EFI_HII_FONT_PACK      *FontPack[];        // Multiple packs ok
    426   // EFI_HII_STRING_PACK    *StringPack[];      // Multiple packs ok
    427   // EFI_HII_KEYBOARD_PACK  *KeyboardPack[];    // Multiple packs ok
    428   //
    429 } EFI_HII_PACKAGES;
    430 
    431 typedef struct _EFI_HII_VARIABLE_PACK_LIST {
    432   struct _EFI_HII_VARIABLE_PACK_LIST   *NextVariablePack;
    433   EFI_HII_VARIABLE_PACK                *VariablePack;
    434 } EFI_HII_VARIABLE_PACK_LIST;
    435 
    436 #pragma pack()
    437 
    438 typedef
    439 EFI_STATUS
    440 (EFIAPI *EFI_HII_NEW_PACK) (
    441   IN  EFI_HII_PROTOCOL    * This,
    442   IN  EFI_HII_PACKAGES    * Packages,
    443   OUT EFI_HII_HANDLE      * Handle
    444   );
    445 
    446 typedef
    447 EFI_STATUS
    448 (EFIAPI *EFI_HII_REMOVE_PACK) (
    449   IN EFI_HII_PROTOCOL    *This,
    450   IN EFI_HII_HANDLE      Handle
    451   );
    452 
    453 typedef
    454 EFI_STATUS
    455 (EFIAPI *EFI_HII_FIND_HANDLES) (
    456   IN     EFI_HII_PROTOCOL *This,
    457   IN OUT UINT16           *HandleBufferLength,
    458   OUT    EFI_HII_HANDLE   *Handle
    459   );
    460 
    461 typedef
    462 EFI_STATUS
    463 (EFIAPI *EFI_HII_EXPORT) (
    464   IN     EFI_HII_PROTOCOL *This,
    465   IN     EFI_HII_HANDLE   Handle,
    466   IN OUT UINTN            *BufferSize,
    467   OUT    VOID             *Buffer
    468   );
    469 
    470 typedef
    471 EFI_STATUS
    472 (EFIAPI *EFI_HII_RESET_STRINGS) (
    473   IN     EFI_HII_PROTOCOL   *This,
    474   IN     EFI_HII_HANDLE     Handle
    475   );
    476 
    477 typedef
    478 EFI_STATUS
    479 (EFIAPI *EFI_HII_TEST_STRING) (
    480   IN     EFI_HII_PROTOCOL  *This,
    481   IN     CHAR16            *StringToTest,
    482   IN OUT UINT32            *FirstMissing,
    483   OUT    UINT32            *GlyphBufferSize
    484   );
    485 
    486 typedef
    487 EFI_STATUS
    488 (EFIAPI *EFI_HII_GET_GLYPH) (
    489   IN     EFI_HII_PROTOCOL  *This,
    490   IN     CHAR16            *Source,
    491   IN OUT UINT16            *Index,
    492   OUT    UINT8             **GlyphBuffer,
    493   OUT    UINT16            *BitWidth,
    494   IN OUT UINT32            *InternalStatus
    495   );
    496 
    497 typedef
    498 EFI_STATUS
    499 (EFIAPI *EFI_HII_GLYPH_TO_BLT) (
    500   IN     EFI_HII_PROTOCOL               *This,
    501   IN     UINT8                          *GlyphBuffer,
    502   IN     EFI_GRAPHICS_OUTPUT_BLT_PIXEL  Foreground,
    503   IN     EFI_GRAPHICS_OUTPUT_BLT_PIXEL  Background,
    504   IN     UINTN                          Count,
    505   IN     UINTN                          Width,
    506   IN     UINTN                          Height,
    507   IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL  *BltBuffer
    508   );
    509 
    510 typedef
    511 EFI_STATUS
    512 (EFIAPI *EFI_HII_NEW_STRING) (
    513   IN     EFI_HII_PROTOCOL      *This,
    514   IN     CHAR16                *Language,
    515   IN     EFI_HII_HANDLE        Handle,
    516   IN OUT STRING_REF            *Reference,
    517   IN     CHAR16                *NewString
    518   );
    519 
    520 typedef
    521 EFI_STATUS
    522 (EFIAPI *EFI_HII_GET_PRI_LANGUAGES) (
    523   IN  EFI_HII_PROTOCOL    *This,
    524   IN  EFI_HII_HANDLE      Handle,
    525   OUT EFI_STRING          *LanguageString
    526   );
    527 
    528 typedef
    529 EFI_STATUS
    530 (EFIAPI *EFI_HII_GET_SEC_LANGUAGES) (
    531   IN  EFI_HII_PROTOCOL    *This,
    532   IN  EFI_HII_HANDLE      Handle,
    533   IN  CHAR16              *PrimaryLanguage,
    534   OUT EFI_STRING          *LanguageString
    535   );
    536 
    537 typedef
    538 EFI_STATUS
    539 (EFIAPI *EFI_HII_GET_STRING) (
    540   IN     EFI_HII_PROTOCOL  *This,
    541   IN     EFI_HII_HANDLE    Handle,
    542   IN     STRING_REF        Token,
    543   IN     BOOLEAN           Raw,
    544   IN     CHAR16            *LanguageString,
    545   IN OUT UINTN             *BufferLength,
    546   OUT    EFI_STRING        StringBuffer
    547   );
    548 
    549 typedef
    550 EFI_STATUS
    551 (EFIAPI *EFI_HII_GET_LINE) (
    552   IN     EFI_HII_PROTOCOL  *This,
    553   IN     EFI_HII_HANDLE    Handle,
    554   IN     STRING_REF        Token,
    555   IN OUT UINT16            *Index,
    556   IN     UINT16            LineWidth,
    557   IN     CHAR16            *LanguageString,
    558   IN OUT UINT16            *BufferLength,
    559   OUT    EFI_STRING        StringBuffer
    560   );
    561 
    562 typedef
    563 EFI_STATUS
    564 (EFIAPI *EFI_HII_GET_FORMS) (
    565   IN     EFI_HII_PROTOCOL  *This,
    566   IN     EFI_HII_HANDLE    Handle,
    567   IN     EFI_FORM_ID       FormId,
    568   IN OUT UINTN             *BufferLength,
    569   OUT    UINT8             *Buffer
    570   );
    571 
    572 typedef
    573 EFI_STATUS
    574 (EFIAPI *EFI_HII_GET_DEFAULT_IMAGE) (
    575   IN     EFI_HII_PROTOCOL           *This,
    576   IN     EFI_HII_HANDLE             Handle,
    577   IN     UINTN                      DefaultMask,
    578   OUT    EFI_HII_VARIABLE_PACK_LIST **VariablePackList
    579   );
    580 
    581 typedef
    582 EFI_STATUS
    583 (EFIAPI *EFI_HII_UPDATE_FORM) (
    584   IN EFI_HII_PROTOCOL     *This,
    585   IN EFI_HII_HANDLE       Handle,
    586   IN EFI_FORM_LABEL       Label,
    587   IN BOOLEAN              AddData,
    588   IN EFI_HII_UPDATE_DATA  *Data
    589   );
    590 
    591 typedef
    592 EFI_STATUS
    593 (EFIAPI *EFI_HII_GET_KEYBOARD_LAYOUT) (
    594   IN     EFI_HII_PROTOCOL    * This,
    595   OUT    UINT16              *DescriptorCount,
    596   OUT    EFI_KEY_DESCRIPTOR  * Descriptor
    597   );
    598 
    599 struct _EFI_HII_PROTOCOL {
    600   EFI_HII_NEW_PACK            NewPack;
    601   EFI_HII_REMOVE_PACK         RemovePack;
    602   EFI_HII_FIND_HANDLES        FindHandles;
    603   EFI_HII_EXPORT              ExportDatabase;
    604 
    605   EFI_HII_TEST_STRING         TestString;
    606   EFI_HII_GET_GLYPH           GetGlyph;
    607   EFI_HII_GLYPH_TO_BLT        GlyphToBlt;
    608 
    609   EFI_HII_NEW_STRING          NewString;
    610   EFI_HII_GET_PRI_LANGUAGES   GetPrimaryLanguages;
    611   EFI_HII_GET_SEC_LANGUAGES   GetSecondaryLanguages;
    612   EFI_HII_GET_STRING          GetString;
    613   EFI_HII_RESET_STRINGS       ResetStrings;
    614   EFI_HII_GET_LINE            GetLine;
    615   EFI_HII_GET_FORMS           GetForms;
    616   EFI_HII_GET_DEFAULT_IMAGE   GetDefaultImage;
    617   EFI_HII_UPDATE_FORM         UpdateForm;
    618 
    619   EFI_HII_GET_KEYBOARD_LAYOUT GetKeyboardLayout;
    620 };
    621 
    622 extern EFI_GUID gEfiHiiProtocolGuid;
    623 
    624 #endif
    625