没有合适的资源?快使用搜索试试~ 我知道了~
首页EZ-USB FX2(68013)固件研究
资源详情
资源评论
资源推荐

EZ-USB FX2(68013)固件研究(1)——Cypress 固件架构彻底解析
算是给所有正在学习 还徘徊着不得其门而入的朋友一个入门的契机吧,我也深知入门的
痛苦,有些人入门就是抱着那什么 协议,包定义,帧格式。。。。。。啃来啃去的,结果啃
不出个所以然来。
依我的经验来看,协议方面的东东,随便找本书,过一遍就行了;然后,你的终点应该放在你
如何来写第一个成功的 固件;而要写 固件,那么了解 固件架构是必要的,也
是重中之重;再然后,等你积累了一些端点,控制,,中断传输, 等等的经
验后,再 回过头去看协议方面的内容,就会有更加深刻的体会了;然后,你就可以试着更改
。 文件了——这个时候你就是高手了。
【1】:首先,还是说下工具吧!
:你要有一块 的 板子,淘宝随便买块好了,还送不少资料。
:要准备开发工具,去 官网下一个 的开发包,全称:
!"#$%&'(')*"
网址:+'',--...**$%-/01
*安装开发包。工具就是 22$&$ 了。怎么用不用我说了吧,这偏文章主题是
固件架构*
【】好了,进入主题,固件架构(汗--!好多废话)。以一个 3684 开发包自带的例子讲解。
(1) 进入目录(个人找自己的):0,3$4%2(3335"%3673
$$,
(2)到 0,3$4%2(33384' 文件价下把 头文件
"*+,!"4*+,&#*+ 这三个头文件拷到 $$ 文件夹里。
(3)( 设置 $'' 里关掉 9&22$4%2:(前面的勾去掉)(别说不会用
(。。。)
(4)检查 (2) 文件路径是否正确。(如果你的 ( 是直接装载 ,3;(。。下,那不会有错
误,否则,自行设置正确的路径。)
【】现在可以打开 bulkloop 工程并编译链接正确了。
在工程下,有以下几个文件:
其中,<%*<5=*7 基本上是每个工程都要添加的,是一些中断向量表,5= 的
函数库等等,不用管它们。
现在重点看前面三个文件:
(1)fw.c,这个文件是整个 的固件根本((% 的缩写), 协议方面的通信都是
在这里完成的,包括上电枚举,重枚举,唤醒以及调用用户自己的程序和控制命令等等。基本上,
如非必要,尽量不要动这个文件的内容,也不要在里面书写你自己的任何代码。
(2)bulkllop.c,这个就是用户自己的代码书写文件(原始名称:(+*)。我们所有的代码
都在这个文件里书写。 已经给我们搭好了架构。
void TD_Init(void):这个函数只会在 启动后调用一次。在这个函数里添加你自己的初始
化代码,也就是传输数据前要处理的,例如 口配置,时钟,端点, 的选择等等。
我们看 $$ 的初始化,它在 的 (&,$' 传输启动前进行了哪些初始化:
时钟频率, 工作模式选择,端点选择,端点传输方向, 大小的配置等等。
void TD_Poll(void):$ 中文意思调度,这个函数就是用户调度程序, 会在空闲的时候
反复调用该函数,所以我们把自己需要反复执行的代码放在这里。例如在 $$ 里,它就实现
了反复从端点 接收上位机数据然后传给端点 ,再从端点 传给上位机(, 端点一样)。
BOOL DR_VendorCmnd(void):这个函数就是自定义命令代码的书写处。我们的 >&#$
命令都会写在这里,!.* 固件会自动调用我们的代码。

void ISR_Ep0in(void) interrupt 0~void ISR_Ep8inout(void) interrupt 0:这几
个函数是当使用端点中断传输时,中断代码的书写处,很少用。
以上,是经常会用到的几个函数;其他,基本不常用。
(3)dscr.51,这个文件是 描述符文件,包括了设备描述符,接口描述符,端点描述符,字
符串等等。里面的英文都注释得很详细了,我就不多做介绍了,刚开始入门的时候,这个文件也
不必改动。
【】然后说下几个包含文件:
有这几个:
(1):fx2.h,预定义,宏及函数声明
(2):fx2regs.h, 的寄存器地址定义。
(3):syncdly.h:同步延时。在其他文件里经常调用的一个函数 ?@057A? 就是这里定义
的。
(4):intrins.h,) 一些数据类型及函数定义。
好了,就写到这里,搞懂每个文件的作用非常非常重要,这样你就可以知道自己的代码书写
在什么地方,遇到不明的函数,定义可以到指定的位置查询,或者想修改某个设置(例如想把端
点 设成 @端点 设成 $'),知道到哪个文件里去修改。
EZ-USB FX2(68013)固件研究(2)——bulkloop 例子
入门的第一个例子,肯定是 $$ 了,装好驱动,开发包后,在开发包
下****335"%3673$$ 就是 $$ 例子。
我之所以从 $ 开始说,也是深有体会的。想当初刚开始学 的时候,抱着协议闷头
看楞是看不出个所以然,后来从例子开始学,才慢慢搞懂了 ,说实话我到现在对 协议类
的东西还是一知半解,不过并不妨碍我进行 的开发不是,所以说, 的固件架构是个
好东东,我们可以偷懒了。开发包里例子是基于 的一块开发板的,我想很少有人能弄到
吧,而 $$ 就简单了,什么外围都不需要,一块 ,加个 $&$2(&'! 就可
以看到效果了。可以说,看懂了 $$, 也就算正式入门了,剩下的要做的就是触类旁通,
然后再不停的回过头去看 协议,就会恍然大悟“然来是这样”。
首先,看 $$ 文件夹下的 #%*'"' 文件,告诉我们这个固件主要实现的功能。
数据从 58BC5@2从端点 2$' 缓冲区到端点 的 (& 缓冲区。数据流向为:
◆PC 端(console 软件)设定要传输的数据
◆PC 端发起端点 2out 传输,数据到达 68013 端点 2 的 out 缓冲区
◆bulkloop 固件查询到端点 2 的 out 缓冲区有数据,于是将数据发往端点 6 的 IN 缓冲区
◆PC 端发起端点 6 IN 传输,于是 68013 的端点 6 IN 缓冲区中的数据被读到 PC 机显示
这就是整个 $$ 过程,5BC5 同理。
然后看固件,看一个固件总是从 80&('DE开始的:
CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1);
IFCONFIG |= 0x40;
:#F&2%7;022222D%82G2%8E
:#F&2%7;02222%8
这两句设定 工作状态以及端口的工作模式。bmCLKSPD,bmCLKSPD1 是一个预定
义,在 6*H 文件中有定义,;( 应该都会用的,直接 4$2'$2#F&('($&***跳到定义处查看;至
于语法,使用了与或操作,用来进行位操作,置 或清 ,编程语言中常用的技巧, 语言不要太
差哦~然后寄存器每位的意义,我们在 89I 中可以查到,这两句告诉我们:设定 68013 CPU
时钟为 48M,端口工作模式为普通的 IO 口。

EP1OUTCFG = 0xA0;
EP1INCFG = 0xA0;
SYNCDELAY; // see TRM section 15.14
EP2CFG = 0xA2;
SYNCDELAY;
EP4CFG = 0xA0;
SYNCDELAY;
EP6CFG = 0xE2;
SYNCDELAY;
EP8CFG = 0xE0;
这几行代码进行端点的配置 55 为 $' 端点,)J 缓冲;55 为 (& 端点,
)J 缓冲。
例如 516A12看 89I 对该寄存器的解释,KD第 位E=-该端点有
效;1该端点为 $' 传输;)1该端点进行 传 输;1端点为 ) 缓冲;
1只读;1该端点缓冲区倍率为双重,即 )J*其他同理。
SYNCDELAY;
EP2BCL = 0x80; // arm EP2OUT by writing byte count w/skip.
SYNCDELAY;
EP2BCL = 0x80;
SYNCDELAY;
EP4BCL = 0x80; // arm EP4OUT by writing byte count w/skip.
SYNCDELAY;
EP4BCL = 0x80;
这段代码对端点计数器进行初始化,注意这里两个端点都写了两次,那是因为我们设置的端
点缓冲为 )J,假如缓冲倍率为 ,即 )J 的话,那么这里初始化要写 次。
// enable dual autopointer feature
AUTOPTRSETUP |= 0x01;
这端代码告诉我们可以使用自动指针,也就是 A889H" 两个自动指针,这两个自动指针
使用方便,可以自动指向端点缓冲区。
然后是 8077DEL在这里处理相关数据传送, 在空闲的时候会自动调用这里面的代码。
WORD i;
WORD count;
if(!(EP2468STAT & bmEP2EMPTY))
{ // 检查 EP2468STAT(SFR)中的 EP2 EMPTY(busy)位,当 FIFO 为空时内核置位此位。
if(!(EP2468STAT & bmEP6FULL))
{ // 检查 EP2468STAT(SFR)中的 EP6 FULL(busy)位,当 FIFO 为满时内核置位此位。
首先,查询端点 的 5I8? 标志,如果不为 ,说明有数据,然后查询端点 的 77 标志,
如果不为 ,说明端点 2 为空,可以接收数据。至于 %55I8?,%577,自行
4$2'$2#F&('($&***
当检查到端点 2$'2F!$ 有数据且端点 2(&2F!$ 为空时,就可以将 的数据M$M到
*使用自动指针直接更换 者的指针,实现数据传送:
!2A89H2222212"NAL2--2$#2&%
!2A8972222212"NL2--2$#2&%
!2A889H2222212"NAL
!2A88972222212"NL
!2A889H2222212"N0L
!2A88972222212"N5L
APTR1H = MSB( &EP2FIFOBUF ); //取端点 2 FIFO 指针
APTR1L = LSB( &EP2FIFOBUF );
剩余13页未读,继续阅读














安全验证
文档复制为VIP权益,开通VIP直接复制

评论1