- 论坛徽章:
- 0
|
求大神指导啊。
小弟用的at91rm9200做的板子,用u-boot-2010.06移植Linux2.6。
内核已经能跑起来了,但是跑起来后网络不通(u-boot的时候网络是通的,已经通过网络下载内核了)。
ping不通,连设置IP也不行,然后知道是因为没有设置MAC,查了一下在系统的启动代码中可以设置一个默认的MAC,于是更改了内核代码然后内核跑起来后就有MAC了,也能设置IP,但是设置后还是ping不通。(进入内核后通过ifconfig eth0 hw ether xx设置MAC后也能设置IP了,但是也是ping不通)
之后尝试从tftp启动内核,发现进入内核后就有MAC(这个MAC不是内核中默认设置的,内核代码中会先从寄存器中看u-boot有没有设置MAC,没有的话才会设置内核代码中的默认MAC),从网络启动后获得的这个MAC是u-boot设置的,并且这时跑起来的内核就能够Ping通PC机。
后来尝试了一下在u-boot中设置环境变量 setenv bootcmd 'ping xx.xx.xx.xx;bootm 0x23000000';这样设置后跑内核前他会先去执行一下ping命令,然后在进入内核后他也能提取u-boot设置的Mac,并且之后也能ping通主机。
于是个人觉得是u-boot初始化网络的问题,如果我使用tftp跑内核和先执行一下ping命令u-boot都会去初始化网络,然而如果是直接从flash启动内核u-boot是不会去初始化网络的,u-boot不初始化网络进入内核后内核就无法提取u-boot设置的MAC,而使用内核代码中设置的MAC貌似只是一个表面上的东西,仍无法ping通。
于是我就想办法在U-boot中先初始化一下网络,尽管查了一些资料说不建议这样,说这个过程占用时间过长,不适合快速启动内核,但是我不去初始化网络我进入内核网络就不能用,所以想着慢就慢吧,当然在bootcmd中先加个ping命令也能好使,但总觉得不太靠谱,还是希望能从u-boot中根本解决一下问题。
于是查相关资料,发现可以在u-boot代码中arm_boot函数中调用main_loop()之前加入eth_init(gd->bd);就会去初始化网络,更改代码后运行确实在u-boot中就会初始化网络但是之后,内核就跑不起来了。
boot 1.0 (Apr 12 2012 - 17:59:39)
U-Boot 2010.06 (Aug 23 2012 - 15:54:50)
DRAM: 64 MiB
Flash: 16 MiB
In: serial
Out: serial
Err: serial
Net: AT91 EMAC
AT91 EMAC: Starting autonegotiation... //这三行不初始化网络的话是没有的,当然在执行tftp或者ping命令
AT91 EMAC: Autonegotiation complete //前也会先打印这三条语句
AT91 EMAC: link up, 100Mbps full-duplex //
Hit any key to stop autoboot: 0
loading kernel to ram...
done
loading ramdisk to ram...
done
start linux...
## Booting kernel from Legacy Image at 23000000 ...
Image Name: Linux-2.6.32
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1460044 Bytes = 1.4 MiB
Load Address: 20008000
Entry Point: 20008000
Verifying Checksum ... Bad Data CRC
ERROR: can't get kernel image!
或者有时候就直接显示
start linux...
Wrong Image Format for bootm command
ERROR: can't get kernel image!
实在不知道怎么回事了,求大神指点啊。
或者哪位大神能知道直接内核跑起来网络就能好使的,是不是我哪里还有问题啊!!也感激万分啊! |
|