On Friday 16 October 2009, Øyvind Harboe wrote:
> On Wed, Oct 14, 2009 at 7:03 PM, David Brownell <davi...@pacbell.net> wrote:
> > On Tuesday 13 October 2009, Øyvind Harboe wrote:
> >> > So I'd think the current code is behaving, modulo issues
> >> > you might have with iMX31 ...
> >>
> >> The currrent code target/arm11* code doesn't assert srst,
> >> it just issues a halt during assert.
> >
> > A quick skim of the docs suggests the right way to get a
> > halt after SRST involves setting halt mode, then setting
> > the reset bit in the vector catch hardware.
> 
> Patch anyone? :-) I've got iMX31 hardware to test on. I tried
> this quickly, but it didn't work first try...

See the appended ...  SRST is working just fine, despite the
comments in the current code.  I think iMX31 must have a few
quirks in that space.

The vector catch is a bit dicey, but I've seen that fire too.
The only caveats for now:  (a) use the "reset-assert" code
to reset, not SRST, and (b) lower the JTAG clock, since it
really does catch reset very early ... before kicking in the
PLLs that allow faster clocking!!

- Dave


================== CUT HERE
Teach ARM11 how to use:

 - the new "reset-assert" event
 - vector catch to implement "reset halt"
 - use SRST more like other cores do.

Tested on OMAP2420, where vector catch seems to work ok with the
reset-assert case, but not SRST ... not clear what's up with that.

> reset halt
...
Debug entry: VCR vector catch
target state: halted
target halted in ARM state due to breakpoint, current mode: Supervisor
cpsr: 0x000001d3 pc: 0x00000000
> 

If using SRST, it just warns that it didn't halt soon enough.
---
 src/target/arm11.c |   65 ++++++++++++++++++++++++++++++++-------------------
 1 file changed, 41 insertions(+), 24 deletions(-)

--- a/src/target/arm11.c
+++ b/src/target/arm11.c
@@ -819,27 +819,41 @@ static int arm11_step(struct target *tar
 
 static int arm11_assert_reset(struct target *target)
 {
-       int retval;
        struct arm11_common *arm11 = target_to_arm11(target);
 
-       retval = arm11_check_init(arm11, NULL);
-       if (retval != ERROR_OK)
-               return retval;
+       /* FIXME when halt is requested, make it work somehow... */
 
-       target->state = TARGET_UNKNOWN;
+       /* optionally catch reset vector */
+       if (target->reset_halt && !(arm11_vcr & 1))
+               arm11_sc7_set_vcr(arm11, arm11_vcr | 1);
 
-       /* we would very much like to reset into the halted, state,
-        * but resetting and halting is second best... */
-       if (target->reset_halt)
-       {
-               CHECK_RETVAL(target_halt(target));
+       /* Issue some kind of warm reset. */
+       if (target_has_event_action(target, TARGET_EVENT_RESET_ASSERT)) {
+               target_handle_event(target, TARGET_EVENT_RESET_ASSERT);
+       } else if (jtag_get_reset_config() & RESET_HAS_SRST) {
+               /* REVISIT handle "pulls" cases, if there's
+                * hardware that needs them to work.
+                */
+               jtag_add_reset(0, 1);
+       } else {
+               LOG_ERROR("%s: how to reset?", target_name(target));
+               return ERROR_FAIL;
        }
 
+       /* registers are now invalid */
+       register_cache_invalidate(arm11->arm.core_cache);
+
+       target->state = TARGET_RESET;
+
+       return ERROR_OK;
+}
 
        /* srst is funny. We can not do *anything* else while it's asserted
         * and it has unkonwn side effects. Make sure no other code runs
         * meanwhile.
         *
+        * (That's not true on OMAP2 chips; maybe an iMX3* series bug?)
+        *
         * Code below assumes srst:
         *
         * - Causes power-on-reset (but of what parts of the system?). Bug
@@ -860,26 +874,29 @@ static int arm11_assert_reset(struct tar
         * state?
         */
 
-       jtag_add_reset(0, 1);
-       jtag_add_reset(0, 0);
+static int arm11_deassert_reset(struct target *target)
+{
+       struct arm11_common *arm11 = target_to_arm11(target);
+       int retval;
 
-       /* How long do we have to wait? */
-       jtag_add_sleep(5000);
+       /* be certain SRST is off */
+       jtag_add_reset(0, 0);
 
-       /* un-mess up TAP state */
-       jtag_add_tlr();
+       retval = arm11_poll(target);
 
-       retval = jtag_execute_queue();
-       if (retval != ERROR_OK)
-       {
-               return retval;
+       if (target->reset_halt) {
+               if (target->state != TARGET_HALTED) {
+                       LOG_WARNING("%s: ran after reset and before halt ...",
+                                       target_name(target));
+                       if ((retval = target_halt(target)) != ERROR_OK)
+                               return retval;
+               }
        }
 
-       return ERROR_OK;
-}
+       /* restore vector catch config */
+       if (target->reset_halt && !(arm11_vcr & 1))
+               arm11_sc7_set_vcr(arm11, arm11_vcr);
 
-static int arm11_deassert_reset(struct target *target)
-{
        return ERROR_OK;
 }
 
_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to