1、Uboot08支持DM9000这个移植要结合以下两篇文章u-boot-2009.08在mini2440上的移植u-boot-2009.08版本已经对CS8900、RTL8019和DM9000X等网卡有比较完善的代码支持(代码在drivers/net/目录 下),而且在S3C24XX系列中默认对CS8900网卡进行配置使用。而mini2440开发板使用的则是DM9000网卡芯片,所以只需在开发板上添 加对DM9000的支持即可。还有一点,以前的 U-boot 对于网络延时部分有问题,需要修改许多地方。但是现在的U-boot 网络部分已经基本不需要怎么修改了,只有在DM9000 的驱动和NFS 的
2、TIMEOUT 参数上需要稍微修改一下。 4.1,DM9000驱动代码修改【1】修改static int dm9000_init函数中部分代码,如果不修改这一部分,在使用网卡的时候会报“could not establish link”的错误。打开/drivers/net/dm9000x.c,定位到377行,修改如下:/* Activate DM9000 */* RX enable */DM9000_iow(DM9000_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN);/* Enable TX/RX interrupt mask */DM9000_iow
3、(DM9000_IMR, IMR_PAR);#if 0 /default to link MII interfacei = 0;while (!(phy_read(1) & 0x20) /* autonegation complete bit */udelay(1000);i+;if (i = 1650) /printf(could not establish linkn);/return 0;break;#endif【2】对于NFS,增加了延时,否则会出现“* ERROR: Cannot mount”的错误。打开/net/nfs.c,定位到36行,修改如下:#if defined(CONFI
4、G_CMD_NET) & defined(CONFIG_CMD_NFS)#define HASHES_PER_LINE 65/* Number of loading hashes per line*/#define NFS_RETRY_COUNT 30#define NFS_TIMEOUT (CONFIG_SYS_HZ/1000*2000UL) /2000UL【3】添加网卡芯片(DM9000)的初始化函数打开board/samsung/mini2440/mini2440.c,定位到194行附近,文件末尾处,修改如下:int dram_init (void)gd-bd-bi_dram0.star
5、t = PHYS_SDRAM_1;gd-bd-bi_dram0.size = PHYS_SDRAM_1_SIZE;return 0;extern int dm9000_initialize(bd_t *bis);/implicit declaration of function dm9000_initialize#ifdef CONFIG_DRIVER_DM9000int board_eth_init(bd_t *bis)return dm9000_initialize(bis);#endif【4】添加串口 Xmodem 传输协议(可不修改)对于使用串口传输数据到内存的操作,有可能会用到Xmo
6、dem协议。但是原本的kermit协议传输就挺好用的,速度也比较快,所以可添加此功能。打开/common/cmd_load.c,定位到37行,修改如下:#if defined(CONFIG_CMD_LOADB)#if defined(ENABLE_CMD_LOADB_X)static ulong load_serial_xmodem (ulong offset);#endifstatic ulong load_serial_ymodem (ulong offset);#endif然后再定位到480行附近,修改如下:if (load_baudrate != current_baudrate) p
7、rintf (# Switch baudrate to %d bps and press ENTER .n,load_baudrate);udelay(50000);gd-baudrate = load_baudrate;serial_setbrg ();udelay(50000);for (;) if (getc() = r)break;#if defined(ENABLE_CMD_LOADB_X)if (strcmp(argv0,loadx)=0) printf (# Ready for binary (xmodem) download to 0x%08lX at %d bps.n,off
8、set,load_baudrate);addr = load_serial_xmodem (offset); else if (strcmp(argv0,loady)=0) #elseif (strcmp(argv0,loady)=0) #endifprintf (# Ready for binary (ymodem) download to 0x%08lX at %d bps.n,offset,load_baudrate);addr = load_serial_ymodem (offset);再定位到998行附近,修改如下:static int getcxmodem(void) if (ts
9、tc()return (getc();return -1;#if defined(ENABLE_CMD_LOADB_X)static ulong load_serial_xmodem (ulong offset)int size;char buf32;int err;int res;connection_info_t info;char xmodemBuf1024;ulong store_addr = 0;ulong addr = 0;size = 0;info.mode = xyzModem_xmodem;res = xyzModem_stream_open (&info, &err);if
10、 (!res) while (res =xyzModem_stream_read (xmodemBuf, 1024, &err) 0) store_addr = addr + offset;size += res;addr += res;#ifndef CFG_NO_FLASHif (addr2info (store_addr) int rc;rc = flash_write (char *) xmodemBuf,store_addr, res);if (rc != 0) flash_perror (rc);return (0); else#endifmemcpy (char *) (stor
11、e_addr), xmodemBuf,res); else printf (%sn, xyzModem_error (err);xyzModem_stream_close (&err);xyzModem_stream_terminate (false, &getcxmodem);flush_cache (offset, size);printf (# Total Size = 0x%08x = %d Bytesn, size, size);sprintf (buf, %X, size);setenv (filesize, buf);return offset;#endifstatic ulon
12、g load_serial_ymodem (ulong offset)再定位到1169行,修改如下:#if defined(CONFIG_CMD_LOADB)U_BOOT_CMD(loadb, 3, 0,do_load_serial_bin,load binary file over serial line (kermit mode), off baud n - load binary file over serial line with offset off and baudrate baud);#if defined(ENABLE_CMD_LOADB_X)U_BOOT_CMD(loadx,
13、 3, 0, do_load_serial_bin,load binary file over serial line (xmodem mode), off baud n - load binary file over serial line with offset off and baudrate baud);#endifU_BOOT_CMD(loady, 3, 0,do_load_serial_bin,load binary file over serial line (ymodem mode), off baud n - load binary file over serial line
14、 with offset off and baudrate baud);【5】修改配置文件,在mini2440.h中加入相关定义打开/include/configs/mini2440.h,定位到60行附近,修改如下:/* Hardware drivers*/#if 0#define CONFIG_DRIVER_CS89001/* we have a CS8900 on-board */#define CS8900_BASE0x19000300#define CS8900_BUS161 /* the Linux driver does accesses as shorts */#endif #d
15、efine CONFIG_NET_MULTI1#define CONFIG_DRIVER_DM9000 1#define CONFIG_DM9000_BASE 0x20000300 /网卡片选地址#define DM9000_IO CONFIG_DM9000_BASE#define DM9000_DATA (CONFIG_DM9000_BASE+4) /网卡数据地址#define CONFIG_DM9000_NO_SROM1/#define CONFIG_DM9000_USE_16BIT#undef CONFIG_DM9000_DEBUG注意:u-boot-2009.08 可以自动检测DM90
16、00网卡的位数,根据开发板原理图可知网卡的数据位为16位,并且网卡位于CPU的BANK4上,所以只需在 board/samsung/mini2440/lowlevel_init.S中设置 #define B4_BWSCON (DW16) 即可,不需要此处的 #define CONFIG_DM9000_USE_16BIT 1给u-boot加上ping命令,用来测试网络通不通/* Command line configuration.*/#include #define CONFIG_CMD_CACHE#define CONFIG_CMD_DATE#define CONFIG_CMD_ELF#de
17、fine CONFIG_CMD_NAND#define CONFIG_CMD_JFFS2 /* JFFS2 Support*/#define CONFIG_CMD_PING /*ping command support*/恢复被注释掉的网卡MAC地址和修改你合适的开发板IP地址以及内核启动参数:#define CONFIG_BOOTDELAY3#define CONFIG_ETHADDR08:00:3e:26:0a:5b #define CONFIG_NETMASK 255.255.255.0#define CONFIG_IPADDR10.1.0.129#define CONFIG_SERVE
18、RIP10.1.0.128#define CONFIG_GATEWAYIP10.1.0.1#define CONFIG_OVERWRITE_ETHADDR_ONCE/*#define CONFIG_BOOTFILEelinos-lart */定位到139行附近,加入使能串口传输数据到内存的操作:#define ENABLE_CMD_LOADB_X1 /使能串口传输数据到内存的操作#if defined(CONFIG_CMD_KGDB)#define CONFIG_KGDB_BAUDRATE115200/* speed to run kgdb serial port */* whats this
19、 ? its not used anywhere */#define CONFIG_KGDB_SER_INDEX1/* which serial port to use */#endif4.2,重新编译u-boot,下载到Nand中从Nand启动,查看启动信息和环境变量并使用ping命令测试网卡,操作如下:Enter your selection: aUSB host is connected. Waiting a download.Now, Downloading ADDRESS:30000000h,TOTAL:154934RECEIVED FILE SIZE: 154934 (151KB/
20、S, 1S)Downloaded file at 0x30000000, size = 154924 bytesWrite to flash ok: skipped size = 0x0, size = 0x25d2c. .nand 方式上电重启后:U-Boot 2009.08 ( 5鏈?09 2011 - 15:01:04)DRAM: 64 MBFlash: 2 MBNAND: 128 MiBIn: serialOut: serialErr: serialNet: dm9000u-bootMINI2440#显示下环境变量:u-bootMINI2440# printenvbootdelay=3
21、baudrate=115200netmask=255.255.255.0stdin=serialstdout=serialstderr=serialipaddr=10.1.129serverip=10.1.0.128ethact=dm9000Environment size: 141/131068 bytesping测试:u-bootMINI2440# ping 10.1.0.128dm9000 i/o: 0x20000300, id: 0x90000a46DM9000: running in 16 bit modeMAC: 00:00:00:00:00:00operating at 100M
22、 full duplex mode* ERROR: ethaddr not setdm9000 i/o: 0x20000300, id: 0x90000a46DM9000: running in 16 bit modeMAC: 00:00:00:00:00:00operating at 100M full duplex modeping failed; host 10.1.0.128 is not alive需要设定IP地址和MAC地址u-bootMINI2440# setenv ipaddr 10.1.0.129u-bootMINI2440# setenv serverip 10.1.0.1
23、28u-bootMINI2440# setenv setenv ethaddr 12:34:56:78:9A:BCu-bootMINI2440# saveenvSaving Environment to NAND.Erasing Nand.Erasing at 0x4000000000002 - 0% complete.Writing to Nand. doneu-bootMINI2440#然后再进行ping测试:u-bootMINI2440# ping 10.1.0.128dm9000 i/o: 0x20000300, id: 0x90000a46DM9000: running in 16
24、bit modeMAC: 12:34:56:78:9a:bcoperating at 100M full duplex modeUsing dm9000 deviceping failed; host 10.1.0.128 is not aliveu-bootMINI2440#可以看到,启动信息里面显示了Net:dm9000,printenv查看的环境变量也和include/configs/mini2440.h中设置的一致。但是现在有个问题就是ping不能通过。经过一段时间在网上搜索,原来有很多人都碰到了这种情况。出现问题的地方可能是DM9000网卡驱动中关闭网卡的地方,如是就试着修改代码如下
25、:打开drivers/net/dm9000x.c,定位到456行附近,屏蔽掉dm9000_halt函数中的内容:/* Stop the interface. The interface is stopped when it is brought.*/static void dm9000_halt(struct eth_device *netdev)#if 0DM9000_DBG(%sn, _func_);/* RESET devie */phy_write(0, 0x8000);/* PHY RESET */DM9000_iow(DM9000_GPR, 0x01);/* Power-Down
26、PHY */DM9000_iow(DM9000_IMR, 0x80);/* Disable all interrupt */DM9000_iow(DM9000_RCR, 0x00);/* Disable RX */#endif重新编译下载,nand启动,运行结果:u-bootMINI2440# ping 10.1.0.128dm9000 i/o: 0x20000300, id: 0x90000a46DM9000: running in 16 bit modeMAC: 00:00:00:00:00:00operating at unknown: 0 mode* ERROR: ethaddr no
27、t setdm9000 i/o: 0x20000300, id: 0x90000a46DM9000: running in 16 bit modeMAC: 00:00:00:00:00:00operating at unknown: 0 modeping failed; host 10.1.0.128 is not aliveu-bootMINI2440# setenv gatewayip 10.1.0.1u-bootMINI2440# setenv ethaddr 12:34:56:78:9a:bc /MAC地址,随便设u-bootMINI2440# ping 10.1.0.128dm900
28、0 i/o: 0x20000300, id: 0x90000a46DM9000: running in 16 bit modeMAC: 12:34:56:78:9a:bcoperating at unknown: 0 modeUsing dm9000 devicehost 10.1.0.128 is aliveu-bootMINI2440# saveenvSaving Environment to NAND.Erasing Nand.Erasing at 0x4000000000002 - 0% complete.Writing to Nand. doneu-bootMINI2440# pin
29、g 10.1.0.128dm9000 i/o: 0x20000300, id: 0x90000a46DM9000: running in 16 bit modeMAC: 12:34:56:78:9a:bcoperating at unknown: 0 modeUsing dm9000 devicehost 10.1.0.128 is aliveu-bootMINI2440#结果,只是第一次ping不通,以后都是可以ping通的(据网友们说这是正常的)。4.3,tftp功能测试首先需要将友善官方移植好的有关mini2440的内核文件zImage_T35复制到linux 宿主机的/tftpboot目录下,因为u-boot默认的此目录,然后执行:u-bootMINI2440# tftp 0x
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1