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

📄 api.a51

📁 AT89C51CC02RSR232引导程序C51源代码
💻 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 + -