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 字节缓冲区

第 1 个 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. 消息 1 输出 - 诊断状态代码 (????)

9. 消息 0 消息代码

0x00

NOP

0x01

获取配置 ->偏移量 0xa00:用于出站消息代码 message_rwbuffer (IOP331 发送到驱动程序)

签名

0x87974060(4)

请求长度

0x00000200(4)

队列数量

0x00000100(4)

SDRAM 大小

0x00000100(4)-->256 MB

IDE 通道

0x00000008(4)

供应商

40 字节字符

型号

8 字节字符

固件版本

16 字节字符

设备映射

16 字节字符

固件版本

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. 第 1 个字节

    命令块长度(低字节)

  2. 第 2 个字节

    命令块长度(高字节)

    注意

    命令块长度不应 > 2040 字节,长度不包括这两个字节

  3. 第 3 个字节

    命令代码

  4. 第 4 个字节及后续字节

    可变长度的数据字节

    取决于命令代码

  5. 最后一个字节:校验和字节(从第 1 个字节到最后一个数据字节的总和)

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 第 1 个 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

风扇数量(例如 2)

字节 4

电压传感器数量(例如 3)

字节 5

温度传感器数量(例如 2)

字节 6

电源数量

字节 7/8

风扇 #0 (RPM)

字节 9/10

风扇 #1

字节 11/12

电压 #0 原始值,单位为 *1000

字节 13/14

电压 #0 值

字节 15/16

电压 #1 原始值

字节 17/18

电压 #1

字节 19/20

电压 #2 原始值

字节 21/22

电压 #2

字节 23

温度 #0

字节 24

温度 #1

字节 25

电源指示灯(bit0 电源#0,bit1 电源#1)

字节 26

UPS 指示灯

GUI_QUICK_CREATE

快速创建 RAID/卷集

字节 0,1

长度

字节 2

命令代码 0x20

字节 3/4/5/6

原始容量

字节 7

RAID 级别

字节 8

条带大小

字节 9

备用

字节 10/11/12/13

设备掩码(用于创建 RAID/卷的设备)

此功能已删除,应用程序喜欢实现快速创建功能

需要使用 GUI_CREATE_RAIDSET 和 GUI_CREATE_VOLUMESET 功能。

GUI_GET_INFO_R

获取 RAID 集信息

字节 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

获取卷集信息

字节 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 为 异步/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 为 异步/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:选择 Flash,1:不选择 Flash)

字节 4/5/6/7

要刷写的 IDE 设备掩码 .. 注意:: 无响应数据可用

GUI_CREATE_RAIDSET

创建 RAID 集

字节 0,1

长度

字节 2

命令代码 0x50

字节 3/4/5/6

设备掩码

字节 7-22

RAID 集名称(如果字节 7 == 0:使用默认值)

GUI_DELETE_RAIDSET

删除 RAID 集

字节 0,1

长度

字节 2

命令代码 0x51

字节 3

raidset#

GUI_EXPAND_RAIDSET

扩展 RAID 集

字节 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

对 RAID 集中的每个卷重复

GUI_ACTIVATE_RAIDSET

激活未完成的 RAID 集

字节 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

创建卷集

字节 0,1

长度

字节 2

命令代码 0x60

字节 3

raidset#

字节 4-19

卷集名称(如果字节 4 == 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->SCSI 为异步/20/40/80/160)(IDE 为 0/1/2/3/4->33/66/100/133/150)

字节 36

1 选择快速初始化

GUI_MODIFY_VOLUME

修改卷集

字节 0,1

长度

字节 2

命令代码 0x61

字节 3

volumeset#

字节 4-19

新的卷集名称(如果字节 4 == 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->SCSI 为异步/20/40/80/160)(IDE 为 0/1/2/3/4->33/66/100/133/150)

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