1.OV的PWDN是高电平有效,即高电平时Camera睡眠,此时I2C也不工作(用i2cdetect探测不到),在低电平时Camera工作;
2.i2cdetect是个很好的工具,你用这个工作时,不用在意设备的寄存器地址位宽和数据位宽,只要保证设备的工作电压以及其挂载到哪一个I2C控制器上,就可以发现该设备,这样可以大大提高初期工作的效率。
3.时序是很重要的,GT2005的时序与OV的时序就不一样,GT的PWDN是低电平有效,所以工作时要把PWDN拉高。这一步是最重要的,只有保证了其工作环境,才能用i2cdetect探测到设备。
4.能够用i2cdetect探测到设备,以后你做事就有底了,至少知道我可以控制这个设备了,哈哈。以后你要关注的就是设备地址,寄存器地址位宽,寄存器数据位宽。这时你应该能够保证用自己写的代码与I2C设备交互。
5.最后你应该能够知道怎么配置设备的寄存器,使其更好的工作,完成它的使命。哈哈,就是向这个设备发命令,控制这个设备。哈哈,成就感。。。。
注:
1.关于I2C的上拉电阻的问题,GT的推荐是4.7K~10K,但是板子上的2.2K也可以。I2C的上拉电阻大致可以用:1.5K,2.2K,4.7K。太小会太耗电,太大好像还影响速度。网上说,不能小于1K,不能大于10K。哈哈。。
2.Makefile、Kconfig、config文件(depends on)等,要把自己的驱动能够编译进Kernel
3.device和driver结构体的创建(要按照LINUX定义的框架去创建),camera这一块就要参考V4L2的结构体,主要参照*.h头文件做就可以,在kernel启动的时候,能够加载驱动(device和driver的name要相同),能够让driver调用device提供的函数(只要结构体包含正确,就能调得到)。
4.gpio_request(GPIO_PV4, "ca_pw"), gpio_direction_outpu(GPIO_PV4, 1), gpio_free(GPIO_PV4),这里调用了gpio_free之后,就已经把该GPIO释放掉了,已经不是你设置的状态了。
5.在device下创建的文件会在相应的sys/class目录下生成sys目录,比如/sys/class/i2c-dev/i2c-3/device/3-0030对应的是3号i2c下地址为0x30的设备
6.在probe i2c adapter时(i2c-xxx.c),会去创建该adapter下面挂载的i2c设备的device(i2c_add_numbered_adapter或i2c_add_adapter), 最终会调到i2c_new_device(),该函数会去判断设备的地址是否正确(i2c_check_client_addr_validity()),以及I2C的地址是否注册过(i2c_check_addr_busy()),也就是说一个BUS下面,不能同时存在两个地址相同的I2C设备。
7.在添加I2C驱动时,调用i2c_add_driver()-》i2c_register_driver(),在其中会Probe I2C设备的驱动,如果Probe不成功也会创建driver class,如果想Probe另外一个同名的驱动,可以判断Probe的结果,如果错误,就调用i2c_del_driver()函数删除该驱动,这样第二个驱动才可以正常probe。
8. 电路图方面:0R是零欧,哈哈,相当于一个跳线。NC是不贴的意思,也就是有两种方案,/NC的一种方案是不贴片的,哈哈~
9.经过验证camera模组在没有MCLK的情况下是不工作的,所以除了时序还要提供MCLK。
10.Camera的Preview和拍照工作功率不同。
在一个产品中的Bring up阶段,Preview(800x600)正常,但是拍照(1600x1200)确死在那里,经牛人指点,怀疑是模组供电不足,并且用320x240的拍照没有问题,更加确认了这一点,最后把问题定位在了2.8V的LDO上,该LDO最大电流为50mA,可能是这个问题导致的。
这里有LDO(低压差线性稳压器)的详细介绍:http://baike.baidu.com/view/1042146.htm
高通平台下Camera bring up 文档:http://www.docin.com/p-36786859.html