 // Файл с прототипами низкоуровневых комманд для AT45DB161E.
 // v 1.12 от 21/07/15
 // v 1.13 от 14/10/19
 // Автор: Сычев А.

#ifdef AT45DB161E_H
#if defined(AT45DB161E_LOWLEVEL) || defined(AT45DB161E_APILEVEL)
 // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
 // №№№№№№№№№№№№№№№№№№№№№№ НИЗКОУРОВНЕВЫЕ НЕБЕЗОПАСНЫЕ ФУНКЦИИ №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
 // №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
 //
 // подробнее см. AT45DBXXX_LL.c
 //
 struct AT45_LL_Routines_st
 {
      // __flash_hal__statusread - чтение регистра статуса
      void (*statusread)( __flash_status_t * pcReadRegister );   // буфер для чтения статус-регистра    

      // __flash_hal__page_read - чтение одной страницы
      void (*page_read)( __FLASH_WORD wPageNum,      // номер страницы для чтения
                                __FLASH_WORD wPageOfs,      // адрес начала чтения в странице
                                __FLASH_BYTE * pDataRead,   // указатель на буфер-приемник данных
                                __FLASH_WORD wCntToRead );  // количество данных на чтение

      // __flash_hal__array_read - последовательное чтение (массив)    
      void (*array_read) ( __FLASH_WORD wPageNum,      // номер начальной страницы для чтения
                                  __FLASH_WORD wPageOfs,      // адрес начала чтения в начальной странице
                                  __FLASH_BYTE * pDataRead,   // указатель на буфер-приемник данных
                                  __FLASH_WORD wCntToRead );  // количество данных на чтение

      // __flash_hal__use512page - сконфигурировать чип на работу со стандартной страницей 512 байт   
      void (*use512page)();

      // __flash_hal__buffer1_read - чтение буфера 1 (up to 66 MHz)
      void (*buffer1_read)( __FLASH_WORD wBuffOfs,      // адрес начала чтения в буфере
                                      __FLASH_BYTE * pDataRead,   // указатель на буфер-приемник данных
                                      __FLASH_WORD wCntToRead );  // количество данных на чтение
      
      // __flash_hal__buffer2_read - чтение буфера 2 (up to 66 MHz)
      void (*buffer2_read)( __FLASH_WORD wBuffOfs,      // адрес начала чтения в буфере
                                      __FLASH_BYTE * pDataRead,   // указатель на буфер-приемник данных
                                      __FLASH_WORD wCntToRead );  // количество данных на чтение
      
      // __flash_hal__buffer1_read_slow - чтение буфера 1 (up to 33 MHz)
      void (*buffer1_read_slow)( __FLASH_WORD wBuffOfs,      // адрес начала чтения в буфере
                                          __FLASH_BYTE * pDataRead,   // указатель на буфер-приемник данных
                                          __FLASH_WORD wCntToRead );  // количество данных на чтение
      
      // __flash_hal__buffer2_read_slow - чтение буфера 2 (up to 33 MHz)
      void (*buffer2_read_slow)( __FLASH_WORD wBuffOfs,      // адрес начала чтения в буфере
                                          __FLASH_BYTE * pDataRead,   // указатель на буфер-приемник данных
                                          __FLASH_WORD wCntToRead );  // количество данных на чтение
      
      // __flash_hal__buffer1_write - запись буфера 1
      void (*buffer1_write)( __FLASH_WORD wBuffOfs,      // адрес начала записи в буфере-приемнике (чип)
                                    __FLASH_BYTE * pDataWrite,  // указатель на буфер-источник данных
                                    __FLASH_WORD wCntToWrite ); // количество данных на запись

      // __flash_hal__buffer2_write - запись буфера 2
      void (*buffer2_write)( __FLASH_WORD wBuffOfs,      // адрес начала записи в буфере-приемнике (чип)
                                      __FLASH_BYTE * pDataWrite,  // указатель на буфер-источник данных
                                      __FLASH_WORD wCntToWrite ); // количество данных на запись
      
      // __flash_hal__buffer1_program - программирование буфера 1 в страницу со стиранием
      void (*buffer1_program)( __FLASH_WORD wPageNum );      // номер страницы, куда произвести программирование
      
      // __flash_hal__buffer2_program - программирование буфера 2 в страницу со стиранием
      void (*buffer2_program)( __FLASH_WORD wPageNum );      // номер страницы, куда произвести программирование
      
      // __flash_hal__buffer1_program_wo_erase - программирование буфера 1 в страницу без стирания
      void (*buffer1_program_wo_erase)( __FLASH_WORD wPageNum );      // номер страницы, куда произвести программирование


      // __flash_hal__buffer2_program_wo_erase - программирование буфера 2 в страницу без стирания
      void (*buffer2_program_wo_erase)( __FLASH_WORD wPageNum );      // номер страницы, куда произвести программирование
      
      // __flash_hal__page_erase - стирание страницы
      void (*page_erase)( __FLASH_WORD wPageNum );      // номер стираемой страницы
      
      // __flash_hal__block_erase - стирание блока
      void (*block_erase)( __FLASH_WORD wBlockNum );      // номер стираемого блока
      
      // __flash_hal__sector0_erase - стирание секторов 0a и 0b
      void (*sector0_erase)( __FLASH_WORD wSubSector );      // номер подсектора 0 или 1
      
      // __flash_hal__sector_erase - стирание секторов с номером 1 и выше
      void (*sector_erase)( __FLASH_WORD wSector );      // номер сектора 1-63

      // __flash_hal__page_write_via_buffer1 - запись страницы через буфер 1
      void (*page_write_via_buffer1)(  __FLASH_WORD wBuffOfs,      // адрес начала записи в буфере-приемнике (чип)
                                              __FLASH_BYTE * pDataWrite,  // указатель на буфер-источник данных
                                              __FLASH_WORD wCntToWrite,   // количество данных на запись
                                              __FLASH_WORD wPageNum  );     // номер страницы, куда произвести программирование
      
      // __flash_hal__page_write_via_buffer2 - запись страницы через буфер 2
      void (*page_write_via_buffer2)(  __FLASH_WORD wBuffOfs,      // адрес начала записи в буфере-приемнике (чип)
                                              __FLASH_BYTE * pDataWrite,  // указатель на буфер-источник данных
                                              __FLASH_WORD wCntToWrite,   // количество данных на запись
                                              __FLASH_WORD wPageNum );      // номер страницы, куда произвести программирование
      
      // __flash_hal__pagetobuffer1 - загрузка содержимого страницы в буфер 1
      void (*pagetobuffer1)(  __FLASH_WORD wPageNum );      // номер страницы для загрузки

      // __flash_hal__pagetobuffer2 - загрузка содержимого страницы в буфер 2
      void (*pagetobuffer2)(  __FLASH_WORD wPageNum );      // номер страницы для загрузки
      
      // __flash_hal__pagetobuffer1 - сравнение содержимого страницы с буфером 1
      void (*buffer1_compare)(  __FLASH_WORD wPageNum );      // номер страницы для сравнения

      // __flash_hal__pagetobuffer2 - сравнение содержимого страницы с буфером 2
      void (*buffer2_compare)(  __FLASH_WORD wPageNum );      // номер страницы для сравнения
      
      // __flash_hal__autopagerewrite - обновление страницы через буфер 1
      void (*autopagerewrite1)( __FLASH_WORD wPageNum );      // номер обновляемой страницы

      // __flash_hal__autopagerewrite - обновление страницы через буфер 2
      void (*autopagerewrite2)( __FLASH_WORD wPageNum );      // номер обновляемой страницы
      
      // __flash_hal__sleepmode - переход в режим пониженного энергопотребления
      void (*sleepmode)();
      
      // __flash_hal__wakeup - выход из режима пониженного энергопотребления
      void (*wakeup)();
      
      // __flash_hal__manufactureridread - чтение идентификатора производителя
      __FLASH_DWORD (*manufactureridread)( __flash_id_t * pManufacturerID ); // необязательный параметр-буфер для приема расширенной информации

      // __flash_hal__writeprotect_enable - включить программную защиту от записи/стирания
      void (*writeprotect_enable)();
      
      // __flash_hal__writeprotect_disable - выключить программную защиту от записи/стирания
      void (*writeprotect_disable)();
      
      // __flash_hal__protectregister_erase - стирает регистр защиты, помечая ВСЕ сектора как защищенные
      // # если включена программная защита от записи, все операции стирания/записи для всех секторов будут заблокированы до ее отключения
      void (*protectregister_erase)();
      
      // __flash_hal__protectregister_write - записывает регистр защиты
      void (*protectregister_write)( __flash_protectionregister_t * contents );// содержимое регистра защиты для записи

      // __flash_hal__protectregister_read - прочитывает регистр защиты
      void (*protectregister_read)( __flash_protectionregister_t * contents ); // буфер-приемник содержимого регистра защиты
      
      // __flash_hal__sectorlockdown - постоянная блокировка сектора от записи/стирания
      void (*sectorlockdown)( __FLASH_DWORD address );  // адрес внутри блокируемого сектора
      
      // __flash_hal__lockdownregister_read - прочитывает регистр блокировки
      void (*lockdownregister_read)( __flash_lockdownregister_t * contents ); // буфер-приемник содержимого регистра блокировки
      
      // __flash_hal__securityregister_write - записывает регистр безопасности
      // * записывает только ПОЛЬЗОВАТЕЛЬСКУЮ часть
      // # РЕГИСТР БЕЗОПАСНОСТИ МОЖЕТ БЫТЬ ЗАПИСАН ТОЛЬКО ОДИН РАЗ!
      void (*securityregister_write)( __flash_usersecurityregister_t * contents ); // содержимое регистра безопасности (часть, доступная для записи пользователю)
      
      // __flash_hal__securityregister_read - прочитывает регистр безопасности
      void (*securityregister_read)( __flash_securityregister_t * contents ); // буфер-приемник содержимого регистра блокировки

      // __flash_hal__securityregister_validate - прочитывает регистр безопасности и выполняет
      // проверку осмысленности прочитанного заводского идентификатора.
      bool (*securityregister_validate)( __flash_securityregister_t * contents ); // буфер-приемник содержимого регистра блокировки
      
      // __flash_hal__getprotectstate - получение состояния общего бита защиты
      flash_err_t (*getprotectstate)( );

      // __flash_hal__getreadyfast - проверка занятости без ожидания
      flash_err_t (*getreadyfast)( );
      
      // __flash_hal__getcompareresult - проверка результата сравнения (бит COMP / bMismatch)
      flash_err_t (*getcompareresult)( );
      
      // __flash_hal__startupDetect - Низкоуровневое определение наличия чипа (доступности)
      flash_err_t (*startupDetect)();

      // __flash_hal__initialize - Низкоуровневая инициализация флешпамяти                                   );
      flash_err_t (*initialize)();
      
      // __flash_hal__dirtyDetect - Низкоуровневое определение наличия чипа (доступности)
      flash_err_t (*dirtyDetect)();
      
      // служебные функции доступа к памяти драйвера
      // __flash_internal_getbuffer_protect
      __flash_protectionregister_t * (*internal_getbuffer_protect)();
      
      // служебные функции доступа к памяти драйвера
      // __flash_internal_getbuffer_page
      __FLASH_BYTE * (*internal_getbuffer_page)();

      // служебная функция для проверки готовности чипа
      int (*smart_waitms)( __FLASH_WORD wTimems );
      
      #if AT45DBXXX_POWER_MANAGEMENT > 0
      // __flash_hal__power_on - реализует управление питанием микросхемы памяти (подает питание)
      void (*power_on)();
      
      // __flash_hal__power_off - реализует управление питанием микросхемы памяти (снимает питание)
      void (*power_off)();
      
      // __flash_hal__power_pulse - реализует управление питанием микросхемы - формирует импульс перезагрузки
      void (*power_pulse)( __FLASH_WORD nCooldownTime_ms, __FLASH_WORD nStartupTime_ms );
      #endif
      
      #if AT45DBXXX_RESET_MANAGEMENT > 0
      // __flash_hal__reset_assert - реализует управление сигналом сброса микросхемы памяти (устанавливает сигнал сброса)
      void (*reset_assert)();
      
      // __flash_hal__reset_release - реализует управление сигналом сброса микросхемы памяти (снимает сигнал сброса)
      void (*reset_release)();
      
      // __flash_hal__reset_pulse - реализует управление сигналом сброса микросхемы памяти (подает законченный импульс сброса)
      void (*reset_pulse)();
      #endif
      
      // __flash_hal__finalize_prepare - Низкоуровневая функция для подготовки флешпамяти к деинициализации драйвера
      flash_err_t (*finalize_prepare)();
 };
 typedef struct AT45_LL_Routines_st AT45_LL_Routines_t;

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























