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