#include <sys/stat.h>
#include "ccdbg-debug.h"
-#define CC_CLOCK 0x1
+#define CC_CLOCK 0x4
#define CC_DATA 0x2
-#define CC_RESET_N 0x4
-#define CC_CLOCK_US (0)
+#define CC_RESET_N 0x1
+#define CC_CLOCK_US (1000)
+
+/* Telemetrum has a 10k pull-up to 3.3v, a 0.001uF cap to ground
+ * and a 2.7k resistor to the reset line. This takes about 6us
+ * to settle, so we'll wait longer than that after changing the reset line
+ */
+#define CC_RESET_US (12)
/* 8051 instructions
*/
+#define NOP 0x00
#define MOV_direct_data 0x75
#define LJMP 0x02
#define MOV_Rn_data(n) (0x78 | (n))
/* Bit-addressable accumulator */
#define ACC(bit) (0xE0 | (bit))
+/* Bit-addressable status word */
+#define PSW(bit) (0xD0 | (bit))
+
#define CP_USB_ASYNC
struct ccdbg {
#else
struct cp_usb *cp;
#endif
+ struct hex_image *rom;
};
/* Intel hex file format data
uint8_t data[0];
};
+#define CC_STATE_ACC 0x1
+#define CC_STATE_PSW 0x2
+#define CC_STATE_DP 0x4
+
+#define CC_STATE_NSFR 5
+
+struct ccstate {
+ uint16_t mask;
+ uint8_t acc;
+ uint8_t sfr[CC_STATE_NSFR];
+};
+
#define HEX_RECORD_NORMAL 0x00
#define HEX_RECORD_EOF 0x01
#define HEX_RECORD_EXTENDED_ADDRESS 0x02
ccdbg_hex_image_equal(struct hex_image *a, struct hex_image *b);
/* ccdbg-io.c */
+void
+ccdbg_set_clock(uint32_t us);
+
void
ccdbg_half_clock(struct ccdbg *dbg);
+void
+ccdbg_wait_reset(struct ccdbg *dbg);
+
int
ccdbg_write(struct ccdbg *dbg, uint8_t mask, uint8_t value);
uint8_t
ccdbg_write_sfr(struct ccdbg *dbg, uint8_t addr, uint8_t *bytes, int nbytes);
+/* ccdbg-rom.c */
+uint8_t
+ccdbg_set_rom(struct ccdbg *dbg, struct hex_image *rom);
+
+uint8_t
+ccdbg_rom_contains(struct ccdbg *dbg, uint16_t addr, int nbytes);
+
+uint8_t
+ccdbg_rom_replace_xmem(struct ccdbg *dbg,
+ uint16_t addrp, uint8_t *bytesp, int nbytes);
+
+/* ccdbg-state.c */
+uint8_t
+ccdbg_state_save(struct ccdbg *dbg, struct ccstate *state, unsigned int mask);
+
+uint8_t
+ccdbg_state_restore(struct ccdbg *dbg, struct ccstate *state);
+
+void
+ccdbg_state_replace_xmem(struct ccdbg *dbg, struct ccstate *state,
+ uint16_t addr, uint8_t *bytes, int nbytes);
+
+void
+ccdbg_state_replace_sfr(struct ccdbg *dbg, struct ccstate *state,
+ uint8_t addr, uint8_t *bytes, int nbytes);
+
#endif /* _CCDBG_H_ */