 // Файл с прототипами низкоуровневых комманд для W25Q16JV.
 // v 1.0 от 12/10/20
 // Автор: Сычев А.

#ifdef W25Q16JV_H
#if defined(W25Q16JV_LOWLEVEL) || defined(W25Q16JV_APILEVEL)
 // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
 // №№№№№№№№№№№№№№№№№№№№№№ НИЗКОУРОВНЕВЫЕ НЕБЕЗОПАСНЫЕ ФУНКЦИИ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
 // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
 //
 // подробнее см. W25QXXX_LL.c
 //
 // --------------------------------------------------------------------------------------------------------
 typedef struct
 {
     struct
     {
        void (* writeDisable )();  // запрещение команд записи / __flash_hal__writedisable
        void (* writeEnable )();   // разрешение команд записи / __flash_hal__writeenable
     }
     operations;

     struct
     {
        void (* statusRead1 )( __flash_status1_t * pcReadRegister ); // чтение регистра статуса / __flash_hal__statusRead1
        void (* statusRead2 )( __flash_status2_t * pcReadRegister ); // чтение регистра статуса / __flash_hal__statusRead2
        void (* statusRead3 )( __flash_status3_t * pcReadRegister ); // чтение регистра статуса / __flash_hal__statusRead3
        void (* statusWrite1)( __flash_status1_t * pcReadRegister ); // запись регистра статуса / __flash_hal__statusWrite1
        void (* statusWrite2)( __flash_status2_t * pcReadRegister ); // запись регистра статуса / __flash_hal__statusWrite2
        void (* statusWrite3)( __flash_status3_t * pcReadRegister ); // запись регистра статуса / __flash_hal__statusWrite3
     }
     status;

     struct
     {
        void (* securityRegister1Erase)(); // стирание регистра 1 безопасности / __flash_hal__securityRegister1Erase
        void (* securityRegister2Erase)(); // стирание регистра 2 безопасности / __flash_hal__securityRegister2Erase 
        void (* securityRegister3Erase)(); // стирание регистра 3 безопасности / __flash_hal__securityRegister3Erase
        void (* securityRegister1Write)(__flash_securityregister_t * contents); // запись регистра 1 безопасности / __flash_hal__securityRegister1Write
        void (* securityRegister2Write)(__flash_securityregister_t * contents); // запись регистра 2 безопасности / __flash_hal__securityRegister2Write 
        void (* securityRegister3Write)(__flash_securityregister_t * contents); // запись регистра 3 безопасности / __flash_hal__securityRegister3Write 
        void (* securityRegister1Read)(__flash_securityregister_t * contents); // чтение регистра 1 безопасности / __flash_hal__securityRegister1Read
        void (* securityRegister2Read)(__flash_securityregister_t * contents); // чтение регистра 2 безопасности / __flash_hal__securityRegister2Read 
        void (* securityRegister3Read)(__flash_securityregister_t * contents); // чтение регистра 3 безопасности / __flash_hal__securityRegister3Read 
     }
     security;

     struct
     {
        void (* globalLock)();   // установить блокировку записи на все сектора/блоки / __flash_hal__globalLock
        void (* globalUnlock)(); // снять блокировку записи со всех секторов/блоков / __flash_hal__globalUnlock
        void (* protectStateWrite)( size_t nProtSector, bool protectState ); // записывает индивидуальную блокировку сектора/блока / __flash_hal__protectStateWrite
        bool (* protectStateRead)( size_t nProtSector ); // считывает индивидуальную блокировку сектора/блока / __flash_hal__protectStateRead
     }
     protection;

     struct
     {
        void (* sleepMode)();  // переход в режим энергосбережения / __flash_hal__sleepMode
        void (* wakeUp)(); // выход из режима энергосбережения / __flash_hal__wakeUp
     }
     sleep;

     struct
     {   
        void (* arrayRead)( __FLASH_DWORD w24Address, __FLASH_BYTE * pDataRead, __FLASH_WORD wCntToRead ); // последовательное чтение (массив) /  __flash_hal__arrayRead
        void (* chunkProgram)( __flash_pageprogramptr_t pdata, __FLASH_DWORD w24Address); // программирование страницы без стирания блока/страницы / __flash_hal__chunkProgram
        void (* pageErase)( __FLASH_WORD wPageNum );   // стирание страницы / __flash_hal__pageErase        
        void (* sectorErase)( __FLASH_WORD wSector );  // стирание сектора / __flash_hal__sectorErase 
     }   
     data;

     struct
     {
        __FLASH_DWORD (*manufacturerIdRead)( __flash_id_t * pManufacturerID );  // чтение идентификатора производителя / __flash_hal__manufacturerIdRead
        void (*uniqueIdRegisterRead)( __flash_uniqueidregister_t * contents );   // прочитывает регистр уникального идентификатора (UniqueID)  / __flash_hal__uniqueIdRegisterRead
        bool (*uniqueIdRegisterValidate)( __flash_uniqueidregister_t * contents );   // прочитывает регистр UniqueID и выполняет его проверку  / __flash_hal__uniqueIdRegisterValidate
     }
     id;

     struct
     {
        flash_err_t (*startupDetect)(); // Низкоуровневая инициализация флешпамяти / __flash_hal__startupDetect  
        flash_err_t (*initialize)(); // Низкоуровневая инициализация флешпамяти / __flash_hal__initialize  
        flash_err_t (*finalizePrepare)(); // Низкоуровневая функция для подготовки флешпамяти к деинициализации драйвера / __flash_hal__finalize_prepare  
        flash_err_t (*dirtyDetect)(); // Низкоуровневое определение наличия чипа (доступности) / __flash_hal__dirtyDetect
        void * (*getBuf)( __flash_internal_buffer_type_t type, size_t * pRetBufSize ); // запросить внутренний буфер низкого уровня / __flash_hal__getBuffer
     }
     service;

     #if W25QXXX_POWER_MANAGEMENT > 0
     struct
     {
        void (*powerOn)();    // реализует управление питанием микросхемы памяти (подает питание) / __flash_hal__power_on 
        void (*powerOff)();   // реализует управление питанием микросхемы памяти (снимает питание) / __flash_hal__power_off
        void (*powerPulse)( __FLASH_WORD nCooldownTime_ms, __FLASH_WORD nStartupTime_ms ); // реализует управление питанием микросхемы - формирует импульс перезагрузки / __flash_hal__power_pulse
     }
     power;
     #endif
     #if W25QXXX_RESET_MANAGEMENT > 0
     struct
     {
        void (*resetAssert)();    // реализует управление сигналом сброса микросхемы памяти (устанавливает сигнал сброса) / __flash_hal__reset_assert 
        void (*resetRelease)();   // реализует управление сигналом сброса микросхемы памяти (снимает сигнал сброса) / __flash_hal__reset_release
        void (*resetPulse)();     // реализует управление сигналом сброса микросхемы памяти (подает законченный импульс сброса) / __flash_hal__reset_pulse
     }
     reset;
     #endif

     struct
     { 
        flash_err_t (*getReadyFast)(); // проверка занятости без ожидания / __flash_hal__getReadyFast
        int (*smartWaitms)( __FLASH_WORD wTimems ); // служебная функция для проверки готовности чипа / __flash_smartWaitms
     }
     ready;
 }
 W25Q_LL_Routines_t;
 
 extern const W25Q_LL_Routines_t W25Q_LL_Routines;
 
 // __flash_hal__getprotectstate - получение состояния общего бита защиты
 flash_err_t __flash_hal__getprotectstate( ); // [W25Q WRONG]

 // служебные функции доступа к памяти драйвера
 //
 __flash_protectionregister_t * __flash_internal_getbuffer_protect();
 __FLASH_BYTE * __flash_internal_getbuffer_page();


#else
#error FLASH HAL: вы подключили заголовочный файл для низкоуровневых операций.
#endif
#else
#error FLASH HAL: подключите сначала заголовочный файл W25Q16JV.h
#endif























