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 发送到驱动程序)
|
||||||||||||||||||||
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. 命令块¶
- 第 1 个字节
命令块长度(低字节)
- 第 2 个字节
命令块长度(高字节)
注意
命令块长度不应 > 2040 字节,长度不包括这两个字节
- 第 3 个字节
命令代码
- 第 4 个字节及后续字节
可变长度的数据字节
取决于命令代码
最后一个字节:校验和字节(从第 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. 返回的数据¶
头部 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
从控制器返回的数据块,其内容取决于命令代码
校验和长度和状态或数据字节的校验和