Hi,

sorry for my long time of inactivity doe to other jobs. A while ago I
send a patch making arm_adi_v5.c independent from transport layer. I
created a third solution:
To preserve the performance I changed the interface to the transport
layer. Both, dap_queue_ap_write and dap_queue_ap_read gets a pointer to
a data array not a single value. The adi_v5_jtag now implements the loop
reading the registers via jtag transport layer. So other transports like
SWD can implement it's own efficient method reading a register multiple
times.

I don't know if the patch works, but it should be easy to adapt.

Best regards,

Svenwhile

Am 13.03.2012 05:30, schrieb simonqian.openocd:
> Hi,
> Attachment is the patch for the latest OpenOCD.
> Versaloon forum has been moved to
> http://groups.yahoo.com/group/versaloon/.
> Actually, there are many patches to implement SWD.
> I just want to find a start point, and original JTAG code is least
> affected.
> So I want first make OpenOCD transport independent, so that JTAG is
> also usable(and testable) and meanwhile SWD code can be commited.
> ------------------------------------------------------------------------
> simonqian.openocd
> *From:* Peter Stuge <mailto:pe...@stuge.se>
> *Date:* 2012-03-13 11:53
> *To:* openocd-devel <mailto:openocd-devel@lists.sourceforge.net>
> *Subject:* Re: [OpenOCD-devel] make arm_adi_v5.c transport independent
> Hi Simon,
> simonqian.openocd wrote:
> > I have recently read libswd code
> Thank you very much for looking into this!
> > and want to somewhat push the SWD progress.
> > First modification should be to arm_adi_v5.c and/or adi_v5_jtag/swd.c,
> > so that arm_adi_v5.c could be transport independent.
> >
> > I found both libswd and my SWD patch modify 2 main functions in
> > arm_adi_v5.c, which are ahbap_debugport_init and mem_ap_read_buf_u32.
> Where can your most recent SWD patch be found?
> http://www.versaloon.com/doc/versaloon/doc_versaloon_openocd_urjtag.html
> has a patch from 2010-11-04, and unfortunately the versaloon.com
> Forum seems to be unavailable since some time.
> > ahbap_debugport_init should obviously be modified to initialize SWD
> > if SWD transport is sellected.
> > And mem_ap_read_buf_u32 should not call adi_jtag_dp_scan, or
> > implement mem_ap_read_buf_u32_jtag and mem_ap_read_buf_u32_swd.
> >
> > 2 solutions:
> > 1. In my SWD patch, I add queue_dp_scan to dap->op, and implement
> > dap_queue_dp_scan to call dap->op->queue_dp_scan instead of JTAG ones.
> > And queue_dp_scan is implemented in both jtag_dp_ops and swd_dp_ops.
> > 2. In libswd code, 2 functions are implemented for mem_ap_read_buf_u32,
> > which are mem_ap_read_buf_u32_jtag and mem_ap_read_buf_u32_swd.
> > And they are called in mem_ap_read_buf_u32 according to the transport
> > sellected.
> >
> > So the result is simple, choose one of the 2 methods above.
> I can't make a useful comment at this point, but I would like to look
> at the code and make a suggestion.
> > Both are OK for me if we can make progress.
> > And I can prepare the patch if any one want to try.
> Thank you for this effort. I will be very happy to test patches.
> //Peter
> ------------------------------------------------------------------------------
> Keep Your Developer Skills Current with LearnDevNow!
> The most comprehensive online learning library for Microsoft developers
> is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
> Metro Style Apps, more. Free future releases when you subscribe now!
> http://p.sf.net/sfu/learndevnow-d2d
> _______________________________________________
> OpenOCD-devel mailing list
> OpenOCD-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/openocd-devel
>
>
> ------------------------------------------------------------------------------
> Keep Your Developer Skills Current with LearnDevNow!
> The most comprehensive online learning library for Microsoft developers
> is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
> Metro Style Apps, more. Free future releases when you subscribe now!
> http://p.sf.net/sfu/learndevnow-d2d
>
>
> _______________________________________________
> OpenOCD-devel mailing list
> OpenOCD-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/openocd-devel

diff --git a/src/target/adi_v5_jtag.c b/src/target/adi_v5_jtag.c
index 75461c3..498cab0 100644
--- a/src/target/adi_v5_jtag.c
+++ b/src/target/adi_v5_jtag.c
@@ -86,7 +86,7 @@ int adi_jtag_dp_scan(struct adiv5_dap *dap,
 	struct arm_jtag *jtag_info = dap->jtag_info;
 	struct scan_field fields[2];
 	uint8_t out_addr_buf;
-	int retval;
+	int retval = ERROR_OK;
 
 	retval = arm_jtag_set_instr(jtag_info, instr, NULL, TAP_IDLE);
 	if (retval != ERROR_OK)
@@ -153,41 +153,48 @@ static int adi_jtag_dp_scan_u32(struct adiv5_dap *dap,
 	return retval;
 }
 
-/**
- * Utility to write AP registers.
- */
-static inline int adi_jtag_ap_write_check(struct adiv5_dap *dap,
-		uint8_t reg_addr, uint8_t *outvalue)
-{
-	return adi_jtag_dp_scan(dap, JTAG_DP_APACC, reg_addr, DPAP_WRITE,
-			outvalue, NULL, NULL);
-}
-
 static int adi_jtag_scan_inout_check_u32(struct adiv5_dap *dap,
 		uint8_t instr, uint8_t reg_addr, uint8_t RnW,
-		uint32_t outvalue, uint32_t *invalue)
+		uint32_t *buffer, uint32_t count)
 {
-	int retval;
+	int retval = ERROR_OK;
 
-	/* Issue the read or write */
-	retval = adi_jtag_dp_scan_u32(dap, instr, reg_addr,
-			RnW, outvalue, NULL, NULL);
-	if (retval != ERROR_OK)
-		return retval;
+	if (RnW == DPAP_READ) {
+		retval = adi_jtag_dp_scan_u32(dap, instr, reg_addr,
+				DPAP_READ, 0, NULL, NULL);
+		if (retval != ERROR_OK)
+			return retval;
+		while(count > 1){
+			retval = adi_jtag_dp_scan_u32(dap, instr, reg_addr,
+					DPAP_READ, 0, buffer, &dap->ack);
+			if (retval != ERROR_OK)
+				return retval;
+			buffer++;
+			count--;
+		}
+		retval = adi_jtag_dp_scan_u32(dap, JTAG_DP_DPACC, DP_RDBUFF,
+				DPAP_READ, 0, buffer, &dap->ack);
+		if (retval != ERROR_OK)
+			return retval;
+	}else{
+		assert(buffer != NULL);
+		while(count > 0){
+			retval = adi_jtag_dp_scan_u32(dap, instr, reg_addr,
+					RnW, *buffer, NULL, NULL);
+			if (retval != ERROR_OK)
+				return retval;
+			buffer++;
+			count--;
+		}
+	}
 
-	/* For reads,  collect posted value; RDBUFF has no other effect.
-	 * Assumes read gets acked with OK/FAULT, and CTRL_STAT says "OK".
-	 */
-	if ((RnW == DPAP_READ) && (invalue != NULL))
-		retval = adi_jtag_dp_scan_u32(dap, JTAG_DP_DPACC,
-				DP_RDBUFF, DPAP_READ, 0, invalue, &dap->ack);
 	return retval;
 }
 
 static int jtagdp_transaction_endcheck(struct adiv5_dap *dap)
 {
 	int retval;
-	uint32_t ctrlstat;
+	uint32_t ctrlstat, tmp;
 
 	/* too expensive to call keep_alive() here */
 
@@ -220,7 +227,7 @@ static int jtagdp_transaction_endcheck(struct adiv5_dap *dap)
 	 * but collect its ACK status.
 	 */
 	retval = adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
-			DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat);
+			DP_CTRL_STAT, DPAP_READ, &ctrlstat, 1);
 	if (retval != ERROR_OK)
 		return retval;
 	if ((retval = jtag_execute_queue()) != ERROR_OK)
@@ -257,7 +264,7 @@ static int jtagdp_transaction_endcheck(struct adiv5_dap *dap)
 			}
 
 			retval = adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
-					DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat);
+					DP_CTRL_STAT, DPAP_READ, &ctrlstat, 1);
 			if (retval != ERROR_OK)
 				return retval;
 			if ((retval = dap_run(dap)) != ERROR_OK)
@@ -304,14 +311,14 @@ static int jtagdp_transaction_endcheck(struct adiv5_dap *dap)
 				LOG_ERROR("JTAG-DP STICKY ERROR");
 
 			/* Clear Sticky Error Bits */
+			tmp = dap->dp_ctrl_stat | SSTICKYORUN | SSTICKYERR;
 			retval = adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
 					DP_CTRL_STAT, DPAP_WRITE,
-					dap->dp_ctrl_stat | SSTICKYORUN
-						| SSTICKYERR, NULL);
+					&tmp, 1);
 			if (retval != ERROR_OK)
 				return retval;
 			retval = adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
-					DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat);
+					DP_CTRL_STAT, DPAP_READ, &ctrlstat, 1);
 			if (retval != ERROR_OK)
 				return retval;
 			if ((retval = dap_run(dap)) != ERROR_OK)
@@ -320,12 +327,12 @@ static int jtagdp_transaction_endcheck(struct adiv5_dap *dap)
 			LOG_DEBUG("jtag-dp: CTRL/STAT 0x%" PRIx32, ctrlstat);
 
 			retval = dap_queue_ap_read(dap,
-					AP_REG_CSW, &mem_ap_csw);
+					AP_REG_CSW, &mem_ap_csw, 1);
 			if (retval != ERROR_OK)
 				return retval;
 
 			retval = dap_queue_ap_read(dap,
-					AP_REG_TAR, &mem_ap_tar);
+					AP_REG_TAR, &mem_ap_tar, 1);
 			if (retval != ERROR_OK)
 				return retval;
 
@@ -373,14 +380,14 @@ static int jtag_dp_q_read(struct adiv5_dap *dap, unsigned reg,
 		uint32_t *data)
 {
 	return adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
-			reg, DPAP_READ, 0, data);
+			reg, DPAP_READ, data, 1);
 }
 
 static int jtag_dp_q_write(struct adiv5_dap *dap, unsigned reg,
 		uint32_t data)
 {
 	return adi_jtag_scan_inout_check_u32(dap, JTAG_DP_DPACC,
-			reg, DPAP_WRITE, data, NULL);
+			reg, DPAP_WRITE, &data, 1);
 }
 
 /** Select the AP register bank matching bits 7:4 of reg. */
@@ -398,7 +405,7 @@ static int jtag_ap_q_bankselect(struct adiv5_dap *dap, unsigned reg)
 }
 
 static int jtag_ap_q_read(struct adiv5_dap *dap, unsigned reg,
-		uint32_t *data)
+		uint32_t *data, uint32_t count)
 {
 	int retval = jtag_ap_q_bankselect(dap, reg);
 
@@ -406,21 +413,18 @@ static int jtag_ap_q_read(struct adiv5_dap *dap, unsigned reg,
 		return retval;
 
 	return adi_jtag_scan_inout_check_u32(dap, JTAG_DP_APACC, reg,
-			DPAP_READ, 0, data);
+			DPAP_READ, data, count);
 }
 
 static int jtag_ap_q_write(struct adiv5_dap *dap, unsigned reg,
-		uint32_t data)
+		uint32_t *data, uint32_t count)
 {
-	uint8_t out_value_buf[4];
-
 	int retval = jtag_ap_q_bankselect(dap, reg);
 	if (retval != ERROR_OK)
 		return retval;
 
-	buf_set_u32(out_value_buf, 0, 32, data);
-
-	return adi_jtag_ap_write_check(dap, reg, out_value_buf);
+	return adi_jtag_scan_inout_check_u32(dap, JTAG_DP_APACC, reg,
+			DPAP_WRITE, data, count);
 }
 
 static int jtag_ap_q_abort(struct adiv5_dap *dap, uint8_t *ack)
diff --git a/src/target/adi_v5_swd.c b/src/target/adi_v5_swd.c
index 5a3570d..084dcca 100644
--- a/src/target/adi_v5_swd.c
+++ b/src/target/adi_v5_swd.c
@@ -84,19 +84,35 @@ static int (swd_queue_dp_write)(struct adiv5_dap *dap, unsigned reg,
 
 
 static int (swd_queue_ap_read)(struct adiv5_dap *dap, unsigned reg,
-		uint32_t *data)
+		uint32_t *data, uint32_t size)
 {
+	int retval = ERROR_OK;
 	// REVISIT  APSEL ...
 	// REVISIT status return ...
-	return swd->read_reg(swd_cmd(true,  true, reg), data);
+	while (size > 0){
+		retval = swd->read_reg(swd_cmd(false,  true, reg), data);
+		if (retval != ERROR_OK)
+			return retval;
+		data += 1;
+		size--;
+	}
+	return retval;
 }
 
 static int (swd_queue_ap_write)(struct adiv5_dap *dap, unsigned reg,
-		uint32_t data)
+		uint32_t *data, uint32_t size)
 {
+	int retval = ERROR_OK;
 	// REVISIT  APSEL ...
 	// REVISIT status return ...
-	return swd->write_reg(swd_cmd(false,  true, reg), data);
+	while (size > 0){
+		retval = swd->write_reg(swd_cmd(false,  true, reg), *data);
+		if (retval != ERROR_OK)
+			return retval;
+		data += 1;
+		size--;
+	}
+	return retval;
 }
 
 static int (swd_queue_ap_abort)(struct adiv5_dap *dap, uint8_t *ack)
diff --git a/src/target/arm_adi_v5.c b/src/target/arm_adi_v5.c
index f8a2e22..4a3d671 100644
--- a/src/target/arm_adi_v5.c
+++ b/src/target/arm_adi_v5.c
@@ -143,7 +143,7 @@ int dap_setup_accessport(struct adiv5_dap *dap, uint32_t csw, uint32_t tar)
 	if (csw != dap->ap_csw_value)
 	{
 		/* LOG_DEBUG("DAP: Set CSW %x",csw); */
-		retval = dap_queue_ap_write(dap, AP_REG_CSW, csw);
+		retval = dap_queue_ap_write(dap, AP_REG_CSW, &csw, 1);
 		if (retval != ERROR_OK)
 			return retval;
 		dap->ap_csw_value = csw;
@@ -151,7 +151,7 @@ int dap_setup_accessport(struct adiv5_dap *dap, uint32_t csw, uint32_t tar)
 	if (tar != dap->ap_tar_value)
 	{
 		/* LOG_DEBUG("DAP: Set TAR %x",tar); */
-		retval = dap_queue_ap_write(dap, AP_REG_TAR, tar);
+		retval = dap_queue_ap_write(dap, AP_REG_TAR, &tar, 1);
 		if (retval != ERROR_OK)
 			return retval;
 		dap->ap_tar_value = tar;
@@ -186,7 +186,7 @@ int mem_ap_read_u32(struct adiv5_dap *dap, uint32_t address,
 	if (retval != ERROR_OK)
 		return retval;
 
-	return dap_queue_ap_read(dap, AP_REG_BD0 | (address & 0xC), value);
+	return dap_queue_ap_read(dap, AP_REG_BD0 | (address & 0xC), value, 1);
 }
 
 /**
@@ -238,7 +238,7 @@ int mem_ap_write_u32(struct adiv5_dap *dap, uint32_t address,
 		return retval;
 
 	return dap_queue_ap_write(dap, AP_REG_BD0 | (address & 0xC),
-			value);
+			&value, 1);
 }
 
 /**
@@ -313,13 +313,9 @@ int mem_ap_write_buf_u32(struct adiv5_dap *dap, const uint8_t *buffer, int count
 		if (retval != ERROR_OK)
 			return retval;
 
-		for (writecount = 0; writecount < blocksize; writecount++)
-		{
-			retval = dap_queue_ap_write(dap, AP_REG_DRW,
-				*(uint32_t *) ((void *) (buffer + 4 * writecount)));
-			if (retval != ERROR_OK)
-				break;
-		}
+		retval = dap_queue_ap_write(dap, AP_REG_DRW, (uint32_t*)buffer, blocksize);
+		if (retval != ERROR_OK)
+			break;
 
 		if ((retval = dap_run(dap)) == ERROR_OK)
 		{
@@ -401,7 +397,7 @@ static int mem_ap_write_buf_packed_u16(struct adiv5_dap *dap,
 
 				memcpy(&outvalue, buffer, sizeof(uint32_t));
 				retval = dap_queue_ap_write(dap,
-						AP_REG_DRW, outvalue);
+						AP_REG_DRW, &outvalue, 1);
 				if (retval != ERROR_OK)
 					break;
 
@@ -439,7 +435,7 @@ int mem_ap_write_buf_u16(struct adiv5_dap *dap, const uint8_t *buffer, int count
 		uint16_t svalue;
 		memcpy(&svalue, buffer, sizeof(uint16_t));
 		uint32_t outvalue = (uint32_t)svalue << 8 * (address & 0x3);
-		retval = dap_queue_ap_write(dap, AP_REG_DRW, outvalue);
+		retval = dap_queue_ap_write(dap, AP_REG_DRW, &outvalue, 1);
 		if (retval != ERROR_OK)
 			break;
 
@@ -509,7 +505,7 @@ static int mem_ap_write_buf_packed_u8(struct adiv5_dap *dap,
 
 				memcpy(&outvalue, buffer, sizeof(uint32_t));
 				retval = dap_queue_ap_write(dap,
-						AP_REG_DRW, outvalue);
+						AP_REG_DRW, &outvalue, 1);
 				if (retval != ERROR_OK)
 					break;
 
@@ -545,7 +541,7 @@ int mem_ap_write_buf_u8(struct adiv5_dap *dap, const uint8_t *buffer, int count,
 		if (retval != ERROR_OK)
 			return retval;
 		uint32_t outvalue = (uint32_t)*buffer << 8 * (address & 0x3);
-		retval = dap_queue_ap_write(dap, AP_REG_DRW, outvalue);
+		retval = dap_queue_ap_write(dap, AP_REG_DRW, &outvalue, 1);
 		if (retval != ERROR_OK)
 			break;
 
@@ -561,13 +557,6 @@ int mem_ap_write_buf_u8(struct adiv5_dap *dap, const uint8_t *buffer, int count,
 	return retval;
 }
 
-/* FIXME don't import ... this is a temporary workaround for the
- * mem_ap_read_buf_u32() mess, until it's no longer JTAG-specific.
- */
-extern int adi_jtag_dp_scan(struct adiv5_dap *dap,
-		uint8_t instr, uint8_t reg_addr, uint8_t RnW,
-		uint8_t *outvalue, uint8_t *invalue, uint8_t *ack);
-
 /**
  * Synchronously read a block of 32-bit words into a buffer
  * @param dap The DAP connected to the MEM-AP.
@@ -606,39 +595,7 @@ int mem_ap_read_buf_u32(struct adiv5_dap *dap, uint8_t *buffer,
 		if (retval != ERROR_OK)
 			return retval;
 
-		/* FIXME remove these three calls to adi_jtag_dp_scan(),
-		 * so this routine becomes transport-neutral.  Be careful
-		 * not to cause performance problems with JTAG; would it
-		 * suffice to loop over dap_queue_ap_read(), or would that
-		 * be slower when JTAG is the chosen transport?
-		 */
-
-		/* Scan out first read */
-		retval = adi_jtag_dp_scan(dap, JTAG_DP_APACC, AP_REG_DRW,
-				DPAP_READ, 0, NULL, NULL);
-		if (retval != ERROR_OK)
-			return retval;
-		for (readcount = 0; readcount < blocksize - 1; readcount++)
-		{
-			/* Scan out next read; scan in posted value for the
-			 * previous one.  Assumes read is acked "OK/FAULT",
-			 * and CTRL_STAT says that meant "OK".
-			 */
-			retval = adi_jtag_dp_scan(dap, JTAG_DP_APACC, AP_REG_DRW,
-					DPAP_READ, 0, buffer + 4 * readcount,
-					&dap->ack);
-			if (retval != ERROR_OK)
-				return retval;
-		}
-
-		/* Scan in last posted value; RDBUFF has no other effect,
-		 * assuming ack is OK/FAULT and CTRL_STAT says "OK".
-		 */
-		retval = adi_jtag_dp_scan(dap, JTAG_DP_DPACC, DP_RDBUFF,
-				DPAP_READ, 0, buffer + 4 * readcount,
-				&dap->ack);
-		if (retval != ERROR_OK)
-			return retval;
+		dap_queue_ap_read(dap, AP_REG_DRW, (uint32_t*)buffer, blocksize);
 
 		retval = dap_run(dap);
 		if (retval != ERROR_OK)
@@ -708,7 +665,10 @@ static int mem_ap_read_buf_packed_u16(struct adiv5_dap *dap,
 
 		do
 		{
-			retval = dap_queue_ap_read(dap, AP_REG_DRW, &invalue);
+			/* TODO: read first the whole memory and convert after.
+			 * This may increase the performance
+			 */
+			retval = dap_queue_ap_read(dap, AP_REG_DRW, &invalue, 1);
 			if (retval != ERROR_OK)
 				return retval;
 			if ((retval = dap_run(dap)) != ERROR_OK)
@@ -756,7 +716,7 @@ int mem_ap_read_buf_u16(struct adiv5_dap *dap, uint8_t *buffer,
 		retval = dap_setup_accessport(dap, CSW_16BIT | CSW_ADDRINC_SINGLE, address);
 		if (retval != ERROR_OK)
 			return retval;
-		retval = dap_queue_ap_read(dap, AP_REG_DRW, &invalue);
+		retval = dap_queue_ap_read(dap, AP_REG_DRW, &invalue, 1);
 		if (retval != ERROR_OK)
 			break;
 
@@ -818,7 +778,7 @@ static int mem_ap_read_buf_packed_u8(struct adiv5_dap *dap,
 
 		do
 		{
-			retval = dap_queue_ap_read(dap, AP_REG_DRW, &invalue);
+			retval = dap_queue_ap_read(dap, AP_REG_DRW, &invalue, 1);
 			if (retval != ERROR_OK)
 				return retval;
 			if ((retval = dap_run(dap)) != ERROR_OK)
@@ -866,7 +826,7 @@ int mem_ap_read_buf_u8(struct adiv5_dap *dap, uint8_t *buffer,
 		retval = dap_setup_accessport(dap, CSW_8BIT | CSW_ADDRINC_SINGLE, address);
 		if (retval != ERROR_OK)
 			return retval;
-		retval = dap_queue_ap_read(dap, AP_REG_DRW, &invalue);
+		retval = dap_queue_ap_read(dap, AP_REG_DRW, &invalue, 1);
 		if (retval != ERROR_OK)
 			return retval;
 		retval = dap_run(dap);
@@ -1008,7 +968,11 @@ int ahbap_debugport_init(struct adiv5_dap *dap)
 	if (retval != ERROR_OK)
 		return retval;
 
-	retval = dap_queue_dp_write(dap, DP_CTRL_STAT, SSTICKYERR);
+	if (dap->ops->is_swd){
+		retval = dap_queue_dp_write(dap, DP_ABORT, DAPABORT | STKERRCLR | STKCMPCLR | WDERRCLR | ORUNERRCLR);
+	}else{
+		retval = dap_queue_dp_write(dap, DP_CTRL_STAT, SSTICKYERR);
+	}
 	if (retval != ERROR_OK)
 		return retval;
 
@@ -1097,10 +1061,10 @@ int dap_get_debugbase(struct adiv5_dap *dap, int ap,
 	ap_old = dap->ap_current;
 	dap_ap_select(dap, ap);
 
-	retval = dap_queue_ap_read(dap, AP_REG_BASE, &dbgbase);
+	retval = dap_queue_ap_read(dap, AP_REG_BASE, &dbgbase, 1);
 	if (retval != ERROR_OK)
 		return retval;
-	retval = dap_queue_ap_read(dap, AP_REG_IDR, &apid);
+	retval = dap_queue_ap_read(dap, AP_REG_IDR, &apid, 1);
 	if (retval != ERROR_OK)
 		return retval;
 	retval = dap_run(dap);
@@ -1632,7 +1596,7 @@ COMMAND_HANDLER(dap_baseaddr_command)
 	 * though they're not common for now.  This should
 	 * use the ID register to verify it's a MEM-AP.
 	 */
-	retval = dap_queue_ap_read(dap, AP_REG_BASE, &baseaddr);
+	retval = dap_queue_ap_read(dap, AP_REG_BASE, &baseaddr, 1);
 	if (retval != ERROR_OK)
 		return retval;
 	retval = dap_run(dap);
@@ -1696,7 +1660,7 @@ COMMAND_HANDLER(dap_apsel_command)
 	dap->apsel = apsel;
 	dap_ap_select(dap, apsel);
 
-	retval = dap_queue_ap_read(dap, AP_REG_IDR, &apid);
+	retval = dap_queue_ap_read(dap, AP_REG_IDR, &apid, 1);
 	if (retval != ERROR_OK)
 		return retval;
 	retval = dap_run(dap);
@@ -1734,7 +1698,7 @@ COMMAND_HANDLER(dap_apid_command)
 
 	dap_ap_select(dap, apsel);
 
-	retval = dap_queue_ap_read(dap, AP_REG_IDR, &apid);
+	retval = dap_queue_ap_read(dap, AP_REG_IDR, &apid, 1);
 	if (retval != ERROR_OK)
 		return retval;
 	retval = dap_run(dap);
diff --git a/src/target/arm_adi_v5.h b/src/target/arm_adi_v5.h
index 1c08547..311c294 100644
--- a/src/target/arm_adi_v5.h
+++ b/src/target/arm_adi_v5.h
@@ -212,10 +212,10 @@ struct dap_ops {
 
 	/** AP register read. */
 	int (*queue_ap_read)(struct adiv5_dap *dap, unsigned reg,
-			uint32_t *data);
+			uint32_t *data, uint32_t size);
 	/** AP register write. */
 	int (*queue_ap_write)(struct adiv5_dap *dap, unsigned reg,
-			uint32_t data);
+			uint32_t *data, uint32_t size);
 	/** AP operation abort. */
 	int (*queue_ap_abort)(struct adiv5_dap *dap, uint8_t *ack);
 
@@ -289,10 +289,10 @@ static inline int dap_queue_dp_write(struct adiv5_dap *dap,
  * @return ERROR_OK for success, else a fault code.
  */
 static inline int dap_queue_ap_read(struct adiv5_dap *dap,
-		unsigned reg, uint32_t *data)
+		unsigned reg, uint32_t *data, uint32_t count)
 {
 	assert(dap->ops != NULL);
-	return dap->ops->queue_ap_read(dap, reg, data);
+	return dap->ops->queue_ap_read(dap, reg, data, count);
 }
 
 /**
@@ -305,10 +305,10 @@ static inline int dap_queue_ap_read(struct adiv5_dap *dap,
  * @return ERROR_OK for success, else a fault code.
  */
 static inline int dap_queue_ap_write(struct adiv5_dap *dap,
-		unsigned reg, uint32_t data)
+		unsigned reg, uint32_t *data, uint32_t count)
 {
 	assert(dap->ops != NULL);
-	return dap->ops->queue_ap_write(dap, reg, data);
+	return dap->ops->queue_ap_write(dap, reg, data, count);
 }
 
 /**
diff --git a/src/target/cortex_m3.c b/src/target/cortex_m3.c
index 98a775c..e86aeea 100644
--- a/src/target/cortex_m3.c
+++ b/src/target/cortex_m3.c
@@ -70,6 +70,7 @@ static int cortexm3_dap_read_coreregister_u32(struct adiv5_dap *swjdp,
 {
 	int retval;
 	uint32_t dcrdr;
+	uint32_t outval = regnum;
 
 	/* because the DCB_DCRDR is used for the emulated dcc channel
 	 * we have to save/restore the DCB_DCRDR when used */
@@ -82,7 +83,7 @@ static int cortexm3_dap_read_coreregister_u32(struct adiv5_dap *swjdp,
 	retval = dap_setup_accessport(swjdp, CSW_32BIT | CSW_ADDRINC_OFF, DCB_DCRSR & 0xFFFFFFF0);
 	if (retval != ERROR_OK)
 		return retval;
-	retval = dap_queue_ap_write(swjdp, AP_REG_BD0 | (DCB_DCRSR & 0xC), regnum);
+	retval = dap_queue_ap_write(swjdp, AP_REG_BD0 | (DCB_DCRSR & 0xC), &outval, 1);
 	if (retval != ERROR_OK)
 		return retval;
 
@@ -90,7 +91,7 @@ static int cortexm3_dap_read_coreregister_u32(struct adiv5_dap *swjdp,
 	retval = dap_setup_accessport(swjdp, CSW_32BIT | CSW_ADDRINC_OFF, DCB_DCRDR & 0xFFFFFFF0);
 	if (retval != ERROR_OK)
 		return retval;
-	retval = dap_queue_ap_read(swjdp, AP_REG_BD0 | (DCB_DCRDR & 0xC), value);
+	retval = dap_queue_ap_read(swjdp, AP_REG_BD0 | (DCB_DCRDR & 0xC), value, 1);
 	if (retval != ERROR_OK)
 		return retval;
 
@@ -110,7 +111,7 @@ static int cortexm3_dap_write_coreregister_u32(struct adiv5_dap *swjdp,
 		uint32_t value, int regnum)
 {
 	int retval;
-	uint32_t dcrdr;
+	uint32_t dcrdr, outval;
 
 	/* because the DCB_DCRDR is used for the emulated dcc channel
 	 * we have to save/restore the DCB_DCRDR when used */
@@ -123,14 +124,15 @@ static int cortexm3_dap_write_coreregister_u32(struct adiv5_dap *swjdp,
 	retval = dap_setup_accessport(swjdp, CSW_32BIT | CSW_ADDRINC_OFF, DCB_DCRDR & 0xFFFFFFF0);
 	if (retval != ERROR_OK)
 		return retval;
-	retval = dap_queue_ap_write(swjdp, AP_REG_BD0 | (DCB_DCRDR & 0xC), value);
+	retval = dap_queue_ap_write(swjdp, AP_REG_BD0 | (DCB_DCRDR & 0xC), &value, 1);
 	// XXX check retval
 
 	/* mem_ap_write_u32(swjdp, DCB_DCRSR, i | DCRSR_WnR); */
 	retval = dap_setup_accessport(swjdp, CSW_32BIT | CSW_ADDRINC_OFF, DCB_DCRSR & 0xFFFFFFF0);
 	if (retval != ERROR_OK)
 		return retval;
-	retval = dap_queue_ap_write(swjdp, AP_REG_BD0 | (DCB_DCRSR & 0xC), regnum | DCRSR_WnR);
+	outval = regnum | DCRSR_WnR;
+	retval = dap_queue_ap_write(swjdp, AP_REG_BD0 | (DCB_DCRSR & 0xC), &outval, 1);
 	// XXX check retval
 
 	retval = dap_run(swjdp);
------------------------------------------------------------------------------
Keep Your Developer Skills Current with LearnDevNow!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-d2d
_______________________________________________
OpenOCD-devel mailing list
OpenOCD-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to