最新日志

发表于:2008-6-20 23:35:55
标签:无标签

0

QT/QTE编译步骤

 
[转载]交叉编译Qt/E和Qtopia过程

交叉编译Qt/E和Qtopia过程
交叉编译Qt/E和Qtopia过程
系统是完全安装RedHat9.0,板子是hybus的X-Hyper250B的,Toolchain用的是开发板带的hybus-arm-linux-R1.1(库的版本是2.95.3)
交叉编译所用到的文件:(所有文件都放在/usr/local/下面)
qt-embedded-2.3.10-free.tar.gz
qt-x11-2.3.2.tar.gz
qtopia-free-source-2.1.1.tar.gz
tmake-1.13.tar.gz
e2fsprogs-1.35.tar.gz

l主机x86的编译步骤:

tar xfz qt-embedded-2.3.10-free.tar.gz(解压后qt-2.3.10改名为qt-2.3.10-host)

export QTEDIR=$PWD/qt-2.3.10-host

tar xfz qt-x11-2.3.2.tar.gz(解压后为qt-2.3.2)

export QT2DIR=$PWD/qt-2.3.2

tar xfz qtopia-free-source-2.1.1.tar.gz(解压后qtopia-free-2.1.1改名为qtopia-2.1.1-host)

export QPEDIR=$PWD/qtopia-2.1.1-host

tar xfz tmake-1.13.tar.gz(解压后tmake-1.13)

export TMAKEDIR=$PWD/tmake-1.13

export TMAKEPATH=$PWD/tmake-1.13/lib/qws/linux-x86-g++

export PATH=$TMAKEDIR/bin:$PATH

cd qt-2.3.2

export QTDIR=$QT2DIR

export PATH=$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

./configure -no-xft

make

make -C tools/qvfb

cd ..

cd qt-2.3.10-host

export QTDIR=$PWD

export PATH=$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

mkdir bin (因为解压后的qt-2.3.10没有bin文件夹)

cp $QT2DIR/bin/uic bin

cp $QT2DIR/tools/qvfb/qvfb bin

cp $QPEDIR/src/qt/qconfig-qpe.h src/tools/

./configure -qconfig qpe -qvfb -thread -system-jpeg -gif -depths 4,8,16,32

make

cd ..

tar xzf e2fsprogs-1.35.tar.gz

cd e2fsprogs-1.35

./configure -enable-elf-shlibs
(需要屏蔽/usr/include/unisd.h里面的:
#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED
# ifndef __intptr_t_defined
typedef __intptr_t intptr_t;
#  define __intptr_t_defined
# endif
#endif
否则会报错。屏蔽后编译其他的东西需要恢复屏蔽。)

make install lib/uuid/

注:这是编译x86的libuuid库

cd ..

cd qtopia-2.1.1-host

export PATH=$QPEDIR/bin:$PATH

export LD_LIBRARY_PATH=$QPEDIR/lib:$LD_LIBRARY_PATH

./configure

make

编译例子:(注意:环境变量要按照上面export设置)

$qmake -project ==>>我都是这样创建.pro文件的

$tmake -o Makefile hello.pro

$make

$qvfb &

$./hello -qws  或者$qpe

还没怎么仔细研究过qpe。

l         目标机arm的编译步骤:

tar xfz qt-embedded-2.3.10-free.tar.gz(解压后qt-2.3.10改名为qt-2.3.10-target)

export QTEDIR=$PWD/qt-2.3.10-target

tar xfz qt-x11-2.3.2.tar.gz

export QT2DIR=$PWD/qt-2.3.2

tar xfz qtopia-free-source-2.1.1.tar.gz(解压后qtopia-free-2.1.1改名为qtopia-2.1.1-target)

export QPEDIR=$PWD/qtopia-2.1.1-target

tar xfz tmake-1.13.tar.gz

export TMAKEDIR=$PWD/tmake-1.13

export TMAKEPATH=$PWD/tmake-1.13/lib/qws/linux-arm-g++

export PATH=$TMAKEDIR/bin:$PATH

cd qt-2.3.2

export QTDIR=$QT2DIR

export PATH=$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

./configure -no-xft

make

make -C tools/qvfb

cd ..

cd qt-2.3.10-target

export QTDIR=$PWD

export PATH=$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

mkdir bin

cp $QT2DIR/bin/uic bin

cp $QT2DIR/tools/qvfb/qvfb bin

cp $QPEDIR/src/qt/qconfig-qpe.h src/tools/

./configure -xplatform linux-arm-g++ -qconfig qpe -qvfb -thread -system-jpeg -gif -depths 4,8,16,32

make

cd ..

注:这里交叉编译arm版本的Qt/E,需要arm版本的libjpeg.so.62,hybus-arm-linux-R1.1里面包含这个库;如没有可以上网下载。

tar xzf e2fsprogs-1.35.tar.gz

cd e2fsprogs-1.35

./configure -host=arm-linux -with-cc=arm-linux-gcc -with-linker=arm-linux-ld -enable-elf-shlibs -prefix=/usr/local/hybus-arm-linux-R1.1/arm-linux

make install lib/uuid/   ===>>>这步安装到hybus-arm-linux-R1.1/lib上的libuuid.so.1.2版本不对,要执行cp lib/libuuid.so.1.2 ../hybus-arm-linux-R1.1/lib

注:这步是交叉编译libuuid库,配置详情见./configure --help

(多谢http:/panjet.wleda.com/?p=20里面的大哥呀)

cd ..

cd qtopia-2.1.1-host

export PATH=$QPEDIR/bin:$PATH

export LD_LIBRARY_PATH=$QPEDIR/lib:$LD_LIBRARY_PATH

cp src/libraries/qtopia/custom-linux-ipaq-g++.cpp src/libraries/qtopia/custom-linux-arm-g++.cpp

cp src/libraries/qtopia/custom-linux-ipaq-g++.h src/libraries/qtopia/custom-linux-arm-g++.h

./configure -xplatform linux-arm-g++

make

注:这里需要libstdc++.so和libgcc_s.so库,hybus-arm-linux-R1.1/lib没有,所以要从网上下载;版本一定要是2.95.3。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(56)
发表于:2008-6-20 23:34:34
标签:无标签

0

qt/qte qtopia编译问题集锦

编译QTE:
1、在/etc/profile设置黄酱变量,然后执行:source /etc/profile使刚修改的profile中的环境变量生效,否则只有注销或者重新启动后才可以生效。查看环境变量的方法是:export。删除环境变量的 方法是:unset,不过还没有经过验证。

export QT2DIR=/usr/local/qt-2.3.2
export QTEDIR=/home/qt-2.3.10

export TMAKEDIR=/usr/local/tmake-1.13
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++

export QTDIR=$QTEDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

export QTDIR PATH MANPATH LD_LIBRARY_PATH

export QPEDIR=/home/qtopia-free-2.1.1

编译通过了:
./configure -xplatform linux-arm-g++ -shared -qvfb -thread -no-xft -depths 16,24,32 -system-jpeg -gif -qconfig qpe

2、编译X86的QTE
export QT2DIR=/usr/local/qt-2.3.2
#export QTEDIR=/home/qt-2.3.10
export QTEDIR=/home/qt-2.3.10-x86
#x86 qte
export QTEDIRX=/home/qt-2.3.10-x86

export TMAKEDIR=/usr/local/tmake-1.13
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++

export QTDIR=$QTEDIRX
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

export QTDIR PATH MANPATH LD_LIBRARY_PATH
#Qtopia
export QPEDIR=/home/qtopia-free-2.1.1

编译通过了:
./configure -xplatform linux-x86-g++ -shared -qvfb -thread -no-xft -depths 16,24,32 -system-jpeg -gif -qconfig qpe



编译jpeg-6b
1、下载jpegsrc.v6b.tar.gz到qtarm目录并解压,进入目录jpeg-6b:
./configure --enable-shared
make   (得到libtools程序)
./configure --enable-shared

修改生成的Makefile文件:
prefix = /qtarm/qt (qte的路径)
CC =/usr/local/arm/2.95.3/bin/arm-linux-gcc
AR =/usr/local/arm/2.95.3/bin/arm-linux-ar rc
AR2=/usr/local/arm/2.95.3/bin/arm-linux-ranlib
cp jconfig.doc jconfig.h
mkdir -p /qtarm/qt/man/man1
make

#make install
生成的libjpeg.so在/usr/lib下 将libjpeg.so拷贝到/usr/local/arm/3.4.1/arm-linux/lib下。



编译qtopia:
./configure -arch arm -displaysize 480-272 -edition pda -platform linux-g++ -qvfb -xplatform linux-arm-g++

./configure –host=arm-linux –with-cc=arm-linux-gcc –with-linker=arm-linux-ld –enable-elf-shlibs –prefix=/usr/local/arm/3.4.1/arm-linux

./configure –host=arm-linux –with-cc=arm-linux-gcc –with-linker=arm-linux-ld –enable-elf-shlibs –prefix=/usr/local/arm/3.4.1/arm-linux -arch arm -displaysize 480-272 -edition pda



软件版本:qtopia-free-2.2.0
 
一、在/root/imx27/下解压qtopia-free-src-2.2.0.tar.gz
tar -xzvf qtopia-free-src-2.2.0.tar.gz
cd /root/imx27/qtopia-free-2.2.0
./configure
make
 
得到本机运行版本uic工具
 
在make的时候出现了大量的错误,具体为:
Q1:
 backend/event.cpp: In static member function ‘static int Event::dayOfWeek(char)’:
backend/event.cpp:419: error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
backend/event.cpp:419: note: candidate 1: operator<=(int, int) <built-in>
/home/henryfok/TrollTech/qt-2.3.10/include/qstring.h:312: note: candidate 2: int operator<=(char, QChar)
make[4]: *** [.obj/release-shared/event.o] Error 1
make[4]: Leaving directory `/home/henryfok/TrollTech/qtopia-free-2.1.1/src/libraries/qtopia'
make[3]: *** [all] Error 2
make[3]: Leaving directory `/home/henryfok/TrollTech/qtopia-free-2.1.1/src/libraries/qtopia'
make[2]: *** [sub-libraries-qtopia] Error 2
make[2]: Leaving directory `/home/henryfok/TrollTech/qtopia-free-2.1.1/src'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/home/henryfok/TrollTech/qtopia-free-2.1.1/src'
make: *** [all] Error
解决办法:
修改 qtopia-free-2.1.1/src/libraries/qtopia/backend/event.cpp 文件的第419行
将while ( !( i & day ) && i <= Event::SUN ) 行改为
while ( !static_cast<int>(( i & day ) && i) <= Event::SUN )
Q2:
/root/imx27/qtopia-free-2.2.0/qt2/include/qwindowsystem_qws.h:230: 错误:‘QWSInputMethod’ 未声明
/root/imx27/qtopia-free-2.2.0/qt2/include/qwindowsystem_qws.h:237: 错误:‘QWSGestureMethod’ 未声明
解决办法:
找到文件:qwindowsystem_qws.h
在该文件的前面添加如下两行:
class QWSInputMethod;
class QWSGestureMethod;
Q3:
/root/imx27/qtopia-free-2.2.0/qt2/include/qvaluestack.h:57: 错误:不能从 ‘QValueListIterator<QMap<QString, QString> >’ 转换到 ‘const char*’,为实参 ‘1’(属于 ‘int remove(const char*)’)
/root/imx27/qtopia-free-2.2.0/qt2/include/qvaluestack.h: In member function ‘T QValueStack<T>::pop() [with T = QString]’:
xml/qxml.cpp:2532:   instantiated from here
/root/imx27/qtopia-free-2.2.0/qt2/include/qvaluestack.h:57: 错误:不能从 ‘QValueListIterator<QString>’ 转换到 ‘const char*’,为实参 ‘1’(属于 ‘int remove(const char*)’)
解决办法:
更改qt-2.3.2文件夹中src/tools/qvaluestack.h第57行源代码:
remove (this->formLast() );
为:
this->remove (this->formLast() );
Q4:
qdawg.cpp:294: 错误:有多余的限定 ‘QDawgPrivate::’ 在成员 ‘QDawgPrivate’ 上
解决办法:
找到qdawg.cpp文件,把其中的第294行修改为:
    ~QDawgPrivate()
    {
        delete memoryFile;
    }
Q5:
thumbnailview_p.h:81: 错误:有多余的限定 ‘ThumbnailItem::’ 在成员 ‘paintItem’ 上
解决办法:
   void ThumbnailItem::paintItem( QPainter*, const QColorGroup& );
修改为:    void paintItem( QPainter*, const QColorGroup& );
Q6:
abtable_p.h:277: 错误:有多余的限定 ‘PhoneTypeSelector::’ 在成员 ‘addType’ 上
解决办法:
 QListViewItem* PhoneTypeSelector::addType(QListViewItem* prevItem,
        QString number, const char* pixmapName, PimContact::ContactFields phoneType);
修改为:
 QListViewItem* addType(QListViewItem* prevItem,
        QString number, const char* pixmapName, PimContact::ContactFields phoneType);
Q7:
../../../include/qtopia/pim/private/../../../../src/libraries/qtopiapim/numberentry_p.h:106: 错误:有多余的限定 ‘NumberEntryDialog::’ 在成员 ‘eventFilter’ 上
解决办法:
    bool NumberEntryDialog::eventFilter(QObject *o, QEvent *e);
修改为:
bool eventFilter(QObject *o, QEvent *e);
Q8:
videoviewer.cpp:52: 错误:有多余的限定 ‘SimpleVideoWidget::’ 在成员 ‘SimpleVideoWidget’ 上
解决办法:
    SimpleVideoWidget::SimpleVideoWidget(QWidget *parent);
修改为:
    SimpleVideoWidget(QWidget *parent);
Q9:
ablabel.h:78: 错误:有多余的限定 ‘AbLabel::’ 在成员 ‘decodeHref’ 上
解决办法;
    bool AbLabel::decodeHref(const QString& href, ServiceRequest* req, QString* pm) const;
修改为:
    bool decodeHref(const QString& href, ServiceRequest* req, QString* pm) const;
Q10:
minefield.h:105: 错误:有多余的限定 ‘MineField::’ 在成员 ‘setState’ 上
minefield.h:106: 错误:有多余的限定 ‘MineField::’ 在成员 ‘placeMines’ 上
解决办法:
修改为:
    void setState( State st );
    void placeMines();
Q11:
buttoneditordialog.h:56: 错误:有多余的限定 ‘ButtonEditorDialog::’ 在成员 ‘actionFor’ 上
解决办法:
    ServiceRequest ButtonEditorDialog::actionFor(int cur) const;
修改为:
 ServiceRequest actionFor(int cur) const;
Q12:
packagewizard.h:106: 错误:有多余的限定 ‘PackageWizard::’ 在成员 ‘current’ 上
解决办法:
 PackageItem* PackageWizard::current() const;
修改为:
 PackageItem* current() const;
Q13:
keyboard.h:60: 错误:有多余的限定 ‘KeyboardPicks::’ 在成员 ‘KeyboardPicks’ 上
解决办法:
   KeyboardPicks::~KeyboardPicks();
修改为:
  ~KeyboardPicks();
Q14:
polished.h:58: 错误:有多余的限定 ‘PolishedDecoration::’ 在成员 ‘drawBlend’ 上
解决办法:
 void PolishedDecoration::drawBlend( QPainter *, const QRect &r, const QColor &c1, const QColor&c2 ) const;
修改为:
 void drawBlend( QPainter *, const QRect &r, const QColor &c1, const QColor&c2 ) const;
Q15:
inputmethods.cpp:86: 错误:有多余的限定 ‘IMToolButton::’ 在成员 ‘IMToolButton’ 上
解决办法:
IMToolButton::IMToolButton( QWidget *parent ) : QToolButton( parent )
修改为:
IMToolButton( QWidget *parent ) : QToolButton( parent )
 
上面提到的大部分错误都是C++的错误,可能所列的错误在每个人的环境中所显现的错误不一致,大家仔细看看都是可以解决的。
 
二、交叉编译qtopia-free-2.2.0
 
2.1创建PDA安装目录
mkdir /root/imx27/qtopia
cd /root/imx27/qtopia-free-2.2.0
修改文件:
vim /root/imx27/qtopia-free-2.2.0/qt2/src/kernel/qwsmouse_qws.cpp
这个文件是修改校准文件存放位置的,如果是可读写的文件系统,可以不需要修改。
修改文件:
vim /root/imx27/qtopia-free-2.2.0/qtopia/mkspecs/qws/linux-arm-g++/qmake.conf
将此行
 QMAKE_LIBS_QT = -lqte
修改为:
QMAKE_LIBS_QT = -lqte -lpng -lts -lz -luuid -ljpeg
 
2.2 创建编译环境
export QTDIR=/root/imx27/qtopia-free-2.2.0/qt2
export QPEDIR=/root/imx27/qtopia-free-2.2.0/qtopia
export LD_LIBRARY_PATH=$QTDIE/lib:$QPEDIR/lib:$LD_LIBRARY_PATH
export TMAKEDIR=/root/imx27/qtopia-free-2.2.0/tmake
export TMAKEPATH=$TMAKEDIR/lib/qws/linux-arm-g++
在/root/imx27/qtopia-free-2.2.0/qtopia/src/qt/qconfig-qpe.h的末尾加上,
#define QT_QWS_IPAQ
#define QT_QWS_IPAQ_RAW
这是使qt自己支持触摸屏。
cp /root/imx27/qtopia-free-2.2.0/qtopia/src/qt/qconfig-qpe.h /root/imx27/qtopia-free-2.2.0/qt2/src/tools
 
cd $QPEDIR/src/libraries/qtopia
cp custom-linux-ipaq-g++.cpp custom-linux-arm-g++.cpp
cp  custom-linux-ipaq-g++.h custom-linux-arm-g++.h
 
2.3
configure 配置:
./configure -qte "-embedded -xplatform linux-arm-g++ -qconfig qpe -no-qvfb -depths 16,24 -system-jpeg -system-libpng -system-zlib -tslib -gif -thread -no-xft -release -I/root/imx27/arminclude -L/root/imx27/armlib -lpng -lts -lz -luuid -ljpeg" -qpe '-xplatform linux-arm-g++ -edition pda -displaysize 800x480 -I/root/imx27/arminclude -L/root/imx27/armlib -prefix=/root/imx27/qtopia'
make
make install
安装后的文件在/root/imx27/qtopia中。
通过上面产生uic的一些操作,使得产生的错误就比较少了。
不过还可能产生jpeg的一些头文件或者是tslib的一些头文件活着是库文件找不到,这时候只需要把前面编译通过的jipeg的头文件以及库文件分别放在/root/imx27/arminclude和/root/imx27/armlib中即可,大部分的错误都是可以这样的解决的。

三、测试

3.1 拷贝库和测试程序
mkdir /root/imx27/qtopia/bin/tests
mkdir /root/imx27/qtopia/lib/ts
cp /root/imx27/tslib-1.3/test/.libs/ts_* /root/imx27/qtopia/bin/tests
cp /root/imx27/tslib-1.3/src/.libs/libts_0.0.so.0* /root/imx27/qtopia/lib
cp /root/imx27/tslib-1.3/src/.libs/libts.so /root/imx27/qtopia/lib
cp /root/imx27/tslib-1.3/plugins/.libs/*.so /root/imx27/qtopia/lib/ts
cp /roo    t/imx27/armlib/*.so* /root/imx27/qtopia/lib //所有需要的支持的库文件

将qtopia复制到nfs目录
cp -r /root/imx27/qtopia /home/yuehy/rootfs
注意:把文件/root/imx27/tslib-1.3/etc/ts.conf拷贝到板子的/etc目录下

3.2 环境变量设置
  在开发板上进行环境变量设置
export QTDIR=/qtopia
export QPEDIR=/qtopia
export QWS_MOUSE_PROTO=TPanel:/dev/ts
export LD_LIBRARY_PATH=/qtopia/lib
export TSLIB_TSEVENTTYPE=H3600  //对tslib中的设备结构体定义
export TSLIB_CONSOLEDEVICE=none //tslib运行需要的控制台,这里就是LCD屏幕 ,设定控制台设备为none,否则默认为/dev/tty
export TSLIB_FBDEVICE=/dev/fb0  //指定帧缓冲设备
export TSLIB_TSDEVICE=/dev/ts //指定开发板对应触摸屏设备节点文件
export TSLIB_CALIBFILE=/etc/pointercal //指定触摸屏校准文件pintercal的存放位置,注意目录的读写权限。
export TSLIB_CONFFILE=/etc/ts.conf //指定TSLIB配置文件的位置
export TSLIB_PLUGINDIR=$QTDIR/lib/ts //指定触摸屏插件所在路径

在设置好以上的环境变量后对触摸屏进行校验
cd /qtopia/etc/bin/tests
./ts_calibrate
陆续在LCD的4个角和中点出现光标,点击光标进行校准,生成校准文件
校验文件产生以后,就可以对运行qpe程序了。
cd /qtopia/etc/bin
./qpe.
 
另:在编译过程可能产生各种各样的错误,其实都是仔细看看都是都是可以解决的,自己做的就是根据网络上的资料,自己重新走了一遍。
自己还遇到了一个不常见的错误:
在包含自 3rdparty/opentype/ftxopentype.c:3 的文件中:
3rdparty/opentype/ftxopen.c:18:40: 错误:freetype/internal/ftstream.h:没有那个文件或目录
3rdparty/opentype/ftxopen.c:19:40: 错误:freetype/internal/ftmemory.h:没有那个文件或目录
3rdparty/opentype/ftxopen.c:20:39: 错误:freetype/internal/tttypes.h:没有那个文件或目录
之所以产生这个问题是由于开发机本身的freetype版本与qtopia所使用的版本不一致所造成的,qtopia-free-2.2.0所需要的freetype的版本为:freetype-2.1.10
解决办法:
解决这个问题有两种方法,一是卸载系统本上的freetype库,重新编译安装版本为:freetype-2.1.10,如果主机系统本来的版本比 2.1.10高的话,那么编译后的freetype-2.1.10放在一个临时目录里面就可以了,在交叉编译qtopia的时候,引用到这个库文件就可以了。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(101)
发表于:2007-11-13 23:22:50
标签:无标签

0

WIN CE开机运行校正程序

在PB工程下加入一个console project
#include "stdafx.h"
#include "Pwinuser.h"

extern BOOL WINAPI TouchCalibrate(void);
int main(int argc, char *argv[], char *envp[])
{
TouchCalibrate();
return 0;
}
修改Project Specific Files下的
project.reg :
[HKEY_LOCAL_MACHINE\init]
  "Launch80"="tchcal.exe"
这样,开机就能运行这个程序了。

编译的时候可能提示找不到"Pwinuser.h",直接拷贝这个文件过来就好了。

点击此处查看原文 >>

系统分类: 汽车电子   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(313)
发表于:2007-11-13 23:21:20
标签:无标签

0

WinCE中划分Storage Memory和Program Memory

ms-help://MS.WindowsCE.500/wcecoreos5/html/wce50conMemoryArchitecture.htm

The RAM on a Windows CE–based device is divided into two areas: the object store and the program memory.

  • The object store resembles a permanent, virtual RAM disk. Data in the object store is retained when you suspend or perform a soft reset operation on the system. Devices typically have a backup power supply for the RAM to preserve data if the main power supply is interrupted temporarily. When operation resumes, the system looks for a previously created object store in RAM and uses it, if one is found. Devices that do not have battery-backed RAM can use the hive-based registry to preserve data during multiple boot processes.
  • The program memory consists of the remaining RAM. Program memory works like the RAM in personal computers — it stores the heaps and stacks for the applications that are running. 

    具体的设置可以在系统启动后,Control Panel -> System -> Memory 里面看到。默认的是把内存五五开,一半给Storage Memory, 一半给Program Memory用.

    划分的方法也很简单,在BSP的config.bib里 CONFIG 区添加这个变量 FSRAMPERCENT = 0xXXXXXX,

    FSRAMPERCENT是一个4byte长度的十六进制数, 我们用代数假设 FSRAMPERCENT = 0xQXYZ, 其中Q,X,Y,Z都是十六进制数

    那么最终划分给Storage Memory的大小 =  ( Q + X + Y +  Z ) / 0x400 * TOTAL_RAM_SIZE

    以文中的例子来算, FSRAMPERCENT=0x10203040, 假设TOTAL_RAM_SIZE=64M, 那么StorageMemory= (0x10 + 0x20 + 0x30 + 0x40) / 0x400 * 64M = 10M

点击此处查看原文 >>

系统分类: ARM   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(387)
发表于:2007-10-12 19:06:53
标签:无标签

0

集成外设及DSP/BIOS应用实例(上)

集成外设及DSP/BIOS应用实例(上)

本文将主要介绍C6000系列DSP的外设,分别从硬件接口特点、接口设计和接口设置等方面介绍了主机口HPI、多通道缓冲串口McBSP和直接存取控制器DMA/EDMA等外设。另外,介绍了如何利用DSP/BIOS操作系统提供的芯片支持库(CSL)访问和控制各个外设。

1  集成外设资源概述

C6000系列DSP在内部集成了丰富的外围设备(Peripherals),方便用于控制片外的存储器、主机以及串行通信设备。对于每种型号的外设资源都是不一样的,具体的需要查询该芯片的技术资料。

    在C6000系列DSP中集成的外设资源有:

    1.DMA与EMDA控制器

DMA、EDMA控制器最人的特点是可以在没有CPU参与的情况下完成映射存储空间中的数据搬移。这些数据搬移可以是在片内存储器、片内外设或是外部器件之间,而且是在CPU后台进行的。

C620x/C670x内部集成了DMA外设,其特点如下:

  (1)DMA摔制器独立于CPU 工作,具有单周期的数据吞叶率。

  (2)四个通道,外加专用的辅助通道,每一个通道对十CPU的优先级可设置。

  (3)32位寻址能力,可以对存储器映射空间的任何一个区域进行访问。

  (4)传送数据支持8/16/32位字长。

  (5)具有灵活的地址产生方式,有单通道分割(split-channel)操作模式。

  (6)每次数据块传输完毕后,可以进行DMA通道的自动初始化。

  (7)传输操作可以由选择的同步事件触发。

  (8)每个通道都可以触发中断事件。

  C621x/C671x内部集成的是EDMA外设,其特点如下:

  (1)16个通道,EDMA可以对16个通道进行彼此独立的控制。

  (2)连接:EMDA通道可以被连接起来,构成一个传输链。

  (3)事件同步:每一个通道都有一个特定的事件来触发。

  (4)主机接口HPI。

主机口(HPI)是一个16/32位宽度的并行端口,主机可以通过它直接访问CPU的整个存储空间,包括C6000片内存储映射的外围设备。C62x/C67x HPI与CPU存储空间的互连是通过DMA控制器实现的。借助专门的地址和数据寄存器,通过DMA辅助通道,完成HPI对存储空间的访问。主机和CPU都可以对HPI控制寄存器(HPIC)进行访问,主机还可以访问HPI地址寄存器(HPIA)和HPI数据寄存器(HPID)。对于C64x器件,CPU也可以访问HPIA寄存器。

2.多通道缓冲串口McBSP

C6000的多通道缓冲串口(McBSP)是存C2x和C54x的串口的基础上发展起来的,McBSP的功能包括:

  (1)全双工通信。

  (2)两级缓冲数据寄存器,允许连续的数据流。

  (3)收发独立的帧信号和时钟信号。

  (4)可以与工业标准的编/解码器、AICs(模拟接口芯片)以及其他串行A/D,D/A接口。

  (5)数据传输可以利用外部时钟,或者是片内的可编程时钟。

  (6)当利用DMA、McBSP服务时,串口数据读写具有自动缓冲能力。

  3.外设存储接口EMIF

  EMIF是实现外设存储器与DSP无缝连接的桥梁,EMIF支持的存储器包括:

  (1)同步突发静态RAM(SBSRAM)。

  (2)同步动态RAM(SDRAM)。

  (3)异步器件(包括异步SRAM,ROM和FIFO等)。

  (4)外部共享存储空间的操作。

EMIF整个外部空间最大容量为64MB,分为4个空间(2E0~CE3,每个CE空间彼此独立,可以进行不同的访问控制,但是某些控制信号线是复用的,使用时一定要注意。数据总线宽度32bit,同时也提供8/16位存储器的读写支持。

4.扩展总线XBUS

扩展总线(XBUS)是一个32位宽度的总线,支持多种异步外设、异步或同步FIFOs、PCI接口芯片和其他类型的外部主机。在主机口接口方面,扩展总线的功能较HPI有了很大增强。XBUS提供了曲种模式,即同步和异步主机口模式。异步模式相当于一个32位的HPI,同步模式支持多种协议的接口。

目前在C6202和C6203中具有扩展总线XBUS功能。

5.自举逻辑控制

TI C6000系列DSP芯片使用多种加载方式。根据复位前管脚的状态执行相应的加载方式。目前提供的3种加载方式如下:

(1)没有BOOT处理:CPU直接从地址0处开始运行。

(2)ROM加载模式:通过DMA控制器,把存储在外部存储器里的程序加载到内部首地址0处,在加载过程中,CPU已经脱离复位状态,但是仍处于stall状态。对于C620x/C670x DSP,要求程序代码必须是以Little-Endian模式存储在外部存储器中,尤其是ROM设备。

(3)主机加载模式:在主机加载模式下,外部主机可以通过HPI接口读写访问CPU的存储空间,包括内部配置的寄存器,如EMIF控制寄存器或其他外设。一旦主机完成了所有的初始化工作后,必须置DSPINT为1,表示已经完成加载过程,同时使CPU脱离stall状态,CPU开始从地址0处运行程序。

在C6201/C6701有专门的管脚BOOTMODE[4:O]决定DSP芯片复位后运行的加载方式,而C6211/C6711是利用主机口的HD[4:0]管脚复用,C6202/C6203是利用扩展总线的XD[4:0]管脚复用。

6.定时器

(26000系列集成了32位的通用定时器。定时器的输入时钟可以由内部产生,也可以是外部时钟;可以通过输出口TOUT输出时钟。TINT和。TOUT两个管脚也可以被配置为GPIO口。定时器可以用于

  (1)计时。

  (2)事件计数。

  (3)产生脉冲。

  (4)产生CPU中断信号。

  (5)产生DMA的同步信号。

2  DSP/BlOS

CCS(Code Composer Studio)是一个完整的DSP集成开发环境,所有的TI DSP都可以使用该软件进行丌发。在CCS中,不仅集成了常规的开发工具如源程序编辑器、代码生成工具(编译、连接器)以及调试环境外,还提供了DSP/BIOS开发工具。DSP/BIOS是一个可裁剪的实时操作系统,方便用户编写多任务应用程序。DSP/BIOS提供了类似于先占式的多线程运行方式、硬件驱动、实时分析和配置工具。DSP/BIOS已经是DSP开发过程中重要的工具。在本节将介绍DSP/BIOS工具的使用。

2.1  DSP/BIOS概述

DSP/BIOS是一个可裁剪的实时操作系统,本身占用很少的CPU资源,被集成在CCS开发环境里。该操作系统由TI公司免费提供。DSP/BIOS提供底层的应用函数接口,可用于支持系统实时分析、线程管理、调度软件中断、周期函数idle函数(后台运行函数)以及外部硬件中断与各种外设的管理。DSP/BIOS主要包括以下几个部分:

    1.DSP/BlOS配置工具

CCS提供了DSP/BIOS GUI功能,即DSP/BIOS配置工具。使用该工具,可以静态创建和配置程序中使用的DSP/BIOS对象,也可以配置存储器分配、线程管理和中断句柄。

2.DSP/BIOS实时分析工具

DSP/BIOS提供的一个强大的实时分析工具。使用该工具可以实时观测程序的运行状况,如各个线程占用CPU运行时间、代码执行时间统计、显示输出信息等。

    3.DSP/BIOS应用程序接口(API)

DSP/BIOS提供了超过150个API函数,其中有与C语言、C++语言和汇编语言接口的函数。这些API函数是为在硬件目标的嵌入式程序工作的,包括实时统计、I/O模块、软件中断管理和时钟管理等模块。由于应用程序的不同,DSP/BIOS API函数的代码长度从200~2000B不等。程序通过调用API函数米使用DSP/BIOS的资源。目前DSP/BIOS中主要的API模块有CLK模块、HST模块、HWI模块、IDL模块、LOG模块、MEM模块、PIP模块、PRD模块、RTDX模块、STS模块、SWI模块、DEC模块、SIO模块、MXB模块、QUE模块和SEM模块。

2.2  DSP/BIOS GUI配置

在DSP/BIOS的程序里,有一个DSP/BIOS的配置文什,该配置文件的后缀名为.cdb。这是一个图形界面的参数设置窗口,如图4-1所示。主要有两种功能:

(1)确定DSP/BIOS使用的各种参数。

(2)可以静态说明需要调用的DSP/BIOS模块,包括中断、任务和内部集成的外设等。


 1.系统设置项

系统设置项包括全局设置、存储器段管理器、系统设置和模块钩子管理器,如图4-2所示。

在全局设置的属性窗口中可以设置正使用的DSP型号、选择使用的片级支持库CSL、Endian模式和Cache模式等多种参数。在存储器段管理器的属性窗口中可以进行系统程序存储段的管理。通过该项设置,系统将自动生成系统程序连接时使用的.cmd文件。

2.实时分析工具

实时分析工具包括LOG管理器和统计类管理器,如图4-3所示。

点击看大图
用户可以利用LOG模块中的事件日志来记录实时的事件。系统口志记录系统所有运行事件包括系统出错等事件。用户可以用LOG_printf或LOG_event函数在用户日志中添加消息。用户可以利用STS模块仝面了解中断、任务以及用户自己定义的代码段或函数的运行时间。

3.线程管理

DSP/BIOS是一个类似于先占式的多任务操作系统。BIOS把任务称之为线程,一个线程是一个单独的控制点,可能包含一个子程序、一个宏或者足一个函数调用。DSP/BIOS内核支持具有不同优先级的多种类型线程运行,高优先级的线程可以中断低优先级的线程,因此具有类似的先.占式特点。

   DSP/BIOS提供了以下几种线程类型,优先级从高到低。

  (1)硬件中断HWI(含CLK模块)。

   (2)软件中断SWI(含PRD模块)。

   (3)任务TSK。

   (4)后台线程IDL。

   线程管理的界面如图4-4所示,使用GUI可以很方便地增加/删除线程。

   4.同步

同步主要的任务就是负责线程之间的协调,如同步通信、数据交换等。其中包括旗语、邮箱、队列管理和资源锁定管理等部分,如图4-5所示。

点击看大图
5.输入输出

    DSP/BIOS内核提供了丰富的数据交换途径。利用BIOS可以方便地实现主机和DSP之间的实时数据交换(RTDX和HST)以及各种线程之间的数据交换。DSP/BIOS的PIP模块
和SIO模块将主要用于I/O数据流的缓冲,这些数据流称为线程、DSP芯片和实时外围设备提供了牢固的数据软件结构。输入输出界面如图4-6所示。


6.片级支持库

片级支持库(CSL)提供了一个C语言接口的配置和控制片内外设1具。CSL集成在BIOS里,系统程序可以使用该功能,也可以不使用。使用片级支持库(CSL)简化了DSP片上外设开发时间,可以加快项目开发进度。片剂支持库(CSL)可以预先静态设置,也可以在程序运行时动态设置。

2.3  DSP/BIOS编程实例

DSP/BIOS是一个嵌入式实时操作系统。在BIOS基础上编程与普通的编写程序不同,下面将以TI的例了来介绍BIOS的编程特点。

    (1)首先新建一个BIOS配置文件。建市两个软件中断SWl0和SWll,SWl0的优先级设为1,SWll优先级设为2,如图4-7所示。

点击看大图
保存例子,名称为switest.cdb。

(2)新建一个工程,工程名switest.pit。把配置文件switest.cdb加入到工程文件中去,同时把switestcfg.cmd文件也加入到工程文件中。

(3)新建switest.C文件。源文件如下:



(4)编译连接工程,打开execution graph、statistics view和message log窗口,然后运行程序。在实时分析工具中可以观察到线程SWIO和SWll运行一次,部分时间是其他线程和KNL-swi运行,如图4-8~图4-10所示。
点击看大图

3  TMS320C6000的HPl接口设计

本节主要介绍主机接口外设HPI,其中介绍了主机如何通过主机接口(Host-port interface,HPI)读写访问C6000的存储器资源,包括HPI的控制寄存器设置,有关信号的作用与接口等。

3.1  HPI硬件介绍

主机口(HPI)是一个16/32位宽度的并行端口,主机可以通过它直接访问CPU的整个存储空间,包括C6000片内的存储映射的外围设备。HPI与CPU存储空间的互连是通过DMA/EDMA控制器实现的。借助专门的地址和数据寄存器,通过DMA辅助通道,完成HPI对存储空间的访问。主机和CPU都呵以对HPI控制寄存器(HPlC)进行访问,另外主机可以访问HPI地址寄存器(HPIA)和HPI数据寄存器(HPID)。对于C64x器件,CPU也可以访问HPIA寄存器。

图4-11中的阴影部分是HPI在C620x/C670x整个芯片中的位置。图4-12是HPI在C621x/C671X/C64x整个芯片中的位置(阴影部分)。表4-1列出了在C6000系列芯片中HPI外设的区别。

点击看大图

3.2 HPI接口及其应用

在这里将仔细介绍HPI接口的特点,分析HPI接口信号和总线时序的特点,硬件接口设计和软件设计特点。

    1.HPI接口与信号

主机可以通过HPI接口与CPU连接,HPI管脚信号功能如表4-2所示,详细的信号描述可以参照TI相关文档。

 

点击看大图
C6000 DSP不同芯片的HPI外设与主机接口有所不同,下面简要介绍其区别。

对于C620x/C670x芯片的HPI外设,HPI是16位宽度的并行接口,CPU可以自动地把主机连续写入的两个16位数据组合成一个32位数据。丰机把数据写入HPID寄存器,DMA辅助通道可以访问所有的CPU地址,把写入的数据存储到指定地址的存储空间中去。C620x/C670x芯片的HPI外设与主机连接框图如图4-13所示。


C621x/C671x的HPI管脚接口与C620x/C670x类似,但是不支持字节使能信号线/HBE[1:0]。C621x/C671x没有提供特殊的EDMA通道来专门进行HPI存取,而是直接将HPI与片内的地址产生单元相连,完全由硬件来处理硬件请求,如图4-14所示。

C64x芯片的HPI外设与主机连接框图如图4-15所示。C64x HPI外没有32根外部数据引脚,支持16/32位数据传输。C64x器件根据自举加载配置和器件配置决定是16位还是32位数据通道。C64x HPll6是C621x/C67lx的HPI外设增强版本。除了C621x/C67lx的HPI外设功能外,HPll6允许DSP访问HPI地址寄存器HPIA。如图4-15所示,地址寄存器HPIA分成两个寄存器,即HPIA写寄存器(HPIAW)和HPIA读寄存器(HPIAR)。HPI 32和HPI16功能类似,区别在于数据总线宽度不一样,而且HPI 32不使用 HHWIL信号线。

2.HPI总线时序

图4-16~图4-19分别给出了HPI读和写操作的时序。/HSTROBE是内部选通信号,由/HDSl、/HDS2和,HCS信号逻辑组合产生。控制信号:HCNTL[1:0]、HR/W、HHWIL和/HBE[1:0]是输入信号,由主机驱动。HCNTL[1:0]和HR/W控制对两个半字的访问。HRDY低电平表示HPI已经准备好收发数据。

/HAS信号为高电平或者没有使用,那么/HSTROBE的下降沿锁存控制信号。如果使用了/HAS信号,在/HAS的下降沿锁存控制信号。可以根据具体的情况来决定是否在接口中应用选通信号HAS,因此下面的读写时序中部各自给出了有/HAS和没有/HAS信号时的情况。

点击看大图

3.HPI控制寄存器

HPI外设利用3个寄存器完成主机和DSP之间的数据交换。3个寄存器分别是HPI数据寄存器(HPID)、HPI地址寄存器(HPIA)和HPI控制寄存器(HPIC)。对于C64x器件,HPI地址寄存器分为地址读寄存器(HPIAR)和地址写寄存器(HPIAW)。

HPIA中存放主机访问DSP存储空间的地址,这是一个30位值,最低2位固定为0。对于C62x/C67x,只有主机才能访问HPIA,DSP不可以访问。对于C64x,主机和DSP都可以访问HPIA寄存器,主机可以对DSP的不同存储空问进行读写操作。

HPID中存放的是主机从存储空问读取的数据,或者是主机要向DSP的存储空间写入的数据。HPIC是32位寄存器,高16位和低16位对应的是同一个物理存储区,因此高16位和低16位的内容是一样的。在写HPIC时,必须保证写入数据的高16位和低16位的内容一致。HPIC寄存器如图4-20所示,其中各位意义如表4-3所示。

点击看大图
 4.主机访问操作顺序

  主机按照以下的顺序完成对HPI的访问:

  (1)初始化HPIC寄存器。

  (2)初始化HPIA寄存器。

  (3)从HPID寄存器读取/写入数据。

对HPI任何一个寄存器的访问,主机都需要在HPI总线上进行两次half-word的存取(第1个16位HHWIL为0,第2个HHWIL为1)。一般主机不会打断这样的两次存取,一旦打断可能会引起整个数据的丢失或者数据被破坏。如果前一次HPI的访问尚未完成,那么当前的第一个half-word的存取需要等待,此时HPI会置/HRDY信号为高。但是在第2个半字存取访问时,HRDY可以为有效状态。C64x}fPl32把两个半字组合成一个字传输。

在访问任何数据之前,必须对HPI进行初始化,包括设置HPIC和HPIA寄存器。对C62x/C67x和C64x是有所不同的。

   HPI的数据传输模式有4种:

   (1)不带地址白增的读操作。

   (2)带地址自增的读操作。

   (3)不带地址自增的写操作。   

   (4)带地址自增的写操作。

这些模式由HPI的HCNTL[1:O]信号以及HHWIL进行控制,具体如表4-4所示。其中的地址自增功能使主机可以很便捷地访问一个线性存储区域,而无需反复地向HPIA中写入需要的地址。

点击看大图
5.HP的自举加载操作

通过HPI接口也提供了相应的HPI加载方式。当CPU复位时,根据相应的加载配置,CPU进入HPI加载处理方式。在HPI加载处理方式中,DSP处在复位状念,而其他部分脱离复位状态。通过HPI接口,主机可以访问DSP的全部存储空间,包括片内外设寄存器、片内存储器和片外存储器。主机完成初始化DSP后,需要向HPI控制寄存器HPIC的DSPHlNT位写1,这样才可以使DSP脱离复位状态开始从地址0处执行程序。HPI加载处理过程如图4-21所示。

点击看大图
3.3 BlOS中HPI设置实例

HPI模块提供了访问HPI寄存器的API函数,其中用于访问HPI状态位和设置中断事件。对于C64x,还包括读写HPlA寄存器。在CCS中没有提供HPI设置图形用户接口。

     HPI模块提供的API函数如表4-5所示。

点击看大图
4  TMS320C6000的McBSP接口设计

本节对多通道缓冲串口McBSP(Multi-channel Buffered Serial Port)的硬件及其操作进行介绍,包括有关的控制寄存器设置和时序图。此外,还介绍在BIOS中McBSP模块的特点和应用。

4.1  McBSP硬件介绍

C6000的多通道缓冲串口(McBSP)是在TMS320C2x/C3x/C5x和TMS320C54x串口的基础上发展起来的,McBSP的功能包括:

   (1)全双工通信。

   (2)双缓冲数据寄存器,允许连续的数据流。

   (3)收发独立的帧信号和时钟信号。

   (4)可以与工业标准的编/解码器、AICs(模拟接口芯片)以及其他串行A/D,D/A接口。

   (5)数据传输可以利用外部时钟,或者是片内的可编程时钟。

   (6)通过5通道的DMA控制器,串口数据读写具有自动缓冲能力。

   另外,McBSP有以下特点:

   (1)支持以下方式的传输接口:

   ■TI/E1帧协议

   ■MVIP兼容的交换方式以及ST—BUS兼容设备,包括:MVIP帧方式、H.100帧方   式和SCSA帧方式

   ■IOM-2兼容设备

   ■AC97兼容设备

   ■IIS兼容设备

   ■SPI设备

  (2)可与多达128个通道进行收发。

  (3)传输的数据字长可以是8位、12位、16位、20位、24位和32位。

  (4)μ-律/A-律压扩硬件。

  (5)对8位数据的传输,可选择LSB先传还是MSB先传。

  (6)可设置帧同步信号和数据时钟信号的极性。

  (7)内部传输时钟和帧同步信号可编程程度高。

所有的C6000器件有着同样的McBSP接口,但是C621x/C671x和C64x器件的McBSP接口却有所不同,增加了新的特色和增强功能。

4.2  McBSP接口及应用

McBSP外设具有很多强大功能,在这里将要介绍外设的信号接口、控制寄存器、时序特点以及初始化工作;同时介绍了作为SPI接口和通用IO口使用的原理和方法。对于McBSP的多通道工作模式和μ-律/A-律压扩硬件功能没有介绍,有兴趣的读者可以参照TI相关文档。

    1.信号接口和寄存器

McBSP包括一个数据通道和一个控制通道,连接到外部器件。数据通过发送(DX)和接收(DR)引脚与外部器件通信,而其他的4个引脚起时钟和帧同步信号作用。C6000通过片内的外设总线访问串口的32位控制寄存器,进而实现与McBSP间的通信与控制。McBSP结构如图4-23所示。外部引脚含义如表4-6所示。

 


点击看大图
数据通道完成数据的发送和接收。CPU或DMA控制器将待发送的数据写入发送寄仔器(DXR)中,从接收寄存器(DRR)读取接收到的数据。写入DXR的数据通过发送移化寄存器(XSR)移位,从DX管脚输出。同样,DR管脚上接收到的数据先移位到接收移位寄存器(RSR)中,然后被复制到接收缓冲寄存器(RBR)中,RBR再将数据复制到DRR中,最后等候CPU或DMA控制器将数据读走。这种多级缓冲方式使得片内的数据搬移和外部数据的通信可以同时进行。

McBSP可以触发多种中断事件,中断事件可以中断CPU执行中断服务子程序:也可以产生同步事件告知DMA控制器,见表4-7。

点击看大图
点击看大图
2.数据的收发

如图4-23所示,McBSP的接收操作采用三级缓冲方式,发送操作采用两级缓冲方式。接收数据到达DR管脚后移位进入RSR,一旦整个数据单元(8位,12位,16位,20位,24位或32位)接收完毕,如果RBR寄存器末满,则RSR将数据复制到RBR中。如果DRR中旧的数据已经被CPU或DMA/EDMA控制器读走,则RBR将新的数据复制到DRR中。发送数据被CPU或DMA/EDMA控制器写到DXR。如果XSR寄存器没有数据,则DXR中的值被复制到XSR中:否则,DXR会等待XSR中旧数据完全发送完,才将数据复制到XSR中。

McBSP的复位有两种方式:

(1)一种是芯片复位,那么McBSP中发送、接收和采样时钟都同时被复位。

(2)另一种是通过设置串口控制寄存器SPCR中的相应位,单独使McBSP复位。设置/XRST使得发送复位。/RRST=0将分别使接收复位,/GRST=0将使采样速率发生器复位。

复位后,整个串口初始化为默认状态。所有计数器及状态标志均被复位,这包括接受状态标志RFULL、RRDY及RSYNCERR,发送状态标志/XEMPTFY、XRDY及XSYNCERR。器件复位和McBSP控制器复位对寄存器标志位和管脚将产生不同的影响。

RRDY和XRDY分别是McBSP接收和发送状态准备标志位。读山DRR数据和写入DXR数据都将分别对RRDY和XRDY状态位产生影响。读写串口数据有多种方式进行同步:

    ·轮询RRDY和XRDY状态位;

    ·DMA/EDMA控制器产生的同步事件(REVT和XEVT);

    ·CPU事件(RINT和XINT)产生的中断。

McBSP的控制信号,如时钟、帧同步和时钟源都是可以设置的。图4-24是McBSP时钟和帧同步信号的一个典型时序。时钟CLKR和CLKX对数据的接收/发送进行同步,而帧同步信号17SR和FSX则与一个数据单元传输同步。

点击看大图
McBSP允许对数据时钟以及帧同步信号设置参数,如下:

·FSR、FSX、CLKX、CLKR的极性

·选择单相帧或二相帧

·定义每相中数据单元的个数

·定义每相中,一个数据单元的位数

·是选择帧同步信号触发新的串行数据发送流,还是被忽略

·选择帧同步与第一个数据位之间的延迟时间,可以是0位,l位,2位延迟

·接收数据的左右调整,进行符号扩展或是填充0

对McBSP的收发部分可以各自独立地选择时钟以及帧同步配置。接收和发送的帧同步信号和时钟可以由内部或是外部产生,根据寄存器PCR、SRGR中相应位的设置而定。

     3.SPl协议下的接口

     McBSP中的传输时钟具有停止模式,与SPI协议的兼容。McBSP支持两种SPI传输格式,在SPCR寄存器的CLKSTP位中设置。表4-9列出了CLKSTP与CLKXP相配合,对串口时钟工作模式的控制。图4-25和图4-26分别给出了在两种SPI格式下,时钟传输接口的时序情况。

 

点击看大图
McBSP既可以作为SPI主设备又可以作为SPI从设备。作为SPI主设备时,由McBSP内部的采样率发生器产生时钟CLKX和从设备使能信号FSX.CLKX定义为输出口(CLKXM=1),FSX定义为输出口,与从设备的使能端(/SS)连接。SPI协议要求:McBSP在移位输出数据之前,FSX信号就必须有效,所以XCR寄存器中XDATDLY位必须设置为1。XDATDLY=0或2时将导致非法操作。

用户需要设置SRGR寄存器中的CLKSM位来选择采样率发生器的时钟源,以及利用CLKGDV位设置需要的SPI数据传输速率。在McBSP内部会产生一个连续的CLKX时钟,在完成传输后时钟禁止输出,从而实现传输接口所需要的时钟停止模式。因此在McBSP-端,对于发送和接收的内部操作而言,时钟信号实际上是连续的。选择时钟停止模式时,SRGR寄存器中的帧设置位(FPER和FWID)无意义。McBSP作为主设备时的接口框图如图4-27所示。


当McBSP作为SPI从设备时,由外部的主设备产生所需的时钟信号和从设备使能信号。串口按照时钟进行数据同步传输。输入的CLKX和FSX信号同时也分别作为McBSP内部接收端的CLKR信号和FSR信号。McBSP的FSX引脚信号同从设备SPI的使能信号SS要求一样,在进行数据传输之前,外部主设备必须先将FSX信号置为有效(低电平)。

图4-28是McBSP作为SPI从设备的接口框图。作为SPI从设备时,McBSP的CLKX管脚和FSX管脚配置为输入管脚(CLKXM=FSXM=0)。McBSP的RCR/XCR寄存器中的(R/X)DATDLY位必须置为0,以保证发送的第一个数据能够出现在DX管脚上,一旦检测到串行时钟CLKX有效,就可以立刻接收数据。


虽然CLKX信号是由外部主设备产牛,但是McBSP内部的采样率发生器仍必须被使能,并被设置为相应的SPI模式。内部采样时钟对输入的CLKX和FSX:信号进行同步化处理。寄存器SRGR中的CLKSM=I,指定内部采样时钟由内部CPU时钟产生。必须保证内部的CLKG信号频率至少是SPI数据传输率的8倍,比如,可以令CLKGDV=l,将采样率发生器设置为最大的速率。

设定McBSP工作在SPI模式下,需要按照以下步骤初始化寄存器:

(1)复位收发端口,将SPCR寄存器中/XRST和/RRST置为0;

(2)McBSP保持复位的状态下,设置有关的寄存器为需要的值,先设置CLKSTP=1xb;

(3)置SPCR寄存器中GRST=l,采样率发生器退出复位态,开始工作:

(4)等待两个时钟周期,以确保McBSP重新初始化;

(5)根据由CPU还是由DMA来访问McBSP,分别进行下面的设置:

·如果是由CPU进行访问,置/XRST=/RRST=1,使能串口,注意SPCR寄存器中其他    的设置值不变。

·如果是由DMA进行访问,先对DMA进行初始化,启动DMA,使之等候同步事件,    然后再将/XRST=/RRST=1,使串口退出复位态。

(6)两个数据时钟周期后,发送端和接收端进入有效状态。

4.通用I/O口

在两种情况下,串口的管脚(CLKX,FSX,DX,CLKR,FSR,DR以及CLKS)可以作为通用IO口使用:

·接收或发送处于复位状态,SPCR寄存器中(R/X) RST="0"。

·串口使能为通用I/O状态,PCR寄存器中(R/X)IOEN=1。

在表4-10中详细描述了这些管脚作为通用IO口的用法,其中有几个引脚只能定义为单向IO口,这一点一定要注意。 

点击看大图
4.3 BIOS中McBSP设置实例

在TMS320C6x系列器件里都集成了McBSP外设。不同类型的DSP芯片集成的McBSP外设个数不一样。BIOS为McBSP提供了对应的API模块。

    1.BlOS中McBSP控制器API函数

同样McBSP模块基于句枘模式,完成对DSP器件McBSP外设的控制,进行串行收发数据操作。API模块包括结构定义、函数和宏。

McBSP只有一个结构,定义如下:

 

点击看大图
点击看大图
McBSP配置管理器创建配置对象,通过设置属性页的内容可以设置McBSP的工作方式。属性页的设置界面如图4-30所示,属性页主要包括以下几个部分:

·发送模式:中断方式、帧同步方式和时钟控制;

·发送帧和数据单元格式:相位、数据单元个数;

·接收模式:中断模式、帧同步、时钟摔制;

·接收帧和数据单元格式:相位、数据单元个数;

·采样频率发生器:采样频率发生器;

·多通道操作:数据单元和块分割:

·通用IO口:使能GPIO功能;

McBSP资源管理器中显示器件内部集成的McBSP外设个数,并对每个外设定义一个初始化的句柄名。C6202和C6203芯片支持第3个外设MCBSP_Prot2,端口和句柄对应方式如下:

  ·McBSP_Prot0:句柄名hMcbspO;

  ·McBSP_Protl:  句柄名 hMcbspl:

  ·McBSP_Prot2:  句柄名hMcbsp2;

通过属性页可以使能打开串口操作和用配置对象初始化串口。属性页如图4-31所示:

点击看大图
通过CSL GUI设置好McBSP端口后,将会分别在头文件和源文件中生成相应代码,详细可以参照附带光盘里的例子。

在csl_mcbsp.h头文件中有如下代代码:


点击看大图
 

点击此处查看原文 >>

系统分类: 汽车电子   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(566)
发表于:2007-10-12 18:58:38
标签:无标签

0

集成外设及DSP/BIOS应用实例(下)

集成外设及DSP/BIOS应用实例(下)
[ 2007-4-13 15:47:00 | By: DSP_light ]
 
集成外设及DSP/BIOS应用实例(下)

5  TMS320C6000的DMA控制器设计

本节主要介绍C6000系列的直接存储器访问(DMA,Direct Memory Access)控制器其中介绍硬件特点、DMA通道与寄存器。

5.1  DMA硬件介绍

DMA控制器最大的特点是可以在没有CPU参与的情况下完成映射存储空间中的数据搬移。这些数据搬移可以是在片内存储器、片内外设或是外部器件之间,而且是在CPU后台进行的。DMA控制器具有4个相互独立编程的传输通道,允许进行4个不同内容的DMA传输。另外,还有一个辅助通道用来服务于主机口接口读写访问。

在讨论DMA操作时,需要了解C6000的DMA传输中的几个概念:

(1)数据的读传输(read transfer):DMA控制器从源地址存储器中读取数据。

(2)数据的写传输(write transfer):DMA控制器将读取的数据写入目标地址存储器中。

(3)数据单元传输(element transfer):一个数据单元的读传输和写传输的结合。

(4)帧传输( transfer):帧的大小可编程设置。完成一个帧传输即传输一定数量的数据单元。

(5)块传输(block transfer):每个DMlA通道也可以独立定义每块中帧的数量。完成一个块传输即传输一定数量的帧。

(6).发送数据单元的传输(transmit element transfer):在通道分割模式下,数据单元从源  地址中读出并写入分割目的地址。

(7)接受数据单元的传输(receive element transfer):在通道分割模式下,数据单元从分割源地址中读出并写入目的地址。

DMA控制器有如下主要特点:

(1)后台操作:DMA控制器可以独立于CPU工作。

(2)高吞吐率:可以以CPU时钟的速度进行数据传输。

(3)4个通道:DMA摔制器可以控制4个独立通道的传输。

(4)辅助通道:主机口用辅助通道来访问CPU的存储空间。辅助通道与其他通道间的优先级可以设置。

(5)单通道分割(split-channel)操作:利用单个通道就可以与一个外设间同时进行数据的读和写传输,效果就好像使用两个DMA通道一样。

(6)多帧()传输:传送的每个数据块可以含有多个数据帧。

(7)优先级可编程:每一个通道对于CPU的优先级是可编程确定的。

(8)地址产生方式可编程:每个通道的源地址寄存器和目标地址寄存器对于每次读写都是可配置索引的。地址可以是常量、递增、递减,或是设定地址索引值。

(9)32位地址范围:DMA控制器可以对仟何一个地址映射区域进行访问,包括:

·片内数据存储区

·片内程序存储区(当其作为映射存储器时,而不是作为cache使用)

·片内的集成外设

·通过EMIF接口的外部存储器

·通过扩展总线接口的扩展存储器

(10)传送数据的字长可编程:每个通道都可以独立选择宽度为字节、半字(16位)或字(32位)。

(11)自动初始化:每传送完一块数据,DMA通道会自动为下一个数据块的传送重新初始化。

(12)事件同步:读、写和帧操作都町以由指定的事件触发。

(13)中断反馈:当一帧或一块数据传送完牛,或是出现错误情况时,每一个通道都可以向CPU发出中断请求。

DMA控制器在C6000中的位置如图4-32所示的阴影部分。

点击看大图
5.2  DMA控制器设计及应用

    1.DMA寄存器、初始化和启动

DMA寄存器用于初始化和控制DMA操作。每一个DMA通道都有一套相关的寄存器完成传输控制,在启动DMA之前,必须刘它们进行初始化。表4-14列出了有关的控制寄存器及其在映射存储器中的位置。限于篇幅,这里没有列出寄存器各个控制位的意义。读者可以参考TI的相关文档。

点击看大图
点击看大图
每一个DMA通道启动可以在程序中由CPU完成,也可以是通过自动初始化肩动。每一个DMA通道都可以山CPU控制独立启动、暂停和停止。DMA通道丰控寄存器(PRICTL)的STATIS域指示相应DMA通道的当前状态。只有在STATUS位和START位相同时,才可以修改主控寄存器。启动操作如下所示:

·手工启动:向DMA主控制寄存器(PRICTL)的START域写入01b将直即启动该通    道的DMA。一旦启动,STATUS的值会变成01b。注意一旦启动,再写入01b将不会有任何影响。

    ·暂停操作:在启动后,向START写10b可以暂停DMA。暂停时,如果某个数据单元传输的读传输过程已经完成,此时DMA通道会继续完成其对应的写传输。STATUS在DMA完成当前写传送后变为10b。

    ·停止操作:启动后写入START=00b,DMA控制器将被停止。停止操作和暂停操作相    同。除非是工作在自动初始化模式下,否则一旦DMA完成数据传输,该通道使进入停止状态,STATUS的值变为00b。

在一次块传送任务完成后,DMA控制器可以自动初始化。向主控制寄存器的START写入11b将以自动初始化方式启动DMA。在一次块传送任务完成后,DMA控制器自动调用DMA全局数据寄存器值预先为下一次数据块的传送操作初始化,因此DMA通道参数设置可以在下一次传送操作之前完成。自动初始化可以使DMA进行以下几种操作方式:

·连续操作:该方式占用一定CPU时间。通常,CPU必须在一次读写传送完成之后立    即重新初始化DMA。利用重载寄存器,就可以在当前块传输中的任何时间为下一次传送初始化参数。

·重复操作:连续操作的一个特例。传送完一块后,DMA控制器将重复前一次相同的    块传输。这种情况下,CPU不需要反复设置重载寄存器,只需在开始传输之前设定重载寄存器的值。

·使能自动初始化:只需通道主控制寄存器的START=11b,就可以使能自动初始化。    传送完一块后,DMA控制器将重载寄存器,重复前一次相同的块传输。如果在暂停后重新启动,START必须被重新设置为11b,以使自动初始化使能。

在从自动初始化到非自动初始化操作中,首先需要暂停DMA摔制器,即写入10b,然后再次启动DMA控制器,即写入01b。

2.传输计数

     DMA的通道传输计数寄存器(XFRCNT)包含两个域,分别表示当前传输的帧计数和每帧的数据单元计数,如图4-33所示。DMA的全局计数重装载寄存器结构与传输计数寄存器的结构相同,如图4-34所示。

点击看大图
· COUNT:此域的16位无符号数指示当前块传输中的帧数,每块的最大帧数  为65535。当一帧内的最后一个读传输完成后,该计数值递减。一旦最后一帧传送完后,整个计数器会被DMA通道主控寄存器的CNT RELOAD域所指定的DMA全局计数重载寄存器内的高16位值重载。COUNT设置为0的效果和设置为1一样。

·ELEMENT COUNT:此域内的16位无符号数指示每帧传输的数据单元个数。每次数  据单元的读传输完成后,该值递减。每帧的最大数据单元数目为65535。最后一个数据单元完成传输后,ELBMENT会被DMA通道主控寄存器的CNT RELOAD域所选定的DMA全局计数重载寄存器内的低16位值重载。在块传输开始前,计数器以及对应的全局计数重载寄存器低16位必须设置相同的值,以保证每次的帧长度相同。  除了在自动初始化模式下需要这种重载以外,对于多帧数据传送,也需要数据单元计  数的重加载,必须设定重载值。如果数据单元计数初始值为零,则操作无效。

     3.传输控制:同步与地址产生

同步机制使得用户可以利用某些事什来触发DMA的传输过程,例如外设中断或外部引脚中断。每一个通道有三种类型的同步方式:

   读同步:由指定的事件触发读传输。

   写同步:由指定的事件触发写传输。

   帧同步:由指定的事件触发帧传输。

由DMA通道主控寄存器的RSYNC和WSYNC两个域控制DMA的同步事件。如果这个寄存器内的FS=1,那么整个帧的同步事件是RSYNC选定的事件,这时WSYNC必须设置为00000b。如果该通道设置为分裂模式(SPLIT不等于OOb),那么RSYNC和WSYNC必须设为非零值。表4-15列出了两个域和同步事件的对应关系。

DMA通道副控寄存器中的STAT和CLR位与同步事件的控制有关。

当指定事件的有关信号发生由低变高(或由高变低)变化时,各个通道会锁定事件,同时相应的STAT位被置位。如果没有选择同步事件,读SFAT位总是1。单个事件可以用来触发多个动作。

通过清除悬挂事件可以强制DMA通道等待下一个事件。相反,设置事件可以触发块传输。在触发事件的相关操作完成后,锁定事件的STAT位标志会被自动清除,也可以通过手动清除。用户可以分别向STAT和CLR写入1,手工设置事件或是清除事件。对STAT和CLR位写入0足无效的。手工清除与设置的优先级总是高于任何自动的清除与设置。

点击看大图
DMA控制器负责对每个通道的读写传输进行地址计算。利用不同的地址产生方式,DMA控制器可以支持多种结构数据的传输。例如,DMA控制器可以对矩阵数据进行转置操作。

DMA通道的源地址寄存器和目的地址寄存器都是32位,分别存放下次读传输和写传输的操作地址。如图4-35和图4-36所示。

点击看大图
在计算传输地址时,有基本调整和使用全局索引值调整两种计算方式。基本调整是指通
过控制域SRC DIR和DST DIR来设置传输地址按数据字长大小递增、递减、保持不变。

全局索引寄存器如图4-37所示。与基本调整不同,这种模式是根据传输的数据元素是否是当前帧的最后一个来进行不同的地址调整。全局索引寄存器的LSBl6(ELEMENTINDEX)中存放普通调整值,MSBl6( INDEX)中存放帧尾调整值,两个索引值都是16位有符号数,范围从32768~32767。每帧中数据除最后一个数据传输之外都按ELEMENT INDEX值规定地址寄存器的增量,对于最后一个数据传输,按照 INDEX值调整地址寄存器的值。

 

点击看大图
4.单一通道的分裂操作

利用通道分裂操作方式可以使一个DMA通道为一个具有固定地址的外部或是内部外设同时提供输入和输出数据流。

    分裂通道操作分为发送数据单元的传输和接收数据单元的传输,每种传输都依次执行一
次读传输和一次写传输:

    ·发送数据单元的传输

■发送读传输:数据从DMA通道的源地址读出,然后源地址按照设置参数进行调    整,传送计数减1。没有同步事件。

■发送写传输:由发送读传输得到的数据被写入分裂目标地址。此过程有WSYNC    域所指定的同步事件。

■接收数据单元的传输

    ■接收读传输:数据从DMA通道的分裂源地址读出。此过程有RSYNC域所指定的事件同步。

    ■接收写传输:由接收读传输得到的数据被写入目标地址,然后目标地址按照设置    调整。没有同步事件。

由于每个通道只有一个数据单元传输和帧传输计数器,因此接收与发送的帧数以及每帧的数据单元个数必须是相同的。为了使分裂通道正常工作,RSYNC和WSYNC控制域必须配置为非零值,同时禁止帧同步方式。

所有传输都按照以上次序进行。但是在以上的过程中,发送数据单元传输并不需要等前一次的接收数据单元传输完成之后才能进行。因此发送数据有可能会发生在接收数据之前。整个相关的发送数据单元传输完成后,源地址寄存器会被递减或者重新初始化。只要发送数据单元传输的次数不会超过接收数据单元传输的次数8次,DMA通道的硬件会继续运行,否则发送数据单元传输将被停止。

在DMA主控寄存器中SPLIT域选取相应的DMA全局地址寄存器作为分裂传输操作中的分裂地址:

    ·分裂源地址:即C6000的输入数据流的源地址,保存在选定的DMA全局地址寄存器    里。
    ·分裂目标地址:即C6000的输出数据流目的地址,比分裂源地址大一个字(4个字节)。    两个地址的最低3位始终为0,强制按照字地址大小排列。从而确保分裂源地址在偶数字上,分裂目标地址是在奇数字上。  对于外部设备,用户在设计地址译码时一定要符合这个规定分裂操作要求。

     5.资源仲裁和优先级设置

     DMA控制器片内仲裁机构根据优先级确定哪个请求方将先获得资源的控制权。这些请求方包括:

   (1)DMA通道。

   (2)CPU的程序存取和数据存取。

   公共资源包括:

   (1)片内数据存储器。

   (2)片内程序存储器。

   (3)通过外设总线访问的片内外设寄存器。

   (4)通过片内外部存储器接口(EMIF)访问的外部存储器。

   (5)通过扩展总线访问的扩展存储器。

   优先级的设置包括两个方面:

(1)DMA与CPU之间:每一个通道都可以独立配置为高优先级模式。主控寄存器的PRI位决定了每一个DMA通道与CPU访问之间的优先级,辅助控制寄存器中的AIJXPRI位决定了辅助通道和CPU之间的优先级。

(2)DMA通道之间的优先级:4个通道的优先级是固定的,通道0优先级最高,通道3优先级最低。辅助通道的优先级是可任意设置的。

    6.DMA通道的状态

一些状态标志位提示着DMA的工作情况,这些标志存在于DMA通道副控寄存器中。副控寄存器中的一系列中断允许位(IE)控制的是DMA中断CPU的方式。如果某个状态对应的IE被使能,则相应的状态变化就会影响该通道的中断信号。当该通道的TCINT他设为1,所有的状态信号相或的结果就会产生DMA_INTx信号并被送往CPU,甭则DMA_INTx无效。它们的逻辑关系如图4-38所示。


 副控寄存器中的SX COND,WDROPCOND和RDROPCOND是出错警告状态信号。不管TCINT的设置情况如何,如果条件被使能同时有效,会立即使DMA通道进入暂停状态。对以上位写入1是无效的。表4-16是DMA通道各个状态的定义,以及状态位的清除方式。
点击看大图
5.3 BIOS中DMA设置实例

在TMS320C6xTM系列器件里,有两个DMA结构,即DMA和EDMA(enhanced DMA)。C6201TM器件集成了DMA外设,而C6211TM集成了EDMA外设。两种DMA结构在结构上有很大的不同,所以BIOS为每一种结构分别提供了对应的独立API模块。

    1.BlOS中DMA控制器API函数

同样:DMA模块基于句柄模式,完成对DSP器件DMA外设的控制,进行DMA操作。API模块包括结构定义、函数和宏。

     DMA配置结构有两个,如表4-17所示。

点击看大图
点击看大图
 2.用CSL UI配置DMA控制器
    
     采用CSL GUI可以很方便地配置DMA控制器。DMA模块包括配置管理器、资源管理器和全局寄存器管理器,CSL图形用户接口DMA部分界面如图4-39所示。

     DMA模块包括下面几个部分:

     (1)DMA配置管理器:配置管理器允许创建一个初始化DMA通道寄存器的配置对象。

     (2)DMA资源管理器:资源管理器指定DMA通道用哪一个配置对象配置。

     (3)DMA全局寄存器管理器:全局寄存器管理器预先初始化全局寄存器。

     利用DMA配置管理器可以很方便地创建一个配置对象,非常直观地设置DMA通道的相关寄存器。DMA配置管理器的属性选项卡如图4-40所示。

 

点击看大图
在属性选项卡中可以设置相关的存储器映射寄存器。配置操作可以分成以下几个部分。

·Operation Mode:工作模式。

·Source:源地址,增加和重载配置。

·Destination:目标地址,增加和重载配置。

·Synchronization:同步控制。

·Count/Index:选择全局寄存器和计数值。

·Intellaap Enable:中断控制。

·Condition:清除条件标志位。

DMA资源管理器把已设定好的DMA配置对象与某一DMA通道绑定,在属性选项卡中直接选择配置对象。如图4-41所示,选择已经创建的对象dmaCfg1初始化DMA通道,DMA通道的句柄是hDmaO。

对于每个DMA通道,全局寄存器是共享的。用资源管理器可以很方便地初始化全局寄存器。全局资源管理器属性选项卡如图4-42所示,设置好该项将会生成对应的DMA_globalAlloc()和DMA_globalConfig()CSL函数。

点击看大图

 

6本章小结
本文介绍了C6000系列DSP芯片的集成外设,主要从外设接口特点和使用等几个方面着重进行介绍。另外给出了如何使用BIOS中芯片支持库(CSL)访问和控制片上外设。限于篇幅,有些部分没有介绍,有兴趣的读者可以参照TI的相关文档。

点击此处查看原文 >>

系统分类: 汽车电子   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(349)
发表于:2007-10-11 12:04:01
标签:无标签

0

DSP的BOOTLOADER

历时接近20天,一个小小的本不该成为障碍的障碍终于解决了,做一下笔记好了!
问题描述:TI DSP flash烧写及自启动
DSP型号:DM642
所有的系统在结束了仿真器开发后,都需要解决一个问题,就是将程序烧写到外部存储芯片中,完成系统上点后的自启动和引导,大多数,就是flash的烧写和自启动。
一,系统初期,没有估计到这部分的工作量,直到与苏工结帐时仍然以为这是一个手到擒来的过程。
也许是以前在实验室,单片机和FPGA的开发过程中,没有遇到过类似的问题,所以我相当然地以为对于DSP也是同样的过程。现在想想,单片机是 用单独的编程器烧写,而FPGA因为开发板提供厂商已经把大量的底层都完善了,我们所需要做得仅仅是编译产生下载文件,下载,OK!按理说,如果我们也是 采取购买开发板的途径进行开发,开发板提供厂商也应该把这部分工作做完了。但是,我们找的是单独的小公司设计一块系统板,这部分工作,尤其是如果系统板和 开发板有所不同的这部分工作,就应改在设计初期,签合同时,明确提出来是谁做,做到权责明析,很遗憾我们没有。而且,在项目进行中和那个帮我们做板子的人 有点不愉快,最要命的是我已经把项目款付给了人家,接下来的工作量,就不能不说是我们自找的了。
二,我意识到,我不得不自己去做这部分工作了,于是开始想要借力合众达。合众达是TI的官方合作伙伴,中国TI DSP的技术支持。
一开始,合众达觉得我是它们开发板的潜在买家。于是开始费力地给我介绍它们的VPM642。于是我告诉它们,我的系统是自己设计的,希望能够得 到它们的支持。他们于是好奇地研究了研究我的板子,然后告诉我,它们这边只是支持合众达的VPM642开发板,而且我的板子和它们的不同,它们也不保证提 供的在VPM642上work的东西在我的板子上也能正常工作。anyway,我说给我吧,我可以作为参考。
于是我搞到两块板子的图纸,开始详细比较二者的不同。
三,根据我比较的结果,我认为,二者没有本质的不同,都是AMD的芯片,型号有差异,一个33,一个320,它们能用的我应该也能用。我拿来SEED的测试程序开始测我的flash,结果是,没有结果……
这时TI 的Robin给了我很重要的hint,需要修改FBTC.pjt,根据flash芯片的不同,不到一天我修改完了,还是不能连接。
四,张金龙给了我两个很重要的暗示的第一个。之所以FBTC修改后,出现错误提示,可能是由于我是用CCS3.1编译的,而原本人家是2.2的。所以我去问SEED要了支持3.1版本的flashburn安装后,flashburn连接的问题解决了。
五,但是硬件上flash的测试仍旧没有通过,张金龙也不知道是为什么。几天后,问题发现了,CPLD中对flash的分页没有工作,而且总线 有冲突。我回头去找苏工,他也意识到这是他的问题,于是,两天后,解决了这个问题。flash硬件测试通过,分页信号正确,flashburn也连接上 了。
六,做到这一步后,某一个晚上,我连接好所有的系统,将一个闪灯和串口发送的test工程烧写进flash,重新上电后,自启动成功!这时我有 点激动,以为问题解决了。可是等我将我们的工程编译下载后,重启动却没有反应!我傻眼了,怎么会呢………………我反复比较两次操作的不同,修改 memory config添加BOOT段,添加boot.asm引导汇编程序,制作hexconv.cmd,一切的一切都是一样的,可是结果却是不同,于是,又是长时 间的毫无头续。
七,到这里已经一周过去了。并且接下来的几天,事情没有任何进展,我发现问题可能是由于我们的工程太大了导致的。于是查阅相关资料,发现很多人 碰到过同样的问题。但是没有解决问题的人回答过。我于是重新求助合众达,求助苏工,求助张金龙,事情毫无进展,所有人似乎都没碰到过这个问题。这时 SEED的楼工给了我一个hint,可能是由于多页烧写,他给了我一个flashburn多页烧写的boot.asm,结果还是没有成功。
八,张金龙和楼工这时都建议我采用另外编写工程,在线烧写的方式。我甚至已经准备好了这个工程,通过比较hex文件和flash内内容,证明已 经能够正确地烧写各个数据段到flash了。但是,各个数据段在flash中的组织格式很麻烦,我研究了两天没有结果。同时,又有了其他方面的新的启发。 张金龙给我的第二个hint,发现我的hex文件已经达到了12M,而flash只有4M,就算分页成功了也无济于事。于是我开始怀疑 hexconv.cmd的正确性,最终,去掉了-image这个选项,hex文件大小降到490K,小于flash一页512K的大小。也就是说,根本不 用考虑分页的问题了。
九,即使到了这里,我明确的感觉到似乎快要成功了,但是却依然没有头续,究竟是哪里出错了呢?合众达技术支持的最大的牛,SEED技术论坛的元 老级人物楼工页没有办法了。他答应给我联系SEED的研发人员,见面解决看看这个问题。而我,在这个等待的过程中,漫无目的地进行这其他的尝试
十,某夜,我将一个中等的采集程序的Config程序进行烧写,它也包括了CMOS的采集部分,只是没有后续处理。发现这个程序可以自启动到 main函数!这对我来说,不叱为一个巨大的鼓舞。我开始比较Config和最大工程evmdm642这两个cdb文件,即DSP/BIOS配置文件。有 两个不同,一个是添加了vcap的task,另一个是添加了硬件中断HWI,我于是试着将这两个东西以各种组合加到原来的cdb上,无果。
final,12月19日,一日没有什么结果,与SEED的研发见面时