wiki:Device/PRS505/SubCPU
Serial port settings:
// CRTSCTS: Enable hardware flow control
// B38400:  38400 baud
// CLOCAL:  Local line - do not change "owner" of port
// PARENB:  Enable parity bit
// CREAD:   Enable receiver
// CS8:     8 data bits
termios_new.c_cflag = CRTSCTS|B38400|CLOCAL|PARENB|CREAD|CS8;
// INPCK: Enable parity check
// IGNPAR: Ignore parity errors
termios_new.c_iflag = INPCK|IGNPAR;



struct SubcpuCommand
{
  _BYTE opcode;
  _BYTE byte1;
  _BYTE byte2;
  _BYTE byte3;
  _BYTE cksum;
};

all opcodes have high bit set (0x80)
cksum = 255 - opcode;


Opcodes. hs = host to subcpu, sh = subcpu to host

  A2 [hs,sh]: receive ack
  A3 [hs,sh]: receive nack

  B1 [sh]: Key Code
    byte1: hw key code
    byte2: 0x2B == key down(?)
  
  B2 [sh]: Key JOG
    (byte1&1) ? JOG DOWN : JOG UP
    nTimes = byte2 & 7

  B3 [sh]: Key Status
    byte1: keydownstatus
    byte2: bit0 ?

  B4 [sh]: battery level
    level = byte2 & 0x1F 
      23..31: 100%
      18..22: 74%
      13..17: 50%
       7..12: 25%
       3.. 6: 1%
       0.. 2: 0%
    byte1 & 3:
      0 = Inner Litium
      1 = Alkali
      2 = Extra Litium

  B5, B6, B7 [hs]: request battery level

  BA [hs]: LED settings
    byte1 = 0x30
    byte2 = 0x40
      bits 4..3:
        0 = LED_ON
        1 = LED_OFF
        2 = LED_FLASH
        3 = LED_MOMENT_ON
      bits 0..2:
        0 = SPEED_5HZ
        1 = SPEED_2HZ
        2 = SPEED_1HZ
        7 = SPEED_1ON4OFF

  BB [hs]: set blue LED
    byte1 = on ? 0x31 : 0x30
  
  BC [hs]: LED ON

  C0 [hs]: request date
  C1 [hs]: request time
  C2     : date info
    [sh]
    year = byte1 + 100;
    month = byte2 & 0xF;
    mday = byte3 & 0x1F;
    [hs]
    byte1 = year - 100
    byte2 = month + 1;
    byte3 = mday | 0x40
  C3     : time info
    [sh]
    hour = byte1 & 0x1F;
    min =  byte2 & 0x3F;
    sec =  byte3 & 0x3F;
    [hs]
    byte1 = hour | 0x40
    byte2 = min  | 0x40
    byte3 = sec  | 0x40

  D0 [sh]: Receive Battery Status
    byte1 & 3:
      0 = CHG_COMPLETE
      1 = CHG_NOW
      2 = CHG_TROUBLE
      3 = BAT_TROUBLE
    (byte1 & 0xCu) >> 2:
      0 = IN_LITHIUM_BAT
      1 = ALKALI_BAT
      2 = AC_ADAPTOR
      3 = EXT_LITHIUM_BAT
    byte2 & 1 ? EXTRA LITHIUM CHG_NOW : EXTRA LITHIUM CHG_COMPLETE
    byte2 & 2 ? EXTRA LITHIUM EXIST : NO EXTRA LITHIUM
    byte2 & 4 ? EXTRA LITIUM AVAILABLE : EXTRA LITIUM NOT AVAILABLE
    byte2 & 8 ? ALKALI BAT AVAILABLE : ALKALI BAT NOT AVAILABLE
    byte2 & 0x10 ? IN LITHIUM AVAILABLE : IN LITHIUM NOT AVAILABLE

    
  D1 [hs]: request battery status

  D2 [sh]: HOST Shutdown Request
  D4 [sh]: HOST Sleep Request
    systemstate = 3
    send D6
  D5 [sh]: HOST Resume Request
    systemstate = 1
  D6 [hs]: go to sleep?
  
  D7 [hs]: initialize?
  D8 [hs]: USB??


hw->sw key map (B1)
    0x00, 0x26  
    0x01, 0x21  
    0x03, 0x42  
    0x02, 0x30  
    0x04, 0x31  
    0x05, 0x32  
    0x06, 0x41  
    0x07, 0x40  
    0x10, 0x72
    0x11, 0x43
    0x12, 0x73
    0x13, 0x44
    0x14, 0x74
    0x15, 0x45
    0x16, 0x75
    0x17, 0x46
    0x20, 0x25  
    0x21, 0x27  
    0x22, 0x23  
    0x23, 0x24  
    0x24, 0x47
    0x25, 0x76
    0x26, 0x71  
    0x27, 0x70  

librie hw codes:
  0x20: page UP (0xA8)
  0x21: page DOWN (0xA9)
  0x22: Q
  0x23: Z
  0x24: moji  (0x8B)
  0x25: space (henkan) (0x20)
  0x26: jisyo (0x8C)
  0x27: hondana  (0xA6)
  0x30: W
  0x31: E
  0x32: D
  0x33: S
  0x34: A
  0x35: C
  0x36: X
  0x37: kakudai (0x86)
  0x40: R
  0x41: T
  0x42: F
  0x43: V
  0x44: B
  0x45: jump (0x82)
  0x46: touroku (0x85)
  0x50: Y
  0x51: U
  0x52: G
  0x53: H
  0x54: N
  0x55: mae page(Right)  (0x82)
  0x56: tsugi page(Left) (0x81)
  0x60: I
  0x61: J
  0x62: K
  0x63: M
  0x64: -
  0x65: JOG Dial Push (0x0D)
  0x66: VOL- (0x8A)
  0x67: VOL+ (0x89)
  0x70: O
  0x71: P
  0x72: L
  0x73: */& (0x81)
  0x74: MENU (0x83)
  0x75: modoru (0x84)
  0x76: ENTER(kettei) (0x0D)