Although I am very familiar with many types of high speed USB peripheral and OTG controllers, as I read more and more about CPPI, I'm realizing there are some definite holes. As you can tell from these questions, I'm completely unfamiliar with the type of API CPPI is presenting and have no idea how to use it. I'm also pretty unfamiliar with USB Host design, so probably there are things in the CPPI which are extremely useful for hosts that are confusing me. The questions below only really scratch the surface, but I'm hoping that the answers might trigger some epiphanies. The USB interface for the Mentor controller seems very familiar (although I have one question below on this.)
My interest is entirely for peripheral operation.
Referring to SPRUFM9B
1. For the CPPI packet descriptors, USB specific data, Sec 2.8.2 gives the layout, but there is no information on the Packet Information Word 0/1. How these are used, what the format is. From User Case 4 (Sec 3.4), you can kinda figure it out, but there is no formal documentation on these words. It's not even really clear how to use CPPI for host vs peripheral mode differs, although the example seems to be for a peripheral.
2. I'm having trouble finding documentation on various Qs and prioritization. Basically 2.8.8.2 is very cursory and really gives very little information on the scheduler, and again, not a lot of information on the format of the data structures and usage, excepting Example 2 in the Sec 3.1. What is a "credit" when referring to the scheduler?
3. I'd like more information on teardown. Does this happen automatically for USB initiated resets? Is this really important for the USB implementation? Why is there such a thing as teardown packets (Sec 2.8.4) when this functionality seems to be controlled by a register (See 4.70, TX_TEARDOWN bit, as well as two others indicated in 2.8.4)
4. Is there a reason that all the data buffers in all the examples are limited to 256 bytes? Is this to show buffer linking? Sec 2.8.1 seems to indicate that buffers can be up to 4Mbyte.
5. What is the purpose of having multiple Queues per TX channel? The example makes it appear that this is specified as per Sec 4.70, but 4.70 makes it look like this is for some special "teardown" descriptor use? Is this a typo? I am also very confused by the comment in Sec 2.8.12.1, Step 1.4.
6. In 4.71, Table 83 says that the default receive Q can be overridden by the CPPI FIFO data block. What is the CPPI FIFO Data block?
7. For the linking RAM (Sec 4.82-84), Region 1 doesn't seem to have a size register? In fact, what is the purpose of setting up memory regions at all? When you push a buffer descriptor pointer onto a Q, you include a pointer to the descriptor and size of the descriptor onto the Q (Sec 4.90). It seems the host is responsible for doing the descriptor memory management, so I'm not sure why the queue manager needs this info at all.
8. For the Mentor controller, is there any limitation between when an INDEXed registers (0x410-0x41F) and non-INDEXed register are used (0x510-0x53A). There must be at least some kind of warning against using both simultaneously in multi-threaded code. (I can't think of why you would want to do that, but I'd expect the datasheet to mention it anyway). Are there any limitations to accessing different non-indexed endpoint status or FIFOs simultaneously?
Thanks for any help with all this...