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

📄 intflash_driver_f91.s

📁 flash AM29LV160 的驱动程序
💻 S
📖 第 1 页 / 共 2 页
字号:
;**************************** _IntFlash_Read ***************************
;Name                         Addr/Register   Size   Type
;pcaddr                                IX-8      3   variable
;pcBuf                                 IX-5      3   variable
;nBytes                                IX-2      2   variable
;num_bytes                            IX+12      3   parameter
;pbuf                                  IX+9      3   parameter
;paddr                                 IX+6      3   parameter


; Stack Frame Size: 23 (bytes)
;       Spill Code: 0 (instruction)


.ENDFUNC "IntFlash_Read",125,"_IntFlash_Read"
;  126	
;  127	INT32 IntFlash_Write( VOID *paddr, VOID *pbuf, UINT num_bytes )
;  128	#ifdef _IAR_CODE
;  129	@ "DATA_PER_RAM"
;  130	#endif
;  131	{
_IntFlash_Write:
.DEFINE "_IntFlash_Write"

.VALUE _IntFlash_Write

.CLASS 2

.TYPE 69

.ENDEF

.BEGFUNC "IntFlash_Write",131,"_IntFlash_Write"

.LINE 131

.DEFINE "paddr"

.CLASS 65

.VALUE 6

.TYPE 33

.ENDEF

.DEFINE "pbuf"

.CLASS 65

.VALUE 9

.TYPE 33

.ENDEF

.DEFINE "num_bytes"

.CLASS 65

.VALUE 12

.TYPE 14

.ENDEF

.DEFINE "nBytes"

.CLASS 65

.VALUE -2

.TYPE 13

.ENDEF

.DEFINE "pcBuf"

.CLASS 65

.VALUE -5

.TYPE 44

.ENDEF

.DEFINE "pcaddr"

.CLASS 65

.VALUE -8

.TYPE 44

.ENDEF

	PUSH	IX
	LD	IX,0
	ADD	IX,SP
	PUSH	BC
	PUSH	BC
	DEC	SP
	DEC	SP
;  132		// the number of bytes passed to this function is always less than
;  133		// 512 bytes
;  134	
;  135		UINT16 nBytes ;
;  136		volatile UINT8 *pcBuf = ( UINT8 * ) pbuf ;
.LINE 136

	LD	BC,(IX+9)
	LD	(IX+-5),BC
;  137		volatile UINT8 *pcaddr = ( UINT8 * ) paddr ;
.LINE 137

	LD	BC,(IX+6)
	LD	(IX+-8),BC
;  138	
;  139	#ifdef _EZ80F91
;  140		// set the PAGE, ROW and COL registers
;  141		FLASH_PAGE = GETPAGE( (LOC_ADDR) pcaddr ) ;
.LINE 141

	LD	BC,1046528
	LD	HL,(IX+-8)
	CALL	__iand
	LD	BC,11
	CALL	__ishrs
	LD	A,L
	OUT0	(252),A
;  142		FLASH_ROW = GETROW( (LOC_ADDR) pcaddr ) ;
.LINE 142

	LD	BC,1792
	LD	HL,(IX+-8)
	CALL	__iand
	LD	BC,8
	CALL	__ishru
	LD	A,L
	OUT0	(253),A
;  143		FLASH_COL = GETCOL( (LOC_ADDR) pcaddr ) ;
.LINE 143

	LD	A,(IX+-8)
	OUT0	(254),A
	XOR	A,A
	LD	(IX+-2),A
	XOR	A,A
	LD	(IX+-1),A
;  144	#endif
;  145	
;  146		// now in a loop read the num_bytes values from FLASH_DATA register
;  147		for( nBytes = 0 ; nBytes < num_bytes ; nBytes++ )
.LINE 147

	JR	L_12
L_10:
;  148	    {	
;  149	#if defined(_EZ80F92) || defined(_EZ80F93)
;  150			// set the PAGE, ROW and COL registers
;  151			FLASH_PAGE = GETPAGE( (LOC_ADDR) pcaddr ) ;
;  152			FLASH_ROW = GETROW( (LOC_ADDR) pcaddr ) ;
;  153			FLASH_COL = GETCOL( (LOC_ADDR) pcaddr ) ;
;  154	#endif
;  155	
;  156			FLASH_DATA = *pcBuf ;
.LINE 156

	LD	IY,(IX+-5)
	LD	A,(IY)
	OUT0	(246),A
;  157			pcBuf++ ;
.LINE 157

	LD	BC,(IX+-5)
	INC	BC
	LD	(IX+-5),BC
	LD	BC,(IX+-2)
	INC	BC
	LD	(IX+-2),C
	LD	(IX+-1),B
;  158	#if defined(_EZ80F92) || defined(_EZ80F93)
;  159			pcaddr++ ;
;  160	#endif
;  161	
;  162		}
L_12:
.LINE 162

	LD	BC,(IX+-2)
	CALL	__stoiu
	LD	BC,(IX+12)
	OR	A,A
	SBC	HL,BC
	JR	C,L_10
;  163		return num_bytes ;
.LINE 163

	LD	BC,(IX+12)
	XOR	A,A
	LD	E,A
	LD	HL,BC
;  164	}
.LINE 164

	LD	SP,IX
	POP	IX
	RET	


;**************************** _IntFlash_Write ***************************
;Name                         Addr/Register   Size   Type
;pcaddr                                IX-8      3   variable
;pcBuf                                 IX-5      3   variable
;nBytes                                IX-2      2   variable
;num_bytes                            IX+12      3   parameter
;pbuf                                  IX+9      3   parameter
;paddr                                 IX+6      3   parameter


; Stack Frame Size: 23 (bytes)
;       Spill Code: 0 (instruction)


.ENDFUNC "IntFlash_Write",164,"_IntFlash_Write"
;  165	
;  166	INT IntFlash_Erase( VOID *paddr, UINT32 num_bytes )
;  167	#ifdef _IAR_CODE
;  168	@ "DATA_PER_RAM"
;  169	#endif
;  170	{
_IntFlash_Erase:
.DEFINE "_IntFlash_Erase"

.VALUE _IntFlash_Erase

.CLASS 2

.TYPE 68

.ENDEF

.BEGFUNC "IntFlash_Erase",170,"_IntFlash_Erase"

.LINE 170

.DEFINE "paddr"

.CLASS 65

.VALUE 6

.TYPE 33

.ENDEF

.DEFINE "num_bytes"

.CLASS 65

.VALUE 9

.TYPE 15

.ENDEF

.DEFINE "nCnt"

.CLASS 65

.VALUE -3

.TYPE 14

.ENDEF

.DEFINE "nPageNum"

.CLASS 65

.VALUE -4

.TYPE 12

.ENDEF

	PUSH	IX
	LD	IX,0
	ADD	IX,SP
	PUSH	BC
	DEC	SP
;  171		// the provided address is the start address of the 32 KB block.
;  172		// and each 32 KB contains 16 2 KB pages. So need to erase the 16 pages.
;  173	
;  174		// given start address is relative from ZERO address. So, from this, we
;  175		// calculate the page numbers to erase.
;  176		UINT8 nPageNum = GETPAGE( (UINT32) paddr ) ;
.LINE 176

	LD	BC,(IX+6)
	XOR	A,A
	LD	E,A
	LD	HL,BC
	LD	BC,1046528
	XOR	A,A
	CALL	__land
	LD	BC,HL
	LD	HL,11
	LD	A,E
	CALL	__lshru
	LD	(IX+-4),C
	LD	BC,0
	LD	(IX+-3),BC
;  177		UINT nCnt ;
;  178	
;  179		for( nCnt = 0 ; nCnt < g_nPagesPerBlock ; nCnt++ )
.LINE 179

	JR	L_23
L_21:
;  180		{
;  181			// store the PAGE NUM in the register
;  182			FLASH_PAGE = nPageNum ;
.LINE 182

	LD	A,(IX+-4)
	OUT0	(252),A
;  183	
;  184			// setup the flash erase
;  185			FLASH_PGCTL = FLASH_PGCTL_PG_ERASE_ENABLE ;
.LINE 185

	LD	A,2
	OUT0	(255),A
;  186	
;  187			// now poll for the 
;  188			while(1)
.LINE 188

L_18:
;  189			{
;  190				// If erase is complete, break from the loop
;  191				if( !(FLASH_PGCTL & FLASH_PGCTL_PG_ERASE_ENABLE ) )
.LINE 191

	IN0	A,(255)
	AND	A,2
	JR	NZ,L_18
;  192					break ;
.LINE 192

	JR	L_20
;  193			}
L_17:
.LINE 193

	JR	L_18
L_20:
;  194			// go to next page
;  195			nPageNum++ ;
.LINE 195

	INC	(IX+-4)
	LD	BC,(IX+-3)
	INC	BC
	LD	(IX+-3),BC
;  196		}
L_23:
.LINE 196

	LD	A,(_g_nPagesPerBlock)
	UEXT	HL
	LD	L,A
	LD	BC,HL
	LD	HL,(IX+-3)
	OR	A,A
	SBC	HL,BC
	JR	C,L_21
;  197	
;  198		return SUCCESS;
.LINE 198

	LD	HL,0
;  199	}
.LINE 199

	LD	SP,IX
	POP	IX
	RET	


;**************************** _IntFlash_Erase ***************************
;Name                         Addr/Register   Size   Type
;_g_nPagesPerBlock                   STATIC      1   variable
;nPageNum                              IX-4      1   variable
;nCnt                                  IX-3      3   variable
;num_bytes                             IX+9      4   parameter
;paddr                                 IX+6      3   parameter


; Stack Frame Size: 19 (bytes)
;       Spill Code: 0 (instruction)


.ENDFUNC "IntFlash_Erase",199,"_IntFlash_Erase"
;  200	
;  201	INT IntFlash_Close( VOID )
;  202	#ifdef _IAR_CODE
;  203	@ "DATA_PER_RAM"
;  204	#endif
;  205	{
_IntFlash_Close:
.DEFINE "_IntFlash_Close"

.VALUE _IntFlash_Close

.CLASS 2

.TYPE 68

.ENDEF

.BEGFUNC "IntFlash_Close",205,"_IntFlash_Close"

	PUSH	IX
	LD	IX,0
	ADD	IX,SP
;  206		// disable INTERNAL FLASH
;  207		FLASH_CTRL = 0x00 ;
.LINE 207

	XOR	A,A
	OUT0	(248),A
;  208		return SUCCESS ;
.LINE 208

	LD	HL,0
;  209	}
.LINE 209

	LD	SP,IX
	POP	IX
	RET	


;**************************** _IntFlash_Close ***************************
;Name                         Addr/Register   Size   Type


; Stack Frame Size: 6 (bytes)
;       Spill Code: 0 (instruction)


.ENDFUNC "IntFlash_Close",209,"_IntFlash_Close"
	XREF __iand:ROM
	XREF __land:ROM
	XREF __ishrs:ROM
	XREF __ishru:ROM
	XREF __lshru:ROM
	XREF __stoiu:ROM
	XDEF _IntFlash_Close
	XDEF _IntFlash_Erase
	XDEF _IntFlash_Write
	XDEF _IntFlash_Read
	XDEF _IntFlash_Init
	XDEF _g_nPagesPerBlock
	END

⌨️ 快捷键说明

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