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 傳送到驅動程式)

簽名

0x87974060(4)

請求長度

0x00000200(4)

佇列數量

0x00000100(4)

SDRAM 大小

0x00000100(4)-->256 MB

IDE 通道

0x00000008(4)

供應商

40 位元組字元

型號

8 位元組字元

FirmVer

16 位元組字元

裝置對映

16 位元組字元

FirmwareVersion

DWORD

  • 新增用於檢查新韌體功能

0x02

設定配置 -> 偏移量 0xa00:用於入站訊息程式碼 message_rwbuffer(驅動程式傳送到 IOP331)

簽名

0x87974063(4)

請求幀的 UPPER32

(4)-->僅驅動程式

0x03

復位(中止所有排隊的命令)

0x04

停止後臺活動

0x05

重新整理快取

0x06

啟動後臺活動(如果後臺已停止,則重新啟動)

0x07

檢查主機命令是否掛起(Novell 可能需要此功能)

0x08

設定控制器時間 -> 偏移量 0xa00 用於入站訊息程式碼 message_rwbuffer(驅動程式到 IOP331)

位元組 0

0xaa <-- 簽名

位元組 1

0x55 <-- 簽名

位元組 2

年 (04)

位元組 3

月 (1..12)

位元組 4

日 (1..31)

位元組 5

小時 (0..23)

位元組 6

分鐘 (0..59)

位元組 7

秒 (0..59)

Areca Raid 控制器的 RS-232 介面

低階命令介面與 VT100 終端互斥

1. 命令執行順序

  1. 標頭

    3 位元組序列 (0x5E, 0x01, 0x61)

  2. 命令塊

    可變長度的資料,包括長度、命令程式碼、資料和校驗和位元組

  3. 返回資料

    可變長度的資料

2. 命令塊

  1. 第一個位元組

    命令塊長度(低位元組)

  2. 第二個位元組

    命令塊長度(高位元組)

    注意

    命令塊長度不應 > 2040 位元組,長度不包括這兩個位元組

  3. 第三個位元組

    命令程式碼

  4. 第四個和後續位元組

    可變長度的資料位元組

    取決於命令程式碼

  5. 最後一個位元組校驗和位元組(從第一個位元組到最後一個數據位元組的總和)

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. 返回資料

  1. Header 3 位元組序列 (0x5E, 0x01, 0x61)

  2. 長度 2 位元組 (低位元組在前,不包含長度和校驗和位元組)

  3. 狀態或資料

    1. 如果長度 == 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
      
    2. 如果長度 > 1

      從控制器返回的資料塊,其內容取決於命令程式碼

  1. 校驗和,長度和狀態或資料位元組的校驗和