view src/eeprom_rs232.inc @ 642:a9a0188091e4

fix rare upgrade issue with OSTC sport 2019 hardware
author heinrichsweikamp
date Thu, 14 Jan 2021 16:24:07 +0100
parents 4050675965ea
children aeca5717d9eb
line wrap: on
line source

;=============================================================================
;
;   File eeprom_rs232.inc                   * combined next generation V3.09.4n
;
;
;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
;=============================================================================
; HISTORY
;  2011-08-03 : [mH] moving from OSTC code



; --------------------------------------------------------------------------------------------
;       EEPROM Defines
; --------------------------------------------------------------------------------------------

#DEFINE DECO_DATA_VALID_TOKEN			0x55		; deco data valid
#DEFINE DECO_DATA_INVALID_TOKEN			0xAA		; deco data invalid


; --------------------------------------------------------------------------------------------
;       EEPROM Memory Map
; --------------------------------------------------------------------------------------------

;       Label						EEPROM Address	 Size  Description

; bank 1+2: settings & options
; ----------------------------						  +--- do not change the position of these data!
#DEFINE eeprom_ostc_serial				0x000		; | 2  OSTC dive computer unique serial number
#DEFINE eeprom_num_dives				0x002		; | 2  total number of dives
#DEFINE eeprom_log_pointer				0x004		; | 3  pointer used for accessing log data in external flash
#DEFINE eeprom_battery_gauge			0x007		; | 6  backup storage for the battery gauge meter
#DEFINE eeprom_log_offset				0x00D		; | 2  offset between OSTC dive counting and user's counting
#DEFINE eeprom_battery_type				0x00F		; | 1  battery type inside the OSTC
#DEFINE eeprom_options_version			0x010		;   2  options version identifier
#DEFINE eeprom_fw_chksum_current		0x012		;   6  checksum of the current firmware *)
;										0x018		;   2  unused
#DEFINE eeprom_options_storage			0x01A		; 486  backup storage for the options


; bank 2: deco data backup
; ------------------------
#DEFINE eeprom_deco_data_validity		0x200		;   1  deco data validity
#DEFINE eeprom_deco_data_version		0x201		;   1  deco data format version
#DEFINE eeprom_deco_data_timestamp		0x202		;   6  date/time of deco data
#DEFINE eeprom_deco_data_surfinterval	0x208		;   2  surface interval
;										0x20A		;   6  unused
#DEFINE eeprom_deco_data_bank3			0x210		;   9  desaturation status
;										0x219		;   1  unused
#DEFINE eeprom_deco_data_bank5			0x21A		;   4  CNS
;										0x21E		;   2  unused
#DEFINE eeprom_deco_data_bank7			0x220		; 128  tissue pressures
; 										0x2A0		;  96  unused


; bank 3: flash backup & factory use
; ----------------------------------
#DEFINE eeprom_prog_page0_backup		0x300		; 128  backup storage for the first program memory page
;										0x380		;   1  unused
#DEFINE eeprom_button_polarity			0x381		;   1  button polarity (factory use only, do not change position!)
#DEFINE eeprom_fw_chksum_recovry		0x382		;   6  checksum of stored recovery firmware *)
;										0x388		; 121  unused


; *) 4 byte code checksum, 1 byte checksum of the checksum, 1 byte firmware ID



; --------------------------------------------------------------------------------------------
;
;           EEPROM read & write Macros
;
; --------------------------------------------------------------------------------------------


;-----------------------------------------------------------------------------
; read 1 byte from EEPROM to memory
;
; eeprom_address: address:2 containing source address in EEPROM
; memory_address: address:2 containing target address in memory
;
EEPROM_CC_READ		macro	eeprom_address, memory_address
	movlw	HIGH(eeprom_address)	; extract bank in EEPROM
	movwf	EEADRH					; set     bank in EEPROM
	movlw	LOW (eeprom_address)	; extract start address in EEPROM
	movwf	EEADR					; set     start address in EEPROM
	call	read_eeprom				; read from EEPROM
	movff	EEDATA,memory_address	; store to memory
	endm


;-----------------------------------------------------------------------------
; read 2 bytes from EEPROM to memory, both bytes need to be in same EEPROM bank
;
; eeprom_address: address:2 containing start address in EEPROM
; memory_address: address:2 containing start address in memory
;
EEPROM_II_READ		macro	eeprom_address, memory_address
	movlw	HIGH(eeprom_address)	; extract bank in EEPROM
	movwf	EEADRH					; set     bank in EEPROM
	movlw	LOW (eeprom_address)	; extract start address in EEPROM
	movwf	EEADR					; set     start address in EEPROM
	lfsr	FSR1,memory_address		; set start address in memory
	movlw	.2						; read  2 bytes
	call	eeprom_read_common		; execute read
	endm


;-----------------------------------------------------------------------------
; read 3 bytes from EEPROM to memory, all bytes need to be in same EEPROM bank
;
; eeprom_address: address:2 containing start address in EEPROM
; memory_address: address:2 containing start address in memory
;
EEPROM_TT_READ		macro	eeprom_address, memory_address
	movlw	HIGH(eeprom_address)	; extract bank in EEPROM
	movwf	EEADRH					; set     bank in EEPROM
	movlw	LOW (eeprom_address)	; extract start address in EEPROM
	movwf	EEADR					; set     start address in EEPROM
	lfsr	FSR1,memory_address		; set start address in memory
	movlw	.3						; read  3 bytes
	call	eeprom_read_common		; execute read
	endm


;-----------------------------------------------------------------------------
; read a range of bytes from EEPROM to memory, all bytes need to be in same EEPROM bank
;
; eeprom_address: address:2 containing start address in EEPROM
; memory_address: address:2 containing start address in memory (bank safe)
; range         : number of bytes to read (1-256), will wrap-around staying in same EEPROM bank!
;
EEPROM_RR_READ		macro	eeprom_address, memory_address, range
	movlw	HIGH(eeprom_address)	; extract bank in EEPROM
	movwf	EEADRH					; set     bank in EEPROM
	movlw	LOW (eeprom_address)	; extract start address in EEPROM
	movwf	EEADR					; set     start address in EEPROM
	lfsr	FSR1,memory_address		; set start address in memory
	movlw	low(range)				; set size of range to read
	call	eeprom_read_common		; execute read
	endm


;-----------------------------------------------------------------------------
; write 1 byte from memory to EEPROM
;
; memory_address: address:2 containing source      address in memory (bank safe)
; eeprom_address: address:2 containing destination address in EEPROM
;
EEPROM_CC_WRITE		macro	memory_address, eeprom_address
	movlw	HIGH(eeprom_address)	; extract bank in EEPROM
	movwf	EEADRH					; set     bank in EEPROM
	movlw	LOW (eeprom_address)	; extract start address in EEPROM
	movwf	EEADR					; set     start address in EEPROM
	movff	memory_address,EEDATA	; copy byte to EEPROM data register
	call	write_eeprom			; execute write
	endm


;-----------------------------------------------------------------------------
; write 2 bytes from memory to EEPROM, both bytes need to go into the same EEPROM bank
;
; memory_address: address:2 containing start address in memory (bank safe)
; eeprom_address: address:2 containing start address in EEPROM
;
EEPROM_II_WRITE		macro	memory_address, eeprom_address
	movlw	HIGH(eeprom_address)	; extract bank in EEPROM
	movwf	EEADRH					; set     bank in EEPROM
	movlw	LOW (eeprom_address)	; extract start address in EEPROM
	movwf	EEADR					; set     start address in EEPROM
	lfsr	FSR1,memory_address		; set start address in memory
	movlw	.2						; write 2 bytes
	call	eeprom_write_common		; execute write
	endm


;-----------------------------------------------------------------------------
; write 3 bytes from memory to EEPROM, all bytes need to go into the same EEPROM bank
;
; memory_address: address:2 containing start address in memory (bank safe)
; eeprom_address: address:2 containing start address in EEPROM
;
EEPROM_TT_WRITE		macro	memory_address, eeprom_address
	movlw	HIGH(eeprom_address)	; extract bank in EEPROM
	movwf	EEADRH					; set     bank in EEPROM
	movlw	LOW (eeprom_address)	; extract start address in EEPROM
	movwf	EEADR					; set     start address in EEPROM
	lfsr	FSR1,memory_address		; set start address in memory
	movlw	.3						; write 3 bytes
	call	eeprom_write_common		; execute write
	endm


;-----------------------------------------------------------------------------
; write a range of bytes from memory to EEPROM, all bytes need to go into the same EEPROM bank
;
; memory_address: address:2 containing start address in memory (bank safe)
; eeprom_address: address:2 containing start address in EEPROM
; range         : number of bytes to write (1-256), will wrap-around staying in same EEPROM bank!
;
EEPROM_RR_WRITE		macro	memory_address, eeprom_address, range
	movlw	HIGH(eeprom_address)	; extract bank in EEPROM
	movwf	EEADRH					; set     bank in EEPROM
	movlw	LOW (eeprom_address)	; extract start address in EEPROM
	movwf	EEADR					; set     start address in EEPROM
	lfsr	FSR1,memory_address		; set start address in memory
	movlw	low(range)				; set size of range to write
	call	eeprom_write_common		; execute write
	endm


;-----------------------------------------------------------------------------
; set up EEPROM address register for subsequent read/write operations
;
; eeprom_address: address:2 containing the EEPROM address to set up
;
EEPROM_SET_ADDRESS	macro	eeprom_address							; Set EEPROM address
	movlw	HIGH(eeprom_address)	; extract bank in EEPROM		; for subsequent calls to
	movwf	EEADRH					; set     EEPROM bank			; write_eeprom / read_eeprom
	movlw	LOW (eeprom_address)	; extract start address in EEPROM
	movwf	EEADR					; set     EEPROM cell
	endm



; --------------------------------------------------------------------------------------------
;
;           Serial Read & Write Macros
;
; --------------------------------------------------------------------------------------------


;-----------------------------------------------------------------------------
; Receive 1 Byte and write to Memory
;
; in case of a Timeout the Flag 'rs232_rx_timeout' will be set
;
SERIAL_CC_RECEIVE	macro	mem_address
	extern	serial_rx_single
	call	serial_rx_single			; (try to) receive one byte
	movff	RCREG1,mem_address			; copy received byte to memory
	endm


;-----------------------------------------------------------------------------
; Stream a Range of Bytes to Memory
;
; in case of a Timeout the Flag 'rs232_rx_timeout' will be set
;
; mem_address: address:2 containing the start address in memory (bank safe)
; range      : number of bytes to receive (1-256)
;
SERIAL_RR_RECEIVE	macro	mem_address, range
	lfsr	FSR2,mem_address			; set start address in memory
	movlw	low(range)					; set number of bytes to receive
	extern	serial_rx_stream
	call	serial_rx_stream
	endm


;-----------------------------------------------------------------------------
; Send 1 Byte Literal
;
SERIAL_LC_SEND	macro	literal
	call	rs232_wait_tx				; wait for completion of last transmit
	movlw	literal						; load literal
	movwf	TXREG1						; send literal to serial TX
	endm


;-----------------------------------------------------------------------------
; Send 1 Byte from Memory
;
; mem_address: address:2 containing the source address in memory (bank safe)
;
SERIAL_CC_SEND	macro	mem_address
	call	rs232_wait_tx				; wait for completion of last transmit
	movff	mem_address,TXREG1			; send byte from memory to serial TX
	endm


;-----------------------------------------------------------------------------
; Send a Range of Bytes from Memory
;
; mem_address: address:2 containing the start address in memory (bank safe)
; range      : number of bytes to send (1-256)
;
SERIAL_RR_SEND	macro	mem_address, range
	lfsr	FSR2,mem_address			; set start address in memory
	movlw	low(range)					; set number of bytes to send
	extern	serial_tx_steam
	call	serial_tx_steam
	endm


; --------------------------------------------------------------------------------------------
;       EXTERN Directives
; --------------------------------------------------------------------------------------------

 IFNDEF INSIDE_EEPROM_RS232

; EEPROM - basic read & write

	extern	eeprom_read_common
	extern	eeprom_write_common

	extern	read_eeprom
	extern	write_eeprom


; EEPROM high-level access

	extern	eeprom_serial_number_read

	extern	eeprom_total_dives_read
	extern	eeprom_total_dives_write

	extern	eeprom_log_offset_read
	extern	eeprom_log_offset_write

	extern	eeprom_battery_gauge_read
	extern	eeprom_battery_gauge_write

	extern	eeprom_deco_data_read
	extern	eeprom_deco_data_write


; Serial - IR / S8

	extern	enable_ir_s8_analog
	extern	disable_ir_s8_analog
	extern	ir_s8_tx_single


; Serial - RS232 (USB / BT)

	extern	enable_rs232
	extern	disable_rs232
	extern	rs232_wait_tx


 ENDIF	; INSIDE_EEPROM_RS232