#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
-#include "cp-usb.h"
-#define CC_CLOCK 0x1
-#define CC_DATA 0x2
-#define CC_RESET_N 0x4
-#define CC_CLOCK_US (40)
+#include "ccdbg-debug.h"
+#include "cc-bitbang.h"
+#include "cc-usb.h"
/* 8051 instructions
*/
+#define NOP 0x00
#define MOV_direct_data 0x75
#define LJMP 0x02
#define MOV_Rn_data(n) (0x78 | (n))
#define DJNZ_Rn_rel(n) (0xd8 | (n))
#define MOV_A_direct 0xe5
+#define MOV_direct1_direct2 0x85
#define MOV_direct_A 0xf5
#define MOV_DPTR_data16 0x90
#define MOV_A_data 0x74
/* 8051 special function registers
*/
+#define SFR_P0 0x80
+#define SFR_SP 0x81
+#define SFR_DPL0 0x82
+#define SFR_DPH0 0x83
+#define SFR_DPL1 0x84
+#define SFR_DPH1 0x85
+
/* flash controller */
#define FWT 0xAB
#define FADDRL 0xAC
/* Bit-addressable accumulator */
#define ACC(bit) (0xE0 | (bit))
+/* Bit-addressable status word */
+#define PSW(bit) (0xD0 | (bit))
+
struct ccdbg {
- struct cp_usb *cp;
+ struct cc_bitbang *bb;
+ struct cc_usb *usb;
+ 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
#define CC_STEP_REPLACE(n) (0x64|(n))
#define CC_GET_CHIP_ID 0x68
-/* Debug levels
- */
-#define CC_DEBUG_BITBANG 0x00000001
-#define CC_DEBUG_COMMAND 0x00000002
-#define CC_DEBUG_INSTRUCTIONS 0x00000004
-#define CC_DEBUG_EXECUTE 0x00000008
-#define CC_DEBUG_FLASH 0x00000010
-
/* ccdbg-command.c */
void
ccdbg_debug_mode(struct ccdbg *dbg);
uint8_t
ccdbg_debug_instr(struct ccdbg *dbg, uint8_t *instr, int nbytes);
+void
+ccdbg_debug_instr_discard(struct ccdbg *dbg, uint8_t *instr, int nbytes);
+
+void
+ccdbg_debug_instr_queue(struct ccdbg *dbg, uint8_t *instr, int nbytes,
+ uint8_t *reply);
+
uint8_t
ccdbg_step_instr(struct ccdbg *dbg);
uint8_t
ccdbg_execute_hex_image(struct ccdbg *dbg, struct hex_image *image);
-/* ccdbg-debug.c */
-void
-ccdbg_debug(int level, char *format, ...);
-
-void
-ccdbg_add_debug(int level);
-
-void
-ccdbg_clear_debug(int level);
-
/* ccdbg-flash.c */
uint8_t
ccdbg_flash_hex_image(struct ccdbg *dbg, struct hex_image *image);
ccdbg_hex_image_equal(struct hex_image *a, struct hex_image *b);
/* ccdbg-io.c */
-void
-ccdbg_half_clock(struct ccdbg *dbg);
-
-int
-ccdbg_write(struct ccdbg *dbg, uint8_t mask, uint8_t value);
-
-uint8_t
-ccdbg_read(struct ccdbg *dbg);
-
struct ccdbg *
ccdbg_open(void);
void
ccdbg_close(struct ccdbg *dbg);
-void
-ccdbg_clock_1_0(struct ccdbg *dbg);
-
-void
-ccdbg_clock_0_1(struct ccdbg *dbg);
-
-void
-ccdbg_write_bit(struct ccdbg *dbg, uint8_t bit);
-
-void
-ccdbg_write_byte(struct ccdbg *dbg, uint8_t byte);
-
-uint8_t
-ccdbg_read_bit(struct ccdbg *dbg);
-
-uint8_t
-ccdbg_read_byte(struct ccdbg *dbg);
-
void
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);
-uint16_t
-ccdbg_cmd_write_read16(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len);
-
-void
-ccdbg_send(struct ccdbg *dbg, uint8_t mask, uint8_t set);
-
void
-ccdbg_send_bit(struct ccdbg *dbg, uint8_t bit);
+ccdbg_cmd_write_queue8(struct ccdbg *dbg, uint8_t cmd,
+ uint8_t *data, int len, uint8_t *reply);
-void
-ccdbg_send_byte(struct ccdbg *dbg, uint8_t byte);
+uint16_t
+ccdbg_cmd_write_read16(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len);
void
ccdbg_send_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes);
-uint8_t
-ccdbg_recv_bit(struct ccdbg *dbg, int first);
-
-uint8_t
-ccdbg_recv_byte(struct ccdbg *dbg, int first);
-
void
ccdbg_recv_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes);
void
-ccdbg_print(char *format, uint8_t mask, uint8_t set);
+ccdbg_sync(struct ccdbg *dbg);
/* ccdbg-manual.c */
struct hex_image *
ccdbg_read_hex_image(struct ccdbg *dbg, uint16_t address, uint16_t length);
+uint8_t
+ccdbg_read_sfr(struct ccdbg *dbg, uint8_t addr, uint8_t *bytes, int nbytes);
+
+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_ */