[ 
  PREAMBLE: this file comes from qvplay-0.95 that is available at 
  	http://www.asahi-net.or.jp/~XG2K-HYS/qvplay-0.95.tar.gz
  This copy is here for convenience to gphoto2 developers.
]
                                                              1998.07.20
                                                            ken-ichi HAYASHI
=============================================================================

                    QV-10 SERIAL COMMUNICATIONS PROTOCOL
                  
=============================================================================

    This document describes the serial communication protocol used by
    QV-10's "DIGITAL" connecter. This information is not official. 
    Rather, it is the result of individual analysis. Please.  Do *not* 
    contact CASIO to ask questions about this information. 
   
    You should read source code of 'qvplay' too.

=============================
S E R I A L   P R O T O C O L
=============================

    * 9600baud 8 bit stop bit 1 Non parity
    * No flow control
    * RTS off
    * CTS,DTR on

CASIO's QV-10 serial cable is a level converter. It converts RS-232C 
voltage levels to QV-10's voltage levels. This voltage converter circuit
uses the electrical power supplied by the host computer's RS-232C 
connector. (V+ is CTS, V- is RTS.) To recieve digital data from QV-10, 
set the CTS terminal to ON, RTS terminal to OFF. 

On power-up, QV-10 serial communication speed defaults to 9600baud.  This
speed may be changed with the'CB' command, described below. This change
remains in effect until power off or another 'CB' command.

-----
===========================
C O M M A N D   F O R M A T
===========================

Commands generally follow this format:
    0x05 0xXX 0xXX ... 0x06 (hex)
That is, a command flag (0x05, or ENQ) followed by command parameters,
followed by an ACK. (0x06).


======================
C O M M A N D  L I S T
======================

    above the line: data sent to QV-10
    ---------------------------------------
    below the line: data recieved from QV-10

ASCII code values are quoted.
All other values are hex.

RESET CAMERA
============

* Reset Camera #1

    05 'QR' 06
    ------------    Reset QV10.
      06  5c    

Comment:
  This command is acceptable, in all states.
  The meaning of 0x5c is checksum.
  Checksum value is reverse bits of all sum of command bytes and
  palameter bytes .
  ~('Q(51)' +  'R(52)') = 5c

* Reset Camera #2

    05 'QE' 06
    ------------    Reset QV10.
      06  69    

Comment:
  This command does not clear the QV10's LCD.    
  The meaning of 0x69 is checksum.


QUERY PICTURE NUMBER
====================

    05 'MP' 06
    -------------- Fetch number of pictures in QV10
      06  62  XX 

Comment:
    Number of pictures in QV10 returned at XX. 
    The meaning of 0x62 is checksum.


SHOW PICTURE #XX ON LCD
======================

    05 'DA' XX 06
    ---------------- Show picture on QV10's LCD. 
      06      YY 

Comment:
    Picture number is specified by XX.
    The return byte YY is checksum. (0x7a - XX )


GET PICTURE DATA IN JPEG FORMAT
===================================
    05 'DA' XX 06 05  'DL' 06 05 'MG' 06 12              06
    --------------------------------------------------------------------
     06      YY     06   6f     06  6b     [Picture Data] [Picture Data]

    06           06                    06
    -----------------------------......---------------- 
    [Picture Data] [Picture Data]        02 00 00 03 FC


Comment:
    XX is the picture number.
    The return byte YY is checksum. (0x7a - XX).
    Return byte 6f is checksum.
    Return byte 6b is checksum.
    02 00 00 03 FC should be end marker.
    If you want to get 'fine mode(640x480)' picture data in QV100,
    you must use 'Mg' instead of 'MG'.

FORMAT OF [Picture Data]
========================

    02 WW WW JJ JJ JJ JJ JJ ........ 17 SS

Comment:
 WW WW: Data Block Size (2 bytes):  (Normally 0x00 0x80, 128 bytes)
        The data preceeding the endmark(02 00 00 03 FC) is its 
        block size(under 0x00 0x80).
    JJ: Picture data. (Image Area of CAM format) 
        (Please refer to the CAM format information below).
    SS: Check sum.  Reverse bits of all sum of second byte (after 0x02) 
        of data block to before SS (0x17).

SEND JPEG FORMAT PICTURE DATA TO QV-10
======================================

    05 'MH' 06 [Picture Data] [Picture Data] 
    ------------------------------------------
      06  6a 12             06             06

    [Picture Data] [Picture Data]       02 00 00 03 FC
    ----------------------------......----------------
    06           06                   06

    05 'DJ' 06
    --------------
      06  ZZ


Comment:
    The return byte 6a is checksum.
    The return byte ZZ(normaly 06 ?) is unknown.
    [Picture Data] format is the same as above.
    The procedure of send a 'fine mode(640x480)' picture for QV100 is unknown.

GET THUMBNAIL IMAGE AS "YCC" FORMAT
===================================

    05 'DA' XX 06 05 'DL' 06 05  'MK' 06 12             06
    -------------------------------------------------------------------- 
    06    YY        06  6f     06   67     [Picture Data] [Picture Data]

    06           06                   06
    ----------------------------......---------------- 
    [Picture Data] [Picture Data]      02 00 00 03 FC

Comment:
    XX: Picture Number
    YY: checksum.  (0x7a - XX)
    The return byte 6f is checksum.
    The return byte 67 is checksum.

FORMAT OF [PICTURE DATA]
========================

     02 WW WW TT TT TT TT TT ........ 17 SS

Comment:
 WW WW: Data block size. (2byte). 
        Normally 0x00 0x80 (128 bytes)
        The data preceeding the endmark(02 00 00 03 FC) is its 
        block size(under 0x00 0x80).
    TT: Picture data. (YCC format)
    SS: Check sum.
        Reverse bits of all sum of second byte (after 0x02) 
        of data block to before SS (0x17).
    Thumbnail image size is 52(W)x36(H).

    In 2808 bytes, 
        the first 1872 bytes contain Y element data(0 to 255), 
        the second 468 bytes contain Cb element data(-128 to 127), 
        the third 468 bytes contain Cr element data(-128 to 127). 

    The Y element is represented by an unsigned char.
    Cb and Cr elements are represented by signed char. 
    The formula to convert YCC to RGB, is described in "ppm.c".
    (qvplay's source file)


GET PICTURE DATA IN YCC FORMAT
==================================

    05 'DA' XX  06 05 'DL' 06 05 'ML' 06 12              06
    -------------------------------------------------------------------- 
      06      YY     06  6f     06  66     [Picture Data] [Picture Data]

    06            06                 06
    ----------------------------......---------------- 
    [Picture Data] [Picture Data]     02 00 00 03 FC


Comment:
    XX: Picture Number.
    YY: checksum. (0x7a - XX)
    The return byte 6f is checksum.
    The return byte 66 is checksum.


FORMAT OF [PICTURE DATA]
========================

    02 WW WW JJ JJ JJ JJ JJ ........ 17 SS
    
Comment:
  WW WW: Data block size. (2bytes). 
         Normaly 0x00 0x80, 128 bytes.
         The data preceeding the endmark(02 00 00 03 FC) is its 
         block size(under 0x00 0x80).
     TT: Picture Data. (YCC format)
     SS: Check sum.
         Reverse bits of all sum of second byte (after 0x02) of data 
         block to before SS(0x17).

 - When picture is 'normal mode(420x240)' picture
    Picture size is 480(W)x240(H).
    All Picture Data size is 153600 byte.

    In 153600 bytes, 
        the first 115200 bytes contain Y element data(0 to 255), 
        the second 19200 bytes contain Cb element data(-128 to 127), 
        the third 19200 bytes contain Cr element data(-128 to 127). 

 - When picture is 'fine mode' picture
    Picture size is 640(W)x480(H).
    All Picture Data size is 460800 byte.

    In 460800 bytes, 
        the first 307200 bytes contain Y element data(0 to 255), 
        the second 76800 bytes contain Cb element data(-128 to 127), 
        the third 76800 bytes contain Cr element data(-128 to 127). 

    The Y element is represented by an unsigned char.
    Cb and Cr elements are represented by signed char. 
    The formula to convert YCC to RGB, is described in "ppm.c".
    (qvplay's source file)


SEND A YCC FORMAT PICTURE TO QV-10
==================================

    05 'MM' 06 [Picture Data] [Picture Data] 
    -----------------------------------------
      06  65  12            06    

    [Picture Data] [Picture Data]       02 00 00 03 FC
    ----------------------------......----------------
    06           06                   06

    05 'DN' 06 05 'DJ' 06
    -----------------------------
      06  6d    06   ZZ

Comment:
    The return byte 65 is checksum.
    The return byte 6d is checksum.
    The return byte ZZ is unknown.
    [Picture Data] format is as described above.
    The procedure of send a 'fine mode(640x480)' picture for QV100 is unknown.

DELETE A PICTURE FROM QV-10 MEMORY
===================================

    05 'DF' XX ff 06
    ------------------- 
    06    YY    

Comment:
    XX: Picture Number.
    YY: checksum (0x76 - XX)

TAKE A PICTURE    
==============

    05 'DR' 06
    -------------    
      06  69  ZZ

Comment:
    You must set QV10 to REC mode.
    The return byte 69 is checksum.
    ZZ: When QV10's function SW is PLAY mode, it is 15,
        in REC mode, it is 06.
    (at QV-700/770 this command not work.)

CHANGE SERIAL COMMUNICATION SPEED
=================================

    05 'CB' XX   06
    ----------------    
      06      YY    

Comment:
   XX: Select XX from the table below
   YY: checksum 

     XX(decimal(hex)): baud
         --------------------
            46(0x2e) : 9600
            22(0x16) : 19200
            11(0x0b) : 38400
             7(0x07) : 57600
             3(0x03) : 115200
         --------------------


CHANGE PICTURE ORDER
====================

    05 'DI' XX 06 05 'DY' 02 XX 06 05 'DF' XX ff 06 05 'Dj' VV 06 
    ------------------------------------------------------------------------ 
      06      YY    06         ZZ    06         WW    06      UU

Comment:
    XX: source picture number
    YY: checksum (0x72 - XX)
    ZZ: unknown
    WW: checksum (0x76 - XX)
    VV: destination picture number
    UU: checksum (0x51 - XX)

FOR EXAMPLE: XX = 5 VV =2
    picture order before: 1 2 3 4 5 6 ...
    picture order after:  1 5 2 3 4 6 ...

POWER OFF QV-10
====================

    05  'QX'  06
    --------------
      06    56 

Comment:
    Power off QV-10.
    The return byte 56 is checksum.

DISABLE AUTO POWER OFF FUNCTION
===============================

    05  'DU'  06 05  'QE'  06
    ----------------------------
      06    66     06   69 

Comment:
    Disable auto power off function.
    The return byte 66, 69 is checksum.

REPORT BATTERY VOLTAGE
======================

    05  'RB'  05  FF  FE  E6  06
    --------------------------------
      06                    83  XX

Comment:
      Fetch battery boltage.
    XX: battery voltage.
        XX/0x10 (devide by 0x10) is an approximate voltage value.
    The return byte 83 is checksum.
    (at QV-700/770 this function report another value.)

SHOW TEST COLOR PATTERN
=======================

    05  'DP' 06
    -------------
      06   XX 

Comment:
    Show 'test color patten' on LCD.
    The return byte XX is checksum.

REPORT SWITCH AND CCD LENS UNIT STATUS
=======================================

    05  'DS'  06
    ----------------
      06    XX  YY ZZ

Comment:
      Report REC/PLAY switch status and CCD lens unit status.
    The return byte XX is checksum.
    YY:
      MSB 
      7 0x80 Too brighter warning mark(filled circle)) is shown on LCD.
      6 0x40 Too darker warning mark(hollow circle)) is shown on LCD.
      5 0x20 unknown
      4 0x10 unknown
      3 0x08 [-]button is pressed.
      2 0x04 [+]button is pressed.
      1 0x02 unknown
      0 0x01 unknown
      LSB
    ZZ:
      MSB 
      7 0x80 CCD lens unit is reverse position.
      6 0x40 REC/PLAY SW. is PLAY position.
      5 0x20 PROTECT button is pressed.
      4 0x10 DEL button is pressed.
      3 0x08 DISP button is pressed.
      2 0x04 MODE button is pressed.
      1 0x02 ZOOM button is pressed.
      0 0x01 Shutter button is pressed.
      LSB
    (at QV-700/770 status YY ZZ is always 00 44.)

PROTECT PICTURE or UNPROTECT PICTURE
====================================

    05  'DY'  XX  YY  06
    -----------------------
      06            ZZ

Comment:
      Protect picture or unprotect picture.

    Picture number is specified by XX.
    YY: 0x00 unprotect picture
    YY: 0x0  protect picture
    The return byte ZZ is checksum.

REPORT PICTURE ATTRIBUTE
========================

    05  'DY' 02 XX  06
    -----------------------
      06          YY  ZZ

Comment:
      Get information(protected or not, normal(480x240) or
      fine(640x480)) about a picture.

    Picture number is specified by XX.
    YY: checksum
    ZZ: picture attribute.
        protect,  resolution, value of ZZ
            off      480x240   0x00
            on       480x240   0x01
            off      640x480   0x02
            on       640x480   0x03

CHANGE IMAGE TRANSFER BLOCK SIZE 
================================

    05  'PP' XX YY  06
    -----------------------
      06          ZZ

Comment:
      Change block size to XX YY.

    Block size(default 0x00 0x80) is specified by XX YY.
    XX: higher byte
    YY: lower byte
    ZZ: checksum

SET DEFAULT PICTURE
===================

    05  'DV' XX  06
    ---------------
      06       YY

Comment:
      Set default picture shown on LCD when power on or reset.

    XX: Picture number
    YY: checksum

HIDE PICTURE NUMBER
===================

    05  'DM' XX  06
    ---------------
      06       YY

Comment:
      Hide picture number shown on LCD.

    XX: Picture number
    YY: checksum

REPORT HARDWARE REVISION
=========================

    05  'SU' 06
    ------------------------
      06   XX   YY ZZ WW VV

Comment:
      Get hardware revison number.

    XX: checksum
    YY: model ID1
    ZZ: model ID2
    WW: revision num1
    VV: revision num2
 
    sample
    model    YYZZWWVV
    QV10   0x00531719
    QV10   0x00538b8f
    QV10A  0x00800003
    QV70   0x00835321
    QV100  0x0103ba90
    QV300  0x01048dc0
    QV700  0x01a0e081
    QV770  0x01a10000

-----
===========================
NEW COMMANDS FOR QV-700/770
===========================
 Those commands are works on QV-700/770 only.

ENABLE NEW COMMANDS FOR QV-700/770?
===================================

    05  'NP' 01  06 
    ------------------
      06       60  
Comment:
     Enable new commands.

   The return byte 60 is checksum.

GET PICTURE DATA IN JPEG FORMAT
===================================
    05 'DA' XX 06 05  'DL' 06 05 'EM'             06 
    -------------------------------------------------
     06      YY     06   6f     06  6d ZZ ZZ ZZ ZZ

    05  'EG'  06  12              06
    -------------------------------------------------
      06   73      [Picture Data] [Picture Data]

    06           06                    06
    -----------------------------......---------------- 
    [Picture Data] [Picture Data]        02 00 00 03 FC

Comment:
    XX is the picture number.
    The return byte YY is checksum. (0x7a - XX).
    Return byte 6f is checksum.
    Return byte 6d is checksum.
    Return byte 73 is checksum.
    Return bytes ZZ ZZ ZZ ZZ are picture data size.
    02 00 00 03 FC should be end marker.

FORMAT OF [Picture Data]
========================

    02 WW WW JJ JJ JJ JJ JJ ........ 17 SS

Comment:
 WW WW: Data Block Size (2 bytes):  (Normally 0x00 0x80, 128 bytes)
        The data preceeding the endmark(02 00 00 03 FC) is its 
        block size(under 0x00 0x80).
    JJ: Picture data. (JFIF format) 
    SS: Check sum.  Reverse bits of all sum of second byte (after 0x02) 
        of data block to before SS (0x17).

GET PICTURE INFORMATION
=======================
    05 'DA' XX 06 05  'DL' 06
    -------------------------
     06      YY     06   6f  

    05  'CV'  06  12                             06
    -------------------------------------------------------------
      06   66       02 00 0b [11bytes data] 17 SS  02 00 00 03 FC

Comment:
    XX is the picture number.
    The return byte YY is checksum. (0x7a - XX).
    Return byte 6f is checksum.
    Return byte 66 is checksum.
    SS: Check sum.  Reverse bits of all sum of second byte (after 0x02) 
        of data block to before SS (0x17).

    11bytes data
     1st byte Compression  01:economy 02:normal 03:fine
     2nd byte unknown 00
     3rd byte taked mode   01:one shot 02:continuous shot
                           07:panorama 08:movie
     4th byte macro mode   01:normal 02:macro mode
     5th byte unknown 01
     6th byte unknown 0a,09,0c,0e,0b shutter speed? WB?
     7th byte iris(meybe) 07:(F8) 03:(F2)
     8th byte unknown 0d
     9th byte unknown 04
    10th byte unknown 0d
    11th byte unknown 01

-----
================
UNKNOWN COMMANDS
================
'DI' 'DK' 'DQ'

'EB' 'Eb' remain memory size (in picture unit)(QV100 only)?
'MQ' 'Mq' picture bytesize (QV100 only)?

'cb' change baud rate (QV-700/770 only)?
'CX' 'CF' 'EC' 'DY' 'FT' 'CZ' 'ES'
'BC' battery check ? (QV-700/770 only)
'MW' write JPEG format data to QV-700/770

==============
SPECIAL THANKS
==============
  Itojun-san, Brahma-san, Goto-san, Mario-san
  (Thanks for their research and report about the serial protocol)
  Dr. Sadun
  (Thanks for fixup of early version of this document which 
    written in my poor English.)
  Kuwata-san
  (Thanks for the report about battery voltage.)
