【68013】slave-fifo模式的固件结构
世界Skill
在这一篇文章中,博主将对正在使用的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。
其他
剩下的还有一些像是头文件、数据段定义等等,不用自己关心,最好不要修改。