X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ccdbg-io.c;h=c69fc0d816751172b190393a96de95bbc047f83d;hp=e72ffbf08ca9a6a6be91270a17b76227a7e6a67e;hb=5df84df7cd6a31527dcfd11030f00ef9d8abf170;hpb=01cb2799875e086ee6096627c058ee235bbc33d5 diff --git a/ccdbg-io.c b/ccdbg-io.c index e72ffbf0..c69fc0d8 100644 --- a/ccdbg-io.c +++ b/ccdbg-io.c @@ -24,6 +24,12 @@ ccdbg_quarter_clock(struct ccdbg *dbg) usleep(CC_CLOCK_US / 4); } +void +ccdbg_half_clock(struct ccdbg *dbg) +{ + usleep(CC_CLOCK_US / 2); +} + struct ccdbg * ccdbg_open(char *file) { @@ -34,6 +40,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); @@ -41,103 +49,165 @@ ccdbg_open(char *file) return NULL; } cccp_init(dbg); + cccp_write(dbg, CC_CLOCK, CC_CLOCK); +#else + cp_usb_init(dbg); +#endif + dbg->clock = 1; return dbg; } 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 } +uint8_t +ccdbg_read(struct ccdbg *dbg) +{ +#if USE_KERNEL + return cccp_read_all(dbg); +#else + return cp_usb_read(dbg); +#endif +} + +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_clock_0_1(struct ccdbg *dbg) +ccdbg_print(char *format, uint8_t mask, uint8_t set) { - ccdbg_quarter_clock(dbg); - assert(dbg->clock == 0); - cccp_write(dbg, CC_CLOCK, CC_CLOCK); - dbg->clock = 1; - ccdbg_quarter_clock(dbg); + 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)); } -/* - * By convention, every macro function is entered with dbg->clock == 1 - */ +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); +} void -ccdbg_write_bit(struct ccdbg *dbg, uint8_t bit) +ccdbg_send_bit(struct ccdbg *dbg, uint8_t bit) { - ccdbg_clock_1_0(dbg); - cccp_write(dbg, CC_DATA, bit ? CC_DATA : 0); - ccdbg_clock_0_1(dbg); + 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_write_byte(struct ccdbg *dbg, uint8_t byte) +ccdbg_send_byte(struct ccdbg *dbg, uint8_t byte) { - int bit; + 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_clock_1_0(dbg); - data = cccp_read(dbg, CC_DATA); - ccdbg_clock_0_1(dbg); - 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 byte[1]; ccdbg_cmd_write(dbg, cmd, data, len); - return ccdbg_read_byte(dbg); + 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; + uint8_t byte[2]; ccdbg_cmd_write(dbg, cmd, data, len); - byte1 = ccdbg_read_byte(dbg); - byte0 = ccdbg_read_byte(dbg); - return (byte1 << 8) | byte0; + ccdbg_recv_bytes(dbg, byte, 2); + return (byte[0] << 8) | byte[1]; } -