diff options
Diffstat (limited to 'Documentation/scsi/arcmsr_spec.rst')
-rw-r--r-- | Documentation/scsi/arcmsr_spec.rst | 907 |
1 files changed, 907 insertions, 0 deletions
diff --git a/Documentation/scsi/arcmsr_spec.rst b/Documentation/scsi/arcmsr_spec.rst new file mode 100644 index 000000000000..83dd53bcff78 --- /dev/null +++ b/Documentation/scsi/arcmsr_spec.rst @@ -0,0 +1,907 @@ +ARECA FIRMWARE SPEC +=================== + +Usage of IOP331 adapter +======================= + +(All In/Out is in IOP331's view) + +1. Message 0 +------------ + +- InitThread message and return code + +2. Doorbell is used for RS-232 emulation +---------------------------------------- + +inDoorBell + bit0 + data in ready + zDRIVER DATA WRITE OK) + bit1 + data out has been read + (DRIVER DATA READ OK) + +outDooeBell: + bit0 + data out ready + (IOP331 DATA WRITE OK) + bit1 + data in has been read + (IOP331 DATA READ OK) + +3. Index Memory Usage +--------------------- + +============ ========================================== +offset 0xf00 for RS232 out (request buffer) +offset 0xe00 for RS232 in (scratch buffer) +offset 0xa00 for inbound message code message_rwbuffer + (driver send to IOP331) +offset 0xa00 for outbound message code message_rwbuffer + (IOP331 send to driver) +============ ========================================== + +4. RS-232 emulation +------------------- + +Currently 128 byte buffer is used: + +============ ===================== +1st uint32_t Data length (1--124) +Byte 4--127 Max 124 bytes of data +============ ===================== + +5. PostQ +-------- + +All SCSI Command must be sent through postQ: + + (inbound queue port) + Request frame must be 32 bytes aligned: + + #bit27--bit31 + flag for post ccb + #bit0--bit26 + real address (bit27--bit31) of post arcmsr_cdb + + ===== =================== + bit31 == =============== + 0 256 bytes frame + 1 512 bytes frame + == =============== + bit30 == ============== + 0 normal request + 1 BIOS request + == ============== + bit29 reserved + bit28 reserved + bit27 reserved + ===== =================== + + (outbount queue port) + Request reply: + + #bit27--bit31 + flag for reply + #bit0--bit26 + real address (bit27--bit31) of reply arcmsr_cdb + + ===== ======================================================= + bit31 must be 0 (for this type of reply) + bit30 reserved for BIOS handshake + bit29 reserved + bit28 == =================================================== + 0 no error, ignore AdapStatus/DevStatus/SenseData + 1 Error, error code in AdapStatus/DevStatus/SenseData + == =================================================== + bit27 reserved + ===== ======================================================= + +6. BIOS request +--------------- + +All BIOS request is the same with request from PostQ + +Except: + +Request frame is sent from configuration space: + + ============ ========================== + offset: 0x78 Request Frame (bit30 == 1) + offset: 0x18 writeonly to generate + IRQ to IOP331 + ============ ========================== + +Completion of request:: + + (bit30 == 0, bit28==err flag) + +7. Definition of SGL entry (structure) +-------------------------------------- + +8. Message1 Out - Diag Status Code (????) +----------------------------------------- + +9. Message0 message code +------------------------ + +====== ================================================================= +0x00 NOP +0x01 Get Config + ->offset 0xa00 :for outbound message code message_rwbuffer + (IOP331 send to driver) + + ===================== ========================================== + Signature 0x87974060(4) + Request len 0x00000200(4) + numbers of queue 0x00000100(4) + SDRAM Size 0x00000100(4)-->256 MB + IDE Channels 0x00000008(4) + vendor 40 bytes char + model 8 bytes char + FirmVer 16 bytes char + Device Map 16 bytes char + FirmwareVersion DWORD + + - Added for checking of + new firmware capability + ===================== ========================================== +0x02 Set Config + ->offset 0xa00 :for inbound message code message_rwbuffer + (driver send to IOP331) + + ========================= ================== + Signature 0x87974063(4) + UPPER32 of Request Frame (4)-->Driver Only + ========================= ================== +0x03 Reset (Abort all queued Command) +0x04 Stop Background Activity +0x05 Flush Cache +0x06 Start Background Activity + (re-start if background is halted) +0x07 Check If Host Command Pending + (Novell May Need This Function) +0x08 Set controller time + ->offset 0xa00 for inbound message code message_rwbuffer + (driver to IOP331) + + ====== ================== + byte 0 0xaa <-- signature + byte 1 0x55 <-- signature + byte 2 year (04) + byte 3 month (1..12) + byte 4 date (1..31) + byte 5 hour (0..23) + byte 6 minute (0..59) + byte 7 second (0..59) + ====== ================== +====== ================================================================= + + +RS-232 Interface for Areca Raid Controller +========================================== + + The low level command interface is exclusive with VT100 terminal + +1. Sequence of command execution +-------------------------------- + + (A) Header + 3 bytes sequence (0x5E, 0x01, 0x61) + + (B) Command block + variable length of data including length, + command code, data and checksum byte + + (C) Return data + variable length of data + +2. Command block +---------------- + + (A) 1st byte + command block length (low byte) + + (B) 2nd byte + command block length (high byte) + + .. Note:: command block length shouldn't > 2040 bytes, + length excludes these two bytes + + (C) 3rd byte + command code + + (D) 4th and following bytes + variable length data bytes + + depends on command code + + (E) last byte + checksum byte (sum of 1st byte until last data byte) + +3. Command code and associated data +----------------------------------- + +The following are command code defined in raid controller Command +code 0x10--0x1? are used for system level management, +no password checking is needed and should be implemented in separate +well controlled utility and not for end user access. +Command code 0x20--0x?? always check the password, +password must be entered to enable these command:: + + 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 + }; + +Command description +^^^^^^^^^^^^^^^^^^^ + +GUI_SET_SERIAL + Set the controller serial# + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x10 + byte 3 password length (should be 0x0f) + byte 4-0x13 should be "ArEcATecHnoLogY" + byte 0x14--0x23 Serial number string (must be 16 bytes) + ================ ============================================= + +GUI_SET_VENDOR + Set vendor string for the controller + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x11 + byte 3 password length (should be 0x08) + byte 4-0x13 should be "ArEcAvAr" + byte 0x14--0x3B vendor string (must be 40 bytes) + ================ ============================================= + +GUI_SET_MODEL + Set the model name of the controller + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x12 + byte 3 password length (should be 0x08) + byte 4-0x13 should be "ArEcAvAr" + byte 0x14--0x1B model string (must be 8 bytes) + ================ ============================================= + +GUI_IDENTIFY + Identify device + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x13 + return "Areca RAID Subsystem " + ================ ============================================= + +GUI_CHECK_PASSWORD + Verify password + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x14 + byte 3 password length + byte 4-0x?? user password to be checked + ================ ============================================= + +GUI_LOGOUT + Logout GUI (force password checking on next command) + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x15 + ================ ============================================= + +GUI_HTTP + HTTP interface (reserved for Http proxy service)(0x16) + +GUI_SET_ETHERNET_ADDR + Set the ethernet MAC address + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x17 + byte 3 password length (should be 0x08) + byte 4-0x13 should be "ArEcAvAr" + byte 0x14--0x19 Ethernet MAC address (must be 6 bytes) + ================ ============================================= + +GUI_SET_LOGO + Set logo in HTTP + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x18 + byte 3 Page# (0/1/2/3) (0xff --> clear OEM logo) + byte 4/5/6/7 0x55/0xaa/0xa5/0x5a + byte 8 TITLE.JPG data (each page must be 2000 bytes) + + .. Note:: page0 1st 2 byte must be + actual length of the JPG file + ================ ============================================= + +GUI_POLL_EVENT + Poll If Event Log Changed + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x19 + ================ ============================================= + +GUI_GET_EVENT + Read Event + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x1a + byte 3 Event Page (0:1st page/1/2/3:last page) + ================ ============================================= + +GUI_GET_HW_MONITOR + Get HW monitor data + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x1b + byte 3 # of FANs(example 2) + byte 4 # of Voltage sensor(example 3) + byte 5 # of temperature sensor(example 2) + byte 6 # of power + byte 7/8 Fan#0 (RPM) + byte 9/10 Fan#1 + byte 11/12 Voltage#0 original value in ``*1000`` + byte 13/14 Voltage#0 value + byte 15/16 Voltage#1 org + byte 17/18 Voltage#1 + byte 19/20 Voltage#2 org + byte 21/22 Voltage#2 + byte 23 Temp#0 + byte 24 Temp#1 + byte 25 Power indicator (bit0 power#0, + bit1 power#1) + byte 26 UPS indicator + ================ ============================================= + +GUI_QUICK_CREATE + Quick create raid/volume set + + ================ ============================================== + byte 0,1 length + byte 2 command code 0x20 + byte 3/4/5/6 raw capacity + byte 7 raid level + byte 8 stripe size + byte 9 spare + byte 10/11/12/13 device mask (the devices to create raid/volume) + ================ ============================================== + + This function is removed, application like + to implement quick create function + + need to use GUI_CREATE_RAIDSET and GUI_CREATE_VOLUMESET function. + +GUI_GET_INFO_R + Get Raid Set Information + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x20 + byte 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 + Get Volume Set Information + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x21 + byte 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 + Get Physical Drive Information + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x22 + byte 3 drive # (from 0 to max-channels - 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 + Get System Information + + ================ ============================================= + byte 0,1 length + byte 2 command code 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 + Clear System Event + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x24 + ================ ============================================= + +GUI_MUTE_BEEPER + Mute current beeper + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x30 + ================ ============================================= +GUI_BEEPER_SETTING + Disable beeper + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x31 + byte 3 0->disable, 1->enable + ================ ============================================= + +GUI_SET_PASSWORD + Change password + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x32 + byte 3 pass word length ( must <= 15 ) + byte 4 password (must be alpha-numerical) + ================ ============================================= + +GUI_HOST_INTERFACE_MODE + Set host interface mode + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x33 + byte 3 0->Independent, 1->cluster + ================ ============================================= + +GUI_REBUILD_PRIORITY + Set rebuild priority + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x34 + byte 3 0/1/2/3 (low->high) + ================ ============================================= + +GUI_MAX_ATA_MODE + Set maximum ATA mode to be used + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x35 + byte 3 0/1/2/3 (133/100/66/33) + ================ ============================================= + +GUI_RESET_CONTROLLER + Reset Controller + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x36 + * Response with VT100 screen (discard it) + ================ ============================================= + +GUI_COM_PORT_SETTING + COM port setting + + ================ ================================================= + byte 0,1 length + byte 2 command code 0x37 + byte 3 0->COMA (term port), + 1->COMB (debug port) + byte 4 0/1/2/3/4/5/6/7 + (1200/2400/4800/9600/19200/38400/57600/115200) + byte 5 data bit + (0:7 bit, 1:8 bit must be 8 bit) + byte 6 stop bit (0:1, 1:2 stop bits) + byte 7 parity (0:none, 1:off, 2:even) + byte 8 flow control + (0:none, 1:xon/xoff, 2:hardware => must use none) + ================ ================================================= + +GUI_NO_OPERATION + No operation + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x38 + ================ ============================================= + +GUI_DHCP_IP + Set DHCP option and local IP address + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x39 + byte 3 0:dhcp disabled, 1:dhcp enabled + byte 4/5/6/7 IP address + ================ ============================================= + +GUI_CREATE_PASS_THROUGH + Create pass through disk + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x40 + byte 3 device # + byte 4 scsi channel (0/1) + byte 5 scsi id (0-->15) + byte 6 scsi lun (0-->7) + byte 7 tagged queue (1 enabled) + byte 8 cache mode (1 enabled) + byte 9 max speed (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_MODIFY_PASS_THROUGH + Modify pass through disk + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x41 + byte 3 device # + byte 4 scsi channel (0/1) + byte 5 scsi id (0-->15) + byte 6 scsi lun (0-->7) + byte 7 tagged queue (1 enabled) + byte 8 cache mode (1 enabled) + byte 9 max speed (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_PASS_THROUGH + Delete pass through disk + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x42 + byte 3 device# to be deleted + ================ ============================================= +GUI_IDENTIFY_DEVICE + Identify Device + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x43 + byte 3 Flash Method + (0:flash selected, 1:flash not selected) + byte 4/5/6/7 IDE device mask to be flashed + .. Note:: no response data available + ================ ============================================= + +GUI_CREATE_RAIDSET + Create Raid Set + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x50 + byte 3/4/5/6 device mask + byte 7-22 raidset name (if byte 7 == 0:use default) + ================ ============================================= + +GUI_DELETE_RAIDSET + Delete Raid Set + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x51 + byte 3 raidset# + ================ ============================================= + +GUI_EXPAND_RAIDSET + Expand Raid Set + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x52 + byte 3 raidset# + byte 4/5/6/7 device mask for expansion + byte 8/9/10 (8:0 no change, 1 change, 0xff:terminate, + 9:new raid level, + 10:new stripe size + 0/1/2/3/4/5->4/8/16/32/64/128K ) + byte 11/12/13 repeat for each volume in the raidset + ================ ============================================= + +GUI_ACTIVATE_RAIDSET + Activate incomplete raid set + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x53 + byte 3 raidset# + ================ ============================================= + +GUI_CREATE_HOT_SPARE + Create hot spare disk + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x54 + byte 3/4/5/6 device mask for hot spare creation + ================ ============================================= + +GUI_DELETE_HOT_SPARE + Delete hot spare disk + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x55 + byte 3/4/5/6 device mask for hot spare deletion + ================ ============================================= + +GUI_CREATE_VOLUME + Create volume set + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x60 + byte 3 raidset# + byte 4-19 volume set name + (if byte4 == 0, use default) + byte 20-27 volume capacity (blocks) + byte 28 raid level + byte 29 stripe size + (0/1/2/3/4/5->4/8/16/32/64/128K) + byte 30 channel + byte 31 ID + byte 32 LUN + byte 33 1 enable tag + byte 34 1 enable cache + byte 35 speed + (0/1/2/3/4->async/20/40/80/160 for scsi) + (0/1/2/3/4->33/66/100/133/150 for IDE ) + byte 36 1 to select quick init + ================ ============================================= + +GUI_MODIFY_VOLUME + Modify volume Set + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x61 + byte 3 volumeset# + byte 4-19 new volume set name + (if byte4 == 0, not change) + byte 20-27 new volume capacity (reserved) + byte 28 new raid level + byte 29 new stripe size + (0/1/2/3/4/5->4/8/16/32/64/128K) + byte 30 new channel + byte 31 new ID + byte 32 new LUN + byte 33 1 enable tag + byte 34 1 enable cache + byte 35 speed + (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 + Delete volume set + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x62 + byte 3 volumeset# + ================ ============================================= + +GUI_START_CHECK_VOLUME + Start volume consistency check + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x63 + byte 3 volumeset# + ================ ============================================= + +GUI_STOP_CHECK_VOLUME + Stop volume consistency check + + ================ ============================================= + byte 0,1 length + byte 2 command code 0x64 + ================ ============================================= + +4. Returned data +---------------- + +(A) Header + 3 bytes sequence (0x5E, 0x01, 0x61) +(B) Length + 2 bytes + (low byte 1st, excludes length and checksum byte) +(C) + status or data: + + 1) If length == 1 ==> 1 byte status code:: + + #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) If length > 1: + + data block returned from controller + and the contents depends on the command code + +(E) Checksum + checksum of length and status or data byte + |