📄 csl_dat_.sa
字号:
;All done so go to procedure exit code
B DAT_COPY_RETURN
DAT_COPY_8:
;Must be 8-bit aligned since it wasn't 32 or 16 bit aligned
;Store transfer count
STW byteCnt,*dmaBase[XFRCNT]
;Store primary control register
MVKL 0x00000251,Y
MVKH 0x00000251,Y
OR Y,initPrictl,Y
STW Y,*dmaBase[PRICTL]
DAT_COPY_RETURN:
;Restore GIE
MVC CSR,X
OR X,gieSave,X
MVC X,CSR
.return id
.endproc
*------------------------------------------------------------------------------*
* Uint32 DAT_copy2d(Uint32 type, void *src, void *dst, Uint16 lineLen,
* Uint16 lineCnt, Uint16 linePitch);
*------------------------------------------------------------------------------*
_DAT_copy2d .cproc type, src, dst, lineLen, lineCnt, linePitch
.reg gieSave
.reg X,Y
.reg const31
.reg stateAddr
.reg useMask
.reg slotNumber
.reg serialNumber
.reg tableAddr
.reg oldSerialNumber
.reg pred
.reg mask
.reg irfReg
.reg id
.reg alignment
.reg dmaBase
.reg initPrictl
.reg gblcntAddr
.reg gblidxAddr
;Load useMask an Initial primary control
;register from state structure
MVKL __DAT_stateStruct,stateAddr
MVKH __DAT_stateStruct,stateAddr
LDW *stateAddr(State.useMask),useMask
LDW *stateAddr(State.initPrictl),initPrictl
LDW *stateAddr(State.gblcntAddr),gblcntAddr
LDW *stateAddr(State.gblidxAddr),gblidxAddr
;Constant needed later
MVK 31,const31
DAT_COPY2D_LOOP1:
;Wait for a free slot to open up
MVC IFR,irfReg
AND irfReg,useMask,X
LMBD 1,X,X
SUB const31,X,slotNumber
CMPEQ slotNumber,-1,pred
[pred] B DAT_COPY2D_LOOP1
;Save and clear GIE
MVC CSR,X
AND X,1,gieSave
AND X,-2,X
MVC X,CSR
;Generate mask from slot number
MVK 1,mask
SHL mask,slotNumber,mask
;Clear interrupt pending flag
MVC mask,ICR
;Load up serial number table address
MVKL __DAT_serialTable,tableAddr
MVKH __DAT_serialTable,tableAddr
LDHU *tableAddr[slotNumber],oldSerialNumber
;Add one to serial numer and store it back into the table
ADD oldSerialNumber,1,serialNumber
STH serialNumber,*tableAddr[slotNumber]
;Construct transfer id from serial number and slot number
SHL serialNumber,16,id
OR id,slotNumber,id
;Load up base address of DMA registers
LDW *stateAddr(State.baseAddr),dmaBase
;Store zero into DMA primary control register
MVKL 0x00000000,X
MVKH 0x00000000,X
STW X,*dmaBase[PRICTL]
;Store source address
STW src,*dmaBase[SRC]
;Store destination address
STW dst,*dmaBase[DST]
;Store secondary control register
MVKL 0x0000A080,Y
MVKH 0x0000A080,Y
STW Y,*dmaBase[SECCTL]
;Calculate argument alignment
OR src,dst,alignment
OR lineLen,alignment,alignment
OR linePitch,alignment,alignment
AND alignment,3,alignment
DAT_COPY2D_32:
;Check to see if 32-bit aligned, branch if not
CMPEQ alignment,0,pred
[!pred] B DAT_COPY2D_16
;Store global index reload register
;((linePitch-lineLen+4)<<16)|4
SUB linePitch,lineLen,X
ADD X,4,X
SHL X,16,X
OR X,4,X
STW X,*gblidxAddr[0]
;Store transfer count and reload (lineCnt<<16)|(lineLen>>2)
SHL lineCnt,16,Y
SHRU lineLen,2,X
OR X,Y,X
STW X,*dmaBase[XFRCNT]
STW X,*gblcntAddr[0]
;Store primary control register
MVKL 0x00000001,Y
MVKH 0x00000001,Y
OR Y,initPrictl,Y
OR Y,type,Y
STW Y,*dmaBase[PRICTL]
;All done so go to procedure exit code
B DAT_COPY2D_RETURN
DAT_COPY2D_16:
;Check to see if 16-bit aligned, branch if not
CMPEQ alignment,2,pred
[!pred] B DAT_COPY2D_8
;Store global index reload register
;((linePitch-lineLen+2)<<16)|2
SUB linePitch,lineLen,X
ADD X,2,X
SHL X,16,X
OR X,2,X
STW X,*gblidxAddr[0]
;Store transfer count and reload (lineCnt<<16)|(lineLen>>1)
SHL lineCnt,16,Y
SHRU lineLen,1,X
OR X,Y,X
STW X,*dmaBase[XFRCNT]
STW X,*gblcntAddr[0]
;Store primary control register
MVKL 0x00000101,Y
MVKH 0x00000101,Y
OR Y,initPrictl,Y
OR Y,type,Y
STW Y,*dmaBase[PRICTL]
;All done so go to procedure exit code
B DAT_COPY2D_RETURN
DAT_COPY2D_8:
;Must be 8-bit aligned since it wasn't 32 or 16 bit aligned
;Store global index reload register
;((linePitch-lineLen+1)<<16)|1
SUB linePitch,lineLen,X
ADD X,1,X
SHL X,16,X
OR X,1,X
STW X,*gblidxAddr[0]
;Store transfer count and reload (lineCnt<<16)|(lineLen)
SHL lineCnt,16,X
OR X,lineLen,X
STW X,*dmaBase[XFRCNT]
STW X,*gblcntAddr[0]
;Store primary control register
MVKL 0x00000201,Y
MVKH 0x00000201,Y
OR Y,initPrictl,Y
OR Y,type,Y
STW Y,*dmaBase[PRICTL]
DAT_COPY2D_RETURN:
;Restore GIE
MVC CSR,X
OR X,gieSave,X
MVC X,CSR
.return id
.endproc
*------------------------------------------------------------------------------*
.endif ;DMA_SUPPORT
.if EDMA_SUPPORT
********************************************************************************
* EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT
* EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT
* EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT
* EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT
* EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT
* EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT
* EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT
* EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT
* EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT
* EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT
* EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT
* EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT EDMA_SUPPORT
********************************************************************************
;QDMA register offsets
OPT .set 8
SRC .set 1
CNT .set 2
DST .set 3
IDX .set 4
;state structure, must match that in the C file
State .struct
useMask .word
baseAddr .word
initOpt .word
.endstruct
*------------------------------------------------------------------------------*
* void DAT_wait(Uint32 id);
*------------------------------------------------------------------------------*
_DAT_wait .cproc id
.reg gieSave
.reg X
.reg slotNumber
.reg serialNumber
.reg tableAddr
.reg oldSerialNumber
.reg pred
.reg mask
.reg cipr
.reg ciprAddr
.reg stateAddr
.reg useMask
;first let's check to see if this is the magic wait-for-all ID
CMPEQ id,-1,pred
[!pred] B DAT_WAIT_NORMAL
;at this point, the ID is the wait-for-all magic id
;this means we have to wait for ALL tranfers to complete
;Load useMask
MVKL __DAT_stateStruct,stateAddr
MVKH __DAT_stateStruct,stateAddr
LDW *stateAddr(State.useMask),useMask
MVKL 0x01A0FFE4,ciprAddr
MVKH 0x01A0FFE4,ciprAddr
ZERO pred
DAT_WAIT_LOOP0:
;Wait until all mask bits appears in the CIPR
[!pred] LDW *ciprAddr,cipr
AND useMask,cipr,X
CMPEQ useMask,X,pred
[!pred] B DAT_WAIT_LOOP0
B DAT_WAIT_RETURN
DAT_WAIT_NORMAL:
;Extract slot number and serial number from id
; MVKL 0x000000FF,X
; MVKH 0x000000FF,X
; AND id,X,slotNumber
EXTU id,24,24,slotNumber
SHRU id,16,serialNumber
;Load old serial number from table
MVKL __DAT_serialTable,tableAddr
MVKH __DAT_serialTable,tableAddr
LDHU *tableAddr[slotNumber],oldSerialNumber
;If the serial numbers don't match then return
CMPEQ serialNumber,oldSerialNumber,pred
[!pred] B DAT_WAIT_RETURN
;Generate CIPR mask from slot number (mask = 1<<slotNumber)
MVK 1,mask
SHL mask,slotNumber,mask
MVKL 0x01A0FFE4,ciprAddr
MVKH 0x01A0FFE4,ciprAddr
ZERO pred
DAT_WAIT_LOOP1:
;Wait until the mask bit appears in the CIPR
[!pred] LDW *ciprAddr,cipr
AND mask,cipr,pred
[!pred] B DAT_WAIT_LOOP1
DAT_WAIT_RETURN:
.return
.endproc
*------------------------------------------------------------------------------*
* int DAT_busy(Uint32 id);
*------------------------------------------------------------------------------*
_DAT_busy .cproc id
.reg gieSave
.reg X
.reg slotNumber
.reg serialNumber
.reg tableAddr
.reg oldSerialNumber
.reg pred
.reg mask
.reg cipr
.reg ciprAddr
.reg busyFlag
;clear the busy flag
ZERO busyFlag
;Extract slot number and serial number from id
MVKL 0x000000FF,X
MVKH 0x000000FF,X
AND id,X,slotNumber
SHRU id,16,serialNumber
;Load old serial number from table
MVKL __DAT_serialTable,tableAddr
MVKH __DAT_serialTable,tableAddr
LDHU *tableAddr[slotNumber],oldSerialNumber
;If the serial numbers don't match then return
CMPEQ serialNumber,oldSerialNumber,pred
[!pred] B DAT_BUSY_RETURN
;Generate CIPR mask from slot number (mask = 1<<slotNumber)
MVK 1,mask
SHL mask,slotNumber,mask
MVKL 0x01A0FFE4,ciprAddr
MVKH 0x01A0FFE4,ciprAddr
;check to see if the mask bit appears in the CIPR
LDW *ciprAddr,cipr
AND mask,cipr,pred
[pred] B DAT_BUSY_RETURN
;the mask bit didn't appear, hence the slot is busy
ADD busyFlag,1,busyFlag
DAT_BUSY_RETURN:
.return busyFlag
.endproc
*------------------------------------------------------------------------------*
* Uint32 DAT_fill(void *dst , Uint16 byteCnt, Uint32 *value);
*------------------------------------------------------------------------------*
_DAT_fill .cproc dst, byteCnt, value
.reg gieSave
.reg X,Y
.reg const31
.reg stateAddr
.reg useMask
.reg slotNumber
.reg serialNumber
.reg tableAddr
.reg oldSerialNumber
.reg pred
.reg mask
.reg cipr
.reg id
.reg alignment
.reg qdmaBase
.reg initOpt
.reg ciprAddr
;Load useMask and Initial primary control register
MVKL __DAT_stateStruct,stateAddr
MVKH __DAT_stateStruct,stateAddr
LDW *stateAddr(State.useMask),useMask
LDW *stateAddr(State.initOpt),initOpt
;Constant needed later
MVK 31,const31
MVKL 0x01A0FFE4,ciprAddr
MVKH 0x01A0FFE4,ciprAddr
ZERO pred
DAT_FILL_LOOP1:
;Wait for a free slot to open up
[!pred] LDW *ciprAddr,cipr
AND cipr,useMask,pred
[!pred] B DAT_FILL_LOOP1
LMBD 1,pred,X
SUB const31,X,slotNumber
;Save and clear GIE
MVC CSR,X
AND X,1,gieSave
AND X,-2,X
MVC X,CSR
;Generate mask from slot number
MVK 1,mask
SHL mask,slotNumber,mask
;Clear interrupt pending flag
STW mask,*ciprAddr
;Load up serial number table address
MVKL __DAT_serialTable,tableAddr
MVKH __DAT_serialTable,tableAddr
LDHU *tableAddr[slotNumber],oldSerialNumber
;Add one to serial numer and store it back into the table
ADD oldSerialNumber,1,serialNumber
STH serialNumber,*tableAddr[slotNumber]
;Construct transfer id from serial number and slot number
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -