diff options
author | Øyvind Harboe <oyvind.harboe@zylin.com> | 2010-09-07 20:27:45 +0200 |
---|---|---|
committer | Øyvind Harboe <oyvind.harboe@zylin.com> | 2010-09-20 20:45:16 +0200 |
commit | 61780558e1654af0f3f20a332763b30bf533a912 (patch) | |
tree | d5f3ebcf16757bc354736bce643ccca23ddc7799 | |
parent | 549d97481407b99a820033379d5a3d44931a5336 (diff) | |
download | openocd_libswd-61780558e1654af0f3f20a332763b30bf533a912.tar.gz openocd_libswd-61780558e1654af0f3f20a332763b30bf533a912.tar.bz2 openocd_libswd-61780558e1654af0f3f20a332763b30bf533a912.tar.xz openocd_libswd-61780558e1654af0f3f20a332763b30bf533a912.zip |
zy1000: add support for Linux host
used /dev/mem and mmem() to memory map JTAG registers
into user space and used new configure options to exclude
eCos specific code.
Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
-rw-r--r-- | src/jtag/zy1000/jtag_minidriver.h | 13 | ||||
-rw-r--r-- | src/jtag/zy1000/zy1000.c | 38 |
2 files changed, 45 insertions, 6 deletions
diff --git a/src/jtag/zy1000/jtag_minidriver.h b/src/jtag/zy1000/jtag_minidriver.h index 4e99d3cb..543fd9bb 100644 --- a/src/jtag/zy1000/jtag_minidriver.h +++ b/src/jtag/zy1000/jtag_minidriver.h @@ -21,12 +21,19 @@ #define TEST_MANUAL() 0 #define VERBOSE(a) -#if BUILD_ECOSBOARD +#if BUILD_ZY1000_MASTER +#if BUILD_ECOSBOARD #include <cyg/hal/hal_io.h> // low level i/o #include <cyg/hal/hal_intr.h> // low level i/o #define ZY1000_PEEK(a, b) HAL_READ_UINT32(a, b) #define ZY1000_POKE(a, b) HAL_WRITE_UINT32(a, b) +#else +#define ZY1000_PEEK(a, b) do {b = *( ( volatile uint32_t *)(a) );} while (0) +#define ZY1000_POKE(a, b) do {*( ( volatile uint32_t *)(a) ) = b;} while (0) +extern volatile void *zy1000_jtag_master; +#define ZY1000_JTAG_BASE ((unsigned long)zy1000_jtag_master) +#endif #else @@ -41,7 +48,7 @@ extern uint32_t zy1000_tcpin(uint32_t address); -#if BUILD_ECOSBOARD +#if BUILD_ZY1000_MASTER // FIFO empty? static __inline__ void waitIdle(void) { @@ -228,7 +235,7 @@ static __inline__ void interface_jtag_add_dr_out(struct jtag_tap *target_tap, } } -#if BUILD_ECOSBOARD +#if BUILD_ZY1000_MASTER #define interface_jtag_add_callback(callback, in) callback(in) #define interface_jtag_add_callback4(callback, in, data1, data2, data3) jtag_set_error(callback(in, data1, data2, data3)) #else diff --git a/src/jtag/zy1000/zy1000.c b/src/jtag/zy1000/zy1000.c index 3ecd0f9b..c939d7f2 100644 --- a/src/jtag/zy1000/zy1000.c +++ b/src/jtag/zy1000/zy1000.c @@ -321,7 +321,7 @@ COMMAND_HANDLER(handle_power_command) return ERROR_OK; } -#if !BUILD_ECOSBOARD +#if !BUILD_ZY1000_MASTER static char *tcp_server = "notspecified"; static int jim_zy1000_server(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { @@ -1002,6 +1002,7 @@ static const struct command_registration zy1000_commands[] = { "With no arguments, prints status.", .usage = "('on'|'off)", }, +#if BUILD_ZY1000_MASTER #if BUILD_ECOSBOARD { .name = "zy1000_version", @@ -1010,6 +1011,7 @@ static const struct command_registration zy1000_commands[] = { .help = "Print version info for zy1000.", .usage = "['openocd'|'zy1000'|'date'|'time'|'pcb'|'fpga']", }, +#endif #else { .name = "zy1000_server", @@ -1038,6 +1040,7 @@ static const struct command_registration zy1000_commands[] = { }; +#if !BUILD_ZY1000_MASTER || BUILD_ECOSBOARD static int tcp_ip = -1; /* Write large packets if we can */ @@ -1106,6 +1109,7 @@ static bool readLong(uint32_t *out_data) *out_data = data; return true; } +#endif enum ZY1000_CMD { @@ -1116,7 +1120,7 @@ enum ZY1000_CMD }; -#if !BUILD_ECOSBOARD +#if !BUILD_ZY1000_MASTER #include <sys/socket.h> /* for socket(), connect(), send(), and recv() */ #include <arpa/inet.h> /* for sockaddr_in and inet_addr() */ @@ -1566,21 +1570,49 @@ static void watchdog_server(cyg_addrword_t data) } #endif +#endif + +#if BUILD_ZY1000_MASTER int interface_jtag_add_sleep(uint32_t us) { jtag_sleep(us); return ERROR_OK; } - #endif +#if BUILD_ZY1000_MASTER && !BUILD_ECOSBOARD +volatile void *zy1000_jtag_master; +#include <sys/mman.h> +#endif int zy1000_init(void) { #if BUILD_ECOSBOARD LOG_USER("%s", ZYLIN_OPENOCD_VERSION); +#else + int fd; + if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) + { + LOG_ERROR("No access to /dev/mem"); + return ERROR_FAIL; + } +#ifndef REGISTERS_BASE +#define REGISTERS_BASE 0x9002000 +#define REGISTERS_SPAN 128 +#endif + + zy1000_jtag_master = mmap(0, REGISTERS_SPAN, PROT_READ | PROT_WRITE, MAP_SHARED, fd, REGISTERS_BASE); + + if(zy1000_jtag_master == (void *) -1) + { + close(fd); + LOG_ERROR("No access to /dev/mem"); + return ERROR_FAIL; + } #endif + + ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x30); // Turn on LED1 & LED2 setPower(true); // on by default |