移植u-boot-1.1.6之mtdparts分区
和u-boot高版本不同,mtdparts命令没有cmd_mtdparts这么一个单独的文件来实现。
不过,搜索uboot可以在cmd_jffs2.c里面看到如下代码:
U_BOOT_CMD(
mtdparts, , , do_jffs2_mtdparts,
"mtdparts- define flash/nand partitions\n",
"\n"
" - list partition table\n"
"mtdparts delall\n"
" - delete all partitions\n"
"mtdparts del part-id\n"
" - delete partition (e.g. part-id = nand0,1)\n"
"mtdparts add <mtd-dev> <size>[@<offset>] [<name>] [ro]\n" ...
可知mtdpart命令是在do_jffs2_mtdparts函数里面实现的。
再看do_jffs2_mtdparts函数:
int do_jffs2_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
if (argc == ) { //这里先检测参数的个数,注意,我们通常使用mtdpart命令时是不带参数,下面会在这里做修改
if (strcmp(argv[], "default") == ) {
setenv("mtdids", (char *)mtdids_default); //mtdids使用mtdids_default
setenv("mtdparts", (char *)mtdparts_default); //mtdparts使用mtdparts,以上两个默认配置都是在配置文件里面实现的,如smdk2410.h
setenv("partition", NULL); mtdparts_init();
return ;
} else if (strcmp(argv[], "delall") == ) {
/* this may be the first run, initialize lists if needed */
mtdparts_init(); setenv("mtdparts", NULL); /* devices_init() calls current_save() */
return devices_init();
}
} ...
此外,在cmd_jffs2.c文件的开头,注意有几个宏定义:
#include <linux/ctype.h> #if (CONFIG_COMMANDS & CFG_CMD_JFFS2) #include <cramfs/cramfs_fs.h> #if (CONFIG_COMMANDS & CFG_CMD_NAND)
#ifdef CFG_NAND_LEGACY
#include <linux/mtd/nand_legacy.h>
#else /* !CFG_NAND_LEGACY */
和
#ifdef CONFIG_JFFS2_CMDLINE
/* default values for mtdids and mtdparts variables */
#if defined(MTDIDS_DEFAULT)
static const char *const mtdids_default = MTDIDS_DEFAULT;
#else
#warning "MTDIDS_DEFAULT not defined!"
static const char *const mtdids_default = NULL;
#endif
还有
static int part_validate_nand(struct mtdids *id, struct part_info *part)
{
#if defined(CONFIG_JFFS2_NAND) && (CONFIG_COMMANDS & CFG_CMD_NAND)
/* info for NAND chips */
nand_info_t *nand;
这里需要定义三个宏还有默认配置:
#define CONFIG_JFFS2_CMDLINE 1
#define CONFIG_JFFS2_NAND 1 #define MTDIDS_DEFAULT "nand0=nandflash0"
#define MTDPARTS_DEFAULT "mtdparts=nandflash0:256k@0(bootloader)," \
"128k(params)," \
"2m(kernel)," \
"-(root)"
#define CONFIG_COMMANDS \
CFG_CMD_JFFS2 | \
以上,编译通过后,并不能立刻启动内核,注意此时的启动参数:
#define CONFIG_BOOTCOMMAND "nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0" //因为kernel还没有被识别
这里应该改成:
#define CONFIG_BOOTCOMMAND "nand read.jffs2 0x30007FC0 0x60000 0x200000; bootm 0x30007FC0"
//这里是内核已经被烧写到Nand里面去了,然后使用nand read命令读到sdram的30007fc0地址处,内核在nand里面的地址是0x60000,大小是2M
这里还是不能使用mtdpart命令,原因是上面提到过mtdpart参数的问题
因为我们不使用参数,那么:
if (argc == ) {
if (strcmp(argv[], "default") == ) {
setenv("mtdids", (char *)mtdids_default);
setenv("mtdparts", (char *)mtdparts_default);
setenv("partition", NULL);
mtdparts_init();
return ;
} else if (strcmp(argv[], "delall") == ) {
/* this may be the first run, initialize lists if needed */
mtdparts_init();
setenv("mtdparts", NULL);
/* devices_init() calls current_save() */
return devices_init();
}
}
/* make sure we are in sync with env variables */
if (mtdparts_init() != )
return ;
if (argc == ) {
list_partitions();
return ;
}
那么,以下四个函数没有执行:
setenv("mtdids", (char *)mtdids_default);
setenv("mtdparts", (char *)mtdparts_default);
setenv("partition", NULL);
mtdparts_init(); //其中,主要是这个没有被执行
处理措施:有两种
第一个,把参数解析那个去掉,直接执行mtdparts_init()函数,代码如下:
int do_jffs2_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
//by Flinn
setenv("mtdids", (char *)mtdids_default);
setenv("mtdparts", (char *)mtdparts_default);
setenv("partition", NULL); mtdparts_init();
if (argc == ) {
if (strcmp(argv[], "default") == ) {
//setenv("mtdids", (char *)mtdids_default);
//setenv("mtdparts", (char *)mtdparts_default);
//setenv("partition", NULL); //mtdparts_init();
return ;
} else if (strcmp(argv[], "delall") == ) {
/* this may be the first run, initialize lists if needed */
mtdparts_init(); setenv("mtdparts", NULL); /* devices_init() calls current_save() */
return devices_init();
}
}
第二种,如韦东山所做,在main.c的main_loop函数里面添加:
#ifdef CONFIG_JFFS2_CMDLINE
extern int mtdparts_init(void); //先执行init函数
if (!getenv("mtdparts"))
{
run_command("mtdparts default", ); //再调用默认配置
}
else
{
mtdparts_init();
}
#endif
以上两种办法都是可以的。
移植u-boot-1.1.6之mtdparts分区的更多相关文章
- 5.移植uboot-设置默认环境变量,裁剪,并分区
在上一章,我们使用网卡传输文件,每次启机时,环境变量都要变为默认值,需要重新设置ip,MAC地址才行,由于没有配置mtdparts命令,启动内核也不成功 所以本章主要学习: 1)修改环境变量默认值 2 ...
- boot camp要求独立的fat分区
先在windows把u盘用diskpart clean掉分区表 然后在苹果里面,给u盘重新分区,分区表不要选择GUID,选择主引导记录,格式选择fat,OK
- 1uboot移植要点[原创☆☆]
----- 一:我们先来了解下实际内存: nand.nor.ram. 所以从CPU是从那部分启动的呢? 答:要看主控芯片的boot如何设置(正如分的启动方式和下载方式一样). uboot:sd卡→iR ...
- u-boot中添加mtdparts支持以及Linux的分区设置
简介 作者:彭东林 邮箱:pengdonglin137@163.com u-boot版本:u-boot-2015.04 Linux版本:Linux-3.14 硬件平台:tq2440, 内存:64M ...
- 【转】 boot.img的解包与打包
原文网址:http://blog.csdn.net/wh_19910525/article/details/8200372 Android 产品中,内核格式是Linux标准的zImage,根文件系统采 ...
- 十一、移植优化---CONFIG 优化进 menuconfig(2)
11.3 jz2440.h 中的剩余宏移植 11.3.1 CONFIG_SYS_TEXT_BASE CONFIG_SYS_TEXT_BASE:设置系统代码段的基地址,设为 0x0:menuconfig ...
- 移植u-boot-2014.4到S5PV210/TQ210(完整)
本文很多其它的是教会大家怎样学习 1.1 概述 1.2 u-boot配置过程分析 1.3 u-boot编译过程分析 1.4 SPL 1.5 加入自己的单板 1.6 移植u-bo ...
- 二十五、grub (Boot Loader) 以及修复grub
双系统安装(先Windows后Linux,以免windows NTloader会覆盖Linux loader) GRUB Grand Uniform Bootloader CentOS5,6 grub ...
- grub paramiter & menu.list
在Linux中,给kernel传递参数以控制其行为总共有三种方法: 1.build kernel之时的各个configuration选项. 2.当kernel启动之时,可以参数在kernel被GRUB ...
随机推荐
- 容易导致outofmemoryException内存泄漏异常的编码问题
1.System.Drawing方面的类使用问题 System.Drawing用到了很多系统的资源和非托管代码,所以使用的时候要特别小心,注意内存泄漏(Memory Leak) 2.new byte[ ...
- CentOS 的网络配置
1, ifcfg-ethX, 设置对应网口的IP等信息, 比如第一个网口, 那么vim /etc/sysconfig/network-scripts/ifcfg-eth0,配置例子: DEVICE=& ...
- 使用jQuery解析xml时command节点解析失败
jQuery版本1.8.3 待解析的xml为: <message><user><command>Login</command></message& ...
- POJ 2823【单调队列】
题意: 给出序列,找出每个连续长度为k的子序列的最大值和最小值. 思路: 裸单调队列... 单调队列这东西用的真的非常局限,大概只能用到这种情景中== 简单说一下维护: 添加元素,为了保持单调性,排除 ...
- 项目已被os x使用 不能打开-黑苹果之路
之前复制了几个视频文件到NTFS的盘上,在mac中始终无法使用(甚至是chmod),无论是哪种播放软件,甚至改成dmg类型都无法打开,报“项目已被os x使用 不能打开”,用ls命令发现文件属性中多了 ...
- 网络安全学习和CTF必不可少的一些网站
[转载备用] 原文地址 http://blog.csdn.net/ida0918/article/details/52730662 http://www.sec-wiki.com/skill/ 安全 ...
- jmeter随笔(3)-从csv中获取带引号的数据详情
最近在工作中,对jmeter实践的点滴的记录这里分享,不一定正确,仅供参考和讨论,有想法的欢迎留言.谈论. 1技巧1:从csv中获取带引号的数据详情 背景:我们从csv中获取数据,在jmeter中使用 ...
- 【Unity Shaders】学习笔记——SurfaceShader(十)镜面反射
[Unity Shaders]学习笔记——SurfaceShader(十)镜面反射 如果你想从零开始学习Unity Shader,那么你可以看看本系列的文章入门,你只需要稍微有点编程的概念就可以. 水 ...
- Java基本概念(未完)
仅简单总结~辅助快速回忆~ 一.JVM 1,Java类加载机制 Java程序由多个类文件组成,按需加载. Java的动态扩展是由运行期动态加载和动态链接实现的.——动态绑定,多态. 加载步骤: 1)装 ...
- 使用 Environment Indicator 模块区分不同的 Drupal 环境
每个 Drupal 网站建设人员到了某个时期,都会有误将线上站点当做本地站点进行修改的经历.尤其是在浏览器中打开了几十个页面时,很容易忘记究竟哪个是哪个. Environment Indicator ...