Wait for a while when switching the RESET_N line
[fw/altos] / lib / ccdbg.h
index b74d13ca3495bde9e8c67b6a7a2f41489d949c5b..8bc9444a2e00269230624c9674b54354488dea8d 100644 (file)
 #include <sys/types.h>
 #include <sys/ioctl.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/ioctl.h>
 #include <sys/stat.h>
-#undef USE_KERNEL
-#ifdef USE_KERNEL
-#include <cp2101.h>
-#define CC_CLOCK       CP2101_GPIO_MASK(0)
-#define CC_DATA                CP2101_GPIO_MASK(1)
-#define CC_RESET_N     CP2101_GPIO_MASK(2)
-#else
+#include "ccdbg-debug.h"
+
 #define CC_CLOCK       0x1
 #define CC_DATA                0x2
 #define CC_RESET_N     0x4
 #define CC_CLOCK       0x1
 #define CC_DATA                0x2
 #define CC_RESET_N     0x4
-#include <usb.h>
-#endif
-
+#define CC_CLOCK_US    (0)
 
 
-/* painfully slow for now */
-#define CC_CLOCK_US    (50)
+/* 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))
 #define DJNZ_Rn_rel(n)         (0xd8 | (n))
 #define MOV_A_direct           0xe5
 #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_direct_A           0xf5
 #define MOV_DPTR_data16                0x90
-#define MOV_A_data     0x74
-#define MOVX_atDPTR_A  0xf0
-#define MOVX_A_atDPTR  0xe0
-#define INC_DPTR       0xa3
-#define TRAP           0xa5
-
-#define SJMP           0x80
-
-#define FWT            0xAB
-#define FADDRL         0xAC
-#define FADDRH         0xAD
-#define FCTL           0xAE
-# define FCTL_BUSY     0x80
-# define FCTL_BUSY_BIT 7
-# define FCTL_SWBSY    0x40
-# define FCTL_SWBSY_BIT        6
-# define FCTL_CONTRD   0x10
-# define FCTL_WRITE    0x02
-# define FCTL_ERASE    0x01
-#define FWDATA         0xAF
-
-#define CLKCON         0xC6
-#define  CLKCON_OSC32K 0x80
-#define  CLKCON_OSC    0x40
-#define  CLKCON_TICKSPD        0x38
-#define  CLKCON_CLKSPD 0x07
-
-#define P0             0x80
-#define P1             0x90
-#define P2             0xA0
-#define P0DIR          0xFD
-#define P1DIR          0xFE
-#define P2DIR          0xFF
-
-#define SLEEP          0xBE
-
-#define JB             0x20
-
-#define ACC(bit)       (0xE0 | (bit))
+#define MOV_A_data             0x74
+#define MOVX_atDPTR_A          0xf0
+#define MOVX_A_atDPTR          0xe0
+#define INC_DPTR               0xa3
+#define TRAP                   0xa5
+#define SJMP                   0x80
+#define JB                     0x20
+
+/* 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
+#define FADDRH                 0xAD
+#define FCTL                   0xAE
+# define FCTL_BUSY             0x80
+# define FCTL_BUSY_BIT         7
+# define FCTL_SWBSY            0x40
+# define FCTL_SWBSY_BIT                6
+# define FCTL_CONTRD           0x10
+# define FCTL_WRITE            0x02
+# define FCTL_ERASE            0x01
+#define FWDATA                 0xAF
+
+#define SLEEP                  0xBE
+
+/* clock controller */
+#define CLKCON                 0xC6
+#define  CLKCON_OSC32K         0x80
+#define  CLKCON_OSC            0x40
+#define  CLKCON_TICKSPD                0x38
+#define  CLKCON_CLKSPD         0x07
+
+/* I/O pins */
+#define P0                     0x80
+#define P1                     0x90
+#define P2                     0xA0
+#define P0DIR                  0xFD
+#define P1DIR                  0xFE
+#define P2DIR                  0xFF
+
+/* Bit-addressable accumulator */
+#define ACC(bit)               (0xE0 | (bit))
+
+/* Bit-addressable status word */
+#define PSW(bit)               (0xD0 | (bit))
+
+#define CP_USB_ASYNC
 
 struct ccdbg {
 
 struct ccdbg {
-       usb_dev_handle  *usb_dev;
-       uint8_t gpio;
-#ifdef USE_KERNEL
-       int     fd;
+#ifdef CP_USB_ASYNC
+       struct cp_usb_async *cp_async;
+#else
+       struct cp_usb *cp;
 #endif
 #endif
-       uint8_t debug_data;
-       int     clock;
+       struct hex_image *rom;
 };
 
 };
 
+/* Intel hex file format data
+ */
 struct hex_record {
        uint8_t length;
        uint16_t address;
 struct hex_record {
        uint8_t length;
        uint16_t address;
@@ -123,12 +141,24 @@ struct hex_image {
        uint8_t         data[0];
 };
 
        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 HEX_RECORD_NORMAL              0x00
 #define HEX_RECORD_EOF                 0x01
 #define HEX_RECORD_EXTENDED_ADDRESS    0x02
 
-#include "cccp.h"
-
+/* CC1111 debug port commands
+ */
 #define CC_CHIP_ERASE          0x14
 
 #define CC_WR_CONFIG           0x1d
 #define CC_CHIP_ERASE          0x14
 
 #define CC_WR_CONFIG           0x1d
@@ -161,10 +191,6 @@ struct hex_image {
 #define CC_STEP_REPLACE(n)     (0x64|(n))
 #define CC_GET_CHIP_ID         0x68
 
 #define CC_STEP_REPLACE(n)     (0x64|(n))
 #define CC_GET_CHIP_ID         0x68
 
-#define CC_DEBUG_BITBANG       0x00000001
-#define CC_DEBUG_COMMAND       0x00000002
-#define CC_DEBUG_INSTRUCTIONS  0x00000004
-
 /* ccdbg-command.c */
 void
 ccdbg_debug_mode(struct ccdbg *dbg);
 /* ccdbg-command.c */
 void
 ccdbg_debug_mode(struct ccdbg *dbg);
@@ -217,16 +243,6 @@ ccdbg_set_pc(struct ccdbg *dbg, uint16_t pc);
 uint8_t
 ccdbg_execute_hex_image(struct ccdbg *dbg, struct hex_image *image);
 
 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-flash.c */
 uint8_t
 ccdbg_flash_hex_image(struct ccdbg *dbg, struct hex_image *image);
@@ -248,14 +264,20 @@ int
 ccdbg_hex_image_equal(struct hex_image *a, struct hex_image *b);
 
 /* ccdbg-io.c */
 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_half_clock(struct ccdbg *dbg);
 
+void
+ccdbg_wait_reset(struct ccdbg *dbg);
+
 int
 ccdbg_write(struct ccdbg *dbg, uint8_t mask, uint8_t value);
 
 int
 ccdbg_write(struct ccdbg *dbg, uint8_t mask, uint8_t value);
 
-uint8_t
-ccdbg_read(struct ccdbg *dbg);
+void
+ccdbg_read(struct ccdbg *dbg, uint8_t *valuep);
 
 struct ccdbg *
 ccdbg_open(void);
 
 struct ccdbg *
 ccdbg_open(void);
@@ -302,15 +324,18 @@ ccdbg_send_byte(struct ccdbg *dbg, uint8_t byte);
 void
 ccdbg_send_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes);
 
 void
 ccdbg_send_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes);
 
-uint8_t
-ccdbg_recv_bit(struct ccdbg *dbg, int first);
+void
+ccdbg_recv_bit(struct ccdbg *dbg, int first, uint8_t *bit);
 
 
-uint8_t
-ccdbg_recv_byte(struct ccdbg *dbg, int first);
+void
+ccdbg_recv_byte(struct ccdbg *dbg, int first, uint8_t *byte);
 
 void
 ccdbg_recv_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes);
 
 
 void
 ccdbg_recv_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes);
 
+void
+ccdbg_sync_io(struct ccdbg *dbg);
+
 void
 ccdbg_print(char *format, uint8_t mask, uint8_t set);
 
 void
 ccdbg_print(char *format, uint8_t mask, uint8_t set);
 
@@ -335,17 +360,36 @@ ccdbg_write_hex_image(struct ccdbg *dbg, struct hex_image *image, uint16_t offse
 struct hex_image *
 ccdbg_read_hex_image(struct ccdbg *dbg, uint16_t address, uint16_t length);
 
 struct hex_image *
 ccdbg_read_hex_image(struct ccdbg *dbg, uint16_t address, uint16_t length);
 
-/* cp-usb.c */
-void
-cp_usb_init(struct ccdbg *dbg);
+uint8_t
+ccdbg_read_sfr(struct ccdbg *dbg, uint8_t addr, uint8_t *bytes, int nbytes);
 
 
-void
-cp_usb_fini(struct ccdbg *dbg);
+uint8_t
+ccdbg_write_sfr(struct ccdbg *dbg, uint8_t addr, uint8_t *bytes, int nbytes);
 
 
-void
-cp_usb_write(struct ccdbg *dbg, uint8_t mask, uint8_t value);
+/* 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
 uint8_t
-cp_usb_read(struct ccdbg *dbg);
+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_ */
 
 #endif /* _CCDBG_H_ */