I am studying Arm’s DMA pl330 controller. I found this code to work with this controller. In the end, everything works as it should, but I ran into a problem. I would like to configure DMA in MEM2MEM mode so that it does not increment the source address. i.e. I expect my array at the other end to be filled with the same values from the source. Logically, I just need to set the corresponding bit in the CCR register to zero and write it down. However, if I do this, then DMA will return the data_read_err error. Although, if I leave all the settings the same, but specify the increment of both addresses (source and target), everything works without errors. I don’t understand what the reason is. Could you help me?
I analyzed the code of the pl330_transfer_zeroes function and found no serious differences. In this function, the incrementing of the source address is disabled and the STZ command is used instead of the LD and ST commands and everything works. If I forcibly disable destination address incrementing, but I get an error again. I tried to repeat the example from the documentation on pl330 “fixed transfers” but it also returns an error. I’ve been digging around for almost a week to solve the problem and I can’t find anything on the Internet. Could you help me with this?