📄 uart_dma.asm
字号:
#include "defBF533.h"
.GLOBAL _UART_DMA_INI;
.GLOBAL _UART_DMA_EN;
.global _uart_dma_stop;
.section L1_data_b;
.align 4;
.global uart_dma_queue;
uart_dma_queue:
.byte4 _uart_dma_queue[4*8];
uart_dma_queue.end:
.extern _tx_buffer;
.section L1_code;
//void UART_DMA_INT(void);
_UART_DMA_INI:
[--sp] = (r7:4, p5:3);
[--sp] = rets;
p0.h = hi(DMA7_NEXT_DESC_PTR);
p0.l = lo(DMA7_NEXT_DESC_PTR);
r0 = 3(z);
w[p0+DMA7_IRQ_STATUS-DMA7_NEXT_DESC_PTR] = r0; //clear DMA_DONE and DMA_ERR bits
r0.l = _uart_dma_queue;
r0.h = _uart_dma_queue;
i0 = r0;
// changed on 2007-07-18
// r1.l = _tx_buffer; //next descriptor address;
// r1.h = _tx_buffer;
p2.l = _tx_buffer;
p2.h = _tx_buffer;
r1 = [p2];
r2.l = 0;
r2.h = 4; //buffer address modifier
r3.l = 0x6811; //config
r4.l = 0; //xcont,64k;
r4.h = 1; //xmod
r5.l = 4; //ycont, 4;
r5.h = 1; //ymod
p1 = 7(z);
[--sp] = r0;
r0 += 16;
lsetup(set_dma_array_s, set_dma_array_e) lc0 = p1;
set_dma_array_s:
w[i0++] = r0.l;
w[i0++] = r1.l;
w[i0++] = r1.h;
w[i0++] = r3.l;
w[i0++] = r4.l;
w[i0++] = r4.h;
w[i0++] = r5.l;
w[i0++] = r5.h;
r0 += 16;
set_dma_array_e:
r1 = r1 + r2;
r0 = [sp++]; //dma chain;
w[i0++] = r0.l;
w[i0++] = r1.l;
w[i0++] = r1.h;
w[i0++] = r3.l;
w[i0++] = r4.l;
w[i0++] = r4.h;
w[i0++] = r5.l;
w[i0++] = r5.h;
[p0+DMA7_NEXT_DESC_PTR- DMA7_NEXT_DESC_PTR] = r0;
ssync;
w[p0+DMA7_CONFIG-DMA7_NEXT_DESC_PTR] = r3;
SSYNC;
rets = [sp++];
(r7:4, p5:3) = [sp++];
_UART_DMA_INI.END:
RTS;
//void uart_dma_stop(int block_index);
_uart_dma_stop:
[--sp] = (r7:4, p5:3);
[--sp] = rets;
r1.l = _uart_dma_queue;
r1.h = _uart_dma_queue;
r0 <<= 4;
r0 = r0 + r1;
r0 += 6; //config offset
p0 = r0;
r0.l = 0x0011;
w[p0] = r0;
rets = [sp++];
(r7:4, p5:3) = [sp++];
_uart_dma_stop.end:
rts;
_UART_DMA_EN:
p0.h = hi(DMA7_NEXT_DESC_PTR);
p0.l = lo(DMA7_NEXT_DESC_PTR);
r1 = 0x1081;
w[p0+DMA7_CONFIG-DMA7_NEXT_DESC_PTR] = r1;
SSYNC;
_UART_DMA_EN.END:
RTS;
.global _uart_en;
_uart_en:
p0.l = lo(UART_GCTL);
p0.h = hi(UART_GCTL);
r0 = w[p0+UART_LCR-UART_GCTL](z);
r1.l = 0x7fff;
r1 = r0&r1;
w[p0+UART_LCR-UART_GCTL] = r1;
ssync;
r1 = 2(z);
w[p0+UART_IER - UART_GCTL] = r1;
ssync;
_uart_en.end:
rts;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -