lua_cpu.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. * @File: lua_cpu.c
  3. * @Author: liu2guang
  4. * @Date: 2018-05-06 09:16:56
  5. *
  6. * @LICENSE: https://github.com/liu2guang/lua2rtt/blob/master/LICENSE.
  7. *
  8. * Change Logs:
  9. * Date Author Notes
  10. * 2018-05-06 liu2guang The first version.
  11. */
  12. #include <lua.h>
  13. #include <lauxlib.h>
  14. #include <lualib.h>
  15. #define TO_32BIT(L, n) (((signed long long)luaL_checknumber((L), (n))) & 0x0ffffffff)
  16. /* Lua: data = r08(address) */
  17. static int cpu_r08(lua_State *L)
  18. {
  19. uint32_t addr = 0;
  20. luaL_checkinteger(L, 1);
  21. addr = (uint32_t)TO_32BIT(L, 1);
  22. lua_pushnumber(L, (lua_Number)(*(volatile uint8_t *)addr));
  23. return 1;
  24. }
  25. /* Lua: w08(address, data) */
  26. static int cpu_w08(lua_State *L)
  27. {
  28. uint32_t addr;
  29. uint8_t data = (uint8_t)TO_32BIT(L, 2);
  30. luaL_checkinteger(L, 1);
  31. addr = (uint32_t)TO_32BIT(L, 1);
  32. *(volatile uint8_t*)addr = data;
  33. return 0;
  34. }
  35. /* Lua: data = r16(address) */
  36. static int cpu_r16(lua_State *L)
  37. {
  38. uint32_t addr = 0;
  39. luaL_checkinteger(L, 1);
  40. addr = (uint32_t)TO_32BIT(L, 1);
  41. lua_pushnumber(L, (lua_Number)(*(volatile uint16_t *)addr));
  42. return 1;
  43. }
  44. /* Lua: w16(address, data) */
  45. static int cpu_w16(lua_State *L)
  46. {
  47. uint32_t addr;
  48. uint16_t data = (uint16_t)TO_32BIT(L, 2);
  49. luaL_checkinteger(L, 1);
  50. addr = (uint32_t)TO_32BIT(L, 1);
  51. *(volatile uint16_t*)addr = data;
  52. return 0;
  53. }
  54. /* Lua: data = r32(address) */
  55. static int cpu_r32(lua_State *L)
  56. {
  57. uint32_t addr = 0;
  58. luaL_checkinteger(L, 1);
  59. addr = (uint32_t)TO_32BIT(L, 1);
  60. lua_pushnumber(L, (lua_Number)(*(volatile uint32_t *)addr));
  61. return 1;
  62. }
  63. /* Lua: w32(address, data) */
  64. static int cpu_w32(lua_State *L)
  65. {
  66. uint32_t addr;
  67. uint32_t data = (uint32_t)TO_32BIT(L, 2);
  68. luaL_checkinteger(L, 1);
  69. addr = (uint32_t)TO_32BIT(L, 1);
  70. *(volatile uint32_t*)addr = data;
  71. return 0;
  72. }
  73. /* Lua: sleep(tick) */
  74. static int cpu_sleep(lua_State *L)
  75. {
  76. rt_thread_delay((uint32_t)TO_32BIT(L, 1));
  77. return 0;
  78. }
  79. // Module function map
  80. #define MIN_OPT_LEVEL 2
  81. #include "lrodefs.h"
  82. static const LUA_REG_TYPE cpu_map[] =
  83. {
  84. {LSTRKEY("r08") , LFUNCVAL(cpu_r08) },
  85. {LSTRKEY("w08") , LFUNCVAL(cpu_w08) },
  86. {LSTRKEY("r16") , LFUNCVAL(cpu_r16) },
  87. {LSTRKEY("w16") , LFUNCVAL(cpu_w16) },
  88. {LSTRKEY("r32") , LFUNCVAL(cpu_r32) },
  89. {LSTRKEY("w32") , LFUNCVAL(cpu_w32) },
  90. {LSTRKEY("sleep"), LFUNCVAL(cpu_sleep)},
  91. {LNILKEY, LNILKEY}
  92. };
  93. /* ´ò¿ªCPU¿â */
  94. LUALIB_API int luaopen_cpu(lua_State *L)
  95. {
  96. LREGISTER(L, "cpu", cpu_map);
  97. }