<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
 <channel>
  <title>WeiBing</title>
  <link>http://weibing.blogbus.com</link>
  <description><![CDATA[懵懂网工飘过CCNA，误落MCSE，捡起NCRE4欲越系分小山 ^_^]]></description>
  <generator> by blogbus.com </generator>
  <lastBuildDate>Mon, 12 Feb 2007 10:34:53 +0800</lastBuildDate>
  <image>
									<url>http://public.blogbus.com/images/head.gif</url>
									<title>WeiBing</title>
									<link>http://weibing.blogbus.com</link>
								</image>  <item>
   <title>U-BOOT 1.3 DM9000AEP驱动</title>
   <description><![CDATA[<p>鉴于许多朋友在U-BOOT移植DM9000AEP驱动遇到的问题，我把最近改了一下的驱动发给大家作参考。<br />在U-BOOT 1.3中使用没问题，启动时需要大于1S的等待时间，DM9000才开始工作。&nbsp;</p><p>/*<br />&nbsp; dm9000.c: Version 1.2 12/15/2003</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A Davicom DM9000 ISA NIC fast Ethernet driver for Linux.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Copyright (C) 1997&nbsp; Sten Wang</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This program is free software; you can redistribute it and/or<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; modify it under the terms of the GNU General Public License<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as published by the Free Software Foundation; either version 2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; of the License, or (at your option) any later version.</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This program is distributed in the hope that it will be useful,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; but WITHOUT ANY WARRANTY; without even the implied warranty of<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&nbsp; See the<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GNU General Public License for more details.</p><p>&nbsp; (C)Copyright 1997-1998 DAVICOM Semiconductor,Inc. All Rights Reserved.</p><p>V0.11&nbsp;&nbsp; 06/20/2001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REG_0A bit3=1, default enable BP with DA match<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 06/22/2001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Support DM9801 progrmming<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E3: R25 = ((R24 + NF) &amp; 0x00ff) | 0xf000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E4: R25 = ((R24 + NF) &amp; 0x00ff) | 0xc200<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; R17 = (R17 &amp; 0xfff0) | NF + 3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E5: R25 = ((R24 + NF - 3) &amp; 0x00ff) | 0xc200<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; R17 = (R17 &amp; 0xfff0) | NF</p><p>v1.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; modify by simon 2001.9.5<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; change for kernel 2.4.x</p><p>v1.1&nbsp;&nbsp; 11/09/2001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fix force mode bug</p><p>v1.2&nbsp;&nbsp; 03/18/2003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Weilun Huang &lt;<a href="mailto:weilun_huang@davicom.com.tw">weilun_huang@davicom.com.tw</a>&gt;:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fixed phy reset.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Added tx/rx 32 bit mode.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cleaned up for kernel merge.</p><p>--------------------------------------</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12/15/2003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Initial port to u-boot by Sascha Hauer &lt;<a href="mailto:saschahauer@web.de">saschahauer@web.de</a>&gt;</p><p>TODO: Homerun NIC and longrun NIC are not functional, only internal at the<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; moment.<br />*/</p><p>#include &lt;common.h&gt;<br />#include &lt;command.h&gt;<br />#include &lt;net.h&gt;<br />#include &lt;asm/io.h&gt;</p><p>#ifdef CONFIG_DRIVER_DM9000</p><p>#include &quot;dm9000x.h&quot;</p><p>/* Board/System/Debug information/definition ---------------- */</p><p>#define DM9801_NOISE_FLOOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x08<br />#define DM9802_NOISE_FLOOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x05</p><p>/* #define CONFIG_DM9000_DEBUG */</p><p>#ifdef CONFIG_DM9000_DEBUG<br />#define DM9000_DBG(fmt,args...) printf(fmt ,##args)<br />#else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp; */<br />#define DM9000_DBG(fmt,args...)<br />#endif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp; */<br />enum DM9000_PHY_mode { DM9000_10MHD = 0, DM9000_100MHD =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1, DM9000_10MFD = 4, DM9000_100MFD = 5, DM9000_AUTO =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8, DM9000_1M_HPNA = 0x10<br />};<br />enum DM9000_NIC_TYPE { FASTETHER_NIC = 0, HOMERUN_NIC = 1, LONGRUN_NIC = 2<br />};</p><p>/* Structure/enum declaration ------------------------------- */<br />typedef struct board_info {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u32 runt_length_counter;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* counter: RX length &lt; 64byte */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u32 long_length_counter;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* counter: RX length &gt; 1514byte */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u32 reset_counter;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* counter: RESET */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u32 reset_tx_timeout;&nbsp;&nbsp; /* RESET caused by TX Timeout */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u32 reset_rx_status;&nbsp;&nbsp;&nbsp; /* RESET caused by RX Statsus wrong */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u16 tx_pkt_cnt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u16 queue_start_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u16 dbug_cnt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u8 phy_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u8 device_wait_reset;&nbsp;&nbsp; /* device state */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u8 nic_type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* NIC type */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char srom[128];<br />} board_info_t;<br />board_info_t dmfe_info;</p><p>/* For module input parameter */<br />//static int media_mode = DM9000_AUTO; /* weiyan,use full duplex mode */<br />static int media_mode = DM9000_100MFD;<br />static u8 nfloor = 0;</p><p>/* function declaration ------------------------------------- */<br />int eth_init(bd_t * bd);<br />int eth_send(volatile void *, int);<br />int eth_rx(void);<br />void eth_halt(void);<br />void eth_halt_true(void);<br />static int dm9000_probe(void);<br />static u16 phy_read(int);<br />static void phy_write(int, u16);<br />u16 read_srom_word(int);<br />static u8 DM9000_ior(int);<br />static void DM9000_iow(int reg, u8 value);</p><p>/* DM9000 network board routine ---------------------------- */</p><p>#define DM9000_outb(d,r) ( *(volatile u8 *)r = d )<br />#define DM9000_outw(d,r) ( *(volatile u16 *)r = d )<br />#define DM9000_outl(d,r) ( *(volatile u32 *)r = d )<br />#define DM9000_inb(r) (*(volatile u8 *)r)<br />#define DM9000_inw(r) (*(volatile u16 *)r)<br />#define DM9000_inl(r) (*(volatile u32 *)r)</p><p>#ifdef CONFIG_DM9000_DEBUG<br />static void<br />dump_regs(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;NCR&nbsp;&nbsp; (0x00): %02x\n&quot;, DM9000_ior(0));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;NSR&nbsp;&nbsp; (0x01): %02x\n&quot;, DM9000_ior(1));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;TCR&nbsp;&nbsp; (0x02): %02x\n&quot;, DM9000_ior(2));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;TSRI&nbsp; (0x03): %02x\n&quot;, DM9000_ior(3));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;TSRII (0x04): %02x\n&quot;, DM9000_ior(4));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;RCR&nbsp;&nbsp; (0x05): %02x\n&quot;, DM9000_ior(5));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;RSR&nbsp;&nbsp; (0x06): %02x\n&quot;, DM9000_ior(6));<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;ISR&nbsp;&nbsp; (0xFE): %02x\n&quot;, DM9000_ior(ISR));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;\n&quot;);<br />}<br />#endif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp; */</p><p>/*<br />&nbsp; Search DM9000 board, allocate space and register it<br />*/<br />int<br />dm9000_probe(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u32 id_val;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id_val = DM9000_ior(DM9000_VIDL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id_val |= DM9000_ior(DM9000_VIDH) &lt;&lt; 8;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id_val |= DM9000_ior(DM9000_PIDL) &lt;&lt; 16;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id_val |= DM9000_ior(DM9000_PIDH) &lt;&lt; 24;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (id_val == DM9000_ID) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;dm9000 i/o: 0x%x, id: 0x%x \n&quot;, CONFIG_DM9000_BASE,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id_val);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;dm9000 not found at 0x%08x id: 0x%08x\n&quot;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONFIG_DM9000_BASE, id_val);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />}</p><p>/* Set PHY operationg mode<br />*/<br />static void<br />set_PHY_mode(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u16 phy_reg4 = 0x01e1, phy_reg0 = 0x1000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!(media_mode &amp; DM9000_AUTO)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (media_mode) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case DM9000_10MHD:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phy_reg4 = 0x21;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phy_reg0 = 0x0000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case DM9000_10MFD:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phy_reg4 = 0x41;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phy_reg0 = 0x1100;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case DM9000_100MHD:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phy_reg4 = 0x81;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phy_reg0 = 0x2000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case DM9000_100MFD:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phy_reg4 = 0x101;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phy_reg0 = 0x3100;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phy_write(4, phy_reg4); /* Set PHY media mode */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phy_write(0, phy_reg0); /*&nbsp; Tmp */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_GPCR, 0x01);&nbsp; /* Let GPIO0 output */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_GPR, 0x00);&nbsp;&nbsp; /* Enable PHY */<br />}</p><p>/*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Init HomeRun DM9801<br />*/<br />static void<br />program_dm9801(u16 HPNA_rev)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __u16 reg16, reg17, reg24, reg25;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!nfloor)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nfloor = DM9801_NOISE_FLOOR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reg16 = phy_read(16);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reg17 = phy_read(17);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reg24 = phy_read(24);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reg25 = phy_read(25);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (HPNA_rev) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0xb900:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* DM9801 E3 */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reg16 |= 0x1000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reg25 = ((reg24 + nfloor) &amp; 0x00ff) | 0xf000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0xb901:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* DM9801 E4 */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reg25 = ((reg24 + nfloor) &amp; 0x00ff) | 0xc200;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reg17 = (reg17 &amp; 0xfff0) + nfloor + 3;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0xb902:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* DM9801 E5 */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0xb903:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* DM9801 E6 */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reg16 |= 0x1000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reg25 = ((reg24 + nfloor - 3) &amp; 0x00ff) | 0xc200;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reg17 = (reg17 &amp; 0xfff0) + nfloor;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phy_write(16, reg16);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phy_write(17, reg17);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phy_write(25, reg25);<br />}</p><p>/*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Init LongRun DM9802<br />*/<br />static void<br />program_dm9802(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __u16 reg25;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!nfloor)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nfloor = DM9802_NOISE_FLOOR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reg25 = phy_read(25);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reg25 = (reg25 &amp; 0xff00) + nfloor;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phy_write(25, reg25);<br />}</p><p>/* Identify NIC type<br />*/<br />static void<br />identify_nic(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct board_info *db = &amp;dmfe_info;&nbsp;&nbsp;&nbsp;&nbsp; /* Point a board information structure */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u16 phy_reg3;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_NCR, NCR_EXT_PHY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phy_reg3 = phy_read(3);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (phy_reg3 &amp; 0xfff0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0xb900:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (phy_read(31) == 0x4404) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db-&gt;nic_type = HOMERUN_NIC;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; program_dm9801(phy_reg3);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;found homerun NIC\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db-&gt;nic_type = LONGRUN_NIC;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;found longrun NIC\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; program_dm9802();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db-&gt;nic_type = FASTETHER_NIC;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_NCR, 0);<br />}</p><p>/* General Purpose dm9000 reset routine */<br />static void<br />dm9000_reset(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;resetting\n&quot;);<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_NCR, NCR_RST);<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; udelay(500);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_NCR, NCR_RST);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; udelay(1000);<br />}</p><p>/* Initilize dm9000 board<br />*/<br />int<br />eth_init(bd_t * bd)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eth_init_true(bd);<br />}</p><p>int eth_init_true(bd_t * bd)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i, oft, lnk;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;eth_init()\n&quot;);</p><p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eth_halt_true();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* RESET device */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dm9000_reset();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dm9000_probe();</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* NIC Type: FASTETHER, HOMERUN, LONGRUN */<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; identify_nic();</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* GPIO0 on pre-activate PHY */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_GPR, 0x00);&nbsp;&nbsp; /*REG_1F bit0 activate phyxcer */</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* copy from set_PHY_mode, do not set phy mode */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_GPCR, 0x01);&nbsp; /* Let GPIO0 output */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_GPR, 0x00);&nbsp;&nbsp; /* Enable PHY */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Set PHY */<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set_PHY_mode();</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Program operating register */<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_NCR, 0x0);&nbsp;&nbsp;&nbsp; /* only intern phy supported by now */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* cut from Linux, weiyan */</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_TCR, 0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* TX Polling clear */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_BPTR, 0x3f);&nbsp; /* Less 3Kb, 200us */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_FCTR, FCTR_HWOT(3) | FCTR_LWOT(8));&nbsp;&nbsp; /* Flow Control : High/Low Water */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_FCR, 0x0);&nbsp;&nbsp;&nbsp; /* SH FIXME: This looks strange! Flow Control */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_SMCR, 0);&nbsp;&nbsp;&nbsp;&nbsp; /* Special Mode */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_NSR, NSR_WAKEST | NSR_TX2END | NSR_TX1END);&nbsp;&nbsp; /* clear TX status */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_ISR, 0x0f);&nbsp;&nbsp; /* Clear interrupt status */</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Set Node address */<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; 6; i++)<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((u16 *) bd-&gt;bi_enetaddr)[i] = read_srom_word(i);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (is_zero_ether_addr(bd-&gt;bi_enetaddr) ||<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; is_multicast_ether_addr(bd-&gt;bi_enetaddr)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* try reading from environment */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u8 i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *s, *e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = getenv (&quot;ethaddr&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; 6; ++i) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bd-&gt;bi_enetaddr[i] = s ?<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; simple_strtoul (s, &amp;e, 16) : 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (s)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = (*e) ? e + 1 : e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;MAC: %02x:%02x:%02x:%02x:%02x:%02x\n&quot;, bd-&gt;bi_enetaddr[0],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bd-&gt;bi_enetaddr[1], bd-&gt;bi_enetaddr[2], bd-&gt;bi_enetaddr[3],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bd-&gt;bi_enetaddr[4], bd-&gt;bi_enetaddr[5]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0, oft = 0x10; i &lt; 6; i++, oft++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(oft, bd-&gt;bi_enetaddr[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0, oft = 0x16; i &lt; 8; i++, oft++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(oft, 0xff);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* read back mac, just to be sure */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0, oft = 0x10; i &lt; 6; i++, oft++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;%02x:&quot;, DM9000_ior(oft));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;\n&quot;);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Activate DM9000 */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN);&nbsp; /* RX enable */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_IMR, IMR_PAR);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Enable TX/RX interrupt mask */<br />#if 0&nbsp;&nbsp; //weibing<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (!(phy_read(1) &amp; 0x20)) { /* autonegation complete bit */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; udelay(1000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i == 10000) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;could not establish link\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />#endif<br />#if 0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* see what we've got */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lnk = phy_read(17) &gt;&gt; 12;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;operating at &quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (lnk) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;10M half duplex &quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 2:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;10M full duplex &quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 4:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;100M half duplex &quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 8:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;100M full duplex &quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;unknown: %d &quot;, lnk);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;mode\n&quot;);<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;operating at 100M full duplex mode\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />}</p><p>/*<br />&nbsp; Hardware start transmission.<br />&nbsp; Send a packet to media from the upper layer.<br />*/<br />int<br />eth_send(volatile void *packet, int length)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *data_ptr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u32 tmplen, i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int tmo;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;eth_send: length: %d\n&quot;, length);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; length; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i % 8 == 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;\nSend: 02x: &quot;, i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;%02x &quot;, ((unsigned char *) packet)[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } DM9000_DBG(&quot;\n&quot;);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Move data to DM9000 TX RAM */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data_ptr = (char *) packet;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_outb(DM9000_MWCMD, DM9000_IO);</p><p>#ifdef CONFIG_DM9000_USE_8BIT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Byte mode */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; length; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_outb((data_ptr[i] &amp; 0xff), DM9000_DATA);</p><p>#endif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp; */<br />#ifdef CONFIG_DM9000_USE_16BIT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmplen = (length + 1) / 2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; tmplen; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_outw(((u16 *) data_ptr)[i], DM9000_DATA);</p><p>#endif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp; */<br />#ifdef CONFIG_DM9000_USE_32BIT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmplen = (length + 3) / 4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; tmplen; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_outl(((u32 *) data_ptr)[i], DM9000_DATA);</p><p>#endif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp; */</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Set TX length to DM9000 */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_TXPLL, length &amp; 0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_TXPLH, (length &gt;&gt; 8) &amp; 0xff);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Issue TX polling command */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_TCR, TCR_TXREQ);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Cleared after TX complete */</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* wait for end of transmission */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmo = get_timer(0) + 5 * CFG_HZ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (DM9000_ior(DM9000_TCR) &amp; TCR_TXREQ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (get_timer(0) &gt;= tmo) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;transmission timeout\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;transmit done\n\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />}</p><p>/*<br />&nbsp; Stop the interface.<br />&nbsp; The interface is stopped when it is brought.<br />*/<br />void eth_halt(void){}</p><p>void<br />eth_halt_true(void)<br />{<br />#if 1&nbsp;&nbsp; //weibing<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;eth_halt\n&quot;);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* RESET devie */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phy_write(0, 0x8000);&nbsp;&nbsp; /* PHY RESET */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_GPR, 0x01);&nbsp;&nbsp; /* Power-Down PHY */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_IMR, 0x80);&nbsp;&nbsp; /* Disable all interrupt */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_RCR, 0x00);&nbsp;&nbsp; /* Disable RX */<br />#endif<br />}</p><p>/*<br />&nbsp; Received a packet and pass to upper layer<br />*/<br />int<br />eth_rx(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u8 rxbyte, *rdptr = (u8 *) NetRxPackets[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u16 RxStatus, RxLen = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u32 tmplen, i;<br />#ifdef CONFIG_DM9000_USE_32BIT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u32 tmpdata;<br />#endif</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Check packet ready or not */<br />//weibing<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_ior(DM9000_MRRH);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_ior(DM9000_MRRL);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //must add this two read,weiyan<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_ior(DM9000_MRCMDX);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Dummy read */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rxbyte = DM9000_inb(DM9000_DATA);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Got most updated data */</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (rxbyte == 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Status check: this byte must be 0 or 1 */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (rxbyte &gt; 1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_RCR, 0x00);&nbsp;&nbsp; /* Stop Device */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_ISR, 0x80);&nbsp;&nbsp; /* Stop INT request */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;rx status check: %d\n&quot;, rxbyte);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;receiving packet\n&quot;);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* A packet ready now&nbsp; &amp; Get status/length */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_outb(DM9000_MRCMD, DM9000_IO);</p><p>#ifdef CONFIG_DM9000_USE_8BIT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RxStatus = DM9000_inb(DM9000_DATA) + (DM9000_inb(DM9000_DATA) &lt;&lt; 8);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RxLen = DM9000_inb(DM9000_DATA) + (DM9000_inb(DM9000_DATA) &lt;&lt; 8);</p><p>#endif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp; */<br />#ifdef CONFIG_DM9000_USE_16BIT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RxStatus = DM9000_inw(DM9000_DATA);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RxLen = DM9000_inw(DM9000_DATA);</p><p>#endif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp; */<br />#ifdef CONFIG_DM9000_USE_32BIT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmpdata = DM9000_inl(DM9000_DATA);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RxStatus = tmpdata;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RxLen = tmpdata &gt;&gt; 16;</p><p>#endif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp; */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;rx status: 0x%04x rx len: %d\n&quot;, RxStatus, RxLen);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Move data from DM9000 */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Read received packet from RX SRAM */<br />#ifdef CONFIG_DM9000_USE_8BIT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; RxLen; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rdptr[i] = DM9000_inb(DM9000_DATA);</p><p>#endif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp; */<br />#ifdef CONFIG_DM9000_USE_16BIT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmplen = (RxLen + 1) / 2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; tmplen; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((u16 *) rdptr)[i] = DM9000_inw(DM9000_DATA);<br />/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;length:%d\n&quot;, RxLen);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; RxLen+1; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(rdptr[i]&gt;='0' &amp;&amp; rdptr[i]&lt;='9' || rdptr[i]&gt;='a' &amp;&amp; rdptr[i]&lt;='f')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;i:%3d %c &quot;,i, rdptr[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;\n&quot;);<br />*/<br />#endif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp; */<br />#ifdef CONFIG_DM9000_USE_32BIT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmplen = (RxLen + 3) / 4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; tmplen; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((u32 *) rdptr)[i] = DM9000_inl(DM9000_DATA);</p><p>#endif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp; */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((RxStatus &amp; 0xbf00) || (RxLen &lt; 0x40)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || (RxLen &gt; DM9000_PKT_MAX)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (RxStatus &amp; 0x100) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;rx fifo error\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (RxStatus &amp; 0x200) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;rx crc error\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (RxStatus &amp; 0x8000) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;rx length error\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (RxLen &gt; DM9000_PKT_MAX) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;rx length too big\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dm9000_reset();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Pass to upper layer */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;passing packet to upper layer\n&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NetReceive(NetRxPackets[0], RxLen);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return RxLen;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />}</p><p>/*<br />&nbsp; Read a word data from SROM<br />*/<br />u16<br />read_srom_word(int offset)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_EPAR, offset);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_EPCR, 0x4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; udelay(8000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_EPCR, 0x0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (DM9000_ior(DM9000_EPDRL) + (DM9000_ior(DM9000_EPDRH) &lt;&lt; 8));<br />}</p><p>void<br />write_srom_word(int offset, u16 val)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_EPAR, offset);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_EPDRH, ((val &gt;&gt; 8) &amp; 0xff));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_EPDRL, (val &amp; 0xff));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_EPCR, 0x12);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; udelay(8000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_EPCR, 0);<br />}</p><p><br />/*<br />&nbsp;&nbsp; Read a byte from I/O port<br />*/<br />static u8<br />DM9000_ior(int reg)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_outb(reg, DM9000_IO);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return DM9000_inb(DM9000_DATA);<br />}</p><p>/*<br />&nbsp;&nbsp; Write a byte to I/O port<br />*/<br />static void<br />DM9000_iow(int reg, u8 value)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_outb(reg, DM9000_IO);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_outb(value, DM9000_DATA);<br />}</p><p>/*<br />&nbsp;&nbsp; Read a word from phyxcer<br />*/<br />static u16<br />phy_read(int reg)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u16 val;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Fill the phyxcer register into REG_0C */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_EPAR, DM9000_PHY | reg);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_EPCR, 0xc);&nbsp;&nbsp; /* Issue phyxcer read command */<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; udelay(100);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Wait read complete */&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //weiyan<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; udelay(1000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Wait read complete */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_EPCR, 0x0);&nbsp;&nbsp; /* Clear phyxcer read command */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val = (DM9000_ior(DM9000_EPDRH) &lt;&lt; 8) | DM9000_ior(DM9000_EPDRL);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* The read data keeps on REG_0D &amp; REG_0E */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;phy_read(%d): %d\n&quot;, reg, val);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return val;<br />}</p><p>/*<br />&nbsp;&nbsp; Write a word to phyxcer<br />*/<br />static void<br />phy_write(int reg, u16 value)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Fill the phyxcer register into REG_0C */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_EPAR, DM9000_PHY | reg);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Fill the written data into REG_0D &amp; REG_0E */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_EPDRL, (value &amp; 0xff));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_EPDRH, ((value &gt;&gt; 8) &amp; 0xff));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_EPCR, 0xa);&nbsp;&nbsp; /* Issue phyxcer write command */<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; udelay(500);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Wait write complete */ //weiyan<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; udelay(1000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Wait write complete */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_iow(DM9000_EPCR, 0x0);&nbsp;&nbsp; /* Clear phyxcer write command */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DM9000_DBG(&quot;phy_write(reg:%d, value:%d)\n&quot;, reg, value);<br />}<br />#endif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* CONFIG_DRIVER_DM9000 */</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://weibing.blogbus.com/logs/6334526.html">怎么又怎么了</a> 2007-07-03</div><div><a href="http://weibing.blogbus.com/logs/4738821.html">opie start log</a> 2007-03-10</div><div><a href="http://weibing.blogbus.com/logs/3459253.html">武侠梦</a> 2006-10-02</div><div><a href="http://weibing.blogbus.com/logs/3444047.html">linux 三天行</a> 2006-09-29</div><div><a href="http://weibing.blogbus.com/logs/2940422.html">YAHOO.util.Dom.setStyle 无法生效</a> 2006-07-30</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fweibing.blogbus.com%2Flogs%2F21641490.html&title=U-BOOT+1.3+DM9000AEP%E9%A9%B1%E5%8A%A8">Del.icio.us</a></span></div>]]></description>
   <link>http://weibing.blogbus.com/logs/21641490.html</link>
   <author>weibing</author>
   <pubDate>Sun, 25 May 2008 22:21:43 +0800</pubDate>
  </item>
  <item>
   <title>dm9000ae 在u-boot上的移植小结</title>
   <description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好久没更新blog了，有点忙也有点懒^_^。自从上次十分简单地移植dm9000到试验箱后，就一直没关注具体的细节，直到这几天自己移植dm9000ae的驱动时才发现网友遇到的问题。u-boot自带的dm9000驱动是针对dm9000，一款比较老的isa接口芯片，而现在一般用的是dm9000ae升级版芯片。这个升级并非完全兼容，稍不注意，就会有莫名其妙的错误。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.超时问题，症状为不断地出现T。通过wireshark的抓包，有发送也有返回的包，但返回的包并没有被处理，直到T，然后重新发包。对比Linux的驱动，在收包前Linux会有<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ior(db,0xf4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ior(db,0xf5);<br />这两个动作。添加后问题解决。在这里说是缓冲区要复位，但我对比dm9000和dm9000ae的datasheet，都是说IMR位7置一时，缓冲区满时会自动复位。看不出dm9000和dm9000ae有什么差别...</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.tftp传送失败。传送uImage，bootm后出现&quot;Bad Data CRC&quot;。wireshark抓包，发送和接收都正常。通过cmp与串口传过来的uImage对比，发现每1468个字节后会有8个字节的丢失。打开驱动的debug，print收到的包，发现收到的数据都正确，只不过包的最大长度为1460，后面的8个字节在随后的包中被上层丢弃了。同时，wireshark显示tftp的分包大小为1468，修改tftp的最大分包大小为1460，问题解决。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.每次接收都先停顿一个T。抓包，发现第一个arp包没有被抓到，即dm9000还没正常工作。而且每次接收都会等待一个T，即接收完后dm9000被停止。讲eth_init添加到board的初始化并注释eth_halt的内容，一切搞定^_^。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总结很轻松，过程总是充满辛酸...经过半年的coding，分析能力也有了很大的提高。另外，工作很忙，希望大家不要问我要代码^_^</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://weibing.blogbus.com/logs/8099878.html">充实的假期</a> 2007-09-04</div><div><a href="http://weibing.blogbus.com/logs/7356405.html">第一站：珠海拱北</a> 2007-08-03</div><div><a href="http://weibing.blogbus.com/logs/6771250.html">实习小结</a> 2007-07-16</div><div><a href="http://weibing.blogbus.com/logs/4597059.html">书海七天</a> 2007-02-23</div><div><a href="http://weibing.blogbus.com/logs/4123025.html">英语.无奈</a> 2006-12-24</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fweibing.blogbus.com%2Flogs%2F12146712.html&title=dm9000ae+%E5%9C%A8u-boot%E4%B8%8A%E7%9A%84%E7%A7%BB%E6%A4%8D%E5%B0%8F%E7%BB%93">Del.icio.us</a></span></div>]]></description>
   <link>http://weibing.blogbus.com/logs/12146712.html</link>
   <author>weibing</author>
   <pubDate>Sun, 16 Dec 2007 17:01:41 +0800</pubDate>
  </item>
  <item>
   <title>Touch Dial</title>
   <description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 哈哈，出粮了，买手机了，抽时间写了个uiq3的拨号软件，挺好玩的^_^，下面是it168里的文章。<a href="http://se.it168.com/viewthread.php?tid=815203&amp;page=1&amp;extra">http://se.it168.com/viewthread.php?tid=815203&amp;page=1&amp;extra</a>=</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上星期买了部w950i，找资源来到168，看到UCall很酷，但很久没更新，于是我做了一个升级版。<br />因为按键图片是动态载入的，所以程序反应有点慢。大家测试后给点意见^_^<br /><br /><img src="http://seat.it168.com/f/a2d5ce051f2422df91ffc9eeecdbd492/47243fe5/day_071028/20071028_e9d0b0f88850e2752535GWygRFfPcH5r.jpg/p/touchdial.jpg" onmouseover="attachimginfo(this, 'attach_2324374', 1);attachimg(this, 'mouseover')" onmouseout="attachimginfo(this, 'attach_2324374', 0, event)" border="0" alt="" /><span style="display: none; left: 260px; position: absolute; top: 496px"><img src="http://se.it168.com/images/default_green/attachimg.gif" border="0" alt="" /></span><br /><br />将程序安装到卡上，会在resource\Apps\目录下创建TouchDial目录。所有程序用到的图片都放在这，<br />各位朋友可以将自己的图片替换掉原来的，diy一个自己的拨号盘。<br /><br /><a href="http://seat.it168.com/f/183c1ea79fc91a01879c2833abc1fb2b/472434b3/day_071028/20071028_ad38e8497ea539a9c1a6QbqGWe0p8n2e.jpg/p/touchdial2.jpg" target="_blank"><img src="http://seat.it168.com/thumb/day_071028/20071028_ad38e8497ea539a9c1a6QbqGWe0p8n2e.jpg" onmouseover="attachimginfo(this, 'attach_2324725', 1)" onmouseout="attachimginfo(this, 'attach_2324725', 0, event)" border="0" alt="点击在新窗口查看全图" /></a><span style="display: none; left: 260px; position: absolute; top: 873px"><img src="http://se.it168.com/images/default_green/attachimg.gif" border="0" alt="" /></span><br /><br />更新了按键的间隔，横向间隔没了，但纵向的间隔怎么都搞不定。。。。<br /><br /><img src="http://seat.it168.com/f/8ec23dff20ccbd29d74d07c41cbca1dd/47243fe5/day_071028/20071028_e49f8db838b878d86ebasFHEyHXlXJ8i.jpg/p/touchdial4.jpg" onmouseover="attachimginfo(this, 'attach_2324987', 1);attachimg(this, 'mouseover')" onmouseout="attachimginfo(this, 'attach_2324987', 0, event)" border="0" alt="" /><span style="display: none; left: 260px; position: absolute; top: 1237px"><img src="http://se.it168.com/images/default_green/attachimg.gif" border="0" alt="" /></span><br /><br />跟新了图片和拨打键的位置。喜欢原来位置的朋友下载dialkey.rar覆盖resource\Apps\Touchdial目录里的图片即可。</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://weibing.blogbus.com/logs/4512572.html">nc 使用摘录</a> 2007-02-11</div><div><a href="http://weibing.blogbus.com/logs/4205190.html">Linux 命令解释程序的实现(shell)</a> 2007-01-05</div><div><a href="http://weibing.blogbus.com/logs/4155880.html">超简单的shell排序</a> 2006-12-29</div><div><a href="http://weibing.blogbus.com/logs/2953733.html">获取鼠标当前位置的通用方法</a> 2006-08-01</div><div><a href="http://weibing.blogbus.com/logs/2947704.html">细心 细心 再细心 ！</a> 2006-07-31</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fweibing.blogbus.com%2Flogs%2F10524795.html&title=Touch+Dial">Del.icio.us</a></span></div>]]></description>
   <link>http://weibing.blogbus.com/logs/10524795.html</link>
   <author>weibing</author>
   <pubDate>Sun, 28 Oct 2007 15:13:22 +0800</pubDate>
  </item>
  <item>
   <title>充实的假期</title>
   <description><![CDATA[<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 终于有时间写点东西了。实习结束休息几天后马上奔到珠海，开始人生的另一个旅途。刚开始，工作很紧张，几乎喘不过气来。慢慢地，适应了，任务也逐步完成，开始发现这个城市也不错:)&nbsp;其实每个城市都有自己的特点，相对广州，珠海的环境确实不错，只是感觉这个城市的节奏有点慢。记得去面谈那天，我问的士师傅珠海有什么特点，他第一个告诉我的就是慢。也许，柔和的海景需要漫步欣赏。 
</p>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可惜，出去游玩的时间不多，一个月来我的任务是负责CQT（移动网络质量测试终端）各模块的功能，平台是我熟悉的2440。难度不高，但任务挺重的，电话拨打、短信、彩信、邮件、网络下载等等。只可惜最后的录音放音模块还没完成，现在没有开发板好像也调试不了。期间，最搞笑的还是茶壶大哥，经常我睡觉他工作，我工作他睡觉，为人大大咧咧，睡觉打大呼噜^_^。 
</p>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这学期的课程不多，可以专心搞项目了，可是，还有一个问题没解决，有点遗憾。难道只有等待？ 
</p>
<!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://weibing.blogbus.com/logs/12146712.html">dm9000ae 在u-boot上的移植小结</a> 2007-12-16</div><div><a href="http://weibing.blogbus.com/logs/7356405.html">第一站：珠海拱北</a> 2007-08-03</div><div><a href="http://weibing.blogbus.com/logs/4406867.html">关于u-boot的编译</a> 2007-01-30</div><div><a href="http://weibing.blogbus.com/logs/3233762.html">老天跟我开了个玩笑</a> 2006-09-05</div><div><a href="http://weibing.blogbus.com/logs/2987833.html">致我的好友</a> 2006-08-05</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fweibing.blogbus.com%2Flogs%2F8099878.html&title=%E5%85%85%E5%AE%9E%E7%9A%84%E5%81%87%E6%9C%9F">Del.icio.us</a></span></div>]]></description>
   <link>http://weibing.blogbus.com/logs/8099878.html</link>
   <author>weibing</author>
   <pubDate>Tue, 04 Sep 2007 23:15:46 +0800</pubDate>
  </item>
  <item>
   <title>第一站：珠海拱北</title>
   <description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8月，职场的正式第一站，珠海拱北之北--香洲。有我曾经向往的工作方式，日出而作日落而继续做...然而，还有更恐怖的茶壶大哥，工作时间平均为11点到5点...这个5点可是早上的5点！！！一个星期连续5天（至今为止:)），不知是不是在赶工程，其他大哥也一般工作到晚上10点...有点难以想象，这样工作，是不是有点累？</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 工作差不多一个星期了，这星期主要负责gsm模块的拨号，写了两天的程序，被老手在4小时内从30K重构到15K，佩服得不得了...我接触的第一个高手，功夫有多深？10年。</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://weibing.blogbus.com/logs/12146712.html">dm9000ae 在u-boot上的移植小结</a> 2007-12-16</div><div><a href="http://weibing.blogbus.com/logs/8099878.html">充实的假期</a> 2007-09-04</div><div><a href="http://weibing.blogbus.com/logs/3764828.html">终于解放</a> 2006-11-05</div><div><a href="http://weibing.blogbus.com/logs/3325905.html">一本不错的嵌入式入门书籍</a> 2006-09-16</div><div><a href="http://weibing.blogbus.com/logs/3024072.html">javascript 按需载入 js文件</a> 2006-08-10</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fweibing.blogbus.com%2Flogs%2F7356405.html&title=%E7%AC%AC%E4%B8%80%E7%AB%99%EF%BC%9A%E7%8F%A0%E6%B5%B7%E6%8B%B1%E5%8C%97">Del.icio.us</a></span></div>]]></description>
   <link>http://weibing.blogbus.com/logs/7356405.html</link>
   <author>weibing</author>
   <pubDate>Fri, 03 Aug 2007 21:14:44 +0800</pubDate>
  </item>
  <item>
   <title>实习总结</title>
   <description><![CDATA[<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span><span><font face="Times New Roman">下文本为献给我们尊敬的老师们而写，部分言语纯属多余 ^_^&nbsp;</font></span></span></p><p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span><span></span></span></p><p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体">实习期间，我主要负责公司</span><span><font face="Times New Roman">Windows CE 5.0</font></span><span style="font-family: 宋体">（以下简称</span><span><font face="Times New Roman">Wince</font></span><span style="font-family: 宋体">）</span><span><font face="Times New Roman"> BSP</font></span><span style="font-family: 宋体">（板级支持包）和</span><span><font face="Times New Roman">BootLoader</font></span><span style="font-family: 宋体">的研发工作。通过增强软件的容错性，减少个别硬件对系统的干扰，使开发板的稳定性得到很大的提高。下面是各阶段的工作总结。</span></p><span><font face="Times New Roman">&nbsp;</font></span> <p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体">第一周，是</span><span><font face="Times New Roman">BootLoader</font></span><span style="font-family: 宋体">的调试，这一阶段主要完成</span><span><font face="Times New Roman">Wince</font></span><span style="font-family: 宋体">映象</span><span><font face="Times New Roman">USB</font></span><span style="font-family: 宋体">下载和烧写功能。刚开始时，由于对</span><span><font face="Times New Roman">Wince</font></span><span style="font-family: 宋体">的架构及其开发流程不熟悉，整个项目进度很慢。期间很多问题都不能快速判断原因所在，不得不通过仿真器一步一步的进行调试，找到出现问题的地方再查资料。确定问题的原因后，解决就十分容易。譬如</span><span><font face="Times New Roman">Wince</font></span><span style="font-family: 宋体">映象的较检，将</span><span><font face="Times New Roman">NK.BIN</font></span><span style="font-family: 宋体">解包时会根据内核虚地址的设置计算映像的入口地址和映像大小等。这时，对比</span><span><font face="Times New Roman">BootLoader</font></span><span style="font-family: 宋体">和内核的虚地址设置，问题便迎刃而解。虽然这阶段花了很长时间和很大的努力，但也正是这一阶段的知识积累，为后续工作打下坚实的基础。</span></p><span><font face="Times New Roman">&nbsp;</font></span> <p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体">第二周，是</span><span><font face="Times New Roman">Wince BSP</font></span><span style="font-family: 宋体">的调试。由于原来的</span><span><font face="Times New Roman">BSP</font></span><span style="font-family: 宋体">不是针对现在这款开发板写的，导致开发板的运行存在不稳定的因素。第一个不稳定因素是启动后内存的不确定状态。原来的</span><span><font face="Times New Roman">FMD</font></span><span style="font-family: 宋体">（闪存媒质驱动）中会根据内存中的参数共享块</span><span><font face="Times New Roman">IMAGE_SHARE_ARGS_UA_STAR</font></span><span style="font-family: 宋体">判断是热启动还是冷启动，然后执行相应的操作。部分开发板的内存启动时并没有完全清空，致使启动失败。在</span><span><font face="Times New Roman">BootLoader</font></span><span style="font-family: 宋体">里手动将这块内存区清空，问题解决。第二个不稳定参数是电源和重启按键驱动与硬件不协调。大部分开发板能正常启动，只有少部分在打印了相关信息后便不能启动。通过驱动的源码可知，该驱动分别为电源和重启按键申请中断</span><span><font face="Times New Roman">0</font></span><span style="font-family: 宋体">和中断</span><span><font face="Times New Roman">2</font></span><span style="font-family: 宋体">，不能启动的开发板都停留在中断开启后。测量中断</span><span><font face="Times New Roman">0</font></span><span style="font-family: 宋体">的端口电压，只有</span><span><font face="Times New Roman">1.5V</font></span><span style="font-family: 宋体">，即不停的陷入中断循环中。原来是端口的电压被无故拉低。问题的解决也算简单，要不给相关端口接外部上拉电阻，要不将相关驱动去除。</span></p><span><font face="Times New Roman">&nbsp;</font></span> <p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体">第三周，是给</span><span><font face="Times New Roman">Wince BSP</font></span><span style="font-family: 宋体">添加额外的功能。主要添加的功能有三个，分别是</span><span><font face="Times New Roman">HIVE</font></span><span style="font-family: 宋体">注册表的实现、</span><span><font face="Times New Roman">NAND FLASH</font></span><span style="font-family: 宋体">剩余空间的分区和</span><span><font face="Times New Roman">RTC</font></span><span style="font-family: 宋体">实时时钟的保存。关于</span><span><font face="Times New Roman">HIVE</font></span><span style="font-family: 宋体">注册表的保存，主要是修改注册表，使相关表项能在系统启动初期被加载。网上和</span><span><font face="Times New Roman">Platform Builder</font></span><span style="font-family: 宋体">自带的帮助都有详细的介绍和指示。但我按操作修改完后，却怎么也无法启动，最后实在没办法，尝试了一次</span><span><font face="Times New Roman">Build and Sysgen</font></span><span style="font-family: 宋体">，经过数小时的等待后，系统正常启动。估计是</span><span><font face="Times New Roman">HIVE</font></span><span style="font-family: 宋体">所需的部分代码没有被编译，才使启动失败。</span><span><font face="Times New Roman">64M</font></span><span style="font-family: 宋体">的</span><span><font face="Times New Roman">NAND FLASH</font></span><span style="font-family: 宋体">除去</span><span><font face="Times New Roman">BootLoader</font></span><span style="font-family: 宋体">和</span><span><font face="Times New Roman">Wince</font></span><span style="font-family: 宋体">映象所占的空间外，还有将近一半的空间供用户存储资料。但问题是</span><span><font face="Times New Roman">BootLoader</font></span><span style="font-family: 宋体">是自己写的，要移植</span><span><font face="Times New Roman">Wince</font></span><span style="font-family: 宋体">的分区管理，目前是不可能的事情。不行就换个角度吧，经过分析，</span><span><font face="Times New Roman">FMD</font></span><span style="font-family: 宋体">首先会查询每个块是否坏块，是则跳过，否则纳入其管核范围之内。这样的话，要达到我的目的就太容易了，告诉</span><span><font face="Times New Roman">FMD</font></span><span style="font-family: 宋体">的上层，存储</span><span><font face="Times New Roman">BootLoader</font></span><span style="font-family: 宋体">和</span><span><font face="Times New Roman">Wince</font></span><span style="font-family: 宋体">映象的空间都是坏的，剩下的空间便自然被纳入管理。</span><span><font face="Times New Roman">RTC</font></span><span style="font-family: 宋体">功能的添加也很简单，由于每次启动后，系统的时间都会初始化为一固定的时间。猜测是启动时执行了时间的设置，使时间停顿。事实证明，猜测是正确的，在</span><span><font face="Times New Roman">RTC</font></span><span style="font-family: 宋体">的驱动初始化时调用了</span><span><font face="Times New Roman">OEMSetRealTime(pTime)</font></span><span style="font-family: 宋体">函数，使每次启动的时间固定为</span><span><font face="Times New Roman">pTime</font></span><span style="font-family: 宋体">。注释该行后，时间正常。</span></p><span><font face="Times New Roman">&nbsp;</font></span> <p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体">第四周，是部分驱动和</span><span><font face="Times New Roman">BootLoader</font></span><span style="font-family: 宋体">的修改。需要改的驱动主要有三个：网卡、</span><span><font face="Times New Roman">LCD</font></span><span style="font-family: 宋体">和触摸屏。首先接手的是网卡，但手头没有一点关于网卡驱动的资料，除了源代码。接连几天，没有一点进展，不得不暂时放弃。至于</span><span><font face="Times New Roman">LCD</font></span><span style="font-family: 宋体">驱动，主要是修改一下硬件的参数，使其工作于</span><span><font face="Times New Roman">7</font></span><span style="font-family: 宋体">寸和</span><span><font face="Times New Roman">8</font></span><span style="font-family: 宋体">寸的屏幕。由于之前已做过</span><span><font face="Times New Roman">Linux</font></span><span style="font-family: 宋体">下相关的修改，这一部分很快完成。但屏幕增大后，触摸屏的精度有很大的下降，直接测得的数据跳动很大。这一部分的解决与</span><span><font face="Times New Roman">Linux</font></span><span style="font-family: 宋体">相同，通过增加测量时间，取各测量值的平均值来调整触摸屏的精度。驱动修改完后，轮到</span><span><font face="Times New Roman">Bootloader</font></span><span style="font-family: 宋体">了，主要是添加图片显示和</span><span><font face="Times New Roman">Wince</font></span><span style="font-family: 宋体">映象加载的进度条显示。图片显示是在初始化</span><span><font face="Times New Roman">LCD</font></span><span style="font-family: 宋体">时，将已转为数组形式的</span><span><font face="Times New Roman">BMP</font></span><span style="font-family: 宋体">图片根据屏幕的分辨率逐点显示，最后便完整地显示整幅图片。而进度条则根据当前已读取的映象大小与总的映象大小之比来更新进度条的长度和相应的颜色，使加载的进度一目了然。</span></p><span><font face="Times New Roman">&nbsp;</font></span> <p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体">第五周，是</span><span><font face="Times New Roman">Linux</font></span><span style="font-family: 宋体">相关说明文档的撰写。这部分之前已做过，也许是说明不够明晰，咨询者众。现在顺带升级根文件系统并撰写</span><span><font face="Times New Roman">Step By Step</font></span><span style="font-family: 宋体">文档，包括《基于</span><span><font face="Times New Roman">Busybox</font></span><span style="font-family: 宋体">的根文件系统制作》、《</span><span><font face="Times New Roman">Linux</font></span><span style="font-family: 宋体">内核的编译及烧写》、《</span><span><font face="Times New Roman">Linux</font></span><span style="font-family: 宋体">开发环境</span><span><font face="Times New Roman">(NFS)</font></span><span style="font-family: 宋体">的快速搭建》等。</span></p><span><font face="Times New Roman">&nbsp;</font></span> <p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="font-family: 宋体">五周的实习生活很忙碌也很充实，除了以上工作外，还学习到不少公司运营的知识、营销的策略，算是迈进职场工作中踏出的坚实的第一步。</span></p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://weibing.blogbus.com/logs/12146712.html">dm9000ae 在u-boot上的移植小结</a> 2007-12-16</div><div><a href="http://weibing.blogbus.com/logs/5331712.html">linux开发环境的快速搭建</a> 2007-05-10</div><div><a href="http://weibing.blogbus.com/logs/4738821.html">opie start log</a> 2007-03-10</div><div><a href="http://weibing.blogbus.com/logs/4467465.html">cs8900 移植 Linux-2.6.19.2</a> 2007-02-06</div><div><a href="http://weibing.blogbus.com/logs/2976351.html">AJAX实现的MVC模型</a> 2006-08-04</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fweibing.blogbus.com%2Flogs%2F7072839.html&title=%E5%AE%9E%E4%B9%A0%E6%80%BB%E7%BB%93">Del.icio.us</a></span></div>]]></description>
   <link>http://weibing.blogbus.com/logs/7072839.html</link>
   <author>weibing</author>
   <pubDate>Thu, 26 Jul 2007 11:30:52 +0800</pubDate>
  </item>
  <item>
   <title>实习小结</title>
   <description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实习快三周了，总算慢慢适应下来。上班很轻松，但上下班的路途却异常险峻...不知是身体累了，还是精神疲惫，搞得晚上的生活异常丰富，打机，看电影，虐待沙包...还有很多新的电影还没看完啊...</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然，技术也算有点进展。上班的效率不错，现在对wince也有了一点了解。NAND Flash分区划分，HIVE注册表保存，RTC时钟保存，NK的usb下载和较检保存。还有一个有点意思的bootloader，暂时名叫ATBOOT。这个bootloader花了不少时间在wince的引导上，好不容易才跟踪到mmu的打开导致lcd寄存器读写失效。跳到ce时明明已关闭了mmu，不知mmu是怎样影响寄存器的读写，难道是映射错误？看来，要恶补一下才行...</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wince5.0差dm9000的网卡驱动还没好外暂时也没什么好搞了，但是wince的调试真让人头疼，首先编译就得花不少时间，另外，没有Eboot，还不知如何单步调试驱动。这只老虎不好吃，但很有挑战性，i like it。明天，要开始整理Linux的资料了，要是Linux也有一个统一的UI界面，也许会吸引更多的开发者，不过，微软为开发者做的事也太多了，框架，接口，规范...什么都有。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看来，还需要更多的项目来发现他们各自的优点。 :)</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://weibing.blogbus.com/logs/5235924.html">又一次站起来...</a> 2007-05-02</div><div><a href="http://weibing.blogbus.com/logs/4738821.html">opie start log</a> 2007-03-10</div><div><a href="http://weibing.blogbus.com/logs/4418970.html">u-boot 1.1.5 移植成功</a> 2007-01-31</div><div><a href="http://weibing.blogbus.com/logs/4123025.html">英语.无奈</a> 2006-12-24</div><div><a href="http://weibing.blogbus.com/logs/3400990.html">计算机三级考试经验</a> 2006-09-24</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fweibing.blogbus.com%2Flogs%2F6771250.html&title=%E5%AE%9E%E4%B9%A0%E5%B0%8F%E7%BB%93">Del.icio.us</a></span></div>]]></description>
   <link>http://weibing.blogbus.com/logs/6771250.html</link>
   <author>weibing</author>
   <pubDate>Mon, 16 Jul 2007 20:41:11 +0800</pubDate>
  </item>
  <item>
   <title>怎么又怎么了</title>
   <description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 睡醒时，梦破灭了。依恋美好的梦境，但终需回到现实。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上班了，不得不学习如何挤公交，下班了，盘算何时才能远离挤压的人群。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 回家后，累了堕了，我的积极哪去呢？</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 唯一觉得不错的，是睡的很快、很香，有点难以想象。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Good Luck Boy! 前路任你闯，just relax...</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://weibing.blogbus.com/logs/5445315.html">家里的床还是不错的</a> 2007-05-20</div><div><a href="http://weibing.blogbus.com/logs/5235924.html">又一次站起来...</a> 2007-05-02</div><div><a href="http://weibing.blogbus.com/logs/4965139.html">暴风雨过后</a> 2007-04-06</div><div><a href="http://weibing.blogbus.com/logs/4123025.html">英语.无奈</a> 2006-12-24</div><div><a href="http://weibing.blogbus.com/logs/3623974.html">一叶孤舟 飘荡湖中</a> 2006-10-20</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fweibing.blogbus.com%2Flogs%2F6334526.html&title=%E6%80%8E%E4%B9%88%E5%8F%88%E6%80%8E%E4%B9%88%E4%BA%86">Del.icio.us</a></span></div>]]></description>
   <link>http://weibing.blogbus.com/logs/6334526.html</link>
   <author>weibing</author>
   <pubDate>Tue, 03 Jul 2007 23:46:20 +0800</pubDate>
  </item>
  <item>
   <title>家里的床还是不错的</title>
   <description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不知从什从时候开始，便一直没有休息的工作，直到现在，直到哪一天病倒。说也奇怪，除了肚子痛，好像好久没有遇到感冒、发烧之类的东西 :)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 没记错的话，过完年不到10天就回到学校开始工作，一直都没有回家住上一个晚上，直到昨晚...有时，真的很佩服自己，怎么这么能干 ^_^ 要不是该死的空调管道发出的十分烦躁的噪声，说不定家里的老爸还在唠叨什么时候回去吃个饭:)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实，回去挺麻烦的，摇诳、拥挤的旅途不说，还有修这个电脑、买那个东西。就是不能好好休息。连老爸都说是不是又回来修电脑啦...虽然这次真的只想回来吃顿饭，睡个好觉...</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://weibing.blogbus.com/logs/6334526.html">怎么又怎么了</a> 2007-07-03</div><div><a href="http://weibing.blogbus.com/logs/5235924.html">又一次站起来...</a> 2007-05-02</div><div><a href="http://weibing.blogbus.com/logs/4965139.html">暴风雨过后</a> 2007-04-06</div><div><a href="http://weibing.blogbus.com/logs/4770389.html">做老师也不容易</a> 2007-03-14</div><div><a href="http://weibing.blogbus.com/logs/4597059.html">书海七天</a> 2007-02-23</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fweibing.blogbus.com%2Flogs%2F5445315.html&title=%E5%AE%B6%E9%87%8C%E7%9A%84%E5%BA%8A%E8%BF%98%E6%98%AF%E4%B8%8D%E9%94%99%E7%9A%84">Del.icio.us</a></span></div>]]></description>
   <link>http://weibing.blogbus.com/logs/5445315.html</link>
   <author>weibing</author>
   <pubDate>Sun, 20 May 2007 22:43:23 +0800</pubDate>
  </item>
  <item>
   <title>linux开发环境的快速搭建</title>
   <description><![CDATA[<p>linux开发环境的快速搭建 <br />WeiBing</p><p>(本文针对朗成电子公司的&nbsp;AT2440EVB-I开发板而写)</p><p>1.建立文件系统目录<br />&nbsp;&nbsp;&nbsp; 假定文件系统的目录为/rootfs,将rootfs.tar解压到该目录。<br />mkdir /rootfs<br />tar zxf rootfs.tar -C /rootfs</p><p>2.配置nfs文件系统<br />&nbsp;&nbsp;&nbsp; 修改/etc/exports文件，格式为 共享目录 开发板ip地址（权限设置）<br />cat &lt;&lt;EOM &gt;/etc/exports<br />/rootfs&nbsp;&nbsp;192.168.1.120(rw,sync,insecure,no_root_squash)<br />EOM<br />&nbsp;&nbsp;&nbsp; 重启nfs服务器<br />/etc/init.d/nfs restart</p><p>3.烧写可启动内核<br />&nbsp;&nbsp;&nbsp; 将待烧写的uImage放到tftp服务器指定的目录下（假定其ip为192.168.1.100），进入u-boot的命令行状态,顺</p><p>序执行下列命令：<br />set ipaddr 192.168.1.120<br />set serverip 192.168.1.100<br />erase 0x00040000 0x001dffff<br />tftp 0x30000000 uImage<br />cp.b 0x30000000 0x00040000 $(filesize)</p><p>set bootargs root=/dev/nfs nfsroot=202.192.32.100:/arm/rootfs rw noinitrd init=/linuxrc </p><p>ip=192.168.1.120:192.168.1.100:192.168.1.100:255.255.255.0:avantech:eth0:off console=ttySAC0,115200</p><p>set bootcmd cp.b 0x00040000 0x33000000 $(filesize)</p><p>saveenv<br />reset</p><p>4.重新启动即可进入开发环境。在linux服务器端将编译好的程序放到/rootfs目录下，通过telnet连入开发板即可</p><p>执行新的程序。下面以usb摄像头的采集程序为例，简要说明开发环境的使用方法。<br />首先，将摄像头驱动usbcam.ko和采集程序spcaserv复制到/rootfs/opt/usbcam目录下<br />mkdir /rootfs/opt/usbcam -p<br />cp usbcam.ko spcaserv /rootfs/opt/usbcam<br />然后进入开发板，执行<br />insmod /opt/usbcam/usbcam.ko<br />./rootfs/opt/usbcam/spcaserv -w 192.168.1.120:7070 -s 320x240 -d /dev/video0<br />最后可以在windows下执行play.bat即可看到从开发板采集到的图象。</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://weibing.blogbus.com/logs/5035974.html">odd bug on struct device_driver</a> 2007-04-14</div><div><a href="http://weibing.blogbus.com/logs/4474252.html">s3c2410 关于 LCD移植的问题</a> 2007-02-06</div><div><a href="http://weibing.blogbus.com/logs/4467465.html">cs8900 移植 Linux-2.6.19.2</a> 2007-02-06</div><div><a href="http://weibing.blogbus.com/logs/4453804.html">BusyBox v1.4.1 移植 s3c2410</a> 2007-02-04</div><div><a href="http://weibing.blogbus.com/logs/4437246.html">DM9000 终于跑起来</a> 2007-02-02</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Fweibing.blogbus.com%2Flogs%2F5331712.html&title=linux%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E7%9A%84%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BA">Del.icio.us</a></span></div>]]></description>
   <link>http://weibing.blogbus.com/logs/5331712.html</link>
   <author>weibing</author>
   <pubDate>Thu, 10 May 2007 22:31:20 +0800</pubDate>
  </item>
 </channel>
</rss>
