목적 : 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;
};
};
/ {
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
댓글 없음:
댓글 쓰기