ARM uboot 的移植5 -从 uboot 官方标准uboot 开始移植

一、环境变量的移植

1、iNand分区表检查 - env 究竟应该放在哪

(1) 测试环境变量是否可以保存。通过开机 set 设置环境变量,然后 save,然后关机后重启来测试环境变量的保存是否成功。

在这里插入图片描述


(2) 我们的环境变量究竟保存到哪里去了?这个就要去分析代码中的分区表。

(3) 环境变量应该被放在哪里?虽然无法确定 ENV 一定要放在哪里,但是有一些地方肯定是不能放的,否则将来会出问题。

原则是:同一个 SD 卡扇区只能放一种东西,不能叠加,否则就会被覆盖掉。uboot 烧录时使用的扇区数是:SD2 的扇区 1-16, 和 49-x(x-49 的大于等于 uboot 的大小)。


(4) 从 uboot 的烧录情况来看,SD2 的扇区 0 空闲,扇区 1-16 被 uboot 的BL1占用,扇区 17-48 空闲,扇区 49-x 被 uboot 的 BL2 占用(BL2 即是整个 uboot)。

在这里插入图片描述

在这里插入图片描述

再往后就是内核、rootfs 等镜像的分区了。系统移植工程师可以根据 kernel 镜像大小、rootfs 大小等,来自由给 SD 分区。


(5) 从 uboot 的分区情况来看,ENV 不能往扇区 1-16 ,或者扇区 49-x 中来放置,其他地方都可以商量。ENV 的大小是 16K 字节,也就是 32 个扇区。

在这里插入图片描述


2、环境变量相关代码浏览

(1) 目前情况是,uboot 在 SD2 中,而 ENV 在 SD0 中,所以现在 ENV 不管放在哪个扇区都能工作,不会有问题。

但是我们还是得找到 ENV 分区所在扇区,并且改到不会和 uboot 冲突。因为将来部署系统时,我们会将 uboot 和 kernel、rootfs 等都烧录到 iNand 中去,那时候也要确保不会冲突。


在这里插入图片描述

在这里插入图片描述

(2)

static inline int write_env(struct mmc *mmc, unsigned long size,
			    unsigned long offset, const void *buffer)

类似于这种函数,在代码分析中,关键是弄明白各种参数的意义。mmc 表示要写的 mmc 设备,size 表示要写的大小,offset 表示要写到 SD 卡的哪个扇区去,buffer 是要写的内容。

在这里插入图片描述


(3) CONFIG_ENV_OFFSET 这个宏,决定了我们的 ENV 在 SD 卡中,相对 SD 卡扇区 0 的偏移量,也就是 ENV 写到 SD 卡的哪里去了。经过分析发现这个宏的值为 0.

所以我们的 ENV 被写到了 0 扇区开始的 32 个扇区(16kB)中。

在这里插入图片描述


(4) 写到这里(0 扇区开始的 32 个扇区)肯定不行,因为和 uboot 的 BL1 冲突了。

从 uboot 的分区情况来看,ENV 不能往扇区 1-16 ,或者扇区 49-x 中来放置,其他地方都可以商量。ENV 的大小是 16K 字节,也就是 32 个扇区。

解决方案是改变这个 CONFIG_ENV_OFFSET 的值,将 ENV 写到别的空闲扇区去。


(5)

#define MOVI_BL2_POS		((eFUSE_SIZE / MOVI_BLKSIZE) + MOVI_BL1_BLKCNT + MOVI_ENV_BLKCNT)	

后面这三个其实分别是1+16+32=49。

其中的 1 就是扇区 0(空闲的),16 就是扇区 1-16(uboot 的 BL1),32 就是扇区 17-48(存放 ENV 的),49 自然就是 uboot 的 BL2 开始扇区了。

这种安排是三星移植的 uboot 版本中推荐的 SD 卡的分区方式,不一定是唯一的。

在这里插入图片描述


(6) 我们参考这个设计,即可实现环境变量不冲突。所以只要将 ENV 放到 17 扇区起始的地方即可。

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


二、环境变量的测试和配置移植

1、如何测试环境变量的保存是否正确

(1) 程序修改重新编译后启动。

这时我们注意到,在上面第一节《环境变量的移植》中,明明已经将 bootdelay 修改为 7,但是由于我们定义了如下代码,改变了 ENV 分区的扇区位置:

//s5p_goni.h
//设置环境变量分区的起始扇区
#define CONFIG_ENV_OFFSET  (17*512)   //第17扇区开始的位置

之前的现象截图:

在这里插入图片描述


现在的现象截图:

在这里插入图片描述

可以看到,定义了变量 #define CONFIG_ENV_OFFSET (17*512) 后,环境变量变成了默认环境变量了。


注意:

启动后要注意, iNand 中本来有没有环境变量。为了保险起见,对 iNand 的前 49 个扇区进行擦除,然后就可以确保里面没有之前保存过的环境变量了。

在这里插入图片描述

使用命令:mmc write 0 30000000 0# 49 来擦除 SD0(iNand) 的扇区 0-48,保证以前的环境变量都没有了。

在这里插入图片描述
(这里我们只擦除 0-48 扇区,避免破坏了 BL2 分区)


(2) 重新开机后先 set 随便改一个环境变量作为标记,然后 saveenv 然后重启。

在这里插入图片描述


(3) 测试方法是,使用:mmc read 0 30000000 17# 32 命令,将 iNand 的 17 开始的 32 个扇区读出来到内存 30000000 处,然后 md 查看。找到显示区域里面的各个环境变量,看读出来的和自己刚才修改的值是否一样。

在这里插入图片描述

md [.b, .w, .l] address [# of objects]
Goni # md 30000000 300
30000000: 6eddde98 64756162 65746172 3531313d    ...nbaudrate=115
30000010: 00303032 746f6f62 73677261 6f6f723d    200.bootargs=roo
30000020: 62753d74 72213069 66746f6f 6f722073    t=ubi0!rootfs ro
30000030: 7366746f 65707974 6962753d 72207366    otfstype=ubifs r
30000040: 66746f6f 7367616c 6c75623d 65725f6b    ootflags=bulk_re
30000050: 6e2c6461 68635f6f 61645f6b 635f6174    ad,no_chk_data_c
30000060: 75206372 6d2e6962 383d6474 69627520    rc ubi.mtd=8 ubi
30000070: 64746d2e 7520333d 6d2e6962 363d6474    .mtd=3 ubi.mtd=6
30000080: 776c6120 5f737961 75736572 313d656d     always_resume=1
30000090: 6e6f6320 656c6f73 7974743d 32434153     console=ttySAC2
300000a0: 3531312c 6e303032 656d2038 30383d6d    ,115200n8 mem=80
300000b0: 656d204d 35323d6d 30404d36 30303478    M mem=256M@0x400
300000c0: 30303030 656d2030 32313d6d 30404d38    00000 mem=128M@0
300000d0: 30303578 30303030 746d2030 72617064    x50000000 mtdpar
300000e0: 733d7374 75736d61 6f2d676e 616e656e    ts=samsung-onena
300000f0: 313a646e 6f62286d 6f6c746f 72656461    nd:1m(bootloader
30000100: 35322c29 70286b36 6d617261 322c2973    ),256k(params),2
30000110: 6b363138 6e6f6328 29676966 286d382c    816k(config),8m(
30000120: 29617363 286d372c 6e72656b 2c296c65    csa),7m(kernel),
30000130: 6c286d31 2c29676f 286d3231 65646f6d    1m(log),12m(mode
30000140: 362c296d 71286d30 746f6f62 282d2c29    m),60m(qboot),-(
30000150: 29494255 6f6f6200 6f6c6274 393d6b63    UBI).bootblock=9
30000160: 6f6f6200 61686374 733d7472 6f207465    .bootchart=set o
30000170: 20737470 74696e69 62732f3d 622f6e69    pts init=/sbin/b
30000180: 63746f6f 74726168 72203b64 62206e75    ootchartd; run b
30000190: 63746f6f 6200646d 63746f6f 723d646d    ootcmd.bootcmd=r
300001a0: 75206e75 73666962 746f6f62 6f6f6200    un ubifsboot.boo
300001b0: 6c656474 313d7961 6f620030 3d6b746f    tdelay=10.bootk=
300001c0: 6e656e6f 20646e61 64616572 33783020    onenand read 0x3
300001d0: 37303030 20304346 30637830 30303030    0007FC0 0xc00000
300001e0: 36783020 30303030 6f623b30 206d746f     0x600000;bootm 
300001f0: 30337830 46373030 62003043 74746f6f    0x30007FC0.boott
30000200: 65636172 7465733d 20766e65 7374706f    race=setenv opts
30000210: 696e6920 6c616374 65645f6c 3b677562     initcall_debug;
30000220: 6e757220 6f6f6220 646d6374 6e6f6300     run bootcmd.con
30000230: 656c6f73 6e6f633d 656c6f73 7974743d    sole=console=tty
30000240: 32434153 3531312c 6e303032 6c660038    SAC2,115200n8.fl
30000250: 62687361 3d746f6f 20746573 746f6f62    ashboot=set boot
30000260: 73677261 6f6f7220 642f3d74 6d2f7665    args root=/dev/m
30000270: 6c626474 246b636f 6f6f627b 6f6c6274    tdblock${bootblo
30000280: 207d6b63 746f6f72 79747366 243d6570    ck} rootfstype=$
30000290: 6f6f727b 74736674 7d657079 69627520    {rootfstype} ubi
300002a0: 64746d2e 757b243d 6c626962 7d6b636f    .mtd=${ubiblock}
300002b0: 69627520 64746d2e 7520333d 6d2e6962     ubi.mtd=3 ubi.m
300002c0: 363d6474 6f7b2420 7d737470 6c7b2420    td=6 ${opts} ${l
300002d0: 6e696463 207d6f66 6f637b24 6c6f736e    cdinfo} ${consol
300002e0: 24207d65 6d656d7b 6f666e69 7b24207d    e} ${meminfo} ${
300002f0: 7064746d 73747261 72203b7d 62206e75    mtdparts}; run b
30000300: 6b746f6f 6d656d00 6f666e69 6d656d3d    ootk.meminfo=mem
30000310: 4d30383d 6d656d20 3635323d 7830404d    =80M mem=256M@0x
30000320: 30303034 30303030 6d656d20 3832313d    40000000 mem=128
30000330: 7830404d 30303035 30303030 636d6d00    M@0x50000000.mmc
30000340: 3d6b6c62 7665642f 636d6d2f 316b6c62    blk=/dev/mmcblk1
30000350: 6d003170 6f62636d 733d746f 62207465    p1.mmcboot=set b
30000360: 61746f6f 20736772 746f6f72 6d7b243d    ootargs root=${m
30000370: 6c62636d 72207d6b 66746f6f 70797473    mcblk} rootfstyp
30000380: 7b243d65 746f6f72 79747366 207d6570    e=${rootfstype} 
30000390: 2e696275 3d64746d 62757b24 6f6c6269    ubi.mtd=${ubiblo
300003a0: 207d6b63 2e696275 3d64746d 62752033    ck} ubi.mtd=3 ub
300003b0: 746d2e69 20363d64 706f7b24 207d7374    i.mtd=6 ${opts} 
300003c0: 636c7b24 666e6964 24207d6f 6e6f637b    ${lcdinfo} ${con
300003d0: 656c6f73 7b24207d 696d656d 7d6f666e    sole} ${meminfo}
300003e0: 6d7b2420 61706474 7d737472 7572203b     ${mtdparts}; ru
300003f0: 6f62206e 006b746f 7064746d 73747261    n bootk.mtdparts
30000400: 64746d3d 74726170 61733d73 6e75736d    =mtdparts=samsun
30000410: 6e6f2d67 6e616e65 6d313a64 6f6f6228    g-onenand:1m(boo
30000420: 616f6c74 29726564 3635322c 6170286b    tloader),256k(pa
30000430: 736d6172 38322c29 286b3631 666e6f63    rams),2816k(conf
30000440: 2c296769 63286d38 2c296173 6b286d37    ig),8m(csa),7m(k
30000450: 656e7265 312c296c 6f6c286d 312c2967    ernel),1m(log),1
30000460: 6d286d32 6d65646f 30362c29 6271286d    2m(modem),60m(qb
30000470: 29746f6f 55282d2c 00294942 7374706f    oot),-(UBI).opts
30000480: 776c613d 5f737961 75736572 313d656d    =always_resume=1
30000490: 6d617200 746f6f62 7465733d 6f6f6220    .ramboot=set boo
300004a0: 67726174 6f722073 2f3d746f 2f766564    targs root=/dev/
300004b0: 306d6172 20777220 746f6f72 79747366    ram0 rw rootfsty
300004c0: 653d6570 20327478 6f637b24 6c6f736e    pe=ext2 ${consol
300004d0: 24207d65 6d656d7b 6f666e69 6e69207d    e} ${meminfo} in
300004e0: 64727469 3378303d 30303033 2c303030    itrd=0x33000000,
300004f0: 72204d38 69646d61 383d6b73 00323931    8M ramdisk=8192.
30000500: 746f6f72 79747366 633d6570 666d6172    rootfstype=cramf
30000510: 66740073 6f627074 733d746f 62207465    s.tftpboot=set b
30000520: 61746f6f 20736772 746f6f72 6962753d    ootargs root=ubi
30000530: 6f722130 7366746f 6f6f7220 74736674    0!rootfs rootfst
30000540: 3d657079 66696275 6f722073 6c66746f    ype=ubifs rootfl
30000550: 3d736761 6b6c7562 6165725f 6f6e2c64    ags=bulk_read,no
30000560: 6b68635f 7461645f 72635f61 62752063    _chk_data_crc ub
30000570: 746d2e69 7b243d64 62696275 6b636f6c    i.mtd=${ubiblock
30000580: 6275207d 746d2e69 20333d64 2e696275    } ubi.mtd=3 ubi.
30000590: 3d64746d 7b242036 7374706f 7b24207d    mtd=6 ${opts} ${
300005a0: 6964636c 7d6f666e 637b2420 6f736e6f    lcdinfo} ${conso
300005b0: 207d656c 656d7b24 666e696d 24207d6f    le} ${meminfo} $
300005c0: 64746d7b 74726170 203b7d73 70746674    {mtdparts}; tftp
300005d0: 33783020 37303030 20304346 616d4975     0x30007FC0 uIma
300005e0: 203b6567 746f6f62 7830206d 30303033    ge; bootm 0x3000
300005f0: 30434637 69627500 616e653d 64656c62    7FC0.ubi=enabled
30000600: 69627500 636f6c62 00383d6b 66696275    .ubiblock=8.ubif
30000610: 6f6f6273 65733d74 6f622074 7261746f    sboot=set bootar
30000620: 72207367 3d746f6f 30696275 6f6f7221    gs root=ubi0!roo
30000630: 20736674 746f6f72 79747366 753d6570    tfs rootfstype=u
30000640: 73666962 6f6f7220 616c6674 623d7367    bifs rootflags=b
30000650: 5f6b6c75 64616572 5f6f6e2c 5f6b6863    ulk_read,no_chk_
30000660: 61746164 6372635f 69627520 64746d2e    data_crc ubi.mtd
30000670: 757b243d 6c626962 7d6b636f 69627520    =${ubiblock} ubi
30000680: 64746d2e 7520333d 6d2e6962 363d6474    .mtd=3 ubi.mtd=6
30000690: 6f7b2420 7d737470 6c7b2420 6e696463     ${opts} ${lcdin
300006a0: 207d6f66 6f637b24 6c6f736e 24207d65    fo} ${console} $
300006b0: 6d656d7b 6f666e69 7b24207d 7064746d    {meminfo} ${mtdp
300006c0: 73747261 72203b7d 62206e75 6b746f6f    arts}; run bootk
300006d0: 64707500 62657461 656e6f3d 646e616e    .updateb=onenand
300006e0: 61726520 30206573 30203078 30303178     erase 0x0 0x100
300006f0: 3b303030 656e6f20 646e616e 69727720    000; onenand wri
30000700: 30206574 30323378 30303830 78302030    te 0x32008000 0x
30000710: 78302030 30303031 75003030 74616470    0 0x100000.updat
30000720: 6f3d6b65 616e656e 6520646e 65736172    ek=onenand erase
30000730: 63783020 30303030 78302030 30303036     0xc00000 0x6000
30000740: 6f3b3030 616e656e 7720646e 65746972    00;onenand write
30000750: 33783020 38303031 20303030 30637830     0x31008000 0xc0
30000760: 30303030 36783020 30303030 70750030    0000 0x600000.up
30000770: 65746164 6e6f3d75 6e616e65 72652064    dateu=onenand er
30000780: 20657361 31307830 30303635 30203030    ase 0x01560000 0
30000790: 61653178 30303061 6e6f3b30 6e616e65    x1eaa0000;onenan
300007a0: 72772064 20657469 32337830 30303030    d write 0x320000
300007b0: 30203030 36323178 30303030 38783020    00 0x1260000 0x8
300007c0: 30303043 65760030 79666972 00006e3d    C0000.verify=n..
300007d0: 00000000 00000000 00000000 00000000    ................
300007e0: 00000000 00000000 00000000 00000000    ................
300007f0: 00000000 00000000 00000000 00000000    ................
30000800: 00000000 00000000 00000000 00000000    ................
30000810: 00000000 00000000 00000000 00000000    ................
30000820: 00000000 00000000 00000000 00000000    ................
30000830: 00000000 00000000 00000000 00000000    ................
30000840: 00000000 00000000 00000000 00000000    ................
30000850: 00000000 00000000 00000000 00000000    ................
30000860: 00000000 00000000 00000000 00000000    ................
30000870: 00000000 00000000 00000000 00000000    ................
30000880: 00000000 00000000 00000000 00000000    ................
30000890: 00000000 00000000 00000000 00000000    ................
300008a0: 00000000 00000000 00000000 00000000    ................
300008b0: 00000000 00000000 00000000 00000000    ................
300008c0: 00000000 00000000 00000000 00000000    ................
300008d0: 00000000 00000000 00000000 00000000    ................
300008e0: 00000000 00000000 00000000 00000000    ................
300008f0: 00000000 00000000 00000000 00000000    ................
30000900: 00000000 00000000 00000000 00000000    ................
30000910: 00000000 00000000 00000000 00000000    ................
30000920: 00000000 00000000 00000000 00000000    ................
30000930: 00000000 00000000 00000000 00000000    ................
30000940: 00000000 00000000 00000000 00000000    ................
30000950: 00000000 00000000 00000000 00000000    ................
30000960: 00000000 00000000 00000000 00000000    ................
30000970: 00000000 00000000 00000000 00000000    ................
30000980: 00000000 00000000 00000000 00000000    ................
30000990: 00000000 00000000 00000000 00000000    ................
300009a0: 00000000 00000000 00000000 00000000    ................
300009b0: 00000000 00000000 00000000 00000000    ................
300009c0: 00000000 00000000 00000000 00000000    ................
300009d0: 00000000 00000000 00000000 00000000    ................
300009e0: 00000000 00000000 00000000 00000000    ................
300009f0: 00000000 00000000 00000000 00000000    ................
30000a00: 00000000 00000000 00000000 00000000    ................
30000a10: 00000000 00000000 00000000 00000000    ................
30000a20: 00000000 00000000 00000000 00000000    ................
30000a30: 00000000 00000000 00000000 00000000    ................
30000a40: 00000000 00000000 00000000 00000000    ................
30000a50: 00000000 00000000 00000000 00000000    ................
30000a60: 00000000 00000000 00000000 00000000    ................
30000a70: 00000000 00000000 00000000 00000000    ................
30000a80: 00000000 00000000 00000000 00000000    ................
30000a90: 00000000 00000000 00000000 00000000    ................
30000aa0: 00000000 00000000 00000000 00000000    ................
30000ab0: 00000000 00000000 00000000 00000000    ................
30000ac0: 00000000 00000000 00000000 00000000    ................
30000ad0: 00000000 00000000 00000000 00000000    ................
30000ae0: 00000000 00000000 00000000 00000000    ................
30000af0: 00000000 00000000 00000000 00000000    ................
30000b00: 00000000 00000000 00000000 00000000    ................
30000b10: 00000000 00000000 00000000 00000000    ................
30000b20: 00000000 00000000 00000000 00000000    ................
30000b30: 00000000 00000000 00000000 00000000    ................
30000b40: 00000000 00000000 00000000 00000000    ................
30000b50: 00000000 00000000 00000000 00000000    ................
30000b60: 00000000 00000000 00000000 00000000    ................
30000b70: 00000000 00000000 00000000 00000000    ................
30000b80: 00000000 00000000 00000000 00000000    ................
30000b90: 00000000 00000000 00000000 00000000    ................
30000ba0: 00000000 00000000 00000000 00000000    ................
30000bb0: 00000000 00000000 00000000 00000000    ................
30000bc0: 00000000 00000000 00000000 00000000    ................
30000bd0: 00000000 00000000 00000000 00000000    ................
30000be0: 00000000 00000000 00000000 00000000    ................
30000bf0: 00000000 00000000 00000000 00000000    ................
Goni # 

在这里插入图片描述


2、常用环境变量的配置移植

(1) 常用的环境变量就是网络相关的那几个,和 CONFIG_BOOTCOMMAND、CONFIG_BOOTARGS 等。

#define CONFIG_ENV_OVERWRITE
#define CONFIG_SYS_CONSOLE_IS_IN_ENV

#define CONFIG_BOOTCOMMAND	"tftp 0x30008000 zImage-android; bootm 0x30008000"
#define CONFIG_BOOTARGS	    "console=ttySAC2,115200 root=/dev/mmcblkOp2 rw init=/linuxrc rootfstype=ext3"
#define CONFIG_ETHADDR		00:40:5c:26:0a:5b
#define CONFIG_NETMASK      255.255.255.0
#define CONFIG_IPADDR		192.168.1.10
#define CONFIG_SERVERIP		192.168.1.141
#define CONFIG_GATEWAYIP	192.168.1.1

在这里插入图片描述


三、网卡驱动的移植1

1、添加网络支持

(1) uboot 中对各种功能也是一个条件编译可以配置可以裁剪的设计(从 linux 内核学来的),默认情况下我们的 uboot 没有选择支持网络。

(2) 在配置头文件中添加一行 #define CONFIG_CMD_NET

在这里插入图片描述


在这里插入图片描述


(3) 添加了网络支持的宏之后,在 uboot 初始化时,就会执行 eth_initialize 函数,从而网络相关代码初始化就会被执行,将来网络就有可能能用。


2、添加 ping 和 tftp 命令

(1) 在 linux 系统中,网络底层驱动被上层应用调用的接口是 socket,是一个典型的分层结构,底层和上层 是完全被 socket 接口隔离的。

(2) 但是在 uboot 中,网络底层驱动和上层应用是黏在一起的,不分层。意思就是,上层网络的每一个应用 都是自己去调用底层驱动中的 操作硬件的代码 来实现的。

(3) uboot 中有很多预先设计的需要用到网络的命令,和我们直接相关的就是 ping 和 tftp 这两个命令。这两个命令在 uboot 中也是需要用相应的宏开关 来打开或者关闭的。

(4) 经过代码检查,发现 ping 命令开关宏为 CONFIG_CMD_PING,而 tftp 命令的开关为 CONFIG_CMD_NET,确认添加。

在这里插入图片描述


3、代码实践

在这里插入图片描述

结果是 ping 和 tftp 命令都被识别了,但是都提示 no ethernet found 网络不通。为什么不通?因为还没做网卡初始化等移植。


4、移植网卡初始化代码

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


  1. 移植的结果:

在这里插入图片描述


四、网卡驱动的移植2

1、实验现象分析

在这里插入图片描述

在这里插入图片描述

(1) 因为我们没有自定义的网卡初始化函数(board_eth_init 或者 cpu_eth_init ),所以 uboot 启动初始化网卡时,打印:Net: Net Initialization Skipped

(2) eth.c 中有 2 个很重要的全局变量:eth_devices(用来指向一个链表,这个链表中保存了当前系统中所有的网卡信息)和 eth_currenteth_current 指针指向当前我们正在操作的那个网卡)。

(3) 在 linux 的网卡驱动体系中,有一个数据结构(struct eth_device)用来表示(封装)一个网卡的所有信息,系统中注册一个网卡时,就是要建立一个这个结构体的实例,然后填充这个实例中的各个元素,最后将这个结构体实例加入到 eth_devices 这个链表上,就完成了注册。

了解了这些之后,你就明白了网卡驱动在初始化时,必须负责将自己注册到系统的网卡驱动体系中(其实就是把自己的 eth_device 结构体实例添加到 eth_devices 链表中)。如果你不做这个过程就会出现:网卡找不到的错误。

(4) 分析当前的问题是:在 305 行判断 eth_devices 是否为 NULL 之前,没有去做网卡驱动的注册,所以这里为 NULL,所以打印出了 “No ethernet found.”


2、DM9000 驱动浏览

(1) 想解决这个问题,就是要在 305 行之前去注册网卡驱动。注册网卡驱动的代码不能随便乱写,一定要遵守 linux 网卡驱动架构的要求。这一块的代码一般属于网卡驱动的一部分,像这里就在 dm9000x.c 中。


(2) dm9000x.c 中的最后一个函数 int dm9000_initialize(bd_t *bis),这个函数就是用来注册 dm9000 网卡驱动的。

在这里插入图片描述


3、问题修复

(1) 根据之前分析 uboot 函数,发现前面有 2 个函数预留的可以用来放网卡初始化函数的,经过对比,感觉 board_eth_init 函数稍微合适点,于是乎去添加。

在这里插入图片描述


实验结果成功:

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值