X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ccdbg-io.c;h=b78e3aad2d5795a5c2bc8ad968a2843e671bc0cf;hp=9586faa38bfcf0b7ed96d2784529a719f069ceb2;hb=4ecfc33f16aa36b315519e6f279da65374b67aba;hpb=39801e6e9fb9388072ee414a447f74095a6ac960 diff --git a/ccdbg-io.c b/ccdbg-io.c index 9586faa3..b78e3aad 100644 --- a/ccdbg-io.c +++ b/ccdbg-io.c @@ -17,17 +17,15 @@ */ #include "ccdbg.h" - -void -ccdbg_quarter_clock(struct ccdbg *dbg) -{ - usleep(CC_CLOCK_US / 4); -} +#include void ccdbg_half_clock(struct ccdbg *dbg) { - usleep(CC_CLOCK_US / 2); + struct timespec req, rem; + req.tv_sec = (CC_CLOCK_US / 2) / 1000000; + req.tv_nsec = ((CC_CLOCK_US / 2) % 1000000) * 1000; + nanosleep(&req, &rem); } struct ccdbg * @@ -40,6 +38,8 @@ ccdbg_open(char *file) perror("calloc"); return NULL; } + dbg->clock = 1; +#ifdef USE_KERNEL dbg->fd = open(file, 2); if (dbg->fd < 0) { perror(file); @@ -48,6 +48,9 @@ ccdbg_open(char *file) } cccp_init(dbg); cccp_write(dbg, CC_CLOCK, CC_CLOCK); +#else + cp_usb_init(dbg); +#endif dbg->clock = 1; return dbg; } @@ -55,112 +58,154 @@ ccdbg_open(char *file) void ccdbg_close(struct ccdbg *dbg) { +#if USE_KERNEL cccp_fini(dbg); close (dbg->fd); +#else + cp_usb_fini(dbg); +#endif free (dbg); } -void -ccdbg_clock_1_0(struct ccdbg *dbg) +int +ccdbg_write(struct ccdbg *dbg, uint8_t mask, uint8_t value) { - ccdbg_quarter_clock(dbg); - assert(dbg->clock == 1); - cccp_write(dbg, CC_CLOCK, 0); - dbg->clock = 0; - ccdbg_quarter_clock(dbg); +#if USE_KERNEL + return cccp_write(dbg, mask, value); +#else + cp_usb_write(dbg, mask, value); + return 0; +#endif } -void -ccdbg_clock_0_1(struct ccdbg *dbg) +uint8_t +ccdbg_read(struct ccdbg *dbg) { - ccdbg_quarter_clock(dbg); - assert(dbg->clock == 0); - cccp_write(dbg, CC_CLOCK, CC_CLOCK); - dbg->clock = 1; - ccdbg_quarter_clock(dbg); +#if USE_KERNEL + return cccp_read_all(dbg); +#else + return cp_usb_read(dbg); +#endif } -/* - * By convention, every macro function is entered with dbg->clock == 1 - */ - +static char +is_bit(uint8_t get, uint8_t mask, char on, uint8_t bit) +{ + if (mask&bit) { + if (get&bit) + return on; + else + return '.'; + } else + return '-'; +} void -ccdbg_write_bit(struct ccdbg *dbg, uint8_t bit) +ccdbg_print(char *format, uint8_t mask, uint8_t set) { - uint8_t data; + ccdbg_debug (CC_DEBUG_BITBANG, format, + is_bit(set, mask, 'C', CC_CLOCK), + is_bit(set, mask, 'D', CC_DATA), + is_bit(set, mask, 'R', CC_RESET_N)); +} - assert(dbg->clock == 1); - data = CC_CLOCK; - if (bit) - data |= CC_DATA; - ccdbg_half_clock(dbg); - cccp_write(dbg, CC_DATA|CC_CLOCK, data); +void +ccdbg_send(struct ccdbg *dbg, uint8_t mask, uint8_t set) +{ + ccdbg_write(dbg, mask, set); + ccdbg_print("%c %c %c\n", mask, set); ccdbg_half_clock(dbg); - cccp_write(dbg, CC_CLOCK, 0); -// printf ("%d", bit); } void -ccdbg_write_byte(struct ccdbg *dbg, uint8_t byte) +ccdbg_send_bit(struct ccdbg *dbg, uint8_t bit) { - int bit; + if (bit) bit = CC_DATA; + ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|bit|CC_RESET_N); + ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, bit|CC_RESET_N); +} + +void +ccdbg_send_byte(struct ccdbg *dbg, uint8_t byte) +{ + int bit; + ccdbg_debug(CC_DEBUG_BITBANG, "#\n# Send Byte 0x%02x\n#\n", byte); + for (bit = 7; bit >= 0; bit--) { + ccdbg_send_bit(dbg, (byte >> bit) & 1); + if (bit == 3) + ccdbg_debug(CC_DEBUG_BITBANG, "\n"); + } +} - for (bit = 7; bit >= 0; bit--) - ccdbg_write_bit(dbg, (byte >> bit) & 1); +void +ccdbg_send_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes) +{ + while (nbytes--) + ccdbg_send_byte(dbg, *bytes++); } uint8_t -ccdbg_read_bit(struct ccdbg *dbg) +ccdbg_recv_bit(struct ccdbg *dbg, int first) { - uint8_t data; + uint8_t mask = first ? CC_DATA : 0; + uint8_t read; - ccdbg_half_clock(dbg); - cccp_write(dbg, CC_CLOCK, CC_CLOCK); - ccdbg_half_clock(dbg); - cccp_write(dbg, CC_CLOCK, 0); - data = cccp_read(dbg, CC_DATA); - return data ? 1 : 0; + ccdbg_send(dbg, CC_CLOCK|mask|CC_RESET_N, CC_CLOCK|CC_DATA|CC_RESET_N); + read = ccdbg_read(dbg); + ccdbg_send(dbg, CC_CLOCK| CC_RESET_N, CC_RESET_N); + return (read & CC_DATA) ? 1 : 0; } uint8_t -ccdbg_read_byte(struct ccdbg *dbg) +ccdbg_recv_byte(struct ccdbg *dbg, int first) { + uint8_t byte = 0; int bit; - uint8_t byte = 0; - for (bit = 7; bit >= 0; bit--) - byte |= ccdbg_read_bit(dbg) << bit; + ccdbg_debug(CC_DEBUG_BITBANG, "#\n# Recv byte\n#\n"); + for (bit = 0; bit < 8; bit++) { + byte = byte << 1; + byte |= ccdbg_recv_bit(dbg, first); + if (bit == 3) + ccdbg_debug(CC_DEBUG_BITBANG, "\n"); + first = 0; + } + ccdbg_debug(CC_DEBUG_BITBANG, "#\n# Recv 0x%02x\n#\n", byte); return byte; } +void +ccdbg_recv_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes) +{ + int first = 1; + while (nbytes--) { + *bytes++ = ccdbg_recv_byte(dbg, first); + first = 0; + } +} + void ccdbg_cmd_write(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len) { int i; - ccdbg_write_byte(dbg, cmd); + ccdbg_send_byte(dbg, cmd); for (i = 0; i < len; i++) - ccdbg_write_byte(dbg, data[i]); + ccdbg_send_byte(dbg, data[i]); } uint8_t ccdbg_cmd_write_read8(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len) { - uint8_t ret; + uint8_t byte[1]; ccdbg_cmd_write(dbg, cmd, data, len); - ret = ccdbg_read_byte(dbg); - return ret; + ccdbg_recv_bytes(dbg, byte, 1); + return byte[0]; } uint16_t ccdbg_cmd_write_read16(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len) { - uint8_t byte1, byte0; - int i; + uint8_t byte[2]; ccdbg_cmd_write(dbg, cmd, data, len); - byte1 = ccdbg_read_byte(dbg); - byte0 = ccdbg_read_byte(dbg); - for (i = 0; i < 4; i++) - (void) ccdbg_read_byte(dbg); - return (byte1 << 8) | byte0; + ccdbg_recv_bytes(dbg, byte, 2); + return (byte[0] << 8) | byte[1]; } -