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

📄 jtag_operates.cpp

📁 系统通过JTAG接口烧结挂接在LXFXP2 上的s29gl256N的FLASH的代码,
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	reset_jtag();

	id_command();

	extest();
}

/**********************************************************************
* 功      LPT_uninitialization - 系统退出之前
* 函 数参 数:无
* 返  回  值: 无
* 函 数 原形:
* 注      意:
***********************************************************************/
void LPT_uninitialization()
{
	extest();
}

/**********************************************************************
* 功      能:putp - 并口输出信息
* 函 数参 数:无
* 返  回  值: 无
* 函 数 原形:
* 注      意:
**********************************************************************
*一般并口有5个寄存器,如下:
*   --------------------------------------------------------
*   |名  称   | 地址偏移 | 读  写  |大  小 | 功  能        |
*   |------------------------------------------------------|
*   |ecpAFifo | 0x000    | W-R/W   |大小   |地址寄存器     |
*   |------------------------------------------------------|
*   |dsr      | 0x001    | R       |字节   |状态寄存器     |
*   |------------------------------------------------------|
*   |dcr      | 0x002    | R/W     |字节   |控制寄存器     | 
*   |------------------------------------------------------|
*   |ecpDFifo | 0x400    | R/W     |双字节 |数据寄存器     |        
*   |------------------------------------------------------|
*   |ecr      | 0x402    | R/W     |字节   |扩展控制寄存器 |
*   |------------------------------------------------------|    
*
* 地址、数据寄存器
*  |------------------------------------------------
*  | 位    | 0  | 1  | 2  | 3  | 4  | 5  | 6  | 7  | 
*  |------------------------------------------------
*  |意义   | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | 
*  |------------------------------------------------
*  |对应脚 |PIN2|PIN3|PIN4|PIN5|PIN6|PIN7|PIN8|PIN9|    
*  |------------------------------------------------
*
* 状态寄存器
*  |--------------------------------------------------------------
*  | 位    | 0  | 1  | 2  | 3   | 4       | 5       | 6   |   7  | 
*  |--------------------------------------------------------------
*  |意义   |保留|保留|IRQ |ERROR|Select IN|Paper Out|ACK  |Busy  | 
*  |--------------------------------------------------------------
*  |对应脚 | 无 | 无 | 无 | P15 |PIN13    |  PIN12  |PIN10|PIN11 |     
*  |--------------------------------------------------------------
***********************************************************************/
int putp(int tdi, int tms, int rp)
{
    // Output pins (LPT driving)
    // LPT D3      Pin 5  and TDI  (bit 3 lptaddress )
    // LPT D2      Pin 4  and TCK  (bit 2 lptaddress )
    // LPT D1      Pin 3  and TMS  (bit 1 lptaddress )
    // LPT D0      Pin 2  and TRST (bit 0 lptaddress )
    //
    // Input pin (S3C4510 board drives)
    // LPT BUSY    Pin 11 and TDO  (bit 7 lptaddress + 1)

    //std jtag pin connect
    //    13         SELECTED         11      TDO  (bit 4 lptaddress + 1)
    //    8          DATA6             5      TDI
    //    4          DATA2             3      nTRT    
    //    3          DATA1             7      TMS
    //    2          DATA0             9      TCK
    
    int tdo = -1;
    int t1,t2;

    t1 = tdi*64+tms*2;
    OUTB(lpt_address, t1);        //TCK low
    
    t1= tdi*64+tms*2+1;
    OUTB(lpt_address, t1);        // TCK high
    
    if(rp == RP)
    {
        OUTB(lpt_address, tdi*64+tms*2);        // TCK low
        t1 = INB(lpt_address + 1);
        t2 = (t1 & 0x10)>>4;
        tdo = t2;  // get TDO data
    }
    
    return tdo;  
}   

/**********************************************************************
* 功      access_rom - 并口读写
* 函 数参 数:无
* 返  回  值: 无
* 函 数 原形:
* 注      意:
**********************************************************************/
WORD access_rom(int rw, DWORD address, WORD data, int rp)  
{  
    return (access_bus(rw, address, data, rp));  
}  

/**********************************************************************
* 功      能:write_command - 并口写
* 函 数参 数:无
* 返  回  值: 无
* 函 数 原形:
* 注      意:
**********************************************************************/
WORD read_command(DWORD addr)  
{       
    access_rom(READ, addr, 0, IP);  //相当于写地址
    return (WORD)(access_rom(READ, addr, 0 , RP)); //相当于读数据    
}  

/**********************************************************************
* 功      能:write_command - 并口写
* 函 数参 数:无
* 返  回  值: 无
* 函 数 原形:
* 注      意:
**********************************************************************/
int write_command(DWORD addr, WORD command)  
{  
    access_rom(SETUP, addr, command, IP);   
    access_rom(WRITE, addr, command, IP);  
    access_rom(HOLD,  addr, command, IP); 
     
    return 0;  
}  

/*********************************************************************
*该函数是否能够保证操作的时序需要确认(刘文龙)
*********************************************************************/
/**********************************************************************
* 功      能:access_bus - 访问ROM对应的总线
* 函 数参 数:无
* 返  回  值: 无
* 函 数 原形:
* 注      意:
**********************************************************************/  
WORD access_bus(int rw, DWORD address, WORD data, int rp)  
{  
    int out_dat[LXFXP25E208_CHAIN_LENGTH], i;
    DWORD li=0;
	WORD busdat = 0;
    	
    // Preset SA-1110 pins to default values (all others set in sa1110jtag.h)   
	// enable pin for nCS0, nOE, nWE. 
    pin[CPU_FALSH_CS_ENB]   = 1;    
    pin[CPU_FALSH_RD_ENB]   = 1;    
    pin[CPU_FALSH_WE_ENB]   = 1;

    pin[CPU_FALSH_CS]       = 1;    
    pin[CPU_FALSH_RD]       = 0;    
    pin[CPU_FALSH_WE]       = 1;

    //设置地址开始
    pin[addresspin[0]]      = 0;    //两个字节对齐
    pin[addresspin_enb[0]]  = 1;    //两个字节对齐
    
    for(i=0; i<CPU_ADDRESS_BITS_NUMBERS; i++)
    {
        pin[addresspin[i]]      = (int)((address >> i) & 1);  
        pin[addresspin_enb[i]]  = (int)(1);                 
    } 
    
    for(i=0; i<CPU_DATA_BITS_NUMBERS; i++)
    {
        pin[datapin_enb[li]] = (int)(0L);  				  // serialize data pins                
    }
    
    if(rw == READ)  
    {  
	    for(i=0; i<CPU_DATA_BITS_NUMBERS; i++)
    	{
        	pin[datapin_enb[li]] = (int)(1L);  			// serialize data pins                
    	}    	
  
	    pin[CPU_FALSH_CS]       = 0;    
    	pin[CPU_FALSH_RD]       = 0;    
    	pin[CPU_FALSH_WE]       = 1;         
    }  
  
    if(rw == WRITE)  
    {  
	    pin[CPU_FALSH_CS]       = 0;    
    	pin[CPU_FALSH_RD]       = 1;    
    	pin[CPU_FALSH_WE]       = 0;    

        // set the data    
        for(li = 0L; li < CPU_DATA_BITS_NUMBERS; li++)    //设置D0-D15
        {
            pin[datapin[li]] = (int)((data >> li) & 1L);      // serialize data pins         
        }             
    }  
    if(rw == SETUP || rw == HOLD)   // just like a write except WE, WE needs setup time   
    {         
	    pin[CPU_FALSH_CS]       = 1;    
    	pin[CPU_FALSH_RD]       = 1;    
    	pin[CPU_FALSH_WE]       = 1;    

        // set the data    
        for(li = 0L; li < CPU_DATA_BITS_NUMBERS; li++)    //设置D0-D15
        {
            pin[datapin[li]] = (int)((data >> li) & 1L);      // serialize data pins         
        }                           
    }  
  
    if(rw == RS)    // setup prior to RD_nWR_OUT   
    {  
        pin[CPU_FALSH_RD] = 1;  
    }  
  
    putp(1,0,IP);   //Run-Test/Idle   
    putp(1,0,IP);   //Run-Test/Idle   
    putp(1,0,IP);   //Run-Test/Idle   
    putp(1,0,IP);   //Run-Test/Idle   
    putp(1,1,IP);   //select DR scan   
    putp(1,0,IP);   //capture DR   
    putp(1,0,IP);   //shift IR   
  
    for(i = 0; i < LXFXP25E208_CHAIN_LENGTH; i++) // shift write data in to JTAG port and read data out   
        out_dat[i] = putp(pin[i],0,rp);  
  
    putp(0,1,IP);   //Exit1-DR   
    putp(1,1,IP);   //Update-DR   
    putp(1,0,IP);   //Run-Test/Idle   
    putp(1,0,IP);   //Run-Test/Idle   
    putp(1,0,IP);   //Run-Test/Idle   
  
    busdat = 0;  
    for(i = 0; i < CPU_DATA_BITS_NUMBERS; i++)  // convert serial data to single WORD   
    {  
        busdat = busdat | (WORD)(out_dat[datapin[i]] << i);  
    }  
    
    extest();  
    
    return (busdat);  
}  

⌨️ 快捷键说明

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