天嵌 ARM开发社区

 找回密码
 注册
查看: 2065|回复: 2

移植网卡 没移植成功

[复制链接]
changxy 发表于 2011-4-26 22:42:15 | 显示全部楼层 |阅读模式
这是串口的错误:

##### EmbedSky BIOS for SKY2440/TQ2440 #####
Press Space key to Download Mode !
Booting Linux ...
Copy linux kernel from 0x00200000 to 0x30008000, size = 0x00200000 ... Copy Kernel to SDRAM done,NOW, Booting Linux......
Uncompressing Linux.......................................................................................................................... done, booting the kernel.
Linux version 2.6.31 (changxy@changxy) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) ) #21 Tue Apr 26 22:04:58 CST 2011
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: SMDK2440
ATAG_INITRD is deprecated; please update your bootloader.
Memory policy: ECC disabled, Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, (c) 2004 Simtec Electronics
S3C244X: core 400.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256
Kernel command line: noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
PID hash table entries: 256 (order: 8, 1024 bytes)
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 60896KB available (3440K code, 311K data, 124K init, 0K highmem)
NR_IRQS:85
irq: clearing pending ext status 00080000
irq: clearing subpending status 00000002
Console: colour dummy device 80x30
console [ttySAC0] enabled
Calibrating delay loop... 199.47 BogoMIPS (lpj=498688)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
NET: Registered protocol family 16
Unable to handle kernel NULL pointer dereference at virtual address 00000008
pgd = c0004000
[00000008] *pgd=00000000
Internal error: Oops: 5 [#1]
Modules linked in:
CPU: 0    Not tainted  (2.6.31 #21)
PC is at platform_device_add+0x68/0x148
LR is at platform_device_add+0x44/0x148
pc : [<c017ebdc>]    lr : [<c017ebb8>]    psr: 80000013
sp : c3819f88  ip : c38463c9  fp : 00000000
r10: 00000000  r9 : 00000000  r8 : 00000000
r7 : 00000006  r6 : 00000000  r5 : c039c298  r4 : 00000000
r3 : 00000000  r2 : c039c2a0  r1 : 00000000  r0 : 00000000
Flags: Nzcv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
Control: c000717f  Table: 30004000  DAC: 00000017
Process swapper (pid: 1, stack limit = 0xc3818270)
Stack: (0xc3819f88 to 0xc381a000)
9f80:                   00000005 c0023dcc 00000000 00000006 00000000 c017eef0
9fa0: c0023d9c 00000000 00000000 c000b408 00000000 c000d658 c0021110 c000b420
9fc0: c0021110 c00272c4 c000b408 c03b3be4 c03b9ba0 c0021448 c0021110 00000000
9fe0: 00000000 00000000 00000000 c0008574 00000000 c0028d74 33cc34ed 378813c8
[<c017ebdc>] (platform_device_add+0x68/0x148) from [<c017eef0>] (platform_add_devices+0x1c/0x60)
[<c017eef0>] (platform_add_devices+0x1c/0x60) from [<c000d658>] (smdk2440_machine_init+0x24/0x30)
[<c000d658>] (smdk2440_machine_init+0x24/0x30) from [<c000b420>] (customize_machine+0x18/0x24)
[<c000b420>] (customize_machine+0x18/0x24) from [<c00272c4>] (do_one_initcall+0x5c/0x1b4)
[<c00272c4>] (do_one_initcall+0x5c/0x1b4) from [<c0008574>] (kernel_init+0x90/0x108)
[<c0008574>] (kernel_init+0x90/0x108) from [<c0028d74>] (kernel_thread_exit+0x0/0x8)
Code: e1a04006 ea00001e e59530b4 e0831004 (e5913008)
---[ end trace 1b75b31a2719ed1c ]---
Kernel panic - not syncing: Attempted to kill init!
[<c002d738>] (unwind_backtrace+0x0/0xdc) from [<c029b238>] (panic+0x40/0x110)
[<c029b238>] (panic+0x40/0x110) from [<c00494bc>] (do_exit+0x64/0x578)
[<c00494bc>] (do_exit+0x64/0x578) from [<c002bcdc>] (die+0x148/0x168)
[<c002bcdc>] (die+0x148/0x168) from [<c002e658>] (__do_kernel_fault+0x64/0x74)
[<c002e658>] (__do_kernel_fault+0x64/0x74) from [<c002e874>] (do_page_fault+0x20c/0x22c)
[<c002e874>] (do_page_fault+0x20c/0x22c) from [<c0027204>] (do_DataAbort+0x30/0x90)
[<c0027204>] (do_DataAbort+0x30/0x90) from [<c0027960>] (__dabt_svc+0x40/0x60)
Exception stack(0xc3819f40 to 0xc3819f88)
9f40: 00000000 00000000 c039c2a0 00000000 00000000 c039c298 00000000 00000006
9f60: 00000000 00000000 00000000 00000000 c38463c9 c3819f88 c017ebb8 c017ebdc
9f80: 80000013 ffffffff                                                      
[<c0027960>] (__dabt_svc+0x40/0x60) from [<c017ebdc>] (platform_device_add+0x68/0x148)
[<c017ebdc>] (platform_device_add+0x68/0x148) from [<c017eef0>] (platform_add_devices+0x1c/0x60)
[<c017eef0>] (platform_add_devices+0x1c/0x60) from [<c000d658>] (smdk2440_machine_init+0x24/0x30)
[<c000d658>] (smdk2440_machine_init+0x24/0x30) from [<c000b420>] (customize_machine+0x18/0x24)
[<c000b420>] (customize_machine+0x18/0x24) from [<c00272c4>] (do_one_initcall+0x5c/0x1b4)
[<c00272c4>] (do_one_initcall+0x5c/0x1b4) from [<c0008574>] (kernel_init+0x90/0x108)
[<c0008574>] (kernel_init+0x90/0x108) from [<c0028d74>] (kernel_thread_exit+0x0/0x8)


/*        db = netdev_priv(ndev);*/
                db = netdev_priv(ndev);
        memset(db, 0, sizeof(*db));

db指针初始化了。代码跟手册上的一样。。。。


2楼是 arch/arm/mach-s3c2440/mach-smdk2440.c 文件

3楼是 driver/net/dm9000.c 的probe函数

希望各位路过的兄弟帮忙解答
 楼主| changxy 发表于 2011-4-26 22:48:08 | 显示全部楼层
dm9000_probe(struct platform_device *pdev)
{
        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;
        }

        SET_NETDEV_DEV(ndev, &pdev->dev);

#if defined (CONFIG_ARCH_S3C2410)
unsigned int oldval_bwscon = *((volatile unsigned int *)S3C2410_BWSCON);
unsigned int oldval_bankcon4 = *((volatile unsigned int *)S3C2410_BANKCON4);
#endif

#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


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

        /* setup board info structure */
/*        db = netdev_priv(ndev);*/
                db = netdev_priv(ndev);
        memset(db, 0, sizeof(*db));

        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;
        }

        iosize = res_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 = res_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;
        }

        /* 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 ");
        mac_src ="changxy";
        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";

        /* 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

#if defined (CONFIG_ARCH_S3C2410)
        *(volatile unsigned int *)S3C2410_BWSCON = oldval_bwscon;
        *(volatile unsigned int *)S3C2410_BANKCON4 = oldval_bankcon4;
#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);

        dm9000_release_board(pdev, db);
        free_netdev(ndev);

        return ret;
}
 楼主| changxy 发表于 2011-4-26 22:49:44 | 显示全部楼层
static struct resource s3c_dm9k_resource[]=
{
        [0]=
        {
                .start = S3C2410_CS4,
                .end   = S3C2410_CS4+3,
                .flags = IORESOURCE_MEM,

        },
        [1]=
        {
                .start = S3C2410_CS4+4,
                .end   = S3C2410_CS4+4+3,
                .flags = IORESOURCE_MEM,
        },

        [2]=
        {
                .start = IRQ_EINT7,
                .end   = IRQ_EINT7,
                .flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,
        },
};

static struct dm9000_plat_data s3c_dm9k_platdata =
{
        .flags = DM9000_PLATF_16BITONLY,
};

struct platform_device s3c_device_dm9000=
{        .name = "dm9000",
        .id   = 0,
        .num_resources = ARRAY_SIZE(s3c_dm9k_resource),
        .dev  =
        {
                .platform_data = &s3c_dm9k_platdata,
        }
};
static struct platform_device *smdk2440_devices[] __initdata = {
        &s3c_device_usb,
        &s3c_device_lcd,
        &s3c_device_wdt,
        &s3c_device_i2c0,
        &s3c_device_iis,
        &s3c_device_dm9000,
};
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-7-7 21:51 , Processed in 1.062500 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

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