HP Prime/Linking Protocol

De TI-Planet Wiki
Aller à la navigation Aller à la recherche
This is a backup copy of the article from the old "HPWiki" of TI-Planet (that only hosted HP Prime info)

This page aims at providing information about the linking protocols of the HP Prime.

The TI-Nspire uses vendor-specific class and proprietary protocols which require specific drivers; the Casio Prizm uses MSD, and the HP Prime uses standard classes as well. Standard classes which do not require extra driver installs are a boon to users.

High-level USB behaviour

"Normal" mode

In normal mode, the Prime exposes itself as a Human Interaction Device (HID). That's a standard class, with built-in drivers in pretty much any USB-supporting OS, aimed primarily at mice, keyboards and joysticks; lots of manufacturers (ab)use that class for other purposes.

Click to see the USB descriptors dump :

<spoiler>

Information for device HP Prime Calculator (VID=0x03F0 PID=0x0441): 

Connection Information:
------------------------------
Connection status: Device connected
Device actual bus speed: High 
Device is hub: No
Device adress: 0x0001
Current configuration value: 0x01
Number of open pipes: 2

Device Descriptor:
------------------------------
0x12	bLength
0x01	bDescriptorType
0x0200	bcdUSB
0x00	bDeviceClass   
0x00	bDeviceSubClass   
0x00	bDeviceProtocol   
0x40	bMaxPacketSize0   (64 Bytes)
0x03F0	idVendor
0x0441	idProduct
0x0100	bcdDevice
0x01	iManufacturer   (Hewlett-Packard)
0x02	iProduct   (HP Prime Calculator)
0x00	iSerialNumber
0x01	bNumConfigurations
Hex dump: 
0x12 0x01 0x00 0x02 0x00 0x00 0x00 0x40 0xF0 0x03 
0x41 0x04 0x00 0x01 0x01 0x02 0x00 0x01 

Device Qualifier Descriptor is not available. Error code: 0x000003E3

Configuration Descriptor:
------------------------------
0x09	bLength
0x02	bDescriptorType
0x0029	wTotalLength
0x01	bNumInterfaces
0x01	bConfigurationValue
0x00	iConfiguration
0x80	bmAttributes   (Bus-powered Device)
0x32	bMaxPower   (100 mA)
Hex dump: 
0x09 0x02 0x29 0x00 0x01 0x01 0x00 0x80 0x32 

Interface Descriptor:
------------------------------
0x09	bLength
0x04	bDescriptorType
0x00	bInterfaceNumber
0x00	bAlternateSetting
0x02	bNumEndPoints
0x03	bInterfaceClass   (Human Interface Device Class)
0x00	bInterfaceSubClass   
0x00	bInterfaceProtocol   
0x00	iInterface
Hex dump: 
0x09 0x04 0x00 0x00 0x02 0x03 0x00 0x00 0x00 

HID Descriptor:
------------------------------
0x09	bLength
0x21	bDescriptorType
0x0101	bcdHID
0x00	bCountryCode
0x01	bNumDescriptors
0x22	bDescriptorType   (Report descriptor)
0x0018	bDescriptorLength
Hex dump: 
0x09 0x21 0x01 0x01 0x00 0x01 0x22 0x18 0x00 

Endpoint Descriptor:
------------------------------
0x07	bLength
0x05	bDescriptorType
0x81	bEndpointAddress   (IN Endpoint)
0x03	bmAttributes	(Transfer: Interrupt / Synch: None / Usage: Data)
0x0040	wMaxPacketSize   (64 Bytes) 
0x01	bInterval
Hex dump: 
0x07 0x05 0x81 0x03 0x40 0x00 0x01 

Endpoint Descriptor:
------------------------------
0x07	bLength
0x05	bDescriptorType
0x02	bEndpointAddress   (OUT Endpoint)
0x03	bmAttributes	(Transfer: Interrupt / Synch: None / Usage: Data)
0x0040	wMaxPacketSize   (64 Bytes) 
0x01	bInterval
Hex dump: 
0x07 0x05 0x02 0x03 0x40 0x00 0x01 

String Descriptor Hex Dump
--------------------------------
Index  LANGID  Hex Dump
               bLength  bDescriptorType  bString
0x00   0x0000  0x04     0x03             0x09, 0x04 
0x01   0x0409  0x20     0x03             Hewlett-Packard
                                         0x48, 0x00, 0x65, 0x00, 0x77, 0x00, 0x6C, 0x00, 
                                         0x65, 0x00, 0x74, 0x00, 0x74, 0x00, 0x2D, 0x00, 
                                         0x50, 0x00, 0x61, 0x00, 0x63, 0x00, 0x6B, 0x00, 
                                         0x61, 0x00, 0x72, 0x00, 0x64, 0x00 
0x02   0x0409  0x28     0x03             HP Prime Calculator
                                         0x48, 0x00, 0x50, 0x00, 0x20, 0x00, 0x50, 0x00, 
                                         0x72, 0x00, 0x69, 0x00, 0x6D, 0x00, 0x65, 0x00, 
                                         0x20, 0x00, 0x43, 0x00, 0x61, 0x00, 0x6C, 0x00, 
                                         0x63, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x61, 0x00, 
                                         0x74, 0x00, 0x6F, 0x00, 0x72, 0x00 
0x04   0x0409  0x09     0x02             )ā耀2
                                         0x29, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32 
0xE5   0x0409  0x28     0x31             ๔ㄨཛྷㄨၤㄨᅬㄨቴㄨ፼ㄨᒄㄨᖌㄨᚔㄨវ
                                         0x54, 0x0E, 0x28, 0x31, 0x5C, 0x0F, 0x28, 0x31, 
                                         0x64, 0x10, 0x28, 0x31, 0x6C, 0x11, 0x28, 0x31, 
                                         0x74, 0x12, 0x28, 0x31, 0x7C, 0x13, 0x28, 0x31, 
                                         0x84, 0x14, 0x28, 0x31, 0x8C, 0x15, 0x28, 0x31, 
                                         0x94, 0x16, 0x28, 0x31, 0x9C, 0x17 
0xE7   0x0409  0x28     0x31             兜ㄨ剤ㄨ卬ㄨ呴ㄨ啼ㄨ嚄ㄨ垌ㄨ墔ㄨ妜ㄨ媤
                                         0x5C, 0x51, 0x28, 0x31, 0x64, 0x52, 0x28, 0x31, 
                                         0x6C, 0x53, 0x28, 0x31, 0x74, 0x54, 0x28, 0x31, 
                                         0x7C, 0x55, 0x28, 0x31, 0x84, 0x56, 0x28, 0x31, 
                                         0x8C, 0x57, 0x28, 0x31, 0x94, 0x58, 0x28, 0x31, 
                                         0x9C, 0x59, 0x28, 0x31, 0xA4, 0x5A 
0xE9   0x0409  0x28     0x31             鑤ㄨ镬ㄨ陴ㄨ靼ㄨ预ㄨ馌ㄨ骔ㄨ鮜ㄨ鲤ㄨ鶬
                                         0x64, 0x94, 0x28, 0x31, 0x6C, 0x95, 0x28, 0x31, 
                                         0x74, 0x96, 0x28, 0x31, 0x7C, 0x97, 0x28, 0x31, 
                                         0x84, 0x98, 0x28, 0x31, 0x8C, 0x99, 0x28, 0x31, 
                                         0x94, 0x9A, 0x28, 0x31, 0x9C, 0x9B, 0x28, 0x31, 
                                         0xA4, 0x9C, 0x28, 0x31, 0xAC, 0x9D 
0xEB   0x0409  0x28     0x31             희ㄨ�ㄨ�ㄨ�ㄨ�ㄨ�ㄨ�ㄨ�ㄨ�ㄨ
                                         0x6C, 0xD7, 0x28, 0x31, 0x74, 0xD8, 0x28, 0x31, 
                                         0x7C, 0xD9, 0x28, 0x31, 0x84, 0xDA, 0x28, 0x31, 
                                         0x8C, 0xDB, 0x28, 0x31, 0x94, 0xDC, 0x28, 0x31, 
                                         0x9C, 0xDD, 0x28, 0x31, 0xA4, 0xDE, 0x28, 0x31, 
                                         0xAC, 0xDF, 0x28, 0x31, 0xB4, 0xE0 
0xED   0x0409  0x29     0x31             ᩴㄩ᭼ㄩᲄㄩᶌㄩẔㄩᾜㄩ₤ㄩ↬ㄩ⊴ㄩ⎼)
                                         0x74, 0x1A, 0x29, 0x31, 0x7C, 0x1B, 0x29, 0x31, 
                                         0x84, 0x1C, 0x29, 0x31, 0x8C, 0x1D, 0x29, 0x31, 
                                         0x94, 0x1E, 0x29, 0x31, 0x9C, 0x1F, 0x29, 0x31, 
                                         0xA4, 0x20, 0x29, 0x31, 0xAC, 0x21, 0x29, 0x31, 
                                         0xB4, 0x22, 0x29, 0x31, 0xBC, 0x23, 0x29 
0xEF   0x0409  0x29     0x31             嵼ㄩ庄ㄩ後ㄩ悔ㄩ憜ㄩ护ㄩ掬ㄩ撴ㄩ於ㄩ曄)
                                         0x7C, 0x5D, 0x29, 0x31, 0x84, 0x5E, 0x29, 0x31, 
                                         0x8C, 0x5F, 0x29, 0x31, 0x94, 0x60, 0x29, 0x31, 
                                         0x9C, 0x61, 0x29, 0x31, 0xA4, 0x62, 0x29, 0x31, 
                                         0xAC, 0x63, 0x29, 0x31, 0xB4, 0x64, 0x29, 0x31, 
                                         0xBC, 0x65, 0x29, 0x31, 0xC4, 0x66, 0x29 
0xF1   0x0409  0x29     0x31             ꂄㄩꆌㄩꊔㄩꎜㄩ꒤ㄩꖬㄩꚴㄩꞼㄩ꣄ㄩ꧌)
                                         0x84, 0xA0, 0x29, 0x31, 0x8C, 0xA1, 0x29, 0x31, 
                                         0x94, 0xA2, 0x29, 0x31, 0x9C, 0xA3, 0x29, 0x31, 
                                         0xA4, 0xA4, 0x29, 0x31, 0xAC, 0xA5, 0x29, 0x31, 
                                         0xB4, 0xA6, 0x29, 0x31, 0xBC, 0xA7, 0x29, 0x31, 
                                         0xC4, 0xA8, 0x29, 0x31, 0xCC, 0xA9, 0x29 
0xF2   0x0409  0x84     0xC1             ㄩ슌ㄩ쎔ㄩ쒜ㄩ
                                         0x29, 0x31, 0x8C, 0xC2, 0x29, 0x31, 0x94, 0xC3, 
                                         0x29, 0x31, 0x9C, 0xC4, 0x29, 0x31, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00 
0xF4   0x0409  0x8C     0x04             ㄪ֔ㄪڜㄪޤㄪࢬㄪ঴ㄪ઼
                                         0x2A, 0x31, 0x94, 0x05, 0x2A, 0x31, 0x9C, 0x06, 
                                         0x2A, 0x31, 0xA4, 0x07, 0x2A, 0x31, 0xAC, 0x08, 
                                         0x2A, 0x31, 0xB4, 0x09, 0x2A, 0x31, 0xBC, 0x0A, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00 
0xF6   0x0409  0x94     0x47             ㄪ䢜ㄪ䦤ㄪ䪬ㄪ䮴ㄪ䲼ㄪ䷄
                                         0x2A, 0x31, 0x9C, 0x48, 0x2A, 0x31, 0xA4, 0x49, 
                                         0x2A, 0x31, 0xAC, 0x4A, 0x2A, 0x31, 0xB4, 0x4B, 
                                         0x2A, 0x31, 0xBC, 0x4C, 0x2A, 0x31, 0xC4, 0x4D, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00 
0xF8   0x0409  0x9C     0x8A             ㄪ认ㄪ責ㄪ趴ㄪ躼ㄪ迄ㄪ郌ㄪ釔ㄪ鋜ㄪ
                                         0x2A, 0x31, 0xA4, 0x8B, 0x2A, 0x31, 0xAC, 0x8C, 
                                         0x2A, 0x31, 0xB4, 0x8D, 0x2A, 0x31, 0xBC, 0x8E, 
                                         0x2A, 0x31, 0xC4, 0x8F, 0x2A, 0x31, 0xCC, 0x90, 
                                         0x2A, 0x31, 0xD4, 0x91, 0x2A, 0x31, 0xDC, 0x92, 
                                         0x2A, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00 
0xFA   0x0409  0xA4     0xCD             ㄪ캬ㄪ쾴ㄪ킼ㄪ퇄ㄪ틌ㄪ폔ㄪ퓜ㄪ헤ㄪ훬ㄪퟴ
                                         0x2A, 0x31, 0xAC, 0xCE, 0x2A, 0x31, 0xB4, 0xCF, 
                                         0x2A, 0x31, 0xBC, 0xD0, 0x2A, 0x31, 0xC4, 0xD1, 
                                         0x2A, 0x31, 0xCC, 0xD2, 0x2A, 0x31, 0xD4, 0xD3, 
                                         0x2A, 0x31, 0xDC, 0xD4, 0x2A, 0x31, 0xE4, 0xD5, 
                                         0x2A, 0x31, 0xEC, 0xD6, 0x2A, 0x31, 0xF4, 0xD7, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00 
0xFD   0x0409  0x2B     0x31             ㊴ㄫ㎼ㄫ㓄ㄫ㗌ㄫ㛔ㄫ㟜ㄫ㣤ㄫ㧬ㄫ㫴ㄫ㯼ㄫÜ
                                         0xB4, 0x32, 0x2B, 0x31, 0xBC, 0x33, 0x2B, 0x31, 
                                         0xC4, 0x34, 0x2B, 0x31, 0xCC, 0x35, 0x2B, 0x31, 
                                         0xD4, 0x36, 0x2B, 0x31, 0xDC, 0x37, 0x2B, 0x31, 
                                         0xE4, 0x38, 0x2B, 0x31, 0xEC, 0x39, 0x2B, 0x31, 
                                         0xF4, 0x3A, 0x2B, 0x31, 0xFC, 0x3B, 0x2B, 0x31, 
                                         0xDC 
0xFE   0x0409  0x8C     0x33             ㄼ㒔ㄼ㖜ㄼ㚤ㄼ㞬ㄼ
                                         0x3C, 0x31, 0x94, 0x34, 0x3C, 0x31, 0x9C, 0x35, 
                                         0x3C, 0x31, 0xA4, 0x36, 0x3C, 0x31, 0xAC, 0x37, 
                                         0x3C, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00 

------------------------------

Whole Device Descriptor as hex dump: 
0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0xF0, 0x03, 
0x41, 0x04, 0x00, 0x01, 0x01, 0x02, 0x00, 0x01

Whole Configuration Descriptor as hex dump: 
0x09, 0x02, 0x29, 0x00, 0x01, 0x01, 0x00, 0x80, 0x32, 0x09, 
0x04, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00, 0x09, 0x21, 
0x01, 0x01, 0x00, 0x01, 0x22, 0x18, 0x00, 0x07, 0x05, 0x81, 
0x03, 0x40, 0x00, 0x01, 0x07, 0x05, 0x02, 0x03, 0x40, 0x00, 
0x01


------------------------------

Connection path for device: 
Contrôleur hôte PCI vers USB standard étendu
Root Hub
HP Prime Calculator (VID=0x03F0 PID=0x0441)

Brought to you by TDD v1.81.0, ...

</spoiler>

Reflashing mode

In reflashing mode, the Prime exposes itself as a Mass Storage Device (MSD), another standard-class with built-in drivers.

Click to see the USB descriptors dump : <spoiler>

Information for device Prime update (VID=0x03F0 PID=0x0441): 

Connection Information:
------------------------------
Connection status: Device connected
Device actual bus speed: High 
Device is hub: No
Device adress: 0x0001
Current configuration value: 0x00
Number of open pipes: 0

Device Descriptor:
------------------------------
0x12	bLength
0x01	bDescriptorType
0x0200	bcdUSB
0x00	bDeviceClass   
0x00	bDeviceSubClass   
0x00	bDeviceProtocol   
0x40	bMaxPacketSize0   (64 Bytes)
0x03F0	idVendor
0x0441	idProduct
0x0100	bcdDevice
0x01	iManufacturer   (HP)
0x02	iProduct   (Prime update)
0x03	iSerialNumber   (5E4C6008)
0x01	bNumConfigurations
Hex dump: 
0x12 0x01 0x00 0x02 0x00 0x00 0x00 0x40 0xF0 0x03 
0x41 0x04 0x00 0x01 0x01 0x02 0x03 0x01 

Device Qualifier Descriptor is not available. Error code: 0x000003E3

Configuration Descriptor:
------------------------------
0x09	bLength
0x02	bDescriptorType
0x0020	wTotalLength
0x01	bNumInterfaces
0x01	bConfigurationValue
0x00	iConfiguration
0x80	bmAttributes   (Bus-powered Device)
0xC8	bMaxPower   (400 mA)
Hex dump: 
0x09 0x02 0x20 0x00 0x01 0x01 0x00 0x80 0xC8 

Interface Descriptor:
------------------------------
0x09	bLength
0x04	bDescriptorType
0x00	bInterfaceNumber
0x00	bAlternateSetting
0x02	bNumEndPoints
0x08	bInterfaceClass   (Mass Storage Device Class)
0x06	bInterfaceSubClass   (Transparent SCSI subclass)
0x50	bInterfaceProtocol   (Bulk only transport)
0x00	iInterface
Hex dump: 
0x09 0x04 0x00 0x00 0x02 0x08 0x06 0x50 0x00 

Endpoint Descriptor:
------------------------------
0x07	bLength
0x05	bDescriptorType
0x81	bEndpointAddress   (IN Endpoint)
0x02	bmAttributes	(Transfer: Bulk / Synch: None / Usage: Data)
0x0200	wMaxPacketSize   (512 Bytes) 
0x01	bInterval
Hex dump: 
0x07 0x05 0x81 0x02 0x00 0x02 0x01 

Endpoint Descriptor:
------------------------------
0x07	bLength
0x05	bDescriptorType
0x02	bEndpointAddress   (OUT Endpoint)
0x02	bmAttributes	(Transfer: Bulk / Synch: None / Usage: Data)
0x0200	wMaxPacketSize   (512 Bytes) 
0x01	bInterval
Hex dump: 
0x07 0x05 0x02 0x02 0x00 0x02 0x01 

String Descriptor Hex Dump
--------------------------------
Index  LANGID  Hex Dump
               bLength  bDescriptorType  bString
0x00   0x0000  0x04     0x03             0x09, 0x04 
0x01   0x0409  0x1C     0x03             HP
                                         0x48, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00 
0x02   0x0409  0x22     0x03             Prime update
                                         0x50, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6D, 0x00, 
                                         0x65, 0x00, 0x20, 0x00, 0x75, 0x00, 0x70, 0x00, 
                                         0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
0x03   0x0409  0x1C     0x03             5E4C6008
                                         0x35, 0x00, 0x45, 0x00, 0x34, 0x00, 0x43, 0x00, 
                                         0x36, 0x00, 0x30, 0x00, 0x30, 0x00, 0x38, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00 
0x04   0x0409  0x09     0x02              ā耀È
                                         0x20, 0x00, 0x01, 0x01, 0x00, 0x80, 0xC8 
0x05   0x0409  0x90     0x86             ダ
                                         0xC0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00 

------------------------------

Whole Device Descriptor as hex dump: 
0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0xF0, 0x03, 
0x41, 0x04, 0x00, 0x01, 0x01, 0x02, 0x03, 0x01

Whole Configuration Descriptor as hex dump: 
0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0x80, 0xC8, 0x09, 
0x04, 0x00, 0x00, 0x02, 0x08, 0x06, 0x50, 0x00, 0x07, 0x05, 
0x81, 0x02, 0x00, 0x02, 0x01, 0x07, 0x05, 0x02, 0x02, 0x00, 
0x02, 0x01


------------------------------

Connection path for device: 
Contrôleur hôte PCI vers USB standard étendu
Root Hub
Prime update (VID=0x03F0 PID=0x0441)

Brought to you by TDD v1.81.0, ...

</spoiler>

Lower-level USB behaviour

"Normal" mode

The protocol is being decoded, and a toolkit for communicating with Prime calculators (six basic operations, more in progress) is available from at https://github.com/debrouxl/hplp . Since 2013/11/03, the program has an interactive terminal-based UI, which makes it usable by a wider audience, though lack of a GUI is still an obvious showstopper for many.

There is another small implementation of the undocumented protocol, called PrimeComm [1] available at https://github.com/eried/PrimeComm , written in C# .NET 4.0.

USB headers and chunks[2]

The first chunk has the following structure:

Byte 0 1 2 3 4 5 6 7 8 9 10 11
Example 00 00 F7 01 00 00 00 B8 06 1C 94 DD
Description Start Start Type Items Size Name length CRC
Additional Count from last Size byte (7) until end Byte length

After the first chunk, the data does not fit in a "chunk" is sent using the following format:

Byte 0 1 2 3
Example 00 01 00 00
Description Start Chunk Data from here, up to the chunk end
Additional Goes back to 0×00 after 0xFF

Generating the USB chunks

After adding the main header to the data, the chunks contain 2 bytes less than the size of the chunk, to include the chunk number, so we can translate all this to:

Little C# code snippet [3] as example of this:

var fullData = new List(_header);
 
// Name
var nameBytes = Encoding.Unicode.GetBytes(name);
 
// Size
var size = BitConverter.GetBytes(data.Length + nameBytes.Length +5);
 
// Combining all fields
fullData.AddRange(size.Reverse());
fullData.Add(0x06);
fullData.Add((byte) nameBytes.Length);
fullData.AddRange(new byte[] {0x94, 0xdd}); // CRC
fullData.AddRange(nameBytes);
fullData.AddRange(data);
 
var allBytes = fullData.ToArray();
int position = 0, chunk = 0;
 
if(chunkSize>0)
    do
    {
        IEnumerable tmp = new[] { (byte)0x00, (byte)(chunk++ % byte.MaxValue) };
        Chunks.Add(tmp.Concat(allBytes.SubArray(position==0?2:position, Math.Min(chunkSize-2, allBytes.Length - position))).ToArray());
        position += chunkSize-(position==0?0:2);
 
    } while (position < allBytes.Length);

And we are already generating valid chunks to use.

Reflashing mode

Here is an analysis of the raw USB data for an upgrade to 0.30 firmware from 2013/08/09, captured by someone else.

Tools: USBpcap on Windows for capture; Wireshark and hte (or any other hex viewer/editor) on Linux for interpretation.

Additional information: SCSI_command‎ (Wikipedia) and pages linked from that one.

<spoiler>

HP Prime update 0.30: USB Mass Storage packets exchanged between host and calculator
====================================================================================

0) Initialization
-----------------
Before transfer:
Repeat N times:
    PC -> CALC: SCSI Command 0x00: TEST UNIT READY
    CALC -> PC: Command 0x00: Good

Start transfer:
PC -> CALC: SCSI Command 0x25: READ CAPACITY(10)
CALC -> PC: 00 07 FC FF 00 00 02 00 
    523519 (2^19 - 3*2^8 - 1) sectors of 512 bytes = 268041728 bytes.
CALC -> PC: Command 0x25: Good 


1) First phase: BXCBOOT0.BIN
----------------------------
Repeat N times:
    PC -> CALC: SCSI Command 0x88: READ(16) from LBA 0, with zero length (invalid packet)
    PC -> CALC: 8+256 bytes of data (*)
    CALC -> PC: Command 0x88: Good
    PC -> CALC: SCSI Command 0x89: COMPARE AND WRITE from LBA 0, with zero length (invalid packet)
    CALC -> PC: 8+256 bytes of identical data (*)
    CALC -> PC: Command 0x89: Good

(*) 8 bytes of control data, followed by 256 bytes from BXCBOOT0.BIN.
    * 2 bytes: tag ?
    * 2 bytes: an indication of direction ? Most host -> calc packets have 00 00, most calc -> host packets have 00 80.
    * 4 bytes: offset ?
Control data dump, in order:
    PC -> CALC: cd be 00 00 ad be 00 00
    CALC -> PC: cd be 00 80 ad be 00 00
    PC -> CALC: c5 be 00 00 00 00 00 00
    CALC -> PC: c5 be 00 80 00 00 00 00
    PC -> CALC: c5 be 00 00 01 00 00 00
    CALC -> PC: 00 00 00 00 00 00 00 00
    PC -> CALC: c5 be 00 00 02 00 00 00
    CALC -> PC: 00 00 00 00 00 00 00 00
    PC -> CALC: cd be 00 00 ad be 00 00
    CALC -> PC: cd be 00 80 ad be 00 80
---------------------------------------
    PC -> CALC: dc be 00 00 00 00 00 00
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: c6 be 00 00 00 01 00 00
    CALC -> PC: c6 be 00 80 00 01 00 00
    PC -> CALC: c6 be 00 00 00 01 00 01
    CALC -> PC: c6 be 00 80 00 01 00 01
...
    PC -> CALC: c6 be 00 00 00 01 00 3f
    CALC -> PC: c6 be 00 80 00 01 00 3f
---------------------------------------
    PC -> CALC: dc be 00 00 06 00 00 00
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: c6 be 00 00 00 01 00 40
    CALC -> PC: c6 be 00 80 00 01 00 40
...
    PC -> CALC: c6 be 00 00 00 01 00 7f
    CALC -> PC: c6 be 00 80 00 01 00 7f
---------------------------------------
    PC -> CALC: dc be 00 00 0c 00 00 00
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: c6 be 00 00 00 01 00 80
    CALC -> PC: c6 be 00 80 00 01 00 80
...
    PC -> CALC: c6 be 00 00 00 01 00 bf
    CALC -> PC: c6 be 00 80 00 01 00 bf
---------------------------------------
    PC -> CALC: dc be 00 00 12 00 00 00
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: c6 be 00 00 00 01 00 c0
    CALC -> PC: c6 be 00 80 00 01 00 c0
...
    PC -> CALC: c6 be 00 00 00 01 00 ff
    CALC -> PC: c6 be 00 80 00 01 00 ff
---------------------------------------
    PC -> CALC: dc be 00 00 19 00 00 00 (why 19 instead of 18 ? Special / spare page ?)
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: c6 be 00 00 00 01 00 00
    CALC -> PC: c6 be 00 80 00 01 00 00
    PC -> CALC: c6 be 00 00 00 01 00 01
    CALC -> PC: c6 be 00 80 00 01 00 01
...
    PC -> CALC: c6 be 00 00 00 01 00 3f
    CALC -> PC: c6 be 00 80 00 01 00 3f
---------------------------------------
    PC -> CALC: dc be 00 00 1f 00 00 00
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: c6 be 00 00 00 01 00 40
    CALC -> PC: c6 be 00 80 00 01 00 40
...
    PC -> CALC: c6 be 00 00 00 01 00 7f
    CALC -> PC: c6 be 00 80 00 01 00 7f
---------------------------------------
    PC -> CALC: dc be 00 00 25 00 00 00
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: c6 be 00 00 00 01 00 80
    CALC -> PC: c6 be 00 80 00 01 00 80
...
    PC -> CALC: c6 be 00 00 00 01 00 bf
    CALC -> PC: c6 be 00 80 00 01 00 bf
---------------------------------------
    PC -> CALC: dc be 00 00 2b 00 00 00
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: c6 be 00 00 00 01 00 c0
    CALC -> PC: c6 be 00 80 00 01 00 c0
...
    PC -> CALC: c6 be 00 00 00 01 00 ff
    CALC -> PC: c6 be 00 80 00 01 00 ff
---------------------------------------
    PC -> CALC: dc be 00 00 32 00 00 00 (again, mysterious +1)
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: c6 be 00 00 00 01 00 00
    CALC -> PC: c6 be 00 80 00 01 00 00
...
    PC -> CALC: c6 be 00 00 00 01 00 3f
    CALC -> PC: c6 be 00 80 00 01 00 3f
---------------------------------------
    PC -> CALC: dc be 00 00 38 00 00 00
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: c6 be 00 00 00 01 00 40
    CALC -> PC: c6 be 00 80 00 01 00 40
...
    PC -> CALC: c6 be 00 00 00 01 00 7f
    CALC -> PC: c6 be 00 80 00 01 00 7f
---------------------------------------
    PC -> CALC: dc be 00 00 3e 00 00 00
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: c6 be 00 00 00 01 00 80
    CALC -> PC: c6 be 00 80 00 01 00 80
...
    PC -> CALC: c6 be 00 00 00 01 00 bf
    CALC -> PC: c6 be 00 80 00 01 00 bf
---------------------------------------
    PC -> CALC: dc be 00 00 44 00 00 00
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: c6 be 00 00 00 01 00 c0
    CALC -> PC: c6 be 00 80 00 01 00 c0
...
    PC -> CALC: c6 be 00 00 00 01 00 ff
    CALC -> PC: c6 be 00 80 00 01 00 ff
---------------------------------------
    PC -> CALC: dc be 00 00 4b 00 00 00 (again, mysterious +1)
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: c6 be 00 00 00 01 00 00
    CALC -> PC: c6 be 00 80 00 01 00 00
...
    PC -> CALC: c6 be 00 00 00 01 00 3f
    CALC -> PC: c6 be 00 80 00 01 00 3f
---------------------------------------
    PC -> CALC: dc be 00 00 51 00 00 00
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: c6 be 00 00 00 01 00 40
    CALC -> PC: c6 be 00 80 00 01 00 40
...
    PC -> CALC: c6 be 00 00 00 01 00 7f
    CALC -> PC: c6 be 00 80 00 01 00 7f
---------------------------------------
    PC -> CALC: dc be 00 00 57 00 00 00
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: c6 be 00 00 00 01 00 80
    CALC -> PC: c6 be 00 80 00 01 00 80
...
    PC -> CALC: c6 be 00 00 00 01 00 bf
    CALC -> PC: c6 be 00 80 00 01 00 bf
---------------------------------------
    PC -> CALC: dc be 00 00 5d 00 00 00
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: c6 be 00 00 00 01 00 c0
    CALC -> PC: c6 be 00 80 00 01 00 c0
...
    PC -> CALC: c6 be 00 00 00 01 00 ff
    CALC -> PC: c6 be 00 80 00 01 00 ff
    PC -> CALC: c7 be 00 00 00 04 00 00
    CALC -> PC: c7 be 00 80 00 04 00 00
---------------------------------------
    PC -> CALC: dc be 00 00 64 00 00 00 (again, mysterious +1)
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: dc be 00 00 64 00 00 00
    CALC -> PC: dc be 00 80 00 00 00 00
    PC -> CALC: cd be 00 00 ad be 00 00
    CALC -> PC: cd be 00 80 ad be 00 80
    PC -> CALC: dc be 00 00 00 00 00 00
    CALC -> PC: dc be 00 80 00 00 00 00
Total amount of data in "c6 be" packets: 4 * 256 packets of 256 bytes = 256 KB = size of BXCBOOT0.bin.


2) Second phase: BESTAARM.ROM + MASTER.DAT + APPSDISK.DAT + <something else>
----------------------------------------------------------------------------
$OFFSET = 0
Repeat N times:
    Repeat 0, 1 or more times:
        PC -> CALC: SCSI Command 0x2A: WRITE(10) from LBA $OFFSET, size 0x20
        PC -> CALC: 16384 bytes of data (the contents of BESTAARM.ROM, then MASTER.DAT, then APPSDISK.DAT - see below for more details)
        CALC -> PC: Command 0x2A: Good
        $OFFSET = $OFFSET + 0x20

    More frequent at the beginning, this group of packets nearly disappears near the end of the transfer:
        PC -> CALC: SCSI Command 0x88: READ(16) from LBA 0, with zero length (invalid packet)
        PC -> CALC: 8+256 bytes of data (*)
        CALC -> PC: Command 0x88: Good
        PC -> CALC: SCSI Command 0x89: COMPARE AND WRITE from LBA 0, with zero length (invalid packet)
        CALC -> PC: 8+256 bytes of identical data (*)
        CALC -> PC: Command 0x89: Good
    (*) 8 bytes of control data, followed by 256 near-constant bytes from ????.
    Control data dump, in order:
        PC -> CALC: dc be 00 00 01 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 03 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 04 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 06 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 07 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 09 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 0a 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 0c 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 0e 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 0f 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 11 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 12 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 14 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 15 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 17 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 19 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 1a 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 1c 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 1d 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 1f 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 20 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 22 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 23 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 25 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 27 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 28 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 2a 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 2b 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 2d 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 2e 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 30 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 32 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 33 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 35 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 36 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 38 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 39 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 3b 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 3c 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 3e 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 40 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 41 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 43 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 44 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 46 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 47 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 49 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 4b 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 4c 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 4e 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 4f 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 51 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 52 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 54 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 55 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 57 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 59 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 5a 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 5c 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 5d 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 5f 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 60 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 62 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 64 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
-------------------------------------------
        PC -> CALC: cd be 00 00 ad be 00 00
        CALC -> PC: cd be 00 80 ad be 00 80
        PC -> CALC: dc be 00 00 00 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 01 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 02 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
...
        PC -> CALC: dc be 00 00 64 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
-------------------------------------------
        PC -> CALC: cd be 00 00 ad be 00 00
        CALC -> PC: cd be 00 80 ad be 00 80
        PC -> CALC: dc be 00 00 00 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
        PC -> CALC: dc be 00 00 01 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
...
        PC -> CALC: dc be 00 00 64 00 00 00
        CALC -> PC: dc be 00 80 00 00 00 00
NOTE1: there are 0x128 "dc be" packets after the initial weirdness.

    Once in a while:
        PC -> CALC: SCSI Command 0x00: TEST UNIT READY
        CALC -> PC: Command 0x00: Good

NOTE2: Highest value reached by $OFFSET: 0x127e0. 0x12800 sectors of 512 bytes are written, which corresponds to:
    * BESTAARM.ROM: 1048576 bytes = 0x800 * 512 bytes, at LBA offset 0;
    * MASTER.DAT: 4194304 bytes = 0x2000 * 512 bytes, at LBA offset 0x800 (marker "EA656XXX.DAT", soon followed by version number "SDKV0.30");
    * APPSDISK.DAT: 33554432 bytes = 0x10000 * 512 bytes, at LBA offset 0x2800 (marker "APDSKXXX.DAT", soon followed by version number "V1.00").


3) Finalization (or something like that)
----------------------------------------
    PC -> CALC: SCSI Command 0x88: READ(16) from LBA 0, with zero length (invalid packet)
    PC -> CALC: 8+256 bytes of data:
        cd be 00 00 ad be 00 00
        ...
    CALC -> PC: Command 0x88: Good
    PC -> CALC: SCSI Command 0x89: COMPARE AND WRITE from LBA 0, with zero length (invalid packet)
    CALC -> PC: 8+256 bytes of data:
        cd be 00 80 ad be 00 80
    CALC -> PC: Command 0x89: Good
    PC -> CALC: SCSI Command 0x88: READ(16) from LBA 0, with zero length (invalid packet)
    PC -> CALC: 8+256 bytes of data:
        c1 be 00 00 00 00 00 00
    <No reply>

</spoiler>

References