天嵌 ARM开发社区

 找回密码
 注册
查看: 2321|回复: 6

我的linux移植dm9000出问题了怎么解决

[复制链接]
denny2011 发表于 2011-10-16 21:26:20 | 显示全部楼层 |阅读模式
我的虚拟机系统是红帽9  内核是2.6.30.4 编译器是4.3.3  按照tq2440的移植手册step by step 来,到第13步出现问题,我修改了那个配置 make menuconfig  ,但是dm9000.c的内容发现和手册里面讲的不一致,我就没有修改dm9000.c,因为那些东西不知道往哪里加,行数和手册里面讲的不一致,现在make zImage,总是报错,因为dm9000.c没有修改,其他的修改了却改不回来,不记得修改之前是什么了......怎么解决啊,,,,,,,,,
亚瑟王 发表于 2011-10-18 11:51:39 | 显示全部楼层
你可以直接从天嵌科技的光盘里面的内核中复制修改好的dm9000.c的代码过来啊。
至于你其它的修改可以按照手册逆向操作。
回复

使用道具 举报

 楼主| denny2011 发表于 2011-11-4 18:17:11 | 显示全部楼层
谢谢管理员的回复,但是我还是没有找到啊,我看到网上有人说大部分是修改dm9000_probe函数
然后我将函数修改为
-----------------------------------------------------------------------------------------
dm9000_probe(struct platform_device *pdev)
{
          #if defined(CONFIG_ARCH_S3C2410)
      unsigned int oldval_bwscon;
      unsigned int oldval_bankcon4;
      #endif/*denny add it hang 4*/
       
        struct dm9000_plat_data *pdata = pdev->dev.platform_data;
        struct board_info *db;        /** Point a board information structure */
        struct net_device *ndev;
        const unsigned char *mac_src;
        int ret = 0;
        int iosize;
        int i;
        u32 id_val;

        /** Init network device */
        ndev = alloc_etherdev(sizeof(struct board_info));
        if (!ndev) {
                dev_err(&pdev->dev, "could not allocate device.\n");
                return -ENOMEM;
        }
        #if        defined(CONFIG_ARCH_s3C2410)
                        *((volatile unsigned int*)S3C2410_BWSCON)=(oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
                        *((volatile unsigned int*)S3C2410_BANKCON4)=0x1f7c;
                #endif/*denny add it hang 4*/
        SET_NETDEV_DEV(ndev, &pdev->dev);

        dev_dbg(&pdev->dev, "dm9000_probe()\n");

        /** setup board info structure */
        db = netdev_priv(ndev);

        db->dev = &pdev->dev;
        db->ndev = ndev;

        spin_lock_init(&db->lock);
        mutex_init(&db->addr_lock);

        INIT_DELAYED_WORK(&db->phy_poll, dm9000_poll_work);

        db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        db->data_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
        db->irq_res  = platform_get_resource(pdev, IORESOURCE_IRQ, 0);

        if (db->addr_res == NULL || db->data_res == NULL ||
            db->irq_res == NULL) {
                dev_err(db->dev, "insufficient resources\n");
                ret = -ENOENT;
                goto out;
        }

        db->irq_wake = platform_get_irq(pdev, 1);
        if (db->irq_wake >= 0) {
                dev_dbg(db->dev, "wakeup irq %d\n", db->irq_wake);

                ret = request_irq(db->irq_wake, dm9000_wol_interrupt,
                                  IRQF_SHARED, dev_name(db->dev), ndev);
                if (ret) {
                        dev_err(db->dev, "cannot get wakeup irq (%d)\n", ret);
                } else {

                        /** test to see if irq is really wakeup capable */
                        ret = set_irq_wake(db->irq_wake, 1);
                        if (ret) {
                                dev_err(db->dev, "irq %d cannot set wakeup (%d)\n",
                                        db->irq_wake, ret);
                                ret = 0;
                        } else {
                                set_irq_wake(db->irq_wake, 0);
                                db->wake_supported = 1;
                        }
                }
        }

        iosize = resource_size(db->addr_res);
        db->addr_req = request_mem_region(db->addr_res->start, iosize,
                                          pdev->name);

        if (db->addr_req == NULL) {
                dev_err(db->dev, "cannot claim address reg area\n");
                ret = -EIO;
                goto out;
        }

        db->io_addr = ioremap(db->addr_res->start, iosize);

        if (db->io_addr == NULL) {
                dev_err(db->dev, "failed to ioremap address reg\n");
                ret = -EINVAL;
                goto out;
        }

        iosize = resource_size(db->data_res);
        db->data_req = request_mem_region(db->data_res->start, iosize,
                                          pdev->name);

        if (db->data_req == NULL) {
                dev_err(db->dev, "cannot claim data reg area\n");
                ret = -EIO;
                goto out;
        }

        db->io_data = ioremap(db->data_res->start, iosize);

        if (db->io_data == NULL) {
                dev_err(db->dev, "failed to ioremap data reg\n");
                ret = -EINVAL;
                goto out;
        }

        /** fill in parameters for net-dev structure */
        ndev->base_addr = (unsigned long)db->io_addr;
        ndev->irq        = db->irq_res->start;

        /** ensure at least we have a default set of IO routines */
        dm9000_set_io(db, iosize);

        /** check to see if anything is being over-ridden */
        if (pdata != NULL) {
                /** check to see if the driver wants to over-ride the
                 * default IO width */

                if (pdata->flags & DM9000_PLATF_8BITONLY)
                        dm9000_set_io(db, 1);

                if (pdata->flags & DM9000_PLATF_16BITONLY)
                        dm9000_set_io(db, 2);

                if (pdata->flags & DM9000_PLATF_32BITONLY)
                        dm9000_set_io(db, 4);

                /** check to see if there are any IO routine
                 * over-rides */

                if (pdata->inblk != NULL)
                        db->inblk = pdata->inblk;

                if (pdata->outblk != NULL)
                        db->outblk = pdata->outblk;

                if (pdata->dumpblk != NULL)
                        db->dumpblk = pdata->dumpblk;

                db->flags = pdata->flags;
        }

#ifdef CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL
        db->flags |= DM9000_PLATF_SIMPLE_PHY;
#endif

        dm9000_reset(db);

        /** try multiple times, DM9000 sometimes gets the read wrong */
        for (i = 0; i < 8; i++) {
                id_val  = ior(db, DM9000_VIDL);
                id_val |= (u32)ior(db, DM9000_VIDH) << 8;
                id_val |= (u32)ior(db, DM9000_PIDL) << 16;
                id_val |= (u32)ior(db, DM9000_PIDH) << 24;

                if (id_val == DM9000_ID)
                        break;
                dev_err(db->dev, "read wrong id 0x%08x\n", id_val);
        }

        if (id_val != DM9000_ID) {
                dev_err(db->dev, "wrong id: 0x%08x\n", id_val);
                ret = -ENODEV;
                goto out;
        }

        /** Identify what type of DM9000 we are working on */

        id_val = ior(db, DM9000_CHIPR);
        dev_dbg(db->dev, "dm9000 revision 0x%02x\n", id_val);

        switch (id_val) {
        case CHIPR_DM9000A:
                db->type = TYPE_DM9000A;
                break;
        case CHIPR_DM9000B:
                db->type = TYPE_DM9000B;
                break;
        default:
                dev_dbg(db->dev, "ID %02x => defaulting to DM9000E\n", id_val);
                db->type = TYPE_DM9000E;
        }

        /** dm9000a/b are capable of hardware checksum offload */
        if (db->type == TYPE_DM9000A || db->type == TYPE_DM9000B) {
                db->can_csum = 1;
                db->rx_csum = 1;
                ndev->features |= NETIF_F_IP_CSUM;
        }

        /** from this point we assume that we have found a DM9000 */

        /** driver system function */
        ether_setup(ndev);

        ndev->netdev_ops        = &dm9000_netdev_ops;
        ndev->watchdog_timeo        = msecs_to_jiffies(watchdog);
        ndev->ethtool_ops        = &dm9000_ethtool_ops;

        db->msg_enable       = NETIF_MSG_LINK;
        db->mii.phy_id_mask  = 0x1f;
        db->mii.reg_num_mask = 0x1f;
        db->mii.force_media  = 0;
        db->mii.full_duplex  = 0;
        db->mii.dev             = ndev;
        db->mii.mdio_read    = dm9000_phy_read;
        db->mii.mdio_write   = dm9000_phy_write;
        #if        defined(CONFIG_ARCH_S3C2410)
                printk("Now use the default MAC address:10:23:45:67:89:ab\n");
                mac_arc="EmbedSky";
                ndev->dev_addr[0]=0x10;
                ndev->dev_addr[1]=0x23;
                ndev->dev_addr[2]=0x45;
                ndev->dev_addr[3]=0x67;
                ndev->dev_addr[4]=0x89;
                ndev->dev_addr[5]=0xab;
        #else
        mac_src = "eeprom";//this is 1278 at yizhizhouce

        /** try reading the node address from the attached EEPROM */
        for (i = 0; i < 6; i += 2)
                dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i);

        if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {
                mac_src = "platform data";
                memcpy(ndev->dev_addr, pdata->dev_addr, 6);
        }
       
        if (!is_valid_ether_addr(ndev->dev_addr)) {
                /** try reading from mac */
               
                mac_src = "chip";
                for (i = 0; i < 6; i++)
                        ndev->dev_addr[i] = ior(db, i+DM9000_PAR);
        }

        if (!is_valid_ether_addr(ndev->dev_addr))
                dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "
                         "set using ifconfig\n", ndev->name);
        #endif
        platform_set_drvdata(pdev, ndev);
        ret = register_netdev(ndev);

        if (ret == 0)
                printk(KERN_INFO "%s: dm9000%c at %p,%p IRQ %d MAC: %pM (%s)\n",
                       ndev->name, dm9000_type_to_char(db->type),
                       db->io_addr, db->io_data, ndev->irq,
                       ndev->dev_addr, mac_src);
        return 0;

out:
        dev_err(db->dev, "not found (%d).\n", ret);
        #if        defined(OCNFIG_ARCH_S3C2410)
                *(volatile unsigned int*)S3C2410_BWSCON=oldval_bwscon;
                *(volatile unsigned int*)S3C2410_BANKCON4=oldval_bankcon4;
        #endif/*denny add it hang 4*/
        dm9000_release_board(pdev, db);
        free_netdev(ndev);
  
        return ret;
}

-----------------------------------------------------------------------------------------
其中有/*denny add it hang 4*/注释的是我加入的,其他的修改按照移植手册一步一步的都没有问题,但是这样子make zImage时候,还是有问题dm9000.o出问题,,,,,
你能帮我解决问题吗?谢谢管理员
回复

使用道具 举报

亚瑟王 发表于 2011-11-14 18:58:51 | 显示全部楼层
把编译时的错误信息贴出来吧。
回复

使用道具 举报

百泉湖 发表于 2012-4-21 17:18:50 | 显示全部楼层
arch/arm/mach-s3c2440/mach-smdk2440.c:255: error: 'tq2440_lcd_cfg' undeclared here (not in a function)
make[1]: *** [arch/arm/mach-s3c2440/mach-smdk2440.o] Error 1
make: *** [arch/arm/mach-s3c2440] Error 2
[root@localhost linux-2.6.30.4]# gedit arch/arm/mach-s3c2440/mach-smdk2440.c
                                                                                
回复

使用道具 举报

百泉湖 发表于 2012-4-21 17:19:53 | 显示全部楼层
请教管理员 我这个是怎么回事呀
回复

使用道具 举报

wuweidong 发表于 2012-4-22 13:14:09 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-6-19 15:42 , Processed in 2.042476 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表