/*
 * brom_func.h
 *
 *  Created on: 2022年5月23日
 *      Author: mglsq
 */

#ifndef SRC_BROM_FUNC_H_
#define SRC_BROM_FUNC_H_

#include<stdint.h>
#include "at_server.h"

typedef struct
{
	uint64_t mcycle_ms_freq;
	uint32_t flash_type;
	uint8_t sck_pin;
	uint8_t nss_pin;
	uint8_t d0_pin;
	uint8_t d1_pin;
} SOFT_QuadSPIStruct;

typedef struct
{
	int (*printf)(char* fmt,...);
	int32_t 	(*at_server_parser)(void *server);
	int32_t 	(*int32_try_parse)(const char* str,int32_t *pvalue);
	int32_t 	(*uint32_try_parse)(const char* str,uint32_t *pvalue);
	int32_t 	(*int64_try_parse)(const char* str,int64_t *pvalue);
	int32_t 	(*uint64_try_parse)(const char* str,uint64_t *pvalue);
	int32_t 	(*string_try_parse)(const char* str,char* str_out);
	char*		(*at_server_get_result_string)(at_result_t result);
	uint32_t	(*SOFT_SPI_ReadID)(uint8_t,uint8_t,uint8_t,uint8_t);
	uint32_t 	(*SOFT_QuadSPI_Cmd)(uint32_t,SOFT_QuadSPIStruct *);
	uint32_t 	(*NORCTRL_QuadSPIinit)(uint32_t,uint32_t,uint64_t);
}brom_func_t;

#define brom_func	((brom_func_t *)0x00080080ul)

#define	read_mcycle()		((uint64_t (*)(void))0x80694)()
#define	brom_memcpy(a,b,c)  ((void (*)(void*,void*,size_t))0x80318)((a),(b),(c))
#define	brom_memset(a,b,c)  ((void (*)(void*,int,size_t))0x80410)((a),(b),(c))

#define brom_strcmp(a,b)                ((int (*)(const char *, const char *))0x85a98)((a),(b))
#define brom_strlen(a)                  ((size_t (*)(const char *))0x85b08)((a))

/* @brief       初始化对应mfp的引脚为SPI功能，并初始化SPI0控制器
 * @param       @arg a: SPI引脚组合序号
 * 引脚组合序号:
 *  ____________________________________________
 * |            |MFP=0  |MFP=1  |MFP=2  |MFP=3  |
 * | SCK        |GPIO24 |GPIO27 |GPIO24 |GPIO00 |
 * | NSS        |GPIO25 |GPIO26 |GPIO25 |GPIO01 |
 * |DATA0/MOSI  |GPIO26 |GPIO25 |GPIO26 |GPIO02 |
 * |DATA1/MISO  |GPIO27 |GPIO24 |GPIO28 |GPIO03 |
 * |DATA2/WP    |GPIO28 |GPIO29 |GPIO27 |GPIO04 |
 * |DATA3/HOLD  |GPIO29 |GPIO28 |GPIO29 |GPIO05 |
 * |____________|_______|_______|_______|_______|
 * @return      无
 * @note        MFP数值即为 a
 * */
#define brom_sf_init(a)                 ((void (*)(size_t))0x82356)((a))

/* @brief       恢复对应mfp的引脚为NORC功能，并关闭SPI0控制器
 * @param       @arg a: SPI引脚组合序号
 * @return      无
 * @note        该函数需要与 brom_sf_init 配套使用
 * */
#define brom_sf_deinit(a)               ((void (*)(size_t))0x8236e)((a))

/* @brief       读取flash的ID
 * @return      无
 * @note        无
 * */
#define brom_sf_read_id()               ((size_t (*)(void))0x820c6)()

/* @brief       擦除flash的指定区域
 * @param       @arg a: flash 地址
 *              @arg b: 需要擦除的数据长度
 * @return      无
 * @note        无
 * */
#define brom_sf_erase_area(a,b)         ((void (*)(size_t, size_t))0x8213c)((a),(b))

/* @brief       编程指定区域的flash
 * @param       @arg a: flash 地址
 *              @arg b: 待写入的数据地址
 *              @arg c: 待写入的数据长度
 * @return      无
 * @note        无
 * */
#define brom_sf_write_bytes(a,b,c)      ((void (*)(size_t, uint8_t *, size_t))0x82200)((a),(b),(c))

/* @brief       读取指定区域的flash
 * @param       @arg a: flash 地址
 *              @arg b: 读取后保存数据的地址
 *              @arg c: 待读取的数据长度
 * @return      无
 * @note        无
 * */
#define brom_sf_read_bytes(a,b,c)       ((void (*)(size_t, uint8_t *, size_t))0x8225e)((a),(b),(c))

/* @brief       字符串转int32_t数据
 * @param       @arg a: 字符串
 *              @arg b: 保存转换结果的 int32_t 变量指针
 * @return      无
 * @note        无
 * */
#define brom_int32_try_parse(a,b)       ((int32_t (*)(const char*, int32_t *))0x807ba)((a),(b))

/* @brief       字符串转uint32_t数据
 * @param       @arg a: 字符串
 *              @arg b: 保存转换结果的 uint32_t 变量指针
 * @return      无
 * @note        无
 * */
#define brom_uint32_try_parse(a,b)      ((int32_t (*)(const char*, uint32_t *))0x807f6)((a),(b))


#endif /* SRC_BROM_FUNC_H_ */
