3608|6

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请问:开发板DM9000A与主机通信问题 [复制链接]

我把主机ip设置为211.83.102.215,板子上dm9000a的ip设置为211.83.102.214
通过交换机相连

板子上电,进入u-boot中,使用tftp下载内核和文件系统,下载的非常快,反正是基本没有什么延时

但是当我进入系统之后,再使用板子ping主机就出现了问题了,如下显示
ping 211.83.102.215
PING 211.83.102.215 (211.83.102.215): 56 data bytes

64 bytes from 211.83.102.215: icmp_seq=1 ttl=64 time=1000.6 ms
64 bytes from 211.83.102.215: icmp_seq=2 ttl=64 time=1000.6 ms
......
64 bytes from 211.83.102.215: icmp_seq=24 ttl=64 time=1000.6 ms
64 bytes from 211.83.102.215: icmp_seq=25 ttl=64 time=1000.7 ms

--- 192.168.0.5 ping statistics ---
27 packets transmitted, 26 packets received, 3% packet loss
round-trip min/avg/max = 996.2/1000.6/1004.1 ms

为什么会延时这么大呢?
在u-boot中下载速度很快,应该不太会是布线的原因啊
谁遇到过这种情况的给点提示,非常感谢!

最新回复

楼主,你把中断 改成高电平触发试试。。。 反正网卡 的问题就那几个 总线,中断,地址,等等的初使化   详情 回复 发表于 2009-1-8 22:34
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
u-boot用的网卡驱动和你系统的驱动肯定是不一样的,这样问题可以肯定的是,你系统的网卡驱动有问题
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我也是觉得系统网卡驱动的问题
但是现在找不到原因,改了驱动里面设置的寄存器,然后又出新问题了,申请不到中断,我网卡使用的是EINT7中断线,对应的中断号应该为35,但是每次都是去申请23,从而申请不成功,我试过在申请时request_irq时强制为35,但是还是去申请23号,不知道怎么会出现种种莫名奇妙的问题!
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

4
 
附上probe 和open两个函数 ,希望有高手给解答一下

/*
  Search DM9000 board, allocate space and register it
*/
static unsigned char eth1_mac_addr[6] = {0x00, 0x13, 0xf6, 0x6c, 0x87, 0x89};
static unsigned char eth2_mac_addr[6] = {0x00, 0x13, 0xf6, 0x6c, 0x87, 0x90};
static unsigned char eth3_mac_addr[6] = {0x00, 0x13, 0xf6, 0x6c, 0x87, 0x91};
int __init dmfe_probe(struct DEVICE *dev)
{       
        ////////////////////////////////////////
        //i2c_data add by zy
        //unsigned int rd_adr=0x0;
        //unsigned int rd_num=0x06;
        //unsigned char * get_data;
        //unsigned char buff[64];
        static char sEthernet[5];
        struct board_info *db;    /* Point a board information structure */
        u32 id_val;
        u32 iobase; // = DM9000_MIN_IO;
        u16 i, dm9000_count = 0;
        u8  irqline;
        //printk("BWSCON=%x\n",BWSCON);
        BANKCON1=0xffff;
        BWSCON &= 0xffffff0f;
        BWSCON|=0xd0;
        //printk("BWSCON2=%x\n",BWSCON);
        GPFCON = 0xaaaa; //EINT0 from PORT F control register
       
        EXTINT0 |= 0x40000000; //EINT0 Rising edge triggered
        INTMSK &= 0xffffffef; //EINT0 Enable
        EINTMASK &= 0x00ffff70;
printk("BANKCON1 = 0x%x\nBWSCON = 0x%x\nGPFCON = 0x%x\nEXTINT0 = 0x%x\nINTMSK = 0x%x\n EINTMASK = 0x%x\n",BANKCON1, BWSCON, GPFCON, EXTINT0, INTMSK, EINTMASK);
        //INTPND |= 0x1;
        //set_external_irq (IRQ_EINT7, EXT_RISING_EDGE, GPIO_PULLUP_DIS);       
       
        //printk("******** dm9000 probe dev->name=%s\n",dev->name);
        if(strcmp(dev->name,sEthernet)!=0)strcpy(sEthernet,dev->name);
        else return 0;
        if(strcmp(dev->name,"eth0")==0)
        {       
                printk("eth0 network interface found ");
                iobase = ioremap(DM9000_MIN_IO_ETH1,0x400);
                //printk("iobase=%x\n",iobase);
                dev->irq = IRQ_EINT7;   //EINT0
                printk("eth0 dev->irq = %d\n", dev->irq);
                for (i=0; i<6; i++)
                {
                          dev->dev_addr = eth1_mac_addr;//db->srom;
                  //        printk("%02X:",dev->dev_addr);
                }
                //printk("\n");
               
        }else
        if(strcmp(dev->name,"eth1")==0)
        {       
                //printk("eth2 network interface found ");
                iobase = DM9000_MIN_IO_ETH2;
                dev->irq = 90;  //INT5
                for (i=0; i<6; i++)
                {
                           dev->dev_addr = eth2_mac_addr;//db->srom;
                  //         printk("%02X:",dev->dev_addr);
                 }
                //printk("\n");
               
        }else       
        if(strcmp(dev->name,"eth3")==0)
        {       
                //printk("eth3 network interface found ");
                iobase = DM9000_MIN_IO_ETH3;
                dev->irq = 91;  //INT6
                for (i=0; i<6; i++)
                {
                        dev->dev_addr = eth3_mac_addr;//db->srom;
                  //      printk("%02X:",dev->dev_addr);
                }
                //printk("\n");
               
        }else
                return 0;
        //printk("HHTech I/O: %x, VID:   succ\n", iobase);
        //return;
        //printk("Device Name=%s,name=%s\n",dev->name,dev->priv);
        //DMFE_DBUG(0, "dmfe_probe()",0);
        //iow(db, 0xfe, 0x0f);         /* Clear interrupt status */
        //printk("222\n");
        /* Disable all interrupt */
        //iow(db, 0xff, 0x80);
/////////////////////////////////////////////////////////////////////////
        /* Search All DM9000 NIC */
        //{
        //printk("iobase=%x,value=%x\n",iobase,DM9000_VID_L);
               
        outb(DM9000_VID_L, iobase);
        id_val = inb(iobase + 4);
        outb(DM9000_VID_H, iobase);
        id_val |= inb(iobase + 4) << 8;
        outb(DM9000_PID_L, iobase);
        id_val |= inb(iobase + 4) << 16;
        outb(DM9000_PID_H, iobase);
        id_val |= inb(iobase + 4) << 24;

        if (id_val == DM9000_ID) {
            printk("HHTech DM9000 %s I/O: %x,VID: %x,MAC: ", dev->name,iobase, id_val);
            dm9000_count++;
            /* Init network device */
            dev = init_etherdev(dev, 0);

        /* Allocated board information structure */
        irqline = 3;
        db = (void *)(kmalloc(sizeof(*db), GFP_KERNEL|GFP_DMA));
        memset(db, 0, sizeof(*db));
        dev->priv = db;        /* link device and board info */
        db->next_dev = dmfe_root_dev;
        dmfe_root_dev = dev;
        db->ioaddr = iobase;
        db->io_data = iobase + 4;

        /* driver system function */
        dev->base_addr = iobase;
        //dev->irq = 68; //INT4 166;//irqline;
        dev->open = &dmfe_open;
        dev->hard_start_xmit = &dmfe_start_xmit;
        dev->stop = &dmfe_stop;
        dev->get_stats = &dmfe_get_stats;
        dev->set_multicast_list = &dm9000_hash_table;
        dev->do_ioctl = &dmfe_do_ioctl;

        /* Read SROM content */
        /*for (i=0; i<64; i++)
                ((u16 *)db->srom) = read_srom_word(db, i);*/

                /* Set Node Address */
                //add by zy
                //i2c_read(0x7a,buff,6);
                //we set lan-switch data to first 24 bytes,then put mac data to the last 6 bytes.
                //printk("MAC set to ");
                for (i=0; i<6; i++){
        //            dev->dev_addr = eth_mac_addr;//db->srom;
                    printk("%02X:",dev->dev_addr);
                }
                printk("\n");
        }

        if (dm9000_count) {
        //request_irq(db->irq, &dmfe_interrupt,0,"DM9000 device",dev);
/* Enable interrupts for GPIO6 */
//L-->H
//HHTECH
//*((volatile unsigned long *) (MCF_MBAR2+MCFSIM2_GPIOINTENABLE)) |=0x00000040;
/* Enable interrupt level for GPIO6 - VEC38 */
//*((volatile unsigned long *) (MCF_MBAR2+MCFSIM2_INTLEVEL5)) |=0x04000000;
        }
//printk("**** request_irq=%x\n",dev->irq);
//if(request_irq(dev->irq, &dmfe_interrupt,SA_SHIRQ,"DM9000 device",dev))
  //              return -EAGAIN;
//        printk(" ****** success  rquest_irq\n");
        /* Re-enable interrupt mask */
        //iow(db, 0xff, 0x83);
        return dm9000_count ? 0:-ENODEV;
}

/*
  Open the interface.
  The interface is opened whenever "ifconfig" actives it.
*/
static int dmfe_open(struct DEVICE *dev)
{
        board_info_t * db = (board_info_t *)dev->priv;
        int rc;

        DMFE_DBUG(0, "dmfe_open", 0);

        //minor = MINOR(dev->priv);
        //printk("minor=%x\n",dev->minor);
        //if (request_irq(dev->irq, &dmfe_interrupt, SA_SHIRQ, dev->name, dev))
        printk("request_irq, irq=%x\n",dev->irq);
        rc = request_irq(dev->irq, &dmfe_interrupt,SA_INTERRUPT/*SA_SHIRQ*/,"DM9000 device",dev);
        //if(request_irq(dev->irq, &dmfe_interrupt,SA_INTERRUPT/*SA_SHIRQ*/,"DM9000 device",dev))
        if (rc < 0)
        {
                printk("request_irq failure, irq=%x, error = %d\n",dev->irq, rc);
                return -EAGAIN;
        }
        printk("request_irq ok, irq=%x\n",dev->irq);
        /* Initilize DM910X board */
        dmfe_init_dm9000(dev);

//        printk("end init\n");
        /* Init driver variable */
        db->dbug_cnt = 0;
        db->runt_length_counter = 0;
        db->long_length_counter = 0;
        db->reset_counter = 0;

        /* Active System Interface */
        //dev->tbusy = 0;        /* Can transmit packet */
        //dev->start = 1;        /* interface ready */
        //mark above for kernel 2.4
        netif_wake_queue(dev);         //add by simon 2001.9.4 for kernel 2.4
        MOD_INC_USE_COUNT;

//        printk("init timer\n");
        /* set and active a timer process */
        init_timer(&db->timer);
//        printk("end timer\n");
        db->timer.expires = DMFE_TIMER_WUT * 2;
        db->timer.data = (unsigned long)dev;
        db->timer.function = &dmfe_timer;
        add_timer(&db->timer);

        return 0;
}
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
--- 192.168.3.1 ping statistics ---
257 packets transmitted, 57 packets received, 77% packet loss
round-trip min/avg/max = 0.098/0.113/0.189 ms
[root@(none) ~]#

我拿2.6.27的来改,ping 是能ping 通了,但丢包这么严重。怎么回事啊?
还有,我的中断 可以设成高电平和上长升沿触发,都可以ping通,但丢包率是一样的。
低电平不能触发中断
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

6
 
我的问题解决了 是总线没配置好。我的是bankcon4
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
楼主,你把中断 改成高电平触发试试。。。

反正网卡 的问题就那几个

总线,中断,地址,等等的初使化

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表