기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
exynos 4412 를 사용한 보드를 제작하였습니다.
여기에 cmos 카메라를 붙여서 실험을 하고 있습니다.
삼성에서 제공하는 기본적인 fimc 관련 device driver 는 포팅을 했고,
V4L2 도 삼성에서 기본적으로 제공한 것을 사용하고 있습니다.
화면 capture, preview 도 잘 됩니다.
참고로 preview 를 위해 어플에서 pthread 하나 돌리고 있고요.
어플은 C++ 로 만들었습니다.
그런데, 한가지 문제가 있더군요.
어플단에서 camera open 을 한 다음 close 를 하면 정상적으로 잘 됩니다.
그러나 open -> preview start -> preview stop -> close 를 하면
close 는 정상적으로 됐다고 return 값이 오는데, 실질적으로 kernel 단의
camera release 함수가 호출이 안됩니다.
좀더 확인해 봤더니 V4L2 의 ioctl 함수를 한번이라도 호출하게 되면,
close 가 안되는 현상이 발생하더군요.
물론 close 하기전에 open -> preview start -> preview stop -> preview start
-> preview stop 은 잘 됩니다.
카메라 초짜라 이래저래 맨땅에 헤딩하면서 하고 있는데, 위의 문제는 당췌
모르겠네요. system call 에서 문제가 있는 것인지, 아니면 V4L2가 문제인지
이런 경우는 처음입니다.
당근 close 시 memory 도 free 했고요.
혹시 유사한 경험을 가지고 계신분은 조언 좀 부탁드립니다.
방금 확인한 건데, 카메라 캡쳐할 때 캐쳐이미지를 저장할 메모리를 잡습니다.
그리고 바로 close 해보니 close 가 안되는 현상이 나오네요.
아마도 문제는 mmap 으로 잡은 메모리가 해제가 안되어서 그런거 같기는 한데,
코드상에서는 제대로 해제를 하도록 코딩한거 같거든요.
메모리 잡을 때
=======================================
struct v4l2_requestbuffers req;
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = 4;
ioctl(fd, VIDIOC_REQBUFS, &req)
....
mmap 으로 처리했고요.
=======================================
이렇게 잡았고......
close 하기 전에
=======================================
buf.count = 0;
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
if (ioctl(m_hCameraHandle, VIDIOC_REQBUFS, &req) < 0)
.......
munmap 으로 처리.
=======================================
위와 같이 메모리를 해제 해주었습니다.
근데도 close 가 안되네요. 뭔가 메모리를 해제해줘야 되는 다른방법이 있는건가요?
문제가 없어 보이는데요. 기본 Samsung BSP를 사용했다면 아마도 fim을 open한 후에 camera select를 하지 않고 close를 하면 문제가 되던 것 밖에 없었습니다.
특히나 Preview와 Capture 모드의 경우에는 Sensor Device Driver에서만 영향을 받기 때문에 모드에 대한 영향이라면 Sensor Device Driver에서 잘못되었을 경우이네요.
IOCTL의 return 값을 모두 검사 해 보세요. 특히 Sensor Device Driver에서 V4L2 함수에서 0이 아닌 값을 return하는지 확인 해 보세요.
linux에서 테스트하신건가요?
아니면 안드로이드인가요?
다른 프로세스에서 열고 있지 않나도 확인해 보시는게 좋습니다.