📄 api.a51
字号:
;*A**************************************************************************
; NAME: api.a51
;----------------------------------------------------------------------------
; CREATED_BY: F. FOSSE
; COMPANY: ATMEL-WM
; CREATION_DATE: 28/04/2001
; AUTHOR: $author: $
; REVISION: $version: $
; DATE: $date: $
;----------------------------------------------------------------------------
; PURPOSE: This file contains the API routines
;
;----------------------------------------------------------------------------
; NOTES: These API routines are based on the T89C51CC01 V1.2
; API_ENTRY_MODULE address defined in BL51 LOCATE options
;
;****************************************************************************
; CHANGES:
;
;****************************************************************************
$TITLE (*** API Routines ***)
API_MODULE SEGMENT CODE
API_ENTRY_MODULE SEGMENT CODE
;_____ I N C L U D E S ____________________________________________________
$include (config.inc)
$include (register.inc)
$include (api.inc)
;_____ M A C R O S ________________________________________________________
;_____ D E F I N I T I O N ________________________________________________
;_____ D E C L A R A T I O N ______________________________________________
PUBLIC api_entry, api_program_fuse_bit
EXTRN CODE (fm_read_xrow, fm_program_xrow, fm_program_xrow_byte)
EXTRN CODE (fm_read_user_byte, fm_program_user, fm_program_user_byte)
EXTRN CODE (fm_read_hardware_byte, fm_program_fuse)
EXTRN CODE (erase_block_8k, erase_block_16k)
;*F***************************************************************************
; NAME: api_entry
;-----------------------------------------------------------------------------
; PARAMS: R1: API id to execute
;
; RETURN:
;
;-----------------------------------------------------------------------------
; PURPOSE: api parser program
;
;*****************************************************************************
RSEG API_MODULE
api_entry:
label_00:
cjne R1,#API_ID_READ_ID,label_01
ajmp api_read_id
label_01:
cjne R1,#API_ID_ERASE_BLOCK,label_02
ajmp api_erase_block
label_02:
cjne R1,#API_ID_PROG_DATA,label_03
ajmp api_program_data
label_03:
cjne R1,#API_ID_READ_DATA,label_04
ajmp api_read_data
label_04:
cjne R1,#API_ID_ERASE_BYTES,label_05
ajmp api_erase_bytes
label_05:
cjne R1,#API_ID_PROG_SSB,label_06
ajmp api_program_ssb
label_06:
cjne R1,#API_ID_PROG_SBV_BSB,label_07
ajmp api_program_xrow
label_07:
cjne R1,#API_ID_READ_BYTES,label_08
ajmp api_read_bytes
label_08:
label_09:
cjne R1,#API_ID_PROG_PAGE,label_0a
ajmp api_program_user_page
label_0a:
cjne R1,#API_ID_PROG_FUSE,label_0b
ajmp api_program_fuse_bit
label_0b:
cjne R1,#API_ID_READ_FUSE,label_0c
ajmp fm_read_hardware_byte
label_0c:
label_0d:
label_0e:
cjne R1,#API_ID_READ_BOOT_ID,label_0f
ajmp api_read_boot_id
label_0f:
cjne R1,#API_ID_BOOT_VERSION,label_10
ajmp api_read_boot_version
label_10:
ret
;*F***************************************************************************
; NAME: api_read_id
;-----------------------------------------------------------------------------
; PARAMS: DPL: 30h: Manufacturer Id
; 31h: Device Id 1
; 60h: Device Id 2
; 61h: Device Id 3
;
; RETURN: ACC: id value
;
; MODIFIED:
;
;-----------------------------------------------------------------------------
; PURPOSE: read component id
;
;*****************************************************************************
api_read_id:
mov A,DPL
cjne A,#MANUF_ID,api_read_id1
mov DPL,#MANUF_ID_ADDRESS
ajmp fm_read_xrow
api_read_id1:
cjne A,#DEVICE_ID1,api_read_id2
mov DPL,#DEVICE_ID1_ADDRESS
ajmp fm_read_xrow
api_read_id2:
cjne A,#DEVICE_ID2,api_read_id3
mov DPL,#DEVICE_ID2_ADDRESS
ajmp fm_read_xrow
api_read_id3:
mov DPL,#DEVICE_ID3_ADDRESS
ajmp fm_read_xrow
;*F***************************************************************************
; NAME: api_erase_block
;-----------------------------------------------------------------------------
; PARAMS: DPTR: start address and block selection
;
; RETURN:
;
; MODIFIED: DPTR, ACC, R0, R1
;
;-----------------------------------------------------------------------------
; PURPOSE: erase some blocks
;
;*****************************************************************************
api_erase_block:
mov A,DPH
cjne A,#BLOCK0_SELECT,api_erase_b1
ajmp erase_block_8k
api_erase_b1:
cjne A,#BLOCK1_SELECT,api_erase_b2
ajmp erase_block_8k
api_erase_b2:
cjne A,#BLOCK2_SELECT,api_erase_b3
ajmp erase_block_16k
api_erase_b3:
cjne A,#BLOCK3_SELECT,api_erase_b4
ajmp erase_block_16k
api_erase_b4:
cjne A,#BLOCK4_SELECT,api_erase_end
ajmp erase_block_16k
api_erase_end:
ret
;*F***************************************************************************
; NAME: api_program_data
;-----------------------------------------------------------------------------
; PARAMS: DPTR: address to program
; ACC: data to program
;
; RETURN:
;
; MODIFIED: ACC
;
;-----------------------------------------------------------------------------
; PURPOSE: program a value in SSB byte
;
;*****************************************************************************
api_program_data:
ajmp fm_program_user_byte
;*F***************************************************************************
; NAME: api_read_data
;-----------------------------------------------------------------------------
; PARAMS: DPTR: address to read
;
; RETURN: ACC: value read
;
; MODIFIED:
;
;-----------------------------------------------------------------------------
; PURPOSE: return a USER data byte value
;
;*****************************************************************************
api_read_data:
ajmp fm_read_user_byte
;*F***************************************************************************
; NAME: api_erase_bytes
;-----------------------------------------------------------------------------
; PARAMS:
;
; RETURN:
;
; MODIFIED: DPTR, ACC
;
;-----------------------------------------------------------------------------
; PURPOSE: erase SBV and BSB
;
;*****************************************************************************
api_erase_bytes:
mov DPH,#00h
mov FCON,#SEL_XROW_CL ; map XROW column latch in XRAM space
mov DPL,#BSB_ADDRESS
mov A,#0FFh
movx @DPTR,A ; erase BSB
mov DPL,#SBV_ADDRESS
mov A,#BOOT_BASE_ADDRESS
movx @DPTR,A ; reset BSB
ajmp fm_program_xrow
;*F***************************************************************************
; NAME: api_program_ssb
;-----------------------------------------------------------------------------
; PARAMS: DPL: 00h: level 0
; 01h: level 1
; 02h: level 2
;
; RETURN:
;
; MODIFIED: DPH, ACC, R0, R1
;
;-----------------------------------------------------------------------------
; PURPOSE: program a value in SSB byte
;
;*****************************************************************************
api_program_ssb:
mov A,DPL
mov DPL,#SSB_ADDRESS
ajmp fm_program_xrow_byte
;*F***************************************************************************
; NAME: api_program_xrow
;-----------------------------------------------------------------------------
; PARAMS: DPL: 00h: BSB byte selection
; 01h: SBV byte selection
; 06h: EB byte selection
; ACC: value to program
;
; RETURN:
;
;-----------------------------------------------------------------------------
; PURPOSE: program a value in SBV or BSB byte
;
;*****************************************************************************
api_program_xrow:
; mov R1,A
; mov A,DPL
; jz api_program_bsb
;api_program_sbv:
; cjne A, #SBV_ADDRESS api_program_eb
; mov A,R1
; mov DPL,#SBV_ADDRESS
; sjmp api_program_xrow_end
;api_program_sbv:
; cjne A, #EB_ADDRESS api_program_eb
; mov A,R1
; mov DPL,#EB_ADDRESS
; sjmp api_program_xrow_end
;api_program_bsb:
; mov A,R1
; mov DPL,#BSB_ADDRESS
;api_program_xrow_end:
ajmp fm_program_xrow_byte
;*F***************************************************************************
; NAME: api_program_user_page
;-----------------------------------------------------------------------------
; PARAMS: ACC: number of byte to program
; DPTR0: destination address in USER
; DPTR1: source address in XRAM
;
; RETURN:
;
; MODIFIED: DPTR0, DPTR1, ACC, R0
;
;-----------------------------------------------------------------------------
; PURPOSE: program one data page
;
;*****************************************************************************
api_program_user_page:
anl AUXR1, #0FEh ; select DPTR0: DPS= 0
mov R0,A
api_program_user_loop:
inc AUXR1 ; select DPTR1
anl FCON,#NOT(SEL_USER_CL) ; map data in XRAM space
movx A,@DPTR ; read one source byte
inc DPTR
inc AUXR1 ; select DPTR0
orl FCON,#SEL_USER_CL ; map USER column latch in XRAM space
movx @DPTR,A ; copy data in CL
inc DPTR
djnz R0,api_program_user_loop
ajmp fm_program_user
;*F***************************************************************************
; NAME: api_program_fuse_bit
;-----------------------------------------------------------------------------
; PARAMS: DPL: 01: fuse 0
; 02: fuse 1
; 04: fuse 2 BLJB
; 08: fuse 3 X2B
; ACC: 00: program fuse
; 01: erase fuse
; RETURN:
;
; MODIFIED: ACC, R0, R1, R2
;
;-----------------------------------------------------------------------------
; PURPOSE: set or clear fuse bit
;
;*****************************************************************************
api_program_fuse_bit:
mov R2,A
mov A,DPL
swap A ; ACC= mask of bit in hardware byte
mov R0,A ; R0= mask of bit in hardware byte
acall fm_read_hardware_byte ; ACC= hardware byte
mov R1,A ; R1= hardware byte
cjne R2,#01h,api_clr_fuse
api_set_fuse:
mov A,R0
orl A,R1
ajmp api_program_fuse_end
api_clr_fuse:
mov A,R0
cpl A
anl A,R1
api_program_fuse_end:
ajmp fm_program_fuse ; must be ajmp for API call
;*F***************************************************************************
; NAME: api_read_bytes
;-----------------------------------------------------------------------------
; PARAMS: DPL: 00h: SSB byte selection
; 01h: BSB byte selection
; 02h: SBV byte selection
;
; RETURN: ACC: byte value
;
; MODIFIED: DPL
;
;-----------------------------------------------------------------------------
; PURPOSE: return SSB, BSB, or SBV byte value
;
;*****************************************************************************
api_read_bytes:
mov A,DPL
api_read_ssb:
cjne A,#SSB_SEL_RD,api_read_bsb
mov DPL,#SSB_ADDRESS
sjmp api_read_bytes_end
api_read_bsb:
cjne A,#BSB_SEL_RD,api_read_sbv
mov DPL,#BSB_ADDRESS
sjmp api_read_bytes_end
api_read_sbv:
cjne A,#SBV_SEL_RD,api_read_eb
mov DPL,#SBV_ADDRESS
sjmp api_read_bytes_end
api_read_eb:
mov DPL,#EB_ADDRESS
api_read_bytes_end:
ajmp fm_read_xrow
;*F***************************************************************************
; NAME: api_read_boot_id
;-----------------------------------------------------------------------------
; PARAMS: DPL: 00h: boot ID1 selection
; 01h: boot ID2 selection
;
; RETURN: ACC: selected boot ID
;
; MODIFIED:
;
;-----------------------------------------------------------------------------
; PURPOSE: return boot ID1 or boot ID2 value
;
;*****************************************************************************
api_read_boot_id:
mov A,DPL
jnz api_read_boot_id2
mov A,#BOOT_ID1_VALUE
ajmp api_read_boot_end
api_read_boot_id2:
mov A,#BOOT_ID2_VALUE
api_read_boot_end:
ret
;*F***************************************************************************
; NAME: api_read_boot_version
;-----------------------------------------------------------------------------
; PARAMS:
;
; RETURN: ACC: version value
;
;-----------------------------------------------------------------------------
; PURPOSE: return bootloader version
;
;*****************************************************************************
api_read_boot_version:
mov A,#BL_VERSION ; version value is transferred in ACC
ret
; API ENTRY POINT
;****************
RSEG API_ENTRY_MODULE
api_call_entry:
ljmp api_entry
;*F***************************************************************************
; NAME: api_program_user
;-----------------------------------------------------------------------------
; PARAMS:
;
; RETURN:
;
;-----------------------------------------------------------------------------
; PURPOSE: launch programming of CL in USER
; product engineer program user function
;
;*****************************************************************************
api_program_user:
mov FCON,#(FPL_S0 OR FMOD_USER_MSK) ; launch USER programming
mov FCON,#(FPL_S1 OR FMOD_USER_MSK)
api_program_user_busy:
mov A,FCON
jb ACC.0,api_program_user_busy
ret
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -