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

📄 s3c4510.c

📁 Linux下通过jtag烧写flash的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#define VERSION "1.0"
#include <stdio.h>
#include <time.h>
#include "s3c4510.h"#include "def.h"#include <asm/io.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;
int io_access_on( unsigned long port ){    if (ioperm (port, 3, 1))     {        perror ("ioperm()");        return 0;    }    if (ioperm (0x80, 1, 1))     {        perror ("ioperm()");        return 0;    }    return 1;}void io_access_off( unsigned long port ){    ioperm (port, 3, 0);    ioperm (0x80, 1, 0);}
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;
	if( io_access_on(LPT1) )        {            OUTB(LPT1, 0x55);
            if(INB(LPT1) == 0x55)  lpt_address = LPT1;
	    io_access_off(LPT1);	}	if( io_access_on(LPT2) )        {            OUTB(LPT2, 0x55);
            if(INB(LPT2) == 0x55)  lpt_address = LPT2;
	    io_access_off(LPT2);	}	if( io_access_on(LPT3) )        {            OUTB(LPT3, 0x55);
            if(INB(LPT3) == 0x55)  lpt_address = LPT3;
	    io_access_off(LPT3);	}	io_access_on(lpt_address);        return(lpt_address);
}

int putp(int tdi, int tms, int rp)
{
    // Output pins (LPT driving)
    // LPT D3      Pin 4  and TCK (bit 2 lptaddress )
    // LPT D2      Pin 5  and TDI (bit 3 lptaddress )
    // LPT D1      Pin 3  and TMS (bit 1 lptaddress )
    // LPT D0      Pin 2 and TRST (bit 0 lptaddress )
    //
    // Input pin (S3C4510 board drives)
    // LPT BUSY    Pin 11 and TDO (bit 7 lptaddress + 2)

	int tdo = -1;
	int t1,t2;

	t1 = tdi*8+tms*2;
	OUTB(lpt_address, t1+0x01);         //TCK low
	t1= tdi*8+tms*2+4;
	OUTB(lpt_address, t1+0x01);         // TCK high
	if(rp == RP)
        {
         OUTB(lpt_address, tdi*8+tms*2+0x01);        // 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, 0);               // TRST low
        OUTB(lpt_address, 0);               // TRST low
        OUTB(lpt_address, 0);               // TRST low
        OUTB(lpt_address, 1);               // TRST high
        OUTB(lpt_address, 1);               // TRST high
        OUTB(lpt_address, 1);               // TRST high
	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

⌨️ 快捷键说明

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