📄 jtag_opt.s
字号:
; --------------------------------------------------------------------------
; -- COPYRIGHT --
; --------------------------------------------------------------------------
; -- --
; -- Copyright (C) 1999-2000 ATMEL Rousset --
; -- --
; -- All rights reserved. Reproduction in whole or part is prohibited --
; -- without the written permission of the copyright owner --
; -- --
; --------------------------------------------------------------------------
; -- CONFIDENTIALITY --
; --------------------------------------------------------------------------
; -- --
; -- This file and its contents are confidential and subject to a --
; -- NON-DISCLOSURE agreement. The use of any data contained herein is --
; -- controlled by the terms of this NON-DISCLOSURE agreement. --
; -- --
; --------------------------------------------------------------------------
; NAME
; jtag_opt.s
;
; VERSION
; 1.0 24.12.00 O. DEBICKI Creation
; 1.1 EKB1 5.4.01 DLJ added functions SET_BRKSLP and CLR_BRKSLP, added SET_BRKSLP to JTAG_reset
; Defined BRKLSP_MASK
; DESCRIPTION
; Describe low level functions to generate JTAG signal on PIO.
;
; EXPORTED FUNCTIONS
; EXPORT JTAG_Reset
; EXPORT JTAG_Shift_ir
; EXPORT JTAG_Shift_dr_4_bits
; EXPORT JTAG_IDCode
; EXPORT JTAG_Step
; EXPORT JTAG_Step_System_Speed
; EXPORT JTAG_Read_Bkru
; EXPORT JTAG_Write_Bkru
;
; WARNING
; !!!! macro INIT_JTAG hard code the PIO base address !!!!
; --------------------------------------------------------------------------
AREA reset, CODE, READONLY, INTERWORK
INCLUDE parts/r40008/r40008.inc
TDI_MASK EQU (1:SHL:8)
TDO_MASK EQU (1:SHL:5)
TMS_MASK EQU (1:SHL:7)
TCK_MASK EQU (1:SHL:6)
SUCCESS EQU 0
FAILED EQU 1
JTAG_WATCH_DOG EQU 0x100
EXPORT JTAG_Reset
EXPORT JTAG_Shift_ir
EXPORT JTAG_Shift_dr_4_bits
EXPORT JTAG_IDCode
EXPORT JTAG_Step
EXPORT JTAG_Step_System_Speed
EXPORT JTAG_Read_Bkru
EXPORT JTAG_Write_Bkru
; ==============================================
; Define following MACROS
; - CLR_TMS
; - SET_TMS
; - TOGGLE_TCK
; - TDO_VALUE
; - TDI
;
; Registers used by JTAG macros:
; r4 Used by INIT_JTAG and END_JTAG, base address PIO_BASE
; r5 Used as scratch register
; ----------------------------------------------
MACRO
INIT_JTAG
; Init r4 which is = #PIO_BASE
; Backup the context
STMFD sp!, {r4-r11, lr}
; ***************** BEWARE TARGET DEPENDANT *******************
MOV r4, #0xFF000000
ORR r4, r4, #0x00FF0000
; *************************************************************
MEND
MACRO
END_JTAG
; Backup ctxt, return success
LDMFD sp!, {r4-r11, lr}
BX lr
MEND
; -------------------------------------------
MACRO
CLR_TMS
MOV r5, #TMS_MASK
STR r5, [r4, #PIO_CODR]
MEND
MACRO
SET_TMS
MOV r5, #TMS_MASK
STR r5, [r4, #PIO_SODR]
MEND
; --------------------------------------------------------
; MOV r0, r0 added because TCK low need a minimum of 50ns
; BEWARE : Target dependant
MACRO
TOGGLE_TCK
MOV r5, #TCK_MASK
STR r5, [r4, #PIO_CODR]
MOV r0, r0
MOV r0, r0
MOV r0, r0
STR r5, [r4, #PIO_SODR]
MEND
; -------------------------------------------
MACRO
TDO_VALUE
; Z = 1 => tdo = 0
; Z = 0 => tdo = 1
LDR r5, [r4, #PIO_PDSR]
ANDS r5, r5, #TDO_MASK
MEND
; -------------------------------------------
MACRO
TDI
; Z = 1 => Clear TDI
; Z = 0 => Set TDI
MOV r5, #TDI_MASK
STREQ r5, [r4, #PIO_CODR]
STRNE r5, [r4, #PIO_SODR]
MEND
; -------------------------------------------
; This macro is used to go to the Select-DR-Scan from
; Shift-DR or Shift-IR staying $reg TCK ticks in
; Run-Test/Idle
; Argument:
; reg: register initialized with iddleState value
MACRO
GOTO_SDRS
SET_TMS;
TOGGLE_TCK ; // Exit1-IR
MOV r0, r0
MOV r0, r0 ; // Needed to respect 50ns of TCK high
TOGGLE_TCK ; // Update-IR
CLR_TMS
TOGGLE_TCK ; // RUN_TEST_IDLE
SET_TMS
TOGGLE_TCK ; // Select-DR-Scan
MEND
; -------------------------------------------
; This macro is used to read & write DR register
; Argument:
; bitMask: bit to be considered
; regIn: register variable used as input
; regOut: register variable used as output
; regScratch: register used as scratch with ANDS
MACRO
RW_JTAG $bitMask, $regIn, $regOut, $regScratch
TOGGLE_TCK ; // Shift-IR
; ANDS $regScratch, $regIn, $bitMask
; TDI
TDO_VALUE
ORRNE $regOut, $regOut, $bitMask
MEND
; --------------------------------------------
; This macro is used to write only DR register
; Argument:
; bitMask: bit to be considered
; regIn: register variable used as input
; regScratch: register used as scratch with ANDS
MACRO
W_JTAG $bitMask, $regIn, $regScratch
TOGGLE_TCK ; // Shift-IR
ANDS $regScratch, $regIn, $bitMask
TDI
MEND
; -------------------------------------------
; This macro is used to go to the Capture-DR tapstate
; from Select-DR-Scan
; Argument:
; None
MACRO
GOTO_C_DR
CLR_TMS ;
TOGGLE_TCK ; // Capture-DR
MEND
; -------------------------------------------
; This macro is used to go to the Capture-IR tapstate
; from Select-DR-Scan
; Argument:
; None
MACRO
GOTO_C_IR
TOGGLE_TCK ; // Select-IR-Scan
CLR_TMS ;
TOGGLE_TCK ; // Capture-IR
MEND
; ==============================================
; FUNCTION: JTAG_Reset
; This function bring the TAP controller to state Select-DR-Scan
; regardless of the state it was in upon entry. It will pass through the reset */
; Arguments:
; Return value:
; r14: return address
; Registers used by JTAG macros:
; r5 pointer to PIO_CODR
; r6 value to write in PIO_CODR
; r7 value to write in PIO_SODR
; r8 value read in PIO_ODSR
; ----------------------------------------------
JTAG_Reset
; Init r5, r6, r7
INIT_JTAG
SET_TMS ;
TOGGLE_TCK ;
MOV r0, r0
MOV r0, r0
TOGGLE_TCK ;
MOV r0, r0
MOV r0, r0
TOGGLE_TCK ;
MOV r0, r0
MOV r0, r0
TOGGLE_TCK ;
MOV r0, r0
MOV r0, r0
TOGGLE_TCK ;
MOV r0, r0
MOV r0, r0
TOGGLE_TCK ;
MOV r0, r0
MOV r0, r0
TOGGLE_TCK ;
MOV r0, r0
MOV r0, r0
TOGGLE_TCK ;
MOV r0, r0
MOV r0, r0
TOGGLE_TCK ; // test-Logic-reset
CLR_TMS ;
TOGGLE_TCK ; // Run-Test/Idle
SET_TMS ;
TOGGLE_TCK ; // Select-DR-Scan
END_JTAG
; ==============================================
; FUNCTION: JTAG_Shift_ir
; Push an instruction in the JTAG IR register
; Assume that TAP controller is supposed to be in Select-DR-Scan
; Assume that IR length = 4
; Arguments:
; r0: instruction
; r1: iddleState
; Return value:
; r0: 1 => SUCESS 0=> FAILED
; r14: return address
; TAP controller is now supposed to be in Select-DR-Scan or in Run-Test/Idle
; Registers used by this function:
; r9: scratch register
; Registers used by JTAG macros:
; r4 Used by INIT_JTAG and END_JTAG
; r5 pointer to PIO_CODR
; r6 value to write in PIO_CODR
; r7 value to write in PIO_SODR
; r8 value read in PIO_ODSR
; ----------------------------------------------
JTAG_Shift_ir
INIT_JTAG
GOTO_C_IR ; // Goto Capture-IR
MOV r0, r0
MOV r0, r0
TOGGLE_TCK ; // Shift-IR
ANDS r9, r0, #(1:SHL:0)
TDI
TOGGLE_TCK ; // Shift-IR 0
ANDS r9, r0, #(1:SHL:1)
TDI
TOGGLE_TCK ; // Shift-IR 1
ANDS r9, r0, #(1:SHL:2)
TDI
TOGGLE_TCK ; // Shift-IR 2
ANDS r9, r0, #(1:SHL:3)
TDI ; // Shift-IR 3
GOTO_SDRS
END_JTAG
; ==============================================
; ==============================================
; FUNCTION: JTAG_Shift_dr_4_bits
; Push a data in the JTAG DR register
; Assume that TAP controller is supposed to be in Select-DR-Scan
; Arguments:
; r0: length
; r1: data
; r2: iddleState
; Return value:
; r0: 1 => SUCESS 0=> FAILED
; r14: return address
; TAP controller is now supposed to be in Select-DR-Scan or in Run-Test/Idle
; Registers used by this function:
; r9: scratch register
; Registers used by JTAG macros:
; r4 Used by INIT_JTAG and END_JTAG
; r5 pointer to PIO_CODR
; r6 value to write in PIO_CODR
; r7 value to write in PIO_SODR
; r8 value read in PIO_ODSR
; ----------------------------------------------
JTAG_Shift_dr_4_bits
INIT_JTAG
GOTO_C_DR ; // Goto Capture-DR
MOV r0, r0
MOV r0, r0
TOGGLE_TCK ; // Shift-IR
ANDS r9, r0, #(1:SHL:0)
TDI
TOGGLE_TCK ; // Shift-DR
ANDS r9, r0, #(1:SHL:1)
TDI
TOGGLE_TCK ; // Shift-DR
ANDS r9, r0, #(1:SHL:2)
TDI
TOGGLE_TCK ; // Shift-DR
ANDS r9, r0, #(1:SHL:3)
TDI ; // Shift-DR
GOTO_SDRS
END_JTAG
; ==============================================
JTAG_IDCode
INIT_JTAG
MOV r6, #1
MOV r6, r6, LSL #31 ; init bitMask
MOV r8, #0
GOTO_C_DR
MOV r7, #0
ANDS r9, r7, #(1:SHL:0)
TDI ; // TDI = 0
TOGGLE_TCK ; // SHIFT_DR
MOV r0, r0
MOV r0, r0
TOGGLE_TCK
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_31
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_30
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_29
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_28
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_27
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_26
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_25
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_24
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_23
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_22
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_21
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_20
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_19
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_18
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_17
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_16
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_15
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_14
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_13
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_12
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_11
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_10
MOV r6, r6, LSR #1 ; // Update the bitMask
TOGGLE_TCK ; // SHIFT_DR
TDO_VALUE
ORRNE r8, r8, r6 ; // SHIFT_DR id_code_9
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -