⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csl_dat_.sa

📁 基于TI 6416DSP 的USB读写程序
💻 SA
📖 第 1 页 / 共 3 页
字号:
               SHL   serialNumber,16,id
               OR    id,slotNumber,id

               ;Load up base address of DMA registers
               LDW   *stateAddr(State.baseAddr),qdmaBase

               ;Store source address
               STW   value,*qdmaBase[SRC]

               ;Store destination address
               STW   dst,*qdmaBase[DST]

               ;store index
;              MVKL  0x00000000,Y
;              MVKH  0x00000000,Y
               ZERO  Y
               STW   Y,*qdmaBase[IDX]

               ;Calculate argument alignment
               OR    dst,byteCnt,alignment
               OR    value,alignment,alignment
               AND   alignment,3,alignment

DAT_FILL_32:
               ;Check to see if 32-bit aligned, branch if not
               CMPEQ alignment,0,pred
       [!pred] B     DAT_FILL_16

               ;Store transfer count
               SHRU  byteCnt,2,X
               STW   X,*qdmaBase[CNT]

               ;Store option register into pseudo space to kick off transfer
               MVKL  0x00200000,Y
               MVKH  0x00200000,Y
               SHL   slotNumber,16,X
               OR    X,Y,Y
               OR    Y,initOpt,Y
               STW   Y,*qdmaBase[OPT]

               ;All done so go to procedure exit code
               B     DAT_FILL_RETURN

DAT_FILL_16:
               ;Check to see if 16-bit aligned, branch if not
               CMPEQ alignment,2,pred
       [!pred] B     DAT_FILL_8

               ;Store transfer count
               SHRU  byteCnt,1,X
               STW   X,*qdmaBase[CNT]

               ;Store option register into pseudo space to kick off transfer
               MVKL  0x08200000,Y
               MVKH  0x08200000,Y
               SHL   slotNumber,16,X
               OR    X,Y,Y
               OR    Y,initOpt,Y
               STW   Y,*qdmaBase[OPT]

               ;All done so go to procedure exit code
               B     DAT_FILL_RETURN

DAT_FILL_8:
               ;Must be 8-bit aligned since it wasn't 32 or 16 bit aligned

               ;Store transfer count
               STW   byteCnt,*qdmaBase[CNT]

               ;Store option register into pseudo space to kick off transfer
               MVKL  0x10200000,Y
               MVKH  0x10200000,Y
               SHL   slotNumber,16,X
               OR    X,Y,Y
               OR    Y,initOpt,Y
               STW   Y,*qdmaBase[OPT]

DAT_FILL_RETURN:
               ;Restore GIE
               MVC   CSR,X
               OR    X,gieSave,X
               MVC   X,CSR

               .return id
               .endproc

*------------------------------------------------------------------------------*
* Uint32 DAT_copy(void *src , void *dst , Uint16 byteCnt);
*------------------------------------------------------------------------------*
_DAT_copy .cproc src, dst, byteCnt

               .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
;               MVK   1, pred
;DAT_COPY_LOOP1:
;               ;Wait for a free slot to open up
;       [pred]  LDW   *ciprAddr,cipr
;               AND   cipr,useMask,X
;               LMBD  1,X,X
;               SUB   const31,X,slotNumber
;               CMPEQ slotNumber,-1,pred
;       [pred]  B     DAT_COPY_LOOP1

               ZERO  pred
DAT_COPY_LOOP1:
               ;Wait for a free slot to open up
       [!pred] LDW   *ciprAddr,cipr
               AND   cipr,useMask,pred
       [!pred] B     DAT_COPY_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
               SHL   serialNumber,16,id
               OR    id,slotNumber,id

               ;Load up base address of DMA registers
               LDW   *stateAddr(State.baseAddr),qdmaBase

               ;Store source address
               STW   src,*qdmaBase[SRC]

               ;Store destination address
               STW   dst,*qdmaBase[DST]

               ;store index
               MVKL  0x00000000,Y
               MVKH  0x00000000,Y
               STW   Y,*qdmaBase[IDX]

               ;Calculate argument alignment
               OR    dst,byteCnt,alignment
               OR    src,alignment,alignment
               AND   alignment,3,alignment

DAT_COPY_32:
               ;Check to see if 32-bit aligned, branch if not
               CMPEQ alignment,0,pred
       [!pred] B     DAT_COPY_16

               ;Store transfer count
               SHRU  byteCnt,2,X
               STW   X,*qdmaBase[CNT]

               ;Store option register into pseudo space to kick off transfer
               MVKL  0x01200000,Y
               MVKH  0x01200000,Y
               SHL   slotNumber,16,X
               OR    X,Y,Y
               OR    Y,initOpt,Y
               STW   Y,*qdmaBase[OPT]

               ;All done so go to procedure exit code
               B     DAT_COPY_RETURN

DAT_COPY_16:
               ;Check to see if 16-bit aligned, branch if not
               CMPEQ alignment,2,pred
       [!pred] B     DAT_COPY_8

               ;Store transfer count
               SHRU  byteCnt,1,X
               STW   X,*qdmaBase[CNT]

               ;Store option register into pseudo space to kick off transfer
               MVKL  0x09200000,Y
               MVKH  0x09200000,Y
               SHL   slotNumber,16,X
               OR    X,Y,Y
               OR    Y,initOpt,Y
               STW   Y,*qdmaBase[OPT]

               ;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,*qdmaBase[CNT]

               ;Store option register into pseudo space to kick off transfer
               MVKL  0x11200000,Y
               MVKH  0x11200000,Y
               SHL   slotNumber,16,X
               OR    X,Y,Y
               OR    Y,initOpt,Y
               STW   Y,*qdmaBase[OPT]

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 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

               ;address of the channel interrupt pending register
               MVKL  0x01A0FFE4,ciprAddr
               MVKH  0x01A0FFE4,ciprAddr

;               MVK   1,pred
;DAT_COPY2D_LOOP1:
;               ;Wait for a free slot to open up
;        [pred] LDW   *ciprAddr,cipr
;               AND   cipr,useMask,X
;               LMBD  1,X,X
;               SUB   const31,X,slotNumber
;               CMPEQ slotNumber,-1,pred
;        [pred] B     DAT_COPY2D_LOOP1

               ZERO  pred
DAT_COPY2D_LOOP1:
               ;Wait for a free slot to open up
       [!pred] LDW   *ciprAddr,cipr
               AND   cipr,useMask,pred
       [!pred] B     DAT_COPY2D_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
               SHL   serialNumber,16,id
               OR    id,slotNumber,id

               ;Load up base address of DMA registers
               LDW   *stateAddr(State.baseAddr),qdmaBase

               ;Store source address
               STW   src,*qdmaBase[SRC]

               ;Store destination address
               STW   dst,*qdmaBase[DST]

               ;Calculate argument alignment
               OR    dst,lineLen,alignment
               OR    src,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 transfer count
               SHRU  lineLen,2,X
               SUB   lineCnt,1,Y
               SHL   Y,16,Y
               OR    X,Y,X
               STW   X,*qdmaBase[CNT]

               ;Store index register 
               SUB   linePitch,lineLen,X
               SHL   X,16,X
               STW   X,*qdmaBase[IDX]

               ;Store option register into pseudo space to kick off transfer
;              MVKL  0x00000000,Y
;              MVKH  0x00000000,Y
               ZERO  Y
               SHL   slotNumber,16,X
               OR    X,Y,Y
               OR    type,Y,Y
               OR    Y,initOpt,Y
               STW   Y,*qdmaBase[OPT]

               ;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 transfer count
               SHRU  lineLen,1,X
               SUB   lineCnt,1,Y
               SHL   Y,16,Y
               OR    X,Y,X
               STW   X,*qdmaBase[CNT]

               ;Store index register 
               SUB   linePitch,lineLen,X
               SHL   X,16,X
               STW   X,*qdmaBase[IDX]

               ;Store option register into pseudo space to kick off transfer
               MVKL  0x08000000,Y
               MVKH  0x08000000,Y
               SHL   slotNumber,16,X
               OR    X,Y,Y
               OR    type,Y,Y
               OR    Y,initOpt,Y
               STW   Y,*qdmaBase[OPT]

               ;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 transfer count
               SHRU  lineLen,0,X
               SUB   lineCnt,1,Y
               SHL   Y,16,Y
               OR    X,Y,X
               STW   X,*qdmaBase[CNT]

               ;Store index register 
               SUB   linePitch,lineLen,X
               SHL   X,16,X
               STW   X,*qdmaBase[IDX]

               ;Store option register into pseudo space to kick off transfer
               MVKL  0x10000000,Y
               MVKH  0x10000000,Y
               SHL   slotNumber,16,X
               OR    X,Y,Y
               OR    type,Y,Y
               OR    Y,initOpt,Y
               STW   Y,*qdmaBase[OPT]

DAT_COPY2D_RETURN:
               ;Restore GIE
               MVC   CSR,X
               OR    X,gieSave,X
               MVC   X,CSR

               .return id
               .endproc

*------------------------------------------------------------------------------*
 .endif ;EDMA_SUPPORT
 
 .endif ;DAT_SUPPORT

********************************************************************************
* End of csl_dat_.sa
********************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -