Javascript implementation of the Kinetis Bootloader protocol
============================================================

Based on the [Kinetis Bootloader v2.0.0 Reference Manual](https://github.com/UltimateHackingKeyboard/bootloader/blob/master/doc/Kinetis%20Bootloader%20v2.0.0%20Reference%20Manual.pdf)

## Supported communication channels/protocols
- [x] USB
- [ ] I2C
- [ ] SPI
- [ ] CAN
- [ ] UART

## Supported Commands
We implemented only the commands that is used in UHK software.
If someone needs other commands, (s)he can easily implement it based on existing. 

- [x] GetProperty
- [ ] SetProperty
- [ ] FlashEraseAll 
- [x] FlashEraseRegion 
- [x] FlashEraseAllUnsecure 
- [x] ReadMemory 
- [x] WriteMemory 
- [ ] FillMemory 
- [x] FlashSecurityDisable 
- [ ] Execute 
- [ ] Call 
- [x] Reset 
- [ ] FlashProgramOnce 
- [ ] FlashReadOnce 
- [ ] FlashReadResource 
- [ ] ConfigureQuadSpi 
- [ ] ReliableUpdate 
- [x] ConfigureI2c 
- [ ] ConfigureSpi 
- [ ] ConfigureCan 

## How to use

```Typescript
  // Initialize peripheral
  const usbPeripheral = new UsbPeripheral({ productId: 1, vendorId: 1 });
  // Initialize Kboot
  const kboot = new KBoot(usbPeripheral);
  // Call the command
  const version = await kboot.getBootloaderVersion();
  // ... more commands
  
  // Close the communication channel. Release resources
  kboot.close();
```

If you have to communicate other I2C device over USB call `kboot.configureI2c(i2cId)` before the command.

```Typescript
  const usbPeripheral = new UsbPeripheral({ productId: 1, vendorId: 1 });
  const kboot = new KBoot(usbPeripheral);
  
  // Get the bootloader version of I2C device
  await kboot.configureI2c(i2cId);
  const version = await kboot.getBootloaderVersion();
```

## TODO
- [ ] Improve exception handling
