Interprocessor (51-51d) protocol FAQ
The 51d program running on the 7312 and the Winbond '51 chip communicate over /dev/ttyS1 at 115200 bps.
Here is what we know so far about the communications protocol:
Last byte of multi-byte strings is a checksum that appears to be calculated by (0xff - (all bytes before checksum added together) + 0x01) workable code:
unsigned char calcsum(int bytec, char bytes[]) { unsigned char sum=0; int i; for (i=0;i<bytec;i++) { sum = (sum+bytes[i])&0xff; } return (0xff-sum+1); }
Obtained from strace at http://downloads.phathack.com/sbingner/strace-51d.log
Definitions
#define TEXT_DISK 0x00 #define TEXT_TRACK 0x01 #define SSA_MODE_NORMAL 0x00 #define SSA_MODE_ARTIST 0x01 #define SSA_MODE_GENRE 0x02 #define SSA_MODE_ALBUM 0x03 /* Codes sent from 51d to 8051 */ #define _51D_INIT 0x10 /* 4Bytes */ #define PLAYING_TRACK 0x48 /* 4Bytes: Track(2) + Disk(2) */ #define ASCII_FOLLOWS 0x50 /* 14Bytes: Type(1) + PacketNum(1) + ASCII(12) */ #define PONG 0x70 /* 0Bytes */ #define TRACKS 0x7C /* 4Bytes: Track(2) + Disk(2) */ #define DISKS 0x7D /* 2Bytes: Disks(2) */ #define FIRMWARE_UPLOAD 0xA3 /* 8Bytes: DATA */ /* Codes sent from 8051 to 51d */ #define SESINFO 0x11 /* 4Bytes: SSAMode(1) + RunType(1) + Lot(2) */ #define REQ_SETTINGS 0x12 #define CUR_SETTINGS 0x13 /* Not sure what this does or syntax */ #define UCID 0x14 #define PLUGIN_SET 0x15 /* 2Bytes: PWid(1) + Activate(1) */ #define REQ_TOT_TRK 0x20 /* 2Bytes: Disk(2) */ #define Q_TOT_DSK 0x21 /* 0Bytes */ #define Q_TRACK_LEN 0x22 #define PLAY 0x30 /* 6Bytes: Track(2) + Disk(2) + Offset(2) */ #define STOP 0x32 /* 0Bytes */ #define REPEAT_TRK 0x33 /* 0Bytes */ #define REPEAT_DSK 0x34 /* 0Bytes */ #define REPEAT_OFF 0x35 /* 0Bytes */ #define BEGIN_SEEK 0x36 /* 1Byte */ #define END_SEEK 0x37 #define GET_AUDIOID 0x38 /* 4Bytes: Track(2) + Disk(2) */ #define MARK_TRACK 0x39 #define RAND_ON 0x40 /* 5Bytes: ?0x0b?(1) + Track?(2) + Disk?(2) */ #define MAG_RAND_ON 0x41 /* 5Bytes: ?0x76?(1) + Track?(2) + Disk?(2) */ #define RAND_PRESS 0x43 #define MAG_RAND_PRESS 0x44 #define RAND_FORWARD 0x45 /* 0Bytes */ #define RAND_REVERSE 0x46 /* 0Bytes */ #define RAND_OFF 0x47 /* 0Bytes */ #define REQ_TRACK_NAME 0x56 /* 4Bytes: Track(2) + Disk(2) */ #define REQ_DISK_NAME 0x57 /* 2Bytes: Disk(2) */ #define STANDBY 0x60 #define SHUTDOWN 0x61 /* 0Bytes */ #define HDD_WAKEUP 0x62 #define PROG_PLD 0x63 #define PLAY_LOOPFILE 0x64 #define SYNC_REQ 0x65 #define PING 0x66 /* 0Bytes */ #define REQ_REBOOT_UC 0x67 #define UTIL_INFO 0x71 #define UTIL_HALTED 0x72 #define CUR_TEMP 0x73 #define INF_8051_REBOOTING 0x78 #define UNMUTE_DAC 0x80 #define SSA_PLAY_MODE 0x90 /* 1Byte: 0=Normal, 1=Artists, 2=Genres, 3=Albums */ #define ENTER_FEATURE 0x91 #define SEL_MENU_ITEM 0x93 #define MENU_DESCEND 0x94 #define MENU_ASCEND 0x95 #define REQ_FIRMWARE 0xA0 #define REQ_BOOT_FIRMWARE 0xA1 #define REQ_TEST_FIRMWARE 0xA2 #define INF_ARM_BOOTOK 0xB0 #define INF_51_BOOTOK 0xB1 #define INF_ERASE_OK 0xB2 #define INF_51_PROGED_OK 0xB3 #define INF_STATUS_RESULT 0xB5 #define SMALL_TRANS_PACK 0xC0 #define MED_TRANS_PACK 0xC2 #define LRG_TRANS_PACKET 0xC3 #define OLD_UTIL_INFO 0xE0 #define OLD_UTIL_HALTED 0xE1 #define UC_DEBUG 0xE2 #define OLD_REQ_FIRMWARE 0xF3 #define OLD_REQ_BOOT_FIRMWARE 0xF5 #define OLD_PROG_PLD 0xFB /* Used globally */ #define HEADER_ACK 0xAC #define BLOCK_ACK 0xBD #define PACKET_ACK 0xCE #define ERROR_DATA 0xFE #define ERROR 0xFF
Protocol Examples
ASCII Text is sent 12 Bytes at a time, in multiple 'packets'
7312 | 8052 | Possible Meaning |
---|---|---|
0xf9 | ?? | |
0x53 | ?? | |
0x10 | ?? | |
0x21,0xdf | Query total disc | |
0xce | ACK | |
0x7d | Total Disks follows | |
0xac | OK, Continue | |
0x00 | First byte | |
0xbd | Continue | |
0x0f | Second Byte (total 15 disks) | |
0xbd | Continue | |
0x74 | End of Stream | |
0xce | ACK | |
0x20,0x00,0x01,0xdf | Query total tracks in disc 1 (0x00, 0x01) | |
0xce | ACK | |
0x7c | Total tracks follows | |
0xac | OK, Continue | |
0x00 | First byte of total tracks | |
0xbd | Continue | |
0x01 | Second Byte of total tracks (1 track in disk 1) | |
0xbd | Continue | |
0x00 | First byte of disknum | |
0xbd | Continue | |
0x01 | Second Byte of disknum | |
0xbd | Continue | |
0x82 | End of Stream | |
0xce | ACK | |
0x30 0x00 0x01 0x00 0x02 0x00 0x00 0xcd | Play Disk 2 Track 1 Offset 0 | |
0xce | ACK | |
0x57,0x00,0x02,0xa7 | Name of disk 2? (Answering "PLY2: Alternative") | |
0xce | ACK | |
0x50 | ACSII Follows | |
0xac | OK, Continue | |
0x00 | Type of Text (0x00 = Disk Name) | |
0xbd | Continue | |
0x00 | Packet Number | |
0xbd | Continue | |
P | ASCII Text | |
0xbd | Continue | |
Above 2 lines repeats for each of the letters 'LY2: Altern' | ||
0xc9 | Checksum? | |
0xce | ACK | |
0x50 | ACSII Follows | |
0xac | OK, Continue | |
0x00 | Type of Text (0x00 = Disk Name) | |
0xbd | Continue | |
0x01 | Packet Number | |
0xbd | Continue | |
a | ASCII Text | |
0xbd | Continue | |
Above 2 lines repeats for each of the letters 'tive' | ||
0x00 | NULL | |
0xbd | Continue | |
Above 2 lines repeat 6 more times | ||
0x96 | Checksum? | |
0xce | ACK | |
0x56,0x00,0x01,0x00,0x02,0xa7 | Name of disk 2, track 1? (returning "3 Doors Down - ") | |
0xce | ACK | |
0x50 | ACSII Follows | |
0xac | OK, Continue | |
0x01 | Type of Text (0x01 = Track Name) | |
0xbd | Continue | |
0x00 | Packet Number | |
0xbd | Continue | |
3 | ASCII Text | |
0xbd | Continue | |
Above 2 lines repeats for each of the letters ' Doors Down' | ||
0x9d | Checksum? | |
0xce | ACK | |
0x50 | ACSII Follows | |
0xac | OK, Continue | |
0x01 | Type of Text (0x01 = Track Name) | |
0xbd | Continue | |
0x01 | Packet Number | |
0xbd | Continue | |
0x20 | ASCII Text (space) | |
0xbd | Continue | |
Above 2 lines repeats for each of the letters ' - Duck And ' | ||
0x67 | Checksum? | |
0xce | ACK | |
0x50 | ACSII Follows | |
0xac | OK, Continue | |
0x01 | Type of Text (0x01 = Track Name) | |
0xbd | Continue | |
0x02 | Packet Number | |
0xbd | Continue | |
R | ASCII Text | |
0xbd | Continue | |
Above 2 lines repeats for each of the letters 'Run (Live)' | ||
0x00 | NULL | |
0xbd | Continue | |
0x00 | NULL | |
0xbd | Continue | |
0x77 | Checksum? | |
0xce | ACK | |
0x66, 0x9a | 8052 PING | |
0xce | ACK | |
0x70 | 51d PONG | |
0xac | ACK, Continue | |
0x90 | Checksum | |
0xce | ACK | |
- Heartbeat:
If the Winbond chip does not see a "heartbeat" signal every 10 seconds, it will kill power to the 7312 and reboot it. It's a two-part sequence:
7312 > 0x70 0xAC < 51 > 0x90 0xCE < 51
Must repeat within 10 seconds, or the Winbond chip will output 0x66,0x9A 3 times and reboot.