본문 바로가기

임베디드

카메라 입력 테스트

Allwinner S3/i3 CPU에는 parallel과 serial(MIPI-CSI) 2개의 카메라 이미지 입력 포트가 있다.

그런데 현재 메인라인 커널은 MIPI-CSI와 ISP를 지원하지 않으며 추후에 bootlin에서 지원할 가능성은 있다.

 

OV7670이라는 VGA급 저질 카메라를 Parallel로 연결하여 간단한 정지영상 capture를 해보았다.

아래 명령은 640x480 해상도의 YUYV 포맷 이미지로 읽어내어 JPEG 형식의 파일로 저장 한다.

fswebcam -S 10 -d /dev/video0 -p YUYV -r 640x480 test22.jpg

 

저장한 이미지는 fbi라는 프로그램으로 프레임버퍼에 저장한 파일을 디스플레이 하였다.

fbi -d /dev/fb0 test22.jpg -a -T 1

 

LCD 화면에 보이는 결과는 다음과 같다. 화질이 심하게 구리구리하다. 개선의 여지가 있는지는 모르겠다.

보기에는 정말 간단하지만, 관련된 devicetree 이리저리 수정해보고  sun6i_csi.c 디바이스 드라이버의 역할을 이해하는데 상당히 오랜시간을 투자한것 같다. 오랜만에 코드를 오랬동안 째려봤더니 어질어질하다.

 

Github에 관련 수정 내용을 모두 올렸다.

https://github.com/foxnux/linux/commit/ee348372c65754c541eedabe6c2048eaebbe188c

https://github.com/foxnux/linux/commit/35035d2912dc83ba5f350386ad79dd4683f6a7a9

 

sun6i_csi 드라이버에 대한 내용은 아래 링크에 잘 정리되어 있다.

https://www.kernel.org/doc/Documentation/devicetree/bindings/media/sun6i-csi.txt

 

 

녹색의 지저분한 노이즈가 비교적 빈번하게 나타나는데 카메라 모듈과 연결된 케이블의 접촉저항 문제로 보인다.

또한 VSYNC/HSYNC 극성도 확인해 보아야겠다.

 

그리고 v4l2 표준 검사에서 실패하는 항목이 몇개 보인다.  원인 파악이 어려울것 같다.

v4l2-compliance -s -f

추후에 preview 기능도 시도해 보아야겠다.  아래 사이트에 참고할만한 내용이 많이 보인다.

https://wiki.st.com/stm32mpu/wiki/V4L2_camera_overview

 

카메라의 기본 이미지 입력 기능은 동작하지만 여러가지 안정성/호환성 문제가 보여 완성도 높게 마무리하려면 고달프겠다.

 

2020년 1월 14일 업데이트

빌드루트를 테스트하면서 preview 기능을 사용하는 방법을 알았다.

ffmpeg으로 간단하게 구현되었다.

 

먼저 ffmpeg -f v4l2 -list_formats all -i /dev/video0 명령어로 지원 가능한 비디오 입력 포맷을 알아본다.

# ffmpeg -f v4l2 -list_formats all -i /dev/video0
[video4linux2,v4l2 @ 0x582e0] Raw       : bayer_bggr8 : 8-bit Bayer BGBG/GRGR :
[video4linux2,v4l2 @ 0x582e0] Raw       : bayer_gbrg8 : 8-bit Bayer GBGB/RGRG :
[video4linux2,v4l2 @ 0x582e0] Raw       : bayer_grbg8 : 8-bit Bayer GRGR/BGBG :
[video4linux2,v4l2 @ 0x582e0] Raw       : bayer_rggb8 : 8-bit Bayer RGRG/GBGB :
[video4linux2,v4l2 @ 0x582e0] Raw       : Unsupported : 10-bit Bayer BGBG/GRGR :
[video4linux2,v4l2 @ 0x582e0] Raw       : Unsupported : 10-bit Bayer GBGB/RGRG :
[video4linux2,v4l2 @ 0x582e0] Raw       : Unsupported : 10-bit Bayer GRGR/BGBG :
[video4linux2,v4l2 @ 0x582e0] Raw       : Unsupported : 10-bit Bayer RGRG/GBGB :
[video4linux2,v4l2 @ 0x582e0] Raw       : Unsupported : 12-bit Bayer BGBG/GRGR :
[video4linux2,v4l2 @ 0x582e0] Raw       : Unsupported : 12-bit Bayer GBGB/RGRG :
[video4linux2,v4l2 @ 0x582e0] Raw       : Unsupported : 12-bit Bayer GRGR/BGBG :
[video4linux2,v4l2 @ 0x582e0] Raw       : Unsupported : 12-bit Bayer RGRG/GBGB :
[video4linux2,v4l2 @ 0x582e0] Raw       :     yuyv422 :           YUYV 4:2:2 :
[video4linux2,v4l2 @ 0x582e0] Raw       : Unsupported :           YVYU 4:2:2 :
[video4linux2,v4l2 @ 0x582e0] Raw       :     uyvy422 :           UYVY 4:2:2 :
[video4linux2,v4l2 @ 0x582e0] Raw       : Unsupported :           VYUY 4:2:2 :
[video4linux2,v4l2 @ 0x582e0] Raw       : Unsupported : YUV 4:2:0 (16x16 Macroblocks) :
[video4linux2,v4l2 @ 0x582e0] Raw       :        nv12 :         Y/CbCr 4:2:0 :
[video4linux2,v4l2 @ 0x582e0] Raw       : Unsupported :         Y/CrCb 4:2:0 :
[video4linux2,v4l2 @ 0x582e0] Raw       :     yuv420p :     Planar YUV 4:2:0 :
[video4linux2,v4l2 @ 0x582e0] Raw       :     yuv420p :     Planar YVU 4:2:0 :
[video4linux2,v4l2 @ 0x582e0] Raw       : Unsupported :         Y/CbCr 4:2:2 :
[video4linux2,v4l2 @ 0x582e0] Raw       : Unsupported :         Y/CrCb 4:2:2 :
[video4linux2,v4l2 @ 0x582e0] Raw       :     yuv422p :     Planar YUV 4:2:2 :
[video4linux2,v4l2 @ 0x582e0] Raw       :    rgb565le :     16-bit RGB 5-6-5 :
[video4linux2,v4l2 @ 0x582e0] Raw       :    rgb565be :  16-bit RGB 5-6-5 BE :
[video4linux2,v4l2 @ 0x582e0] Compressed:       mjpeg :            JFIF JPEG :
/dev/video0: Immediate exit requested

mjpeg을 사용해 보고 싶었으나 동작하지 않는다.

이유는 모르겠으나 Sunxi 메인라인 커널의 sun6i_csi.c 에는 관련 기능이 빠져있다.

 

화질이 좋을 것으로 예상되는 yuv422p를 선택하여 테스트 해보았다.

LCD 화면 좌측 상단에 640x480 해상도로  preview가 잘된다. LCD 화면에 꽉차게 scale-up하는 방법은 나중에 찾아보자.

메시지 만으로 판단해보면 30FPS가 꾸준히 올라오는 것으로 보이다.

# ffmpeg -f video4linux2 -video_size 640x480 -r 5 -input_format yuv422p -i /dev/video0 -pix_fmt bgra -f fbdev /dev/fb0
[video4linux2,v4l2 @ 0x583e0]  613.634290] sun6i-csi 1cb4000.csi: dma_alloc_coherent of size 614400 failed
[0mioctl(VIDIOC_G_PARM): Inappropriate ioctl for device
[video4linux2,v4l2 @ 0x583e0] Time per frame unknown
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 613.674923, bitrate: N/A
    Stream #0:0: Video: rawvideo (Y42B / 0x42323459), yuv422p, 640x480, 30 tbr, 1000k tbn, 1000k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> rawvideo (native))
Press [q] to stop, [?] for help
[swscaler @ 0x60f50] No accelerated colorspace conversion found from yuv422p to bgra.
Output #0, fbdev, to '/dev/fb0':
  Metadata:
    encoder         : Lavf58.29.100
    Stream #0:0: Video: rawvideo (BGRA / 0x41524742), bgra, 640x480, q=2-31, 49152 kb/s, 5 fps, 5 tbn, 5 tbc
    Metadata:
      encoder         : Lavc58.54.100 rawvideo
frame= 3387 fps= 30 q=-0.0 Lsize=N/A time=00:11:17.40 bitrate=N/A speed=6.02x    
video:4064400kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown

 

기존에 녹색 노이즈가 많이 나오는 현상은 카메라 모듈 연결용 Flat 케이블의 접촉 문제였다.

케이블을 교체하니 녹색의 불규칙한 노이즈는 많이 사라졌다. 여전히 조금씩 보이기는 하지만.

추후에 좀 짧은 케이블을 구해서 테스트 해보도록 하자.

'임베디드' 카테고리의 다른 글

Buildroot 테스트  (0) 2020.01.06
ADC 키패드 입력 테스트  (0) 2020.01.06
동영상 재생 테스트  (0) 2020.01.02
Kernel 5.5 (rc4) 포팅과 부팅  (2) 2019.12.31
CH330N/CH340 Windows 10 드라이버 설치  (0) 2019.12.31