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

📄 ethernet.c

📁 开发三星s3c44b0引导程序
💻 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 + -