 // Файл импорта внешних функций
 // v 1.0 от 07/10/20

 // Автор: Сычев А.

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


#ifndef W25QXXX_IMPORT_H
#define W25QXXX_IMPORT_H

 #include "drivers/flash/w25q/config/W25Q16JV_conf.h" 

 typedef struct
 {
      #if W25QXXX_POWER_MANAGEMENT
      void ( *SetPinPowerOn)(); 
      void ( *SetPinPowerOff)();
      #endif
      #if W25QXXX_RESET_MANAGEMENT                                         
      void ( *ResetPinAssert)(); 
      void ( *ResetPinRelease)();
      #endif
      #if W25QXXX_HW_WR_PROTECT
      void ( *HwWrProtPinAssert)(); 
      void ( *HwWrProtPinRelease)();
      #endif
 }
 ExtMemPins_Handle_W25Q_t;

#ifdef W25QXXX_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 W25QXXX_POWER_MANAGEMENT || W25QXXX_RESET_MANAGEMENT || W25QXXX_HW_WR_PROTECT
 extern const ExtMemPins_Handle_W25Q_t ExtMemPinsHandle_W25Q;
 // Import External Memory Pins Handle
 #define pExtMemPinsHandle (&ExtMemPinsHandle_W25Q)
 #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 W25QXXX_POWER_MANAGEMENT
 // Опция W25QXXX_POWER_MANAGEMENT
 #define __imp_flash_poweron()             pExtMemPinsHandle->SetPinPowerOn()
 #define __imp_flash_poweroff()            pExtMemPinsHandle->SetPinPowerOff()
 #endif

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

 #if W25QXXX_HW_WR_PROTECT
 // Опция W25QXXX_HW_WR_PROTECT
 #define __imp_flash_hwwrprotect_assert()  pExtMemPinsHandle->HwWrProtPinAssert()
 #define __imp_flash_hwwrprotect_release() pExtMemPinsHandle->HwWrProtPinRelease()
 #endif
 // ------------------------------------------------------------------------------------
 // __imp_flash_powercycle - перезапуск чипа по питанию.
 // нужна для отключения блокировки регистра статуса "Status Register Lock"
 // Эта функция требуется ТОЛЬКО ЕСЛИ:
 // * 1) запрещено управление питанием (W25QXXX_POWER_MANAGEMENT = 0); и
 // * 2) требуется поддержка разблокировки регистра статуса
 // Если все эти условия выполняются, требуется такую функцию объявить и импортировать.
 // В остальных случаях она не требуется.
 // #define __imp_flash_powercycle()    sys_flash_W25QXXX_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_memcmp(p1,p2,c)   memcmp(p1,p2,c) // порт функции memcmp()
 #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()                    // разблокировка доступа к устройству ч/з мютекс

#endif
#endif