/* * Copyright (c) Hisilicon Technologies Co., Ltd. 2020-2020. All rights reserved. * Description: IAPI head file for flash * Author: Hisilicon * Create: 2020-10-15 */ #ifndef __UAPI_FLASH__H__ #define __UAPI_FLASH__H__ #include "td_type.h" #ifdef __cplusplus #if __cplusplus extern "C" { #endif #endif /* __cplusplus */ #define FLASH_NAME_LEN 32 /* Flash Name max length */ #define INVALID_FD (-1) /* Read and write without OOB, for example: kernel/uboot/ubi/cramfs.. */ #define UAPI_FLASH_RW_FLAG_RAW (0x0) /* Read and write with OOB, example: yaffs2 file system image */ #define UAPI_FLASH_RW_FLAG_WITH_OOB (0x1) /* Erase before write */ #define UAPI_FLASH_RW_FLAG_ERASE_FIRST (0x2) /* This macro for return value when nand flash have bad block or valid length * less partition length. * CNcomment: 当nand有坏块时,读/写/擦除时,有效长度可能小于分区大小/打开长度,此时 * 为了不越界,读/写/擦除完有效长度后,返回该值。 CNend */ #define UAPI_FLASH_END_DUETO_BADBLOCK (-10) /* flash type */ typedef enum { UAPI_FLASH_TYPE_AUTO = 0x0, /* Auto flash type */ UAPI_FLASH_TYPE_NOR_0 = 0x1, /* SPI NOR flash type */ UAPI_FLASH_TYPE_NAND_0 = 0x4, /* NAND flash type */ UAPI_FLASH_TYPE_EMMC_0 = 0x8, /* eMMC flash type */ UAPI_FLASH_TYPE_UFS_0 = 0xC, /* UFS flash type */ UAPI_FLASH_TYPE_MAX /* Invalid flash type */ } uapi_flash_type; typedef enum { RD = 0x01, WR = 0x02 } pmode_t; /* Flash partition access permission type */ typedef enum { ACCESS_NONE = 0, ACCESS_RD = (1 << RD), ACCESS_WR = (1 << WR), ACCESS_RDWR = (ACCESS_RD | ACCESS_WR), ACCESS_BUTT } uapi_flash_access_perm; /* * struct uapi_flash_partinfo - Flash partition descriptions * @start_addr: Partiton start address * @part_size: Partition size * @dev_name: The device node name where this partition * @part_name: The partition name of this partition * @perm: The partition access permission type */ typedef struct { td_u64 start_addr; td_u64 part_size; td_char dev_name[FLASH_NAME_LEN]; td_char part_name[FLASH_NAME_LEN]; uapi_flash_access_perm perm; } uapi_flash_partinfo; /* * struct uapi_flash_info - flash information * @total_size: flash total size * @part_number: flash partition number * @block_size: flash block size * @page_size: flash page size * @oob_size: flash OOB size * @open_addr: flash open address * @open_len: flash open length * @flash_type: flash type * @part_info: partition descriptions on this flash */ typedef struct { td_u64 total_size; td_u64 part_number; td_u64 open_addr; td_u64 open_len; td_u32 block_size; td_u32 page_size; td_u32 oob_size; uapi_flash_type flash_type; uapi_flash_partinfo *part_info; } uapi_flash_info; /* * Brief: Open flash partition by type and name * Note: partition name for spi/nand, use '/dev/mtdx' as partition name; use * '/dev/mmcblk0px' as partion name for EMMC * CNcomment: 非EMMC器件(如SPI/NAND),只能用/dev/mtdx作为分区名。EMMC器件只 * 能用/dev/mmcblk0px作为分区名。 * attention N/A * param[in] flash_type Flash type CNcomment: flash类型 CNend * param[in] partition_name Partition name CNcomment: 分区名 CNend * retval :td_handle Success. CNcomment:打开成功的flash句柄 CNend * retval :INVALID_FD Failed. CNcomment:失败 CNend * see N/A */ td_handle uapi_flash_open(uapi_flash_type flash_type, const td_char *partition_name); /* * Brief: Open flash partition by type and name * Note: partition name for spi/nand, use '/dev/mtdx' as partition name; use * '/dev/mmcblk0px' as partion name for EMMC * CNcomment: 非EMMC器件(如SPI/NAND),只能用/dev/mtdx作为分区名。EMMC器件只 * 能用/dev/mmcblk0px作为分区名。 * attention N/A * param[in] flash_type Flash type CNcomment: flash类型 CNend * param[in] address Address offset CNcomment: 地址偏移位置 CNend * param[in] len Open length CNcomment: 操作flash的长度 CNend * retval :td_handle Success. CNcomment:打开成功的flash句柄 CNend * retval :INVALID_FD Failed. CNcomment:失败 CNend * see N/A */ td_handle uapi_flash_open_by_addr(uapi_flash_type flash_type, td_u64 address, td_u64 len); /* * Brief: Close opend flash handle * Note: partition name for spi/nand, use '/dev/mtdx' as partition name; use * '/dev/mmcblk0px' as partion name for EMMC * CNcomment: 非EMMC器件(如SPI/NAND),只能用/dev/mtdx作为分区名。EMMC器件只 * 能用/dev/mmcblk0px作为分区名。 * attention N/A * param[in] handle Flash handle CNcomment: flash句柄 CNend * retval :TD_SUCCESS Success. CNcomment:成功 CNend * retval :TD_FAILURE Failed. CNcomment:失败 CNend * see N/A */ td_s32 uapi_flash_close(td_handle handle); /* * Brief: Erase Flash partition * CNcomment: 擦除Flash分区 * attention N/A * param[in] handle Flash handle CNcomment: flash句柄 CNend * param[in] offset Address offset CNcomment: 地址偏移位置 CNend * param[in] len Erase length CNcomment: 擦除flash的长度 CNend * retval :TotalErase Erase total length. CNcomment:成功擦除的长度 CNend * retval :TD_FAILURE Failed. CNcomment:失败 CNend * see N/A */ td_s64 uapi_flash_erase(td_handle handle, td_u64 offset, td_u64 len); /* * Brief: Read data from flash * CNcomment: 从Flash读数据 * attention N/A * param[in] handle Flash handle CNcomment: flash句柄 CNend * param[in] offset Address offset CNcomment: 地址偏移位置 CNend * param[in] buf Data buffer pointer CNcomment: 读数据的buffer指针 CNend * param[in] len Read length CNcomment: 读flash的长度 CNend * param[in] flags Read flags, OOB flag use UAPI_FLASH_RW_FLAG_WITH_OOB if data * includes OOB data * CNcomment: 读flash的标志位,可取值 UAPI_FLASH_RW_FLAG_WITH_OOB, * 表示数据内容是否带 OOB 区 CNend * retval :TotalRead Read total length. CNcomment:成功读取的长度 CNend * retval :TD_FAILURE Failed. CNcomment:失败 CNend * retval :UAPI_FLASH_END_DUETO_BADBLOCK * Return when bad block exist, caller need to check the read result. * CNcomment: 读Flash遇到坏块结束(读完有效长度数据后,返回该值, * 由用户判断成功与否) CNend */ td_s64 uapi_flash_read(td_handle handle, td_u64 offset, td_u8 *buf, td_u64 len, td_u32 flags); /* * Brief: Write data to flash * CNcomment: 写数据到Flash * attention 1) forbidden used the function when yaffs filesystem is using * 2) can use UAPI_FLASH_RW_FLAG_ERASE_FIRST manner write flah , can write over * all partition one time or write with block * CNcomment: 1) 不能调用该接口更新当前正使用的yaffs文件系统 * 2) 调用该接口写Flash时,可以使用UAPI_FLASH_RW_FLAG_ERASE_FIRST,可以 * 一次写完也可以一块一块的写,但是当写yaffs2时, * 必须先调用EXT_Flash_Erase把要写的分区完全擦除 CNend * param[in] handle Flash handle CNcomment: flash句柄 CNend * param[in] offset Address offset CNcomment: 地址偏移位置 CNend * param[in] buf Data buffer pointer CNcomment: 写数据的buffer指针 CNend * param[in] len Read length CNcomment: 写flash的长度 CNend * param[in] flags Write flags, OOB flag use UAPI_FLASH_RW_FLAG_WITH_OOB if data includes OOB data * CNcomment: 写flash的标志位,可取值UAPI_FLASH_RW_FLAG_WITH_OOB,表示数据内容是否 * 带 OOB 区 CNend * retval :TotalWrite Write total length. CNcomment:成功读取的长度 CNend * retval :TD_FAILURE Failed. CNcomment:失败 CNend * retval :UAPI_FLASH_END_DUETO_BADBLOCK * Return when bad block exist, caller need to check the read result. * CNcomment: 读Flash遇到坏块结束(读完有效长度数据后,返回该值,由用户 * 判断成功与否) CNend */ td_s64 uapi_flash_write(td_handle handle, td_u64 offset, td_u8 *buf, td_u64 len, td_u32 flags); /* * Brief: Get flash information * CNcomment: 获取Flash器件的信息。 * attention N/A * param[in] handle Flash handle CNcomment: flash句柄 CNend * param[out] flash_info Flash information pointer CNcomment: 存储器件信息的指针 CNend * retval :TD_SUCCESS Success. CNcomment:成功 CNend * retval :TD_FAILURE Failed. CNcomment:失败 CNend * see N/A */ td_s32 uapi_flash_getinfo(td_handle handle, uapi_flash_info *flash_info); #ifdef __cplusplus #if __cplusplus } #endif #endif /* __cplusplus */ #endif /* __UAPI_FLASH__H__ */