項目比較緊,3周內把一個帶有外置ISP,MIPI數據通訊,800萬像素的camera從無驅動到實現客戶所有需求。linux
1日 搭平臺,建環境,編譯內核,燒寫代碼。shell
我是一直在Window下搭個虛擬機登服務器搞開發的,對Linux系統環境實在無愛,往往一到項目剛開始要搭環境了,心裏總有點排斥,過程就比較糾結,看來之後仍是要搞個linux真機玩玩。服務器
2日 編寫camera驅動大體框架,配置GPIO,I2C,MIPI,電壓,時鐘等。
不多能碰到FAE只給硬件手冊,沒有Linux和Android驅動的。由於是camera sensor外接ISP芯片,杯具就發生了。整個系統是這樣,高通平臺的開發板,本身寫驅動來控制ISP芯片,ISP芯片與camera sensor封裝在一塊兒,ISP控制sensor,實質就是sensor寫寄存器。架構
開始寫驅動了,說好聽的那是站在巨人的肩膀上借鑑別的驅動,說難聽的就是照葫蘆畫瓢,反正再改下Kconfig, Makefile,這驅動框架就算是有了。
對驅動開發而言,前期的主要工做應該就是配置GPIO口和芯片上電時序了。框架
每一個特定平臺在操做GPIO,電壓,時鐘上都會有本身的一套內核API封裝實現,只要能看懂會用這些API便可。配置完後,須在驅動初始化函數裏,正確設置芯片的上電時序,確保芯片硬件上能正常工做起來。函數
3日 編寫I2C通訊的封裝函數,調試CPU與ISP間的I2C通訊性能
對於一些成熟方案,上面的工做完成順利的話,驅動就差很少了。。很惋惜,這塊ISP芯片在提高800萬camera性能的同時,並無給我帶來足夠多的技術支持,只能說,成也ISP,敗也ISP,解決方案全都本身來吧。萬里長征第一道坎即是I2C。學習
I2C通訊自己要注意兩點,調試
1) SDA第9位ACK位爲低時說明從設備有響應。開發
2) Slave address
芯片手冊對這個從設備地址沒有統一的寫法,有的給出8位地址,有的給出7位地址,一開始容易混淆。若是給出的是8位地址,那第8位是指Write- 0或者Read-1,實際的I2C芯片地址是7位的。Linux源碼裏struct i2c_board_info的板基信息應填寫7位I2C地址,另外,I2C芯片地址能夠經過開發板shell環境下$ ls /sys/bus/i2c/devices/ 查看。舉個例子,
static struct i2c_board_info msm_camera_boardinfo[] __initdata = {
{
I2C_BOARD_INFO("ov8820", 0x78 >> 1),
},
4日 FAE現場支持
FAE過來了,就確認了一件事,沒有現成驅動了,我完全死心了。後來還發現一個規律,只要FAE來現場那就意味着啥都搞不出來了。。幾我的匯聚思想還不如一我的靜下心來研究。不過他們此行至少留下一份重要的資料-ISP芯片指令序列,camera全部功能的實現就靠它了。
5日 調通I2C
I2C的調通具備里程碑式的意義,它不只標誌着硬件性能正常開啓,更爲後來璀璨絢爛的camera世界奠基了堅實的基礎。。
有段時間卡在I2C 通訊上,給ISP芯片0x3c寫入開啓芯片命令0xf0成功,可是再發送其餘命令所有失敗。
分析現象,I2C總線已經能夠通訊了,問題只能是在ISP芯片上,因而,查電路圖,抄傢伙起來把電路板上的電和時鐘所有再量一遍。。
結果發現,有一路來自自動對焦馬達的電壓只有1.7V,沒有達到要求,驅動裏沒有把它的GPIO拉高,致使芯片沒法正常開啓工做。
6日 編寫預覽驅動,測量MIPI數據
根據葵花寶典裏的ISP指令序列,在Linux驅動裏和Android高通抽象層裏填寫相關代碼,即可實現預覽功能。不過很不幸,光靠那兩下子預覽 仍是出不來的。開啓預覽程序時,用示波器量MIPI總線上的圖像數據,可以獲得理想的MIPI波形,說明底層驅動的預覽功能OK,問題在於高通平臺的 CAMIF VFE上,因而,翻閱高通的技術資料,學習添加VFE的一些配置。
7日 配置VFE,點亮預覽
預覽的成功具備劃時代的意義,它不只標誌着camera模塊在整個Android系統架構中的成型,更爲後來的拍照,錄像,圖像效果等功能奠基了堅 實的基礎。預覽的出現,意味着我不用再回答那些相似像「camera亮沒」之類的只注重表面現象的問題,從那一刻起,我彷彿站上了另外一個高度,有種夢迴漢 唐的感受。。
8日 健壯代碼,編寫拍照功能,對焦功能
至此,整個camera模塊從上層應用到底層驅動已所有打通,接下來就能夠見神殺神,見佛殺佛了。。
9日 編寫白平衡,色彩效果,場景模式,ISO,防震,閃光燈等功能
這年頭碼農傷不起啊!就按葵花寶典上的ISP指令序列往裏使勁填充。
10日 登錄服務器提交代碼