X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ccdbg-io.c;h=2cd42e274da882556cf291cb79ddce2faebdc3a4;hp=2019885d1b521963bb150d4ec89cd206a3907f2b;hb=3709ec3205cfb152b6568f3ea505c67fe7504c2a;hpb=0ffe4ef870b0e564789a1990aeab5b6651868e5b diff --git a/ccdbg-io.c b/ccdbg-io.c index 2019885d..2cd42e27 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,15 +49,53 @@ 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); +} + +int +ccdbg_write(struct ccdbg *dbg, uint8_t mask, uint8_t value) +{ +#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 +} + void ccdbg_clock_1_0(struct ccdbg *dbg) { ccdbg_quarter_clock(dbg); assert(dbg->clock == 1); - cccp_write(dbg, CC_CLOCK, 0); + ccdbg_write(dbg, CC_CLOCK, 0); dbg->clock = 0; ccdbg_quarter_clock(dbg); } @@ -59,7 +105,7 @@ ccdbg_clock_0_1(struct ccdbg *dbg) { ccdbg_quarter_clock(dbg); assert(dbg->clock == 0); - cccp_write(dbg, CC_CLOCK, CC_CLOCK); + ccdbg_write(dbg, CC_CLOCK, CC_CLOCK); dbg->clock = 1; ccdbg_quarter_clock(dbg); } @@ -71,9 +117,17 @@ ccdbg_clock_0_1(struct ccdbg *dbg) void ccdbg_write_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); + uint8_t data; + + assert(dbg->clock == 1); + data = CC_CLOCK; + if (bit) + data |= CC_DATA; + ccdbg_half_clock(dbg); + ccdbg_write(dbg, CC_DATA|CC_CLOCK, data); + ccdbg_half_clock(dbg); + ccdbg_write(dbg, CC_CLOCK, 0); +// printf ("%d", bit); } void @@ -90,10 +144,12 @@ ccdbg_read_bit(struct ccdbg *dbg) { uint8_t data; - ccdbg_clock_1_0(dbg); - data = cccp_read(dbg, CC_DATA); - ccdbg_clock_0_1(dbg); - return data ? 1 : 0; + ccdbg_half_clock(dbg); + ccdbg_write(dbg, CC_CLOCK, CC_CLOCK); + ccdbg_half_clock(dbg); + ccdbg_write(dbg, CC_CLOCK, 0); + data = ccdbg_read(dbg); + return (data & CC_DATA) ? 1 : 0; } uint8_t @@ -119,17 +175,22 @@ ccdbg_cmd_write(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len) uint8_t ccdbg_cmd_write_read8(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len) { + uint8_t ret; ccdbg_cmd_write(dbg, cmd, data, len); - return ccdbg_read_byte(dbg); + ret = ccdbg_read_byte(dbg); + return ret; } uint16_t ccdbg_cmd_write_read16(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len) { uint8_t byte1, byte0; + int i; 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; }