關於uboot在jz2440上的移植問題

由於書上的介紹與板子上不大一樣,遇到很多問題,將查找到的資料綜合一下,以便使用!



1)開發環境

1.開發板:勤研2440, 

nor flash:沒移植改變nor flash前,顯示Amd29LV400BB 512K,但實際是:

Bank # 1: MXIC MX29LV160B FLASH (16 x 16)  Size: 2 MB in 35 Sectors
  AMD Standard command set, Manufacturer ID: 0xC2, Device ID: 0x2249
  Erase timeout: 30000 ms, write timeout: 100 ms

第0扇區大小爲8K,第1、2爲4K,第3爲16K,後面31扇區爲32K。前面4個扇區加起來剛好是主要扇區的大小 = 32K

Sector Start Addresses:
    00000000 (RO) 00002000 (RO) 00003000 (RO) 00004000 (RO) 00008000 (RO)
    00010000 (RO) 00018000      00020000      00028000      00030000
    00038000      00040000      00048000      00050000      00058000
    00060000      00068000      00070000      00078000      00080000 (RO,放參數)
    00088000 (RO) 00090000      00098000      000A0000      000A8000
    000B0000      000B8000      000C0000      000C8000      000D0000
    000D8000      000E0000      000E8000      000F0000      000F8000


2.軟件環境:ubantu9.0(韋東山一期光盤)

3. linux版本:linux-2.6.22.6 (/work/system/linux-2.6.22.6)補丁:linux-2.6.22.6_jz2440.patch

4.u-boot:uboot-1.1.6  補丁:u-boot-1.1.6_jz2440.patch

 

5.自己的u-boot目錄/work/system/u-boot-jimmy/u-boot-1.1.6

 

參考:http://blog.csdn.net/johnmcu/article/details/6561311

 2)具體步驟

A)解壓U-BOOT-1.1.6,進入U-BOOT目錄,修改Makefile

smdk2410_config :       unconfig
        @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

加上

myjz2440_config: unconfig
        @$(MKCONFIG) $(@:_config=) arm arm920t myjz2440  NULL s3c24x0

 

修改完Makefile後,在board目錄下,新建自己的開發板目錄myjz2440,把smdk2410目錄下的所有文件拷到myjz2440,把smdk2410.c改爲myjz2440.c。修改該目錄下的Makefile,把smdk2410.o改爲myjz2440.o

COBJS :=myjz2440.o flash.o

 

include/configs目錄下創建板子的配置頭文件,拷貝smdk2410.hmyjz2440.h

 

  測試能否編譯成功:

  執行makemyjz2440_config

 

B).修改SDRAM配置,在board/myjz2440/lowlevel_init.S(內存控制器初始化)中,檢查

#define B6_BWSCON  (DW32)位寬爲32

B1_BWSCON改爲(DW16 B5_BWSCON改爲(DW8),如下:

#define B1_BWSCON               (DW16)
#define B2_BWSCON               (DW16)
//#define B3_BWSCON             (DW16 + WAIT + UBLB)
#define B3_BWSCON               (DW16 + UBLB)
#define B4_BWSCON               (DW16 + WAIT + UBLB)
#define B5_BWSCON               (DW8)
#define B6_BWSCON               (DW32)
#define B7_BWSCON               (DW32)

 

根據HCLK設置SDRAM 的刷新參數,主要是REFCNT寄存器,開發板HCLK100M

將  

#define REFCNT  0x1113 改爲  #define REFCNT 0x4f4  /* period=7.8125us, HCLK=100Mhz, (2048+1-7.8125*100) */

增加對S3C2440的支持2440的時鐘計算公式、NAND操作和2410不太一樣。

對於2440開發板,將FCLK設爲400MHz,分頻比爲FCLKHCLKPCLK=148

 

修改board/myjz2440/myjz2440.c中的board_init函數(爲了方便,可以再 vi include/s3c24x0.h,加入:

#define isS3C2410               ((rGSTATUS1 & 0xffff0000) == 0x32410000)
):

 

DECLARE_GLOBAL_DATA_PTR;

 

#define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01)) 

/*參考鏈接是#define S3C2440_MPLL_400MHZ ((0x7f<<12)|(0x02<<4)|(0x01)) ,不過沒什麼影響*/
#define S3C2440_MPLL_200MHZ     ((0x5c<<12)|(0x01<<4)|(0x02))
#define S3C2440_MPLL_100MHZ     ((0x5c<<12)|(0x01<<4)|(0x03))
#define S3C2440_UPLL_96MHZ      ((0x38<<12)|(0x02<<4)|(0x01))
#define S3C2440_UPLL_48MHZ      ((0x38<<12)|(0x02<<4)|(0x02)) //usb有關
#define S3C2440_CLKDIV          (0x05) // | (1<<3))    /* FCLK:HCLK:PCLK = 1:4:8, UCLK = UPLL/2 */
#define S3C2440_CLKDIV188       0x04                  /* FCLK:HCLK:PCLK = 1:8:8 */
#define S3C2440_CAMDIVN188      ((0<<8)|(1<<9)) /* FCLK:HCLK:PCLK = 1:8:8 */

/* Fin = 16.9344MHz */
#define S3C2440_MPLL_399MHz_Fin16MHz    ((0x6e<<12)|(0x03<<4)|(0x01))
#define S3C2440_UPLL_48MHZ_Fin16MHz     ((60<<12)|(4<<4)|(2))


 

int board_init (void)
{

        S3C24X0_CLOCK_POWER *clk_power = S3C24X0_GetBase_CLOCK_POWER();

        S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
        gpio->GPACON = 0x007FFFFF;
        gpio->GPBCON = 0x00044555;
        gpio->GPBUP = 0x000007FF;
        gpio->GPCCON = 0xAAAAAAAA;
        gpio->GPCUP = 0x0000FFFF;
        gpio->GPDCON = 0xAAAAAAAA;
        gpio->GPDUP = 0x0000FFFF;
        gpio->GPECON = 0xAAAAAAAA;
        gpio->GPEUP = 0x0000FFFF;
        gpio->GPFCON = 0x000055AA;
        gpio->GPFUP = 0x000000FF;
        gpio->GPGCON = 0xFF95FFBA;
        gpio->GPGUP = 0x0000FFFF;
        gpio->GPHCON = 0x002AFAAA;
        gpio->GPHUP = 0x000007FF;

        /* FCLK:HCLK:PCLK = 1:4:8 */
        clk_power->CLKDIVN = S3C2440_CLKDIV;

        /* change to asynchronous bus mod */
        __asm__(    "mrc    p15, 0, r1, c1, c0, 0\n"    /* read ctrl register   */
                    "orr    r1, r1, #0xc0000000\n"      /* Asynchronous         */
                    "mcr    p15, 0, r1, c1, c0, 0\n"    /* write ctrl register  */
                    :::"r1"
                    );
        /* to reduce PLL lock time, adjust the LOCKTIME register */
        clk_power->LOCKTIME = 0xFFFFFFFF;
        clk_power->UPLLCON = S3C2440_UPLL_48MHZ;
        delay (4000);
         /* configure MPLL */
        clk_power->MPLLCON = S3C2440_MPLL_400MHZ;
        /* some delay between MPLL and UPLL */
        /* configure UPLL */
        /* some delay between MPLL and UPLL */
        delay (8000);

      gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
        gd->bd->bi_boot_params = 0x30000100;
        icache_enable();
        dcache_enable();
        return 0;
}

 

cpu/arm920t/s3c24X0/speed.c中修改:

在程序開頭增加一行DECLARE_GLOBAL_DATA_PTR;,這樣纔可以使用gd變量:

 

DECLARE_GLOBAL_DATA_PTR;

static ulong get_PLLCLK(int pllreg)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
    ulong r, m, p, s;

    if (pllreg == MPLL)
        r = clk_power->MPLLCON;
    else if (pllreg == UPLL)
        r = clk_power->UPLLCON;
    else
        hang();

    m = ((r & 0xFF000) >> 12) + 8;
    p = ((r & 0x003F0) >> 4) + 2;
    s = r & 0x3;
 /* support both of S3C2410 and S3C2440 */

    if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
       return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
    else
        return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));   /* S3C2440 */
}

/* return FCLK frequency */
ulong get_FCLK(void)
{
    return(get_PLLCLK(MPLL));
}
// jimm add for jz2440
#define S3C2440_CLKDIVN_PDIVN        (1<<0)
#define S3C2440_CLKDIVN_HDIVN_MASK   (3<<1)
#define S3C2440_CLKDIVN_HDIVN_1      (0<<1)
#define S3C2440_CLKDIVN_HDIVN_2      (1<<1)
#define S3C2440_CLKDIVN_HDIVN_4_8    (2<<1)
#define S3C2440_CLKDIVN_HDIVN_3_6    (3<<1)
#define S3C2440_CLKDIVN_UCLK         (1<<3)

#define S3C2440_CAMDIVN_CAMCLK_MASK  (0xf<<0)
#define S3C2440_CAMDIVN_CAMCLK_SEL   (1<<4)
#define S3C2440_CAMDIVN_HCLK3_HALF   (1<<8)
#define S3C2440_CAMDIVN_HCLK4_HALF   (1<<9)
#define S3C2440_CAMDIVN_DVSEN        (1<<12)

/* return HCLK frequency */
ulong get_HCLK(void)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

 unsigned long clkdiv;

    unsigned long camdiv;

    int hdiv = 1;
if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
    return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
else
    {
        clkdiv = clk_power->CLKDIVN;
        camdiv = clk_power->CAMDIVN;

        /* work out clock scalings */

        switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {
        case S3C2440_CLKDIVN_HDIVN_1:
            hdiv = 1;
            break;

        case S3C2440_CLKDIVN_HDIVN_2:
            hdiv = 2;
            break;

        case S3C2440_CLKDIVN_HDIVN_4_8:
            hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;
            break;

        case S3C2440_CLKDIVN_HDIVN_3_6:
            hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
            break;
        }
      return get_FCLK() / hdiv;
    }
}

ulong get_PCLK(void)
{
 S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

    unsigned long clkdiv;

    unsigned long camdiv;

    int hdiv = 1;

 

    /* support both of S3C2410 and S3C2440 */

    if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)

    return((clk_power->CLKDIVN & 0x1) ? get_HCLK()/2 : get_HCLK());

    else

    {

        clkdiv = clk_power->CLKDIVN;
        camdiv = clk_power->CAMDIVN;
        /* work out clock scalings */
        switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {
        case S3C2440_CLKDIVN_HDIVN_1:
            hdiv = 1;
            break;
        case S3C2440_CLKDIVN_HDIVN_2:
            hdiv = 2;
            break;
        case S3C2440_CLKDIVN_HDIVN_4_8:
            hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;
            break;
        case S3C2440_CLKDIVN_HDIVN_3_6:

            hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
            break;
        }
        return get_FCLK() / hdiv / ((clkdiv & S3C2440_CLKDIVN_PDIVN)? 2:1);
    }
}

/* return UCLK frequency */
ulong get_UCLK(void)
{
    return(get_PLLCLK(UPLL));
}

重新執行make myjz2440_config   ;make all生成u-boot.bin,由於還沒有增加NAND Flash的支持,所以可燒入NOR Flash中運行

make all時會出現錯誤:沒有CAMDIVN

這個要在include/s3c24x0.h中定義, 在129S3C24X0_CLOCK_POWER結構體中增加:

S3C24X0_REG32   CAMDIVN;   /* for s3c2440*/

 

成功後,控制檯顯示:

U-Boot 1.1.6 (Jul 20 2013 - 09:53:57)

DRAM:  64 MB
Flash: 512 kB(nor flash ,實際有2M)
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
myjz2440 #  printenv
bootdelay=3
baudrate=115200
ipaddr=10.140.1.253
serverip=10.140.1.250
netmask=255.255.255.0
stdin=serial
stdout=serial
stderr=serial


myjz2440 # ping 10.140.1.250
CS8900 Ethernet chip not found?!





下面修改 的nor flash大小顯示(MX29LV160B FLASH (16 x 16)  Size: 2 MB)


添加Norflash的information

>vi include/flash.h


第181行添加

#define EON_ID_LV160AB   0x22492249


在include/configs/myjz2440.h添加

//jimym add for myjz2440 MX29LV160B
#define CONFIG_MX29LV160B  1
#ifdef CONFIG_MX29LV160B
#define CONFIG_MX29LV160B     1        //TQ2440 Nor Flash
#define PHYS_FLASH_SIZE            0x200000 //2M
#define CFG_MAX_FLASH_SECT  (35)     //扇區數
#define CFG_ENV_ADDR               (CFG_FLASH_BASE + 0x80000) //
0x80000爲參數開始存放位置
#endif

//註釋掉下面兩個類型的Nor Flash設置(CONFIG_AMD_LV400,CONFIG_AMD_LV800),因爲不是我們所使用的型號

#if 0   
#define CONFIG_AMD_LV400     1 /* uncomment this if you have a LV400 flash */
#define CONFIG_AMD_LV800     1 /* uncomment this if you have a LV800 flash */
#endif


在board/myjz2440/flash.c添加:

//jimmy add
#define MAIN_SECT_SIZE     0x8000  // 定義爲32k,主要扇區的大小


#define MEM_FLASH_ADDR1  (*(volatile u16 *)(CFG_FLASH_BASE + (0x00000555 << 1)))
#define MEM_FLASH_ADDR2  (*(volatile u16 *)(CFG_FLASH_BASE + (0x000002AA << 1)))

由於我們是把norflash連接到了s3c2440的bank0上,因此norflash中的地址相對於s3c2440來說基址爲0x00000000,即CFG_FLASH_BASE  = 0。
而之所以又把norflash中的地址向左移一位(即乘以2),是因爲我們是把s3c2440的ADDR1連接到了norflash的A0上的緣故。

由數據手冊可知EN29LV160AB第0扇區大小爲8K,第1、2爲4K,第3爲16K,後面31扇區爲32K。前面4個扇區加起來剛好是主要扇區的大小 = 32K, 所以修改87行下如下

for (j = 0; j < flash_info[i].sector_count; j++)
{
    if (j <= 3) 
   {
        /* 1st one is 8 KB */
       if (j == 0) 
      {
             flash_info[i].start[j] = flashbase + 0;
      }

      /* 2nd and 3rd are both 4 KB */
      if ((j == 1) || (j == 2)) 
     {
           flash_info[i].start[j] = flashbase + 0x2000 + (j - 1) * 0x1000;
     }

     /* 4th 16 KB */
     if (j == 3) 
    {
           flash_info[i].start[j] = flashbase + 0x4000;
     }
 } 
 else 
 {
       flash_info[i].start[j] = flashbase + (j - 3) * MAIN_SECT_SIZE;
 }
}
size += flash_info[i].size;

修改flash_print_info,添加MX29LV160B相關信息如下:


  switch (info->flash_id & FLASH_VENDMASK) {
        case (AMD_MANUFACT & FLASH_VENDMASK):
                printf ("AMD: ");
                break;
case (MX_MANUFACT & FLASH_VENDMASK):
  printf ("MXIC: ");
  break;
        default:
                printf ("Unknown Vendor ");
                break;
        }

switch (info->flash_id & FLASH_TYPEMASK) {
        case (AMD_ID_LV400B & FLASH_TYPEMASK):
                printf ("1x Amd29LV400BB (4Mbit)\n");
                break;
        case (AMD_ID_LV800B & FLASH_TYPEMASK):
                printf ("1x Amd29LV800BB (8Mbit)\n");
                break;
case (MX29LV160B & FLASH_TYPEMASK):
  printf ("1x MX29LV160B (16Mbit)\n");
  break;
        default:
                printf ("Unknown Chip Type\n");
                goto Done;
                break;
        }

修改int flash_erase (flash_info_t * info, int s_first, int s_last)
 if ((info->flash_id & FLASH_VENDMASK) !=
            //(AMD_MANUFACT & FLASH_VENDMASK)) {
            (MX_MANUFACT & FLASH_VENDMASK)) {
                return ERR_UNKNOWN_FLASH_VENDOR;
        }
至此,uboot關於Norflash已經移植好

make distclean

make smdk2440_config

make即可生成u-boot.bin

下載到板子的Norflash,在命令臺輸入saveenv即可

myjz2440 haha# setenv bootdelay 4
myjz2440 haha# saveenv
Saving Environment to Flash...
Un-Protected 2 sectors
Erasing Flash...Erasing sector 19 ... ok.
Erasing sector 20 ... ok.
Erased 2 sectors
Writing to Flash... done
Protected 2 sectors
myjz2440 haha# flinfo

Bank # 1: MXIC: 1x MX29LV160B (16Mbit)
  Size: 2 MB in 35 Sectors
  Sector Start Addresses:
    00000000 (RO) 00002000 (RO) 00003000 (RO) 00004000 (RO) 00008000 (RO)
    00010000 (RO) 00018000      00020000      00028000      00030000
    00038000      00040000      00048000      00050000      00058000
    00060000      00068000      00070000      00078000      00080000 (RO)
    00088000 (RO) 00090000      00098000      000A0000      000A8000
    000B0000      000B8000      000C0000      000C8000      000D0000
    000D8000      000E0000      000E8000      000F0000      000F8000


以上轉自:http://blog.csdn.net/conjimmy/article/details/9491197

(注:原文上面實驗成功,但原文下面網卡移植存在一定問題!)







U-Boot移植DM9000網卡

——西伯利亞的風

    根據書《嵌入式Linux應用開發完全手冊》移植網卡驅動,對於Jz2440開發板好像並不適用,Jz2440開發板使用的是DM9000網卡,已經不是書上講的CS8900網卡了。DM9000網卡與CS8900網卡接口方式不一樣,經過幾天的折騰,終於移植成功,現將筆記整理如下。


一、移植環境

1.u-boot版本1.1.6

2.開發板Jz2440ARM9       S3C2440

                          NAND       K9F2G08

                          SDRAM     K4S561632 * 2

             網卡      DM9000

3.Linux: ubuntu 9.10


二、移植思路

       查看u-boot-1.1.6源碼發現,u-boot中已經包含dm9000的驅動文件dm9000x.c,所以我們只需要設置u-boot支持網卡就行。總體思路主要完成以下幾件事情:

       1.設置存儲控制器,也就是設置S3C2440BANK以使用DM9000

       2.配置u-boot使用DM9000網卡;

       3.設置IPserverIP等。


三、設置存儲控制器

       根據Jz2440開發板的原理圖可知,DM9000網卡  使用的是BANK4

       由圖可知,DM9000網卡使用的片選信號是nGCS 4,也就說明DM9000使用了BANK4。修改lowlevel_init.S(路徑:board/smdk2410/lowlevel_init.S)。

/* BWSCON */

#define DW8      (0x0)

#define DW16    (0x1)

#define DW32    (0x2)

#define WAIT    (0x1<<2)

#define UBLB    (0x1<<3)

#define B1_BWSCON    (DW32)

#define B2_BWSCON    (DW16)

#if 0

#define B3_BWSCON    (DW16 + WAIT + UBLB)

#endif

#define B3_BWSCON    (DW16 + UBLB)

#define B4_BWSCON    (DW16 + WAIT + UBLB)

#define B5_BWSCON    (DW16)

#define B6_BWSCON    (DW32)

#define B7_BWSCON    (DW32)

    修改前BANK3外接的CS8900網卡,將BANK3註釋掉,修改數據寬度爲16位,設置BANK4數據寬度16位,使用WAITnBE信號。

#define B4_Tacs    0x0    /*0clk */

#define B4_Tcos    0x3    /*4clk */

#define B4_Tacc    0x7    /* 14clk */

#define B4_Tcoh    0x1    /*1clk */

#define B4_Tah      0x3    /*4clk */

#define B4_Tacp    0x6    /*6clk */

#define B4_PMC    0x0    /* normal */

    根據DM9000數據手冊設置時序,具體見DM9000數據手冊。


四、配置u-boot使用DM9000網卡

       修改配置文件smdk2410.h(路徑:include/configs/smdk2410.h)。

/** Hardware drivers*/

#if 0

#define CONFIG_DRIVER_CS8900    1
/* we have a CS8900 on-board */

#define CS8900_BASE                       0x19000300

#define CS8900_BUS16                      1 /* the Linux driver does accesses as shorts */

#endif

#define CONFIG_DRIVER_DM9000      1 /* we have a DM9000 on-board */

#define CONFIG_DM9000_USE_16BIT 1

#define CONFIG_DM9000_BASE          0x20000000

#define DM9000_DATA                        0x20000004

#define DM9000_IO                             0x20000000

    註釋掉CS8900的信息,添加DM9000的配置信息。

    宏定義CONFIG_DRIVER_DM90001表示配置使用DM9000網卡,u-boot編譯時會將DM9000相關的驅動編譯進去。其中0x20000000DM9000的基址(BANK4),由於DM9000只有一條地址線CMDLADDR2,見圖3.1)用於區別是數據還是地址(CMD爲低時數據總線上傳輸的是地址信號,CMD爲高時傳輸的是數據信號),所以DM9000_DATA0x20000004DM9000_IO0x20000000


五、設置IPserverIP

       在配置文件smdk2410.h(路徑:include/configs/smdk2410.h)中根據實際情況修改開發板的IP地址,serverIP

    修改前:

#define CONFIG_NETMASK    255.255.255.0

#define CONFIG_IPADDR       10.0.0.110

#define CONFIG_SERVERIP    10.0.0.1

    修改後:

#define CONFIG_NETMASK    255.255.255.0

#define CONFIG_IPADDR       192.168.1.6

#define CONFIG_SERVERIP    192.168.1.2

    我的PC和開發板使用路由器相連,PC IP地址爲192.168.1.2,開發板設置爲192.168.1.6,保證在同一個網段就行。

增加ping命令:

#define CONFIG_COMMANDS \
               (CONFIG_CMD_DFL| \

                  CFG_CMD_CACHE| \

                /*CFG_CMD_NAND|*/ \

           /*CFG_CMD_EEPROM |*/ \

                     /*CFG_CMD_I2C|*/ \

                    /*CFG_CMD_USB|*/ \

                 FG_CMD_REGINFO| \

                     CFG_CMD_PING| \
                     CFG_CMD_DATE| \

                        CFG_CMD_ELF)


    仿照CMD命令格式,我們使用CFG_CMD_PING增加對ping的支持。


六、遇到問題vs解決方案

       以上任務完成,在u-boot根目錄下編譯,編譯成功!

使用OpenJtag將編譯完成的u-boot.bin燒入開發板運行。u-boot啓動後,使用print命令查看u-boot的參數:

Jz2440 # print

bootdelay=3

baudrate=115200

ethaddr=08:00:3e:26:0a:5b

ipaddr=192.168.1.6

serverip=192.168.1.2

netmask=255.255.255.0

stdin=serial

stdout=serial

stderr=serial

    看到開發板的IPserverIP已經修改成功。我們使用ping命令ping一下PC 192.168.1.2

Jz2440 # ping 192.168.1.2

dm9000 i/o: 0x20000000, id: 0x90000a46

MAC: 50:50:50:50:50:50

could not establish link

ping failed; host 192.168.1.2 is not alive


        host is not alive 
ping不通,看來存在問題!

    上網搜索了很久,網上的都是教你屏蔽這一段代碼,屏蔽那一段代碼,然後就可以了,都沒有詳細的分析,看不大明白。後來,通過研究高版本的u-boot,發現了問題所在。

    打開高版本u-bootu-boot-1.3.4中的dm9000x.c,可以看到如下更新說明:

06/03/2008    Remy Bohmer <[url=mailto[email protected]][email protected][/url]>

-Fixed the driver to work with DM9000A.


    發現DM9000驅動在後續版本中更新了,老版本的(u-boot-1.1.6)對DM9000支持可能存在問題。

    發現了問題,馬上更新試試看,複製u-boot-1.3.4中的dm9000x.cu-boot-1.1.6中,覆蓋掉原來的dm9000x.c,然後編譯。

出現了錯誤!

drivers/dm9000x.c:480: undefined reference to `is_zero_ether_addr'

/drivers/dm9000x.c:480: undefined reference to `is_multicast_ether_addr'

make: *** [u-boot] Error 1

    很明顯,缺少兩個函數定義。網上搜索也沒有找到,乾脆對u-boot-1.3.4建立SourceInsight工程搜索這兩個函數。發現這兩個函數都存在於net.h中(路徑:include/net.h)。

    複製這兩個函數,到自己的u-boot(目前爲u-boot-1.1.6)的net.h中(路徑:include/net.h

/*

*
* is_zero_ether_addr - Determine if give Ethernet address is all zeros.

* @addr: Pointer to a six-byte array containing the Ethernet address

*

* Return true if the address is all zeroes.

*/

static inline int is_zero_ether_addr(const u8 *addr)

{
    return !(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]);

}




/*

*
* is_multicast_ether_addr - Determine if the Ethernet address is a multicast.

* @addr: Pointer to a six-byte array containing the Ethernet address

*

* Return true if the address is a multicast address.

* By definition the broadcast address is also a multicast address.

*/

static inline int is_multicast_ether_addr(const u8 *addr)

{
    return (0x01 & addr[0]);

}


    然後編譯,通過!

    燒寫到開發板,ping主機192.168.1.2

Jz2440 # ping 192.168.1.2

ERROR: resetting DM9000 -> not responding

dm9000 i/o: 0x20000000, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:00:3e:26:0a:5b

could not establish link

host 192.168.1.2 is alive

    “host 192.168.1.2 is alive”, ping通了,DM9000移植OK


七、網絡測試

1.測試tftp

     通過tftp傳輸一個程序到內存中運行試試看。在主機上打開tftp軟件,將leds.bin(運行地址在0x30000000)放在tftp軟件目錄中,在u-boot界面,輸入命令:

Jz2440 # tftp 0x30000000 leds.bin

ERROR: resetting DM9000 -> not responding

dm9000 i/o: 0x20000000, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:00:3e:26:0a:5b

could not establish link

TFTP from server 192.168.1.2; our IP address is 192.168.1.6

Filename 'leds.bin'.

Load address: 0x30000000

Loading: #

done

Bytes transferred = 168 (a8 hex)

    傳輸成功,在u-boot界面使用go命令運行程序

Jz2440 # go 0x30000000

## Starting application at 0x30000000 ...

    可以看到Jz2440開發板上led已經在循環閃爍了。


2.測試nfs

    由於虛擬機Linux上開啓了nfs服務,虛擬機Linux IP192.168.1.3,需要先更改serverIP

Jz2440 # setenv serverip 192.168.1.3

Jz2440 # saveenv

    然後將leds.bin放在nfs目錄,/work/nfs_root/,在u-boot界面使用nfs傳輸文件

Jz2440 # nfs 0x30000000 192.168.1.3:/work/nfs_root/leds.bin

ERROR: resetting DM9000 -> not responding

dm9000 i/o: 0x20000000, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:00:3e:26:0a:5b

could not establish link

File transfer via NFS from server 192.168.1.3; our IP address is 192.168.1.6

Filename '/work/nfs_root/leds.bin'.

Load address: 0x30000000

Loading: #

done

Bytes transferred = 168 (a8 hex)

    傳輸成功,在u-boot界面使用go命令運行程序

Jz2440 # go 0x30000000

## Starting application at 0x30000000 ...

    可以看到Jz2440開發板上led已經在循環閃爍了。

    至此,DM9000網卡移植成功!

以上轉自:http://blog.csdn.net/cxsys/article/details/7375662

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章