Add Page 14 (Event Log) and Page 20 (Enclosure Info) to C mock driver

This commit is contained in:
accusys
2026-03-29 15:08:47 +08:00
parent e7af73992d
commit f64450bdfa
5 changed files with 220 additions and 10 deletions
+4
View File
@@ -0,0 +1,4 @@
*.o
*.dSYM
test_mock_driver
test_all_pages
+14 -7
View File
@@ -22,7 +22,8 @@ make
## 執行測試
```bash
./test_mock_driver
./test_mock_driver # 基本測試
./test_all_pages # 完整頁面測試
```
## 使用方式
@@ -151,13 +152,14 @@ mock_cleanup();
| Page | 大小 | 內容 |
|------|------|------|
| 0x00 | 1024 | Controller Info |
| 0x01 | 1024 | RAID Snapshot |
| 0x00 | 1024 | Controller Info (序號, 型號, 韌體, 狀態) |
| 0x01 | 1024 | RAID Snapshot (RAID 0-1 狀態) |
| 0x07 | 512 | LUN Map Table |
| 0x0A | 1024 | RAID Info |
| 0x0B | 1024 | RAID Info |
| 0x0E | 1024 | RAID Info |
| 0x1B | 512 | Disk List |
| 0x0A | 1024 | RAID Info 0-1 (狀態, 等級, 容量) |
| 0x0B | 1024 | RAID Info 2-3 |
| 0x0E | 1024 | Event Log (8 筆事件, 含時間戳記) |
| 0x14 | 512 | Enclosure Info (風扇, 電源, 溫度) |
| 0x1B | 512 | Disk List (8 個磁碟槽) |
## 整合到 GS
@@ -188,6 +190,11 @@ endif
## 開發日誌
- 2026-03-29: 新增頁面
- Page 14: Event Log (8 筆事件,含時間戳記與訊息)
- Page 20: Enclosure Info (風扇、電源、溫度、電池)
- test_all_pages 完整測試
- 2024-03-29: 初始版本
- 基本控制器模擬
- 事件佇列
+140 -1
View File
@@ -57,6 +57,7 @@ void mock_init(void) {
mock_fill_page10(0);
mock_fill_page11(0);
mock_fill_page14(0);
mock_fill_page20(0);
mock_fill_page27(0);
// Register default events
@@ -185,7 +186,145 @@ void mock_fill_page11(int ctrlIndex) {
}
void mock_fill_page14(int ctrlIndex) {
memset(g_mockCtrl[ctrlIndex].bPage14Data, 0, 1024);
unsigned char *buf = g_mockCtrl[ctrlIndex].bPage14Data;
memset(buf, 0, 1024);
// Event Log Structure (16 events, 64 bytes each)
// Each event: 32 bytes data + 32 bytes message
// Offset 0-15: Event Type (4 bytes), Timestamp (4 bytes), Slot/EID (4 bytes), Status (4 bytes)
// Offset 16-31: Reserved
// Offset 32-63: Event Message (32 bytes)
time_t now = time(NULL);
// Event 0: Controller started
buf[0] = 0x01; // Event Type: System
buf[1] = 0x00;
buf[2] = 0x00;
buf[3] = 0x00;
*(unsigned int*)(buf + 4) = (unsigned int)(now - 3600); // 1 hour ago
*(unsigned int*)(buf + 8) = 0xFFFFFFFF; // Controller
buf[12] = 0x01; // Status: Info
memcpy(buf + 32, "Controller started successfully ", 32);
// Event 1: Disk online
buf[64] = 0x02; // Event Type: Disk
buf[65] = 0x00;
buf[66] = 0x00;
buf[67] = 0x00;
*(unsigned int*)(buf + 68) = (unsigned int)(now - 1800); // 30 min ago
*(unsigned int*)(buf + 72) = 0x02; // Slot 2
buf[76] = 0x01; // Status: Info
memcpy(buf + 96, "Disk online ", 32);
// Event 2: RAID normal
buf[128] = 0x03; // Event Type: RAID
buf[129] = 0x00;
buf[130] = 0x00;
buf[131] = 0x00;
*(unsigned int*)(buf + 132) = (unsigned int)(now - 900); // 15 min ago
*(unsigned int*)(buf + 136) = 0x00; // RAID ID 0
buf[140] = 0x01; // Status: Info
memcpy(buf + 160, "RAID-01 status: Normal ", 32);
// Event 3: Temperature warning
buf[192] = 0x02; // Event Type: Disk
buf[193] = 0x00;
buf[194] = 0x00;
buf[195] = 0x00;
*(unsigned int*)(buf + 196) = (unsigned int)(now - 600); // 10 min ago
*(unsigned int*)(buf + 200) = 0x03; // Slot 3
buf[204] = 0x02; // Status: Warning
memcpy(buf + 224, "Disk temperature warning: 45C ", 32);
// Event 4: Power supply normal
buf[256] = 0x05; // Event Type: Power
buf[257] = 0x00;
buf[258] = 0x00;
buf[259] = 0x00;
*(unsigned int*)(buf + 260) = (unsigned int)(now - 300); // 5 min ago
*(unsigned int*)(buf + 264) = 0x00; // PS 0
buf[268] = 0x01; // Status: Info
memcpy(buf + 288, "Power supply 1 online ", 32);
// Event 5: Fan normal
buf[320] = 0x04; // Event Type: Enclosure
buf[321] = 0x00;
buf[322] = 0x00;
buf[323] = 0x00;
*(unsigned int*)(buf + 324) = (unsigned int)(now - 120); // 2 min ago
*(unsigned int*)(buf + 328) = 0x00; // Fan 0
buf[332] = 0x01; // Status: Info
memcpy(buf + 352, "Fan speed normal: 5200 RPM ", 32);
// Event 6: Network up
buf[384] = 0x06; // Event Type: Network
buf[385] = 0x00;
buf[386] = 0x00;
buf[387] = 0x00;
*(unsigned int*)(buf + 388) = (unsigned int)(now - 60); // 1 min ago
*(unsigned int*)(buf + 392) = 0x00; // Port 0
buf[396] = 0x01; // Status: Info
memcpy(buf + 416, "Network port link up ", 32);
// Event 7: Battery OK
buf[448] = 0x01; // Event Type: System
buf[449] = 0x00;
buf[450] = 0x00;
buf[451] = 0x00;
*(unsigned int*)(buf + 452) = (unsigned int)now; // Now
*(unsigned int*)(buf + 456) = 0xFFFFFFFF; // Controller
buf[460] = 0x01; // Status: Info
memcpy(buf + 480, "Battery backup unit initialized ", 32);
// Event count at offset 960 (0x3C0)
buf[960] = 8; // 8 events stored
if (g_verbose) {
printf("[MOCK] Page 14 filled for controller %d (8 events)\n", ctrlIndex);
}
}
void mock_fill_page20(int ctrlIndex) {
unsigned char *buf = g_mockCtrl[ctrlIndex].bPage20Data;
memset(buf, 0, 512);
buf[0] = 2; // Fan Count
buf[1] = 2; // Power Supply Count
buf[2] = 4; // Temperature Sensor Count
buf[3] = 1; // Heat Sink Count
buf[4] = 1; // Power Supply Fan Count
buf[0x10] = 0x50;
buf[0x11] = 0x14;
buf[0x12] = 0x40;
buf[0x13] = 0x13;
buf[0x18] = 0xA0;
buf[0x19] = 0x0F;
buf[0x20] = 35;
buf[0x21] = 32;
buf[0x22] = 38;
buf[0x23] = 30;
buf[0x40] = 0x00;
buf[0x41] = 0x00;
buf[0x42] = 0x01;
buf[0x43] = 0x00;
buf[0x50] = 0x00;
buf[0x51] = 0x00;
buf[0x60] = 0x01;
buf[0x61] = 0x64;
buf[0x62] = 0x00;
buf[0x00] = 0x00;
if (g_verbose) {
printf("[MOCK] Page 20 filled for controller %d (Enclosure Info)\n", ctrlIndex);
}
}
void mock_fill_page27(int ctrlIndex) {
@@ -97,6 +97,7 @@ void mock_fill_page7(int ctrlIndex);
void mock_fill_page10(int ctrlIndex);
void mock_fill_page11(int ctrlIndex);
void mock_fill_page14(int ctrlIndex);
void mock_fill_page20(int ctrlIndex);
void mock_fill_page27(int ctrlIndex);
void mock_register_default_events(void);
+61 -2
View File
@@ -100,12 +100,70 @@ void test_page11(void) {
}
void test_page14(void) {
printf("\n========== TEST PAGE 14: RAID Info 6-7 ==========\n");
printf("\n========== TEST PAGE 14: Event Log ==========\n");
MOCK_CTRL_INFO *ctrl = mock_get_ctrl_info(0);
unsigned char *buf = ctrl->bPage14Data;
print_hex("Full Page 14", buf, 64);
printf("Event Count: %d\n", buf[960]);
// Print first event
printf("\nEvent 0:\n");
printf(" Type: 0x%02X\n", buf[0]);
printf(" Timestamp: %u\n", *(unsigned int*)(buf + 4));
printf(" Slot/EID: 0x%02X\n", *(unsigned int*)(buf + 8));
printf(" Status: 0x%02X\n", buf[12]);
printf(" Message: %.32s\n", buf + 32);
// Print second event
printf("\nEvent 1:\n");
printf(" Type: 0x%02X\n", buf[64]);
printf(" Timestamp: %u\n", *(unsigned int*)(buf + 68));
printf(" Slot/EID: 0x%02X\n", *(unsigned int*)(buf + 72));
printf(" Status: 0x%02X\n", buf[76]);
printf(" Message: %.32s\n", buf + 96);
print_hex("Page 14 (first 128 bytes)", buf, 128);
}
void test_page20(void) {
printf("\n========== TEST PAGE 20: Enclosure Info ==========\n");
MOCK_CTRL_INFO *ctrl = mock_get_ctrl_info(0);
unsigned char *buf = ctrl->bPage20Data;
printf("Enclosure ID: %d\n", buf[0]);
printf("Fan Count: %d\n", buf[1]);
printf("Power Supply Count: %d\n", buf[2]);
printf("Temperature Sensor Count: %d\n", buf[3]);
printf("Heat Sink Count: %d\n", buf[4]);
// Fan speeds
unsigned short fan1 = buf[0x10] | (buf[0x11] << 8);
unsigned short fan2 = buf[0x12] | (buf[0x13] << 8);
printf("Fan 1 Speed: %d RPM\n", fan1);
printf("Fan 2 Speed: %d RPM\n", fan2);
// Temperatures
printf("Temperature 1: %d C\n", buf[0x20]);
printf("Temperature 2: %d C\n", buf[0x21]);
printf("Temperature 3: %d C\n", buf[0x22]);
printf("Temperature 4: %d C\n", buf[0x23]);
// Temp status
printf("Temp 1 Status: %d\n", buf[0x40]);
printf("Temp 2 Status: %d\n", buf[0x41]);
printf("Temp 3 Status: %d\n", buf[0x42]);
// Power Supply status
printf("Power Supply 1: %s\n", buf[0x50] == 0 ? "OK" : "FAIL");
printf("Power Supply 2: %s\n", buf[0x51] == 0 ? "OK" : "FAIL");
// Battery
printf("Battery Present: %s\n", buf[0x60] == 1 ? "Yes" : "No");
printf("Battery Charge: %d%%\n", buf[0x61]);
print_hex("Full Page 20", buf, 128);
}
void test_page27(void) {
@@ -190,6 +248,7 @@ int main(int argc, char *argv[]) {
test_page10();
test_page11();
test_page14();
test_page20();
test_page27();
test_devioctl();
test_events();