 // Файл импорта внешних функций
 // v 1.0 от 20/07/15
 // v 1.1 от 14/10/19
 // Автор: Сычев А.

 // Драйвер управления AD45DB161E использует интерфейсные функции SSP и системного таймера
 // Для нормальной работы требуется, чтобы в системе присутствовали следующие функции:
 //  * функция обмена по SSP/SPI (двустороннйий обмен)
 //  * функции управления ChipSelect
 //  * функции задержки на микросекунды и миллисекунды
 //  * функция получения отметки времени (системный таймер) в миллисекундах
 //  * функция отключения/включения питания чипа
 //  * функции работы с памятью

#ifndef AT45DBXXX_IMPORT_H
#define AT45DBXXX_IMPORT_H

 #include "drivers/flash/at45/config/at45db161e_conf.h" 

 typedef struct
 {
      #if AT45DBXXX_POWER_MANAGEMENT
      void ( *SetPinPowerOn)(); 
      void ( *SetPinPowerOff)();
      #endif
      #if AT45DBXXX_RESET_MANAGEMENT                                         
      void ( *ResetPinAssert)(); 
      void ( *ResetPinRelease)();
      #endif
      #if AT45DBXXX_HW_WR_PROTECT
      void ( *HwWrProtPinAssert)(); 
      void ( *HwWrProtPinRelease)();
      #endif
 }
 ExtMemPins_Handle_AT45_t;

#ifdef AT45DBXXX_HAL_H

 // переопределите макросы на ваши функции (имя внутреннего макроса менять не надо)
 #include "stm32l1xx_hal.h" // HAL_GetTick()
 #include "core/main.h"          // HAL_Wait_us()
 #include "drivers/spi/spi.h" // SPIHandle
 
 #include <string.h>

 // Import SPI handle
 #define pSPIHandle (&SPIHandle)

 #if AT45DBXXX_POWER_MANAGEMENT || AT45DBXXX_RESET_MANAGEMENT || AT45DBXXX_HW_WR_PROTECT
 extern const ExtMemPins_Handle_AT45_t ExtMemPinsHandle_AT45;
 // Import External Memory Pins Handle
 #define pExtMemPinsHandle (&ExtMemPinsHandle_AT45)
 #endif 

 //      внутренний макрос          |  ваша функция
 #define __imp_sys_delayus(_1us)     HAL_Wait_us(_1us)                  // ожидание, в микросекундах
 #define __imp_sys_delayms(_1ms)     HAL_Delay(_1ms)                    // ожидание, в миллисекундах
 #define __imp_sys_gettimer()        HAL_GetTick()                      // возвращает количество тиков системы с момента старта системы
 #define __imp_ssp_cshi()            pSPIHandle->SetNSS()               // #CS в состояние 1 (HiLogicLevel)
 #define __imp_ssp_cslo()            pSPIHandle->ClrNSS()               // #CS в состояние 0 (LoLogicLevel)
 #define __imp_ssp_ro(r,c)           pSPIHandle->Receive(r,c)           // функция обмена по SSP / SPI
 #define __imp_ssp_wo(w,c)           pSPIHandle->Transmit(w,c)          // функция обмена по SSP / SPI

 // ------------------------------------------------------------------------------------
 // __imp_ssp_io - функция двунаправленного обмена - не требуется, если есть __imp_ssp_ro и __imp_ssp_wo
 //#define __imp_ssp_io(w,r,c)       pSPIHandle->TransmitReceive(w,r,c) // функция обмена по SSP / SPI

 // ------------------------------------------------------------------------------------
 // __imp_ssp_io_rev - функция передачи данных по SPI в обратном порядке байт.
 // Создается для ускорения процесса обмена. Если такая функция отсутсвует в вашей системе,
 // не объявляйте макрос __imp_ssp_io_rev. При этом драйвер будет сам инвертировать порядок
 // байт в ущерб производительности.
 /*
 #define __imp_ssp_io_rev(w,r,c)     ssp_ior(w,r,c)      // функция обмена по SSP / SPI в обратном порядке байт
 */

 #if AT45DBXXX_POWER_MANAGEMENT
 // Опция AT45DBXXX_POWER_MANAGEMENT
 #define __imp_flash_poweron()             pExtMemPinsHandle->SetPinPowerOn()
 #define __imp_flash_poweroff()            pExtMemPinsHandle->SetPinPowerOff()
 #endif

 #if AT45DBXXX_RESET_MANAGEMENT
 // Опция AT45DBXXX_RESET_MANAGEMENT
 #define __imp_flash_reset_assert()        pExtMemPinsHandle->ResetPinAssert()
 #define __imp_flash_reset_release()       pExtMemPinsHandle->ResetPinRelease()
 #endif

 #if AT45DBXXX_HW_WR_PROTECT
 // Опция AT45DBXXX_HW_WR_PROTECT
 #define __imp_flash_hwwrprotect_assert()  pExtMemPinsHandle->HwWrProtPinAssert()
 #define __imp_flash_hwwrprotect_release() pExtMemPinsHandle->HwWrProtPinRelease()
 #endif
 // ------------------------------------------------------------------------------------
 // __imp_flash_powercycle - перезапуск чипа по питанию.
 // нужна если требуется аппаратное конфигурирование чипа на размер 512 байт (одноразовое перепрограммирование)
 // Эта функция требуется ТОЛЬКО ЕСЛИ:
 // * 1) запрещено управление питанием (AT45DBXXX_POWER_MANAGEMENT = 0); и
 // * 2) запрещены сервисные байты (включен AT45DB161E_PRM512); и
 // * 2) отключен режим эмуляции страниц 512 байт (отключен AT45DB161E_EMU512).
 // Если все эти условия выполняются, требуется такую функцию объявить и импортировать.
 // В остальных случаях она не требуется.
 // #define __imp_flash_powercycle()    sys_flash_AT45DBXXX_pwrcycle( ) // отключение питания чипа
 //                                                                     // Note: при остутствии возможности отключить питание чипа используйте
 //                                                                     // данный вызов как callback-событие для того, чтобы пользователь сделал это.

 // ------------------------------------------------------------------------------------
 #define __imp_sys_memset(p,b,c)     memset(p,b,c)   // порт функции memset()
 #define __imp_sys_memzero(p,c)      memset(p,0,c)   // порт функции memset()
 #define __imp_sys_memcpy(d,s,c)     memcpy(d,s,c)   // порт функции memcpy()
 #define __imp_sys_memmove(d,s,c)    memmove(d,s,c)  // порт функции memmove()
 // ------------------------------------------------------------------------------------
 #define __imp_utl_mutex_lock()                      // блокировка доступа к устройству ч/з мютекс
 #define __imp_utl_mutex_unlock()                    // разблокировка доступа к устройству ч/з мютекс

 // Добавьте прототипы функций:

 /* функция системы */

 // void           sys_delayus( unsigned int _1us  );
 // void           sys_delayms( unsigned int _1ms  );
 // unsigned int   sys_gettimer( void );

 /* функции работы с памятью */
 // void           sys_memset(void*,int,unsigned int);
 // void           sys_memcpy(void*,const void*,unsigned int);
 // void           sys_memmove(void*,const void*,unsigned int);

 /* функции обмена по SSP */
 // void           ssp_cshi();
 // void           ssp_cslo();
 // void           ssp_io(
 //                        __FLASH_BYTE* ,   //  -- буфер на запись (может быть 0)
 //                        __FLASH_BYTE* ,   //  -- буфер на чтение (может быть 0)
 //                        __FLASH_DWORD ) ; //  -- количество байт
 //
 // void           ssp_ior(
 //                        __FLASH_BYTE* ,   //  -- буфер на запись (может быть 0)
 //                        __FLASH_BYTE* ,   //  -- буфер на чтение (может быть 0)
 //                        __FLASH_DWORD ) ; //  -- количество байт
 //

#endif
#endif