📄 jtagdlg.cpp
字号:
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 + -