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

📄 jtag_opt.s

📁 使用JTAG口对AT91R40008芯片进行FLASH编程的程序
💻 S
📖 第 1 页 / 共 3 页
字号:
; --------------------------------------------------------------------------
; --                                 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 + -