| |||
| Home > Handling Processor Exceptions > Single-channel DMA transfer | |||
The following examples show an interrupt handler that performs
interrupt driven I/O to memory transfers, soft DMA. The code is
an FIQ handler. It uses the banked FIQ registers to maintain state
between interrupts. This code is best situated at location 0x1C.
In the example code:
Points to the base address of the I/O device that data is read from.
Is the offset from the base address to the 32-bit data register that is read. Reading this register clears the interrupt.
Points to the memory location to where that data is being transferred.
Points to the last address to transfer to.
The entire sequence for handling a normal transfer is four instructions. Code situated after the conditional return is used to signal that the transfer is complete.
Example 39. FIQ handler
LDR R11, [R8, #IOData] ; Load port data from the IO device.
STR R11, [R9], #4 ; Store it to memory: update the pointer.
CMP R9, R10 ; Reached the end ?
SUBLSS pc, lr, #4 ; No, so return.
; Insert transfer complete
; code here.
Byte transfers can be made by replacing the load instructions with load byte instructions. Transfers from memory to an I/O device are made by swapping the addressing modes between the load instruction and the store instruction.