diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/ccdbg-command.c | 6 | ||||
| -rw-r--r-- | lib/ccdbg-io.c | 12 | ||||
| -rw-r--r-- | lib/ccdbg.h | 9 | 
3 files changed, 25 insertions, 2 deletions
| diff --git a/lib/ccdbg-command.c b/lib/ccdbg-command.c index d99e8ff3..74313bdf 100644 --- a/lib/ccdbg-command.c +++ b/lib/ccdbg-command.c @@ -27,11 +27,12 @@ ccdbg_debug_mode(struct ccdbg *dbg)  	ccdbg_debug(CC_DEBUG_COMMAND, "#\n");  	ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA|CC_RESET_N);  	ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N,          CC_DATA           ); +	ccdbg_wait_reset(dbg);  	ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );  	ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N,          CC_DATA           );  	ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );  	ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N,          CC_DATA|CC_RESET_N); -	ccdbg_sync_io(dbg); +	ccdbg_wait_reset(dbg);  }  void @@ -42,11 +43,12 @@ ccdbg_reset(struct ccdbg *dbg)  	ccdbg_debug(CC_DEBUG_COMMAND, "#\n");  	ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA|CC_RESET_N);  	ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           ); +	ccdbg_wait_reset(dbg);  	ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );  	ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );  	ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );  	ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA|CC_RESET_N); -	ccdbg_sync_io(dbg); +	ccdbg_wait_reset(dbg);  }  uint8_t diff --git a/lib/ccdbg-io.c b/lib/ccdbg-io.c index e5e85e43..3606c57c 100644 --- a/lib/ccdbg-io.c +++ b/lib/ccdbg-io.c @@ -25,6 +25,7 @@  #endif  static uint32_t	cc_clock_us = CC_CLOCK_US; +static uint32_t	cc_reset_us = CC_RESET_US;  void  ccdbg_set_clock(uint32_t us) @@ -41,6 +42,17 @@ ccdbg_half_clock(struct ccdbg *dbg)  	nanosleep(&req, &rem);  } +void +ccdbg_wait_reset(struct ccdbg *dbg) +{ +	struct timespec	req, rem; +	 +	ccdbg_sync_io(dbg); +	req.tv_sec = (cc_reset_us) / 1000000; +	req.tv_nsec = ((cc_reset_us) % 1000000) * 1000; +	nanosleep(&req, &rem); +} +	  struct ccdbg *  ccdbg_open(void)  { diff --git a/lib/ccdbg.h b/lib/ccdbg.h index 037d8ff5..8bc9444a 100644 --- a/lib/ccdbg.h +++ b/lib/ccdbg.h @@ -37,6 +37,12 @@  #define CC_RESET_N	0x4  #define CC_CLOCK_US	(0) +/* 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 @@ -264,6 +270,9 @@ 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); | 
