summaryrefslogtreecommitdiff
path: root/arm7/lib/src/MI_dma.c
blob: fc2ff0c9ad30762cac4b86af9a014ad6c8c90393 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include "function_target.h"
#include "MI_dma.h"
#include "OS_system.h"

ARM_FUNC void MI_WaitDma(u32 channel) {
    OSIntrMode mode = OS_DisableInterrupts();
    vu32 * addr = (vu32 *)(REG_ADDR_DMA0SAD + (channel * 3 + 2) * 4);
    while(addr[0] & 0x80000000) ;
    if (channel == 0) {
        addr = (vu32 *)(REG_ADDR_DMA0SAD + channel * 12);
        addr[0] = 0;
        addr[1] = 0;
        addr[2] = 0x81400001;
    }
    mode = OS_RestoreInterrupts(mode);
}

ARM_FUNC void MI_StopDma(u32 channel) {
    OSIntrMode mode = OS_DisableInterrupts();
    vu16 * addr = (vu16 *)(REG_ADDR_DMA0SAD + (channel * 6 + 5) * 2);
    addr[0] &= ~(DMA_START_MASK | DMA_REPEAT);
    addr[0] &= ~DMA_ENABLE;
    {
        s32 dummy = addr[0];
    }
    {
        s32 dummy = addr[0];
    }
    if (channel == 0) {
        vu32 * addr32 = (vu32 *)(REG_ADDR_DMA0SAD + channel * 12);
        addr32[0] = 0;
        addr32[1] = 0;
        addr32[2] = 0x81400001;
    }
    mode = OS_RestoreInterrupts(mode);
}