rl78/g10,g1m,g1n stuff: impl sfp&ocd; also have different pinout configs
This commit is contained in:
parent
d523de69b7
commit
72371a13fd
|
@ -65,6 +65,7 @@ if(FAMILY STREQUAL "rp2040")
|
|||
# Example include
|
||||
target_include_directories(${PROJECT} PUBLIC
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/bsp/
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/msp430/
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/swim/
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/tool78/
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
|
||||
#ifndef BREADBOARD_H_
|
||||
#define BREADBOARD_H_
|
||||
|
||||
#define BREADBOARD_TRIG_IN 14
|
||||
#define BREADBOARD_GLITCH_OUT 15
|
||||
|
||||
#define BREADBOARD_SBW_PIO pio0
|
||||
#define BREADBOARD_SBW_TCK 8
|
||||
#define BREADBOARD_SBW_TDIO 9
|
||||
|
||||
#define BREADBOARD_SWIM_PIO pio0
|
||||
#define BREADBOARD_SWIM_PIN 22
|
||||
|
||||
#define BREADBOARD_TOOL78_PIO pio1
|
||||
|
||||
#define BREADBOARD_TOOL78_nRESET 16
|
||||
|
||||
#define BREADBOARD_TOOL78_78K0_FLMD0 17
|
||||
#define BREADBOARD_TOOL78_78K0_TXMOSI 18
|
||||
#define BREADBOARD_TOOL78_78K0_RXMISO 19
|
||||
#define BREADBOARD_TOOL78_78K0_CLOCK 20
|
||||
|
||||
#define BREADBOARD_TOOL78_78K0R_FLMD0 17
|
||||
#define BREADBOARD_TOOL78_78K0R_TOOL0 18
|
||||
|
||||
#define BREADBOARD_TOOL78_RL78_TOOL0 17
|
||||
#define BREADBOARD_TOOL78_RL78_TX 18
|
||||
#define BREADBOARD_TOOL78_RL78_RX 19
|
||||
|
||||
inline static void breadboard_init(void) { }
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
|
||||
#ifndef PINOUT_H_
|
||||
#define PINOUT_H_
|
||||
|
||||
#include "breadboard.h"
|
||||
#include "zap.h"
|
||||
|
||||
#define PINOUT_USE_DRAGONZAP 1
|
||||
|
||||
#if PINOUT_USE_DRAGONZAP
|
||||
|
||||
#define TRIGGER_IN_PIN ZAP_TRIG_IN
|
||||
// use CROWBAR_1 / CROWBAR_2 / GLITCH_OUT to select glitching method
|
||||
#define GLITCH_OUT_PIN ZAP_CROWBAR_1
|
||||
|
||||
#define PINOUT_SBW_PIO BREADBOARD_SBW_PIO
|
||||
#define PINOUT_SBW_TCK (ZAP_GPIO_BASE+0)
|
||||
#define PINOUT_SBW_TDIO (ZAP_GPIO_BASE+1)
|
||||
|
||||
#define PINOUT_SWIM_PIO BREADBOARD_SWIM_PIO
|
||||
#define PINOUT_SWIM ZAP_GPIO_BASE
|
||||
|
||||
#define PINOUT_TOOL78_PIO BREADBOARD_TOOL78_PIO
|
||||
|
||||
#define PINOUT_TOOL78_nRESET (ZAP_GPIO_BASE+0)
|
||||
|
||||
#define PINOUT_TOOL78_78K0_FLMD0 (ZAP_GPIO_BASE+1)
|
||||
#define PINOUT_TOOL78_78K0_TXMOSI (ZAP_GPIO_BASE+2)
|
||||
#define PINOUT_TOOL78_78K0_RXMISO (ZAP_GPIO_BASE+3)
|
||||
#define PINOUT_TOOL78_78K0_CLOCK (ZAP_GPIO_BASE+4)
|
||||
|
||||
#define PINOUT_TOOL78_78K0R_FLMD0 (ZAP_GPIO_BASE+1)
|
||||
#define PINOUT_TOOL78_78K0R_TOOL0 (ZAP_GPIO_BASE+2)
|
||||
|
||||
#define PINOUT_TOOL78_RL78_TOOL0 (ZAP_GPIO_BASE+1)
|
||||
#define PINOUT_TOOL78_RL78_TX (ZAP_GPIO_BASE+2)
|
||||
#define PINOUT_TOOL78_RL78_RX (ZAP_GPIO_BASE+3)
|
||||
|
||||
inline static void bsp_init_stuff(void) {
|
||||
zap_init_default();
|
||||
}
|
||||
|
||||
#else /***********************************************************************/
|
||||
|
||||
#define TRIGGER_IN_PIN BREADBOARD_TRIG_IN
|
||||
#define GLITCH_OUT_PIN BREADBOARD_GLITCH_OUT
|
||||
|
||||
#define PINOUT_SBW_PIO BREADBOARD_SBW_PIO
|
||||
#define PINOUT_SBW_TCK BREADBOARD_SBW_TCK
|
||||
#define PINOUT_SBW_TDIO BREADBOARD_SBW_TDIO
|
||||
|
||||
#define PINOUT_SWIM_PIO BREADBOARD_SWIM_PIO
|
||||
#define PINOUT_SWIM BREADBOARD_SWIM_PIN
|
||||
|
||||
#define PINOUT_TOOL78_PIO BREADBOARD_TOOL78_PIO
|
||||
|
||||
#define PINOUT_TOOL78_nRESET BREADBOARD_TOOL78_nRESET
|
||||
|
||||
#define PINOUT_TOOL78_78K0_FLMD0 BREADBOARD_TOOL78_78K0_FLMD0
|
||||
#define PINOUT_TOOL78_78K0_TXMOSI BREADBOARD_TOOL78_78K0_TXMOSI
|
||||
#define PINOUT_TOOL78_78K0_RXMISO BREADBOARD_TOOL78_78K0_RXMISO
|
||||
#define PINOUT_TOOL78_78K0_CLOCK BREADBOARD_TOOL78_78K0_CLOCK
|
||||
|
||||
#define PINOUT_TOOL78_78K0R_FLMD0 BREADBOARD_TOOL78_78K0R_FLMD0
|
||||
#define PINOUT_TOOL78_78K0R_TOOL0 BREADBOARD_TOOL78_78K0R_TOOL0
|
||||
|
||||
#define PINOUT_TOOL78_RL78_TOOL0 BREADBOARD_TOOL78_RL78_TOOL0
|
||||
#define PINOUT_TOOL78_RL78_TX BREADBOARD_TOOL78_RL78_TX
|
||||
#define PINOUT_TOOL78_RL78_RX BREADBOARD_TOOL78_RL78_RX
|
||||
|
||||
inline static void bsp_init_stuff(void) {
|
||||
breadboard_init();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -12,6 +12,7 @@
|
|||
#include <pico/stdio_usb.h>
|
||||
#include <pico/binary_info.h>
|
||||
|
||||
#include "pinout.h"
|
||||
|
||||
#include "cli.h"
|
||||
|
||||
|
@ -28,6 +29,8 @@ void cli_msp430_flash(void);
|
|||
void cli_tool78_testtest(void);
|
||||
void cli_tool78_prototest(void);
|
||||
void cli_tool78_ocdtest(void);
|
||||
void cli_tool78_g10_prototest(void);
|
||||
void cli_tool78_g10_ocdtest(void);
|
||||
|
||||
void cli_tool78_glitch_dump(void);
|
||||
void cli_tool78_glitch_paramsearch(void);
|
||||
|
@ -71,6 +74,8 @@ static struct cli_cmd cmds[] = {
|
|||
{ "rl78phy", cli_tool78_testtest },
|
||||
{ "rl78sfp", cli_tool78_prototest },
|
||||
{ "rl78ocd", cli_tool78_ocdtest },
|
||||
{ "rl10sfp", cli_tool78_g10_prototest },
|
||||
{ "rl10ocd", cli_tool78_g10_ocdtest },
|
||||
|
||||
{ "g78dump", cli_tool78_glitch_dump },
|
||||
{ "g78param", cli_tool78_glitch_paramsearch },
|
||||
|
@ -83,6 +88,7 @@ static struct cli_cmd cmds[] = {
|
|||
|
||||
void cli_init(void) {
|
||||
stdio_usb_init();
|
||||
bsp_init_stuff();
|
||||
while (!stdio_usb_connected()) ;
|
||||
printf("Hi! Run a command, or 'help' for help.\n");
|
||||
}
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
#include <hardware/gpio.h>
|
||||
#include <pico/stdlib.h>
|
||||
|
||||
#include "pinout.h"
|
||||
|
||||
#include "pio_sbw.h"
|
||||
#include "tap.h"
|
||||
#include "msp430dbg.h"
|
||||
|
|
|
@ -9,19 +9,18 @@
|
|||
#include <pico/stdlib.h>
|
||||
#include <pico/binary_info.h>
|
||||
|
||||
#include "pinout.h"
|
||||
|
||||
#include "tool78_hw.h"
|
||||
#include "tool78_cmds.h"
|
||||
#include "glitch.h"
|
||||
|
||||
#define TRIGGER_IN_PIN (14/*-1*/)
|
||||
#define GLITCH_OUT_PIN 15
|
||||
|
||||
void cli_tool78_glitch_dump(void);
|
||||
void cli_tool78_glitch_paramsearch(void);
|
||||
void cli_tool78_glitch_ocd_dump(void);
|
||||
|
||||
#define DUMP_OFFSET 0/*0xef000*/
|
||||
#define DUMP_SIZE 65536
|
||||
#define DUMP_SIZE 1024/*65536*/
|
||||
|
||||
// test with decoupling caps: length in 20..500(..1500) -> ok
|
||||
// testing on ocd lock: length: 5..35
|
||||
|
@ -46,12 +45,17 @@ static uint8_t databuf[DUMP_SIZE];
|
|||
static struct glitch_param_randrange offset;
|
||||
static struct glitch_param_adc length;
|
||||
|
||||
static void glitch_init_core1_stuff(bool exttrig) {
|
||||
static bool glitch_init_core1_stuff(bool exttrig) {
|
||||
offset.min = 10*1000;
|
||||
offset.max = 35433*1000;
|
||||
length.min = 10;
|
||||
length.max = 10*1000;
|
||||
length.min = 100;
|
||||
length.max = 50/*26*/*1000;
|
||||
#if PINOUT_USE_DRAGONZAP
|
||||
length.adc_index = 0;//999;
|
||||
#else
|
||||
#error "a"
|
||||
length.adc_index = 999;
|
||||
#endif
|
||||
|
||||
glitch_param_randrange_init(&offset);
|
||||
glitch_param_adc_init(&length);
|
||||
|
@ -91,7 +95,7 @@ static void glitch_init_core1_stuff(bool exttrig) {
|
|||
.getter = glitch_param_adc_fn
|
||||
};
|
||||
gparam.trigger_in_pin = exttrig ? TRIGGER_IN_PIN : (-1);
|
||||
glitch_ready(&gparam);
|
||||
return glitch_ready(&gparam);
|
||||
}
|
||||
static void glitch_init_pwm_stuff(void) {
|
||||
const float dutycycle = (2.1f + 0.00f) / 3.3f + 0.0125f;//25f /* calibration (more) */;
|
||||
|
@ -202,7 +206,10 @@ deinit_bad:
|
|||
}
|
||||
|
||||
void cli_tool78_glitch_paramsearch(void) {
|
||||
glitch_init_core1_stuff(true);
|
||||
if (!glitch_init_core1_stuff(true)) {
|
||||
printf("bad glitcher params!\n");
|
||||
while (1) asm volatile("");
|
||||
}
|
||||
|
||||
uint8_t passwd[10] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
|
||||
uint16_t ver;
|
||||
|
@ -354,7 +361,10 @@ do_reset_stuff:
|
|||
}
|
||||
|
||||
void cli_tool78_glitch_ocd_dump(void) {
|
||||
glitch_init_core1_stuff(false);
|
||||
if (!glitch_init_core1_stuff(false)) {
|
||||
printf("bad glitcher params!\n");
|
||||
while (1) asm volatile("");
|
||||
}
|
||||
|
||||
gpio_set_function(2, GPIO_FUNC_SIO);
|
||||
gpio_set_dir(2, GPIO_OUT);
|
||||
|
@ -416,7 +426,8 @@ restart:
|
|||
//tool78_hw_rl78_uart1.rx_set_stop_bit(false);
|
||||
glitch_arm();
|
||||
for (size_t i = 0; i < 16; ++i) {
|
||||
glitch_trigger_sw_core1();
|
||||
//glitch_trigger_sw_core1();
|
||||
glitch_trigger_sw_pio();
|
||||
rr = tool78_hw_rl78_uart1.recv(1, checkbuf, 12*1000);
|
||||
if (rr != 1) {
|
||||
busy_wait_ms(1); // leave time to recharge
|
||||
|
@ -468,7 +479,7 @@ success:;
|
|||
}
|
||||
printf("got ver! %04x\n", ver);
|
||||
|
||||
printf("glitch len: %lu us\n", *(volatile uint32_t*)&glitch_param_cur.length_ns.cur);
|
||||
printf("glitch len: %lu ns\n", *(volatile uint32_t*)&glitch_param_cur.length_ns.cur);
|
||||
/*goto do_reset_stuff;*/
|
||||
|
||||
st = tool78_ocd_connect(&tool78_hw_rl78_uart1, passwd);
|
||||
|
|
184
src/cli/rl78.c
184
src/cli/rl78.c
|
@ -1,6 +1,7 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <pico/time.h>
|
||||
|
||||
#include "tool78_hw.h"
|
||||
#include "tool78_cmds.h"
|
||||
|
@ -10,10 +11,15 @@
|
|||
void cli_tool78_testtest(void);
|
||||
void cli_tool78_prototest(void);
|
||||
void cli_tool78_ocdtest(void);
|
||||
void cli_tool78_g10_prototest(void);
|
||||
void cli_tool78_g10_ocdtest(void);
|
||||
|
||||
static uint8_t DATA_main_dbgpad[1024];
|
||||
static uint8_t DATA_main_nodbg [1024];
|
||||
|
||||
static uint8_t DATA_G1M_dbgpad[];
|
||||
static uint8_t DATA_G1M_nodbg [];
|
||||
|
||||
static uint8_t shellcode_test[] = {
|
||||
0x51, 0x61, // mov a, #'a'
|
||||
0xfc, 0xa1, 0xff, 0x0e, // call !!effa1
|
||||
|
@ -60,7 +66,7 @@ void cli_tool78_prototest(void) {
|
|||
|
||||
tool78_silicon_sig_t sig;
|
||||
memset(&sig, 0, sizeof sig);
|
||||
enum tool78_stat st = tool78_init_sfp(&tool78_hw_rl78_uart1, &sig);
|
||||
enum tool78_stat st = tool78_init_sfp(hw, &sig);
|
||||
printf("result: 0x%02x. sig:\n", st);
|
||||
for (size_t i = 0; i < sizeof(struct tool78_silicon_sig_rl78); ++i)
|
||||
printf("0x%02x ", ((const uint8_t*)&sig)[i]);
|
||||
|
@ -89,11 +95,11 @@ sec: flg=fe bot=03 fsws=0000 fswe=003f
|
|||
// NOTE: RL78 ONLY
|
||||
struct tool78_security sec;
|
||||
memset(&sec, 0, sizeof sec);
|
||||
st = tool78_do_security_get(&tool78_hw_rl78_uart1, &sec);
|
||||
st = tool78_do_security_get(hw, &sec);
|
||||
printf("secget: 0x%02x\n", st);
|
||||
printf("sec: flg=%02x bot=%02x fsws=%04x fswe=%04x\n", sec.flg, sec.bot, sec.fsws, sec.fswe);
|
||||
|
||||
/*//st = tool78_do_security_release(&tool78_hw_rl78_uart1);
|
||||
//st = tool78_do_security_release(&tool78_hw_rl78_uart1);
|
||||
//printf("sec rel: 0x%02x\n", st);
|
||||
// one block = 0x400 = 1k
|
||||
st = tool78_do_block_erase(hw, 0, -1);
|
||||
|
@ -104,14 +110,14 @@ sec: flg=fe bot=03 fsws=0000 fswe=003f
|
|||
printf("programming: 0x%02x\n", st);
|
||||
|
||||
st = tool78_do_verify(hw, 0, 0x3ff, datatoflash);
|
||||
printf("verify: 0x%02x\n", st);*/
|
||||
printf("verify: 0x%02x\n", st);
|
||||
|
||||
/*for (size_t iii = 0; iii < 65536; iii += 0x400) {
|
||||
st = tool78_do_verify(hw, iii+0, iii+0x3ff, &DATA_wfum_flash[iii]);
|
||||
printf("verify 0x%04zx: 0x%02x\n", iii, st);
|
||||
}*/
|
||||
|
||||
tool78_hw_rl78_uart1.deinit();
|
||||
hw->deinit();
|
||||
}
|
||||
|
||||
void cli_tool78_ocdtest(void) {
|
||||
|
@ -170,6 +176,48 @@ deinit_bad:
|
|||
return;
|
||||
}
|
||||
|
||||
void cli_tool78_g10_prototest(void) {
|
||||
struct tool78_hw* hw = &tool78_hw_rl78g10_uart1;
|
||||
|
||||
enum tool78_stat st = tool78_init_sfp(hw, NULL);
|
||||
printf("init: %02x\n", st);
|
||||
|
||||
const uint8_t* datatoflash = false ? DATA_G1M_nodbg : DATA_G1M_dbgpad;
|
||||
|
||||
enum tool78_g10_flash_size fsz = 0x1f;
|
||||
st = tool78_do_g10_get_flash_size(hw, &fsz);
|
||||
printf("get flash size: stat %02x size %02x\n", st, fsz);
|
||||
|
||||
hw->deinit();
|
||||
st = tool78_init_sfp(hw, NULL);
|
||||
|
||||
uint16_t crc=0;
|
||||
st = tool78_do_g10_check_crc(hw, fsz, &crc);
|
||||
printf("get crc: stat %02x crc %04x\n", st, crc);
|
||||
|
||||
hw->deinit();
|
||||
/*st = tool78_init_sfp(hw, NULL);
|
||||
|
||||
st = tool78_do_g10_erase_then_write(hw, fsz, datatoflash, 768);
|
||||
printf("erase-then-write: stat %02x\n", st);
|
||||
|
||||
hw->deinit();*/
|
||||
}
|
||||
void cli_tool78_g10_ocdtest(void) {
|
||||
uint8_t passwd[10] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
|
||||
struct tool78_hw* hw = &tool78_hw_rl78g10_uart1;
|
||||
|
||||
int st = tool78_init_ocd(hw, NULL, passwd);
|
||||
printf("init: %02x\n", st);
|
||||
|
||||
uint8_t val = 0;
|
||||
st = tool78_ocd_read(hw, 0x0080, 1, &val);
|
||||
printf("read: st=%d val=%02x\n", st, val);
|
||||
|
||||
hw->deinit();
|
||||
}
|
||||
|
||||
|
||||
static uint8_t DATA_main_dbgpad[1024] = {
|
||||
0xda, 0x00, 0x00, 0x00, 0x43, 0x01, 0x4f, 0x01, 0x5b, 0x01, 0x67, 0x01, 0x73,
|
||||
0x01, 0x7f, 0x01, 0x8b, 0x01, 0x97, 0x01, 0xa3, 0x01, 0xaf, 0x01, 0xbb, 0x01,
|
||||
|
@ -334,3 +382,129 @@ static uint8_t DATA_main_nodbg[1024] = {
|
|||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
|
||||
};
|
||||
|
||||
static uint8_t DATA_G1M_dbgpad[768] = {
|
||||
0xce, 0x00, 0xff, 0xff, 0xce, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xf7, 0xfd,
|
||||
0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xf8,
|
||||
0xd0, 0xfe, 0xfd, 0x29, 0x02, 0xfd, 0x42, 0x02, 0xfd, 0x16, 0x01, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0xd7, 0x71, 0x0b, 0x00, 0xfd, 0xdb, 0x00, 0x52, 0x08, 0x31, 0x05, 0x07,
|
||||
0x00, 0x00, 0x71, 0x0a, 0x00, 0xef, 0x06, 0x71, 0x0b, 0x00, 0x00, 0x00, 0x00,
|
||||
0xfd, 0xea, 0x00, 0x31, 0x1a, 0x92, 0xdf, 0xe8, 0x71, 0x0a, 0x00, 0xfd, 0xdb,
|
||||
0x00, 0xfd, 0xdb, 0x00, 0xd7, 0x71, 0x0a, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb,
|
||||
0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00,
|
||||
0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd,
|
||||
0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb,
|
||||
0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00,
|
||||
0xfd, 0xdb, 0x00, 0x41, 0x0e, 0x52, 0x00, 0x36, 0x00, 0xfe, 0x11, 0x8b, 0xc1,
|
||||
0xc3, 0xfd, 0xec, 0x00, 0xc2, 0xc0, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd,
|
||||
0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb,
|
||||
0x00, 0xa7, 0x92, 0xd2, 0xdf, 0xdd, 0x52, 0x00, 0x11, 0x8b, 0xc1, 0xc3, 0xfd,
|
||||
0xec, 0x00, 0xc2, 0xc0, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00,
|
||||
0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xa7,
|
||||
0x92, 0xd2, 0xdf, 0xdd, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00,
|
||||
0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd,
|
||||
0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb,
|
||||
0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00,
|
||||
0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0x51,
|
||||
0x45, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0x51, 0x4e, 0xfd, 0xdb, 0x00, 0xfd,
|
||||
0xdb, 0x00, 0x51, 0x44, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0x51, 0x20, 0xfd,
|
||||
0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xed, 0x55, 0x01, 0x51, 0x20, 0xfd, 0xec, 0x00,
|
||||
0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd,
|
||||
0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb,
|
||||
0x00, 0xfd, 0xdb, 0x00, 0xed, 0x55, 0x01, 0xcf, 0x77, 0x00, 0x00, 0xcf, 0x00,
|
||||
0xff, 0x00, 0xcf, 0x30, 0x00, 0x00, 0xcf, 0x50, 0x00, 0x00, 0xcf, 0x60, 0x00,
|
||||
0x7f, 0xcf, 0x20, 0xff, 0x00, 0xd7, 0xcf, 0xf0, 0x00, 0xe5, 0xcf, 0xf3, 0x00,
|
||||
0x10, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff
|
||||
};
|
||||
|
||||
static uint8_t DATA_G1M_nodbg[768] = {
|
||||
0xce, 0x00, 0xff, 0xff, 0xce, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xf7, 0xfd,
|
||||
0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcb, 0xf8,
|
||||
0xd0, 0xfe, 0xfd, 0x29, 0x02, 0xfd, 0x42, 0x02, 0xfd, 0x16, 0x01, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0xd7, 0x71, 0x0b, 0x00, 0xfd, 0xdb, 0x00, 0x52, 0x08, 0x31, 0x05, 0x07,
|
||||
0x00, 0x00, 0x71, 0x0a, 0x00, 0xef, 0x06, 0x71, 0x0b, 0x00, 0x00, 0x00, 0x00,
|
||||
0xfd, 0xea, 0x00, 0x31, 0x1a, 0x92, 0xdf, 0xe8, 0x71, 0x0a, 0x00, 0xfd, 0xdb,
|
||||
0x00, 0xfd, 0xdb, 0x00, 0xd7, 0x71, 0x0a, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb,
|
||||
0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00,
|
||||
0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd,
|
||||
0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb,
|
||||
0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00,
|
||||
0xfd, 0xdb, 0x00, 0x41, 0x0e, 0x52, 0x00, 0x36, 0x00, 0xfe, 0x11, 0x8b, 0xc1,
|
||||
0xc3, 0xfd, 0xec, 0x00, 0xc2, 0xc0, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd,
|
||||
0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb,
|
||||
0x00, 0xa7, 0x92, 0xd2, 0xdf, 0xdd, 0x52, 0x00, 0x11, 0x8b, 0xc1, 0xc3, 0xfd,
|
||||
0xec, 0x00, 0xc2, 0xc0, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00,
|
||||
0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xa7,
|
||||
0x92, 0xd2, 0xdf, 0xdd, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00,
|
||||
0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd,
|
||||
0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb,
|
||||
0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00,
|
||||
0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0x51,
|
||||
0x45, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0x51, 0x4e, 0xfd, 0xdb, 0x00, 0xfd,
|
||||
0xdb, 0x00, 0x51, 0x44, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0x51, 0x20, 0xfd,
|
||||
0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xed, 0x55, 0x01, 0x51, 0x20, 0xfd, 0xec, 0x00,
|
||||
0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd,
|
||||
0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb, 0x00, 0xfd, 0xdb,
|
||||
0x00, 0xfd, 0xdb, 0x00, 0xed, 0x55, 0x01, 0xcf, 0x77, 0x00, 0x00, 0xcf, 0x00,
|
||||
0xff, 0x00, 0xcf, 0x30, 0x00, 0x00, 0xcf, 0x50, 0x00, 0x00, 0xcf, 0x60, 0x00,
|
||||
0x7f, 0xcf, 0x20, 0xff, 0x00, 0xd7, 0xcf, 0xf0, 0x00, 0xe5, 0xcf, 0xf3, 0x00,
|
||||
0x10, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff
|
||||
};
|
||||
|
||||
|
|
|
@ -127,6 +127,7 @@ static void CORE1_FUNC(glitch_core1_thread_core1_fifoirq)(void) {
|
|||
CORE1_DO_GLITCH();
|
||||
multicore_fifo_drain();
|
||||
multicore_fifo_clear_irq();
|
||||
gpio_put(25, true);
|
||||
continue_:
|
||||
irq_set_enabled(irq, true);
|
||||
}
|
||||
|
@ -185,6 +186,7 @@ static void CORE1_FUNC(glitch_core1_thread_pio)(void) {
|
|||
|
||||
trigctl_wait_glitch_irq(trigctl_pio, trigctl_sm, true);
|
||||
trigctl_ack_glitch_irq(trigctl_pio, trigctl_sm);
|
||||
gpio_put(25, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -252,6 +254,13 @@ static void CORE0_FUNC(glitch_stop_no_clock_chg)(void) {
|
|||
}
|
||||
|
||||
bool CORE0_FUNC(glitch_ready)(const struct glitch_params* params) {
|
||||
/*printf("params: off = %p %p ; len = %p %p\n",
|
||||
params->offset_ns.getter, params->offset_ns.ud,
|
||||
params->length_ns.getter, params->length_ns.ud);
|
||||
printf("trigger in = %d pol %d ; glitch out = %d pol %d\n",
|
||||
params->trigger_in_pin, params->trigger_in_polarity,
|
||||
params->glitch_out_pin, params->glitch_out_polarity);
|
||||
printf("impl: %d\n", params->impl);*/
|
||||
// check params values
|
||||
if (!params->offset_ns.getter || !params->offset_ns.ud) return false;
|
||||
if (!params->length_ns.getter || !params->length_ns.ud) return false;
|
||||
|
@ -271,7 +280,10 @@ bool CORE0_FUNC(glitch_ready)(const struct glitch_params* params) {
|
|||
int r = 0x99990;
|
||||
if (params->impl == glitch_impl_pio) {
|
||||
r = trigctl_pio_can_init();
|
||||
if (r < 0) return false;
|
||||
if (r < 0) {
|
||||
printf("no pio!\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
glitch_stop();
|
||||
|
@ -281,6 +293,10 @@ bool CORE0_FUNC(glitch_ready)(const struct glitch_params* params) {
|
|||
param_cur.length_ns.cur = 0;
|
||||
param_cur.armed = false;
|
||||
|
||||
gpio_init(25);
|
||||
gpio_set_dir(25, GPIO_OUT);
|
||||
gpio_put(25, false);
|
||||
|
||||
// let's not care about impl and always use core1 for now
|
||||
// TODO: if pio: check SM availability etc (& clear param_cur if fails)
|
||||
|
||||
|
@ -356,6 +372,7 @@ bool CORE0_FUNC(glitch_ready)(const struct glitch_params* params) {
|
|||
: GPIO_OVERRIDE_NORMAL) << IO_BANK0_GPIO0_CTRL_OUTOVER_LSB)
|
||||
, IO_BANK0_GPIO0_CTRL_FUNCSEL_BITS | IO_BANK0_GPIO0_CTRL_OUTOVER_BITS
|
||||
);
|
||||
printf("glitch out init: func %d on pin %d\n", func, param_cur.glitch_out_pin);
|
||||
|
||||
multicore_launch_core1(glitch_core1_thread);
|
||||
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
#include <hardware/pio_instructions.h>
|
||||
#include <hardware/timer.h>
|
||||
|
||||
#include "pinout.h"
|
||||
|
||||
#include "pio_sbw.h"
|
||||
|
||||
#include "sbw.pio.h"
|
||||
|
|
|
@ -10,10 +10,6 @@
|
|||
#include <stdbool.h>
|
||||
/*#include <hardware/pio.h>*/
|
||||
|
||||
#define PINOUT_SBW_PIO pio0
|
||||
#define PINOUT_SBW_TCK 8
|
||||
#define PINOUT_SBW_TDIO 9
|
||||
|
||||
extern int sbw_piosm, sbw_offset;
|
||||
|
||||
// does the debug handshake/SBW setup thingy, call before sbw_init()
|
||||
|
|
|
@ -4,13 +4,12 @@
|
|||
#include <hardware/pio.h>
|
||||
#include <hardware/timer.h>
|
||||
|
||||
#include "pinout.h"
|
||||
|
||||
#include "swim_hw.h"
|
||||
|
||||
#include "swim.pio.h"
|
||||
|
||||
#define PINOUT_SWIM_PIO pio0
|
||||
#define PINOUT_SWIM 22
|
||||
|
||||
int swim_tx_sm = -1, swim_rx_sm = -1, swim_tx_off = -1, swim_rx_off = -1;
|
||||
|
||||
void swim_preinit(void) {
|
||||
|
|
|
@ -109,7 +109,7 @@ void piodump_main(void) {
|
|||
|
||||
uint16_t stuff[32];
|
||||
for (uint32_t i = 0; i < 32; ++i) {
|
||||
stuff[i] = /*pio_get_one*/pio_read_one(PINOUT_SBW_PIO, (uint)sbw_piosm, i, 8);
|
||||
stuff[i] = /*pio_get_one*/pio_read_one(pio0, (uint)sbw_piosm, i, 8);
|
||||
bool good = stuff[i] == sbw_program_instructions[i];
|
||||
printf("PIO_INSN[0x%02lx] = 0x%04x (%s)\n", i, stuff[i],
|
||||
good ? "correct" : "wrong");
|
||||
|
|
|
@ -107,7 +107,7 @@ public stop_ok:
|
|||
% c-sdk {
|
||||
|
||||
static inline void tool78_uart_rx_program_init(PIO pio, uint sm, uint offset,
|
||||
uint pin, uint baudrate, bool en) {
|
||||
uint pin, uint baudrate, bool en, bool check_stop_bit) {
|
||||
//const int PIN_DBG = 4;
|
||||
|
||||
pio_sm_set_consecutive_pindirs(pio, sm, pin, 1, false); // pin is input now
|
||||
|
@ -117,6 +117,14 @@ static inline void tool78_uart_rx_program_init(PIO pio, uint sm, uint offset,
|
|||
//pio_sm_set_consecutive_pindirs(pio, sm, PIN_DBG, 1, true);
|
||||
//pio_gpio_init(pio, PIN_DBG);
|
||||
|
||||
if (!check_stop_bit) {
|
||||
pio->instr_mem[offset + tool78_uart_rx_offset_stopbit_magic]
|
||||
= pio_encode_jmp(offset + tool78_uart_rx_offset_stop_ok);
|
||||
} else {
|
||||
pio->instr_mem[offset + tool78_uart_rx_offset_stopbit_magic]
|
||||
= pio_encode_jmp_pin(offset + tool78_uart_rx_offset_stop_ok);
|
||||
}
|
||||
|
||||
pio_sm_config c = tool78_uart_rx_program_get_default_config(offset);
|
||||
sm_config_set_in_pins(&c, pin);
|
||||
sm_config_set_jmp_pin(&c, pin);
|
||||
|
|
|
@ -105,8 +105,8 @@ static const struct delayvalues delays[23] = {
|
|||
#define tG23 (1000*1000) /* RL78/G23 datasheet just says "everything 1ms lol" */
|
||||
|
||||
// G10 proto
|
||||
#define tDTR 1
|
||||
#define tDRT 1
|
||||
#define tDTR (3*1000)
|
||||
#define tDRT 20
|
||||
#define tCRC 1000
|
||||
#define tPRO 1000
|
||||
#define tVER 20000
|
||||
|
@ -917,26 +917,28 @@ enum tool78_stat tool78_do_g10_get_flash_size(struct tool78_hw* hw,
|
|||
busy_wait_us_32(tDTR);
|
||||
|
||||
// start crc calc cmd
|
||||
uint8_t data[2];
|
||||
uint8_t data[3];
|
||||
data[0] = tool78_cmd_crc_check;
|
||||
int rr = hw->send(1, data, -1);
|
||||
if (rr != 1) return tool78_stat_internal_error;
|
||||
|
||||
enum tool78_stat st = tool78_data_recv(hw, data, 2, tDT+tDRT);
|
||||
if (st != tool78_stat_ack) return st;
|
||||
data[1] = data[2] = 0;
|
||||
rr = hw->recv(3, data, (tDT+tDRT)*100); // cmd is echoed back
|
||||
//printf("gfsz rr=%d data=%02x %02x %02x\n", rr, data[0], data[1], data[2]);
|
||||
if (rr != 3) return tool78_stat_timeout_error;
|
||||
if (data[1] != tool78_stat_ack) return data[1];
|
||||
|
||||
if (data[0] != tool78_stat_ack) return data[0];
|
||||
|
||||
*fsz = data[1];
|
||||
*fsz = data[2];
|
||||
|
||||
busy_wait_us_32(tDTR);
|
||||
data[0] = tool78_stat_nak; // should send ack here, but send nak to stop crc calc
|
||||
rr = hw->send(1, data, -1);
|
||||
//printf("send nak: rr=%d data=%02x\n", rr, data[0]);
|
||||
if (rr != 1) return tool78_stat_internal_error;
|
||||
|
||||
/*st =*/ tool78_data_recv(hw, data, 1, tCRC);
|
||||
// ignore status of this stuff
|
||||
//if (st != tool78_stat_ack) return st;
|
||||
rr = hw->recv(3, data, tCRC);
|
||||
//printf("recv rr=%d data=%02x %02x %02x\n", rr, data[0], data[1], data[2]);
|
||||
// should answer with 0x04 but let's not care here
|
||||
|
||||
return tool78_stat_ack;
|
||||
}
|
||||
|
@ -944,25 +946,23 @@ enum tool78_stat tool78_do_g10_check_crc(struct tool78_hw* hw,
|
|||
enum tool78_g10_flash_size fsz, uint16_t* crc) {
|
||||
busy_wait_us_32(tDTR);
|
||||
|
||||
uint8_t data[2];
|
||||
uint8_t data[3];
|
||||
data[0] = tool78_cmd_crc_check;
|
||||
int rr = hw->send(1, data, -1);
|
||||
if (rr != 1) return tool78_stat_internal_error;
|
||||
|
||||
enum tool78_stat st = tool78_data_recv(hw, data, 2, tDT+tDRT);
|
||||
if (st != tool78_stat_ack) return st;
|
||||
|
||||
if (data[0] != tool78_stat_ack) return data[0];
|
||||
rr = hw->recv(3, data, (tDT+tDRT)*100);
|
||||
if (rr != 3) return tool78_stat_timeout_error;
|
||||
if (data[1] != tool78_stat_ack) return data[1];
|
||||
|
||||
busy_wait_us_32(tDTR);
|
||||
if (data[1] != fsz) {
|
||||
if (data[2] != fsz) {
|
||||
data[0] = tool78_stat_nak; // should send ack here, but send nak to stop crc calc
|
||||
rr = hw->send(1, data, -1);
|
||||
if (rr != 1) return tool78_stat_internal_error;
|
||||
|
||||
/*st =*/ tool78_data_recv(hw, data, 1, tCRC);
|
||||
// ignore status of this stuff
|
||||
//if (st != tool78_stat_ack) return st;
|
||||
rr = hw->recv(3, data, tCRC);
|
||||
// should answer with 0x04 but let's not care here
|
||||
|
||||
return tool78_stat_bad_flash_size;
|
||||
} else {
|
||||
|
@ -970,13 +970,26 @@ enum tool78_stat tool78_do_g10_check_crc(struct tool78_hw* hw,
|
|||
rr = hw->send(1, data, -1);
|
||||
if (rr != 1) return tool78_stat_internal_error;
|
||||
|
||||
st = tool78_data_recv(hw, data, 1, tCRC);
|
||||
if (st != tool78_stat_ack) return st;
|
||||
st = data[0];
|
||||
rr = hw->recv(2, data, tCRC*2);
|
||||
if (rr != 2) return tool78_stat_timeout_error;
|
||||
if (data[0] == 0xff) { // framing error bullshit
|
||||
data[0] = data[1];
|
||||
rr = hw->recv(1, &data[1], tCRC);
|
||||
if (rr != 1) return tool78_stat_timeout_error;
|
||||
}
|
||||
//printf("recv1 rr=%d data=%02x %02x\n", rr, data[0], data[1]);
|
||||
enum tool78_stat st = data[1];
|
||||
if (st != tool78_stat_ack) return st;
|
||||
|
||||
st = tool78_data_recv(hw, data, 2, tDT*2);
|
||||
if (st != tool78_stat_ack) return st;
|
||||
rr = hw->recv(2, data, tDT*1000);
|
||||
//printf("recv2 rr=%d data=%02x %02x %02x\n", rr, data[0], data[1], data[2]);
|
||||
if (rr != 2) return tool78_stat_timeout_error;
|
||||
if (data[0] == 0xff) {
|
||||
data[0] = data[1];
|
||||
rr = hw->recv(1, &data[1], tDT*500);
|
||||
if (rr != 1) return tool78_stat_timeout_error;
|
||||
}
|
||||
//printf("recv2 rr=%d data=%02x %02x %02x\n", rr, data[0], data[1], data[2]);
|
||||
|
||||
*crc = data[0] | ((uint16_t)data[1] << 8);
|
||||
|
||||
|
@ -984,28 +997,27 @@ enum tool78_stat tool78_do_g10_check_crc(struct tool78_hw* hw,
|
|||
}
|
||||
}
|
||||
enum tool78_stat tool78_do_g10_erase_then_write(struct tool78_hw* hw,
|
||||
enum tool78_g10_flash_size fsz, const uint8_t* data_to_wr) {
|
||||
enum tool78_g10_flash_size fsz, const uint8_t* data_to_wr, size_t datalen) {
|
||||
busy_wait_us_32(tDTR);
|
||||
|
||||
uint8_t data[4];
|
||||
uint8_t data[5];
|
||||
data[0] = tool78_cmd_write_after_erase;
|
||||
int rr = hw->send(1, data, -1);
|
||||
if (rr != 1) return tool78_stat_internal_error;
|
||||
|
||||
enum tool78_stat st = tool78_data_recv(hw, data, 2, tDT+tDRT);
|
||||
if (st != tool78_stat_ack) return st;
|
||||
|
||||
if (data[0] != tool78_stat_ack) return data[0];
|
||||
rr = hw->recv(3, data, (tDT+tDRT)*100);
|
||||
printf("recv1 rr=%d data=%02x %02x %02x\n", rr, data[0], data[1], data[2]);
|
||||
if (rr != 3) return tool78_stat_timeout_error;
|
||||
if (data[1] != tool78_stat_ack) return data[1];
|
||||
|
||||
busy_wait_us_32(tDTR);
|
||||
if (data[1] != fsz) {
|
||||
if (data[2] != fsz) {
|
||||
data[0] = tool78_stat_nak; // should send ack here, but send nak to stop crc calc
|
||||
rr = hw->send(1, data, -1);
|
||||
if (rr != 1) return tool78_stat_internal_error;
|
||||
|
||||
/*st =*/ tool78_data_recv(hw, data, 1, tERA);
|
||||
// ignore status of this stuff
|
||||
//if (st != tool78_stat_ack) return st;
|
||||
rr = hw->recv(3, data, tERA);
|
||||
// should answer with 0x04 but let's not care here
|
||||
|
||||
return tool78_stat_bad_flash_size;
|
||||
} else {
|
||||
|
@ -1013,41 +1025,59 @@ enum tool78_stat tool78_do_g10_erase_then_write(struct tool78_hw* hw,
|
|||
rr = hw->send(1, data, -1);
|
||||
if (rr != 1) return tool78_stat_internal_error;
|
||||
|
||||
st = tool78_data_recv(hw, data, 1, tERA);
|
||||
if (st != tool78_stat_ack) return st;
|
||||
st = data[0];
|
||||
rr = hw->recv(2, data, tERA);
|
||||
if (rr != 2) return tool78_stat_timeout_error;
|
||||
if (data[0] == 0xff) { // framing error bullshit
|
||||
data[0] = data[1];
|
||||
rr = hw->recv(1, &data[1], tERA);
|
||||
if (rr != 1) return tool78_stat_timeout_error;
|
||||
}
|
||||
printf("recv2 rr=%d data=%02x %02x\n", rr, data[0], data[1]);
|
||||
enum tool78_stat st = data[1];
|
||||
if (st != tool78_stat_ack) return st;
|
||||
|
||||
size_t flash_sz = (fsz + 1) * 256;
|
||||
for (size_t i = 0; i < flash_sz; i += 4) {
|
||||
data[0] = ((i+0) < datalen) ? data_to_wr[i+0] : 0xff;
|
||||
data[1] = ((i+1) < datalen) ? data_to_wr[i+1] : 0xff;
|
||||
data[2] = ((i+2) < datalen) ? data_to_wr[i+2] : 0xff;
|
||||
data[3] = ((i+3) < datalen) ? data_to_wr[i+3] : 0xff;
|
||||
|
||||
busy_wait_us_32(tDTR);
|
||||
rr = hw->send(1, &data_to_wr[i+0], -1);
|
||||
rr = hw->send(1, &data[0], -1);
|
||||
if (rr != 1) return tool78_stat_internal_error;
|
||||
busy_wait_us_32(tDRT);
|
||||
rr = hw->send(1, &data_to_wr[i+1], -1);
|
||||
busy_wait_us_32(tDRT*20);
|
||||
rr = hw->send(1, &data[1], -1);
|
||||
if (rr != 1) return tool78_stat_internal_error;
|
||||
busy_wait_us_32(tDRT);
|
||||
rr = hw->send(1, &data_to_wr[i+2], -1);
|
||||
busy_wait_us_32(tDRT*20);
|
||||
rr = hw->send(1, &data[2], -1);
|
||||
if (rr != 1) return tool78_stat_internal_error;
|
||||
busy_wait_us_32(tDRT);
|
||||
rr = hw->send(1, &data_to_wr[i+3], -1);
|
||||
busy_wait_us_32(tDRT*20);
|
||||
rr = hw->send(1, &data[3], -1);
|
||||
if (rr != 1) return tool78_stat_internal_error;
|
||||
|
||||
st = tool78_data_recv(hw, data, 1, tPRO);
|
||||
if (st != tool78_stat_ack) return st;
|
||||
st = data[0];
|
||||
rr = hw->recv(5, data, tPRO);
|
||||
printf("recv3 i=%04zx rr=%d data=%02x %02x %02x %02x %02x\n", i, rr, data[0],
|
||||
data[1], data[2], data[3], data[4]);
|
||||
if (rr != 5) return tool78_stat_timeout_error;
|
||||
st = data[4];
|
||||
if (st != tool78_stat_ack) return st;
|
||||
}
|
||||
|
||||
st = tool78_data_recv(hw, data, 1, tVER);
|
||||
if (st != tool78_stat_ack) return st;
|
||||
rr = hw->recv(2, data, tVER*100);
|
||||
printf("recv4 rr=%d data=%02x %02x\n", rr, data[0], data[1]);
|
||||
if (rr != 2) return tool78_stat_timeout_error;
|
||||
st = data[1];
|
||||
|
||||
return tool78_stat_ack;
|
||||
return st;
|
||||
}
|
||||
}
|
||||
// ----
|
||||
|
||||
int tool78_ocd_version(struct tool78_hw* hw, uint16_t* ver) {
|
||||
bool is_g10 = (hw->target & tool78_mcu_mask) == tool78_mcu_rl78g10;
|
||||
if (is_g10) return -5;
|
||||
|
||||
busy_wait_ms(1);
|
||||
|
||||
uint8_t bytes[3];
|
||||
|
@ -1075,8 +1105,9 @@ int tool78_ocd_version(struct tool78_hw* hw, uint16_t* ver) {
|
|||
int tool78_ocd_connect(struct tool78_hw* hw, const uint8_t passwd[10]) {
|
||||
busy_wait_ms(1);
|
||||
uint8_t stuff[11];
|
||||
uint8_t connst, cksum;
|
||||
stuff[0] = tool78ocd_cmd_connect;
|
||||
uint8_t connst;
|
||||
bool is_g10 = (hw->target & tool78_mcu_mask) == tool78_mcu_rl78g10;
|
||||
stuff[0] = is_g10 ? tool78ocd_cmdg10_connect : tool78ocd_cmd_connect;
|
||||
int rr = hw->send(1, &stuff[0], -1);
|
||||
|
||||
// stuff[1] is tool78ocd_cmd_connect echoed back
|
||||
|
@ -1086,20 +1117,29 @@ int tool78_ocd_connect(struct tool78_hw* hw, const uint8_t passwd[10]) {
|
|||
for (int iii = 0; iii < rr; ++iii) {
|
||||
printf("0x%02x%c", stuff[1+iii], (iii==rr-1)?'\n':' ');
|
||||
}*/
|
||||
//return -1;
|
||||
return -1;
|
||||
}
|
||||
connst=stuff[2];
|
||||
printf("connst 1=%02x\n", connst);
|
||||
if (connst == 0xff) {
|
||||
rr = hw->recv(1, &connst, 1000);
|
||||
if (rr != 1) return -1;
|
||||
}
|
||||
printf("connst 2=%02x\n", connst);
|
||||
if (connst == 0xf0 || connst == 0xf4) return connst;
|
||||
// connst==0xf1
|
||||
|
||||
memcpy(stuff, passwd, 10);
|
||||
cksum = stuff[10] = tool78_calc_ocd_checksum8(10, passwd);
|
||||
if (!is_g10) {
|
||||
stuff[10] = tool78_calc_ocd_checksum8(10, passwd);
|
||||
}
|
||||
|
||||
busy_wait_ms(1);
|
||||
rr = hw->send(11, stuff, -1);
|
||||
rr = hw->send(is_g10 ? 10 : 11, stuff, -1);
|
||||
|
||||
// stuff[9] is the checksum byte echoed back
|
||||
rr = hw->recv(2, &stuff[9], 100000);
|
||||
printf("ocdpw 2 = %02x %02x\n", stuff[9], stuff[10]);
|
||||
if (rr != 2) {
|
||||
/*printf("OCDconn2 rr: %d\n", rr);
|
||||
for (int iii = 0; iii < rr; ++iii) {
|
||||
|
@ -1107,7 +1147,17 @@ int tool78_ocd_connect(struct tool78_hw* hw, const uint8_t passwd[10]) {
|
|||
}*/
|
||||
return -2;
|
||||
}
|
||||
|
||||
if (stuff[9] == 0xff) { // framing error bullshit
|
||||
stuff[9] = stuff[10];
|
||||
rr = hw->recv(1, &stuff[10], 100000);
|
||||
if (rr != 1) return -2;
|
||||
}
|
||||
printf("ocdpw 3 = %02x %02x\n", stuff[9], stuff[10]);
|
||||
while (stuff[10] == 0) {
|
||||
rr = hw->recv(1, &stuff[10], 100000);
|
||||
if (rr != 1) return -2;
|
||||
}
|
||||
printf("ocdpw 4 = %02x %02x\n", stuff[9], stuff[10]);
|
||||
|
||||
/*printf("cksum=0x%02x conn=%02x pw=%02x\n",
|
||||
cksum, connst, stuff[10]);*/
|
||||
|
@ -1117,9 +1167,58 @@ int tool78_ocd_connect(struct tool78_hw* hw, const uint8_t passwd[10]) {
|
|||
}
|
||||
int tool78_ocd_read(struct tool78_hw* hw, uint16_t off, uint8_t len,
|
||||
uint8_t* data) {
|
||||
busy_wait_ms(1);
|
||||
busy_wait_us(300);//busy_wait_ms(1);
|
||||
|
||||
bool is_g10 = (hw->target & tool78_mcu_mask) == tool78_mcu_rl78g10;
|
||||
|
||||
uint8_t hdr[4];
|
||||
int rr;
|
||||
|
||||
if (is_g10) {
|
||||
if (len == 2) {
|
||||
hdr[0] = tool78ocd_cmdg10_setptr;
|
||||
hdr[1] = off & 0xff; // l
|
||||
hdr[2] = off >> 8; // h
|
||||
hdr[3] = 1; // b
|
||||
rr = hw->send(sizeof hdr, hdr, -1);
|
||||
if (rr != sizeof hdr) return -1;
|
||||
|
||||
rr = hw->recv(2, data, 1000);
|
||||
if (rr != 2) return -2;
|
||||
if (data[1] != 0x00) return -3;
|
||||
|
||||
hdr[0] = tool78ocd_cmdg10_read_word;
|
||||
rr = hw->send(1, hdr, -1);
|
||||
if (rr != 1) return -1;
|
||||
|
||||
rr = hw->recv(2, data, 1000*len);
|
||||
if (rr != 2) return -2;
|
||||
return 0;
|
||||
} else {
|
||||
hdr[0] = tool78ocd_cmdg10_setptr;
|
||||
hdr[1] = off & 0xff; // l
|
||||
hdr[2] = off >> 8; // h
|
||||
hdr[3] = len; // b
|
||||
rr = hw->send(sizeof hdr, hdr, -1);
|
||||
if (rr != sizeof hdr) return -1;
|
||||
printf("sent hdr\n");
|
||||
|
||||
rr = hw->recv(2, data, 1000);
|
||||
printf("stat rr=%d data=%02x %02x\n", rr, data[0], data[1]);
|
||||
if (rr != 2) return -2;
|
||||
if (data[1] != 0x00) return -3;
|
||||
|
||||
hdr[0] = tool78ocd_cmdg10_read_raw;
|
||||
rr = hw->send(1, hdr, -1);
|
||||
if (rr != 1) return -1;
|
||||
printf("sent rdcmd\n");
|
||||
|
||||
rr = hw->recv(len, data, 1000*len);
|
||||
printf("got data rr=%d data=%02x\n", rr, data[0]);
|
||||
if (rr != len) return -2;
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
hdr[0] = tool78ocd_cmd_read;
|
||||
hdr[2] = off >> 8;
|
||||
hdr[1] = off & 0xff;
|
||||
|
@ -1127,6 +1226,7 @@ int tool78_ocd_read(struct tool78_hw* hw, uint16_t off, uint8_t len,
|
|||
//printf("rd len=%u\n", len);
|
||||
|
||||
int rr = hw->send(sizeof hdr, hdr, -1);
|
||||
if (rr != sizeof hdr) return -1;
|
||||
rr = hw->recv(1, &hdr[2], 1000);
|
||||
// last byte of header sent echoed back
|
||||
if (rr != 1 || hdr[2] != hdr[3]) {
|
||||
|
@ -1137,32 +1237,85 @@ int tool78_ocd_read(struct tool78_hw* hw, uint16_t off, uint8_t len,
|
|||
rr = hw->recv(len, data, 1000*len);
|
||||
//printf("ocd read %d\n", rr);
|
||||
return (rr == len) ? 0 : -1;
|
||||
}
|
||||
}
|
||||
int tool78_ocd_write(struct tool78_hw* hw, uint16_t addr, uint8_t len,
|
||||
const uint8_t* data) {
|
||||
if (len == 0) return -1;
|
||||
busy_wait_ms(1);
|
||||
|
||||
bool is_g10 = (hw->target & tool78_mcu_mask) == tool78_mcu_rl78g10;
|
||||
|
||||
uint8_t hdr[4];
|
||||
int rr;
|
||||
|
||||
if (is_g10) {
|
||||
if (len == 2) {
|
||||
hdr[0] = tool78ocd_cmdg10_setptr;
|
||||
hdr[1] = addr & 0xff; // l
|
||||
hdr[2] = addr >> 8; // h
|
||||
hdr[3] = data[1]; // b
|
||||
|
||||
rr = hw->send(sizeof hdr, hdr, -1);
|
||||
if (rr != sizeof hdr) return -1;
|
||||
|
||||
hdr[0] = tool78ocd_cmdg10_write_word;
|
||||
hdr[1] = data[0]; // a
|
||||
|
||||
rr = hw->send(2, hdr, -1);
|
||||
if (rr != 2) return -1;
|
||||
|
||||
rr = hw->recv(2, hdr, 1000*len);
|
||||
if (rr != 2) return -1;
|
||||
|
||||
return (hdr[1] == 0) ? 0 : -2;
|
||||
} else {
|
||||
hdr[0] = tool78ocd_cmdg10_setptr;
|
||||
hdr[1] = addr & 0xff; // l
|
||||
hdr[2] = addr >> 8; // h
|
||||
hdr[3] = len; // b
|
||||
|
||||
rr = hw->send(sizeof hdr, hdr, -1);
|
||||
if (rr != sizeof hdr) return -1;
|
||||
|
||||
hdr[0] = tool78ocd_cmdg10_write_raw;
|
||||
|
||||
rr = hw->send(1, hdr, -1);
|
||||
if (rr != 1) return -1;
|
||||
|
||||
rr = hw->send(len, data, -1);
|
||||
if (rr != len) return -1;
|
||||
|
||||
rr = hw->recv(2, hdr, 1000*len);
|
||||
if (rr != 2) return -1;
|
||||
|
||||
return (hdr[1] == 0) ? 0 : -2;
|
||||
}
|
||||
} else {
|
||||
hdr[0] = tool78ocd_cmd_write;
|
||||
hdr[1] = addr & 0xff;
|
||||
hdr[2] = addr >> 8;
|
||||
hdr[3] = len;
|
||||
|
||||
int rr = hw->send(sizeof hdr, hdr, -1);
|
||||
if (rr != sizeof hdr) return -1;
|
||||
rr = hw->send(len, data, -1);
|
||||
if (rr != len) return -1;
|
||||
|
||||
// last data byte echoed back
|
||||
rr = hw->recv(2, hdr, 1000*len);
|
||||
if (rr != 2) return -1;
|
||||
///printf("ocd write 0x%02x\n", hdr[1]);
|
||||
return (hdr[1] == tool78ocd_cmd_write) ? 0 : -2;
|
||||
}
|
||||
}
|
||||
int tool78_ocd_exec(struct tool78_hw* hw) {
|
||||
busy_wait_ms(1);
|
||||
|
||||
uint8_t hdr[2];
|
||||
hdr[0] = tool78ocd_cmd_exec;
|
||||
bool is_g10 = (hw->target & tool78_mcu_mask) == tool78_mcu_rl78g10;
|
||||
|
||||
uint8_t hdr[2], cmd;
|
||||
cmd = hdr[0] = is_g10 ? tool78ocd_cmdg10_exec : tool78ocd_cmd_exec;
|
||||
|
||||
int rr = hw->send(1, hdr, -1);
|
||||
|
||||
|
@ -1170,27 +1323,45 @@ int tool78_ocd_exec(struct tool78_hw* hw) {
|
|||
if (rr != 1 && rr != 2) return -1;
|
||||
//printf("h[0]=0x%02x, h[1]=0x%02x\n", hdr[0], hdr[1]);
|
||||
|
||||
return (hdr[0] == tool78ocd_cmd_exec) ? 0 : -2;
|
||||
return (hdr[0] == cmd) ? 0 : -2;
|
||||
}
|
||||
int tool78_ocd_leave(struct tool78_hw* hw, bool exit_to_ram) {
|
||||
busy_wait_ms(1);
|
||||
|
||||
bool is_g10 = (hw->target & tool78_mcu_mask) == tool78_mcu_rl78g10;
|
||||
|
||||
uint8_t hdr[2];
|
||||
|
||||
if (is_g10) {
|
||||
hdr[0] = tool78ocd_cmdg10_exit_reti;
|
||||
} else {
|
||||
hdr[0] = exit_to_ram ? tool78ocd_cmd_exit_ram : tool78ocd_cmd_exit_reti;
|
||||
}
|
||||
|
||||
int rr = hw->send(1, hdr, -1);
|
||||
|
||||
if (is_g10) {
|
||||
rr = hw->recv(2, &hdr[0], 1000);
|
||||
if (rr != 2) return -1;
|
||||
|
||||
return 0;
|
||||
} else {
|
||||
rr = hw->recv(1, &hdr[1], 1000);
|
||||
if (rr != 1) return -1;
|
||||
|
||||
return (hdr[0] == hdr[1]) ? 0 : -2;
|
||||
}
|
||||
}
|
||||
|
||||
// ----
|
||||
|
||||
static enum tool78_stat tool78_init_common(struct tool78_hw* hw) {
|
||||
if (!hw) return tool78_stat_internal_error;
|
||||
if ((hw->target & tool78_mcu_mask) != tool78_mcu_rl78g10) {
|
||||
hw->flags &= ~tool78_hw_flag_done_reset;
|
||||
} else {
|
||||
hw->flags |= tool78_hw_flag_done_reset;
|
||||
}
|
||||
|
||||
enum tool78_stat st = tool78_stat_ack;
|
||||
for (size_t i = 0; i < 16; ++i) {
|
||||
|
@ -1216,10 +1387,16 @@ static enum tool78_stat tool78_init_common(struct tool78_hw* hw) {
|
|||
//printf("baudrate result=0x%02x\n", st);
|
||||
if (st != tool78_stat_ack) return st;
|
||||
} else {
|
||||
enum tool78_stat st2;
|
||||
st = tool78_data_recv(hw, &st2, 1, 1000);
|
||||
if (st != tool78_stat_ack) return st;
|
||||
st = st2;
|
||||
// 0x3a/0xc5 is echoed back as well
|
||||
uint8_t data[5];
|
||||
int rr = hw->recv(2, data, 1000);
|
||||
st = data[1];
|
||||
//printf("init rr:%d st=%02x\n", rr, st);
|
||||
if (rr != 2) return tool78_stat_timeout_error;
|
||||
|
||||
// should be 5 zero bytes, but let's not check
|
||||
rr = hw->recv(5, data, 1000*1000);
|
||||
if (rr != 5) return tool78_stat_timeout_error;
|
||||
}
|
||||
|
||||
return st;
|
||||
|
@ -1247,9 +1424,11 @@ enum tool78_stat tool78_init_ocd(struct tool78_hw* hw, uint16_t* ver,
|
|||
//printf("common st=%d\n", st);
|
||||
if (st != tool78_stat_ack) return st;
|
||||
|
||||
if ((hw->target & tool78_mcu_mask) != tool78_mcu_rl78g10) {
|
||||
st = tool78_ocd_version(hw, ver);
|
||||
//printf("ocdver st=%d\n", st);
|
||||
if (st) return st;
|
||||
}
|
||||
|
||||
st = tool78_ocd_connect(hw, passwd);
|
||||
//printf("conn st=%d\n", st);
|
||||
|
|
|
@ -46,7 +46,7 @@ enum tool78_stat tool78_do_g10_get_flash_size(struct tool78_hw*,
|
|||
enum tool78_stat tool78_do_g10_check_crc(struct tool78_hw*,
|
||||
enum tool78_g10_flash_size fsz, uint16_t* crc);
|
||||
enum tool78_stat tool78_do_g10_erase_then_write(struct tool78_hw*,
|
||||
enum tool78_g10_flash_size fsz, const uint8_t* data);
|
||||
enum tool78_g10_flash_size fsz, const uint8_t* data, size_t datalen);
|
||||
|
||||
// new commands from the RL78/G23 (Proto C)
|
||||
|
||||
|
|
|
@ -5,22 +5,6 @@
|
|||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define PINOUT_TOOL78_PIO pio1
|
||||
|
||||
#define PINOUT_TOOL78_nRESET 16
|
||||
|
||||
#define PINOUT_TOOL78_78K0_FLMD0 17
|
||||
#define PINOUT_TOOL78_78K0_TXMOSI 18
|
||||
#define PINOUT_TOOL78_78K0_RXMISO 19
|
||||
#define PINOUT_TOOL78_78K0_CLOCK 20
|
||||
|
||||
#define PINOUT_TOOL78_78K0R_FLMD0 17
|
||||
#define PINOUT_TOOL78_78K0R_TOOL0 18
|
||||
|
||||
#define PINOUT_TOOL78_RL78_TOOL0 17
|
||||
#define PINOUT_TOOL78_RL78_TX 18
|
||||
#define PINOUT_TOOL78_RL78_RX 19
|
||||
|
||||
enum tool78_target {
|
||||
tool78k0_uart2 = 0x12,
|
||||
tool78k0_spi = 0x13,
|
||||
|
@ -157,6 +141,15 @@ enum tool78ocd_cmd {
|
|||
tool78ocd_cmd_exec = 0x94,
|
||||
tool78ocd_cmd_exit_reti = 0x95, // TODO: what is this?
|
||||
tool78ocd_cmd_exit_ram = 0x97, // TODO: what is this?
|
||||
|
||||
tool78ocd_cmdg10_connect = 0x55,
|
||||
tool78ocd_cmdg10_setptr = 0x56,
|
||||
tool78ocd_cmdg10_read_raw = 0x57,
|
||||
tool78ocd_cmdg10_write_raw = 0x58,
|
||||
tool78ocd_cmdg10_read_word = 0x59,
|
||||
tool78ocd_cmdg10_write_word= 0x5a,
|
||||
tool78ocd_cmdg10_exec = 0x5b,
|
||||
tool78ocd_cmdg10_exit_reti = 0x5c,
|
||||
};
|
||||
|
||||
enum tool78_frame {
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
#include <pico/time.h>
|
||||
#include <pico/timeout_helper.h>
|
||||
|
||||
#include "pinout.h"
|
||||
|
||||
#include "tool78_defs.h"
|
||||
#include "tool78_hw_helpers.h"
|
||||
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
#include <hardware/pio.h>
|
||||
#include <pico/time.h>
|
||||
|
||||
#include "pinout.h"
|
||||
|
||||
#include "tool78_defs.h"
|
||||
#include "tool78_hw_helpers.h"
|
||||
|
||||
|
@ -29,7 +31,7 @@ static bool t78k0_uart2_init(void) {
|
|||
tool78_uart_tx_program_init(PINOUT_TOOL78_PIO, vars.smtx, vars.txoff,
|
||||
PINOUT_TOOL78_78K0_TXMOSI, 9600, true);
|
||||
tool78_uart_rx_program_init(PINOUT_TOOL78_PIO, vars.smrx, vars.rxoff,
|
||||
PINOUT_TOOL78_78K0_RXMISO, 9600, true);
|
||||
PINOUT_TOOL78_78K0_RXMISO, 9600, true, true);
|
||||
|
||||
// magic initial not-really-commands
|
||||
// wait tCOM or tR1 (unclear) (>445k/8M s + (2^16)/2M s)
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
#include <hardware/pwm.h>
|
||||
#include <pico/time.h>
|
||||
|
||||
#include "pinout.h"
|
||||
|
||||
#include "tool78_defs.h"
|
||||
#include "tool78_hw_helpers.h"
|
||||
|
||||
|
@ -35,7 +37,7 @@ static bool t78k0_uart2_extclk_init(void) {
|
|||
tool78_uart_tx_program_init(PINOUT_TOOL78_PIO, vars.smtx, vars.txoff,
|
||||
PINOUT_TOOL78_78K0_TXMOSI, 9600, true);
|
||||
tool78_uart_rx_program_init(PINOUT_TOOL78_PIO, vars.smrx, vars.rxoff,
|
||||
PINOUT_TOOL78_78K0_RXMISO, 9600, true);
|
||||
PINOUT_TOOL78_78K0_RXMISO, 9600, true, true);
|
||||
|
||||
// magic initial not-really-commands
|
||||
// wait tCOM or tR1 (unclear) (>445k/8M s + (2^16)/2M s)
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
#include <hardware/pio.h>
|
||||
#include <pico/time.h>
|
||||
|
||||
#include "pinout.h"
|
||||
|
||||
#include "tool78_defs.h"
|
||||
#include "tool78_hw_helpers.h"
|
||||
|
||||
|
@ -28,7 +30,7 @@ static bool t78k0r_uart1_init(void) {
|
|||
tool78_entryseq_78k0r(tool78_entry_78k0r_uart1);
|
||||
|
||||
tool78_uart_rx_program_init(PINOUT_TOOL78_PIO, vars.smrx, vars.rxoff,
|
||||
PINOUT_TOOL78_78K0R_TOOL0, 9600, true);
|
||||
PINOUT_TOOL78_78K0R_TOOL0, 9600, true, true);
|
||||
tool78_uart_tx_program_init(PINOUT_TOOL78_PIO, vars.smtx, vars.txoff,
|
||||
PINOUT_TOOL78_78K0R_TOOL0, 9600, true);
|
||||
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
#include <pico/time.h>
|
||||
#include <pico/timeout_helper.h>
|
||||
|
||||
#include "pinout.h"
|
||||
|
||||
#include "tool78_defs.h"
|
||||
#include "tool78_hw.h"
|
||||
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
#include <hardware/pio.h>
|
||||
#include <pico/time.h>
|
||||
|
||||
#include "pinout.h"
|
||||
|
||||
#include "tool78_defs.h"
|
||||
#include "tool78_hw_helpers.h"
|
||||
|
||||
|
@ -13,6 +15,7 @@
|
|||
static struct tool78_pio_vars vars;
|
||||
|
||||
static int trl78_uart1_send(int len, const uint8_t* data, int32_t timeout_us);
|
||||
static int trl78g10_uart1_send(int len, const uint8_t* data, int32_t timeout_us);
|
||||
|
||||
static bool trl78_uart1_init(void) {
|
||||
if (!tool78_hw_init_help(&tool78_uart_tx_program, &tool78_uart_rx_program,
|
||||
|
@ -27,7 +30,7 @@ static bool trl78_uart1_init(void) {
|
|||
tool78_entryseq_rl78(typ);
|
||||
|
||||
tool78_uart_rx_program_init(PINOUT_TOOL78_PIO, vars.smrx, vars.rxoff,
|
||||
PINOUT_TOOL78_RL78_TOOL0, 115200, true);
|
||||
PINOUT_TOOL78_RL78_TOOL0, 115200, true, true);
|
||||
tool78_uart_tx_program_init(PINOUT_TOOL78_PIO, vars.smtx, vars.txoff,
|
||||
PINOUT_TOOL78_RL78_TOOL0, 115200, true);
|
||||
|
||||
|
@ -50,24 +53,23 @@ static bool trl78g10_uart1_init(void) {
|
|||
vars.exclusive = true;
|
||||
vars.bitswap = true;
|
||||
|
||||
enum tool78_entry typ = tool78_entry_rl78_uart1;
|
||||
//enum tool78_entry typ = tool78_entry_rl78_uart1;
|
||||
enum tool78_entry typ = (tool78_hw_rl78g10_uart1.flags & tool78_hw_flag_do_ocd)
|
||||
? tool78_entry_rl78_ocd : tool78_entry_rl78_uart1;
|
||||
|
||||
tool78_entryseq_rl78(typ);
|
||||
|
||||
tool78_uart_rx_program_init(PINOUT_TOOL78_PIO, vars.smrx, vars.rxoff,
|
||||
PINOUT_TOOL78_RL78_TOOL0, 115200, true);
|
||||
PINOUT_TOOL78_RL78_TOOL0, 115200, true, false);
|
||||
tool78_uart_tx_program_init(PINOUT_TOOL78_PIO, vars.smtx, vars.txoff,
|
||||
PINOUT_TOOL78_RL78_TOOL0, 115200, true);
|
||||
|
||||
uint8_t byte = (uint8_t)typ;
|
||||
trl78_uart1_send(1, &byte, -1);
|
||||
trl78g10_uart1_send(1, &byte, -1);
|
||||
|
||||
//busy_wait_us_32(70); // tMB
|
||||
busy_wait_ms(4);
|
||||
//busy_wait_ms(4);
|
||||
|
||||
// now a baudrate set command needs to be sent, but we leave that to the
|
||||
// upper (command processing) layer as it has to know about those timings
|
||||
// anyway
|
||||
// the device will reply with 0x06
|
||||
|
||||
return true; // all is well!
|
||||
}
|
||||
|
@ -130,7 +132,7 @@ struct tool78_hw tool78_hw_rl78_uart1 = {
|
|||
struct tool78_hw tool78_hw_rl78g10_uart1 = {
|
||||
.target = tool78rlg10_uart1,
|
||||
|
||||
.init = trl78_uart1_init,
|
||||
.init = trl78g10_uart1_init,
|
||||
.deinit = trl78_uart1_deinit,
|
||||
|
||||
.set_baudrate = trl78_uart1_set_baudrate,
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
#include <hardware/pio.h>
|
||||
#include <pico/time.h>
|
||||
|
||||
#include "pinout.h"
|
||||
|
||||
#include "tool78_defs.h"
|
||||
#include "tool78_hw_helpers.h"
|
||||
|
||||
|
@ -39,7 +41,7 @@ static bool trl78_uart2_init(void) {
|
|||
tool78_uart_tx_program_init(PINOUT_TOOL78_PIO, vars.smtx, vars.txoff,
|
||||
PINOUT_TOOL78_RL78_TX, 115200, true);
|
||||
tool78_uart_rx_program_init(PINOUT_TOOL78_PIO, vars.smrx, vars.rxoff,
|
||||
PINOUT_TOOL78_RL78_RX, 115200, true);
|
||||
PINOUT_TOOL78_RL78_RX, 115200, true, true);
|
||||
gpio_set_function(PINOUT_TOOL78_RL78_TOOL0, GPIO_FUNC_SIO);
|
||||
|
||||
// now a baudrate set command needs to be sent, but we leave that to the
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
#include <pico/time.h>
|
||||
#include <pico/timeout_helper.h>
|
||||
|
||||
#include "pinout.h"
|
||||
|
||||
#include "tool78_defs.h"
|
||||
#include "tool78_hw_helpers.h"
|
||||
|
||||
|
@ -27,7 +29,7 @@ static bool test_init(void) {
|
|||
tool78_uart_tx_program_init(PINOUT_TOOL78_PIO, vars.smtx, vars.txoff,
|
||||
PINOUT_TOOL78_RL78_TX, 115200, true);
|
||||
tool78_uart_rx_program_init(PINOUT_TOOL78_PIO, vars.smrx, vars.rxoff,
|
||||
PINOUT_TOOL78_RL78_RX, 115200, true);
|
||||
PINOUT_TOOL78_RL78_RX, 115200, true, true);
|
||||
|
||||
// TODO: magic initial not-really-commands
|
||||
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "zap_crowbar.h"
|
||||
|
||||
void zap_crowbar_init(void) {
|
||||
printf("zap crowbar init\n");
|
||||
const io_rw_32 pinmask = (1u << ZAP_CROWBAR_1) | (1u << ZAP_CROWBAR_2);
|
||||
|
||||
sio_hw->gpio_clr = pinmask; // default to low -> hiZ by default
|
||||
|
|
|
@ -17,6 +17,7 @@ void zap_dac_init(bool shdn) {
|
|||
spi_init(ZAP_DAC_SPI, 1*1000*1000); // TODO: can we go higher?
|
||||
spi_set_format(ZAP_DAC_SPI, 16, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);
|
||||
|
||||
(void)shdn;
|
||||
gpio_put(ZAP_DAC_NLATCH, true);
|
||||
gpio_put(ZAP_DAC_CS , true);
|
||||
//gpio_put(ZAP_DAC_NSHDN , !shdn);
|
||||
|
|
|
@ -28,6 +28,7 @@ void zap_dac_set_b(uint16_t b);
|
|||
|
||||
// only relevant for MCP49x2
|
||||
static inline void zap_dac_set_shutdown(bool shdn) {
|
||||
(void)shdn;
|
||||
//gpio_put(ZAP_DAC_NSHDN, !shdn);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
trace.log
|
||||
*.bin
|
||||
*.h
|
||||
*.elf
|
||||
*.map
|
||||
*.o
|
||||
*.srec
|
|
@ -0,0 +1,27 @@
|
|||
|
||||
AS := rl78-elf-gcc
|
||||
LD := rl78-elf-gcc
|
||||
OBJCOPY := rl78-elf-objcopy
|
||||
|
||||
all: test-rom.srec test-dbg.srec test-rom.bin test-dbg.bin
|
||||
|
||||
test.S.o: test.S
|
||||
$(AS) -c -o "$@" "$<"
|
||||
romhdr.S.o: romhdr.S
|
||||
$(AS) -c -o "$@" "$<"
|
||||
|
||||
OBJFILES := test.S.o romhdr.S.o
|
||||
|
||||
test-%.elf test-%.elf.map: $(OBJFILES) link-%.ld
|
||||
$(LD) -o "$@" $(OBJFILES) -T link-$*.ld -Wl,-Map="$@.map" -nostdlib -nostartfiles
|
||||
|
||||
test-%.bin: test-%.elf
|
||||
$(OBJCOPY) -O binary "$<" "$@"
|
||||
|
||||
%.srec: %.elf
|
||||
$(OBJCOPY) -O srec "$<" "$@"
|
||||
|
||||
clean:
|
||||
@$(RM) -v test-*.bin test-*.bin.h test-*.elf test-*.elf.map test.S.o
|
||||
.KEEP: test-rom.elf test-dbg.elf
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
|
||||
/*#define SSR00 #0x0100*/
|
||||
|
||||
#define P0 0xfff00
|
||||
#define P1 0xfff01
|
||||
#define PM0 0xfff20
|
||||
#define PM1 0xfff21
|
||||
|
||||
#define PER0 0xf00f0
|
||||
#define OSMC 0xf00f3
|
||||
|
||||
#define PU0 0xf0030
|
||||
#define PU1 0xf0031
|
||||
#define POM0 0xf0050
|
||||
#define POM1 0xf0051
|
||||
#define PMC0 0xf0060
|
||||
#define PMC1 0xf0061
|
||||
/*#define PD1 0x0075*/
|
||||
#define PIOR 0xf0077
|
||||
|
||||
/*#define CMC 0xfffa0
|
||||
#define CSC 0xfffa1
|
||||
#define CKC 0xfffa4*/
|
||||
#define HOCODIV 0xf00a8
|
||||
|
||||
|
||||
/*#define STMK0
|
||||
SRMK0
|
||||
SREMK0
|
||||
SAUEN
|
||||
#define ST0 0x0124
|
||||
#define SPS0 0x0126
|
||||
SMR00H
|
||||
SMR00L
|
||||
SCR00H
|
||||
SCR00L*/
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
OUTPUT_FORMAT("elf32-rl78","elf32-rl78","elf32-rl78")
|
||||
OUTPUT_ARCH(rl78)
|
||||
ENTRY(_start)
|
||||
|
||||
MEMORY
|
||||
{
|
||||
ram (rwx) : ORIGIN = 0xff900, LENGTH = 0x5e0/*idk*/
|
||||
}
|
||||
|
||||
SECTIONS {
|
||||
/*.hdr :
|
||||
{
|
||||
BYTE(0xe0); BYTE(0x07); / * address * /
|
||||
BYTE(SIZEOF(.text));
|
||||
} > ram*/
|
||||
.text :
|
||||
{
|
||||
*(.text* .rodata* .data*)
|
||||
} > ram
|
||||
.bss :
|
||||
{
|
||||
*(.bss)
|
||||
} > ram =0x00
|
||||
|
||||
/DISCARD/ :
|
||||
{
|
||||
*(.vectors)
|
||||
*(.callt)
|
||||
*(.option)
|
||||
*(.password)
|
||||
*(.plt)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,166 @@
|
|||
OUTPUT_FORMAT("elf32-rl78","elf32-rl78","elf32-rl78")
|
||||
OUTPUT_ARCH(rl78)
|
||||
ENTRY(_start)
|
||||
|
||||
MEMORY
|
||||
{
|
||||
/*data (rwx) : ORIGIN = 0x0200, LENGTH = 0x100
|
||||
text (rx) : ORIGIN = 0xf800, LENGTH = 0x800 - 0x20
|
||||
vectors (rw) : ORIGIN = 0xffe0, LENGTH = 0x20*/
|
||||
|
||||
rom (rx) : ORIGIN = 0x00000, LENGTH = 0x01000
|
||||
/* vectors, boot clusters, etc.: part of ^ */
|
||||
ram (rwx) : ORIGIN = 0xffae0, LENGTH = 0x00400
|
||||
|
||||
/*
|
||||
* 16k code flash: 00000..03FFF
|
||||
* 2k data flash: F1000..F17FF
|
||||
* 1.5k ram: FF900..FFEDF
|
||||
*
|
||||
* boot clusters: +00000; +01000
|
||||
* vectors: 00000..0007F
|
||||
* callt: 00080..000BF
|
||||
* option byte: 000C0..000C3
|
||||
* debugpasswd: 000C4..000CD
|
||||
*
|
||||
* flash block = 0x400 bytes => 0x10 blocks
|
||||
*
|
||||
* vectors:
|
||||
* 000: RESET/POR/WDT/TRAP/RPE/...
|
||||
* 004: INTWDTI/INTSRO
|
||||
* 006: INTLVI
|
||||
* 008: INTP0
|
||||
* 00A: INTP1
|
||||
* ...
|
||||
* .14: INTP6
|
||||
* 016: INTST0/INTCSI00/INTIIC00
|
||||
* 018: INTSR0/INTCSI01/INTIIC01
|
||||
* 01e: INTSRE0
|
||||
* 020: INTTM00
|
||||
* 022: INTST1/INTCSI10/INTIIC10
|
||||
* 024: INTSR1/INTCSI11/INTIIC11
|
||||
* 026: INTSRE1
|
||||
* bluh bluh not really interesting
|
||||
* 07E: BRK
|
||||
*
|
||||
* 02000..03FFF mirrored to F2000..F3FFF (if enabmed in PMC)
|
||||
*
|
||||
* IO regs:
|
||||
* serial data reg 00: TXD0/SIO00/SDR00 = 0xfff10
|
||||
* serial data reg 01: RXD0/SIO01/SDR01 = 0xfff12
|
||||
* serial data reg 02: TXD1/SIO10/SDR02 = 0xfff44
|
||||
* serial data reg 03: RXD1/SIO11/SDR03 = 0xfff42
|
||||
*
|
||||
* port mode reg? PMx = 0xFFF2x
|
||||
*
|
||||
* port input mode PIMx = 0xF004x
|
||||
* port output mode POMx = 0xF005x
|
||||
* port mode control PMCx = 0xF006x
|
||||
* port mode select PMS = 0xF007B
|
||||
* peripheral io redirection regs?
|
||||
* flash operating mode FLMODE = 0xF00AA
|
||||
* serial status reg SSR0x = F010(x*2)
|
||||
* serial mode reg SMR0x = F011(x*2)
|
||||
* serial comm ops setting SCR0x = F011(8+x*2)
|
||||
* + channel enable, start stop, clocksel, output, output enable, output level, standby control
|
||||
* interrupt stuff at 0xF0441+...
|
||||
*
|
||||
* F0090: rom enable flag etc : DFLCTL bit 0 (enable dataflash access?)
|
||||
* F0800: request data etc (not interesting here)
|
||||
* F0803=1
|
||||
* F0880=4
|
||||
* F0880: also rom enable bit?
|
||||
* FLMODE (voltages stuff, bluh), FLMWRP(?) (enable prev reg), PMMC (also voltages)
|
||||
*
|
||||
* TXD1 enable = PMC20=0 PM20=0 P20=1
|
||||
* RXD1 enable = PMC31=0 PM31=1
|
||||
*
|
||||
* WDT: WDTE (enable reg) + option byte C0: set WDTON bit to 0 (bit 4)
|
||||
*
|
||||
* serial: UART1: ch2
|
||||
* 8n1 lsbfirst
|
||||
* PER0: bit 2 hi
|
||||
* PRR0: bit 2 lo
|
||||
* SPSm: 0b0100<<4 (125kbaud?)
|
||||
* SMRmn:
|
||||
* SEm SSm STm SOEm SOm SOLm SSCm ISC
|
||||
*
|
||||
* opt C1: 0b00000010 // 0x1a?
|
||||
* opt C2: 0b11101001 // 0x2d?
|
||||
* opt C3: 0b10000101 == 0x85
|
||||
* C4..CD: 00 ...
|
||||
*/
|
||||
}
|
||||
|
||||
SECTIONS {
|
||||
.btc0 :
|
||||
{
|
||||
. = 0x00000;
|
||||
KEEP(*(.vectors))
|
||||
. = 0x00080;
|
||||
KEEP(*(.callt))
|
||||
. = 0x000c0;
|
||||
KEEP(*(.option))
|
||||
. = 0x000c4;
|
||||
KEEP(*(.password))
|
||||
. = 0x000ce;
|
||||
*(.text.btc0)
|
||||
} > rom =0xff
|
||||
/* TODO: btc1? */
|
||||
.text :
|
||||
{
|
||||
. = ALIGN(2);
|
||||
*(.text .rodata* .eh_frame_hdr)
|
||||
. = ALIGN(256);
|
||||
/*KEEP(*(.eh_frame) *(.gcc_except_table*))
|
||||
PROVIDE (__preinit_array_start = .);
|
||||
KEEP (*(.preinit_array))
|
||||
PROVIDE (__preinit_array_end = .);
|
||||
PROVIDE (__init_array_start = .);
|
||||
KEEP (*(SORT(.init_array.*)))
|
||||
KEEP (*(.init_array))
|
||||
PROVIDE (__init_array_end = .);
|
||||
PROVIDE (__fini_array_start = .);
|
||||
KEEP (*(.fini_array))
|
||||
KEEP (*(SORT(.fini_array.*)))
|
||||
PROVIDE (__fini_array_end = .);
|
||||
LONG(0);*/ /* Sentinel. */
|
||||
/* gcc uses crtbegin.o to find the start of the constructors, so
|
||||
we make sure it is first. Because this is a wildcard, it
|
||||
doesn't matter if the user does not actually link against
|
||||
crtbegin.o; the linker won't look for a file to match a
|
||||
wildcard. The wildcard also means that it doesn't matter which
|
||||
directory crtbegin.o is in. */
|
||||
/*KEEP (*crtbegin*.o(.ctors))*/
|
||||
/* We don't want to include the .ctor section from from the
|
||||
crtend.o file until after the sorted ctors. The .ctor section
|
||||
from the crtend file contains the end of ctors marker and it
|
||||
must be last */
|
||||
/*KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
|
||||
KEEP (*(SORT(.ctors.*)))
|
||||
KEEP (*(.ctors))
|
||||
KEEP (*crtbegin*.o(.dtors))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
|
||||
KEEP (*(SORT(.dtors.*)))
|
||||
KEEP (*(.dtors))*/
|
||||
} > rom =0xff
|
||||
|
||||
.data :
|
||||
{
|
||||
__data_vma_start = ABSOLUTE(.);
|
||||
__data_lma_start = SIZEOF(.text);
|
||||
*(.data)
|
||||
}
|
||||
__data_size = SIZEOF(.data);
|
||||
.bss :
|
||||
{
|
||||
__bss_start = ABSOLUTE(.);
|
||||
*(.bss .sbss)
|
||||
} >ram
|
||||
__bss_size = SIZEOF(.bss);
|
||||
|
||||
/DISCARD/ :
|
||||
{
|
||||
*(.plt)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
|
||||
.section .vectors, "a", %progbits
|
||||
|
||||
_VECTORS:
|
||||
_vtor_RST:
|
||||
.2byte _start
|
||||
/* other vectors... */
|
||||
.2byte 0xffff
|
||||
.2byte _start /* wdt -> shrug */
|
||||
.2byte 0xffff
|
||||
|
||||
.section .callt, "a", %progbits
|
||||
|
||||
_CALLT:
|
||||
.2byte 0xffff
|
||||
|
||||
.section .option, "a", %progbits
|
||||
|
||||
/* option bytes */
|
||||
_OPTION:
|
||||
/* 0x000C0: wdt settings */
|
||||
.byte 0xee /* wdt disable */
|
||||
/* 0x000C1: */
|
||||
.byte 0xf7 /* LVD reset, 2.84V */
|
||||
/* 0x000C2: */
|
||||
.byte 0xfd /* HSmode, HOCO@20MHz */
|
||||
/* 0x000C3: debug settings */
|
||||
.byte 0x85 /* enabled */
|
||||
|
||||
.section .password, "a", %progbits
|
||||
|
||||
/* debugger password: ten 0xff bytes */
|
||||
_PASSWORD:
|
||||
.byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
|
||||
|
|
@ -0,0 +1,254 @@
|
|||
|
||||
#include "hw.S"
|
||||
|
||||
.global _start
|
||||
_start:
|
||||
/*mov es, #0*/
|
||||
movw sp, #0xfed0
|
||||
|
||||
; IAWCTL = 0 -> none?
|
||||
|
||||
|
||||
call !siniport
|
||||
call !siniclk
|
||||
;call !sinitau
|
||||
;call !siniuart0
|
||||
call !main
|
||||
|
||||
delay_long:
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
delay_data:
|
||||
nop
|
||||
ret
|
||||
|
||||
|
||||
tx_byte:
|
||||
; start condition
|
||||
clr1 P0.0
|
||||
call !delay_long ;27 cyc = 4 cyc + 16 cyc + 7 cyc
|
||||
|
||||
; data bits
|
||||
mov c, #8 ; 1 cyc
|
||||
.Lbitloop:
|
||||
|
||||
; set 1 bit
|
||||
bf a.0, $.Lsetlo ; 3 cyc hi // 5 cyc lo
|
||||
.Lsethi:
|
||||
nop ; 1 cyc hi //
|
||||
nop ; 1 cyc hi //
|
||||
set1 P0.0 ; 2 cyc hi //
|
||||
br $.Lafterset ; 3 cyc hi //
|
||||
.Lsetlo:
|
||||
clr1 P0.0 ; // 2 cyc lo
|
||||
nop ; // 1 cyc lo
|
||||
nop ; // 1 cyc lo
|
||||
nop ; // 1 cyc lo
|
||||
.Lafterset:
|
||||
; delay
|
||||
call !delay_data ;12 cyc
|
||||
|
||||
; next bit
|
||||
shr a, 1 ; 1 cyc
|
||||
dec c ; 1 cyc
|
||||
bnz $.Lbitloop ; 4 cyc
|
||||
|
||||
; stop condition
|
||||
set1 P0.0
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
|
||||
ret
|
||||
|
||||
|
||||
main:
|
||||
set1 P0.0
|
||||
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
|
||||
loop:
|
||||
mov es, #0xe
|
||||
|
||||
;movw bc, #0x0200
|
||||
mov c, #0
|
||||
movw hl, #0xfe00
|
||||
innerloop:
|
||||
mov a, es:[hl]
|
||||
push ax
|
||||
push bc
|
||||
call !tx_byte
|
||||
pop bc
|
||||
pop ax
|
||||
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
|
||||
incw hl
|
||||
;decw bc
|
||||
;cmpw bc, #0
|
||||
dec c
|
||||
cmp0 c
|
||||
bnz $innerloop
|
||||
|
||||
;movw bc, #0x0200
|
||||
mov c, #0
|
||||
;movw hl, #0xfe00
|
||||
innerloop2:
|
||||
mov a, es:[hl]
|
||||
push ax
|
||||
push bc
|
||||
call !tx_byte
|
||||
pop bc
|
||||
pop ax
|
||||
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
|
||||
incw hl
|
||||
;decw bc
|
||||
;cmpw bc, #0
|
||||
dec c
|
||||
cmp0 c
|
||||
bnz $innerloop2
|
||||
|
||||
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
|
||||
mov a, #'E'
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
mov a, #'N'
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
mov a, #'D'
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
mov a, #' '
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
|
||||
br !loop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
mov a, #' '
|
||||
call !tx_byte
|
||||
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
call !delay_long
|
||||
;set1 P0.0
|
||||
|
||||
br !loop
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
siniport:
|
||||
; P00 GPIO
|
||||
; P06 TxD0
|
||||
mov !PIOR, #0
|
||||
|
||||
; set P0 as output
|
||||
mov !P0, #0
|
||||
|
||||
; disable pullups
|
||||
mov !PU0, #0
|
||||
|
||||
; push-pull output
|
||||
mov !POM0, #0
|
||||
|
||||
; not analog in
|
||||
mov !PMC0, #0x7f
|
||||
|
||||
; set port modes
|
||||
;mov !PM0, #0x0f ; P00 GPIO ; P06 TxD0
|
||||
mov !PM0, #0
|
||||
|
||||
ret
|
||||
|
||||
|
||||
siniclk:
|
||||
mov !PER0, #0xe5 ; enable many peripherals
|
||||
mov !OSMC, #0x10
|
||||
;mov !HOCODIV, #1
|
||||
ret
|
||||
|
Loading…
Reference in New Issue