热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

uboot之裁剪和修改参数

环境变量的设置内核默认分布空间bootparamskernelroot0x00000000-0x00040000:bootloader0x00040000-0x00060000

环境变量的设置

       内核默认分布空间 

     boot  params kernel  root

    0x00000000-0x00040000 : "bootloader"

    0x00040000-0x00060000 : "params"

    0x00060000-0x00260000 : "kernel"

    0x00260000-0x10000000 : "root"

 

        默认参数设置

const uchar default_environment[] = {
#ifdef CONFIG_BOOTARGS"bootargs=" CONFIG_BOOTARGS "\0"
#endif
#ifdef CONFIG_BOOTCOMMAND"bootcmd=" CONFIG_BOOTCOMMAND "\0"
#endif
#ifdef CONFIG_RAMBOOTCOMMAND"ramboot=" CONFIG_RAMBOOTCOMMAND "\0"
#endif
#ifdef CONFIG_NFSBOOTCOMMAND"nfsboot=" CONFIG_NFSBOOTCOMMAND "\0"
#endif
#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)"bootdelay=" MK_STR(CONFIG_BOOTDELAY) "\0"
#endif
#if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)"baudrate=" MK_STR(CONFIG_BAUDRATE) "\0"

   所以我们需要对一些参数进行设置,不再试默认参数,这样启动uboot时不会再报

            *** Warning - bad CRC, using default environment

 

    但是我们需要做的就是两步。一个就是设置环境变量的参数,第二就是保存环境变量

   #define CONFIG_BOOTARGS "cOnsole=ttySAC0 root=/dev/mtdblock3"    //设置控制台和root分区

   #define CONFIG_BOOTCOMMAND "nand read 30000000 0xabc 0x200000;bootm 30000000"    //设置内核的读取地址

 

 第二步保存环境变量时,我们需要规定环境变量的保存地址,在内核参数中我们可以看到 0x00040000-0x00060000 : "params",但是我们现在的uboot太大,所以需要进行如下步骤

  裁剪uboot,修改大小

    查看头文件,看那些内容不需要,直接屏蔽

//#define CONFIG_USB_OHCI
//#define CONFIG_USB_KEYBOARD
//#define CONFIG_USB_STORAGE
//#define CONFIG_DOS_PARTITION//#define CONFIG_RTC_S3C24X0//#define CONFIG_BOOTP_BOOTFILESIZE
//#define CONFIG_BOOTP_BOOTPATH
//#define CONFIG_BOOTP_GATEWAY
//#define CONFIG_BOOTP_HOSTNAME//#define CONFIG_CMD_DATE//#define CONFIG_CMD_DHCP 动态获得ip//#define CONFIG_CMD_USB#if 0
/*
* File system
*/
#define CONFIG_CMD_FAT
#define CONFIG_CMD_EXT2
#define CONFIG_CMD_UBI
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#define CONFIG_MTD_PARTITIONS
//#define CONFIG_YAFFS2
#define CONFIG_RBTREE
#endif

 

make distclean完重新对程序进行编译

重新设置环境变量的储存地址

根据saveenv命令,搜索可以知道  saveenv函数存在于common/env_nand.c下

 

查看common/makefile , 需要打开宏定开关,编译程序

    COBJS-$(CONFIG_ENV_IS_IN_NAND) += env_nand.o

 

查看env_nand.c下的saveenv函数可以知道还有几个宏需要定义

#define CONFIG_ENV_OFFSET    0x00040000      //环境变量保存的偏移地址

#define CONFIG_ENV_SIZE      0x20000        //环境变量的储存大小

#define CONFIG_ENV_RANGE     0x20000       //环境变量的储存范围

 

到这里就可以下载程序进行测试了    smdk2440.h

用上一节配置好的uboot的网卡进行烧写,然后复制到nor上进行测试(或者直接下配置好的uboot,然后用usb命令下载)

    set ipaddr 192.168.2.5        设置单板ip

    set serverip 192.168.2.2        设置服务器ip

    set ethaddr 00:0c:29:6c:b9:36    设置网卡mac

    tftp 30000000 uboot.bin        下载内核进行测试

 

    protect off all

    erase 0 3ffff    //由于重新更改了uboot的大小

    cp.b 30000000 0 40000

 

    然后uboot启动后执行save命令后重启,就不会再有默认参数的报错

    

U-Boot 2012.04.01 (Sep 25 2019 - 19:43:19)CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: 2 MiB
NAND: 256 MiB
In: serial
Out: serial
Err: serial
Net: dm9000
Hit any key to stop autoboot: 0

 

    至此uboot的基本功能已经全部移植完了,有点细节问题就是当我们现在下载内核时,必须输入像nand erase  60000 200000这样的命令,输入地址太麻烦,可以在uboot中设置变量来代替这些地址

    首先查看分区大小 mtdparts命令,但是现在还没有定义这个命令,搜索可以知道该命令实现在comomn/cmd_mtdparts.c   中,查看makefile,可以知道需要定义CONFIG_CMD_MTDPARTS宏,才能编译该文件,在头文件中加入该定义

   

    COBJS-$(CONFIG_CMD_MTDPARTS) += cmd_mtdparts.o

    然后查看mtdparts函数的是如何实现分区划分的,搜索mtdparts_init函数可以看出没有人在调用这个函数,所以我们需要自己手动调用这个函数,在borad.c的调用这个函数

    mtdparts_init();    //分区显示初始化

   /* main_loop() can return to retry autoboot, if so just run it again. */

    for (;;) {

        main_loop();

    }

 

    然后分析 mtdparts_init()函数,搜索CONFIG_CMD_MTDPARTS,查看别的单板是怎么设置mtdparts的参数的,然后根据自己的单板修改参数

#define CONFIG_CMD_MTDPARTS
#define MTDIDS_DEFAULT "nand0=samsungJZ2440" /*表示的是哪一个设备*/
#define MTDPARTS_DEFAULT "mtdparts=samsungJZ2440:256K(uboot)," \ //分区参数 注意nand0和mtdparts的第一个参数要一样"128K(params)," \"2M(kernel)," \"-(root)"

 

编译完成下载后,需要先手动输入mtdparts default,然后再测试命令是否正常

SMDK2410 # mtdpartsdevice nand0 , # parts = 4
#: name size offset mask_flags
0: uboot 0x00040000 0x00000000 0
1: params 0x00020000 0x00040000 0
2: kernel 0x00200000 0x00060000 0
3: root 0x0fda0000 0x00260000 0active partition: nand0,0 - (uboot) 0x00040000 @ 0x00000000defaults:
mtdids : nand0=jz2440-0
mtdparts: mtdparts=jz2440-0:256K(uboot),128K(params),2M(kernel),-(root)

 

这个时候如果不想自己手动输入mtdparts default命令,可以在程序中直接执行完mtdparts default命令 ,这个时候可以不再调用mtdparts_init()

run_command("mtdparts default",0);/* main_loop() can return to retry autoboot, if so just run it again. */for (;;) {main_loop();}

   

这个时候我们就可以利用这些参数直接烧写内核等

    nand erase.part kernel     //擦除内核区域

    nand write 30000000 kernel    //将内核写到kernel分区

    set bootcmd 'nand read 30000000 kernel;bootm 30000000 '   //读出内核启动


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • javascript二叉树基本功能实现
    都是常用的功能。删除是最复杂的。。test ... [详细]
  • 本文介绍了新款奇骏的两个让人上瘾的功能,分别是智能互联系统和BOSE音响。通过对新款奇骏的配置和功能进行评测,探讨了这两个新增功能的使用体验和优势。此外,还介绍了新款奇骏的其他配置和改进,如增加的座椅和驾驶辅助系统,以及内饰的舒适性提升。对于喜欢音响的消费者来说,BOSE音响的升级也是一个亮点。最后,文章提到了BOSE音响的数字还原能力,以及7座版无法配备BOSE音响的原因。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
author-avatar
mobiledu2502855757
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有