[Feature][ZXW-88]merge P50 version

Only Configure: No
Affected branch: master
Affected module: unknown
Is it affected on both ZXIC and MTK: only ZXIC
Self-test: Yes
Doc Update: No

Change-Id: I34667719d9e0e7e29e8e4368848601cde0a48408
diff --git a/ap/lib/libmtd/mtd_api.h b/ap/lib/libmtd/mtd_api.h
new file mode 100755
index 0000000..bd95421
--- /dev/null
+++ b/ap/lib/libmtd/mtd_api.h
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * 版权所有 (C)2022, 中兴通讯股份有限公司。
+ *
+ * 文件名称:     pub_flags.h
+ * 文件标识:     pub_flags
+ * 内容摘要:     zx298501芯片平台flags分区规划头文件
+ * 使用方法:
+ *
+ * 修改日期        版本号      修改标记        修改人          修改内容
+ * ------------------------------------------------------------------------------
+ * 2022/09/15      V1.0        Create          周国坡          创建
+ *
+ *******************************************************************************/
+
+#ifndef _MTD_API_H
+#define _MTD_API_H
+
+typedef enum
+{
+    DEVICE_MTD = 0,
+    DEVICE_ZFTL = 1,
+    DEVICE_MTD_BLOCK,
+} device_type_t;
+
+/**
+ * @brief 根据分区名查找分区设备文件路径
+ * @param partition_name      入参,分区名
+ * @param type                入参,设备类型
+ * @param out_mtd_path        出参,设备文件路径缓冲区
+ * @param out_mtd_path_len    入参,out_mtd_path数据缓冲区长度
+ * @return 成功返回0,失败返回-1
+ * @retval
+ * @note
+ * @warning
+ */
+extern int mtd_find(const char *i_parti_name, device_type_t type, char *out_mtd_path, unsigned int out_mtd_path_len);
+
+/**
+ * @brief 根据分区名获取mtd分区信息
+ * @param fd                  入参,mtd分区文件fd
+ * @param info                出参,包括分区大小和擦除块大小
+ * @return 成功返回0,失败返回-1
+ * @retval
+ * @note fd为打开/dev/mtdN设备句柄
+ * @warning
+ */
+extern int mtd_get_info(int fd, struct mtd_info_user *info);
+
+/**
+ * @brief 判断block是否是坏块
+ * @param fd                  入参,mtd分区文件fd
+ * @param offset              入参,mtd分区偏移位置,包含坏块
+ * @return 0表示非坏块,1表示坏块,-1表示失败
+ * @retval
+ * @note fd为打开/dev/mtdN设备句柄
+ * @warning
+ */
+extern int mtd_block_isbad(int fd, off_t offset);
+
+/**
+ * @brief 擦除指定分区
+ * @param partition_name      入参,分区名
+  * @return 成功返回0,失败返回-1
+ * @retval
+ * @note
+ * @warning
+ */
+extern int mtd_erase_partition(const char *partition_name);
+
+/**
+ * @brief 将指定镜像文件写到指定分区
+ * @param partition_name      入参,分区名
+ * @param image_file          入参,指定的镜像文件
+ * @return 成功返回0,失败返回-1
+ * @retval
+ * @note
+ * @warning 先要mtd_erase_partition函数擦除分区
+ */
+extern int mtd_write_partition(const char *partition_name, const char *image_file);
+
+/**
+ * @brief 擦除mtd分区指定位置数据
+ * @param fd                  入参,mtd分区文件fd
+ * @param offset              入参,mtd分区偏移位置,包含坏块
+  * @return 成功返回0,失败返回-1
+ * @retval
+ * @note fd为打开/dev/mtdN设备句柄
+ * @warning 
+ */
+extern int mtd_erase_offset(int fd, off_t offset);
+
+/**
+ * @brief 将数据写到mtd分区指定偏移位置
+ * @param fd                  入参,mtd分区文件fd
+ * @param offset              入参,mtd分区偏移位置
+ * @param buf                 入参,数据缓冲区
+ * @param count               入参,buf数据长度,不超过一个擦除块
+ * @return 成功返回写入数据长度,失败返回-1
+ * @retval
+ * @note fd为打开/dev/mtdN设备句柄
+ * @warning 先要mtd_erase_partition函数擦除分区
+ */
+extern ssize_t mtd_write_offset(int fd, off_t offset, const void *buf, size_t count);
+
+/**
+ * @brief 读取mtd分区指定偏移位置的数据
+ * @param fd                  入参,mtd分区文件fd
+ * @param offset              入参,mtd分区偏移位置
+ * @param buf                 出参,数据缓冲区
+ * @param count               入参,buf数据长度,不超过一个擦除块
+ * @return 成功返回读取数据长度,失败返回-1
+ * @retval
+ * @note fd为打开/dev/mtdN设备句柄
+ * @warning
+ */
+extern ssize_t mtd_read_offset(int fd, off_t offset, void *buf, size_t count);
+
+#endif  /* _MTD_API_H */