摩托罗拉SE4500 德州仪器TI Omap37xx/AM3715/DM3730/AM3530 wince6.0/Windows Mobile 6.5平台 二维软解调试记录及相关解释
生活随笔
收集整理的這篇文章主要介紹了
摩托罗拉SE4500 德州仪器TI Omap37xx/AM3715/DM3730/AM3530 wince6.0/Windows Mobile 6.5平台 二维软解调试记录及相关解释
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
現在安卓大行其道,不是高通,就是MTK,甚至于很多人不知道還有德州儀器這個平臺了,關于如何在德州儀器Omap37xx平臺上調試SE4500,網絡上除了針對SE4500的幾個pdf文檔介紹之外,沒有任何資料可供參考,相信本文對你很有幫助,不必感謝。本文出自C.S.D.N原創(轉載標明來源)。
?????
一、SE4500因為工作在3.3V,德州儀器的Omap37xx工作在1.8V,所以之間必須要進行電平轉換,建議使用德州儀器的TXB0104/08進行轉換(看好了是TXB0104/08不是TXS0104/08,兩者都是QFN封裝,價錢應該是一樣的,但是支持的最高轉換頻率是不一樣的),因為SE4500屬于圖像采集,所以要求頻率超過24Mbps,所以必須使用TXB系列的電平轉換芯片。
二、SE4500在不上電時,會將I2C總線的電平拉低,嚴格意義上講,摩托羅拉的SE4500應該是兼容I2C協議,不是標準I2C協議,標準I2C協議要求總線上不工作的器件應該是高阻狀態,而不是把I2C總線電平拉低,導致總線上的其他設備無法正常工作。
三、PCB layout的時候,camera信號線最好走等長線,這樣圖像采集的信號干擾少,會好很多。
四、CAM_Open,CAM_Close莫名其妙被調用多次,導致CAM domain在系統休眠時無法進入休眠
以下部分注冊表取自TI平臺SE4500驅動的注冊表部分: [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\CAM]
"Dll"="cam_SE4500.dll"
"Prefix"="CAM"
"Index"=dword:1
"Order"=dword:200
"BufferSize"=dword:80000
"BufferCount"=dword:4
"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}" ; CE_DRIVER_POWER_MANAGEABLE_GENERIC_GUID
"PowerFlags"=dword:00000103???????? ; send pre/post device state changes
? ? ? 摩托羅拉給的注冊表配置基本上是這個樣子,通過在CAM_Init、CAM_Open、CAM_Close函數開頭部分添加打印信息。 ? ? ? 我們發現,在驅動加載時候,按理說,應該只有CAM_Init被device.exe調用,后面的CAM_Open和CAM_Close只有程序調用了 CreateFile("CAM1:",**)和CloseHandle以后才會分別調用CAM_Open和CAM_Close。 ? ? ? Log信息顯示,驅動加載的時候,CAM_Init被調用一次,CAM_Open被連續調用了兩次,CAM_Close被調用了一次,導致 refCount在調用CAM_Close的時候不為零,所以導致Camera的clock無法關閉,因為只有refCount等于零時才會關掉FCLK 和ICLK。 ? ? ? 為什么會出現上面這種情況呢,我們經過分析,發現是注冊表中IClass后面的值有問題,原來摩托羅拉(現在是斑馬,Zebra Technologies)在配置這個參數的時候,是沒有考慮整個EVM3530平臺是否進入休眠的,只關心SDL軟解功能是否能夠正常工作。 ? ? ?我們修改了Iclass的值如下: ?"IClass"=multi_sz:"{0AE2066F-89A2-4D70-8FC2-29AEFA68413C}=%b","{CB998A05-122C-4166-846A-933E4D7E3C86}=%b"
? ? ? 經過測試,此時在驅動加載時,只有CAM_Init被調用了。通過修改Drvr_intf.cpp和hw_intf.cpp源代碼,我們在摩托羅拉提供的 驅動代碼基礎上解決了驅動在加載時就給SE4500上電的問題,此時如果應用程序不使用4500的話,它有20多mA的電流消耗,除非在應用程序中配置為AudoIdle,所以我們這樣做,在驅動加載時不上電,只有在SDL調用CAM_Open的時候再給SE4500上電,調用CAM_Close時再給斷電。 ? ? ? 但這時有個問題,就是系統進入休眠時會切斷控制SE4500上電的三極管的控制腳的電壓,除非你的系統沒有真正進入休眠(CORE或者PER domain沒有關閉,這樣當然不會切斷1.8V電壓,你的LDO肯定不會關掉), 所以SE4500的3.3V在休眠時就會斷電,之前啟動應用程序后給里面通過I2C發送的配置參數都會丟失,一喚醒系統,再進休眠,此時SE4500又有20多mA的電流消耗,所以,我們在驅動中動態調用pin Mux,就是如果應用程序打開了SE4500,再進入休眠的話,我們動態設置pin Mux為OFF_INPUT_PULL_UP,也就是OFF MODE使能,INPUT使能,上拉使能(Omap3平臺的內部上拉下拉只在引腳作為輸入功能時有效,故我們設置為輸入,而非輸出)。 ? ? ? 注意:SE4500使用了"Index"=dword:1,所以SDL中一定是使用CreateFile("CAM1:",***)這樣的方式打開的,為了不至于沖突,系統的Camera的Index不能使用1,可以使用除1以外的其他可用值。
五、SE4500驅動和系統自帶Camera驅動同時加載時(兩個都使用Camera總線,但是分時復用,理論上不會沖突)。系統Camera能使用,能預覽能拍照,但是SE4500能出光,不能解碼了,這是怎么回事?
????? 經過測試,我們發現是在camera驅動加載時,注冊了IRQ_CAM0中斷,導致SE4500的SDL軟解庫中無法注冊該中斷,所以后面就只能出光不能解碼,發現該問題,我們修改了camera驅動的實現,讓其只有camera打開時,才注冊該中斷,通過一個互斥機制,camera打開時會檢測SE4500是否在工作,如果在工作,就提示ISP被占用,打開失敗,反之亦然。該問題迎刃而解。
?????
一、SE4500因為工作在3.3V,德州儀器的Omap37xx工作在1.8V,所以之間必須要進行電平轉換,建議使用德州儀器的TXB0104/08進行轉換(看好了是TXB0104/08不是TXS0104/08,兩者都是QFN封裝,價錢應該是一樣的,但是支持的最高轉換頻率是不一樣的),因為SE4500屬于圖像采集,所以要求頻率超過24Mbps,所以必須使用TXB系列的電平轉換芯片。
二、SE4500在不上電時,會將I2C總線的電平拉低,嚴格意義上講,摩托羅拉的SE4500應該是兼容I2C協議,不是標準I2C協議,標準I2C協議要求總線上不工作的器件應該是高阻狀態,而不是把I2C總線電平拉低,導致總線上的其他設備無法正常工作。
三、PCB layout的時候,camera信號線最好走等長線,這樣圖像采集的信號干擾少,會好很多。
四、CAM_Open,CAM_Close莫名其妙被調用多次,導致CAM domain在系統休眠時無法進入休眠
以下部分注冊表取自TI平臺SE4500驅動的注冊表部分: [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\CAM]
"Dll"="cam_SE4500.dll"
"Prefix"="CAM"
"Index"=dword:1
"Order"=dword:200
"BufferSize"=dword:80000
"BufferCount"=dword:4
"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}" ; CE_DRIVER_POWER_MANAGEABLE_GENERIC_GUID
"PowerFlags"=dword:00000103???????? ; send pre/post device state changes
? ? ? 摩托羅拉給的注冊表配置基本上是這個樣子,通過在CAM_Init、CAM_Open、CAM_Close函數開頭部分添加打印信息。 ? ? ? 我們發現,在驅動加載時候,按理說,應該只有CAM_Init被device.exe調用,后面的CAM_Open和CAM_Close只有程序調用了 CreateFile("CAM1:",**)和CloseHandle以后才會分別調用CAM_Open和CAM_Close。 ? ? ? Log信息顯示,驅動加載的時候,CAM_Init被調用一次,CAM_Open被連續調用了兩次,CAM_Close被調用了一次,導致 refCount在調用CAM_Close的時候不為零,所以導致Camera的clock無法關閉,因為只有refCount等于零時才會關掉FCLK 和ICLK。 ? ? ? 為什么會出現上面這種情況呢,我們經過分析,發現是注冊表中IClass后面的值有問題,原來摩托羅拉(現在是斑馬,Zebra Technologies)在配置這個參數的時候,是沒有考慮整個EVM3530平臺是否進入休眠的,只關心SDL軟解功能是否能夠正常工作。 ? ? ?我們修改了Iclass的值如下: ?"IClass"=multi_sz:"{0AE2066F-89A2-4D70-8FC2-29AEFA68413C}=%b","{CB998A05-122C-4166-846A-933E4D7E3C86}=%b"
? ? ? 經過測試,此時在驅動加載時,只有CAM_Init被調用了。通過修改Drvr_intf.cpp和hw_intf.cpp源代碼,我們在摩托羅拉提供的 驅動代碼基礎上解決了驅動在加載時就給SE4500上電的問題,此時如果應用程序不使用4500的話,它有20多mA的電流消耗,除非在應用程序中配置為AudoIdle,所以我們這樣做,在驅動加載時不上電,只有在SDL調用CAM_Open的時候再給SE4500上電,調用CAM_Close時再給斷電。 ? ? ? 但這時有個問題,就是系統進入休眠時會切斷控制SE4500上電的三極管的控制腳的電壓,除非你的系統沒有真正進入休眠(CORE或者PER domain沒有關閉,這樣當然不會切斷1.8V電壓,你的LDO肯定不會關掉), 所以SE4500的3.3V在休眠時就會斷電,之前啟動應用程序后給里面通過I2C發送的配置參數都會丟失,一喚醒系統,再進休眠,此時SE4500又有20多mA的電流消耗,所以,我們在驅動中動態調用pin Mux,就是如果應用程序打開了SE4500,再進入休眠的話,我們動態設置pin Mux為OFF_INPUT_PULL_UP,也就是OFF MODE使能,INPUT使能,上拉使能(Omap3平臺的內部上拉下拉只在引腳作為輸入功能時有效,故我們設置為輸入,而非輸出)。 ? ? ? 注意:SE4500使用了"Index"=dword:1,所以SDL中一定是使用CreateFile("CAM1:",***)這樣的方式打開的,為了不至于沖突,系統的Camera的Index不能使用1,可以使用除1以外的其他可用值。
五、SE4500驅動和系統自帶Camera驅動同時加載時(兩個都使用Camera總線,但是分時復用,理論上不會沖突)。系統Camera能使用,能預覽能拍照,但是SE4500能出光,不能解碼了,這是怎么回事?
????? 經過測試,我們發現是在camera驅動加載時,注冊了IRQ_CAM0中斷,導致SE4500的SDL軟解庫中無法注冊該中斷,所以后面就只能出光不能解碼,發現該問題,我們修改了camera驅動的實現,讓其只有camera打開時,才注冊該中斷,通過一個互斥機制,camera打開時會檢測SE4500是否在工作,如果在工作,就提示ISP被占用,打開失敗,反之亦然。該問題迎刃而解。
總結
以上是生活随笔為你收集整理的摩托罗拉SE4500 德州仪器TI Omap37xx/AM3715/DM3730/AM3530 wince6.0/Windows Mobile 6.5平台 二维软解调试记录及相关解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 摩托罗拉SE4500 三星 S3C641
- 下一篇: 高通APQ8074 spi 接口配置