Add Page 14 (Event Log) and Page 20 (Enclosure Info) to C mock driver
This commit is contained in:
@@ -0,0 +1,4 @@
|
|||||||
|
*.o
|
||||||
|
*.dSYM
|
||||||
|
test_mock_driver
|
||||||
|
test_all_pages
|
||||||
@@ -22,7 +22,8 @@ make
|
|||||||
## 執行測試
|
## 執行測試
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./test_mock_driver
|
./test_mock_driver # 基本測試
|
||||||
|
./test_all_pages # 完整頁面測試
|
||||||
```
|
```
|
||||||
|
|
||||||
## 使用方式
|
## 使用方式
|
||||||
@@ -151,13 +152,14 @@ mock_cleanup();
|
|||||||
|
|
||||||
| Page | 大小 | 內容 |
|
| Page | 大小 | 內容 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| 0x00 | 1024 | Controller Info |
|
| 0x00 | 1024 | Controller Info (序號, 型號, 韌體, 狀態) |
|
||||||
| 0x01 | 1024 | RAID Snapshot |
|
| 0x01 | 1024 | RAID Snapshot (RAID 0-1 狀態) |
|
||||||
| 0x07 | 512 | LUN Map Table |
|
| 0x07 | 512 | LUN Map Table |
|
||||||
| 0x0A | 1024 | RAID Info |
|
| 0x0A | 1024 | RAID Info 0-1 (狀態, 等級, 容量) |
|
||||||
| 0x0B | 1024 | RAID Info |
|
| 0x0B | 1024 | RAID Info 2-3 |
|
||||||
| 0x0E | 1024 | RAID Info |
|
| 0x0E | 1024 | Event Log (8 筆事件, 含時間戳記) |
|
||||||
| 0x1B | 512 | Disk List |
|
| 0x14 | 512 | Enclosure Info (風扇, 電源, 溫度) |
|
||||||
|
| 0x1B | 512 | Disk List (8 個磁碟槽) |
|
||||||
|
|
||||||
## 整合到 GS
|
## 整合到 GS
|
||||||
|
|
||||||
@@ -188,6 +190,11 @@ endif
|
|||||||
|
|
||||||
## 開發日誌
|
## 開發日誌
|
||||||
|
|
||||||
|
- 2026-03-29: 新增頁面
|
||||||
|
- Page 14: Event Log (8 筆事件,含時間戳記與訊息)
|
||||||
|
- Page 20: Enclosure Info (風扇、電源、溫度、電池)
|
||||||
|
- test_all_pages 完整測試
|
||||||
|
|
||||||
- 2024-03-29: 初始版本
|
- 2024-03-29: 初始版本
|
||||||
- 基本控制器模擬
|
- 基本控制器模擬
|
||||||
- 事件佇列
|
- 事件佇列
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ void mock_init(void) {
|
|||||||
mock_fill_page10(0);
|
mock_fill_page10(0);
|
||||||
mock_fill_page11(0);
|
mock_fill_page11(0);
|
||||||
mock_fill_page14(0);
|
mock_fill_page14(0);
|
||||||
|
mock_fill_page20(0);
|
||||||
mock_fill_page27(0);
|
mock_fill_page27(0);
|
||||||
|
|
||||||
// Register default events
|
// Register default events
|
||||||
@@ -185,7 +186,145 @@ void mock_fill_page11(int ctrlIndex) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void mock_fill_page14(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) {
|
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_page10(int ctrlIndex);
|
||||||
void mock_fill_page11(int ctrlIndex);
|
void mock_fill_page11(int ctrlIndex);
|
||||||
void mock_fill_page14(int ctrlIndex);
|
void mock_fill_page14(int ctrlIndex);
|
||||||
|
void mock_fill_page20(int ctrlIndex);
|
||||||
void mock_fill_page27(int ctrlIndex);
|
void mock_fill_page27(int ctrlIndex);
|
||||||
void mock_register_default_events(void);
|
void mock_register_default_events(void);
|
||||||
|
|
||||||
|
|||||||
@@ -100,12 +100,70 @@ void test_page11(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void test_page14(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);
|
MOCK_CTRL_INFO *ctrl = mock_get_ctrl_info(0);
|
||||||
unsigned char *buf = ctrl->bPage14Data;
|
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) {
|
void test_page27(void) {
|
||||||
@@ -190,6 +248,7 @@ int main(int argc, char *argv[]) {
|
|||||||
test_page10();
|
test_page10();
|
||||||
test_page11();
|
test_page11();
|
||||||
test_page14();
|
test_page14();
|
||||||
|
test_page20();
|
||||||
test_page27();
|
test_page27();
|
||||||
test_devioctl();
|
test_devioctl();
|
||||||
test_events();
|
test_events();
|
||||||
|
|||||||
Reference in New Issue
Block a user