Skip to main content

Kiiroo Bootloader

While it would be a great marketing strategy for the kind of people that read this document, there is not actually a toy called the Kiiroo Bootloader. Rather, this refers to the common bootloader that comes installed on Kiiroo toys, most notably the Fleshlight Launch. The bootloader is used to update the on system firmware over Bluetooth, a sketchy venture in the best of conditions.

Command Structure and Flow

Most Kiiroo toys will have 3 characteristics.

  • Bootloader Commands/Control (CTL)
  • Data (DATA)
  • Sensor (SENSOR)

All bootloader related commands go to CTL.

Commands sent to the boot loader are 2 bytes, sent by setting the value of CTL with 1 byte, then the value of DATA with 1 byte.

0xGG -> CTL
0xHH -> DATA
  • 0xGG - Byte 0 - command index
  • 0xHH - Byte 1 - command data

After this, CTL is read, and the value signifies the success/failure of the operation.

  • 0x02 - Success
  • Anything not 0x2 - Failure

If the operation succeeds and expects data back, it will read the DATA characteristic. Data returns can vary in length. If this is the case,


Get Execution Mode

Retrieves information about the current execution mode of the hardware.


  • Command Index: 0x03
  • Command Data: 0x00


  • Byte[1] & 0x0 - Bootloader Mode
  • Byte[1] & 0x1 - Application Mode

Set Execution Mode

Change the execution mode to Bootloader mode and resets the device.


  • Command Index: 0x06

  • Command Data: 0x00


    None, device will most likely disconnect after command.

Get Software Version

Retrieves information about the version of the firmware currently on the hardware.


  • Command Index: 0x05
  • Command Data: 0x00


If return is 6 bytes:

  • Byte[4] - Major Version
  • Byte[5] - Minor Version

If return is 12 bytes:

  • Byte[10] - Major Version
  • Byte[11] - Minor Version

For example, if the firmware version is v1.3, and the return is 6 bytes, we expect it to look like

0xXX 0xXX 0xXX 0xXX 0x01 0x03

Get Flash Information

Retrieves information about the on-chip flash. As toys may have different chips with differing sizes of flash, return sizes may vary.


  • Command Index: 0x0A
  • Command Data: 0x00


If return is 7 bytes:

  • High nibble of Byte[0] - Address Increment
  • Low nibble of Byte[0] - Word Size
  • Byte[1] << 8 || Byte[2] - Program Length
  • Byte[3] << 8 || Byte[4] - Program Base
  • Byte[5] << 8 || Byte[6] - Row Length

If return is 9 bytes:

  • Byte[0] - Flash Erase Value
  • High nibble of Byte[1] - Address Increment
  • Low nibble of Byte[1] - Word Size
  • Byte[2] << 8 || Byte[3] - Program Length
  • Byte[4] << 16 || Byte[5] << 8 || Byte[6] - Program Base
  • Byte[7] << 8 || Byte[8] - Row Length

Erase Memory

Erases the flash of the internal microcontroller.


  • Command Index: 0x09
  • Command Data: 0x00


No return value.

Verify Memory

Verifies memory. Not sure what this means.


  • Command Index: 0x08
  • Command Data: 0x00


No return value.


Returns the CRC of the currently loaded firmware.


  • Command Index: 0x07
  • Command Data: 0x00


CRC string for the loaded firmware.

Push Block

Sends a block of firmware code to the device to be written to flash.


  • Command Index: 0x0b
  • Command Data: Row data, variable length



Write Block

Writes the previously pushed block to flash.


  • Command Index: 0x0c
  • Command Data: Memory row to write to, as string with leading zeros.