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

📄 samsung_old.asm

📁 Utils and test SD card read write cycles
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	    MOVI     L4, $FFFFFFFF               ; WriteValue
ClearSectorLoop:
	    STW.R    L0, L4                      ; Write to Flash
	    ADDI     L3, -4                      ; LoopCount != 0?
	    BNE      ClearSectorLoop             ; No: --> branch
	    RET      PC, L1                      ;

if (ROM_ACTIVE==0) || defined(INF3)
;============================================================================;
; Function   : ReadDeviceID   						     ;
;									     ;
; Registers  : L0 : SectorNo / DeviceID                                      ;
;              L1 : Return-PC						     ;
;	       L2 : Return-SR						     ;
;              L3 : Opc                                                      ;
;              L4 : alternate ReturnAddr                                     ;
;              L5 : Sector# --> ChipSelect                                                   ;
;============================================================================;

	    XDEF     _ReadDeviceID
_ReadDeviceID:
	    FRAME    L6, L1
	    MOVI     L3, READ_DEVICE_ID_OPC      ; Par1: Opc
	    SUM      L4, PC, #ReadDeviceIdContinue-PC+1
						 ; Par2: alternate ReturnAddr
	    MOV      L5, L0                      ; Par3:Sector# -> ChipSelect
	    ChipSelect
if defined(INF3)
	    ReadStatus                           ; to Reset ID-counter
						 ; (bug in Samsung Chip)
	    MOV      L5, L0                      ; Par3:Sector# -> ChipSelect
	    ChipSelect
endif
ReadDeviceIdContinue:				 ; Par1: Opc
	    MOV      L4, L0                      ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
						 ; Par1: ChipSelect
	    ReadDeviceId
	    MOV      L3, L5                      ; Save DeviceId
	    MOV      L5, L0                      ; Par1: Sector#
	    FlashIdle
	    MOV      L0, L3                      ; L0 = DeviceId
	    RET      PC, L1                      ;
endif

if ROM_ACTIVE==0
;============================================================================;
; Function   : RecalculateCRC 						     ;
;									     ;
; Registers  : L0 : BufferAddress					     ;
;              L1 : BufferSize-4					     ;
;              L2 : ChipSelect						     ;
;              L3 : Return-PC						     ;
;	       L4 : Return-SR						     ;
;              L5 : Data                                                     ;
;              L6 : Data                                                     ;
;============================================================================;

_RecalculateCRC:
	    FRAME    L7, L3                      ;
	    ORI      L2, FLASH_INHIBIT|FLASH_SM_ENABLE
	    STW.IOA  0, 0, SM_RESET_PARITY       ; Clear SM Paritybytes
	    LDW.P    L0, L5			 ; first read
	    LDW.P    L0, L6 			 ; first read
	    ADDI     L1, -8			 ; decrement counter
	    BE       CRCLastBytes                ;
CRCLoop:    STW.R    L2, L5			 ;
	    LDW.P    L0, L5			 ;
	    ADDI     L1, -8			 ; decrement counter
	    STW.R    L2, L6 			 ;
	    DBNE     CRCLoop 	                 ; ready?
	    LDW.P    L0, L6 			 ;
CRCLastBytes:					 ;
	    STW.R    L2, L5			 ; store last bytes
	    STW.R    L2, L6 			 ; store last bytes
	    LDHU.N   L0, L5, 2                   ; Load Paritybytes from Buffer
	    LDHU.N   L0, L6, 2                   ;
	    STHU.D   L2, L5, 0                   ; Store Paritybytes b3, b2
	    STHU.D   L2, L6, 0                   ; Store Paritybytes b1, b0
	    RET      PC, L3                      ;

;============================================================================;
; Function   : EraseBlockRom                 				     ;
;									     ;
; Registers  : L0 : SectorNo / Status                                        ;
;              L1 : Flags       					     ;
;              L2 : Return-PC						     ;
;	       L3 : Return-SR						     ;
;              L4 : FlashMemAddres                                           ;
;              L5 : Temp                                                     ;
;============================================================================;

_EraseBlockRom:
	    FRAME    L7, L2
	    MOVI     L4, ERASE_BLOCK_OPC         ; Par1: Opc
	    SUM      L5, PC, #AbortErase-PC+1    ; BackGroundErase && PC_EVENT
						 ; Par2: alternate ReturnAddr
	    MOV      L6, L0                      ; Par3: Sector# -> ChipSelect
	    ChipSelect
	    MOV      L0, L5                      ; ActPage#
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetAddr
	    CMPBI    L1, SKIP_ERASE              ; MultiPlane Erase?
	    BNE      ExitErase                   ; Yes: --> branch
	    MOVI     L4, ERASE_BLOCK1_OPC        ; Par1: Opc
	    MOV      L5, L0                      ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
	    MOV      L4, L6                      ; Save ChipSelect
	    CMPBI    L1, OVERLAPPED              ; Overlapped Erase?
	    DBNE     EraseOverlapped             ; Yes: --> branch
	    MOV      L6, L0                      ; Par1: Sector#
	    WaitForReady
	    MOV      L6, L4                      ; Par1: ChipSelect
	    ReadStatus
	    MOV      L4, L6                      ; Save Status
	    MOV      L6, L0                      ; Sector#
	    FlashIdle
	    MOV      L0, L4                      ; L0 = Status
	    RET      PC, L2                      ;
EraseOverlapped:
						 ; Par1: Sector#
	    SetOverlapped
	    MOVI     L6, -1                      ; Par1: -1 --> Enable IO1 Int
	    WaitForReady
ExitErase:
	    MOVI     L0, 0                       ; Status = NoError
	    RET      PC, L2                      ;
AbortErase:
	    MOVI     L0, -1                      ; Status = Aborted
	    RET      PC, L2                      ;

;============================================================================;
; Function   : ReadOverheadFromFlash					     ;
;									     ;
; Description: Reads 32 Bit OverheadArea from a sector                       ;
;                                                                            ;
; Registers  : L0 : SectorNo / EraseCount                                    ;
;              L1 : Return-PC						     ;
;	       L2 : Return-SR						     ;
;              L3 : FlashMemAddres                                           ;
;              L4 : Temp                                                     ;
;============================================================================;

_ReadOverheadFromFlash:
	    FRAME    L6, L1
	    MOVI     L3, READ_OVERHEAD_OPC       ; Par1: Opc
	    SUM      L4, PC, #ReadOverheadWithinSamePage-PC+1
						 ; Par2: alternate ReturnAddr
	    MOV      L5, L0                      ; Sector# -> ChipSelect
	    ChipSelect
	    MOV      L0, L4                      ; ActPage#
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetAddr
	    MOVI     L3, READ_CONFIRM_OPC|DONT_SAVE_OPC
						 ; Par1: Opc
	    MOV      L4, L0			 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
	    PollForReady                         ; Par1: ChipSelect
ReadOverheadBehindPoll:
						 ; Par1: Bufferaddr not used
	    MOVI     L4, 0                       ; Par2: Flags no store in Buffer
	    ReadWord                             ; Par3: ChipSelect
	    MOV      L3, L5                      ; Save ResultWord
	    MOV      L5, L0                      ; Par1: Sector#
	    FlashIdle
	    MOV      L0, L3                      ; L0 = ResultWord
	    RET      PC, L1                      ;
ReadOverheadWithinSamePage:
	    MOV      L0, L4                      ; ActPage#
	    MOVI     L3, RANDOM_DATA_OUTPUT_OPC|DONT_SAVE_OPC
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetAddr
	    MOVI     L3, RANDOM_DATA_OUTPUT1_OPC|DONT_SAVE_OPC
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
	    BR       ReadOverheadBehindPoll      ;

;============================================================================;
; Function   : WriteOverhead  						     ;
;									     ;
; Registers  : L0 : SectorNo / Status                                        ;
;              L1 : Overhead                                                 ;
;              L2 : Flags       					     ;
;              L3 : Return-PC						     ;
;	       L4 : Return-SR						     ;
;              L5 : Opc                                                      ;
;              L6 : Sector#                                                  ;
;              L7 : ChipSelect                                               ;
;============================================================================;

_WriteOverhead:
	    FRAME    L8, L3
	    MOVI     L5, WRITE_OVERHEAD_OPC      ; Par1: Opc
	    SUM      L6, PC, #WriteOverheadWithinSamePage-PC+1
						 ; Par2: alternate ReturnAddr
	    MOV      L7, L0                      ; Sector# -> ChipSelect
	    ChipSelect
	    MOV      L0, L6                      ; ActPage#
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetAddr
WriteOverheadWord:
	    MOV      L5, L2                      ; Par1: Flags
	    MOV      L6, L1                      ; Par2: Word
						 ; Par3: ChipSelect
	    WriteWord
	    MOV      L2, L5                      ; Flags may be modified
	    CMPBI    L2, SKIP_PROGRAM            ; for multiSector pages
	    BNE      WriteOverheadExit           ;
	    MOVI     L5, PROGRAM_SECTOR_OPC      ; Par1: Opc
	    MOV      L6, L0                      ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
	    MOV      L5, L7                      ; Save ChipSelect
	    CMPBI    L2, OVERLAPPED              ; Overlapped Erase?
	    DBNE     WriteOverheadOverlapped     ; Yes: --> branch
	    MOV      L7, L0                      ; Par1: Sector#
	    WaitForReady
	    MOV      L7, L5                      ; Par1: ChipSelect
	    ReadStatus
	    MOV      L5, L7                      ; Save Status
	    MOV      L7, L0                      ; Par1: Sector#
	    FlashIdle
	    MOV      L0, L5                      ; L0 = Status
	    RET      PC, L3                      ;
WriteOverheadOverlapped:
						 ; Par1: Sector#
	    SetOverlapped
	    MOVI     L7, -1                      ; Par1: -1 --> Enable IO1 Int
	    WaitForReady
WriteOverheadExit:
	    MOVI     L0, 0                       ; Status = NoError
	    RET      PC, L3                      ;
WriteOverheadWithinSamePage:
	    MOV      L0, L6                      ; ActPage#
	    MOVI     L5, RANDOM_DATA_INPUT_OPC|DONT_SAVE_OPC
						 ; Par1: Opc
	                                         ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetAddr
	    BR       WriteOverheadWord

;============================================================================;
; Function   : WriteSector     						     ;
;									     ;
; Registers  : L0 : SectorNo / Status                                        ;
;              L1 : BufferAddress                                            ;
;              L2 : ChunkTableAddress                                        ;
;              L3 : Flags                                                    ;
;              L4 : Overhead                                                 ;
;              L5 : Return-PC						     ;
;	       L6 : Return-SR						     ;
;              L7 : BufferAddress                                            ;
;	       L8 : Opc/ChunkLength     				     ;
;	       L9 : Sector#/Flags                                            ;
;	       L10: ChipSelect						     ;
;============================================================================;

_WriteSector:
	    FRAME    L11, L5
	    MOVI     L8, WRITE_SECTOR_OPC        ; Par1: Opc
	    SUM      L9, PC, #WriteWithinSamePage-PC+1
						 ; Par2: alternate ReturnAddr
	    MOV      L10, L0                     ; Par3: Sector# -> ChipSelect
	    ChipSelect
	    MOV      L0, L9                      ; ActPage#
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
						 ; Par1: Opc
						 ; Par2: Sector#

⌨️ 快捷键说明

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