tizen 2.4 release
[kernel/u-boot-tm1.git] / property / recv_nand_mode.c
1 #include <config.h>
2 #include <common.h>
3 #include <linux/types.h>
4 #include <asm/arch/bits.h>
5 #include <image.h>
6 #include <linux/string.h>
7 #include <android_bootimg.h>
8 #include <linux/mtd/mtd.h>
9 #include <linux/mtd/nand.h>
10 #include <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>
16 #include <fat.h>
17 #include <asm/byteorder.h>
18 #include <part.h>
19 #include <mmc.h>
20 #include "asm/arch/sci_types.h"
21
22 #ifdef dprintf
23 #undef dprintf
24 #endif
25 #define dprintf(fmt, args...) printf(fmt, ##args)
26
27 static const int MISC_COMMAND_PAGE = 1;         // bootloader command is this page
28 static char buf[8192];
29
30
31
32 int get_recovery_message(struct recovery_message *out)
33 {
34         loff_t offset = 0;
35         unsigned pagesize;
36         size_t size;
37
38         struct mtd_info *nand;
39         struct mtd_device *dev;
40         struct part_info *part;
41         u8 pnum;
42         int ret;
43
44         ret = mtdparts_init();
45         if(ret != 0){
46                 dprintf("mtdparts init error %d\n", ret);
47                 return -1;
48         }
49
50         ret = find_dev_and_part("misc", &dev, &pnum, &part);
51         if(ret){
52                 dprintf("No partiton named %s found\n", "misc");
53                 return -1;
54         }else if(dev->id->type != MTD_DEV_TYPE_NAND){
55         printf("Partition %s not a NAND device\n", "misc");
56         return -1;
57     }
58
59         nand = &nand_info[dev->id->num];
60         pagesize = nand->writesize;
61
62         offset = pagesize * MISC_COMMAND_PAGE + part->offset;
63         size = pagesize;
64         ret = nand_read_skip_bad(nand, offset, &size, (void *)buf);
65         if(ret != 0){
66                 printf("function: %s nand read error %d\n", __FUNCTION__, ret);
67                 return -1;
68         }
69
70         memcpy(out, buf, sizeof(*out));
71         return 0;
72 }
73
74 int set_recovery_message(const struct recovery_message *in)
75 {
76         loff_t offset = 0;
77         unsigned pagesize;
78         size_t size;
79
80         struct mtd_info *nand;
81         struct mtd_device *dev;
82         struct part_info *part;
83         u8 pnum;
84         int ret;
85
86         ret = mtdparts_init();
87         if(ret != 0){
88                 dprintf("mtdparts init error %d\n", ret);
89                 return -1;
90         }
91
92         ret = find_dev_and_part("misc", &dev, &pnum, &part);
93         if(ret){
94                 dprintf("No partiton named %s found\n", "misc");
95                 return -1;
96         }else if(dev->id->type != MTD_DEV_TYPE_NAND){
97                 dprintf("Partition %s not a NAND device\n", "misc");
98                 return -1;
99         }
100
101         nand = &nand_info[dev->id->num];
102         pagesize = nand->writesize;
103
104         size = pagesize*(MISC_COMMAND_PAGE + 1);
105
106         ret = nand_read_skip_bad(nand, part->offset, &size, (void *)SCRATCH_ADDR);
107         if(ret != 0){
108                 dprintf("%s: nand read error %d\n", __FUNCTION__, ret);
109                 return -1;
110         }
111
112
113         offset = SCRATCH_ADDR;
114         offset += (pagesize * MISC_COMMAND_PAGE);
115         memcpy(offset, in, sizeof(*in));
116
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);
121         opts.jffs2 = 0;
122         opts.scrub = 0;
123         opts.quiet = 1;
124         ret = nand_erase_opts(nand, &opts);
125         if(ret != 0){
126                 dprintf("%s, nand erase error %d\n", __FUNCTION__, ret);
127                 return -1;
128         }
129         ret = nand_write_skip_bad(nand, part->offset, &size, (void *)SCRATCH_ADDR);
130         if(ret != 0){
131                 dprintf("%s, nand erase error %d\n", __FUNCTION__, ret);
132                 return -1;
133         }
134
135 }