---------------------------------
问题总结:我觉得这里是u-boot和linux不一致的地方,具体的原理部分还不是很不清楚,该分歧的地方具体在那里有待研究。不过我觉得这
里不是mac地址设置的问题。实验了一下,mac地址是可以随便设的。只不过在u-boot里面设定的ethaddr没有读到linux下面,使得其为
00:00:00:00:00:00。所以需要重新设定mac地址。如果有人清楚的知道该问题的核心所在,请告诉我,呵呵,在此多谢了。我也会好好思考
的。
---------------------
2006-08-23
补充:
解决方法二:
读代码,以及从网上查找得知,u-boot的网络驱动是没有问题的,只是在和Linux的配合上不太协调。可以将kernel的net驱动部分修改一下,指定一个默认的合法的mac地址。
我现在用的版本是Linux-2.4.27-vsr1
先修改驱动:
linux-2.4.27//drivers/at91/net/at91_ether.c
265 /*
266 * Set the ethernet MAC address in dev->dev_addr
267 */
268 static void get_mac_address(struct net_device *dev) {
269 AT91PS_EMAC regs = (AT91PS_EMAC) dev->base_addr;
270 char addr[6];
271 static char default_ether_addr[]={0x36,0xB9,0x04,0x00,0x24,0x80};
272 unsigned int hi, lo;
273
274 /* Check if bootloader set address in Specific-Address 1 */
275 hi = regs->EMAC_SA1H;
276 lo = regs->EMAC_SA1L;
277 addr[0] = (lo & 0xff);
278 addr[1] = (lo & 0xff00) >> 8;
279 addr[2] = (lo & 0xff0000) >> 16;
280 addr[3] = (lo & 0xff000000) >> 24;
281 addr[4] = (hi & 0xff);
282 addr[5] = (hi & 0xff00) >> 8;
283
284 if (is_valid_ether_addr(addr)) {
285 memcpy(dev->dev_addr, &addr, 6);
286 return;
287 }
288
289 /* Check if bootloader set address in Specific-Address 2 */
290 hi = regs->EMAC_SA2H;
291 lo = regs->EMAC_SA2L;
292 addr[0] = (lo & 0xff);
293 addr[1] = (lo & 0xff00) >> 8;
294 addr[2] = (lo & 0xff0000) >> 16;
295 addr[3] = (lo & 0xff000000) >> 24;
296 addr[4] = (hi & 0xff);
297 addr[5] = (hi & 0xff00) >> 8;
298
299 if (is_valid_ether_addr(addr)) {
300 memcpy(dev->dev_addr, &addr, 6);
301 return;
302 }
303 /*default_ether_addr*/
304 memcpy(dev->dev_addr,&default_ether_addr, 6);
305 }
然后修改:
linux-2.4.27/include/asm-arm/arch-at91rm9200/pio.h
找到static inline void AT91_CfgPIO_EMAC_MII(void)函数,并将其替换如下内容,然后重新编译内核。
static inline void AT91_CfgPIO_EMAC_MII(void) {
AT91_SYS->PIOA_PDR |= AT91C_PA16_EMDIO | AT91C_PA15_EMDC | AT91C_PA14_ERXER | AT91C_PA13_ERX1
| AT91C_PA12_ERX0 | AT91C_PA11_ECRS_ECRSDV | AT91C_PA7_ETXCK_EREFCK;
AT91_SYS->PIOB_PDR |= AT91C_PB25_EF100 | AT91C_PB19_ERXCK | AT91C_PB18_ECOL | AT91C_PB17_ERXDV
| AT91C_PB16_ERX3 | AT91C_PB15_ERX2;
AT91_SYS->PIOD_PDR |= AT91C_PD0_ETX0 | AT91C_PD1_ETX1 | AT91C_PD4_ETXEN | AT91C_PD2_ETX2
| AT91C_PD3_ETX3 | AT91C_PD5_ETXER;
AT91_SYS->PIOB_BSR |= AT91C_PB25_EF100 | AT91C_PB19_ERXCK | AT91C_PB18_ECOL | AT91C_PB17_ERXDV
| AT91C_PB16_ERX3 | AT91C_PB15_ERX2;
AT91_SYS->PIOD_BSR |= AT91C_PD2_ETX2 | AT91C_PD3_ETX3 | AT91C_PD5_ETXER;
}
完成后MII接口的网络可以使用,该驱动现在可以支持MII和RMII接口网络,这个需要在配置时选择,我现在用的是MII。写入flash启动后mac地址就显示为你所设定的mac地址了。
可以用diff制作一个补丁,方便使用。
---------------------
转自:http://blog.chinaunix.net/u/21948/showart_150264.html