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

#define 51D_INIT 0x10              /* 4Bytes */
#define 8051_INIT 0x11             /* 4Bytes: SSAMode(1) + RunType(1) + Lot(2) */
#define 51D_REINIT 0x13            /* Not sure what this does or syntax */
#define ACTIVATE_PLUGIN 0x15       /* 2Bytes: PWid(1) + Activate(1) */
#define QUERY_NUM_DISKS 0x21       /* 0Bytes */
#define QUERY_NUM_TRACKS 0x20      /* 2Bytes: Disk(2) */
#define PLAY_TRACK 0x30            /* 6Bytes: Track(2) + Disk(2) + Offset(2) */
#define STOP 0x32                  /* 0Bytes */
#define REPEAT_TRACK 0x33          /* 0Bytes */
#define REPEAT_DISK 0x34           /* 0Bytes */
#define REPEAT_OFF 0x35            /* 0Bytes */
#define BEGIN_SEEK 0x36            /* 1Byte */
#define AUDIO_ID 0x38              /* 4Bytes: Track(2) + Disk(2) */
#define RANDOM_DISK 0x40           /* 5Bytes: ?0x0b?(1) + Track?(2) + Disk?(2) */
#define RANDOM_MAG 0x41            /* 5Bytes: ?0x76?(1) + Track?(2) + Disk?(2) */
#define RANDOM_NEXT 0x45           /* 0Bytes */
#define RANDOM_OFF 0x47            /* 0Bytes */
#define PLAYING_TRACK 0x48         /* 4Bytes: Track(2) + Disk(2) */
#define ASCII_FOLLOWS 0x50         /* 14Bytes: Type(1) + PacketNum(1) + ASCII(12) */
#define QUERY_TRACK_NAME 0x56      /* 4Bytes: Track(2) + Disk(2) */
#define QUERY_DISK_NAME 0x57       /* 2Bytes: Disk(2) */
#define SHUTDOWN 0x61              /* 0Bytes */
#define PING 0x66                  /* 0Bytes */
#define PONG 0x70                  /* 0Bytes */
#define SSA_PLAY_MODE 0x90         /* 1Byte: 0=Normal, 1=Artists, 2=Genres, 3=Albums */
#define TRACKS 0x7c                /* 4Bytes: Track(2) + Disk(2) */
#define DISKS 0x7d                 /* 2Bytes: Disks(2) */
#define FIRMWARE_UPLOAD 0xa3       /* 8Bytes: DATA */
#define REQ_FIRMWARE 0xa0
#define HEADER_ACK 0xac
#define BLOCK_ACK 0xbd
#define PACKET_ACK 0xce

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.