반응형
하드웨어 구성에서 기 생성된 DMA 채널을 다른 하드웨어 블럭에서 컨트롤 하고 싶을 때
dma_request_chan 함수를 사용한다.
이 함수의 2번째 인자로 name 이 들어가야 되는데 이 값은 device-tree 에서 dma-name 값을 참조하여 설정된 환경을 읽어와서
dma_chan Context 를 생성해서 리턴하는 역활을 해준다.
우선 아래와 같은 dma 가 일반적으로 생성이 되어 있고.
axi_dma_0: dma@40400000 {
#dma-cells = <1>;
clock-names = "s_axi_lite_aclk", "m_axi_s2mm_aclk";
clocks = <&clkc 17>, <&clkc 17>;
compatible = "xlnx,axi-dma-7.1", "xlnx,axi-dma-1.00.a";
interrupt-names = "s2mm_introut";
interrupt-parent = <&intc>;
interrupts = <0 36 4>;
reg = <0x40400000 0x10000>;
xlnx,addrwidth = <0x20>;
xlnx,sg-length-width = <0xe>;
dma-channel@40400030 {
compatible = "xlnx,axi-dma-s2mm-channel";
dma-channels = <0x1>;
interrupts = <0 36 4>;
xlnx,datawidth = <0x20>;
xlnx,device-id = <0x0>;
};
};
내가 만든 다른 하드웨어 드라이버에서 DMA 에 엑세스를 하고 싶다면 예를들어
아래와 같이 system-user.dtsi 에 내가 사용하려는 드라이버 compatible 이 잇는 블럭에 dma 관련 내용을 추가를 시켜 준다.
// pl.dtsi
// 내가 사용할 드라이버 로직 관련 pl.dtsi 이름을 참조하여
lvds_conv_0: lvds_conv@43c10000 {
...
compatible = "xlnx,lvds-conv-1.0";
...
};
// system-user.dtsi
amba_pl: amba_pl {
#address-cells = <1>;
#size-cells = <1>;
compatible = "simple-bus";
ranges ;
...
lvds_conv_0: lvds_conv@43c10000 {
dmas = <&axi_dma_0 0
&axi_dma_0 1>;
dma-names = "axidma0";
};
....
pwm_int_0: enc_pwm_int@43c00000 {
....
이후 실제 드라이버에서 아래와 같이 호출만 해주면 된다.
afe_image_dev->rx_chan = dma_request_channel(&afe_image_dev->pdev->dev, "axidma0");
반응형
'Development > Xilinx' 카테고리의 다른 글
[petalinux] 2023 버전 BSP 없이 xsa 파일로 프로젝트 생성 (0) | 2024.05.10 |
---|---|
[Petalinux] Error No space left on device or exceeds (0) | 2024.03.06 |
Petalinux 2019.1 installation on ubuntu 18.04 (설치, 우분투) (0) | 2020.12.16 |
Vivado Tool 설치 on Ubuntu (0) | 2020.12.15 |
[ZYNQ] Petalinux Kernel 드라이버 빌드 방법 (0) | 2019.11.21 |
댓글