首次接觸到TELECHIP的平臺,不得不感嘆一下,這個平臺的工具還真是好用,不得不說TELECHIP的工程師們想得周到。
本人這次用到的是TCC7901,具體調試過程如下:
一、基本開發流程
1、首先找到了一個官方的BSP包,本來是想去官方網站下載的,但可惜,只有TELECHIP的客服才能下載,所以通過了其它辦法拿到了一個2.2版的BSP包。
2、創建了一個基本工程,按默認的配置編譯了一下BSP包,驗證通過OK。
3、利用Config_120.exe工具配置了一下BSP參數;這裏主要設定RAM大小,屏大小,TP 用的I2C通道,LCD的時序參數。
4、重配置了一下telechips.bat,添加了一個設備驅動;雙擊這個BAT文件,選擇BULID BSP包。
5、利用FWDN_V5_120.exe工具,將生成的NK.ROM,tcboot.rom下載到設備板,
這裏要設成USB BOOT模式,BM[2]腳接高NAND BOOT,接低USB BOOT。另外USB要設成DEVICE。
6、FWDN_V5_120.exe工具可以對NAND 分區配置,格式化NAND FLASH,下載LOGO等功能,非常方便。
二、具體調試
1、顯示驅動:由於每家用的屏都不一樣,所以屏的參數必須要調整的,一般來說改動的地方不多,由於我用到是3.5寸的屏,所以我做了如下改動:
#define IMAGE1_WIDTH 320
#define IMAGE1_HEIGHT 240
#define LCD_WIDTH 320
#define LCD_HEIGHT 240
#define LCD_DEVIDE 12
#define LCD_VPW (1)
#define LCD_VBP (13)
#define LCD_VFP (9)
#define LCD_HPW (1)
#define LCD_HBP (70)
#define LCD_HFP (17)
另外背光控制IO做了調整。
由於我的屏是通過SPI方式初始化的,所以還在TCC_LCD.C裏面加了模擬SPI通訊函數。
2、TOUCHPANEL調試:
TOUCHPANEL用的是TSC2003,BSP包裏面有這個驅動,只要對一些參數稍做調整,
#define MAX_X 3810//3940
#define MIN_X 245
#define MAX_Y 3610//3870
#define MIN_Y 456 //
這些參數你在點屏的時候,可以通過驅動打印出來。
校驗完屏之後,讀取校屏的座標參數寫入註冊表。
"CalibrationData"="644,476 112,68 120,864 1168,864 1168,80 "
3、HOST USB
BSP包裏面已經實現了USB HOST,只要添加相關的組件即可。
我添加的USB組件有
--> Core OS --> Core OS Services --> USB Host Support --> USB Storage Class Driver
--> Device Drivers --> USB Function --> USB Function Clients --> Mass Storage
--> Device Drivers --> USB Host --> USB Host Controllers --> OHCI
4、SD 卡、I2C、SPI:
這樣驅動BSP包已實現了,SD卡只要添加相關組件就可以用了。主要有兩個:SD Host Controller,SD Memory。
這裏主要要自己實現的可能就是插/拔卡通知了。可以採用事件。
另外就是大容量SD卡支持,將common.bib裏面做如下修改:
sdbus.dll $(_FLATRELEASEDIR)/sdbus2.dll NK SH
拔卡出SD卡後,卸載文件系統時間修改。
[HKEY_LOCAL_MACHINE/System/StorageManager]
"Dll"="fsdmgr.dll"
"PNPUnloadDelay"=dword:12c //300MS
5、HIVE 注表的實現
(1)、在PLATFORM.reg裏面添加如下注項。
;HIVE BOOT SECTION
[HKEY_LOCAL_MACHINEinitBootVars]
"SYSTEMHIVE"="Documents and Settings/system.hv" ;system.hv會保存到HDDDocuments and Settingssystem.hv
;"PROFILEDIR"="Documents and Settings" ;user.hv會保存到HDDDocuments and Settingsdefaultuser.hv
"Start DevMgr"=dword:1 ;
"DefaultUser"="default" ;咱們只有一個用戶default,基本上就是決定user.hv的路徑了
"Flags"=dword:3 ;這個應該是wince 5.0下決定在哪個階段啓動device.exe的表項
"RegistryFlags"=dword:1 ;這個就是設置註冊表每次改動後自動flush到system.hv
; END HIVE BOOT SECTION
(2)、在nand 的註冊表中加入到;HIVE BOOT SECTION 與; END HIVE BOOT SECTION之間。同時再添加句
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/Nand]
"MountAsBootable"=dword:1 ;這個是wince 5.0下指定這個分區保存system.hv的關鍵
6、多語言的實現,
(1)菜單 Platform -> Settings,Locale中選擇中文,英語,默認選擇中文。
(2)在組件中添加:MUI的組件。中文字庫選擇SimSun & NSimSun250。
(3)sysgen 工程。
(4)運行createmui 0409 ,然後在release目錄中找到MultiUI.bib文件,將文件裏面的內容複製到COMMON.bib裏面。
(5)makeimg 。
7、CH7026調試
通過CH7026將數字的RGB 編碼成,CVBS跟VGA輸出。這裏不作詳介紹。
8、字庫調整到NANDFLASH裏面:
將COMMON.REG 相關的註冊項註釋掉,同時將COMMON.BIB裏面的包含simsun.ttc行註釋掉。然後再在platform.reg裏面加入如下:
[HKEY_LOCAL_MACHINE/SYSTEM/GDI]
"FontLinkMethods"=dword:1
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/FontPath]
"FontPath"="//NAND FLASH" ; 字庫文件所在目錄
; @CESYSGEN IF !GWES_DECOMPDRV
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/FontLink/SystemLink]
"Tahoma"="//NAND FLASH//simsun.ttc,NSimSun"
"Courier New"="//NADN FLASH//simsun.ttc,NSimSun"
"Arial"="//NADN FLASH//simsun.ttc,NSimSun"
"Times New Roman"="//NADN FLASH//simsun.ttc,NSimSun"
"Symbol"="//NAND FALSH//simsun.ttc,NSimSun"
9、HIVE註冊表引起系統慢。
由於HIVE註冊表的註冊表文件是保存在NANDFLASH裏面的,同時RAM裏面會有一份副本,NK在運行的時候還是用到的是RAM裏面的註冊表,我們可能通過如下注冊項來設定是否每次改都更新到NANDFLASH裏面。
"RegistryFlags"=dword:1 ;這個就是設置註冊表每次改動後自動flush到system.hv
但這樣會有一個問題,就是在頻繁寫註冊表的時候,就會影響性能了。比如進入TCPMP播放器時會很慢。
解決辦法就是用手動刷新,將上面的註冊改成“0”,
方法一、在系統關機的時候將RAM保存到NANDFLASH。
方法二、更改刷新註冊表時間,比如說有改的時候3秒或5秒更新一次,這樣有利於掉電不丟失註冊表。這裏的時間可以自已定。
獲得註冊表更新事件:
[HKEY_LOCAL_MACHINE/System/ObjectStore/RegFlush]
; To monitor the flushing from an external process add "ActivityName" registry value.
; The activity name is a global named event that filesystem will signal on Registry Activity.
; "ActivityName"=""
"ActivityName"="RegFlushEvent"
; Create an thread in filesys to perform flushing
; "SpawnThread"=dword:1
"SpawnThread"=dword:0
; Make the thread IDLE priority
"FlushPriority256"=dword:FF
; ActivityThreshold specifies the # of reg activity before we force a flush
; "ActivityThreshold"=dword:100
"ActivityThreshold"=dword:1
; Timeout period for a flush (flush occurs if there have been some changes during this period)
; "FlushPeriod"=dword:3E8
; "FlushPeriod"=dword:7530
在驅動裏面打開“RegFlushEvent”一個同名事件,然後創建一個線程,等待該事件,在線程裏面手動更新註冊表。
10、USB-HUB功能:
由於USB不夠用,所以用到硬件外擴,軟件方面不需要做任何事情,只要USB HOST 驅動OK,接上硬件就行了。
這中間還有一個USB插拔檢測的問題,因爲我通過USB HUB將HOST分成了兩個接口:一個USB口,另一個通過IC轉成了SDIO接口。這樣對於U盤的檢測帶來了麻煩,因爲SDIO接口的卡插拔的時候沒有WM_DEVICECHANGE消息,就不能通過這個消息來判斷了。
DBT_DEVICEARRIVAL:插入
DBT_DEVICEREMOVECOMPLETE:拔出。
只能自己創建一個消息隊列,然後RequestDeviceNotifications,然後再讀出消息,就OK了。
11、慮擬串口:
慮擬串口,我採用的方法比較簡單,就是在我的驅動裏面開一個線程接收串口來的數據,因爲我主要用到接收數據.其實我寫了兩種串口驅動,一種用於GPS的將COM慮擬成多個,一個給地圖軟件用,另外的給一些像時間同步,查看GPS模塊信息用等.
還有一種是用於MCU與ARM通訊用,主要是解析串口數據然後分發給不同的應用程序.
while( !pSerial->m_bExit )
{
// 等待串口驅動通知
WaitCommEvent( pSerial->m_hCOM, &dwCommModemStatus, NULL );
// 稍候再去讀,等數據包到完整
// 僅處理字符事件
if( !(dwCommModemStatus & EV_RXCHAR) )
continue;
dwBytesRead = pSerial->Read( byRecvBuf, sizeof(byRecvBuf) );
後面是對BUF的操作...將數據填到一個循環BUF裏面.
}
12、TVP5147 調試:
這個主要是將CAMERA驅動調通就OK了,然後改一個下VP5147的初始化配置.
大概流程是這樣,攝像頭或者CVBS視頻信號輸入,通過TVP5147轉換成565的信號,通過CIF接口輸入到ARM ,然後通過CAMERA驅動讀取視頻信號,通過TCCCAMERAFILTER-->TCCVRENDERFILTER 顯示在LCD上,好像TCC7901輸入視頻最大支持320*240(如果過大爲造成畫面閃動,聽說好像沒有解),然後通過M2MSCALER拉伸到你想要的尺寸,也不知是真是假,但我目前還是用到320*240然後拉到800*240。
這裏有個問題,就是因爲TCC7901 用TSC2003 作爲TP A/D,這個IC有個特點,只有DOWN的中斷,沒有UP的中斷,中斷來了以後ARM通過I2C去讀取TP採樣讀據。UP的判斷爲DOWN中斷80MS後爲UP。如果你一直按着TP就會不停的有中斷產生,就會不停的通過I2C讀取AD數據,中間只有10MS作爲線程輪片。
如果在CAMERA預覽的情況下,一直按着TP就會發現畫面會閃動。但如果低於15幀就不會出現這個問題。
13、喚醒與待機:
14、更新NK,TCBOOT,APPS:
更新NK 本來TELECHIP的工具就做得很不錯了,但是因爲我們內存只有64M還要求GPS後臺運行,如果前臺在播視頻,這樣就顯得內存嚴重不足了,所以我用了BIFS文件系統,將NK分成兩部分,每次啓動只將大約4M的NK裝入內存,其它的放入BINFS下面,這樣我們的可用內存64-1M顯存-6M硬解-4M NK=53M。
這一部分TELECHIP是沒有提供的,只能自己想辦法。我們現在NK升級,TCBOOT升級,LOGO升級,應用程序,全部通過SD卡一次性升級成功。
待續。。。