uboot1.1.6移植体验

来源:互联网 发布:淘宝先行赔付 编辑:程序博客网 时间:2024/06/05 06:19
一、配置相关的内容移植
1.修改配置信息:架构,处理器型号,开发板型号,生产商,片上系统型号
通过修改顶层Makefile:在smdk2410_config后添加本开发板的配置信息:
tq2440_config :unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t tq2440 NULL s3c24x0
接着修改arm-linux-gcc交叉编译工具的路径,我的gcc交叉编译链是4.3.3的,从天嵌的光盘上面复制的,估计天嵌官网上面也有资源
ifeq ($(ARCH),arm)
CROSS_COMPILE = /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux-
endif
到这里,顶层的Makefile的修改就算是完成了。
2.建立开发板相关的文件夹:将board目录下面的smdk2410文件夹改为tq2440,并且将该目录下面的其他的目录删除
进入tq2440将smdk2410.c改为tq2440.c,修改当前目录下面的Makefile:即把COBJS:= smdk2410.o flash.o boot_init.o改成COBJS:= tq2440.o flash.o boot_init.o
3.修改include下的头文件:把include/configs下的smdk2410.h改为tq2440.h
4.进行编译测试:make tq2440_config
打印出Configuring for tq2440 board... 说明配置信息修改成功

接着make,等待一段时间后编译成功的话就会编译出u-boot.bin

5.针对开发板的硬件配置,进行软件上的兼容
(1).增加SDRAM的配置:我的开发板的SDRAM是用两块32M的组成64M的
修改board/tq2440/lowlevel_init.S为:
#define B1_BWSCON  (DW16)
#define B2_BWSCON  (DW16)
#define B3_BWSCON  (DW16 + WAIT + UBLB)
#define B4_BWSCON  (DW16)
#define B5_BWSCON  (DW8)
#define B6_BWSCON  (DW32)
#define B7_BWSCON  (DW32)
#define REFCNT 0x4f4

(2).时钟设置:修改cpu/arm920t/start.S
屏蔽原来的时钟
#if 0
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif
然后将 stack_setup 子程序搬到 relocate 子程序之前,并在
stack_setup 子程序后加一条跳转指令调用clock_init 子函数,进行时钟初始化。clock_init函数可以自己在/board/tq2440下面新建一个boot_init.c来定义
不过这里我是参考天嵌的资源,直接调用已经打包好的库文件nand_read.module,只需要在连接脚本上添加以下内容即可。
u-boot.lds文件
.text      :
{
      cpu/arm920t/start.o(.text)
      modules/nand_read.module (.text)
 *(.text)
}

(3).配置Nor Flash:我的开发板使用的是2M的EN29LV160AB,原先的是1M的配置
打开/include/configs/tq2440.h,在FLASH and environment organization一栏,注释掉:
#if 0
#define CONFIG_AMD_LV400 1/* uncomment this if you have a LV400 flash */
#endif
用这个:
#define CONFIG_AMD_LV800
接着改:
#define PHYS_FLASH_SIZE 0x00200000 /*2M*/
#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x1F0000) /* addr of environment */
#define CFG_ENV_SIZE 0x20000/* Total Size of Environment Sector */
这些配置信息对应的函数在board/tq2440/flash.c中,它支持AM29LV400和AM29LV800,而AM29LV800和两片EN29LV160AB基本一样

(4).增加nand Flash的驱动:本开发板使用的是256M的。对应的函数定义可以在cpu/arm920t/s3c24x0/nand_flash.c下面,也可以使用天嵌现成的库文件nand_read.module

(5).增加网卡DM9000驱动:uboot自带DM9000驱动,只需做一些小的修改即可
在include/configs/tq2440.h中,将作如下修改:
找到/*Hardware drivers*/栏,将以下CS8900网卡配置内容删去
#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 */

#define CONFIG_NETMASK          255.255.255.0
#define CONFIG_IPADDR 10.0.0.110
#define CONFIG_SERVERIP 10.0.0.1

改成:
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_BASE 0x20000300
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE + 4)
#define CONFIG_DM9000_USE_16BIT

#define CONFIG_ETHADDR 0a:1b:2c:3d:4e:5f
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.6
#define CONFIG_SERVERIP 192.168.1.8

接着修改drivers目录下面的Makefile:
COBJS = dm9000x.o
未完待续。。。。。。


二、添加uboot命令:

首先了解下uboot命令执行的过程:
在U-Boot中输入“xxx”命令执行时,U-Boot接收输入的字符串“xxx”,传递给run_command函数。
run_command函数调用common/command.c中实现的find_cmd函数在__u_boot_cmd_start与__u_boot_cmd_end间查找命令,
并返回menu命令的cmd_tbl_t结构。然后run_command函数使用返回的cmd_tbl_t结构中的函数指针调用xxx命令的响应函数do_xxx,
从而完成了命令的执行。


1.在common目录下面添加命令操作的c文件,并以cmd_xxx.c来命名,c文件里面的内容格式是:
#include <common.h>
#include <command.h>
.......需要用到的头文件
int do_xxx( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
     //这里面定义命令执行的内容 
return 0;
}

U_BOOT_CMD(
xxx, CFG_MAXARGS,   1,     do_xxx,
".........",  //usage短帮助信息
".....................\n" //help长帮助信息
);

修改common目录下面的Makefile:在COBJS后面添加一个cmd_xxx.o 

如果在cmd_xxx.c中有条件编译选项#if (CONFIG_COMMANDS & CFG_CMD_XXX),那么就要接着下面的修改:(这个条件编译的意思就是,CFG_CMD_XXX存在定义就编译下面的内容)
2.修改include/cmd_confdefs.h:添加xxx命令的标志位,在/*Configurable monitor commands*/一栏中
#define CFG_CMD_XXX       0x????????ULL
3.修改include/configs/tq2440.h:
把上面定义的宏标识添加到这个宏里面#define CONFIG_COMMANDS

以上一和二两大点的内容都搞定后执行下面命令,make distclean,make clean,make tq2440_config,make,等待生成u-boot.bin文件就可以了。之后,我使用jlink下载到Nor Flash测试。

0 0