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

📄 csl_dat_.sa

📁 Ti C6416 上对FLASH操作得范例程序
💻 SA
📖 第 1 页 / 共 3 页
字号:
               ;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 + -