Bläddra i källkod

add: 添加otp操作库

Wendal Chen 4 år sedan
förälder
incheckning
3acaeda060
3 ändrade filer med 148 tillägg och 0 borttagningar
  1. 1 0
      luat/include/luat_libs.h
  2. 12 0
      luat/include/luat_otp.h
  3. 135 0
      luat/modules/luat_lib_otp.c

+ 1 - 0
luat/include/luat_libs.h

@@ -101,5 +101,6 @@ LUAMOD_API int luaopen_fonts( lua_State *L );
 
 LUAMOD_API int luaopen_pin( lua_State *L );
 LUAMOD_API int luaopen_dac( lua_State *L );
+LUAMOD_API int luaopen_otp( lua_State *L );
 
 #endif

+ 12 - 0
luat/include/luat_otp.h

@@ -0,0 +1,12 @@
+
+#ifndef LUAT_OTP_H
+#define LUAT_OTP_H
+#include "luat_base.h"
+
+
+int luat_otp_read(int zone, char* buff, size_t offset, size_t len);
+int luat_otp_write(int zone, char* buff, size_t offset, size_t len);
+int luat_otp_erase(int zone, size_t offset, size_t len);
+int luat_otp_lock(int zone);
+
+#endif

+ 135 - 0
luat/modules/luat_lib_otp.c

@@ -0,0 +1,135 @@
+
+/*
+@module  otp
+@summary OTP操作库
+@version 1.0
+@date    2021.12.08
+*/
+#include "luat_base.h"
+#include "luat_otp.h"
+
+#define LUAT_LOG_TAG "otp"
+#include "luat_log.h"
+
+/*
+读取指定OTP区域读取数据
+@api otp.read(zone, offset, len)
+@int 区域, 通常为0/1/2/3, 与具体硬件相关
+@int 偏移量
+@int 读取长度, 单位字节, 必须是4的倍数, 不能超过4096字节
+@return string 成功返回字符串, 否则返回nil
+@usage
+
+local otpdata = otp.read(0, 0, 64)
+if otpdata then
+    log.info("otp", otpdata:toHex())
+end
+*/
+static int l_otp_read(lua_State *L) {
+    int zone;
+    int offset;
+    int len;
+
+    zone = luaL_checkinteger(L, 1);
+    offset = luaL_checkinteger(L, 2);
+    len = luaL_checkinteger(L, 3);
+
+    if (zone < 0 || zone > 16) {
+        return 0;
+    }
+    if (offset < 0 || offset > 4*1024) {
+        return 0;
+    }
+    if (len < 0 || len > 4*1024) {
+        return 0;
+    }
+    if (offset + len > 4*1024) {
+        return 0;
+    }
+    luaL_Buffer buff;
+    luaL_buffinitsize(L, &buff, len);
+    int ret = luat_otp_read(zone, buff.b, (size_t)offset, (size_t)len);
+    if (ret >= 0) {
+        lua_pushlstring(L, buff.b, ret);
+        return 1;
+    }
+    else {
+        return 0;
+    }
+};
+
+/*
+往指定OTP区域写入数据
+@api otp.write(zone, data, offset)
+@int 区域, 通常为0/1/2/3, 与具体硬件相关
+@string 数据, 长度必须是4个倍数
+@int 偏移量
+@return booL 成功返回true,否则返回false
+*/
+static int l_otp_write(lua_State *L) {
+    int zone;
+    int offset;
+    int len;
+    const char* data;
+
+    zone = luaL_checkinteger(L, 1);
+    data = luaL_checklstring(L, 2, &len);
+    offset = luaL_checkinteger(L, 3);
+
+    if (zone < 0 || zone > 16) {
+        return 0;
+    }
+    if (offset < 0 || offset > 4*1024) {
+        return 0;
+    }
+    if (len < 0 || len > 4*1024) {
+        return 0;
+    }
+    if (offset + len > 4*1024) {
+        return 0;
+    }
+    int ret = luat_otp_write(zone, data, (size_t)offset, (size_t)len);
+    lua_pushboolean(L, ret == 0 ? 1 : 0);
+    return 1;
+};
+
+/*
+擦除指定OTP区域
+@api otp.erase(zone)
+@int 区域, 通常为0/1/2/3, 与具体硬件相关
+@return bool 成功返回true,否则返回false
+*/
+static int l_otp_erase(lua_State *L) {
+    int zone;
+    zone = luaL_checkinteger(L, 1);
+    int ret = luat_otp_erase(zone, 0, 1024);
+    lua_pushboolean(L, ret == 0 ? 1 : 0);
+    return 1;
+};
+
+/*
+锁定OTP区域. 特别注意!!一旦加锁即无法解锁,OTP变成只读!!!
+@api otp.lock(zone)
+@return bool 成功返回true,否则返回false
+*/
+static int l_otp_lock(lua_State *L) {
+    int ret = luat_otp_lock(0);
+    lua_pushboolean(L, ret == 0 ? 1 : 0);
+    return 1;
+};
+
+
+#include "rotable.h"
+static const rotable_Reg reg_otp[] =
+{
+    {"read", l_otp_read, 0},
+    {"write", l_otp_write, 0},
+    {"erase", l_otp_erase, 0},
+    {"lock", l_otp_lock, 0},
+	{ NULL, NULL , 0}
+};
+
+LUAMOD_API int luaopen_otp( lua_State *L ) {
+    luat_newlib(L, reg_otp);
+    return 1;
+}