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. 校验和,长度和状态或数据字节的校验和