Window XP驱动开发(十七) 芯片固件程序设计 (代码实现,针对USB2.0 芯片CY7C68013A)

转载引用于 http://blog.csdn.net/chenyujing1234

 一、固件的修改

修改是基于CYPRESS官方提供的固件工程Bulkloop基础上。(获得方法参考http://blog.csdn.net/chenyujing1234/article/details/7622901

1、修改VID、PID
1、1   修改hex文件中的VID与PID

在固件工程下的dscr.a51文件中修改。

1、2  修改EEPROM中的VID、PID

Hex2bix.exe(具体源码自己查看http://download.csdn.net/detail/chenyujing1234/4423966)把hex文件转为iic文件时加入了VID与PID。

其中IIC_Hdr结构体中存放默认的VID、PID:    IIC_HDR IIC_Hdr = { 0xB2, 0x0547, 0x2131, 0x0000, 0x04, 0x00 };(VID: 4750  PID: 3121)

解释VID、PID高低字节反掉的原因:

在 x86 系统中,低位地址存放的是低位字节,高位地址存放的是高位字节。比如一个short 型的变量0x0102,内存中存放位置是02 01,02 在低地址,01 在高地址。
USB总线上的传输顺序是先低地址,再高地址,也就是02 01。到达 FX2 后的接收顺序是从低地址到高地址顺序存储,这样02 在低地址,01 在高地址。

而 8051 的变量是低地址存放的是高位字节,高地址存放的是低位字节,这样02 01 所表示的变量就变成了0x0201 的unsigned short型的变量。

下面是Hex2bix.exe的部分源码:

  1. case FT_IIC:  
  2.          {  
  3.             switch (IIC_Hdr.prom_type)  
  4.             {  
  5.             case 0xB0:                       // EZ-USB  
  6.             case 0xB2:  
  7.                 fwrite(&IIC_Hdr,7,1,file);    // Write type, VID, PID, DID (7 bytes)  
  8.                     bytes = 7;  
  9.                break;  
  10.             case 0xB4:                       // EZ-USB FX  
  11.             case 0xB6:  
  12.                 fwrite(&IIC_Hdr,9,1,file);    // Write type, VID, PID, DID, Config (9 bytes)  
  13.                     bytes = 9;  
  14.                break;  
  15.             case 0xC0:                       // EZ-USB FX2  
  16.             case 0xC2:  
  17.                 fwrite(&IIC_Hdr,8,1,file);    // Write type, VID, PID, DID, Config (8 bytes)  
  18.                     bytes = 8;  
  19.                break;  
  20.             default:  
  21.                Error(ERR_UNRECOGNIZED_FIRSTBYTE);  
  22.             }  
  23.          }  


 

当然此结构体中的VID、PID字段可以通过Hex2bix.exe 的命令行指定。

 

根据CY7C68中的要求,我们会在iic文件中的第一个字节中放C2 ,第二三放VID,第四五放PID

得到的iic文件头如下:

 

2、设计成Slave FIFO模式。

根据 <<http://blog.csdn.net/chenyujing1234/article/details/7604266>>对我的系统的设计,把CY7C68配置成Slave FIFO模式。

2、1  配置端点

根据与FPGA的约定我决定只使用两个端点:

把端点2配置成OUT,BULK类型;把端点6配置成IN,BULK类型。

在固件工程中的dscr.a51中定义了两种类型的配置描述符:HighSpeedConfigDscr和FullSpeedConfigDscr。(两种类型的设备类似,这里只以HighSpeedConfigDscr为例)

每种类型都含有两种节点: 接口描述、端点描述

(1)因为我们只用到端点2和端点6两个端点,把以我们把接口描述中的Number of end points设置为2。

  1. ;; Interface Descriptor  
  2.       db   DSCR_INTRFC_LEN      ;; Descriptor length  
  3.       db   DSCR_INTRFC         ;; Descriptor type  
  4.       db   0               ;; Zero-based index of this interface  
  5.       db   0               ;; Alternate setting  
  6.       db   2               ;; Number of end points   
  7.       db   0ffH            ;; Interface class  
  8.       db   00H               ;; Interface sub class  
  9.       db   00H               ;; Interface sub sub class  
  10.       db   0               ;; Interface descriptor string index  

(2)然后再修改端点

解释上图:

db 02H: 2表示是端点2,0表示是OUT方向;

db 86H: 6表示是端点6,8表示是INT方向。

2、2 修改void TD_Init(void)函数

 

  1. void TD_Init(void)    // Called once at startup  
  2. {  
  3.         CPUCS = 0x10;   // 0001 0000  
  4.                     // Bit      Value   Register    Function  
  5.                     // bit.7    0       reserved  
  6.                     // bit.6    0       reserved  
  7.                     // bit.5    0       PORTCSTB    PortC access generates /RD & /WR strobes  
  8.                     // bit.4:3  10      CLKSPD[1:0] 00 : 12M Hz (Default)  
  9.                     //                              01 : 24M Hz  
  10.                     //                              10 : 48M Hz  
  11.                     //                              11 : Reserved  
  12.                     // bit.2    0       CLKINV      0  : CLKOUT signal not inverted  
  13.                     //                              1  : CLKOUT signal inverted  
  14.                     // bit.1    0       CLKOE       0  : CLKOUT pin floats  
  15.                     //                              1  : CLKOUT pin driven  
  16.                     // bit.0    0       reserved  
  17.   
  18.     IFCONFIG = 0x43;// 0100 0011  
  19.                     // Bit      Value   Register    Function  
  20.                     // bit.7    0       IFCLKSRC    0  : External clock on the IFCLK pin  
  21.                     //                              1  : Internal 30 or 48MHz (default)  
  22.                     // bit.6    1       3048MHZ     0  : 30M Hz  
  23.                     //                              1  : 48M Hz  
  24.                     // bit.5    0       IFCLKOE     0  : Tri-state  
  25.                     //                              1  : Drive  
  26.                     // bit.4    0       IFCLKOL     0  : clock not inverted  
  27.                     //                              1  : clock is inverted  
  28.                     // bit.3    0       ASYNC       0  : FIFO/GPIF operate synchronously  
  29.                     //                              1  : FIFO/GPIF operate asynchronously  
  30.                     // bit.4    0       GSTATE      1  : GPIF states, Port E Alternate Functions.  
  31.                     //                                   PE0 GSTATE[0]  
  32.                     //                                   PE1 GSTATE[1]  
  33.                     //                                   PE2 GSTATE[2]  
  34.                     // bit.1:0  11      IFCFG[1:0]  00 : Ports  
  35.                     //                              01 : Reserved  
  36.                     //                              10 : GPIF Interface (internal master)  
  37.                     //                              11 : Slave FIFO Interface(external master)  
  38.     SYNCDELAY;  
  39.       
  40.     EP6CFG = 0xE8;  // 1110 1000, (Size = 1024, buf = Quad (Buf x4), BULK)  
  41.                     // Bit      Value   Register    Function  
  42.                     // bit.7    1       VALID       0  : Does not respond to any USB traffic.  
  43.                     //                              1  : Activate an endpoint(default)  
  44.                     // bit.6    1       DIR         0  : OUT  
  45.                     //                              1  : IN  
  46.                     // bit.5:4  10      TYPE[1:0]   0  : Invalid  
  47.                     //                              01 : ISOCHRONOUS  
  48.                     //                              10 : BULK (default)  
  49.                     //                              11 : INTERRUPT  
  50.                     // bit.3    1       SIZE        0  : 512 bytes  
  51.                     //                              1  : 1024 bytes  
  52.                     // bit.2    0       reserved  
  53.                     // bit.1:0  0       BUF[1:0]    00 : Quad  
  54.                     //                              01 : Invalid  
  55.                     //                              10 : Double  
  56.                     //                              11 : Triple  
  57.     SYNCDELAY;  
  58.   
  59.     EP4CFG = 0x7F;      SYNCDELAY;  // EP4 not valid  
  60.     EP2CFG = 0x7F;      SYNCDELAY;  // EP2 not valid  
  61.     EP8CFG = 0x7F;      SYNCDELAY;  // EP8 not valid  
  62.   
  63.     FIFORESET = 0x80;               // activate NAK-ALL to avoid race conditions  
  64.     SYNCDELAY;                      // see TRM section 15.14  
  65.   
  66.     FIFORESET = 0x02;   SYNCDELAY;  // reset, FIFO 2  
  67.     FIFORESET = 0x04;   SYNCDELAY;  // reset, FIFO 4  
  68.     FIFORESET = 0x06;   SYNCDELAY;  // reset, FIFO 6  
  69.     FIFORESET = 0x08;   SYNCDELAY;  // reset, FIFO 8  
  70.     FIFORESET = 0x00;   SYNCDELAY;  // deactivate NAK-ALL  
  71.       
  72.     PINFLAGSAB = 0x00;  SYNCDELAY;  // FLAGA - fixed EP2EF, FLAGB - fixed EP4EF  
  73.     PINFLAGSCD = 0x00;  SYNCDELAY;  // FLAGC - fixed EP6FF, FLAGD - fixed EP8FF  
  74.     PORTACFG  |= 0x80;  SYNCDELAY;  // FLAGD, set alt. func. of PA7 pin (alt. func.=alternate functions)  
  75.     FIFOPINPOLAR = 0x00;SYNCDELAY;  // all signals active low  
  76.   
  77.     EP6FIFOCFG = 0x0C;  SYNCDELAY;  // AUTOIN=1, ZEROLENIN=1, WORDWIDE=0  
  78. }  


 

2、3   修改void TD_Init(void)Bug(Time:2012-07-28)

2、3、1、Bug描述

从端点6可以读到FPGA送过来的数据,可是我写到端点2的数据FPGA却收不到;调试现象为:

第一次写端点2是成功的,第二次写就失败了。

2、3、2、解决方法分析

一开始以为是FPGA读时序有问题,可是FPGA工程师坚信没有问题;

后来从网上 http://bbs.ednchina.com/BLOG_ARTICLE_192827.HTM 得到启发,是因为没有对PINFLAGSAB、PINFLAGSCD进行配置。

(1)当autoout=1时,主机和外部设备直接连接,68013的8051失效,此时外部设备是master,也就是说读写时序要有外部设备产 生,你不能向68013写数据是不可能的,原则上说你至少可以写两个512的数据进去,然后就写不下去了,我验证过了确实是这样。
(2)如果你没有专门的设定相关寄存器,所有的标志默认的都是低有效的,所以应该是0是full,1是not full!
(3)FLAGB is EP2EF , FLAGA is EP2FF

          FLAGD is EP6EF,   FLAGC is EP6FF

2、3、3、解决方法
  1. void TD_Init(void)             // Called once at startup  
  2. {  
  3.    // set the CPU clock to 48MHz  
  4.    CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1) ;  
  5.   
  6.    // set the slave FIFO interface to 48MHz  
  7.   // IFCONFIG |= 0x40;  
  8.    IFCONFIG = 0x43;// 0100 0011  
  9.   
  10.   // Registers which require a synchronization delay, see section 15.14  
  11.   // FIFORESET        FIFOPINPOLAR  
  12.   // INPKTEND         OUTPKTEND  
  13.   // EPxBCH:L         REVCTL  
  14.   // GPIFTCB3         GPIFTCB2  
  15.   // GPIFTCB1         GPIFTCB0  
  16.   // EPxFIFOPFH:L     EPxAUTOINLENH:L  
  17.   // EPxFIFOCFG       EPxGPIFFLGSEL  
  18.   // PINFLAGSxx       EPxFIFOIRQ  
  19.   // EPxFIFOIE        GPIFIRQ  
  20.   // GPIFIE           GPIFADRH:L  
  21.   // UDMACRCH:L       EPxGPIFTRIG  
  22.   // GPIFTRIG  
  23.     
  24.   // Note: The pre-REVE EPxGPIFTCH/L register are affected, as well...  
  25.   //      ...these have been replaced by GPIFTC[B3:B0] registers  
  26.   
  27.   // default: all endpoints have their VALID bit set  
  28.   // default: TYPE1 = 1 and TYPE0 = 0 --> BULK    
  29.   // default: EP2 and EP4 DIR bits are 0 (OUT direction)  
  30.   // default: EP6 and EP8 DIR bits are 1 (IN direction)  
  31.   // default: EP2, EP4, EP6, and EP8 are double buffered  
  32.   
  33.   // we are just using the default values, yes this is not necessary...  
  34.   EP1OUTCFG = 0xA0; // 10100000  
  35.   EP1INCFG = 0xA0;  // 10100000  
  36.   
  37.   SYNCDELAY;                    // see TRM section 15.14  
  38.   EP2CFG = 0xA2;   // 1010 0010         
  39.   SYNCDELAY;   
  40.   // chenyujing                     
  41.   //EP4CFG = 0xA0;  
  42.   EP4CFG = 0xA0;  
  43.   SYNCDELAY;                      
  44.   EP6CFG = 0xE2;  // 1110 0010  
  45.   SYNCDELAY;                      
  46.   EP8CFG = 0xE0;    // 1110 1000, (Size = 1024, buf = Quad (Buf x4), BULK)  
  47.     // Bit      Value   Register    Function  
  48.                     // bit.7    1       VALID       0  : Does not respond to any USB traffic.  
  49.                     //                              1  : Activate an endpoint(default)  
  50.                     // bit.6    1       DIR         0  : OUT  
  51.                     //                              1  : IN  
  52.                     // bit.5:4  10      TYPE[1:0]   0  : Invalid  
  53.                     //                              01 : ISOCHRONOUS  
  54.                     //                              10 : BULK (default)  
  55.                     //                              11 : INTERRUPT  
  56.                     // bit.3    1       SIZE        0  : 512 bytes  
  57.                     //                              1  : 1024 bytes  
  58.                     // bit.2    0       reserved  
  59.                     // bit.1:0  0       BUF[1:0]    00 : Quad  
  60.                     //                              01 : Invalid  
  61.                     //                              10 : Double  
  62.                     //                              11 : Triple  
  63.   
  64.  PINFLAGSAB = 0x8c;         // defines FLAGA as prog-level flag, pointed to by FIFOADR[1:0]  
  65.  SYNCDELAY;                 // FLAGB as full flag, as pointed to by FIFOADR[1:0]  
  66.  PINFLAGSCD = 0xae;         // FLAGC as empty flag, as pointed to by FIFOADR[1:0]  
  67.  PORTACFG = 0x80;           // used PA7/FLAGD as a port pin, not as a FIFO flag  
  68.  FIFOPINPOLAR = 0x00;       // set all slave FIFO interface pins as active low  
  69.   
  70.   
  71.   
  72.   // out endpoints do not come up armed  
  73.   EP2FIFOCFG = 0x15;    SYNCDELAY;  // 0001 0101 AUTOOUT=1, ZEROLENIN=1, WORDWIDE=1           
  74.   EP6FIFOCFG = 0x0D;    SYNCDELAY;  // 0000 1101 AUTOIN=1, ZEROLENIN=1, WORDWIDE=1    
  75.                                       //bit.7 0   
  76.                                       //bit.6 INFM1   
  77.                                       //bit.5 OEP1   
  78.                                       //bit.4 AUTOOUT   
  79.                                       //bit.3 AUTOIN   
  80.                                       //bit.2 ZEROLENIN   
  81.                                       //bit.1 0   
  82.                                       //bit.0 WORDWIDE  
  83.   
  84.     
  85.   
  86.   // since the defaults are double buffered we must write dummy byte counts twice  
  87.   SYNCDELAY;                      
  88.   EP2BCL = 0x80;                // arm EP2OUT by writing byte count w/skip.  
  89.   SYNCDELAY;                      
  90.   EP2BCL = 0x80;  
  91.   SYNCDELAY;                      
  92.   //EP4BCL = 0x80;                // arm EP4OUT by writing byte count w/skip.  
  93.   //SYNCDELAY;                      
  94.   //EP4BCL = 0x80;     
  95.   //SYNCDELAY;                      
  96.   EP6BCL = 0x80;                // arm EP4OUT by writing byte count w/skip.  
  97.   SYNCDELAY;                      
  98.   EP6BCL = 0x80;     
  99.   
  100.    SYNCDELAY;  
  101.  FIFORESET = 0x80; // reset all FIFOs  
  102.  SYNCDELAY;  
  103.  FIFORESET = 0x02;  
  104.  SYNCDELAY;  
  105.  FIFORESET = 0x04;  
  106.  SYNCDELAY;  
  107.  FIFORESET = 0x06;  
  108.  SYNCDELAY;  
  109.  FIFORESET = 0x08;  
  110.  SYNCDELAY;  
  111.  FIFORESET = 0x00;  
  112.   
  113.   // enable dual autopointer feature  
  114.   AUTOPTRSETUP |= 0x01;  
  115.   
  116. }  





 

二、测试固件方法

测试就是去读取FPGA写入的数据,但怎么判断FPAG工程师的代码使写入是有效呢?

为了在与FPGA工程师为为什么端点时没数据而争执时,能让FPGA工程师心服口服地知道是自己的问题,我们应该知道在Slave FIFO模式下的写时序图。

1、FPGA端的设计

在开发技术手册上有:

翻译成中文是:

(1)FX2LP接收内部或外部的时钟(IFCLK最大为48MHz);

(2)SLCS#、SLRD、SLWR、SLOE、PKTENT信号作为外部的逻辑;

(3)当用外部时钟时,外部时钟必须在用IFCLKSRC bit转化到外部时钟时表现出来;

(4)每个端点能有byte或word两种方式可选,可通过内部的配置bit来配置;SLOE信号使能被选择的数据;

(5)外部的控制逻辑要保证在写数据到一个slave FIFO时,output enable 信号是不可用的。

 

3、1 Slave FIFO 同步写

写时序图:

包结束触发时序图:

PKTEND能把最后的数据值按时钟输入到FIFOs.

(1)虽然PKTEND的断言没有特殊的要求,但是那里有一个特殊的拐角的条件要满足。

(2)当FIFO被配置成自动模式时,有一个增加的时序要求需要被满足,此时它被要求连续地发送两个包:

一个满包(满被定义作为满足AUTOENLEN寄存器中设置的级别的比特数)被自动提交,随在它后面的是一个short one byte或word包(它们是用PKTEND手动提交的)。

在这种场景中,用户必须确保在最后byte或word被输入到之前的自动提交包后的上升沿后断言PKTEND至少一个时钟周期。

下图表示的就是这样应用场景,其中X表示在IN端点被配置成自动模式时AUTOINLEN寄存器被设置的值。

 


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值