On Fri, Mar 25, 2011 at 4:29 PM, Spencer Oliver <s...@spen-soft.co.uk> wrote:
> On 25/03/2011 10:37, Drasko DRASKOVIC wrote:
>>
>> Obviausly, there is an inconsistency of mips_ejtag_fastdata_scan() in
>> the loop comparing to previous references - it is not preceded by
>> mips_ejtag_set_instr().
>
> This should not matter. The second call can be removed as the fastdata
> instruction is already selected in the tap.

I agree with you. But for some reason it meters for me. If I do not
put mips_ejtag_set_instr(ejtag_info, EJTAG_INST_FASTDATA) inside the
loop function fails with error :
mini program did not return to start.

And not only that. I also had to assure that PrAcc is "1" by putting
these lines inside the loop  :
/* wait PrAcc pending bit for FASTDATA write */
if ((retval = wait_for_pracc_rw(ejtag_info, &ejtag_ctrl)) != ERROR_OK)
   return retval

But this sounds more or less logical, because EJATG spec says explicitly :

As noted above, two conditions must be true for the Fastdata access to
succeed. These are:
• PrAcc must be 1, i.e., there must be a pending processor access.
• The Fastdata operation must use a valid Fastdata area address in the
dmseg segment (0xF..F20.0000 to
0xF..F20.000F).

But for this to work, wait_for_pracc_rw() had to be modified before,
as it contains useless and wrong while(1) loop, as we discussed
before.

So, when you take all of this into account, I am really surprised that
current implementation works for some people.

I think that FASTDATA loop in mips32_pracc_fastdata_xfer() :
for (i = 0; i < count; i++)
{
        /* Send the data out using fastdata (clears the access pending bit) */
        if ((retval = mips_ejtag_fastdata_scan(ejtag_info, write_t,
buf++)) != ERROR_OK)
                return retval;
}

should actually look like this :

for (i = 0; i < count; i++)
        {
                /* wait PrAcc pending bit for FASTDATA write */
                if ((retval = wait_for_pracc_rw(ejtag_info, &ejtag_ctrl)) != 
ERROR_OK)
                        return retval;

                /* Send the data out using fastdata (clears the access pending 
bit) */
                mips_ejtag_set_instr(ejtag_info, EJTAG_INST_FASTDATA);
                if ((retval = mips_ejtag_fastdata_scan(ejtag_info, write_t, 
buf++))
!= ERROR_OK)
                        return retval;
        }

and that sending of both start and end addresses before should be
preceded with corrected wait_for_pracc_rw(), as requested by the EJTAG
spec.

I am very concerned to submit the patch, having in mind that Andrew
and you confirm that the mips32_pracc_fastdata_xfer() works as it is
now in the git repo.

BR,
Drasko
_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to