查看UEFI下的大小写转换函数的时候,偶然发现了EFI_UNICODE_COLLATION_PROTOCOL【参考1】提供了几个有意思的函数。
具体的头文件定义在 \MdePkg\Include\Protocol\UnicodeCollation.h
///
/// The EFI_UNICODE_COLLATION_PROTOCOL is used to perform case-insensitive
/// comparisons of strings.
///
struct _EFI_UNICODE_COLLATION_PROTOCOL {
EFI_UNICODE_COLLATION_STRICOLL StriColl;
EFI_UNICODE_COLLATION_METAIMATCH MetaiMatch;
EFI_UNICODE_COLLATION_STRLWR StrLwr;
EFI_UNICODE_COLLATION_STRUPR StrUpr;
//
// for supporting fat volumes
//
EFI_UNICODE_COLLATION_FATTOSTR FatToStr;
EFI_UNICODE_COLLATION_STRTOFAT StrToFat;
///
/// A Null-terminated ASCII string array that contains one or more language codes.
/// When this field is used for UnicodeCollation2, it is specified in RFC 4646 format.
/// When it is used for UnicodeCollation, it is specified in ISO 639-2 format.
///
CHAR8 *SupportedLanguages;
};
根据介绍,大概的介绍一些功能(如果你发现有错误,欢迎eMail指出)
EFI_UNICODE_COLLATION_STRICOLL StriColl; //大小写不敏感的比较函数
EFI_UNICODE_COLLATION_METAIMATCH MetaiMatch; //正则表达式匹配
EFI_UNICODE_COLLATION_STRLWR StrLwr; //字符串转小写
EFI_UNICODE_COLLATION_STRUPR StrUpr; //字符串转大写
EFI_UNICODE_COLLATION_FATTOSTR FatToStr; //8.3格式的OEM定义字符文件名转String
EFI_UNICODE_COLLATION_STRTOFAT StrToFat; //String转8.3格式的OEM定义字符
CHAR8 *SupportedLanguages; //列出当前系统支持的语言代码
之后,根据上面的介绍,编写一个测试例子:
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/ShellCEntryLib.h>
#include <Protocol/UnicodeCollation.h>
extern EFI_BOOT_SERVICES *gBS;
extern EFI_SYSTEM_TABLE *gST;
extern EFI_RUNTIME_SERVICES *gRT;
int
EFIAPI
main (
IN int Argc,
IN CHAR16 **Argv
)
{
EFI_STATUS Status;
EFI_UNICODE_COLLATION_PROTOCOL *mUnicodeCollation;
CHAR16 *TestStr=L"wWw.LaB-z.cOm";
CHAR16 *Pattern1=L"w*";
CHAR16 *Pattern2=L"*z.c*";
CHAR16 *Pattern3=L"c*";
Status = gBS->LocateProtocol(
&gEfiUnicodeCollation2ProtocolGuid,
NULL,
&mUnicodeCollation);
if (EFI_ERROR (Status)) {
Print(L"Can't Locate Protocol\n");
return Status;
}
mUnicodeCollation->StrLwr(mUnicodeCollation,TestStr);
Print(L"%s\n",TestStr);
mUnicodeCollation->StrUpr(mUnicodeCollation,TestStr);
Print(L"%s\n",TestStr);
Print(L"%d\n",(mUnicodeCollation->
MetaiMatch(mUnicodeCollation,
TestStr,
Pattern1)));
Print(L"%d\n",(mUnicodeCollation->
MetaiMatch(mUnicodeCollation,
TestStr,
Pattern2)));
Print(L"%d\n",(mUnicodeCollation->
MetaiMatch(mUnicodeCollation,
TestStr,
Pattern3)));
return EFI_SUCCESS;
}
其中测试了大小写转换不必细说,多说两句关于正则表达式的用法:
CHAR16 *TestStr=L"wWw.LaB-z.cOm"; CHAR16 *Pattern1=L"w*"; CHAR16 *Pattern2=L"*z.c*"; CHAR16 *Pattern3=L"c*";
其中 “*” 表示匹配一个或者任意多个字符, Pattern1 表示的是“以w开头的字符串”;Pattern2 表示的是“中间含有 z.c 字符的字符串”;Pattern3 表示的是“以c开头的字符串”。最终运行结果如下:
完整的代码下载:
UnicTest
参考:
1. UEFI 2.4 P592


大大,請問如何能讀到SPI ROM的 binary file 呢?
你查一下南桥的spec 上面有spi 的寄存器,然后对照手边的flash部分的代码看看就知道了。
好的
南橋spec上面好像沒有說如何得到SPIBAR?
沒有SPIBAR ,我就無法操作register來做
讀取SPI ROM的動作~
你是哪个南桥,不同平台差别挺大的
我用Wice Socket來讀到 SPI ROM 在 0x1740EF
南橋是 WINBOND W25Q64BV
你的 spi 是在 super io 下面吗?
不是在super io 下
不在 Super IO 下面的话,不需要看 SuperIO 的spec
直接看南桥的Spec就好了。最好是对照BIOS Source Code看一下。
read 我是用SPIBAR+ offset 的register操作完成的
那write呢? 是不是可以用SPI cmd, opcode? 該如何寫呢?
如果 read 可以,那么下面可以试试 erase了,然后再实验 write
雖然知道每個register的功能,但卻不清楚其工作的順序啊?
1.看 Super IO 的spec
2.看BIOS 的Source Code,里面有SPI挂在SIO下面和SB 下面的做法
還是不行@@