diff target-utils/dspdump/dspops.c @ 540:27b5526ba1a8

dspdump target program written, compiles
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 28 Oct 2019 08:19:33 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/dspdump/dspops.c	Mon Oct 28 08:19:33 2019 +0000
@@ -0,0 +1,75 @@
+#include "types.h"
+#include "leadapi.h"
+#include "dumpagent.h"
+
+wait_for_dsp_ready()
+{
+	unsigned cnt;
+
+	for (cnt = 0; cnt < 10000; cnt++)
+		if (DOWNLOAD_STATUS == LEAD_READY)
+			return(0);
+	return(-1);
+}
+
+boot_dsp_dump_agent()
+{
+	const u16 *src;
+	volatile u16 *api;
+	unsigned n;
+
+	/* put it into reset first */
+	CLKM_CNTL_RST |= CLKM_LEAD_RST;
+	/* generous 1 ms for the reset pulse */
+	wait_ARM_cycles(13000);
+	/* lift it out of reset */
+	CLKM_CNTL_RST &= ~CLKM_LEAD_RST;
+	/* another generous 1 ms */
+	wait_ARM_cycles(13000);
+	/* bootloader should be ready for us now */
+	if (wait_for_dsp_ready() < 0) {
+		printf("ERROR: DSP bootloader not ready out of reset\n");
+		return(-1);
+	}
+	/* upload the agent code */
+	src = dsp_agent_code;
+	api = (volatile u16 *) APIF_ADDR;
+	for (n = 0; n < DSP_DUMPCODE_LEN; n++)
+		*api++ = *src++;
+	DOWNLOAD_EXT_PAGE = 0;
+	DOWNLOAD_SIZE = DSP_DUMPCODE_LEN;
+	DOWNLOAD_ADDR = DSP_DUMPCODE_START;
+	DOWNLOAD_STATUS = BLOCK_READY;
+	if (wait_for_dsp_ready() < 0) {
+		printf("ERROR: DSP bl not ready after block write\n");
+		return(-1);
+	}
+	/* start it! */
+	DOWNLOAD_EXT_PAGE = 0;
+	DOWNLOAD_SIZE = 0;
+	DOWNLOAD_ADDR = DSP_DUMPCODE_START;
+	DOWNLOAD_STATUS = BLOCK_READY;
+	if (wait_for_dsp_ready() < 0) {
+		printf("ERROR: DSP not ready after commanded jump to agent\n");
+		return(-1);
+	}
+}
+
+dsp_read_op(mode, addr, blklen)
+	u16 mode, blklen;
+	u32 addr;
+{
+	int rc;
+
+	APIRAM_FIRST_WORD = mode;
+	DOWNLOAD_STATUS = PAGE_SELECTION;
+	rc = wait_for_dsp_ready();
+	if (rc < 0)
+		return(rc);
+	DOWNLOAD_EXT_PAGE = addr >> 16;
+	DOWNLOAD_SIZE = blklen;
+	DOWNLOAD_ADDR = addr;
+	DOWNLOAD_STATUS = BLOCK_READY;
+	rc = wait_for_dsp_ready();
+	return(rc);
+}