애플리케이션에서 v4l2-ctl --stream-mmap을 입력했을 때, 커널 내부에서 일어나는 일입니다.
1단계: 장치 열기 및 설정 (Open & Configuration)
App: /dev/video0를 엽니다.
App: VIDIOC_S_FMT (포맷 설정) 호출.
Bridge Driver: 포맷이 확정되면 VDMA 하드웨어 레지스터에 해상도(Stride, Hsize, Vsize)를 세팅합니다.
2단계: 버퍼 요청 및 할당 (Buffer Allocation)
App: VIDIOC_REQBUFS 호출.
V4L2 Core (vb2): 커널 메모리(DDR)에 영상 프레임 들어갈 공간(Buffer)을 할당합니다.
App: VIDIOC_QBUF (Queue Buffer).
할당된 빈 버퍼를 "채워달라"며 드라이버 큐에 넣습니다.
Bridge Driver는 이 버퍼의 **물리 주소(Physical Address)**를 VDMA IP에게 알려줍니다. ("야, 데이터 들어오면 여기다 써!")
3단계: 스트리밍 시작 (STREAMON) - 가장 중요
App: VIDIOC_STREAMON 호출.
Bridge Driver:
VDMA IP를 Run 모드로 켭니다. (이제 VDMA는 데이터가 들어오기만을 기다립니다.)
연결된 서브디바이스(Stub Driver)의 s_stream(1) 함수를 호출합니다.
<!-- end list -->
Stub Driver의 역할: 만약 실제 카메라라면 여기서 I2C로 "찍기 시작해!" 명령을 보냅니다. TPG라면 TPG 레지스터를 켭니다.
4단계: 하드웨어 데이터 전송 (Data Transfer via DMA)
FPGA (Source): 카메라나 TPG에서 영상 신호(Pixel Data)와 동기 신호(TUSER: Frame Start, TLAST: Line End)가 AXI Stream을 타고 나옵니다.
VDMA IP: 들어오는 AXI Stream 데이터를 받아서, 아까 설정된 DDR 메모리 주소로 짐을 나릅니다 (CPU는 관여 안 함).
아까 Failed to prepare DMA transfer 에러는 여기서 소스(Stub/HW)가 데이터를 안 보내줘서 VDMA가 멍하니 기다리다 타임아웃 난 것입니다.
5단계: 완료 인터럽트 및 반환 (Interrupt & Dequeue)
VDMA IP: 한 프레임(1920x1080)을 다 쓰면 **인터럽트(IRQ)**를 발생시킵니다.
Bridge Driver: 인터럽트를 받아 "어? 다 썼네?" 하고 해당 버퍼를 V4L2 Core에게 "완료됨(Done)" 처리합니다.
App: VIDIOC_DQBUF (Dequeue Buffer)로 대기하다가, 완료된 버퍼를 건겨받아 파일로 저장(fwrite)합니다.
3. 핵심 요약 (Xilinx 환경)
**제어(Control)**는 CPU가 합니다 (App <-> Driver <-> HW Register).
**데이터(Data)**는 VDMA가 직접 옮깁니다 (FPGA -> DDR). CPU를 거치지 않습니다.
Stub Driver의 위치: Stub은 맨 처음 시작 명령(s_stream)을 받는 역할입니다. 하지만 Stub 자체가 데이터를 만들어내진 않습니다. 데이터를 만드는 건 **FPGA 안의 IP(TPG나 센서 인터페이스)**여야 합니다.
'linux > petalinux' 카테고리의 다른 글
| Petalinux 22.1 Custom kernel and Uboot (0) | 2026.01.05 |
|---|---|
| petalinux with AI (gemini cli) petalinux bsp 설치 (오류지만 진행) (0) | 2025.11.11 |
| petalinux with AI (gemini cli) petalinux bsp 설치 (bsp 에러시) (0) | 2025.11.11 |
| petalinux with AI (gemini cli) petalinux tools 설치 (0) | 2025.11.11 |
| OSDZU3 (0) | 2025.11.11 |