projects
/
fw
/
openocd
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
mips32, use scan32 function for reading impcode/idcode.
[fw/openocd]
/
src
/
jtag
/
commands.c
diff --git
a/src/jtag/commands.c
b/src/jtag/commands.c
index c092eec5325cd56872a2912eb00636f0d0c67eb7..ed40755b73a5a7dcb45410f56ad5a42b547782cd 100644
(file)
--- a/
src/jtag/commands.c
+++ b/
src/jtag/commands.c
@@
-23,43
+23,44
@@
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. *
***************************************************************************/
***************************************************************************/
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
+#include <jtag/jtag.h>
#include "commands.h"
struct cmd_queue_page {
#include "commands.h"
struct cmd_queue_page {
+ struct cmd_queue_page *next;
void *address;
size_t used;
void *address;
size_t used;
- struct cmd_queue_page *next;
};
#define CMD_QUEUE_PAGE_SIZE (1024 * 1024)
};
#define CMD_QUEUE_PAGE_SIZE (1024 * 1024)
-static struct cmd_queue_page *cmd_queue_pages = NULL;
+static struct cmd_queue_page *cmd_queue_pages;
+static struct cmd_queue_page *cmd_queue_pages_tail;
-
jtag_command_t *jtag_command_queue = NULL
;
-static
jtag_command_t
**next_command_pointer = &jtag_command_queue;
+
struct jtag_command *jtag_command_queue
;
+static
struct jtag_command
**next_command_pointer = &jtag_command_queue;
-void jtag_queue_command(
jtag_command_t *
cmd)
+void jtag_queue_command(
struct jtag_command *
cmd)
{
{
- /
/ this command goes on the end, so ensure the queue terminates
+ /
* this command goes on the end, so ensure the queue terminates */
cmd->next = NULL;
cmd->next = NULL;
-
jtag_command_t
**last_cmd = next_command_pointer;
+
struct jtag_command
**last_cmd = next_command_pointer;
assert(NULL != last_cmd);
assert(NULL == *last_cmd);
*last_cmd = cmd;
assert(NULL != last_cmd);
assert(NULL == *last_cmd);
*last_cmd = cmd;
- /
/ store location where the next command pointer will be stored
+ /
* store location where the next command pointer will be stored */
next_command_pointer = &cmd->next;
}
next_command_pointer = &cmd->next;
}
-void
*
cmd_queue_alloc(size_t size)
+void
*
cmd_queue_alloc(size_t size)
{
struct cmd_queue_page **p_page = &cmd_queue_pages;
int offset;
{
struct cmd_queue_page **p_page = &cmd_queue_pages;
int offset;
@@
-94,38
+95,37
@@
void* cmd_queue_alloc(size_t size)
#define ALIGN_SIZE (sizeof(union worse_case_align))
/* The alignment process. */
#define ALIGN_SIZE (sizeof(union worse_case_align))
/* The alignment process. */
- size = (size + ALIGN_SIZE -
1) & (~(ALIGN_SIZE-
1));
+ size = (size + ALIGN_SIZE -
1) & (~(ALIGN_SIZE -
1));
/* Done... */
/* Done... */
- if (*p_page)
- {
- while ((*p_page)->next)
- p_page = &((*p_page)->next);
+ if (*p_page) {
+ p_page = &cmd_queue_pages_tail;
if (CMD_QUEUE_PAGE_SIZE - (*p_page)->used < size)
p_page = &((*p_page)->next);
}
if (CMD_QUEUE_PAGE_SIZE - (*p_page)->used < size)
p_page = &((*p_page)->next);
}
- if (!*p_page)
- {
+ if (!*p_page) {
*p_page = malloc(sizeof(struct cmd_queue_page));
(*p_page)->used = 0;
*p_page = malloc(sizeof(struct cmd_queue_page));
(*p_page)->used = 0;
- (*p_page)->address = malloc(CMD_QUEUE_PAGE_SIZE);
+ size_t alloc_size = (size < CMD_QUEUE_PAGE_SIZE) ?
+ CMD_QUEUE_PAGE_SIZE : size;
+ (*p_page)->address = malloc(alloc_size);
(*p_page)->next = NULL;
(*p_page)->next = NULL;
+ cmd_queue_pages_tail = *p_page;
}
offset = (*p_page)->used;
(*p_page)->used += size;
}
offset = (*p_page)->used;
(*p_page)->used += size;
- t = (
uint8_t *)((*p_page)->address)
;
+ t = (
*p_page)->address
;
return t + offset;
}
return t + offset;
}
-void cmd_queue_free(void)
+
static
void cmd_queue_free(void)
{
struct cmd_queue_page *page = cmd_queue_pages;
{
struct cmd_queue_page *page = cmd_queue_pages;
- while (page)
- {
+ while (page) {
struct cmd_queue_page *last = page;
free(page->address);
page = page->next;
struct cmd_queue_page *last = page;
free(page->address);
page = page->next;
@@
-133,6
+133,7
@@
void cmd_queue_free(void)
}
cmd_queue_pages = NULL;
}
cmd_queue_pages = NULL;
+ cmd_queue_pages_tail = NULL;
}
void jtag_command_queue_reset(void)
}
void jtag_command_queue_reset(void)
@@
-148,8
+149,7
@@
enum scan_type jtag_scan_type(const struct scan_command *cmd)
int i;
int type = 0;
int i;
int type = 0;
- for (i = 0; i < cmd->num_fields; i++)
- {
+ for (i = 0; i < cmd->num_fields; i++) {
if (cmd->fields[i].in_value)
type |= SCAN_IN;
if (cmd->fields[i].out_value)
if (cmd->fields[i].in_value)
type |= SCAN_IN;
if (cmd->fields[i].out_value)
@@
-166,9
+166,7
@@
int jtag_scan_size(const struct scan_command *cmd)
/* count bits in scan command */
for (i = 0; i < cmd->num_fields; i++)
/* count bits in scan command */
for (i = 0; i < cmd->num_fields; i++)
- {
bit_count += cmd->fields[i].num_bits;
bit_count += cmd->fields[i].num_bits;
- }
return bit_count;
}
return bit_count;
}
@@
-179,7
+177,7
@@
int jtag_build_buffer(const struct scan_command *cmd, uint8_t **buffer)
int i;
bit_count = jtag_scan_size(cmd);
int i;
bit_count = jtag_scan_size(cmd);
- *buffer = calloc(1,
CEIL
(bit_count, 8));
+ *buffer = calloc(1,
DIV_ROUND_UP
(bit_count, 8));
bit_count = 0;
bit_count = 0;
@@
-187,10
+185,8
@@
int jtag_build_buffer(const struct scan_command *cmd, uint8_t **buffer)
cmd->ir_scan ? "IRSCAN" : "DRSCAN",
cmd->num_fields);
cmd->ir_scan ? "IRSCAN" : "DRSCAN",
cmd->num_fields);
- for (i = 0; i < cmd->num_fields; i++)
- {
- if (cmd->fields[i].out_value)
- {
+ for (i = 0; i < cmd->num_fields; i++) {
+ if (cmd->fields[i].out_value) {
#ifdef _DEBUG_JTAG_IO_
char *char_buf = buf_to_str(cmd->fields[i].out_value,
(cmd->fields[i].num_bits > DEBUG_JTAG_IOZ)
#ifdef _DEBUG_JTAG_IO_
char *char_buf = buf_to_str(cmd->fields[i].out_value,
(cmd->fields[i].num_bits > DEBUG_JTAG_IOZ)
@@
-203,9
+199,7
@@
int jtag_build_buffer(const struct scan_command *cmd, uint8_t **buffer)
#endif
buf_set_buf(cmd->fields[i].out_value, 0, *buffer,
bit_count, cmd->fields[i].num_bits);
#endif
buf_set_buf(cmd->fields[i].out_value, 0, *buffer,
bit_count, cmd->fields[i].num_bits);
- }
- else
- {
+ } else {
DEBUG_JTAG_IO("fields[%i].out_value[%i]: NULL",
i, cmd->fields[i].num_bits);
}
DEBUG_JTAG_IO("fields[%i].out_value[%i]: NULL",
i, cmd->fields[i].num_bits);
}
@@
-213,7
+207,7
@@
int jtag_build_buffer(const struct scan_command *cmd, uint8_t **buffer)
bit_count += cmd->fields[i].num_bits;
}
bit_count += cmd->fields[i].num_bits;
}
- /
/DEBUG_JTAG_IO("bit_count totalling: %i", bit_count);
+ /
*DEBUG_JTAG_IO("bit_count totalling: %i", bit_count); */
return bit_count;
}
return bit_count;
}
@@
-227,15
+221,14
@@
int jtag_read_buffer(uint8_t *buffer, const struct scan_command *cmd)
/* we return ERROR_OK, unless a check fails, or a handler reports a problem */
retval = ERROR_OK;
/* we return ERROR_OK, unless a check fails, or a handler reports a problem */
retval = ERROR_OK;
- for (i = 0; i < cmd->num_fields; i++)
- {
+ for (i = 0; i < cmd->num_fields; i++) {
/* if neither in_value nor in_handler
* are specified we don't have to examine this field
*/
/* if neither in_value nor in_handler
* are specified we don't have to examine this field
*/
- if (cmd->fields[i].in_value)
- {
+ if (cmd->fields[i].in_value) {
int num_bits = cmd->fields[i].num_bits;
int num_bits = cmd->fields[i].num_bits;
- uint8_t *captured = buf_set_buf(buffer, bit_count, malloc(CEIL(num_bits, 8)), 0, num_bits);
+ uint8_t *captured = buf_set_buf(buffer, bit_count,
+ malloc(DIV_ROUND_UP(num_bits, 8)), 0, num_bits);
#ifdef _DEBUG_JTAG_IO_
char *char_buf = buf_to_str(captured,
#ifdef _DEBUG_JTAG_IO_
char *char_buf = buf_to_str(captured,
@@
-249,9
+242,7
@@
int jtag_read_buffer(uint8_t *buffer, const struct scan_command *cmd)
#endif
if (cmd->fields[i].in_value)
#endif
if (cmd->fields[i].in_value)
- {
buf_cpy(captured, cmd->fields[i].in_value, num_bits);
buf_cpy(captured, cmd->fields[i].in_value, num_bits);
- }
free(captured);
}
free(captured);
}
@@
-260,5
+251,3
@@
int jtag_read_buffer(uint8_t *buffer, const struct scan_command *cmd)
return retval;
}
return retval;
}
-
-