기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
모듈 초기화 함수는
init/main.c 의 do_initcalls()에서 등록이 됩니다.
probe함수의 호출은
platform_driver_register 혹은 platform_device_regsiter() 함수가 호출될 경우에 호출이 됩니다.
조건이 있는데, platform device와 platform driver가 둘 다 알맞는것이 존재할 경우 probe함수가 호출됩니다.
여기서 더 들어가면.........ㅎㅎ, 강좌가 되니 kernel device model에 대해서 좀 더 공부하시면 대략 아실 수 있을겁니다.
카메라 작업 중이신가보네요?
저도 카메라 작업 중입니다.
MODULE_DEVICE_TABLE로 grep해봤더니 MODULE_DEVICE_TABLE에 등록하고
module_init도 호출하는 코드들이 많습니다.
그래서 MODULE_DEVICE_TABLE과 probe 호출되는 시점과는 아무런 관계가 없다고 추측됩니다.
아래는 간단하게 ctag와 grep으로 펑션 호출 따라가본 결과입니다.
카메라쪽 코드들만 MODULE_DEVICE_TABLE에 등록하고
i2c 등록은 어플단에서의 호출로 시작됩니다.
device/sec/sec_proprietary/libcamera/SecCamera.cpp
688 int SecCamera::Create(int cameraId)
715 ret = fimc_v4l2_s_input(m_cam_fd, index);
259 static int fimc_v4l2_s_input(int fp, int index)
266 ret = ioctl(fp, VIDIOC_S_INPUT, &input);
drivers/media/video/v4l2-ioctl.c
1201 ret = ops->vidioc_s_input(file, fh, *i);
drivers/media/video/samsung/fimc/fimc_v4l2.c
277 .vidioc_s_input = fimc_s_input,
./drivers/media/video/samsung/fimc/fimc_capture.c
599 int fimc_s_input(struct file *file, void *fh, unsigned int i)
629 ret = fimc_configure_subdev(ctrl);
551 static int fimc_configure_subdev(struct fimc_control *ctrl)
586 sd = v4l2_i2c_new_subdev_board(&ctrl->v4l2_dev, i2c_adap,
| 587 name, i2c_info, &addr);
./drivers/media/video/v4l2-common.c
898 EXPORT_SYMBOL_GPL(v4l2_i2c_new_subdev_board);
| 851 /* Create the i2c client */
| 852 if (info->addr == 0 && probe_addrs)
| 853 client = i2c_new_probed_device(adapter, info, probe_addrs);
| 854 else
| 855 client = i2c_new_device(adapter, info);
이렇게 구성돼있어서
부팅 후 커널 메세지나 i2cdetect를 돌려보아도 해당 카메라 관련 된게 전혀 검색되지 않습니다.
카메라 어플을 실행해보면
am start -a android.intent.action.MAIN -n com.android.camera/.Camera
커널 메세지와 adb logcat에 메세지가 나오기 시작하면서 i2cdetect로 검색해보면
i2c device가 등록돼있는걸 확인하실 수 있습니다.
어떤 목적때문에 동적으로 등록하는지는 잘 모르겠지만
이렇게 등록하니 한 버스에 같은 i2c address 카메라 두개 붙였는데 통신 잘되네요