您的位置:首页 > 其它

u-boot-2010.03在tq6410上的移植详解(一)

2010-06-25 13:57 405 查看
原创文章版权所有!如需转载,请注明出处: http://hi.baidu.com/liushuiyue1/myhome谢谢合作!!!!!
由于Uboot2010.03对S3C6410有了很好的支持,所以采用Uboot2010.03版本。
一、             移植环境
主  机:VMWare--Fedora 8
开发板:天嵌TQ6410—256M nandflash,Kernel:2.6.30.4
编译器:EABI-4.3.3_V0.1
u-boot:u-boot-2010.08
二、       源码获得
              Uboot源码到ftp://ftp.denx.de/pub/u-boot/下载
三、     本次移植的功能实现
·  支持Nand Flash读写
·  支持从Nand Flash/SD启动
·  支持CS8900或者DM9000网卡 
·  支持Yaffs文件系统 
·  支持USB下载
四、     移植步骤
              1.建立自己的开发板项目并测试编译
目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM处理器的支持,有smdk2400、smdk2410和smdk6400,但没有6410,所以我们就在这里建立自己的开发板项目。
1)因6410和6400的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫my2440
#tar -jxvf u-boot-2010.03.tar.bz2    //解压源码
#cd u-boot-2010.03/board/samsung/    //进入目录
#mkdir smdk6410                        //创建smkd6410文件夹
2)因6410和6400的资源差不多,所以就以6400项目的代码作为模板,以后再修改
#cp -rf smdk6400/* smdk6410/   //将6400下所有的代码复制到6410下
#cd smdk6410                   //进入smdk6410目录
#mv smdk6400.c my6410.c      //将smdk6410下的smdk6400.c改名为smdk6410.c
#cd ../../../                //回到u-boot根目录
#cp include/configs/smdk6400.h include/configs/smdk6410.h //建立6410配置头文件
 
3)修改u-boot跟目录下的Makefile文件。查找到smdk6400_config的地方,在他下面按照smdk6400_config的格式建立smdk6410_config的编译选项,另外还要指定交叉编译器
#gedit Makefile
 
CROSS_COMPILE ?= arm-linux-        //指定交叉编译器为arm-linux-gcc
smdk6410_noUSB_config /
smdk6410_config      :      unconfig
      @mkdir -p $(obj)include $(obj)board/samsung/smdk6410
      @mkdir -p $(obj)nand_spl/board/samsung/smdk6410
      @echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
      @if [ -z "$(findstring smdk6410_noUSB_config,$@)" ]; then                   /
             echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/smdk6410/config.tmp;/
             $(MKCONFIG) $(@:_config=) arm arm1176 smdk6410 samsung s3c64xx;            /
      else                                                                /
             echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/smdk6410/config.tmp;/
             $(MKCONFIG) $(@:_noUSB_config=) arm arm1176 smdk6410 samsung s3c64xx;       /
      fi
      @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
*说明:arm    :CPU的架构(ARCH)
       arm1176:CPU的类型
       smdk6410 :对应在board目录下建立新的开发板项目的目录
       samsung:新开发板项目目录的上级目录,如直接在board下建立新的开发板项目的目录,则这里就为NULL
       s3c64xx:CPU型号
*注意:编译选项格式的第二行要用Tab键开始,否则编译会出错
4)进入顶层目录nand_spl/board/samsung目录新建目录smdk6410,并将smdk6400下的文件复制到刚刚新建的smdk6410下
#cd  nand_spl/board/samsung //
#cp –ar smdk6400/* smdk6410/
 
5)测试编译新建的smdk6410开发板项目
#make smdk6410_config //如果出现Configuring for smdk6410 board...则表示设置正确
#make //编译后在根目录下会出现u-boot.bin和u-boot-nand.bin文件,则u-boot移植的第一步就算完成了
由于此版本的u-boot对于串口和时钟在开始配置文件中就已经初始化,对于ARM1176有很好的支持,利用从SD卡启动的uboot将u-boot-nand.bin下载到nand flash中,同时将开发板上SW2设置到从Nand flash启动位置。利用SecureCRT.exe软件观察串口打印信息如下:
 
可以看到移植在tq6410上移植uboot已经成功。可是Nor flash是2M可是信息上显示为0,是因为没有添加Nor flash的驱动引起的,而且开发板上自带的是DM9000AE的100M网卡,而uboot默认支持CS8900所以开始添加uboot的相关功能。
移植是采用SD烧写nand flash的uboot,为了方便烧写和调试首先移植网卡实现tftp下载。
五、             DM9000在Uboot2010.03上的移植
1)首先进入include/configs/修改smdk6410.h文件,屏蔽CS8900的相关宏定义同时添加DM9000AE的相关宏
#cd include/configs///
#gedit smdk6410.h //
smdk6410.h修改内容如下:
#define CONFIG_NET_MULTI           1
//#define CONFIG_CS8900                  /* we have a CS8900 on-board */
//#define CONFIG_CS8900_BASE           0x18800300
//#define CONFIG_CS8900_BUS16           /* follow the Linux driver    */
 
 
#define CONFIG_DRIVER_DM9000          1/* we have a DM9000AE on-board      */
#define CONFIG_DM9000_BASE              0x18000300
#define DM9000_IO               CONFIG_DM9000_BASE
#define DM9000_DATA                (CONFIG_DM9000_BASE + 4)
#define CONFIG_DM9000_USE_16BIT
 
#define CONFIG_ETHADDR        10:23:45:67:89:ab
#define CONFIG_NETMASK              255.255.255.0
#define CONFIG_IPADDR            192.168.174.2 //开发板上的ip地址
#define CONFIG_SERVERIP        192.168.174.1//虚拟机上的ip地址
#define CONFIG_GATEWAYIP   192.168.174.6
#define CONFIG_DM9000_DEBUG//一定要加上否则会出现没有设置ipaddr的现象
2)修改net/eth.c,添加DM9000AE的初始化函数(红色部分为修改的地方):
int eth_initialize(bd_t *bis)
{
      unsigned char env_enetaddr[6];
      int eth_number = 0;
 
      eth_devices = NULL;
      eth_current = NULL;
 
      show_boot_progress (64);
#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
      miiphy_init();
#endif
      /* Try board-specific initialization first.  If it fails or isn't
       * present, try the cpu-specific initialization */
      if (board_eth_init(bis) < 0)
             cpu_eth_init(bis);
 
#if defined(CONFIG_DB64360) || defined(CONFIG_CPCI750)
      mv6436x_eth_initialize(bis);
#endif
#if defined(CONFIG_DB64460) || defined(CONFIG_P3Mx)
      mv6446x_eth_initialize(bis);
#endif
#if defined(CONFIG_DRIVER_DM9000)
      dm9000_initialize(bis);
#endif
      if (!eth_devices) {
             puts ("No ethernet found./n");
             show_boot_progress (-64);
      } else {
             struct eth_device *dev = eth_devices;
             char *ethprime = getenv ("ethprime");
 
             show_boot_progress (65);
             do {
                    if (eth_number)
                           puts (", ");
 
                    printf("%s", dev->name);
 
                    if (ethprime && strcmp (dev->name, ethprime) == 0) {
                           eth_current = dev;
                           puts (" [PRIME]");
                    }
 
                    eth_getenv_enetaddr_by_index(eth_number, env_enetaddr);
 
                    if (memcmp(env_enetaddr, "/0/0/0/0/0/0", 6)) {
                           if (memcmp(dev->enetaddr, "/0/0/0/0/0/0", 6) &&
                               memcmp(dev->enetaddr, env_enetaddr, 6))
                           {
                                  printf ("/nWarning: %s MAC addresses don't match:/n",
                                         dev->name);
                                  printf ("Address in SROM is         %pM/n",
                                         dev->enetaddr);
                                  printf ("Address in environment is  %pM/n",
                                         env_enetaddr);
                           }
 
                           memcpy(dev->enetaddr, env_enetaddr, 6);
                    }
 
                    eth_number++;
                    dev = dev->next;
             } while(dev != eth_devices);
重新编译uboot,并下载uboot到nand flash中,重新启动开发板,观察打印信息如下,可以发现uboot已经能识别DM9000芯片:
 
使用ping指令进行测试如下:
 
 
至此,uboot已经能支持dm9000的网卡,可以使用tftp协议下载程序并在ram中运行了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息