Android分区增加和reset功能实现

来源:互联网 发布:女子网络直播踩兔子 编辑:程序博客网 时间:2024/04/29 23:12

1,项目需求

项目需求,陕西联通需要我们在机顶盒上实现如下描述的一个功能。芯片方案(M3与MX)

增加一个reset按键实现,在开机过程中检测到有reset按键就进入recovery找到备份的facbackup分区内的升级包和配置文件并升级。

通过修改加入一个分区

但对于系统而言,无论是recovery系统还是android系统都没有影响,只是多了一个可识别的设备而已。

启动后

从上面可以看出系统和分区无关,如果我们完全可以不在android系统上挂载/dev/fblock/facbackup设备。在recovery系统下挂载升级就可以,挂载只是为了方便大家直观认识。并且前期验证阶段也是通过android系统把升级包拷贝进去。



要实现该功能就要先增加一个分区。

2. 分区增加

1)m3系统

对应文件\M3_SDK\kernel\arch\arm\mach-meson3\board-m3-reff16.c,在参数static struct mtd_partition multi_partition_info_512M[] = 里面加入如下代码:
红色部分为加入的代码,意味着增加了一个384M的分区。
#if defined(CONFIG_AM_NAND)||defined(CONFIG_INAND)
// add by jyshan jzby 实际启效果的是这个,,针对所有硬件版本,而不是下面1G那个
static struct mtd_partition multi_partition_info_512M[] =
{
   
#if defined(CONFIG_INAND)
       {
           .name = "bootloader",
           .offset = BOOTLOADER_OFFSET,
           .size = BOOTLOADER_SIZE,
       },
       {
           .name = "ubootenv",
           .offset = CONFIG_ENV_OFFSET,
           .size = CONFIG_ENV_SIZE,
       },
#endif
    {
    .name = "aml_logo",
    .offset = 8*1024*1024,
    .size=8*1024*1024,
    },
    {
        .name = "recovery",
        .offset = 16*1024*1024,
        .size = 16*1024*1024,
    },
    {
        .name = "boot",
        .offset = 32*1024*1024,
        .size = 16*1024*1024,
    },
    {
        .name = "system",
        .offset = 48*1024*1024,
        .size = 800*1024*1024,
    },
    {
        .name = "cache",
        .offset = 848*1024*1024,
        .size = 512*1024*1024,
    },  
 {
        .name = "userdata",
        .offset=1360*1024*1024,
        .size=1024*1024*1024,
    },#if 1  
    {
        .name = "facbackup",    //只是设备名称,也可改叫其他名称。之所以名称与根文件系统内的facbackup同名是为了将来挂载方便程序员辨认。

        .offset=(u_int64_t)2384*1024*1024,   //需要计算一个版本和一个版本不一样,前面的描述符(u_int64_t)不能省略,2384*1024*1024不强制转型时,默认计算结果是int型,导致计算结果溢出;使分区出现问题导致recovery不能读取boot分区导致,无法正常进入升级。       

        .size=384*1024*1024,    //需要扩展的分区大小

    },
#endif

    {
    .name = "NFTL_Part",
    .offset = MTDPART_OFS_APPEND,
    .size = MTDPART_SIZ_FULL,
    },
};
上面的定义有两个,看清楚是哪一个。
从上面的宏定义也看得很清楚有可能不是这个变量,那肯定是其他某个,找到修改即可。原理不变,注意上面分区的顺序,依次数下来该分区应该是第九块设备,记住这个数字九。
那些宏定义被用到可以在MX_SDK\out\target\product\g18ref\obj\KERNEL_OBJ下面的.config文件中看到。

2)MX系统

v8001的版本上是在MX_SDK\common\customer\boards\board-m6g18-themmc.c文件,其他版本可能不一样,但都应该在MX_SDK\common\customer\boards\目录下。我们可以从MX_SDK\device\amlogic\g18ref下面的Kernel.mk里面查看KERNEL_DEFCONFIG。找到后修改和M3一致。


3. 增加文件根系统中facbackup文件的创建,并在系统初始化的过程中把新增加的分区挂载到facbackup文件夹下面。

1)m3系统

\M3_SDK\device\amlogic\f16ref\init.rc在系统启动之前初始化用到的文件。我们在代码中增加如下部分(红色部分代码)

on init
    sysclktz 0
    loglevel 7

    mkdir /system
    mkdir /data 0771 system system
    mkdir /cache 0770 system cache
    mkdir /facbackup 0771 system system
    mkdir /config 0500 root root
.....
.....
.....
on fs
    mount ext4 inand@system /system
    mount ext4 inand@system /system ro remount
    e2fsck -y /dev/block/data
    mount ext4 inand@userdata /data nosuid nodev
    mount ext4 inand@cache /cache nosuid nodev
    mount ext4 inand@facbackup /facbackup nosuid nodev

on post-fs
    # once everything is setup, no need to modify /
    #mount rootfs rootfs / ro remount

    # We chown/chmod /cache again so because mount is run as root + defaults
    chown system cache /cache
    chmod 0770 /cache

   # We chown/chmod /cache again so because mount is run as root + defaults
    chown system system /facbackup
    chmod 0771 /facbackup


    # This may have been created by the recovery system with odd permissions
    chown system cache /cache/recovery
    chmod 0770 /cache/recovery

  从以上可以看出在初始化的时候先创建了facbackup文件,之后挂载设备到facbackup,注意上面的inand@facbackup 这个就是上面增加分区的时候命名的块设备名称,如果上面改了名字,这里就要改。最后是分组和设置权限,按理说前面都设置了,这里没有必要再设置,估计是参考着cache写的。


Options(选项)选项是对服务的描述。它们影响init进程如何以及何时启动服务。
咱们来看看默认的init.rc文件。这里我只列出了主要的事件以及服务。
Table
Action/Service     描述
on early-init     设置init进程以及它创建的子进程的优先级,设置init进程的安全环境
on init     设置全局环境,为cpu accounting创建cgroup(资源控制)挂载点
on fs     挂载mtd分区
on post-fs     改变系统目录的访问权限
on post-fs-data     改变/data目录以及它的子目录的访问权限
on boot     基本网络的初始化,内存管理等等
service servicemanager     启动系统管理器管理所有的本地服务,比如位置、音频、Shared preference等等…
service zygote     启动zygote作为应用进程


2)MX系统

MX的init.rc有部分功能在MX_SDK\system\core\rootdir\init.rc下实现,注意不是全部。

也是找到相应的文件创建地方

on init
......
......
    mkdir /system
    mkdir /data 0771 system system
    mkdir /cache 0770 system cache
    mkdir /facbackup 0771 system system
    mkdir /config 0500 root root
......
......
......
on fs
# mount mtd partitions
    # Mount /system rw first to give the filesystem a chance to save a checkpoint
    #mount yaffs2 mtd@system /system
    #mount yaffs2 mtd@system /system ro remount
    #mount yaffs2 mtd@userdata /data nosuid nodev
    #mount yaffs2 mtd@cache /cache nosuid nodev

on post-fs
    # once everything is setup, no need to modify /
    #mount rootfs rootfs / ro remount
    # mount shared so changes propagate into child namespaces
    mount rootfs rootfs / shared rec
    mount tmpfs tmpfs /mnt/secure private rec

    # We chown/chmod /cache again so because mount is run as root + defaults
    chown system cache /cache
    chmod 0770 /cache
    # We restorecon /cache in case the cache partition has been reset.
    restorecon /cache

    # We chown/chmod /cache again so because mount is run as root + defaults
    chown system system /facbackup
    chmod 0771 /facbackup
    # We chown/chmod /cache again so because mount is run as root + defaults
    restorecon /facbackup


显然我们发现少了mount挂载的地方,挂载的地方在MX_SDK\device\amlogic\g18ref\init.amlogic.board.rc文件中

on init

on fs
    setprop ro.crypto.umount_sd false
    mount ext4 /dev/block/system /system wait ro noatime nodiratime noauto_da_alloc
    e2fsck -y /dev/block/data
    mount ext4 /dev/block/data /data noatime nodiratime norelatime nosuid nodev noauto_da_alloc
    mount ext4 /dev/block/cache /cache noatime nodiratime norelatime nosuid nodev noauto_da_alloc
    mount ext4 /dev/block/facbackup /facbackup noatime nodiratime norelatime nosuid nodev noauto_da_alloc
    write /sys/class/aml_keys/aml_keys/version auto3

on post-fs-data

on boot
   

4.  在recovery中增加对相应分区的检查和升级处理。


1)m3

对于m3在\M3_SDK\bootable\recovery\recovery.c文件中加入如下代码(红色部分为加入的代码)


static const char *CACHE_ROOT = "/cache";
static const char *SDCARD_ROOT = "/sdcard";
static const char *RAM_COMMAND_FILE = "/sys/class/boot_monitor/boot_command";
static const char *SDCARD_COMMAND_FILE = "/sdcard/factory_update_param.aml";
#define JZBY_RECOVERY_BACK_FAC
static const char *BACKUP_ROOT = "/facbackup";
static const char *FAC_BACKUP_COMMAND_FILE = "/facbackup/factory_update_param.aml";

static const char *UDISK_ROOT = "/udisk";
static const char *UDISK_COMMAND_FILE = "/udisk/factory_update_param.aml";
......
......
static void
get_args(int *argc, char ***argv) {
    struct bootloader_message boot;
    memset(&boot, 0, sizeof(boot));
    get_bootloader_message(&boot);  // this may fail, leaving a zeroed structure
......
......
    // --- if that doesn't work, try the udisk command file
    if (*argc <= 1) {
        FILE *fp = fopen_path(UDISK_COMMAND_FILE, "r");
        if (fp != NULL) {
            char *argv0 = (*argv)[0];
            *argv = (char **) malloc(sizeof(char *) * MAX_ARGS);
            (*argv)[0] = argv0;  // use the same program name

            char buf[MAX_ARG_LENGTH];
            for (*argc = 1; *argc < MAX_ARGS; ) {
                if (!fgets(buf, sizeof(buf), fp)) break;
            temp_args = strtok(buf, "\r\n");
            if(temp_args == NULL)  continue;
                   (*argv)[*argc]  = strdup(temp_args);   // Strip newline.      
                        ++*argc;
            }

            check_and_fclose(fp, UDISK_COMMAND_FILE);
            LOGI("Got arguments from %s\n", UDISK_COMMAND_FILE);
        }
    }
    
    // --- if that doesn't work, try the sdcard command file
    #ifdef JZBY_RECOVERY_BACK_FAC  //add by jyshan jzby
    if (*argc <= 1) {
        FILE *fp = fopen_path(FAC_BACKUP_COMMAND_FILE, "r");
        if (fp != NULL) {
            char *argv0 = (*argv)[0];
            *argv = (char **) malloc(sizeof(char *) * MAX_ARGS);
            (*argv)[0] = argv0;  // use the same program name

            char buf[MAX_ARG_LENGTH];
            for (*argc = 1; *argc < MAX_ARGS; ) {
                if (!fgets(buf, sizeof(buf), fp)) break;
            temp_args = strtok(buf, "\r\n");
            if(temp_args == NULL)  continue;
                   (*argv)[*argc]  = strdup(temp_args);   // Strip newline.      
                        ++*argc;
            }

            check_and_fclose(fp, FAC_BACKUP_COMMAND_FILE);
            LOGI("Got arguments from %s\n", FAC_BACKUP_COMMAND_FILE);
        }
        else
        {
              LOGI("jyshanjyshanjyshanjyshan open %s\n", FAC_BACKUP_COMMAND_FILE);      
        }
    }
    #endif

......
......
}
......
......

很显然就是在执行recovery过程中,仿照sdcard和U盘升级流程,先定义变量,不解释了。之后把sdcard升级过程响应部分代码加在sdcard和U盘升级流程之后。

2)MX

对于MX在\MX_SDK\bootable\recovery\recovery.cpp文件中,修改方法和M3一致。


5. 在recovery系统中增加facbackup文件夹,并挂载到设备/dev/block/facbackup 到facbackup文件下

这里需要阐明一点,设备是设备,系统是系统。步骤2只是为了让我们在android系统下能看到facbackup分区设置的。其实不要步骤二,在刷机时就把必要的update.zip和配置aml文件放进去,步骤二,完全可以不要。也就是说分区存在内容存在,只是在android系统没有挂载而已。而且android和recovery系统挂载与否无关。
那既然要在recovery系统中读取升级包升级,那必须挂载。这样就应了标题,创建文件夹并挂载。

1)M3

下创建文件夹

修改文件
M3_SDK\device\amlogic\f16ref\recovery\init.rc
M3_SDK\device\amlogic\f16ref\recovery\recovery.fstab
M3_SDK\device\amlogic\f16ref\recovery\init.rc中如下
on early-init
    ......
    ......
on init
    ......
    ......
    mkdir /system
    mkdir /data
    mkdir /cache
    mkdir /facbackup
    mount /tmp /tmp tmpfs
on boot
    ......
    ......
创建文件夹,不解释。
M3_SDK\device\amlogic\f16ref\recovery\recovery.fstab修改如下:
# mount point    fstype        device            device2
......
/system         ext4            /dev/block/cardblkinand6
/cache          ext4            /dev/block/cardblkinand7
/data           ext4            /dev/block/cardblkinand8
/facbackup      ext4            /dev/block/cardblkinand9
/sdcard         vfat            /dev/block/cardblksd#   
/udisk          vfat            /dev/block/sda#
/media          vfat            /dev/block/cardblkinand10
这个文件分区表,添加了这个设备。注意以前的第九个设备变成第十个了,还记得之前说过的第九个设备吧,在那里插入一个后,现在第九个设备是 /dev/block/facbackup/以前的第九个设备变成第十个了。在recovery main 函数中调用load_volume_table();函数根据 /etc/recovery.fstab(最终系统存储在etc下)建立分区表
// command line args come from, in decreasing precedence:
//   - the actual command line
//   - the bootloader control block (one per line, after "recovery")
//   - the contents of COMMAND_FILE (one per line)
注意:以上只是注册了分区,等于声明有这个东西而已,但没有挂载。挂载是在步骤三中调用fopen_path函数打开文件时,该函数会先调用ensure_path_mounted函数挂载设备,之后再打开这个文件。recovery具体执行流程参见http://blog.csdn.net/andyhuabing/article/details/9248713 以及http://blog.csdn.net/andyhuabing/article/details/9226569内有详细解释。

由于步骤一中的修改导致设备顺序发生了变化,所以需要在M3_SDK\device\amlogic\common\recovery\fdisk.media.sh文件修改做一下调整。红色部分为修改部分,需要把以前的9调整为10。
#!/sbin/sh

#/sbin/busybox fdisk /dev/block/avnftl8 < /etc/fdisk.media.cmd
#/sbin/busybox fdisk /dev/block/avnftli < /etc/fdisk.media.cmd
/sbin/busybox fdisk /dev/block/cardblkinand10 < /etc/fdisk.media.cmd

以上调试如果有问题,不要看串口打印了,没用。最后打印都,将标准输出和标准错误输出重定位到"/tmp/recovery.log"。在recovery模式下,出错,查看该文件即可。

2)MX

MX的修改基本和m3一致,修改的文件是

MX_SDK\device\amlogic\g18ref\recovery\init.rc

MX_SDK\device\amlogic\g18ref\recovery\recovery.fstab

在init.rc中添加mkdir /facbackup
在recovery.fstab中添加/facbackup   ext4  /dev/block/facbackup
MX不需要修改fdisk.media.sh文件,因为MX里面使用的是/dev/block/facbackup之类这样的设备名称,而不是在根据设备排序命名操作。

6. 在uboot中检查是否有按键,有按键就跳转到recovery刷新系统,没有就正常开机。注意:MX此区域代码绝对和m3不一样,需要修改。


1)M3

对于M3的系统需要修改如下三个文件

M3_SDK\uboot\include\configs\amlogic\m3_mbox.h
M3_SDK\uboot\board\amlogic\m3_mbox\m3_mbox.c
M3_SDK\uboot\common\main.c

首先在m3_mbox.h文件中修改如下:红色部分代码

#define CONFIG_CMD_USB
#define CONFIG_CMD_FAT
#define JZBY_RECOVERY_BACK_FAC
#define CONFIG_NET_CLK_EXTERNAL//use external 50MHz clock source
#define CONFIG_CMD_NET
......
......
#define CONFIG_EXTRA_ENV_SETTINGS \
......
......
    "nandargs=setenv bootargs androidboot.resolution=${outputmode} hdmitx=${outputmode} init=/init console=ttyS0,115200n8 nohlt logo=osd1,0x84100000,loaded,${outputmode} a9_clk=600M clk81=187000000 mem=1024m mac=${ethaddr}\0"\
    "mmcargs=setenv bootargs androidboot.resolution=${outputmode} hdmitx=${outputmode} init=/init console=ttyS0,115200n8 nohlt logo=osd1,0x84100000,loaded,${outputmode} a9_clk=600M clk81=187000000 mem=1024m mac=${ethaddr}\0"\
    "nandboot=run mmcboot\0"\
    "mmcboot=run isfile_update; run mmcargs;mmcinfo;mmc read 1 ${loadaddr} ${normal_start} ${normal_size};bootm ${loadaddr}\0"\
    "recoveryboot=echo Enter recovery mode...;mmcinfo;fatload mmc 0 ${loadaddr} ${recovery_path};bootm ${loadaddr}\0"\
        "recoverybootforce=echo Enter recovery fore mode...;mmcinfo;fatload mmc 0:1 82000000 uImage_recovery;bootm\0"\
   "recoveryfacbackup=echo Enter recovery facbackup mode...;mmcinfo;mmc read 1 ${loadaddr} ${recovery_start} ${recovery_size};bootm ${loadaddr}\0"\
    "bootloader_start=0\0" \
    "bootloader_size=60000\0" \
    "bootloader_path=u-boot-aml-ucl.bin\0" \
    "normal_name=boot\0" \
    "normal_start=0x2000000\0" \
    "normal_size=0x1000000\0" \
    "recovery_name=recovery\0" \
    "recovery_start=0x1000000\0" \
    "recovery_size=0x1000000\0" \
......
......
......
    
第一句话意思是加入一个宏控制,方便以后屏蔽代码。
第二句话的意思是加入了一个简便的输入方法,以前在uboot下面要输入echo Enter recovery facbackup mode...;mmcinfo;mmc read 1 ${loadaddr} ${recovery_start} ${recovery_size};bootm ${loadaddr}}\0 这么长一段的代码,现在可以只输入一句run recoveryfacbackup就能搞定。也可以在uboot里面的函数中使用run_command ("命令", 0);即可。不过现在函数中没有用,主要是为了在命令行模拟咱们的reset按键,偷懒输命令加了一行。是不是发现做技术的越懒越精。
这句话的意思是mmcinfo挂载sd卡,mmc read 1 ${loadaddr} ${recovery_start} ${recovery_size}从flash里面把recovery系统读出来,放到内存里面,bootm ${loadaddr}}\0 的意思是从内存的loadaddr启动系统,也就是刚刚考入的recovery系统。


在m3_mbox.c文件中加入如下红色部分代码

#ifdef CONFIG_AML_TINY_USBTOOL
int usb_get_update_result(void)
{
......
......
......
}
#endif
#ifdef JZBY_RECOVERY_BACK_FAC
int reset_boot_mode_check(void)
{
    unsigned long hold_time = 50000, polling_time = 10000, tmp;
    unsigned long upgrade_step;
    printf("JZBY reset mode check...\n");  
    clrbits_le32(P_PREG_PAD_GPIO2_EN_N, (1<<25));     // VCC5V_EN GPIOD_9
    setbits_le32(P_PREG_PAD_GPIO2_O, (1<<25));
#ifdef CONFIG_SARADC    
    saradc_enable();
#endif    
    //added by Elvis for added fool idle
    get_key();
    get_key();    
    while(hold_time > 0)
    {
        udelay(polling_time);
        tmp = get_key();
        printf("get_key(): %d\n", tmp);
        if(!tmp)  break;
        hold_time -= polling_time;
    }
    if(hold_time > 0)
    {
        printf("Normal Start...\n");
        return    1;
    }
    else
    {
        display_messge("echo Enter recovery facbackup mode...");
        if(upgrade_bootloader())
        {
            run_command ("set upgrade_step 1", 0);
            run_command ("save", 0);
            run_command ("reset", 0);
            hang();
        }
        run_command ("set upgrade_step 2", 0);
        run_command ("save", 0);
        into_recovery();
    }
return    0;
}
#endif

int switch_boot_mode(void)
{
......
......
......

这些话的作用就一个,检测按键消息,收到按键跳入recovery机制更新系统。


在main.c文件中加入如下红色部分代码


/****************************************************************************/

void main_loop (void)
{
#ifndef CONFIG_SYS_HUSH_PARSER
    static char lastcommand[CONFIG_SYS_CBSIZE] = { 0, };
    int len;
    int rc = 1;
    int flag;
#endif
......
......
......
//added by Elvis
#ifdef CONFIG_SWITCH_BOOT_MODE
switch_boot_mode();
#endif
......
......
......
#ifdef CONFIG_LOGDISPLAY
       s = getenv ("logdisplaycmd");
       run_command (s, 0);
#endif
        s = getenv ("bootcmd");

    debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "<UNDEFINED>");
#ifdef JZBY_RECOVERY_BACK_FAC
    reset_boot_mode_check();
#endif

    if (bootdelay >= 0 && s && !abortboot (bootdelay)) {
# ifdef CONFIG_AUTOBOOT_KEYED
        int prev = disable_ctrlc(1);    /* disable Control C checking */
# endif
.......
.......
.......
}

这句加入的功能就更简单了,recovery主任务中加入reset_boot_mode_check()函数。
另外根据当事人郝丽的描述,还要修改M3_SDK\reset\uboot\include\configs\amlogic\m3_mbox.h下面有一句//#define CONFIG_SARADC   1是注释掉的,需要打开否则监控不到reset按键。


2)MX

由于MX没有reset的按键,所以以下MX对应的uboot修改纯属个人YY有兴趣的可以和平台组蒋大拿讨论研究,他可是来者不拒哈!
对于MX的系统也需要修改如下三个文件0801版本,视频基地版本修改文件路径和m3基本类似
MX_SDK\uboot\include\configs\customer\m6_mbx_v1.h
M3_SDK\uboot\customer\board\m6_mbx_v1\m6_mbx_v1.c
M3_SDK\uboot\common\main.c

首先确定uboot到底难过的是哪个c文件,通过uboot编译命令即可确认,0801版本上用到的uboot编译命令是,make m6_mbx_v1_config。所以很显然就是m6_mbx_v1.c.
对于m6_mbx_v1.h的修改为

#define CONFIG_UCL 1
#define CONFIG_SELF_COMPRESS
#define JZBY_RECOVERY_BACK_FAC
#define CONFIG_IMPROVE_UCL_DEC   1
......
#ifdef CONFIG_SPI_NAND_EMMC_COMPATIBLE
#define CONFIG_EXTRA_ENV_SETTINGS \
    "mmc_logo_offset=0x24000\0" \
    ......
    "mmc_recovery=echo enter recovery;run vdacswitchconfig;run mmcargs;if mmcinfo; then if fatload mmc 0 ${loadaddr} recovery.img; then bootm;fi;fi; if usb start; then if fatload usb 0 ${loadaddr} recovery.img; then bootm;fi;fi; mmcinfo 1; mmc read 1 ${loadaddr} ${mmc_recovery_offset} ${mmc_lk_size}; bootm\0" \
    "recoveryfacbackup=mmcinfo 1; mmc read 1 ${loadaddr} ${mmc_recovery_offset} ${mmc_lk_size}; bootm\0" \
......

在m6_mbx_v1.c中的修改下:加入如下语句
#ifdef JZBY_RECOVERY_BACK_FAC
int reset_boot_mode_check(void)
{
    unsigned long hold_time = 50000, polling_time = 10000, tmp;
    unsigned long upgrade_step;
    printf("JZBY reset mode check...\n");
   
    clrbits_le32(P_PREG_PAD_GPIO2_EN_N, (1<<25));     // VCC5V_EN GPIOD_9
    setbits_le32(P_PREG_PAD_GPIO2_O, (1<<25));
#ifdef CONFIG_SARADC    
    saradc_enable();
#endif    
    //added by Elvis for added fool idle
    get_key();
    get_key();    
    while(hold_time > 0){
        udelay(polling_time);
        tmp = get_key();
        printf("get_key(): %d\n", tmp);
        if(!tmp)  break;
        hold_time -= polling_time;
    }
    if(hold_time > 0){
        printf("Normal Start...\n");
        return    1;
    }else{
        run_command ("set upgrade_step 2", 0);
        run_command ("save", 0);
        run_command ("mmcinfo 1; mmc read 1 ${loadaddr} ${mmc_recovery_offset} ${mmc_lk_size}; bootm", 0);
    }
    return    0;
}
#endif

main.c的修改与m3一样,也是在void main_loop (void)函数中加入调用reset_boot_mode_check()函数即可。

7. 修改过程中遇到过的问题

1,做了步骤二后一直mount不上,追查后,蒋大拿给我的解释如下。

一般的系统目录如下:
system   cache    tmp   data   ..........
他们可能属于不同的文件系统。
文件系统又分为fat,ntfs,yaffs,ext,ext2,ext3,ext4
格式化可以按照任意一个系统文件类型格式化,格式化后该设备内容变为执行格式化的文件系统类型。
挂载是指分区后块设备需要挂载在文件系统的某个文件夹下面才能被文件系统访问到。挂载时参数中有挂载的设备类型,务必要与需要挂载的设备文件类型相同,挂载命令会检查此项。如果文件类型不匹配会出现挂载不上的问题。
增加了分区后以前系统在该分区里面可能也放了一些东西,或者文件系统不一样。导致系统启动挂载时无法识别该设备文件系统类型,从而挂在不上。此时需要格式化该设备,之后就可以挂载了。由于我们的系统命令不支持ext4格式化,所以用ext2代替,他们基本通用。之后挂载,就没有问题了。一次格式化之后,以后就不用了,从新烧写系统也能识别挂载了。命令是:busybox mkfs.ext2 /dev/block/facbackup
另外大拿还说要是我们直接把系统制作成启动盘就可以不用格式化,因为启动盘在启动机顶盒之前会先格式化整个机顶盒,在挂载的时候,虽然也是首次增加的分区,但是由于之前格式化过,就算文件系统类型不同,在挂载时发现文件系统不对应,而且设备是空的,系统会自动格式化为相应的挂载类型,以实现挂载。

2, 要是生产版本还要在burner下面加一些配置。修改如下,我们普通的验证版本可以不加这些修改。

m3版本
修改文件
M3_SDK\burner\570\create_img.sh
M3_SDK\burner\570\partitions.txt
M3_SDK\burner\570\summary.txt

在create_img.sh增加如下红色字体
#!/bin/bash
echo "============= Start generating emmc image ========"
echo
......
echo "Generate facbackup.img"
mkdir data
./make_ext4fs -l 384M -a data ./facbackup.img ./facbackup
echo

......
./mkemmcimg -v -t partitions.txt -b u-boot-aml-ucl.bin -e env.bin
rm system.img userdata.img facbackup.img cache.img cache.img.data sd.img
......

在partitions.txt中增加如下红色字体
0x000000000000-0x000000080000 : "bootloader" u-boot-aml-ucl.bin
0x000000080000-0x000000088000 : "ubootenv" env.bin
0x000000800000-0x000001000000 : "aml_logo" aml_logo.img
0x000001000000-0x000002000000 : "recovery" uImage_recovery
0x000002000000-0x000003000000 : "boot" boot.img
0x000003000000-0x000035000000 : "system" system.img
0x000035000000-0x000055000000 : "cache" cache.img
0x000055000000-0x000095000000 : "userdata" userdata.img
0x000095000000-0x0000aD000000 : "facbackup" facbackup.img
0x0000aD000000-0x0000EBFC0000 : "NFTL_Part" -
在summary.txt中会自动生成红的那一行代码,刘冉那货说这个summary.txt文件是自动生成的,要是生成不了,就自己添加吧。
mkemmcimg version v1.1(Nov 20 2013)
partition table         : partitions.txt
boot file               : u-boot-aml-ucl.bin
partition found: bootloader (u-boot-aml-ucl.bin) 0x0-0x80000
partition found: ubootenv (env.bin) 0x80000-0x88000
partition found: aml_logo (aml_logo.img) 0x800000-0x1000000
partition found: recovery (uImage_recovery) 0x1000000-0x2000000
partition found: boot (boot.img) 0x2000000-0x3000000
partition found: system (system.img) 0x3000000-0x35000000
partition found: cache (cache.img) 0x35000000-0x55000000
partition found: userdata (userdata.img) 0x55000000-0x95000000
partition found: facbackup (facbackup.img) 0x95000000-0xad000000
partition found: NFTL_Part (-) 0xad000000-0xebfc0000


3,在facbackup分区中的aml修改


此时配置文件需要修改为如下:
--wipe_media
--wipe_data
--wipe_cache
--update_package=/facbackup/g18ref-ota-20140526.V0801_ykai.zip






0 0
原创粉丝点击