#include "luat_base.h"
#include "luat_sfd.h"

// #ifdef LUAT_SFD_ONCHIP

#define LUAT_LOG_TAG "onchip"
#include "luat_log.h"

#include "wm_include.h"
#include "wm_flash_map.h"
#include "wm_internal_flash.h"

extern uint32_t kv_addr;
extern uint32_t kv_size_kb;

int sfd_onchip_init (void* userdata) {
    sfd_onchip_t* onchip = (sfd_onchip_t*)userdata;
    if (onchip == NULL)
       return -1;
    //LLOGD("kv addr 0x%08X", kv_addr);
    //LLOGD("kv addr2 0x%08X", (0x1FC000 - 112 * 1024 - 64 * 1024));
    onchip->addr = kv_addr;
    return 0;
}

int sfd_onchip_status (void* userdata) {
    return 0;
}

int sfd_onchip_read (void* userdata, char* buff, size_t offset, size_t len) {
    int ret;
    sfd_onchip_t* onchip = (sfd_onchip_t*)userdata;
    if (onchip == NULL)
       return -1;
    ret = tls_fls_read(offset + onchip->addr, (u8 *)buff, len);
    if (ret != TLS_FLS_STATUS_OK)
    {
        return -1;
    }
    return 0;
}

int sfd_onchip_write (void* userdata, const char* buff, size_t offset, size_t len) {
    int ret;
    sfd_onchip_t* onchip = (sfd_onchip_t*)userdata;
    if (onchip == NULL)
       return -1;
    ret = tls_fls_write_without_erase(offset + onchip->addr, (u8 *)buff, len);
    if (ret != TLS_FLS_STATUS_OK)
    {
        return -1;
    }
    return 0;
}
int sfd_onchip_erase (void* userdata, size_t offset, size_t len) {
    int ret;
    sfd_onchip_t* onchip = (sfd_onchip_t*)userdata;
    if (onchip == NULL)
       return -1;
    ret = tls_fls_erase((offset + onchip->addr) / INSIDE_FLS_SECTOR_SIZE);
    if (ret != TLS_FLS_STATUS_OK)
    {
        return -1;
    }
    return 0;
}

int sfd_onchip_ioctl (void* userdata, size_t cmd, void* buff) {
    return 0;
}

// #endif