Hmm, it seems strange that it returns an ACK_WAIT on the first try. It'll probably be a good idea to read the errata myself as well.
I will start experimenting today or tomorrow, but as of now I'm not sure how to get libswd up and running. Specifically I don't know how to tell it with which device to open for communication. Regards, Ákos On 13 March 2012 10:46, CeDeROM <cede...@tlen.pl> wrote: > Hey Akos! :-) > > It would be too beautiful to be that simple, reading DRW initiates memory > read operation and it always returns ACK=WAIT (see ADIv5), then we need to > clear the sticky errors otherwise we get FAULT ACK, then we should read > RDBUFF with read result. But: > 1. Polling READOK flag does not make sense it we need to read anything else > (CTRL/STAT) just after MEM-AP access. > 2. Writing to DP register discards MEM-AP operation. > 3. We need to reissue DRW read, it returns ACK=OK then (unless TAR has > changed due TAR autoincrement which might be dangerous in our case). > 4. We need to read memory vale from RDBUFF. > 5. It is also important to add dummy data phase on each ACK!=OK otherwise > protocol error occurs. > > This works for me, after dozens of trials. If you think this can be done > simpler show me and Im delighted to implement simpler and more cleear > solution :-) > > It is very important to create abstract solution in OpenOCD that will setup > transfer, perform transfer and handle potential errors then retry if > necessary. Program should not be left in unknown state or crash on error.. > > Best regards, > Tomek > > CeDeROM, SQ7MHZ, http://www.tomek.cedro.info > > On Mar 13, 2012 10:30 AM, "Akos Vandra" <axo...@gmail.com> wrote: >> >> Hi! >> >> I have just read through adiv5.1, and my understanding of the read >> operation is somewhat different: >> >> I understood that after you read DRW register, it should return an >> ACK_OK, with unpredictable data. And on the next read of the register >> (even with TAR changed) it returns the data of the previous read >> operation, and issues the next request on the bus. If you do not want >> to issue another read, just read the RDBUFF register of the DP >> >> So in order to read address 0x1234 and 0x5678, you: >> >> Set up mem-ap, tar = 0x1234 >> Read DRW, get an ACK_OK (let's presume the read takes a lot of time) >> set up mem-ap, tar=0x5678 >> Read DRW, get an ACK_WAIT (last read is still pending). >> Read DRW, get an ACK_WAIT (...) >> .... >> (Read completes) >> Read DRW, get an ACK_OK. Now the SW issues a read to 0x5678, and >> returns the data at address 0x1234. >> (Read completes fast) >> Read RDBUFF, get an ACK_OK with data at address 0x1234. >> >> With writes, you get an ACK_OK first, and then on the next write (if >> the previous completed) you might get an ACK_FAULT, but that is >> because the first write operation failed for some readon (for ex. >> peripheral was not powered on, and generated a bus fault). >> >> Please say how this sounds, I'll look up the exact chapter numbers in >> the docuementation, if needed. >> >> Regards, >> Ákos >> >> >> On 13 March 2012 09:40, CeDeROM <cede...@tlen.pl> wrote: >> > 2012/3/13 Sven Krauss <sven.kra...@web.de>: >> >> sorry for my long time of inactivity doe to other jobs. A while ago I >> >> send a >> >> patch making arm_adi_v5.c independent from transport layer. I created a >> >> third solution: >> >> To preserve the performance I changed the interface to the transport >> >> layer. >> >> Both, dap_queue_ap_write and dap_queue_ap_read gets a pointer to a data >> >> array not a single value. The adi_v5_jtag now implements the loop >> >> reading >> >> the registers via jtag transport layer. So other transports like SWD >> >> can >> >> implement it's own efficient method reading a register multiple times. >> > >> > Yes, double pointers (or pointers array as you state) are mandatory >> > when executing/operating on eqneueued elements from the past and when >> > we don't want to flush the queue on each read, I found that out too >> > :-) I have considered that, but I don't want to change the API unless >> > absolutely necessary, so I try to find some other solution first, if >> > not possible, we need to change the API slightly. >> > >> > Anyway, the pointers will increase the efficiency, while the main >> > problem right now is the error handling and retry by the OpenOCD >> > itself... I hope anyone will take the challenge and implement it in >> > OpenOCD, until then I am working on error handling and retry at the >> > libswd/transport level, which seems to be a circus, but also seems it >> > started to work recently :-) >> > >> > Best regards :-) >> > Tomek >> > >> > -- >> > CeDeROM, SQ7MHZ, http://www.tomek.cedro.info >> > >> > >> > ------------------------------------------------------------------------------ >> > Keep Your Developer Skills Current with LearnDevNow! >> > The most comprehensive online learning library for Microsoft developers >> > is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3, >> > Metro Style Apps, more. Free future releases when you subscribe now! >> > http://p.sf.net/sfu/learndevnow-d2d >> > _______________________________________________ >> > OpenOCD-devel mailing list >> > OpenOCD-devel@lists.sourceforge.net >> > https://lists.sourceforge.net/lists/listinfo/openocd-devel ------------------------------------------------------------------------------ Keep Your Developer Skills Current with LearnDevNow! The most comprehensive online learning library for Microsoft developers is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3, Metro Style Apps, more. Free future releases when you subscribe now! http://p.sf.net/sfu/learndevnow-d2d _______________________________________________ OpenOCD-devel mailing list OpenOCD-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openocd-devel