요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
digraph board {
rankdir=TB
n00000001 [label="{{<port0> 0} | ipu1_csi0\n/dev/v4l-subdev0 | {<port1> 1 | <port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n00000001:port2 -> n00000005 [style=dashed]
n00000001:port1 -> n0000000f:port0 [style=dashed]
n00000001:port1 -> n0000000b:port0 [style=dashed]
n00000005 [label="ipu1_csi0 capture\n/dev/video0", shape=box, style=filled, fillcolor=yellow]
n0000000b [label="{{<port0> 0 | <port1> 1} | ipu1_vdic\n/dev/v4l-subdev1 | {<port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n0000000b:port2 -> n0000000f:port0 [style=dashed]
n0000000f [label="{{<port0> 0} | ipu1_ic_prp\n/dev/v4l-subdev2 | {<port1> 1 | <port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n0000000f:port1 -> n00000013:port0 [style=dashed]
n0000000f:port2 -> n0000001c:port0 [style=dashed]
n00000013 [label="{{<port0> 0} | ipu1_ic_prpenc\n/dev/v4l-subdev3 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
n00000013:port1 -> n00000016 [style=dashed]
n00000016 [label="ipu1_ic_prpenc capture\n/dev/video1", shape=box, style=filled, fillcolor=yellow]
n0000001c [label="{{<port0> 0} | ipu1_ic_prpvf\n/dev/v4l-subdev4 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
n0000001c:port1 -> n0000001f [style=dashed]
n0000001f [label="ipu1_ic_prpvf capture\n/dev/video2", shape=box, style=filled, fillcolor=yellow]
n0000002f [label="{{<port0> 0} | ipu1_csi1\n/dev/v4l-subdev5 | {<port1> 1 | <port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n0000002f:port2 -> n00000033 [style=dashed]
n0000002f:port1 -> n0000000f:port0 [style=dashed]
n0000002f:port1 -> n0000000b:port0 [style=dashed]
n00000033 [label="ipu1_csi1 capture\n/dev/video3", shape=box, style=filled, fillcolor=yellow]
n0000003d [label="{{<port0> 0} | ipu2_csi0\n/dev/v4l-subdev6 | {<port1> 1 | <port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n0000003d:port2 -> n00000041 [style=dashed]
n0000003d:port1 -> n0000004b:port0 [style=dashed]
n0000003d:port1 -> n00000047:port0 [style=dashed]
n00000041 [label="ipu2_csi0 capture\n/dev/video4", shape=box, style=filled, fillcolor=yellow]
n00000047 [label="{{<port0> 0 | <port1> 1} | ipu2_vdic\n/dev/v4l-subdev7 | {<port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n00000047:port2 -> n0000004b:port0 [style=dashed]
n0000004b [label="{{<port0> 0} | ipu2_ic_prp\n/dev/v4l-subdev8 | {<port1> 1 | <port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n0000004b:port1 -> n0000004f:port0 [style=dashed]
n0000004b:port2 -> n00000058:port0 [style=dashed]
n0000004f [label="{{<port0> 0} | ipu2_ic_prpenc\n/dev/v4l-subdev9 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
n0000004f:port1 -> n00000052 [style=dashed]
n00000052 [label="ipu2_ic_prpenc capture\n/dev/video5", shape=box, style=filled, fillcolor=yellow]
n00000058 [label="{{<port0> 0} | ipu2_ic_prpvf\n/dev/v4l-subdev10 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
n00000058:port1 -> n0000005b [style=dashed]
n0000005b [label="ipu2_ic_prpvf capture\n/dev/video6", shape=box, style=filled, fillcolor=yellow]
n0000006b [label="{{<port0> 0} | ipu2_csi1\n/dev/v4l-subdev11 | {<port1> 1 | <port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n0000006b:port2 -> n0000006f [style=dashed]
n0000006b:port1 -> n0000004b:port0 [style=dashed]
n0000006b:port1 -> n00000047:port0 [style=dashed]
n0000006f [label="ipu2_csi1 capture\n/dev/video7", shape=box, style=filled, fillcolor=yellow]
n00000079 [label="{{<port0> 0 | <port1> 1} | ipu1_csi0_mux\n/dev/v4l-subdev12 | {<port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n00000079:port2 -> n00000001:port0 [style=dashed]
n0000007d [label="{{<port0> 0 | <port1> 1} | ipu2_csi1_mux\n/dev/v4l-subdev13 | {<port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n0000007d:port2 -> n0000006b:port0 [style=dashed]
n00000081 [label="{{} | adv7180 3-0021\n/dev/v4l-subdev14 | {<port0> 0}}", shape=Mrecord, style=filled, fillcolor=green]
n00000081:port0 -> n00000079:port1 [style=dashed]
}
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
ADV7180 입력과 IPU 캡처 경로
1-51이 DOT 그래프는 SabreAuto 보드의 i.MX6Q V4L2 미디어 토폴로지를 위에서 아래로 배치합니다. 녹색 Mrecord는 포트가 있는 서브디바이스이고 노란 상자는 /dev/video 캡처 노드입니다. 모든 간선은 style=dashed이므로 그래프를 추출한 시점에 비활성화된 선택 가능 링크를 나타냅니다.
두 IPU는 같은 내부 구조를 가집니다. 각 IPU의 CSI0·CSI1은 포트 2에서 직접 캡처 장치로 나가고, 포트 1에서 전처리기 `ic_prp` 또는 디인터레이서 `vdic`로 갈 수 있습니다. `vdic` 출력도 `ic_prp`로 합류하므로 순차 주사 영상은 직접, 인터레이스 영상은 디인터레이스 뒤 같은 전처리 경로를 사용할 수 있습니다.
각 `ic_prp`는 포트 1의 `ic_prpenc` 인코딩 경로와 포트 2의 `ic_prpvf` 뷰파인더 경로로 분기합니다. 두 분기는 각각 별도 `/dev/video` 캡처 노드에 도달합니다. IPU1은 `/dev/video0`부터 `/dev/video3`, IPU2는 `/dev/video4`부터 `/dev/video7`을 제공합니다.
두 보드 그래프가 공유하는 IPU1·IPU2 서브디바이스와 캡처 노드입니다.
두 CSI의 직접 캡처와 VDIC·PRP·인코딩·뷰파인더 분기를 모두 나열합니다. 원문에서는 전부 dashed입니다.
각 CSI 입력이 직접 캡처 또는 전처리 분기로 이동하는 대표 경로입니다.
SabreAuto 고유 입력은 아날로그 비디오 디코더 `adv7180 3-0021`(`/dev/v4l-subdev14`)입니다. 디코더 포트 0은 `ipu1_csi0_mux`(`/dev/v4l-subdev12`)의 입력 포트 1로 연결되고, mux 출력 포트 2는 `ipu1_csi0` 입력 포트 0으로 이어집니다. 이 경로를 선택하면 ADV7180 영상이 IPU1의 직접 캡처·VDIC·PRP 분기를 이용할 수 있습니다.
`ipu2_csi1_mux`(`/dev/v4l-subdev13`)의 출력 포트 2는 `ipu2_csi1` 입력 포트 0에 연결되어 있지만, 이 그래프에는 mux의 포트 0 또는 1로 들어오는 외부 소스 링크가 없습니다. 따라서 노드는 토폴로지에 존재해도 이 파일만으로는 IPU2 CSI1의 실제 외부 입력을 확정할 수 없습니다.
ADV7180이 IPU1 CSI0으로 들어가는 보드 고유 경로와 입력이 표시되지 않은 IPU2 mux를 구분합니다.
공통 IPU 그래프에 추가되는 3개 서브디바이스와 3개 점선 링크입니다.
digraph board {
rankdir=TB
n00000001 [label="{{<port0> 0} | ipu1_csi0\n/dev/v4l-subdev0 | {<port1> 1 | <port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n00000001:port2 -> n00000005 [style=dashed]
n00000001:port1 -> n0000000f:port0 [style=dashed]
n00000001:port1 -> n0000000b:port0 [style=dashed]
n00000005 [label="ipu1_csi0 capture\n/dev/video0", shape=box, style=filled, fillcolor=yellow]
n0000000b [label="{{<port0> 0 | <port1> 1} | ipu1_vdic\n/dev/v4l-subdev1 | {<port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n0000000b:port2 -> n0000000f:port0 [style=dashed]
n0000000f [label="{{<port0> 0} | ipu1_ic_prp\n/dev/v4l-subdev2 | {<port1> 1 | <port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n0000000f:port1 -> n00000013:port0 [style=dashed]
n0000000f:port2 -> n0000001c:port0 [style=dashed]
n00000013 [label="{{<port0> 0} | ipu1_ic_prpenc\n/dev/v4l-subdev3 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
n00000013:port1 -> n00000016 [style=dashed]
n00000016 [label="ipu1_ic_prpenc capture\n/dev/video1", shape=box, style=filled, fillcolor=yellow]
n0000001c [label="{{<port0> 0} | ipu1_ic_prpvf\n/dev/v4l-subdev4 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
n0000001c:port1 -> n0000001f [style=dashed]
n0000001f [label="ipu1_ic_prpvf capture\n/dev/video2", shape=box, style=filled, fillcolor=yellow]
n0000002f [label="{{<port0> 0} | ipu1_csi1\n/dev/v4l-subdev5 | {<port1> 1 | <port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n0000002f:port2 -> n00000033 [style=dashed]
n0000002f:port1 -> n0000000f:port0 [style=dashed]
n0000002f:port1 -> n0000000b:port0 [style=dashed]
n00000033 [label="ipu1_csi1 capture\n/dev/video3", shape=box, style=filled, fillcolor=yellow]
n0000003d [label="{{<port0> 0} | ipu2_csi0\n/dev/v4l-subdev6 | {<port1> 1 | <port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n0000003d:port2 -> n00000041 [style=dashed]
n0000003d:port1 -> n0000004b:port0 [style=dashed]
n0000003d:port1 -> n00000047:port0 [style=dashed]
n00000041 [label="ipu2_csi0 capture\n/dev/video4", shape=box, style=filled, fillcolor=yellow]
n00000047 [label="{{<port0> 0 | <port1> 1} | ipu2_vdic\n/dev/v4l-subdev7 | {<port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n00000047:port2 -> n0000004b:port0 [style=dashed]
n0000004b [label="{{<port0> 0} | ipu2_ic_prp\n/dev/v4l-subdev8 | {<port1> 1 | <port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n0000004b:port1 -> n0000004f:port0 [style=dashed]
n0000004b:port2 -> n00000058:port0 [style=dashed]
n0000004f [label="{{<port0> 0} | ipu2_ic_prpenc\n/dev/v4l-subdev9 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
n0000004f:port1 -> n00000052 [style=dashed]
n00000052 [label="ipu2_ic_prpenc capture\n/dev/video5", shape=box, style=filled, fillcolor=yellow]
n00000058 [label="{{<port0> 0} | ipu2_ic_prpvf\n/dev/v4l-subdev10 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
n00000058:port1 -> n0000005b [style=dashed]
n0000005b [label="ipu2_ic_prpvf capture\n/dev/video6", shape=box, style=filled, fillcolor=yellow]
n0000006b [label="{{<port0> 0} | ipu2_csi1\n/dev/v4l-subdev11 | {<port1> 1 | <port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n0000006b:port2 -> n0000006f [style=dashed]
n0000006b:port1 -> n0000004b:port0 [style=dashed]
n0000006b:port1 -> n00000047:port0 [style=dashed]
n0000006f [label="ipu2_csi1 capture\n/dev/video7", shape=box, style=filled, fillcolor=yellow]
n00000079 [label="{{<port0> 0 | <port1> 1} | ipu1_csi0_mux\n/dev/v4l-subdev12 | {<port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n00000079:port2 -> n00000001:port0 [style=dashed]
n0000007d [label="{{<port0> 0 | <port1> 1} | ipu2_csi1_mux\n/dev/v4l-subdev13 | {<port2> 2}}", shape=Mrecord, style=filled, fillcolor=green]
n0000007d:port2 -> n0000006b:port0 [style=dashed]
n00000081 [label="{{} | adv7180 3-0021\n/dev/v4l-subdev14 | {<port0> 0}}", shape=Mrecord, style=filled, fillcolor=green]
n00000081:port0 -> n00000079:port1 [style=dashed]
}
요약·해설
imx6q-sabreauto.dot:1-51i.MX6Q SabreAuto의 ADV7180 입력과 두 IPU의 CSI·VDIC·PRP·인코딩·뷰파인더·직접 캡처 노드 사이 선택 가능한 미디어 링크를 설명합니다.