// Файл с прототипами интерфейсных функций для работы // с AT45DB321D на высоком уровне. // // v 1.3 от 17/04/19 // Автор: Сычев А. #if !defined(AT45DBXXX_IMPORT_H) && !defined(AT45DB321D_API_C) // AT45DBXXX_IMPORT_H - предотвращает ошибки при рекурсивном включении пользователем // заголовочных файлов этого драйвера внутри AT45DBXXX_import.h #undef AT45DB321D_APILEVEL #undef AT45DB321D_LOWLEVEL #endif #include "drivers\flash\lowlevel\AT45DB321D_GLOB.h" #include "drivers\flash\common\AT45DB321D_ERR.h" #ifndef AT45DB321D_API_H #define AT45DB321D_API_H // TODO: // flash_error_restore(...) // восстановление после некоторых ошибок (см. FLERR_UNEXPECTED_BUSY) // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ЗАЩИТА СЕКТОРОВ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ #pragma pack( push, 1 ) typedef enum { // flash_getprotect flash_sector_unprotected = 0, // не защищен flash_sector_protected = 1, // защищен //-------------------------------- flash_sector_protect_nomodify = 0, // не модифицировать биты защиты: общий/частный flash_sector_protect_modify = 0x7f, // модифицировать общий бит защиты flash_sector_protect_pick = 1, // отметить сектор для операции снятия/установки защиты } flash_api_protect_bits; #pragma pack( pop ) #pragma pack( push, 1 ) struct flash_sectors_st { union { __FLASH_DWORD loprotect; // биты защиты секторов 0-31 __FLASH_BYTE bytes[1]; // для внутреннего пользования struct { __FLASH_DWORD s0 : 1; // на весь сектор 0 выделен один бит. Либо секторы 0a,0b защищены, либо нет. __FLASH_DWORD s1 : 1; __FLASH_DWORD s2 : 1; __FLASH_DWORD s3 : 1; __FLASH_DWORD s4 : 1; __FLASH_DWORD s5 : 1; __FLASH_DWORD s6 : 1; __FLASH_DWORD s7 : 1; __FLASH_DWORD s8 : 1; __FLASH_DWORD s9 : 1; __FLASH_DWORD s10 : 1; __FLASH_DWORD s11 : 1; __FLASH_DWORD s12 : 1; __FLASH_DWORD s13 : 1; __FLASH_DWORD s14 : 1; __FLASH_DWORD s15 : 1; __FLASH_DWORD s16 : 1; __FLASH_DWORD s17 : 1; __FLASH_DWORD s18 : 1; __FLASH_DWORD s19 : 1; __FLASH_DWORD s20 : 1; __FLASH_DWORD s21 : 1; __FLASH_DWORD s22 : 1; __FLASH_DWORD s23 : 1; __FLASH_DWORD s24 : 1; __FLASH_DWORD s25 : 1; __FLASH_DWORD s26 : 1; __FLASH_DWORD s27 : 1; __FLASH_DWORD s28 : 1; __FLASH_DWORD s29 : 1; __FLASH_DWORD s30 : 1; __FLASH_DWORD s31 : 1; }; }; union { __FLASH_DWORD hiprotect; // биты защиты секторов 32-63 struct { __FLASH_DWORD s32 : 1; __FLASH_DWORD s33 : 1; __FLASH_DWORD s34 : 1; __FLASH_DWORD s35 : 1; __FLASH_DWORD s36 : 1; __FLASH_DWORD s37 : 1; __FLASH_DWORD s38 : 1; __FLASH_DWORD s39 : 1; __FLASH_DWORD s40 : 1; __FLASH_DWORD s41 : 1; __FLASH_DWORD s42 : 1; __FLASH_DWORD s43 : 1; __FLASH_DWORD s44 : 1; __FLASH_DWORD s45 : 1; __FLASH_DWORD s46 : 1; __FLASH_DWORD s47 : 1; __FLASH_DWORD s48 : 1; __FLASH_DWORD s49 : 1; __FLASH_DWORD s50 : 1; __FLASH_DWORD s51 : 1; __FLASH_DWORD s52 : 1; __FLASH_DWORD s53 : 1; __FLASH_DWORD s54 : 1; __FLASH_DWORD s55 : 1; __FLASH_DWORD s56 : 1; __FLASH_DWORD s57 : 1; __FLASH_DWORD s58 : 1; __FLASH_DWORD s59 : 1; __FLASH_DWORD s60 : 1; __FLASH_DWORD s61 : 1; __FLASH_DWORD s62 : 1; __FLASH_DWORD s63 : 1; }; }; }; #pragma pack( pop ) #pragma pack( push, 1 ) typedef struct { // @sectors: // бит со значением flash_sector_protected означает, что сектор защищен от стирания/записи // бит со значением flash_sector_nomodify означает, что сектор не защищен struct flash_sectors_st sectors; __FLASH_BYTE protection_enabled : 1; // 0 - защита секторов отключена, 1 - включена __FLASH_BYTE _reserved : 7; } flash_api_getprotect_t; #pragma pack( pop ) #pragma pack( push, 1 ) typedef struct { // @sectors: // бит со значением flash_sector_protect_pick означает, что нужно защищитить сектор от стирания/записи // бит со значением flash_sector_nomodify означает, что не нужно менять статус защиты сектора struct flash_sectors_st sectors; __FLASH_BYTE protection_enabled: 1; // 0 (flash_sector_unprotected) - защита секторов отключена, // 1 (flash_sector_protected) - включена __FLASH_BYTE protection_modify : 7; // 0b0000000 (flash_sector_protect_nomodify) - не изменять бит защиты, // 0b1111111 (flash_sector_protect_modify) - изменить бит защиты } flash_api_protect_t; #pragma pack( pop ) #pragma pack( push, 1 ) typedef struct { // @sectors: // бит со значением flash_sector_protect_pick означает, что нужно снять защиту с сектора // бит со значением flash_sector_nomodify означает, что не нужно менять статус защиты сектора struct flash_sectors_st sectors; __FLASH_BYTE protection_enabled: 1; // 0 (flash_sector_unprotected) - защита секторов отключена, // 1 (flash_sector_protected) - включена __FLASH_BYTE protection_modify : 7; // 0b0000000 (flash_sector_protect_nomodify) - не изменять бит защиты, // 0b1111111 (flash_sector_protect_modify) - изменить бит защиты } flash_api_unprotect_t; #pragma pack( pop ) // flash_protect - установить защиту секторов // * параметр @content может быть равен NULL flash_err_t flash_protect( flash_api_protect_t * content ); // flash_protect - снять защиту секторов // * параметр @content может быть равен NULL flash_err_t flash_unprotect( flash_api_protect_t * content ); // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ЧТЕНИЕ/ЗАПИСЬ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ typedef __FLASH_DWORD flash_address_t; typedef __FLASH_DWORD flash_size_t; // режим стирания для flash_erase() typedef enum { fem_byaddress, fem_bypage, fem_byblock, fem_bysector, } flash_erase_mode_t; // режим записи для flash_write() typedef enum { fwm_safewrite, // безопасная запись fwm_fastwrite, // быстрая запись fwm_compatible, // промежуточный режим м/у быстрой и безопасной записью } flash_write_mode_t; // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ДОПОЛНИТЕЛЬНО №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ typedef enum { // ЗАПРОС // РАЗМЕР БУФЕРА // ПОЛУЧИТЬ: fsvc_getVendorId, // 2 // ID производителя fsvc_getDeviceId, // 2 // ID устройства (__flash_deviceid_t) fsvc_getExtInfo, // * // расширенную информацию производителя fsvc_getExtInfoLen, // 1 // длинну расширенной информации производителя fsvc_getDataCapacity, // 4 // доступная емкость устройства (в байтах) fsvc_getFullCapacity, // 4 // полная емкость устройства (в байтах) fsvc_getCapacity, // 4 // заявляемая емкость устройства по документации (MBit-s) fsvc_getProtect, // 1 // информацию о защите секторов (общий бит защиты 0x00 или 0x01) fsvc_getSectorsCount, // 2 // количество секторов fsvc_getPagesCount, // 2 // количество страниц fsvc_getBlocksCount, // 2 // количество блоков fsvc_getPageSize, // 2 // размер страницы fsvc_getReadyState, // 1 // готовность устройства fsvc_getMinAddress, // 4 // минимально возможный линейный адрес fsvc_getMaxAddress, // 4 // максимально возможный линейный адрес } flash_service_info_t; typedef struct { flash_address_t minAddress; flash_address_t maxAddress; flash_size_t maxSectors; flash_size_t sectorSize; } flash_properties_t; extern const flash_properties_t FlashProperties; #endif