2007.8.13
u-boot1.1.6 初步调试成功。
1. 在网上找了几个 u-boot 的移植文档,之前一直没有成功,后来,设置好 u-boot 的程序运行地址后, make clean && make at91rm9200dk_config && make ,生成 u-boot.bin 文件。
2. 在调试好 arm9200 的仿真器后,选择 File->Load memory from file ,选择 u-boot.bin 文件。
3. 文件 Load 成功以后,将 PC 指针设置为 u-boot 程序的运行地址。
4. 执行程序,即可在串口终端看到 u-boot 的提示符。
2007.8.14
1. 发现在文件 Start.S 中调用了 LowLevelInit 函数,初始化 SDRAM , 终端, DEBUG 串口, NAND 等,根据需要添加。在 u-boot 中没有进行 LowLevelInit ,所以会出现初始化不正确的时候会有问题。
2. 经常会出现 IIC 不 能写的状况,原因不明。
3.AXD 调试的时候,经常要重启才可以。有时候要进行断电。
4.u-boot 的程序启动地址在 board/at91rm9200dk/config.mk 中修改 TEXT_BASE 的值
2007.8.15
1. 研究 PMC 时钟是怎么回事,给个时钟是 如何产生的,看数据手册的方框图。
设置 master clock 的寄存 器,选择使用 slow clock ,main clock,plla,pllb 中的一个作为 时钟输入,通过 master clock controller 后生成 master clock 和 process clock. 选择 的 plla 和 pllb 可以通过设置相应的寄存器 来倍频 main clock.
2007-8-20
1.u-boot-1.1.6 成功从 nand flash 上启动。但 是还有很多问题没有搞清楚。 board/at91rm9200dk/config.mk ,这个 TEXT_BASE 的值所起的作 用,没有搞清楚。 U-boot.bin
文件从 flash 中读取到 sdram 中的内存的位置不是这个地址,也还是可以启动的。所以,之前的 bios9200 的代码完全不用作任何的改变,就可以将 u-boot 烧写到 nand flash 上,并且读入内存,启动 u-boot 。之前虽然也进行过直接烧写的工作,但是可能是 u-boot 中的代码,初始化的串口有问题,造成没有什么输出,显示的。现在代码中写死了。
2. 阅读了一下 bios9200 的代码,关键的部分在于,不同的板子,要进行不同的 LowLevelInit 工作 的,所以之前的 at91rm9200_for_Uboot ,不能够使用,也是因为 LowLevelInit 初始化的可能有些问题,在 u-boot 启动的时候,按照网上的修改方法,并没有进行 LowLevelInit ,所以出 现问题。
3.u-boot 的移植配置,参看以下文章
开发板 H9200M 简介 FLSH: 4M (2M ×16) -> 固化Linux 内 核 0x1000_0000-0x103_FFFF [编辑 ] 主要地址资源分配 [ 编辑 ] 使用厂商提供的低级初始化模块的资源分配
[ 编辑 ] 完全使用 U - boot 来做 bootloader 的资源分配
[ 编辑 ] 移植 u-boot 到目标板 [ 编辑 ] U-Boot 主要目录结构 board 目标板相关文件,比如Makefile 和u-boot.lds 等都和具体的开发板的硬件和地址分配有关; [ 编辑 ] u-boot1.1.6 + boot.bin 移植方法 1 、增加目标平台到 ./board/ 下(此步骤可选,主要为了不影响源码) 因为我们当前 平台 h9200m 用的是 at91rm9200 CPU ,因此我们找最 接近的已有平台来简化移植过程,进入 board 目录下,以原有 at91rm9200dk 为 模板,拷贝 at91rm9200dk 为我们 的 h9200m 目录,进入目录 h9200m ,将 at91rm9200dk.c 更名为 h9200m.c ,再编辑当前目录下的 Makefile ,编辑 并搜索 at91rm9200 ,在 28 行会找到 at91rm9200dk.o ,将其改为 h9200m.o ;目录中 config.mk 是用来记录 U-boot 复制到 内存的基址, flash.c 用来配置 Flash , u-boot.lds 是内核链接器的脚本文 件。 命令: cd u-boot-1.1.6/board 2 、进入 ./include/configs 下 以 at91rm9200dk.h 为模板,生成 h9200m.h ;在这里的文件都是和硬件系统配置息息相关,它需记录新平台的所有配置参数。 命 令: cd u-boot-1.1.6/include/configs 3 、修改 Makefile 以及 编辑源码根目 录下的 Makefile ,搜索 at91rm9200 , 1.1.6 版本在 1766 行,在 1768 行插入配置代码,编辑源码目录下 的 MAKEALL ,搜索 at91rm9200 , 1.1.6 版本在 190 行,在 at91rm9200dk 后加入 h9200m 即可。 vi u-boot-1.1.6/Makefile 4 、根据具体的硬件配 置,修改参数 因为在 at91rm9200 引导时,厂商提供了前期初始化的 boot.bin ,它 主要作了部分的硬件初始化,替代 U-boot 的 stage1 部分,所以在 U-boot 中就应该去掉这部分功能,不然会导致重复配置,使 U-boot 在初始配置时当掉,因此我们要修改 . /include/configs/h9200m.h ,添加 #define CONFIG_SKIP_LOWLEVEL_INIT 1 (我们默认添在第 40 行),使 U-boot 跳过低级初始化过程;我们使用的开发板的 nor flash 是 4M 的,因此我们搜索 PHYS_FLASH_SIZE ,复制这行,并将上面的原始一行注释掉,将下面的 0x200000 改为 0x400000 ,在 163 行。 命令: vi u-boot-1.1.6/include/configs/h9200m.h 5 、下面我们要进行针 对板子的具体化设置 编辑 ./board/h9200m/h9200m.c ,跳转到第 50 行, 将gd->bd->bi_arch_number = MACH_TYPE_AT91RM9200; 再编辑 ./include/asm-arm/mach-types.h ,跳转到第 740 行,添加硬件设备 的 ID 号,我们在这里使用 1888 作为 h9200m 的设备号 #define MACH_TYPE_H9200M 1888 这样我们的开发板就有自己的设备号了,不过 kernel 是不成认的,如果你想让全世界人 都承认,你还要到 www.kernel.com 去申请你的设备,这样一来所有内核源码中都会有这一段代码了;上面的做法仅用来测试使用。 ( 至此一个可以启动的 U - boot 就已经完成了 ) [ 编辑 ] 从裸板开始,假设 flash 中没有内容,从新载入 uboot a.PC 宿主机设置 在 windows 下,打开超级终端,设置串口为 115200 8N1 无 流控 b.JP100 设置为 2 - 3 短接,从片内 rom 启动,启动片内 ROM 中的程序。上电, 复位,超级终端下出现 ”CCCCCCC” c. 用 Xmodem 协议发送 loader.bin ,发完继续出现 ”CCCCCC” d. 再用 Xmodem 协议发送 u-boot.bin ,发完显示 >U-Boot> 提示符 e. 擦除 FLASH: >protect off all 上述两步擦除 FLASH 中所有内容,若只擦除 uboot 所占部分,则 >protect off 10000000 1001FFFF 或 ( 待证实 ) >protect off 1:0-1 f. 装入 boot.bin >loadb 20000000 ( 能过串口线(Kermit mode) 来装 载二进制文件) 在超级终端下,用 kermit 模式发送 boot.bin >cp.b 20000000 10000000 5ffff g. 装入 u-boot.gz >loadb 20000000 用 kermit 模式发送 u-boot.gz >cp.b 20000000 10010000 ffff h.JP100 设置为 1 - 2 短接,从 flash 启动,启动 Flash 中固化的程序。 [ 编辑 ] 环境变量设置 a. 网络参数设置 >setenv ethaddr 12:34:56:78:99:aa ;MAC 地址 b. 系统自动运行 注意:这里设置为络服务器启动模式,用网线从主机上下载内核和文件系统到 SDRAM 中,每次掉 电后都要重新开始。 >setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000 ramdisk_size=15360 initrd 指定根文 件系统的位置 >setenv bootcmd tftp 21000000 uimage/; tftp 21100000 ramdisk.gz/; bootm 21000000 设定自动启动 脚本,先用 tftp 下载内核镜象到 21000000 ,然 后下载文件系统到 21100000 ,再从内核镜象地址 21000000 启动 注意:必须确保主机上启动了 tftp 服务,在根目录上有 tftpboot 目录。可用 rpm –q tftp 查看是否安装了 tftp ,若没有的话,则需要安装。在服务配置里选定 tftp 服务,开始。设置开机时自动启动 tftp 服务。执行 ntsysv 命 令,然后选择需要开机自动启动的服务, nfs,tftp 等,以空格选择。 在 linux 下的终端执行 minicom ,则启动 串口终端,可以用 minicom –s 设置。
|
2007-8-21 NAND 移植成功
主要参看了网上的几篇文章, http://bbs2.chinaunix.net/viewthread.php?tid=855860
http://www.lupaworld.com/23340/viewspace_4343.html
重点内容如下部分:
对于 uboot 的移植请参考我之前写的 《 U-Boot 的编译与移植到 QT-S3C44B0X 开发板上》 http://bbs.chinaunix.net/viewthr ... p;highlight=pywj777
非常感谢 dozec 的《基于 S3C2410 的 Linux 全线移植文档》 http://bbs.chinaunix.net/viewthr ... 的 Linux 全线移植文档 我的 nand flash 移植大部分是 参考这个文档移植成功的。
下面对 nand flash 的初始化代码 nand_init() 进行分析:
1. 如果定义 (CONFIG_COMMANDS & CFG_CMD_NAND) 没定义 (CFG_NAND_LEGACY) 则 start_armboot() 调用 driver/nand/nand.c 中的 nand_init() ,否则如果定义 (CONFIG_COMMANDS & CFG_CMD_NAND) 并且有定义了 CFG_NAND_LEGACY ,则调用自己定义的 nand_init() 。在我当前的情景中是使用 driver/nand/nand.c 中的 nand_init() 。
2.nand_init() 调用本文件中的 nand_init_chip() 对 nand 进行初始化。
3.nand_init_chip() 首先调用 board_nand_init() 。
4.board_nand_init() 是需要自己添加的函数,这个函数的主要功能是对 struct nand_chip 结构体的函数指针赋值,让它们指向自己为 nand 驱 动编写的一些函数,对未赋值的指针, uboot 会在后面为其赋上通用 nand 驱 动函数指针。
5.nand_init_chip() 接着调用 nand_scan().
6.nand_scan() 定义在 drivers/nand/nand_base.c 文件中。它首先对 struct nand_chip 结构体中在 board_nand_init() 函数中未赋值的指针赋上通用 nand 驱 动函数指针。
7. 通 用 nand 驱动函数 nand_select_chip() 赋值给 struct nand_chip 结 构体的函数指针用于打开或关闭 nand 芯片, 0 为打开, 1 为关闭。在这个函数中会调用 nand_chip 结构体中的 hwcontrol 函数指针,这个指针指向的函数是需要自己编写的。这个函数指针在 board_nand_init() 函数中被赋值。主要作用是向 nand flash 发送一些 nand flash 开启与关闭命令。
8.nand_scan() 剩余部分初始化 nand_chip 和 mtd_info 结构体。
9.nand_scan() 最后在返回时调用 drivers/nand/nand_bbt.c 文件中的 nand_default_bbt() 。
10.nand_default_bby() 选择一个坏块描述表,返回时调用本文件中的 nand_scan_bbt() 。
11.nand_scan_bbt() 寻找建立一个坏块描述表。
12. 最后返回到 nand_init() ,这样 nand 驱动的初始化完成了。
下面对命令 nand read addr ofs size 的执行流程进行分析:
1.nand read addr ofs size 命令的作 用是从 nand flash 地址的偏移量 ofs 处 读取长度为 size 字节的数据存储到内存地址 addr 处。
2.common/main.c 文件中的 main_loop() 主要执行 read_line() 读取命令 行。
3.read_line() 读取到命令行后会调用 common/main.c 文件中的 run_command() 。
4.run_command() 调用 common/command.c 文件中的 find_cmd() 在 .u_boot_cmd 段中寻找该命令的 cmd_tbl_t 结构,找到后返回该结构。该命令的结构是通过定义在 include/command.h 中的宏定义 U_BOOT_CMD 登记进 .u_boot_cmd 段中的。
5.run_command() 找到该命令的 cmd_tbl_t 结构后则执行该命令对应的函数。对于本情景是 nand 命令对应的函数 do_nand() 。
6.do_nand() 有两个版本,一个是定义了 CFG_NAND_LEGACY 。另一个是未定义 CFG_NAND_LEGACY 。这两个版本都定义在 common/cmd_nand.c 文件中。对于本情景使用未定义 CFG_NAND_LEGACY 的 do_nand() 函数。要使用 do_nand() 还必须定义宏 CONFIG_COMMANDS&CFG_CMD_NAND 。(若未定义 CFG_NAND_LEGACY 则在这个情景中的 do_nand() 函数调用的函数都定义在 drivers/nand_legacy/nand_legacy.c 文件中)。
7. 对于我们的情景 do_nand() 会调用定义在 include/nand.h 文件中的 nand_read() 。
8.nand_read() 则调用本 nand 芯 片对应的 nand_info_t 结构的 read 指针。而 read 指针在 nand_scan() 中被指向了 同文件 (drivers/nand/nand_base.c) 中的 nand_read() 函数。
9.nand_read() 函数最终会调用 nand_chip 结构中的 cmdfunc 指针,通过这个指 针指向的函数向 nand flash 芯片发送命令。最终完成整个命令的执行。
为了让 uboot 支持自己 QT 板子的 nand flash 而进行修改的部分
1. 前面的移植请参考我写的一篇《 U-Boot 的编译与移植到 QT-S3C44B0X 开发板上》,现在在 board/51EDA/QT/ 目录下建立 nand.c 文件。
2. 在 nand.c 中添加自己的 board_nand_init() 函数。设定 nand_chip 结构中的 hwcontrol 和 dev_ready 指针指向自己的 函数 QT_hwcontrol 和 QT_device_ready 。 并建立自己的 QT_hwcontrol 和 QT_device_ready 函 数。
3. 由 于自己板子的 nand flash 的命令发送方式与 uboot 提 供的通用 nand flash 命令发送方式不同,所以在 nand.c 文件中建立自己的命令发送函数 QT_nand_command() ,并在 board_nand_init() 函数中将 nand_chip 结构中的 cmdfunc 指针指向 QT_nand_command() 函数,使其使用自己定义的发送命令函数。
4. 在 include/configs/QT.h 中定义 CFG_NAND_BASE 用于指 定自己板子 nand flash 的 I/O 地址。
5. 在 CONFIG_COMMANDS 中打开 CFG_CMD_NAND 选项。
6. 在 include/configs/QT.h 中定义 NAND_MAX_CHIPS 指定 自己板子的 nand flash 芯片数。
7. 在 include/configs/QT.h 中定义 CFG_MAX_NAND_DEVICE 指定想要支持的 nand flash 设备数。
dozec 的《基于 S3C2410 的 Linux 全线移植文档》在 U-BOOT 对 Nand Flash 的支持中的移植方法是在定义了 CFG_NAND_LEGACY 情况下移植的。而我的是在未定义 CFG_NAND_LEGACY 的情况下移植的。
基于以上的分析,仔细阅读 u-boot 的代码主要修改 board/at91rm9200dk/at91rm9200dk.c
/*
* Disk On Chip (NAND) Millenium initialization.
* The NAND lives in the CS2* space
*/
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
extern ulong nand_probe (ulong physadr);
#define AT91_SMARTMEDIA_BASE 0x40000000 /* physical address to access memory on NCS3 */
void nand_init (void)
{
/* Setup Smart Media, fitst enable the address range of CS3 */
*AT91C_EBI_CSA |= AT91C_EBI_CS3A_SMC_SmartMedia;
//CFGR
#define AT91C_EBI_DBPUC ((unsigned int) 0x1 <<0)
#define AT91C_EBI_EBSEN ((unsigned int) 0x1 <<1)
AT91C_BASE_EBI->EBI_CFGR =(AT91C_EBI_DBPUC & 0x00 ) | (AT91C_EBI_EBSEN & 0x00);
// 根据不同的 flash 对寄存器进行相应的设置
/* AT91C_BASE_SMC2->SMC2_CSR[3] = (SM_RWH | SM_RWS |
AT91C_SMC2_ACSS_STANDARD | AT91C_SMC2_DBW_8 |
SM_TDF | AT91C_SMC2_WSEN | SM_NWS);*/
AT91C_BASE_SMC2->SMC2_CSR[3] = (AT91C_SMC2_NWS & 0x04) |
AT91C_SMC2_WSEN |
(AT91C_SMC2_TDF & 0X200) |
(AT91C_SMC2_BAT) |
AT91C_SMC2_DBW_8;
/* enable the SMOE line PC0=SMCE, A21=CLE, A22=ALE */
*AT91C_PIOC_ASR = AT91C_PC0_BFCK | AT91C_PC1_BFRDY_SMOE |
AT91C_PC3_BFBAA_SMWE;
*AT91C_PIOC_PDR = AT91C_PC0_BFCK | AT91C_PC1_BFRDY_SMOE |
AT91C_PC3_BFBAA_SMWE;
//flash CE 接 PC15 RE 接 PC14 ,所以进行以下配置,根据不同的板子来
*AT91C_PMC_PCER = 1 << AT91C_ID_PIOC;
//enable PC14 bid output
*AT91C_PIOC_ODR = AT91C_PIO_PC14;
*AT91C_PIOC_PER = AT91C_PIO_PC14;
//pull-up 14
AT91C_BASE_PIOC->PIO_PPUDR = ~AT91C_PIO_PC14;
AT91C_BASE_PIOC->PIO_PPUER = AT91C_PIO_PC14;
//enable pc15 for output
*AT91C_PIOC_PER = AT91C_PIO_PC15;
AT91C_BASE_PIOC->PIO_OER = AT91C_PIO_PC15;
// 进行短暂的延时
int j;
for(j=0;j<50000;j++);
printf ("%4lu MB/n", nand_probe(AT91_SMARTMEDIA_BASE) >> 20);
}
修改配置文件 include/configs/at91rm9200dk.h 中关于 nand flash 的宏定义
// 增加 nand 的命令支持
#define CONFIG_COMMANDS /
((CONFIG_CMD_DFL | CFG_CMD_MII |/
CFG_CMD_DHCP | CFG_CMD_NAND ) & /
~(CFG_CMD_BDI | /
CFG_CMD_IMI | /
CFG_CMD_AUTOSCRIPT | /
CFG_CMD_FPGA | /
CFG_CMD_MISC | /
CFG_CMD_LOADS ))
/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */
#include <cmd_confdefs.h>
//#include <asm/arch/AT91RM9200.h>
#define CFG_NAND_LEGACY 1 // 使用 board/at91rm9200dk/at91rm9200dk.c 中的 nand_init() 函数和 driver/nand_legacy/nand_legacy.c 中的函数,如果不定义,使用 driver/nand/nand.c 中的 nand_init()
#define CFG_MAX_NAND_DEVICE 1 /* Max number of NAND devices */
#define SECTORSIZE 512
#define ADDR_COLUMN 1
#define ADDR_PAGE 2
#define ADDR_COLUMN_PAGE 3
#define NAND_ChipID_UNKNOWN 0x00
#define NAND_MAX_FLOORS 1
#define NAND_MAX_CHIPS 1
//my ale cle 这个不是很明白,应该根据你的板子上的连接来设置,看你的 flash 上的 cle 和 ale 分别接的是那一根地址线
#define AT91_SMART_MEDIA_ALE (1 << 21) /* our ALE is AD21 */
#define AT91_SMART_MEDIA_CLE (1 << 22) /* our CLE is AD22 */
//PC15 接的是 CE , PC14 接的是 RE
#define NAND_DISABLE_CE(nand) do { *AT91C_PIOC_SODR = AT91C_PIO_PC15;} while(0)
#define NAND_ENABLE_CE(nand) do { *AT91C_PIOC_CODR = AT91C_PIO_PC15;} while(0)
#define NAND_WAIT_READY(nand) while (!(*AT91C_PIOC_PDSR & AT91C_PIO_PC14))
#define WRITE_NAND_COMMAND(d, adr) do{ *(volatile __u8 *)((unsigned long)adr | AT91_SMART_MEDIA_CLE) = (__u8)(d); } while(0)
#define WRITE_NAND_ADDRESS(d, adr) do{ *(volatile __u8 *)((unsigned long)adr | AT91_SMART_MEDIA_ALE) = (__u8)(d); } while(0)
#define WRITE_NAND(d, adr) do{ *(volatile __u8 *)((unsigned long)adr) = (__u8)d; } while(0)
#define READ_NAND(adr) ((volatile unsigned char)(*(volatile __u8 *)(unsigned long)adr))
/* the following are NOP's in our implementation */
// 要进行修改,按以下定义
#define NAND_CTL_CLRALE(nandptr) (nandptr & ~(AT91_SMART_MEDIA_ALE))
#define NAND_CTL_SETALE(nandptr) (nandptr|AT91_SMART_MEDIA_ALE)
#define NAND_CTL_CLRCLE(nandptr) (nandptr & ~(AT91_SMART_MEDIA_CLE))
#define NAND_CTL_SETCLE(nandptr) (nandptr|AT91_SMART_MEDIA_CLE)
2007-8-22
1. 解决环境变量 env 的 存储问题。
描述:在 cmd_nvedit.c 中,检查环境变量存储在那里。可选的有 CFG_ENV_IS_IN_NVRAM
CFG_ENV_IS_IN_EEPROM
CFG_ENV_IS_IN_FLASH
CFG_ENV_IS_IN_DATAFLASH
CFG_ENV_IS_IN_NAND
CFG_ENV_IS_NOWHERE
在 include/configs/at91rm9200.h 中定义其中的一种就可以,因为还没有搞好 I2C, 所以目前先使用 NAND flash 。在该文件中添加:
#define CFG_ENV_IS_IN_NAND
#define CFG_ENV_OFFSET 0x40000 // 环境变量存储位置偏移
#define CFG_ENV_SIZE 0x20000 // 环境变量存储大小
#define CFG_ENV_ADDR 0x40040000
并且注释掉其他的 ENV 的设置。
由于 nand 的 驱动使用了 nand_legacy.c 中的 nand 接口函数。所以要修改 common/env_nand.c 中的 saveenv 函数和 env_relocate_spec 函数。
int saveenv(void)
{
ulong total;
int ret = 0;
puts ("Erasing Nand...");
/*
if (nand_erase(&nand_info[0], CFG_ENV_OFFSET, CFG_ENV_SIZE))
return 1;
*/
if (nand_legacy_erase(&nand_dev_desc[0], CFG_ENV_OFFSET, CFG_ENV_SIZE,1))
return 1;
puts ("Writing to Nand... ");
total = CFG_ENV_SIZE;
/*
ret = nand_write(&nand_info[0], CFG_ENV_OFFSET, &total, (u_char*)env_ptr);
if (ret || total != CFG_ENV_SIZE)
return 1;
*/
ret = nand_legacy_rw(&nand_dev_desc[0] , 0x00 ,CFG_ENV_OFFSET,CFG_ENV_SIZE, (size_t *)&total, (u_char*)env_ptr);
puts ("done/n");
return ret;
}
/*
* The legacy NAND code saved the environment in the first NAND device i.e.,
* nand_dev_desc + 0. This is also the behaviour using the new NAND code.
*/
void env_relocate_spec (void)
{
#if !defined(ENV_IS_EMBEDDED)
ulong total;
int ret;
total = CFG_ENV_SIZE;
// ret = nand_read(&nand_info[0], CFG_ENV_OFFSET, &total, (u_char*)env_ptr);
ret = nand_legacy_rw(&nand_dev_desc[0], 0x01 ,CFG_ENV_OFFSET,CFG_ENV_SIZE, (size_t *)&total, (u_char*)env_ptr);
if (ret || total != CFG_ENV_SIZE)
return use_default();
if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)
return use_default();
#endif /* ! ENV_IS_EMBEDDED */
}
2007-8-27
内核与文件系统移植成功。其中经历了不少的问题。主要是这么几个方 面:
1. 在 uboot 中的 bootargs 的设置, init=/linuxrc console=/dev/ttyS0,115200 root=/dev/mtdblock2 。
2. 自动启动内核的时候, bootcmd 的设置在内核中要给 nand flash 分好区的,在第三个分区烧写上文件系统。
3. 编译 busybox ,写好 rcS 文件。
2007-8-28
1. 明确的几个问题。
1 )在当前的启动方式下, uboot 仅仅相当于提供了方便的方式下载内核,文件系统的任务,如何能够让 uboot 自己完成启动的全部任务。目前为 eeprom 中的 bios 程序,调用烧写在 nand flash 上的 uboot ,完成启动。但是 bios 要 是从 nand flash 上读出 uboot ,就必须移植 nand flash 的驱动才可以,这样相当于 bios 也 可以完成烧写 nand flash 的任务。那么是不是有办法让 uboot 烧 写在 eeprom 中,自己启动的。
2. 出现不能初始化 console 的错误的时候,可能是 /dev 没有加载,在编译内核的时候,要选中自动加载 /dev 在 boot 的时候,这个选项。不然程序会因为找不到 /dev/console 出错。