资讯
HOME
资讯
正文内容
nand write uboot 如何为SD卡与NAND Flash的uboot加上menu菜单
发布时间 : 2024-11-24
作者 : 小编
访问数量 : 23
扫码分享至微信

如何为SD卡与NAND Flash的uboot加上menu菜单

  亲爱的卡友们,如果看完文章之后还是有疑惑或不懂的地方,请联系我们,自己去理解或猜答案是件很累的事,请把最麻烦的事情交给我们来处理,术业有专攻,闻道有先后,深圳市雷龙发展专注存储行业13年,专业提供小容量存储解决方案。  【SD NAND】用ok6410进行烧写时,每次都需要敲一大堆命令,又费时又费力。 记得以前用TQ2440时,u-boot启动时会有一个菜单,只按一个数字键就把内核烧好了,非常方便。  现在这张SD卡功能就很全面了,不仅能够直接从SD卡启动,而且还可以烧写NAND Flash中的u-boot zImage rootfs,呵呵。  下面就把这个功能加到ok6410的u-boot 中去。  一、修改SD卡的u-boot1.1.6  1. common/main.c中  void main_loop (void)  {  ……  if(bootdelay>=0&&s&&!abortboot(bootdelay)){ }  //如果在启动过程中有按键,打断了执行过程的话  run_command("menu",0);  //如果menu返回的话,就进入u-boot的shell中  #ifdef CFG_HUSH_PARSER  parse_file_outer();  ……  }  2. 执行menu的过程  run_command("menu", 0),最终会执行do_menu.  do_menu 开始时先打印出命令菜单,然后根据不同的选择,执行不同的命令。  所以添加的文件 common/cmd_menu.c,如下:  #include  #include  #include  #include  void print_menu_usage(void)  {  printf("rn##### SD boot Menu#####rn");  printf("[1] Download u-boot bootloader to Nand Flashrn");  printf("[2] Download Linux Kernel to Nand Flashrn");  printf("[3] Download CRAMFS image to Nand Flashrn");  printf("[4] Download YAFFS image to Nand Flashrn");  printf("[5] Boot the systemrn");  printf("[6] Format the Nand Flashrn");  printf("[0] Set the boot parametersrn");  printf("[a] Download User Program (eg: uCOS-II or TQ2440_Test)rn");  printf("[b] Download LOGO Picture (。bin) to Nand Flash rn");  printf("[q] quit from menurn");  printf("Enter your selection: ");  }  intdo_menu(cmd_tbl_t*cmdtp,intflag,intargc,char*argv[])  {  intc;  char cmd_buf[200];  while(1)  {  print_menu_usage();  c=getc();  printf("%cn",c);  switch(c)  {  case'1':  {  strcpy(cmd_buf,"fatload mmc 0:1 50008000 u-boot.bin_nand; nand erase 0 100000; nand write.uboot 50008000 0 10000");  run_command(cmd_buf,0);  break;  }  case'2':  {  strcpy(cmd_buf,"fatload mmc 0:1 50008000 zImage_nand; nand erase 100000 500000; nand write.e 50008000 100000 500000");  run_command(cmd_buf,0);  break;  }  case'3':  {  //strcpy(cmd_buf,"fatload mmc 0:1 50008000 u-boot.bin; nand erase 0 100000; nand write.uboot 50008000 0 10000");  //run_command(cmd_buf,0);  break;  }  case'4':  {  //strcpy(cmd_buf,"fatload mmc 0:1 50008000 rootfs.yaffs; nand erase 600000 4A4000; nand write.yaffs2 50008000 600000 4A4000");  //strcpy(cmd_buf,"fatload mmc 0:1 50008000 rootfs.yaffs; nand erase 600000 $(filesize); nand write.yaffs2 50008000 600000 $(filesize)");  //注意:nand erase 600000 $(filesize),假设有坏块的话,这样会有数据不能写入, 所以这个地方可以固定一个较大值,如  // 0x1400000=20M,所以rootfs.yaffs的大小不能超过20M,  //考虑此处是不是要加上NAND Flash分区: nand erase root,把整个的root分区全部擦除,这样就不必担心是否有坏块的问题了  strcpy(cmd_buf,"fatload mmc 0:1 50008000 rootfs.yaffs; nand erase 600000 1400000; nand write.yaffs2 50008000 600000 $(filesize)");  run_command(cmd_buf,0);  break;  }  case'5':  {  strcpy(cmd_buf,"bootm 50008000");  run_command(cmd_buf,0);  break;  }  case'q':  return;  default:  printf("command not foundn");  break;  }  }  }  U_BOOT_CMD(  menu,5,1,do_menu,  "menu - manipulate BMP image datan",  "menu long help: TNND mu you"  );  3. 添加到Makefile中  最后在common/Makefile中添加一行  COBJS+=cmd_menu.o  注意:在组合命令时,如NAND write不知道烧写的大小怎么办? 没关系,有变量 $(filesize), 只要加上这个任何问题都不再困难。  上面的50008000是从SD卡启动时,要读到的内存地址; 若是从Nand Flash启动要把上面的50008000改为C0008000  二。 测试一下  2.1 sd卡  a. 因为都是从SD卡和第一个分区读数据,所以将SD卡分区时第一个分区格式必须为FAT32.  b. 编译u-boot.bin:  代码要用光盘中带的u-boot,这个支持从NAND Flash 启动  make forlinx_nand_ram256_config, 后生成 u-boot.bin  复制到SD卡的第一个分区, 并改名为 u-boot.bin_nand(要与u-boot代码中的名称保持一致)  c. 编译zImage  代码要用光盘中带的linux-3.0.1, make后生成zImage  复制到SD卡的第一个分区, 并改名为 zImage_nand(要与u-boot代码中的名称保持一致)  d. 生成rootfs.yaffs  可以用光盘中带的FileSystem-Yaffs2.tar.gz, 解压后,嫌太大,把不需要的删掉,  里面的busybox好像是动态链接的,自己编个静态的busybox,最后生成rootfs.yaffs  sudo /opt/6410/4.3.2/bin/mkyaffs2image-nand2g FileSystem-Yaffs2 rootfs.yaffs  NAND Flash 是2G的所以要用命令 mkyaffs2image-nand2g  将rootfs.yaffs复制到SD卡的第一个分区(要与u-boot代码中的名称保持一致)  注意: 如果不确定rootfs本身有没有问题,可以先从nfs启动,看是否正常。  如果正常再用mkyaffs2image-nand2g,做成yaffs镜像烧入到NAND Flash中。  亲爱的卡友们,如果看完文章之后还是有疑惑或不懂的地方,请联系我们,自己去理解或猜答案是件很累的事,请把最麻烦的事情交给我们来处理,术业有专攻,闻道有先后,深圳市雷龙发展专注存储行业13年,专业提供小容量存储解决方案。

Linux系统移植之—uboot移植,你们要的uboot终于来了,堪称精品

作为一名过来人,uboot、kernel对每个学linux的来说都有很深的情谊,因为它们是一个系统跑起来的最基础,每个学linux的都会首先接触到。而它们本身就是一个精美的小系统,里边代码所体现的逻辑、算法以及每个绝妙的C知识点都让你沉醉其中。

uboot 属于bootloader的一种,是用来引导启动内核的,它的最终目的就是,从flash中读出内核,放到内存中,启动内核。具体内容如下:

1 u­boot 的介绍及系统结构

1.1 u­boot 介绍

1.2 获取 u­boot

1.3 u­boot 体系结构

1.3.1 u­boot 目录结构

2 uboot 的启动过程及工作原理

2.1 启动模式介绍

2.2 阶段 1 介绍

2.2.1 定义入口

2.2.2 设置异常向量

2.2.3 设置 CPU 的模式为 SVC 模式

2.2.4 关闭看门狗

2.2.5 禁掉所有中断

2.2.6 设置以 CPU 的频率

2.2.7 设置 CP15

2.2.8 配置内存区控制寄存器

2.2.9 安装 U­BOOT 使的栈空间

2.2.10 BSS 段清 0

2.2.11 搬移 Nand Flash 代码

2.2.12 进入 C 代码部分

2.3 阶段 2 的 C 语言代码部分 

2.3.1 调用一系列的初始化函数

2.3.2 初始化网络设备

2.3.3 进入主 UBOOT 命令行

2.4 代码搬运

3 uboot 的移 植过程

3.1 环境

3.2 步骤

3.2.1 修改 Makefile

3.2.2 在 board 子目录中建立 crane2410

3.2.3 在 include/configs/中建立配置头文件

3.2.4 指定交叉编译工具的路径

3.2.5 测试编译能否成功

3.2.6 修改 lowlevel_init.S 文件

2.9 UBOOT 的 Nand Flash 移植

3.2.8 重新编译 u­boot

3.2.9 把 u­boot 烧入 flash

4.2 常用命令使用说明

4.2.1 askenv(F)

在标准输入(stdin)获得环境变量。

4.2.2 autoscr

从内存(Memory)运行脚本。(注意,从下载地址开始,例如我们的开发板是从 0x30008000 处开始运

行).

CRANE2410 # autoscr 0x30008000

## Executing script at 30008000

4.2.3 base

打印或者设置当前指令与下载地址的地址偏移。

4.2.4 bdinfo

打印开发板信息

CRANE2410 # bdinfo

-arch_number = 0x000000C1 (CPU 体系结构号)

-env_t = 0x00000000 (环境变量)

-boot_params = 0x30000100 (启动引导参数)

-DRAM bank = 0x00000000 (内存区)

--> start = 0x30000000 (SDRAM 起始地址)

--> size = 0x04000000 (SDRAM 大小)

-ethaddr = 01:23:45:67:89:AB (以太网地址)

-ip_addr = 192.168.1.5 (IP 地址)

-baudrate = 115200 bps (波特率)

4.2.5 bootp

通过网络使用 Bootp 或者 TFTP 协议引导境像文件。

CRANE2410 # help bootp

bootp [loadAddress] [bootfilename]

4.2.6 bootelf

默认从 0x30008000 引导 elf 格式的文件(vmlinux)

CRANE2410 # help bootelf

bootelf [address] - load address of ELF image.

4.2.7 bootd(=boot)

引导的默认命令,即运行 U-BOOT 中在“include/configs/smdk2410.h” 中设置的“bootcmd” 中

的命令。如下:

#define CONFIG_BOOTCOMMAND "tftp 0x30008000 uImage; bootm 0x30008000";

在命令下做如下试验:

CRANE2410 # set bootcmd printenv

CRANE2410 # boot

bootdelay=3

baudrate=115200

ethaddr=01:23:45:67:89:abCRANE2410 # bootd

bootdelay=3

baudrate=115200

ethaddr=01:23:45:67:89:ab

4.2.8 tftp(tftpboot)

即将内核镜像文件从 PC 中下载到 SDRAM 的指定地址,然后通过 bootm 来引导内核,前提是所用 PC 要安装设

置 tftp 服务。

下载信息:

CRANE2410 # tftp 0x30008000 zImage

TFTP from server 10.0.0.1; our IP address is 10.0.0.110

Filename 'zImage'.

Load address: 0x30008000

Loading: #################################################################

#################################################################

#################################################

done

Bytes transferred = 913880 (df1d8 hex)

4.2.9 bootm

内核的入口地址开始引导内核。

CRANE2410 # bootm 0x30008000

## Booting image at 30008000 ...

Starting kernel ...

Uncompressing

Linux......................................................................

done, .

4.2.10 go

直接跳转到可执行文件的入口地址,执行可执行文件。

CRANE2410 # go 0x30008000

## Starting application at 0x30008000 ...

4.2.11 cmp

对输入的两段内存地址进行比较。

CRANE2410 # cmp 0x30008000 0x30008040 64

word at 0x30008000 (0xe321f0d3) != word at 0x30008040 (0xc022020c)

Total of 0 words were the same

CRANE2410 # cmp 0x30008000 0x30008000 64

Total of 100 words were the same

4.2.12 coninfo

打印所有控制设备和信息,例如

-List of available devices:

-serial 80000003 SIO stdin stdout stderr

4.2.13 cp

内存拷贝,cp 源地址 目的地址 拷贝大小(字节)

CRANE2410 # help cp

cp [.b, .w, .l] source target count

ANE2410 # cp 0x30008000 0x3000f000 644.2.14 date

获得/设置/重设日期和时间

CRANE2410 # date

Date: 2006-6-6 (Tuesday) Time: 06:06:06

4.2.15 erase(F)

擦除 FLASH MEMORY, 由于该 ARM 板没有 Nor Flash, 所有不支持该命令.

CRANE2410 # help erase

erase start end

- erase FLASH from addr 'start' to addr 'end'

erase start +len

- erase FLASH from addr 'start' to the end of sect w/addr 'start'+'len'-1

erase N:SF[-SL]

- erase sectors SF-SL in FLASH bank # N

erase bank N

- erase FLASH bank # N

erase all

- erase all FLASH banks

4.2.16 flinfo(F)

打印 Nor Flash 信息, 由于该 ARM 板没有 Nor Flash, 所有不支持该命令.

4.2.17 iminfo

打印和校验内核镜像头, 内核的起始地址由 CFG_LOAD_ADDR 指定:

#define CFG_LOAD_ADDR 0x30008000 /* default load address */

该宏在 include/configs/crane2410.h 中定义.

CRANE2410 # iminfo

## Checking Image at 30008000 ...

Image Name: Linux-2.6.14.1

Created: 2006-06-28 7:43:01 UTC

Image Type: ARM Linux Kernel Image (uncompressed)

Data Size: 1047080 Bytes = 1022.5 kB

Load Address: 30008000

Entry Point: 30008040

Verifying Checksum ... OK

4.2.18 loadb

从串口下载二进制文件

CRANE2410 # loadb

## Ready for binary (kermit) download to 0x30008000 at 115200 bps...

## Total Size = 0x00000000 = 0 Bytes

## Start Addr = 0x30008000

4.2.19 md

显示指定内存地址中的内容

CRANE2410 # md 0

00000000: ea000012 e59ff014 e59ff014 e59ff014 ................

00000010: e59ff014 e59ff014 e59ff014 e59ff014 ................

00000020: 33f80220 33f80280 33f802e0 33f80340 ..3...3...3@..3

00000030: 33f803a0 33f80400 33f80460 deadbeef ...3...3`..3....

00000040: 33f80000 33f80000 33f9c0b4 33fa019c ...3...3...3...3

00000050: e10f0000 e3c0001f e38000d3 e129f000 ..............).00000060: e3a00453 e3a01000 e5801000 e3e01000 S...............

00000070: e59f0444 e5801000 e59f1440 e59f0440 D.......@...@...

00000080: e5801000 e59f043c e3a01003 e5801000 ....<...........

00000090: eb000051 e24f009c e51f1060 e1500001 Q.....O.`.....P.

000000a0: 0a000007 e51f2068 e51f3068 e0432002 ....h ..h0... C.

000000b0: e0802002 e8b007f8 e8a107f8 e1500002 . ............P.

000000c0: dafffffb e51f008c e2400803 e2400080 ..........@...@.

000000d0: e240d00c e51f0094 e51f1094 e3a02000 ..@.......... ..

000000e0: e5802000 e2800004 e1500001 dafffffb . ........P.....

000000f0: eb000006 e59f13d0 e281f000 e1a00000 ................

4.2.20 mm

顺序显示指定地址往后的内存中的内容,可同时修改,地址自动递增。

CRANE2410 # mm 0x30008000

30008000: e1a00000 ? fffff

30008004: e1a00000 ? eeeeee

30008008: e1a00000 ? q

CRANE2410 # md 30008000

30008000: 000fffff 00eeeeee e1a00000 e1a00000 ................

30008010: e1a00000 e1a00000 e1a00000 e1a00000 ................

30008020: ea000002 016f2818 00000000 000df1d8 .....(o.........

30008030: e1a07001 e3a08000 e10f2000 e3120003 .p....... ......

4.2.21 mtest

简单的 RAM 检测

CRANE2410 # mtest

Pattern FFFFFFFD Writing... Reading...

4.2.22 mw

向内存地址写内容

CRANE2410 # md 30008000

30008000: ffffdffd ffffdffc ffffdffb ffffdffa ................

CRANE2410 # mw 30008000 0 4

CRANE2410 # md 30008000

30008000: 00000000 00000000 00000000 00000000 ................

4.2.23 nm

修改内存地址, 地址不递增

CRANE2410 # nm 30008000

30008000: de4c457f ? 00000000

30008000: 00000000 ? 11111111

30008000: 11111111 ?

4.2.24 printenv

打印环境变量

CRANE2410 # printenv

bootdelay=3

baudrate=115200

ethaddr=01:23:45:67:89:ab

ipaddr=10.0.0.110

serverip=10.0.0.1

netmask=255.255.255.0

stdin=serial

stdout=serialstderr=serial

Environment size: 153/65532 bytes

4.2.25 ping

ping 主机

CRANE2410 # ping 10.0.0.1

host 10.0.0.1 is alive

4.2.26 reset

复位 CPU

4.2.27 run

运行已经定义好的 U-BOOT 的命令

CRANE2410 # set myenv ping 10.0.0.1

CRANE2410 # run myenv

host 10.0.0.1 is alive

4.2.28 saveenv(F)

保存设定的环境变量

4.2.29 setenv

设置环境变量

CRANE2410 # setenv ipaddr 10.0.0.254

CRANE2410 # printenv

ipaddr=10.0.0.254

4.2.30 sleep

命令延时执行时间

CRANE2410 # sleep 1

4.2.31 version

打印 U-BOOT 版本信息

CRANE2410 # version

U-Boot 1.1.4 (Jul 4 2006 - 12:42:27)

4.2.32 nand info

打印 nand flash 信息

CRANE2410 # nand info

Device 0: Samsung K9F1208U0B at 0x4e000000 (64 MB, 16 kB sector)

4.2.33 nand device <n>

显示某个 nand 设备

CRANE2410 # nand device 0

Device 0: Samsung K9F1208U0B at 0x4e000000 (64 MB, 16 kB sector)

... is now current device

4.2.34 nand bad

CRANE2410 # nand bad

Device 0 bad blocks:4.2.35 nand read

nand read InAddr FlAddr size

InAddr: 从 nand flash 中读到内存的起始地址。

FlAddr: nand flash 的起始地址。

size: 从 nand flash 中读取的数据的大小。

CRANE2410 # nand read 0x30008000 0 0x100000

NAND read: device 0 offset 0, size 1048576 ...

1048576 bytes read: OK

4.2.36 nand erease

nand erase FlAddr size

FlAddr: nand flash 的起始地址

size: 从 nand flash 中擦除数据块的大小

CRANE2410 # nand erase 0x100000 0x20000

NAND erase: device 0 offset 1048576, size 131072 ... OK

4.2.37 nand write

nand write InAddr FlAddr size

InAddr: 写到 Nand Flash 中的数据在内存的起始地址

FlAddr: Nand Flash 的起始地址

size: 数据的大小

CRANE2410 # nand write 0x30f00000 0x100000 0x20000

NAND write: device 0 offset 1048576, size 131072 ...

131072 bytes written: OK

4.2.37 nboot

u-boot-1.1.4 代码对于 nboot 命令的帮助不正确,修改如下:

正确的顺序为:

nboot InAddr dev FlAddr

InAddr: 需要装载到的内存的地址。

FlAddr: 在 nand flash 上 uImage 存放的地址

dev: 设备号

需要提前设置环境变量,否则 nboot 不会调用 bootm

CRANE2410 #setenv autostart yes

CRANE2410 # nboot 30008000 0 100000

Loading from device 0: <NULL> at 0x4e000000 (offset 0x100000)

Image Name: Linux-2.6.14.3

Created: 2006-07-06 7:31:52 UTC

Image Type: ARM Linux Kernel Image (uncompressed)

Data Size: 897428 Bytes = 876.4 kB

Load Address: 30008000

Entry Point: 30008040

Automatic boot of image at addr 0x30008000 ...

## Booting image at 30008000 ...

Starting kernel ...

4.3 命令简写说明

所以命令都可以简写,只要命令前面的一部分不会跟其它命令相同,就可以不用写全整个命令.save 命令

CRANE2410 # sa

Saving Environment to Flash...

Un-Protected 1 sectors

Erasing Flash...Erasing sector 10 ... Erased 1 sectors

4.4 把文件写入 NandFlash

如果把一个传到内存中的文件写入到 Nand Flash 中, 如:新的 uboot.bin, zImage(内核),

rootfs 等, 如果做呢?我们可以用 Nand Flash 命令来完成. 但是 Nand Flash 写时,必须先要把 Nand

Flash 的写入区全部擦除后,才能写. 下面以把内存 0x30008000 起长度为 0x20000 的内容写到 Nand

Flash 中的 0x100000 为例.

CRANE2410 # nand erase 0x100000 20000

NAND erase: device 0 offset 1048576, size 131072 ... OK

CRANE2410 # nand write 0x30008000 0x100000 0x20000

NAND write: device 0 offset 1048576, size 131072 ...

131072 bytes written: OK

相关问答

有哪些非常好的嵌入式书籍推介?

推荐几本我大学时候读过的书。大概可以总结为C语言-->数据结构-->shell-->Linux应用-->内核-->51单片机-->STM32当然这个也是嵌入式的...

 吕燕身高  双星物语2加强版修改器 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2024  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部