[vitis] Zynq7000 QSPI Boot 상태에서 QSPI 프로그래밍 안될 때

[vitis] FSBL change boot MODE

enter image description here

[vitis] Zynq7000 QSPI Boot 상태에서 QSPI 프로그래밍 안될 때

https://adaptivesupport.amd.com/s/article/70548?language=en_US

문제 상황

Vitis에서 Zynq-7000 보드의 QSPI 플래시에 이미지를 프로그램하려 고 하면 다음과 같은 경고 메시지가 출력될 수 있다.

Flash programming is not supported with the selected boot mode. If flash programming fails, configure device for JTAG boot mode and try again.

TE0726-03 이라는 ZYNQ 개발보드로 외부 딥스위치로 BOOT MODE 변경이 안되는 제품 한정 상황

원인 분석

QSPI Boot 모드에서의 Flash Programming 제한

Zynq-7000 디바이스가 QSPI Boot 모드로 설정된 상태에서는, Vivado/Vitis Flash Programmer가 QSPI 플래시에 직접 쓰는 동작을 제한한다.

이는 툴의 오류가 아니라, Zynq 부트 구조상 의도된 동작이다.
툴은 PS의 BOOT_MODE 레지스터 값을 읽어 현재 부트 모드를 판단한 뒤, QSPI 모드일 경우 경고를 출력하고 프로그래밍을 중단한다.

중요한 점

  • 이 제한은 ps7_init.tcl, FSBL, 또는 소프트웨어 설정 문제가 아니다.
  • BOOT_MODE는 하드웨어 스트랩(MIO 핀, DIP 스위치, 점퍼)에 의해 결정된다.
  • 소프트웨어나 TCL 스크립트로 QSPI <-> JTAG 부트 모드를 변경할 수 없다.

해결 방법

1. 부트 모드를 JTAG으로 변경(가장 일반적인 추천 방법)

보드의 BOOT MODE 스위치(DIP 또는 점퍼)를 JTAG Boot 모드로 설정한 후 전원을 다시 인가한다.
JTAG 모드에서는:

  • PS가 외부 플래시를 부트 디바이스로 사용하지 않음
  • Flash Programmer가 안전하게 QSPI 플래시에 접근 가능

2. Flash Programming 수행

Vivado 또는 Vitis에서 QSPI Flash Programming을 정상적으로 수행한다.

3. 부트 모드를 QSPI로 복원

프로그램 완료 후, BOOT MODE를 다시 QSPI로 변경하고 전원을 재인가하여 정상 부팅을 확인한다.

일반적인 해결 방법이 안되는 상황일 경우

ZYNQ FPGA 보드에 외부 BOOT MODE 변경이 안되는 상황이라면 FSBL을 수정하여 부트모드로 변경할 수 있다.
생성된 FSBL의 main.c 파일 안에 main() 함수 안에 다음과 같은 코드가 있는데 한줄을 추가하면 된다.

/*
* Read bootmode register
*/
BootModeRegister = Xil_In32(BOOT_MODE_REG);
BootModeRegister &= BOOT_MODES_MASK;

//add this line to trick boot mode to JTAG
BootModeRegister = JTAG_MODE;

BootModeRegister = JTAG_MODE; 이 코드 한줄 추가하면 된다.

코드 추가된 FSBL.elf 파일을 따로 하나 만들어두고

  • Flash Write 할 때 FSBL을 선택할 수 있는데 이때 JTAG_MODE 추가된 코드로 부팅해서 Flash Write하게 할 수 있다.
  • QSPI BOOT MODE 일 경우에도 JTAG RUN 동작 시 FSBL을 JTAG_MODE FSBL을 선택하면 쓰기를 할 수 있다.

보통은 보드에 딥스위치 형태로 부트모드 변경이 가능하기 떄문에 이런 경우가 많지는 않지만
특수한 경우에 활용하면 될 것 같다.(VIVADO 2017.3 버전 이후 가능)

끝 :)

댓글 쓰기

0 댓글