Interprocessor (51-51d) protocol FAQ

From PhatHack Wiki
Jump to navigation Jump to search


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
Initialization
0xf9 ??
 0x53??
0x10 ??
HU Query total disc
 0x21,0xdfQuery total disc
0xce ACK
0x7d Total Disks follows
 0xacOK, Continue
0x00 First byte
 0xbdContinue
0x0f Second Byte (total 15 disks)
 0xbdContinue
0x74 End of Stream
 0xceACK
HU Query total tracks
 0x20,0x00,0x01,0xdfQuery total tracks in disc 1 (0x00, 0x01)
0xce ACK
0x7c Total tracks follows
 0xacOK, Continue
0x00 First byte of total tracks
 0xbdContinue
0x01 Second Byte of total tracks (1 track in disk 1)
 0xbdContinue
0x00 First byte of disknum
 0xbdContinue
0x01 Second Byte of disknum
 0xbdContinue
0x82 End of Stream
 0xceACK
Direct play track
 0x30 0x00 0x01 0x00 0x02 0x00 0x00 0xcdPlay Disk 2 Track 1 Offset 0
0xce ACK
HU ? Name of Disk
 0x57,0x00,0x02,0xa7Name of disk 2? (Answering "PLY2: Alternative")
0xce ACK
0x50 ACSII Follows
 0xacOK, Continue
0x00 Type of Text (0x00 = Disk Name)
 0xbdContinue
0x00 Packet Number
 0xbdContinue
P ASCII Text
 0xbdContinue
Above 2 lines repeats for each of the letters 'LY2: Altern'
0xc9 Checksum?
 0xceACK
0x50 ACSII Follows
 0xacOK, Continue
0x00 Type of Text (0x00 = Disk Name)
 0xbdContinue
0x01 Packet Number
 0xbdContinue
a ASCII Text
 0xbdContinue
Above 2 lines repeats for each of the letters 'tive'
0x00 NULL
 0xbdContinue
Above 2 lines repeat 6 more times
0x96 Checksum?
 0xceACK
HU ? Name of Track
 0x56,0x00,0x01,0x00,0x02,0xa7Name of disk 2, track 1? (returning "3 Doors Down - ")
0xce ACK
0x50 ACSII Follows
 0xacOK, Continue
0x01 Type of Text (0x01 = Track Name)
 0xbdContinue
0x00 Packet Number
 0xbdContinue
3 ASCII Text
 0xbdContinue
Above 2 lines repeats for each of the letters ' Doors Down'
0x9d Checksum?
 0xceACK
0x50 ACSII Follows
 0xacOK, Continue
0x01 Type of Text (0x01 = Track Name)
 0xbdContinue
0x01 Packet Number
 0xbdContinue
0x20 ASCII Text (space)
 0xbdContinue
Above 2 lines repeats for each of the letters ' - Duck And '
0x67 Checksum?
 0xceACK
0x50 ACSII Follows
 0xacOK, Continue
0x01 Type of Text (0x01 = Track Name)
 0xbdContinue
0x02 Packet Number
 0xbdContinue
R ASCII Text
 0xbdContinue
Above 2 lines repeats for each of the letters 'Run (Live)'
0x00 NULL
 0xbdContinue
0x00 NULL
 0xbdContinue
0x77 Checksum?
 0xceACK
8052 Ping Request
 0x66, 0x9a8052 PING
0xce ACK
0x70 51d PONG
 0xacACK, Continue
0x90 Checksum
 0xceACK
   
  • 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.