안녕하세요
임베디드 리눅스 초보 개발자 입니다.
SPI 인터페이스를 사용하는 카메라를 개발하고 있구요
카메라 기본 동작및 테스트를 위해 S5PV210 보드에 포팅하고 있습니다.
커널은 2.6.32 Android(Froyo) 버전사용합니다.
카메라 디바이스 구조체에는 기본적으로 I2C 를 사용하도록 되어 있어서
인터넷에서 찾은 내용을 토대로 v4l2의 내용을 일부 수정했구요
해당 카메라 드라이버는 다른 SPI를 사용하는 Driver 형식을 참고했습니다.
문제는 init() 함수는 제대로 타는데, probe() 함수를 실행하지 못하고 있습니다.
몇일째 삽질을 하고 있습니다만 워낙 아는것이 없어 같은 자리만 계속 돌고 있습니다.
어디를 참고 해야 할지, 어디가 잘못되었는지...
고수분들의 지식을 좀 나눠주세요
감사합니다.
제가 작업한 부분은 아래와 같습니다.
SPI 관련 정보를 추가
v4l2-common.c
+ void v4l2_spi_subdev_init(struct v4l2_subdev *sd, struct spi_device *spi,
+ const struct v4l2_subdev_ops *ops)
+ struct v4l2_subdev *v4l2_spi_new_subdev(struct v4l2_device *v4l2_dev,
+ struct spi_master *master, struct spi_board_info *info)
v4l2-device.c
- v4l2_device_unregister()
+ if (sd->flags & V4L2_SUBDEV_FL_IS_SPI) {
+ struct spi_device *spi = v4l2_get_subdevdata(sd);
+ if (spi)
+ spi_unregister_device(spi);
+ }
v4l2-common.h
+ struct spi_device;
+ struct v4l2_subdev *v4l2_spi_new_subdev(struct v4l2_device *v4l2_dev, struct spi_master *master,
+ struct spi_board_info *info);
+ void v4l2_spi_subdev_init(struct v4l2_subdev *sd, struct spi_device *spi,
+ const struct v4l2_subdev_ops *ops);
v4l2-subdev.h
+ #define V4L2_SUBDEV_FL_IS_SPI (1U << 1)
위의 내용은
http://lwn.net/Articles/378783/ 에 내용을 참고 했구요.
카메라 드라이버
static int mt9d111_probe(struct spi_device *spi)
{
int ret;
struct mt9d111_state *state;
struct v4l2_subdev *sd;
printk("ttn[REDZONE] MT9D111 Probe !!!n");
state = kzalloc(sizeof(struct mt9d111_state), GFP_KERNEL);
if (state == NULL)
return -ENOMEM;
sd = &state->sd;
strcpy(sd->name, "camera_spi");
spi->bits_per_word = 8;
spi->mode = SPI_MODE_0;
ret = spi_setup(spi);
g_spi = spi;
/* Registering subdev */
v4l2_spi_subdev_init(sd, spi, &mt9d111_ops);
g_state = state;
mt9d111_initialize();
dev_info(&spi->dev, "mt9d111 has been probedn");
return 0;
}
static int mt9d111_remove(struct spi_device *spi)
{
struct v4l2_subdev *sd = spi_get_drvdata(spi);
v4l2_device_unregister_subdev(sd);
kfree(to_state(sd));
return 0;
}
static struct spi_driver mt9d111_driver = {
.driver = {
.name = "camera_spi", //MT9D111_DRIVER_NAME,
.owner = THIS_MODULE,
},
.probe = mt9d111_probe,
.remove = __exit_p(mt9d111_remove),
.suspend = NULL,
.resume = NULL,
};
static int __init mt9d111_init(void)
{
int ret;
ret = spi_register_driver(&mt9d111_driver);
printk("t[REDZONE] %s %dn", __func__, ret);
return ret;
}
static void __exit mt9d111_exit(void)
{
spi_unregister_driver(&mt9d111_driver);
}
module_init(mt9d111_init);
module_exit(mt9d111_exit);
부팅 완료후에 /sys/bus/spi/drivers/camera_spi 라고 뭔가 생기긴 했습니다... ㅡㅡ"
의 이름과 동일하게 해주셔야 probe()함수가 수행 됩니다.