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

📄 jtagdlg.cpp

📁 原创
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    S4510_Assert_nGCS(addr);
    S4510_SetPin(nOE,LOW); 
	
    JTAG_ShiftDRStateNoTdo(outCellValue); 
    
    S4510_SetPin(nOE,HIGH);
    S4510_Deassert_nGCS(addr);
	
    JTAG_ShiftDRState(outCellValue,inCellValue); 
	
	return S4510_GetDataByte();
}

int CJtagDlg::NOR_WAITRB(void)
{
	
	// Check if the bit6 toggle ends.	
	/*
	while(1)
	{
	JTAG_ShiftDRState(outCellValue,inCellValue);
	if( S4510_GetPin(GPF6)==HIGH)break;
	}
	*/
    volatile U16 flashStatus,old;
    int temp=0;

	m_program.ShowWindow(TRUE);
	m_program.SetRange32(0,2500);
	m_program.SetPos(temp);	
	old = NOR_RdHW(0x0);
	
    while(1)
	{
		temp++;
		flashStatus = NOR_RdHW(0x0);
		if( (old&0x40) == (flashStatus&0x40) )
			break;		
		// Check bit5 fot timeout
		/*
		if( flashStatus&0x20 )
		{
		old = NOR_RdHW(0x0);
		flashStatus = NOR_RdHW(0x0);
		if( (old&0x40) == (flashStatus&0x40) )
		return 0;
		else 
		return 1;
		}
		*/
		m_program.SetPos(temp);
		old = flashStatus;
	}
    m_program.SetPos(2500);
	m_program.ShowWindow(FALSE);
	if(temp<100)
		return 1;
    
	return 0;
}

void CJtagDlg:: NOR_WAITBYTE(void)
{
/*
while(1)
{
JTAG_ShiftDRState(outCellValue,inCellValue);
if( S4510_GetPin(GPF6)==HIGH)break;
}
*/	
	// Check if the bit6 toggle ends.
    volatile U16 flashStatus,old;
	
	old = NOR_RdHW(0x0);
	
    while(1)
	{
		flashStatus = NOR_RdHW(0x0);
        if( (old&0x40) == (flashStatus&0x40) )
			break;
		old = flashStatus;
	}	
	
}

void CJtagDlg:: NOR_Reset(void)
{
	NOR_WrHW(0, FLASH_RESET);
}

void CJtagDlg:: NOR_EraseSector(int sec)
{
	NOR_Reset();
	/* 6 write cycles */
	NOR_WrHW(0x5555, 0xAAAA);
	NOR_WrHW(0x2AAA, 0x5555);
	NOR_WrHW(0x5555, 0x8080);
	NOR_WrHW(0x5555, 0xAAAA);
	NOR_WrHW(0x2AAA, 0x5555);
	NOR_WrHW(secaddr[sec]>>1, FLASH_ERASE_SECTOR);
	
	/* wait for finishing */
	if(!NOR_WAITRB())
		AfxMessageBox("Erase The Flash OK!!! ",MB_ICONINFORMATION | MB_OK);
	else
		AfxMessageBox("Erase The Flash Fail, try again please!!! ",MB_ICONINFORMATION | MB_OK);
	//while(!(rPDATC&0x4));	//gpc2 = r/b
	//NOR_Reset();
}

void CJtagDlg::NOR_EraseChip(void)
{
	NOR_Reset();
	/* 6 write cycles */
	NOR_WrHW(0xAAA, 0xAA);
	NOR_WrHW(0x555, 0x55);
	NOR_WrHW(0xaaa, 0x80);
	NOR_WrHW(0xaaa, 0xAA);
	NOR_WrHW(0x555, 0x55);	
	NOR_WrHW(0xaaa, 0x10);
	
	//wait for finishing 
	if(!NOR_WAITRB())
		AfxMessageBox("Erase The Flash OK!!! ",MB_ICONINFORMATION | MB_OK);
	else
		AfxMessageBox("Erase The Flash Fail, try again please!!! ",MB_ICONINFORMATION | MB_OK);

	//while(!(rPDATC&0x4));	//gpc2 = r/b
	//NOR_Reset();
}

void CJtagDlg::NOR_Program(U32 addr, U8 *data, int len)
{
	int i;
	int iTemp=0;
	U16 shiTemp;
	
	m_program.ShowWindow(TRUE);
	m_program.SetRange32(0,len);
	m_program.SetPos(0);
	GetDlgItem(IDC_STATIC_FLASH_STATE)->SetWindowText("正在烧写......");
	
	NOR_Reset();
	iTemp = ((CComboBox *)GetDlgItem(IDC_COMBO1))->GetCurSel();
	if(iTemp == 0)
	{		
		for(i=0; i<len; i++)
		{	
			// first 3 cycles
			NOR_WrByte(0xAAA, 0xAA);
			NOR_WrByte(0x555, 0x55);
			NOR_WrByte(0xAAA, 0xA0);						
			NOR_WrByte(addr+i, *data);
			data++;
			m_program.SetPos(i);
		}
	}
	else if(iTemp == 1)
	{
		for(i=0; i<len; i++)
		{
			// first 3 cycles
			NOR_WrHW(0x555, 0xAA);
			NOR_WrHW(0x2AA, 0x55);
			NOR_WrHW(0x555, 0xA0);
			shiTemp = (data[0]<<8)|data[1];
			NOR_WrHW(addr+i, shiTemp);
			data += 2;
			m_program.SetPos(i);
		}
	}
	else
	{
		AfxMessageBox("暂不支持这种Flash的连接方式!", MB_ICONINFORMATION | MB_OK);
	}
	
	GetDlgItem(IDC_STATIC_FLASH_STATE)->SetWindowText("烧写完成!");
	m_program.ShowWindow(TRUE);
	
}

int CJtagDlg:: NOR_ReadId(void)
{
	short vid=0xff, pid=0xff;
	int j = ((CComboBox *)GetDlgItem(IDC_COMBO1))->GetCurSel();
	if(j != CB_ERR)
	{
		if(j==0)//byte读取方式
		{
			//默认可以检测4510板子上的m:29LV800BTC-90			
			//NOR_WrByte?
			NOR_WrHW(0xAAA, 0xAA);
			NOR_WrHW(0x555, 0x55);
			NOR_WrHW(0xAAA, 0x90);
			vid = NOR_RdHW(0);
			pid = NOR_RdHW(2);	
			//pid = NOR_RdHW(1);//I think?
		}											
		else
		{	
			NOR_WrHW(0x5555, 0xAA);
			NOR_WrHW(0x2AAA, 0x55);
			NOR_WrHW(0x5555, 0x90);
			vid = NOR_RdHW(0);
			pid = NOR_RdHW(1);			
		}
	}	
	
	return((vid<<16)|pid);
}

int CJtagDlg:: NOR_GetSecs(U32 size)
{
	int cnt=0;
	while(size > secaddr[cnt++]);	
	return cnt-1;
}

void CJtagDlg:: NOR_Init(void)
{
	int i=0;
	secaddr[0]=0x00000;
	secaddr[1]=0x04000;
	secaddr[2]=0x06000;
	secaddr[3]=0x08000;
	for(i=4;i<19;i++)
		secaddr[i]=0x10000*(i-3);	
}


/**sumsung chip function application**/
void CJtagDlg:: S4510_InitCell(void)
{
    int i;	
    dataOutCellIndex[0] = DATA0_OUT;
    dataOutCellIndex[1] = DATA1_OUT;
    dataOutCellIndex[2] = DATA2_OUT;
    dataOutCellIndex[3] = DATA3_OUT;
    dataOutCellIndex[4] = DATA4_OUT;
    dataOutCellIndex[5] = DATA5_OUT;
    dataOutCellIndex[6] = DATA6_OUT;
    dataOutCellIndex[7] = DATA7_OUT;	
    dataOutCellIndex[8] = DATA8_OUT;
    dataOutCellIndex[9] = DATA9_OUT;
    dataOutCellIndex[10] = DATA10_OUT;
    dataOutCellIndex[11] = DATA11_OUT;
    dataOutCellIndex[12] = DATA12_OUT;
    dataOutCellIndex[13] = DATA13_OUT;
    dataOutCellIndex[14] = DATA14_OUT;
    dataOutCellIndex[15] = DATA15_OUT;	
    dataOutCellIndex[16] = DATA16_OUT;
    dataOutCellIndex[17] = DATA17_OUT;
    dataOutCellIndex[18] = DATA18_OUT;
    dataOutCellIndex[19] = DATA19_OUT;
    dataOutCellIndex[20] = DATA20_OUT;
    dataOutCellIndex[21] = DATA21_OUT;
    dataOutCellIndex[22] = DATA22_OUT;
    dataOutCellIndex[23] = DATA23_OUT;	
    dataOutCellIndex[24] = DATA24_OUT;
    dataOutCellIndex[25] = DATA25_OUT;
    dataOutCellIndex[26] = DATA26_OUT;
    dataOutCellIndex[27] = DATA27_OUT;
    dataOutCellIndex[28] = DATA28_OUT;
    dataOutCellIndex[29] = DATA29_OUT;
    dataOutCellIndex[30] = DATA30_OUT;
    dataOutCellIndex[31] = DATA31_OUT;	
	
    dataInCellIndex[0] = DATA0_IN;  
    dataInCellIndex[1] = DATA1_IN;
    dataInCellIndex[2] = DATA2_IN;
    dataInCellIndex[3] = DATA3_IN;
    dataInCellIndex[4] = DATA4_IN;
    dataInCellIndex[5] = DATA5_IN;
    dataInCellIndex[6] = DATA6_IN;
    dataInCellIndex[7] = DATA7_IN;
    dataInCellIndex[8] = DATA8_IN;  
    dataInCellIndex[9] = DATA9_IN;
    dataInCellIndex[10] = DATA10_IN;
    dataInCellIndex[11] = DATA11_IN;
    dataInCellIndex[12] = DATA12_IN;
    dataInCellIndex[13] = DATA13_IN;
    dataInCellIndex[14] = DATA14_IN;
    dataInCellIndex[15] = DATA15_IN;
    dataInCellIndex[16] = DATA16_IN;  
    dataInCellIndex[17] = DATA17_IN;
    dataInCellIndex[18] = DATA18_IN;
    dataInCellIndex[19] = DATA19_IN;
    dataInCellIndex[20] = DATA20_IN;
    dataInCellIndex[21] = DATA21_IN;
    dataInCellIndex[22] = DATA22_IN;
    dataInCellIndex[23] = DATA23_IN;
    dataInCellIndex[24] = DATA24_IN;  
    dataInCellIndex[25] = DATA25_IN;
    dataInCellIndex[26] = DATA26_IN;
    dataInCellIndex[27] = DATA27_IN;
    dataInCellIndex[28] = DATA28_IN;
    dataInCellIndex[29] = DATA29_IN;
    dataInCellIndex[30] = DATA30_IN;
    dataInCellIndex[31] = DATA31_IN;
    
    addrCellIndex[0]=ADDR0;
    addrCellIndex[1]=ADDR1;
    addrCellIndex[2]=ADDR2;
    addrCellIndex[3]=ADDR3;
    addrCellIndex[4]=ADDR4;
    addrCellIndex[5]=ADDR5;
    addrCellIndex[6]=ADDR6;
    addrCellIndex[7]=ADDR7;
    addrCellIndex[8]=ADDR8;
    addrCellIndex[9]=ADDR9;
    addrCellIndex[10]=ADDR10;
    addrCellIndex[11]=ADDR11;
    addrCellIndex[12]=ADDR12;
    addrCellIndex[13]=ADDR13;
    addrCellIndex[14]=ADDR14;
    addrCellIndex[15]=ADDR15;
    addrCellIndex[16]=ADDR16;
    addrCellIndex[17]=ADDR17;
    addrCellIndex[18]=ADDR18;
    addrCellIndex[19]=ADDR19;
    addrCellIndex[20]=ADDR20;
    addrCellIndex[21]=ADDR21;
	
    //outCellValue[] must be initialized by dummy values for JTAG_ShiftDRState();
    for(i=0;i<S4510_MAX_CELL_INDEX;i++)
    {
		outCellValue[i]=HIGH;
		inCellValue[i]='u';
    }
    outCellValue[S4510_MAX_CELL_INDEX]='\0';	//just for JTAG_ShiftDRState(strlen)
    inCellValue[S4510_MAX_CELL_INDEX]='\0';
	
    JTAG_RunTestldleState();
    /* 预装数据,但不驱动 */
	JTAG_ShiftIRState(SAMPLE_PRELOAD);
    JTAG_ShiftDRState(outCellValue, inCellValue); //inCellValue[] is initialized.
	
    for(i=0;i<S4510_MAX_CELL_INDEX;i++)
    {
		outCellValue[i] = inCellValue[i];	    //outCellValue[] is initialized.
    }
	
    //Memory control signal initialization.
    S4510_SetPin(DATA0_31_CON,HIGH);    //HIGH=input, LOW=output
    
	S4510_SetPin(ADDR_CS_RW_CON,LOW);
    S4510_SetPin(nECS0,HIGH); 
    S4510_SetPin(nECS1,HIGH); 
    S4510_SetPin(nECS2,HIGH); 
    S4510_SetPin(nECS3,HIGH); 
	S4510_SetPin(nOE,HIGH); 
	
	//S4510_SetPin(ADDR_CS_RW_CON,LOW);
	
    S4510_SetPin(nRCS0,HIGH); 
    S4510_SetPin(nRCS1,HIGH); 
    S4510_SetPin(nRCS2,HIGH); 
    S4510_SetPin(nRCS3,HIGH); 
	S4510_SetPin(nRCS4,HIGH); 
	S4510_SetPin(nRCS5,HIGH); 
    S4510_SetPin(nRAS0,HIGH); 
	
	//S4510_SetPin(ADDR_CS_RW_CON,LOW);
	S4510_SetPin(nRAS1,HIGH); 
	S4510_SetPin(nRAS2,HIGH); 
	S4510_SetPin(nRAS3,HIGH); 
	S4510_SetPin(nCAS0,HIGH); 
	S4510_SetPin(nCAS1,HIGH); 
	
	//S4510_SetPin(ADDR_CS_RW_CON,LOW);
	S4510_SetPin(nCAS2,HIGH);
	S4510_SetPin(nCAS3,HIGH);
	S4510_SetPin(nDWE,HIGH);
	S4510_SetPin(nWBE0,HIGH);
	S4510_SetPin(nWBE1,HIGH);
	S4510_SetPin(nWBE2,HIGH);
	S4510_SetPin(nWBE3,HIGH);
	
    //S4510_SetPin(ADDR_CS_RW_CON,LOW); 
    //S4510_SetPin(ADDR_CS_RW_CON,LOW);
	//S4510_SetPin(ADDR_CS_RW_CON,LOW);
	//S4510_SetPin(ADDR_CS_RW_CON,LOW);
}

/* 以下操作只是设置数组元素,并没有直接施加到引脚上 */
void CJtagDlg::S4510_SetPin(int index, char value)
{
    outCellValue[index] = value;
}

char CJtagDlg::S4510_GetPin(int index)
{
    return inCellValue[index];
}

void CJtagDlg::S4510_SetAddr(U32 addr)
{
    int i;
	
    for(i=0; i<22; i++)
    {
		if(addr & (1<<i))
			outCellValue[addrCellIndex[i]]=HIGH;
		else
			outCellValue[addrCellIndex[i]]=LOW;
    }
}

void CJtagDlg::S4510_SetDataByte(U8 data)
{
    int i;
	
    for(i=0;i<8;i++)
    {
		if(data & (1<<i))
			outCellValue[dataOutCellIndex[i]]=HIGH;
		else
			outCellValue[dataOutCellIndex[i]]=LOW;
    }
}

void CJtagDlg::S4510_SetDataHW(U16 data)
{
    int i;
	
    for(i=0;i<16;i++)
    {
		if(data & (1<<i))
			outCellValue[dataOutCellIndex[i]]=HIGH;
		else
			outCellValue[dataOutCellIndex[i]]=LOW;
    }
}

void CJtagDlg::S4510_SetDataWord(U32 data)
{
    int i;
	
    for(i=0;i<32;i++)
    {
		if(data & (1<<i))
			outCellValue[dataOutCellIndex[i]]=HIGH;
		else
			outCellValue[dataOutCellIndex[i]]=LOW;
    }
}

U8 CJtagDlg::S4510_GetDataByte(void)
{
    int	i;
    U8 data=0;
	
    for(i=0;i<8;i++)
    {
		if(inCellValue[dataInCellIndex[i]]==HIGH)
		{
			data = (data | (1<<i));
		}
    }
    return data;
}

U16 CJtagDlg::S4510_GetDataHW(void)
{
    int	i;
    U16 data=0;
	
    for(i=0;i<16;i++)
    {
		if(inCellValue[dataInCellIndex[i]]==HIGH)
		{
			data = (data | (1<<i));
		}
    }
    return data;
}


U32 CJtagDlg::S4510_GetDataWord(void)
{
    int	i;
    U32 data=0;
	
    for(i=0;i<32;i++)
    {
		if(inCellValue[dataInCellIndex[i]]==HIGH)
		{
			data = (data | (1<<i));
		}
    }
    return data;
}


void CJtagDlg::JTAG_RunTestldleState( void )
{
	JTAG_Reset();
	
	JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY(); // Why 3 times?
	JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); // Run-Test/Idle Status
	JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
	JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); // Run-Test/Idle Status
	JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
	JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); // Run-Test/Idle Status
	
}


void  CJtagDlg::JTAG_ShiftIRState(char *wrIR)
{
	int size;
	int i;
	int tdi;
	
	JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
	JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY(); 	// Select-DR-Scan 
	
	JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
	JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY(); 	//Select-IR-Scan 
	
	JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
	JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); 	//Capture-IR 
	
	JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
	JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); 	//Shift-IR 
	
	size=strlen(wrIR);
	
	for( i=0;i<(size-1);i++)
	{
		tdi= (wrIR[i] ==HIGH) ? TDI_H:TDI_L;
		JTAG_SET(tdi|TMS_L|TCK_L);JTAG_DELAY();
		JTAG_SET(tdi|TMS_L|TCK_H);JTAG_DELAY(); 	//Shift-IR 
	}
	tdi=(wrIR[i] ==HIGH) ? TDI_H:TDI_L; //i=3
	JTAG_SET(tdi|TMS_H|TCK_L);JTAG_DELAY();
	JTAG_SET(tdi|TMS_H|TCK_H);JTAG_DELAY(); 	//Exit1-IR
	
	JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();
	JTAG_SET(TDI_H|TMS_H|TCK_H);JTAG_DELAY(); 	//Update-IR
	
	JTAG_SET(TDI_H|TMS_L|TCK_L);JTAG_DELAY();
	JTAG_SET(TDI_H|TMS_L|TCK_H);JTAG_DELAY(); 	//Run-Test/Idle
}


void  CJtagDlg::JTAG_ShiftDRState(char *wrDR, char *rdDR)
{
	int size;
	int i;
	int tdi;
	
	JTAG_SET(TDI_H|TMS_H|TCK_L);JTAG_DELAY();

⌨️ 快捷键说明

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