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 - 从控制器返回的数据块,其内容取决于命令代码 
 
- 校验和,长度和状态或数据字节的校验和