본문 바로가기
Development/Xilinx

[Xilinx] DMA 사용을 위한 dma_requeat_chan 사용 법

by qWooWp 2022. 10. 26.
반응형

하드웨어 구성에서 기 생성된 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");
반응형

댓글