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