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

📄 s3c4510.c.bak

📁 针对硬件操作
💻 BAK
📖 第 1 页 / 共 2 页
字号:

	int tdo = -1;
	int t1,t2;

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

void reset_jtag(void)                //不用动
{
	int i;
    OUTB(lpt_address, TRST);            // TRST low
	Sleep(5);
    OUTB(lpt_address, 0);               // TRST high
	Sleep(5);
	for( i=0; i<8; i++) putp(1,1,IP);   // move to TEST_LOGIC/RESET
	putp(1,0,IP);                       // move to Run_Test/Idle
}

void test_logic_reset(void)
{
	putp(1,1,IP);	// keep TMS set to 1 force a test logic reset
	putp(1,1,IP);	// no matter where you are in the TAP controller
	putp(1,1,IP);
	putp(1,1,IP);
	putp(1,1,IP);
	putp(1,1,IP);
}

int check_id(char *device_id)
{
	// compare passed device ID to the one returned from the ID command
	char in_id[40];
    BOOL error_flag = FALSE;
    int i;

    for(i = 34; i >= 0; i--)
	{
		if(i == 4 || i == 21 || i == 33)
		{
			in_id[i] = ' ';
			i--;
		}
		if(putp(1,0,RP) == 0)
			in_id[i] = '0';
		else
			in_id[i] = '1';

		if((in_id[i] != *(device_id + i)) && (*(device_id + i) != '*'))
		{
			error_flag = TRUE;
		}
	}
	in_id[35] = 0;

	if(error_flag)
	{
		printf("error, failed to read device ID\n");
		printf("check cables and power\n");
		printf("ACT: %s\n",in_id);
		printf("EXP: %s\n\n",device_id);
		return -1;
	}

    if(!strcmp(device_id,S3C4510ID)) // print S3C4510 device revision
	{
        int s3c_rev =
			(int)(in_id[0] - '0') * 8 +
			(int)(in_id[1] - '0') * 4 +
			(int)(in_id[2] - '0') * 2 +
			(int)(in_id[3] - '0');
        printf("S3C4510 revision %d\n",s3c_rev);
	}	
	return 0;
}

void id_command(void)
{
	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);
	putp(1,1,IP);	//select IR scan
	putp(1,0,IP);	//capture IR
	putp(1,0,IP);	//shift IR

    putp(0,0,IP);   //S3C4510 IDCODE, LSB first
    putp(1,0,IP);   //
    putp(1,0,IP);   //
    putp(1,1,IP);   //Exit1-IR

	putp(1,1,IP);	//Update-IR
	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

    if(check_id(S3C4510ID))
        error_out("failed to read device ID for the S3C4510");

	putp(1,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
}

void bypass_all(void)
{
	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);
	putp(1,1,IP);	//select IR scan
	putp(1,0,IP);	//capture IR
	putp(1,0,IP);	//shift IR

    putp(1,0,IP);   //S3C4510 BYPASS
	putp(1,0,IP);	//
	putp(1,0,IP);	//
	putp(1,1,IP);	//Exit1-IR

	putp(1,1,IP);	//Update-IR
	putp(1,0,IP);	//Run-Test/Idle
	putp(1,0,IP);	//Run-Test/Idle
	putp(1,0,IP);	//Run-Test/Idle
}

void extest(void)
{
	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);
	putp(1,1,IP);	//select IR scan
	putp(1,0,IP);	//capture IR
	putp(1,0,IP);	//shift IR

    putp(0,0,IP);   //S3C4510 extest
	putp(0,0,IP);	//
	putp(0,0,IP);	//
    putp(0,1,IP);   //Exit1-IR

	putp(1,1,IP);	//Update-IR
	putp(1,0,IP);	//Run-Test/Idle
	putp(1,0,IP);	//Run-Test/Idle
	putp(1,0,IP);	//Run-Test/Idle
}

void write_rom2(DWORD address, WORD data)
{
    access_bus2(WRITE, address, data, IP);
	access_bus2(SETUP, address, data, IP); // clear status register
}

WORD read_rom2(DWORD address)
{
    access_bus2(READ, address, 0, IP);  //相当于写地址
    return (WORD)(access_bus2(READ, address, 0 , RP)); //相当于读书局
}

DWORD access_bus2(int rw, DWORD address, DWORD data, int rp)  // acess the cs1 rom bank1
{
    return s3c4510_bus2(nRCS_0_OUT, rw, address, data, rp);
}


DWORD s3c4510_bus2(int cs, int rw, DWORD address, DWORD data, int rp)
{
    int out_dat[300], i;
    DWORD li, busdat = 0;

    // Preset S3C4510 pins to default values (all others set in S3C4510.h)
    pin[nRCS_0_OUT] = 1;
    pin[nRCS_1_OUT] = 1;
    pin[nRCS_2_OUT] = 1;
    pin[nRCS_3_OUT] = 1;
/*
    pin[nRCS_4_OUT] = 1;
    pin[nRCS_5_OUT] = 1;
    pin[nECS_0_OUT] = 1;
    pin[nECS_1_OUT] = 1;
    pin[nECS_2_OUT] = 1;
    pin[nECS_3_OUT] = 1;
*/

	pin[nWBE_DWE_OE_CS0_OUT_ENB] = 0;
    pin[nOE_OUT]    = 0;
    pin[nWBE_0_OUT] = 1;
    pin[nWBE_1_OUT] = 1;
    pin[nWBE_2_OUT] = 1;
    pin[nWBE_3_OUT] = 1;
    pin[nDWE_OUT] = 1; 

    pin[nGCS_6_OUT] = 1;   //sdram

    pin[D7_0_OUT_ENB] = 0;
    pin[D15_8_OUT_ENB] = 0;

	 pin[A15_1_OUT_ENB] = 0;
     pin[A0_OUT_ENB] = 0;

     pin[A16_OUT_ENB] = 0;
	 pin[A17_OUT_ENB] = 0;
	 pin[A18_OUT_ENB] = 0;
	 pin[A19_OUT_ENB] = 0;
	 pin[A20_OUT_ENB] = 0;
	 pin[A21_OUT_ENB] = 1;
	 pin[A22_OUT_ENB] = 1;
	 pin[A23_OUT_ENB] = 1;
	 pin[A24_OUT_ENB] = 1;

	 
    for(i = 1; i < 15; i++)    //set A1-A14
        pin[67+i] = (int)((address >> i) & 1);     // a1 = cell 68
    for(i = 15; i < 25; i++)    //set A15-A24
        pin[82+(i-15)*2] = (int)((address >> i) & 1);  //a15 = 82

	if(rw == READ)
	{
        pin[cs] = 0;
	    pin[D7_0_OUT_ENB] = 1;
        pin[D15_8_OUT_ENB] = 1;
	//	pin[D_OUT_ENB] = 1;
		pin[nOE_OUT]    = 0;
	}
	if(rw == WRITE)
	{
        pin[cs]         = 0;
        pin[nDWE_OUT]= 0;   //pin[nWBE_0_OUT] 
        pin[nOE_OUT]    = 1;
	    pin[D7_0_OUT_ENB] = 0;
        pin[D15_8_OUT_ENB] = 0;
      //  pin[D_OUT_ENB]  = 0;  // switch data pins to drive

        for(li = 0L; li < 8L; li++)    //设置D0-D7
            pin[102+li*2] = (int)((data >> li) & 1L);  // serialize data pins
        for(li = 0L; li < 8L; li++)     //设置D8-D15
            pin[119+li*2] = (int)((data >> (li+8)) & 1L);  // serialize data pins
	}

	if( rw == HOLD)	// just like a write except WE, WE needs setup time
	{
		pin[cs]         = 0;
        pin[nOE_OUT]   = 1;
	    pin[D7_0_OUT_ENB] = 1;
        pin[D15_8_OUT_ENB] = 1;
       // pin[D_OUT_ENB] = 0;
	   	pin[nDWE_OUT]= 1;
		//pin[nWBE_0_OUT] = 1;
        //for(li = 0L; li < 32L; li++)
        //    pin[125-li*2] = (int)((data >> li) & 1L);  // serialize data pins
	}
	
	if(rw == SETUP )	// just like a write except WE, WE needs setup time
	{
		pin[cs]         = 0;
        pin[nOE_OUT]   = 1;
		pin[D7_0_OUT_ENB] = 0;
        pin[D15_8_OUT_ENB] = 0;
      //  pin[D_OUT_ENB] = 0;
		pin[nDWE_OUT]= 1;
	//	pin[nWBE_0_OUT] = 1;
        for(li = 0L; li < 8L; li++)    //设置D0-D7
            pin[102+li*2] = (int)((data >> li) & 1L);  // serialize data pins
        for(li = 0L; li < 8L; li++)     //设置D8-D15
            pin[119+li*2] = (int)((data >> (li+8)) & 1L);  // serialize data pins
        

	}

	if(rw == RS)	// setup prior to RD_nWR_OUT
	{
		pin[nOE_OUT] = 1;
		pin[cs]      = 0;
		//pin[nWBE_0_OUT] = 0;
		pin[nDWE_OUT]= 0;
	}

    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 < 256; 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 < 7; i++)	// convert serial data to single DWORD
	{
        busdat = busdat | (DWORD)(out_dat[102 + i*2] << i);  
	}
    busdat = busdat | (DWORD)(out_dat[117] << 7);  

	for(i = 0; i < 7; i++)	// convert serial data to single DWORD
	{
        busdat = busdat | (DWORD)(out_dat[119 + i*2] << (i+8));  //????
	}
    busdat = busdat | (DWORD)(out_dat[134] << 15); 

   // printf("busdat %x\n",busdat);
	return(busdat);
}

⌨️ 快捷键说明

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