ARECA 韌體規範¶
IOP331 介面卡的使用¶
(所有輸入/輸出均在 IOP331 的視角中)
1. 訊息 0¶
InitThread 訊息和返回程式碼
2. 門鈴用於 RS-232 模擬¶
- inDoorBell
- bit0
資料已準備好 zDRIVER DATA WRITE OK)
- bit1
資料輸出已被讀取 (DRIVER DATA READ OK)
- outDooeBell
- bit0
資料輸出已準備好 (IOP331 DATA WRITE OK)
- bit1
資料輸入已被讀取 (IOP331 DATA READ OK)
3. 索引記憶體使用情況¶
偏移量 0xf00 |
用於 RS232 輸出(請求緩衝區) |
偏移量 0xe00 |
用於 RS232 輸入(暫存緩衝區) |
偏移量 0xa00 |
用於入站訊息程式碼 message_rwbuffer(驅動程式傳送到 IOP331) |
偏移量 0xa00 |
用於出站訊息程式碼 message_rwbuffer(IOP331 傳送到驅動程式) |
4. RS-232 模擬¶
當前使用 128 位元組緩衝區
第一個 uint32_t |
資料長度 (1--124) |
位元組 4--127 |
最多 124 位元組的資料 |
5. PostQ¶
所有 SCSI 命令必須透過 postQ 傳送
- (入站佇列埠)
請求幀必須 32 位元組對齊
- #bit27--bit31
用於 post ccb 的標誌
- #bit0--bit26
post arcmsr_cdb 的真實地址 (bit27--bit31)
bit31
0
256 位元組幀
1
512 位元組幀
bit30
0
正常請求
1
BIOS 請求
bit29
保留
bit28
保留
bit27
保留
- (出站佇列埠)
請求回覆
- #bit27--bit31
用於回覆的標誌
- #bit0--bit26
回覆 arcmsr_cdb 的真實地址 (bit27--bit31)
bit31
必須為 0(對於此型別的回覆)
bit30
為 BIOS 握手保留
bit29
保留
bit28
0
沒有錯誤,忽略 AdapStatus/DevStatus/SenseData
1
錯誤,AdapStatus/DevStatus/SenseData 中的錯誤程式碼
bit27
保留
6. BIOS 請求¶
所有 BIOS 請求與來自 PostQ 的請求相同
除了
請求幀從配置空間傳送
偏移量:0x78
請求幀 (bit30 == 1)
偏移量:0x18
只寫以生成到 IOP331 的 IRQ
請求完成
(bit30 == 0, bit28==err flag)
7. SGL 條目的定義(結構)¶
8. Message1 Out - Diag 狀態碼 (????)¶
9. Message0 訊息程式碼¶
0x00 |
NOP |
||||||||||||||||||||
0x01 |
獲取配置 -> 偏移量 0xa00:用於出站訊息程式碼 message_rwbuffer(IOP331 傳送到驅動程式)
|
||||||||||||||||||||
0x02 |
設定配置 -> 偏移量 0xa00:用於入站訊息程式碼 message_rwbuffer(驅動程式傳送到 IOP331)
|
||||||||||||||||||||
0x03 |
復位(中止所有排隊的命令) |
||||||||||||||||||||
0x04 |
停止後臺活動 |
||||||||||||||||||||
0x05 |
重新整理快取 |
||||||||||||||||||||
0x06 |
啟動後臺活動(如果後臺已停止,則重新啟動) |
||||||||||||||||||||
0x07 |
檢查主機命令是否掛起(Novell 可能需要此功能) |
||||||||||||||||||||
0x08 |
設定控制器時間 -> 偏移量 0xa00 用於入站訊息程式碼 message_rwbuffer(驅動程式到 IOP331)
|
Areca Raid 控制器的 RS-232 介面¶
低階命令介面與 VT100 終端互斥
1. 命令執行順序¶
- 標頭
3 位元組序列 (0x5E, 0x01, 0x61)
- 命令塊
可變長度的資料,包括長度、命令程式碼、資料和校驗和位元組
- 返回資料
可變長度的資料
2. 命令塊¶
- 第一個位元組
命令塊長度(低位元組)
- 第二個位元組
命令塊長度(高位元組)
注意
命令塊長度不應 > 2040 位元組,長度不包括這兩個位元組
- 第三個位元組
命令程式碼
- 第四個和後續位元組
可變長度的資料位元組
取決於命令程式碼
最後一個位元組校驗和位元組(從第一個位元組到最後一個數據位元組的總和)
3. 命令程式碼和關聯資料¶
以下是在 RAID 控制器中定義的命令程式碼,命令程式碼 0x10--0x1? 用於系統級別管理,不需要密碼檢查,應在單獨的良好控制的實用程式中實現,而不是供終端使用者訪問。 命令程式碼 0x20--0x?? 始終檢查密碼,必須輸入密碼才能啟用這些命令
enum
{
GUI_SET_SERIAL=0x10,
GUI_SET_VENDOR,
GUI_SET_MODEL,
GUI_IDENTIFY,
GUI_CHECK_PASSWORD,
GUI_LOGOUT,
GUI_HTTP,
GUI_SET_ETHERNET_ADDR,
GUI_SET_LOGO,
GUI_POLL_EVENT,
GUI_GET_EVENT,
GUI_GET_HW_MONITOR,
// GUI_QUICK_CREATE=0x20, (function removed)
GUI_GET_INFO_R=0x20,
GUI_GET_INFO_V,
GUI_GET_INFO_P,
GUI_GET_INFO_S,
GUI_CLEAR_EVENT,
GUI_MUTE_BEEPER=0x30,
GUI_BEEPER_SETTING,
GUI_SET_PASSWORD,
GUI_HOST_INTERFACE_MODE,
GUI_REBUILD_PRIORITY,
GUI_MAX_ATA_MODE,
GUI_RESET_CONTROLLER,
GUI_COM_PORT_SETTING,
GUI_NO_OPERATION,
GUI_DHCP_IP,
GUI_CREATE_PASS_THROUGH=0x40,
GUI_MODIFY_PASS_THROUGH,
GUI_DELETE_PASS_THROUGH,
GUI_IDENTIFY_DEVICE,
GUI_CREATE_RAIDSET=0x50,
GUI_DELETE_RAIDSET,
GUI_EXPAND_RAIDSET,
GUI_ACTIVATE_RAIDSET,
GUI_CREATE_HOT_SPARE,
GUI_DELETE_HOT_SPARE,
GUI_CREATE_VOLUME=0x60,
GUI_MODIFY_VOLUME,
GUI_DELETE_VOLUME,
GUI_START_CHECK_VOLUME,
GUI_STOP_CHECK_VOLUME
};
命令說明¶
- GUI_SET_SERIAL
設定控制器序列號
位元組 0,1
長度
位元組 2
命令程式碼 0x10
位元組 3
密碼長度(應為 0x0f)
位元組 4-0x13
應為“ArEcATecHnoLogY”
位元組 0x14--0x23
序列號字串(必須為 16 位元組)
- GUI_SET_VENDOR
設定控制器的供應商字串
位元組 0,1
長度
位元組 2
命令程式碼 0x11
位元組 3
密碼長度(應為 0x08)
位元組 4-0x13
應為“ArEcAvAr”
位元組 0x14--0x3B
供應商字串(必須為 40 位元組)
- GUI_SET_MODEL
設定控制器的型號名稱
位元組 0,1
長度
位元組 2
命令程式碼 0x12
位元組 3
密碼長度(應為 0x08)
位元組 4-0x13
應為“ArEcAvAr”
位元組 0x14--0x1B
型號字串(必須為 8 位元組)
- GUI_IDENTIFY
識別裝置
位元組 0,1
長度
位元組 2
- 命令程式碼 0x13
返回“Areca RAID Subsystem “
- GUI_CHECK_PASSWORD
驗證密碼
位元組 0,1
長度
位元組 2
命令程式碼 0x14
位元組 3
密碼長度
位元組 4-0x??
要檢查的使用者密碼
- GUI_LOGOUT
登出 GUI(強制在下一個命令上進行密碼檢查)
位元組 0,1
長度
位元組 2
命令程式碼 0x15
- GUI_HTTP
HTTP 介面(為 Http 代理服務保留)(0x16)
- GUI_SET_ETHERNET_ADDR
設定乙太網 MAC 地址
位元組 0,1
長度
位元組 2
命令程式碼 0x17
位元組 3
密碼長度(應為 0x08)
位元組 4-0x13
應為“ArEcAvAr”
位元組 0x14--0x19
乙太網 MAC 地址(必須為 6 位元組)
- GUI_SET_LOGO
在 HTTP 中設定徽標
位元組 0,1
長度
位元組 2
命令程式碼 0x18
位元組 3
頁面# (0/1/2/3) (0xff --> 清除 OEM 徽標)
位元組 4/5/6/7
0x55/0xaa/0xa5/0x5a
位元組 8
TITLE.JPG 資料(每個頁面必須為 2000 位元組)
注意
page0 第一個 2 位元組必須是 JPG 檔案的實際長度
- GUI_POLL_EVENT
輪詢事件日誌是否已更改
位元組 0,1
長度
位元組 2
命令程式碼 0x19
- GUI_GET_EVENT
讀取事件
位元組 0,1
長度
位元組 2
命令程式碼 0x1a
位元組 3
事件頁面 (0:第 1 頁/1/2/3:最後一頁)
- GUI_GET_HW_MONITOR
獲取硬體監視器資料
位元組 0,1
長度
位元組 2
命令程式碼 0x1b
位元組 3
FAN 的數量(例如 2)
位元組 4
電壓感測器的數量(例如 3)
位元組 5
溫度感測器的數量(例如 2)
位元組 6
電源數量
位元組 7/8
風扇#0 (RPM)
位元組 9/10
風扇#1
位元組 11/12
電壓#0 原始值
*1000位元組 13/14
電壓#0 值
位元組 15/16
電壓#1 org
位元組 17/18
電壓#1
位元組 19/20
電壓#2 org
位元組 21/22
電壓#2
位元組 23
溫度#0
位元組 24
溫度#1
位元組 25
電源指示器(bit0 power#0,bit1 power#1)
位元組 26
UPS 指示器
- GUI_QUICK_CREATE
快速建立 raid/volume set
位元組 0,1
長度
位元組 2
命令程式碼 0x20
位元組 3/4/5/6
原始容量
位元組 7
RAID 級別
位元組 8
條帶大小
位元組 9
備用
位元組 10/11/12/13
裝置掩碼(建立 raid/volume 的裝置)
此功能已刪除,應用程式喜歡實現快速建立功能
需要使用 GUI_CREATE_RAIDSET 和 GUI_CREATE_VOLUMESET 功能。
- GUI_GET_INFO_R
獲取 Raid Set 資訊
位元組 0,1
長度
位元組 2
命令程式碼 0x20
位元組 3
raidset#
typedef struct sGUI_RAIDSET { BYTE grsRaidSetName[16]; DWORD grsCapacity; DWORD grsCapacityX; DWORD grsFailMask; BYTE grsDevArray[32]; BYTE grsMemberDevices; BYTE grsNewMemberDevices; BYTE grsRaidState; BYTE grsVolumes; BYTE grsVolumeList[16]; BYTE grsRes1; BYTE grsRes2; BYTE grsRes3; BYTE grsFreeSegments; DWORD grsRawStripes[8]; DWORD grsRes4; DWORD grsRes5; // Total to 128 bytes DWORD grsRes6; // Total to 128 bytes } sGUI_RAIDSET, *pGUI_RAIDSET;- GUI_GET_INFO_V
獲取 Volume Set 資訊
位元組 0,1
長度
位元組 2
命令程式碼 0x21
位元組 3
volumeset#
typedef struct sGUI_VOLUMESET { BYTE gvsVolumeName[16]; // 16 DWORD gvsCapacity; DWORD gvsCapacityX; DWORD gvsFailMask; DWORD gvsStripeSize; DWORD gvsNewFailMask; DWORD gvsNewStripeSize; DWORD gvsVolumeStatus; DWORD gvsProgress; // 32 sSCSI_ATTR gvsScsi; BYTE gvsMemberDisks; BYTE gvsRaidLevel; // 8 BYTE gvsNewMemberDisks; BYTE gvsNewRaidLevel; BYTE gvsRaidSetNumber; BYTE gvsRes0; // 4 BYTE gvsRes1[4]; // 64 bytes } sGUI_VOLUMESET, *pGUI_VOLUMESET;- GUI_GET_INFO_P
獲取物理驅動器資訊
位元組 0,1
長度
位元組 2
命令程式碼 0x22
位元組 3
驅動器 #(從 0 到最大通道數 - 1)
typedef struct sGUI_PHY_DRV { BYTE gpdModelName[40]; BYTE gpdSerialNumber[20]; BYTE gpdFirmRev[8]; DWORD gpdCapacity; DWORD gpdCapacityX; // Reserved for expansion BYTE gpdDeviceState; BYTE gpdPioMode; BYTE gpdCurrentUdmaMode; BYTE gpdUdmaMode; BYTE gpdDriveSelect; BYTE gpdRaidNumber; // 0xff if not belongs to a raid set sSCSI_ATTR gpdScsi; BYTE gpdReserved[40]; // Total to 128 bytes } sGUI_PHY_DRV, *pGUI_PHY_DRV;- GUI_GET_INFO_S
獲取系統資訊
位元組 0,1
長度
位元組 2
命令程式碼 0x23
typedef struct sCOM_ATTR { BYTE comBaudRate; BYTE comDataBits; BYTE comStopBits; BYTE comParity; BYTE comFlowControl; } sCOM_ATTR, *pCOM_ATTR; typedef struct sSYSTEM_INFO { BYTE gsiVendorName[40]; BYTE gsiSerialNumber[16]; BYTE gsiFirmVersion[16]; BYTE gsiBootVersion[16]; BYTE gsiMbVersion[16]; BYTE gsiModelName[8]; BYTE gsiLocalIp[4]; BYTE gsiCurrentIp[4]; DWORD gsiTimeTick; DWORD gsiCpuSpeed; DWORD gsiICache; DWORD gsiDCache; DWORD gsiScache; DWORD gsiMemorySize; DWORD gsiMemorySpeed; DWORD gsiEvents; BYTE gsiMacAddress[6]; BYTE gsiDhcp; BYTE gsiBeeper; BYTE gsiChannelUsage; BYTE gsiMaxAtaMode; BYTE gsiSdramEcc; // 1:if ECC enabled BYTE gsiRebuildPriority; sCOM_ATTR gsiComA; // 5 bytes sCOM_ATTR gsiComB; // 5 bytes BYTE gsiIdeChannels; BYTE gsiScsiHostChannels; BYTE gsiIdeHostChannels; BYTE gsiMaxVolumeSet; BYTE gsiMaxRaidSet; BYTE gsiEtherPort; // 1:if ether net port supported BYTE gsiRaid6Engine; // 1:Raid6 engine supported BYTE gsiRes[75]; } sSYSTEM_INFO, *pSYSTEM_INFO;- GUI_CLEAR_EVENT
清除系統事件
位元組 0,1
長度
位元組 2
命令程式碼 0x24
- GUI_MUTE_BEEPER
使當前蜂鳴器靜音
位元組 0,1
長度
位元組 2
命令程式碼 0x30
- GUI_BEEPER_SETTING
停用蜂鳴器
位元組 0,1
長度
位元組 2
命令程式碼 0x31
位元組 3
0->停用,1->啟用
- GUI_SET_PASSWORD
更改密碼
位元組 0,1
長度
位元組 2
命令程式碼 0x32
位元組 3
密碼長度 (必須 <= 15 )
位元組 4
密碼(必須是字母數字)
- GUI_HOST_INTERFACE_MODE
設定主機介面模式
位元組 0,1
長度
位元組 2
命令程式碼 0x33
位元組 3
0->獨立,1->叢集
- GUI_REBUILD_PRIORITY
設定重建優先順序
位元組 0,1
長度
位元組 2
命令程式碼 0x34
位元組 3
0/1/2/3(低->高)
- GUI_MAX_ATA_MODE
設定要使用的最大 ATA 模式
位元組 0,1
長度
位元組 2
命令程式碼 0x35
位元組 3
0/1/2/3 (133/100/66/33)
- GUI_RESET_CONTROLLER
重置控制器
位元組 0,1
長度
位元組 2
命令程式碼 0x36 * 使用 VT100 螢幕響應(丟棄它)
- GUI_COM_PORT_SETTING
COM 埠設定
位元組 0,1
長度
位元組 2
命令程式碼 0x37
位元組 3
0->COMA(終端埠),1->COMB(除錯埠)
位元組 4
0/1/2/3/4/5/6/7 (1200/2400/4800/9600/19200/38400/57600/115200)
位元組 5
資料位(0:7 位,1:8 位必須為 8 位)
位元組 6
停止位(0:1,1:2 停止位)
位元組 7
奇偶校驗(0:無,1:關閉,2:偶數)
位元組 8
流控制(0:無,1:xon/xoff,2:硬體 => 必須使用無)
- GUI_NO_OPERATION
無操作
位元組 0,1
長度
位元組 2
命令程式碼 0x38
- GUI_DHCP_IP
設定 DHCP 選項和本地 IP 地址
位元組 0,1
長度
位元組 2
命令程式碼 0x39
位元組 3
0:dhcp 停用,1:dhcp 啟用
位元組 4/5/6/7
IP 地址
- GUI_CREATE_PASS_THROUGH
建立直通磁碟
位元組 0,1
長度
位元組 2
命令程式碼 0x40
位元組 3
裝置 #
位元組 4
scsi 通道 (0/1)
位元組 5
scsi id (0-->15)
位元組 6
scsi lun (0-->7)
位元組 7
標記佇列 (1 啟用)
位元組 8
快取模式 (1 啟用)
位元組 9
最大速度(0/1/2/3/4,對於 scsi 為 async/20/40/80/160)(對於 ide 為 0/1/2/3/4,33/66/100/133/150)
- GUI_MODIFY_PASS_THROUGH
修改直通磁碟
位元組 0,1
長度
位元組 2
命令程式碼 0x41
位元組 3
裝置 #
位元組 4
scsi 通道 (0/1)
位元組 5
scsi id (0-->15)
位元組 6
scsi lun (0-->7)
位元組 7
標記佇列 (1 啟用)
位元組 8
快取模式 (1 啟用)
位元組 9
最大速度(0/1/2/3/4,對於 scsi 為 async/20/40/80/160)(對於 ide 為 0/1/2/3/4,33/66/100/133/150)
- GUI_DELETE_PASS_THROUGH
刪除直通磁碟
位元組 0,1
長度
位元組 2
命令程式碼 0x42
位元組 3
要刪除的裝置#
- GUI_IDENTIFY_DEVICE
識別裝置
位元組 0,1
長度
位元組 2
命令程式碼 0x43
位元組 3
Flash 方法(0:選擇快閃記憶體,1:未選擇快閃記憶體)
位元組 4/5/6/7
要重新整理的 IDE 裝置掩碼 .. 注意:: 沒有可用的響應資料
- GUI_CREATE_RAIDSET
建立 Raid Set
位元組 0,1
長度
位元組 2
命令程式碼 0x50
位元組 3/4/5/6
裝置掩碼
位元組 7-22
raidset 名稱(如果位元組 7 == 0:使用預設值)
- GUI_DELETE_RAIDSET
刪除 Raid Set
位元組 0,1
長度
位元組 2
命令程式碼 0x51
位元組 3
raidset#
- GUI_EXPAND_RAIDSET
擴充套件 Raid Set
位元組 0,1
長度
位元組 2
命令程式碼 0x52
位元組 3
raidset#
位元組 4/5/6/7
用於擴充套件的裝置掩碼
位元組 8/9/10
(8:0 無更改,1 更改,0xff:終止,9:新 raid 級別,10:新條帶大小 0/1/2/3/4/5->4/8/16/32/64/128K)
位元組 11/12/13
為 raidset 中的每個卷重複
- GUI_ACTIVATE_RAIDSET
啟用不完整的 raid set
位元組 0,1
長度
位元組 2
命令程式碼 0x53
位元組 3
raidset#
- GUI_CREATE_HOT_SPARE
建立熱備用磁碟
位元組 0,1
長度
位元組 2
命令程式碼 0x54
位元組 3/4/5/6
用於建立熱備用的裝置掩碼
- GUI_DELETE_HOT_SPARE
刪除熱備用磁碟
位元組 0,1
長度
位元組 2
命令程式碼 0x55
位元組 3/4/5/6
用於刪除熱備用的裝置掩碼
- GUI_CREATE_VOLUME
建立 volume set
位元組 0,1
長度
位元組 2
命令程式碼 0x60
位元組 3
raidset#
位元組 4-19
卷集名稱 (如果 byte4 == 0, 使用預設值)
位元組 20-27
卷容量 (塊)
位元組 28
RAID 級別
位元組 29
條帶大小 (0/1/2/3/4/5->4/8/16/32/64/128K)
位元組 30
通道
位元組 31
ID
位元組 32
LUN
位元組 33
1 啟用標籤
位元組 34
1 啟用快取
位元組 35
速度 (0/1/2/3/4->async/20/40/80/160 for scsi) (0/1/2/3/4->33/66/100/133/150 for IDE )
位元組 36
1 選擇快速初始化
- GUI_MODIFY_VOLUME
修改卷集
位元組 0,1
長度
位元組 2
命令程式碼 0x61
位元組 3
volumeset#
位元組 4-19
新的卷集名稱 (如果 byte4 == 0, 不修改)
位元組 20-27
新的卷容量 (保留)
位元組 28
新的 RAID 級別
位元組 29
新的條帶大小 (0/1/2/3/4/5->4/8/16/32/64/128K)
位元組 30
新的通道
位元組 31
新的 ID
位元組 32
新的 LUN
位元組 33
1 啟用標籤
位元組 34
1 啟用快取
位元組 35
速度 (0/1/2/3/4->async/20/40/80/160 for scsi) (0/1/2/3/4->33/66/100/133/150 for IDE )
- GUI_DELETE_VOLUME
刪除卷集
位元組 0,1
長度
位元組 2
命令程式碼 0x62
位元組 3
volumeset#
- GUI_START_CHECK_VOLUME
開始卷一致性檢查
位元組 0,1
長度
位元組 2
命令程式碼 0x63
位元組 3
volumeset#
- GUI_STOP_CHECK_VOLUME
停止卷一致性檢查
位元組 0,1
長度
位元組 2
命令程式碼 0x64
4. 返回資料¶
Header 3 位元組序列 (0x5E, 0x01, 0x61)
長度 2 位元組 (低位元組在前,不包含長度和校驗和位元組)
狀態或資料
如果長度 == 1 ==> 1 位元組狀態碼
#define GUI_OK 0x41 #define GUI_RAIDSET_NOT_NORMAL 0x42 #define GUI_VOLUMESET_NOT_NORMAL 0x43 #define GUI_NO_RAIDSET 0x44 #define GUI_NO_VOLUMESET 0x45 #define GUI_NO_PHYSICAL_DRIVE 0x46 #define GUI_PARAMETER_ERROR 0x47 #define GUI_UNSUPPORTED_COMMAND 0x48 #define GUI_DISK_CONFIG_CHANGED 0x49 #define GUI_INVALID_PASSWORD 0x4a #define GUI_NO_DISK_SPACE 0x4b #define GUI_CHECKSUM_ERROR 0x4c #define GUI_PASSWORD_REQUIRED 0x4d
如果長度 > 1
從控制器返回的資料塊,其內容取決於命令程式碼
校驗和,長度和狀態或資料位元組的校驗和