에 접속해 debian > images > alip-armhf > latest > linaro-jessie-alip-20161117-32.tar.gz 를 다운 받는다.
그리고 처음으로 나와서, archive > ubuntu > images > gnome > latest > linaro-vivid-gnome-20151215-714.tar.gz 도 다운받는다.
그리고 이전까지 사용했던 arm_fpga_hdmi_output 프로젝트를 살짝 수정해서 사용한다.
블록 디자인을 열어 주고, ZYNQ PS를 더블클릭 해 준다.
다음 그림에 해당하는 항목을 체크 해 준다.
아마 여기까지는 다 되어 있을 확률이 높다.
다음은 안 되어있을 것이므로 체크해 준다.
다음은 MDIO를 배치해야 인터넷이 정상적으로 동작한다고 한다.
이쪽에서는 주의해서 볼 필요가 있다.(아마 다 되어 있을 것임)
클럭도 확인해 준다. 아마 값이 같게 설정되어 있을 것이다.
클럭설정까지 마쳤다면 다시 MIO 설정으로 돌아와 USB reset 세팅을 다시 해 준다.
GPIO는 아마 되어 있을 것이다.
DDR 세팅도 봐 준다.
다음은 인터럽트 세팅이다.
다음과 같이 설정 해 준다.
다 했다면 OK를 눌러 나온다.
이후 기타 설계 변경 사항으로, AXIGPIO 모듈과 HDMIHPD 신호를 삭제해 HDMI 삽입을 능동적으로 감지를 없애고 인터페이스가 능동적으로 출력하게 한다. HDMI은 원래 32비트인데 우리는 데이터를 정렬해서 24비트로 변환했으므로 axi-streamsubset converter 모듈도 함께 삭제한다.
AXI GPIO를 in0 으로 받던 Concat은 input 라인을 2로 줄여 준다.
이후 초기화 된 in2를 다시 in0에 연결해 준다.
AXI4-Stream to video out 출력 video out을 RGB_DVI에 직접 연결했고, axi-stream subsetconverter 를 삭제해 더 이상 변환이 불필요하다.
그리고 AXI-GPIO를 삭제했기 때문에 AXI Interconnect 모듈에 인터페이스가 하나 부족해진다.
따라서 다음과 같이 설정한다.
AXI Interconnect 모듈을 더블클릭해 마스터 인터페이스를 3으로 조정 해 준다.
Image Packaging Configuration > Root filesystem type > SD card 선택 > 아래 Save > OK > Exit > Esc 두번 눌러서 다시 메인 화면으로 > Linux Components Selection > linux-kernel > ext-local-src > External linux-kernel local source settings > External linux-kernel local source path > /petalinux_prj/linux_kernel 기입(사진참고, petalinux_prj 소스는 자기 환경에 맞게 설정하기) > OK > 아래 Save > OK > Exit > Esc 또는 Exit 계속 해서 나가기
아까 지정했던 /petalinux_prj/linux_kernel 을 만족하기 위해 /petalinux_prj 위치에서
$ mkdir linux_kernel
을 사용해 폴더를 하나 생성 해 준다.
이후 Linaro LINUX 파일을 모두 VM으로 옮겨 온다.
추가로 셀러가 제공해 준 5) linux software 의 linux-4.14.0-v2018.3.tar.gz 도 가져 와야 한다.
그럼 파일이 이렇게 3개 남게 된다.
그런데 나는 조금 불안해서 petalinux_prj 하위에 kernel_software 라는 폴더를 만들어 이 3개를 거기에다가 저장했다.
$ tar --gzip -zxvf <linux-4.14.0-v2018.3.tar.gz 있는 위치>
실행해 준다.
다시 petalinux_desktop 프로젝트로 돌아가서
$ petalinux-config -c kernel
을 완료해 준다.
(오류가 나면 linux-4.14.0 파일의 owner, group 을 자기 자신으로 세팅하고 다시 해보자)
진행되다 보면 커널 설정이 나온다.
아래 쭉 내려서 Device Drivers > Graphics support > Digilent VGA/HDMI DRM Encoder Driver, Xilinx LCD/HDMI driver support 두 항목이 체크되어 있는지 확인한다.(기본값은 체크 되어 있음.)
다 했다면 Exit 로 나오자. 만약 수정 사항이 있다면 save 해야 한다.
뭐 다운받을게 이렇게 많은지 모르겠는데, 계속 나온다.
셀러가 제공해 준 파일에서, 3)sample projects > 7010 > linux 어쩌고 > 02 (내 임의로 linarolinux라 이름붙임) > system-user.dtsi 파일을 vm으로 옮겨 주자.
다운받은 이 파일은 좀 복잡한 폴더로 넣을 예정이다. 내 경우 경로가
/peta/petalinux_prj/petalinux_desktop_project-spec/meta-user/recipes-bsp/device-tree/files 내에 있는 system-user.dtsi 파일을 교체해 준다.
교체했다면 petalinux_desktop 프로젝트 폴더에서
$ petalinux-build
로 빌드를 시작한다.
오류 메세지가 하나 나왔지만 일단 진행 해 본다.
TFTPBOOT 폴더에 접근을 할 수 없어서 카피를 건너뛰었다고 나온다.
컨픽에서 설정을 다시 해주기는 귀찮다.
일단 BOOT.BIN 은 생성되었으니 사용해 본다.
- 추후 수정 예정 -
일단 먼저 진행했는데
유선 라인으로는 잘 동작하긴 하는데 디스플레이 되는 화면에 아무것도 나타나지 않아 해결을 좀 해야 할 것 같다..
설정 상에서 뭔가 잘 못 건든 것 같다. 셀러가 제공해 준 BOOT.BIN, image.ub 는 정상인걸 보면 말이다.
axi_dynclk_v1_0: IP module that generates corresponding display clock signals according to different resolutions, and AXI for ARM total The line is configured.And we have used HDMI interface in the previous "HDMI interface using VGA display" tutorial, careful friends You may also have the impression that HDMI requires two clocks, one is a pixel clock and the other is 5 times the HDMI encoded clock.This one. The module also plays this role here, except that the output clock is configurable and uses ARM to pass through the AXI bus. Configured. That is, ARM can configure the clock frequency of the output image through software code.
rgb2dvi_v1_2: Convert VGA display drive signal to TMDS HDMI encoded signal output to HDMI connector Port. Same as the module used in the FPGA section "HDMI Interface Using VGA Display".
아무튼 이 IP를 추가하도록 한다.
추가하는 방법은 다음과 같다.
나의 경우 경로가 다음과 같다.
repo 전체를 select 해준다.
그럼 IP 2개, Interface 1개가 추가된다.
Apply > OK 를 눌러 나온다.
추가한 IP를 보기 위해 IP Catalog 를 선택해 준다.
User Repository 가 새로 생성되있는 것을 볼 수 있다.
UserIP, Video & Image Processing 에 각각 IP 가 들어있다.
기본적인 준비가 끝났다.
다음으로, AXIVideo Direct Memory Access 모듈을 추가한다.
다이어그램에서 + 를 눌러 추가한다.
추가한 뒤, 기본 ZYNQ PS를 다음과 같이 연결 해 준다.
새로 추가한 VDMA 를 더블클릭 해 본다.
IP 설정 창이 나온다.
이를 다음과 같이 고쳐준다.
그리고 Advanced 옵션에 들어가 GenLock Mode를 Master 로 바꿔준다.
다 했다면 Ok를 눌러 나온다.
동그라미 친 Run Connection Automation 을 클릭한다.
모두 선택해 준다.
그럼 자동으로 연결이 된다.
그리고 VDMA(axi_vdma_0) 모듈의 왼쪽에 있는 두 개의 클럭을 수동으로 연결하고, 두 클럭은 모두 동일 클럭을 사용한다.
다음으로, AXI Stream Subset Converter 모듈을 추가한다.
이 모듈은 32비트 데이터를 24비트 데이터로 변환하는데,
ARM은 32-bit 지만 데이터는 오직 24비트만 사용한다.
RGB 각각이 1 바이트씩 차지해 24비트가 됨.
다이어그램에서 subset 을 검색해 추가해 준다.
위쪽에 모듈이 하나 추가된 것을 볼 수 있다.
그리고 더블클릭 해 설정에 들어간다.
다음과 같이 설정해 준다.
이 모듈에 대한 자세한 설명은 arm_fpga_hdmi_output\related IP module documentation 에 있다
우리는 이 설정으로, RGB 데이터 배열을 설정한다.
왜냐면 이 이미지 배열은 DDR3에 저장되어 있고, 각각의 픽셀은 BGR로 배열되어 있지만 우리가 필요한 HDMI 출력 데이터는 RBG이기 때문이다.
설정이 끝난 이후, 다음과 같이 연결해준다.
그리고 새로운 모듈을 하나 더 추가해 준다.
+ 를 누르고 const 를 검색하자
추가를 해 준다.
마찬가지로 설정을 바꿀 것이므로 더블클릭 해 설정창에 들어간다.
1, 1 로 되어 있으면 된다.(기본값이기도 하다.)
그리고 다음과 같이 연결해준다.
다음은 AXI4-Stream to Video out 모듈을 추가해 AXI 인터페이스를 사용해 데이터를 읽은 값을 비디오 스트림으로 변환한다.
+ 표시를 눌러 vid를 검색 > AXI4-Stream to Video out 을 더블클릭 해 준다.
마찬가지로 설정에 들어간다.
다음과 같이 설정을 바꿔준다.
그리고 나와서 다음과 같이 연결해 준다.
연결을 완료했다면 모듈을 하나 더 추가한다.
+ 버튼 > timing 검색 > Video Timing Controller 추가한다.
추가한 모듈 설정에 들어가서 다음 그림과 같이 바꿔준다.
여기까지 완료했다면, Run Connection Automation 을 선택한다.
위 그림과 같으면 OK를 누른다.
그리고 수동으로 Video timing controller 의 vtiming_out 을 AXI4-Stream to Video out 모듈의 vtiming_in 에 연결한다.
연결했다면 다음은 AXI4 모듈의 vtg_ce 를 VTC의 gen_clken 에 연결한다.
연결을 완료했다면 HDMI 를 위한 인코딩 모듈을 추가한다.
+ > rgb2dvi
추가한 뒤 더블클릭해 설정에 들어가 다음과 같이 만든다.
여기서 클럭을 2개로 나눠 쓰는 이유를 설명하고 있다.
720p@30hz는 클럭을 74.25Mhz를 사용하지만, 우리는 1080p@60Hz를 사용할 것이기 때문에 클럭을 120Mhz 이상으로 만든 것이다.
설정을 끝내고 나왔으면 수동으로 선을 연결해 준다.
연결을 완료했다면 클럭 생성 모듈을 추가한다.
+ > dynclk 검색
추가하면 이런 모듈이 생성된 것을 볼 수 있다.
따로 설정은 하지 않고, Run Connection Automation 을 선택한다.
rgb2dvi 를 제외하고 모두 선택해준다.
다 했다면 나와서 두 모듈을 이렇게 연결해 준다.
소프트웨어가 100Mhz 클럭에 자동으로 연결되므로 이전에 자동으로 연결된 v_tc_0의 클럭 및 s_axi_acl_axik 와 v_axi4s_vid-out0 모듈의 vid_io_out_clk 신호를 수동 분리한다.
위처럼 분리하고, 하나만 하는게 아니라 총 3개의 핀을 분리해 줘야 한다.
그리고 다음 그림과 같이 연결 해 준다.
연결이 마무리 되었다면 GPIO 모듈을 추가해준다.
+ > GPIO
추가하고 설정에 들어가 다음과 같이 설정해 준다.
OK를 누르고 나와 Run Connection Automation 을 눌러 자동으로 연결되게 한다.
전부 선택하고 OK 눌러준다.
끝난 후에 블럭을 보면(Zoom fit 상태) 이따구로 되어 있다.
좀 정렬을 해 준다.
Optimize routing 옵션을 이용해 최적화를 해 봤다.
다음은 EN 핀을 추가한다.
+ > const 검색
만들어진 모듈의 output 핀을 누르고 Make External 옵션을 선택한다.
이렇게 꼬리가 생긴 것을 볼 수 있다.
그리고 이름을 바꿔준다.
기존 dout > HDMI_EN 으로 이름을 변경해 주었다.
그리고 인터럽트 제어 모듈을 하나 더 추가한다.
+ > concat
이런 모듈이 하나 더 생겼다.
더블클릭 해 설정에 들어간다.
Number of Ports 를 3으로 조정해 주고 OK 를 누른다.
각 포트를 연결한다.
AXI Video Direct Memory Access의 mm2s_introut 과 Concat의 In1을 연결
Input은 이렇게 연결해 주고 남은 Output은 ZYNQ PS에 연결한다.
연결이 끝난 후, Run Block Automation 을 실행시킨다.
OK를 누른다.
다음은 RGB to DVI Video encoder 의 output 을 외부와 연결해 준다.
완료했다면, 만든 디자인을 한 번 검증 해 보자.
다음과 같은 메세지가 나온다.
지금은 크게 신경쓰지 않아도 되는 듯 하다. OK를 눌러 무시한다.
이렇게 하면 디자인 생성이 완료다.
HDMI 검증도 해 볼 필요가 있기에 비트스트림까지 생성해 보도록 한다.
합성을 하려는데 top 모듈이 없다고 하면, 이름을 design_1 이라고 칭하고 생성한다.
I/O 포트가 중요하다.
전압이 1.8V로 되어 있는 부분들을 3.3V로 고쳐준다(LVCMOS33)
핀은 위 사진과 같이 할당해준다.
저장하고, 다시 합성부터 비트스트림 생성까지 진행한다.
비트스트림까지 생성이 완료되었다면, SDK를 켜 준다.
(전에 HW Export 과정이 필요하다. 그냥 File > Export 에서 진행해 주면 된다.)
SDK를 켰다면, 새로운 프로젝트를 만든다.
file > new > application project
프로젝트 이름은 다음과 같다.
일단 wrapping 안 하고 진행해 보도록 한다.(뭐에 쓰는건지 아직도 모르겠다)
저대로 했다면 Finish 를 눌러 준다.
셀러가 SDK 소스 코드를 이미 파일 안에 넣어 줬다고 한다.
arm_fpga_04_hdmi_output.sdk > hdmi_test > src 에서 찾도록 하자.
폴더 째로 옮겨와야 한다.
hdmi_test 폴더와 hdmi_test_bsp 폴더를 둘 다 가져오자.
그리고 JTAG 와 UART 에 연결해 디버깅 하면 완료 라고 하는데..
디버깅 하는 방법은 ARM 의 03_AXI_GPIO 파일을 보라고 한다. 후..
일단 모르니까 보도록 한다.
다 필요없고 SDK 사용 부분만 본다.
Debug 설정으로 들어간다.
뭔 이상한 리눅스 어플리케이션 디버깅으로 잡혀있다.
FPGA 상에서 디버깅 환경을 만들기 위해 Debug type를 Standalone application debug 로 고친다.
추가로 뜨는 창에서는 Hardware platform 을 설정 해 준다.
그리고 Reset entire system, Program FPGA 를 체크 해 준다.
하고 Application 에서 프로세서를 선택하라고 하는데 나는 그게 안 뜬다(Hardware platform 을 design_1_hw_platform_0 으로 설정시)
그래서 비트스트림 파일을 저걸 쓰는 대신에 HW platform 은 ZC702_hw_platform 으로 변경한다.
그리고 Application 에서 ps7_cortexa9_0을 선택한다.
이랬는데 디버그가 비활성화 된 상태다. 일단 문제를 모르겠으니 sdk 폴더를 한 번 싹다 비운다.
그리고 다시 design_1 을 Wrapping 해준다.
wrapping 하고 나서 Export 하면 Wrapping 된 design_1이 아닌 그냥 design_1 만 내보낸다.
뭐지 제대로 한 것 같은데 싶어서 다시 비트스트림 생성을 한다.
역시 비트스트림 생성 과정에서 뭔가 있었던 것 같다.
다시 하니까 Wrapper 생성을 잘 한다.
그래도 혹시 모르니까 다시 hdmi_test 생성부터 한다.
셀러 hdmi_test 폴더를 다시 가져온다(hdmi_test_bsp 도 가져와야 함!)
가져 왔으면 바로 반영이 되는 시스템이 아니라 File > Refresh 를 꼭 해줘야 반영이 된다.
참고로 디버그 표시가 보이지 않는다면 위쪽 탭의 Run > Debug Config 로 들어가면 된다.
들어가서 실행시킨다.
아무튼 디버깅은 정상 작동한다.
아마도
근데 HDMI output이 아무것도 없는건가 화면이 왜 안나오는지는 잘 모르겠다
일단 동작은 확인했으니 HDMI 은 이까지 하고 본래 목적인 linaro linux 를 진행한다.
---------------------------------
추가
셀러가 제공해 준 소스로 debug 시는 동작하지 않았지만, Run으로는 60Hz 상에서 동작하는 것을 확인 가능했다. 참고로 30Hz로도 시험해 봤는데 현재 사용하는 모니터 출력모드는 지원하지 않아 출력이 되지 않았다.
컴파일된 BOOT.BIN 파일이 output 으로 나오게 된다.(얘는 필요없는 것 같긴 하다)
이 BOOT.BIN, image.ub, u-boot.elf, zynq_fsbl.elf 파일을 Windows 환경으로 다시 가지고 온다.
zynq_fsbl.elf : 시스템 부팅, DDR3 초기화, 시스템 클럭 초기화, FLASH 또는 SD카드의 firstagebootloader 를 DDR3에 로딩해 수행, u-boot를 DDR3에 로딩하여 FPGA의 BIT 구성을 주로 수행하며, BIT가 없으면 무시하는 작업, PS를 구성하는 MIO등 일련의 작업 수행
u-boot.elf : boot 부팅 파일, image.ub를 DDR3에 로딩하는 것을 책임짐
image.ub : petalinux의 커널(?)
나는 윈도우즈 환경 상에서 petalinux 라는 폴더를 하나 바탕화면에 생성하고 다음 파일들을 저장했다.
상태는 클라우드 관련이므로 신경쓰지 말자.
(petalinux-v2018.3-final-installer.run 파일이 없다고 해서 다운받을 필요는 없다)
다시 Vivado 를 켜서 저번에 만들어 뒀던 프로젝트의 SDK를 실행시키자.
그리고 위의 Xilinx > Create Boot Image 탭에 들어간다.
Output BIF file path 는 기존 프로젝트의 sdk 폴더에 저장한다.
(output path를 지정하는 것이지 output 파일을 열어야 하는 것이 아님)
Output path 는 BOOT.bin 파일이 자동으로 잡힌다.
나는 경로가 이렇게 나왔다.
다음으로 Boot image partitions 에 ubuntu 에서 받아왔던 fsbl, u-boot 를 추가할 것이다.
path 에 한글이 들어가지 않게 주의하자. 만약 들어간다면 C:\ 에 옮겨서 진행하는 것이 좋을 것이다.
Bootloader 로 zynq_fsbl.elf 를 추가하고
Datafile 로 u-boot.elf 를 추가해 준다.
다 했으면 Create Image 로 이미지 생성을 해 준다.
여기서 생성한 BOOT.bin 을 우분투에서 가져온 파일들을 저장하는 공간으로 넘겨준다.
나는 petaOS라는 폴더를 추가로 생성해 거기에 저장했다.
그리고 SD 카드를 하나 준비한다.(32GB, 다이소에서 삼)
SD 카드 리더기도 하나 필요하다(다이소에서 삼)
SD 카드 리더기에 sd카드를 꼽고 컴퓨터에 마운트시키면
나의 경우 E 드라이브로 잡혔다.
E드라이브를 FAT32로 포맷해 준다.
딱히 건드릴 것은 없다.
BOOT.bin 과 image.ub를 여기에 넣어 주도록 한다.
SD 카드를 빼서 보드에 끼워준다.
BOOT(sd0) 쪽으로 끼워 준다.
그리고 ON KE 스위치를 11로 맞춰준다.
우리는 COM 포트로 연결해야 하기 때문에 UART를 사용한다.
보드의 UART 포트와 PC를 연결하고 장치 관리자를 열면 포트(COMx, x는 숫자) 가 연결된 것을 볼 수 있다.