/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * * Utility for ChromeOS-specific GPT partitions, Please see corresponding .c * files for more details. */ #include "flash_ts.h" #include "cgpt.h" #include "errno.h" #include "stdio.h" #include "string.h" inline int page_to_sector(const nand_geom *nand, int page) { return page * (nand->szofpg / nand->szofsector); } int nand_read_page(const nand_geom *nand, int page, void *buf, int size) { uint8_t *page_buff; if (Load((struct drive *)nand->user, &page_buff, page_to_sector(nand, page), nand->szofsector, (size + nand->szofsector - 1) / nand->szofsector)) { // page may be not erased. return default data. memset(buf, 0xff, size); return 0; } memcpy(buf, page_buff, size); free(page_buff); return 0; } int nand_write_page(const nand_geom *nand, int page, const void *buf, int buf_size) { void *page_buff; int ret; int sectors = (buf_size + nand->szofsector - 1) / nand->szofsector; int size = nand->szofsector * sectors; page_buff = malloc(size); if (!page_buff) return -1; memset(page_buff, 0xff, size); memcpy(page_buff, buf, buf_size); ret = Save((struct drive *)nand->user, page_buff, page_to_sector(nand, page), nand->szofsector, sectors); free(page_buff); return ret; } int nand_erase_block(const nand_geom *nand, int block) { int sector = block * (nand->szofblk / nand->szofsector); int res; void *erase_buff = malloc(nand->szofblk); if (!erase_buff) return -1; memset(erase_buff, 0xff, nand->szofblk); res = Save((struct drive *)nand->user, erase_buff, sector, nand->szofsector, nand->szofblk / nand->szofsector); free(erase_buff); return res; } int nand_is_bad_block(const nand_geom *nand, int block) { return 0; }