git-svn-id: svn://svn.berlios.de/openocd/trunk@1184 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
oharboe 2008-11-26 13:31:26 +00:00
parent 6d49edef7d
commit 7765c63649
2 changed files with 81 additions and 70 deletions

View File

@ -543,10 +543,10 @@ static void setPower(bool power)
savePower = power; savePower = power;
if (power) if (power)
{ {
HAL_WRITE_UINT32(0x08000014, 0x8); HAL_WRITE_UINT32(ZY1000_JTAG_BASE+0x14, 0x8);
} else } else
{ {
HAL_WRITE_UINT32(0x08000010, 0x8); HAL_WRITE_UINT32(ZY1000_JTAG_BASE+0x10, 0x8);
} }
} }
@ -1413,7 +1413,6 @@ static char uart_stack[4096];
static char forwardBuffer[1024]; // NB! must be smaller than a TCP/IP packet!!!!! static char forwardBuffer[1024]; // NB! must be smaller than a TCP/IP packet!!!!!
static char backwardBuffer[1024]; static char backwardBuffer[1024];
static cyg_io_handle_t serial_handle;
void setNoDelay(int session, int flag) void setNoDelay(int session, int flag)
{ {
@ -1686,6 +1685,16 @@ int handle_uart_command(struct command_context_s *cmd_ctx, char *cmd, char **arg
//get existing serial configuration //get existing serial configuration
len = sizeof(cyg_serial_info_t); len = sizeof(cyg_serial_info_t);
int err; int err;
cyg_io_handle_t serial_handle;
err = cyg_io_lookup("/dev/ser0", &serial_handle);
if (err != ENOERR)
{
LOG_ERROR("/dev/ser0 not found\n");
return ERROR_FAIL;
}
err = cyg_io_get_config(serial_handle, CYG_IO_GET_CONFIG_SERIAL_OUTPUT_DRAIN, &buf, &len); err = cyg_io_get_config(serial_handle, CYG_IO_GET_CONFIG_SERIAL_OUTPUT_DRAIN, &buf, &len);
err = cyg_io_get_config(serial_handle, CYG_IO_GET_CONFIG_SERIAL_INFO, &buf, &len); err = cyg_io_get_config(serial_handle, CYG_IO_GET_CONFIG_SERIAL_INFO, &buf, &len);
if (err != ENOERR) if (err != ENOERR)
@ -1748,6 +1757,8 @@ int main(int argc, char *argv[])
ramblockdevice=(cyg_uint8 *)malloc(ramblockdevice_size); ramblockdevice=(cyg_uint8 *)malloc(ramblockdevice_size);
memset(ramblockdevice, 0xff, ramblockdevice_size); memset(ramblockdevice, 0xff, ramblockdevice_size);
#ifdef CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION #ifdef CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION
setHandler(CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION); setHandler(CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION);
setHandler(CYGNUM_HAL_VECTOR_ABORT_PREFETCH); setHandler(CYGNUM_HAL_VECTOR_ABORT_PREFETCH);
@ -1755,12 +1766,6 @@ int main(int argc, char *argv[])
#endif #endif
int err; int err;
err = cyg_io_lookup("/dev/ser0", &serial_handle);
if (err != ENOERR)
{
diag_printf("/dev/ser0 not found\n");
reboot();
}
setPower(true); // on by default setPower(true); // on by default
@ -1811,10 +1816,15 @@ int main(int argc, char *argv[])
err = mount("/dev/flash1", "/config", "jffs2"); err = mount("/dev/flash1", "/config", "jffs2");
if (err < 0) if (err < 0)
{ {
diag_printf("unable to mount jffs\n"); diag_printf("unable to mount jffs2, falling back to ram disk..\n");
err = mount("", "/config", "ramfs");
if (err<0)
{
diag_printf("unable to mount /config as ramdisk.\n");
reboot(); reboot();
} }
} else
{
/* are we using a ram disk instead of a flash disk? This is used /* are we using a ram disk instead of a flash disk? This is used
* for ZY1000 live demo... * for ZY1000 live demo...
* *
@ -1844,7 +1854,7 @@ int main(int argc, char *argv[])
reboot(); reboot();
} }
// copydir("/config2", "/config"); // copydir("/config2", "/config");
copyfile("/config2/ip", "/config/ip"); copyfile("/config2/ip", "/config/ip");
copydir("/config2/settings", "/config/settings"); copydir("/config2/settings", "/config/settings");
@ -1854,6 +1864,7 @@ int main(int argc, char *argv[])
/* we're not going to use a ram block disk */ /* we're not going to use a ram block disk */
free(ramblockdevice); free(ramblockdevice);
} }
}
mkdir(ZYLIN_CONFIG_DIR, 0777); mkdir(ZYLIN_CONFIG_DIR, 0777);

View File

@ -81,8 +81,8 @@ static bool readPowerDropout()
{ {
cyg_uint32 state; cyg_uint32 state;
// sample and clear power dropout // sample and clear power dropout
HAL_WRITE_UINT32(0x08000010, 0x80); HAL_WRITE_UINT32(ZY1000_JTAG_BASE+0x10, 0x80);
HAL_READ_UINT32(0x08000010, state); HAL_READ_UINT32(ZY1000_JTAG_BASE+0x10, state);
bool powerDropout; bool powerDropout;
powerDropout = (state & 0x80) != 0; powerDropout = (state & 0x80) != 0;
return powerDropout; return powerDropout;
@ -93,8 +93,8 @@ static bool readSRST()
{ {
cyg_uint32 state; cyg_uint32 state;
// sample and clear SRST sensing // sample and clear SRST sensing
HAL_WRITE_UINT32(0x08000010, 0x00000040); HAL_WRITE_UINT32(ZY1000_JTAG_BASE+0x10, 0x00000040);
HAL_READ_UINT32(0x08000010, state); HAL_READ_UINT32(ZY1000_JTAG_BASE+0x10, state);
bool srstAsserted; bool srstAsserted;
srstAsserted = (state & 0x40) != 0; srstAsserted = (state & 0x40) != 0;
return srstAsserted; return srstAsserted;
@ -153,35 +153,35 @@ void zy1000_reset(int trst, int srst)
LOG_DEBUG("zy1000 trst=%d, srst=%d", trst, srst); LOG_DEBUG("zy1000 trst=%d, srst=%d", trst, srst);
if(!srst) if(!srst)
{ {
ZY1000_POKE(0x08000014, 0x00000001); ZY1000_POKE(ZY1000_JTAG_BASE+0x14, 0x00000001);
} }
else else
{ {
/* Danger!!! if clk!=0 when in /* Danger!!! if clk!=0 when in
* idle in TAP_RTI, reset halt on str912 will fail. * idle in TAP_RTI, reset halt on str912 will fail.
*/ */
ZY1000_POKE(0x08000010, 0x00000001); ZY1000_POKE(ZY1000_JTAG_BASE+0x10, 0x00000001);
} }
if(!trst) if(!trst)
{ {
ZY1000_POKE(0x08000014, 0x00000002); ZY1000_POKE(ZY1000_JTAG_BASE+0x14, 0x00000002);
} }
else else
{ {
/* assert reset */ /* assert reset */
ZY1000_POKE(0x08000010, 0x00000002); ZY1000_POKE(ZY1000_JTAG_BASE+0x10, 0x00000002);
} }
if (trst||(srst&&(jtag_reset_config & RESET_SRST_PULLS_TRST))) if (trst||(srst&&(jtag_reset_config & RESET_SRST_PULLS_TRST)))
{ {
waitIdle(); waitIdle();
/* we're now in the TLR state until trst is deasserted */ /* we're now in the TLR state until trst is deasserted */
ZY1000_POKE(0x08000020, TAP_TLR); ZY1000_POKE(ZY1000_JTAG_BASE+0x20, TAP_TLR);
} else } else
{ {
/* We'll get RCLK failure when we assert TRST, so clear any false positives here */ /* We'll get RCLK failure when we assert TRST, so clear any false positives here */
ZY1000_POKE(0x08000014, 0x400); ZY1000_POKE(ZY1000_JTAG_BASE+0x14, 0x400);
} }
/* wait for srst to float back up */ /* wait for srst to float back up */
@ -216,7 +216,7 @@ int zy1000_speed(int speed)
{ {
/*0 means RCLK*/ /*0 means RCLK*/
speed = 0; speed = 0;
ZY1000_POKE(0x08000010, 0x100); ZY1000_POKE(ZY1000_JTAG_BASE+0x10, 0x100);
LOG_DEBUG("jtag_speed using RCLK"); LOG_DEBUG("jtag_speed using RCLK");
} }
else else
@ -228,8 +228,8 @@ int zy1000_speed(int speed)
} }
LOG_USER("jtag_speed %d => JTAG clk=%f", speed, 64.0/(float)speed); LOG_USER("jtag_speed %d => JTAG clk=%f", speed, 64.0/(float)speed);
ZY1000_POKE(0x08000014, 0x100); ZY1000_POKE(ZY1000_JTAG_BASE+0x14, 0x100);
ZY1000_POKE(0x0800001c, speed&~1); ZY1000_POKE(ZY1000_JTAG_BASE+0x1c, speed&~1);
} }
return ERROR_OK; return ERROR_OK;
} }
@ -242,7 +242,7 @@ int zy1000_register_commands(struct command_context_s *cmd_ctx)
int zy1000_init(void) int zy1000_init(void)
{ {
ZY1000_POKE(0x08000010, 0x30); // Turn on LED1 & LED2 ZY1000_POKE(ZY1000_JTAG_BASE+0x10, 0x30); // Turn on LED1 & LED2
/* deassert resets. Important to avoid infinite loop waiting for SRST to deassert */ /* deassert resets. Important to avoid infinite loop waiting for SRST to deassert */
zy1000_reset(0, 0); zy1000_reset(0, 0);
@ -324,9 +324,9 @@ int interface_jtag_execute_queue(void)
cyg_uint32 empty; cyg_uint32 empty;
waitIdle(); waitIdle();
ZY1000_PEEK(0x08000010, empty); ZY1000_PEEK(ZY1000_JTAG_BASE+0x10, empty);
/* clear JTAG error register */ /* clear JTAG error register */
ZY1000_POKE(0x08000014, 0x400); ZY1000_POKE(ZY1000_JTAG_BASE+0x14, 0x400);
if ((empty&0x400)!=0) if ((empty&0x400)!=0)
{ {
@ -347,7 +347,7 @@ static cyg_uint32 getShiftValue()
{ {
cyg_uint32 value; cyg_uint32 value;
waitIdle(); waitIdle();
ZY1000_PEEK(0x0800000c, value); ZY1000_PEEK(ZY1000_JTAG_BASE+0xc, value);
VERBOSE(LOG_INFO("getShiftValue %08x", value)); VERBOSE(LOG_INFO("getShiftValue %08x", value));
return value; return value;
} }
@ -356,7 +356,7 @@ static cyg_uint32 getShiftValueFlip()
{ {
cyg_uint32 value; cyg_uint32 value;
waitIdle(); waitIdle();
ZY1000_PEEK(0x08000018, value); ZY1000_PEEK(ZY1000_JTAG_BASE+0x18, value);
VERBOSE(LOG_INFO("getShiftValue %08x (flipped)", value)); VERBOSE(LOG_INFO("getShiftValue %08x (flipped)", value));
return value; return value;
} }
@ -369,8 +369,8 @@ static void shiftValueInnerFlip(const enum tap_state state, const enum tap_state
cyg_uint32 a,b; cyg_uint32 a,b;
a=state; a=state;
b=endState; b=endState;
ZY1000_POKE(0x0800000c, value); ZY1000_POKE(ZY1000_JTAG_BASE+0xc, value);
ZY1000_POKE(0x08000008, (1<<15)|(repeat<<8)|(a<<4)|b); ZY1000_POKE(ZY1000_JTAG_BASE+0x8, (1<<15)|(repeat<<8)|(a<<4)|b);
VERBOSE(getShiftValueFlip()); VERBOSE(getShiftValueFlip());
} }
#endif #endif
@ -680,10 +680,10 @@ int interface_jtag_add_runtest(int num_cycles, enum tap_state state)
{ {
tms = (tms_scan >> i) & 1; tms = (tms_scan >> i) & 1;
waitIdle(); waitIdle();
ZY1000_POKE(0x08000028, tms); ZY1000_POKE(ZY1000_JTAG_BASE+0x28, tms);
} }
waitIdle(); waitIdle();
ZY1000_POKE(0x08000020, state); ZY1000_POKE(ZY1000_JTAG_BASE+0x20, state);
#endif #endif
@ -725,7 +725,7 @@ int interface_jtag_add_pathmove(int num_states, enum tap_state *path)
} }
waitIdle(); waitIdle();
ZY1000_POKE(0x08000028, tms); ZY1000_POKE(ZY1000_JTAG_BASE+0x28, tms);
cur_state = path[state_count]; cur_state = path[state_count];
state_count++; state_count++;
@ -733,7 +733,7 @@ int interface_jtag_add_pathmove(int num_states, enum tap_state *path)
} }
waitIdle(); waitIdle();
ZY1000_POKE(0x08000020, cur_state); ZY1000_POKE(ZY1000_JTAG_BASE+0x20, cur_state);
return ERROR_OK; return ERROR_OK;
} }