EFI_IFR_ONE_OF
Summary:
Creates a select-one-of question.
Prototype:
#define EFI_IFR_ONE_OF_OP 0x05
typedef struct _EFI_IFR_ONE_OF {
EFI_IFR_OP_HEADER Header;
EFI_IFR_QUESTION_HEADER Question;
UINT8 Flags;
union {
struct {
UINT8 MinValue;
UINT8 MaxValue;
UINT8 Step;
} u8;
struct {
UINT16 MinValue;
UINT16 MaxValue;
UINT16 Step;
} u16;
struct {
UINT32 MinValue;
UINT32 MaxValue;
UINT32 Step;
} u32;
struct {
UINT64 MinValue;
UINT64 MaxValue;
UINT64 Step;
} u64;
} data;
} EFI_IFR_ONE_OF;
Members:
Header The sequence that defines the type of opcode as well as the length of the opcode being defined.
Header.OpCode = EFI_IFR_ONE_OF_OP.
Question The standard question header.
Flags Specifies flags related to the numeric question.
MinValue The minimum value to be accepted by the browser for this opcode.
The size of the data field may vary from 8 to 64 bits, depending on the size specified in Flags
MaxValue The maximum value to be accepted by the browser for this opcode.
The size of the data field may vary from 8 to 64 bits, depending on the size specified in Flags
Step Defines the amount to increment or decrement the value each time a user requests a value change.
If the step value is 0, then the input mechanism for the numeric value is to be free-form
and require the user to type in the actual value.
The size of the data field may vary from 8 to 64 bits, depending on the size specified in Flags
Description:
This opcode creates a select-on-of object, where the user must select from one of the nested options.
This is identical to EFI_IFR_NUMERIC.
옵션 opcode에 대한 정의는 다음과 같다.
EFI_IFR_ONE_OF_OPTION
Summary:
Creates a pre-defined option for a question.
Prototype:
#define EFI_IFR_ONE_OF_OPTION_OP 0x09
typedef struct _EFI_IFR_ONE_OF_OPTION {
EFI_IFR_OP_HEADER Header;
EFI_STRING_ID Option;
UINT8 Flags;
UINT8 Type;
EFI_IFR_TYPE_VALUE Value;
} EFI_IFR_ONE_OF_OPTION;
Members:
Header The sequence that defines the type of opcode as well as the length of the opcode being defined.
Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP.
Option The string token reference to the option description string for this particular opcode.
Flags Specifies the flags associated with the current option (EFI_IFR_OPTION_x)
Type Specifies the type of the option’s value (See EFI_IFR_TYPE)
Value The union of all of the different possible values. The actual contents (and size)
of the field depends on Type.
설명에 따르면 Value 필드의 내용은 Type 필드의 값에 따라 달라진다. 다음은 해당 type 플래그의 주석이 있는 모든 가능한 value type이다.
우리는 구조에서 데이터를 UINT8 OneOf로 선언했다. 따라서 컴파일러는 type 플래그를 EFI_IFR_TYPE_NUM_SIZE_8로 자동으로 공제했다. 이를 UINT16 OneOf로 변경하면 컴파일러는 type 필드 값을 EFI_IFR_TYPE_NUM_SIZE_16으로 변경한다.
EFI_IFR_ORDERED_LIST
Summary:
Creates a set question using an ordered list.
#define EFI_IFR_ORDERED_LIST_OP 0x23
typedef struct _EFI_IFR_ORDERED_LIST {
EFI_IFR_OP_HEADER Header;
EFI_IFR_QUESTION_HEADER Question;
UINT8 MaxContainers;
UINT8 Flags;
} EFI_IFR_ORDERED_LIST;
Members:
Header The byte sequence that defines the type of opcode as well as the length of the opcode being defined.
Header.OpCode = EFI_IFR_ORDERED_LIST_OP.
Question The standard question header.
MaxContainers The maximum number of entries for which this tag will maintain an order.
This value also identifies the size of the storage associated with this tag’s ordering array.
Flags A bit-mask that determines which unique settings are active for this opcode.
Description:
Create an ordered list question in the current form. One thing to note is that valid values for the options
in ordered lists should never be a 0.
데이터를 필드와 일치시키면 새 필드에 대해 다음 데이터를 얻게 된다.
UINT8 MaxContainers; // 0x03
UINT8 Flags; // 0x00
모든 것이 order이고 요소에는 3개의 옵션이 있으므로 MaxContainter=0x3이다. 옵션 IFR 코드를 보면 옵션이 oneof 요소에서 사용된 것과 동일한 opcode EFI_IFR_ONE_OF_OPTION으로 인코딩된 것을 볼 수 있다.
원리는 동일하다. 데이터를 UINT8에서 UINT16으로 인코딩하는 경우 컴파일러는 옵션을EFI_IFR_TYPE_NUM_SIZE_16(=UINT16)으로 인코딩하고 스토리지에 다음과 같이 표시된다.
UINT16 OrderedListValue[3];
0B 00 0A 00 0C 00
orderedlist를 사용하면 숫자가 아닌 데이터 유형을 사용할 수도 있다. 예를 들어 변수를 날짜 배열로 인코딩도 가능하다.
EFI_HII_DATE OrderedListValue[3];
당연히 VFR에서 코드를 변경 해줘야 한다.
orderedlist
varid = FormData.OrderedListValue,
prompt = STRING_TOKEN(ORDERED_LIST_PROMPT),
help = STRING_TOKEN(ORDERED_LIST_HELP),
option text = STRING_TOKEN(ORDERED_LIST_OPTION1), value = 2021/7/4, flags = 0;
option text = STRING_TOKEN(ORDERED_LIST_OPTION2), value = 2022/8/5, flags = 0;
option text = STRING_TOKEN(ORDERED_LIST_OPTION3), value = 2023/9/6, flags = 0;
endlist;
이런 코드에 대한 IFR 데이터를 파싱하면 모든 옵션이 #define EFI_IFR_TYPE_DATE 0x06 type으로 인코딩된 것을 볼 수 있다.