lib_ringfs_ram.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /*
  2. * Copyright © 2014 Kosma Moczek <kosma@cloudyourcar.com>
  3. * This program is free software. It comes without any warranty, to the extent
  4. * permitted by applicable law. You can redistribute it and/or modify it under
  5. * the terms of the Do What The Fuck You Want To Public License, Version 2, as
  6. * published by Sam Hocevar. See the COPYING file for more details.
  7. */
  8. #if USE_LIB_RINGFS_RAM==1
  9. #include "lib_ringfs_func.h"
  10. #include "lib_ringfs.h"
  11. #include "lib_ringfs_ram.h"
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <stdlib.h>
  15. #include <inttypes.h>
  16. #ifdef FLASHSIM_LOG
  17. #define logprintf(args...) printf(args)
  18. #else
  19. #define logprintf(args...) do {} while (0)
  20. #endif
  21. #define FLASH_RAM_SECTOR_SIZE 128
  22. #define FLASH_RAM_TOTAL_SECTORS 16
  23. #define FLASH_RAM_PARTITION_OFFSET 4
  24. #define FLASH_RAM_PARTITION_SIZE 8
  25. uint8_t ram_buf[FLASH_RAM_TOTAL_SECTORS][FLASH_RAM_SECTOR_SIZE] = {0};
  26. struct rfs_dev_ram {
  27. int size;
  28. int sector_size;
  29. uint8_t* buf;
  30. //FILE *fh;
  31. };
  32. struct rfs_dev_ram rfs_dev_ram_obj = {0};
  33. struct rfs_dev_ram *ramHandle = 0;
  34. void init_flash_driver_ram(void)
  35. {
  36. ramHandle = rfs_dev_ram_open("example.ram",
  37. FLASH_RAM_TOTAL_SECTORS*FLASH_RAM_SECTOR_SIZE,
  38. FLASH_RAM_SECTOR_SIZE);
  39. }
  40. static int op_sector_erase(struct ringfs_flash_partition *flash, int address)
  41. {
  42. (void) flash;
  43. rfs_dev_ram_sector_erase(ramHandle, address);
  44. return 0;
  45. }
  46. static ssize_t op_program(struct ringfs_flash_partition *flash, int address, const void *data, size_t size)
  47. {
  48. (void) flash;
  49. rfs_dev_ram_program(ramHandle, address, data, size);
  50. return size;
  51. }
  52. static ssize_t op_read(struct ringfs_flash_partition *flash, int address, void *data, size_t size)
  53. {
  54. (void) flash;
  55. rfs_dev_ram_read(ramHandle, address, data, size);
  56. return size;
  57. }
  58. struct ringfs_flash_partition rfs_disk_ram = {
  59. .sector_size = FLASH_RAM_SECTOR_SIZE,
  60. .sector_offset = FLASH_RAM_PARTITION_OFFSET,
  61. .sector_count = FLASH_RAM_PARTITION_SIZE,
  62. .sector_erase = op_sector_erase,
  63. .program = op_program,
  64. .read = op_read,
  65. };
  66. struct rfs_dev_ram *rfs_dev_ram_open(const char *name, int size, int sector_size)
  67. {
  68. struct rfs_dev_ram *ram = &rfs_dev_ram_obj;
  69. ram = &rfs_dev_ram_obj;
  70. ram->size = size;
  71. ram->sector_size = sector_size;
  72. #if 0
  73. //ram->fh = fopen(name, "w+");
  74. //assert_param(ram->fh != NULL);
  75. //assert_param(ftruncate(fileno(ram->fh), size) == 0);
  76. #else
  77. ram->buf = &ram_buf[0][0];
  78. #endif
  79. return ram;
  80. }
  81. void rfs_dev_ram_close(struct rfs_dev_ram *ram)
  82. {
  83. //fclose(ram->fh);
  84. //free(ram);
  85. memset(ram_buf, 0x00, sizeof(ram_buf));
  86. }
  87. void rfs_dev_ram_sector_erase(struct rfs_dev_ram *ram, int addr)
  88. {
  89. int sector_start = addr - (addr % ram->sector_size);
  90. logprintf("rfs_dev_ram_erase (0x%08x) * erasing sector at 0x%08x\n", addr, sector_start);
  91. #if 0
  92. void *empty = malloc(ram->sector_size);
  93. assert_param(fseek(ram->fh, sector_start, SEEK_SET) == 0);
  94. assert_param(fwrite(empty, 1, ram->sector_size, ram->fh) == (size_t) ram->sector_size);
  95. free(empty);
  96. #else
  97. memset(ram->buf+sector_start, 0xff, ram->sector_size);
  98. #endif
  99. }
  100. void rfs_dev_ram_read(struct rfs_dev_ram *ram, int addr, uint8_t *buf, int len)
  101. {
  102. #if 0
  103. assert_param(fseek(ram->fh, addr, SEEK_SET) == 0);
  104. assert_param(fread(buf, 1, len, ram->fh) == (size_t) len);
  105. logprintf("rfs_dev_ram_read (0x%08x) = %d bytes [ ", addr, len);
  106. for (int i=0; i<len; i++) {
  107. logprintf("%02x ", buf[i]);
  108. if (i == 15) {
  109. logprintf("... ");
  110. break;
  111. }
  112. }
  113. logprintf("]\n");
  114. #else
  115. int32_t opt_len = 0;
  116. opt_len = len;
  117. if((addr+len) <= (ram->size))
  118. {
  119. //地址和长度在合法的范围内;
  120. }
  121. else
  122. {
  123. //获取的内存空间超限,调整读取长度
  124. opt_len = ram->size - addr;
  125. }
  126. if(opt_len <= 0)
  127. {
  128. return;
  129. }
  130. memcpy(buf, ram->buf+addr, opt_len);
  131. return;
  132. #endif
  133. }
  134. void rfs_dev_ram_program(struct rfs_dev_ram *ram, int addr, const uint8_t *buf, int len)
  135. {
  136. #if 0
  137. logprintf("rfs_dev_ram_program(0x%08x) + %d bytes [ ", addr, len);
  138. for (int i=0; i<len; i++) {
  139. logprintf("%02x ", buf[i]);
  140. if (i == 15) {
  141. logprintf("... ");
  142. break;
  143. }
  144. }
  145. logprintf("]\n");
  146. uint8_t *data = malloc(len);
  147. assert_param(fseek(ram->fh, addr, SEEK_SET) == 0);
  148. assert_param(fread(data, 1, len, ram->fh) == (size_t) len);
  149. for (int i=0; i<(int) len; i++)
  150. data[i] &= buf[i];
  151. assert_param(fseek(ram->fh, addr, SEEK_SET) == 0);
  152. assert_param(fwrite(data, 1, len, ram->fh) == (size_t) len);
  153. free(data);
  154. #else
  155. int32_t opt_len = 0;
  156. opt_len = len;
  157. if((addr+len) <= (ram->size))
  158. {
  159. //地址和长度在合法的范围内;
  160. }
  161. else
  162. {
  163. //获取的内存空间超限,调整读取长度
  164. opt_len = ram->size - addr;
  165. }
  166. if(opt_len <= 0)
  167. {
  168. return;
  169. }
  170. memcpy(ram->buf+addr, buf, opt_len);
  171. return;
  172. #endif
  173. }
  174. #endif //----------------USE_LIB_RINGFS_RAM==1---------------------//
  175. /* vim: set ts=4 sw=4 et: */