3 #include <linux/types.h>
4 #include <asm/arch/bits.h>
6 #include <linux/string.h>
7 #include <android_bootimg.h>
8 #include <linux/mtd/mtd.h>
9 #include <linux/mtd/nand.h>
11 #include <android_boot.h>
12 #include <environment.h>
13 #include <jffs2/jffs2.h>
14 #include <boot_mode.h>
15 #include <android_recovery.h>
17 #include <asm/byteorder.h>
20 #include "asm/arch/sci_types.h"
25 #define dprintf(fmt, args...) printf(fmt, ##args)
27 static const int MISC_COMMAND_PAGE = 1; // bootloader command is this page
28 static char buf[8192];
32 int get_recovery_message(struct recovery_message *out)
38 struct mtd_info *nand;
39 struct mtd_device *dev;
40 struct part_info *part;
44 ret = mtdparts_init();
46 dprintf("mtdparts init error %d\n", ret);
50 ret = find_dev_and_part("misc", &dev, &pnum, &part);
52 dprintf("No partiton named %s found\n", "misc");
54 }else if(dev->id->type != MTD_DEV_TYPE_NAND){
55 printf("Partition %s not a NAND device\n", "misc");
59 nand = &nand_info[dev->id->num];
60 pagesize = nand->writesize;
62 offset = pagesize * MISC_COMMAND_PAGE + part->offset;
64 ret = nand_read_skip_bad(nand, offset, &size, (void *)buf);
66 printf("function: %s nand read error %d\n", __FUNCTION__, ret);
70 memcpy(out, buf, sizeof(*out));
74 int set_recovery_message(const struct recovery_message *in)
80 struct mtd_info *nand;
81 struct mtd_device *dev;
82 struct part_info *part;
86 ret = mtdparts_init();
88 dprintf("mtdparts init error %d\n", ret);
92 ret = find_dev_and_part("misc", &dev, &pnum, &part);
94 dprintf("No partiton named %s found\n", "misc");
96 }else if(dev->id->type != MTD_DEV_TYPE_NAND){
97 dprintf("Partition %s not a NAND device\n", "misc");
101 nand = &nand_info[dev->id->num];
102 pagesize = nand->writesize;
104 size = pagesize*(MISC_COMMAND_PAGE + 1);
106 ret = nand_read_skip_bad(nand, part->offset, &size, (void *)SCRATCH_ADDR);
108 dprintf("%s: nand read error %d\n", __FUNCTION__, ret);
113 offset = SCRATCH_ADDR;
114 offset += (pagesize * MISC_COMMAND_PAGE);
115 memcpy(offset, in, sizeof(*in));
117 nand_erase_options_t opts;
118 memset(&opts, 0, sizeof(opts));
119 opts.offset = part->offset;
120 opts.length = pagesize *(MISC_COMMAND_PAGE + 1);
124 ret = nand_erase_opts(nand, &opts);
126 dprintf("%s, nand erase error %d\n", __FUNCTION__, ret);
129 ret = nand_write_skip_bad(nand, part->offset, &size, (void *)SCRATCH_ADDR);
131 dprintf("%s, nand erase error %d\n", __FUNCTION__, ret);