센서 제어와 영상 데이터는 경로가 다릅니다
- Sensor
노출·gain·영상 모드 등은 보통 I²C 같은 제어 경로로 설정합니다.
CSI-2 link로 영상 샘플을 전송합니다.
- CSI receiver / ISP
입력 link를 수신하고 구현에 따라 영상 처리를 수행합니다.
capture 장치가 RAM의 버퍼에 데이터를 씁니다.
- V4L2 video node
/dev/videoN의 ioctl로 format·buffer·stream을 제어합니다.
완료된 버퍼를 사용자 공간이 처리합니다.
- 사용자 프로그램
유효한 데이터 길이와 format에 맞춰 프레임을 해석합니다.
세로 화살표는 영상 데이터와 처리 단계의 흐름입니다. I²C가 영상 전체를 이 경로로 운반한다는 뜻은 아닙니다. USB UVC 등 다른 카메라는 연결 구조가 다릅니다.
Media Controller의 entity·pad·link는 이 연결을 표현합니다. sub-device의 pad format, link 설정, video node의 pixel format이 맞아야 합니다. /dev/video0을 열 수 있다는 사실만으로 sensor에서 RAM까지 전 경로가 정상이라는 뜻은 아닙니다. Media Controller의 연결 모델
QBUF는 사용할 버퍼를 드라이버에 넘깁니다
1. 버퍼 준비
REQBUFS로 버퍼 집합을 요청하고 QUERYBUF가 돌려준 offset·길이를 이용해 mmap합니다. offset을 물리 주소라고 가정하거나 임의로 바꾸지 않습니다. 요청한 개수와 실제 할당한 개수도 확인합니다.
2. QBUF 후
해당 index의 버퍼를 capture에 사용할 수 있도록 queue에 넣습니다. driver가 관리하는 동안 애플리케이션이 내용을 임의로 읽고 수정하면 안 됩니다. QBUF가 즉시 새 프레임 하나의 촬영 완료를 뜻하지는 않습니다.
3. 프레임 완료
장치·드라이버가 버퍼를 채워 완료 queue에 넣습니다. poll 등으로 준비 상태를 기다릴 수 있습니다. poll이 반환했다고 화면에 이미 표시됐다는 뜻은 아닙니다.
4. DQBUF와 사용자 처리
DQBUF가 돌려준 index·bytesused·timestamp·flags 등을 읽습니다. 데이터 처리를 마치면 같은 버퍼를 QBUF로 다시 넘길 수 있습니다. 계속 보관할 데이터라면 버퍼 재사용 전에 별도 보관·참조 수명을 설계해야 합니다.
단계는 버퍼의 사용 권한과 완료 상태가 바뀌는 순서입니다. QBUF·DQBUF 호출마다 프레임 전체를 새 메모리로 복사한다는 그림이 아닙니다.
해상도만 같다고 같은 프레임은 아닙니다
| 값 | 확인할 내용 |
|---|---|
| width / height | 영상의 가로·세로 샘플 수입니다. 메모리 stride와 같지는 않습니다. |
| pixel format | RGB·YUV·Bayer 등 샘플의 의미와 배치를 정합니다. |
| bytesperline | 한 줄을 저장할 때의 stride입니다. width × 임의의 바이트 수로 대신하지 않습니다. |
| sizeimage / bytesused | 할당에 필요한 공간과 이번 버퍼의 유효 데이터 길이를 구분합니다. |
| single-planar / multi-planar | 색 성분의 수와 API plane의 수를 단순히 동일시하지 않습니다. 실제 format·API를 확인합니다. |
format을 요청한 뒤에는 드라이버가 반환한 실제 값을 읽어야 합니다. 지원하지 않는 해상도나 정렬 조건 때문에 조정될 수 있습니다. 줄이 어긋나거나 색이 틀어졌다면 먼저 format과 stride를 확인합니다. V4L2 pixel format
전원은 probe 한 번으로 끝나지 않습니다
Linux 6.18 문서의 새 sensor driver는 runtime PM으로 clock·regulator·GPIO 등의 상태를 관리합니다. register 접근과 streaming에 필요한 동안 전원을 확보하고 사용이 끝나면 참조를 돌려줍니다. 옛 글의 .s_power() 예를 새 driver의 일반 규칙으로 가져오지 않습니다.
ret = pm_runtime_resume_and_get(dev);
if (ret < 0)
return ret;
/* 이제 센서 register 접근과 stream 시작을 수행합니다. */
/* 실패하면 이미 확보한 PM 참조를 반환해야 합니다. */이 코드는 PM 참조 확보 부분만 보인 예입니다. 센서 register 설정, error unwind, stream stop은 장치별로 구현해야 합니다. runtime_resume 안에서 무조건 v4l2_ctrl_handler_setup()을 호출하는 방식 역시 문서의 제약을 확인해야 합니다. sensor driver의 전원·clock 규칙
| 증상 | 나누어 확인할 단계 |
|---|---|
| DQBUF에서 계속 기다립니다. | QBUF, STREAMON, media link·format, sensor stream, receiver 오류, DMA 완료 순서로 확인합니다. |
| resume 뒤 첫 프레임만 깨집니다. | 전원·clock 복구, mode·control 재설정, stale buffer와 완료 상태를 확인합니다. |
| DMABUF fd는 전달했는데 화면이 깨집니다. | format·stride·수명·동기화와 importer가 지원하는 메모리 조건을 확인합니다. |