4c5f9f3416
hboot will apparently fail to install if the first block of the image (the one pointed to by the offset in the block 0 header) is a bad block. (Hopefully it handles subsequent bad blocks.) This change makes the MTD write code keep track of the bad blocks it has skipped over, so that the offset in the header can be adjusted to be the address of the first successfully written block. Change-Id: I45d58e32a36d0c1dbc0a7f871bd5985b6c8ff524 http://b/2358012 - passion: failure to flash hboot (bad blocks?)
56 lines
1.9 KiB
C
56 lines
1.9 KiB
C
/*
|
|
* Copyright (C) 2007 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef MTDUTILS_H_
|
|
#define MTDUTILS_H_
|
|
|
|
#include <sys/types.h> // for size_t, etc.
|
|
|
|
typedef struct MtdPartition MtdPartition;
|
|
|
|
int mtd_scan_partitions(void);
|
|
|
|
const MtdPartition *mtd_find_partition_by_name(const char *name);
|
|
|
|
/* mount_point is like "/system"
|
|
* filesystem is like "yaffs2"
|
|
*/
|
|
int mtd_mount_partition(const MtdPartition *partition, const char *mount_point,
|
|
const char *filesystem, int read_only);
|
|
|
|
/* get the partition and the minimum erase/write block size. NULL is ok.
|
|
*/
|
|
int mtd_partition_info(const MtdPartition *partition,
|
|
size_t *total_size, size_t *erase_size, size_t *write_size);
|
|
|
|
/* read or write raw data from a partition, starting at the beginning.
|
|
* skips bad blocks as best we can.
|
|
*/
|
|
typedef struct MtdReadContext MtdReadContext;
|
|
typedef struct MtdWriteContext MtdWriteContext;
|
|
|
|
MtdReadContext *mtd_read_partition(const MtdPartition *);
|
|
ssize_t mtd_read_data(MtdReadContext *, char *data, size_t data_len);
|
|
void mtd_read_close(MtdReadContext *);
|
|
|
|
MtdWriteContext *mtd_write_partition(const MtdPartition *);
|
|
ssize_t mtd_write_data(MtdWriteContext *, const char *data, size_t data_len);
|
|
off_t mtd_erase_blocks(MtdWriteContext *, int blocks); /* 0 ok, -1 for all */
|
|
off_t mtd_find_write_start(MtdWriteContext *ctx, off_t pos);
|
|
int mtd_write_close(MtdWriteContext *);
|
|
|
|
#endif // MTDUTILS_H_
|