하드웨어
최근에 EZ-S3C6410 에 카메라를 연결하는 작업을 하였다.
배포하는 커널이 2.6.29 인데 카메라 드라이버에 버그가 있었다.
v4l2 (Video 4 linux 2 ==> Video for linux second) 연결부분에서 open(), release() 함수의 인자 문제인데
이전 v4l2 의 인자는 file 포인터와 inode 포인터 두개였지만 현재(2.6.29 이후)는 inode 포인터 하나만을 인자로 넘긴다.
이로 인해 드라이버를 연결하면 문제가 발생하였다.
이전소스(2.6.21 포함 이전)들과 현재의 카메라 드라이버 소스를 비교하면 현재의 드라이버가 상당히 깔끔하고 직관적이게
작성되었다. (개인적으로 정말 잘 만들었다)
카메라를 캡쳐하려면 카메라에 대한 기본적인 내용을 알아야 한다.
삼성 MCU 들로 DVR 장비를 만들지는 않으니 이글을 DVR 과 접목해서 판단하지 말기 바란다.
보통 보드에 카메라를 단다면 CMOS 카메라를 연결한다. 카메라 드라이버에서는 이 카메라를 센서라고 말한다.
MCU 에서 카메라를 캡쳐하는 드라이버를 카메라 드라이버이며 이를 사용자(APP)에 표준화하여 보여주는
리눅스 표준을 V4L 이라고 말한다. 요즘은 V4L 두번째 버젼이 나와서 V4L2 라고 표기한다.
삼성커널에서는 카메라캡쳐 부분을 FIMC 라는 용어를 사용한다. (약어는 찾아볼 생각을 안했다 ㅜ.ㅜ)
FIMC 드라이버에서 수정할 부분은 카메라센서 만을 수정하면 된다.
사용하고자 하는 카메라가 제각각 틀리니 수정해야 하는 것은 당연한데...
MCU 에서 카메라를 캡쳐하는 형식은 여러가지가 있다.
카메라센서에서는 크게 2가지 형태의 출력을 지원한다.
- YCbCr
- RGB Bayer
YCbCr 을 풀어보면 Y 는 밝기이며 Cr 은 Complement Red (Red 보수), Cb 는 Complement Blue (Blue 의 보수) 이다.
식으로 나타내면 쉽다.
- Y = R + 2G + B
- Cr = Y - R
- Cb = Y - B
이전에 Y (흑백)값으로 영상처리를 많이 했지만 지금은 HSI 형태이니 나도 이제 구시대의 개발자당 ㅠㅠ
하지만 아직도 카메라 센서들은 YCbCr 의 형태로 출력을 내어준다.
YCbCr 영상의 포맷도 여러형태가 있다.
영상은 frame 이라는 말과 field 라는 말이 존재하는데 DVR 이 아니므로 frame 이라는 말만을 사용한다.
frame 은 우리가 알고있는 1초에 몇번 영상이 샘플되는지는 나타내는 숫자이다.
카메라 센서는 클럭입력을 주면 출력으로 PCLK (픽셀클럭), Hsync, Vsync, Data(8) 이 나온다.
frame 은 쉽게 Vsync 와 매칭이 되는데 Vsync 나 Hsync 를 MCU 쪽에서는 바라보지 않을 경우가 많다.
CCIR656 형태의 출력일 경우 처음 4번의 데이타에 헤더정보가 실려 이 값을 보고 프레임 시작임을 감지할 수 있다.
영상의 특성상 0xff 란 값이 나오지 않으므로 헤더는 0xff 를 선두에 달고 정보를 표시한다.
자세한 내용은 인터넷 검색을 하면 된다. ^^
대부분의 경우 카메라센서의 출력을 CCIR656 을 사용하니 다른 형태에 대해서는 언급하지는 않겠다.
카메라센서는 모두 i2c 를 통해 레지스터를 설정하는데 이때 카메라의 해상도와 출력형태 (CCIR656)
출력순서(YCbCr or CbCrY, YCrCb 등) 을 결정한다.
중요한것을 클럭의 엣지이다. Falling 또는 Raising 을 정확히 설정해야 한다.
i2c 를 이용하여 카메라를 설정하므로 기본적인 리눅스 i2c 드라이버의 형태도 알아야 한다.
커널의 driver/media/video 의 디렉토리에 많으니 참고한다.
다시 삼성의 카메라 드라이버로 돌아와서..
삼성에서 만든 ARM MCU 들중에 카메라를 지원하면 아래의 두가지 형태를 볼수 있다.
- codec
- preview
삼성의 카메라 하드웨어는 항상 위의 2가지 형태를 지원한다.
codec 은 카메라 센서를 YCbCr 의 형태로 켭쳐하는 것이며
preview 는 YCbCr 로 캡쳐한 후 RGB 형태로 변환하여 제공한다.
즉 preview 는 LCD 에 보여주기 위한 형태를 지원한다.
YCbCr 을 RGB 로 변환하는 공식은 여러가지가 나와있지만 단순희 특정값을 곱하여 나타내는 것은 오차가 심하다
복잡한 계산을 하면 MCU 의 자원을 사용하게되니 하드웨어에서 RGB 변환을 지원한다.
preview 드라이버가 이일을 수행한다.
YCbCr 형태는 영상 압축(encoding)에서 사용된다. ( JPEG, MPEG, H.264 )
다음시간에는 V4L2 에 대해 글을 작성하려고 합니다.
카메라 클럭 활성화 하는 api 좀 알려주실 수 있나요 2.6.35 기반입니다.