 // Файл аппаратной абстрации: функции системы, SPI
 // v 1.0 от 07/10/20
 // Автор: Сычев А.

 // НЕ ТРЕБУЕТ МОДИФИКАЦИИ!

#if defined(W25Q16JV_LOWLEVEL) || defined(W25Q16JV_APILEVEL)

#ifndef W25QXXX_HAL_H
#define W25QXXX_HAL_H

        #include "drivers\flash\base\flash_api_types.h"    // типы
        #include "drivers\flash\w25q\config\W25QXXX_import.h" // программная прослойка: прототипы функций обмена по SSP

        /* уровень аппаратной абстракции: системные функции     */
        /*      - внутр. процедура -            - функция системы - */
      //#define __FLASH_WAITns(_10ns)             __imp_sys_delayns(_10ns)       // ожидание, в 10ках наносекунд
        #define __FLASH_WAITus(_1us)              __imp_sys_delayus(_1us)        // ожидание, в микросекундах

        #if W25QXXX_NO_MS_DELAYS == 1
        #define __FLASH_WAITms(_1ms)              __int_sys_delayms(_1ms)        // ожидание, в миллисекундах (внутр. функция)
        #else
        #define __FLASH_WAITms(_1ms)              __imp_sys_delayms(_1ms)        // ожидание, в миллисекундах
        #endif

        #define __FLASH_SMART_GETTIMER()          __imp_sys_gettimer()           //__imp_sys_gettimer()           // возвращает количество тиков системы с момента запуска в миллисекундах
        #define __FLASH_COPYMEMORY(dst,src,cnt)   __imp_sys_memset(dst,src,cnt)  // копирование блока памяти (memcpy)
        #define __FLASH_MOVEMEMORY(dst,src,cnt)   __imp_sys_memmove(dst,src,cnt) // перемещение блока памяти (memmove)
        #define __FLASH_ZEROMEMORY(dst,cnt)       __imp_sys_memzero(dst,cnt)     // обнуление блока памяти (memset)
        #define __FLASH_SETMEMORY(dst,byte,cnt)   __imp_sys_memset(dst,byte,cnt) // заполнение блока памяти (memset)

        /* уровень аппаратной абстракции: встроенные функции     */
        /*      - внутр. процедура -         - встроенная функция - */
        #if W25Q16JV_DONTUSESMARTDELAY
        #define __FLASH_SMART_WAITms(_1ms)        __imp_sys_delayms(_1ms)
        #else
        #define __FLASH_SMART_WAITms(_1ms)        __flash_smartWaitms(_1ms) // ожидание, в миллисекундах с проверкой состояния flash.
        #endif

        #ifdef  W25QXXX_POWER_MANAGEMENT
        #define __FLASH_POWER_ON()                __imp_flash_poweron()
        #define __FLASH_POWER_OFF()               __imp_flash_poweroff()
        #endif

        #ifdef  W25QXXX_RESET_MANAGEMENT
        #define __FLASH_RESET_ASSERT()            __imp_flash_reset_assert()      // установить сигнал сброса
        #define __FLASH_RESET_RELEASE()           __imp_flash_reset_release()     // снять сигнал сброса
        #endif

        #define __FLASH_LOCK()                    __imp_utl_mutex_lock()
        #define __FLASH_UNLOCK()                  __imp_utl_mutex_unlock()
      //#define __FLASH_IS_IRQ()                  __imp_utl_isirq_context()
      //#define __FLASH_IS_TSK()                  (!__FLASH_IS_IRQ())

        /* уровень аппаратной абстракции: функции обмена по SSP     */
        /*      - внутр. процедура -         - польз. функция SSP - */
        #define __FLASH_HAL_CS_HI()             __imp_ssp_cshi()               // #CS в состояние 1 (HiLogicLevel)
        #define __FLASH_HAL_CS_LO()             __imp_ssp_cslo()               // #CS в состояние 0 (LoLogicLevel)
        // __FLASH_HAL_EX: wb - write buffer ptr, rb - read buffer pointer, cnt - amount of bytes to exchange
        #define __FLASH_HAL_EX(wb,rb,cnt)       __imp_ssp_io( (__FLASH_BYTE*)(wb),(__FLASH_BYTE*)(rb),(__FLASH_DWORD)(cnt) )  // обмен по SSP (SPI) в обе стороны

        // UPDATED: 16.04.19
        #ifndef __imp_ssp_ro // read-only
        #define __FLASH_HAL_RD(rb,cnt)          __imp_ssp_io( 0,(__FLASH_BYTE*)(rb),(__FLASH_DWORD)(cnt) )  // обмен по SSP (SPI): прием от flash-чипа
        #else
        #define __FLASH_HAL_RD(rb,cnt)          __imp_ssp_ro( (__FLASH_BYTE*)(rb),(__FLASH_DWORD)(cnt) )  // обмен по SSP (SPI): прием от flash-чипа
        #endif
        #ifndef __imp_ssp_wo // write-only
        #define __FLASH_HAL_WR(wb,cnt)          __imp_ssp_io( (__FLASH_BYTE*)(wb),0,(__FLASH_DWORD)(cnt) )  // обмен по SSP (SPI): запись во flash-чип
        #else
        #define __FLASH_HAL_WR(wb,cnt)          __imp_ssp_wo( (__FLASH_BYTE*)(wb),(__FLASH_DWORD)(cnt) )  // обмен по SSP (SPI): запись во flash-чип
        #endif
        #define __FLASH_HAL_WRCMD(wb,cnt)         __FLASH_HAL_WR(wb,cnt)
#endif
#else
#error FLASH HAL: вы подключили заголовочный файл для низкоуровневых операций.
#endif