blob: d02784fab5fe178d6324de7e79fedef2ee84d856 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 __SYS_FCB2_PRIV_H_
#define __SYS_FCB2_PRIV_H_
#ifdef __cplusplus
extern "C" {
#endif
#define FCB2_TMP_BUF_SZ 32
#define FCB2_ID_GT(a, b) (((int16_t)(a) - (int16_t)(b)) > 0)
struct fcb2_disk_area {
uint32_t fd_magic;
uint8_t fd_ver;
uint8_t _pad;
uint16_t fd_id;
};
struct fcb2_sector_info {
struct flash_sector_range *si_range; /* Sector range */
uint32_t si_sector_offset; /* Sector offset in fcb */
uint16_t si_sector_in_range; /* Sector number relative to si_range */
};
static inline int
fcb2_len_in_flash(const struct flash_sector_range *range, uint16_t len)
{
if (range->fsr_align <= 1) {
return len;
}
return (len + (range->fsr_align - 1)) & ~(range->fsr_align - 1);
}
int fcb2_getnext_in_area(struct fcb2 *fcb, struct fcb2_entry *loc);
static inline int
fcb2_getnext_sector(struct fcb2 *fcb, int sector)
{
if (++sector >= fcb->f_sector_cnt) {
sector = 0;
}
return sector;
}
int fcb2_getnext_nolock(struct fcb2 *fcb, struct fcb2_entry *loc);
int fcb2_elem_info(struct fcb2_entry *loc);
int fcb2_elem_crc16(struct fcb2_entry *loc, uint16_t *c16p);
int fcb2_sector_hdr_init(struct fcb2 *fcb, int sector, uint16_t id);
int fcb2_entry_location_in_range(const struct fcb2_entry *loc);
struct flash_sector_range *fcb2_get_sector_range(const struct fcb2 *fcb,
int sector);
int fcb2_sector_hdr_read(struct fcb2 *, struct flash_sector_range *srp,
uint16_t sec, struct fcb2_disk_area *fdap);
/**
* Finds sector range for given fcb sector.
*/
struct flash_sector_range *fcb2_get_sector_range(const struct fcb2 *fcb,
int sector);
/**
* @brief Get information about sector from fcb.
*
* @param fcb fcb to check sector
* @param sector fcb sector number
* sector can be specified as FCB2_SECTOR_OLDEST.
* @param info pointer to structure that will receive sector information
*
* @return 0 if sector information was extracted correctly
* FCB2_ERR_ARGS if sector number was outside fcb range.
*/
int fcb2_get_sector_info(const struct fcb2 *fcb, int sector,
struct fcb2_sector_info *info);
/**
* @brief Write data to fcb sector.
*
* @param loc location of the sector from fcb2_get_sector_loc().
* @param off offset from the beginning of the sector to start write
* @param buf pointer to data to be written
* @param len number of bytes to write to the fcb sector
*
* @return 0 if write was successful non zero otherwise.
*/
int fcb2_write_to_sector(struct fcb2_entry *loc, int off,
const void *buf, int len);
/**
* @brief Read data from fcb sector.
*
* @param loc location of the sector from fcb2_get_sector_loc().
* @param off offset from the beginning of the sector to start read
* @param buf pointer to output buffer
* @param len number of bytes to read from the fcb sector
*
* @return 0 if read was successful non zero otherwise.
*/
int fcb2_read_from_sector(struct fcb2_entry *loc, int off, void *buf, int len);
#ifdef __cplusplus
}
#endif
#endif