【68013】slave-fifo模式的固件结构

少女dtysky

世界Skill

时刻2014.05.08

在这一篇文章中,博主将对正在使用的slave-fifo模式下68013的固件进行分析,以此来说明68013的固件结构。


FW.c

这个文件中包含Cypress官方默认的一些基本操作(比如电源管理、设备描述符枚举等)。虽然官方不建议自己更改,但在某些情况下我们仍然需要对其进行添加达到一些操作的目的。

1.整体架构:
文件中共包含两个函数定义:

void main(void)  
void SetupCommand(void)

其中第一个函数是固件的主循环,第二个函数的作用是响应控制端口的指令。

2.main函数内部:
此函数中主要通过调用以下函数来实现响应的功能:

TD_Init()

用户自己定义的函数,作用是进行68013的初始化,只在固件上电的时候执行一次。

枚举过程

从初始化结束开始到主循环都是枚举过程,用于USB设备的描述符枚举,也就是PC端的设备识别过程。

while(TRUE){...}

这个是固件执行的主循环,当设备枚举成功正常工作时会一直进行此循环中的内容。

if(GotSUD){ SetupCommand(); GotSUD = FALSE; }

在主循环内,检查是否有从控制端口传来的令牌包,若有,进入响应函数进行处理。

if (Sleep){...}

在主循环内,检查是否有挂起请求,若有,进入挂起模式。

if(TD_Suspend()){...}

在挂起时执行用户定义的挂起操作指令,执行完毕返回后推出挂起。

TD_Poll()

用户自己定义的调度函数,在没有挂起请求或者令牌包的时候不断执行。

3.SetupCommand内部:
该函数用于实现控制端口传来的控制指令。

switch(SETUPDAT[1]){case...}

收到令牌包请求后,读取令牌包数组的第二个元素,来进行对应的操作。
令牌包的内容由上位机定义,具体内容将在后面的教程中给出。
在这个函数内已经有了许多官方默认设定的分支,这些分支中执行函数交由用户定义,已经足够完成一些一般的操作,如果还有其他需求也可自己加入其他分支,但注意分支取值有效区间,68013允许的为0xA0-0xAF以外的所有数据。


slave.c

由于使用的是slave-fifo模式,所以这个用户自定义文件名字设定为此,用户的自定义基本操作都在这里。

1.整体架构:
此文件主要进行初始化函数、用户调度函数以及各种中断、控制请求的处理函数定义。

2.函数详解:

void TD_Init( void )

在此函数中对68013进行初始化,可以参考这里

void TD_Poll( void )

在此函数中加入用户需要在主机空闲时执行的操作,具体执行实际参考上面的分析。

BOOL TD_Suspend( void )

在此函数中加入在挂起模式时执行的操作。

BOOL TD_Resume( void )

在此函数中加入在从挂起中唤醒时执行的操作。

控制指令响应函数

这个会在以后的文章中进行分析。

void ISR_xxxx( void ) interrupt 0

各种中断函数,用于执行响应的中断,具体中断对应请查看EZUSB_TRM


其他

剩下的还有一些像是头文件、数据段定义等等,不用自己关心,最好不要修改。

如果不是自己的创作,少女是会标识出来的,所以要告诉别人是少女写的哦。