@Roger
I was looking at some board with STM32...RET6 and found this:
http://www.ebay.com/itm/Wang-STM32F103RET6-Camera-module-2-8-LCD-/220810051414That page has a link at the bottom to an example of using the OV7670 camera and dumping the image to the screen, with source code. I thought it may help you with that camera.
About the Sdcard with DMA, the first example of maple mini with DMA I looked at was an sdcard library by Pol Pla. I am sure it doesn't work right away, cause it had the channels swapped around for TX and RX, or the buffers, something was incorrect, but besides that may be almost functional.
What would you want to do with that onComplete function? is your intention that the DMATransfer function sets the DMA ISR to that onComplete function, so it is called once the DMA is finished, and returns back to the calling function immediately?
So far I have implemented the DMA ISRs within the library, so whoever is using them does not have to care if they use DMA or transfer a byte at a time. As for simplicity of use, I think that is easier. Call the SPITransfer with a buffer of certain length and don't worry how it is done.
Now, calling the DMA transfer and returning immediately allows you to execute other code, but you have to implement your onComplete function in the main sketch.
Now, what if instead we pass a pointer to a Boolean? if the DMA is active, the Boolean is set. If it is finished, the Boolean is false. The ISR can be coded in the library, but set to modify that variable by pointer.
That way also anyone can check if the DMA is complete, not just your sketch, but the DMA functions, even normal SPI transfers, can check if a DMA is active or not before trying to do something else with the SPI peripheral.