用了gpif模式,该模式,在实现上位机传输command命令方面,具有很好的实用性。不过这个芯片入门时间需要的久一点,开始一头雾水。但对软件整体思路的理解很重要。。根据我的经验,总结如下几步 分享一下,给新接触迷茫的人:
(1) 配置endpoint,这些是基础,是实现具体软件功能的硬件设备(endpoint)的初始化配置。。。。。包括几个寄存器:EPxCFG(配置EPx的缓存大小,个数,以及out还是in),outpktend(清除EPx的缓存,具体解释见芯片说明书),EPxFIFOCFG(配置EPx自动还是手动的commit模式,一般fifo大量数据传输可自动),EPxGPIFFLGSEL(配置在waveform中,终止的flag标志选择,如果不配置,就要配置传输的次数数量,见下(3)),可能还有其它的 但主要是这几个。
这些都是初始化函数TD_INIT里面
(2)配置waveform(就是状态机,及不同状态机情况下 芯片的输出值,从状态0到状态6),这一步,就是实现GPIF模式下(还有一种模式是slavefifo),状态机及不同状态下的ctl和data数据线的输出的配置。通过官方的 GPIF Designer实现,可视化界面 比写c文件简单多了,配置完 输出c文件,一起放到固件文件系统中,和固件c文件一起编译。。。这部分参考芯片说明书, 一目了然;
(3)在td_poll函数中,启动waveform(包括终止waveform过程):waverform一共有四种模式(固定的,每一种模式的启动都不一样,因此 四种waveform可以同时存在,程序知道执行哪个waveform):对于single write和single read,需要往xGPIFSGLDATLX寄存器中写数据,然后启动,waveform执行一次 结束 。。还要循环往寄存器写入,所以写寄存器的逻辑放在td_poll函数文件中;对于fifo write和fifo read,需要往GPIFRIG中写数据,然后启动,至于waveform什么时候结束,要看你是定义了需要传输的字符数 还是定义的是fifo flag满足条件就终止。二者选一个就行。
当然,上面的启动waveform的写操作 需要在某些条件满足情况下(条件语句),比如fifo不是空,有数据需要输出等。
总体是上述三步。。理解了整体思路,在具体操作中 参考芯片说明书操作即可。理解思路和过程就成功了一大半。