2018년 4월 22일 일요일

AXI CDMA with BRAM

목적 : Zynq ZCU102보드를 이용하여 BRAM에 기록되어 있는 데이터를 AXI CDMA를 통해 리눅스의 어플리케이션으로 데이터를 저장하는 방법을 알아보자.

우선 사용자가 poke라는 어플리케이션으로 4k영역에 0x0 ~ 0x3ff 까지 기록하는 방식으로 프로그램을 간단 하게 수정 하고, cdma 드라이버를 로드 하기 전에 4k영역에 데이터를 써 넣는다.
cdma 드라이버가 로드되면 bram에 써 놓은 데이터를 cdma를 통해 어플리케이션으로 가져오는 것을 확인 할 수 있다.

* 드라이버를 로드할때는 poke어플리케이션을 실행 해야 하므로 백그라운드 모드로 실행 하자.

1. Zynq ZCU102를 이용한 하드웨어 디자인

2. 어드레스 정보

3. Bitstream까지 모두 완료되면 FSBL을 만들기 위해 SDK를 실행시켜준다.(File->Export, File->Launch SDK)

4. FSBL까지 완성되면 하드웨어 설정을 petalinux에서 불러와 설정 할 수 있다.
이때 디바이스 트리까지 업데이트 된다. 

5. cdma동작을 위한 드라이버 모듈 만들기
5.1 petalinux사용법에서 보면 나와있듯 드라이버를 만들기 위해 petalinux-create명령을 사용하여 모듈 드라이버를 생성한다.
$ petalinux-create -t modules --name cdma-driver --enable

5.2. 생성된 모듈 폴더로 이동하여 아래 github에서 소스코드를 다운로드 후 빌드를 진행한다.
$ petalinux-build -c cdma-driver

download file.....
https://github.com/pcw1029/zcu102_public/tree/master/cdma/sw/driver/cdma-driver.c

5.3 하드웨어 설정 가져오기
$ petalinux-config --get-hw-description=<sdk path>

6. bram에 4k영역에 데이터를 쓰기위해 xilinx에서 제공하는 어플리케이션인 peekpoke을 사용한다.
6.1 peekpoke을 사용하기 위해서 $petalinux-config -c rootfs 에서 apps항목 중 peekpoke을 선택해야 한다.

6.2 아래 github에 수정된 peekpoke파일이 있다. 
https://github.com/pcw1029/zcu102_public/tree/master/cdma/sw/peekpoke

6.3 수정한 peekpoke을 다시 빌드한다.
$ petalinux-build -c peekpoke -x do_clean && petalinux-build -c peekpoke

7. device-tree에 새로 만들어진  cdma-driver를 추가한다.
추가 위치는 meta-user/recipes-bsp/device-tree/files 아래 system-user.dtsi 파일을 수정하면 된다.
수정 내용
  /include/ "system-conf.dtsi"                 
  / {
      cdmatest_0: cdmatest@0 {
          compatible = "xilinx,cdma-driver";
          dmas = <&axi_cdma_0 0>;
          dma-names = "cdma";
          dma-coherent;
      };
  };

8. 빌드
$ petalinux-build

9. SD카드용 이미지 생성
<project-root path>/images/linux 폴더로 이동 후 아래 명령으로 이미지 파일(BOOT.bin, image.ub)을 생성 후 SD카드로 복사한다.
$ petalinux-package --boot --fsbl <.elf file path> --fpga <.bit file path> --u-boot

실행 결과
1. poke 어플을 이용해 0xa0001000위치에 데이터를 쎃는다.
# poke 0xa0001000 11 1024

2. peek 어플을 이용해 0xa0001000위치에 데이터가 잘 써 있는지 확인 한다.
# peek 0xa0001000 1024

3. 모듈을 올려 가져온 데이터가 2번의 데이터와 일치하는지 확인 한다.
# insmode /lib/modules/4.9.0/extra/cdma-driver.ko test_buf_size=4096


댓글 없음:

댓글 쓰기

VITIS Git + Doxygen Config

 Doxygen Configure 1. Vitis 메뉴의 Window->Preference의 C/C++ -> Editor의 Documentation tool comments 기본 설정값을 Doxygen으로 변경 설정 후 함수 바로 위에서 /...