X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=lib%2Fccdbg-io.c;h=9c6693cdbe0ad5a0698cdcfc8b214761b877b148;hp=6999dbecb1503684f77532259488a006660c8c84;hb=26095fc0511ee0d5213f038986032f7c59964cf0;hpb=f7d49868aeae80d515b12a7e339628f1296754a6 diff --git a/lib/ccdbg-io.c b/lib/ccdbg-io.c index 6999dbec..9c6693cd 100644 --- a/lib/ccdbg-io.c +++ b/lib/ccdbg-io.c @@ -18,30 +18,29 @@ #include "ccdbg.h" #include - -void -ccdbg_half_clock(struct ccdbg *dbg) -{ - struct timespec req, rem; - req.tv_sec = (CC_CLOCK_US / 2) / 1000000; - req.tv_nsec = ((CC_CLOCK_US / 2) % 1000000) * 1000; - nanosleep(&req, &rem); -} +#include "cc-usb.h" +#include "cc-bitbang.h" struct ccdbg * ccdbg_open(void) { struct ccdbg *dbg; + char *tty; dbg = calloc(sizeof (struct ccdbg), 1); if (!dbg) { perror("calloc"); return NULL; } - dbg->cp = cp_usb_open (); - if (!dbg->cp) { - free (dbg); - return NULL; + tty = getenv("CCDBG_TTY"); + if (!tty || tty[0] == '/') + dbg->usb = cc_usb_open(tty); + if (!dbg->usb) { + dbg->bb = cc_bitbang_open(); + if (!dbg->bb) { + free(dbg); + return NULL; + } } return dbg; } @@ -49,125 +48,63 @@ ccdbg_open(void) void ccdbg_close(struct ccdbg *dbg) { - cp_usb_close(dbg->cp); + if (dbg->usb) + cc_usb_close(dbg->usb); + if (dbg->bb) + cc_bitbang_close(dbg->bb); free (dbg); } -int -ccdbg_write(struct ccdbg *dbg, uint8_t mask, uint8_t value) -{ - cp_usb_write(dbg->cp, mask, value); - return 0; -} - -uint8_t -ccdbg_read(struct ccdbg *dbg) -{ - return cp_usb_read(dbg->cp); -} - -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_print(char *format, uint8_t mask, uint8_t set) -{ - 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)); -} - -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_send_bit(struct ccdbg *dbg, uint8_t bit) +ccdbg_debug_mode(struct ccdbg *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); + if (dbg->usb) + cc_usb_debug_mode(dbg->usb); + else if (dbg->bb) + cc_bitbang_debug_mode(dbg->bb); } void -ccdbg_send_byte(struct ccdbg *dbg, uint8_t byte) +ccdbg_reset(struct ccdbg *dbg) { - 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"); - } + if (dbg->usb) + cc_usb_reset(dbg->usb); + else if (dbg->bb) + cc_bitbang_reset(dbg->bb); } void ccdbg_send_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes) { - while (nbytes--) - ccdbg_send_byte(dbg, *bytes++); -} - -uint8_t -ccdbg_recv_bit(struct ccdbg *dbg, int first) -{ - uint8_t mask = first ? CC_DATA : 0; - uint8_t read; - - 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; + if (dbg->usb) + cc_usb_send_bytes(dbg->usb, bytes, nbytes); + else if (dbg->bb) + cc_bitbang_send_bytes(dbg->bb, bytes, nbytes); } -uint8_t -ccdbg_recv_byte(struct ccdbg *dbg, int first) +void +ccdbg_recv_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes) { - uint8_t byte = 0; - int 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; + if (dbg->usb) + cc_usb_recv_bytes(dbg->usb, bytes, nbytes); + else if (dbg->bb) + cc_bitbang_recv_bytes(dbg->bb, bytes, nbytes); } void -ccdbg_recv_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes) +ccdbg_sync(struct ccdbg *dbg) { - int first = 1; - while (nbytes--) { - *bytes++ = ccdbg_recv_byte(dbg, first); - first = 0; - } + if (dbg->usb) + cc_usb_sync(dbg->usb); + else if (dbg->bb) + cc_bitbang_sync(dbg->bb); } void ccdbg_cmd_write(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len) { - int i; - ccdbg_send_byte(dbg, cmd); - for (i = 0; i < len; i++) - ccdbg_send_byte(dbg, data[i]); + ccdbg_send_bytes(dbg, &cmd, 1); + ccdbg_send_bytes(dbg, data, len); } uint8_t @@ -176,6 +113,7 @@ 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); ccdbg_recv_bytes(dbg, byte, 1); + ccdbg_sync(dbg); return byte[0]; } @@ -185,5 +123,15 @@ ccdbg_cmd_write_read16(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len) uint8_t byte[2]; ccdbg_cmd_write(dbg, cmd, data, len); ccdbg_recv_bytes(dbg, byte, 2); + ccdbg_sync(dbg); return (byte[0] << 8) | byte[1]; } + +void +ccdbg_cmd_write_queue8(struct ccdbg *dbg, uint8_t cmd, + uint8_t *data, int len, + uint8_t *reply) +{ + ccdbg_cmd_write(dbg, cmd, data, len); + ccdbg_recv_bytes(dbg, reply, 1); +}