PCD trong EDK II là gì?
Quicknote giải thích Platform Configuration Database trong EDK II.
PCD là Platform Configuration Database. Đây là cơ chế để EDK II đưa cấu hình vào module mà không phải hard-code trực tiếp trong source C.
Nếu nhìn thực tế, PCD giống một hệ thống build option/config option có kiểm soát: platform quyết định giá trị, module đọc giá trị đó để đổi hành vi.
Vì sao không hard-code?
Thay vì viết:
#define ENABLE_VERBOSE_LOG 1
#define UART_BAUD_RATE 115200
module có thể dùng PCD:
if (FeaturePcdGet (PcdEnableVerboseLog)) {
DEBUG ((DEBUG_INFO, "Verbose path enabled\n"));
}
BaudRate = FixedPcdGet32 (PcdUartBaudRate);
Platform A có thể bật log, platform B có thể tắt log mà không sửa source module.
PCD đi qua những file nào?
Khai báo PCD
Token space, name, type, default value, token number.
Module reference PCD
Module nói mình dùng PCD này.
Platform set value
Override giá trị theo board/build target.
Module đọc PCD
FeaturePcdGet, FixedPcdGet32, PcdGetBool...
Ví dụ hoàn chỉnh
Trong DEC:
[PcdsFeatureFlag]
gMyPkgTokenSpaceGuid.PcdEnableVerboseLog|FALSE|BOOLEAN|0x00000001
[PcdsFixedAtBuild]
gMyPkgTokenSpaceGuid.PcdUartBaudRate|115200|UINT32|0x00000002
Trong INF:
[Pcd]
gMyPkgTokenSpaceGuid.PcdEnableVerboseLog
gMyPkgTokenSpaceGuid.PcdUartBaudRate
Trong DSC:
[PcdsFeatureFlag]
gMyPkgTokenSpaceGuid.PcdEnableVerboseLog|TRUE
[PcdsFixedAtBuild]
gMyPkgTokenSpaceGuid.PcdUartBaudRate|921600
Trong C:
if (FeaturePcdGet (PcdEnableVerboseLog)) {
DEBUG ((DEBUG_INFO, "UART baud = %u\n", FixedPcdGet32 (PcdUartBaudRate)));
}
Các loại PCD nên nhớ
| Mục | Giá trị | Ghi chú |
|---|---|---|
| FeatureFlag | Bật/tắt feature | Thường dùng với FeaturePcdGet(). |
| FixedAtBuild | Giá trị cố định khi build | Nhanh, đơn giản, phù hợp config không đổi runtime. |
| PatchableInModule | Có thể patch trong binary | Dùng khi cần chỉnh giá trị sau build trong một số flow. |
| Dynamic | Giá trị quản lý động | Có thể phụ thuộc PCD database/runtime mechanism. |
| DynamicEx | Dynamic có token space rõ hơn | Phù hợp package/platform phức tạp hơn. |
PCD và debug thực tế
Một lỗi rất dễ gặp: bạn đổi giá trị trong DEC nhưng hành vi không đổi. Lý do là DSC platform đang override giá trị đó.
Thứ tự cần kiểm tra:
- PCD default trong DEC.
- PCD được module reference trong INF.
- PCD bị override trong DSC nào.
- Build target/platform bạn đang build có đúng DSC đó không.
- Code dùng đúng macro theo type chưa.
Checklist PCD
Ghi nhớ nhanh
PCD là cách EDK II biến cấu hình platform thành input có kiểm soát cho module. Với người làm BIOS, PCD rất giống build option, nhưng sạch hơn vì có type, token space và flow rõ ràng.
Bài liên quan
- DSC trong EDK II là gì?
- Library Class và Library Instance là gì?
- INF trong EDK II là gì?
- FDF trong EDK II là gì?
Nguồn tham khảo public
Thấy nội dung này hữu ích?
Lưu lại hoặc chia sẻ cho người cũng đang học firmware, BIOS/UEFI và embedded systems.
Nội dung liên quan
Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.