flash_api_base.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. // v 1.0 from 14/10/2020
  2. // Сычев А.
  3. #ifndef FLASH_API_PROTECTION_H
  4. #define FLASH_API_PROTECTION_H
  5. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  6. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  7. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ЗАЩИТА СЕКТОРОВ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  8. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  9. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  10. #pragma pack( push, 1 )
  11. typedef enum
  12. {
  13. // flash_getprotect
  14. flash_sector_unprotected = 0, // не защищен
  15. flash_sector_protected = 1, // защищен
  16. //--------------------------------
  17. flash_sector_protect_nomodify = 0, // не модифицировать биты защиты: общий/частный
  18. flash_sector_protect_modify = 0x7f, // модифицировать общий бит защиты
  19. flash_sector_protect_pick = 1, // отметить сектор для операции снятия/установки защиты
  20. }
  21. flash_api_protect_bits;
  22. #pragma pack( pop )
  23. #pragma pack( push, 1 )
  24. struct flash_sectors_st
  25. {
  26. union
  27. {
  28. __FLASH_DWORD loprotect; // биты защиты секторов 0-31
  29. __FLASH_BYTE bytes[1]; // для внутреннего пользования
  30. struct
  31. {
  32. __FLASH_DWORD s0 : 1; // AT45: на весь сектор 0 выделен один бит. Либо секторы 0a,0b защищены, либо нет.
  33. __FLASH_DWORD s1 : 1;
  34. __FLASH_DWORD s2 : 1;
  35. __FLASH_DWORD s3 : 1;
  36. __FLASH_DWORD s4 : 1;
  37. __FLASH_DWORD s5 : 1;
  38. __FLASH_DWORD s6 : 1;
  39. __FLASH_DWORD s7 : 1;
  40. __FLASH_DWORD s8 : 1;
  41. __FLASH_DWORD s9 : 1;
  42. __FLASH_DWORD s10 : 1;
  43. __FLASH_DWORD s11 : 1;
  44. __FLASH_DWORD s12 : 1;
  45. __FLASH_DWORD s13 : 1;
  46. __FLASH_DWORD s14 : 1;
  47. __FLASH_DWORD s15 : 1;
  48. __FLASH_DWORD s16 : 1;
  49. __FLASH_DWORD s17 : 1;
  50. __FLASH_DWORD s18 : 1;
  51. __FLASH_DWORD s19 : 1;
  52. __FLASH_DWORD s20 : 1;
  53. __FLASH_DWORD s21 : 1;
  54. __FLASH_DWORD s22 : 1;
  55. __FLASH_DWORD s23 : 1;
  56. __FLASH_DWORD s24 : 1;
  57. __FLASH_DWORD s25 : 1;
  58. __FLASH_DWORD s26 : 1;
  59. __FLASH_DWORD s27 : 1;
  60. __FLASH_DWORD s28 : 1;
  61. __FLASH_DWORD s29 : 1;
  62. __FLASH_DWORD s30 : 1;
  63. __FLASH_DWORD s31 : 1;
  64. };
  65. };
  66. union
  67. {
  68. __FLASH_DWORD hiprotect; // биты защиты секторов 32-63
  69. struct
  70. {
  71. __FLASH_DWORD s32 : 1;
  72. __FLASH_DWORD s33 : 1;
  73. __FLASH_DWORD s34 : 1;
  74. __FLASH_DWORD s35 : 1;
  75. __FLASH_DWORD s36 : 1;
  76. __FLASH_DWORD s37 : 1;
  77. __FLASH_DWORD s38 : 1;
  78. __FLASH_DWORD s39 : 1;
  79. __FLASH_DWORD s40 : 1;
  80. __FLASH_DWORD s41 : 1;
  81. __FLASH_DWORD s42 : 1;
  82. __FLASH_DWORD s43 : 1;
  83. __FLASH_DWORD s44 : 1;
  84. __FLASH_DWORD s45 : 1;
  85. __FLASH_DWORD s46 : 1;
  86. __FLASH_DWORD s47 : 1;
  87. __FLASH_DWORD s48 : 1;
  88. __FLASH_DWORD s49 : 1;
  89. __FLASH_DWORD s50 : 1;
  90. __FLASH_DWORD s51 : 1;
  91. __FLASH_DWORD s52 : 1;
  92. __FLASH_DWORD s53 : 1;
  93. __FLASH_DWORD s54 : 1;
  94. __FLASH_DWORD s55 : 1;
  95. __FLASH_DWORD s56 : 1;
  96. __FLASH_DWORD s57 : 1;
  97. __FLASH_DWORD s58 : 1;
  98. __FLASH_DWORD s59 : 1;
  99. __FLASH_DWORD s60 : 1;
  100. __FLASH_DWORD s61 : 1;
  101. __FLASH_DWORD s62 : 1;
  102. __FLASH_DWORD s63 : 1;
  103. };
  104. };
  105. };
  106. #pragma pack( pop )
  107. #pragma pack( push, 1 )
  108. typedef struct
  109. {
  110. // @sectors:
  111. // бит со значением flash_sector_protected означает, что сектор защищен от стирания/записи
  112. // бит со значением flash_sector_nomodify означает, что сектор не защищен
  113. struct flash_sectors_st sectors;
  114. __FLASH_BYTE protection_enabled : 1; // 0 - защита секторов отключена, 1 - включена
  115. __FLASH_BYTE _reserved : 7;
  116. }
  117. flash_api_getprotect_t;
  118. #pragma pack( pop )
  119. #pragma pack( push, 1 )
  120. typedef struct
  121. {
  122. // @sectors:
  123. // бит со значением flash_sector_protect_pick означает, что нужно защищитить сектор от стирания/записи
  124. // бит со значением flash_sector_nomodify означает, что не нужно менять статус защиты сектора
  125. struct flash_sectors_st sectors;
  126. __FLASH_BYTE protection_enabled: 1; // 0 (flash_sector_unprotected) - защита секторов отключена,
  127. // 1 (flash_sector_protected) - включена
  128. __FLASH_BYTE protection_modify : 7; // 0b0000000 (flash_sector_protect_nomodify) - не изменять бит защиты,
  129. // 0b1111111 (flash_sector_protect_modify) - изменить бит защиты
  130. }
  131. flash_api_protect_t;
  132. #pragma pack( pop )
  133. #pragma pack( push, 1 )
  134. typedef struct
  135. {
  136. // @sectors:
  137. // бит со значением flash_sector_protect_pick означает, что нужно снять защиту с сектора
  138. // бит со значением flash_sector_nomodify означает, что не нужно менять статус защиты сектора
  139. struct flash_sectors_st sectors;
  140. __FLASH_BYTE protection_enabled: 1; // 0 (flash_sector_unprotected) - защита секторов отключена,
  141. // 1 (flash_sector_protected) - включена
  142. __FLASH_BYTE protection_modify : 7; // 0b0000000 (flash_sector_protect_nomodify) - не изменять бит защиты,
  143. // 0b1111111 (flash_sector_protect_modify) - изменить бит защиты
  144. }
  145. flash_api_unprotect_t;
  146. #pragma pack( pop )
  147. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  148. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  149. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ЧТЕНИЕ/ЗАПИСЬ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  150. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  151. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  152. typedef __FLASH_DWORD flash_address_t;
  153. typedef __FLASH_DWORD flash_size_t;
  154. // режим стирания для flash_erase()
  155. typedef enum
  156. {
  157. fem_byaddress,
  158. fem_bypage,
  159. fem_byblock,
  160. fem_bysector,
  161. }
  162. flash_erase_mode_t;
  163. // режим записи для flash_write()
  164. typedef enum
  165. {
  166. fwm_safewrite, // безопасная запись
  167. fwm_fastwrite, // быстрая запись
  168. fwm_compatible, // промежуточный режим м/у быстрой и безопасной записью
  169. }
  170. flash_write_mode_t;
  171. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  172. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  173. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ДОПОЛНИТЕЛЬНО №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  174. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  175. // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
  176. typedef enum
  177. { // ЗАПРОС // РАЗМЕР БУФЕРА // ПОЛУЧИТЬ:
  178. fsvc_getVendorId, // 2 // ID производителя
  179. fsvc_getDeviceId, // 2 // ID устройства (__flash_deviceid_t)
  180. fsvc_getExtInfo, // * // расширенную информацию производителя
  181. fsvc_getExtInfoLen, // 1 // длинну расширенной информации производителя
  182. fsvc_getDataCapacity, // 4 // доступная емкость устройства (в байтах)
  183. fsvc_getFullCapacity, // 4 // полная емкость устройства (в байтах)
  184. fsvc_getCapacity, // 4 // заявляемая емкость устройства по документации (MBit-s)
  185. fsvc_getProtect, // 1 // информацию о защите секторов (общий бит защиты 0x00 или 0x01)
  186. fsvc_getSectorsCount, // 2 // количество секторов
  187. fsvc_getPagesCount, // 2 // количество страниц
  188. fsvc_getBlocksCount, // 2 // количество блоков
  189. fsvc_getPageSize, // 2 // размер страницы
  190. fsvc_getReadyState, // 1 // готовность устройства
  191. fsvc_getMinAddress, // 4 // минимально возможный линейный адрес
  192. fsvc_getMaxAddress, // 4 // максимально возможный линейный адрес
  193. }
  194. flash_service_info_t;
  195. typedef struct
  196. {
  197. flash_address_t minAddress;
  198. flash_address_t maxAddress;
  199. flash_size_t maxSectors;
  200. flash_size_t sectorSize;
  201. const char * pChipDescription; // textual flash-chip description
  202. }
  203. flash_properties_t;
  204. // flash_api_descriptor_t
  205. // Дескриптор API чипа энергонезависимой памяти
  206. typedef struct
  207. {
  208. struct
  209. {
  210. // flash_protect - установить защиту секторов
  211. flash_err_t (*flashProtect)( flash_api_protect_t * content );
  212. // flash_protect - снять защиту секторов
  213. flash_err_t (*flashUnprotect)( flash_api_protect_t * content );
  214. // flash_initialize - инициализация драйвера и API работы с устройством
  215. flash_err_t (*flashInitialize)( bool detectMode );
  216. // flash_getready - проверка готовности устройства (со стандартным таймаутом)
  217. flash_err_t (*flashGetReady)();
  218. // flash_service - функция получения общих сведений об флеш-памяти.
  219. flash_err_t (*flashService)( flash_service_info_t si, void * pdata, __FLASH_WORD * pbufsize );
  220. // flash_protect_ex - установить/снять защиту секторов
  221. flash_err_t (*flashProtectEx)( flash_api_protect_t * content, flash_api_protect_bits mode );
  222. // flash_getprotect - получить информацию о защищенных секторах.
  223. flash_err_t (*flashGetProtect)( flash_api_getprotect_t * content );
  224. // flash_erase - мультирежимное стирание данных
  225. flash_err_t (*flashErase)( flash_erase_mode_t mode, __FLASH_DWORD start, __FLASH_DWORD count );
  226. // flash_write - мультирежимная запись данных по адресу
  227. flash_err_t (*flashWrite)( flash_address_t address, __FLASH_BYTE * pBuffer, flash_address_t size, flash_write_mode_t mode );
  228. // flash_read - чтение данных по адресу
  229. flash_err_t (*flashRead)( flash_address_t address, __FLASH_BYTE * pBuffer, flash_address_t size );
  230. // flash_sleepmode - переход в режим пониженного энергопотребления
  231. flash_err_t (*flashSleepMode)();
  232. // flash_wakeup - выход из режима пониженного энергопотребления
  233. flash_err_t (*flashWakeup)();
  234. // flash_finalize - деинициализация драйвера
  235. flash_err_t (*flashFinalize)( bool bHibernate, bool bForce );
  236. }
  237. routines;
  238. const flash_properties_t * flashProperties;
  239. }
  240. flash_api_descriptor_t;
  241. #endif