OpenOCD Snowball

= Introduction = OpenOCD mainline includes preliminary support for Cortex-A9 and Snowball. See the Compiling_OpenOCD for instructions to checkout and build from source, or visit OpenOCD homepage. For using this solution, you need at least: - a usb jtag dongle, - an openocd excutable running on a host machine, - a gdb cross compile for arm platform.

Eclipse can be used as a GDB front end.

= JTAG Hardware HowTos = Following list provides some usb dongle that have tested with snowball :
 * Amontec JTAGKey2
 * Olimex ARM-USB-OCD
 * TinCanTools Flyswatter2

The openocd application is available in source code. Follow the following step, for building the application.

= Known Issues =

While power saving is enabled, the openocd polling is failing because dap is not powered?
Apply following patch to openocd and rebuild. From c3ab72ab20273a54e9f47fce05cedf159847a33d Mon Sep 17 00:00:00 2001 From: Michel Jaouen  Date: Tue, 26 Jul 2011 11:16:29 +0200 Subject: [PATCH] remove warning when board in sleep --- src/target/adi_v5_jtag.c |    8 ++++ src/target/cortex_a.c   |    2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/target/adi_v5_jtag.c b/src/target/adi_v5_jtag.c index 75461c3..eb9627d 100644 --- a/src/target/adi_v5_jtag.c +++ b/src/target/adi_v5_jtag.c @@ -296,9 +296,9 @@ static int jtagdp_transaction_endcheck(struct adiv5_dap *dap) dap->ap_csw_value, dap->ap_tar_value); -			if (ctrlstat & SSTICKYORUN) -				LOG_ERROR("JTAG-DP OVERRUN - check clock, " -					"memaccess, or reduce jtag speed"); +			//if (ctrlstat & SSTICKYORUN) +			//	LOG_ERROR("JTAG-DP OVERRUN - check clock, " +			//		"memaccess, or reduce jtag speed"); 			if (ctrlstat & SSTICKYERR)  				LOG_ERROR("JTAG-DP STICKY ERROR"); @@ -331,7 +331,7 @@ static int jtagdp_transaction_endcheck(struct adiv5_dap *dap)  			if ((retval = dap_run(dap)) != ERROR_OK)  				return retval; -			LOG_ERROR("MEM_AP_CSW 0x%" PRIx32 ", MEM_AP_TAR 0x%" +			LOG_DEBUG("MEM_AP_CSW 0x%" PRIx32 ", MEM_AP_TAR 0x%" 					PRIx32, mem_ap_csw, mem_ap_tar); } diff --git a/src/target/cortex_a.c b/src/target/cortex_a.c index 2370d95..1223087 100755 --- a/src/target/cortex_a.c +++ b/src/target/cortex_a.c @@ -844,7 +844,7 @@ static int cortex_a8_poll(struct target *target) armv7a->debug_base + CPUDBG_DSCR, &dscr); 	if (retval != ERROR_OK)  	{ -		return retval; +		return ERROR_OK;  	}  	cortex_a8->cpudbg_dscr = dscr; --  1.7.4.1

SMP Support
Apply the following patch for smp support. From 3c35988a8dd4e6c1a18b7156bc1367258e9e2fb9 Mon Sep 17 00:00:00 2001 From: Michel Jaouen  Date: Fri, 30 Sep 2011 14:45:21 +0200 Subject: [PATCH] OpenOCD : add smp remote protocol message --- gdb/remote.c |   71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 70 insertions(+), 1 deletions(-) diff --git a/gdb/remote.c b/gdb/remote.c index 243bdd7..7ce402e 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -10552,6 +10552,72 @@ remote_upload_trace_state_variables (struct uploaded_tsv **utsvp) }   return 0; } +#define OPENOCD_SMP +#ifdef OPENOCD_SMP +static int dummy = 0; +static int get_core(void) +{ +	struct remote_state *rs = get_remote_state ; +	int core = -1; +	if (!remote_desc) +   error (_("command can only be used with remote target")); +	if (remote_desc) +	{ +		//puts_filtered("sending jc\n"); +		putpkt("jc"); +		//puts_filtered("Jc sent\n"); +		getpkt(&rs->buf, &rs->buf_size, 0); +		//		print_packet (rs->buf); +		hex2bin(rs->buf,(gdb_byte *)&core,4); +	} +	else return dummy; +	return core; +} + +static int set_core(int core) +{ +	char tmp[16]; +	struct remote_state *rs = get_remote_state ; +	dummy = core; +	if (!remote_desc) +   error (_("command can only be used with remote target")); +	else	{ +		sprintf(tmp,"Jc%x",core); +		//puts_filtered(tmp); +		putpkt(tmp); +		getpkt (&rs->buf, &rs->buf_size, 0); +	} +	return 0; +} + +static void smp_value_read (struct value *v) +{ +	int core = get_core; +	memcpy (value_contents_all_raw (v), +			&core, +			4); +} + +static void smp_value_write (struct value *v, struct value * from) +{ +	int core; +	memcpy (&core,value_contents_all_raw (from), 4); +	set_core(core); +} + +static struct lval_funcs smp_value_funcs = { smp_value_read, smp_value_write }; + + + +static struct value *smp_make_value (struct gdbarch *gdbarch, +		struct internalvar *var) +{ +	struct type *type = arch_integer_type (gdbarch, 32, 1, "DWORD32"); +   return allocate_computed_value (type, &smp_value_funcs, NULL); +} +#endif + + void _initialize_remote (void) @@ -10559,7 +10625,10 @@ _initialize_remote (void) struct remote_state *rs; struct cmd_list_element *cmd; char *cmd_name; - + /* smp specific  */ +#ifdef OPENOCD_SMP + create_internalvar_type_lazy ("_core", smp_make_value); +#endif /* architecture specific data */ remote_gdbarch_data_handle = gdbarch_data_register_post_init (init_remote_state); -- 1.7.4.1