3 #include <linux/types.h>
4 #include <linux/string.h>
6 #include <jffs2/jffs2.h>
10 #ifdef CONFIG_EMMC_BOOT
11 #include "../disk/part_uefi.h"
12 #include "../drivers/mmc/card_sdio.h"
16 extern int ext4_read_content(int dev, wchar_t* partition_name, const char *filename, void *buf, int offset, int len);
19 int do_fs_file_read(char *mpart, char *filenm, void *buf, int len)
26 part = malloc(sizeof(wchar_t)*(strlen(mpart)+1));
30 while ((*tmp++ = *mpart++) != '\0')
32 ret = ext4_read_content(mmc_dev,
36 0,/*not support non-zero offset*/
39 #elif defined(CONFIG_FS_UBIFS)
40 static int is_ubifs_init = 0;
41 if(is_ubifs_init == 0){
46 ret = ubifs_mount(mpart);
48 printf("do_fs_file_read:mount %s failed!\n",mpart);
51 ret = ubifs_load(filenm, buf, len);
53 printf("do_fs_file_read:file %s not found!\n", filenm);
58 int do_fs_file_write(char *mpart, char *filenm, void *buf, int len)
60 /*do not write in uboot now*/
64 int do_raw_data_read(char *part, u32 size, u32 off, char *buf)
67 #ifdef CONFIG_EMMC_BOOT
68 u16 offp=0, len=0, left=0;
72 wchar_t *partition=NULL;
74 disk_partition_t info;
75 block_dev_desc_t *dev = NULL;
80 dev = get_dev("mmc", 1);
82 printf("get mmc dev failed!\n");
86 partition = malloc(sizeof(wchar_t)*(strlen(part)+1));
90 while ((*tmp++ = *part++) != '\0');
92 offp = off%EMMC_SECTOR_SIZE;
95 len = EMMC_SECTOR_SIZE - offp;
98 nsct = size/EMMC_SECTOR_SIZE;
99 left = size%EMMC_SECTOR_SIZE;
102 sctbuf = malloc(EMMC_SECTOR_SIZE);
109 if(get_partition_info_by_name(dev, partition, &info))
112 cursct = info.start + off/EMMC_SECTOR_SIZE;
113 //read first unaligned data
115 if(!Emmc_Read(PARTITION_USER, cursct, 1, (uint8 *)sctbuf))
118 memcpy(bufwp,sctbuf+offp,len);
121 //read sector aligned data
123 if(!Emmc_Read(PARTITION_USER, cursct, nsct, (uint8 *)bufwp))
128 //read last unaligned data
130 if(!Emmc_Read(PARTITION_USER, cursct, 1, (uint8 *)sctbuf))
132 memcpy(bufwp,sctbuf,left);
137 printf("do_raw_data_read: wanted size :0x%x, real 0x%x\n",size+len,bufwp-buf);
143 struct ubi_volume_desc *vol;
145 ubi_dev = nand_ubi_dev_init();
147 printf("do_raw_data_read: ubi init failed.\n");
150 vol = ubi_open_volume_nm(ubi_dev, part, UBI_READONLY);
152 printf("cannot open \"%s\", error %d",
153 part, (int)PTR_ERR(vol));
157 if(size != uboot_ubi_read(vol, buf, off, size))
158 printf("%s: read vol %s failed!\n",__func__,part);
162 ubi_close_volume(vol);
165 printf("do_raw_data_read error.\n");
169 int do_raw_data_write(char *part, u32 updsz, u32 size, u32 off, char *buf)
172 #ifdef CONFIG_EMMC_BOOT
179 size_t length,wlen=0;
180 struct mtd_device *dev;
181 struct mtd_info *nand;
182 struct part_info *mtdpart;
183 struct ubi_volume_desc *vol;
184 nand_erase_options_t opts;
187 ret = find_dev_and_part(part, &dev, &pnum, &mtdpart);
190 else if (dev->id->type != MTD_DEV_TYPE_NAND)
193 offset = mtdpart->offset+off;
195 nand = &nand_info[dev->id->num];
196 memset(&opts, 0x0, sizeof(opts));
197 opts.offset = offset;
198 opts.length = length;
202 ret = nand_erase_opts(nand, &opts);
204 printf("erase %s failed.\n",part);
207 //write spl part with header
208 if(strcmp(part, "spl")==0){
209 ret = sprd_nand_write_spl(buf, nand);
213 while((size != wlen) && (i++<0xff)) {
214 ret = nand_write_skip_bad(nand, offset, &length, buf);
220 //mark a block as badblock
221 printf("nand write error %d, mark bad block 0x%llx\n",ret,offset&~(nand->erasesize-1));
222 nand->block_markbad(nand,offset &~(nand->erasesize-1));
228 ubi_dev = nand_ubi_dev_init();
230 printf("do_raw_data_write: ubi init failed.\n");
233 vol = ubi_open_volume_nm(ubi_dev, part, UBI_READWRITE);
235 printf("cannot open \"%s\", error %d",
236 part, (int)PTR_ERR(vol));
240 //set total size to be updated in this volume
242 ret = ubi_start_update(vol->vol->ubi, vol->vol, updsz);
244 printf("Cannot start volume %s update\n",part);
249 ret = ubi_more_update_data(vol->vol->ubi, vol->vol, buf, size);
251 printf("Couldnt write data in volume %s\n",part);
255 ubi_close_volume(vol);
260 printf("do_raw_data_write error.\n");