wip
git-svn-id: svn://svn.berlios.de/openocd/trunk@1184 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
parent
6d49edef7d
commit
7765c63649
103
src/ecosboard.c
103
src/ecosboard.c
|
@ -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,48 +1816,54 @@ 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");
|
||||||
reboot();
|
err = mount("", "/config", "ramfs");
|
||||||
}
|
if (err<0)
|
||||||
|
|
||||||
/* are we using a ram disk instead of a flash disk? This is used
|
|
||||||
* for ZY1000 live demo...
|
|
||||||
*
|
|
||||||
* copy over flash disk to ram block device
|
|
||||||
*/
|
|
||||||
if (boolParam("ramdisk"))
|
|
||||||
{
|
|
||||||
diag_printf("Unmounting /config from flash and using ram instead\n");
|
|
||||||
err=umount("/config");
|
|
||||||
if (err < 0)
|
|
||||||
{
|
{
|
||||||
diag_printf("unable to unmount jffs\n");
|
diag_printf("unable to mount /config as ramdisk.\n");
|
||||||
reboot();
|
reboot();
|
||||||
}
|
}
|
||||||
|
|
||||||
err = mount("/dev/flash1", "/config2", "jffs2");
|
|
||||||
if (err < 0)
|
|
||||||
{
|
|
||||||
diag_printf("unable to mount jffs\n");
|
|
||||||
reboot();
|
|
||||||
}
|
|
||||||
|
|
||||||
err = mount("/dev/ram", "/config", "jffs2");
|
|
||||||
if (err < 0)
|
|
||||||
{
|
|
||||||
diag_printf("unable to mount ram block device\n");
|
|
||||||
reboot();
|
|
||||||
}
|
|
||||||
|
|
||||||
// copydir("/config2", "/config");
|
|
||||||
copyfile("/config2/ip", "/config/ip");
|
|
||||||
copydir("/config2/settings", "/config/settings");
|
|
||||||
|
|
||||||
umount("/config2");
|
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
/* we're not going to use a ram block disk */
|
/* are we using a ram disk instead of a flash disk? This is used
|
||||||
free(ramblockdevice);
|
* for ZY1000 live demo...
|
||||||
|
*
|
||||||
|
* copy over flash disk to ram block device
|
||||||
|
*/
|
||||||
|
if (boolParam("ramdisk"))
|
||||||
|
{
|
||||||
|
diag_printf("Unmounting /config from flash and using ram instead\n");
|
||||||
|
err=umount("/config");
|
||||||
|
if (err < 0)
|
||||||
|
{
|
||||||
|
diag_printf("unable to unmount jffs\n");
|
||||||
|
reboot();
|
||||||
|
}
|
||||||
|
|
||||||
|
err = mount("/dev/flash1", "/config2", "jffs2");
|
||||||
|
if (err < 0)
|
||||||
|
{
|
||||||
|
diag_printf("unable to mount jffs\n");
|
||||||
|
reboot();
|
||||||
|
}
|
||||||
|
|
||||||
|
err = mount("/dev/ram", "/config", "jffs2");
|
||||||
|
if (err < 0)
|
||||||
|
{
|
||||||
|
diag_printf("unable to mount ram block device\n");
|
||||||
|
reboot();
|
||||||
|
}
|
||||||
|
|
||||||
|
// copydir("/config2", "/config");
|
||||||
|
copyfile("/config2/ip", "/config/ip");
|
||||||
|
copydir("/config2/settings", "/config/settings");
|
||||||
|
|
||||||
|
umount("/config2");
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
/* we're not going to use a ram block disk */
|
||||||
|
free(ramblockdevice);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue