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

📄 if_de.c

📁 很好的一个嵌入式linux平台下的bootloader
💻 C
📖 第 1 页 / 共 5 页
字号:
/* ******************************************************************** *  Start of 21140/21140A support which does not use the MII interface  */static voidtulip_null_media_poll(    tulip_softc_t * const sc,    tulip_mediapoll_event_t event){#if defined(TULIP_DEBUG)    sc->tulip_dbg.dbg_events[event]++;#endif#if defined(DIAGNOSTIC)    printf(TULIP_PRINTF_FMT ": botch(media_poll) at line %d\n",	   TULIP_PRINTF_ARGS, __LINE__);#endif}__inline__ static voidtulip_21140_mediainit(    tulip_softc_t * const sc,    tulip_media_info_t * const mip,    tulip_media_t const media,    unsigned gpdata,    unsigned cmdmode){    sc->tulip_mediums[media] = mip;    mip->mi_type = TULIP_MEDIAINFO_GPR;    mip->mi_cmdmode = cmdmode;    mip->mi_gpdata = gpdata;}static voidtulip_21140_evalboard_media_probe(    tulip_softc_t * const sc){    tulip_media_info_t *mip = sc->tulip_mediainfo;    sc->tulip_gpinit = TULIP_GP_EB_PINS;    sc->tulip_gpdata = TULIP_GP_EB_INIT;    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EB_PINS);    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EB_INIT);    TULIP_CSR_WRITE(sc, csr_command,	TULIP_CSR_READ(sc, csr_command) | TULIP_CMD_PORTSELECT |	TULIP_CMD_PCSFUNCTION | TULIP_CMD_SCRAMBLER | TULIP_CMD_MUSTBEONE);    TULIP_CSR_WRITE(sc, csr_command,	TULIP_CSR_READ(sc, csr_command) & ~TULIP_CMD_TXTHRSHLDCTL);    DELAY(1000000);    if ((TULIP_CSR_READ(sc, csr_gp) & TULIP_GP_EB_OK100) != 0) {	sc->tulip_media = TULIP_MEDIA_10BASET;    } else {	sc->tulip_media = TULIP_MEDIA_100BASETX;    }    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET,			  TULIP_GP_EB_INIT,			  TULIP_CMD_TXTHRSHLDCTL);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET_FD,			  TULIP_GP_EB_INIT,			  TULIP_CMD_TXTHRSHLDCTL|TULIP_CMD_FULLDUPLEX);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,			  TULIP_GP_EB_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_SCRAMBLER);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,			  TULIP_GP_EB_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_SCRAMBLER|TULIP_CMD_FULLDUPLEX);}static const tulip_boardsw_t tulip_21140_eb_boardsw = {    TULIP_21140_DEC_EB,    tulip_21140_evalboard_media_probe,    tulip_media_select,    tulip_null_media_poll,    tulip_2114x_media_preset,};static voidtulip_21140_accton_media_probe(    tulip_softc_t * const sc){    tulip_media_info_t *mip = sc->tulip_mediainfo;    unsigned gpdata;    sc->tulip_gpinit = TULIP_GP_EB_PINS;    sc->tulip_gpdata = TULIP_GP_EB_INIT;    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EB_PINS);    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EB_INIT);    TULIP_CSR_WRITE(sc, csr_command,	TULIP_CSR_READ(sc, csr_command) | TULIP_CMD_PORTSELECT |	TULIP_CMD_PCSFUNCTION | TULIP_CMD_SCRAMBLER | TULIP_CMD_MUSTBEONE);    TULIP_CSR_WRITE(sc, csr_command,	TULIP_CSR_READ(sc, csr_command) & ~TULIP_CMD_TXTHRSHLDCTL);    DELAY(1000000);    gpdata = TULIP_CSR_READ(sc, csr_gp);    if ((gpdata & TULIP_GP_EN1207_UTP_INIT) == 0) {	sc->tulip_media = TULIP_MEDIA_10BASET;    } else {	if ((gpdata & TULIP_GP_EN1207_BNC_INIT) == 0) {		sc->tulip_media = TULIP_MEDIA_BNC;        } else {		sc->tulip_media = TULIP_MEDIA_100BASETX;        }    }    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_BNC,			  TULIP_GP_EN1207_BNC_INIT,			  TULIP_CMD_TXTHRSHLDCTL);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET,			  TULIP_GP_EN1207_UTP_INIT,			  TULIP_CMD_TXTHRSHLDCTL);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET_FD,			  TULIP_GP_EN1207_UTP_INIT,			  TULIP_CMD_TXTHRSHLDCTL|TULIP_CMD_FULLDUPLEX);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,			  TULIP_GP_EN1207_100_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_SCRAMBLER);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,			  TULIP_GP_EN1207_100_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_SCRAMBLER|TULIP_CMD_FULLDUPLEX);}static const tulip_boardsw_t tulip_21140_accton_boardsw = {    TULIP_21140_EN1207,    tulip_21140_accton_media_probe,    tulip_media_select,    tulip_null_media_poll,    tulip_2114x_media_preset,};static voidtulip_21140_smc9332_media_probe(    tulip_softc_t * const sc){    tulip_media_info_t *mip = sc->tulip_mediainfo;    int idx, cnt = 0;    TULIP_CSR_WRITE(sc, csr_command, TULIP_CMD_PORTSELECT|TULIP_CMD_MUSTBEONE);    TULIP_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET);    DELAY(10);	/* Wait 10 microseconds (actually 50 PCI cycles but at 		   33MHz that comes to two microseconds but wait a		   bit longer anyways) */    TULIP_CSR_WRITE(sc, csr_command, TULIP_CMD_PORTSELECT |	TULIP_CMD_PCSFUNCTION | TULIP_CMD_SCRAMBLER | TULIP_CMD_MUSTBEONE);    sc->tulip_gpinit = TULIP_GP_SMC_9332_PINS;    sc->tulip_gpdata = TULIP_GP_SMC_9332_INIT;    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_SMC_9332_PINS|TULIP_GP_PINSET);    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_SMC_9332_INIT);    DELAY(200000);    for (idx = 1000; idx > 0; idx--) {	u_int32_t csr = TULIP_CSR_READ(sc, csr_gp);	if ((csr & (TULIP_GP_SMC_9332_OK10|TULIP_GP_SMC_9332_OK100)) == (TULIP_GP_SMC_9332_OK10|TULIP_GP_SMC_9332_OK100)) {	    if (++cnt > 100)		break;	} else if ((csr & TULIP_GP_SMC_9332_OK10) == 0) {	    break;	} else {	    cnt = 0;	}	DELAY(1000);    }    sc->tulip_media = cnt > 100 ? TULIP_MEDIA_100BASETX : TULIP_MEDIA_10BASET;    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,			  TULIP_GP_SMC_9332_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_SCRAMBLER);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,			  TULIP_GP_SMC_9332_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_SCRAMBLER|TULIP_CMD_FULLDUPLEX);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET,			  TULIP_GP_SMC_9332_INIT,			  TULIP_CMD_TXTHRSHLDCTL);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET_FD,			  TULIP_GP_SMC_9332_INIT,			  TULIP_CMD_TXTHRSHLDCTL|TULIP_CMD_FULLDUPLEX);} static const tulip_boardsw_t tulip_21140_smc9332_boardsw = {    TULIP_21140_SMC_9332,    tulip_21140_smc9332_media_probe,    tulip_media_select,    tulip_null_media_poll,    tulip_2114x_media_preset,};static voidtulip_21140_cogent_em100_media_probe(    tulip_softc_t * const sc){    tulip_media_info_t *mip = sc->tulip_mediainfo;    u_int32_t cmdmode = TULIP_CSR_READ(sc, csr_command);    sc->tulip_gpinit = TULIP_GP_EM100_PINS;    sc->tulip_gpdata = TULIP_GP_EM100_INIT;    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EM100_PINS);    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_EM100_INIT);    cmdmode = TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION|TULIP_CMD_MUSTBEONE;    cmdmode &= ~(TULIP_CMD_TXTHRSHLDCTL|TULIP_CMD_SCRAMBLER);    if (sc->tulip_rombuf[32] == TULIP_COGENT_EM100FX_ID) {	TULIP_CSR_WRITE(sc, csr_command, cmdmode);	sc->tulip_media = TULIP_MEDIA_100BASEFX;	tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASEFX,			  TULIP_GP_EM100_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION);	tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASEFX_FD,			  TULIP_GP_EM100_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_FULLDUPLEX);    } else {	TULIP_CSR_WRITE(sc, csr_command, cmdmode|TULIP_CMD_SCRAMBLER);	sc->tulip_media = TULIP_MEDIA_100BASETX;	tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,			  TULIP_GP_EM100_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_SCRAMBLER);	tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,			  TULIP_GP_EM100_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_SCRAMBLER|TULIP_CMD_FULLDUPLEX);    }}static const tulip_boardsw_t tulip_21140_cogent_em100_boardsw = {    TULIP_21140_COGENT_EM100,    tulip_21140_cogent_em100_media_probe,    tulip_media_select,    tulip_null_media_poll,    tulip_2114x_media_preset};static voidtulip_21140_znyx_zx34x_media_probe(    tulip_softc_t * const sc){    tulip_media_info_t *mip = sc->tulip_mediainfo;    int cnt10 = 0, cnt100 = 0, idx;    sc->tulip_gpinit = TULIP_GP_ZX34X_PINS;    sc->tulip_gpdata = TULIP_GP_ZX34X_INIT;    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_ZX34X_PINS);    TULIP_CSR_WRITE(sc, csr_gp, TULIP_GP_ZX34X_INIT);    TULIP_CSR_WRITE(sc, csr_command,	TULIP_CSR_READ(sc, csr_command) | TULIP_CMD_PORTSELECT |	TULIP_CMD_PCSFUNCTION | TULIP_CMD_SCRAMBLER | TULIP_CMD_MUSTBEONE);    TULIP_CSR_WRITE(sc, csr_command,	TULIP_CSR_READ(sc, csr_command) & ~TULIP_CMD_TXTHRSHLDCTL);    DELAY(200000);    for (idx = 1000; idx > 0; idx--) {	u_int32_t csr = TULIP_CSR_READ(sc, csr_gp);	if ((csr & (TULIP_GP_ZX34X_LNKFAIL|TULIP_GP_ZX34X_SYMDET|TULIP_GP_ZX34X_SIGDET)) == (TULIP_GP_ZX34X_LNKFAIL|TULIP_GP_ZX34X_SYMDET|TULIP_GP_ZX34X_SIGDET)) {	    if (++cnt100 > 100)		break;	} else if ((csr & TULIP_GP_ZX34X_LNKFAIL) == 0) {	    if (++cnt10 > 100)		break;	} else {	    cnt10 = 0;	    cnt100 = 0;	}	DELAY(1000);    }    sc->tulip_media = cnt100 > 100 ? TULIP_MEDIA_100BASETX : TULIP_MEDIA_10BASET;    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET,			  TULIP_GP_ZX34X_INIT,			  TULIP_CMD_TXTHRSHLDCTL);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_10BASET_FD,			  TULIP_GP_ZX34X_INIT,			  TULIP_CMD_TXTHRSHLDCTL|TULIP_CMD_FULLDUPLEX);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX,			  TULIP_GP_ZX34X_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_SCRAMBLER);    tulip_21140_mediainit(sc, mip++, TULIP_MEDIA_100BASETX_FD,			  TULIP_GP_ZX34X_INIT,			  TULIP_CMD_PORTSELECT|TULIP_CMD_PCSFUNCTION			      |TULIP_CMD_SCRAMBLER|TULIP_CMD_FULLDUPLEX);}static const tulip_boardsw_t tulip_21140_znyx_zx34x_boardsw = {    TULIP_21140_ZNYX_ZX34X,    tulip_21140_znyx_zx34x_media_probe,    tulip_media_select,    tulip_null_media_poll,    tulip_2114x_media_preset,};static voidtulip_2114x_media_probe(    tulip_softc_t * const sc){    sc->tulip_cmdmode |= TULIP_CMD_MUSTBEONE	|TULIP_CMD_BACKOFFCTR|TULIP_CMD_THRSHLD72;}static const tulip_boardsw_t tulip_2114x_isv_boardsw = {    TULIP_21140_ISV,    tulip_2114x_media_probe,    tulip_media_select,    tulip_media_poll,    tulip_2114x_media_preset,};#ifdef NEC5074static voidtulip_2114x_necddb_media_preset(    tulip_softc_t * const sc){    tulip_media_t media;    if (sc->tulip_probe_state == TULIP_PROBE_INACTIVE)	media = sc->tulip_media;    else	media = sc->tulip_probe_media;    sc->tulip_cmdmode &= ~(TULIP_CMD_PCSFUNCTION | TULIP_CMD_SCRAMBLER 			   | TULIP_CMD_NOHEARTBEAT);    /* to avoid Tx underruns with prefetch switched off */    if (_pci_maxburst_log2() <= 2)	sc->tulip_cmdmode |= TULIP_CMD_STOREFWD;    switch (media) {    case TULIP_MEDIA_100BASEFX:    case TULIP_MEDIA_100BASET4:    case TULIP_MEDIA_100BASETX:    case TULIP_MEDIA_100BASEFX_FD:    case TULIP_MEDIA_100BASETX_FD:	/* the MII doesn't use the symbol interface */	sc->tulip_cmdmode |= TULIP_CMD_NOHEARTBEAT;	break;    case TULIP_MEDIA_10BASET_FD:	sc->tulip_cmdmode |= TULIP_CMD_NOHEARTBEAT;	break;    case TULIP_MEDIA_10BASET:    case TULIP_MEDIA_BNC:    case TULIP_MEDIA_AUI:    default:	break;    }    tulip_2114x_media_preset (sc);}static const tulip_boardsw_t tulip_2114x_necddb_boardsw = {    TULIP_21140_NECDDB,    tulip_2114x_media_probe,    tulip_media_select,    tulip_media_poll,    tulip_2114x_necddb_media_preset,};#endif /* NEC5074 *//* * ******** END of chip-specific handlers. *********** *//* * Code the read the SROM and MII bit streams (I2C) */static voidtulip_delay_300ns(    tulip_softc_t * const sc){#if !defined(PROM)    int idx;    /*     * while this seems like a good idea, local bus latencies     * stretches PCI accesses to such an extent that it's      * better to just have a simple delay     */    for (idx = (300 / 33) + 1; idx > 0; idx--)	(void) TULIP_CSR_READ(sc, csr_busmode);#else    DELAY(1);#endif}#define EMIT    do { TULIP_CSR_WRITE(sc, csr_srom_mii, csr); tulip_delay_300ns(sc); } while (0)static voidtulip_srom_idle(    tulip_softc_t * const sc){    unsigned bit, csr;        csr  = SROMSEL ; EMIT;    csr  = SROMSEL | SROMRD; EMIT;      csr ^= SROMCS; EMIT;    csr ^= SROMCLKON; EMIT;    /*     * Write 25 cycles of 0 which will force the SROM to be idle.     */    for (bit = 3 + SROM_BITWIDTH + 16; bit > 0; bit--) {        csr ^= SROMCLKOFF; EMIT;    /* clock low; data not valid */        csr ^= SROMCLKON; EMIT;     /* clock high; data valid */    }    csr ^= SROMCLKOFF; EMIT;    csr ^= SROMCS; EMIT;    csr  = 0; EMIT;}     static voidtulip_srom_read(    tulip_softc_t * const sc){       unsigned idx;     const unsigned bitwidth = SROM_BITWIDTH;    const unsigned cmdmask = (SROMCMD_RD << bitwidth);    const unsigned msb = 1 << (bitwidth + 3 - 1);    unsigned lastidx = (1 << bitwidth) - 1;    tulip_srom_idle(sc);    for (idx = 0; idx <= lastidx; idx++) {        unsigned lastbit, data, bits, bit, csr;	csr  = SROMSEL ;	        EMIT;        csr  = SROMSEL | SROMRD;        EMIT;        csr ^= SROMCSON;                EMIT;        csr ^=            SROMCLKON;    EMIT;            lastbit = 0;        for (bits = idx|cmdmask, bit = bitwidth + 3; bit > 0; bit--, bits <<= 1) {            const unsigned thisbit = bits & msb;            csr ^= SROMCLKOFF; EMIT;    /* clock low; data not valid */   

⌨️ 快捷键说明

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