rl78/g10,g1m,g1n stuff: impl sfp&ocd; also have different pinout configs

This commit is contained in:
Triss 2022-04-20 00:21:22 +02:00
parent d523de69b7
commit 72371a13fd
34 changed files with 1238 additions and 159 deletions

View File

@ -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/

34
src/bsp/breadboard.h Normal file
View File

@ -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

77
src/bsp/pinout.h Normal file
View File

@ -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

View File

@ -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");
}

View File

@ -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"

View File

@ -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);

View File

@ -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
};

View File

@ -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);

View File

@ -8,6 +8,8 @@
#include <hardware/pio_instructions.h>
#include <hardware/timer.h>
#include "pinout.h"
#include "pio_sbw.h"
#include "sbw.pio.h"

View File

@ -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()

View File

@ -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) {

View File

@ -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");

View File

@ -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);

View File

@ -105,13 +105,13 @@ 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
#define tERA (350*1000)
#define tDT 1
#define tDT 1
/*#define tDR 1*/
@ -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,52 +1167,155 @@ 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];
hdr[0] = tool78ocd_cmd_read;
hdr[2] = off >> 8;
hdr[1] = off & 0xff;
hdr[3] = len;
//printf("rd len=%u\n", len);
int rr;
int rr = hw->send(sizeof hdr, hdr, -1);
rr = hw->recv(1, &hdr[2], 1000);
// last byte of header sent echoed back
if (rr != 1 || hdr[2] != hdr[3]) {
//printf("rd recv=%02x\n", hdr[2]);
return -2;
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;
hdr[3] = 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]) {
//printf("rd recv=%02x\n", hdr[2]);
return -2;
}
rr = hw->recv(len, data, 1000*len);
//printf("ocd read %d\n", rr);
return (rr == len) ? 0 : -1;
}
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];
hdr[0] = tool78ocd_cmd_write;
hdr[1] = addr & 0xff;
hdr[2] = addr >> 8;
hdr[3] = len;
int rr;
int rr = hw->send(sizeof hdr, hdr, -1);
rr = hw->send(len, data, -1);
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
// 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;
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];
hdr[0] = exit_to_ram ? tool78ocd_cmd_exit_ram : tool78ocd_cmd_exit_reti;
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);
rr = hw->recv(1, &hdr[1], 1000);
if (rr != 1) return -1;
if (is_g10) {
rr = hw->recv(2, &hdr[0], 1000);
if (rr != 2) return -1;
return (hdr[0] == hdr[1]) ? 0 : -2;
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;
hw->flags &= ~tool78_hw_flag_done_reset;
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;
st = tool78_ocd_version(hw, ver);
//printf("ocdver st=%d\n", st);
if (st) 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);

View File

@ -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)

View File

@ -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 {

View File

@ -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"

View File

@ -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)

View File

@ -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)

View File

@ -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);

View File

@ -6,6 +6,8 @@
#include <pico/time.h>
#include <pico/timeout_helper.h>
#include "pinout.h"
#include "tool78_defs.h"
#include "tool78_hw.h"

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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);
}

7
test/rl78g10/.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
trace.log
*.bin
*.h
*.elf
*.map
*.o
*.srec

27
test/rl78g10/Makefile Normal file
View File

@ -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

37
test/rl78g10/hw.S Normal file
View File

@ -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*/

33
test/rl78g10/link-dbg.ld Normal file
View File

@ -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)
}
}

166
test/rl78g10/link-rom.ld Normal file
View File

@ -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)
}
}

35
test/rl78g10/romhdr.S Normal file
View File

@ -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

254
test/rl78g10/test.S Normal file
View File

@ -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