TCC平台开发笔记

    技术2022-05-20  46

    TCC平台开发笔记

    首次接触到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帧就不会出现这个问题。

     


    最新回复(0)