📄 ethernet.c
字号:
#include <zooboot.h>#include <command.h>#include <hardware.h>#include <net.h>#ifdef CFG_DRIVER_AT75C220ETHER#if (CFG_COMMANDS & CFG_CMD_NET)ethernet_t* mac = MACA_BASE;int MII_ReadPhy(unsigned char addr, unsigned short *ret) { unsigned long value = (addr << 18); if (mac == MACA_BASE) value |= 0x60820000; else if (mac == MACB_BASE) value |= 0x61020000; mac->man=value; udelay(10000); *ret = (unsigned short)(mac->man & 0x0000ffff); return 1; }int MII_GetLinkSpeed(void) { unsigned short stat1, stat2; int ret; if (!(ret = MII_ReadPhy(MII_STS_REG, &stat1))) return 0; if (!(ret = MII_ReadPhy(MII_STS2_REG, &stat2))) return 0; if ((stat2 & 0x0400) != 0x0400) return 0; if ((stat1 & 0x4000) && ((stat2 & 0x4000) && (stat2 & 0x0200))) { //set MII for 100BaseTX and Full Duplex mac->cfg = mac->cfg | CFG_SPD| CFG_FD; // printf("MII: 100BaseTX and Full Duplex detected\n"); return 1; } else if ((stat1 & 0x1000) && (!(stat2 & 0x4000) && (stat2 & 0x0200))) { //set MII for 10BaseT and Full Duplex mac->cfg = (mac->cfg & ~CFG_SPD) | CFG_FD; // printf("MII: 10BaseT and Full Duplex detected\n"); return 1; } else if ((stat1 & 0x2000) && ((stat2 & 0x4000) && (!(stat2 & 0x0200)))) { //set MII for 100BaseTX and Half Duplex mac->cfg = (mac->cfg | CFG_SPD ) & ~CFG_FD; // printf("MII: 100BaseTX and Hall Duplex detected\n"); return 1; } else if ((stat1 & 0x0800) && ((!(stat2 & 0x4000)) && (!(stat2 & 0x0200)))) { //set MII for 10BaseT and Half Duplex mac->cfg = mac->cfg & ~CFG_SPD & ~CFG_FD; // printf("MII: 10BaseT and Hall Duplex detected\n"); return 1; } return 0;}int MDIO_StartupPhy(void) { int ret; if(mac->sr & SR_LINK) { printf("MDIO_StartupPhy: no link\n"); return 0; }; mac->ctl |= CTL_MPE; ret = MII_GetLinkSpeed(); if (ret == 0) { printf("MDIO_StartupPhy: MII_GetLinkSpeed failed\n"); // ret = AutoNegotiate(&stst); ret = 0; } else { ret = 1; } mac->ctl &= ~CTL_MPE; return ret;};rbf_t* rbfdt;rbf_t* rbfp;int eth_init( bd_t *bd ) { int ret; int i; rbfdt=RBF_FRAMEBTD; for(i=0;i<RBF_FRAMEMAX;i++) { rbfdt[i].addr=RBF_FRAMEBUF+RBF_FRAMELEN*i; rbfdt[i].size=0; }; rbfdt[RBF_FRAMEMAX-1].addr|=RBF_WRAP; rbfp=&rbfdt[0]; ret = MDIO_StartupPhy(); mac->sa2l = (bd->bi_enetaddr[3] << 24) | (bd->bi_enetaddr[2] << 16) | (bd->bi_enetaddr[1] << 8) | (bd->bi_enetaddr[0]); mac->sa2h = (bd->bi_enetaddr[5] << 8) | (bd->bi_enetaddr[4]); mac->rbqp=(long)(&rbfdt[0]); mac->rsr &= ~(RSR_OVR | RSR_REC | RSR_BNA); mac->cfg = (mac->cfg | CFG_CAF | CFG_NBC ) & ~CFG_CLK; mac->ctl |= CTL_TE | CTL_RE ; return 0;};int eth_send(volatile void *packet, int length) { while(!(mac->tsr & TSR_IDLE)); //ggi bug on bnq bit _BNQ)); mac->tar=(long)packet; mac->tcr=length; while(mac->tcr & 0x7ff); mac->tsr |= TSR_COMP; return 0;};int eth_rx(void) { int size,i; unsigned char *src, *dst; if(!(rbfp->addr & RBF_OWNER)) return 0; size=rbfp->size & RBF_SIZE; NetReceive(rbfp->addr & RBF_ADDR, size); rbfp->addr &= ~RBF_OWNER; if(rbfp->addr & RBF_WRAP) rbfp=&rbfdt[0]; else rbfp++; mac->rsr |= RSR_REC; return size;};void eth_halt( void ) {};#endif#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -