|
|
@@ -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;
|
|
|
+}
|