====== KBI - Khadas Bootloader Instructions ======
This page introduces about KBI. You will learn how to manage the status of Khadas SBC through KBI.
Khadas Bootloader Instructions(KBI) can be used to:
* Manage the programmable MCU
* Carry out low level hardware management
* Let developers utilise all the features of Khadas SBCs.
This page takes VIM2 as an example.
===== Uboot usage =====
To get started, make sure you have booted into U-Boot:
```shell
normal power off
boot wol: enable
Hit Enter or space or Ctrl+C key to stop autoboot -- : 0
kvim2# _
```
==== Help information =====
You can get help information by typing ''kbi'':
```shell
kvim2# kbi
kbi - Khadas Bootloader Instructions sub-system
Usage:
kbi [function] [mode] [write|read]
kbi version - read version information
kbi usid - read usid information
kbi adc - read adc value
kbi powerstate - read power on state
kbi poweroff - power off device
kbi ethmac - read ethernet mac address
kbi led [systemoff|systemon] w - set blue led mode
kbi led [systemoff|systemon] r - read blue led mode
kbi bootmode w - set bootmode to emmc or spi
kbi bootmode r - read current bootmode
kbi trigger [wol|rtc|ir|dcin|key|gpio] w <0|1> - disable/enable boot trigger
kbi trigger [wol|rtc|ir|dcin|key|gpio] r - read mode of a boot trigger
```
==== MCU Verison ====
Get the MCU firmware version:
```shell
kvim2# kbi version
version: 03
```
==== Initialize ====
Initialize the KBI:
```shell
kvim2# kbi init
```
==== Serial number ====
Get the device serial number:
```shell
kvim2# kbi usid
usid: 000000
```
==== ADC ====
Get ADC value:
```shell
kvim2# kbi adc
adc: 0x236
```
The ADC value can distinguish between hardware modules.
==== Power Off ====
Power off the device:
```shell
kvim2# kbi poweroff
```
==== MAC Address ====
Get the Ethernet MAC address:
```shell
kvim2# kbi ethmac
mac address: 98:aa:fc:60:44:c0
```
==== LED Control ====
Setup the blue LED:
The blue LED has 4 working modes: ''Always Off'', ''Always on'', ''Breathe'' and ''Heartbeat''. It indicates VIM working modes.
The MCU,in charge of system power management, controls the blue LED. The CPU controls the white LED.
In this case, the blue LED still work even VIM2 was powered off.
The KBI can be used to program the blue LED for two working modes:
* system off / idle: power off status, the CPU is in power-down mode.
* system on / working: power on status, the CPU is in working mode.
For example:
To check the blue LED’s setting for ''system off'' / idle status:
```shell
kvim2# kbi led systemoff r
led mode: breathe [systemoff]
```
To check the blue LED’s setting for ''system on'' / working status:
```shell
kvim2# kbi led systemon r
led mode: off [systemon]
```
When VIM2 is powered on,the blue LED is ''Always off''.
You can also reset it to ''breathe'' mode:
```shell
kvim2# kbi led systemon w breathe
```
You can also change the setting for ''system on'' / working status:
```shell
kvim2# kbi led systemon w Heartbeat
```
==== Boot Mode ====
You can flash the images to SPI or eMMC storage in VIM2, and setup one of them as the default boot media by KBI.
Set the default boot media as the SPI:
```shell
kvim2# kbi bootmode w spi
```
Set default boot media as eMMC storage:
```shell
kvim2# kbi bootmode w emmc
```
You can take a review on the default boot media by running:
```shell
kvim2# kbi bootmode r
bootmode: emmc
```
==== Boot Trigger Events ====
VIM2 supports different events for triggering boot-up:
* WOL: Wake on Lan
* RTC: RTC timer
* IR: IR remote controller
* DCIN: Plug in the DC adapter
* Key: Power Key/Button
* GPIO: External GPIO events
It means any of the above events can trigger VIM2 to power-on after that trigger event has been set to the ''enabled'' status.
For example:
* Get the status of the WOL trigger event: \\ ```shell
kvim2# kbi trigger wol r
boot wol: disable
```
* WOL is disabled for the pre-installed ROM by default, you can enable it by writing a new value: \\ ```shell
kvim2# kbi trigger wol w 1
set_wol: 1
```
* In general, you will disable the WOL for security reasons. : \\ ```shell
kvim2# kbi trigger wol w 0
set_wol: 0
```
====== Read for reference ======
* [[https://dl.khadas.com/Hardware/Edge/MCU/Edge-V_MCU_REG_EN.pdf|Edge-V MCU Register Map]]
* [[https://dl.khadas.com/Hardware/VIM2/MCU/VIM2_MCU_REG_EN.pdf|VIM2 MCU Register Map]]
* [[https://dl.khadas.com/Hardware/VIM3/MCU/VIM3_MCU_REG_EN.pdf|VIM3 MCU Register Map]]