⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hw_basic.c

📁 FPGA、CPLD芯片的usb数据下载线
💻 C
字号:
/*----------------------------------------------------------------------------- * Hardware-dependent code for usb_jtag *----------------------------------------------------------------------------- * Copyright (C) 2007 Kolja Waschk, ixo.de *----------------------------------------------------------------------------- * This code is part of usbjtag. usbjtag is free software; you can redistribute * it and/or modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the License, * or (at your option) any later version. usbjtag is distributed in the hope * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details.  You should have received a * copy of the GNU General Public License along with this program in the file * COPYING; if not, write to the Free Software Foundation, Inc., 51 Franklin * St, Fifth Floor, Boston, MA  02110-1301  USA *----------------------------------------------------------------------------- */#include <fx2regs.h>#include "hardware.h"#include "delay.h"//-----------------------------------------------------------------------------#define HAVE_PS_MODE 1#define HAVE_AS_MODE 1#define HAVE_OE_LED  1//-----------------------------------------------------------------------------/* JTAG TCK, AS/PS DCLK */sbit at 0xA2          TCK; /* Port C.0 */#define bmTCKOE       bmBIT2#define SetTCK(x)     do{TCK=(x);}while(0)/* JTAG TDI, AS ASDI, PS DATA0 */sbit at 0xA0          TDI; /* Port C.2 */#define bmTDIOE       bmBIT0#define SetTDI(x)     do{TDI=(x);}while(0)/* JTAG TMS, AS/PS nCONFIG */sbit at 0xA3          TMS; /* Port C.3 */#define bmTMSOE       bmBIT3#define SetTMS(x)     do{TMS=(x);}while(0)/* JTAG TDO, AS/PS CONF_DONE */sbit at 0xA1          TDO; /* Port C.1 */#define bmTDOOE       bmBIT1#define GetTDO(x)     TDO//-----------------------------------------------------------------------------#if defined(HAVE_PS_MODE) || defined(HAVE_AS_MODE)  /* AS DATAOUT, PS nSTATUS */  sbit at 0xA6        ASDO; /* Port C.6 */  #define bmASDOOE    bmBIT6  #define GetASDO(x)  ASDO#else  #define bmASDOOE    0  #define GetASDO(x)  0#endif//-----------------------------------------------------------------------------#if defined(HAVE_AS_MODE)  /* AS Mode nCS */  sbit at 0xA4        NCS; /* Port C.4 */  #define bmNCSOE     bmBIT4  #define SetNCS(x)   do{NCS=(x);}while(0)  #define GetNCS(x)   NCS  /* AS Mode nCE */  sbit at 0xA5        NCE; /* Port C.5 */  #define bmNCEOE     bmBIT5  #define SetNCE(x)   do{NCE=(x);}while(0)  unsigned char ProgIO_ShiftInOut_AS(unsigned char x);#else  #define bmNCSOE     0  #define SetNCS(x)   while(0){}  #define GetNCS(x)   1  #define bmNCEOE     0  #define SetNCE(x)   while(0){}  #define ProgIO_ShiftInOut_AS(x) ProgIO_ShiftInOut(x)#endif//-----------------------------------------------------------------------------#ifdef HAVE_OE_LED  sbit at 0xA7        OELED; /* Port C.7 */  #define bmOELEDOE   bmBIT7  #define SetOELED(x) do{OELED=(x);}while(0)#else  #define bmOELEDOE   0  #define SetOELED(x) while(0){}#endif//-----------------------------------------------------------------------------#define bmPROGOUTOE (bmTCKOE|bmTDIOE|bmTMSOE|bmNCEOE|bmNCSOE|bmOELEDOE)#define bmPROGINOE  (bmTDOOE|bmASDOOE)//-----------------------------------------------------------------------------void ProgIO_Poll(void)    {}// These aren't called anywhere in usbjtag.c, but I plan to do so...void ProgIO_Enable(void)  {}void ProgIO_Disable(void) {}void ProgIO_Deinit(void)  {}void ProgIO_Init(void){  /* The following code depends on your actual circuit design.     Make required changes _before_ you try the code! */  // set the CPU clock to 48MHz, enable clock output to FPGA  CPUCS = bmCLKOE | bmCLKSPD1;  // Use internal 48 MHz, enable output, use "Port" mode for all pins  IFCONFIG = bmIFCLKSRC | bm3048MHZ | bmIFCLKOE;  // power on the onboard FPGA and all other VCCs, de-assert RESETN  IOE = 0x1F;  OEE = 0x1F;  mdelay(500); // wait for supply to come up  // TDO input, others output  OEC=(OEC&~bmPROGINOE) | bmPROGOUTOE;}void ProgIO_Set_State(unsigned char d){  /* Set state of output pins:   *   * d.0 => TCK   * d.1 => TMS   * d.2 => nCE (only #ifdef HAVE_AS_MODE)   * d.3 => nCS (only #ifdef HAVE_AS_MODE)   * d.4 => TDI   * d.6 => LED / Output Enable   */  SetTCK((d & bmBIT0) ? 1 : 0);  SetTMS((d & bmBIT1) ? 1 : 0);#ifdef HAVE_AS_MODE  SetNCE((d & bmBIT2) ? 1 : 0);  SetNCS((d & bmBIT3) ? 1 : 0);#endif  SetTDI((d & bmBIT4) ? 1 : 0);#ifdef HAVE_OE_LED  SetOELED((d & bmBIT5) ? 1 : 0);#endif}unsigned char ProgIO_Set_Get_State(unsigned char d){  ProgIO_Set_State(d);  /* Read state of input pins:   *   * TDO => d.0   * DATAOUT => d.1 (only #ifdef HAVE_AS_MODE)   */   return (GetASDO()<<1)|GetTDO();}//-----------------------------------------------------------------------------void ProgIO_ShiftOut(unsigned char c){  /* Shift out byte C:    *   * 8x {   *   Output least significant bit on TDI   *   Raise TCK   *   Shift c right   *   Lower TCK   * }   */   (void)c; /* argument passed in DPL */  _asm        MOV  A,DPL        ;; Bit0        RRC  A        MOV  _TDI,C        SETB _TCK        ;; Bit1        RRC  A        CLR  _TCK        MOV  _TDI,C        SETB _TCK        ;; Bit2        RRC  A        CLR  _TCK        MOV  _TDI,C        SETB _TCK        ;; Bit3        RRC  A        CLR  _TCK        MOV  _TDI,C        SETB _TCK        ;; Bit4        RRC  A        CLR  _TCK        MOV  _TDI,C        SETB _TCK        ;; Bit5        RRC  A        CLR  _TCK        MOV  _TDI,C        SETB _TCK        ;; Bit6        RRC  A        CLR  _TCK        MOV  _TDI,C        SETB _TCK        ;; Bit7        RRC  A        CLR  _TCK        MOV  _TDI,C        SETB _TCK        NOP         CLR  _TCK        ret  _endasm;}/*;; For ShiftInOut, the timing is a little more;; critical because we have to read _TDO/shift/set _TDI;; when _TCK is low. But 20% duty cycle at 48/4/5 MHz;; is just like 50% at 6 Mhz, and that's still acceptable*/#if HAVE_AS_MODEunsigned char ProgIO_ShiftInOut_JTAG(unsigned char c);unsigned char ProgIO_ShiftInOut_AS(unsigned char c);unsigned char ProgIO_ShiftInOut(unsigned char c){  if(GetNCS(x)) return ProgIO_ShiftInOut_JTAG(c);  return ProgIO_ShiftInOut_AS(c);}#else /* HAVE_AS_MODE */#define ProgIO_ShiftInOut_JTAG(x) ProgIO_ShiftInOut(x)#endifunsigned char ProgIO_ShiftInOut_JTAG(unsigned char c){  /* Shift out byte C, shift in from TDO:   *   * 8x {   *   Read carry from TDO   *   Output least significant bit on TDI   *   Raise TCK   *   Shift c right, append carry (TDO) at left   *   Lower TCK   * }   * Return c.   */   (void)c; /* argument passed in DPL */  _asm        MOV  A,DPL        ;; Bit0        MOV  C,_TDO        RRC  A        MOV  _TDI,C        SETB _TCK        CLR  _TCK        ;; Bit1        MOV  C,_TDO        RRC  A        MOV  _TDI,C        SETB _TCK        CLR  _TCK        ;; Bit2        MOV  C,_TDO        RRC  A        MOV  _TDI,C        SETB _TCK        CLR  _TCK        ;; Bit3        MOV  C,_TDO        RRC  A        MOV  _TDI,C        SETB _TCK        CLR  _TCK        ;; Bit4        MOV  C,_TDO        RRC  A        MOV  _TDI,C        SETB _TCK        CLR  _TCK        ;; Bit5        MOV  C,_TDO        RRC  A        MOV  _TDI,C        SETB _TCK        CLR  _TCK        ;; Bit6        MOV  C,_TDO        RRC  A        MOV  _TDI,C        SETB _TCK        CLR  _TCK        ;; Bit7        MOV  C,_TDO        RRC  A        MOV  _TDI,C        SETB _TCK        CLR  _TCK        MOV  DPL,A        ret  _endasm;  /* return value in DPL */  return c;}#ifdef HAVE_AS_MODEunsigned char ProgIO_ShiftInOut_AS(unsigned char c){  /* Shift out byte C, shift in from TDO:   *   * 8x {   *   Read carry from TDO   *   Output least significant bit on TDI   *   Raise TCK   *   Shift c right, append carry (TDO) at left   *   Lower TCK   * }   * Return c.   */  (void)c; /* argument passed in DPL */  _asm        MOV  A,DPL        ;; Bit0        MOV  C,_ASDO        RRC  A        MOV  _TDI,C        SETB _TCK        CLR  _TCK        ;; Bit1        MOV  C,_ASDO        RRC  A        MOV  _TDI,C        SETB _TCK        CLR  _TCK        ;; Bit2        MOV  C,_ASDO        RRC  A        MOV  _TDI,C        SETB _TCK        CLR  _TCK        ;; Bit3        MOV  C,_ASDO        RRC  A        MOV  _TDI,C        SETB _TCK        CLR  _TCK        ;; Bit4        MOV  C,_ASDO        RRC  A        MOV  _TDI,C        SETB _TCK        CLR  _TCK        ;; Bit5        MOV  C,_ASDO        RRC  A        MOV  _TDI,C        SETB _TCK        CLR  _TCK        ;; Bit6        MOV  C,_ASDO        RRC  A        MOV  _TDI,C        SETB _TCK        CLR  _TCK        ;; Bit7        MOV  C,_ASDO        RRC  A        MOV  _TDI,C        SETB _TCK        CLR  _TCK        MOV  DPL,A        ret  _endasm;  return c;}#endif /* HAVE_AS_MODE */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -