[rapa3기][4조][실시간 운영체제 이식, 최적화 및 차량용 미들웨어 개발] imx219 모듈 관련 질문드립니다

안녕하세요 ai-g-topst 보드에서 IMX219 카메라 사용 중 드라이버/디바이스트리 적용 관련하여 문의드립니다.

보드 환경은 다음과 같습니다.

  • Host(빌드): Ubuntu 22.04 (WSL2)

  • Yocto SDK: topst-sdk / MACHINE=ai-g-topst

  • Image: telechips-topst-ai-image

  • Target board: ai-g-topst

  • Target OS: Telechips Baseline (Poky/meta-telechips/meta-core) 4.0.17

보드 부팅 후 UART/쉘에서 확인한 값은 아래와 같습니다.

ai-g-topst:~$ uname -a
Linux ai-g-topst 5.10.223-tcc #1 SMP PREEMPT Thu Jun 19 10:07:38 UTC 2025 aarch64 aarch64 aarch64 GNU/Linux

ai-g-topst:~$ cat /proc/version
Linux version 5.10.223-tcc (oe-user@oe-host) (aarch64-telechips-linux-gcc (GCC) 11.2.1 20220111, GNU ld (GNU Binutils) 2.38.20220708) #1 SMP PREEMPT Thu Jun 19 10:07:38 UTC 2025

ai-g-topst:~$ cat /etc/os-release
ID=poky-telechips-systemd
NAME="Telechips Baseline (Poky/meta-telechips/meta-core)"
VERSION="4.0.17"
VERSION_ID=4.0.17
PRETTY_NAME="Telechips Baseline (Poky/meta-telechips/meta-core) 4.0.17"

카메라 디바이스 노드는 아래처럼 보입니다.

ai-g-topst:~$ ls -l /dev/video* /dev/media* 2>/dev/null
crw-rw---- 1 root video 252, 0 Apr 28 17:42 /dev/media0
crw-rw---- 1 root video  81, 0 Apr 28 17:42 /dev/video0

그런데 커널 설정에서 IMX219 관련 항목이 확인되지 않습니다.

ai-g-topst:~$ zcat /proc/config.gz 2>/dev/null | grep -i IMX219 || echo "no IMX219 in kernel config"
no IMX219 in kernel config

또한 modprobe가 타깃에 없어서 모듈 로드도 확인하기 어렵습니다.

ai-g-topst:~$ modprobe imx219
sh: modprobe: command not found

호스트에서 stitch-fai-ai.sh -f를 실행하면 아래와 같이 FAI/FWDN 패키징은 정상 완료됩니다.

  • telechips-topst-ai-image-ai-g-topst.ext4

  • tcc7500-lpd4x321.dtb

  • tc-boot-ai-g-topst.img

  • u-boot.rom

등이 포함되어 output_nd.fai 생성 및 output_nd.fwdn.zip 패키징은 완료했습니다.

./stitch-fai-ai.sh -f
...
Complete to make fai file
[+] Packaging FWDN binaries
  adding: output_nd.fai ...
  adding: output_nd.gpt ...
  adding: fwdn_nd.exe ...
...

zcat /proc/config.gz | grep -i IMX219에서 IMX219 관련 설정이 전혀 나오지 않는 경우, 보통 커널에 드라이버가 미포함인 것인지, 혹은 DTB만 적용하면 되는 구조인지 어느 쪽 가능성이 높은지 궁금합니다.

modprobe가 없는 타깃 환경에서 IMX219가 모듈이 아닌 built-in인지 / 드라이버가 실제 로드됐는지 확인하는 방법이 있을까요?
(예: dmesg | grep -i imx / media-ctl -p / sysfs 경로 등)

가능하면 IMX219 적용을 위해 확인해야 하는 recipe/DTB 노드/커널 config 옵션 이름도 조언 주시면 감사하겠습니다.

읽어주셔서 감사합니다.

안녕하세요.
해당 문의에 답변 드립니다.

현재 github과 topst.ai 홈페이지에서 공식 지원하고 있는 소스와 이미지는 imx219센서를 지원하고 있지 않습니다.
현재 v1.0.0으로 이미지가 릴리즈된 상황인데, 곧 v1.1.0을 릴리즈할 예정입니다.
릴리즈 이후 v1.1.0에는 imx219센서가 포함되어있고, local.conf에서 단순하게 feature만 변경하여 빌드하시면 imx219를 사용하실 수 있습니다. 혹은 imx219용 image를 다운하셔서 fwdn 후 사용하시면 됩니다.

현재 받으신 이미지에서는 ov5647 센서만 사용하실 수 있습니다.
v1.1.0은 곧 릴리즈 예정이니, 참고 부탁드립니다.

감사합니다!

구현 방법은 아래와 같습니다.

  1. 드라이버 및 Kconfig 추가
    imx219는 kernel config에 기본적으로 포함이 되어있지 않습니다. 따라서 imx219.c 드라이버를 만드시고, Kconfig에 컨피그를 추가해줍니다. 다음 Makefile에 해당 config 활성화 여부에 따라 imx219.c 드라이버가 빌드도록 추가해주면 됩니다.

  2. 디바이스 트리 추가
    imx219용 디바이스 트리 또한 없기 때문에 MIPI0 혹은 MIPI1 원하는 포트에 맞도록 디바이스 트리를 추가해주시면 됩니다. 이 때 include로 디바이스 트리 또한 빌드되도록 설정해주어야합니다.

  3. Kconfig 활성화 후 커널 재빌드

빌드를 하시면 imx219는 모듈이 아니라 커널에 포함되어 빌드가 됩니다.
따라서 부팅 후 dmesg에서 imx가 probe되었다는 로그를 확인할 수 있어야 합니다.
media-ctl -p로는 포트간 linking이 잘 되어있는지 확인해주시면 됩니다.
아래는 media-ctl -p 출력 예입니다.

 media-ctl -p
Media controller API version 5.10.205
 
Media device information
------------------------
driver          tcc-cap-media-d
model           Telechips capture subsystem
serial
bus info        platform:camera sub-system
hw revision     0x0
driver version  5.10.205
 
Device topology
- entity 1: videoinput0 (1 pad, 1 link)
            type Node subtype V4L flags 0
            device node name /dev/video0
        pad0: Sink
                <- "tcc-isp-0":1 [ENABLED,IMMUTABLE]
 
- entity 5: tcc-isp-0 (2 pads, 2 links)
            type V4L2 subdev subtype Unknown flags 1
            device node name /dev/v4l-subdev0
        pad0: Sink
                [fmt:SRGGB10_1X10/1920x1080 field:none colorspace:raw xfer:none ycbcr:601 quantization:full-range]
                <- "mipi_csi2_0":1 [ENABLED,IMMUTABLE]
        pad1: Source
                [fmt:UYVY8_1X16/1912x1064 field:none]
                -> "videoinput0":0 [ENABLED,IMMUTABLE]
 
- entity 8: mipi_csi2_0 (5 pads, 2 links)
            type V4L2 subdev subtype Unknown flags 1
            device node name /dev/v4l-subdev1
        pad0: Sink
                [fmt:SRGGB10_1X10/1920x1080 field:none colorspace:raw xfer:none ycbcr:601 quantization:full-range]
                <- "imx219 7-0010":0 [ENABLED,IMMUTABLE]
        pad1: Source
                [fmt:SRGGB10_1X10/1920x1080 field:none colorspace:raw xfer:none ycbcr:601 quantization:full-range]
                -> "tcc-isp-0":0 [ENABLED,IMMUTABLE]
        pad2: Source
                [fmt:SRGGB10_1X10/1920x1080 field:none colorspace:raw xfer:none ycbcr:601 quantization:full-range]
        pad3: Source
                [fmt:SRGGB10_1X10/1920x1080 field:none colorspace:raw xfer:none ycbcr:601 quantization:full-range]
        pad4: Source
                [fmt:SRGGB10_1X10/1920x1080 field:none colorspace:raw xfer:none ycbcr:601 quantization:full-range]
 
- entity 14: imx219 7-0010 (1 pad, 1 link)
             type V4L2 subdev subtype Sensor flags 0
             device node name /dev/v4l-subdev2
        pad0: Source
                [fmt:SRGGB10_1X10/1920x1080 field:none colorspace:raw xfer:none ycbcr:601 quantization:full-range
                 crop.bounds:(8,8)/3280x2464
                 crop:(688,700)/1920x1080]
                -> "mipi_csi2_0":0 [ENABLED,IMMUTABLE]

감사합니다.

안내주신 내용 시도해보도록 하겠습니다. 감사합니다!

안녕하세요! 안내주신 방법대로 imx219 드라이버/Kconfig, DTS 추가 후 커널 재빌드까지 진행했고, 부팅 후 dmesg에서 imx219 3-0010 probe 로그 확인했습니다. media-ctl -p에서도 imx219 → mipi_csi2_0 → tcc-isp-0 → videoinput0 링크가 ENABLED로 잡히는 것까지는 확인했습니다.

ai-g-topst:~$ media-ctl -p
Media controller API version 5.10.223

Media device information
------------------------
driver          tcc-cap-media-d
model           Telechips capture subsystem
serial          
bus info        platform:camera sub-system
hw revision     0x0
driver version  5.10.223

Device topology
- entity 1: videoinput0 (2 pads, 1 link)
            type Node subtype V4L flags 0
            device node name /dev/video0
        pad0: Sink
                <- "tcc-isp-0":1 [ENABLED,IMMUTABLE]
        pad1: Source

- entity 6: tcc-isp-0 (2 pads, 2 links)
            type V4L2 subdev subtype Unknown flags 1
            device node name /dev/v4l-subdev0
        pad0: Sink
                [fmt:SRGGB10_1X10/3280x2464 field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]
                <- "mipi_csi2_0":1 [ENABLED,IMMUTABLE]
        pad1: Source
                [fmt:UYVY8_1X16/3272x2448 field:none]
                -> "videoinput0":0 [ENABLED,IMMUTABLE]

- entity 9: mipi_csi2_0 (5 pads, 2 links)
            type V4L2 subdev subtype Unknown flags 1
            device node name /dev/v4l-subdev1
        pad0: Sink
                [fmt:SRGGB10_1X10/3280x2464 field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]
                <- "imx219 3-0010":0 [ENABLED,IMMUTABLE]
        pad1: Source
                [fmt:SRGGB10_1X10/3280x2464 field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]
                -> "tcc-isp-0":0 [ENABLED,IMMUTABLE]
        pad2: Source
                [fmt:UYVY8_2X8/1x1 field:none]
        pad3: Source
                [fmt:UYVY8_2X8/1x1 field:none]
        pad4: Source
                [fmt:UYVY8_2X8/1x1 field:none]

- entity 15: imx219 3-0010 (1 pad, 1 link)
             type V4L2 subdev subtype Sensor flags 0
             device node name /dev/v4l-subdev2
        pad0: Source
                [fmt:SRGGB10_1X10/3280x2464 field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range
                 crop.bounds:(8,8)/3280x2464
                 crop:(8,8)/3280x2464]
                -> "mipi_csi2_0":0 [ENABLED,IMMUTABLE]

그런데 여기서 실제 프레임을 파일로 저장해서 확인하는 단계에서 막혔습니다.
/dev/video0에서 v4l2-ctl로 스트리밍을 걸면 --verbose 기준으로는 dqbuf 로그가 출력되면서 bytesused도 4147200(1920x1080 UYVY 기준)처럼 정상 값이 찍히는데, 정작 --stream-to로 raw를 저장하면 파일이 항상 0 byte로 남습니다.

예를 들어 아래처럼 실행해도 파일이 0 byte입니다.

v4l2-ctl -d /dev/video0 \
  --set-fmt-video=width=1920,height=1080,pixelformat=UYVY \
  --stream-mmap=4 --stream-count=1 --stream-to=$HOME/frame.uyvy

추가로 /dev/video0 드라이버가 tcc-dewarp로 잡히는데, 혹시 이 노드는 v4l2-ctl --stream-to 방식으로 payload dump가 원래 지원되지 않는 구조인지, 아니면 다른 캡처 노드(/dev/videoX)나 별도 샘플 앱/권장 캡처 방법을 써야 하는지 궁금합니다. 답변 부탁드립니다. 감사합니다!