基於avd7181c解決視頻輸入效果差的問題<二>---疑難調試手記

基於avd7181c解決視頻輸入效果差的問題<二>---疑難調試手記

    

       筆者在上一篇文章中講述了基於AVD7181C來解決平臺視頻輸入效果差的問題大概解決方案。在這個探索研究中,也遇到了一些比較麻煩的問題。下面就講述一些遇到的一個個讓人歡喜讓人憂的問題。

      Avd7181c是通過IIC來控制的。因爲iic也是一種非常成熟的通訊接口,我們就直接用全志平臺裏整理過的iic操作sensor_read, sensor_write接口,這兩個接口在平臺支持的camera有很多種型號,都是正常使用的,筆者利用者這些接口也移植到了其他幾個iic接口的外設中。

        剛開始,在驅動架構搭建好以後,加載AVD7181C驅動後,再加載csi的驅動,就會執行到AVD7181C probe函數,可以得到iic的client,得到adapter,也就是linux iic驅動中對象的總管。筆者調試時,希望在probe函數裏大概操作一下AVD7181C的寄存器,也就把ypbpr設置的一組寄存器操作下去。結果顯示,這一組寄存器全部都可以正常寫進去,這樣寫寄存器就沒有問題。但是,當筆者去讀寄存器的值的時候,發現總是讀不出來,iic總是返回錯誤,據錯誤碼分析就iic發出讀數據指令後,AVD7181C沒有迴應數據,但是是收到了接收iic 地址的ack。因爲用的AVD7181C小模塊板也是新做的,我們又檢查一下iic的配置以及其他reset、standby兩個供電的正常性。

        一步步排除,首先筆者移植了一個已經成熟使用的在其他平臺是小模塊,因爲數據接口的一些不同,直接使用它調試不方便,但是爲了驗證iic驅動的問題,就飛了兩個供電以及iic。問題還是一樣,錯誤信息如下:

 

          面對這種情況,非常的奇怪,wince的平臺、AVD7181C的demo板子通過pc軟件都可以正常操作AVD7181C的寄出去,讀寫正常。憑着經驗判斷,這肯定是iic通訊出了問題。可是移植的sensor_read接口也是很成熟,那麼多camera都是使用那個接口,都可以正常的讀,怎麼會有問題呢?帶着疑問,跟幾個同事聊起這件奇怪的事情,剛好有個同事說以前在在小系統調試過AVD7181C的時候,碰到過類似的問題,就是iic在讀的兼容性的問題。面對高手的指路,得一步步證實、驗證。

筆者借用了邏輯分析儀來抓通訊的波形,抓到不能正常讀的iic時序圖,如下:

 

筆者另外又抓了一個用AVD7181C demo板能正常讀它寄存器的iic時序圖,如下:

 

       面對這兩幅有力的證據,下一步就是找解決辦法了。很明顯,全志寫的sensor_read,很明顯是一個讀動作,是先發送iic地址後,送出寄存器的地址,然後就是一個stop的命令,接着再重啓,發送iic地址,收到ack後,對方並沒有發送應該送的數據。顯示,就是沒對上眼,對方沒有理解主機發送的秋波。sensor_read的源代碼如下:

 

接着分析比較能夠正常讀的時序圖,發現在是先發送iic地址後,送出寄存器的地址後,沒有發送停止信號,而是直接重新啓動,發送iic地址,收到AVD7181C的ack後,很快就收到了數據,然後纔是整個通訊的停止信號。

爲了解決這個問題,當然得按照能demo板的時序處理來改寫sensor_read。改寫後的程序大概如下:

 

AVD7181C iic讀寄存器兼容性問題確實不常見,現在多數的iic設備,兩種sensor_read的處理方式都是可以支持的。喫一塹,長一智,困難越來越多,疲勞越多,白頭髮也會越多,當然收穫也是最多,也會更有價值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章