HP Prime/Linking Protocol
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
- ↑ Erwin Ried, Nov. 29 2013 - http://ried.cl/en/proyecto/utilidad-para-intercambiar-archivos-con-la-hp-prime-primecomm/
- ↑ Erwin Ried, Nov. 29 2013 - http://ried.cl/en/franqueando-los-secretos-del-hardware-mediante-ingenieria-inversa/
- ↑ Erwin Ried, Nov. 29 2013 - https://github.com/eried/PrimeComm/blob/master/PrimeComm/PrimeUsbFile.cs