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

📄 s3c4510.c

📁 三星S3C4510 FLASH编程的C源码
💻 C
字号:
#define VERSION "1.0"
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include "s3c4510.h"

int pin[] =
{
    1,  // UARXD1_IN
    0,  // nUADSR0_OUT
    1,  // UATXD0_OUT
    1,  // nUADTR0_IN
    1,  // UARXD0_IN
    0,  // SDA_OUT
    1,  // SDA_IN
    0,  // SCL_OUT
    1,  // SCL_IN
    0,  // P_17_ENB
    0,  // P_17_OUT
    0,  // P_17_IN
    0,  // P_16_ENB
    0,  // P_16_OUT
    0,  // P_16_IN
    0,  // P_15_ENB
    0,  // P_15_OUT
    0,  // P_15_IN
    0,  // P_14_ENB
    0,  // P_14_OUT
    0,  // P_14_IN
    0,  // P_13_ENB
    0,  // P_13_OUT
    0,  // P_13_IN
    0,  // P_12_ENB
    0,  // P_12_OUT
    0,  // P_12_IN
    0,  // P_11_ENB
    0,  // P_11_OUT
    0,  // P_11_IN
    0,  // P_10_ENB
    0,  // P_10_OUT
    0,  // P_10_IN
    0,  // P_9_ENB
    0,  // P_9_OUT
    0,  // P_9_IN
    0,  // P_8_ENB
    0,  // P_8_OUT
    0,  // P_8_IN
    0,  // P_7_ENB
    0,  // P_7_OUT
    0,  // P_7_IN
    0,  // P_6_ENB
    0,  // P_6_OUT
    0,  // P_6_IN
    0,  // P_5_ENB
    0,  // P_5_OUT
    0,  // P_5_IN
    0,  // P_4_ENB
    0,  // P_4_OUT
    0,  // P_4_IN
    0,  // P_3_ENB
    0,  // P_3_OUT
    0,  // P_3_IN
    0,  // P_2_ENB
    0,  // P_2_OUT
    0,  // P_2_IN
    0,  // P_1_ENB
    0,  // P_1_OUT
    0,  // P_1_IN
    0,  // P_0_ENB
    0,  // P_0_OUT
    0,  // P_0_IN
    0,  // D_31_OUT
    0,  // D_31_IN
    0,  // D_30_OUT
    0,  // D_30_IN
    0,  // D_29_OUT
    0,  // D_29_IN
    0,  // D_28_OUT
    0,  // D_28_IN
    0,  // D_27_OUT
    0,  // D_27_IN
    0,  // D_26_OUT
    0,  // D_26_IN
    0,  // D_25_OUT
    0,  // D_25_IN
    0,  // D_24_OUT
    0,  // D_24_IN
    0,  // D_23_OUT
    0,  // D_23_IN
    0,  // D_22_OUT
    0,  // D_22_IN
    0,  // D_21_OUT
    0,  // D_21_IN
    0,  // D_20_OUT
    0,  // D_20_IN
    0,  // D_19_OUT
    0,  // D_19_IN
    0,  // D_18_OUT
    0,  // D_18_IN
    0,  // D_17_OUT
    0,  // D_17_IN
    0,  // D_16_OUT
    0,  // D_16_IN
    0,  // D_15_OUT
    0,  // D_15_IN
    0,  // D_14_OUT
    0,  // D_14_IN
    0,  // D_13_OUT
    0,  // D_13_IN
    0,  // D_12_OUT
    0,  // D_12_IN
    0,  // D_11_OUT
    0,  // D_11_IN
    0,  // D_10_OUT
    0,  // D_10_IN
    0,  // D_9_OUT
    0,  // D_9_IN
    0,  // D_8_OUT
    0,  // D_8_IN
    0,  // D_7_OUT
    0,  // D_7_IN
    0,  // D_6_OUT
    0,  // D_6_IN
    0,  // D_5_OUT
    0,  // D_5_IN
    0,  // D_4_OUT
    0,  // D_4_IN
    0,  // D_3_OUT
    0,  // D_3_IN
    0,  // D_2_OUT
    0,  // D_2_IN
    0,  // D_1_OUT
    0,  // D_1_IN
    0,  // D_0_OUT
    0,  // D_0_IN
    1,  // D_OUT_ENB
    0,  // A_21_OUT
    0,  // A_20_OUT
    0,  // A_19_OUT
    0,  // A_18_OUT
    0,  // A_17_OUT
    0,  // A_16_OUT
    0,  // A_15_OUT
    0,  // A_14_OUT
    0,  // A_13_OUT
    0,  // A_12_OUT
    0,  // A_11_OUT
    0,  // A_10_OUT
    0,  // A_9_OUT
    0,  // A_8_OUT
    0,  // A_7_OUT
    0,  // A_6_OUT
    0,  // A_5_OUT
    0,  // A_4_OUT
    0,  // A_3_OUT
    0,  // A_2_OUT
    0,  // A_1_OUT
    0,  // A_0_OUT
    0,  // ExtMACK_OUT
    0,  // ExtMREQ_IN
    1,  // nWBE_3_OUT
    1,  // nWBE_2_OUT
    1,  // nWBE_1_OUT
    1,  // nWBE_0_OUT
    1,  // nDWE_OUT
    1,  // nCAS_3_OUT
    1,  // nCAS_2_OUT
    1,  // nCAS_1_OUT
    1,  // nCAS_0_OUT
    1,  // nRAS_3_OUT
    1,  // nRAS_2_OUT
    1,  // nRAS_1_OUT
    1,  // nRAS_0_OUT
    1,  // nRCS_5_OUT
    1,  // nRCS_4_OUT
    1,  // nRCS_3_OUT
    1,  // nRCS_2_OUT
    1,  // nRCS_1_OUT
    0,  // CLKSEL_IN
    0,  // nRESET_IN
    0,  // MCLK_IN
    0,  // MCLKO_OUT
    0,  // CLKOEN_IN
    1,  // nRCS_0_OUT
    1,  // B0SIZE_1_IN
    1,  // B0SIZE_0_IN
    1,  // nOE_OUT
    1,  // nEWAIT_IN
    1,  // nECS_3_OUT
    1,  // nECS_2_OUT
    1,  // nECS_1_OUT
    1,  // nECS_0_OUT
    0,  // DIS_BUS
    1,  // UCLK_IN
    1,  // TMODE_IN
    0,  // MDC_OUT
    1,  // LITTLE_IN
    0,  // MDIO_OE
    0,  // MDIO_OUT
    0,  // MDIO_IN
    0,  // TX_EN_TXEN_10M_OUT
    0,  // TX_CLK_TXCLK_10M_OUT
    0,  // TX_ERR_PCOMP_10M_OUT
    0,  // TXD3_OUT
    0,  // TXD2_OUT
    0,  // TXD1_LOOP10_OUT
    0,  // TXD0_TXD_10M_OUT
    1,  // COL_COL_10M_IN
    1,  // RX_CLK_RXCLK_10M_IN
    1,  // RX_ERR_IN
    1,  // RXD3_IN
    1,  // RXD2_IN
    1,  // RXD1_IN
    1,  // RXD0_RXD_10M_IN
    1,  // RX_DV_LINK10_IN
    1,  // CRS_CRS_10M_IN
    0,  // TXCBEN
    0,  // TXCB_OUT
    1,  // TXCB_IN
    0,  // nSYNCB_OUT
    1,  // RXCB_IN
    1,  // nDCDB_IN
    1,  // nCTSB_IN
    0,  // TXDB_OUT
    0,  // nRTSB_OUT
    1,  // RXDB_IN
    0,  // nDTRB_OUT
    0,  // TXCAEN
    0,  // TXCA_OUT
    1,  // TXCA_IN
    0,  // nSYNCA_OUT
    1,  // RXCA_IN
    1,  // nDCDA_IN
    1,  // nCTSA_IN
    0,  // TXDA_OUT
    0,  // nRTSA_OUT
    1,  // RXDA_IN
    0,  // nDTRA_OUT
    0,  // nUADSR1_OUT
    0,  // UATXD1_OUT
    1   // nUADTR1_IN
};

int lpt_address;

void error_out(char *error_string)
{
	printf("%s\n",error_string);
	exit(0);
}

unsigned short test_port(void)
{
	// search for valid parallel port
    lpt_address = 0;
    _outp(LPT1, 0x55);
    if(_inp(LPT1) == 0x55)  lpt_address = LPT1;
    _outp(LPT2, 0x55);
    if(_inp(LPT2) == 0x55)  lpt_address = LPT2;
    _outp(LPT3, 0x55);
    if(_inp(LPT3) == 0x55)  lpt_address = LPT3;
    return(lpt_address);
}

int putp(int tdi, int tms, int rp)
{
    // Output pins (LPT driving)
    // LPT ST(-)     Pin 1  and TCK (bit 0 lptaddress + 2)
    // LPT D0        Pin 2  and TDI
    // LPT SEL_IN(-) Pin 17 and TMS (bit 3 lptaddress + 2)
    // LPT INIT      Pin 16 and TRST (bit 2 lptaddress + 2)
    //
    // Input pin (S3C4510 board drives)
    // LPT ACK       Pin 10 and TDO (bit 6 lptaddress + 1)

	int tdo = -1;
    _outp(lpt_address,    tdi);                     // TDI
    _outp(lpt_address+2, !tms*8+TRST+1);            // TCK low
    _outp(lpt_address+2, !tms*8+TRST);              // TCK high
    if(rp == RP)
    {
        _outp(lpt_address+2, !tms*8+TRST+1);        // TCK low
        tdo = ((int)_inp(lpt_address + 1) >> 6)&1;  // get TDO data
    }
	return tdo;
}

void reset_jtag(void)
{
    _outp(lpt_address+2, 0);                // TRST low
    _outp(lpt_address+2, TRST);             // TRST high
}

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_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);
}

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

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 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;
	}

	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);
}

⌨️ 快捷键说明

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