From ed9ac9b6fe3257bb728db059f4ae689fc5469fdd Mon Sep 17 00:00:00 2001 From: David Brownell Date: Thu, 5 Nov 2009 20:35:47 -0800 Subject: [PATCH] ARM926: more cleanup An init_target() wrapper isn't needed, and target_create() can shrink a bit. Add a header comment and some doxygen. Remove arm926ejs_catch_broken_irscan() which has been a NOP for quite a few months now, and in any case duplicates logic in the JTAG core to validate IR capture data. But force the capture mask to 0x0f, so those tests are most effective. Signed-off-by: David Brownell --- src/target/arm926ejs.c | 59 ++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 37 deletions(-) diff --git a/src/target/arm926ejs.c b/src/target/arm926ejs.c index 03adc774d..7147dbfd8 100644 --- a/src/target/arm926ejs.c +++ b/src/target/arm926ejs.c @@ -29,33 +29,22 @@ #include "target_type.h" +/* + * The ARM926 is built around the ARM9EJ-S core, and most JTAG docs + * are in the ARM9EJ-S Technical Reference Manual (ARM DDI 0222B) not + * the ARM926 manual (ARM DDI 0198E). The scan chains are: + * + * 1 ... core debugging + * 2 ... EmbeddedICE + * 3 ... external boundary scan (SoC-specific, unused here) + * 6 ... ETM + * 15 ... coprocessor 15 + */ + #if 0 #define _DEBUG_INSTRUCTION_EXECUTION_ #endif -static int arm926ejs_catch_broken_irscan(uint8_t *captured, void *priv, - scan_field_t *field) -{ - /* FIX!!!! this code should be reenabled. For now it does not check - * the queue...*/ - return 0; -#if 0 - /* The ARM926EJ-S' instruction register is 4 bits wide */ - uint8_t t = *captured & 0xf; - uint8_t t2 = *field->in_check_value & 0xf; - if (t == t2) - { - return ERROR_OK; - } - else if ((t == 0x0f) || (t == 0x00)) - { - LOG_DEBUG("caught ARM926EJ-S invalid Capture-IR result after CP15 access"); - return ERROR_OK; - } - return ERROR_JTAG_QUEUE_FAILED;; -#endif -} - #define ARM926EJS_CP15_ADDR(opcode_1, opcode_2, CRn, CRm) ((opcode_1 << 11) | (opcode_2 << 8) | (CRn << 4) | (CRm << 0)) static int arm926ejs_cp15_read(target_t *target, uint32_t op1, uint32_t op2, @@ -136,7 +125,7 @@ static int arm926ejs_cp15_read(target_t *target, uint32_t op1, uint32_t op2, LOG_DEBUG("addr: 0x%x value: %8.8x", address, *value); #endif - arm_jtag_set_instr(jtag_info, 0xc, &arm926ejs_catch_broken_irscan); + arm_jtag_set_instr(jtag_info, 0xc, NULL); return ERROR_OK; } @@ -227,7 +216,7 @@ static int arm926ejs_cp15_write(target_t *target, uint32_t op1, uint32_t op2, LOG_DEBUG("addr: 0x%x value: %8.8x", address, value); #endif - arm_jtag_set_instr(jtag_info, 0xf, &arm926ejs_catch_broken_irscan); + arm_jtag_set_instr(jtag_info, 0xf, NULL); return ERROR_OK; } @@ -543,6 +532,7 @@ static int arm926ejs_get_arch_pointers(target_t *target, return ERROR_OK; } +/** Logs summary of ARM926 state for a halted target. */ int arm926ejs_arch_state(struct target_s *target) { armv4_5_common_t *armv4_5 = target->arch_info; @@ -644,6 +634,7 @@ int arm926ejs_soft_reset_halt(struct target_s *target) return target_call_event_callbacks(target, TARGET_EVENT_HALTED); } +/** Writes a buffer, in the specified word size, with current MMU settings. */ int arm926ejs_write_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer) { @@ -732,14 +723,6 @@ static int arm926ejs_read_phys_memory(struct target_s *target, return armv4_5_mmu_read_physical(target, &arm926ejs->armv4_5_mmu, address, size, count, buffer); } -static int arm926ejs_init_target(struct command_context_s *cmd_ctx, - struct target_s *target) -{ - arm9tdmi_init_target(cmd_ctx, target); - - return ERROR_OK; -} - int arm926ejs_init_arch_info(target_t *target, arm926ejs_common_t *arm926ejs, jtag_tap_t *tap) { @@ -782,9 +765,10 @@ static int arm926ejs_target_create(struct target_s *target, Jim_Interp *interp) { arm926ejs_common_t *arm926ejs = calloc(1,sizeof(arm926ejs_common_t)); - arm926ejs_init_arch_info(target, arm926ejs, target->tap); + /* ARM9EJ-S core always reports 0x1 in Capture-IR */ + target->tap->ir_capture_mask = 0x0f; - return ERROR_OK; + return arm926ejs_init_arch_info(target, arm926ejs, target->tap); } static int arm926ejs_handle_cp15_command(struct command_context_s *cmd_ctx, @@ -915,6 +899,7 @@ static int arm926ejs_mmu(struct target_s *target, int *enabled) return ERROR_OK; } +/** Registers commands to access coprocessor, cache, and debug resources. */ int arm926ejs_register_commands(struct command_context_s *cmd_ctx) { int retval; @@ -938,6 +923,7 @@ int arm926ejs_register_commands(struct command_context_s *cmd_ctx) return retval; } +/** Holds methods for ARM926 targets. */ target_type_t arm926ejs_target = { .name = "arm926ejs", @@ -972,7 +958,7 @@ target_type_t arm926ejs_target = .register_commands = arm926ejs_register_commands, .target_create = arm926ejs_target_create, - .init_target = arm926ejs_init_target, + .init_target = arm9tdmi_init_target, .examine = arm9tdmi_examine, .virt2phys = arm926ejs_virt2phys, .mmu = arm926ejs_mmu, @@ -982,4 +968,3 @@ target_type_t arm926ejs_target = .mrc = arm926ejs_mrc, .mcr = arm926ejs_mcr, }; -