Skip to content

Commit

Permalink
add:luatos支持little_flash并添加demo
Browse files Browse the repository at this point in the history
  • Loading branch information
Dozingfiretruck committed May 11, 2024
1 parent 2dca888 commit f81f850
Show file tree
Hide file tree
Showing 6 changed files with 398 additions and 206 deletions.
10 changes: 5 additions & 5 deletions components/little_flash/inc/little_flash_define.h
Expand Up @@ -34,11 +34,11 @@ typedef struct little_flash little_flash_t;
#ifndef LF_DEBUG
#define LF_DEBUG(...) LF_PRINTF(__VA_ARGS__)
#endif
#define LF_ASSERT(EXPR) \
if (!(EXPR)) \
{ \
LF_PRINTF("(%s) has assert failed at %s.", #EXPR, __FUNCTION__); \
while (1); \
#define LF_ASSERT(EXPR) \
if (!(EXPR)) \
{ \
LF_PRINTF("(%s) has assert failed at %s.", #EXPR, __FUNCTION__); \
while (1); \
}
#else
#ifndef LF_DEBUG
Expand Down
95 changes: 95 additions & 0 deletions components/little_flash/luat_lib_little_flash.c
@@ -0,0 +1,95 @@
/*
@module little_flash
@summary LITTLE FLASH 软件包
@version 1.0
@date 2024.05.11
@demo little_flash
@tag LUAT_USE_LITTLE_FLASH
*/

#include "luat_base.h"
#include "luat_spi.h"
#include "luat_mem.h"

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

static little_flash_t lf_flash = {0};

/*
初始化 little_flash
@api lf.init(spi_device)
@int userdata spi_device
@return userdata 成功返回一个数据结构,否则返回nil
@usage
--spi_device
local spi_device = spi.deviceSetup(0,17,0,0,8,2000000,spi.MSB,1,0)
log.info("lf.init",lf.init(spi_device))
*/
static int luat_little_flash_init(lua_State *L){
static luat_spi_device_t* little_flash_spi_device = NULL;
if (lua_type(L, 1) == LUA_TUSERDATA){
little_flash_spi_device = (luat_spi_device_t*)lua_touserdata(L, 1);
lf_flash.spi.user_data = little_flash_spi_device;
}
little_flash_init();
int re = little_flash_device_init(&lf_flash);
lua_pushlightuserdata(L, &lf_flash);
return 1;
}

#ifdef LUAT_USE_FS_VFS
#include "luat_fs.h"
#include "lfs.h"
extern lfs_t* flash_lfs_lf(little_flash_t* flash, size_t offset, size_t maxsize);

/*
挂载 little_flash lfs文件系统
@api lf.mount(flash, mount_point, offset, maxsize)
@userdata flash Flash 设备对象 lf.init()返回的数据结构
@string mount_point 挂载目录名
@int 起始偏移量,默认0
@int 总大小, 默认是整个flash
@return bool 成功返回true
@usage
log.info("lf.mount",lf.mount(little_flash_device,"/little_flash"))
*/
static int luat_little_flash_mount(lua_State *L) {
const little_flash_t *flash = lua_touserdata(L, 1);
const char* mount_point = luaL_checkstring(L, 2);
size_t offset = luaL_optinteger(L, 3, 0);
size_t maxsize = luaL_optinteger(L, 4, 0);
lfs_t* lfs = flash_lfs_lf(flash, offset, maxsize);
if (lfs) {
luat_fs_conf_t conf = {
.busname = (char*)lfs,
.type = "lfs2",
.filesystem = "lfs2",
.mount_point = mount_point,
};
int ret = luat_fs_mount(&conf);
LLOGD("vfs mount %s ret %d", mount_point, ret);
lua_pushboolean(L, 1);
}
else {
lua_pushboolean(L, 0);
}
return 1;
}
#endif

#include "rotable2.h"
static const rotable_Reg_t reg_little_flash[] =
{
{ "init", ROREG_FUNC(luat_little_flash_init)},
#ifdef LUAT_USE_FS_VFS
{ "mount", ROREG_FUNC(luat_little_flash_mount)},
#endif
{ NULL, ROREG_INT(0)}
};

LUAMOD_API int luaopen_little_flash( lua_State *L ) {
luat_newlib2(L, reg_little_flash);
return 1;
}
10 changes: 6 additions & 4 deletions components/little_flash/luat_little_flash_lfs2.c
Expand Up @@ -6,6 +6,8 @@
#define LUAT_LOG_TAG "little_flash"
#include "luat_log.h"

#ifdef LUAT_USE_LITTLE_FLASH

#ifdef LUAT_USE_FS_VFS
#include "lfs.h"
#include "little_flash.h"
Expand All @@ -17,23 +19,23 @@ static int lf_block_device_read(const struct lfs_config *cfg, lfs_block_t block,
little_flash_t* flash = (little_flash_t*)cfg->context;
// int ret = lf_read(flash, lf_offset + block * flash->chip.erase_gran + off, size, buffer);
int ret = little_flash_read(flash, lf_offset + block * flash->chip_info.erase_size + off, buffer, size);
// LUAT_DEBUG_PRINT("lf_block_device_read ret %d", ret);
// LLOGD("lf_block_device_read ret %d", ret);
return ret;
}

static int lf_block_device_prog(const struct lfs_config *cfg, lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size) {
little_flash_t* flash = (little_flash_t*)cfg->context;
// int ret = lf_write(flash, lf_offset + block * flash->chip.erase_gran + off, size, buffer);
int ret = little_flash_write(flash, lf_offset + block * flash->chip_info.erase_size + off, buffer, size);
// LUAT_DEBUG_PRINT("lf_block_device_prog ret %d", ret);
// LLOGD("lf_block_device_prog ret %d", ret);
return ret;
}

static int lf_block_device_erase(const struct lfs_config *cfg, lfs_block_t block) {
little_flash_t* flash = (little_flash_t*)cfg->context;
// int ret = lf_erase(flash, lf_offset + block * flash->chip.erase_gran, flash->chip.erase_gran);
int ret = little_flash_erase(flash, lf_offset + block * flash->chip_info.erase_size, flash->chip_info.erase_size);
// LUAT_DEBUG_PRINT("lf_block_device_erase ret %d", ret);
// LLOGD("lf_block_device_erase ret %d", ret);
return ret;
}

Expand Down Expand Up @@ -103,4 +105,4 @@ fail :

#endif

#endif
6 changes: 3 additions & 3 deletions components/little_flash/port/little_flash_config.h
@@ -1,15 +1,15 @@
#ifndef _LITTLE_FLASH_CONFIG_H_
#define _LITTLE_FLASH_CONFIG_H_

#include "luat_debug.h"

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

#ifdef __cplusplus
extern "C" {
#endif

/* define the printf function for little flash */
#define LF_PRINTF LUAT_DEBUG_PRINT
#define LF_PRINTF LLOGI

#define LF_DEBUG_MODE /* enable debug mode for little flash */

Expand Down
93 changes: 93 additions & 0 deletions demo/little_flash/main.lua
@@ -0,0 +1,93 @@

-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "little_flash demo"
VERSION = "1.0.0"

log.info("main", PROJECT, VERSION)

sys = require("sys")

--添加硬狗防止程序卡死
if wdt then
wdt.init(9000)--初始化watchdog设置为9s
sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end

-- spi_id,pin_cs
local function little_flash_spi_pin()
local rtos_bsp = rtos.bsp()
if rtos_bsp == "AIR101" then
return 0,pin.PB04
elseif rtos_bsp == "AIR103" then
return 0,pin.PB04
elseif rtos_bsp == "AIR105" then
return 5,pin.PC14
elseif rtos_bsp == "ESP32C3" then
return 2,7
elseif rtos_bsp == "ESP32S3" then
return 2,14
elseif rtos_bsp == "EC618" then
return 0,8
elseif rtos_bsp == "EC718P" then
return 0,8
else
log.info("main", "bsp not support")
return
end
end

sys.taskInit(function()
-- log.info("等5秒")
sys.wait(1000)
local spi_id,pin_cs = little_flash_spi_pin()
if not spi_id then
while 1 do
sys.wait(1000)
log.info("main", "bsp not support yet")
end
end

log.info("lf", "SPI", spi_id, "CS PIN", pin_cs)
spi_flash = spi.deviceSetup(spi_id,pin_cs,0,0,8,20*1000*1000,spi.MSB,1,0)
log.info("lf", "spi_flash", spi_flash)
little_flash_device = lf.init(spi_flash)
if little_flash_device then
log.info("lf.init ok")
else
log.info("lf.init Error")
return
end

if lf.mount then
local ret = lf.mount(little_flash_device,"/little_flash")
log.info("lf.mount", ret)
if ret then
log.info("little_flash", "挂载成功")
log.info("fsstat", fs.fsstat("/little_flash"))

-- 挂载成功后,可以像操作文件一样操作
local f = io.open("/little_flash/test", "w")
f:write(os.date())
f:close()

log.info("little_flash", io.readFile("/little_flash/test"))

-- 文件追加
os.remove("/little_flash/test2")
io.writeFile("/little_flash/test2", "LuatOS")
local f = io.open("/little_flash/test2", "a+")
f:write(" - " .. os.date())
f:close()

log.info("little_flash", io.readFile("/little_flash/test2"))
else
log.info("little_flash", "挂载失败")
end
end
end)


-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

0 comments on commit f81f850

Please sign in to comment.