Line 358... |
Line 358... |
int result = 0;
|
int result = 0;
|
int fd = connection.device.fd;
|
int fd = connection.device.fd;
|
JTAGProxyWriteMessage xmit_write;
|
JTAGProxyWriteMessage xmit_write;
|
JTAGProxyReadMessage xmit_read;
|
JTAGProxyReadMessage xmit_read;
|
JTAGProxyChainMessage xmit_chain;
|
JTAGProxyChainMessage xmit_chain;
|
|
JTAGProxyBlockWriteMessage *xmit_bwrite;
|
|
JTAGProxyBlockReadMessage xmit_bread;
|
JTAGProxyWriteResponse recv_write;
|
JTAGProxyWriteResponse recv_write;
|
JTAGProxyReadResponse recv_read;
|
JTAGProxyReadResponse recv_read;
|
JTAGProxyChainResponse recv_chain;
|
JTAGProxyChainResponse recv_chain;
|
|
JTAGProxyBlockWriteResponse recv_bwrite;
|
|
JTAGProxyBlockReadResponse recv_bread;
|
unsigned long long data,* ret_val;
|
unsigned long long data,* ret_val;
|
uint32_t word1; /* Use word1 and word2 to ease portability to platforms */
|
uint32_t word1; /* Use word1 and word2 to ease portability to platforms */
|
uint32_t word2; /* without long long and for alignment reasons */
|
uint32_t word2; /* without long long and for alignment reasons */
|
|
unsigned long address;
|
|
unsigned long* b_data;
|
|
int nRegisters;
|
|
int len,i;
|
|
|
#ifndef ANSI_PROTOTYPES
|
#ifndef ANSI_PROTOTYPES
|
int command;
|
int command;
|
|
|
va_start(ap);
|
va_start(ap);
|
Line 410... |
Line 418... |
break;
|
break;
|
if(result = ReadResponse(fd,&recv_write,sizeof(recv_write)))
|
if(result = ReadResponse(fd,&recv_write,sizeof(recv_write)))
|
break;
|
break;
|
result = recv_write.status;
|
result = recv_write.status;
|
break;
|
break;
|
|
case JTAG_COMMAND_BLOCK_WRITE:
|
|
address = va_arg(ap,unsigned long);
|
|
b_data = va_arg(ap,unsigned long*);
|
|
nRegisters = va_arg(ap,int);
|
|
len = sizeof(JTAGProxyBlockWriteMessage) + (nRegisters-1)*4;
|
|
xmit_bwrite = (JTAGProxyBlockWriteMessage*)malloc(len);
|
|
xmit_bwrite->command = htonl(command);
|
|
xmit_bwrite->length = htonl(len-8);
|
|
xmit_bwrite->address = htonl(address);
|
|
xmit_bwrite->nRegisters = htonl(nRegisters);
|
|
for(i=0;i<nRegisters;i++)
|
|
xmit_bwrite->data[i] = htonl(b_data[i]);
|
|
if(!(result = jtag_proxy_write(fd,xmit_bwrite,len)) &&
|
|
!(result = ReadResponse(fd,&recv_bwrite,sizeof(recv_bwrite))))
|
|
result = recv_bwrite.status;
|
|
free(xmit_bwrite);
|
|
xmit_bwrite = NULL;
|
|
break;
|
|
case JTAG_COMMAND_BLOCK_READ:
|
|
address = va_arg(ap,unsigned long);
|
|
b_data = va_arg(ap,unsigned long*);
|
|
nRegisters = va_arg(ap,int);
|
|
xmit_bread.command = htonl(command);
|
|
xmit_bread.length = htonl(sizeof(xmit_bread)-8);
|
|
xmit_bread.address = htonl(address);
|
|
xmit_bread.nRegisters = htonl(nRegisters);
|
|
if(result = jtag_proxy_write(fd,&xmit_bread,sizeof(xmit_bread)))
|
|
break;
|
|
if(result = ReadResponse(fd,&recv_bread,sizeof(recv_bread)))
|
|
break;
|
|
b_data[0] = ntohl(recv_bread.data[0]);
|
|
if(result = jtag_proxy_read(fd,&b_data[1],4*(recv_bread.nRegisters-1)))
|
|
break;
|
|
if(recv_bread.nRegisters != nRegisters)
|
|
result = JTAG_PROXY_PROTOCOL_ERROR;
|
|
else
|
|
{
|
|
for(i=1;i<nRegisters;i++)
|
|
b_data[i] = ntohl(b_data[i]);
|
|
}
|
|
break;
|
case JTAG_COMMAND_CHAIN:
|
case JTAG_COMMAND_CHAIN:
|
xmit_chain.command = htonl(command);
|
xmit_chain.command = htonl(command);
|
xmit_chain.length = htonl(sizeof(xmit_chain)-8);
|
xmit_chain.length = htonl(sizeof(xmit_chain)-8);
|
xmit_chain.chain = htonl(va_arg(ap,unsigned int));
|
xmit_chain.chain = htonl(va_arg(ap,unsigned int));
|
if(result = jtag_proxy_write(fd,&xmit_chain,sizeof(xmit_chain)))
|
if(result = jtag_proxy_write(fd,&xmit_chain,sizeof(xmit_chain)))
|
Line 485... |
Line 534... |
sprintf(sTemp,"An error was reported by the proxy server. The command was:\n"
|
sprintf(sTemp,"An error was reported by the proxy server. The command was:\n"
|
"\"JTAG_COMMAND_CHAIN\",%u. The command returned %d.\n",
|
"\"JTAG_COMMAND_CHAIN\",%u. The command returned %d.\n",
|
va_arg(ap,unsigned int));
|
va_arg(ap,unsigned int));
|
error(sTemp);
|
error(sTemp);
|
break;
|
break;
|
|
case JTAG_COMMAND_BLOCK_READ:
|
|
sprintf(sTemp,"An error was reported by the proxy server. The command was:\n"
|
|
"\"JTAG_COMMAND_BLOCK_READ\",0x%08x,0x%08x,%d\nThe command returned %d.\n",
|
|
va_arg(ap,unsigned long),va_arg(ap,unsigned long),va_arg(ap,int),result);
|
|
error(sTemp);
|
|
break;
|
|
case JTAG_COMMAND_BLOCK_WRITE:
|
default:
|
default:
|
sprintf(sTemp,"An error was reported by the proxy server. The command is "
|
sprintf(sTemp,"An error was reported by the proxy server. The command was:\n"
|
"currently unimplemented.\nThe command code was %d, and the result "
|
"\"JTAG_COMMAND_BLOCK_WRITE\",0x%08x,0x%08x,%d\nThe command returned %d.\n",
|
"code was %d.\n",command,result);
|
va_arg(ap,unsigned long),va_arg(ap,unsigned long),va_arg(ap,int),result);
|
error(sTemp);
|
error(sTemp);
|
break;
|
break;
|
}
|
}
|
va_end(ap);
|
va_end(ap);
|
}
|
}
|
Line 649... |
Line 705... |
}
|
}
|
|
|
return data; /* CZ */
|
return data; /* CZ */
|
}
|
}
|
|
|
|
int jtag_write_block(unsigned int regno,void* data,int nRegisters)
|
|
{
|
|
unsigned long* buffer = (unsigned long*)data;
|
|
int i,result;
|
|
|
|
err = 0;
|
|
switch(connection.location)
|
|
{
|
|
case JTAG_LOCAL: /* We can't do any better than this locally */
|
|
for(i=0;i<nRegisters;i++)
|
|
jtag_write_reg(regno+i,(ULONGEST)buffer[i]);
|
|
break;
|
|
case JTAG_REMOTE:
|
|
if(result = jtag_send_proxy(JTAG_COMMAND_BLOCK_WRITE,regno,data,nRegisters))
|
|
{
|
|
jtag_proxy_error(result,JTAG_COMMAND_BLOCK_WRITE,regno,data,nRegisters);
|
|
err = result;
|
|
}
|
|
break;
|
|
default:
|
|
error("jtag_write_reg called with no connection!");
|
|
break;
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
|
int jtag_read_block(unsigned int regno,void* data,int nRegisters)
|
|
{
|
|
unsigned long* buffer = (unsigned long*)data;
|
|
int i,result;
|
|
|
|
err = 0;
|
|
switch(connection.location)
|
|
{
|
|
case JTAG_LOCAL: /* We can't do any better than this locally */
|
|
for(i=0;i<nRegisters;i++)
|
|
buffer[i] = (unsigned long)jtag_read_reg(regno+i);
|
|
break;
|
|
case JTAG_REMOTE:
|
|
if(result = jtag_send_proxy(JTAG_COMMAND_BLOCK_READ,regno,data,nRegisters))
|
|
{
|
|
jtag_proxy_error(result,JTAG_COMMAND_BLOCK_READ,regno,data,nRegisters);
|
|
err = result;
|
|
}
|
|
break;
|
|
default:
|
|
error("jtag_write_reg called with no connection!");
|
|
break;
|
|
}
|
|
|
|
return err;
|
|
}
|
|
|
/* Sets scan chain. */
|
/* Sets scan chain. */
|
|
|
void
|
void
|
jtag_set_chain (chain)
|
jtag_set_chain (chain)
|
int chain;
|
int chain;
|