Random hacking
[fw/altos] / ccdbg-io.c
index e72ffbf08ca9a6a6be91270a17b76227a7e6a67e..9586faa38bfcf0b7ed96d2784529a719f069ceb2 100644 (file)
@@ -24,6 +24,12 @@ ccdbg_quarter_clock(struct ccdbg *dbg)
        usleep(CC_CLOCK_US / 4);
 }
 
        usleep(CC_CLOCK_US / 4);
 }
 
+void
+ccdbg_half_clock(struct ccdbg *dbg)
+{
+       usleep(CC_CLOCK_US / 2);
+}
+
 struct ccdbg *
 ccdbg_open(char *file)
 {
 struct ccdbg *
 ccdbg_open(char *file)
 {
@@ -41,6 +47,8 @@ ccdbg_open(char *file)
                return NULL;
        }
        cccp_init(dbg);
                return NULL;
        }
        cccp_init(dbg);
+       cccp_write(dbg, CC_CLOCK, CC_CLOCK);
+       dbg->clock = 1;
        return dbg;
 }
 
        return dbg;
 }
 
@@ -79,9 +87,17 @@ ccdbg_clock_0_1(struct ccdbg *dbg)
 void
 ccdbg_write_bit(struct ccdbg *dbg, uint8_t bit)
 {
 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);
+       cccp_write(dbg, CC_DATA|CC_CLOCK, data);
+       ccdbg_half_clock(dbg);
+       cccp_write(dbg, CC_CLOCK, 0);
+//     printf ("%d", bit);
 }
 
 void
 }
 
 void
@@ -98,9 +114,11 @@ ccdbg_read_bit(struct ccdbg *dbg)
 {
        uint8_t data;
 
 {
        uint8_t data;
 
-       ccdbg_clock_1_0(dbg);
+       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);
        data = cccp_read(dbg, CC_DATA);
-       ccdbg_clock_0_1(dbg);
        return data ? 1 : 0;
 }
 
        return data ? 1 : 0;
 }
 
@@ -127,17 +145,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
 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);
        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;
 }
 
 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);
        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;
 }
 
        return (byte1 << 8) | byte0;
 }