á¡á
ááºážá¡áá±ážá áá
áºá
áááºáá
áºááá¯ááºážá¡áá±ááŒáá·áº 0x0A DC7831
á€áá±á¬ááºážáá«ážááœáẠemulator ááœáẠdevice firmware ááá¯áááºááá¯á· run ááááºá debugger ááŸáá·áº á¡ááŒááºá¡ááŸááºá¡áá»áá¯ážáááºáá±á¬ááºááŸá¯ááᯠááá¯ááºááŒááŒá®áž firmware á áá±ážáááºáá±á¬ dynamic analysis ááá¯áá¯ááºáá±á¬ááºáááºááᯠá€áá±á¬ááºážáá«ážááœáẠáá±á¬áºááŒáá«áááºá
á á±á¬ááá¯áá»ážáá¬á
ááá¯ážá¡áá±ážá ááá«ážááœá±á·áááºážááŸá¬
ááœááºáá²á·áá±á¬ááŸá áºá¡áááºážáááºá áá»áœááºá¯ááºááá¯á·ááá¬ááºááœá²áááºážááœáẠá ááºáá á¹á ááºážáá áºáá¯á Firmware ááᯠá á¯á¶á ááºážá á áºáá±ážááẠááá¯á¡ááºáá«áááºá Firmware ááᯠáá»á¯á¶á·ááŒá®áž bootloader ááŒáá·áº áá¯ááºááá¯ážáá¬ážáááºá áá°ááẠá€á¡áá¬ááᯠá¡ááœááºááŸá¯ááºááœá±ážáá±á¬áááºážááŒáá·áº ááŒá¯áá¯ááºáá²á·ááŒá®áž ááŸááºáá¬ááºáá²ááœáẠáá±áá¬áá»á¬ážááᯠá¡ááŒáááºáá±á«ááºážáá»á¬ážá áœá¬ ááœáŸá±á·ááŒá±á¬ááºážáá±ážáá²á·áááºá ááá¯á·áá±á¬áẠFirmware ááá¯ááºááá¯ááºá á¡áá¶áá á¹á ááºážáá»á¬ážááŸáá·áº áááºááŒáœá áœá¬ áá¯á¶á·ááŒááºáá²á·áááºá á€á¡áá¬á¡á¬ážáá¯á¶ážááᯠMIPS core ááœááºááŸááááºá
áááºááœááºáá»ááºá¡ááŒá±á¬ááºážá¡áááºážááŒá±á¬áá·áºá áááŸáááá¯ááºáá±á¬ emulator áá»á¬ážááẠáá»áœááºá¯ááºááá¯á·ááŸáá·áº áááá¯ááºáá®áá±á¬áºáááºážá áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºááᯠrun áá»ááºáá±ážáááºá ááá¯á·áá±á¬áẠáá»áœááºá¯ááºááá¯á·ááẠá¡áááá·áºáá¯á¶ážáá¯ááºáá±á¬ááºááá¯ááºááŒá®áž áááºá firmware ááᯠáá¯ááºááá¯ážááá¯ááºá á±ááá·áº áá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯áẠemulator ááŒá¯áá¯ááºááẠáá¯á¶ážááŒááºáá²á·áááºá áá»áœááºáá±á¬áºááá¯á· á ááºážááŒáá·áºáá±á¬á· á¡áá¯ááºááŒá áºááœá¬ážáááºá áááºá ááá¯ááºážáá²ááᯠáá¯ááºáá±á¬ááºááẠá¡áá¶áááááá¬áá»á¬áž ááá·áºáá»áŸáẠáá¬áá¯ááºáááºáááºážáᯠáá»áœááºá¯ááºááá¯á· ááœá±ážáá²á·áááºá á¡áááºážááá¬áá«áá°áž - ááŒá®ážááœá¬ážáá¬áááºáž áá±á¬ááºážáá«áááºá áá»áœááºá¯ááºááá¯á· áááºááœá±ážááŒá®áž ááŒáá·áºá á¯á¶áá±á¬ emulator áá áºáá¯ááᯠááŒá¯áá¯ááºááẠáá¯á¶ážááŒááºáá²á·áááºá
ááááºááŸá¬ ááœááºáá»á°áá¬á
áá
Ạemulator ááŒá
áºáááºá
áá¬ááŒá±á¬áá·áº Kopycat
á áá¬ážáá¯á¶ážáá»á¬ážáá±á«áºááœáẠááŒáá¬ááºáá áºáá¯ááŸááááºá
- copycat (á¡ááºá¹áááááºá áá¬áẠ[ËkÉpɪkÊt]) - á¡áá¯áá°áá°á á¡áá¯áá°áá°á
- ááœá±á¬áá» (á¡ááºá¹áááááºá áá¬áẠ[ËkÊt]) - ááŒá±á¬ááºá ááŒá±á¬áẠ- ááá±á¬áá»ááºáááºáá®ážáá°ááœá±áá²á á¡ááŒáá¯ááºáá¯á¶ážáááá á¹áá¬ááº
- á á¬áá¯á¶áž "K" ááẠKotlin áááá¯ááááºážáááºážáá¬áá¬á áá¬ážááŸááŒá áºáááºá
Copycat
emulator ááá¯áááºáá®ážáá±á¬á¡áá«á á¡ááœááºáááá»áá±á¬áááºážááá¯ááºáá»á¬ážááᯠáááºááŸááºáá²á·áááº-
- á¡áá¶áááááá¬áá»á¬ážá áá±á¬áºáá»á°ážáá»á¬ážá áááá¯áááºáᬠcores á¡áá áºáá»á¬ážááᯠáá»ááºááŒááºá áœá¬ áááºáá®ážááá¯ááºááŸá¯á
- á¡áá»áá¯ážáá»áá¯ážáá±á¬ modules áá»á¬ážá០virtual device ááá¯á á¯áá±ážááá¯ááºááŸá¯á
- áááºááá·áº binary data (firmware) ááá¯áááᯠvirtual device áááŸááºáá¬ááºáá²ááá¯á· load áá¯ááºááá¯ááºá áœááºáž;
- áá»áŸááºáá áºááŒááºááá¯ááºáá»ááºáá»á¬áž (á áá áºá¡ááŒá±á¡áá±ááá»áŸááºáá áºááŒááºáá¯á¶áá»á¬áž) ááŸáá·áºá¡áá¯ááºáá¯ááºááá¯ááºááŸá¯á
- Built-in debugger ááŸáááá·áº emulator ááŸáá·áº á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááá¯ááºááŸá¯á
- áá±ááºáá®ááœá¶á·ááŒáá¯ážááá¯ážáááºáá±á¬ áá¬áá¬á áá¬ážáá±á¬ááºážáá»á¬ážá
ááááºá¡áá±ááŒáá·áº Kotlin ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáááºá¡ááœáẠááœá±ážáá»ááºáá¶áá²á·ááááºá áááºá áºáá¬ážáááá¯áá¬áááºáᬠ(á€áááºááŸá¬ áá±á¬áºáá»á°ážáá»á¬ážá¡áá»ááºážáá»ááºáž virtual data buses áá»á¬ážááŸáááá·áº áááºááœááºááá·áºá¡áá«)á JSON ááᯠá ááºáá á¹á ááºážáá±á¬áºááŒáá»ááºáá±á¬áºáááºá¡ááŒá áºá ááŸáá·áº GDB RSP ááŸáá·áº debugger ááŸáá·áºá¡ááŒááºá¡ááŸááºáááºáá¶áááºá¡ááœáẠprotocol á¡ááŒá ẠGDB RSP ááá¯á·ááŒá áºáááºá
ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááŸá¬ ááŸá áºááŸá áºáá»á±á¬áºááá·áºáᬠááŸááá±ážááŒá®áž áááºááŒáœá áœá¬ áá¯ááºáá±á¬ááºáá±áá«áááºá ááá¯á¡áá»áááºá¡áá±á¬á¡ááœááºáž MIPSá x86á V850ESá ARM ááŸáá·áº PowerPC áááá¯áááºáᬠcore áá»á¬ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá²á·áááºá
ááá±á¬áá»ááºááẠááŒá®ážááœá¬ážáá¬áᬠáá°á¡áá»á¬ážááᯠáá»ááºáá»ááºááŒáá·áºááŒáá·áºáááºááŒááẠá¡áá»áááºáá»áá±á¬ááºáá¬ááŒá®ááŒá áºáááºá áá»áœááºá¯ááºááá¯á·ááẠáá±á¬ááºááá¯ááºážááœáẠááá±á¬áá»ááºá á¡áá±ážá áááºáá±á¬áºááŒáá»ááºááᯠáá¯ááºáá±á¬ááºáááºááŒá áºáá±á¬áºáááºáž ááá¯á¡áá»áááºááœáẠKopycat ááᯠá¡áá¯á¶ážááŒá¯ááẠá¡á¬áá¯á¶á áá¯ááºáá«áááºá
á
áááºáááŸááºáá°áá»á¬ážá¡ááœááºá áááá¯ááá¯ážááŸááºážáá¬ážááŸááºážááᯠemulator á០áá±á«ááºážáá¯ááºáá¯ááºááá¯ááºáá«áááºá
emulator ááœááºááŒá¶á·
SMARTRHINO-2018 ááœááºáááá·áºá¡ááœáẠá¡á
á±á¬ááá¯ááºážááœáẠááŒá±á¬ááºážááŒááºá¡ááºáá»ááºáá®áá¬á
áœááºážáááºááᯠáááºááŒá¬ážáááºá¡ááœáẠá
ááºážáááºáááááᬠâááŒá¶á·â ááᯠáááºáá®ážáá²á·ááŒá±á¬ááºáž ááááááŒáá«á
áá¯á·á Static Firmware ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯ áá¯ááºáááºážá
ááºááᯠáá±á¬áºááŒáá¬ážáá«áááºá
ááᯠ"á áá®áá¬áá»á¬áž" ááá¯ááá·áºááœááºážááŒá®áž emulator ááœáẠfirmware ááᯠrun ááŒáá«á áá¯á·á
áá»áá±á¬áºááá¯á·ááá¯á¡ááºáá«áááº:
1) Java 1.8
2) Python ááŸáá·áº module
Windows á¡ááœááº:
1)
2)
Linux á¡ááœááº-
1) ááá¯áááº
áááºááẠEclipseá IDA Pro ááá¯á·ááá¯áẠradare2 ááᯠGDB áá¯á¶ážá áœá²áá°á¡ááŒá Ạá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
áááºááá¯á¡áá¯ááºáá¯ááºááá²
emulator ááœáẠfirmware ááá¯áá¯ááºáá±á¬ááºáááºá¡ááœááºá áááá·áºáááááá¬á analogueááŒá áºááá·áº virtual device ááᯠ"á á¯áá±áž" ááẠááá¯á¡ááºáá«áááºá
áááááá¬á¡á á Ạ(âááŒá¶á·â) ááᯠááá±á¬ááºáá¯á¶ááœáẠááŒááá¯ááºáááº-
emulator ááœáẠmodular ááœá²á·á ááºážáá¯á¶ááŸáááŒá®áž áá±á¬ááºáá¯á¶áž virtual device ááᯠJSON ááá¯ááºááœáẠáá±á¬áºááŒááá¯ááºáá«áááºá
JSON 105 ááá¯ááºážáá»á¬áž
{
"top": true,
// Plugin name should be the same as file name (or full path from library start)
"plugin": "rhino",
// Directory where plugin places
"library": "user",
// Plugin parameters (constructor parameters if jar-plugin version)
"params": [
{ "name": "tty_dbg", "type": "String"},
{ "name": "tty_bt", "type": "String"},
{ "name": "firmware", "type": "String", "default": "NUL"}
],
// Plugin outer ports
"ports": [ ],
// Plugin internal buses
"buses": [
{ "name": "mem", "size": "BUS30" },
{ "name": "nand", "size": "4" },
{ "name": "gpio", "size": "BUS32" }
],
// Plugin internal components
"modules": [
{
"name": "u1_stm32",
"plugin": "STM32F042",
"library": "mcu",
"params": {
"firmware:String": "params.firmware"
}
},
{
"name": "usart_debug",
"plugin": "UartSerialTerminal",
"library": "terminals",
"params": {
"tty": "params.tty_dbg"
}
},
{
"name": "term_bt",
"plugin": "UartSerialTerminal",
"library": "terminals",
"params": {
"tty": "params.tty_bt"
}
},
{
"name": "bluetooth",
"plugin": "BT",
"library": "mcu"
},
{ "name": "led_0", "plugin": "LED", "library": "mcu" },
{ "name": "led_1", "plugin": "LED", "library": "mcu" },
{ "name": "led_2", "plugin": "LED", "library": "mcu" },
{ "name": "led_3", "plugin": "LED", "library": "mcu" },
{ "name": "led_4", "plugin": "LED", "library": "mcu" },
{ "name": "led_5", "plugin": "LED", "library": "mcu" },
{ "name": "led_6", "plugin": "LED", "library": "mcu" },
{ "name": "led_7", "plugin": "LED", "library": "mcu" },
{ "name": "led_8", "plugin": "LED", "library": "mcu" },
{ "name": "led_9", "plugin": "LED", "library": "mcu" },
{ "name": "led_10", "plugin": "LED", "library": "mcu" },
{ "name": "led_11", "plugin": "LED", "library": "mcu" },
{ "name": "led_12", "plugin": "LED", "library": "mcu" },
{ "name": "led_13", "plugin": "LED", "library": "mcu" },
{ "name": "led_14", "plugin": "LED", "library": "mcu" },
{ "name": "led_15", "plugin": "LED", "library": "mcu" }
],
// Plugin connection between components
"connections": [
[ "u1_stm32.ports.usart1_m", "usart_debug.ports.term_s"],
[ "u1_stm32.ports.usart1_s", "usart_debug.ports.term_m"],
[ "u1_stm32.ports.usart2_m", "bluetooth.ports.usart_m"],
[ "u1_stm32.ports.usart2_s", "bluetooth.ports.usart_s"],
[ "bluetooth.ports.bt_s", "term_bt.ports.term_m"],
[ "bluetooth.ports.bt_m", "term_bt.ports.term_s"],
[ "led_0.ports.pin", "u1_stm32.buses.pin_output_a", "0x00"],
[ "led_1.ports.pin", "u1_stm32.buses.pin_output_a", "0x01"],
[ "led_2.ports.pin", "u1_stm32.buses.pin_output_a", "0x02"],
[ "led_3.ports.pin", "u1_stm32.buses.pin_output_a", "0x03"],
[ "led_4.ports.pin", "u1_stm32.buses.pin_output_a", "0x04"],
[ "led_5.ports.pin", "u1_stm32.buses.pin_output_a", "0x05"],
[ "led_6.ports.pin", "u1_stm32.buses.pin_output_a", "0x06"],
[ "led_7.ports.pin", "u1_stm32.buses.pin_output_a", "0x07"],
[ "led_8.ports.pin", "u1_stm32.buses.pin_output_a", "0x08"],
[ "led_9.ports.pin", "u1_stm32.buses.pin_output_a", "0x09"],
[ "led_10.ports.pin", "u1_stm32.buses.pin_output_a", "0x0A"],
[ "led_11.ports.pin", "u1_stm32.buses.pin_output_a", "0x0B"],
[ "led_12.ports.pin", "u1_stm32.buses.pin_output_a", "0x0C"],
[ "led_13.ports.pin", "u1_stm32.buses.pin_output_a", "0x0D"],
[ "led_14.ports.pin", "u1_stm32.buses.pin_output_a", "0x0E"],
[ "led_15.ports.pin", "u1_stm32.buses.pin_output_a", "0x0F"]
]
}
Parameter ááá¯á¡á¬áá¯á¶á áá¯ááºáá«á firmware ááᯠá¡ááá¯ááºáž áá±á¬ááºáá»á¬áž firmware á¡ááŒá Ạvirtual device ááœááºáááºááá¯ááºáá±á¬ááá¯ááºáá áºáá¯áá¡áááºááŒá áºáááºá
virtual device ááŸáá·áº áááºááááºáááºááŸá¯á áá áºááŸáá·áº áááºážáá¡ááŒááºá¡ááŸááºá¡áá»áá¯ážáááºáá±á¬ááºááŸá¯ááᯠá¡á±á¬ááºáá«áá¯á¶ááŒááºážááŒáá·áº ááá¯ááºá á¬ážááŒá¯ááá¯ááºáááº-
emulator á áááºááŸáá ááºážáááºááŸá¯ á¥ááá¬ááœáẠáááºá OS á COM port áá»á¬áž (ááá°ážáá¯áẠáá±á¬áºáá»á°ážá¡ááœáẠá¡ááŸá¬ážá¡ááœááºáž UART ááŸáá·áº UART) ááŸáá·áº á¡ááŒááºá¡ááŸááºá¡áá»áá¯ážáááºáá±á¬ááºááŸá¯ áá«áááºáááºá áááºážááá¯á·ááẠá ááºáá á¹á ááºážáá»á¬ážááŸáá·áº áá»áááºáááºáá¬ážááá·áº á¡á á áºá¡ááŸáẠport áá»á¬áž ááá¯á·ááá¯áẠvirtual COM port áá»á¬ážááŒá áºááá¯ááºááẠ(áááºážá¡ááœáẠáááºáá¬ááá¯á¡ááºáááºá com0com/socat).
áá±á¬áá±á¬áááºááœáẠááŒááºáá០emulator ááŸáá·áº á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááẠá¡ááááááºážáááºážááŸá áºáá¯ááŸááááºá
- GDB RSP áááá¯ááá¯áá±á¬ (á¡ááá¯á¡áá á€áááá¯ááá¯áá±á¬ááᯠáá¶á·ááá¯ážáá±ážááá·áº áááááá¬áá»á¬ážááŸá¬ Eclipse / IDA / radare2);
- internal emulator command line (Argparse ááá¯á·ááá¯áẠPython)á
Virtual COM á¡áá±á«ááºáá»á¬áž
terminal ááŸáááá·áº á ááºááœááºážááŸá ááááá ááºáá áºáá¯á UART ááŸáá·áº á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºáááºá¡ááœááºá áááºá áẠvirtual COM ports áá áºá á¯á¶ááᯠáááºáá®ážááẠááá¯á¡ááºáááºá áá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœááºá ááááºáááºážáá áºáá¯ááᯠemulator ááŸá¡áá¯á¶ážááŒá¯ááŒá®áž áá¯ááááá áºáá¯ááᯠterminal áááá¯áááẠ(PuTTY ááá¯á·ááá¯áẠscreen) ááŸá¡áá¯á¶ážááŒá¯áááº-
com0com ááᯠá¡áá¯á¶ážááŒá¯
Virtual COM port áá»á¬ážááᯠcom0com kit á០setup utility ááᯠá¡áá¯á¶ážááŒá¯á configure áá¯ááºáá¬ážááẠ(console version - C:Program Files (x86)com0comsetupÑ.exeá ááá¯á·ááá¯áẠGUI áá¬ážááŸááºáž - C:Program Files (x86)com0comsetupg.exe):
áá±áá¹áá¬áá»á¬ážááá¯á á áºáá±ážáá«á buffer overrun ááá¯ááœáá·áºáá«á áááºáá®ážáá¬ážáá±á¬ virtual port áá»á¬ážá¡á¬ážáá¯á¶ážá¡ááœááºá ááá¯ááºáá«á emulator ááẠCOM port á០áá¯á¶á·ááŒááºááŸá¯ááᯠá á±á¬áá·áºáááá·áºáááºá
socat ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážá
UNIX á
áá
áºáá»á¬ážááœáẠsocat utility ááá¯á¡áá¯á¶ážááŒá¯á emulator á០virtual COM port áá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬ááºáááºáá®ážáá±ážáá«áááºá áááºážááá¯áá¯ááºáá±á¬ááºáááºá¡ááœááºá emulator ááá¯á
áááºáá±á¬á¡áá« port name ááœáẠprefix ááá¯áááºááŸááºáá¯á¶áá¬ááŒá
áºáááºá socat:
.
á¡ááœááºážááá¯ááºáž á¡áááá·áºáá±ážá á¬ááŒá±á¬ááºáž áá»ááºááŸá¬ááŒáẠ(Argparse ááá¯á·ááá¯áẠPython)
Kopycat ááẠááœááºááá¯ážááºá¡ááá®áá±ážááŸááºážáá áºáá¯ááŒá áºáá±á¬ááŒá±á¬áá·áºá emulator ááẠáááºážáá¡áá¬ááá¹áá¯áá»á¬ážááŸáá·áº variable áá»á¬ážááŸáá·áº á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºáááºá¡ááœáẠcommand line interface ááœá±ážáá»ááºá áá¬ááŸá áºáá¯ááᯠáá±ážáá±á¬ááºáááº- Argparse ááŸáá·áº Pythoná
Argparse ááẠKopycat ááœááºáááºáá±á¬ááºáá¬ážáá±á¬ CLI áá áºáá¯ááŒá áºááŒá®áž áá°ááá¯ááºážá¡ááœáẠá¡ááŒá²áááºážá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá
á¡ááŒá¬ážááœá±ážáá»ááºá áᬠCLI ááẠPython á áá¬ážááŒááºááŒá áºáááºá áááºážááá¯á¡áá¯á¶ážááŒá¯áááºá¡ááœáẠáááºááẠJep Python module ááá¯ááá·áºááœááºážááŒá®áž Python ááŸáá·áºá¡áá¯ááºáá¯ááºááẠemulator ááᯠconfigure áá¯ááºááẠááá¯á¡ááºááẠ(á¡áá¯á¶ážááŒá¯áá°ááááºáá áá áºááœááºááá·áºááœááºážáá¬ážááá·áº Python á áá¬ážááŒááºááᯠá¡áá¯á¶ážááŒá¯áá«áááº)á
Python module ááᯠJep ááá·áºááœááºážááŒááºážá
Linux Jep á¡á±á¬ááºááœáẠpip ááŸáá áºááá·áº ááá·áºááœááºážááá¯ááºáááº-
pip install jep
Windows ááœáẠJep ááá·áºááœááºážáááºá Windows SDK ááŸáá·áº áááºááá¯ááºáᬠMicrosoft Visual Studio ááᯠáŠážá
áœá¬ ááá·áºááœááºážááá«áááºá áá»áœááºá¯ááºááá¯á·ááẠááá·áºá¡ááœáẠá¡áááºážáááºááá¯ááá¯ááœááºáá°á¡á±á¬áẠááŒá¯áá¯ááºáá¬ážáá«áááºá
pip install jep-3.8.2-cp27-cp27m-win_amd64.whl
Jep áááºáááºááŸá¯ááá¯á á áºáá±ážáááºá áááºááẠcommand line ááœáẠrun áááºááá¯á¡ááºáááº-
python -c "import jep"
áá¯á¶á·ááŒááºááŸá¯ááŒáá·áº á¡á±á¬ááºáá«á á¬ááᯠáááºáá¶ááá«áááº-
ImportError: Jep is not supported in standalone Python, it must be embedded in Java.
ááá·áºá
áá
áºá¡ááœáẠemulator batch ááá¯ááºááœáẠ(copycat.bat - Windows á¡ááœááºá áááá¹áá°ááŒá±á¬áẠ- Linux á¡ááœááº) ááá·áºáááºáá»ááºáá»á¬ážá
á¬áááºáž DEFAULT_JVM_OPTS
áá±á¬ááºááẠparameter áá
áºáá¯ááá·áºáá«á Djava.library.path
â áááºážááœáẠááá·áºááœááºážáá¬ážáá±á¬ Jep module ááá¯á· áááºážááŒá±á¬ááºážáá«áááºááááºá
Windows á¡ááœáẠááááºááẠá€áá²á·ááá¯á·áá±á¬ á á¬ááŒá±á¬ááºážááŒá áºááá·áºáááº-
set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep"
Kopycat ááᯠá áááºááŒááºáž
emulator ááẠconsole JVM application áá áºáá¯ááŒá áºáááºá ááœáŸááºáááºááŒááºážááᯠoperating system command line script (sh/cmd) ááŸáááá·áº áá¯ááºáá±á¬ááºáááºá
Windows á¡á±á¬ááºááœáẠrun ááẠcommand
binkopycat -g 23946 -n rhino -l user -y library -p firmware=firmwarerhino_pass.bin,tty_dbg=COM26,tty_bt=COM28
socat utility ááá¯á¡áá¯á¶ážááŒá¯á Linux á¡á±á¬ááºááœáẠrun ááẠcommand-
./bin/kopycat -g 23946 -n rhino -l user -y library -p firmware=./firmware/rhino_pass.bin, tty_dbg=socat:./COM26,tty_bt=socat:./COM28
-g 23646
- GDB áá¬áá¬ááá¯á·áááºáá±á¬ááºáááºááœáá·áºááá·áº TCP áá±á«ááºá-n rhino
â áááºáá áá Ạmodule áá¡ááẠ(á á¯áá±ážáá¬ážáá±á¬áááááá¬);-l user
â áááºá module ááá¯ááŸá¬ááœá±ááẠá á¬ááŒáá·áºááá¯ááºá¡áááºá-y library
â á ááºááœááºáá«ááŸááá±á¬ module áá»á¬ážááá¯ááŸá¬ááœá±áááºáááºážááŒá±á¬ááºážáfirmwarerhino_pass.bin
- firmware ááá¯ááºááá¯á·áááºážááŒá±á¬ááºáž;- COM26 ááŸáá·áº COM28 áá»á¬ážááẠvirtual COM port áá»á¬ážááŒá áºáááºá
ááááºá¡áá±áá²á· á¡áá»ááºááŒáá«áááá·áºáááºá Python >
(ááá¯á·ááá¯áẠArgparse >
):
18:07:59 INFO [eFactoryBuilder.create ]: Module top successfully created as top
18:07:59 INFO [ Module.initializeAndRes]: Setup core to top.u1_stm32.cortexm0.arm for top
18:07:59 INFO [ Module.initializeAndRes]: Setup debugger to top.u1_stm32.dbg for top
18:07:59 WARN [ Module.initializeAndRes]: Tracer wasn't found in top...
18:07:59 INFO [ Module.initializeAndRes]: Initializing ports and buses...
18:07:59 WARN [ Module.initializePortsA]: ATTENTION: Some ports has warning use printModulesPortsWarnings to see it...
18:07:59 FINE [ ARMv6CPU.reset ]: Set entry point address to 08006A75
18:07:59 INFO [ Module.initializeAndRes]: Module top is successfully initialized and reset as a top cell!
18:07:59 INFO [ Kopycat.open ]: Starting virtualization of board top[rhino] with arm[ARMv6Core]
18:07:59 INFO [ GDBServer.debuggerModule ]: Set new debugger module top.u1_stm32.dbg for GDB_SERVER(port=23946,alive=true)
Python >
IDA Pro ááŸáá·áº á¡ááŒááºá¡ááŸááºáááºáá¶ááŒááºážá
á
ááºážáááºááŒááºážááᯠááá¯ážááŸááºážá
á±áááºá áá»áœááºá¯ááºááá¯á·ááẠáá±á¬ááºááœáẠIDA ááœáẠááœá²ááŒááºážá
áááºááŒá¬ááŸá¯á¡ááœáẠá¡áááºážá¡ááŒá
áºááá¯ááºá¡ááŒá
ẠRhino firmware ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
áááºáá¬á¡áá»ááºá¡áááºááá«áá² áááºá Firmware ááá¯áááºáž áááºá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá
IDA Pro ááœáẠKopycat ááá¯ááœáá·áºááŒá®ážáá±á¬ááºá Debugger áá®áá°ážááœáẠááá¯ááºááᯠâá¡ááŸá¬ážááŸá¬ááŒááºáááááá¬ááᯠááŒá±á¬ááºážáá«..."ááŒá®ážáá±á¬á·ááœá±áž"á¡áá±ážááááºáž GDB á¡ááŸá¬ážááŸá¬ááŒááºâ . ááá¯á·áá±á¬áẠáá»áááºáááºááŸá¯-áá®áá°ážááᯠáááºááŸááºáá«á á¡ááŸá¬ážááŸá¬ááŒááºáá° - áá¯ááºáááºážá áẠááœá±ážáá»ááºá áá¬áá»á¬áž...
áááºááá¯ážáá»á¬ážááᯠáááºááŸááºáá«-
- áá»áŸá±á¬ááºááœáŸá¬ - áááºááá·áºáááºááá¯áž
- áááºáá¶áá°á¡áááº- 127.0.0.1 (ááá¯á·ááá¯áẠKopycat áá¯ááºáá±á¬ááºáá±ááá·áº á¡áá±ážááááºážá ááºá IP ááááºá á¬)
- ááááºáááºáž: 23946
ááᯠá¡ááŸá¬ážááŸá¬ááŒááºááŒááºážááá¯ááºááᯠáááá¯ááºáá«ááŒá® (F9 áá®áž)á
emulator ááŸá debugger module ááá¯á·áá»áááºáááºááẠáááºážááá¯ááŸáááºáá«á IDA ááẠá¡ááŸá¬ážááŸá¬ááŒááºááŒááºážáá¯ááºááá¯á· áá±á¬ááºááœá¬ážáááºá á¡ááá¯áááºážááá¯ážáá»á¬áž áááŸáááá¯ááºáááº- ááŸááºáá¯á¶áááºááŸá¯áá»á¬ážá¡ááŒá±á¬ááºáž á¡áá»ááºá¡áááºá stack á¡ááŒá±á¬ááºážá
ááᯠáá»áœááºá¯ááºááá¯á·ááẠá¡ááŸá¬ážááŸá¬ááŒááºáááááá¬á á á¶á¡ááºá¹áá«áááºá¡á¬ážáá¯á¶ážááᯠáá¯á¶ážááá¯ááºáááº-
- ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠá¡ááá·áºááá·áºáá¯ááºáá±á¬ááºááŒááºáž (ááá¯á·á¡ááá·áº О á¡ááá·áºáá»á±á¬áº - áá±á¬á· F7 ááŸáá·áº F8 á¡áá®ážáá®áž);
- ááœááºáá»ááºááŸá¯ááᯠá áááºááŒááºážááŸáá·áº áá±áá¹ááááºááŒááºážá
- áá¯ááºááŸáá·áº áá±áᬠ(F2 áá±á¬á·) ááŸá áºáá¯á áá¯á¶ážá¡ááœáẠbreakpoints áá»á¬ážááᯠáááºáá®ážááŒááºážá
á¡ááŸá¬ážááŸá¬ááŒááºáááááá¬ááá¯á· áá»áááºáááºááŒááºážááẠáá¬ááºážáá²ááºáá¯ááºááᯠáá¯ááºáá±á¬ááºááŒááºážáᯠáááá¯ááá¯áá«á áááºááŸááá¯ááºáá±á¬ááºááŸá¯á¡áá±á¡áá¬ážááẠááááºá
á¬ááŒá
áºááááºá 0x08006A74
- áá¯ááºáá±á¬ááºáá»ááºá
áááºááŒááºážá Reset_Handler. á
á¬áááºážááᯠá¡á±á¬ááºááá¯á· ááœáŸá±á·áá«áá áá¯ááºáá±á¬ááºáá»ááºáá±á«áºááá¯ááŸá¯ááᯠáááºááœá±á·ááŒááºááá¯ááºáá«áááºá á¡ááá. á€á
á¬ááŒá±á¬ááºážáá±á«áºááœáẠáá¬áá¬ááᯠáááºáá¬ážááá¯ááºááẠ(ááááºá
ᬠ0x08006ABE
) ááŸáá·áº áá¯ááºáá±á¬ááºáá»ááºááᯠáá¯ááºáá±á¬ááºáá«á cursor á¡áá ááŒá±ážáá«á (áá±á¬á· F4)á
ááá¯á·áá±á¬áẠáá¯ááºáá±á¬ááºáá»ááºááᯠáááºáá±á¬ááºááẠF7 ááᯠááŸáááºááá¯ááºáááºá á¡ááá.
áááºá command ááᯠrun áá¯ááºáááºážá ááºááᯠáááºáá¯ááºáá«á (F9 áá±á¬á·)á ááá¯á·áá±á¬áẠâáá±áá¹áá á±á¬áá·áºáá«â áááºážááá¯ážááẠááá¯ááºáá áºáá»ááºááŒáá·áº áá±á«áºáá¬áááá·áºáááºá áááºááá¯ááºážáá¬áž:
ááŸáááºááá¯ááºáá¬áá²á· áááºááá¯ááºážáá¬áž Firmware áá¯ááºá áá¯ááºáá±á¬ááºááŸá¯ááᯠááá¯ááºážáá¶á·áá¬ážááŒá®áž áááºážááᯠá¡ááŸá±á¬áá·áºá¡ááŸááºááŒá áºá á±ááá·áº áá¯ááºááŸá ááááºá á¬áá áºáá¯áááºážá០áááºáááºáá¯ááºáá±á¬ááºááá¯ááºáááºá
áááºááẠáá¯ááºááᯠáááºáááºáá¯ááºáá±á¬ááºáá«áá virtual COM port áá»á¬ážááŸáá·áº áá»áááºáááºáá¬ážáá±á¬ terminals áá»á¬ážááœáẠá¡á±á¬ááºáá«ááá¯ááºážáá»á¬ážááᯠááœá±á·ááááá·áºáááº-
"state bypass" line áááŸá±á·ááŸá±á¬ááºááœááºááŸááá±ááŒááºážááẠvirtual Bluetooth module áááºá¡áá¯á¶ážááŒá¯áá°á COM port ááŸáá±áá¬áááºáá¶ááŒááºážáá¯ááºááá¯á·ááŒá±á¬ááºážááœá¬ážáááºááá¯áá±á¬áºááŒáááºá
ááᯠBluetooth terminal (áá¯á¶ááœááºáá«ááŸááá±á¬ COM29) ááœáẠRhino protocol ááŸáá·áºá¡áá® command áá»á¬ážááá¯ááá¯ááºááá·áºááá¯ááºáá«áááºá á¥ááá¬á¡á¬ážááŒáá·áºá "MEOW" á¡áááá·áºááẠ"mur-mur" ááŒáá¯ážááᯠBluetooth terminal ááá¯á·ááŒááºáá±ážáááá·áºáááº-
á¡áá¯áá°á áᬠáá¯á¶ážá ááá¯ááºáá«á
emulator áá áºáá¯ááᯠáááºáá±á¬ááºáá±á¬á¡áá«á áááºááẠáá®ážááŒá¬ážá ááºáá á¹á ááºážáá áºáá¯á á¡áá±ážá áááº/á¡áá¯áá°ááŸá¯á¡ááá·áºááᯠááœá±ážáá»ááºááá¯ááºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá Bluetooth module ááᯠááá°áá®áá±á¬áááºážáááºážáá»á¬ážááŒáá·áº á¡áá¯áá°ááá¯ááºáááº-
- áááááá¬á¡á¬áž á¡ááŒáá·áºá¡á á¡áááá·áºáá±ážááŸá¯áá»á¬ážááŒáá·áº á¡ááŒáá·áºá¡á á¡áá¯áá°áá«áááºá
- AT á¡áááá·áºáá»á¬ážááᯠá¡áá¯áá°áᬠáááºáá áá áºá COM port á០áá±áá¬á á®ážááŒá±á¬ááºážááᯠáááºáá¶áááŸááááºá
- virtual device ááẠááŒá®ážááŒáá·áºá á¯á¶áá±á¬ data redirection ááᯠreal device ááá¯á· áá¶á·ááá¯ážáá±ážáááºá
- á¡ááŒá²áááºáž "OK" ááŒááºáá±ážááá·áº ááá¯ážááŸááºážáá±á¬ áá±á¬ááºážáá«ážááá¯ááŒá áºáááºá
emulator ááááºááŸááá¬ážááŸááºážááẠáá¯ááááááºážáááºážááá¯á¡áá¯á¶ážááŒá¯ááẠ- virtual Bluetooth module ááẠconfiguration ááá¯áá¯ááºáá±á¬ááºáááºá ááá¯á·áá±á¬áẠáááºáá áá áºá COM port á០data áá»á¬ážááᯠ"proxying" mode ááá¯á·ááŒá±á¬ááºážááŒá®áž emulator á UART port ááá¯á·ááŒá±á¬ááºážáááºá
á¡á
áœááºá¡áá»á¬ážá á¡á
áááºá¡ááá¯ááºážá¡áá»áá¯á·ááᯠá¡áá±á¬ááºá¡ááẠááá±á¬áºáá«á áá¯ááºá ááá¯ážááŸááºážáá±á¬ áááááá¬áááºáá¬ááᬠááŒá
áºááá¯ááºááŒá±ááᯠáá¯á¶ážáááºááŒáá·áºááŒáá«á
áá¯á·á á¥ááá¬á¡á¬ážááŒáá·áºá DMA ááá¯á· áá±áá¬ááœáŸá²ááŒá±á¬ááºážááŒááºážááᯠááááºážáá»á¯ááºááẠáá¬áááºááŸáááá·áº á¡áá»áááºááá¯ááºážáááááá¬ááᯠááááºáá®ážáá¬ážáá«á (á
á
áºáá±ážááŸá¯ááẠáá¯ááºáá±á¬ááºááŸá¯ááœáẠáá¯ááºáá±á¬ááºááẠws2812b_á
á±á¬áá·áºáá«áááœááºáááºááŸááááºá 0x08006840
) ááá¯á·áá±á¬áẠfirmware ááẠá¡áá¶á¡á¬áž ááŒááºáááºáááºááŸááºááẠá¡ááŒá²áááºážá
á±á¬áá·áºááá¯ááºážáá±áááºááŒá
áºáááºá á¡áá¯ááºááŸá¯ááºáááºááœááºáááºááŸááááºá 0x200004C4
áááºážááẠDMA áá±áá¬ááá¯ááºážá ááááºážááá¯ááºááŸá¯ááᯠááŒááááº-
á¡áá¶ááᯠááá¯ááºááá¯ááºááŒááºáááºáááºááŸááºááŒááºážááŒáá·áº á€á¡ááŒá±á¡áá±ááá¯á· áá»áœááºá¯ááºááá¯á·áá±á¬ááºááŸáááá¯ááºáááºá á¡áá¯ááºááŸá¯ááºááẠáááºážááᯠinstall ááŒá®ážáá±á¬ááºáá»ááºáá»ááºážá IDA Pro ááœááºá áááºááẠPython áá¯ááºáá±á¬ááºáá»ááºááᯠáááºáá®ážááŒá®áž ááŒááºááŸááºáá áºáá¯ááœáẠáá±á«áºááá¯ááá¯ááºááŒá®áž áááºááá¯áž 1 ááᯠá¡áá¶ááœáẠáá±ážáá¬ážááŒá®ážáá±á¬áẠbreakpoint ááᯠáá¯ááºááœáẠááá¯ááºááá¯ááºááá·áºááá¯ááºáááºá á¡áá¯ááºááŸá¯ááºáááº.
Breakpoint ááá¯ááºááœááºáá°
á¡áááºáá¯á¶áž IDA ááŸá¬ Python function áá áºáá¯ááᯠáááºáá®ážááŒáá·áºáá¡á±á¬ááºá áá®áá°áž ááá¯áẠ- Script á¡áááá·áº...
áááºáááºááŸá á
á¬áááºážááœáẠá¡ááá¯á¡ááœá¬á¡áá
áºáá
áºáá¯ááᯠááá·áºáá«á áááºážááᯠáá¬áááºáá±áž (á¥ááá¬á BPT),
áá¬áááºááŸá á
á¬áá¬ážá¡ááœááºááœáẠáá¯ááºáá±á¬ááºáá»ááºáá¯ááºááᯠááá·áºáá«-
def skip_dma():
print "Skipping wait ws2812..."
value = Byte(0x200004C4)
if value == 1:
PatchDbgByte(0x200004C4, 0)
return False
á¡á²áá®áá±á¬áẠáá»áá±á¬áºááá¯á· ááŸáááºáááºá ááœá±ážááŸá¬áž ááŒá®ážáá»áŸáẠscript window ááá¯ááááºáá«á
áá² áá¯ááºáá¶áá«ááºááᯠááœá¬ážááŒáá·áºáá¡á±á¬áẠ0x0800688A
ááœá²ááŸááºáá
áºáᯠáááºááŸááºáá« (F2 áá±á¬á·)á áááºážááŒááºáá« (á¡ááŒá±á¬ááºážá¡áá¬áá®áá°áž ááŒááºááŸááºááᯠáááºážááŒááºáá«...) áá¬ááºááœáŸááºážá¡áá»áá¯ážá¡á
á¬ážááᯠPython á¡ááŒá
ẠáááºááŸááºááẠááá±á·áá«ááŸáá·áºá
áááºááŸá á¡áá¶áááºááá¯áž ááá¯áá»áŸáẠá¡áá¯ááºááŸá¯ááºááẠ1 ááŸáá·áº áá®áá»áŸááẠá ááá¯á·áá±á¬áẠáááºááẠáá¯ááºáá±á¬ááºáá»ááºááᯠáá¯ááºáá±á¬ááºááá·áºáááºá skip_dma áá¬ááºááœáŸááºážááá¯ááºážááœááº-
á¡áááºá áááºááẠáá¯ááºáá±á¬ááºáá»ááºá¡ááœáẠfirmware ááᯠrun áá«áá breakpoint handler code á á¡á
áá»áá¯ážááŒááºážááᯠIDA window ááœáẠááœá±á·ááŒááºááá¯ááºááẠoutput ááá¯ááºážá¡á¬ážááŒáá·áº Skipping wait ws2812...
. ááᯠFirmware ááẠá¡áá¶ááᯠááŒááºáááºáááºááŸááºááẠá
á±á¬áá·áºáááºááá¯ááºáá«á á¡áá¯ááºááŸá¯ááºáááº.
emulator ááŸáá·áºá¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááŸá¯
á¡áá¯áá°áááºá¡ááá¯á·ááŸá¬ á¡áá¯áá°ááŒááºážááẠáá»á±á¬áºááœáŸááºááŸá¯ááŸáá·áº ááœáŸááºáááºážááŸá¯ááᯠááŒá áºá á±ááá¯ááºááœááºáááŸááá«á emulator ááẠáá¯áá±áá®á¡á¬áž ááŸááºáá¬ááºáá²ááœáẠáá±áá¬áá»á¬ážááᯠááŒááºááá¯ááºá á±ááẠááá¯á·ááá¯áẠthread áá»á¬ážá á¡ááŒááºá¡ááŸááºá¡áá»áá¯ážáááºáá±á¬ááºááŸá¯ááᯠáá°áá±á¬ááºááá¯ááºáá»áŸáẠááá¯áá áááºáááºá á¬ážá áá¬áá±á¬ááºážáá«áááºá
RTOS áá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážááŒá¬ážááœáẠá¡ááºááá¯ááºá¡á¬ážááá¯áẠá¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºáá¯á¶ááᯠááá·áºá¡á¬áž ááŒááá«áááºá áááºážááẠá¡áá¯ááºáá¯ááºáá±áá«á áá¯ááºááá¯ááºáá±á¬ááºááŸá¯ááᯠáŠážá
áœá¬áá±áá¹ááááºááá·áºáááºá function ááá¯áá±á¬ááºááœá¬ážááẠbluetooth_task_entry âLEDâ ááœáŸááºááŒá¬ážáá»ááºá áá¯ááºáá±á¬ááºáá²áá¬áááœá²ááá¯á· (ááááºá
ᬠ0x080057B8
) ááá¯á·áá±á¬áẠáááºááá·áºá¡áá¬ááᯠááááá¯á¶ážáááºáá®ážááŒá®áž á
áá
áºáááºážá
á®ááá¯á· áá±ážááá¯á·áááºááᯠáááºááœá±á·ááá¯ááºáá«áááºá ledControlQueueHandle message áá
áºáá»áá¯á·
variable ááá¯áááºáá±á¬ááºááẠbreakpoint áá
áºáá¯áááºááŸááºáá¬ážááá·áºáááºá ledControlQueueHandleááœááºáááºááŸááááºá 0x20000624
áá¯ááºááᯠáááºáááºáá¯ááºáá±á¬ááºáá«-
ááááºá¡áá±ááŒáá·áº áááºááá·áºáááá·áºááááºá
á¬ááŸá¬ ááááŠážá
áœá¬ ááŒá
áºáá±á«áºáááºááŒá
áºáááºá 0x080057CA
function ááá¯ááá±á«áºáá® osMailAllocááŒá®ážáá±á¬á· ááááºá
á¬ááŸá¬ 0x08005806
function ááá¯ááá±á«áºáá® osMailPutááá¡ááŒá¬ - ááááºá
á¬ááá¯á· 0x08005BD4
( function ááá¯ááá±á«áºáá® osMailGet) function ááŸáá·áºáááºááá¯ááºáááºá leds_task_entry (LED-task) ááá¯ááá¯áááºááŸá¬ á¡áá¯ááºáá»á¬ážááᯠááŒá±á¬ááºážáá²á·ááŒá®áž ááᯠLED-task ááẠááááºážáá»á¯ááºááŸá¯ááᯠáááºáá¶áááŸááá²á·áááºá
á€ááá¯ážááŸááºážáá±á¬áááºážáááºážááŒáá·áº RTOS á¡áá¯ááºáá»á¬ážááẠá¡áá»ááºážáá»ááºážá¡ááŒááºá¡ááŸááºá¡áá»áá¯ážáááºáá±á¬ááºáá¯á¶ááᯠáááºáááºááŸááºááá¯ááºáááºá
á¡ááŸááºááŸá¬á á¡áá¯ááºáá»á¬ážáá¡ááŒááºá¡ááŸááºá¡ááŒááºá¡ááŸááºáááºáá¶áá±ážáááºááá¯ááá¯ááŸá¯ááºááœá±ážááá¯ááºáá±á¬áºáááºáž emulator ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº á€á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááŸá¯ááá¯ááŒá±áá¬áá¶ááŒááºážááẠáááºáááºážááŸá¯áááºážáá«áááºá
Radare2 ááŒáá·áº á áááºáá«á
Radare2 áá²á·ááá¯á·áá±á¬ universal tool ááᯠááẠáá»á áºáá»á°ááŸá¯ááááá«á
r2 ááᯠá¡áá¯á¶ážááŒá¯á emulator ááŸáá·áº áá»áááºáááºáááºá command ááẠá€áá²á·ááá¯á· ááŒá áºáááº-
radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf
á
áááºá¡áá¯á¶ážááŒá¯ááá¯ááºáá«ááŒá® (dc
) ááŸáá·áº áá¯ááºáá±á¬ááºáá»ááºááᯠáá±áá¹ááááºáá« (Ctrl+C)á
áá¶ááá±á¬ááºážá
áœá¬áá²á áá±á¬áá±á¬áááºááœáẠr2 ááẠhardware gdb server ááŸáá·áº memory layout ááŒáá·áºá¡áá¯ááºáá¯ááºáá¬ááœáẠááŒá¿áá¬áá»á¬ážááŸááá±áááºá áááºážááŒá±á¬áá·áºá breakpoints ááŸáá·áº Steps áá»á¬áž á¡áá¯ááºááá¯ááºáá« (command ds
) áá«ááᯠáááŒá¬áááºááŸá¬ ááŒá¯ááŒááºááá¯ááºáááá·áºáááºááá¯á· áá»áœááºáá±á¬áºááá¯á· áá»áŸá±á¬áºááá·áºáá«áááºá
Eclipse ááŒáá·áº ááŒá±ážááŒááºážá
emulator ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážá¡ááœáẠááœá±ážáá»ááºá
áá¬áá»á¬ážáá²á០áá
áºáá¯ááẠáá®ááœááºáá±áá±á¬ device á firmware ááᯠdebug áá¯ááºáááºááŒá
áºáááºá ááŸááºážáááºážáááºá¡ááœááºá áá»áœááºá¯ááºááá¯á·ááẠRhino firmware ááá¯áááºáž á¡áá¯á¶ážááŒá¯áá«áááºá Firmware á¡áááºážá¡ááŒá
áºáá»á¬ážááᯠáááºáá±á«ááºážáá¯ááºáá¯ááºááá¯ááºáá«áááºá
áá»áœááºá¯ááºááá¯á·ááẠáááºááŸááºááŸá¯á០Eclipse ááᯠIDE á¡ááŒá
Ạá¡áá¯á¶ážááŒá¯áá«áááºá
emulator ááẠEclipse ááœáẠá
á¯á
ááºážáá¬ážáá±á¬ firmware ááᯠááá¯ááºááá¯ááºáááºááá¯ááºá
á±áááºá¡ááœáẠparameter ááá¯ááá·áºááœááºážáááºááá¯á¡ááºááẠfirmware=null
emulator launch command ááá¯á·
binkopycat -g 23946 -n rhino -l user -y modules -p firmware=null,tty_dbg=COM26,tty_bt=COM28
á¡ááŸá¬ážááŸá¬ááŒááºáááºááŸá¯ááᯠá áá áºááá·áºááœááºážááŒááºážá
Eclipse ááœáẠáá®áá°ážááᯠááœá±ážáá«á Run - Debug Configurations... ááœáá·áºáá¬áá±á¬ááŒáááºážáá±á«ááºááœááºá á¡ááá¯ááºážá GDB Hardware Debugging áááºááœá²á·á ááºážáá¯á¶á¡áá áºáá áºáá¯ááá·áºáááºááá¯á¡ááºáááºá ááá¯á·áá±á¬áẠ"áááºá" áááºááºááœáẠáááºááŸáááá±á¬áá»ááºááŸáá·áº á¡ááŸá¬ážááŸá¬ááŒááºááŒááºážá¡ááœáẠá¡ááá®áá±ážááŸááºážááᯠáááºááŸááºáá«-
"Debugger" áááºááºááœáẠGDB á¡áááá·áºááᯠáááºááŸááºááẠááá¯á¡ááºáááº-
${openstm32_compiler_path}arm-none-eabi-gdb
GDB áá¬áᬠ(á¡áááºááŸááºááŸáá·áº ááá¯á·ááº) ááá¯á· áá»áááºáááºáááºá¡ááœáẠááá·áºáááºáá»ááºáá»á¬ážááá¯áááºáž ááá·áºááœááºážáá«á
"Startup" tab ááœááºá áááºááẠá¡á±á¬ááºáá« parameters áá»á¬ážááᯠáááºááŸááºááá«áááºá
- checkbox ááá¯ááœáá·áºáá«á áá¯á¶áááºáá«á (ááá¯á·ááŒá±á¬áá·áº á á¯á ááºážáá¬ážáá±á¬ Firmware áá¯á¶á¡á¬áž emulator áá²ááá¯á· áááºáá±ážááœá¬ážáá«áááºá
- checkbox ááá¯ááœáá·áºáá«á áááºá¹áá±ááá»á¬ážááᯠáááºáá«á;
- launch command ááá¯ááá·áºáá«
set $pc = *0x08000004
(PC register ááᯠááááºá á¬ááŸá memory á០áááºááá¯ážá¡ááŒá ẠáááºááŸááºáá«á0x08000004
- ááááºá á¬ááᯠá¡á²áá®ááŸá¬ ááááºážáá¬ážáááºá ResetHandler).
áá»á±ážáá°ážááŒá¯. áááááŒá¯áá«Eclipse á០firmware ááá¯ááºááᯠáá±á«ááºážáá¯ááºááá¯ááºááá¯áá«áá ááœá±ážáá»ááºá áá¬áá»á¬áž áá¯á¶áááºáá«á О ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáá«á áá±á¬áºááŒáááºáááá¯á¡ááºáá«á
Debug ááá¯ááŸáááºááŒá®ážáá±á¬ááºá áááºááẠá¡ááŸá¬ážááŸá¬ááŒááºáá¯ááºááœáẠá¡áá¯ááºáá¯ááºááá¯ááºáááº-
- áá¯ááºááᯠá¡ááá·áºááá·áºáá¯ááºáá±á¬ááºááŒááºážá
- breakpoints áá»á¬ážááŸáá·áº á¡ááŒááºá¡ááŸááºáááºáá¶ááŒááºážá
ááœá±á¬ááá¯. Eclipse ááŸá¬ áá°ážáá°ážááŒá¬ážááŒá¬áž áá°ážáá°ážááŒá¬ážááŒá¬áž áá áºáá»áá¯á· ááŸááá«áááº... áá°ááá¯á·áá²á· á¡áá°áá±ááááºá á¥ááá¬á¡á¬ážááŒáá·áºá á¡ááŸá¬ážááŸá¬ááŒááºáááááá¬ááᯠá áááºáá±á¬á¡áá« â0x0â á¡ááœáẠá¡áááºážá¡ááŒá áºáááŸááá±á¬ áááºáá±á·áá»áº áá±á«áºáá¬áá«áá ááá¯á·áá±á¬áẠá¡ááá·áºá¡áááá·áºáá±á¬áº (F5) ááᯠáá¯ááºáá±á¬ááºáá«á
á¡á²áá®á¡á á¬ážáá áºá¥á®ážáááá¯á¶ážááá¯ááºážá
áá°áááºážáá¯ááºááᯠá¡áá¯áá°ááŒááºážááẠá¡ááœááºá áááºáááºá á¬ážá áá¬áá±á¬ááºážáá±á¬ á¡áá¬áá áºáá¯ááŒá áºáááºá á ááºáá á¹á ááºáž áá±á¬á·ááºáá²á¡ááºáá»ááºáá®áá¬ááẠá á áºááŸááºáá±á¬ áááááá¬ááá«áá² firmware ááᯠá¡ááŸá¬ážááŸá¬ááŒááºááẠááŒá áºááá¯ááºáááºá áá¯áá±áá®áá áºáŠážá¡ááœááºá áááºážááẠá ááºáá á¹á ááºážáá áºáá¯ááŸáá·áºááẠá¡ááŒá²áááºážáááŒá áºááá¯ááºáá±á¬ ááá¯ááºážááá áºáá¯ááºááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠáá¯ááºáá±á¬ááºááẠá¡ááœáá·áºá¡áá±ážáá áºáá¯ááŒá áºáááºá
áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºážáá»ááºáá°áá»á¬ážááᯠá¡áááºááŒá±ááŒá±á áá±á¬áºáá¯á¶áááºáá¯á¶ ááá¯ážááá¯ážááŸááºážááŸááºážááŸáá·áº á áááºáááºááŸááºáááºááŸáá·áº áá¯ááºáá±á¬ááºááẠá¡áá»áááºáá»á¬ážá áœá¬ á áá¯ááºáá¯ááºááẠáááá¯á¡ááºáá±á¬ áááááá¬áá áºáá¯ááᯠáá¶á·ááá¯ážáá±ážááá¯áá«áááºá
Hardware emulators áá»á¬ážá¡áá¯á¶ážááŒá¯ááŒááºážááá¯ááºáᬠááá·áºá¡ááœá±á·á¡ááŒá¯á¶á¡ááŒá±á¬ááºáž ááŸááºáá»ááºáá»á¬ážááœáẠáá±ážáá«á ááœá±ážááœá±ážááẠááááºáá±á«áºááŒá®áž áá±ážááœááºážáá»á¬ážááᯠáá»á±áá»á±áááºááẠááŒá±ááŒá¬ážáá±ážáá«áááºá
á
á¬áááºážááœááºážá¡áá¯á¶ážááŒá¯áá°áá»á¬ážáᬠá
á
áºáááºážááœáẠáá«áááºááá¯ááºáá«áááºá
ááẠemulator ááᯠáá¬á¡ááœáẠáá¯á¶ážáá¬áá²á
-
áá« (áá®áá¬ááº) firmware ááᯠdevelop áá¯ááºáááºá
-
Firmware ááá¯áá±á·áá¬áá±áá«áááºá
-
ááááºážáá»á¬áž (Dendiá Segaá PSP) ááá¯ááœáá·áºáááº
-
á¡ááŒá¬ážáá áºáá¯áᯠ(ááŸááºáá»ááºáá»á¬ážááœááºáá±ážáá«)
á¡áá¯á¶ážááŒá¯áá° ááá áŠáž áá²áá±ážáá²á·áááºá á¡áá¯á¶ážááŒá¯áá° 7 áŠáž ááŒá¬ážáá±áá²á·áá«áááºá
áá°áááºážáá¯ááºááá¯á¡áá¯áá°ááẠáááºááá·áºáá±á¬á·ááºáá²ááºááᯠá¡áá¯á¶ážááŒá¯ááááºážá
-
Qemu
-
Unicorn á¡ááºáá»ááº
-
Proteus
-
á¡ááŒá¬ážáá áºáá¯áᯠ(ááŸááºáá»ááºáá»á¬ážááœááºáá±ážáá«)
á¡áá¯á¶ážááŒá¯áá° ááá áŠáž áá²áá±ážáá²á·áááºá á¡áá¯á¶ážááŒá¯áá° 6 áŠáž ááŒá¬ážáá±áá²á·áá«áááºá
áááºá¡áá¯á¶ážááŒá¯áá±áá±á¬ emulator ááœáẠáááºáá¬ááᯠááŒáŸáá·áºáááºááá¯ááááºážá
-
á¡ááŸáááºááá¯áá»ááºáááºá
-
á áá áºááá·áºááœááºážááŒááºáž/ááœáá·áºááŒááºážááá¯á·ááᯠááœááºáá°á á±áá«áááºá
-
emulator (APIá áá»áááºáá»á¬áž) ááŸáá·áºá¡ááŒááºá¡ááŸááºáááºáá¶áááºá¡ááœáẠáá±á¬ááºáááºááœá±ážáá»ááºá áá¬áá»á¬áž ááá¯áá»ááºáá«áááº
-
á¡áá¬áá¬ááá¯ááºážááᯠáá»á±á¬áºáááºá
-
á¡ááŒá¬ážáá áºáá¯áᯠ(ááŸááºáá»ááºáá»á¬ážááœááºáá±ážáá«)
á¡áá¯á¶ážááŒá¯áá° áá áŠáž áá²áá±ážáá²á·áááºá á¡áá¯á¶ážááŒá¯áá° 8 áŠáž ááŸá±á¬ááºáá²á·áááºá
source: www.habr.com