diff src/external_flash.inc @ 634:4050675965ea

3.10 stable release
author heinrichsweikamp
date Tue, 28 Apr 2020 17:34:31 +0200
parents 185ba2f91f59
children 75e90cd0c2c3
line wrap: on
line diff
--- a/src/external_flash.inc	Thu Mar 05 15:06:14 2020 +0100
+++ b/src/external_flash.inc	Tue Apr 28 17:34:31 2020 +0200
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File external_flash.inc                   combined next generation V3.08.8
+;   File external_flash.inc                 * combined next generation V3.09.4e
 ;
 ;
 ;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
@@ -14,29 +14,32 @@
 ; 0x000000 - 0x1FFFFF    2 MB dive profile data, shared ring buffer
 ; 0x200000 - 0x2FFFFF    1 MB dive header  data, last 256 dives, 4 kB / dive
 ; 0x300000 - 0x3DFFFF  896 kB unused
-; 0x3E0000 - 0x3DFFFF  120 kB firmware buffer
-; 0x3E0000 - 0x3FFFFF    8 kB unused
+; 0x3C0000 - 0x3DDFFF  120 kB backup firmware
+; 0x3DE000 - 0x3DFFFF    8 kb unused
+; 0x3E0000 - 0x3FDFFF  120 kB firmware buffer
+; 0x3FE000 - 0x3FFFFF    8 kB reserved for factory use
 
 
 ; Write: WREG -> FLASH with address increment and wrap-around at 0x200000
-	extern	write_byte_ext_flash_plus_prof		; with    increase of ext_flash_dive_counter
-	extern	write_byte_ext_flash_plus_nocnt		; without increase of ext_flash_dive_counter
-	extern	write_byte_ext_flash_plus_nodel		; without increase of ext_flash_dive_counter, without delete on entering new page
+	extern	ext_flash_write_byte_0x20_incdc		; with increment of ext_flash_dive_counter
+	extern	ext_flash_write_byte_0x20			; standard flash write
+	extern	ext_flash_write_byte_0x20_nodel		; without delete on entering new page
 
 
 ; Write: WREG -> FLASH with address increment and wrap-around at 0x400000
-	extern	write_byte_ext_flash_plus_comms		; without wait for use with fast comm (~86us fixed delay due to 115200 Bauds - use with caution)
+	extern	ext_flash_write_byte_0x40_nowait	; without wait for use with fast comm (~86us fixed delay due to 115200 Bauds - use with caution)
 
 
 ; Read: block-read FLASH -> WREG
 	extern	ext_flash_read_block_start			; initial    read of one  byte at ext_flash_address:3
 	extern	ext_flash_read_block_0x40			; subsequent read of next byte(s) with wrap-around at 0x400000
-	extern	ext_flash_read_block_0x20			; subsequent read of next byte(s) with wrap-around at 0x200000
+;	extern	ext_flash_read_block_0x20			; subsequent read of next byte(s) with wrap-around at 0x200000
 	extern	ext_flash_read_block_stop			; terminate  read
 
 
 ; Erase:
-	extern	ext_flash_erase_4kB					; erase one 4 kB sector @ext_flash_address:3
+	extern	ext_flash_erase_4kB					; erase   one 4kB block  starting at ext_flash_address:3
+	extern	ext_flash_erase_range				; erase #WREG 4kB blocks starting at ext_flash_address:3
 	extern	erase_complete_logbook				; erase complete logbook (FLASH and EEPROM)
 
 
@@ -44,6 +47,16 @@
 	extern	ext_flash_enable_protection			; enable  write protection
 	extern	ext_flash_disable_protection		; disable write protection
 
+; Misc
+	extern	ext_flash_read_jedec				; read JEDEC IDs
+	extern	ext_flash_inc_address_4kB			; increment address by 0x001000, no check for wrap-around
+
+
+ IFDEF _firmware_recovery
+; Firmware Copying
+	extern	copy_fw_active_to_backup			; copy active firmware code to backup storage
+	extern	copy_fw_backup_to_active			; copy backup firmware code to update storage
+ ENDIF
 
 
 ;-----------------------------------------------------------------------------
@@ -51,48 +64,61 @@
 ;-----------------------------------------------------------------------------
 
 
-; read 1 byte from FLASH to WREG with address auto-increment and wrap-around at 0x200000
+; read 1 byte from FLASH to WREG with address increment and wrap-around at 0x200000
 ;
 ; the byte read is also copied to ext_flash_rw
 ;
 FLASH_CW_READ_0x20	macro
-	extern	ext_flash_byte_read_plus_0x20
-	call	ext_flash_byte_read_plus_0x20
+	extern	ext_flash_read_byte_0x20
+	call	ext_flash_read_byte_0x20			; read from FLASH to WREG
 	endm
 
 
-; read 1 byte from FLASH to memory with address auto-increment and wrap-around at 0x200000
+; read 1 byte from FLASH to WREG with address increment and wrap-around at 0x400000
+;
+; the byte read is also copied to ext_flash_rw
 ;
-; mem_address: address:2 containing target address in memory
+FLASH_CW_READ_0x40	macro
+	extern	ext_flash_read_byte_0x40
+	call	ext_flash_read_byte_0x40			; read from FLASH to WREG
+	endm
+
+
+; read 1 byte from FLASH to memory with address increment and wrap-around at 0x200000
+;
+; mem_address: target address in memory, must be in current bank!
 ;
 FLASH_CC_READ_0x20	macro	mem_address
-	extern	ext_flash_byte_read_plus_0x20
-	call	ext_flash_byte_read_plus_0x20		; read from flash
-	movff	WREG,mem_address					; copy to   memory
+	extern	ext_flash_read_byte_0x20
+	call	ext_flash_read_byte_0x20			; read from FLASH to WREG
+	movwf	mem_address							; copy from WREG  to memory
 	endm
 
 
 ; read 2 bytes from FLASH to memory with address auto-increment and wrap-around at 0x200000
 ;
-; mem_address: address:2 containing start address in memory
+; mem_address: target address in memory, must be in current bank!
 ;
 FLASH_II_READ_0x20	macro	mem_address
-	extern	ext_flash_byte_read_plus_0x20
-	call	ext_flash_byte_read_plus_0x20		; read 1st byte from flash
-	movff	WREG,mem_address+0					; copy 1st byte to   memory
-	call	ext_flash_byte_read_plus_0x20		; read 2nd byte from flash
-	movff	WREG,mem_address+1					; copy 2nd byte to   memory
+	extern	ext_flash_read_byte_0x20
+	call	ext_flash_read_byte_0x20			; read 1st byte from FLASH to WREG
+	movwf	mem_address+0						; copy 1st byte from WREG  to memory
+	call	ext_flash_read_byte_0x20			; read 2nd byte from FLASH to WREG
+	movwf	mem_address+1						; copy 2nd byte from WREG  to memory
 	endm
 
 
-; read a range of data from FLASH to memory (destroys WREG, FSR1) - wraps around at 0x400000
-;                                                                 - increments ext_flash_address
-; flash_start : address:3 containing start address in flash
+; read a range of data from FLASH to memory (destroys WREG, FSR1)
+;
 ; memory_start: address:2 containing start address in memory
 ; range       : literal:1 giving the number of bytes to read (1-256)
 ;
-FLASH_RR_READ		macro	flash_start, memory_start, range
-	MOVTT	flash_start,ext_flash_address			; set start address in FLASH
+; Attention: function does NOT check for a wrap-around!
+;
+; -> flash_start is at ext_flash_address
+; -> ext_flash_address is NOT changed
+;
+FLASH_RR_READ		macro	memory_start, range
 	lfsr	FSR1,memory_start						; set start address in memory
 	movlw	low(range)								; set size of range to read
 	extern	ext_flash_read_range
@@ -100,29 +126,45 @@
 	endm
 
 
-; write a range of data from memory to FLASH (destroys WREG, FSR1) - Attention: range must fit into a 256 byte block!
-;                                                                  - does not increment ext_flash_address!
+; write a range of data from memory to FLASH (destroys WREG, FSR1)
+;
 ; memory_start: address:2 containing start address in memory
-; flash_start : address:3 containing start address in flash
 ; range       : literal:1 giving the number of bytes to write (1-256)
 ;
-FLASH_RR_WRITE		macro	memory_start, flash_start, range
+; Attention: low(ext_flash_address) + range must be <= 256 !
+;
+; -> flash_start is at ext_flash_address
+; -> old flash chip: ext_flash_address is incremented according to range parameter
+; -> new flash chip: ext_flash_address is set to start of next 256 byte block
+;
+FLASH_RR_WRITE		macro	memory_start, range
 	lfsr	FSR1,memory_start						; set start address in memory
-	MOVTT	flash_start,ext_flash_address			; set start address in FLASH
-	movlw	low(range)								; set size of range to read
+	movlw	low(range)								; set size of range to write
 	extern	ext_flash_write_range
 	call	ext_flash_write_range					; execute range-write
 	endm
 
 
+; set ext_flash_address to a given address
+;
+EXT_FLASH_ADDR	macro	address
+	movlw	LOW   (address         )
+	movwf	ext_flash_address+0
+	movlw	HIGH  (address & 0xFFFF)
+	movwf	ext_flash_address+1
+	movlw	UPPER (address         )
+	movwf	ext_flash_address+2
+	endm
+
+
 ; move forward in FLASH with wrap-around at 0x400000 to 0x000000
 ;
 ; increment: literal (1-255)
 ;
-ext_flash_inc_address_0x40		macro	increment
-		movlw	increment
-		extern	incf_ext_flash_address0_0x40
-		call	incf_ext_flash_address0_0x40
+EXT_FLASH_INC_ADDRESS_0x40	macro	increment
+	movlw	increment
+	extern	ext_flash_inc_address_0x40_exec
+	call	ext_flash_inc_address_0x40_exec
 	endm
 
 
@@ -130,19 +172,16 @@
 ;
 ; increment: literal (1-255)
 ;
-ext_flash_inc_address_0x20		macro	increment
-		movlw	increment
-		extern	incf_ext_flash_address0_0x20
-		call	incf_ext_flash_address0_0x20
+EXT_FLASH_INC_ADDRESS_0x20	macro	increment
+	movlw	increment
+	extern	ext_flash_inc_address_0x20_exec
+	call	ext_flash_inc_address_0x20_exec
 	endm
 
 
-; decrement length count
-;
-; decrement: literal (1-255)
+; decrement length counter by 1
 ;
-ext_flash_dec_length			macro	decrement
-		movlw	decrement
-		extern	decf_ext_flash_length0
-		call	decf_ext_flash_length0
+EXT_FLASH_DEC_LENGTH		macro
+	extern	ext_flash_dec_length_exec
+	call	ext_flash_dec_length_exec
 	endm