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

📄 s3c4510.c

📁 Linux下通过jtag烧写flash的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	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];
    int 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("Found S3C4510B, 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_rom(DWORD address, unsigned char data)
{
    access_bus(SETUP, address, data, IP); // clear status register
    access_bus(WRITE, address, data, IP);
//    access_bus(HOLD,  address, data, IP);
}

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

unsigned char read_rom(DWORD address)
{
    access_bus(READ, address, 0, IP);
    return (unsigned char)(access_bus(READ, address, 0 , RP)&0xff);
}

WORD read_rom2(DWORD address)
{
    access_bus2(READ, address, 0, IP);
    return (WORD)(access_bus2(READ, address, 0 , RP));
}

DWORD access_rom(int rw, DWORD address, DWORD data, int rp)
{
    return(access_bus(rw, address, data, rp));
}

DWORD access_bus(int rw, DWORD address, DWORD data, int rp)
{
    return s3c4510_bus(nRCS_0_OUT, rw, address, data, 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_bus(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[nOE_OUT]    = 0;
    pin[nWBE_0_OUT] = 1;
    pin[nWBE_1_OUT] = 1;
    pin[nWBE_2_OUT] = 1;
    pin[nWBE_3_OUT] = 1;

    pin[D_OUT_ENB] = 1;

    for(i = 0; i < 22; i++)
        pin[149-i] = (int)((address >> i) & 1);  // set address 0 thru 21

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

        for(li = 0L; li < 32L; li++)
            pin[125-li*2] = (int)((data >> li) & 1L);  // set data pins
	}

	if(rw == SETUP || rw == HOLD)	// just like a write except WE, WE needs setup time
	{
        pin[nOE_OUT]   = 1;
        pin[D_OUT_ENB] = 0;
        for(li = 0L; li < 32L; li++)
            pin[125-li*2] = (int)((data >> li) & 1L);  // serialize data pins
	}

	if(rw == RS)	// setup prior to RD_nWR_OUT
	{
		pin[nOE_OUT] = 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 < 232; 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 < 32; i++)	// convert serial data to single DWORD
	{
        busdat = busdat | (DWORD)(out_dat[125 - i*2] << i);
	}

	return(busdat);
}


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[nOE_OUT]    = 0;
    pin[nWBE_0_OUT] = 1;
    pin[nWBE_1_OUT] = 1;
    pin[nWBE_2_OUT] = 1;
    pin[nWBE_3_OUT] = 1;

    pin[D_OUT_ENB] = 0;

    for(i = 0; i < 22; i++)
        pin[149-i] = (int)((address >> i) & 1);  // set address 0 thru 21

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

        for(li = 0L; li < 32L; li++)
            pin[125-li*2] = (int)((data >> li) & 1L);  // set data pins
	}

	if( rw == HOLD)	// just like a write except WE, WE needs setup time
	{
		pin[cs]         = 1;
        pin[nOE_OUT]   = 1;
        pin[D_OUT_ENB] = 0;
		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[D_OUT_ENB] = 0;
		pin[nWBE_0_OUT] = 1;
        for(li = 0L; li < 32L; li++)
            pin[125-li*2] = (int)((data >> li) & 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;
	}

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

	return(busdat);
}

⌨️ 快捷键说明

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