📄 main.asm
字号:
#include "defBF531.h"
#include "BF531_USB_Head.h"
#include "\d12\PDIUSBD12.h"
.global Rx0BufStartAddr,Tx0BufStartAddr;
//.global UsbRxBuf,UsbTxBuf;
.GLOBAL USBFrameIndex;
.global UsbAudioBuffer;
.global Ch1Vol,Ch2Vol,Ch3Vol,Ch4Vol;
.global Rx0_BufA,Rx0_BufB;
.global Tx0_BufA,Tx0_BufB;
.global OutPutGainTableForAllCh;
.global AudioFrameCnt;
.global BlinkCnt;
.global UsbABuf_RPtr,UsbABuf_RPtrPre,UsbABuf_RPtrPst;
.global UsbABuf_WPtr,UsbABuf_WPtrPre,UsbABuf_WPtrPst;
.global UsbABuf_RWPtrSamePage;
.global UsbABuf_WBeyondR_Distance;
.global _28ReservedByteBuffer;
///////////////////////////////
//D12
///////////////////////////////
.global UsbCtrlBuf;
.extern _SPORT0_RX_ISR;
.extern Init_Interrupts,AllPfLedBlink,Enable_DMA_Sport0;
.extern Init_Sport0,Init_FLG,MsDelay,Init_DMA_Sport0,Init_EBIU;
.extern Led0Tgl,Led0Off,Led0On;
.extern Led1Tgl,Led1Off,Led1On;
.extern Led2Tgl,Led2Off,Led2On;
.extern Led3Tgl,Led3Off,Led3On;
.extern CheckFx2Fifo;
.extern Get512BytesFromFx2;
.extern Write64BytesToFx2;
.extern _512USBByteStreamProcess;
.extern UsbOperationVarInit;
.extern InitD12;
.section SECTION_Data; //8bit width, total size: 16K Byte
//SPort DMA buffer
.align 4;
.byte2 Rx0_BufA[FrameLength*2*2]; //in sequence of PriL,SecL,PriR,SecR
.byte2 Rx0_BufB[FrameLength*2*2]; //in sequence of PriL,SecL,PriR,SecR
.byte2 Tx0_BufA[FrameLength*2*2]; //in sequence of PriL,SecL,PriR,SecR
.byte2 Tx0_BufB[FrameLength*2*2]; //in sequence of PriL,SecL,PriR,SecR
.align 4;
.byte4 Rx0BufStartAddr;
.byte4 Tx0BufStartAddr;
.byte4 AudioFrameCnt; //for SportDMA intr count, and LED blink
.byte4 USBFrameIndex; //to trace USB frame received
.byte4 UsbABuf_RPtr;
.byte4 UsbABuf_RPtrPre;
.byte4 UsbABuf_RPtrPst;
.byte4 UsbABuf_WPtr;
.byte4 UsbABuf_WPtrPre;
.byte4 UsbABuf_WPtrPst;
.byte4 UsbABuf_RWPtrSamePage=1;
.byte4 UsbABuf_WBeyondR_Distance;
.byte4 BlinkCnt;
.byte2 OutPutGainTableForAllCh[21]="outputgaintable.dat";
.byte2 Ch1Vol=0.1;
.byte2 Ch2Vol=0.2;
.byte2 Ch3Vol=0.3;
.byte2 Ch4Vol=0.4;
//.byte2 UsbRxBuf[512];
//.byte2 UsbTxBuf[64];
.align 4;
.byte2 UsbAudioBuffer[240*UsbAudioBufferSlotSize];
.byte2 _28ReservedByteBuffer[28];
.byte4 VarEndDataMem=0xffffffff;
///////////////////////////////
//D12
///////////////////////////////
.align 2;
.byte2 UsbCtrlBuf[64];
.byte2 IsBulkEPRxedData;
.section SECTION_Code1;
.global _main;
_main:
#ifdef SoftSimu
call UsbOperationVarInit;
call CheckFx2Fifo;
r0=1; //ZZZZZZZZZZZZZZZZZZZ
call Get512BytesFromFx2;
call _SPORT0_RX_ISR;
r0=1; //ZZZZZZZZZZZZZZZZZZZ
call Get512BytesFromFx2;
call _SPORT0_RX_ISR;
call _SPORT0_RX_ISR;
call _SPORT0_RX_ISR;
call _SPORT0_RX_ISR;
#endif
call Init_EBIU;
call Init_FLG;
//call AllPfLedBlink;
//call AllPfLedBlink;
call UsbOperationVarInit;
//all PF up
p0.l = lo(FIO_FLAG_D);
p0.h = hi(FIO_FLAG_D);
r1.l = 0xffff;
w[p0] = r1.l;
ssync;
//call ResetD12;
call InitD12;
call ReadChipID;
//call Init_Sport0;
//call Init_DMA_Sport0;
//call Init_Interrupts;
//call Enable_DMA_Sport0;
Mainloop:
//idle;
//call CheckFx2Fifo;
//call Get512BytesFromFx2;
call CheckD12Status;
CALL UsbServe;
p0.l=lo(IsBulkEPRxedData);
p0.h=hi(IsBulkEPRxedData);
r0.l=w[p0];
r0.h=0;
cc=r0==0;
if cc jump RxNoUsbBulkData;
//set IsBulkEPRxedData=0;
r0.l=0;
w[p0]=r0;
//WriteEndpoint(5,ByteCntRxedFromUsbEP,&UsbCtrlBuf);
p0.l=lo(bEndp);
p0.h=hi(bEndp);
r0=0x5;
[p0]=r0;
p0.l=lo(ByteCntRxedFromUsbEP);
p0.h=hi(ByteCntRxedFromUsbEP);
r0.l=w[p0];
r0.h=0;
p0.l=lo(bLen);
p0.h=hi(bLen);
[p0]=r0;
p0.l=lo(pBuf);
p0.h=hi(pBuf);
r0.l=lo(UsbCtrlBuf);
r0.h=hi(UsbCtrlBuf);
[p0]=r0;
call WriteEndpoint;
RxNoUsbBulkData:
/* p0.l=lo(UsbCtrlBuf);
p0.h=hi(UsbCtrlBuf);
r0=[p0];
cc=r0==0;
if !cc jump TurnOnLedD1;
p0.l=lo(FIO_FLAG_D);
p0.h=hi(FIO_FLAG_D);
r0.l=0xBF54;
w[p0]=r0;
jump LedOperationFinished;
TurnOnLedD1:
p0.l=lo(FIO_FLAG_D);
p0.h=hi(FIO_FLAG_D);
r0.l=0xAF54;
w[p0]=r0;*/
LedOperationFinished:
nop;nop;nop;nop;nop;
jump Mainloop;
_main.END:
CheckD12Status:
[ --SP ]=RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
//Check D12 INT_N pin status
p0.l=lo(FIO_FLAG_D);
p0.h=hi(FIO_FLAG_D);
r0.l=w[ p0 ];
r0.h=0;
r1.l=0xbfff;
r1.h=0;
r0=r0 | r1;
cc=r0==r1;
if !cc jump NoUsbTransfer;
/*
//delay for a while
[ --SP ]=lc0;
[ --SP ]=lt0;
[ --SP ]=lb0;
r0.l=20;
call MsDelay;
nop;nop;nop;
lb0=[ SP++ ];
lt0=[ SP++ ];
lc0=[ SP++ ];
//Check D12 INT_N pin status again
p0.l=lo(FIO_FLAG_D);
p0.h=hi(FIO_FLAG_D);
r0.l=w[ p0 ];
r0.h=0;
r1.l=0xBFFF;
r1.h=0;
r0=r0 | r1;
cc=r0==r1;
if !cc jump NoUsbTransfer;
*/
call UsbInterrupt;
NoUsbTransfer:
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS=[ SP++ ];
rts;
CheckD12Status.end:
UsbInterrupt:
[ --SP ]=RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
[ --SP ]=r1; //push r1
call ReadIntReg;
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0=[p0];
cc=r0==0;
if cc jump UsbInterrupt_Exit;
r1=D12_INT_BUSRESET;
r1=r0&r1;
cc=r1==0;
if cc jump Not_INT_BUSRESET;
//code for handling busreset
Not_INT_BUSRESET:
r1=D12_INT_EOT;
r1=r0&r1;
cc=r1==0;
if cc jump Not_INT_EOT;
//code for handling DMA end of transfer
Not_INT_EOT:
r1=D12_INT_SUSPENDCHANGE;
r1=r0&r1;
cc=r1==0;
if cc jump Not_INT_SUSPENDCHANGE;
//code for handling suspend status changed
Not_INT_SUSPENDCHANGE:
r1=D12_INT_ENDP0IN;
r1=r0&r1;
cc=r1==0;
if cc jump Not_D12_INT_ENDP0IN;
//code for handling endpoint0 In
call Ep0_TxDone;
Not_D12_INT_ENDP0IN:
r1=D12_INT_ENDP0OUT;
r1=r0&r1;
cc=r1==0;
if cc jump Not_D12_INT_ENDP0OUT;
//code for handling endpoint0 Out
call Ep0_RxDone;
Not_D12_INT_ENDP0OUT:
r1=D12_INT_ENDP1IN;
r1=r0&r1;
cc=r1==0;
if cc jump Not_D12_INT_ENDP1IN;
//code for handling endpoint1 In
call Ep1_TxDone;
Not_D12_INT_ENDP1IN:
r1=D12_INT_ENDP1OUT;
r1=r0&r1;
cc=r1==0;
if cc jump Not_D12_INT_ENDP1OUT;
//code for handling endpoint1 Out
call Ep1_RxDone;
//WriteEndpoint(3,ByteCntRxedFromUsbEP,&UsbCtrlBuf);
p0.l=lo(bEndp);
p0.h=hi(bEndp);
r0=0x3;
[p0]=r0;
p0.l=lo(ByteCntRxedFromUsbEP);
p0.h=hi(ByteCntRxedFromUsbEP);
r0.l=w[p0];
r0.h=0;
p0.l=lo(bLen);
p0.h=hi(bLen);
[p0]=r0;
p0.l=lo(pBuf);
p0.h=hi(pBuf);
r0.l=lo(UsbCtrlBuf);
r0.h=hi(UsbCtrlBuf);
[p0]=r0;
call WriteEndpoint;
Not_D12_INT_ENDP1OUT:
r1=D12_INT_ENDP2IN;
r1=r0&r1;
cc=r1==0;
if cc jump Not_D12_INT_ENDP2IN;
//code for handling endpoint2 In
call Ep2_TxDone;
Not_D12_INT_ENDP2IN:
r1=D12_INT_ENDP2OUT;
r1=r0&r1;
cc=r1==0;
if cc jump UsbInterrupt_Exit;
//code for handling endpoint2 Out
call Ep2_RxDone;
p0.l=lo(IsBulkEPRxedData);
p0.h=hi(IsBulkEPRxedData);
r0.l=1;
w[p0]=r0;
p0.l=lo(FIO_FLAG_T);
p0.h=hi(FIO_FLAG_T);
r0.l=0x1000;
w[p0]=r0.l;
UsbInterrupt_Exit:
r1=[ SP++ ]; //pop r1
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS=[ SP++ ];
rts;
UsbInterrupt.end:
UsbServe:
[ --SP ]=RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
[ --SP ]=r1; //push r1
p0.l=lo(SetupPacket);
p0.h=hi(SetupPacket);
r0=[p0];
cc=r0==1;
if !cc jump UsbServe_Exit;
r0=0;
[p0]=r0;
call Control_Handler;
UsbServe_Exit:
r1=[ SP++ ]; //pop r1
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS=[ SP++ ];
rts;
UsbServe.end:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -