u-boot-2012.04.01流程以及移植说明
参考:u-boot2012.04.01移植到mini2440
u-boot-2012.04.01
流程以及
移植说明:
从新制作一个单板:
复制u-boot-2012.04.01/board/samsung目录下的:smdk2410文件夹为smdk2440
复制u-boot-2012.04.01/include/configs目录下的:smdk2410.h文件为smdk2440.h
在u-boot-2012.04.01/boards.cfg文件下复制65行,修改boards.cfg:
仿照
smdk2410
arm
arm920t
-
samsung
s3c24x0
添加:
smdk2440
arm
arm920t
-
samsung
s3c24x0
然后重新配置一下:make smdk2440_config
然后重新编译一下:make
1、设置管理模式:
2、关看门狗:
# if defined(CONFIG_S3C2400)
#
define pWTCON
0x15300000
#
define INTMSK
0x14400008
// Interrupt-Controller base addresses //
#
define CLKDIVN
0x14800014
// clock divisor register //
#else
#
define pWTCON
0x53000000
#
define INTMSK
0x4A000008
// Interrupt-Controller base addresses //
#
define INTSUBMSK
0x4A00001C
#
define CLKDIVN
0x4C000014
// clock divisor register //
# endif
3、屏蔽中断:
# if defined(CONFIG_S3C2410)
# endif
4、设置时钟:
#define S3C2440_MPLL_200MHZ
((0x5c<<12)|(0x01<<4)|(0x02))
#define S3C2440_MPLL_400MHZ
((0x5c<<12)|(0x01<<4)|(0x01))
5、设置SDRAM:
修改lowlevel_init中为:
6、初始化nand flash、重定位、清楚BSS段:
注意:详细代码参考下面修改处。
7、u-boot启动第二阶段:给内核传递参数
call_board_init_f:
u-boot启动时SP指向SDRAM的刚开始低地址位置,在代码重定位以后要从新设置栈指针SP,更改栈指针SP:
修改后:
// Set stackpointer in internal RAM to call board_init_f //
call_board_init_f:
注意:上面三段代码为另外手动添加,因为u-boot源码中的:
这段代码就是为了实现调用board_init_r的功能,故省略这一步直接跳过去运行。
8、跳到SDRAM中运行call_board_init_f
9、乱码,查看
串口波特率的设置,发现在get_HCLK里没有定义CONFIG_S3C2440
①更改get_HCLK里没有定义CONFIG_S3C2440
board_init_f
在smdk2440.h
#ifdef CONFIG_CMD_NAND
#define CONFIG_NAND_S3C2410
解决办法:暂时去掉如下行
//#define CONFIG_CMD_NAND
再次编译,出现错误:
fs/yaffs2/libyaffs2.o: In function `yaffs_StartUp:
/home/share/jz2440/source/u-boot/u-boot-2012.04.01/fs/yaffs2/yaffscfg.c:210: undefined reference to `nand_info
解决方法:将#define CONFIG_YAFFS2注释掉
10、去除编译条件pie,在(u-boot-2012.04.01/u-boot-2012.04.01/arch/arm/config.mk)
11、修改代码支持Nor Flash
# ifdef CONFIG_SYS_FLASH_CHECKSUM
# else
// !CONFIG_SYS_FLASH_CHECKSUM //
# endif
// CONFIG_SYS_FLASH_CHECKSUM //
#endif
上面代码在nand flash启动时nor flash是没有办法访问的,flash_init之后没有找到nor flash,故打印失败,程序卡死在hang();
修改:当程序找不到nor flash的时候继续运行:
分析:flash_init函数,可以打开下面函数中的调试开关:
#define DEBUG 1
#define debug 1
调试开关打开以后可以根据打印信息搜索:可知在数组jedec_table中缺少nor flash对应的数组,对应添加一项:
static const struct amd_flash_info jedec_table[] = {
编译后测试,发现提示flash扇区太多,可以搜索后修改CONFIG_SYS_MAX_FLASH_SECT为:128
12、修改代码支持Nand Flash
u-boot已经可以Nand启动,但是并不表示u-boot启动以后可以对Nand Flash进行读写操作。
修改:
//#define CONFIG_S3C2410
// specifically a SAMSUNG S3C2410 SoC //
#define CONFIG_S3C2440
// specifically a SAMSUNG S3C2410 SoC //
#ifdef CONFIG_CMD_NAND
#ifdef CONFIG_S3C2410
#define CONFIG_NAND_S3C2410
#define CONFIG_SYS_S3C2410_NAND_HWECC
#else
#define CONFIG_NAND_S3C2440
#define CONFIG_SYS_S3C2440_NAND_HWECC
#endif
#define CONFIG_SYS_MAX_NAND_DEVICE
1
#define CONFIG_SYS_NAND_BASE
0x4E000000
#endif
分析源码:
bl board_init_r
修改:
a、删除:
b、board_nand_init:
struct s3c2440_nand *nand_reg = s3c2440_get_base_nand();
#if 0
#endif
c、s3c2440_hwcontrol:
d、增加函数s3c2440_nand_select:
e、s3c2440_dev_ready:
f、修改所有的s3c2410_nand为s3c2440_nand;
注意USB烧写方法:
1、因为没有裁剪的u-boot达到500K,但是我们自带的u-boot烧写分区没有这么大,所以不能使用u-boot来烧写u-boot,只能使用u-boot里的指令来烧写:
2、新烧写到nor flash的u-boot不支持USB烧写,可以使用以下命令,用WINS自带的超级终端下载烧写,ymodem模式:
3、修改好网卡后可以用tftp下载内核:
4、用tftp下载u-boot到nor flash,同样可以用tftp下载u-boot到nand flash:
5、烧写内核:
内核打印出来的分区信息
6、烧写200K的u-boot
注意:nor flash启动的u-boot既可以烧写nor flash本身也可以烧写nand flash,但是如果是nand flash启动的话就没办法操作nor flash,因为nand flash启动的时候0地址对应片内内存,无法访问nor flash;
13、修改代码支持DM9000网卡:
DM9000源码在drivers/net目录下面,查看其Makefile文件,可以知道只有配置CONFIG_DRIVER_DM9000才能支持DM9000
在配置文件:/include/configs/smdk2440.h文件内找到CONFIG_CS8900,去掉,添加CONFIG_DRIVER_DM9000
在编译,根据错误找找原因,发现没有定义DM9000_DATA,查找DM9000_DATA参考别的源码定义:
#define CONFIG_DRIVER_DM9000
#define CONFIG_DM9000_BASE
0x20000000
#define DM9000_IO
CONFIG_DM9000_BASE
#define DM9000_DATA
CONFIG_DM9000_BASE + 4
设置内存控制器位宽等发送数据时序参数:
编译烧写:根据提示找到board.c里面的初始化函数调用的依然是CS8900初始化函数:
eth_initialize(gd->bd);
故增加:
#ifdef CONFIG_DRIVER_DM9000
#endif
在编译烧写测试,设置ipaddr,ethaddr参数,设置完成以后ping,但此时设置参数不要保存,因为参数的保存地址没有设置,测试可以用TFTP工具来下载内核
14、易用性修改/裁剪系统:
搜索u-boot启动信息中的CRC报警:“using default environment”即可找到在common/Env_common.c中有默认环境变量数组:default_environment[],其中bootargs=CONFIG_BOOTARGS、bootcmd=CONFIG_BOOTCOMMAND为传给内核的启动参数,要手动在在配置文件:/include/configs/smdk2440.h文件中定义一下:
#define CONFIG_BOOTARGS "console=ttySAC0 root=/dev/mtdblock3"
//表示文件系统在3分区
#define CONFIG_BOOTCOMMAND "nand read 30000000 kernel;bootm 30000000" //规划好分区,知道内核存在nand flash哪里之后才可以设置,u-boot根据这条命令启动内核
bootdelay:倒数计时时间长度。
ethaddr:可以在这设置
ipaddr:可以在这设置
#define CONFIG_ETHADDR 00:0c:29:4d:e4:f4
裁剪:
修改配置文件:/include/configs/smdk2440.h
从头看那些是不需要的。
屏蔽:CONFIG_USB_OHCI-----CONFIG_DOS_PARTITION
CONFIG_CMD_DATE
CONFIG_CMD_DHCP
CONFIG_RTC...
BOOTP
CONFIG_CMD_USB
file system都不要
编译u-boot文件变成200k,从新划分区,可以参照来的u-boot的分区,老的分区可以启动内核查看内核启动信息或则:
mtd
//u-boot中使用mtd命令可以查看u-boot分区
想知道需要定义哪些宏可以搜索"saveenv",知道在/common/Env_nand.c中可以查看其Makefile就知道要定义哪个宏了。
#if 0
//nor flash环境变量设置
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000)
#define CONFIG_ENV_IS_IN_FLASH
#define CONFIG_ENV_SIZE 0x10000
#define CONFIG_ENV_OVERWRITE
#else
//nand flash环境变量设置
#define CONFIG_ENV_IS_IN_NAND
#define CONFIG_ENV_OFFSET
0x00040000
#define CONFIG_ENV_SIZE
0x20000
#define CONFIG_ENV_RANGE
CONFIG_ENV_SIZE
#endif
增加mtd命令:
搜索“mtdparts”,参考示例定义下面的宏分区
cmd_mtdparts.c里,可以根据common的Makefile判断需要定义哪个宏开关,同时要手工添加执行mtdparts_init,如下:
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#define MTDIDS_DEFAULT
"nand0=jz2440-0"
// 那一个设备 //
#define MTDPARTS_DEFAULT
"mtdparts=jz2440-0:256k(u-boot),"
在board.c里面:
main_loop前面初始化:run_command("mtdparts default", 0);
//要执行:mtdparts default
15、烧写JFFS2:
16、烧写YAFFS:
烧写后发现出错(nand write.yaffs 30000000 260000 889bc0):
NAND write: device 0 offset 0x260000, size 0x889bc0
Unknown nand command suffix .yaffs.
由于nand命令对应cmd_nand.c文件,可知出错语句处宏CONFIG_CMD_NAND_YAFFS没有定义
修改配置文件:/include/configs/smdk2440.h增加:
再烧写u-boot.bin来启动内核发现启动不起来,提示:
VFS: Mounted root (yaffs2 filesystem).
Freeing init memory: 140K
Warning: unable to open an initial console.
Kernel panic - not syncing: No init found.
Try passing init= option to kernel.
挂载成功但是缺少文件,可以用:
指令查看烧写数据,和fs_mini_mdev.yaffs2里的二进制文件作比较,看看源文件和烧写地址数据是否一致。
修改:drivers/mtd/nand/Nand_util.c
nand_write_skip_bad函数:
a、
b、
c、
d、烧写:
更新nor flash里的UBOOT:
烧写YAFFS:
17、制作补丁:
怎么用这个补丁:
最重要的一点:
评论