한국어
Embedded
 

드라이버 Rockchip VOP

makersweb 2024.04.22 21:59 조회 수 : 968

VOP(Visual Output Processor) 는 비디오 메모리 버퍼의 이미지 데이터를 외부 디스플레이 인터페이스(LVDS, MIPI, eDP, HDMI 등)로 전송하는 Rockchip SoC 시리즈용 디스플레이 컨트롤러이다.

VOP는 AHB 슬레이브를 통해 AHB 버스에 연결되고 AXI 마스터를 통해 AXI 버스에 연결된다. 레지스터 설정은 AHB 슬레이브 인터페이스를 통해 구성되며 디스플레이 프레임 데이터는 AXI 마스터 인터페이스를 통해 읽혀진다. 또한 IEP와 VOP 사이에는 IEP에서 VOP로 프레임 데이터를 제공할 수 있는 데이터 경로가 있다. (VOP 호환 SoC에서는 커널 빌드 시 이 기능을 활성화해야 한다.)

 

VOP2 는 RK3566/RK3568 부터 사용된다. 이 드라이버는 Rockchip의 커널에서 제공되는 기존 다운스트림 드라이버에서 파생되었다. 이 업스트림 드라이버는 비표준 DRM 속성, 엉성한 코드 및 다운스트림 드라이버 상태의 기타 변경 사항을 제거하기 위해 큰 변경 사항을 확인해야 했다.

dtsi 파일에 필요한 디스플레이 하위 시스템 노드 및 iommu 노드와 함께 해당 노드를 추가해야한다.

 

Example:

...
    vop: vop@fdd90000 {
        compatible = "rockchip,rk3588-vop";
        reg = <0x0 0xfdd90000 0x0 0x4200>, <0x0 0xfdd95000 0x0 0x1000>;
        reg-names = "regs", "gamma_lut";
        interrupts = <GIC_SPI 156 IRQ_TYPE_LEVEL_HIGH>;
...
        iommus = <&vop_mmu>;
        power-domains = <&power RK3588_PD_VOP>;
        rockchip,grf = <&sys_grf>;
        rockchip,vop-grf = <&vop_grf>;
        rockchip,vo1-grf = <&vo1_grf>;
        rockchip,pmu = <&pmu>;

        status = "disabled";

        vop_out: ports {
            #address-cells = <1>;
            #size-cells = <0>;

            vp0: port@0 {
                #address-cells = <1>;
                #size-cells = <0>;
                reg = <0>;

                vp0_out_dp0: endpoint@0 {
                    reg = <0>;
                    remote-endpoint = <&dp0_in_vp0>;
                };

                vp0_out_edp0: endpoint@1 {
                    reg = <1>;
                    remote-endpoint = <&edp0_in_vp0>;
                };

                vp0_out_hdmi0: endpoint@2 {
                    reg = <2>;
                    remote-endpoint = <&hdmi0_in_vp0>;
                };
            };

            vp1: port@1 {
                #address-cells = <1>;
                #size-cells = <0>;
                reg = <1>;

                vp1_out_dp0: endpoint@0 {
                    reg = <0>;
                    remote-endpoint = <&dp0_in_vp1>;
                };

                vp1_out_edp0: endpoint@1 {
                    reg = <1>;
                    remote-endpoint = <&edp0_in_vp1>;
                };

                vp1_out_hdmi0: endpoint@2 {
                    reg = <2>;
                    remote-endpoint = <&hdmi0_in_vp1>;
                };
            };
...
        };
    };
...