fix some compiler errors. delays are still TODO
This commit is contained in:
parent
1b1ed215eb
commit
e77699c9cc
|
@ -43,6 +43,7 @@ if(FAMILY STREQUAL "rp2040")
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/tool78/tool78_hw_78k0r_uart1.c
|
${CMAKE_CURRENT_SOURCE_DIR}/src/tool78/tool78_hw_78k0r_uart1.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/tool78/tool78_hw_rl78_uart1.c
|
${CMAKE_CURRENT_SOURCE_DIR}/src/tool78/tool78_hw_rl78_uart1.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/tool78/tool78_hw_rl78_uart2.c
|
${CMAKE_CURRENT_SOURCE_DIR}/src/tool78/tool78_hw_rl78_uart2.c
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/src/tool78/tool78_cmds.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/test/piotest.c
|
${CMAKE_CURRENT_SOURCE_DIR}/src/test/piotest.c
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <pico/time.h>
|
#include <pico/time.h>
|
||||||
#include <pico/timeout_helper.h>
|
#include <pico/timeout_helper.h>
|
||||||
|
|
||||||
|
@ -41,7 +43,7 @@ static uint8_t databuf[255];
|
||||||
|
|
||||||
|
|
||||||
static enum tool78_stat tool78_data_send(struct tool78_hw* hw,
|
static enum tool78_stat tool78_data_send(struct tool78_hw* hw,
|
||||||
size_t len, const uint8_t* data, bool final_block) {
|
int len, const uint8_t* data, bool final_block) {
|
||||||
if (len == 0) return tool78_stat_ack;
|
if (len == 0) return tool78_stat_ack;
|
||||||
if (len > 0x100) return tool78_stat_internal_error;
|
if (len > 0x100) return tool78_stat_internal_error;
|
||||||
len &= 0xff;
|
len &= 0xff;
|
||||||
|
@ -73,7 +75,7 @@ static enum tool78_stat tool78_data_send(struct tool78_hw* hw,
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum tool78_stat tool78_cmd_send(struct tool78_hw* hw, uint8_t cmd,
|
static enum tool78_stat tool78_cmd_send(struct tool78_hw* hw, uint8_t cmd,
|
||||||
uint8_t len, const uint8_t* data) {
|
int len, const uint8_t* data) {
|
||||||
if (len == 0) return tool78_stat_ack;
|
if (len == 0) return tool78_stat_ack;
|
||||||
if (len > 0x100) return tool78_stat_internal_error;
|
if (len > 0x100) return tool78_stat_internal_error;
|
||||||
len &= 0xff;
|
len &= 0xff;
|
||||||
|
@ -121,7 +123,7 @@ static enum tool78_stat tool78_data_recv(struct tool78_hw* hw, uint8_t* buf,
|
||||||
rr = hw->recv(1, &pre[1], 100);
|
rr = hw->recv(1, &pre[1], 100);
|
||||||
if (rr != 1) return tool78_stat_internal_error;
|
if (rr != 1) return tool78_stat_internal_error;
|
||||||
|
|
||||||
uint8_t len = pre[1];
|
int len = pre[1];
|
||||||
if (!len) len = 256;
|
if (!len) len = 256;
|
||||||
|
|
||||||
if (hw->target == tool78k0_spi && pre[1] == tool78_stat_busy)
|
if (hw->target == tool78k0_spi && pre[1] == tool78_stat_busy)
|
||||||
|
@ -137,7 +139,7 @@ static enum tool78_stat tool78_data_recv(struct tool78_hw* hw, uint8_t* buf,
|
||||||
if (post[1] != tool78_frame_etx && post[1] != tool78_frame_etb)
|
if (post[1] != tool78_frame_etx && post[1] != tool78_frame_etb)
|
||||||
return tool78_stat_protocol_error;
|
return tool78_stat_protocol_error;
|
||||||
|
|
||||||
uint8_t ck = tool78_calc_checksum(len, buf);
|
uint8_t ck = tool78_calc_checksum8(len, buf);
|
||||||
if (ck != post[0])
|
if (ck != post[0])
|
||||||
return tool78_stat_protocol_error;
|
return tool78_stat_protocol_error;
|
||||||
|
|
||||||
|
@ -150,6 +152,7 @@ static enum tool78_stat tool78_wait_status(struct tool78_hw* hw, int l, int time
|
||||||
timeout_us *= 2;
|
timeout_us *= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum tool78_stat st;
|
||||||
bool blockinf = timeout_us < 0;
|
bool blockinf = timeout_us < 0;
|
||||||
absolute_time_t at = make_timeout_time_us(timeout_us);
|
absolute_time_t at = make_timeout_time_us(timeout_us);
|
||||||
timeout_state_t ts = {0};
|
timeout_state_t ts = {0};
|
||||||
|
@ -166,11 +169,11 @@ static enum tool78_stat tool78_wait_status(struct tool78_hw* hw, int l, int time
|
||||||
}
|
}
|
||||||
|
|
||||||
st = tool78_data_recv(hw, databuf, l, timeout_us);
|
st = tool78_data_recv(hw, databuf, l, timeout_us);
|
||||||
if (st == tool78_status_busy) goto cont;
|
if (st == tool78_stat_busy) goto cont;
|
||||||
if (st != tool78_stat_ack) return st;
|
if (st != tool78_stat_ack) return st;
|
||||||
|
|
||||||
st = databuf[0];
|
st = databuf[0];
|
||||||
if (st == tool78_status_busy) goto cont;
|
if (st == tool78_stat_busy) goto cont;
|
||||||
|
|
||||||
return st;
|
return st;
|
||||||
|
|
||||||
|
@ -195,7 +198,6 @@ enum tool78_stat tool78_do_reset(struct tool78_hw* hw) {
|
||||||
|
|
||||||
enum tool78_stat tool78_do_baud_rate_set(struct tool78_hw* hw) {
|
enum tool78_stat tool78_do_baud_rate_set(struct tool78_hw* hw) {
|
||||||
uint8_t d0x[5];
|
uint8_t d0x[5];
|
||||||
int len = 0;
|
|
||||||
enum tool78_stat st;
|
enum tool78_stat st;
|
||||||
|
|
||||||
switch (hw->target & tool78_mcu_mask) {
|
switch (hw->target & tool78_mcu_mask) {
|
||||||
|
@ -224,7 +226,7 @@ enum tool78_stat tool78_do_baud_rate_set(struct tool78_hw* hw) {
|
||||||
d0x[0] = 0x00; // 0=115.2k 1=250k 2=500k 3=1M
|
d0x[0] = 0x00; // 0=115.2k 1=250k 2=500k 3=1M
|
||||||
d0x[1] = 33; // 3.3V, will switch to full-speed mode
|
d0x[1] = 33; // 3.3V, will switch to full-speed mode
|
||||||
|
|
||||||
st = tool78_cmd_send(hw, tool78_cmd_baud_rate_set, 5, d0x);
|
st = tool78_cmd_send(hw, tool78_cmd_baud_rate_set, 2, d0x);
|
||||||
if (st != tool78_stat_ack) return st;
|
if (st != tool78_stat_ack) return st;
|
||||||
|
|
||||||
st = tool78_wait_status(hw, 3, tWT10); // TODO // aka tCS6
|
st = tool78_wait_status(hw, 3, tWT10); // TODO // aka tCS6
|
||||||
|
@ -450,17 +452,17 @@ enum tool78_stat tool78_do_silicon_signature(struct tool78_hw* hw,
|
||||||
case tool78_mcu_78k0r: nbyte = 27; break;
|
case tool78_mcu_78k0r: nbyte = 27; break;
|
||||||
case tool78_mcu_rl78: nbyte = 22; break;
|
case tool78_mcu_rl78: nbyte = 22; break;
|
||||||
default: // oops
|
default: // oops
|
||||||
return tool78_stat_bad_cmu_for_cmd;
|
return tool78_stat_bad_mcu_for_cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(sig_Dest, 0, 27);
|
memset(sig_dest, 0, 27);
|
||||||
enum tool78_stat st = tool78_cmd_send(hw, tool78_cmd_silicon_signature, 0, NULL);
|
enum tool78_stat st = tool78_cmd_send(hw, tool78_cmd_silicon_signature, 0, NULL);
|
||||||
if (st != tool78_stat_ack) return st;
|
if (st != tool78_stat_ack) return st;
|
||||||
|
|
||||||
st = tool78_wait_status(hw, 1, tWT11); // TODO // aka tCS11
|
st = tool78_wait_status(hw, 1, tWT11); // TODO // aka tCS11
|
||||||
if (st != tool78_stat_ack) return st;
|
if (st != tool78_stat_ack) return st;
|
||||||
|
|
||||||
st = tool78_data_recv(hw, sig_dest, nbyte, tFD2); // TODO // aka tSD11
|
st = tool78_data_recv(hw, (uint8_t*)sig_dest, nbyte, tFD2); // TODO // aka tSD11
|
||||||
if (st != tool78_stat_ack) return st;
|
if (st != tool78_stat_ack) return st;
|
||||||
|
|
||||||
// TODO: parity check of data
|
// TODO: parity check of data
|
||||||
|
@ -479,7 +481,7 @@ enum tool78_stat tool78_do_version_get(struct tool78_hw* hw, tool78_version_t* v
|
||||||
if (st != tool78_stat_ack) return st;
|
if (st != tool78_stat_ack) return st;
|
||||||
|
|
||||||
memset(vout, 0, 6);
|
memset(vout, 0, 6);
|
||||||
st = tool78_data_recv(hw, vout, 6, tFD2); // TODO
|
st = tool78_data_recv(hw, (uint8_t*)vout, 6, tFD2); // TODO
|
||||||
if (st != tool78_stat_ack) return st;
|
if (st != tool78_stat_ack) return st;
|
||||||
|
|
||||||
return st;
|
return st;
|
||||||
|
@ -513,7 +515,7 @@ enum tool78_stat tool78_do_checksum(struct tool78_hw* hw, uint32_t start,
|
||||||
if (st != tool78_stat_ack) return st;
|
if (st != tool78_stat_ack) return st;
|
||||||
|
|
||||||
*ckout = 0;
|
*ckout = 0;
|
||||||
st = tool78_data_recv(hw, ckout, 2, tFD1); // TODO // aka tSD10
|
st = tool78_data_recv(hw, (uint8_t*)ckout, 2, tFD1); // TODO // aka tSD10
|
||||||
if (st != tool78_stat_ack) return st;
|
if (st != tool78_stat_ack) return st;
|
||||||
|
|
||||||
return st;
|
return st;
|
||||||
|
@ -566,7 +568,7 @@ enum tool78_stat tool78_do_security_set(struct tool78_hw* hw,
|
||||||
st = tool78_wait_status(hw, 1, tWT14); // TODO // aka tDS7
|
st = tool78_wait_status(hw, 1, tWT14); // TODO // aka tDS7
|
||||||
if (st != tool78_stat_ack) return st;
|
if (st != tool78_stat_ack) return st;
|
||||||
|
|
||||||
if (!srl78) { // yeah...
|
if (!isrl78) { // yeah...
|
||||||
st = tool78_wait_status(hw, 1, tWT15); // TODO
|
st = tool78_wait_status(hw, 1, tWT15); // TODO
|
||||||
if (st != tool78_stat_ack) return st;
|
if (st != tool78_stat_ack) return st;
|
||||||
}
|
}
|
||||||
|
@ -595,7 +597,7 @@ enum tool78_stat tool78_do_security_get(struct tool78_hw* hw,
|
||||||
sec->fsws = data[2] | ((uint16_t)data[3]<<8);
|
sec->fsws = data[2] | ((uint16_t)data[3]<<8);
|
||||||
sec->fswe = data[4] | ((uint16_t)data[5]<<8);
|
sec->fswe = data[4] | ((uint16_t)data[5]<<8);
|
||||||
|
|
||||||
return st
|
return st;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum tool78_stat tool78_do_security_release(struct tool78_hw* hw) {
|
enum tool78_stat tool78_do_security_release(struct tool78_hw* hw) {
|
||||||
|
|
|
@ -112,7 +112,7 @@ enum tool78_stat {
|
||||||
// 78k0/Kx2 only. security related?
|
// 78k0/Kx2 only. security related?
|
||||||
tool78_stat_read_error = 0x20,
|
tool78_stat_read_error = 0x20,
|
||||||
// 78k0/Kx2 SPI only
|
// 78k0/Kx2 SPI only
|
||||||
tool78_stat_busy = 0xff
|
tool78_stat_busy = 0xff,
|
||||||
|
|
||||||
tool78_stat_protocol_error = 0xc1, // low-level wire protocol violation
|
tool78_stat_protocol_error = 0xc1, // low-level wire protocol violation
|
||||||
tool78_stat_bad_mcu_for_cmd = 0xc2,
|
tool78_stat_bad_mcu_for_cmd = 0xc2,
|
||||||
|
@ -154,19 +154,26 @@ enum tool78_frame {
|
||||||
tool78_frame_eot = 0x17,
|
tool78_frame_eot = 0x17,
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline uint8_t tool78_digest_checksum8(uint8_t r, const uint8_t* data) {
|
static inline uint8_t tool78_digest_checksum8(uint8_t r, size_t len, const uint8_t* data) {
|
||||||
for (size_t i = 0; i < len; ++i) r = r - data[i];
|
for (size_t i = 0; i < len; ++i) r = r - data[i];
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
static inline uint8_t tool78_calc_checksum8(size_t len, const uint8_t* data) {
|
static inline uint8_t tool78_calc_checksum8(size_t len, const uint8_t* data) {
|
||||||
return tool78_digest_checksum8(r, len, data);
|
return tool78_digest_checksum8(0, len, data);
|
||||||
}
|
}
|
||||||
static inline uint8_t tool78_calc_ocd_checksum8(size_t len, const uint8_t* data) {
|
static inline uint8_t tool78_calc_ocd_checksum8(size_t len, const uint8_t* data) {
|
||||||
return ~tool78_calc_checksum8(len, data);
|
return ~tool78_calc_checksum8(len, data);
|
||||||
}
|
}
|
||||||
// TODO: 16bit checksum (cf. command B0 Checksum)
|
|
||||||
|
|
||||||
__attribute__((__packed__, __align__(1))) struct tool78_silicon_sig_78k0 {
|
static inline uint16_t tool78_digest_checksum16(uint16_t r, size_t len, const uint8_t* data) {
|
||||||
|
for (size_t i = 0; i < len; ++i) r = r - data[i]; // yes it's done byte by byte
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
static inline uint8_t tool78_calc_checksum16(size_t len, const uint8_t* data) {
|
||||||
|
return tool78_digest_checksum16(0, len, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct __attribute__((__packed__)) tool78_silicon_sig_78k0 {
|
||||||
uint8_t ven; // vendor code. 0x10 == NEC
|
uint8_t ven; // vendor code. 0x10 == NEC
|
||||||
uint8_t met; // macro extension (0x7f)
|
uint8_t met; // macro extension (0x7f)
|
||||||
uint8_t msc; // macro function code (0x04)
|
uint8_t msc; // macro function code (0x04)
|
||||||
|
@ -178,7 +185,7 @@ __attribute__((__packed__, __align__(1))) struct tool78_silicon_sig_78k0 {
|
||||||
// "for above fields except BOT, the lower 7 bits are used as data entity,
|
// "for above fields except BOT, the lower 7 bits are used as data entity,
|
||||||
// and the highest bit is used as an odd parity"
|
// and the highest bit is used as an odd parity"
|
||||||
};
|
};
|
||||||
__attribute__((__packed__, __align__(1))) struct tool78_silicon_sig_78k0r {
|
struct __attribute__((__packed__)) tool78_silicon_sig_78k0r {
|
||||||
uint8_t ven; // vendor code. 0x10 == NEC
|
uint8_t ven; // vendor code. 0x10 == NEC
|
||||||
uint8_t met; // macro extension (0x6f or 0x7f)
|
uint8_t met; // macro extension (0x6f or 0x7f)
|
||||||
uint8_t msc; // macro function code (0x04)
|
uint8_t msc; // macro function code (0x04)
|
||||||
|
@ -195,7 +202,7 @@ __attribute__((__packed__, __align__(1))) struct tool78_silicon_sig_78k0r {
|
||||||
// "for VEN, MET, MSC and DEC, the lower 7 bits are used as data entity,
|
// "for VEN, MET, MSC and DEC, the lower 7 bits are used as data entity,
|
||||||
// and the highest bit is used as an odd parity."
|
// and the highest bit is used as an odd parity."
|
||||||
};
|
};
|
||||||
__attribute__((__packed__, __align__(1))) struct tool78_silicon_sig_rl78 {
|
struct __attribute__((__packed__)) tool78_silicon_sig_rl78 {
|
||||||
uint8_t dec[3]; // device code
|
uint8_t dec[3]; // device code
|
||||||
uint8_t dev[10]; // device name
|
uint8_t dev[10]; // device name
|
||||||
uint8_t cen[3]; // last address of code flash rom, little-endian
|
uint8_t cen[3]; // last address of code flash rom, little-endian
|
||||||
|
@ -203,14 +210,14 @@ __attribute__((__packed__, __align__(1))) struct tool78_silicon_sig_rl78 {
|
||||||
uint8_t ver[3]; // firmware version number
|
uint8_t ver[3]; // firmware version number
|
||||||
// no parity bits
|
// no parity bits
|
||||||
};
|
};
|
||||||
__attribute__((__packed__, __align__(1))) typedef union tool78_silicon_sig {
|
typedef union __attribute__((__packed__)) tool78_silicon_sig {
|
||||||
struct tool78_silicon_sig_78k0 k780 ;
|
struct tool78_silicon_sig_78k0 k780 ;
|
||||||
struct tool78_silicon_sig_78k0r k780r;
|
struct tool78_silicon_sig_78k0r k780r;
|
||||||
struct tool78_silicon_sig_rl78 rl78 ;
|
struct tool78_silicon_sig_rl78 rl78 ;
|
||||||
} tool78_silicon_sig_t;
|
} tool78_silicon_sig_t;
|
||||||
|
|
||||||
// same structure for 78k0 and 78k0r, not used in rl78
|
// same structure for 78k0 and 78k0r, not used in rl78
|
||||||
__attribute__((__packed__, __align__(1))) typedef struct tool78_version {
|
typedef struct __attribute__((__packed__)) tool78_version {
|
||||||
uint8_t dv[3]; // all zero
|
uint8_t dv[3]; // all zero
|
||||||
uint8_t fw[3];
|
uint8_t fw[3];
|
||||||
} tool78_version_t;
|
} tool78_version_t;
|
||||||
|
|
|
@ -40,10 +40,10 @@ static bool t78k0r_uart1_init(void) {
|
||||||
busy_wait_us_32(120 + 20); // t01 or tCOM
|
busy_wait_us_32(120 + 20); // t01 or tCOM
|
||||||
|
|
||||||
// send two 0x00 "LOW" bytes
|
// send two 0x00 "LOW" bytes
|
||||||
uint8_t byte = 0x00;
|
byte = 0x00;
|
||||||
t78k0_uart2_send(1, &byte, -1);
|
t78k0r_uart1_send(1, &byte, -1);
|
||||||
busy_wait_us_32(120); // t12
|
busy_wait_us_32(120); // t12
|
||||||
t78k0_uart2_send(1, &byte, -1);
|
t78k0r_uart1_send(1, &byte, -1);
|
||||||
busy_wait_us_32(610); // t2C
|
busy_wait_us_32(610); // t2C
|
||||||
|
|
||||||
// now a reset command needs to be sent, but we leave that to the upper
|
// now a reset command needs to be sent, but we leave that to the upper
|
||||||
|
|
Loading…
Reference in New Issue