Zach Welch wrote:
On Thu, 2009-06-04 at 12:49 +0200, Magnus Lundin wrote:
Hi

The number of bits used for TAR autoincrement when using CSW_ADDRINC_PACKED must be at least 10 according to ARM ADI specifications. Cortex-M3 uses 12 bits (4k blocks) and OMAP35xx uses 10 bits (1k blocks).

This patch adds support for different TAR autotincrement sizes and sets it to 12 bits for Cortex-M3.

Please remove the #define TAR_AUTOINCR_BLOCK and put the following line
in a static function.  Use a temporary variable.

+               /* Adjust to read blocks within boundaries aligned to
the TAR autoincremnent size*/
+               blocksize = (TAR_AUTOINCR_BLOCK -
((TAR_AUTOINCR_BLOCK-1) & address)) >> 2;

Thanks.

Z
New version

Regards
Magnus
Index: src/target/arm_adi_v5.c
===================================================================
--- src/target/arm_adi_v5.c	(revision 2032)
+++ src/target/arm_adi_v5.c	(working copy)
@@ -52,6 +52,18 @@
  * are immediatley available.
 */
 
+
+/* ARM ADI Specification requires at least 10 bits used for TAR autoincrement  */
+
+/*
+	u32 tar_block_size(u32 address)
+	Return the largest block starting at address that does not cross a tar block size alignment boundary
+*/
+static u32 max_tar_block_size(u32 tar_autoincr_block, u32 address)
+{
+	return  (tar_autoincr_block - ((tar_autoincr_block - 1) & address)) >> 2;
+}
+
 /***************************************************************************
  *                                                                         *
  * DPACC and APACC scanchain access through JTAG-DP                        *
@@ -467,8 +479,8 @@
 
 	while (wcount > 0)
 	{
-		/* Adjust to write blocks within 4K aligned boundaries */
-		blocksize = (0x1000 - (0xFFF & address)) >> 2;
+		/* Adjust to write blocks within boundaries aligned to the TAR autoincremnent size*/
+		blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address);
 		if (wcount < blocksize)
 			blocksize = wcount;
 
@@ -517,8 +529,8 @@
 	{
 		int nbytes;
 
-		/* Adjust to read within 4K block boundaries */
-		blocksize = (0x1000 - (0xFFF & address)) >> 1;
+		/* Adjust to write blocks within boundaries aligned to the TAR autoincremnent size*/
+		blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address);
 
 		if (wcount < blocksize)
 			blocksize = wcount;
@@ -613,8 +625,8 @@
 	{
 		int nbytes;
 
-		/* Adjust to read within 4K block boundaries */
-		blocksize = (0x1000 - (0xFFF & address));
+		/* Adjust to write blocks within boundaries aligned to the TAR autoincremnent size*/
+		blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address);
 
 		if (wcount < blocksize)
 			blocksize = wcount;
@@ -710,8 +722,8 @@
 
 	while (wcount > 0)
 	{
-		/* Adjust to read within 4K block boundaries */
-		blocksize = (0x1000 - (0xFFF & address)) >> 2;
+		/* Adjust to read blocks within boundaries aligned to the TAR autoincremnent size*/
+		blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address);
 		if (wcount < blocksize)
 			blocksize = wcount;
 
@@ -784,8 +796,8 @@
 	{
 		int nbytes;
 
-		/* Adjust to read within 4K block boundaries */
-		blocksize = (0x1000 - (0xFFF & address)) >> 1;
+		/* Adjust to read blocks within boundaries aligned to the TAR autoincremnent size*/
+		blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address);
 		if (wcount < blocksize)
 			blocksize = wcount;
 
@@ -879,8 +891,8 @@
 	{
 		int nbytes;
 
-		/* Adjust to read within 4K block boundaries */
-		blocksize = (0x1000 - (0xFFF & address));
+		/* Adjust to read blocks within boundaries aligned to the TAR autoincremnent size*/
+		blocksize = max_tar_block_size(swjdp->tar_autoincr_block, address);
 
 		if (wcount < blocksize)
 			blocksize = wcount;
Index: src/target/arm_adi_v5.h
===================================================================
--- src/target/arm_adi_v5.h	(revision 2032)
+++ src/target/arm_adi_v5.h	(working copy)
@@ -99,8 +99,17 @@
 	u8  ack;
 	/* extra tck clocks for memory bus access */
 	u32	memaccess_tck;
+	/* Size of TAR autoincrement block, ARM ADI Specification requires at least 10 bits */
+	u32 tar_autoincr_block;
+
 } swjdp_common_t;
 
+/* Accessor function for currently selected DAP-AP number */ 
+static inline u8 dap_ap_get_select(swjdp_common_t *swjdp)
+{
+	return (u8)( swjdp ->apsel >> 24);
+}
+
 /* Internal functions used in the module, partial transactions, use with caution */
 extern int dap_dp_write_reg(swjdp_common_t *swjdp, u32 value, u8 reg_addr);
 /* extern int swjdp_write_apacc(swjdp_common_t *swjdp, u32 value, u8 reg_addr); */
Index: src/target/cortex_m3.c
===================================================================
--- src/target/cortex_m3.c	(revision 2032)
+++ src/target/cortex_m3.c	(working copy)
@@ -1579,6 +1579,7 @@
 	armv7m->swjdp_info.ap_tar_value = -1;
 	armv7m->swjdp_info.jtag_info = &cortex_m3->jtag_info;
 	armv7m->swjdp_info.memaccess_tck = 8;
+	armv7m->swjdp_info.tar_autoincr_block = (1<<12);  /* Cortex-M3 has 4096 bytes autoincrement range */ 
 
 	/* initialize arch-specific breakpoint handling */
 
@@ -1599,6 +1600,10 @@
 	armv7m->store_core_reg_u32 = cortex_m3_store_core_reg_u32;
 
 	target_register_timer_callback(cortex_m3_handle_target_request, 1, 1, target);
+	if((retval = arm_jtag_setup_connection(&cortex_m3->jtag_info)) != ERROR_OK)
+	{
+		return retval;
+	}
 
 	if ((retval = arm_jtag_setup_connection(&cortex_m3->jtag_info)) != ERROR_OK)
 	{
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to