fix some compiler errors. delays are still TODO

This commit is contained in:
Triss 2021-11-07 21:07:37 +01:00
parent 1b1ed215eb
commit e77699c9cc
4 changed files with 37 additions and 27 deletions

View File

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

View File

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

View File

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

View File

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