luat_sfd_mem.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include "luat_base.h"
  2. #include "luat_spi.h"
  3. #include "luat_gpio.h"
  4. #include "luat_sfd.h"
  5. #define LUAT_LOG_TAG "sfd"
  6. #include "luat_log.h"
  7. //--------------------------------------------------------------------
  8. // SFD at memory , for test
  9. #include "luat_zbuff.h"
  10. static int sfd_mem_init (void* userdata);
  11. static int sfd_mem_status (void* userdata);
  12. static int sfd_mem_read (void* userdata, char* buff, size_t offset, size_t len);
  13. static int sfd_mem_write (void* userdata, const char* buff, size_t offset, size_t len);
  14. static int sfd_mem_erase (void* userdata, size_t offset, size_t len);
  15. static int sfd_mem_ioctl (void* userdata, size_t cmd, void* buff);
  16. const sdf_opts_t sfd_mem_opts = {
  17. .initialize = sfd_mem_init,
  18. .status = sfd_mem_status,
  19. .read = sfd_mem_read,
  20. .write = sfd_mem_write,
  21. .erase = sfd_mem_erase,
  22. .ioctl = sfd_mem_ioctl,
  23. };
  24. static int sfd_mem_init (void* userdata) {
  25. if (userdata == NULL) {
  26. LLOGE("userdata for sfd_mem must NOT NULL");
  27. return -1;
  28. }
  29. sfd_drv_t *drv = (sfd_drv_t*)userdata;
  30. luat_zbuff_t* zbuff = drv->cfg.zbuff;
  31. if (zbuff->len < 16*1024) {
  32. LLOGE("zbuff for sfd_mem is too small");
  33. return -1;
  34. }
  35. return 0;
  36. }
  37. static int sfd_mem_status (void* userdata) {
  38. if (userdata == NULL) {
  39. LLOGE("userdata for sfd_mem must NOT NULL");
  40. return -1;
  41. }
  42. return 0;
  43. }
  44. static int sfd_mem_read (void* userdata, char* buff, size_t offset, size_t len) {
  45. if (userdata == NULL) {
  46. LLOGE("userdata for sfd_mem must NOT NULL");
  47. return -1;
  48. }
  49. sfd_drv_t *drv = (sfd_drv_t*)userdata;
  50. luat_zbuff_t* zbuff = drv->cfg.zbuff;
  51. if (offset > zbuff->len) {
  52. // LLOGD("over read");
  53. return 0;
  54. }
  55. if (offset+len > zbuff->len) {
  56. len = zbuff->len - offset;
  57. }
  58. if (len > 0) {
  59. memcpy(buff, zbuff->addr + offset, len);
  60. }
  61. return len;
  62. }
  63. static int sfd_mem_write (void* userdata, const char* buff, size_t offset, size_t len) {
  64. if (userdata == NULL) {
  65. LLOGE("userdata for sfd_mem must NOT NULL");
  66. return -1;
  67. }
  68. sfd_drv_t *drv = (sfd_drv_t*)userdata;
  69. luat_zbuff_t* zbuff = drv->cfg.zbuff;
  70. if (offset > zbuff->len) {
  71. // LLOGD("over read");
  72. return 0;
  73. }
  74. if (offset+len > zbuff->len) {
  75. len = zbuff->len - offset;
  76. }
  77. if (len > 0) {
  78. memcpy(zbuff->addr + offset, buff, len);
  79. }
  80. return len;
  81. }
  82. static int sfd_mem_erase (void* userdata, size_t offset, size_t len) {
  83. if (userdata == NULL) {
  84. LLOGE("userdata for sfd_mem must NOT NULL");
  85. return -1;
  86. }
  87. sfd_drv_t *drv = (sfd_drv_t*)userdata;
  88. luat_zbuff_t* zbuff = drv->cfg.zbuff;
  89. if (offset > zbuff->len) {
  90. // LLOGD("over read");
  91. return 0;
  92. }
  93. if (offset+len > zbuff->len) {
  94. len = zbuff->len - offset;
  95. }
  96. if (len > 0) {
  97. memset(zbuff->addr + offset, 0, len);
  98. }
  99. return 0;
  100. }
  101. static int sfd_mem_ioctl (void* userdata, size_t cmd, void* buff) {
  102. return 0;
  103. }