From d116c9d031986547500c38d3b26d0d9ad7874a1f Mon Sep 17 00:00:00 2001 From: Senthil Ramakrishnan Date: Sun, 8 Oct 2017 15:19:55 -0500 Subject: [PATCH 01/80] RealTek WiFi test configuration --- tools/test_configs/RealtekInterface.json | 27 ++++++++++++++++++++++++ tools/test_configs/config_paths.json | 3 ++- tools/test_configs/target_configs.json | 4 ++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 tools/test_configs/RealtekInterface.json diff --git a/tools/test_configs/RealtekInterface.json b/tools/test_configs/RealtekInterface.json new file mode 100644 index 0000000000..ad4a9ef31b --- /dev/null +++ b/tools/test_configs/RealtekInterface.json @@ -0,0 +1,27 @@ +{ + "config": { + "header-file": { + "help" : "String for including your driver header file", + "value" : "\"RTWInterface.h\"" + }, + "object-construction" : { + "value" : "new RTWInterface()" + }, + "connect-statement" : { + "help" : "Must use 'net' variable name, replace WIFI_SSID, WIFI_PASSWORD, WIFI_SECURITY, WIFI_CHANNEL with your WiFi settings", + "value" : "((RTWInterface *)net)->connect(WIFI_SSID, WIFI_PASSWORD, WIFI_SECURITY, WIFI_CHANNEL)" + }, + "echo-server-addr" : { + "help" : "IP address of echo server", + "value" : "\"195.34.89.241\"" + }, + "echo-server-port" : { + "help" : "Port of echo server", + "value" : "7" + }, + "tcp-echo-prefix" : { + "help" : "Some servers send a prefix before echoed message", + "value" : "\"Realtek Ameba TCP/UDP test service\\n\"" + } + } +} diff --git a/tools/test_configs/config_paths.json b/tools/test_configs/config_paths.json index c543176906..098c9442c3 100644 --- a/tools/test_configs/config_paths.json +++ b/tools/test_configs/config_paths.json @@ -1,5 +1,6 @@ { "ETHERNET" : "EthernetInterface.json", "ODIN_WIFI" : "OdinInterface.json", - "ODIN_ETHERNET" : "Odin_EthernetInterface.json" + "ODIN_ETHERNET" : "Odin_EthernetInterface.json", + "REALTEK_WIFI" : "RealtekInterface.json" } diff --git a/tools/test_configs/target_configs.json b/tools/test_configs/target_configs.json index eaff8b55b9..346901bf6a 100644 --- a/tools/test_configs/target_configs.json +++ b/tools/test_configs/target_configs.json @@ -6,5 +6,9 @@ "K64F": { "default_test_configuration": "ETHERNET", "test_configurations": ["ETHERNET"] + }, + "REALTEK_RTL8195AM": { + "default_test_configuration": "REALTEK_WIFI", + "test_configurations": ["REALTEK_WIFI"] } } From 889e22cce9a2c71b36135c8511f2177d3ecb9fb8 Mon Sep 17 00:00:00 2001 From: danclement Date: Fri, 27 Oct 2017 16:19:03 -0600 Subject: [PATCH 02/80] Checking in the fixes related to I2C issues. Three main issues: 1) The 0x13 special case section in write data in ncs36510_i2c.c didn't have a write++ command. 2) In the same write function, the WDAT8 command was put before the 0x13 section and this is not correct 3) Needed to add wait_us(0) before and after the register writes for apparent clock domain crossing delay times until registers are stable in HW There were also a handful of other tweaks related to general code maintenance and moving some status register checks to the proper locations. --- targets/TARGET_ONSEMI/TARGET_NCS36510/i2c.h | 8 ++-- .../TARGET_ONSEMI/TARGET_NCS36510/i2c_api.c | 6 +-- .../TARGET_NCS36510/ncs36510_i2c.c | 40 ++++++++----------- 3 files changed, 23 insertions(+), 31 deletions(-) diff --git a/targets/TARGET_ONSEMI/TARGET_NCS36510/i2c.h b/targets/TARGET_ONSEMI/TARGET_NCS36510/i2c.h index bcbafbe000..2b5f323343 100644 --- a/targets/TARGET_ONSEMI/TARGET_NCS36510/i2c.h +++ b/targets/TARGET_ONSEMI/TARGET_NCS36510/i2c.h @@ -48,7 +48,6 @@ #define I2C_SPEED_400K_AT_8MHZ (uint8_t)0x03 #define I2C_SPEED_400K_AT_16MHZ (uint8_t)0x08 - /* I2C commands */ #define I2C_CMD_NULL 0x00 #define I2C_CMD_WDAT0 0x10 @@ -93,7 +92,10 @@ #define I2C_API_STATUS_SUCCESS 0 #define PAD_REG_ADRS_BYTE_SIZE 4 -#define SEND_COMMAND(cmd) while(!I2C_FIFO_EMPTY); wait_us(1); obj->membase->CMD_REG = cmd; +// The wait_us(0) command is needed so the I2C state machines have enough +// time for data to settle across all clock domain crossings in their +// synchronizers, both directions. +#define SEND_COMMAND(cmd) wait_us(0); obj->membase->CMD_REG = cmd; wait_us(0); /** Init I2C device. * @details @@ -158,4 +160,4 @@ extern int32_t fI2cReadB(i2c_t *d, char *buf, int len); */ extern int32_t fI2cWriteB(i2c_t *d, const char *buf, int len); -#endif /* I2C_H_ */ \ No newline at end of file +#endif /* I2C_H_ */ diff --git a/targets/TARGET_ONSEMI/TARGET_NCS36510/i2c_api.c b/targets/TARGET_ONSEMI/TARGET_NCS36510/i2c_api.c index cc57ed834d..12845ed069 100644 --- a/targets/TARGET_ONSEMI/TARGET_NCS36510/i2c_api.c +++ b/targets/TARGET_ONSEMI/TARGET_NCS36510/i2c_api.c @@ -169,9 +169,7 @@ int i2c_byte_write(i2c_t *obj, int data) return Count; } - while(obj->membase->STATUS.WORD & I2C_STATUS_CMD_FIFO_OFL_BIT); /* Wait till command overflow ends */ - - if(obj->membase->STATUS.WORD & I2C_STATUS_BUS_ERR_BIT) { + if(I2C_BUS_ERR_CHECK) { /* Bus error means NAK received */ return 0; } else { @@ -180,4 +178,4 @@ int i2c_byte_write(i2c_t *obj, int data) } } -#endif /* DEVICE_I2C */ \ No newline at end of file +#endif /* DEVICE_I2C */ diff --git a/targets/TARGET_ONSEMI/TARGET_NCS36510/ncs36510_i2c.c b/targets/TARGET_ONSEMI/TARGET_NCS36510/ncs36510_i2c.c index 1b3e5daf20..8ae4a9b935 100644 --- a/targets/TARGET_ONSEMI/TARGET_NCS36510/ncs36510_i2c.c +++ b/targets/TARGET_ONSEMI/TARGET_NCS36510/ncs36510_i2c.c @@ -65,7 +65,6 @@ /* See i2c.h for details */ void fI2cInit(i2c_t *obj,PinName sda,PinName scl) { - uint32_t clockDivisor; /* determine the I2C to use */ I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA); I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL); @@ -93,9 +92,7 @@ void fI2cInit(i2c_t *obj,PinName sda,PinName scl) obj->membase->CR.BITS.I2C_APB_CD_EN = True; /* set default baud rate at 100k */ - clockDivisor = ((fClockGetPeriphClockfrequency() / 100000) >> 2) - 2; - obj->membase->CR.BITS.CD_VAL = (clockDivisor & I2C_CLOCKDIVEDER_VAL_MASK); - obj->membase->PRE_SCALE_REG = (clockDivisor & I2C_APB_CLK_DIVIDER_VAL_MASK) >> 5; /**< Zero pre-scale value not allowed */ + fI2cFrequency(obj, 100000); /* Cross bar setting */ pinmap_pinout(sda, PinMap_I2C_SDA); @@ -110,8 +107,8 @@ void fI2cInit(i2c_t *obj,PinName sda,PinName scl) PadReg_t *padRegScl = (PadReg_t*)(PADREG_BASE + (scl * PAD_REG_ADRS_BYTE_SIZE)); CLOCK_ENABLE(CLOCK_PAD); - padRegSda->PADIO0.BITS.POWER = 1; /* sda: Drive strength */ - padRegScl->PADIO0.BITS.POWER = 1; /* scl: Drive strength */ + padRegSda->PADIO0.BITS.POWER = 3; /* sda: Drive strength */ + padRegScl->PADIO0.BITS.POWER = 3; /* scl: Drive strength */ CLOCK_DISABLE(CLOCK_PAD); CLOCK_ENABLE(CLOCK_GPIO); @@ -160,7 +157,10 @@ int32_t fI2cReadB(i2c_t *obj, char *buf, int len) int32_t read = 0; while (read < len) { - /* Send read command */ + + while(FIFO_OFL_CHECK); /* Wait till command overflow ends */ + + /* Send read command */ SEND_COMMAND(I2C_CMD_RDAT8); while(!RD_DATA_READY) { if (I2C_BUS_ERR_CHECK) { @@ -170,8 +170,8 @@ int32_t fI2cReadB(i2c_t *obj, char *buf, int len) } buf[read++] = obj->membase->RD_FIFO_REG; /**< Reading 'read FIFO register' will clear status register */ - if(!(read>=len)) { /* No ACK will be generated for the last read, upper level I2C protocol should generate */ - SEND_COMMAND(I2C_CMD_WDAT0); /* TODO based on requirement generate ACK or NACK Based on the requirement. */ + if(!(read>=len)) { + SEND_COMMAND(I2C_CMD_WDAT0); } else { /* No ack */ SEND_COMMAND(I2C_CMD_WDAT1); @@ -179,7 +179,7 @@ int32_t fI2cReadB(i2c_t *obj, char *buf, int len) /* check for FIFO underflow */ if(I2C_UFL_CHECK) { - return I2C_ERROR_NO_SLAVE; /* TODO No error available for this in i2c_api.h */ + return I2C_EVENT_ERROR; } if(I2C_BUS_ERR_CHECK) { /* Bus error */ @@ -196,8 +196,8 @@ int32_t fI2cWriteB(i2c_t *obj, const char *buf, int len) int32_t write = 0; while (write < len) { - /* Send write command */ - SEND_COMMAND(I2C_CMD_WDAT8); + + while(FIFO_OFL_CHECK); /* Wait till command overflow ends */ if(buf[write] == I2C_CMD_RDAT8) { /* SW work around to counter FSM issue. If the only command in the CMD FIFO is the WDAT8 command (data of 0x13) @@ -205,35 +205,27 @@ int32_t fI2cWriteB(i2c_t *obj, const char *buf, int len) RDAT8 command by the data FSM; resulting in an I2C bus error (NACK instead of an ACK). */ /* Send 0x13 bit wise */ SEND_COMMAND(I2C_CMD_WDAT0); - SEND_COMMAND(I2C_CMD_WDAT0); - SEND_COMMAND(I2C_CMD_WDAT0); - SEND_COMMAND(I2C_CMD_WDAT1); - SEND_COMMAND(I2C_CMD_WDAT0); - SEND_COMMAND(I2C_CMD_WDAT0); - SEND_COMMAND(I2C_CMD_WDAT1); - SEND_COMMAND(I2C_CMD_WDAT1); + write++; } else { /* Send data */ + SEND_COMMAND(I2C_CMD_WDAT8); SEND_COMMAND(buf[write++]); } - SEND_COMMAND(I2C_CMD_VRFY_ACK); /* TODO Verify ACK based on requirement, Do we need? */ + SEND_COMMAND(I2C_CMD_VRFY_ACK); if (I2C_BUS_ERR_CHECK) { /* Bus error */ return I2C_ERROR_BUS_BUSY; } - - while(FIFO_OFL_CHECK); /* Wait till command overflow ends */ } - return write; } -#endif /* DEVICE_I2C */ \ No newline at end of file +#endif /* DEVICE_I2C */ From 2f36cd78d671e92154a8b3d6dce19a44af41d094 Mon Sep 17 00:00:00 2001 From: Martin Kojtal <0xc0170@gmail.com> Date: Tue, 7 Nov 2017 09:12:16 +0000 Subject: [PATCH 03/80] test: realtek net config default to none Changing this to none as result of build failures. Wifi needs own configuration per an enviroment. By setting this to none, net tests are skipped for Realtek platform. --- tools/test_configs/target_configs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/test_configs/target_configs.json b/tools/test_configs/target_configs.json index 346901bf6a..c6d9a9b259 100644 --- a/tools/test_configs/target_configs.json +++ b/tools/test_configs/target_configs.json @@ -8,7 +8,7 @@ "test_configurations": ["ETHERNET"] }, "REALTEK_RTL8195AM": { - "default_test_configuration": "REALTEK_WIFI", + "default_test_configuration": "NONE", "test_configurations": ["REALTEK_WIFI"] } } From c2bba672dfa1a9e21c1190a2094c8a4e19512faf Mon Sep 17 00:00:00 2001 From: jeromecoutant Date: Thu, 9 Nov 2017 09:45:07 +0100 Subject: [PATCH 04/80] STM32F412 IAR linker file issue --- .../TARGET_STM32F412xG/device/TOOLCHAIN_IAR/stm32f412xx.icf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/device/TOOLCHAIN_IAR/stm32f412xx.icf b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/device/TOOLCHAIN_IAR/stm32f412xx.icf index f702047a09..46363c1caf 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/device/TOOLCHAIN_IAR/stm32f412xx.icf +++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F412xG/device/TOOLCHAIN_IAR/stm32f412xx.icf @@ -10,7 +10,7 @@ define symbol __region_ROM_end__ = MBED_APP_START + MBED_APP_SIZE; define symbol __NVIC_start__ = 0x20000000; define symbol __NVIC_end__ = 0x200001C7; /* Aligned on 8 bytes */ define symbol __region_RAM_start__ = 0x200001C8; -define symbol __region_RAM_end__ = 0x2001FFFF; +define symbol __region_RAM_end__ = 0x2003FFFF; /* Memory regions */ define memory mem with size = 4G; From e20d35df27059e8ab5ea0289cf4cb74bb0616a25 Mon Sep 17 00:00:00 2001 From: Laurent MEUNIER Date: Wed, 8 Nov 2017 09:02:21 +0100 Subject: [PATCH 05/80] STM32F4: Flash: fix 2MB GetSector computation The computation of the sector number in GetSector for 2MB flash sizes consists in adding an extra constant for 2MB dual bank (12 as in ADDR_FLASH_SECTOR_12), then going through the same address check as if it was an address of the first sector. That means that we need to modify tmp and address as if it was a first bank address, which we're doing here by sub_stracting 0x100000 delta. --- targets/TARGET_STM/TARGET_STM32F4/flash_api.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/targets/TARGET_STM/TARGET_STM32F4/flash_api.c b/targets/TARGET_STM/TARGET_STM32F4/flash_api.c index 1455f07aab..f3f1be95ac 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/flash_api.c +++ b/targets/TARGET_STM/TARGET_STM32F4/flash_api.c @@ -180,8 +180,10 @@ static uint32_t GetSector(uint32_t address) /* This function supports 1Mb and 2Mb flash sizes */ #if defined(ADDR_FLASH_SECTOR_16) if (address & 0x100000) { // handle 2nd bank + /* Sector will be at least 12 */ sector = FLASH_SECTOR_12; - tmp = address - ADDR_FLASH_SECTOR_12; + tmp -= 0x100000; + address -= 0x100000; } #endif if (address < ADDR_FLASH_SECTOR_4) { // 16k sectorsize From f81521adcc2cf19df7912ac7d44f0d4d6c9bf593 Mon Sep 17 00:00:00 2001 From: Laurent MEUNIER Date: Wed, 8 Nov 2017 09:02:39 +0100 Subject: [PATCH 06/80] STM32: remove trailing white spaces --- targets/TARGET_STM/TARGET_STM32F4/flash_api.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32F4/flash_api.c b/targets/TARGET_STM/TARGET_STM32F4/flash_api.c index f3f1be95ac..5ba7fb9e49 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/flash_api.c +++ b/targets/TARGET_STM/TARGET_STM32F4/flash_api.c @@ -145,7 +145,6 @@ int32_t flash_program_page(flash_t *obj, uint32_t address, const uint8_t *data, uint32_t flash_get_sector_size(const flash_t *obj, uint32_t address) { - if ((address >= (FLASH_BASE + FLASH_SIZE)) || (address < FLASH_BASE)) { return MBED_FLASH_INVALID_SIZE; } @@ -165,7 +164,7 @@ uint32_t flash_get_start_address(const flash_t *obj) } uint32_t flash_get_size(const flash_t *obj) { - return FLASH_SIZE; + return FLASH_SIZE; } /** @@ -175,7 +174,7 @@ uint32_t flash_get_size(const flash_t *obj) */ static uint32_t GetSector(uint32_t address) { - uint32_t sector = 0; + uint32_t sector = 0; uint32_t tmp = address - ADDR_FLASH_SECTOR_0; /* This function supports 1Mb and 2Mb flash sizes */ #if defined(ADDR_FLASH_SECTOR_16) @@ -191,14 +190,14 @@ static uint32_t GetSector(uint32_t address) } #if defined(ADDR_FLASH_SECTOR_5) else if (address < ADDR_FLASH_SECTOR_5) { //64k sector size - sector += FLASH_SECTOR_4; + sector += FLASH_SECTOR_4; } else { sector += 4 + (tmp >>17); } #else // In case ADDR_FLASH_SECTOR_5 is not defined, sector 4 is the last one. else { //64k sector size - sector += FLASH_SECTOR_4; + sector += FLASH_SECTOR_4; } #endif return sector; @@ -227,7 +226,7 @@ if((Sector == FLASH_SECTOR_0) || (Sector == FLASH_SECTOR_1) || (Sector == FLASH_ sectorsize = 64 * 1024; } else { sectorsize = 128 * 1024; - } + } return sectorsize; } From ce04e3db087a288f8a1f5cfb59cb992c349978f3 Mon Sep 17 00:00:00 2001 From: Marcus Chang Date: Tue, 7 Nov 2017 09:25:24 -0800 Subject: [PATCH 07/80] Increase flash size on Realtek RTL8195AM The Realtek RTL8195AM has 2 MiB of external flash. This change enables the FlashIAP driver to gain access to the full flash. --- targets/TARGET_Realtek/TARGET_AMEBA/flash_ext.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/TARGET_Realtek/TARGET_AMEBA/flash_ext.h b/targets/TARGET_Realtek/TARGET_AMEBA/flash_ext.h index 6ad5c799da..b2d287bf61 100644 --- a/targets/TARGET_Realtek/TARGET_AMEBA/flash_ext.h +++ b/targets/TARGET_Realtek/TARGET_AMEBA/flash_ext.h @@ -24,7 +24,7 @@ extern "C" { #endif #define FLASH_PAGE_SIZE 256 -#define FLASH_SIZE 0x100000 +#define FLASH_SIZE 0x200000 #define FLASH_OFS_START 0x0 #define FLASH_OFS_END (FLASH_OFS_START + FLASH_SIZE) From 157150ec91fb48dba13dd6c729756dbcf52e6e32 Mon Sep 17 00:00:00 2001 From: Laurent MEUNIER Date: Thu, 2 Nov 2017 13:10:57 +0100 Subject: [PATCH 08/80] STM32: Extend Ethernet RMII workaround to all applicable devices part of F77x/F76x series. --- .../lwip-eth/arch/TARGET_STM/stm32xx_emac.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/stm32xx_emac.c b/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/stm32xx_emac.c index 0ec2b16e48..134cea811d 100644 --- a/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/stm32xx_emac.c +++ b/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/stm32xx_emac.c @@ -46,7 +46,8 @@ static sys_mutex_t tx_lock_mutex; /* function */ static void _eth_arch_rx_task(void *arg); static void _eth_arch_phy_task(void *arg); -#if defined (TARGET_NUCLEO_F767ZI) +#if defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx)\ + || defined (STM32F779xx) static void _rmii_watchdog(void *arg); #endif @@ -375,9 +376,10 @@ static void _eth_arch_phy_task(void *arg) } } -#if defined (TARGET_NUCLEO_F767ZI) +#if defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx)\ + || defined (STM32F779xx) /** - * workaround for the ETH RMII bug in STM32F769 Cut1.0 + * workaround for the ETH RMII bug in STM32F76x and STM32F77x revA * * \param[in] netif the lwip network interface structure */ @@ -497,7 +499,8 @@ err_t eth_arch_enetif_init(struct netif *netif) /* initialize the hardware */ _eth_arch_low_level_init(netif); -#if defined (TARGET_NUCLEO_F767ZI) +#if defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx)\ + || defined (STM32F779xx) sys_thread_new("stm32_rmii_watchdog", _rmii_watchdog, netif, DEFAULT_THREAD_STACKSIZE, osPriorityLow); #endif From 3aa46e6af0e5f176cbfe147d1727bf16dc9472b9 Mon Sep 17 00:00:00 2001 From: Maciej Bocianski Date: Fri, 3 Nov 2017 15:32:08 +0100 Subject: [PATCH 09/80] small supplement for PR #5338 --- TESTS/mbedmicro-rtos-mbed/malloc/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TESTS/mbedmicro-rtos-mbed/malloc/main.cpp b/TESTS/mbedmicro-rtos-mbed/malloc/main.cpp index daf80719f9..e0fcd355e0 100644 --- a/TESTS/mbedmicro-rtos-mbed/malloc/main.cpp +++ b/TESTS/mbedmicro-rtos-mbed/malloc/main.cpp @@ -56,7 +56,7 @@ int main() { // static stack for threads to reduce heap usage on devices with small RAM // and eliminate run out of heap memory problem - MBED_ALIGN(8) uint8_t stack[THREAD_STACK_SIZE * NUM_THREADS]; + uint8_t stack[NUM_THREADS][THREAD_STACK_SIZE]; Thread *thread_list[NUM_THREADS]; int test_time = 15; @@ -64,7 +64,7 @@ int main() // Allocate threads for the test for (int i = 0; i < NUM_THREADS; i++) { - thread_list[i] = new Thread(osPriorityNormal, THREAD_STACK_SIZE, stack + i * THREAD_STACK_SIZE); + thread_list[i] = new Thread(osPriorityNormal, THREAD_STACK_SIZE, stack[i]); if (NULL == thread_list[i]) { allocation_failure = true; } else { From 781c0c7105077711a1707bd64e42dfcb81265a7f Mon Sep 17 00:00:00 2001 From: Kevin Bracey Date: Fri, 3 Nov 2017 15:15:57 +0200 Subject: [PATCH 10/80] Shrink RTOS classes Various RTOS classes were storing their CMSIS-RTOS creation attribute structure as a member, when it's not required after construction. Reduce memory by eliminating this member. --- rtos/EventFlags.cpp | 10 +++++----- rtos/EventFlags.h | 1 - rtos/MemoryPool.h | 13 ++++++------- rtos/Mutex.cpp | 12 ++++++------ rtos/Mutex.h | 1 - rtos/Queue.h | 13 ++++++------- rtos/RtosTimer.cpp | 8 ++++---- rtos/RtosTimer.h | 1 - rtos/Semaphore.cpp | 8 ++++---- rtos/Semaphore.h | 1 - 10 files changed, 31 insertions(+), 37 deletions(-) diff --git a/rtos/EventFlags.cpp b/rtos/EventFlags.cpp index abd88a1142..3d6b79321f 100644 --- a/rtos/EventFlags.cpp +++ b/rtos/EventFlags.cpp @@ -39,11 +39,11 @@ EventFlags::EventFlags(const char *name) void EventFlags::constructor(const char *name) { memset(&_obj_mem, 0, sizeof(_obj_mem)); - memset(&_attr, 0, sizeof(_attr)); - _attr.name = name ? name : "application_unnamed_event_flags"; - _attr.cb_mem = &_obj_mem; - _attr.cb_size = sizeof(_obj_mem); - _id = osEventFlagsNew(&_attr); + osEventFlagsAttr_t attr; + attr.name = name ? name : "application_unnamed_event_flags"; + attr.cb_mem = &_obj_mem; + attr.cb_size = sizeof(_obj_mem); + _id = osEventFlagsNew(&attr); MBED_ASSERT(_id); } diff --git a/rtos/EventFlags.h b/rtos/EventFlags.h index 8f0e2b20ed..02df107773 100644 --- a/rtos/EventFlags.h +++ b/rtos/EventFlags.h @@ -90,7 +90,6 @@ private: void constructor(const char *name = NULL); uint32_t wait(uint32_t flags, uint32_t opt, uint32_t timeout, bool clear); osEventFlagsId_t _id; - osEventFlagsAttr_t _attr; mbed_rtos_storage_event_flags_t _obj_mem; }; diff --git a/rtos/MemoryPool.h b/rtos/MemoryPool.h index 361ae6518f..0eab4de792 100644 --- a/rtos/MemoryPool.h +++ b/rtos/MemoryPool.h @@ -50,12 +50,12 @@ public: MemoryPool() { memset(_pool_mem, 0, sizeof(_pool_mem)); memset(&_obj_mem, 0, sizeof(_obj_mem)); - memset(&_attr, 0, sizeof(_attr)); - _attr.mp_mem = _pool_mem; - _attr.mp_size = sizeof(_pool_mem); - _attr.cb_mem = &_obj_mem; - _attr.cb_size = sizeof(_obj_mem); - _id = osMemoryPoolNew(pool_sz, sizeof(T), &_attr); + osMemoryPoolAttr_t attr = { 0 }; + attr.mp_mem = _pool_mem; + attr.mp_size = sizeof(_pool_mem); + attr.cb_mem = &_obj_mem; + attr.cb_size = sizeof(_obj_mem); + _id = osMemoryPoolNew(pool_sz, sizeof(T), &attr); MBED_ASSERT(_id); } @@ -95,7 +95,6 @@ public: private: osMemoryPoolId_t _id; - osMemoryPoolAttr_t _attr; /* osMemoryPoolNew requires that pool block size is a multiple of 4 bytes. */ char _pool_mem[((sizeof(T) + 3) & ~3) * pool_sz]; mbed_rtos_storage_mem_pool_t _obj_mem; diff --git a/rtos/Mutex.cpp b/rtos/Mutex.cpp index 359af10536..874af4608c 100644 --- a/rtos/Mutex.cpp +++ b/rtos/Mutex.cpp @@ -40,12 +40,12 @@ Mutex::Mutex(const char *name) void Mutex::constructor(const char *name) { memset(&_obj_mem, 0, sizeof(_obj_mem)); - memset(&_attr, 0, sizeof(_attr)); - _attr.name = name ? name : "aplication_unnamed_mutex"; - _attr.cb_mem = &_obj_mem; - _attr.cb_size = sizeof(_obj_mem); - _attr.attr_bits = osMutexRecursive | osMutexPrioInherit | osMutexRobust; - _id = osMutexNew(&_attr); + osMutexAttr_t attr = { 0 }; + attr.name = name ? name : "aplication_unnamed_mutex"; + attr.cb_mem = &_obj_mem; + attr.cb_size = sizeof(_obj_mem); + attr.attr_bits = osMutexRecursive | osMutexPrioInherit | osMutexRobust; + _id = osMutexNew(&attr); MBED_ASSERT(_id); } diff --git a/rtos/Mutex.h b/rtos/Mutex.h index 4f1ed8a6aa..5490012d46 100644 --- a/rtos/Mutex.h +++ b/rtos/Mutex.h @@ -82,7 +82,6 @@ private: void constructor(const char *name = NULL); osMutexId_t _id; - osMutexAttr_t _attr; mbed_rtos_storage_mutex_t _obj_mem; }; diff --git a/rtos/Queue.h b/rtos/Queue.h index 56739522ae..8f32d7a4e2 100644 --- a/rtos/Queue.h +++ b/rtos/Queue.h @@ -51,12 +51,12 @@ public: /** Create and initialize a message Queue. */ Queue() { memset(&_obj_mem, 0, sizeof(_obj_mem)); - memset(&_attr, 0, sizeof(_attr)); - _attr.mq_mem = _queue_mem; - _attr.mq_size = sizeof(_queue_mem); - _attr.cb_mem = &_obj_mem; - _attr.cb_size = sizeof(_obj_mem); - _id = osMessageQueueNew(queue_sz, sizeof(T*), &_attr); + osMessageQueueAttr_t attr = { 0 }; + attr.mq_mem = _queue_mem; + attr.mq_size = sizeof(_queue_mem); + attr.cb_mem = &_obj_mem; + attr.cb_size = sizeof(_obj_mem); + _id = osMessageQueueNew(queue_sz, sizeof(T*), &attr); MBED_ASSERT(_id); } @@ -115,7 +115,6 @@ public: private: osMessageQueueId_t _id; - osMessageQueueAttr_t _attr; char _queue_mem[queue_sz * (sizeof(T*) + sizeof(mbed_rtos_storage_message_t))]; mbed_rtos_storage_msg_queue_t _obj_mem; }; diff --git a/rtos/RtosTimer.cpp b/rtos/RtosTimer.cpp index acec84ed98..3e6c19718b 100644 --- a/rtos/RtosTimer.cpp +++ b/rtos/RtosTimer.cpp @@ -31,10 +31,10 @@ namespace rtos { void RtosTimer::constructor(mbed::Callback func, os_timer_type type) { _function = func; memset(&_obj_mem, 0, sizeof(_obj_mem)); - memset(&_attr, 0, sizeof(_attr)); - _attr.cb_mem = &_obj_mem; - _attr.cb_size = sizeof(_obj_mem); - _id = osTimerNew((void (*)(void *))Callback::thunk, type, &_function, &_attr); + osTimerAttr_t attr = { 0 }; + attr.cb_mem = &_obj_mem; + attr.cb_size = sizeof(_obj_mem); + _id = osTimerNew((void (*)(void *))Callback::thunk, type, &_function, &attr); MBED_ASSERT(_id); } diff --git a/rtos/RtosTimer.h b/rtos/RtosTimer.h index d96de829e1..d75f49c8b2 100644 --- a/rtos/RtosTimer.h +++ b/rtos/RtosTimer.h @@ -157,7 +157,6 @@ private: void constructor(mbed::Callback func, os_timer_type type); osTimerId_t _id; - osTimerAttr_t _attr; mbed_rtos_storage_timer_t _obj_mem; mbed::Callback _function; }; diff --git a/rtos/Semaphore.cpp b/rtos/Semaphore.cpp index 107dccb33f..fb082d3c44 100644 --- a/rtos/Semaphore.cpp +++ b/rtos/Semaphore.cpp @@ -36,10 +36,10 @@ Semaphore::Semaphore(int32_t count, uint16_t max_count) { void Semaphore::constructor(int32_t count, uint16_t max_count) { memset(&_obj_mem, 0, sizeof(_obj_mem)); - memset(&_attr, 0, sizeof(_attr)); - _attr.cb_mem = &_obj_mem; - _attr.cb_size = sizeof(_obj_mem); - _id = osSemaphoreNew(max_count, count, &_attr); + osSemaphoreAttr_t attr = { 0 }; + attr.cb_mem = &_obj_mem; + attr.cb_size = sizeof(_obj_mem); + _id = osSemaphoreNew(max_count, count, &attr); MBED_ASSERT(_id != NULL); } diff --git a/rtos/Semaphore.h b/rtos/Semaphore.h index 80dc928ede..07ce078277 100644 --- a/rtos/Semaphore.h +++ b/rtos/Semaphore.h @@ -71,7 +71,6 @@ private: void constructor(int32_t count, uint16_t max_count); osSemaphoreId_t _id; - osSemaphoreAttr_t _attr; mbed_rtos_storage_semaphore_t _obj_mem; }; From 5fe9ee557178c5177b94a5a898125908d6c1e493 Mon Sep 17 00:00:00 2001 From: Filip Jagodzinski Date: Tue, 31 Oct 2017 18:19:36 +0100 Subject: [PATCH 11/80] Tests: RTOS: RtosTimer: Fix tests for NRF51_DK board Additional delay is needed to prevent random failures when waiting for a semaphore. --- TESTS/mbedmicro-rtos-mbed/rtostimer/main.cpp | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/TESTS/mbedmicro-rtos-mbed/rtostimer/main.cpp b/TESTS/mbedmicro-rtos-mbed/rtostimer/main.cpp index 581336bcdc..59c26cc4f2 100644 --- a/TESTS/mbedmicro-rtos-mbed/rtostimer/main.cpp +++ b/TESTS/mbedmicro-rtos-mbed/rtostimer/main.cpp @@ -23,7 +23,7 @@ using namespace utest::v1; #define TEST_DELAY_MS 50 #define TEST_DELAY2_MS 30 -#define TEST_DELAY_MS_DELTA 1 +#define TEST_DELAY_MS_DELTA 5 #define TEST_RESTART_DELAY_MS 10 #if TEST_RESTART_DELAY_MS >= TEST_DELAY_MS @@ -71,12 +71,12 @@ void test_oneshot_not_restarted() t.start(); TEST_ASSERT_EQUAL(osOK, stat); - int32_t slots = sem.wait(TEST_DELAY_MS + 1); + int32_t slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); t.stop(); TEST_ASSERT_EQUAL(1, slots); TEST_ASSERT_INT_WITHIN(TEST_DELAY_MS_DELTA * 1000, TEST_DELAY_MS * 1000, t.read_us()); - slots = sem.wait(TEST_DELAY_MS + 1); + slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); TEST_ASSERT_EQUAL(0, slots); stat = timer.stop(); @@ -105,12 +105,12 @@ void test_periodic_repeats() t.start(); TEST_ASSERT_EQUAL(osOK, stat); - int32_t slots = sem.wait(TEST_DELAY_MS + 1); + int32_t slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); int t1 = t.read_us(); TEST_ASSERT_EQUAL(1, slots); TEST_ASSERT_INT_WITHIN(TEST_DELAY_MS_DELTA * 1000, TEST_DELAY_MS * 1000, t1); - slots = sem.wait(TEST_DELAY_MS + 1); + slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); t.stop(); TEST_ASSERT_EQUAL(1, slots); TEST_ASSERT_INT_WITHIN(TEST_DELAY_MS_DELTA * 1000, TEST_DELAY_MS * 1000, t.read_us() - t1); @@ -118,7 +118,7 @@ void test_periodic_repeats() stat = timer.stop(); TEST_ASSERT_EQUAL(osOK, stat); - slots = sem.wait(TEST_DELAY_MS + 1); + slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); TEST_ASSERT_EQUAL(0, slots); stat = timer.stop(); @@ -153,7 +153,7 @@ void test_restart() stat = timer.start(TEST_DELAY_MS); TEST_ASSERT_EQUAL(osOK, stat); - slots = sem.wait(TEST_DELAY_MS + 1); + slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); t.stop(); TEST_ASSERT_EQUAL(1, slots); TEST_ASSERT_INT_WITHIN(TEST_DELAY_MS_DELTA * 1000, (TEST_DELAY_MS + TEST_RESTART_DELAY_MS) * 1000, t.read_us()); @@ -183,7 +183,7 @@ void test_start_again() stat = timer.start(TEST_DELAY_MS); TEST_ASSERT_EQUAL(osOK, stat); - int32_t slots = sem.wait(TEST_DELAY_MS + 1); + int32_t slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); TEST_ASSERT_EQUAL(1, slots); stat = timer.stop(); @@ -192,7 +192,7 @@ void test_start_again() stat = timer.start(TEST_DELAY_MS); TEST_ASSERT_EQUAL(osOK, stat); - slots = sem.wait(TEST_DELAY_MS + 1); + slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); TEST_ASSERT_EQUAL(1, slots); stat = timer.stop(); @@ -227,7 +227,7 @@ void test_restart_updates_delay() t.start(); TEST_ASSERT_EQUAL(osOK, stat); - slots = sem.wait(TEST_DELAY2_MS + 1); + slots = sem.wait(TEST_DELAY2_MS + TEST_DELAY_MS_DELTA); t.stop(); TEST_ASSERT_EQUAL(1, slots); TEST_ASSERT_INT_WITHIN(TEST_DELAY_MS_DELTA * 1000, TEST_DELAY2_MS * 1000, t.read_us()); @@ -273,7 +273,7 @@ void test_stop() stat = timer.stop(); TEST_ASSERT_EQUAL(osOK, stat); - slots = sem.wait(TEST_DELAY_MS + 1); + slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); TEST_ASSERT_EQUAL(0, slots); stat = timer.stop(); @@ -337,7 +337,7 @@ void test_isr_calls_fail() Ticker ticker; ticker.attach(mbed::callback(timer_isr_call, (void const *) &timer), (float) TEST_DELAY_MS / 1000.0); - wait_ms(TEST_DELAY_MS + 1); + wait_ms(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); } utest::v1::status_t test_setup(const size_t number_of_cases) From 5ead8eccebf4722c45ab28352258685cd1fa5f32 Mon Sep 17 00:00:00 2001 From: Filip Jagodzinski Date: Fri, 3 Nov 2017 10:57:20 +0100 Subject: [PATCH 12/80] Tests: RTOS: RtosTimer: Refactor for readability --- TESTS/mbedmicro-rtos-mbed/rtostimer/main.cpp | 320 +++++++++---------- 1 file changed, 151 insertions(+), 169 deletions(-) diff --git a/TESTS/mbedmicro-rtos-mbed/rtostimer/main.cpp b/TESTS/mbedmicro-rtos-mbed/rtostimer/main.cpp index 59c26cc4f2..694ea04bf3 100644 --- a/TESTS/mbedmicro-rtos-mbed/rtostimer/main.cpp +++ b/TESTS/mbedmicro-rtos-mbed/rtostimer/main.cpp @@ -21,18 +21,55 @@ using namespace utest::v1; -#define TEST_DELAY_MS 50 -#define TEST_DELAY2_MS 30 -#define TEST_DELAY_MS_DELTA 5 -#define TEST_RESTART_DELAY_MS 10 +#define DELAY_MS 50 +#define DELTA_MS 5 +#define RESTART_DELAY_MS 10 +#define DELAY2_MS 30 -#if TEST_RESTART_DELAY_MS >= TEST_DELAY_MS -#error invalid TEST_RESTART_DELAY_MS value +#if RESTART_DELAY_MS >= DELAY_MS +#error invalid RESTART_DELAY_MS value #endif -void timer_callback(void const *arg) +class Stopwatch: public Timer { +private: + Semaphore _sem; + +public: + Stopwatch() : + Timer(), _sem(1) + { + } + + ~Stopwatch() + { + } + + void start(void) + { + _sem.wait(0); + Timer::start(); + } + + void stop(void) + { + Timer::stop(); + _sem.release(); + } + + int32_t wait_until_stopped(uint32_t millisec = osWaitForever) + { + core_util_critical_section_enter(); + int running = _running; + core_util_critical_section_exit(); + if (!running) { + return 1; + } + return _sem.wait(millisec); + } +}; + +void sem_callback(Semaphore *sem) { - Semaphore *sem = (Semaphore *) arg; sem->release(); } @@ -44,14 +81,15 @@ void timer_callback(void const *arg) * which aborts test program. */ #if defined(MBED_TRAP_ERRORS_ENABLED) && MBED_TRAP_ERRORS_ENABLED -void error(const char* format, ...) { +void error(const char* format, ...) +{ (void) format; } #endif /** Test one-shot not restarted when elapsed * - * Given a one-shot timer + * Given a one-shot RtosTimer * When the timer is started * and given time elapses * Then timer stops @@ -60,32 +98,27 @@ void error(const char* format, ...) { */ void test_oneshot_not_restarted() { - Semaphore sem(1); - RtosTimer timer(mbed::callback(timer_callback, (void const *) &sem), osTimerOnce); - osStatus stat = timer.stop(); - TEST_ASSERT_EQUAL(osErrorResource, stat); + Stopwatch stopwatch; + RtosTimer rtostimer(mbed::callback(&stopwatch, &Stopwatch::stop), osTimerOnce); - Timer t; - sem.wait(0); - stat = timer.start(TEST_DELAY_MS); - t.start(); - TEST_ASSERT_EQUAL(osOK, stat); + stopwatch.start(); + osStatus status = rtostimer.start(DELAY_MS); + TEST_ASSERT_EQUAL(osOK, status); - int32_t slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); - t.stop(); + int32_t slots = stopwatch.wait_until_stopped(); TEST_ASSERT_EQUAL(1, slots); - TEST_ASSERT_INT_WITHIN(TEST_DELAY_MS_DELTA * 1000, TEST_DELAY_MS * 1000, t.read_us()); + TEST_ASSERT_INT_WITHIN(DELTA_MS, DELAY_MS, stopwatch.read_ms()); + stopwatch.start(); - slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); + slots = stopwatch.wait_until_stopped(DELAY_MS + DELTA_MS); TEST_ASSERT_EQUAL(0, slots); - - stat = timer.stop(); - TEST_ASSERT_EQUAL(osErrorResource, stat); + status = rtostimer.stop(); + TEST_ASSERT_EQUAL(osErrorResource, status); } /** Test periodic repeats continuously * - * Given a periodic timer + * Given a periodic RtosTimer * When timer is started * and given time elapses * Then timer repeats its operation @@ -94,77 +127,37 @@ void test_oneshot_not_restarted() */ void test_periodic_repeats() { - Semaphore sem(1); - RtosTimer timer(mbed::callback(timer_callback, (void const *) &sem), osTimerPeriodic); - osStatus stat = timer.stop(); - TEST_ASSERT_EQUAL(osErrorResource, stat); + Stopwatch stopwatch; + RtosTimer rtostimer(mbed::callback(&stopwatch, &Stopwatch::stop), osTimerPeriodic); - Timer t; - sem.wait(0); - stat = timer.start(TEST_DELAY_MS); - t.start(); - TEST_ASSERT_EQUAL(osOK, stat); + stopwatch.start(); + osStatus status = rtostimer.start(DELAY_MS); + TEST_ASSERT_EQUAL(osOK, status); - int32_t slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); - int t1 = t.read_us(); + int32_t slots = stopwatch.wait_until_stopped(); + int t1 = stopwatch.read_ms(); + stopwatch.reset(); + stopwatch.start(); TEST_ASSERT_EQUAL(1, slots); - TEST_ASSERT_INT_WITHIN(TEST_DELAY_MS_DELTA * 1000, TEST_DELAY_MS * 1000, t1); + TEST_ASSERT_INT_WITHIN(DELTA_MS, DELAY_MS, t1); - slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); - t.stop(); + slots = stopwatch.wait_until_stopped(); TEST_ASSERT_EQUAL(1, slots); - TEST_ASSERT_INT_WITHIN(TEST_DELAY_MS_DELTA * 1000, TEST_DELAY_MS * 1000, t.read_us() - t1); + TEST_ASSERT_INT_WITHIN(DELTA_MS, DELAY_MS, stopwatch.read_ms()); + stopwatch.start(); - stat = timer.stop(); - TEST_ASSERT_EQUAL(osOK, stat); + status = rtostimer.stop(); + TEST_ASSERT_EQUAL(osOK, status); - slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); + slots = stopwatch.wait_until_stopped(DELAY_MS + DELTA_MS); TEST_ASSERT_EQUAL(0, slots); - - stat = timer.stop(); - TEST_ASSERT_EQUAL(osErrorResource, stat); -} - -/** Test timer can be restarted - * - * Given a one-shot timer - * When the timer is started - * and @a start is called again before given time elapses - * and given time elapses - * Then timer stops - * and elapsed time is greater than original delay - */ -void test_restart() -{ - Semaphore sem(1); - RtosTimer timer(mbed::callback(timer_callback, (void const *) &sem), osTimerOnce); - osStatus stat = timer.stop(); - TEST_ASSERT_EQUAL(osErrorResource, stat); - - Timer t; - sem.wait(0); - stat = timer.start(TEST_DELAY_MS); - t.start(); - TEST_ASSERT_EQUAL(osOK, stat); - - int32_t slots = sem.wait(TEST_RESTART_DELAY_MS); - TEST_ASSERT_EQUAL(0, slots); - - stat = timer.start(TEST_DELAY_MS); - TEST_ASSERT_EQUAL(osOK, stat); - - slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); - t.stop(); - TEST_ASSERT_EQUAL(1, slots); - TEST_ASSERT_INT_WITHIN(TEST_DELAY_MS_DELTA * 1000, (TEST_DELAY_MS + TEST_RESTART_DELAY_MS) * 1000, t.read_us()); - - stat = timer.stop(); - TEST_ASSERT_EQUAL(osErrorResource, stat); + status = rtostimer.stop(); + TEST_ASSERT_EQUAL(osErrorResource, status); } /** Test timer can be started again * - * Given a one-shot timer + * Given a one-shot Rtosimer * When the timer is started * and given time elapses * Then timer stops @@ -174,34 +167,31 @@ void test_restart() */ void test_start_again() { - Semaphore sem(1); - RtosTimer timer(mbed::callback(timer_callback, (void const *) &sem), osTimerOnce); - osStatus stat = timer.stop(); - TEST_ASSERT_EQUAL(osErrorResource, stat); + Semaphore sem(0, 1); + RtosTimer rtostimer(mbed::callback(sem_callback, &sem), osTimerOnce); - sem.wait(0); - stat = timer.start(TEST_DELAY_MS); - TEST_ASSERT_EQUAL(osOK, stat); + osStatus status = rtostimer.start(DELAY_MS); + TEST_ASSERT_EQUAL(osOK, status); - int32_t slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); + int32_t slots = sem.wait(DELAY_MS + DELTA_MS); TEST_ASSERT_EQUAL(1, slots); - stat = timer.stop(); - TEST_ASSERT_EQUAL(osErrorResource, stat); + status = rtostimer.stop(); + TEST_ASSERT_EQUAL(osErrorResource, status); - stat = timer.start(TEST_DELAY_MS); - TEST_ASSERT_EQUAL(osOK, stat); + status = rtostimer.start(DELAY_MS); + TEST_ASSERT_EQUAL(osOK, status); - slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); + slots = sem.wait(DELAY_MS + DELTA_MS); TEST_ASSERT_EQUAL(1, slots); - stat = timer.stop(); - TEST_ASSERT_EQUAL(osErrorResource, stat); + status = rtostimer.stop(); + TEST_ASSERT_EQUAL(osErrorResource, status); } /** Test timer restart updates delay * - * Given a one-shot timer + * Given a one-shot RtosTimer * When the timer is started * and @a start is called again with a different delay before given time elapses * and updated delay elapses @@ -210,134 +200,127 @@ void test_start_again() */ void test_restart_updates_delay() { - Semaphore sem(1); - RtosTimer timer(mbed::callback(timer_callback, (void const *) &sem), osTimerOnce); - osStatus stat = timer.stop(); - TEST_ASSERT_EQUAL(osErrorResource, stat); + Stopwatch stopwatch; + RtosTimer rtostimer(mbed::callback(&stopwatch, &Stopwatch::stop), osTimerOnce); - sem.wait(0); - stat = timer.start(TEST_DELAY_MS); - TEST_ASSERT_EQUAL(osOK, stat); + stopwatch.start(); + osStatus status = rtostimer.start(DELAY_MS); + TEST_ASSERT_EQUAL(osOK, status); - int32_t slots = sem.wait(TEST_RESTART_DELAY_MS); + int32_t slots = stopwatch.wait_until_stopped(RESTART_DELAY_MS); TEST_ASSERT_EQUAL(0, slots); - Timer t; - stat = timer.start(TEST_DELAY2_MS); - t.start(); - TEST_ASSERT_EQUAL(osOK, stat); + stopwatch.reset(); + stopwatch.start(); + status = rtostimer.start(DELAY2_MS); + TEST_ASSERT_EQUAL(osOK, status); - slots = sem.wait(TEST_DELAY2_MS + TEST_DELAY_MS_DELTA); - t.stop(); + slots = stopwatch.wait_until_stopped(); TEST_ASSERT_EQUAL(1, slots); - TEST_ASSERT_INT_WITHIN(TEST_DELAY_MS_DELTA * 1000, TEST_DELAY2_MS * 1000, t.read_us()); + TEST_ASSERT_INT_WITHIN(DELTA_MS, DELAY2_MS, stopwatch.read_ms()); - stat = timer.stop(); - TEST_ASSERT_EQUAL(osErrorResource, stat); + status = rtostimer.stop(); + TEST_ASSERT_EQUAL(osErrorResource, status); } /** Test timer is created in stopped state * - * Given a one-shot timer + * Given a one-shot RtosTimer * When the timer has not been started * Then the timer is stopped */ void test_created_stopped() { - RtosTimer timer(mbed::callback(timer_callback, (void const *) NULL), osTimerOnce); - osStatus stat = timer.stop(); - TEST_ASSERT_EQUAL(osErrorResource, stat); + RtosTimer rtostimer(mbed::callback(sem_callback, (Semaphore *) NULL), osTimerOnce); + osStatus status = rtostimer.stop(); + TEST_ASSERT_EQUAL(osErrorResource, status); } /** Test one-shot can be stopped * - * Given a one-shot timer + * Given a one-shot RtosTimer * When the timer is started * and timer is stopped while still running * Then timer stops operation */ void test_stop() { - Semaphore sem(1); - RtosTimer timer(mbed::callback(timer_callback, (void const *) &sem), osTimerOnce); - osStatus stat = timer.stop(); - TEST_ASSERT_EQUAL(osErrorResource, stat); + Semaphore sem(0, 1); + RtosTimer rtostimer(mbed::callback(sem_callback, &sem), osTimerOnce); - sem.wait(0); - stat = timer.start(TEST_DELAY_MS); - TEST_ASSERT_EQUAL(osOK, stat); + osStatus status = rtostimer.start(DELAY_MS); + TEST_ASSERT_EQUAL(osOK, status); - int32_t slots = sem.wait(TEST_RESTART_DELAY_MS); + int32_t slots = sem.wait(RESTART_DELAY_MS); TEST_ASSERT_EQUAL(0, slots); - stat = timer.stop(); - TEST_ASSERT_EQUAL(osOK, stat); + status = rtostimer.stop(); + TEST_ASSERT_EQUAL(osOK, status); - slots = sem.wait(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); + slots = sem.wait(DELAY_MS + DELTA_MS); TEST_ASSERT_EQUAL(0, slots); - stat = timer.stop(); - TEST_ASSERT_EQUAL(osErrorResource, stat); + status = rtostimer.stop(); + TEST_ASSERT_EQUAL(osErrorResource, status); } /** Test timer started with infinite delay * - * Given a one-shot timer + * Given a one-shot RtosTimer * When the timer is started with @a osWaitForever delay * Then @a start return status is @a osOK */ void test_wait_forever() { - RtosTimer timer(mbed::callback(timer_callback, (void const *) NULL), osTimerOnce); + RtosTimer rtostimer(mbed::callback(sem_callback, (Semaphore *) NULL), osTimerOnce); - osStatus stat = timer.start(osWaitForever); - TEST_ASSERT_EQUAL(osOK, stat); + osStatus status = rtostimer.start(osWaitForever); + TEST_ASSERT_EQUAL(osOK, status); - stat = timer.stop(); - TEST_ASSERT_EQUAL(osOK, stat); + status = rtostimer.stop(); + TEST_ASSERT_EQUAL(osOK, status); } /** Test timer started with zero delay * - * Given a one-shot timer + * Given a one-shot RtosTimer * When the timer is started with 0 delay * Then @a start return status is @a osErrorParameter */ void test_no_wait() { - RtosTimer timer(mbed::callback(timer_callback, (void const *) NULL), osTimerOnce); + RtosTimer rtostimer(mbed::callback(sem_callback, (Semaphore *) NULL), osTimerOnce); - osStatus stat = timer.start(0); - TEST_ASSERT_EQUAL(osErrorParameter, stat); + osStatus status = rtostimer.start(0); + TEST_ASSERT_EQUAL(osErrorParameter, status); - stat = timer.stop(); - TEST_ASSERT_EQUAL(osErrorResource, stat); + status = rtostimer.stop(); + TEST_ASSERT_EQUAL(osErrorResource, status); } -void timer_isr_call(void const *arg) +void rtostimer_isr_call(RtosTimer *rtostimer) { - RtosTimer *timer = (RtosTimer *) arg; - osStatus stat = timer->start(TEST_DELAY_MS); - TEST_ASSERT_EQUAL(osErrorISR, stat); + osStatus status = rtostimer->start(DELAY_MS); + TEST_ASSERT_EQUAL(osErrorISR, status); - stat = timer->stop(); - TEST_ASSERT_EQUAL(osErrorISR, stat); + status = rtostimer->stop(); + TEST_ASSERT_EQUAL(osErrorISR, status); } /** Test timer method calls from an ISR fail * - * Given a one-shot timer + * Given a one-shot RtosTimer * When a timer method is called from an ISR * Then method return status is @a osErrorISR */ void test_isr_calls_fail() { - RtosTimer timer(mbed::callback(timer_callback, (void const *) NULL), osTimerOnce); + RtosTimer rtostimer(mbed::callback(sem_callback, (Semaphore *) NULL), osTimerOnce); Ticker ticker; - ticker.attach(mbed::callback(timer_isr_call, (void const *) &timer), (float) TEST_DELAY_MS / 1000.0); + ticker.attach(mbed::callback(rtostimer_isr_call, &rtostimer), (float) DELAY_MS / 1000.0); - wait_ms(TEST_DELAY_MS + TEST_DELAY_MS_DELTA); + wait_ms(DELAY_MS + DELTA_MS); } utest::v1::status_t test_setup(const size_t number_of_cases) @@ -347,16 +330,15 @@ utest::v1::status_t test_setup(const size_t number_of_cases) } Case cases[] = { - Case("Test one-shot not restarted when elapsed", test_oneshot_not_restarted), - Case("Test periodic repeats continuously", test_periodic_repeats), - Case("Test timer can be restarted while running", test_restart), - Case("Test stopped timer can be started again", test_start_again), - Case("Test restart changes timeout", test_restart_updates_delay), - Case("Test can be stopped", test_stop), - Case("Test timer is created in stopped state", test_created_stopped), - Case("Test timer started with infinite delay", test_wait_forever), - Case("Test timer started with zero delay", test_no_wait), - Case("Test calls from ISR fail", test_isr_calls_fail) + Case("One-shot not restarted when elapsed", test_oneshot_not_restarted), + Case("Periodic repeats continuously", test_periodic_repeats), + Case("Stopped timer can be started again", test_start_again), + Case("Restart changes timeout", test_restart_updates_delay), + Case("Timer can be stopped", test_stop), + Case("Timer is created in stopped state", test_created_stopped), + Case("Timer started with infinite delay", test_wait_forever), + Case("Timer started with zero delay", test_no_wait), + Case("Calls from ISR fail", test_isr_calls_fail) }; Specification specification(test_setup, cases); From 27d4b52a5f1e40e01164b1bbc904c223990b5837 Mon Sep 17 00:00:00 2001 From: jeromecoutant Date: Fri, 6 Oct 2017 09:56:20 +0200 Subject: [PATCH 13/80] NUCLEO_L496ZG minor update --- .../TARGET_NUCLEO_L496ZG/PeripheralPins.c | 4 +-- .../TARGET_NUCLEO_L496ZG/PinNames.h | 9 +++++ .../TARGET_NUCLEO_L496ZG/system_clock.c | 35 +++++++++++++------ 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L496xG/TARGET_NUCLEO_L496ZG/PeripheralPins.c b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L496xG/TARGET_NUCLEO_L496ZG/PeripheralPins.c index 4795a9c4d2..890c0e7842 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L496xG/TARGET_NUCLEO_L496ZG/PeripheralPins.c +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L496xG/TARGET_NUCLEO_L496ZG/PeripheralPins.c @@ -258,8 +258,8 @@ const PinMap PinMap_UART_TX[] = { {PC_12, UART_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, {PD_5, UART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, {PD_8, UART_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // ARDUINO D1 - {PG_7, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, - {PG_9, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to STDIO_UART_TX + {PG_7, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART1)}, // Connected to STDIO_UART_TX + {PG_9, UART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, {NC, NC, 0} }; diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L496xG/TARGET_NUCLEO_L496ZG/PinNames.h b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L496xG/TARGET_NUCLEO_L496ZG/PinNames.h index 741cd43383..e51ea37f50 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L496xG/TARGET_NUCLEO_L496ZG/PinNames.h +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L496xG/TARGET_NUCLEO_L496ZG/PinNames.h @@ -266,6 +266,15 @@ typedef enum { SPI_CS = D10, PWM_OUT = D9, + USB_OTG_FS_SOF = PA_8, + USB_OTG_FS_VBUS = PA_9, + USB_OTG_FS_ID = PA_10, + USB_OTG_FS_DM = PA_11, + USB_OTG_FS_DP = PA_12, + USB_OTG_FS_NOE_ALT = PA_13, + USB_OTG_FS_SOF_ALT = PA_14, + USB_OTG_FS_NOE = PC_9, + // Not connected NC = (int)0xFFFFFFFF } PinName; diff --git a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L496xG/TARGET_NUCLEO_L496ZG/system_clock.c b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L496xG/TARGET_NUCLEO_L496ZG/system_clock.c index e80f723dde..e8d5be0049 100644 --- a/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L496xG/TARGET_NUCLEO_L496ZG/system_clock.c +++ b/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L496xG/TARGET_NUCLEO_L496ZG/system_clock.c @@ -190,10 +190,10 @@ uint8_t SetSysClock_PLL_HSE(uint8_t bypass) // Select PLL clock as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 80 MHz or 48 MHz - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 80 MHz or 48 MHz - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; // 80 MHz or 48 MHz - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // 80 MHz or 48 MHz + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 80 MHz + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 80 MHz + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; /* 80 MHz */ + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // 80 MHz if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) { return 0; // FAIL } @@ -217,6 +217,13 @@ uint8_t SetSysClock_PLL_HSE(uint8_t bypass) RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // No PLL update HAL_RCC_OscConfig(&RCC_OscInitStruct); + /* Select HSI as clock source for LPUART1 */ + RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LPUART1; + RCC_PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_HSI; + if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit) != HAL_OK) { + return 0; // FAIL + } + // Output clock on MCO1 pin(PA8) for debugging purpose #if DEBUG_MCO == 2 if (bypass == 0) @@ -289,6 +296,13 @@ uint8_t SetSysClock_PLL_HSI(void) RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; // No PLL update HAL_RCC_OscConfig(&RCC_OscInitStruct); + /* Select HSI as clock source for LPUART1 */ + RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LPUART1; + RCC_PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_HSI; + if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit) != HAL_OK) { + return 0; // FAIL + } + // Output clock on MCO1 pin(PA8) for debugging purpose #if DEBUG_MCO == 3 HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1); // 16 MHz @@ -322,7 +336,6 @@ uint8_t SetSysClock_PLL_MSI(void) RCC_OscInitStruct.MSIState = RCC_MSI_ON; RCC_OscInitStruct.HSEState = RCC_HSE_OFF; RCC_OscInitStruct.HSIState = RCC_HSI_OFF; - RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT; RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11; /* 48 MHz */ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; @@ -342,11 +355,6 @@ uint8_t SetSysClock_PLL_MSI(void) PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_MSI; /* 48 MHz */ HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); - /* Select LSE as clock source for LPUART1 */ - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPUART1; - PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_LSE; - HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); - // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; /* 80 MHz */ @@ -357,6 +365,13 @@ uint8_t SetSysClock_PLL_MSI(void) return 0; // FAIL } + /* Select LSE as clock source for LPUART1 */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPUART1; + PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_LSE; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { + return 0; // FAIL + } + // Output clock on MCO1 pin(PA8) for debugging purpose #if DEBUG_MCO == 4 HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_MSI, RCC_MCODIV_2); // 2 MHz From 538208120635a2e0462e8a521be0ca8c64d6eb2d Mon Sep 17 00:00:00 2001 From: jeromecoutant Date: Fri, 3 Nov 2017 11:05:54 +0100 Subject: [PATCH 14/80] NUCLEO_L496ZG_P support --- targets/targets.json | 4 ++++ tools/export/sw4stm32/__init__.py | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/targets/targets.json b/targets/targets.json index dbfaa724fa..97ad2d6562 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -3396,6 +3396,10 @@ "release_versions": ["2", "5"], "device_name": "STM32L496ZG" }, + "NUCLEO_L496ZG_P": { + "inherits": ["NUCLEO_L496ZG"], + "detect_code": ["0828"] + }, "VBLUNO52": { "supported_form_factors": ["ARDUINO"], "inherits": ["MCU_NRF52"], diff --git a/tools/export/sw4stm32/__init__.py b/tools/export/sw4stm32/__init__.py index ce15e09657..9d55dae8fe 100644 --- a/tools/export/sw4stm32/__init__.py +++ b/tools/export/sw4stm32/__init__.py @@ -259,6 +259,11 @@ class Sw4STM32(GNUARMEclipse): 'name': 'NUCLEO-L496ZG', 'mcuId': 'STM32L496ZGTx' }, + 'NUCLEO_L496ZG_P': + { + 'name': 'NUCLEO-L496ZG', + 'mcuId': 'STM32L496ZGTx' + }, } TARGETS = BOARDS.keys() From c4a034fba7d1d953b4e0da375b0d555089cf0c29 Mon Sep 17 00:00:00 2001 From: Boting Ren Date: Fri, 3 Nov 2017 05:15:38 +0900 Subject: [PATCH 15/80] Add mbed-cloud-client support on DISCO_L475VG_IOT01A with wifi_esp8266_v4.json. --- targets/targets.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/targets/targets.json b/targets/targets.json index 97ad2d6562..b66213ecac 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -1606,7 +1606,8 @@ "macros_add": ["USBHOST_OTHER"], "device_has_add": ["ANALOGOUT", "CAN", "LOWPOWERTIMER", "SERIAL_FC", "TRNG", "FLASH"], "release_versions": ["2", "5"], - "device_name": "STM32L475VG" + "device_name": "STM32L475VG", + "bootloader_supported": true }, "DISCO_L476VG": { "inherits": ["FAMILY_STM32"], From b66b28c08ace1527bd0c93e4438372d15ed4a712 Mon Sep 17 00:00:00 2001 From: Ryan Kurte Date: Fri, 6 Oct 2017 15:17:31 +1300 Subject: [PATCH 16/80] Threaded wrapper for rail driver on EFR32 platforms Updated NanostackRfPhyEfr32 with a receive queue. Cleaned up debug messages, re-added to non-threaded calls. Removed debug print override Removed tr_debug override Removed normal-operation prints that could have timing implications if enabled Removed dead NVIC code (and a couple of dead log outputs) --- .../TARGET_SL_RAIL/NanostackRfPhyEfr32.cpp | 198 ++++++++++++++++-- 1 file changed, 176 insertions(+), 22 deletions(-) diff --git a/features/nanostack/FEATURE_NANOSTACK/targets/TARGET_SL_RAIL/NanostackRfPhyEfr32.cpp b/features/nanostack/FEATURE_NANOSTACK/targets/TARGET_SL_RAIL/NanostackRfPhyEfr32.cpp index 875abbb48a..5b9805bf0a 100644 --- a/features/nanostack/FEATURE_NANOSTACK/targets/TARGET_SL_RAIL/NanostackRfPhyEfr32.cpp +++ b/features/nanostack/FEATURE_NANOSTACK/targets/TARGET_SL_RAIL/NanostackRfPhyEfr32.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ #include "NanostackRfPhyEfr32.h" +#include "mbed.h" #include "ns_types.h" #include "platform/arm_hal_interrupt.h" #include "nanostack/platform/arm_hal_phy.h" @@ -23,6 +24,38 @@ #include "mbed-trace/mbed_trace.h" #define TRACE_GROUP "SLRF" +#ifndef RF_THREAD_STACK_SIZE +#define RF_THREAD_STACK_SIZE 1024 +#endif + +#ifndef RF_QUEUE_SIZE +#define RF_QUEUE_SIZE 8 +#endif + +enum RFThreadSignal { + SL_RX_DONE = (1 << 1), + SL_TX_DONE = (1 << 2), + SL_TX_ERR = (1 << 3), + SL_TX_TIMEOUT = (1 << 4), + SL_ACK_RECV = (1 << 5), + SL_ACK_TIMEOUT = (1 << 6), + SL_TXFIFO_ERR = (1 << 7), + SL_RXFIFO_ERR = (1 << 8), + SL_CAL_REQ = (1 << 9), + SL_RSSI_DONE = (1 << 10), + SL_QUEUE_FULL = (1 << 11), + + SL_ACK_PEND = (1 << 31), +}; + +static void rf_thread_loop(const void *arg); +static osThreadDef(rf_thread_loop, osPriorityRealtime, RF_THREAD_STACK_SIZE); +static osThreadId rf_thread_id; + +static volatile void* rx_queue[8]; +static volatile size_t rx_queue_head; +static volatile size_t rx_queue_tail; + /* Silicon Labs headers */ extern "C" { #include "rail/rail.h" @@ -64,10 +97,11 @@ typedef enum { static const RAIL_CsmaConfig_t csma_config = RAIL_CSMA_CONFIG_802_15_4_2003_2p4_GHz_OQPSK_CSMA; -#if defined(TARGET_EFR32MG1) +#if defined(TARGET_EFR32MG1) || defined(TARGET_EFR32FG1) #include "ieee802154_subg_efr32xg1_configurator_out.h" #include "ieee802154_efr32xg1_configurator_out.h" -#elif defined(TARGET_EFR32MG12) +#elif defined(TARGET_EFR32MG12) || defined(TARGET_EFR32FG12) +#include "ieee802154_efr32xg12_configurator_out.h" #include "ieee802154_efr32xg12_configurator_out.h" #else #error "Not a valid target." @@ -152,6 +186,76 @@ static int8_t rf_start_cca(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_h /* Local function prototypes */ static bool rail_checkAndSwitchChannel(uint8_t channel); +static void rf_thread_loop(const void *arg) +{ + tr_debug("rf_thread_loop: starting (id: %d)\n", rf_thread_id); + for (;;) { + osEvent event = osSignalWait(0, osWaitForever); + + if (event.status != osEventSignal) { + continue; + } + + platform_enter_critical(); + + if (event.value.signals & SL_RX_DONE) { + while(rx_queue_tail != rx_queue_head) { + void* handle = (void*) rx_queue[rx_queue_tail]; + RAIL_RxPacketInfo_t* info = (RAIL_RxPacketInfo_t*) memoryPtrFromHandle(handle); + device_driver.phy_rx_cb( + info->dataPtr + 1, + info->dataLength - 1, + info->appendedInfo.lqi, + info->appendedInfo.rssiLatch, + rf_radio_driver_id); + + memoryFree(handle); + rx_queue[rx_queue_tail] = NULL; + + rx_queue_tail = (rx_queue_tail + 1) % RF_QUEUE_SIZE; + } + + } else if (event.value.signals & SL_TX_DONE) { + device_driver.phy_tx_done_cb(rf_radio_driver_id, + current_tx_handle, + PHY_LINK_TX_SUCCESS, + 1, + 1); + } else if (event.value.signals & SL_ACK_RECV) { + device_driver.phy_tx_done_cb( rf_radio_driver_id, + current_tx_handle, + (event.value.signals & SL_ACK_PEND) ? PHY_LINK_TX_DONE_PENDING : PHY_LINK_TX_DONE, + 1, + 1); + } else if (event.value.signals & SL_ACK_TIMEOUT) { + waiting_for_ack = false; + device_driver.phy_tx_done_cb(rf_radio_driver_id, + current_tx_handle, + PHY_LINK_TX_FAIL, + 1, + 1); + } else if(event.value.signals & SL_TX_ERR) { + device_driver.phy_tx_done_cb( rf_radio_driver_id, + current_tx_handle, + PHY_LINK_CCA_FAIL, + 8, + 1); + } else if(event.value.signals & SL_CAL_REQ) { + tr_debug("rf_thread_loop: SL_CAL_REQ signal received (unhandled)\n"); + } else if(event.value.signals & SL_RXFIFO_ERR) { + tr_debug("rf_thread_loop: SL_RXFIFO_ERR signal received (unhandled)\n"); + } else if(event.value.signals & SL_TXFIFO_ERR) { + tr_debug("rf_thread_loop: SL_TXFIFO_ERR signal received (unhandled)\n"); + } else if(event.value.signals & SL_QUEUE_FULL) { + tr_debug("rf_thread_loop: SL_QUEUE_FULL signal received (packet dropped)\n"); + } else { + tr_debug("rf_thread_loop unhandled event status: %d value: %d\n", event.status, event.value.signals); + } + + platform_exit_critical(); + } +} + /*============ CODE =========*/ /* @@ -168,6 +272,8 @@ static int8_t rf_device_register(void) return -1; } + tr_debug("rf_device_register: entry\n"); + #if MBED_CONF_SL_RAIL_BAND == 2400 RADIO_PA_Init((RADIO_PAInit_t*)&paInit2p4); #elif (MBED_CONF_SL_RAIL_BAND == 915) || (MBED_CONF_SL_RAIL_BAND == 868) @@ -254,6 +360,12 @@ static int8_t rf_device_register(void) radio_state = RADIO_INITING; } +#ifdef MBED_CONF_RTOS_PRESENT + rx_queue_head = 0; + rx_queue_tail = 0; + rf_thread_id = osThreadCreate(osThread(rf_thread_loop), NULL); +#endif + return rf_radio_driver_id; } @@ -288,26 +400,26 @@ static int8_t rf_start_cca(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_h switch(radio_state) { case RADIO_UNINIT: - tr_debug("Radio uninit\n"); + tr_debug("rf_start_cca: Radio uninit\n"); return -1; case RADIO_INITING: - tr_debug("Radio initing\n"); + tr_debug("rf_start_cca: Radio initing\n"); return -1; case RADIO_CALIBRATION: - tr_debug("Radio calibrating\n"); + tr_debug("rf_start_cca: Radio calibrating\n"); return -1; case RADIO_TX: - tr_debug("Radio in TX mode\n"); + tr_debug("rf_start_cca: Radio in TX mode\n"); return -1; case RADIO_IDLE: case RADIO_RX: // If we're still waiting for an ACK, don't mess up the internal state if(waiting_for_ack || RAIL_RfStateGet() == RAIL_RF_STATE_TX) { if((RAIL_GetTime() - last_tx) < 30000) { - tr_debug("Still waiting on previous ACK\n"); + tr_debug("rf_start_cca: Still waiting on previous ACK\n"); return -1; } else { - tr_debug("TXerr\n"); + tr_debug("rf_start_cca: TXerr\n"); } } @@ -325,7 +437,7 @@ static int8_t rf_start_cca(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_h txOpt.waitForAck = false; } - //tr_debug("Called TX, len %d, chan %d, ack %d\n", data_length, channel, waiting_for_ack ? 1 : 0); + tr_debug("rf_start_cca: Called TX, len %d, chan %d, ack %d\n", data_length, channel, waiting_for_ack ? 1 : 0); if(RAIL_TxStartWithOptions(channel, &txOpt, &RAIL_CcaCsma, (RAIL_CsmaConfig_t*) &csma_config) == 0) { //Save packet number and sequence @@ -378,7 +490,7 @@ static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_ break; /* Enable wireless interface ED scan mode */ case PHY_INTERFACE_RX_ENERGY_STATE: - tr_debug("Energy det req\n"); + tr_debug("rf_interface_state_control: Energy det req\n"); // TODO: implement energy detection break; /* Enable RX in promiscuous mode (aka no address filtering) */ @@ -435,12 +547,15 @@ static int8_t rf_extension(phy_extension_type_e extension_type, uint8_t *data_pt /* Read status of the link */ case PHY_EXTENSION_READ_LINK_STATUS: // TODO: return accurate value here - tr_debug("Trying to read link status\n"); + tr_debug("rf_extension: Trying to read link status\n"); break; /* Convert between LQI and RSSI */ case PHY_EXTENSION_CONVERT_SIGNAL_INFO: // TODO: return accurate value here - tr_debug("Trying to read signal info\n"); + tr_debug("rf_extension: Trying to read signal info\n"); + break; + case PHY_EXTENSION_ACCEPT_ANY_BEACON: + tr_debug("rf_extension: Trying to accept any beacon\n"); break; } return 0; @@ -468,7 +583,7 @@ static int8_t rf_address_write(phy_address_type_e address_type, uint8_t *address case PHY_MAC_64BIT: /* Store MAC in MSB order */ memcpy(MAC_address, address_ptr, 8); - tr_debug("MACw "); + tr_debug("rf_address_write: MACw "); for(unsigned int i = 0; i < sizeof(MAC_address); i ++) { tr_debug("%02x:", MAC_address[i]); } @@ -483,13 +598,11 @@ static int8_t rf_address_write(phy_address_type_e address_type, uint8_t *address /*Set 16-bit address*/ case PHY_MAC_16BIT: short_address = address_ptr[0] << 8 | address_ptr[1]; - tr_debug("Filter EUI16 %04x\n", short_address); RAIL_IEEE802154_SetShortAddress(short_address); break; /*Set PAN Id*/ case PHY_MAC_PANID: PAN_address = address_ptr[0] << 8 | address_ptr[1]; - tr_debug("Filter PAN %04x\n", PAN_address); RAIL_IEEE802154_SetPanId(PAN_address); break; } @@ -618,7 +731,11 @@ void RAILCb_TxRadioStatus(uint8_t status) { status == RAIL_TX_CONFIG_TX_ABORTED || status == RAIL_TX_CONFIG_TX_BLOCKED) { waiting_for_ack = false; - device_driver.phy_tx_done_cb( rf_radio_driver_id, +#ifdef MBED_CONF_RTOS_PRESENT + osSignalSet(rf_thread_id, SL_TX_ERR); + } +#else + device_driver.phy_tx_done_cb(rf_radio_driver_id, current_tx_handle, PHY_LINK_CCA_FAIL, 8, @@ -626,6 +743,7 @@ void RAILCb_TxRadioStatus(uint8_t status) { } else { tr_debug("Packet TX error %d\n", status); } +#endif } radio_state = RADIO_RX; } @@ -648,7 +766,6 @@ void RAILCb_RxRadioStatus(uint8_t status) { case RAIL_RX_CONFIG_ADDRESS_FILTERED: break; default: - tr_debug("RXE %d\n", status); break; } } @@ -663,7 +780,11 @@ void RAILCb_RxRadioStatus(uint8_t status) { */ void RAILCb_CalNeeded(void) { // TODO: Implement on-the-fly recalibration +#ifdef MBED_CONF_RTOS_PRESENT + osSignalSet(rf_thread_id, SL_CAL_REQ); +#else tr_debug("!!!! Calling for calibration\n"); +#endif } /** @@ -691,6 +812,9 @@ void RAILCb_TimerExpired(void) { * callback. */ void RAILCb_TxPacketSent(RAIL_TxPacketInfo_t *txPacketInfo) { +#ifdef MBED_CONF_RTOS_PRESENT + osSignalSet(rf_thread_id, SL_TX_DONE); +#else if(device_driver.phy_tx_done_cb != NULL) { device_driver.phy_tx_done_cb( rf_radio_driver_id, current_tx_handle, @@ -700,6 +824,7 @@ void RAILCb_TxPacketSent(RAIL_TxPacketInfo_t *txPacketInfo) { 1, 1); } +#endif last_tx = RAIL_GetTime(); radio_state = RADIO_RX; } @@ -731,12 +856,16 @@ void RAILCb_RxPacketReceived(void *rxPacketHandle) { /* Save the pending bit */ last_ack_pending_bit = (rxPacketInfo->dataPtr[1] & (1 << 4)) != 0; /* Tell the stack we got an ACK */ - //tr_debug("rACK\n"); +#ifdef MBED_CONF_RTOS_PRESENT + osSignalSet(rf_thread_id, SL_ACK_RECV | SL_ACK_PEND); +#else + tr_debug("rACK\n"); device_driver.phy_tx_done_cb( rf_radio_driver_id, current_tx_handle, last_ack_pending_bit ? PHY_LINK_TX_DONE_PENDING : PHY_LINK_TX_DONE, 1, 1); +#endif } else { /* Figure out whether we want to not ACK this packet */ @@ -752,14 +881,24 @@ void RAILCb_RxPacketReceived(void *rxPacketHandle) { RAIL_AutoAckCancelAck(); } - //tr_debug("rPKT %d\n", rxPacketInfo->dataLength); /* Feed the received packet into the stack */ +#ifdef MBED_CONF_RTOS_PRESENT + if (((rx_queue_head + 1) % RF_QUEUE_SIZE) != rx_queue_tail) { + memoryTakeReference(rxPacketHandle); + rx_queue[rx_queue_head] = rxPacketHandle; + rx_queue_head = (rx_queue_head + 1) % RF_QUEUE_SIZE; + osSignalSet(rf_thread_id, SL_RX_DONE); + } else { + osSignalSet(rf_thread_id, SL_QUEUE_FULL); + } +#else + tr_debug("rPKT %d\n", rxPacketInfo->dataLength); device_driver.phy_rx_cb(rxPacketInfo->dataPtr + 1, rxPacketInfo->dataLength - 1, - //TODO: take a new RAIL release that exposes LQI, or have LQI as function of RSSI - 255, + rxPacketInfo->appendedInfo.lqi, rxPacketInfo->appendedInfo.rssiLatch, rf_radio_driver_id); +#endif } } } @@ -792,13 +931,16 @@ void RAILCb_IEEE802154_DataRequestCommand(RAIL_IEEE802154_Address_t *address) { */ void RAILCb_RxAckTimeout(void) { if(waiting_for_ack) { - tr_debug("nACK\n"); waiting_for_ack = false; +#ifdef MBED_CONF_RTOS_PRESENT + osSignalSet(rf_thread_id, SL_ACK_TIMEOUT); +#else device_driver.phy_tx_done_cb( rf_radio_driver_id, current_tx_handle, PHY_LINK_TX_FAIL, 1, 1); +#endif } } @@ -849,7 +991,11 @@ static bool rail_checkAndSwitchChannel(uint8_t newChannel) { * time of the callback dispatch. */ void RAILCb_RxFifoAlmostFull(uint16_t bytesAvailable) { +#ifdef MBED_CONF_RTOS_PRESENT + osSignalSet(rf_thread_id, SL_RXFIFO_ERR); +#else tr_debug("RX near full (%d)\n", bytesAvailable); +#endif } /** @@ -871,7 +1017,11 @@ void RAILCb_RxFifoAlmostFull(uint16_t bytesAvailable) { * callback dispatch. */ void RAILCb_TxFifoAlmostEmpty(uint16_t spaceAvailable) { +#ifdef MBED_CONF_RTOS_PRESENT + osSignalSet(rf_thread_id, SL_TXFIFO_ERR); +#else tr_debug("TX near empty (%d)\n", spaceAvailable); +#endif } /** @@ -886,5 +1036,9 @@ void RAILCb_TxFifoAlmostEmpty(uint16_t spaceAvailable) { * get the result. */ void RAILCb_RssiAverageDone(int16_t avgRssi) { +#ifdef MBED_CONF_RTOS_PRESENT + osSignalSet(rf_thread_id, SL_RSSI_DONE); +#else tr_debug("RSSI done (%d)\n", avgRssi); +#endif } \ No newline at end of file From b1c4fa3f3429a2379bd068fcd8ab508de4abdfe6 Mon Sep 17 00:00:00 2001 From: Ryan Kurte Date: Thu, 12 Oct 2017 10:15:12 +1300 Subject: [PATCH 17/80] Added critical section around rf_start_cca --- .../targets/TARGET_SL_RAIL/NanostackRfPhyEfr32.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/features/nanostack/FEATURE_NANOSTACK/targets/TARGET_SL_RAIL/NanostackRfPhyEfr32.cpp b/features/nanostack/FEATURE_NANOSTACK/targets/TARGET_SL_RAIL/NanostackRfPhyEfr32.cpp index 5b9805bf0a..117ccdf306 100644 --- a/features/nanostack/FEATURE_NANOSTACK/targets/TARGET_SL_RAIL/NanostackRfPhyEfr32.cpp +++ b/features/nanostack/FEATURE_NANOSTACK/targets/TARGET_SL_RAIL/NanostackRfPhyEfr32.cpp @@ -211,7 +211,6 @@ static void rf_thread_loop(const void *arg) memoryFree(handle); rx_queue[rx_queue_tail] = NULL; - rx_queue_tail = (rx_queue_tail + 1) % RF_QUEUE_SIZE; } @@ -423,6 +422,8 @@ static int8_t rf_start_cca(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_h } } + platform_enter_critical(); + data_ptr[0] = data_length + 2; RAIL_RfIdleExt(RAIL_IDLE_ABORT , true); RAIL_TxDataLoad(&txData); @@ -443,15 +444,18 @@ static int8_t rf_start_cca(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_h //Save packet number and sequence current_tx_handle = tx_handle; current_tx_sequence = data_ptr[3]; + platform_exit_critical(); return 0; } else { RAIL_RfIdle(); RAIL_RxStart(channel); radio_state = RADIO_RX; + platform_exit_critical(); return -1; } } //Should never get here... + platform_exit_critical(); return -1; } From a95fcbf40bfcf17bbc2c15110afbe5eb348bd54e Mon Sep 17 00:00:00 2001 From: Ryan Kurte Date: Wed, 1 Nov 2017 11:02:08 +1300 Subject: [PATCH 18/80] Swapped to macro definition for debug prints --- .../TARGET_SL_RAIL/NanostackRfPhyEfr32.cpp | 76 ++++++++++++------- 1 file changed, 47 insertions(+), 29 deletions(-) diff --git a/features/nanostack/FEATURE_NANOSTACK/targets/TARGET_SL_RAIL/NanostackRfPhyEfr32.cpp b/features/nanostack/FEATURE_NANOSTACK/targets/TARGET_SL_RAIL/NanostackRfPhyEfr32.cpp index 117ccdf306..3b91b01aa6 100644 --- a/features/nanostack/FEATURE_NANOSTACK/targets/TARGET_SL_RAIL/NanostackRfPhyEfr32.cpp +++ b/features/nanostack/FEATURE_NANOSTACK/targets/TARGET_SL_RAIL/NanostackRfPhyEfr32.cpp @@ -14,24 +14,39 @@ * limitations under the License. */ #include "NanostackRfPhyEfr32.h" + +#include + #include "mbed.h" #include "ns_types.h" #include "platform/arm_hal_interrupt.h" #include "nanostack/platform/arm_hal_phy.h" #include "mbed_toolchain.h" -#include #include "mbed-trace/mbed_trace.h" #define TRACE_GROUP "SLRF" +/* Enable debug printing with SL_RADIO_DEBUG, override debug printer with SL_DEBUG_PRINT. */ +#ifdef SL_RADIO_DEBUG +#ifndef SL_DEBUG_PRINT +#define SL_DEBUG_PRINT(...) tr_debug(__VA_ARGS__) +#endif +#else +#define SL_DEBUG_PRINT(...) +#endif + +/* RF_THREAD_STACK_SIZE defines tack size for the RF adaptor thread */ #ifndef RF_THREAD_STACK_SIZE #define RF_THREAD_STACK_SIZE 1024 #endif +/* RF_QUEUE_SIZE defines queue size for incoming messages */ #ifndef RF_QUEUE_SIZE #define RF_QUEUE_SIZE 8 #endif + +/* RFThreadSignal used to signal from interrupts to the adaptor thread */ enum RFThreadSignal { SL_RX_DONE = (1 << 1), SL_TX_DONE = (1 << 2), @@ -45,13 +60,16 @@ enum RFThreadSignal { SL_RSSI_DONE = (1 << 10), SL_QUEUE_FULL = (1 << 11), + // ACK pend flag can be signalled in addition to RX_DONE SL_ACK_PEND = (1 << 31), }; +/* Adaptor thread definitions */ static void rf_thread_loop(const void *arg); static osThreadDef(rf_thread_loop, osPriorityRealtime, RF_THREAD_STACK_SIZE); static osThreadId rf_thread_id; +/* Queue for passing messages from interrupt to adaptor thread */ static volatile void* rx_queue[8]; static volatile size_t rx_queue_head; static volatile size_t rx_queue_tail; @@ -188,7 +206,7 @@ static bool rail_checkAndSwitchChannel(uint8_t channel); static void rf_thread_loop(const void *arg) { - tr_debug("rf_thread_loop: starting (id: %d)\n", rf_thread_id); + SL_DEBUG_PRINT("rf_thread_loop: starting (id: %d)\n", rf_thread_id); for (;;) { osEvent event = osSignalWait(0, osWaitForever); @@ -240,15 +258,15 @@ static void rf_thread_loop(const void *arg) 8, 1); } else if(event.value.signals & SL_CAL_REQ) { - tr_debug("rf_thread_loop: SL_CAL_REQ signal received (unhandled)\n"); + SL_DEBUG_PRINT("rf_thread_loop: SL_CAL_REQ signal received (unhandled)\n"); } else if(event.value.signals & SL_RXFIFO_ERR) { - tr_debug("rf_thread_loop: SL_RXFIFO_ERR signal received (unhandled)\n"); + SL_DEBUG_PRINT("rf_thread_loop: SL_RXFIFO_ERR signal received (unhandled)\n"); } else if(event.value.signals & SL_TXFIFO_ERR) { - tr_debug("rf_thread_loop: SL_TXFIFO_ERR signal received (unhandled)\n"); + SL_DEBUG_PRINT("rf_thread_loop: SL_TXFIFO_ERR signal received (unhandled)\n"); } else if(event.value.signals & SL_QUEUE_FULL) { - tr_debug("rf_thread_loop: SL_QUEUE_FULL signal received (packet dropped)\n"); + SL_DEBUG_PRINT("rf_thread_loop: SL_QUEUE_FULL signal received (packet dropped)\n"); } else { - tr_debug("rf_thread_loop unhandled event status: %d value: %d\n", event.status, event.value.signals); + SL_DEBUG_PRINT("rf_thread_loop unhandled event status: %d value: %d\n", event.status, event.value.signals); } platform_exit_critical(); @@ -271,7 +289,7 @@ static int8_t rf_device_register(void) return -1; } - tr_debug("rf_device_register: entry\n"); + SL_DEBUG_PRINT("rf_device_register: entry\n"); #if MBED_CONF_SL_RAIL_BAND == 2400 RADIO_PA_Init((RADIO_PAInit_t*)&paInit2p4); @@ -399,26 +417,26 @@ static int8_t rf_start_cca(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_h switch(radio_state) { case RADIO_UNINIT: - tr_debug("rf_start_cca: Radio uninit\n"); + SL_DEBUG_PRINT("rf_start_cca: Radio uninit\n"); return -1; case RADIO_INITING: - tr_debug("rf_start_cca: Radio initing\n"); + SL_DEBUG_PRINT("rf_start_cca: Radio initing\n"); return -1; case RADIO_CALIBRATION: - tr_debug("rf_start_cca: Radio calibrating\n"); + SL_DEBUG_PRINT("rf_start_cca: Radio calibrating\n"); return -1; case RADIO_TX: - tr_debug("rf_start_cca: Radio in TX mode\n"); + SL_DEBUG_PRINT("rf_start_cca: Radio in TX mode\n"); return -1; case RADIO_IDLE: case RADIO_RX: // If we're still waiting for an ACK, don't mess up the internal state if(waiting_for_ack || RAIL_RfStateGet() == RAIL_RF_STATE_TX) { if((RAIL_GetTime() - last_tx) < 30000) { - tr_debug("rf_start_cca: Still waiting on previous ACK\n"); + SL_DEBUG_PRINT("rf_start_cca: Still waiting on previous ACK\n"); return -1; } else { - tr_debug("rf_start_cca: TXerr\n"); + SL_DEBUG_PRINT("rf_start_cca: TXerr\n"); } } @@ -438,7 +456,7 @@ static int8_t rf_start_cca(uint8_t *data_ptr, uint16_t data_length, uint8_t tx_h txOpt.waitForAck = false; } - tr_debug("rf_start_cca: Called TX, len %d, chan %d, ack %d\n", data_length, channel, waiting_for_ack ? 1 : 0); + SL_DEBUG_PRINT("rf_start_cca: Called TX, len %d, chan %d, ack %d\n", data_length, channel, waiting_for_ack ? 1 : 0); if(RAIL_TxStartWithOptions(channel, &txOpt, &RAIL_CcaCsma, (RAIL_CsmaConfig_t*) &csma_config) == 0) { //Save packet number and sequence @@ -494,7 +512,7 @@ static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_ break; /* Enable wireless interface ED scan mode */ case PHY_INTERFACE_RX_ENERGY_STATE: - tr_debug("rf_interface_state_control: Energy det req\n"); + SL_DEBUG_PRINT("rf_interface_state_control: Energy det req\n"); // TODO: implement energy detection break; /* Enable RX in promiscuous mode (aka no address filtering) */ @@ -551,15 +569,15 @@ static int8_t rf_extension(phy_extension_type_e extension_type, uint8_t *data_pt /* Read status of the link */ case PHY_EXTENSION_READ_LINK_STATUS: // TODO: return accurate value here - tr_debug("rf_extension: Trying to read link status\n"); + SL_DEBUG_PRINT("rf_extension: Trying to read link status\n"); break; /* Convert between LQI and RSSI */ case PHY_EXTENSION_CONVERT_SIGNAL_INFO: // TODO: return accurate value here - tr_debug("rf_extension: Trying to read signal info\n"); + SL_DEBUG_PRINT("rf_extension: Trying to read signal info\n"); break; case PHY_EXTENSION_ACCEPT_ANY_BEACON: - tr_debug("rf_extension: Trying to accept any beacon\n"); + SL_DEBUG_PRINT("rf_extension: Trying to accept any beacon\n"); break; } return 0; @@ -587,11 +605,11 @@ static int8_t rf_address_write(phy_address_type_e address_type, uint8_t *address case PHY_MAC_64BIT: /* Store MAC in MSB order */ memcpy(MAC_address, address_ptr, 8); - tr_debug("rf_address_write: MACw "); + SL_DEBUG_PRINT("rf_address_write: MACw "); for(unsigned int i = 0; i < sizeof(MAC_address); i ++) { - tr_debug("%02x:", MAC_address[i]); + SL_DEBUG_PRINT("%02x:", MAC_address[i]); } - tr_debug("\n"); + SL_DEBUG_PRINT("\n"); /* Pass MAC to the RF driver in LSB order */ uint8_t MAC_reversed[8]; for(unsigned int i = 0; i < sizeof(MAC_address); i ++) { @@ -745,7 +763,7 @@ void RAILCb_TxRadioStatus(uint8_t status) { 8, 1); } else { - tr_debug("Packet TX error %d\n", status); + SL_DEBUG_PRINT("Packet TX error %d\n", status); } #endif } @@ -787,7 +805,7 @@ void RAILCb_CalNeeded(void) { #ifdef MBED_CONF_RTOS_PRESENT osSignalSet(rf_thread_id, SL_CAL_REQ); #else - tr_debug("!!!! Calling for calibration\n"); + SL_DEBUG_PRINT("!!!! Calling for calibration\n"); #endif } @@ -863,7 +881,7 @@ void RAILCb_RxPacketReceived(void *rxPacketHandle) { #ifdef MBED_CONF_RTOS_PRESENT osSignalSet(rf_thread_id, SL_ACK_RECV | SL_ACK_PEND); #else - tr_debug("rACK\n"); + SL_DEBUG_PRINT("rACK\n"); device_driver.phy_tx_done_cb( rf_radio_driver_id, current_tx_handle, last_ack_pending_bit ? PHY_LINK_TX_DONE_PENDING : PHY_LINK_TX_DONE, @@ -896,7 +914,7 @@ void RAILCb_RxPacketReceived(void *rxPacketHandle) { osSignalSet(rf_thread_id, SL_QUEUE_FULL); } #else - tr_debug("rPKT %d\n", rxPacketInfo->dataLength); + SL_DEBUG_PRINT("rPKT %d\n", rxPacketInfo->dataLength); device_driver.phy_rx_cb(rxPacketInfo->dataPtr + 1, rxPacketInfo->dataLength - 1, rxPacketInfo->appendedInfo.lqi, @@ -998,7 +1016,7 @@ void RAILCb_RxFifoAlmostFull(uint16_t bytesAvailable) { #ifdef MBED_CONF_RTOS_PRESENT osSignalSet(rf_thread_id, SL_RXFIFO_ERR); #else - tr_debug("RX near full (%d)\n", bytesAvailable); + SL_DEBUG_PRINT("RX near full (%d)\n", bytesAvailable); #endif } @@ -1024,7 +1042,7 @@ void RAILCb_TxFifoAlmostEmpty(uint16_t spaceAvailable) { #ifdef MBED_CONF_RTOS_PRESENT osSignalSet(rf_thread_id, SL_TXFIFO_ERR); #else - tr_debug("TX near empty (%d)\n", spaceAvailable); + SL_DEBUG_PRINT("TX near empty (%d)\n", spaceAvailable); #endif } @@ -1043,6 +1061,6 @@ void RAILCb_RssiAverageDone(int16_t avgRssi) { #ifdef MBED_CONF_RTOS_PRESENT osSignalSet(rf_thread_id, SL_RSSI_DONE); #else - tr_debug("RSSI done (%d)\n", avgRssi); + SL_DEBUG_PRINT("RSSI done (%d)\n", avgRssi); #endif } \ No newline at end of file From bb3bd003c515f40a6087f3644cb5604c5a813648 Mon Sep 17 00:00:00 2001 From: Martin Kojtal <0xc0170@gmail.com> Date: Fri, 27 Oct 2017 17:46:24 +0100 Subject: [PATCH 19/80] ncs36510: fire interrupt correct timer fix Use Timer1, it is used for us ticker isr handling. Plus reset target counter, that should be 0, go to upper ticker isr handler immediately. --- targets/TARGET_ONSEMI/TARGET_NCS36510/ncs36510_us_ticker_api.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/targets/TARGET_ONSEMI/TARGET_NCS36510/ncs36510_us_ticker_api.c b/targets/TARGET_ONSEMI/TARGET_NCS36510/ncs36510_us_ticker_api.c index 75fa1b398b..e0b07b9cbc 100644 --- a/targets/TARGET_ONSEMI/TARGET_NCS36510/ncs36510_us_ticker_api.c +++ b/targets/TARGET_ONSEMI/TARGET_NCS36510/ncs36510_us_ticker_api.c @@ -130,7 +130,8 @@ uint32_t us_ticker_read() void us_ticker_fire_interrupt(void) { - NVIC_SetPendingIRQ(Tim0_IRQn); + us_ticker_target = 0; + NVIC_SetPendingIRQ(Tim1_IRQn); } /******************************************************************************* From d3ca63edd58b19d9305ff1a527cd59a47ccaa88b Mon Sep 17 00:00:00 2001 From: Senthil Ramakrishnan Date: Tue, 24 Oct 2017 10:05:45 -0500 Subject: [PATCH 20/80] Doxygen comment updates and fixes --- doxyfile_options | 2 +- drivers/UARTSerial.h | 7 +++++++ platform/ATCmdParser.h | 16 ++++++++++++++-- platform/CThunk.h | 10 ++++++++-- platform/CallChain.h | 19 ++++++++++++++----- platform/Callback.h | 16 ++++++++-------- platform/CircularBuffer.h | 10 +++++++++- platform/CriticalSectionLock.h | 10 ++++++++++ platform/DeepSleepLock.h | 11 +++++++++++ platform/DirHandle.h | 8 +++++++- platform/FileBase.h | 19 +++++++++++++------ platform/FileHandle.h | 11 ++++++++++- platform/FileLike.h | 14 ++++++++++---- platform/FilePath.h | 20 ++++++++++++++++---- platform/FileSystemHandle.h | 6 ++++++ platform/FileSystemLike.h | 9 ++++++++- platform/FunctionPointer.h | 16 +++++++++------- platform/LocalFileSystem.h | 9 ++++++++- platform/PlatformMutex.h | 9 ++++++++- platform/SingletonPtr.h | 8 ++++++-- platform/Stream.h | 8 ++++++-- platform/Transaction.h | 9 +++++++-- platform/mbed_application.h | 5 +---- platform/mbed_assert.h | 22 +++++++++++++++++++++- platform/mbed_critical.h | 13 ++++++++++--- platform/mbed_debug.h | 10 +++++++++- platform/mbed_error.h | 5 +++++ platform/mbed_interface.h | 11 +++++++++++ platform/mbed_mem_trace.h | 8 ++++++++ platform/mbed_mktime.h | 7 +++++++ platform/mbed_poll.h | 10 +++++++++- platform/mbed_preprocessor.h | 6 ++++++ platform/mbed_retarget.h | 12 ++++++++++++ platform/mbed_rtc_time.h | 5 +++++ platform/mbed_semihost_api.h | 4 +--- platform/mbed_sleep.h | 6 ++++++ platform/mbed_stats.h | 12 ++++++++++++ platform/mbed_toolchain.h | 6 ++++++ platform/mbed_wait_api.h | 6 ++++++ rtos/EventFlags.h | 10 ++++++++-- rtos/Mail.h | 11 +++++++++-- rtos/MemoryPool.h | 10 ++++++++-- rtos/Mutex.h | 11 ++++++++--- rtos/Queue.h | 9 +++++++-- rtos/RtosTimer.h | 10 ++++++++-- rtos/Semaphore.h | 9 +++++++-- rtos/Thread.h | 9 +++++++-- rtos/rtos_idle.h | 11 +++++++++++ 48 files changed, 404 insertions(+), 81 deletions(-) diff --git a/doxyfile_options b/doxyfile_options index be46e1346e..4ee6b29a87 100644 --- a/doxyfile_options +++ b/doxyfile_options @@ -32,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = "My Project" +PROJECT_NAME = "Mbed OS Reference" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version diff --git a/drivers/UARTSerial.h b/drivers/UARTSerial.h index c0069adcb7..f6ff523f8f 100644 --- a/drivers/UARTSerial.h +++ b/drivers/UARTSerial.h @@ -39,6 +39,13 @@ namespace mbed { +/** \addtogroup drivers */ + +/** Class providing buffered UART communication functionality using separate circular buffer for send and receive channels + * + * @ingroup drivers + */ + class UARTSerial : private SerialBase, public FileHandle, private NonCopyable { public: diff --git a/platform/ATCmdParser.h b/platform/ATCmdParser.h index 1201a6055f..c8fb040634 100644 --- a/platform/ATCmdParser.h +++ b/platform/ATCmdParser.h @@ -24,6 +24,15 @@ #include #include "Callback.h" +namespace mbed { + +/** \addtogroup platform */ +/** @{*/ +/** + * \defgroup platform_ATCmdParser ATCmdParser class + * @{ + */ + /** * Parser class for parsing AT commands * @@ -43,8 +52,6 @@ * @endcode */ -namespace mbed { - class ATCmdParser : private NonCopyable { private: @@ -299,6 +306,11 @@ public: */ bool process_oob(void); }; + +/**@}*/ + +/**@}*/ + } //namespace mbed #endif //MBED_ATCMDPARSER_H diff --git a/platform/CThunk.h b/platform/CThunk.h index 90e150b6a9..73c3aba138 100644 --- a/platform/CThunk.h +++ b/platform/CThunk.h @@ -1,6 +1,10 @@ /** \addtogroup platform */ /** @{*/ +/** + * \defgroup platform_CThunk CThunk class + * @{ + */ /* General C++ Object Thunking class * * - allows direct callbacks to non-static C++ class functions @@ -73,13 +77,11 @@ /* IRQ/Exception compatible thunk entry function */ typedef void (*CThunkEntry)(void); -/** @}*/ /** * Class for created a pointer with data bound to it * * @note Synchronization level: Not protected - * @ingroup platform */ template class CThunk @@ -243,5 +245,9 @@ class CThunk } }; +/**@}*/ + +/**@}*/ + #endif/*__CTHUNK_H__*/ diff --git a/platform/CallChain.h b/platform/CallChain.h index 42e97e6d28..ffb786d2c2 100644 --- a/platform/CallChain.h +++ b/platform/CallChain.h @@ -22,7 +22,17 @@ #include namespace mbed { + + +typedef Callback *pFunctionPointer_t; +class CallChainLink; + /** \addtogroup platform */ +/** @{*/ +/** + * \defgroup platform_CallChain CallChain class + * @{ + */ /** Group one or more functions in an instance of a CallChain, then call them in * sequence using CallChain::call(). Used mostly by the interrupt chaining code, @@ -60,12 +70,7 @@ namespace mbed { * chain.call(); * } * @endcode - * @ingroup platform */ - -typedef Callback *pFunctionPointer_t; -class CallChainLink; - class CallChain : private NonCopyable { public: /** Create an empty chain @@ -183,6 +188,10 @@ private: CallChainLink *_chain; }; +/**@}*/ + +/**@}*/ + } // namespace mbed #endif diff --git a/platform/Callback.h b/platform/Callback.h index cb2c5a95b3..b300afefad 100644 --- a/platform/Callback.h +++ b/platform/Callback.h @@ -24,12 +24,15 @@ namespace mbed { /** \addtogroup platform */ - +/** @{*/ +/** + * \defgroup platform_Callback Callback class + * @{ + */ /** Callback class based on template specialization * * @note Synchronization level: Not protected - * @ingroup platform */ template class Callback; @@ -67,7 +70,6 @@ namespace detail { /** Callback class based on template specialization * * @note Synchronization level: Not protected - * @ingroup platform */ template class Callback { @@ -642,7 +644,6 @@ private: /** Callback class based on template specialization * * @note Synchronization level: Not protected - * @ingroup platform */ template class Callback { @@ -1218,7 +1219,6 @@ private: /** Callback class based on template specialization * * @note Synchronization level: Not protected - * @ingroup platform */ template class Callback { @@ -1795,7 +1795,6 @@ private: /** Callback class based on template specialization * * @note Synchronization level: Not protected - * @ingroup platform */ template class Callback { @@ -2373,7 +2372,6 @@ private: /** Callback class based on template specialization * * @note Synchronization level: Not protected - * @ingroup platform */ template class Callback { @@ -2952,7 +2950,6 @@ private: /** Callback class based on template specialization * * @note Synchronization level: Not protected - * @ingroup platform */ template class Callback { @@ -4546,6 +4543,9 @@ Callback callback(const volatile U *obj, R (*func)(const return Callback(func, obj); } +/**@}*/ + +/**@}*/ } // namespace mbed diff --git a/platform/CircularBuffer.h b/platform/CircularBuffer.h index bb7fd38c54..b721791b81 100644 --- a/platform/CircularBuffer.h +++ b/platform/CircularBuffer.h @@ -20,11 +20,15 @@ namespace mbed { /** \addtogroup platform */ +/** @{*/ +/** + * \defgroup platform_CircularBuffer CircularBuffer functions + * @{ + */ /** Templated Circular buffer class * * @note Synchronization level: Interrupt safe - * @ingroup platform */ template class CircularBuffer { @@ -112,6 +116,10 @@ private: volatile bool _full; }; +/**@}*/ + +/**@}*/ + } #endif diff --git a/platform/CriticalSectionLock.h b/platform/CriticalSectionLock.h index 5199fbaf69..cb619769c8 100644 --- a/platform/CriticalSectionLock.h +++ b/platform/CriticalSectionLock.h @@ -22,6 +22,13 @@ namespace mbed { +/** \addtogroup platform */ +/** @{*/ +/** + * \defgroup platform_CriticalSectionLock CriticalSectionLock functions + * @{ + */ + /** RAII object for disabling, then restoring, interrupt state * Usage: * @code @@ -65,6 +72,9 @@ public: } }; +/**@}*/ + +/**@}*/ } // namespace mbed diff --git a/platform/DeepSleepLock.h b/platform/DeepSleepLock.h index 17abe15614..6b64022fc0 100644 --- a/platform/DeepSleepLock.h +++ b/platform/DeepSleepLock.h @@ -22,6 +22,12 @@ namespace mbed { +/** \addtogroup platform */ +/** @{*/ +/** + * \defgroup platform_DeepSleepLock DeepSleepLock functions + * @{ + */ /** RAII object for disabling, then restoring the deep sleep mode * Usage: @@ -82,6 +88,11 @@ public: } }; +/**@}*/ + +/**@}*/ + + } #endif diff --git a/platform/DirHandle.h b/platform/DirHandle.h index b1dcfe2b1f..116ebf581d 100644 --- a/platform/DirHandle.h +++ b/platform/DirHandle.h @@ -23,6 +23,11 @@ namespace mbed { /** \addtogroup platform */ +/** @{*/ +/** + * \defgroup platform_DirHandle DirHandle functions + * @{ + */ /** Represents a directory stream. Objects of this type are returned @@ -40,7 +45,6 @@ namespace mbed { * * @note to create a directory, @see Dir * @note Synchronization level: Set by subclass - * @ingroup platform */ class DirHandle : private NonCopyable { public: @@ -142,7 +146,9 @@ public: virtual void seekdir(off_t location) { seek(location); } }; +/**@}*/ +/**@}*/ } // namespace mbed #endif /* MBED_DIRHANDLE_H */ diff --git a/platform/FileBase.h b/platform/FileBase.h index 5df9ef8550..4f6371923b 100644 --- a/platform/FileBase.h +++ b/platform/FileBase.h @@ -27,19 +27,22 @@ typedef int FILEHANDLE; #include "platform/NonCopyable.h" namespace mbed { -/** \addtogroup platform */ -/** @{*/ - + typedef enum { FilePathType, FileSystemPathType } PathType; -/** @}*/ +/** \addtogroup platform */ +/** @{*/ /** - * @class FileBase - * @ingroup platform + * \defgroup platform_FileBase FileBase class + * @{ */ +/** Class FileBase + * + */ + class FileBase : private NonCopyable { public: FileBase(const char *name, PathType t); @@ -62,6 +65,10 @@ private: const PathType _path_type; }; +/**@}*/ + +/**@}*/ + } // namespace mbed #endif diff --git a/platform/FileHandle.h b/platform/FileHandle.h index a6b306b3fa..6a769b4b8f 100644 --- a/platform/FileHandle.h +++ b/platform/FileHandle.h @@ -26,6 +26,11 @@ typedef int FILEHANDLE; namespace mbed { /** \addtogroup platform */ +/** @{*/ +/** + * \defgroup platform_FileHandle FileHandle functions + * @{ + */ /** Class FileHandle @@ -36,7 +41,6 @@ namespace mbed { * * @note to create a file, @see File * @note Synchronization level: Set by subclass - * @ingroup platform */ class FileHandle : private NonCopyable { public: @@ -254,6 +258,11 @@ public: std::FILE *fdopen(FileHandle *fh, const char *mode); +/**@}*/ + +/**@}*/ + + } // namespace mbed #endif diff --git a/platform/FileLike.h b/platform/FileLike.h index 91a3f304d0..e75be50bfd 100644 --- a/platform/FileLike.h +++ b/platform/FileLike.h @@ -23,14 +23,17 @@ namespace mbed { /** \addtogroup platform */ - - -/* Class FileLike +/** @{*/ +/** + * \defgroup platform_FileLike FileLike class + * @{ + */ +/** Class FileLike + * * A file-like object is one that can be opened with fopen by * fopen("/name", mode). * * @note Synchronization level: Set by subclass - * @ingroup platform */ class FileLike : public FileHandle, public FileBase, private NonCopyable { public: @@ -42,6 +45,9 @@ public: virtual ~FileLike() {} }; +/**@}*/ + +/**@}*/ } // namespace mbed diff --git a/platform/FilePath.h b/platform/FilePath.h index 4c4dc65e15..d380041ca0 100644 --- a/platform/FilePath.h +++ b/platform/FilePath.h @@ -23,15 +23,23 @@ namespace mbed { /** \addtogroup platform */ - +/** @{*/ /** - * @class FileSystem - * @ingroup platform + * \defgroup platform_FilePath FilePath class + * @{ */ -class FileSystem; +class FileSystem; +/** Class FilePath + * + */ + class FilePath { public: + /** Constructor FilePath + * + * @param file_path The path of file. + */ FilePath(const char* file_path); const char* fileName(void); @@ -48,6 +56,10 @@ private: FileBase* fb; }; +/**@}*/ + +/**@}*/ + } // namespace mbed #endif diff --git a/platform/FileSystemHandle.h b/platform/FileSystemHandle.h index bf2c33561d..713d6e5d7a 100644 --- a/platform/FileSystemHandle.h +++ b/platform/FileSystemHandle.h @@ -26,6 +26,10 @@ namespace mbed { /** \addtogroup platform */ /** @{*/ +/** + * \defgroup platform_FileSystemHandle FileSystemHandle functions + * @{ + */ /** A filesystem-like object is one that can be used to open file-like @@ -91,7 +95,9 @@ public: */ virtual int mkdir(const char *path, mode_t mode); }; +/**@}*/ +/**@}*/ } // namespace mbed diff --git a/platform/FileSystemLike.h b/platform/FileSystemLike.h index d8923391d6..aef7913cf6 100644 --- a/platform/FileSystemLike.h +++ b/platform/FileSystemLike.h @@ -25,6 +25,11 @@ namespace mbed { /** \addtogroup platform */ +/** @{*/ +/** + * \defgroup platform_FileSystemLike FileSystemLike functions + * @{ + */ /** A filesystem-like object is one that can be used to open file-like @@ -34,7 +39,6 @@ namespace mbed { * of the rest of the functions just return error values). * * @note Synchronization level: Set by subclass - * @ingroup platform */ class FileSystemLike : public FileSystemHandle, public FileBase, private NonCopyable { public: @@ -79,6 +83,9 @@ public: } }; +/**@}*/ + +/**@}*/ } // namespace mbed diff --git a/platform/FunctionPointer.h b/platform/FunctionPointer.h index a57195f7a8..18c34c2106 100644 --- a/platform/FunctionPointer.h +++ b/platform/FunctionPointer.h @@ -23,13 +23,14 @@ namespace mbed { /** \addtogroup platform */ - +/** @{*/ +/** + * \defgroup platform_FunctionPointer FunctionPointer class + * @{ + */ // Declarations for backwards compatibility // To be foward compatible, code should adopt the Callback class -/** - * @ingroup platform - */ template class FunctionPointerArg1 : public Callback { public: @@ -61,9 +62,6 @@ public: } }; -/** - * @ingroup platform - */ template class FunctionPointerArg1 : public Callback { public: @@ -97,6 +95,10 @@ public: typedef FunctionPointerArg1 FunctionPointer; +/**@}*/ + +/**@}*/ + } // namespace mbed diff --git a/platform/LocalFileSystem.h b/platform/LocalFileSystem.h index 3bd64d8377..ce0baafaf0 100644 --- a/platform/LocalFileSystem.h +++ b/platform/LocalFileSystem.h @@ -27,9 +27,12 @@ namespace mbed { /** \addtogroup platform */ /** @{*/ +/** + * \defgroup platform_LocalFileSystem LocalFileSystem functions + * @{ + */ FILEHANDLE local_file_open(const char* name, int flags); -/** @}*/ /** * @class LocalFileHandle @@ -112,6 +115,10 @@ public: virtual int remove(const char *filename); }; +/**@}*/ + +/**@}*/ + } // namespace mbed #endif diff --git a/platform/PlatformMutex.h b/platform/PlatformMutex.h index 517fd3ad05..dc3b82bee6 100644 --- a/platform/PlatformMutex.h +++ b/platform/PlatformMutex.h @@ -1,5 +1,10 @@ /** \addtogroup platform */ +/** @{*/ +/** + * \defgroup platform_PlatformMutex PlatformMutex class + * @{ + */ /* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * @@ -25,7 +30,6 @@ typedef rtos::Mutex PlatformMutex; #else /** A stub mutex for when an RTOS is not present - * @ingroup platform */ class PlatformMutex : private mbed::NonCopyable { public: @@ -50,3 +54,6 @@ public: #endif +/**@}*/ + +/**@}*/ diff --git a/platform/SingletonPtr.h b/platform/SingletonPtr.h index 369d6dbe2f..848fd099f4 100644 --- a/platform/SingletonPtr.h +++ b/platform/SingletonPtr.h @@ -1,6 +1,10 @@ /** \addtogroup platform */ /** @{*/ +/** + * \defgroup platform_SingletonPtr SingletonPtr class + * @{ + */ /* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * @@ -55,7 +59,6 @@ inline static void singleton_unlock(void) osMutexRelease (singleton_mutex_id); #endif } -/** @}*/ /** Utility class for creating an using a singleton * @@ -68,7 +71,6 @@ inline static void singleton_unlock(void) * @note: This class is lazily initialized on first use. * This class is a POD type so if it is not used it will * be garbage collected. - * @ingroup platform */ template struct SingletonPtr { @@ -108,4 +110,6 @@ struct SingletonPtr { }; #endif +/**@}*/ +/**@}*/ diff --git a/platform/Stream.h b/platform/Stream.h index fd74b0520f..20b7e44afc 100644 --- a/platform/Stream.h +++ b/platform/Stream.h @@ -26,16 +26,18 @@ namespace mbed { /** \addtogroup platform */ /** @{*/ +/** + * \defgroup platform_Stream Stream class + * @{ + */ extern void mbed_set_unbuffered_stream(std::FILE *_file); extern int mbed_getc(std::FILE *_file); extern char* mbed_gets(char *s, int size, std::FILE *_file); -/** @}*/ /** File stream * * @note Synchronization level: Set by subclass - * @ingroup platform */ class Stream : public FileLike, private NonCopyable { @@ -82,7 +84,9 @@ protected: // Stub } }; +/**@}*/ +/**@}*/ } // namespace mbed #endif diff --git a/platform/Transaction.h b/platform/Transaction.h index 8e26236880..23f03e07f2 100644 --- a/platform/Transaction.h +++ b/platform/Transaction.h @@ -21,9 +21,13 @@ namespace mbed { /** \addtogroup platform */ +/** @{*/ +/** + * \defgroup platform_Transaction Transaction class + * @{ + */ /** Transaction structure - * @ingroup platform */ typedef struct { void *tx_buffer; /**< Tx buffer */ @@ -38,7 +42,6 @@ typedef struct { /** Transaction class defines a transaction. * * @note Synchronization level: Not protected - * @ingroup platform */ template class Transaction { @@ -72,7 +75,9 @@ private: Class* _obj; transaction_t _data; }; +/**@}*/ +/**@}*/ } #endif diff --git a/platform/mbed_application.h b/platform/mbed_application.h index 633b6a8572..43b4813f75 100644 --- a/platform/mbed_application.h +++ b/platform/mbed_application.h @@ -1,6 +1,3 @@ - -/** \addtogroup platform */ -/** @{*/ /* mbed Microcontroller Library * Copyright (c) 2017-2017 ARM Limited * @@ -16,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + #ifndef MBED_APPLICATION_H #define MBED_APPLICATION_H @@ -52,4 +50,3 @@ void mbed_start_application(uintptr_t address); #endif -/** @}*/ diff --git a/platform/mbed_assert.h b/platform/mbed_assert.h index bd86983fc8..d651f1e8c0 100644 --- a/platform/mbed_assert.h +++ b/platform/mbed_assert.h @@ -1,6 +1,10 @@ /** \addtogroup platform */ /** @{*/ +/** + * \defgroup platform_Assert Assert macros + * @{ + */ /* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * @@ -39,6 +43,19 @@ void mbed_assert_internal(const char *expr, const char *file, int line); } #endif +/** MBED_ASSERT + * Declare runtime assertions: results in runtime error if condition is false + * + * @note + * Use of MBED_ASSERT is limited debug builds only. + * + * @code + * + * int Configure(serial_t *obj) { + * MBED_ASSERT(obj); + * } + * @endcode + */ #ifdef NDEBUG #define MBED_ASSERT(expr) ((void)0) @@ -110,4 +127,7 @@ do { \ #endif -/** @}*/ +/**@}*/ + +/**@}*/ + diff --git a/platform/mbed_critical.h b/platform/mbed_critical.h index 8aa314a8e9..0b7cb2a8b1 100644 --- a/platform/mbed_critical.h +++ b/platform/mbed_critical.h @@ -1,6 +1,4 @@ -/** \addtogroup platform */ -/** @{*/ /* * Copyright (c) 2015-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: Apache-2.0 @@ -29,6 +27,12 @@ extern "C" { #endif +/** \addtogroup platform */ +/** @{*/ +/** + * \defgroup platform_critical critical section function + * @{ + */ /** Determine the current interrupts enabled state * @@ -363,8 +367,11 @@ void *core_util_atomic_decr_ptr(void **valuePtr, ptrdiff_t delta); #ifdef __cplusplus } // extern "C" #endif +/**@}*/ +/**@}*/ #endif // __MBED_UTIL_CRITICAL_H__ -/** @}*/ + + diff --git a/platform/mbed_debug.h b/platform/mbed_debug.h index 761c1eb99f..5f9a19805d 100644 --- a/platform/mbed_debug.h +++ b/platform/mbed_debug.h @@ -1,6 +1,11 @@ /** \addtogroup platform */ /** @{*/ +/** + * \defgroup platform_debug Debug functions + * @{ + */ + /* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * @@ -68,4 +73,7 @@ static inline void debug_if(int condition, const char *format, ...) { #endif -/** @}*/ +/**@}*/ + +/**@}*/ + diff --git a/platform/mbed_error.h b/platform/mbed_error.h index 1da55135b9..8f5cd9baff 100644 --- a/platform/mbed_error.h +++ b/platform/mbed_error.h @@ -1,6 +1,10 @@ /** \addtogroup platform */ /** @{*/ +/** + * \defgroup platform_error Error functions + * @{ + */ /* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * @@ -75,3 +79,4 @@ void error(const char* format, ...); #endif /** @}*/ +/** @}*/ diff --git a/platform/mbed_interface.h b/platform/mbed_interface.h index 538a6a7cbf..94baa34f77 100644 --- a/platform/mbed_interface.h +++ b/platform/mbed_interface.h @@ -1,6 +1,11 @@ /** \addtogroup platform */ /** @{*/ +/** + * \defgroup platform_interface Network interface and other utility functions + * @{ + */ + /* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * @@ -42,6 +47,11 @@ extern "C" { #if DEVICE_SEMIHOST +/** + * \defgroup platform_interface interface functions + * @{ + */ + /** Functions to control the mbed interface * * mbed Microcontrollers have a built-in interface to provide functionality such as @@ -137,6 +147,7 @@ void mbed_error_printf(const char* format, ...); * */ void mbed_error_vfprintf(const char * format, va_list arg); +/** @}*/ #ifdef __cplusplus } diff --git a/platform/mbed_mem_trace.h b/platform/mbed_mem_trace.h index 0267255ba7..59da721e2f 100644 --- a/platform/mbed_mem_trace.h +++ b/platform/mbed_mem_trace.h @@ -1,6 +1,7 @@ /** \addtogroup platform */ /** @{*/ + /* mbed Microcontroller Library * Copyright (c) 2006-2016 ARM Limited * @@ -35,6 +36,11 @@ enum { MBED_MEM_TRACE_FREE }; +/** + * \defgroup platform_mem_trace mem_trace functions + * @{ + */ + /* Prefix for the output of the default tracer */ #define MBED_MEM_DEFAULT_TRACER_PREFIX "#" @@ -133,6 +139,8 @@ void mbed_mem_trace_free(void *ptr, void *caller); */ void mbed_mem_trace_default_callback(uint8_t op, void *res, void *caller, ...); +/** @}*/ + #ifdef __cplusplus } #endif diff --git a/platform/mbed_mktime.h b/platform/mbed_mktime.h index b28525224c..dd302702e4 100644 --- a/platform/mbed_mktime.h +++ b/platform/mbed_mktime.h @@ -28,6 +28,11 @@ extern "C" { #endif +/** + * \defgroup platform_mktime mktime functions + * @{ + */ + /** Compute if a year is a leap year or not. * * @param year The year to test it shall be in the range [70:138]. Year 0 is @@ -89,6 +94,8 @@ time_t _rtc_mktime(const struct tm* calendar_time); */ bool _rtc_localtime(time_t timestamp, struct tm* calendar_time); +/** @}*/ + #ifdef __cplusplus } #endif diff --git a/platform/mbed_poll.h b/platform/mbed_poll.h index 635733bb98..f9c894c21f 100644 --- a/platform/mbed_poll.h +++ b/platform/mbed_poll.h @@ -27,7 +27,11 @@ namespace mbed { class FileHandle; /** \addtogroup platform */ - +/** @{*/ +/** + * \defgroup platform_poll poll functions + * @{ + */ struct pollfh { FileHandle *fh; @@ -47,6 +51,10 @@ struct pollfh { */ int poll(pollfh fhs[], unsigned nfhs, int timeout); +/**@}*/ + +/**@}*/ + } // namespace mbed #endif //MBED_POLL_H diff --git a/platform/mbed_preprocessor.h b/platform/mbed_preprocessor.h index 5e72d99f87..63312e8b13 100644 --- a/platform/mbed_preprocessor.h +++ b/platform/mbed_preprocessor.h @@ -1,5 +1,10 @@ /** \addtogroup platform */ /** @{*/ +/** + * \defgroup platform_preprocessor preprocessor macros + * @{ + */ + /* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * @@ -51,3 +56,4 @@ #endif /** @}*/ +/** @}*/ diff --git a/platform/mbed_retarget.h b/platform/mbed_retarget.h index a12abc219b..0f3e30b5e5 100644 --- a/platform/mbed_retarget.h +++ b/platform/mbed_retarget.h @@ -58,13 +58,21 @@ typedef unsigned int gid_t; ///< Group ID #endif +/** \addtogroup platform */ +/** @{*/ +/** + * \defgroup platform_retarget Retarget functions + * @{ + */ /* DIR declarations must also be here */ #if __cplusplus namespace mbed { + class FileHandle; class DirHandle; std::FILE *mbed_fdopen(FileHandle *fh, const char *mode); + } typedef mbed::DirHandle DIR; #else @@ -438,4 +446,8 @@ enum { DT_SOCK, ///< This is a UNIX domain socket. }; +/**@}*/ + +/**@}*/ + #endif /* RETARGET_H */ diff --git a/platform/mbed_rtc_time.h b/platform/mbed_rtc_time.h index 84a3739ec3..ee3e7ec7a1 100644 --- a/platform/mbed_rtc_time.h +++ b/platform/mbed_rtc_time.h @@ -1,6 +1,10 @@ /** \addtogroup platform */ /** @{*/ +/** + * \defgroup platform_rtc_time rtc_time functions + * @{ + */ /* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * @@ -90,3 +94,4 @@ void attach_rtc(time_t (*read_rtc)(void), void (*write_rtc)(time_t), void (*init #endif /** @}*/ +/** @}*/ diff --git a/platform/mbed_semihost_api.h b/platform/mbed_semihost_api.h index 9127c5ff00..611cce69c0 100644 --- a/platform/mbed_semihost_api.h +++ b/platform/mbed_semihost_api.h @@ -1,6 +1,4 @@ -/** \addtogroup platform */ -/** @{*/ /* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * @@ -95,4 +93,4 @@ int semihost_disabledebug(void); #endif -/** @}*/ + diff --git a/platform/mbed_sleep.h b/platform/mbed_sleep.h index 4f635d452a..23fa5150f4 100644 --- a/platform/mbed_sleep.h +++ b/platform/mbed_sleep.h @@ -1,6 +1,11 @@ /** \addtogroup platform */ /** @{*/ +/** + * \defgroup platform_sleep Sleep functions + * @{ + */ + /* mbed Microcontroller Library * Copyright (c) 2006-2017 ARM Limited * @@ -169,3 +174,4 @@ __INLINE static void deepsleep(void) #endif /** @}*/ +/** @}*/ diff --git a/platform/mbed_stats.h b/platform/mbed_stats.h index 99662af414..c997baefab 100644 --- a/platform/mbed_stats.h +++ b/platform/mbed_stats.h @@ -1,6 +1,10 @@ /** \addtogroup platform */ /** @{*/ +/** + * \defgroup platform_stats stats functions + * @{ + */ /* mbed Microcontroller Library * Copyright (c) 2016-2016 ARM Limited * @@ -25,6 +29,9 @@ extern "C" { #endif +/** + * struct mbed_stats_heap_t definition + */ typedef struct { uint32_t current_size; /**< Bytes allocated currently. */ uint32_t max_size; /**< Max bytes allocated at a given time. */ @@ -41,6 +48,9 @@ typedef struct { */ void mbed_stats_heap_get(mbed_stats_heap_t *stats); +/** + * struct mbed_stats_stack_t definition + */ typedef struct { uint32_t thread_id; /**< Identifier for thread that owns the stack or 0 if multiple threads. */ uint32_t max_size; /**< Maximum number of bytes used on the stack. */ @@ -73,3 +83,5 @@ size_t mbed_stats_stack_get_each(mbed_stats_stack_t *stats, size_t count); #endif /** @}*/ + +/** @}*/ diff --git a/platform/mbed_toolchain.h b/platform/mbed_toolchain.h index f5d5e79e61..a911e9c997 100644 --- a/platform/mbed_toolchain.h +++ b/platform/mbed_toolchain.h @@ -1,6 +1,11 @@ /** \addtogroup platform */ /** @{*/ +/** + * \defgroup platform_toolchain Toolchain functions + * @{ + */ + /* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * @@ -382,3 +387,4 @@ typedef int FILEHANDLE; #endif /** @}*/ +/** @}*/ diff --git a/platform/mbed_wait_api.h b/platform/mbed_wait_api.h index 91619def4a..a58509f741 100644 --- a/platform/mbed_wait_api.h +++ b/platform/mbed_wait_api.h @@ -1,6 +1,11 @@ /** \addtogroup platform */ /** @{*/ +/** + * \defgroup platform_wait_api wait_api functions + * @{ + */ + /* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * @@ -70,3 +75,4 @@ void wait_us(int us); #endif /** @}*/ +/** @}*/ diff --git a/rtos/EventFlags.h b/rtos/EventFlags.h index 02df107773..5beb5e5ef1 100644 --- a/rtos/EventFlags.h +++ b/rtos/EventFlags.h @@ -32,7 +32,11 @@ namespace rtos { /** \addtogroup rtos */ /** @{*/ - +/** + * \defgroup rtos_EventFlags EventFlags class + * @{ + */ + /** The EventFlags class is used to signal or wait for an arbitrary event or events. @note EventFlags support 31 flags so the MSB flag is ignored, it is used to return an error code (@a osFlagsError) @@ -93,7 +97,9 @@ private: mbed_rtos_storage_event_flags_t _obj_mem; }; +/** @}*/ +/** @}*/ + } #endif -/** @}*/ diff --git a/rtos/Mail.h b/rtos/Mail.h index 602907e34e..83a3a24656 100644 --- a/rtos/Mail.h +++ b/rtos/Mail.h @@ -38,7 +38,11 @@ using namespace rtos; namespace rtos { /** \addtogroup rtos */ /** @{*/ - +/** + * \defgroup rtos_Mail Mail class + * @{ + */ + /** The Mail class allow to control, send, receive, or wait for mail. A mail is a memory block that is send to a thread or interrupt service routine. @tparam T data type of a single message element. @@ -103,9 +107,12 @@ private: MemoryPool _pool; }; +/** @}*/ +/** @}*/ + } #endif -/** @}*/ + diff --git a/rtos/MemoryPool.h b/rtos/MemoryPool.h index 0eab4de792..d76a99e794 100644 --- a/rtos/MemoryPool.h +++ b/rtos/MemoryPool.h @@ -33,7 +33,11 @@ namespace rtos { /** \addtogroup rtos */ /** @{*/ - +/** + * \defgroup rtos_MemoryPool MemoryPool class + * @{ + */ + /** Define and manage fixed-size memory pools of objects of a given type. @tparam T data type of a single object (element). @tparam queue_sz maximum number of objects (elements) in the memory pool. @@ -99,8 +103,10 @@ private: char _pool_mem[((sizeof(T) + 3) & ~3) * pool_sz]; mbed_rtos_storage_mem_pool_t _obj_mem; }; +/** @}*/ +/** @}*/ } #endif -/** @}*/ + diff --git a/rtos/Mutex.h b/rtos/Mutex.h index 5490012d46..e84631e64f 100644 --- a/rtos/Mutex.h +++ b/rtos/Mutex.h @@ -32,7 +32,11 @@ namespace rtos { /** \addtogroup rtos */ /** @{*/ - +/** + * \defgroup rtos_Mutex Mutex class + * @{ + */ + /** The Mutex class is used to synchronize the execution of threads. This is for example used to protect access to a shared resource. @@ -84,8 +88,9 @@ private: osMutexId_t _id; mbed_rtos_storage_mutex_t _obj_mem; }; - +/** @}*/ +/** @}*/ } #endif -/** @}*/ + diff --git a/rtos/Queue.h b/rtos/Queue.h index 8f32d7a4e2..556c9b8f0d 100644 --- a/rtos/Queue.h +++ b/rtos/Queue.h @@ -34,7 +34,11 @@ namespace rtos { /** \addtogroup rtos */ /** @{*/ - +/** + * \defgroup rtos_EventFlags EventFlags class + * @{ + */ + /** The Queue class allow to control, send, receive, or wait for messages. A message can be a integer or pointer value to a certain type T that is send to a thread or interrupt service routine. @@ -118,8 +122,9 @@ private: char _queue_mem[queue_sz * (sizeof(T*) + sizeof(mbed_rtos_storage_message_t))]; mbed_rtos_storage_msg_queue_t _obj_mem; }; +/** @}*/ +/** @}*/ } #endif -/** @}*/ diff --git a/rtos/RtosTimer.h b/rtos/RtosTimer.h index d75f49c8b2..c5e6276468 100644 --- a/rtos/RtosTimer.h +++ b/rtos/RtosTimer.h @@ -33,7 +33,11 @@ namespace rtos { /** \addtogroup rtos */ /** @{*/ - +/** + * \defgroup rtos_RtosTimer RtosTimer class + * @{ + */ + /** The RtosTimer class allow creating and and controlling of timer functions in the system. A timer function is called when a time period expires whereby both on-shot and periodic timers are possible. A timer can be started, restarted, or stopped. @@ -160,9 +164,11 @@ private: mbed_rtos_storage_timer_t _obj_mem; mbed::Callback _function; }; +/** @}*/ +/** @}*/ } #endif -/** @}*/ + diff --git a/rtos/Semaphore.h b/rtos/Semaphore.h index 07ce078277..88b479c5e4 100644 --- a/rtos/Semaphore.h +++ b/rtos/Semaphore.h @@ -31,6 +31,10 @@ namespace rtos { /** \addtogroup rtos */ /** @{*/ +/** + * \defgroup rtos_Semaphore Semaphore class + * @{ + */ /** The Semaphore class is used to manage and protect access to a set of shared resources. * @@ -73,8 +77,9 @@ private: osSemaphoreId_t _id; mbed_rtos_storage_semaphore_t _obj_mem; }; - +/** @}*/ +/** @}*/ } #endif -/** @}*/ + diff --git a/rtos/Thread.h b/rtos/Thread.h index cf92877d7e..d67ad3acf8 100644 --- a/rtos/Thread.h +++ b/rtos/Thread.h @@ -35,6 +35,10 @@ namespace rtos { /** \addtogroup rtos */ /** @{*/ +/** + * \defgroup rtos_Thread Thread class + * @{ + */ /** The Thread class allow defining, creating, and controlling thread functions in the system. * @@ -370,8 +374,9 @@ private: mbed_rtos_storage_thread_t _obj_mem; bool _finished; }; - +/** @}*/ +/** @}*/ } #endif -/** @}*/ + diff --git a/rtos/rtos_idle.h b/rtos/rtos_idle.h index 5fa9fb776c..c2894c23e3 100644 --- a/rtos/rtos_idle.h +++ b/rtos/rtos_idle.h @@ -31,7 +31,17 @@ extern "C" { #endif +/** + * \defgroup rtos_Idle Idle hook function + * @{ + */ +/** + @note + Sets the hook function called by idle task + @param fptr Hook function pointer. + */ void rtos_attach_idle_hook(void (*fptr)(void)); +/** @}*/ #ifdef __cplusplus } @@ -40,3 +50,4 @@ void rtos_attach_idle_hook(void (*fptr)(void)); #endif /** @}*/ + From 88a91a5a9be2db2eecd76d84f9a9b7b8b786dfa6 Mon Sep 17 00:00:00 2001 From: Senthil Ramakrishnan Date: Fri, 27 Oct 2017 15:38:18 -0500 Subject: [PATCH 21/80] Fix comments on mbed_assert.h --- platform/mbed_assert.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/mbed_assert.h b/platform/mbed_assert.h index d651f1e8c0..8aecdcc3fa 100644 --- a/platform/mbed_assert.h +++ b/platform/mbed_assert.h @@ -47,7 +47,7 @@ void mbed_assert_internal(const char *expr, const char *file, int line); * Declare runtime assertions: results in runtime error if condition is false * * @note - * Use of MBED_ASSERT is limited debug builds only. + * Use of MBED_ASSERT is limited to Debug and Develop builds. * * @code * From 6d967bbb54622769d04029428808a20ba8e7f863 Mon Sep 17 00:00:00 2001 From: Senthil Ramakrishnan Date: Tue, 31 Oct 2017 16:17:07 -0500 Subject: [PATCH 22/80] Fixed doxygen_options.json --- doxygen_options.json | 1 + 1 file changed, 1 insertion(+) diff --git a/doxygen_options.json b/doxygen_options.json index c4ebdc0308..834cac9270 100644 --- a/doxygen_options.json +++ b/doxygen_options.json @@ -1,4 +1,5 @@ { + "PROJECT_NAME": "Mbed OS Reference", "ENABLE_PREPROCESSING": "YES", "MACRO_EXPANSION": "YES", "EXPAND_ONLY_PREDEF": "NO", From 69df251916bb81138c84db2d2e540ef298c325cd Mon Sep 17 00:00:00 2001 From: Maciej Bocianski Date: Tue, 24 Oct 2017 13:10:02 +0200 Subject: [PATCH 23/80] event queue test: fix out of memory problem for NUCLEO_F070RB --- TESTS/events/queue/main.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/TESTS/events/queue/main.cpp b/TESTS/events/queue/main.cpp index f779ee0c24..738fdd0d8d 100644 --- a/TESTS/events/queue/main.cpp +++ b/TESTS/events/queue/main.cpp @@ -22,7 +22,10 @@ using namespace utest::v1; -#define TEST_EQUEUE_SIZE 1024 +// TEST_EQUEUE_SIZE was reduced below 1024B to fit this test to devices with small RAM (RAM <= 16kB) +// additionally TEST_EQUEUE_SIZE was expressed in EVENTS_EVENT_SIZE to increase readability +// (for more details about EVENTS_EVENT_SIZE see EventQueue constructor) +#define TEST_EQUEUE_SIZE (18*EVENTS_EVENT_SIZE) // flag for called volatile bool touched = false; From 9f9666ecede69a954cf83ad9367987e39b8a0c0a Mon Sep 17 00:00:00 2001 From: gorazd Date: Wed, 18 Oct 2017 22:14:12 +0200 Subject: [PATCH 24/80] add new target L-Tek FF-LPC546XX --- .../TARGET_FF_LPC546XX/PeripheralNames.h | 113 ++++++++ .../TARGET_FF_LPC546XX/PeripheralPins.c | 125 +++++++++ .../TARGET_FF_LPC546XX/PinNames.h | 250 ++++++++++++++++++ .../TARGET_FF_LPC546XX/clock_config.c | 248 +++++++++++++++++ .../TARGET_FF_LPC546XX/clock_config.h | 144 ++++++++++ .../TARGET_FF_LPC546XX/device.h | 39 +++ .../TARGET_FF_LPC546XX/mbed_overrides.c | 121 +++++++++ targets/targets.json | 6 + 8 files changed, 1046 insertions(+) create mode 100644 targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/PeripheralNames.h create mode 100644 targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/PeripheralPins.c create mode 100644 targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/PinNames.h create mode 100644 targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/clock_config.c create mode 100644 targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/clock_config.h create mode 100644 targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/device.h create mode 100644 targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/mbed_overrides.c diff --git a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/PeripheralNames.h b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/PeripheralNames.h new file mode 100644 index 0000000000..7efa1e5c20 --- /dev/null +++ b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/PeripheralNames.h @@ -0,0 +1,113 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef MBED_PERIPHERALNAMES_H +#define MBED_PERIPHERALNAMES_H + +#include "cmsis.h" +#include "PortNames.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + OSC32KCLK = 0, +} RTCName; + +typedef enum { + UART_0 = Flexcomm0, + UART_2 = Flexcomm2, + UART_7 = Flexcomm7 +} UARTName; + +#define STDIO_UART_TX USBTX +#define STDIO_UART_RX USBRX +#define STDIO_UART UART_0 + +typedef enum { + I2C_7 = Flexcomm7, + I2C_2 = Flexcomm2 +} I2CName; + +#define TPM_SHIFT 8 +typedef enum { + PWM_1 = (0 << TPM_SHIFT) | (0), // FTM0 CH0 + PWM_2 = (0 << TPM_SHIFT) | (1), // FTM0 CH1 + PWM_3 = (0 << TPM_SHIFT) | (2), // FTM0 CH2 + PWM_4 = (0 << TPM_SHIFT) | (3), // FTM0 CH3 + PWM_5 = (0 << TPM_SHIFT) | (4), // FTM0 CH4 + PWM_6 = (0 << TPM_SHIFT) | (5), // FTM0 CH5 + PWM_7 = (0 << TPM_SHIFT) | (6), // FTM0 CH6 + PWM_8 = (0 << TPM_SHIFT) | (7), // FTM0 CH7 + PWM_9 = (1 << TPM_SHIFT) | (0), // FTM1 CH0 + PWM_10 = (1 << TPM_SHIFT) | (1), // FTM1 CH1 + PWM_11 = (1 << TPM_SHIFT) | (2), // FTM1 CH2 + PWM_12 = (1 << TPM_SHIFT) | (3), // FTM1 CH3 + PWM_13 = (1 << TPM_SHIFT) | (4), // FTM1 CH4 + PWM_14 = (1 << TPM_SHIFT) | (5), // FTM1 CH5 + PWM_15 = (1 << TPM_SHIFT) | (6), // FTM1 CH6 + PWM_16 = (1 << TPM_SHIFT) | (7), // FTM1 CH7 + PWM_17 = (2 << TPM_SHIFT) | (0), // FTM2 CH0 + PWM_18 = (2 << TPM_SHIFT) | (1), // FTM2 CH1 + PWM_19 = (2 << TPM_SHIFT) | (2), // FTM2 CH2 + PWM_20 = (2 << TPM_SHIFT) | (3), // FTM2 CH3 + PWM_21 = (2 << TPM_SHIFT) | (4), // FTM2 CH4 + PWM_22 = (2 << TPM_SHIFT) | (5), // FTM2 CH5 + PWM_23 = (2 << TPM_SHIFT) | (6), // FTM2 CH6 + PWM_24 = (2 << TPM_SHIFT) | (7), // FTM2 CH7 + PWM_25 = (3 << TPM_SHIFT) | (0), // FTM3 CH0 + PWM_26 = (3 << TPM_SHIFT) | (1), // FTM3 CH1 + PWM_27 = (3 << TPM_SHIFT) | (2), // FTM3 CH2 + PWM_28 = (3 << TPM_SHIFT) | (3), // FTM3 CH3 + PWM_29 = (3 << TPM_SHIFT) | (4), // FTM3 CH4 + PWM_30 = (3 << TPM_SHIFT) | (5), // FTM3 CH5 + PWM_31 = (3 << TPM_SHIFT) | (6), // FTM3 CH6 + PWM_32 = (3 << TPM_SHIFT) | (7), // FTM3 CH7 +} PWMName; + +#define ADC_INSTANCE_SHIFT 8 +#define ADC_B_CHANNEL_SHIFT 5 + +typedef enum { + ADC0_SE0 = 0, + ADC0_SE1 = 1, + ADC0_SE2 = 2, + ADC0_SE3 = 3, + ADC0_SE4 = 4, + ADC0_SE5 = 5, + ADC0_SE6 = 6, + ADC0_SE7 = 7, + ADC0_SE8 = 8, + ADC0_SE9 = 9, + ADC0_SE10 = 10, + ADC0_SE11 = 11, +} ADCName; + +typedef enum { + CAN_1 = 1 +} CANName; + +typedef enum { + SPI_0 = Flexcomm0, + SPI_2 = Flexcomm2, + SPI_3 = Flexcomm3 +} SPIName; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/PeripheralPins.c b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/PeripheralPins.c new file mode 100644 index 0000000000..bb555ca3b7 --- /dev/null +++ b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/PeripheralPins.c @@ -0,0 +1,125 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "PeripheralPins.h" + +/************RTC***************/ +const PinMap PinMap_RTC[] = { + {NC, OSC32KCLK, 0}, +}; + +/************ADC***************/ +const PinMap PinMap_ADC[] = { + {P0_15, ADC0_SE3, 0}, + {P0_16, ADC0_SE4, 0}, + {P0_23, ADC0_SE11, 0}, + {P0_31, ADC0_SE5, 0}, + {P1_0, ADC0_SE6, 0}, + {P0_10, ADC0_SE0, 0}, + {NC , NC , 0} +}; + +/************CAN***************/ +const PinMap PinMap_CAN_TD[] = { + {P0_1, CAN_1, 1}, + {NC , NC , 0} +}; + +const PinMap PinMap_CAN_RD[] = { + {P0_0, CAN_1, 1}, + {NC , NC , 0} +}; + + +/************DAC***************/ +const PinMap PinMap_DAC[] = { + {NC , NC , 0} +}; + +/************I2C***************/ +const PinMap PinMap_I2C_SDA[] = { + {P0_26, I2C_2, 1}, + {P1_29, I2C_7, 1}, + {NC , NC , 0} +}; + +const PinMap PinMap_I2C_SCL[] = { + {P0_27, I2C_2, 1}, + {P1_30, I2C_7, 1}, + {NC , NC , 0} +}; + +/************UART***************/ +const PinMap PinMap_UART_TX[] = { + {P0_30, UART_0, 1}, + {P0_27, UART_2, 1}, + {P1_30, UART_7, 1}, + {NC , NC , 0} +}; + +const PinMap PinMap_UART_RX[] = { + {P0_29, UART_0, 1}, + {P0_26, UART_2, 1}, + {P1_29, UART_7, 1}, + {NC , NC , 0} +}; + +const PinMap PinMap_UART_CTS[] = { + {NC , NC , 0} +}; + +const PinMap PinMap_UART_RTS[] = { + {NC , NC , 0} +}; + +/************SPI***************/ +const PinMap PinMap_SPI_SCLK[] = { + {P1_4, SPI_0, 1}, + {P1_23, SPI_2, 1}, + {P0_6, SPI_3, 1}, + {NC , NC , 0} +}; + +const PinMap PinMap_SPI_MOSI[] = { + {P1_5, SPI_0, 1}, + {P1_24, SPI_2, 1}, + {P0_8, SPI_3, 1}, + {NC , NC , 0} +}; + +const PinMap PinMap_SPI_MISO[] = { + {P1_6, SPI_0, 1}, + {P1_25, SPI_2, 1}, + {P0_9, SPI_3, 1}, + {NC , NC , 0} +}; + +const PinMap PinMap_SPI_SSEL[] = { + {P1_7, SPI_0, 1}, + {P0_7, SPI_3, 1}, + {NC , NC , 0} +}; + +/************PWM***************/ +const PinMap PinMap_PWM[] = { + {P0_17 , PWM_1, 4}, + {P0_18 , PWM_2, 4}, + {P0_19 , PWM_3, 4}, + {P0_22 , PWM_4, 4}, + {P0_28 , PWM_8, 4}, + {P0_29 , PWM_9, 4}, + {NC , NC, 0} +}; diff --git a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/PinNames.h b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/PinNames.h new file mode 100644 index 0000000000..bc22e8e4bc --- /dev/null +++ b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/PinNames.h @@ -0,0 +1,250 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef MBED_PINNAMES_H +#define MBED_PINNAMES_H + +#include "cmsis.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + PIN_INPUT, + PIN_OUTPUT +} PinDirection; + +#define PORT_SHIFT 5 + +typedef enum { + P0_0 = (0 << PORT_SHIFT | 0), + P0_1 = (0 << PORT_SHIFT | 1), + P0_2 = (0 << PORT_SHIFT | 2), + P0_3 = (0 << PORT_SHIFT | 3), + P0_4 = (0 << PORT_SHIFT | 4), + P0_5 = (0 << PORT_SHIFT | 5), + P0_6 = (0 << PORT_SHIFT | 6), + P0_7 = (0 << PORT_SHIFT | 7), + P0_8 = (0 << PORT_SHIFT | 8), + P0_9 = (0 << PORT_SHIFT | 9), + P0_10 = (0 << PORT_SHIFT | 10), + P0_11 = (0 << PORT_SHIFT | 11), + P0_12 = (0 << PORT_SHIFT | 12), + P0_13 = (0 << PORT_SHIFT | 13), + P0_14 = (0 << PORT_SHIFT | 14), + P0_15 = (0 << PORT_SHIFT | 15), + P0_16 = (0 << PORT_SHIFT | 16), + P0_17 = (0 << PORT_SHIFT | 17), + P0_18 = (0 << PORT_SHIFT | 18), + P0_19 = (0 << PORT_SHIFT | 19), + P0_20 = (0 << PORT_SHIFT | 20), + P0_21 = (0 << PORT_SHIFT | 21), + P0_22 = (0 << PORT_SHIFT | 22), + P0_23 = (0 << PORT_SHIFT | 23), + P0_24 = (0 << PORT_SHIFT | 24), + P0_25 = (0 << PORT_SHIFT | 25), + P0_26 = (0 << PORT_SHIFT | 26), + P0_27 = (0 << PORT_SHIFT | 27), + P0_28 = (0 << PORT_SHIFT | 28), + P0_29 = (0 << PORT_SHIFT | 29), + P0_30 = (0 << PORT_SHIFT | 30), + P0_31 = (0 << PORT_SHIFT | 31), + + P1_0 = (1 << PORT_SHIFT | 0), + P1_1 = (1 << PORT_SHIFT | 1), + P1_2 = (1 << PORT_SHIFT | 2), + P1_3 = (1 << PORT_SHIFT | 3), + P1_4 = (1 << PORT_SHIFT | 4), + P1_5 = (1 << PORT_SHIFT | 5), + P1_6 = (1 << PORT_SHIFT | 6), + P1_7 = (1 << PORT_SHIFT | 7), + P1_8 = (1 << PORT_SHIFT | 8), + P1_9 = (1 << PORT_SHIFT | 9), + P1_10 = (1 << PORT_SHIFT | 10), + P1_11 = (1 << PORT_SHIFT | 11), + P1_12 = (1 << PORT_SHIFT | 12), + P1_13 = (1 << PORT_SHIFT | 13), + P1_14 = (1 << PORT_SHIFT | 14), + P1_15 = (1 << PORT_SHIFT | 15), + P1_16 = (1 << PORT_SHIFT | 16), + P1_17 = (1 << PORT_SHIFT | 17), + P1_18 = (1 << PORT_SHIFT | 18), + P1_19 = (1 << PORT_SHIFT | 19), + P1_20 = (1 << PORT_SHIFT | 20), + P1_21 = (1 << PORT_SHIFT | 21), + P1_22 = (1 << PORT_SHIFT | 22), + P1_23 = (1 << PORT_SHIFT | 23), + P1_24 = (1 << PORT_SHIFT | 24), + P1_25 = (1 << PORT_SHIFT | 25), + P1_26 = (1 << PORT_SHIFT | 26), + P1_27 = (1 << PORT_SHIFT | 27), + P1_28 = (1 << PORT_SHIFT | 28), + P1_29 = (1 << PORT_SHIFT | 29), + P1_30 = (1 << PORT_SHIFT | 30), + P1_31 = (1 << PORT_SHIFT | 31), + + P2_0 = (2 << PORT_SHIFT | 0), + P2_1 = (2 << PORT_SHIFT | 1), + P2_2 = (2 << PORT_SHIFT | 2), + P2_3 = (2 << PORT_SHIFT | 3), + P2_4 = (2 << PORT_SHIFT | 4), + P2_5 = (2 << PORT_SHIFT | 5), + P2_6 = (2 << PORT_SHIFT | 6), + P2_7 = (2 << PORT_SHIFT | 7), + P2_8 = (2 << PORT_SHIFT | 8), + P2_9 = (2 << PORT_SHIFT | 9), + P2_10 = (2 << PORT_SHIFT | 10), + P2_11 = (2 << PORT_SHIFT | 11), + P2_12 = (2 << PORT_SHIFT | 12), + P2_13 = (2 << PORT_SHIFT | 13), + P2_14 = (2 << PORT_SHIFT | 14), + P2_15 = (2 << PORT_SHIFT | 15), + P2_16 = (2 << PORT_SHIFT | 16), + P2_17 = (2 << PORT_SHIFT | 17), + P2_18 = (2 << PORT_SHIFT | 18), + P2_19 = (2 << PORT_SHIFT | 19), + P2_20 = (2 << PORT_SHIFT | 20), + P2_21 = (2 << PORT_SHIFT | 21), + P2_22 = (2 << PORT_SHIFT | 22), + P2_23 = (2 << PORT_SHIFT | 23), + P2_24 = (2 << PORT_SHIFT | 24), + P2_25 = (2 << PORT_SHIFT | 25), + P2_26 = (2 << PORT_SHIFT | 26), + P2_27 = (2 << PORT_SHIFT | 27), + P2_28 = (2 << PORT_SHIFT | 28), + P2_29 = (2 << PORT_SHIFT | 29), + P2_30 = (2 << PORT_SHIFT | 30), + P2_31 = (2 << PORT_SHIFT | 31), + + P3_0 = (3 << PORT_SHIFT | 0), + P3_1 = (3 << PORT_SHIFT | 1), + P3_2 = (3 << PORT_SHIFT | 2), + P3_3 = (3 << PORT_SHIFT | 3), + P3_4 = (3 << PORT_SHIFT | 4), + P3_5 = (3 << PORT_SHIFT | 5), + P3_6 = (3 << PORT_SHIFT | 6), + P3_7 = (3 << PORT_SHIFT | 7), + P3_8 = (3 << PORT_SHIFT | 8), + P3_9 = (3 << PORT_SHIFT | 9), + P3_10 = (3 << PORT_SHIFT | 10), + P3_11 = (3 << PORT_SHIFT | 11), + P3_12 = (3 << PORT_SHIFT | 12), + P3_13 = (3 << PORT_SHIFT | 13), + P3_14 = (3 << PORT_SHIFT | 14), + P3_15 = (3 << PORT_SHIFT | 15), + P3_16 = (3 << PORT_SHIFT | 16), + P3_17 = (3 << PORT_SHIFT | 17), + P3_18 = (3 << PORT_SHIFT | 18), + P3_19 = (3 << PORT_SHIFT | 19), + P3_20 = (3 << PORT_SHIFT | 20), + P3_21 = (3 << PORT_SHIFT | 21), + P3_22 = (3 << PORT_SHIFT | 22), + P3_23 = (3 << PORT_SHIFT | 23), + P3_24 = (3 << PORT_SHIFT | 24), + P3_25 = (3 << PORT_SHIFT | 25), + P3_26 = (3 << PORT_SHIFT | 26), + P3_27 = (3 << PORT_SHIFT | 27), + P3_28 = (3 << PORT_SHIFT | 28), + P3_29 = (3 << PORT_SHIFT | 29), + P3_30 = (3 << PORT_SHIFT | 30), + P3_31 = (3 << PORT_SHIFT | 31), + + P4_0 = (4 << PORT_SHIFT | 0), + P4_1 = (4 << PORT_SHIFT | 1), + P4_2 = (4 << PORT_SHIFT | 2), + P4_3 = (4 << PORT_SHIFT | 3), + P4_4 = (4 << PORT_SHIFT | 4), + P4_5 = (4 << PORT_SHIFT | 5), + P4_6 = (4 << PORT_SHIFT | 6), + P4_7 = (4 << PORT_SHIFT | 7), + P4_8 = (4 << PORT_SHIFT | 8), + P4_9 = (4 << PORT_SHIFT | 9), + P4_10 = (4 << PORT_SHIFT | 10), + P4_11 = (4 << PORT_SHIFT | 11), + P4_12 = (4 << PORT_SHIFT | 12), + P4_13 = (4 << PORT_SHIFT | 13), + P4_14 = (4 << PORT_SHIFT | 14), + P4_15 = (4 << PORT_SHIFT | 15), + P4_16 = (4 << PORT_SHIFT | 16), + + + + // mbed original LED naming + LED1 = P0_13, + LED2 = P1_27, + LED3 = P0_14, + LED4 = P1_28, + + + // USB Pins + USBTX = P0_30, + USBRX = P0_29, + + + A0 = P0_16, + A1 = P0_31, + A2 = P1_0, + A3 = P2_0, + A4 = P3_4, + A5 = P1_1, + + + p5 = P1_24, + p6 = P1_25, + p7 = P1_23, + p8 = P1_8, + p9 = P0_26, + p10 = P0_27, + p11 = P1_4, + p12 = P1_5, + p13 = P1_6, + p14 = P1_7, + p15 = P0_15, + p16 = P0_16, + p17 = P0_23, + p18 = P0_31, + p19 = P1_0, + p20 = P0_10, + p21 = P0_17, + p22 = P0_18, + p23 = P0_19, + p24 = P0_22, + p25 = P0_28, + p26 = P0_29, + p27 = P1_30, + p28 = P1_29, + p29 = P0_0, + p30 = P0_1, + + + + // Not connected + NC = (int)0xFFFFFFFF +} PinName; + + +typedef enum { + PullNone = 0, + PullDown = 1, + PullUp = 2, + PullDefault = PullUp +} PinMode; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/clock_config.c b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/clock_config.c new file mode 100644 index 0000000000..cea986a6c0 --- /dev/null +++ b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/clock_config.c @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2017 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * How to set up clock using clock driver functions: + * + * 1. Setup clock sources. + * + * 2. Setup voltage for the fastest of the clock outputs + * + * 3. Set up wait states of the flash. + * + * 4. Set up all dividers. + * + * 5. Set up all selectors to provide selected clocks. + */ + +/* TEXT BELOW IS USED AS SETTING FOR THE CLOCKS TOOL ***************************** +!!ClocksProfile +product: Clocks v1.0 +processor: LPC54618J512 +package_id: LPC54618J512ET180 +mcu_data: ksdk2_0 +processor_version: 0.0.0 +board: LPCXpresso54618 + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR THE CLOCKS TOOL **/ + +#include "fsl_power.h" +#include "fsl_clock.h" +#include "clock_config.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Variables + ******************************************************************************/ +/* System clock frequency. */ +extern uint32_t SystemCoreClock; + +/******************************************************************************* + ********************* Configuration BOARD_BootClockFRO12M *********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR THE CLOCKS TOOL ***************************** +!!Configuration +name: BOARD_BootClockFRO12M +outputs: +- {id: System_clock.outFreq, value: 12 MHz} +settings: +- {id: SYSCON.EMCCLKDIV.scale, value: '1', locked: true} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR THE CLOCKS TOOL **/ + +/******************************************************************************* + * Variables for BOARD_BootClockFRO12M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFRO12M configuration + ******************************************************************************/ +void BOARD_BootClockFRO12M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_EN); /*!< Ensure FRO is on */ + CLOCK_AttachClk( + kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12MHz first to ensure we can change voltage without accidentally + being below the voltage for current speed */ + CLOCK_SetupFROClocking(12000000U); /*!< Set up FRO to the 12 MHz, just for sure */ + POWER_SetVoltageForFreq( + 12000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */ + CLOCK_SetFLASHAccessCyclesForFreq(12000000U); /*!< Set FLASH wait states for core */ + + /*!< Set up dividers */ + CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false); /*!< Reset divider counter and set divider to value 1 */ + + /*!< Set up clock selectors - Attach clocks to the peripheries */ + CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch MAIN_CLK to FRO12M */ + /*!< Set SystemCoreClock variable. */ + SystemCoreClock = BOARD_BOOTCLOCKFRO12M_CORE_CLOCK; +} + +/******************************************************************************* + ********************** Configuration BOARD_BootClockFROHF48M *********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR THE CLOCKS TOOL ***************************** +!!Configuration +name: BOARD_BootClockFROHF48M +outputs: +- {id: System_clock.outFreq, value: 48 MHz} +settings: +- {id: SYSCON.MAINCLKSELA.sel, value: SYSCON.fro_hf} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR THE CLOCKS TOOL **/ + +/******************************************************************************* + * Variables for BOARD_BootClockFROHF48M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFROHF48M configuration + ******************************************************************************/ +void BOARD_BootClockFROHF48M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_EN); /*!< Ensure FRO is on */ + CLOCK_AttachClk( + kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12MHz first to ensure we can change voltage without accidentally + being below the voltage for current speed */ + POWER_SetVoltageForFreq( + 48000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */ + CLOCK_SetFLASHAccessCyclesForFreq(48000000U); /*!< Set FLASH wait states for core */ + + CLOCK_SetupFROClocking(48000000U); /*!< Set up high frequency FRO output to selected frequency */ + + /*!< Set up dividers */ + CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false); /*!< Reset divider counter and set divider to value 1 */ + + /*!< Set up clock selectors - Attach clocks to the peripheries */ + CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /*!< Switch MAIN_CLK to FRO_HF */ + /*!< Set SystemCoreClock variable. */ + SystemCoreClock = BOARD_BOOTCLOCKFROHF48M_CORE_CLOCK; +} + +/******************************************************************************* + ********************* Configuration BOARD_BootClockFROHF96M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR THE CLOCKS TOOL ***************************** +!!Configuration +name: BOARD_BootClockFROHF96M +outputs: +- {id: System_clock.outFreq, value: 96 MHz} +settings: +- {id: SYSCON.MAINCLKSELA.sel, value: SYSCON.fro_hf} +sources: +- {id: SYSCON.fro_hf.outFreq, value: 96 MHz} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR THE CLOCKS TOOL **/ + +/******************************************************************************* + * Variables for BOARD_BootClockFROHF96M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockFROHF96M configuration + ******************************************************************************/ +void BOARD_BootClockFROHF96M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_EN); /*!< Ensure FRO is on */ + CLOCK_AttachClk( + kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12MHz first to ensure we can change voltage without accidentally + being below the voltage for current speed */ + POWER_SetVoltageForFreq( + 96000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */ + CLOCK_SetFLASHAccessCyclesForFreq(96000000U); /*!< Set FLASH wait states for core */ + + CLOCK_SetupFROClocking(96000000U); /*!< Set up high frequency FRO output to selected frequency */ + + /*!< Set up dividers */ + CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false); /*!< Reset divider counter and set divider to value 1 */ + + /*!< Set up clock selectors - Attach clocks to the peripheries */ + CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /*!< Switch MAIN_CLK to FRO_HF */ + /*!< Set SystemCoreClock variable. */ + SystemCoreClock = BOARD_BOOTCLOCKFROHF96M_CORE_CLOCK; +} + +/******************************************************************************* + ********************* Configuration BOARD_BootClockPLL180M ********************** + ******************************************************************************/ +/* TEXT BELOW IS USED AS SETTING FOR THE CLOCKS TOOL ***************************** +!!Configuration +name: BOARD_BootClockPLL180M +outputs: +- {id: FRO12M_clock.outFreq, value: 12 MHz} +- {id: FROHF_clock.outFreq, value: 48 MHz} +- {id: SYSPLL_clock.outFreq, value: 180 MHz} +- {id: System_clock.outFreq, value: 180 MHz} +settings: +- {id: SYSCON.M_MULT.scale, value: '30', locked: true} +- {id: SYSCON.N_DIV.scale, value: '1', locked: true} +- {id: SYSCON.PDEC.scale, value: '2', locked: true} +- {id: SYSCON_PDRUNCFG0_PDEN_SYS_PLL_CFG, value: Power_up} +sources: +- {id: SYSCON._clk_in.outFreq, value: 12 MHz, enabled: true} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR THE CLOCKS TOOL **/ + +/******************************************************************************* + * Variables for BOARD_BootClockPLL180M configuration + ******************************************************************************/ +/******************************************************************************* + * Code for BOARD_BootClockPLL180M configuration + ******************************************************************************/ +void BOARD_BootClockPLL180M(void) +{ + /*!< Set up the clock sources */ + /*!< Set up FRO */ + POWER_DisablePD(kPDRUNCFG_PD_FRO_EN); /*!< Ensure FRO is on */ + CLOCK_AttachClk( + kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12MHz first to ensure we can change voltage without accidentally + being below the voltage for current speed */ + POWER_SetVoltageForFreq( + 12000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */ + CLOCK_SetFLASHAccessCyclesForFreq(12000000U); /*!< Set FLASH wait states for core */ + + /*!< Set up SYS PLL */ + const pll_setup_t pllSetup = { + .pllctrl = SYSCON_SYSPLLCTRL_SELI(32U) | SYSCON_SYSPLLCTRL_SELP(16U) | SYSCON_SYSPLLCTRL_SELR(0U), + .pllmdec = (SYSCON_SYSPLLMDEC_MDEC(8191U)), + .pllndec = (SYSCON_SYSPLLNDEC_NDEC(770U)), + .pllpdec = (SYSCON_SYSPLLPDEC_PDEC(98U)), + .pllRate = 180000000U, + .flags = PLL_SETUPFLAG_WAITLOCK | PLL_SETUPFLAG_POWERUP}; + CLOCK_AttachClk(kEXT_CLK_to_SYS_PLL); /*!< Set sys pll clock source from external crystal */ + CLOCK_SetPLLFreq(&pllSetup); /*!< Configure PLL to the desired value */ + POWER_SetVoltageForFreq( + 180000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */ + CLOCK_SetFLASHAccessCyclesForFreq(180000000U); /*!< Set FLASH wait states for core */ + CLOCK_AttachClk(kSYS_PLL_to_MAIN_CLK); /*!< Switch System clock to SYS PLL 180MHz */ + + /* Set SystemCoreClock variable. */ + SystemCoreClock = BOARD_BootClockPLL180M_CORE_CLOCK; +} diff --git a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/clock_config.h b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/clock_config.h new file mode 100644 index 0000000000..f9cdab4d95 --- /dev/null +++ b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/clock_config.h @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2017 NXP + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _CLOCK_CONFIG_H_ +#define _CLOCK_CONFIG_H_ + +#include "fsl_common.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +#define BOARD_XTAL0_CLK_HZ 12000000U /*!< Board xtal0 frequency in Hz */ +#define BOARD_XTAL32K_CLK_HZ 32768U /*!< Board xtal32K frequency in Hz */ +#define BOARD_BootClockRUN BOARD_BootClockFROHF48M + + +/******************************************************************************* + ********************* Configuration BOARD_BootClockFRO12M *********************** + ******************************************************************************/ +/******************************************************************************* + * Definitions for BOARD_BootClockFRO12M configuration + ******************************************************************************/ +#define BOARD_BOOTCLOCKFRO12M_CORE_CLOCK 12000000U /*!< Core clock frequency:12000000Hz */ + +/******************************************************************************* + * API for BOARD_BootClockFRO12M configuration + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @brief This function executes configuration of clocks. + * + */ +void BOARD_BootClockFRO12M(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ + +/******************************************************************************* + ********************** Configuration BOARD_BootClockFROHF48M *********************** + ******************************************************************************/ +/******************************************************************************* + * Definitions for BOARD_BootClockFROHF48M configuration + ******************************************************************************/ +#define BOARD_BOOTCLOCKFROHF48M_CORE_CLOCK 48000000U /*!< Core clock frequency:48000000Hz */ + +/******************************************************************************* + * API for BOARD_BootClockFROHF48M configuration + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @brief This function executes configuration of clocks. + * + */ +void BOARD_BootClockFROHF48M(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ + +/******************************************************************************* + ********************* Configuration BOARD_BootClockFROHF96M ********************** + ******************************************************************************/ +/******************************************************************************* + * Definitions for BOARD_BootClockFROHF96M configuration + ******************************************************************************/ +#define BOARD_BOOTCLOCKFROHF96M_CORE_CLOCK 96000000U /*!< Core clock frequency:96000000Hz */ + +/******************************************************************************* + * API for BOARD_BootClockFROHF96M configuration + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @brief This function executes configuration of clocks. + * + */ +void BOARD_BootClockFROHF96M(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ + +/******************************************************************************* + ********************* Configuration BOARD_BootClockPLL180M ********************** + ******************************************************************************/ +/******************************************************************************* + * Definitions for BOARD_BootClockPLL180M configuration + ******************************************************************************/ +#define BOARD_BootClockPLL180M_CORE_CLOCK 180000000U /*!< Core clock frequency:180000000Hz */ + +/******************************************************************************* + * API for BOARD_BootClockPLL180M configuration + ******************************************************************************/ +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus*/ + +/*! + * @brief This function executes configuration of clocks. + * + */ +void BOARD_BootClockPLL180M(void); + +#if defined(__cplusplus) +} +#endif /* __cplusplus*/ +#endif /* _CLOCK_CONFIG_H_ */ + diff --git a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/device.h b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/device.h new file mode 100644 index 0000000000..de347c375d --- /dev/null +++ b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/device.h @@ -0,0 +1,39 @@ +// The 'features' section in 'target.json' is now used to create the device's hardware preprocessor switches. +// Check the 'features' section of the target description in 'targets.json' for more details. +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef MBED_DEVICE_H +#define MBED_DEVICE_H + +#define NUMBER_OF_GPIO_INTS 8 + +#define APP_EXCLUDE_FROM_DEEPSLEEP \ + (SYSCON_PDRUNCFG_PDEN_WDT_OSC_MASK | SYSCON_PDRUNCFG_PDEN_SRAMX_MASK | \ + SYSCON_PDRUNCFG_PDEN_SRAM0_MASK | SYSCON_PDRUNCFG_PDEN_SRAM1_2_3_MASK) + +/* Defines used by the sleep code */ +#define LPC_CLOCK_INTERNAL_IRC BOARD_BootClockFRO12M +#define LPC_CLOCK_RUN BOARD_BootClockFROHF48M + +#define DEVICE_ID_LENGTH 24 + + + + + +#include "objects.h" + +#endif diff --git a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/mbed_overrides.c b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/mbed_overrides.c new file mode 100644 index 0000000000..b727924a6a --- /dev/null +++ b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC546XX/TARGET_FF_LPC546XX/mbed_overrides.c @@ -0,0 +1,121 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "gpio_api.h" +#include "clock_config.h" +#include "fsl_emc.h" +#include "fsl_power.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/* The SDRAM timing. */ +#define SDRAM_REFRESHPERIOD_NS (64 * 1000000 / 4096) /* 4096 rows/ 64ms */ +#define SDRAM_TRP_NS (18u) +#define SDRAM_TRAS_NS (42u) +#define SDRAM_TSREX_NS (67u) +#define SDRAM_TAPR_NS (18u) +#define SDRAM_TWRDELT_NS (6u) +#define SDRAM_TRC_NS (60u) +#define SDRAM_RFC_NS (60u) +#define SDRAM_XSR_NS (67u) +#define SDRAM_RRD_NS (12u) +#define SDRAM_MRD_NCLK (2u) +#define SDRAM_RAS_NCLK (2u) +#define SDRAM_MODEREG_VALUE (0x23u) +#define SDRAM_DEV_MEMORYMAP (0x09u) /* 128Mbits (8M*16, 4banks, 12 rows, 9 columns)*/ + +// called before main +void mbed_sdk_init() +{ + BOARD_BootClockFROHF48M(); +} + +// Change the NMI pin to an input. This allows NMI pin to +// be used as a low power mode wakeup. The application will +// need to change the pin back to NMI_b or wakeup only occurs once! +void NMI_Handler(void) +{ + //gpio_t gpio; + //gpio_init_in(&gpio, PTA4); +} + +// Enable the RTC oscillator if available on the board +void rtc_setup_oscillator(void) +{ + /* Enable the RTC 32K Oscillator */ + SYSCON->RTCOSCCTRL |= SYSCON_RTCOSCCTRL_EN_MASK; +} + +void ADC_ClockPower_Configuration(void) +{ + /* SYSCON power. */ + POWER_DisablePD(kPDRUNCFG_PD_VDDA); /* Power on VDDA. */ + POWER_DisablePD(kPDRUNCFG_PD_ADC0); /* Power on the ADC converter. */ + POWER_DisablePD(kPDRUNCFG_PD_VD2_ANA); /* Power on the analog power supply. */ + POWER_DisablePD(kPDRUNCFG_PD_VREFP); /* Power on the reference voltage source. */ + POWER_DisablePD(kPDRUNCFG_PD_TS); /* Power on the temperature sensor. */ + + /* Enable the clock. */ + CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); + + /* CLOCK_AttachClk(kMAIN_CLK_to_ADC_CLK); */ + /* Sync clock source is not used. Using sync clock source and would be divided by 2. + * The divider would be set when configuring the converter. + */ + CLOCK_EnableClock(kCLOCK_Adc0); /* SYSCON->AHBCLKCTRL[0] |= SYSCON_AHBCLKCTRL_ADC0_MASK; */ +} + +/* Initialize the external memory. */ +void BOARD_InitSDRAM(void) +{ + emc_basic_config_t basicConfig; + emc_dynamic_timing_config_t dynTiming; + emc_dynamic_chip_config_t dynChipConfig; + + /* Basic configuration. */ + basicConfig.endian = kEMC_LittleEndian; + basicConfig.fbClkSrc = kEMC_IntloopbackEmcclk; + /* EMC Clock = CPU FREQ/2 here can fit CPU freq from 12M ~ 180M. + * If you change the divide to 0 and EMC clock is larger than 100M + * please take refer to emc.dox to adjust EMC clock delay. + */ + basicConfig.emcClkDiv = 1; + /* Dynamic memory timing configuration. */ + dynTiming.readConfig = kEMC_Cmddelay; + dynTiming.refreshPeriod_Nanosec = SDRAM_REFRESHPERIOD_NS; + dynTiming.tRp_Ns = SDRAM_TRP_NS; + dynTiming.tRas_Ns = SDRAM_TRAS_NS; + dynTiming.tSrex_Ns = SDRAM_TSREX_NS; + dynTiming.tApr_Ns = SDRAM_TAPR_NS; + dynTiming.tWr_Ns = (1000000000 / CLOCK_GetFreq(kCLOCK_EMC) + SDRAM_TWRDELT_NS); /* one clk + 6ns */ + dynTiming.tDal_Ns = dynTiming.tWr_Ns + dynTiming.tRp_Ns; + dynTiming.tRc_Ns = SDRAM_TRC_NS; + dynTiming.tRfc_Ns = SDRAM_RFC_NS; + dynTiming.tXsr_Ns = SDRAM_XSR_NS; + dynTiming.tRrd_Ns = SDRAM_RRD_NS; + dynTiming.tMrd_Nclk = SDRAM_MRD_NCLK; + /* Dynamic memory chip specific configuration: Chip 0 - MTL48LC8M16A2B4-6A */ + dynChipConfig.chipIndex = 0; + dynChipConfig.dynamicDevice = kEMC_Sdram; + dynChipConfig.rAS_Nclk = SDRAM_RAS_NCLK; + dynChipConfig.sdramModeReg = SDRAM_MODEREG_VALUE; + dynChipConfig.sdramExtModeReg = 0; /* it has no use for normal sdram */ + dynChipConfig.devAddrMap = SDRAM_DEV_MEMORYMAP; + /* EMC Basic configuration. */ + EMC_Init(EMC, &basicConfig); + /* EMC Dynamc memory configuration. */ + EMC_DynamicMemInit(EMC, &dynTiming, &dynChipConfig, 1); +} diff --git a/targets/targets.json b/targets/targets.json index b66213ecac..68b18fadeb 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -711,6 +711,12 @@ "release_versions": ["2", "5"], "device_name" : "LPC54618J512ET180" }, + "FF_LPC546XX": { + "inherits": ["LPC546XX"], + "extra_labels_remove" : ["LPCXpresso"], + "supported_form_factors": [""], + "detect_code": ["8081"] + }, "NUCLEO_F030R8": { "inherits": ["FAMILY_STM32"], "supported_form_factors": ["ARDUINO", "MORPHO"], From 761c57876bb42a3c008e228c6eba6c572f7fd2e1 Mon Sep 17 00:00:00 2001 From: Chris Snow Date: Sun, 15 Oct 2017 17:05:45 +0100 Subject: [PATCH 25/80] Fix ETHMEM_SECTION placement for ARM on LPC1768 --- .../lwip-interface/lwip-eth/arch/TARGET_NXP/lpc17_emac.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_NXP/lpc17_emac.c b/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_NXP/lpc17_emac.c index d39be116e1..5b3b326435 100644 --- a/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_NXP/lpc17_emac.c +++ b/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_NXP/lpc17_emac.c @@ -153,7 +153,7 @@ struct lpc_enetdata { # define ETHMEM_SECTION __attribute__((section("AHBSRAM1"),aligned)) # endif #elif defined(TARGET_LPC17XX) -# if defined(TOOLCHAIN_GCC_ARM) +# if defined(TOOLCHAIN_GCC_ARM) || defined(TOOLCHAIN_ARM) # define ETHMEM_SECTION __attribute__((section("AHBSRAM1"),aligned)) # endif #endif From 05a36aafe89d6d37dccb1c590ff0319e979cc6cb Mon Sep 17 00:00:00 2001 From: Kevin Gilbert Date: Fri, 13 Oct 2017 17:22:21 -0500 Subject: [PATCH 26/80] Remove build warnings in LWIP --- .../FEATURE_LWIP/lwip-interface/lwip/src/core/lwip_tcp.c | 1 - features/FEATURE_LWIP/lwip-interface/lwip_stack.c | 6 ++++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/features/FEATURE_LWIP/lwip-interface/lwip/src/core/lwip_tcp.c b/features/FEATURE_LWIP/lwip-interface/lwip/src/core/lwip_tcp.c index ec2e1f92ce..17b681e590 100644 --- a/features/FEATURE_LWIP/lwip-interface/lwip/src/core/lwip_tcp.c +++ b/features/FEATURE_LWIP/lwip-interface/lwip/src/core/lwip_tcp.c @@ -358,7 +358,6 @@ tcp_close_shutdown_fin(struct tcp_pcb *pcb) default: /* Has already been closed, do nothing. */ return ERR_OK; - break; } if (err == ERR_OK) { diff --git a/features/FEATURE_LWIP/lwip-interface/lwip_stack.c b/features/FEATURE_LWIP/lwip-interface/lwip_stack.c index 064612ba6f..513c3830e5 100644 --- a/features/FEATURE_LWIP/lwip-interface/lwip_stack.c +++ b/features/FEATURE_LWIP/lwip-interface/lwip_stack.c @@ -293,7 +293,9 @@ static int get_ip_addr_type(const ip_addr_t *ip_addr) return IPADDR_TYPE_V4; } #endif +#if LWIP_IPV6 && LWIP_IPV4 return IPADDR_TYPE_ANY; +#endif } void add_dns_addr(struct netif *lwip_netif) @@ -658,7 +660,7 @@ nsapi_error_t mbed_lwip_bringup_2(bool dhcp, bool ppp, const char *ip, const cha if (!netif_is_link_up(&lwip_netif)) { if (sys_arch_sem_wait(&lwip_netif_linked, 15000) == SYS_ARCH_TIMEOUT) { if (ppp) { - ppp_lwip_disconnect(); + (void) ppp_lwip_disconnect(); } return NSAPI_ERROR_NO_CONNECTION; } @@ -686,7 +688,7 @@ nsapi_error_t mbed_lwip_bringup_2(bool dhcp, bool ppp, const char *ip, const cha if (!mbed_lwip_get_ip_addr(true, &lwip_netif)) { if (sys_arch_sem_wait(&lwip_netif_has_any_addr, DHCP_TIMEOUT * 1000) == SYS_ARCH_TIMEOUT) { if (ppp) { - ppp_lwip_disconnect(); + (void) ppp_lwip_disconnect(); } return NSAPI_ERROR_DHCP_FAILURE; } From 8dceef0492e718588b72da67c2ca548e11ba64f0 Mon Sep 17 00:00:00 2001 From: Jammu Kekkonen Date: Fri, 3 Nov 2017 18:25:02 +0200 Subject: [PATCH 27/80] HEXIWEAR: define HEXIWEAR target to support bootloader. --- targets/targets.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/targets/targets.json b/targets/targets.json index 68b18fadeb..d4f6a93f2c 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -642,7 +642,8 @@ "device_has": ["ANALOGIN", "ANALOGOUT", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPI_ASYNCH", "SPISLAVE", "STDIO_MESSAGES", "TRNG", "FLASH"], "default_lib": "std", "release_versions": ["2", "5"], - "device_name": "MK64FN1M0xxx12" + "device_name": "MK64FN1M0xxx12", + "bootloader_supported": true }, "K66F": { "supported_form_factors": ["ARDUINO"], From 6de5b39f3f6576a4b88eb668c7a14a6778f10f8a Mon Sep 17 00:00:00 2001 From: Andrea Corrado Date: Thu, 12 Oct 2017 11:21:20 +0100 Subject: [PATCH 28/80] introduced mbed Connect Cloud board based on ODIN-W2 Module rety commit, added ublox changes Corrected error Corrected error in targets json Reworked JSON Added lwip-eth to Connect ODIN removes ARM CC error Fixed formating issues Correct formating error in .json Indentation errors --- .../stm32f4_eth_conf.c | 61 ++++++ .../stm32f4_eth_init.c | 143 +++++++++++++++ .../stm32f4_eth_conf.c | 6 +- .../stm32f4_eth_init.c | 14 +- .../PeripheralNames.h | 0 .../PeripheralPins.c | 0 .../TARGET_MBED_CONNECT_ODIN/PinNames.h | 173 ++++++++++++++++++ .../TARGET_UBLOX_EVK_ODIN_W2/PinNames.h | 13 ++ .../sdk/LICENSE | 0 .../LICENSE-permissive-binary-license-1.0.txt | 0 .../TOOLCHAIN_ARM/libublox-odin-w2-driver.ar | Bin .../libublox-odin-w2-driver.a | Bin .../TOOLCHAIN_IAR/libublox-odin-w2-driver.a | Bin .../ublox-odin-w2-drivers/OdinWiFiInterface.h | 0 .../sdk/ublox-odin-w2-drivers/bt_types.h | 0 .../sdk/ublox-odin-w2-drivers/cb_assert.h | 0 .../ublox-odin-w2-drivers/cb_bt_conn_man.h | 0 .../sdk/ublox-odin-w2-drivers/cb_bt_man.h | 0 .../sdk/ublox-odin-w2-drivers/cb_bt_pan.h | 0 .../sdk/ublox-odin-w2-drivers/cb_bt_sec_man.h | 0 .../sdk/ublox-odin-w2-drivers/cb_bt_serial.h | 0 .../ublox-odin-w2-drivers/cb_bt_serial_le.h | 0 .../ublox-odin-w2-drivers/cb_bt_test_man.h | 0 .../sdk/ublox-odin-w2-drivers/cb_bt_utils.h | 0 .../sdk/ublox-odin-w2-drivers/cb_cert_utils.h | 0 .../sdk/ublox-odin-w2-drivers/cb_comdefs.h | 0 .../sdk/ublox-odin-w2-drivers/cb_gatt.h | 0 .../ublox-odin-w2-drivers/cb_gatt_client.h | 0 .../ublox-odin-w2-drivers/cb_gatt_server.h | 0 .../sdk/ublox-odin-w2-drivers/cb_gatt_utils.h | 0 .../sdk/ublox-odin-w2-drivers/cb_hw.h | 0 .../sdk/ublox-odin-w2-drivers/cb_main.h | 0 .../sdk/ublox-odin-w2-drivers/cb_otp.h | 0 .../cb_platform_basic_types.h | 0 .../sdk/ublox-odin-w2-drivers/cb_port_types.h | 0 .../sdk/ublox-odin-w2-drivers/cb_status.h | 0 .../sdk/ublox-odin-w2-drivers/cb_types.h | 0 .../sdk/ublox-odin-w2-drivers/cb_watchdog.h | 0 .../sdk/ublox-odin-w2-drivers/cb_wlan.h | 0 .../cb_wlan_target_data.h | 0 .../sdk/ublox-odin-w2-drivers/cb_wlan_types.h | 0 .../sdk/wifi_emac/wifi_emac_api.cpp | 0 .../sdk/wifi_emac/wifi_emac_api.h | 0 .../system_clock.c | 0 targets/targets.json | 30 ++- 45 files changed, 425 insertions(+), 15 deletions(-) create mode 100644 features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/TARGET_STM32F4/TARGET_MBED_CONNECT_ODIN/stm32f4_eth_conf.c create mode 100644 features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/TARGET_STM32F4/TARGET_MBED_CONNECT_ODIN/stm32f4_eth_init.c rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/PeripheralNames.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/PeripheralPins.c (100%) create mode 100644 targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/TARGET_MBED_CONNECT_ODIN/PinNames.h rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{ => TARGET_MODULE_UBLOX_ODIN_W2}/TARGET_UBLOX_EVK_ODIN_W2/PinNames.h (95%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/LICENSE (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/LICENSE-permissive-binary-license-1.0.txt (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/TOOLCHAIN_ARM/libublox-odin-w2-driver.ar (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/TOOLCHAIN_GCC_ARM/libublox-odin-w2-driver.a (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/TOOLCHAIN_IAR/libublox-odin-w2-driver.a (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/OdinWiFiInterface.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/bt_types.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_assert.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_bt_conn_man.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_bt_man.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_bt_pan.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_bt_sec_man.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_bt_serial.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_bt_serial_le.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_bt_test_man.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_bt_utils.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_cert_utils.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_comdefs.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_gatt.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_gatt_client.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_gatt_server.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_gatt_utils.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_hw.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_main.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_otp.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_platform_basic_types.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_port_types.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_status.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_types.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_watchdog.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_wlan.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_wlan_target_data.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/ublox-odin-w2-drivers/cb_wlan_types.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/wifi_emac/wifi_emac_api.cpp (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/sdk/wifi_emac/wifi_emac_api.h (100%) rename targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/{TARGET_UBLOX_EVK_ODIN_W2 => TARGET_MODULE_UBLOX_ODIN_W2}/system_clock.c (100%) mode change 100644 => 100755 targets/targets.json diff --git a/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/TARGET_STM32F4/TARGET_MBED_CONNECT_ODIN/stm32f4_eth_conf.c b/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/TARGET_STM32F4/TARGET_MBED_CONNECT_ODIN/stm32f4_eth_conf.c new file mode 100644 index 0000000000..56f754a4f4 --- /dev/null +++ b/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/TARGET_STM32F4/TARGET_MBED_CONNECT_ODIN/stm32f4_eth_conf.c @@ -0,0 +1,61 @@ +/* mbed Microcontroller Library + * Copyright (c) 2017 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "stm32f4xx_hal.h" + +void _eth_config_mac(ETH_HandleTypeDef *heth) +{ + ETH_MACInitTypeDef macconf = + { + .Watchdog = ETH_WATCHDOG_ENABLE, + .Jabber = ETH_JABBER_ENABLE, + .InterFrameGap = ETH_INTERFRAMEGAP_96BIT, + .CarrierSense = ETH_CARRIERSENCE_ENABLE, + .ReceiveOwn = ETH_RECEIVEOWN_ENABLE, + .LoopbackMode = ETH_LOOPBACKMODE_DISABLE, + .ChecksumOffload = ETH_CHECKSUMOFFLAOD_ENABLE, + .RetryTransmission = ETH_RETRYTRANSMISSION_DISABLE, + .AutomaticPadCRCStrip = ETH_AUTOMATICPADCRCSTRIP_DISABLE, + .BackOffLimit = ETH_BACKOFFLIMIT_10, + .DeferralCheck = ETH_DEFFERRALCHECK_DISABLE, + .ReceiveAll = ETH_RECEIVEAll_DISABLE, + .SourceAddrFilter = ETH_SOURCEADDRFILTER_DISABLE, + .PassControlFrames = ETH_PASSCONTROLFRAMES_BLOCKALL, + .BroadcastFramesReception = ETH_BROADCASTFRAMESRECEPTION_ENABLE, + .DestinationAddrFilter = ETH_DESTINATIONADDRFILTER_NORMAL, + .PromiscuousMode = ETH_PROMISCUOUS_MODE_DISABLE, + .MulticastFramesFilter = ETH_MULTICASTFRAMESFILTER_NONE, // Disable multicast filter + .UnicastFramesFilter = ETH_UNICASTFRAMESFILTER_PERFECT, + .HashTableHigh = 0x0U, + .HashTableLow = 0x0U, + .PauseTime = 0x0U, + .ZeroQuantaPause = ETH_ZEROQUANTAPAUSE_DISABLE, + .PauseLowThreshold = ETH_PAUSELOWTHRESHOLD_MINUS4, + .UnicastPauseFrameDetect = ETH_UNICASTPAUSEFRAMEDETECT_DISABLE, + .ReceiveFlowControl = ETH_RECEIVEFLOWCONTROL_DISABLE, + .TransmitFlowControl = ETH_TRANSMITFLOWCONTROL_DISABLE, + .VLANTagComparison = ETH_VLANTAGCOMPARISON_16BIT, + .VLANTagIdentifier = 0x0U + }; + + if (heth->Init.ChecksumMode == ETH_CHECKSUM_BY_HARDWARE) { + macconf.ChecksumOffload = ETH_CHECKSUMOFFLAOD_ENABLE; + } else { + macconf.ChecksumOffload = ETH_CHECKSUMOFFLAOD_DISABLE; + } + + (void) HAL_ETH_ConfigMAC(heth, &macconf); +} diff --git a/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/TARGET_STM32F4/TARGET_MBED_CONNECT_ODIN/stm32f4_eth_init.c b/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/TARGET_STM32F4/TARGET_MBED_CONNECT_ODIN/stm32f4_eth_init.c new file mode 100644 index 0000000000..f9ee0771e7 --- /dev/null +++ b/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/TARGET_STM32F4/TARGET_MBED_CONNECT_ODIN/stm32f4_eth_init.c @@ -0,0 +1,143 @@ +#include +#include "stm32f4xx_hal.h" +#include "mbed_toolchain.h" + +#define C029_OTP_START_ADDRESS (0x1FFF7800U) +#define C029_OTP_END_ADDRESS (C029_OTP_START_ADDRESS + (16*32)) +#define C029_MAC_ETHERNET_ID (3) + +typedef MBED_PACKED(struct) C029_OTP_Header { + uint8_t id; + uint8_t len; + uint8_t data[]; +} C029_OTP_Header; + +static int _macRetrieved = 0; +static char _macAddr[6] = { 0x02, 0x02, 0xF7, 0xF0, 0x00, 0x00 }; + +static C029_OTP_Header *increment(C029_OTP_Header *pTemp) +{ + uint8_t len = 0; + uint8_t id = 0; + uint8_t *p = (uint8_t*)pTemp; + + memcpy((void*)&id, (void*)pTemp, 1); + + if (id == 0xFF){ + p++; + } else { + p++; + memcpy((void*)&len, (void*)p++, 1); + p += len; + } + return (C029_OTP_Header*)p; +} + +/** + * Override HAL Eth Init function + */ +void HAL_ETH_MspInit(ETH_HandleTypeDef* heth) +{ + GPIO_InitTypeDef GPIO_InitStructure; + if (heth->Instance == ETH) { + + /* Enable GPIOs clocks */ + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + + /** ETH GPIO Configuration + RMII_REF_CLK ----------------------> PA1 + RMII_MDIO -------------------------> PA2 + RMII_MDC --------------------------> PC1 + RMII_MII_CRS_DV -------------------> PA7 + RMII_MII_RXD0 ---------------------> PC4 + RMII_MII_RXD1 ---------------------> PC5 + RMII_MII_RXER ---------------------> PG2 + RMII_MII_TX_EN --------------------> PB11 + RMII_MII_TXD0 ---------------------> PB12 + RMII_MII_TXD1 ---------------------> PB13 + */ + /* Configure PA1, PA2 and PA7 */ + GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; + GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.Pull = GPIO_PULLUP; + GPIO_InitStructure.Pin = GPIO_PIN_2 | GPIO_PIN_7; + GPIO_InitStructure.Alternate = GPIO_AF11_ETH; + HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); + + GPIO_InitStructure.Pull = GPIO_NOPULL; + GPIO_InitStructure.Pin = GPIO_PIN_1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); + + /* Configure PB13 */ + GPIO_InitStructure.Pin = GPIO_PIN_13 | GPIO_PIN_11 | GPIO_PIN_12; + HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); + + /* Configure PC1, PC4 and PC5 */ + GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5; + HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); + + /* Enable the Ethernet global Interrupt */ + HAL_NVIC_SetPriority(ETH_IRQn, 0x7, 0); + HAL_NVIC_EnableIRQ(ETH_IRQn); + + /* Enable ETHERNET clock */ + __HAL_RCC_ETH_CLK_ENABLE(); + } +} + +/** + * Override HAL Eth DeInit function + */ +void HAL_ETH_MspDeInit(ETH_HandleTypeDef* heth) +{ + if (heth->Instance == ETH) { + /* Peripheral clock disable */ + __HAL_RCC_ETH_CLK_DISABLE(); + + /** ETH GPIO Configuration + RMII_REF_CLK ----------------------> PA1 + RMII_MDIO -------------------------> PA2 + RMII_MDC --------------------------> PC1 + RMII_MII_CRS_DV -------------------> PA7 + RMII_MII_RXD0 ---------------------> PC4 + RMII_MII_RXD1 ---------------------> PC5 + RMII_MII_RXER ---------------------> PG2 + RMII_MII_TX_EN --------------------> PB11 + RMII_MII_TXD0 ---------------------> PB12 + RMII_MII_TXD1 ---------------------> PB13 + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7); + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13 | GPIO_PIN_11 | GPIO_PIN_12); + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5); + + /* Disable the Ethernet global Interrupt */ + NVIC_DisableIRQ(ETH_IRQn); + } +} + +uint8_t mbed_otp_mac_address(char *mac) +{ + C029_OTP_Header *pFound = NULL; + C029_OTP_Header *pTemp = (C029_OTP_Header*)C029_OTP_START_ADDRESS; + C029_OTP_Header temp; + + if (_macRetrieved == 0) { + while ((pTemp >= (C029_OTP_Header*)C029_OTP_START_ADDRESS) && (pTemp < (C029_OTP_Header*)C029_OTP_END_ADDRESS)){ + memcpy((void*)&temp, (void*)pTemp, sizeof(temp)); + if (temp.id == C029_MAC_ETHERNET_ID){ + pFound = pTemp; + break; + } + pTemp = increment(pTemp); + } + if (pFound != NULL) { + memcpy(_macAddr, pFound->data, 6); + _macRetrieved = 1; + } + } + memcpy(mac, _macAddr, 6); + + return 1; +} diff --git a/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/TARGET_STM32F4/TARGET_UBLOX_EVK_ODIN_W2/stm32f4_eth_conf.c b/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/TARGET_STM32F4/TARGET_UBLOX_EVK_ODIN_W2/stm32f4_eth_conf.c index 7325f42caf..56f754a4f4 100644 --- a/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/TARGET_STM32F4/TARGET_UBLOX_EVK_ODIN_W2/stm32f4_eth_conf.c +++ b/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/TARGET_STM32F4/TARGET_UBLOX_EVK_ODIN_W2/stm32f4_eth_conf.c @@ -19,7 +19,7 @@ void _eth_config_mac(ETH_HandleTypeDef *heth) { ETH_MACInitTypeDef macconf = - { + { .Watchdog = ETH_WATCHDOG_ENABLE, .Jabber = ETH_JABBER_ENABLE, .InterFrameGap = ETH_INTERFRAMEGAP_96BIT, @@ -48,8 +48,8 @@ void _eth_config_mac(ETH_HandleTypeDef *heth) .ReceiveFlowControl = ETH_RECEIVEFLOWCONTROL_DISABLE, .TransmitFlowControl = ETH_TRANSMITFLOWCONTROL_DISABLE, .VLANTagComparison = ETH_VLANTAGCOMPARISON_16BIT, - .VLANTagIdentifier = 0x0U, - }; + .VLANTagIdentifier = 0x0U + }; if (heth->Init.ChecksumMode == ETH_CHECKSUM_BY_HARDWARE) { macconf.ChecksumOffload = ETH_CHECKSUMOFFLAOD_ENABLE; diff --git a/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/TARGET_STM32F4/TARGET_UBLOX_EVK_ODIN_W2/stm32f4_eth_init.c b/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/TARGET_STM32F4/TARGET_UBLOX_EVK_ODIN_W2/stm32f4_eth_init.c index 89fd896139..f9ee0771e7 100644 --- a/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/TARGET_STM32F4/TARGET_UBLOX_EVK_ODIN_W2/stm32f4_eth_init.c +++ b/features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_STM/TARGET_STM32F4/TARGET_UBLOX_EVK_ODIN_W2/stm32f4_eth_init.c @@ -25,8 +25,7 @@ static C029_OTP_Header *increment(C029_OTP_Header *pTemp) if (id == 0xFF){ p++; - } - else { + } else { p++; memcpy((void*)&len, (void*)p++, 1); p += len; @@ -59,31 +58,30 @@ void HAL_ETH_MspInit(ETH_HandleTypeDef* heth) RMII_MII_TXD0 ---------------------> PB12 RMII_MII_TXD1 ---------------------> PB13 */ - /* Configure PA1, PA2 and PA7 */ + /* Configure PA1, PA2 and PA7 */ GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Pull = GPIO_PULLUP; GPIO_InitStructure.Pin = GPIO_PIN_2 | GPIO_PIN_7; GPIO_InitStructure.Alternate = GPIO_AF11_ETH; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); - + GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Pin = GPIO_PIN_1; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure PB13 */ - GPIO_InitStructure.Pin = GPIO_PIN_13 | GPIO_PIN_11 | GPIO_PIN_12; + GPIO_InitStructure.Pin = GPIO_PIN_13 | GPIO_PIN_11 | GPIO_PIN_12; HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); /* Configure PC1, PC4 and PC5 */ GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5; - HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); - + HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); /* Enable the Ethernet global Interrupt */ HAL_NVIC_SetPriority(ETH_IRQn, 0x7, 0); HAL_NVIC_EnableIRQ(ETH_IRQn); - + /* Enable ETHERNET clock */ __HAL_RCC_ETH_CLK_ENABLE(); } diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/PeripheralNames.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/PeripheralNames.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/PeripheralNames.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/PeripheralNames.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/PeripheralPins.c b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/PeripheralPins.c similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/PeripheralPins.c rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/PeripheralPins.c diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/TARGET_MBED_CONNECT_ODIN/PinNames.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/TARGET_MBED_CONNECT_ODIN/PinNames.h new file mode 100644 index 0000000000..ea26b94807 --- /dev/null +++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/TARGET_MBED_CONNECT_ODIN/PinNames.h @@ -0,0 +1,173 @@ +/* mbed Microcontroller Library + ******************************************************************************* + * Copyright (c) 2014, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ +#ifndef MBED_PINNAMES_H +#define MBED_PINNAMES_H + +#include "cmsis.h" +#include "PinNamesTypes.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + PA_0 = 0x00, PA_1 = 0x01, PA_2 = 0x02, PA_3 = 0x03, + PA_4 = 0x04, PA_5 = 0x05, PA_6 = 0x06, PA_7 = 0x07, + PA_8 = 0x08, PA_9 = 0x09, PA_10 = 0x0A, PA_11 = 0x0B, + PA_12 = 0x0C, PA_13 = 0x0D, PA_14 = 0x0E, PA_15 = 0x0F, + + PB_0 = 0x10, PB_1 = 0x11, PB_2 = 0x12, PB_3 = 0x13, + PB_4 = 0x14, PB_5 = 0x15, PB_6 = 0x16, PB_7 = 0x17, + PB_8 = 0x18, PB_9 = 0x19, PB_10 = 0x1A, PB_11 = 0x1B, + PB_12 = 0x1C, PB_13 = 0x1D, PB_14 = 0x1E, PB_15 = 0x1F, + + PC_0 = 0x20, PC_1 = 0x21, PC_2 = 0x22, PC_3 = 0x23, + PC_4 = 0x24, PC_5 = 0x25, PC_6 = 0x26, PC_7 = 0x27, + PC_8 = 0x28, PC_9 = 0x29, PC_10 = 0x2A, PC_11 = 0x2B, + PC_12 = 0x2C, PC_13 = 0x2D, PC_14 = 0x2E, PC_15 = 0x2F, + + PD_0 = 0x30, PD_1 = 0x31, PD_2 = 0x32, PD_3 = 0x33, + PD_4 = 0x34, PD_5 = 0x35, PD_6 = 0x36, PD_7 = 0x37, + PD_8 = 0x38, PD_9 = 0x39, PD_10 = 0x3A, PD_11 = 0x3B, + PD_12 = 0x3C, PD_13 = 0x3D, PD_14 = 0x3E, PD_15 = 0x3F, + + PE_0 = 0x40, PE_1 = 0x41, PE_2 = 0x42, PE_3 = 0x43, + PE_4 = 0x44, PE_5 = 0x45, PE_6 = 0x46, PE_7 = 0x47, + PE_8 = 0x48, PE_9 = 0x49, PE_10 = 0x4A, PE_11 = 0x4B, + PE_12 = 0x4C, PE_13 = 0x4D, PE_14 = 0x4E, PE_15 = 0x4F, + + PF_0 = 0x50, PF_1 = 0x51, PF_2 = 0x52, PF_3 = 0x53, + PF_4 = 0x54, PF_5 = 0x55, PF_6 = 0x56, PF_7 = 0x57, + PF_8 = 0x58, PF_9 = 0x59, PF_10 = 0x5A, PF_11 = 0x5B, + PF_12 = 0x5C, PF_13 = 0x5D, PF_14 = 0x5E, PF_15 = 0x5F, + + PG_0 = 0x60, PG_1 = 0x61, PG_2 = 0x62, PG_3 = 0x63, + PG_4 = 0x64, PG_5 = 0x65, PG_6 = 0x66, PG_7 = 0x67, + PG_8 = 0x68, PG_9 = 0x69, PG_10 = 0x6A, PG_11 = 0x6B, + PG_12 = 0x6C, PG_13 = 0x6D, PG_14 = 0x6E, PG_15 = 0x6F, + + PH_0 = 0x70, PH_1 = 0x71, PH_2 = 0x72, PH_3 = 0x73, + PH_4 = 0x74, PH_5 = 0x75, PH_6 = 0x76, PH_7 = 0x77, + PH_8 = 0x78, PH_9 = 0x79, PH_10 = 0x7A, PH_11 = 0x7B, + PH_12 = 0x7C, PH_13 = 0x7D, PH_14 = 0x7E, PH_15 = 0x7F, + + // Module Pins + // A + P_A5 = PC_2, // UART-DTR + P_A6 = PF_2, // Switch-0 + P_A7 = PE_0, // Red, Mode + P_A8 = PB_6, // Green, Switch-1 + P_A9 = PB_8, // Blue + P_A10 = PA_11, // UART-CTS + P_A11 = PA_9, // UART-TXD + P_A12 = PA_12, // UART-RTS + P_A13 = PA_10, // UART-RXD + P_A14 = PD_9, // GPIO-0 + P_A15 = PD_8, // GPIO-1 + P_A16 = PD_11, // GPIO-2 + P_A17 = PD_12, // GPIO-3 + P_A18 = PA_3, // UART-DSR + // B + // C + P_C5 = PG_4, // SPI-IRQ + P_C6 = PE_13, // SPI-MISO + P_C8 = PE_12, // Res + P_C10 = PE_14, // SPI-MOSI + P_C11 = PE_11, // SPI-CS0 + P_C12 = PE_9, // Res + P_C13 = PF_6, // GPIO-4 + P_C14 = PC_1, // RMII-MDC + P_C15 = PA_2, // RMII-MDIO + P_C16 = PF_7, // GPIO-7 + P_C17 = PF_1, // I2C-SCL + P_C18 = PF_0, // I2C-SDA + // D + P_D1 = PB_12, // RMII-TXD0 + P_D2 = PB_13, // RMII-TXD1 + P_D3 = PB_11, // RMII-TXEN + P_D4 = PA_7, // RMII-CRSDV + P_D5 = PC_4, // RMII-RXD0 + P_D6 = PC_5, // RMII-RXD1 + P_D8 = PA_1, // RMII-REFCLK + // TP + P_TP5 = PB_4, // NTRST + P_TP7 = PA_13, // TMS SWDIO + P_TP8 = PA_15, // TDI + P_TP9 = PA_14, // TCK SWCLK + P_TP10 = PB_3, // TDO + //P_TP11, // BOOT0 + + // Internal + LED1 = PD_9, + LED2 = PA_12, + LED3 = PD_8, + LED4 = PA_11, + LED5 = PC_2, + LED6 = PA_3, + LED7 = PF_6, + LED_RED = PE_0, + LED_GREEN = PB_6, + LED_BLUE = PB_8, + SW1 = PF_2, + SW2 = PG_4, + + // Standardized button names + BUTTON1 = SW1, + BUTTON2 = SW2, + + I2C_SDA = PF_0, + I2C_SCL = PF_1, + SPI0_MOSI = PE_14, + SPI0_MISO = PE_13, + SPI0_SCK = PE_12, + SPI0_CS = PE_11, + SPI1_CS = PE_9, + + SPI_MOSI = SPI0_MOSI, + SPI_MISO = SPI0_MISO, + SPI_SCK = SPI0_SCK, + SPI_CS = SPI0_CS, + + // DAPLink + USBRX = MBED_CONF_TARGET_USB_RX, + USBTX = MBED_CONF_TARGET_USB_TX, + SWDIO = PA_15, + SWCLK = PA_14, + NTRST = PB_4, + + // Not connected + NC = (int)0xFFFFFFFF +} PinName; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/PinNames.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/TARGET_UBLOX_EVK_ODIN_W2/PinNames.h similarity index 95% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/PinNames.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/TARGET_UBLOX_EVK_ODIN_W2/PinNames.h index 1be288b161..e6b09b7502 100644 --- a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/PinNames.h +++ b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/TARGET_UBLOX_EVK_ODIN_W2/PinNames.h @@ -159,6 +159,19 @@ typedef enum { LED_BLUE = LED3, SW0 = PF_2, // Switch-0 SW1 = PB_6, // Green / Switch-1 + + I2C_SCL = D15, + I2C_SDA = D14, + SPI0_MOSI = D11, + SPI0_MISO = D12, + SPI0_SCK = D13, + SPI0_CS = D10, + SPI1_CS = D9, + + SPI_MOSI = SPI0_MOSI, + SPI_MISO = SPI0_MISO, + SPI_SCK = SPI0_SCK, + SPI_CS = SPI0_CS, // Standardized button names diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/LICENSE b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/LICENSE similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/LICENSE rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/LICENSE diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/LICENSE-permissive-binary-license-1.0.txt b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/LICENSE-permissive-binary-license-1.0.txt similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/LICENSE-permissive-binary-license-1.0.txt rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/LICENSE-permissive-binary-license-1.0.txt diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/TOOLCHAIN_ARM/libublox-odin-w2-driver.ar b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_ARM/libublox-odin-w2-driver.ar similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/TOOLCHAIN_ARM/libublox-odin-w2-driver.ar rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_ARM/libublox-odin-w2-driver.ar diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/TOOLCHAIN_GCC_ARM/libublox-odin-w2-driver.a b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_GCC_ARM/libublox-odin-w2-driver.a similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/TOOLCHAIN_GCC_ARM/libublox-odin-w2-driver.a rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_GCC_ARM/libublox-odin-w2-driver.a diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/TOOLCHAIN_IAR/libublox-odin-w2-driver.a b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_IAR/libublox-odin-w2-driver.a similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/TOOLCHAIN_IAR/libublox-odin-w2-driver.a rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/TOOLCHAIN_IAR/libublox-odin-w2-driver.a diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/OdinWiFiInterface.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/OdinWiFiInterface.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/OdinWiFiInterface.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/OdinWiFiInterface.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/bt_types.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/bt_types.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/bt_types.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/bt_types.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_assert.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_assert.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_assert.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_assert.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_conn_man.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_conn_man.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_conn_man.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_conn_man.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_man.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_man.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_man.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_man.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_pan.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_pan.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_pan.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_pan.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_sec_man.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_sec_man.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_sec_man.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_sec_man.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_serial.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_serial.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_serial.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_serial.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_serial_le.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_serial_le.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_serial_le.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_serial_le.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_test_man.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_test_man.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_test_man.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_test_man.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_utils.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_utils.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_utils.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_bt_utils.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_cert_utils.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_cert_utils.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_cert_utils.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_cert_utils.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_comdefs.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_comdefs.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_comdefs.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_comdefs.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_gatt.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_gatt.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_gatt.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_gatt.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_gatt_client.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_gatt_client.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_gatt_client.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_gatt_client.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_gatt_server.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_gatt_server.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_gatt_server.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_gatt_server.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_gatt_utils.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_gatt_utils.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_gatt_utils.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_gatt_utils.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_hw.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_hw.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_hw.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_hw.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_main.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_main.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_main.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_main.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_otp.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_otp.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_otp.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_otp.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_platform_basic_types.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_platform_basic_types.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_platform_basic_types.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_platform_basic_types.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_port_types.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_port_types.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_port_types.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_port_types.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_status.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_status.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_status.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_status.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_types.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_types.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_types.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_types.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_watchdog.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_watchdog.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_watchdog.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_watchdog.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_wlan.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_wlan.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_wlan.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_wlan.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_wlan_target_data.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_wlan_target_data.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_wlan_target_data.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_wlan_target_data.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_wlan_types.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_wlan_types.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_wlan_types.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/ublox-odin-w2-drivers/cb_wlan_types.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/wifi_emac/wifi_emac_api.cpp b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/wifi_emac/wifi_emac_api.cpp similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/wifi_emac/wifi_emac_api.cpp rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/wifi_emac/wifi_emac_api.cpp diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/wifi_emac/wifi_emac_api.h b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/wifi_emac/wifi_emac_api.h similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/sdk/wifi_emac/wifi_emac_api.h rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/sdk/wifi_emac/wifi_emac_api.h diff --git a/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/system_clock.c b/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/system_clock.c similarity index 100% rename from targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_UBLOX_EVK_ODIN_W2/system_clock.c rename to targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F439xI/TARGET_MODULE_UBLOX_ODIN_W2/system_clock.c diff --git a/targets/targets.json b/targets/targets.json old mode 100644 new mode 100755 index d4f6a93f2c..ccfcd28528 --- a/targets/targets.json +++ b/targets/targets.json @@ -1725,18 +1725,21 @@ "device_has_add": [], "device_name": "STM32F401VC" }, - "UBLOX_EVK_ODIN_W2": { + "MODULE_UBLOX_ODIN_W2": { "inherits": ["FAMILY_STM32"], - "supported_form_factors": ["ARDUINO"], "core": "Cortex-M4F", "extra_labels_add": ["STM32F4", "STM32F439", "STM32F439ZI","STM32F439xx", "STM32F439xI"], "macros": ["MBEDTLS_CONFIG_HW_SUPPORT", "HSE_VALUE=24000000", "HSE_STARTUP_TIMEOUT=5000", "CB_INTERFACE_SDIO","CB_CHIP_WL18XX","SUPPORT_80211D_ALWAYS","WLAN_ENABLED","MBEDTLS_ARC4_C","MBEDTLS_DES_C","MBEDTLS_MD4_C","MBEDTLS_MD5_C","MBEDTLS_SHA1_C"], "device_has_add": ["CAN", "EMAC", "TRNG", "FLASH"], "device_has_remove": ["RTC", "SLEEP"], "features": ["LWIP"], - "release_versions": ["5"], "device_name": "STM32F439ZI", - "bootloader_supported": true, + "bootloader_supported": true + }, + "UBLOX_EVK_ODIN_W2": { + "inherits": ["MODULE_UBLOX_ODIN_W2"], + "supported_form_factors": ["ARDUINO"], + "release_versions": ["5"], "config": { "usb_tx": { "help": "Value: D8(default) or D1", @@ -1753,6 +1756,25 @@ } } }, + "MBED_CONNECT_ODIN": { + "inherits": ["MODULE_UBLOX_ODIN_W2"], + "release_versions": ["5"], + "config": { + "usb_tx": { + "help": "Value: PA_9(default) or PD_8", + "value": "PA_9" + }, + "usb_rx": { + "help": "Value: PA_10(default) or PD_9", + "value": "PA_10" + }, + "stdio_uart": { + "help": "Value: UART_1(default) or UART_3", + "value": "UART_1", + "macro_name": "STDIO_UART" + } + } + }, "UBLOX_C030": { "inherits": ["FAMILY_STM32"], "supported_form_factors": ["ARDUINO"], From 0105347b93ff07ba4bae94a4dd41e88d827538d0 Mon Sep 17 00:00:00 2001 From: Dave Wu Date: Wed, 20 Sep 2017 14:37:22 +1000 Subject: [PATCH 29/80] Added support for ADI EV-COG-AD4050LZ platform. --- .../TARGET_ADUCM4050/.mbedignore | 28 + .../TARGET_EV_COG_AD4050LZ/PeripheralNames.h | 136 + .../TARGET_EV_COG_AD4050LZ/PinNames.h | 221 + .../device/startup_ADuCM4050.c | 286 + .../device/startup_ADuCM4050.h | 236 + .../device/system_ADuCM4050.c | 322 + .../TOOLCHAIN_ARM_STD/ADuCM4050.sct | 52 + .../TOOLCHAIN_GCC_ARM/ADuCM4050.ld | 214 + .../TOOLCHAIN_IAR/ADuCM4050.icf | 48 + .../TARGET_ADUCM4050/api/PeripheralPins.c | 138 + .../TARGET_ADUCM4050/api/PeripheralPins.h | 67 + .../TARGET_ADUCM4050/api/analogin_api.c | 216 + .../TARGET_ADUCM4050/api/cmsis.h | 46 + .../TARGET_ADUCM4050/api/cmsis_nvic.h | 78 + .../TARGET_ADUCM4050/api/device.h | 48 + .../TARGET_ADUCM4050/api/flash_api.c | 89 + .../TARGET_ADUCM4050/api/gpio_api.c | 144 + .../TARGET_ADUCM4050/api/gpio_dev_mem.c | 47 + .../TARGET_ADUCM4050/api/gpio_irq_api.c | 317 + .../TARGET_ADUCM4050/api/gpio_object.h | 61 + .../TARGET_ADUCM4050/api/i2c_api.c | 238 + .../TARGET_ADUCM4050/api/lp_ticker_api.c | 269 + .../TARGET_ADUCM4050/api/objects.h | 112 + .../TARGET_ADUCM4050/api/pinmap.c | 103 + .../TARGET_ADUCM4050/api/rtc_api.c | 94 + .../TARGET_ADUCM4050/api/serial_api.c | 352 + .../TARGET_ADUCM4050/api/sleep.c | 255 + .../TARGET_ADUCM4050/api/sleep.h | 69 + .../TARGET_ADUCM4050/api/spi_api.c | 346 + .../TARGET_ADUCM4050/api/trng_api.c | 96 + .../TARGET_ADUCM4050/api/us_ticker.c | 346 + .../TARGET_ADUCM4050/bsp/ADuCM4050.h | 26 + .../TARGET_ADUCM4050/bsp/ADuCM4050_cdef.h | 18 + .../TARGET_ADUCM4050/bsp/ADuCM4050_def.h | 34 + .../TARGET_ADUCM4050/bsp/ADuCM4050_device.h | 29 + .../TARGET_ADUCM4050/bsp/ADuCM4050_typedefs.h | 31 + .../TARGET_ADUCM4050/bsp/adc/adi_adc.c | 2371 ++++ .../TARGET_ADUCM4050/bsp/adc/adi_adc_data.c | 19 + .../TARGET_ADUCM4050/bsp/adc/adi_adc_def.h | 120 + .../TARGET_ADUCM4050/bsp/adi_callback.h | 60 + .../TARGET_ADUCM4050/bsp/adi_cyclecount.h | 137 + .../TARGET_ADUCM4050/bsp/adi_processor.h | 67 + .../TARGET_ADUCM4050/bsp/adi_types.h | 18 + .../TARGET_ADUCM4050/bsp/adi_version.h | 63 + .../TARGET_ADUCM4050/bsp/beep/adi_beep.c | 751 ++ .../TARGET_ADUCM4050/bsp/beep/adi_beep_def.h | 128 + .../TARGET_ADUCM4050/bsp/common.h | 127 + .../bsp/config/adi_adc_config.h | 342 + .../bsp/config/adi_beep_config.h | 164 + .../bsp/config/adi_crc_config.h | 100 + .../bsp/config/adi_crypto_config.h | 138 + .../bsp/config/adi_cycle_counting_config.h | 105 + .../bsp/config/adi_flash_config.h | 299 + .../bsp/config/adi_global_config.h | 131 + .../bsp/config/adi_i2c_config.h | 226 + .../bsp/config/adi_pwr_config.h | 638 + .../bsp/config/adi_rng_config.h | 106 + .../bsp/config/adi_rtc_config.h | 397 + .../bsp/config/adi_spi_config.h | 592 + .../bsp/config/adi_sport_config.h | 355 + .../bsp/config/adi_tmr_config.h | 902 ++ .../bsp/config/adi_uart_config.h | 496 + .../bsp/config/adi_wdt_config.h | 119 + .../TARGET_ADUCM4050/bsp/crc/adi_crc.c | 1279 ++ .../TARGET_ADUCM4050/bsp/crc/adi_crc_def.h | 92 + .../TARGET_ADUCM4050/bsp/crypto/adi_crypto.c | 1577 +++ .../bsp/crypto/adi_crypto_def.h | 209 + .../TARGET_ADUCM4050/bsp/dma/adi_dma.c | 346 + .../bsp/drivers/adc/adi_adc.h | 346 + .../bsp/drivers/beep/adi_beep.h | 277 + .../bsp/drivers/crc/adi_crc.h | 236 + .../bsp/drivers/crypto/adi_crypto.h | 235 + .../bsp/drivers/dma/adi_dma.h | 274 + .../bsp/drivers/flash/adi_flash.h | 185 + .../bsp/drivers/general/adi_data_transfer.h | 127 + .../bsp/drivers/general/adi_drivers_general.h | 98 + .../bsp/drivers/gpio/adi_gpio.h | 174 + .../bsp/drivers/i2c/adi_i2c.h | 243 + .../bsp/drivers/pwr/adi_pwr.h | 689 + .../bsp/drivers/rng/adi_rng.h | 204 + .../bsp/drivers/rtc/adi_rtc.h | 521 + .../bsp/drivers/spi/adi_spi.h | 386 + .../bsp/drivers/sport/adi_sport.h | 236 + .../bsp/drivers/tmr/adi_tmr.h | 253 + .../bsp/drivers/uart/adi_uart.h | 498 + .../bsp/drivers/wdt/adi_wdt.h | 77 + .../bsp/drivers/xint/adi_xint.h | 120 + .../TARGET_ADUCM4050/bsp/flash/adi_flash.c | 1812 +++ .../bsp/flash/adi_flash_data.c | 116 + .../bsp/flash/adi_flash_def.h | 181 + .../TARGET_ADUCM4050/bsp/gpio/adi_gpio.c | 975 ++ .../TARGET_ADUCM4050/bsp/gpio/adi_gpio_def.h | 94 + .../TARGET_ADUCM4050/bsp/i2c/adi_i2c.c | 1169 ++ .../TARGET_ADUCM4050/bsp/i2c/adi_i2c_data.c | 120 + .../TARGET_ADUCM4050/bsp/i2c/adi_i2c_def.h | 129 + .../TARGET_ADUCM4050/bsp/pwr/adi_pwr.c | 1904 +++ .../TARGET_ADUCM4050/bsp/pwr/adi_pwr_def.h | 172 + .../bsp/retarget_uart_config.h | 27 + .../TARGET_ADUCM4050/bsp/rng/adi_rng.c | 796 ++ .../TARGET_ADUCM4050/bsp/rng/adi_rng_def.h | 69 + .../TARGET_ADUCM4050/bsp/rtc/adi_rtc.c | 2608 ++++ .../TARGET_ADUCM4050/bsp/rtc/adi_rtc_data.c | 190 + .../TARGET_ADUCM4050/bsp/rtc/adi_rtc_def.h | 163 + .../bsp/rtos_map/adi_rtos_map.h | 71 + .../bsp/rtos_map/adi_rtos_map_freertos.h | 144 + .../bsp/rtos_map/adi_rtos_map_noos.h | 180 + .../bsp/rtos_map/adi_rtos_map_ucos_ii.h | 149 + .../bsp/rtos_map/adi_rtos_map_ucos_iii.h | 167 + .../TARGET_ADUCM4050/bsp/spi/adi_spi.c | 1892 +++ .../TARGET_ADUCM4050/bsp/spi/adi_spi_data.c | 162 + .../TARGET_ADUCM4050/bsp/spi/adi_spi_def.h | 148 + .../TARGET_ADUCM4050/bsp/sport/adi_sport.c | 1771 +++ .../bsp/sport/adi_sport_def.h | 193 + .../TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050.h | 5339 ++++++++ .../bsp/sys/adi_ADuCM4050_cdef.h | 788 ++ .../bsp/sys/adi_ADuCM4050_device.h | 1338 ++ .../bsp/sys/adi_ADuCM4050_typedefs.h | 11252 ++++++++++++++++ .../TARGET_ADUCM4050/bsp/sys/adi_cio_macros.h | 50 + .../TARGET_ADUCM4050/bsp/sys/platform.h | 56 + .../TARGET_ADUCM4050/bsp/system_ADuCM4050.h | 159 + .../TARGET_ADUCM4050/bsp/tmr/adi_tmr.c | 611 + .../TARGET_ADUCM4050/bsp/tmr/adi_tmr_data.c | 155 + .../TARGET_ADUCM4050/bsp/uart/adi_uart.c | 2779 ++++ .../TARGET_ADUCM4050/bsp/uart/adi_uart_def.h | 214 + .../TARGET_ADUCM4050/bsp/wdt/adi_wdt.c | 225 + .../TARGET_ADUCM4050/bsp/xint/adi_xint.c | 413 + .../TARGET_ADUCM4050/bsp/xint/adi_xint_def.h | 61 + targets/TARGET_Analog_Devices/mbed_rtx.h | 58 + targets/targets.json | 19 +- 129 files changed, 61780 insertions(+), 4 deletions(-) create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/.mbedignore create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/PeripheralNames.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/PinNames.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/device/startup_ADuCM4050.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/device/startup_ADuCM4050.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/device/system_ADuCM4050.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TOOLCHAIN_ARM_STD/ADuCM4050.sct create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TOOLCHAIN_GCC_ARM/ADuCM4050.ld create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TOOLCHAIN_IAR/ADuCM4050.icf create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/PeripheralPins.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/PeripheralPins.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/analogin_api.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/cmsis.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/cmsis_nvic.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/device.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/flash_api.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_api.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_dev_mem.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_irq_api.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_object.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/i2c_api.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/lp_ticker_api.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/objects.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/pinmap.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/rtc_api.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/sleep.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/sleep.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/spi_api.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/us_ticker.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050_cdef.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050_def.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050_device.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050_typedefs.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adc/adi_adc.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adc/adi_adc_data.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adc/adi_adc_def.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_callback.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_cyclecount.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_processor.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_types.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_version.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/beep/adi_beep.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/beep/adi_beep_def.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/common.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_adc_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_beep_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_crc_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_crypto_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_cycle_counting_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_flash_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_global_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_i2c_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_pwr_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_rng_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_rtc_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_spi_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_sport_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_tmr_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_uart_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_wdt_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/crc/adi_crc.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/crc/adi_crc_def.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/crypto/adi_crypto.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/crypto/adi_crypto_def.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/dma/adi_dma.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/adc/adi_adc.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/beep/adi_beep.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/crc/adi_crc.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/crypto/adi_crypto.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/dma/adi_dma.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/flash/adi_flash.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/general/adi_data_transfer.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/general/adi_drivers_general.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/gpio/adi_gpio.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/i2c/adi_i2c.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/pwr/adi_pwr.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/rng/adi_rng.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/rtc/adi_rtc.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/spi/adi_spi.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/sport/adi_sport.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/tmr/adi_tmr.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/uart/adi_uart.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/wdt/adi_wdt.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/xint/adi_xint.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/flash/adi_flash.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/flash/adi_flash_data.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/flash/adi_flash_def.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/gpio/adi_gpio.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/gpio/adi_gpio_def.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/i2c/adi_i2c.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/i2c/adi_i2c_data.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/i2c/adi_i2c_def.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/pwr/adi_pwr.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/pwr/adi_pwr_def.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/retarget_uart_config.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rng/adi_rng.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rng/adi_rng_def.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc_data.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc_def.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map_freertos.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map_noos.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map_ucos_ii.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map_ucos_iii.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/spi/adi_spi.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/spi/adi_spi_data.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/spi/adi_spi_def.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sport/adi_sport.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sport/adi_sport_def.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050_cdef.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050_device.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050_typedefs.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_cio_macros.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/platform.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/system_ADuCM4050.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/tmr/adi_tmr.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/tmr/adi_tmr_data.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/uart/adi_uart.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/uart/adi_uart_def.h create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/wdt/adi_wdt.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/xint/adi_xint.c create mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/xint/adi_xint_def.h create mode 100755 targets/TARGET_Analog_Devices/mbed_rtx.h diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/.mbedignore b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/.mbedignore new file mode 100755 index 0000000000..94a9f73e3f --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/.mbedignore @@ -0,0 +1,28 @@ +bsp/adc/adi_adc_data.c +bsp/adc/adi_adc_data_v1.c +bsp/adc/adi_adc_v1.c +bsp/beep/adi_beep_v1.c +bsp/crc/adi_crc_data.c +bsp/crc/adi_crc_v1.c +bsp/crypto/adi_crypto_v1.c +bsp/dma/adi_dma_pl230_v2.c +bsp/flash/adi_flash_data.c +bsp/flash/adi_flash_v1.c +bsp/gpio/adi_gpio_v1.c +bsp/i2c/adi_i2c_data.c +bsp/i2c/adi_i2c_v1.c +bsp/pwr/adi_pwr_v1.c +bsp/rtc/adi_rtc_data.c +bsp/rtc/adi_rtc_data_v1.c +bsp/rtc/adi_rtc_v1.c +bsp/sport/adi_sport_data_v1.c +bsp/sport/adi_sport_v1.c +bsp/uart/adi_uart_data_v1.c +bsp/uart/adi_uart_v1.c +bsp/spi/adi_spi_data.c +bsp/spi/adi_spi_data_v1.c +bsp/spi/adi_spi_v1.c +bsp/tmr/adi_tmr_data.c +bsp/tmr/adi_tmr_data_v1.c +bsp/tmr/adi_tmr_v1.c +bsp/wdt/adi_wdt_v1.c diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/PeripheralNames.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/PeripheralNames.h new file mode 100755 index 0000000000..c1cfd6c14a --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/PeripheralNames.h @@ -0,0 +1,136 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#ifndef MBED_PERIPHERALNAMES_H +#define MBED_PERIPHERALNAMES_H + +#include "cmsis.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + OSC32KCLK = 0, +} RTCName; + +typedef enum { + UART_0 = 0, + UART_1 = 1, + UART_2 = 2, + UART_3 = 3, + UART_4 = 4, +} UARTName; + +#define STDIO_UART_TX USBTX +#define STDIO_UART_RX USBRX +#define STDIO_UART UART_0 + +typedef enum { + I2C_0 = 0, + I2C_1 = 1, + I2C_2 = 2, +} I2CName; + +#define TPM_SHIFT 8 +typedef enum { + PWM_1 = (0 << TPM_SHIFT) | (0), // FTM0 CH0 + PWM_2 = (0 << TPM_SHIFT) | (1), // FTM0 CH1 + PWM_3 = (0 << TPM_SHIFT) | (2), // FTM0 CH2 + PWM_4 = (0 << TPM_SHIFT) | (3), // FTM0 CH3 + PWM_5 = (0 << TPM_SHIFT) | (4), // FTM0 CH4 + PWM_6 = (0 << TPM_SHIFT) | (5), // FTM0 CH5 + PWM_7 = (0 << TPM_SHIFT) | (6), // FTM0 CH6 + PWM_8 = (0 << TPM_SHIFT) | (7), // FTM0 CH7 + PWM_9 = (1 << TPM_SHIFT) | (0), // FTM1 CH0 + PWM_10 = (1 << TPM_SHIFT) | (1), // FTM1 CH1 + PWM_11 = (1 << TPM_SHIFT) | (2), // FTM1 CH2 + PWM_12 = (1 << TPM_SHIFT) | (3), // FTM1 CH3 + PWM_13 = (1 << TPM_SHIFT) | (4), // FTM1 CH4 + PWM_14 = (1 << TPM_SHIFT) | (5), // FTM1 CH5 + PWM_15 = (1 << TPM_SHIFT) | (6), // FTM1 CH6 + PWM_16 = (1 << TPM_SHIFT) | (7), // FTM1 CH7 + PWM_17 = (2 << TPM_SHIFT) | (0), // FTM2 CH0 + PWM_18 = (2 << TPM_SHIFT) | (1), // FTM2 CH1 + PWM_19 = (2 << TPM_SHIFT) | (2), // FTM2 CH2 + PWM_20 = (2 << TPM_SHIFT) | (3), // FTM2 CH3 + PWM_21 = (2 << TPM_SHIFT) | (4), // FTM2 CH4 + PWM_22 = (2 << TPM_SHIFT) | (5), // FTM2 CH5 + PWM_23 = (2 << TPM_SHIFT) | (6), // FTM2 CH6 + PWM_24 = (2 << TPM_SHIFT) | (7), // FTM2 CH7 + // could be 4 or could be 3... not sure what register + // this is for... too much abstraction + PWM_25 = (3 << TPM_SHIFT) | (0), // FTM3 CH0 + PWM_26 = (3 << TPM_SHIFT) | (1), // FTM3 CH1 + PWM_27 = (3 << TPM_SHIFT) | (2), // FTM3 CH2 + PWM_28 = (3 << TPM_SHIFT) | (3), // FTM3 CH3 + PWM_29 = (3 << TPM_SHIFT) | (4), // FTM3 CH4 + PWM_30 = (3 << TPM_SHIFT) | (5), // FTM3 CH5 + PWM_31 = (3 << TPM_SHIFT) | (6), // FTM3 CH6 + PWM_32 = (3 << TPM_SHIFT) | (7), // FTM3 CH7 +} PWMName; + +typedef enum { + ADC0_VIN0 = 0, + ADC0_VIN1 = 1, + ADC0_VIN2 = 2, + ADC0_VIN3 = 3, + ADC0_VIN4 = 4, + ADC0_VIN5 = 5, + ADC0_VIN6 = 6, + ADC0_VIN7 = 7 +} ADCName; + +typedef enum { + DAC_0 = 0 +} DACName; + + +typedef enum { + SPI_0 = 0, + SPI_1 = 1, + SPI_2 = 2, +} SPIName; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/PinNames.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/PinNames.h new file mode 100755 index 0000000000..3192608f78 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/PinNames.h @@ -0,0 +1,221 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#ifndef MBED_PINNAMES_H +#define MBED_PINNAMES_H + +/* + The ADuCM4050 is made in two package variants. + + 64 lead LFCSP & 72 ball WLCSP + + There are some differences for Port 2 between the two variants + WLCSP also has Port 3. + + The #define ADUCM4050_LFCSP is used to determine which variant the code + is built for. + + For LFCSP leave the #define in, to build for ADUCM4050_WLCSP remove. +*/ +#define ADUCM4050_LFCSP + +#include "cmsis.h" + +#include "adi_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + PIN_INPUT, + PIN_OUTPUT +} PinDirection; + +//update + +#define GPIO_PORT_SHIFT 12 + + +typedef enum { + P0_00 = (0 << GPIO_PORT_SHIFT | 0 ), + P0_01 = (0 << GPIO_PORT_SHIFT | 1 ), + P0_02 = (0 << GPIO_PORT_SHIFT | 2 ), + P0_03 = (0 << GPIO_PORT_SHIFT | 3 ), + P0_04 = (0 << GPIO_PORT_SHIFT | 4 ), + P0_05 = (0 << GPIO_PORT_SHIFT | 5 ), + P0_06 = (0 << GPIO_PORT_SHIFT | 6 ), + P0_07 = (0 << GPIO_PORT_SHIFT | 7 ), + P0_08 = (0 << GPIO_PORT_SHIFT | 8 ), + P0_09 = (0 << GPIO_PORT_SHIFT | 9 ), + P0_10 = (0 << GPIO_PORT_SHIFT | 10), + P0_11 = (0 << GPIO_PORT_SHIFT | 11), + P0_12 = (0 << GPIO_PORT_SHIFT | 12), + P0_13 = (0 << GPIO_PORT_SHIFT | 13), + P0_14 = (0 << GPIO_PORT_SHIFT | 14), + P0_15 = (0 << GPIO_PORT_SHIFT | 15), + P1_00 = (1 << GPIO_PORT_SHIFT | 0 ), + P1_01 = (1 << GPIO_PORT_SHIFT | 1 ), + P1_02 = (1 << GPIO_PORT_SHIFT | 2 ), + P1_03 = (1 << GPIO_PORT_SHIFT | 3 ), + P1_04 = (1 << GPIO_PORT_SHIFT | 4 ), + P1_05 = (1 << GPIO_PORT_SHIFT | 5 ), + P1_06 = (1 << GPIO_PORT_SHIFT | 6 ), + P1_07 = (1 << GPIO_PORT_SHIFT | 7 ), + P1_08 = (1 << GPIO_PORT_SHIFT | 8 ), + P1_09 = (1 << GPIO_PORT_SHIFT | 9 ), + P1_10 = (1 << GPIO_PORT_SHIFT | 10), + P1_11 = (1 << GPIO_PORT_SHIFT | 11), + P1_12 = (1 << GPIO_PORT_SHIFT | 12), + P1_13 = (1 << GPIO_PORT_SHIFT | 13), + P1_14 = (1 << GPIO_PORT_SHIFT | 14), + P1_15 = (1 << GPIO_PORT_SHIFT | 15), + P2_00 = (2 << GPIO_PORT_SHIFT | 0 ), + P2_01 = (2 << GPIO_PORT_SHIFT | 1 ), + P2_02 = (2 << GPIO_PORT_SHIFT | 2 ), + P2_03 = (2 << GPIO_PORT_SHIFT | 3 ), + P2_04 = (2 << GPIO_PORT_SHIFT | 4 ), + P2_05 = (2 << GPIO_PORT_SHIFT | 5 ), + P2_06 = (2 << GPIO_PORT_SHIFT | 6 ), + P2_07 = (2 << GPIO_PORT_SHIFT | 7 ), + P2_08 = (2 << GPIO_PORT_SHIFT | 8 ), + P2_09 = (2 << GPIO_PORT_SHIFT | 9 ), + P2_10 = (2 << GPIO_PORT_SHIFT | 10), + P2_11 = (2 << GPIO_PORT_SHIFT | 11), + + // USB Pins + USBTX = P0_10, + USBRX = P0_11, + USBTX1 = P1_15, + USBRX1 = P2_00, + + // mbed original LED naming + LED1 = P2_02, + LED2 = P2_10, + LED3 = LED2, + LED4 = LED1, + + //Push buttons + PB0 = P1_00, // BTN1 + PB1 = P0_09, // BTN2 + BOOT = P1_01, + WAKE0 = P0_15, // JP15 to select + WAKE1 = P1_00, // JP8 (BTN1 jumper) to select + WAKE2 = P0_13, // JP4 to select + WAKE3 = P2_01, // JP15 to select + + // SPI Pins + SPI0_SCLK = P0_00, + SPI0_MOSI = P0_01, + SPI0_MISO = P0_02, + SPI0_CS0 = P0_03, + SPI0_CS1 = P1_10, + SPI0_CS2 = P2_08, + SPI0_CS3 = P2_09, + + SPI1_SCLK = P1_06, + SPI1_MOSI = P1_07, + SPI1_MISO = P1_08, + SPI1_CS0 = P1_09, + SPI1_CS1 = P2_11, + SPI1_CS2 = P2_02, + SPI1_CS3 = P1_10, + + SPI2_SCLK = P1_02, + SPI2_MOSI = P1_03, + SPI2_MISO = P1_04, + SPI2_CS0 = P1_05, + SPI2_CS1 = P0_09, + SPI2_CS2 = P2_10, + SPI2_CS3 = P2_07, + + // ADC Pins + ADC_VIN0 = P2_03, + ADC_VIN1 = P2_04, + ADC_VIN2 = P2_05, + ADC_VIN3 = P2_06, + ADC_VIN4 = P2_07, + ADC_VIN5 = P2_08, + ADC_VIN6 = P2_09, + ADC_VIN7 = P2_10, + + // Arduino Headers + D0 = P0_10, // UART0_TXD + D1 = P0_11, // UART0_RXD + D2 = P0_15, // INT_WAKE0 + D3 = P0_13, // EXT_INT_WAKE2 + D4 = P0_09, // EXT_SPI2_CS1 + D5 = P2_01, // INT_WAKE3 or EXT_RTC1_SS1 via JP8 + D6 = P1_11, // GPIO_27 + D7 = P0_12, // GPIO_08 or GPIO_12 via JP7 + + D8 = P1_12, // GPIO_28 + D9 = P1_14, // GPIO_30 + D10 = SPI0_CS2, // P2_08 + D11 = SPI0_MOSI, // P0_01 + D12 = SPI0_MISO, // P0_02 + D13 = SPI0_SCLK, // P0_00 + I2C_SCL = P0_04, // I2C_SCL + I2C_SDA = P0_05, // I2C_SDA + + A0 = P2_03, // ADC0 + A1 = P2_04, // EXT_ADC1 + A2 = P2_05, // EXT_ADC2 + A3 = P2_06, // ADC3 + A4 = P2_07, // SPI2_CS3 + A5 = P2_10, // EXT_GPIO42 + + // Not connected + NC = (int)0xFFFFFFFF +} PinName; + + +typedef enum { + PullNone = 0, + PullDown = 1, + PullUp = 2, + PullDefault = PullNone +} PinMode; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/device/startup_ADuCM4050.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/device/startup_ADuCM4050.c new file mode 100755 index 0000000000..b48cc0f83c --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/device/startup_ADuCM4050.c @@ -0,0 +1,286 @@ +/*! + ***************************************************************************** + * @file: startup_ADuCM4050.c + * @brief: Interrupt table and default handlers for ADuCM4x50 + * @version: $Revision: $ + * @date: $Date: $ + *----------------------------------------------------------------------------- + * +Copyright (c) 2010-2017 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *****************************************************************************/ +#ifdef __CC_ARM +#include +#include +#endif +#include +#include +#include + +/*---------------------------------------------------------------------------- + Checksum options + *----------------------------------------------------------------------------*/ +#if defined (__CC_ARM) +__attribute__ ((at(0x000001A0u))) +#elif defined(__ICCARM__) +__root +#endif +const uint32_t SECTION_PLACE(blank_checksum[],".checksum") = +{ + BLANKX60,BLANKX600 +}; + +/*---------------------------------------------------------------------------- + A relocated IVT is requested. Provision for IVT relocation + to RAM during startup. This allows for dynamic interrupt + vector patching required by RTOS. Places the relocated IVT + at the start of RAM. We need (72 + 15 + 1)*4 = 352 bytes, + which address 0x20000000. +*----------------------------------------------------------------------------*/ +#ifdef __ICCARM__ +void (*__Relocated___Vectors[NVIC_NUM_VECTORS])(void) @(NVIC_RAM_VECTOR_ADDRESS); +#else +void (*__Relocated___Vectors[NVIC_NUM_VECTORS])(void) __attribute__((at(NVIC_RAM_VECTOR_ADDRESS))); +#endif /* __ICCARM__ */ + +/*---------------------------------------------------------------------------- + External function Declaration + *----------------------------------------------------------------------------*/ +extern void SramInit(void); + +/*---------------------------------------------------------------------------- + Exception / Interrupt Handler + *----------------------------------------------------------------------------*/ +WEAK_FUNCTION( NMI_Handler ) +WEAK_FUNCTION( HardFault_Handler ) +WEAK_FUNCTION( MemManage_Handler ) +WEAK_FUNCTION( BusFault_Handler ) +WEAK_FUNCTION( UsageFault_Handler ) +WEAK_FUNCTION( SVC_Handler ) +WEAK_FUNCTION( DebugMon_Handler ) +WEAK_FUNCTION( PendSV_Handler ) +WEAK_FUNCTION( SysTick_Handler ) +WEAK_FUNCTION( RTC1_Int_Handler ) +WEAK_FUNCTION( Ext_Int0_Handler ) +WEAK_FUNCTION( Ext_Int1_Handler ) +WEAK_FUNCTION( Ext_Int2_Handler ) +WEAK_FUNCTION( Ext_Int3_Handler ) +WEAK_FUNCTION( WDog_Tmr_Int_Handler ) +WEAK_FUNCTION( Vreg_over_Int_Handler ) +WEAK_FUNCTION( Battery_Voltage_Int_Handler) +WEAK_FUNCTION( RTC0_Int_Handler ) +WEAK_FUNCTION( GPIO_A_Int_Handler ) +WEAK_FUNCTION( GPIO_B_Int_Handler ) +WEAK_FUNCTION( GP_Tmr0_Int_Handler ) +WEAK_FUNCTION( GP_Tmr1_Int_Handler ) +WEAK_FUNCTION( Flash0_Int_Handler ) +WEAK_FUNCTION( UART0_Int_Handler ) +WEAK_FUNCTION( SPI0_Int_Handler ) +WEAK_FUNCTION( SPI2_Int_Handler ) +WEAK_FUNCTION( I2C0_Slave_Int_Handler ) +WEAK_FUNCTION( I2C0_Master_Int_Handler ) +WEAK_FUNCTION( DMA_Err_Int_Handler ) +WEAK_FUNCTION( DMA_SPIH_TX_Int_Handler ) +WEAK_FUNCTION( DMA_SPIH_RX_Int_Handler ) +WEAK_FUNCTION( DMA_SPORT0A_Int_Handler ) +WEAK_FUNCTION( DMA_SPORT0B_Int_Handler ) +WEAK_FUNCTION( DMA_SPI0_TX_Int_Handler ) +WEAK_FUNCTION( DMA_SPI0_RX_Int_Handler ) +WEAK_FUNCTION( DMA_SPI1_TX_Int_Handler ) +WEAK_FUNCTION( DMA_SPI1_RX_Int_Handler ) +WEAK_FUNCTION( DMA_UART0_TX_Int_Handler ) +WEAK_FUNCTION( DMA_UART0_RX_Int_Handler ) +WEAK_FUNCTION( DMA_I2C0_STX_Int_Handler ) +WEAK_FUNCTION( DMA_I2C0_SRX_Int_Handler ) +WEAK_FUNCTION( DMA_I2C0_MX_Int_Handler ) +WEAK_FUNCTION( DMA_AES0_IN_Int_Handler ) +WEAK_FUNCTION( DMA_AES0_OUT_Int_Handler ) +WEAK_FUNCTION( DMA_FLASH0_Int_Handler ) +WEAK_FUNCTION( SPORT0A_Int_Handler ) +WEAK_FUNCTION( SPORT0B_Int_Handler ) +WEAK_FUNCTION( Crypto_Int_Handler ) +WEAK_FUNCTION( DMA_ADC0_Int_Handler ) +WEAK_FUNCTION( GP_Tmr2_Int_Handler ) +WEAK_FUNCTION( Crystal_osc_Int_Handler ) +WEAK_FUNCTION( SPI1_Int_Handler ) +WEAK_FUNCTION( PLL_Int_Handler ) +WEAK_FUNCTION( RNG_Int_Handler ) +WEAK_FUNCTION( Beep_Int_Handler ) +WEAK_FUNCTION( ADC0_Int_Handler ) +WEAK_FUNCTION( DMA_SIP0_Int_Handler ) +WEAK_FUNCTION( DMA_SIP1_Int_Handler ) +WEAK_FUNCTION( DMA_SIP2_Int_Handler ) +WEAK_FUNCTION( DMA_SIP3_Int_Handler ) +WEAK_FUNCTION( DMA_SIP4_Int_Handler ) +WEAK_FUNCTION( DMA_SIP5_Int_Handler ) +WEAK_FUNCTION( DMA_SIP6_Int_Handler ) +WEAK_FUNCTION( DMA_SIP7_Int_Handler ) +WEAK_FUNCTION( UART1_Int_Handler ) +WEAK_FUNCTION( DMA_UART1_TX_Int_Handler ) +WEAK_FUNCTION( DMA_UART1_RX_Int_Handler ) +WEAK_FUNCTION( RGB_Tmr_Int_Handler ) +WEAK_FUNCTION( Root_Clk_Err_Handler ) + +/*---------------------------------------------------------------------------- + Exception / Interrupt Vector table + *----------------------------------------------------------------------------*/ +const pFunc SECTION_PLACE(IVT_NAME[104],VECTOR_SECTION) = { + (pFunc) INITIAL_SP, /* Initial Stack Pointer */ + ADUCM4050_VECTORS +}; + +/*---------------------------------------------------------------------------- +* Initialize .bss and .data for GNU +*----------------------------------------------------------------------------*/ +#if defined( __GNUC__) && !defined (__CC_ARM) +void zero_bss(void) +{ + uint32_t *pSrc, *pDest; + uint32_t *pTable __attribute__((unused)); +#ifdef __STARTUP_COPY_MULTIPLE + /* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + pTable = &__copy_table_start__; + + for (; pTable < &__copy_table_end__; pTable = pTable + 3) { + pSrc = (uint32_t*)*(pTable + 0); + pDest = (uint32_t*)*(pTable + 1); + for (; pDest < (uint32_t*)(*(pTable + 1) + *(pTable + 2)) ; ) { + *pDest++ = *pSrc++; + } + } +#else + /* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + pSrc = &__etext; + pDest = &__data_start__; + + for ( ; pDest < &__data_end__ ; ) { + *pDest++ = *pSrc++; + } +#endif /*__STARTUP_COPY_MULTIPLE */ + + /* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE + /* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + pTable = &__zero_table_start__; + + for (; pTable < &__zero_table_end__; pTable = pTable + 2) { + pDest = (uint32_t*)*(pTable + 0); + for (; pDest < (uint32_t*)(*(pTable + 0) + *(pTable + 1)) ; ) { + *pDest++ = 0; + } + } +#elif defined (__STARTUP_CLEAR_BSS) + /* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + pDest = &__bss_start__; + + for ( ; pDest < &__bss_end__ ; ) { + *pDest++ = 0ul; + } +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ +} +#endif + +/*---------------------------------------------------------------------------- +* Function : Reset_Handler (-15) +* Description : Reset event handler +*----------------------------------------------------------------------------*/ +void Reset_Handler(void) +{ + /* Initialize SRAM configuration. */ + SramInit(); + +#if defined(__GNUC__) && !defined (__CC_ARM) + zero_bss(); +#endif + + /* Setup system. */ + SystemInit(); + + /* Call remaining startup code and then main. */ + RESET_EXCPT_HNDLR(); +} + +/*---------------------------------------------------------------------------- + Default Handler for Exceptions / Interrupts + *----------------------------------------------------------------------------*/ +#if defined(__CC_ARM) || defined (__GNUC__) +void Default_Handler(void) +{ + while(1); +} +#endif + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/device/startup_ADuCM4050.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/device/startup_ADuCM4050.h new file mode 100755 index 0000000000..98da5428c3 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/device/startup_ADuCM4050.h @@ -0,0 +1,236 @@ +/*! +***************************************************************************** + * @file: startup_ADuCM4050.h + * @brief: CMSIS Cortex-M4 Core Peripheral Access Layer Header File for + * ADI ADuCxxx Device Series + * @version: $Revision: $ + * @date: $Date: $ + *----------------------------------------------------------------------------- + * +Copyright (c) 2010-2017 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *****************************************************************************/ + +/* +WEAK_FUNC(func) + If this is available for a compiler, apply whatever attributes are needed + to a function definition ("func") to flag that the function is a "weak" one. +VECTOR_SECTION + A particular setup may have a requirement that the vector table be placed + in a particular section. This specifies the name of that section +RESET_EXCPT_HNDLR + A particular setup may have a requirement for a different reset handler. + This specifies the name of that handler. +*/ + +#ifndef __STARTUP_H__ +#define __STARTUP_H__ + +#include +#define VECTOR_SECTION ".vectors" +#ifdef __CC_ARM +extern unsigned Image$$ADUCM_HEAP$$Base[]; +extern unsigned Image$$ADUCM_HEAP$$ZI$$Limit[]; +void Default_Handler(void); +#define SECTION_NAME(sectionname) __attribute__ ((section(sectionname))) +#define SECTION_PLACE(def,sectionname) def __attribute__ ((section(sectionname))) +#define IVT_NAME __Vectors +#define RESET_EXCPT_HNDLR __main +#define COMPILER_NAME "ARMCC" +#define WEAK_FUNCTION(x) void x (void) __attribute__ ((weak, alias("Default_Handler"))); +#elif defined(__ICCARM__) +/* +* IAR MISRA C 2004 error suppressions: +* +* Pm093 (rule 18.4): use of union - overlapping storage shall not be used. +* Required for interrupt vector table entries. +* +* Pm140 (rule 11.3): a cast should not be performed between a pointer type and an integral type +* The rule makes an exception for memory-mapped register accesses. +*/ +#pragma diag_suppress=Pm093,Pm140 +#define SECTION_PLACE(def,sectionname) def @ sectionname +#define SECTION_NAME(sectionname) def @ sectionname +#define IVT_NAME __vector_table +#define WEAK_FUNC(func) __weak func +#define RESET_EXCPT_HNDLR __iar_program_start +#define COMPILER_NAME "ICCARM" +#define WEAK_FUNCTION(x) WEAK_FUNC ( void x (void)) { while(1){} } +#elif defined(__GNUC__) +extern unsigned __etext; +extern unsigned __data_start__; +extern unsigned __data_end__; +extern unsigned __copy_table_start__; +extern unsigned __copy_table_end__; +extern unsigned __zero_table_start__; +extern unsigned __zero_table_end__; +extern unsigned __bss_start__; +extern unsigned __bss_end__; +extern unsigned __StackTop; +void Default_Handler(void); +/*---------------------------------------------------------------------------- + External References + *----------------------------------------------------------------------------*/ +#ifndef __START +extern void _start(void) __attribute__((noreturn)); /* PreeMain (C library entry point) */ +#define RESET_EXCPT_HNDLR _start +#else +extern int __START(void) __attribute__((noreturn)); /* main entry point */ +#define RESET_EXCPT_HNDLR __START +#endif +#ifndef __STACK_SIZE +#define __STACK_SIZE 0x00000400 +#endif +#if !defined(__HEAP_SIZE) || (__HEAP_SIZE <= 0) +#define __HEAP_SIZE 0x00000C00 +#endif +#define SECTION_NAME(sectionname) __attribute__ ((section(sectionname))) +#define SECTION_PLACE(def,sectionname) def __attribute__ ((section(sectionname))) +#define IVT_NAME __Vectors +#define COMPILER_NAME "GNUC" +#define WEAK_FUNCTION(x) void x (void) __attribute__ ((weak, alias("Default_Handler"))); +#define __STARTUP_CLEAR_BSS_MULTIPLE +#endif // __GNUC__ +#define LASTCRCPAGE 0 +#define BLANKX4 0xFFFFFFFF +#define BLANKX20 BLANKX4,BLANKX4,BLANKX4,BLANKX4,BLANKX4,BLANKX4,BLANKX4,BLANKX4 +#define BLANKX100 BLANKX20,BLANKX20,BLANKX20,BLANKX20,BLANKX20,BLANKX20,BLANKX20,BLANKX20 +#define BLANKX600 BLANKX100,BLANKX100,BLANKX100,BLANKX100,BLANKX100,BLANKX100 +#define BLANKX60 BLANKX20,BLANKX20,BLANKX20 +void RESET_EXCPT_HNDLR(void); +void Reset_Handler(void); +/* IVT typedefs. */ +typedef void( *pFunc )( void ); + +#define ADUCM4050_VECTORS \ + /* Configure Initial Stack Pointer, using linker-generated symbols */\ + Reset_Handler, /* -15 */ \ + NMI_Handler, /* -14 */ \ + HardFault_Handler, /* -13 */ \ + MemManage_Handler, /* -12 */ \ + BusFault_Handler, /* -11 */ \ + UsageFault_Handler, /* -10 */ \ + 0, /* -9 */ \ + 0, /* -8 */ \ + 0, /* -7 */ \ + 0, /* -6 */ \ + SVC_Handler, /* -5 */ \ + DebugMon_Handler, /* -4 */ \ + 0, /* -3 */ \ + PendSV_Handler, /* -2 */ \ + SysTick_Handler, /* -1 */ \ + /* External interrupts */ \ + RTC1_Int_Handler, /* 0 */ \ + Ext_Int0_Handler, /* 1 */ \ + Ext_Int1_Handler, /* 2 */ \ + Ext_Int2_Handler, /* 3 */ \ + Ext_Int3_Handler, /* 4 */ \ + WDog_Tmr_Int_Handler, /* 5 */ \ + Vreg_over_Int_Handler, /* 6 */ \ + Battery_Voltage_Int_Handler, /* 7 */ \ + RTC0_Int_Handler, /* 8 */ \ + GPIO_A_Int_Handler, /* 9 */ \ + GPIO_B_Int_Handler, /* 10 */ \ + GP_Tmr0_Int_Handler, /* 11 */ \ + GP_Tmr1_Int_Handler, /* 12 */ \ + Flash0_Int_Handler, /* 13 */ \ + UART0_Int_Handler, /* 14 */ \ + SPI0_Int_Handler, /* 15 */ \ + SPI2_Int_Handler, /* 16 */ \ + I2C0_Slave_Int_Handler, /* 17 */ \ + I2C0_Master_Int_Handler, /* 18 */ \ + DMA_Err_Int_Handler, /* 19 */ \ + DMA_SPIH_TX_Int_Handler, /* 20 */ \ + DMA_SPIH_RX_Int_Handler, /* 21 */ \ + DMA_SPORT0A_Int_Handler, /* 22 */ \ + DMA_SPORT0B_Int_Handler, /* 23 */ \ + DMA_SPI0_TX_Int_Handler, /* 24 */ \ + DMA_SPI0_RX_Int_Handler, /* 25 */ \ + DMA_SPI1_TX_Int_Handler, /* 26 */ \ + DMA_SPI1_RX_Int_Handler, /* 27 */ \ + DMA_UART0_TX_Int_Handler, /* 28 */ \ + DMA_UART0_RX_Int_Handler, /* 29 */ \ + DMA_I2C0_STX_Int_Handler, /* 30 */ \ + DMA_I2C0_SRX_Int_Handler, /* 31 */ \ + DMA_I2C0_MX_Int_Handler, /* 32 */ \ + DMA_AES0_IN_Int_Handler, /* 33 */ \ + DMA_AES0_OUT_Int_Handler, /* 34 */ \ + DMA_FLASH0_Int_Handler, /* 35 */ \ + SPORT0A_Int_Handler, /* 36 */ \ + SPORT0B_Int_Handler, /* 37 */ \ + Crypto_Int_Handler, /* 38 */ \ + DMA_ADC0_Int_Handler, /* 39 */ \ + GP_Tmr2_Int_Handler, /* 40 */ \ + Crystal_osc_Int_Handler, /* 41 */ \ + SPI1_Int_Handler, /* 42 */ \ + PLL_Int_Handler, /* 43 */ \ + RNG_Int_Handler, /* 44 */ \ + Beep_Int_Handler, /* 45 */ \ + ADC0_Int_Handler, /* 46 */ \ + 0, /* 47 */ \ + 0, /* 48 */ \ + 0, /* 49 */ \ + 0, /* 50 */ \ + 0, /* 51 */ \ + 0, /* 52 */ \ + 0, /* 53 */ \ + 0, /* 54 */ \ + 0, /* 55 */ \ + DMA_SIP0_Int_Handler, /* 56 */ \ + DMA_SIP1_Int_Handler, /* 57 */ \ + DMA_SIP2_Int_Handler, /* 58 */ \ + DMA_SIP3_Int_Handler, /* 59 */ \ + DMA_SIP4_Int_Handler, /* 60 */ \ + DMA_SIP5_Int_Handler, /* 61 */ \ + DMA_SIP6_Int_Handler, /* 62 */ \ + DMA_SIP7_Int_Handler, /* 63 */ \ + 0, /* 64 */ \ + 0, /* 65 */ \ + UART1_Int_Handler, /* 66 */ \ + DMA_UART1_TX_Int_Handler, /* 67 */ \ + DMA_UART1_RX_Int_Handler, /* 68 */ \ + RGB_Tmr_Int_Handler, /* 69 */ \ + 0, /* 70 */ \ + Root_Clk_Err_Handler, /* 71 */ \ + 0,0,0,0,0,0,0,0, /* 72 - 79 */ \ + (pFunc)BLANKX4, (pFunc)BLANKX4, /* security_options */ \ + (pFunc)BLANKX4, (pFunc)BLANKX4, \ + (pFunc)0xA79C3203u, (pFunc)LASTCRCPAGE, \ + (pFunc)BLANKX4, (pFunc)BLANKX4 /* 80 - 87 */ + +#endif /* __STARTUP_H__ */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/device/system_ADuCM4050.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/device/system_ADuCM4050.c new file mode 100755 index 0000000000..df75af10d2 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/device/system_ADuCM4050.c @@ -0,0 +1,322 @@ +/**************************************************************************//** + * @file system_ADuCM4050.c + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer Source File for + * Device ADuCM4x50 + * @version V3.10 + * @date 23. November 2012 + * + ******************************************************************************/ +/* Copyright (c) 2012 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + Portions Copyright (c) 2016 - 2017 Analog Devices, Inc. + ---------------------------------------------------------------------------*/ + +#include +#include +#include + +/*---------------------------------------------------------------------------- + Define clocks + *----------------------------------------------------------------------------*/ +#ifdef ADI_DEBUG +/* only needed in debug mode */ +uint32_t lfClock = 0u; /* "lf_clk" coming out of LF mux */ +#endif + +/*---------------------------------------------------------------------------- + Clock Variable definitions + *----------------------------------------------------------------------------*/ +/* Note that these variables will be re-initialized to the value set here by the + LIBC startup code, so if other clock values are required, make sure set them + here. +*/ +uint32_t hfClock = __HFOSC; /* "root_clk" output of HF mux */ +uint32_t gpioClock = 0u; /* external GPIO clock */ +uint32_t SystemCoreClock = __HFOSC; /*!< System Clock Frequency (Core Clock) */ + + +/*---------------------------------------------------------------------------- + Clock functions + *----------------------------------------------------------------------------*/ + +/*! + * Update the clock. + * + * @param none + * @return none + * + * @brief Updates the variable SystemCoreClock and must be called whenever + * the core clock is changed during program execution. + */ +void SystemCoreClockUpdate(void) +{ + uint32_t val, nDivisor, nMulfactor, div2, mul2; + +#ifdef ADI_DEBUG + /* "lfclock" is only used during debug checks... */ + /* LF clock is always 32k, whether osc or xtal */ + lfClock = __LFCLK; /* for beep, wdt and lcd */ + if (lfClock == 0u) { + while (1) {} + } +#endif + /* Update Core Clock sources */ + /* update the HF clock */ + switch (pADI_CLKG0_CLK->CTL0 & BITM_CLKG_CLK_CTL0_CLKMUX ) { + + case HFMUX_INTERNAL_OSC_VAL: + hfClock = __HFOSC; + break; + + case HFMUX_EXTERNAL_XTAL_VAL: + hfClock = __HFXTAL; + break; + + case HFMUX_SYSTEM_SPLL_VAL: + /* Calculate System PLL output frequency */ + if ((pADI_CLKG0_CLK->CTL0 & BITM_CLKG_CLK_CTL0_PLL_IPSEL) != 0u) { + /* PLL input from HFXTAL */ + val = __HFXTAL; + } else { + /* PLL input from HFOSC */ + val = __HFOSC; + } + + /* PLL NSEL multiplier */ + nMulfactor = (pADI_CLKG0_CLK->CTL3 & BITM_CLKG_CLK_CTL3_SPLLNSEL) >> BITP_CLKG_CLK_CTL3_SPLLNSEL; + /* PLL MSEL divider */ + nDivisor = (pADI_CLKG0_CLK->CTL3 & BITM_CLKG_CLK_CTL3_SPLLMSEL) >> BITP_CLKG_CLK_CTL3_SPLLMSEL; + + /* PLL NSEL multiplier */ + mul2 = (pADI_CLKG0_CLK->CTL3 & BITM_CLKG_CLK_CTL3_SPLLMUL2) >> BITP_CLKG_CLK_CTL3_SPLLMUL2; + /* PLL MSEL divider */ + div2 = (pADI_CLKG0_CLK->CTL3 & BITM_CLKG_CLK_CTL3_SPLLDIV2) >> BITP_CLKG_CLK_CTL3_SPLLDIV2; + + val = ((val << mul2) * nMulfactor / nDivisor) >> div2; + + hfClock = val; + break; + + case HFMUX_GPIO_VAL: + hfClock = gpioClock; + break; + + default: + return; + } /* end switch */ + + SystemCoreClock = hfClock; +} + +/*! + * Configure the SRAM banks + * + * @return none + * + * @brief Setup the SRAM banks. + * Initialize the SRAM configuration and retention. + */ +void SramInit(void) +{ + /* On reset, there is no SRAM retention. Any retention has to be explicitly + * set here. */ + adi_system_EnableRetention(ADI_SRAM_BANK_1 | + ADI_SRAM_BANK_3 | + ADI_SRAM_BANK_4 | + ADI_SRAM_BANK_5 | + ADI_SRAM_BANK_6 | + ADI_SRAM_BANK_7, true); + /* To disable the instruction SRAM and entire 64K of SRAM is used as DSRAM */ + adi_system_EnableISRAM(false); + /* To disable the instruction cache */ + adi_system_EnableCache(false); +} + +/*! + * Initialize the system + * + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System and update the relocate vector table. + */ +void SystemInit (void) +{ + uint32_t IntStatus; + + IntStatus = __get_PRIMASK(); + __disable_irq(); + + /* Set boot ROM IVT. */ + SCB->VTOR = (uint32_t)NVIC_FLASH_VECTOR_ADDRESS; + + /* Set all three (USGFAULTENA, BUSFAULTENA, and MEMFAULTENA) fault enable bits + * in the System Control Block, System Handler Control and State Register + * otherwise these faults are handled as hard faults. + */ + SCB->SHCSR = SCB_SHCSR_USGFAULTENA_Msk | + SCB_SHCSR_BUSFAULTENA_Msk | + SCB_SHCSR_MEMFAULTENA_Msk ; + +#if (__FPU_PRESENT == 1u) && (__FPU_USED == 1u) + /* the FPU is disabled by default so enable FPU (NEON and VFP) + * set the System Control Block, Coprocessor Access Control Register bits: + * CP10 = grant CP10 coprocessor privileges and user mode access (full access) + * CP11 = grant CP11 coprocessor privileged and user mode access (full access) + * (CP10 and CP11 MUST be the same or "BEHAVIOR IS UNPREDICTABLE") + */ + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 for Full Access */ +#endif + + /* Flush instruction and data pipelines to insure assertion of new settings. */ + __ISB(); + __DSB(); + + adi_pwr_Init(); + adi_pwr_SetClockDivider(ADI_CLOCK_HCLK,1); + adi_pwr_SetClockDivider(ADI_CLOCK_PCLK,1); + + /* Set up the LF clock MUX. Currently LFXTAL is unstable so use the + internal LF Oscillator instead. LFXTAL is still required to be enabled + as it is required by RTC0. This LFXTAL issue is going to be fixed + in the next revision of the silicon. */ + adi_pwr_EnableClockSource(ADI_CLOCK_SOURCE_LFXTAL,true); + adi_pwr_SetLFClockMux(ADI_CLOCK_MUX_LFCLK_LFOSC); + adi_pwr_EnableClockSource(ADI_CLOCK_SOURCE_LFOSC,true); + + __set_PRIMASK(IntStatus); +} + +/*! + * @brief Enables or disables the cache. + * @param bEnable Specify whether to enable/disable cache. + * - true : Enable cache. + * - false: Disable cache. + * @return none + */ +void adi_system_EnableCache(bool bEnable) +{ + pADI_FLCC0_CACHE->KEY = CACHE_CONTROLLER_KEY; + if( bEnable == true ) { + pADI_FLCC0_CACHE->SETUP |= BITM_FLCC_CACHE_SETUP_ICEN; + } else { + pADI_FLCC0_CACHE->SETUP &= ~BITM_FLCC_CACHE_SETUP_ICEN; + } +} + +/*! + * @brief This enables or disables instruction SRAM + * + * @param bEnable Enable/disable the instruction SRAM. + * - true : Enable instruction SRAM. + * - false : Disable instruction SRAM. + * @return none + * @note The appropriate linker file needs to support the configuration. + */ +void adi_system_EnableISRAM(bool bEnable) +{ + + if( bEnable == true ) { + pADI_PMG0_TST->SRAM_CTL |= BITM_PMG_TST_SRAM_CTL_INSTREN; + } else { + pADI_PMG0_TST->SRAM_CTL &= ~BITM_PMG_TST_SRAM_CTL_INSTREN; + } +} + +/*! + * @brief This enables/disable SRAM retention during the hibernation. + * @param eBank: Specify which SRAM banks. Multiple banks can be set + / using a logical OR of the banks. + * @param bEnable Enable/disable the retention for specified SRAM bank. + * - true : Enable retention during hibernation. + * - false: Disable retention during hibernation. + * @return ADI_SYS_SUCCESS Configured successfully. + * @return ADI_SYS_FAILURE Invalid bank, or banks, specified. Any incorrect + * or invalid bank options will result in failure and + * no changes will have been applied. + * @note The appropriate linker file needs to support the configuration. + * BANK 0 is always retained. + * BANKS 1 can be retained individually. + * BANK 2 is never retained. + * BANKS 3 and 4 can only be mutually retained. + * BANKS 5 can be retained individually. + * BANKS 6 and 7 can only be mutually retained. + */ +ADI_SYS_RESULT adi_system_EnableRetention(ADI_SRAM_BANK eBank, bool bEnable) +{ + uint32_t retainBits = 0u; + +#ifdef ADI_DEBUG + if((0u != (eBank & ADI_SRAM_BANK_0)) || + (0u != (eBank & ADI_SRAM_BANK_2))) { + /* Banks 0 and 2 are not selectable */ + return ADI_SYS_FAILURE; + } + + /* Are banks 3 or 4 selected? */ + if(0u != (eBank & (ADI_SRAM_BANK_3 | ADI_SRAM_BANK_4))) { + /* If so, the only valid option is for both to be retained. */ + if((eBank & (ADI_SRAM_BANK_3 | ADI_SRAM_BANK_4)) != (ADI_SRAM_BANK_3 | ADI_SRAM_BANK_4)) { + return ADI_SYS_FAILURE; + } + } + + /* Are banks 6 or 7 selected? */ + if(0u != (eBank & (ADI_SRAM_BANK_6 | ADI_SRAM_BANK_7))) { + /* If so, the only valid option is for both to be retained */ + if((eBank & (ADI_SRAM_BANK_6 | ADI_SRAM_BANK_7)) != (ADI_SRAM_BANK_6 | ADI_SRAM_BANK_7)) { + return ADI_SYS_FAILURE; + } + } +#endif + if((eBank & ADI_SRAM_BANK_1) != 0u) { + retainBits |= BITM_PMG_SRAMRET_RET1; + } + if((eBank & (ADI_SRAM_BANK_3 | ADI_SRAM_BANK_4)) != 0u) { + retainBits |= BITM_PMG_SRAMRET_RET2; + } + if((eBank & ADI_SRAM_BANK_5) != 0u) { + retainBits |= BITM_PMG_SRAMRET_RET3; + } + if((eBank & (ADI_SRAM_BANK_6 | ADI_SRAM_BANK_7)) != 0u) { + retainBits |= BITM_PMG_SRAMRET_RET4; + } + + /* Unlock the SRAMRET register using the PWRKEY. + * If there is any chance that this sequence can be interrupted then it + * should be protected by disabling interrupts. A write to any other + * register on the APB bus before writing to PMG_SRAMRET will return the + * protection to the lock state. */ + pADI_PMG0->PWRKEY = PWRKEY_VALUE_KEY; + if(bEnable) { + pADI_PMG0->SRAMRET |= retainBits; + } else { + pADI_PMG0->SRAMRET &= ~(retainBits); + } + + return ADI_SYS_SUCCESS; +} diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TOOLCHAIN_ARM_STD/ADuCM4050.sct b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TOOLCHAIN_ARM_STD/ADuCM4050.sct new file mode 100755 index 0000000000..0f7791ae5e --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TOOLCHAIN_ARM_STD/ADuCM4050.sct @@ -0,0 +1,52 @@ +;****************************************************************************** +; File: ADuCM4050.sct +; Scatter loading file for Analog Devices ADuCM4050 processor +; +; Copyright (c) 2011 - 2014 ARM LIMITED +; Copyright (c) 2016 - 2017 Analog Devices, Inc. +; +; All rights reserved. +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions are met: +; - Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; - Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in the +; documentation and/or other materials provided with the distribution. +; - Neither the name of ARM nor the names of its contributors may be used +; to endorse or promote products derived from this software without +; specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +; ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE +; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +; POSSIBILITY OF SUCH DAMAGE. +;****************************************************************************** +LR_IROM1 0x00000000 0x0007F000 { + FLASH0 0x00000000 0x00000800 { + *(.vectors, +First) + *(.checksum) + } + + ER_IROM1 AlignExpr(ImageLimit(FLASH0), 16) 0x0007E800 { + ; load address = execution address + *(InRoot$$Sections) + *(+RO) + } + + RW_IRAM1 0x20040000 EMPTY 0 { } + + ADUCM_IRAM2 0x20000200 0x7E00 { *(+RW) } + + ADUCM_IRAM3 0x20048000 0x10000 { *(+ZI) } + + ADUCM_HEAP AlignExpr(ImageLimit(RW_IRAM1), 16) EMPTY + (ImageBase(ADUCM_IRAM3) - 0x2000 - AlignExpr(ImageLimit(RW_IRAM1), 16)) { } ; heap +} diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TOOLCHAIN_GCC_ARM/ADuCM4050.ld b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TOOLCHAIN_GCC_ARM/ADuCM4050.ld new file mode 100755 index 0000000000..2ead54a157 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TOOLCHAIN_GCC_ARM/ADuCM4050.ld @@ -0,0 +1,214 @@ +/* + * Portions Copyright (c) 2016 Analog Devices, Inc. + * + * Based on Device/ARM/ARMCM4/Source/GCC/gcc_arm.ld file in + * ARM.CMSIS.4.5.0.pack. + */ + +/* Linker script to configure memory regions. */ +MEMORY +{ + /* The first 0x800 bytes of flash */ + FLASH0 (rx) : ORIGIN = 0x00000000, LENGTH = 0x800 + /* The remaining bytes of flash minus 4KB Protected Key Storage */ + FLASH (rx) : ORIGIN = 0x00000800, LENGTH = 512k - 4k - 0x800 + /* SRAM bank 0 */ + DSRAM_A (rwx) : ORIGIN = 0x20000200, LENGTH = 32k - 0x200 + /* SRAM bank 3+4+5+6+7 */ + DSRAM_B (rwx) : ORIGIN = 0x20048000, LENGTH = 64k + /* stack must not be in bank 1,2,7 where ISRAM or CACHE + are set at power on */ +} + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* Custom stack and heap sizes */ +__stack_size__ = 0x2000; +__heap_size__ = 0x6000; + +/* select custom or default sizes for stack and heap */ +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400; +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0C00; + + +/* Linker script to place sections and symbol values. + * It references the following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines the following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __Vectors_End + * __Vectors_Size + */ +ENTRY(Reset_Handler) + +SECTIONS +{ + .vectors : + { + KEEP(*(.vectors)) + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + KEEP(*(.checksum)) + } > FLASH0 + + .security_options : + { + . = ALIGN(4); + KEEP(*(.security_options)) + . = ALIGN(4); + } > FLASH0 + + .text : + { + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */ + /* + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + LONG (__etext) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + LONG (__etext2) + LONG (__data2_start__) + LONG (__data2_end__ - __data2_start__) + __copy_table_end__ = .; + } > FLASH + */ + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */ + + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + LONG (__bss2_start__) + LONG (__bss2_end__ - __bss2_start__) + __zero_table_end__ = .; + } > FLASH + + + __etext = .; + + .data : AT (__etext) + { + __data_start__ = .; + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + + } > DSRAM_A + + .bss : + { + . = ALIGN(16); + __bss2_start__ = .; + *(COMMON) + . = ALIGN(16); + __bss2_end__ = .; + __bss_start__ = .; + *(.bss*) + . = ALIGN(16); + __bss_end__ = .; + } > DSRAM_B + + __StackTop = ORIGIN(DSRAM_B); + __StackLimit = __StackTop - STACK_SIZE; + __HeapLimit = __StackLimit; + __HeapBase = __HeapLimit - HEAP_SIZE; + __end__ = __HeapBase; + PROVIDE(end = __end__); + PROVIDE(__stack = __StackTop); +} diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TOOLCHAIN_IAR/ADuCM4050.icf b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TOOLCHAIN_IAR/ADuCM4050.icf new file mode 100755 index 0000000000..318ad52023 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TOOLCHAIN_IAR/ADuCM4050.icf @@ -0,0 +1,48 @@ +/****************************************************************************** +* File: ADuCM4050.icf +* ILINK Configuration File for Analog Devices ADuCM4050 processor +* +* Copyright (c) 2011 - 2014 ARM LIMITED +* Copyright (c) 2016 - 2017 Analog Devices, Inc. +* +* All rights reserved. +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* - Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* - Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* - Neither the name of ARM nor the names of its contributors may be used +* to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +******************************************************************************/ +define memory mem with size = 4G; +define region ROM_PAGE0_INTVEC = mem:[from 0x00000000 size 0x000001A0]; +define region ROM_PAGE0_CHECKSUM = mem:[from 0x000001A0 size 0x00000660]; +define region ROM_REGION = mem:[from 0x00000800 size 506K]; +define region RAM_bank1_region = mem:[from 0x20040000 size 0x00008000]; +define region RAM_bank2_region = mem:[from 0x20000200 size 0x00007E00] + | mem:[from 0x20048000 size 0x00010000]; +define block CSTACK with alignment = 16, size = 0x2000 { }; +define block HEAP with alignment = 16, size = 0x6000 { }; +do not initialize { section .noinit }; +initialize by copy { rw }; +place at start of ROM_PAGE0_INTVEC { ro section .vectors }; +place in ROM_PAGE0_CHECKSUM { ro section .checksum }; +place in ROM_REGION { ro }; +place at end of RAM_bank1_region { block CSTACK }; +place at start of RAM_bank1_region { block HEAP }; +place in RAM_bank2_region { rw }; diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/PeripheralPins.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/PeripheralPins.c new file mode 100755 index 0000000000..8257894757 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/PeripheralPins.c @@ -0,0 +1,138 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +/* + The ADuCM4050 is made in two package variants. + + 64 lead LFCSP & 72 ball WLCSP + + There are some differences for Port 2 between the two variants + WLCSP also has Port 3. + + The #define ADUCM4050_LFCSP is used to determine which variant the code + is built for. + + For LFCSP leave the #define in, to build for ADUCM4050_WLCSP remove. +*/ +#define ADUCM4050_LFCSP + +#include "PeripheralPins.h" + +/************UART***************/ +const PinMap PinMap_UART_TX[] = { + {P0_10, UART_0, 1}, + {P1_15, UART_1, 2}, + {NC, NC, 0} +}; + +const PinMap PinMap_UART_RX[] = { + {P0_11, UART_0, 1}, + {P2_00, UART_1, 2}, + {NC, NC, 0} +}; + +/************SPI***************/ +const PinMap PinMap_SPI_SCLK[] = { + {P0_00, SPI_0, 1}, + {P1_06, SPI_1, 1}, + {P1_02, SPI_2, 1}, + {NC, NC, 0} +}; + +const PinMap PinMap_SPI_MOSI[] = { + {P0_01, SPI_0, 1}, + {P1_07, SPI_1, 1}, + {P1_03, SPI_2, 1}, + {NC, NC, 0} +}; + +const PinMap PinMap_SPI_MISO[] = { + {P0_02, SPI_0, 1}, + {P1_08, SPI_1, 1}, + {P1_04, SPI_2, 1}, + {NC, NC, 0} +}; + +#if defined(ADUCM4050_LFCSP) +const PinMap PinMap_SPI_SSEL[] = { + {P0_03, SPI_0, 1}, + {P1_09, SPI_1, 1}, + {P2_10, SPI_2, 1}, + {NC, NC, 0} +}; +#else +const PinMap PinMap_SPI_SSEL[] = { + {P0_03, SPI_0, 1}, + {P1_09, SPI_1, 1}, + {P2_15, SPI_2, 1}, + {NC, NC, 0} +}; +#endif + +/************I2C***************/ +const PinMap PinMap_I2C_SDA[] = { + {P0_05, I2C_0, 1}, + {NC, NC, 0} +}; + +const PinMap PinMap_I2C_SCL[] = { + {P0_04, I2C_0, 1}, + {NC, NC, 0} +}; + +/************ADC***************/ +const PinMap PinMap_ADC[] = { + {P2_03, ADC0_VIN0, 1}, + {P2_04, ADC0_VIN1, 1}, + {P2_05, ADC0_VIN2, 1}, + {P2_06, ADC0_VIN3, 1}, + {P2_07, ADC0_VIN4, 1}, + {P2_08, ADC0_VIN5, 1}, + {P2_09, ADC0_VIN6, 1}, +#ifdef ADUCM4050_LFCSP + {P2_10, ADC0_VIN7, 1}, +#endif + {NC, NC, 0} +}; + +/************RTC***************/ +const PinMap PinMap_RTC[] = { + {NC, OSC32KCLK, 0}, +}; diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/PeripheralPins.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/PeripheralPins.h new file mode 100755 index 0000000000..40ef7f85b1 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/PeripheralPins.h @@ -0,0 +1,67 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#ifndef MBED_PERIPHERALPINS_H +#define MBED_PERIPHERALPINS_H + +#include "pinmap.h" +#include "PeripheralNames.h" + +/************RTC***************/ +extern const PinMap PinMap_RTC[]; + +/************ADC***************/ +extern const PinMap PinMap_ADC[]; + +/************I2C***************/ +extern const PinMap PinMap_I2C_SDA[]; +extern const PinMap PinMap_I2C_SCL[]; + +/************UART***************/ +extern const PinMap PinMap_UART_TX[]; +extern const PinMap PinMap_UART_RX[]; + +/************SPI***************/ +extern const PinMap PinMap_SPI_SCLK[]; +extern const PinMap PinMap_SPI_MOSI[]; +extern const PinMap PinMap_SPI_MISO[]; +extern const PinMap PinMap_SPI_SSEL[]; + +#endif diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/analogin_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/analogin_api.c new file mode 100755 index 0000000000..d007006439 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/analogin_api.c @@ -0,0 +1,216 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "mbed_assert.h" +#include "analogin_api.h" + +#if DEVICE_ANALOGIN + +#include "adi_adc_def.h" +#include "pinmap.h" +#include "PeripheralPins.h" + +/** Analogin hal structure. analogin_s is declared in the target's hal + */ +typedef struct analogin_s analogin_t; + +#ifdef __cplusplus +extern "C" { +#endif + +/* ADC Device number */ +#define ADC_DEV_NUM (0u) + +/* Memory Required for adc driver */ +static uint32_t DeviceMemory[(ADI_ADC_MEMORY_SIZE+3)/4]; +/* Active channel */ +static uint32_t adi_pin2channel(PinName pin); + +/** + * \defgroup hal_analogin Analogin hal functions + * @{ + */ + +/** Initialize the analogin peripheral + * + * Configures the pin used by analogin. + * @param obj The analogin object to initialize + * @param pin The analogin pin name + */ +void analogin_init(analogin_t *obj, PinName pin) +{ + ADI_ADC_HANDLE hDevice; + bool bCalibrationDone = false; + bool bReady = false; + + ADCName peripheral; + uint32_t function, channel; + + peripheral = (ADCName)pinmap_peripheral(pin, &PinMap_ADC[0]); // gives peripheral + MBED_ASSERT(peripheral != (ADCName)NC); + + /* verify read function */ + function = pinmap_function(pin, &PinMap_ADC[0]); + MBED_ASSERT(function == 1); + + /* Configure PORT2_MUX registers */ + pin_function(pin, function); + + /* Configure active channel */ + channel = adi_pin2channel(pin); + MBED_ASSERT(channel != 0xFFFFFFFF); + obj->UserBuffer.nChannels = channel; + + /* Open the ADC device */ + adi_adc_Open(ADC_DEV_NUM, DeviceMemory, sizeof(DeviceMemory),&hDevice); + obj->hDevice = hDevice; + + /* Power up ADC */ + adi_adc_PowerUp (hDevice, true); + + /* Set ADC reference */ + adi_adc_SetVrefSource (hDevice, ADI_ADC_VREF_SRC_INT_2_50_V); + + /* Enable ADC sub system */ + adi_adc_EnableADCSubSystem (hDevice, true); + + /* Wait untilthe ADC is ready for sampling */ + while(bReady == false) { + adi_adc_IsReady (hDevice, &bReady); + } + + /* Start calibration */ + adi_adc_StartCalibration (hDevice); + + /* Wait until calibration is done */ + while (!bCalibrationDone) { + adi_adc_IsCalibrationDone (hDevice, &bCalibrationDone); + } + + /* Set the delay time */ + adi_adc_SetDelayTime ( hDevice, obj->DelayCycles); + + /* Set the acquisition time. (Application need to change it based on the impedence) */ + adi_adc_SetAcquisitionTime ( hDevice, obj->SampleCycles); + +} + +/** Read the input voltage, represented as a float in the range [0.0, 1.0] + * + * @param obj The analogin object + * @return A floating value representing the current input voltage + */ +float analogin_read(analogin_t *obj) +{ + float fl32 = (float)analogin_read_u16(obj)/(float)4095.0; + + return(fl32); +} + +/** Read the value from analogin pin, represented as an unsigned 16bit value + * + * @param obj The analogin object + * @return An unsigned 16bit value representing the current input voltage + */ +uint16_t analogin_read_u16(analogin_t *obj) +{ + ADI_ADC_HANDLE hDevice = obj->hDevice; + ADI_ADC_BUFFER *pAdcBuffer; + + /* Submit the buffer to the driver */ + adi_adc_SubmitBuffer (hDevice, &obj->UserBuffer); + + /* Enable the ADC */ + adi_adc_Enable (hDevice, true); + + adi_adc_GetBuffer (hDevice, &pAdcBuffer); + MBED_ASSERT(pAdcBuffer == &obj->UserBuffer); + + return( (uint16_t) ( ((uint16_t *)pAdcBuffer->pDataBuffer)[(pAdcBuffer->nNumConversionPasses) - 1]) ); +} + +/* Retrieve te active channel correspondoing to the input pin */ +static uint32_t adi_pin2channel(PinName pin) +{ + + uint32_t activech; + + switch(pin) { + case ADC_VIN0: + activech = ADI_ADC_CHANNEL_0; + break; + case ADC_VIN1: + activech = ADI_ADC_CHANNEL_1; + break; + case ADC_VIN2: + activech = ADI_ADC_CHANNEL_2; + break; + case ADC_VIN3: + activech = ADI_ADC_CHANNEL_3; + break; + case ADC_VIN4: + activech = ADI_ADC_CHANNEL_4; + break; + case ADC_VIN5: + activech = ADI_ADC_CHANNEL_5; + break; + case ADC_VIN6: + activech = ADI_ADC_CHANNEL_6; + break; + case ADC_VIN7: + activech = ADI_ADC_CHANNEL_7; + break; + default: + activech = (uint32_t) 0xFFFFFFFF; + break; + } + + return((uint32_t) activech); +} + + + +/**@}*/ + +#ifdef __cplusplus +} +#endif + +#endif // #if DEVICE_ANALOGIN diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/cmsis.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/cmsis.h new file mode 100755 index 0000000000..2d2850cc2e --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/cmsis.h @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#ifndef MBED_CMSIS_H +#define MBED_CMSIS_H +#define __C +#include "adi_processor.h" +#include "cmsis_nvic.h" +#endif diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/cmsis_nvic.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/cmsis_nvic.h new file mode 100755 index 0000000000..3a866a5d72 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/cmsis_nvic.h @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#ifndef MBED_CMSIS_NVIC_H +#define MBED_CMSIS_NVIC_H + +#include "cmsis.h" + +#define NVIC_USER_IRQ_OFFSET 16 +#define NVIC_USER_IRQ_NUMBER 72 +#define NVIC_NUM_VECTORS (NVIC_USER_IRQ_OFFSET + NVIC_USER_IRQ_NUMBER) + +#define NVIC_RAM_VECTOR_ADDRESS 0x20000000 +#define NVIC_FLASH_VECTOR_ADDRESS 0x0 + +#ifdef __cplusplus +extern "C" { +#endif + +/** Set the ISR for IRQn + * + * Sets an Interrupt Service Routine vector for IRQn; if the feature is available, the vector table is relocated to SRAM + * the first time this function is called + * @param[in] IRQn The Interrupt Request number for which a vector will be registered + * @param[in] vector The ISR vector to register for IRQn + */ +void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector); + +/** Get the ISR registered for IRQn + * + * Reads the Interrupt Service Routine currently registered for IRQn + * @param[in] IRQn The Interrupt Request number the vector of which will be read + * @return Returns the ISR registered for IRQn + */ +uint32_t NVIC_GetVector(IRQn_Type IRQn); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/device.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/device.h new file mode 100755 index 0000000000..0d46738ec1 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/device.h @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#ifndef MBED_DEVICE_H +#define MBED_DEVICE_H + +#define DEVICE_ID_LENGTH 24 + +#include "objects.h" + +#endif diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/flash_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/flash_api.c new file mode 100755 index 0000000000..25afcc193f --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/flash_api.c @@ -0,0 +1,89 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#ifdef DEVICE_FLASH +#include "flash_api.h" +#include "flash_data.h" +#include "mbed_critical.h" + +// This file is automagically generated + +// This is a flash algo binary blob. It is PIC (position independent code) that should be stored in RAM + +static unsigned FLASH_ALGO[] = { + 0x20004A4B,0x60111E41,0x6211494A,0x60912107,0x074B6811,0xF011D5FC,0xD0000F30,0x21002001, + 0x47706211,0x2400B510,0xD1082A01,0xF872F000,0x6D09493F,0xD00207C8,0xFFE2F7FF,0x46204604, + 0x493BBD10,0x62082000,0xB5104770,0xF862F000,0x4010E8BD,0x4601E7D4,0x20004A35,0x60131E43, + 0x49346191,0x21066211,0x68116091,0xD5FC074B,0x0F30F011,0x2001D000,0x62112100,0xB57C4770, + 0x4B2C4C2B,0x62232500,0xF04FE03E,0x602333FF,0xD3042908,0x61236813,0x61636853,0xF04FE025, + 0xE9CD33FF,0x29083300,0xE8DFD21A,0x1619F001,0x0A0D1013,0x79910407,0x1006F88D,0xF88D7951, + 0x79111005,0x1004F88D,0xF88D78D1,0x78911003,0x1002F88D,0xF88D7851,0x78111001,0x1000F88D, + 0x1300E9DD,0x61636121,0x60E02108,0x60A32304,0xF0136823,0xD0010F30,0xE0072501,0x075B6823, + 0x3008D5FC,0x32083908,0xD1BE2900,0x62202000,0xBD7C4628,0x21004806,0x4A066041,0x4A066202, + 0x22046342,0x22016382,0x62016542,0x00004770,0x40018000,0x676C7565,0xB8950950,0 +}; + +static const flash_algo_t flash_algo_config = { + .init = 0x00000025, + .uninit = 0x00000043, + .erase_sector = 0x00000057, + .program_page = 0x0000007F, + .static_base = 0x0000013C, + .algo_blob = FLASH_ALGO +}; + +static const sector_info_t sectors_info[] = { + {0x0, 0x800}, +}; + +static const flash_target_config_t flash_target_config = { + .page_size = 0x800, + .flash_start = 0x0, + .flash_size = 0x0007F000, + .sectors = sectors_info, + .sector_info_count = sizeof(sectors_info) / sizeof(sector_info_t) +}; + +void flash_set_target_config(flash_t *obj) +{ + obj->flash_algo = &flash_algo_config; + obj->target_config = &flash_target_config; +} +#endif diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_api.c new file mode 100755 index 0000000000..c338d84275 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_api.c @@ -0,0 +1,144 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "mbed_assert.h" +#include "gpio_api.h" +#include "pinmap.h" +#include "adi_gpio.h" + + +#define MUX_FUNC_0 0x0 +#define NUM_GPIO_PORTS 4 + +extern uint8_t gpioMemory[ADI_GPIO_MEMORY_SIZE]; +extern uint8_t gpio_initialized; + +static uint16_t gpio_oen[NUM_GPIO_PORTS] = {0}; +static uint16_t gpio_output_val[NUM_GPIO_PORTS] = {0}; + + +/****************************************************************************** + Function definitions + *****************************************************************************/ +uint32_t gpio_set(PinName pin) +{ + MBED_ASSERT(pin != (PinName)NC); + uint32_t pin_num = pin & 0xFF; + + pin_function(pin, MUX_FUNC_0); + + return (1 << pin_num); +} + +void gpio_init(gpio_t *obj, PinName pin) +{ + obj->pin = pin; + + if (pin == (PinName)NC) + return; + + // Initialize the GPIO driver. This function + // initializes the GPIO driver only once globally. + if (!gpio_initialized) + adi_gpio_Init(gpioMemory, ADI_GPIO_MEMORY_SIZE); + + pin_function(pin, MUX_FUNC_0); +} + +void gpio_mode(gpio_t *obj, PinMode mode) +{ + uint32_t pin = obj->pin; + + pin_mode((PinName)pin, mode); +} + +void gpio_dir(gpio_t *obj, PinDirection direction) +{ + MBED_ASSERT(obj->pin != (PinName)NC); + uint32_t port = obj->pin >> GPIO_PORT_SHIFT; + uint32_t pin_num = obj->pin & 0xFF; + + if (direction == PIN_OUTPUT) { + adi_gpio_OutputEnable((ADI_GPIO_PORT)port, 1 << pin_num, true); + // save the input/output configuration + gpio_oen[port] |= (1 << pin_num); + } else { + adi_gpio_InputEnable((ADI_GPIO_PORT)port, 1 << pin_num, true); + // save the input/output configuration + gpio_oen[port] &= (~(1 << pin_num)); + } +} + +void gpio_write(gpio_t *obj, int value) +{ + MBED_ASSERT(obj->pin != (PinName)NC); + uint32_t port = obj->pin >> GPIO_PORT_SHIFT; + uint32_t pin_num = obj->pin & 0xFF; + + if (value & 1) { + adi_gpio_SetHigh((ADI_GPIO_PORT)port, (1 << pin_num)); + + // save the output port value + gpio_output_val[port] |= ((value & 1) << pin_num); + } else { + adi_gpio_SetLow((ADI_GPIO_PORT)port, (1 << pin_num)); + + // save the output port value + gpio_output_val[port] &= (~(1 << pin_num)); + } +} + + +int gpio_read(gpio_t *obj) +{ + MBED_ASSERT(obj->pin != (PinName)NC); + uint32_t port = obj->pin >> GPIO_PORT_SHIFT; + uint32_t pin_num = obj->pin & 0xFF; + uint16_t Data; + + // check whether the pin is configured as input or output + if ((gpio_oen[port] >> pin_num) & 1) + Data = gpio_output_val[port] & (1 << pin_num); + else + // otherwise call GetData + adi_gpio_GetData((ADI_GPIO_PORT)port, (1 << pin_num), &Data); + + return ((((uint32_t)Data) >> pin_num) & 1); +} diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_dev_mem.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_dev_mem.c new file mode 100755 index 0000000000..5e0d99ad8b --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_dev_mem.c @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include + +// ADI GPIO device driver state memory. Only one state memory is required globally. +uint8_t gpioMemory[ADI_GPIO_MEMORY_SIZE]; + +// Flag to indicate whether the GPIO driver has been initialized +uint8_t gpio_initialized = 0; diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_irq_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_irq_api.c new file mode 100755 index 0000000000..ae5b8234c3 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_irq_api.c @@ -0,0 +1,317 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "gpio_irq_api.h" +#include "adi_gpio.h" +#include "adi_gpio_def.h" + +#ifdef DEVICE_INTERRUPTIN + +#define MAX_GPIO_LINES 16 +#define MAX_GPIO_PORTS ADI_GPIO_NUM_PORTS + +typedef struct { + unsigned int id; + gpio_irq_event event; + uint8_t int_enable; +} gpio_chan_info_t; + +extern uint8_t gpioMemory[ADI_GPIO_MEMORY_SIZE]; +extern uint8_t gpio_initialized; +static gpio_chan_info_t channel_ids[MAX_GPIO_PORTS][MAX_GPIO_LINES]; +static gpio_irq_handler irq_handler = NULL; + + +/** Local interrupt callback routine. + */ +static void gpio_irq_callback(void *pCBParam, uint32_t Event, void *pArg) +{ + uint16_t pin = *(ADI_GPIO_DATA*)pArg; + int index = 0; + + // determine the index of the pin that caused the interrupt + while (pin) { + if (pin & 0x01) { + // call the user ISR. The argument Event is the port number of the GPIO line. + if (irq_handler != NULL) + irq_handler((uint32_t)channel_ids[Event][index].id, channel_ids[Event][index].event); + } + index++; + pin >>= 1; + } +} + + +/** Function to get the IENA and IENB register values. + * Added here based on code from ADuCM302x + */ +static ADI_GPIO_RESULT adi_gpio_GetGroupInterruptPins(const ADI_GPIO_PORT Port, const IRQn_Type eIrq, + const ADI_GPIO_DATA Pins, uint16_t* const pValue) +{ + ADI_GPIO_TypeDef *pReg[ADI_GPIO_NUM_PORTS] = {pADI_GPIO0, pADI_GPIO1, pADI_GPIO2, pADI_GPIO3}; + ADI_GPIO_TypeDef *pPort; /* pointer to port registers */ + uint16_t Value = 0u; + + pPort = pReg[Port]; + + switch (eIrq) { + case SYS_GPIO_INTA_IRQn: + Value = pPort->IENA; + break; + case SYS_GPIO_INTB_IRQn: + Value = pPort->IENB; + break; + default: + break; /* This shall never reach */ + } + + *pValue = (Value & Pins); + return (ADI_GPIO_SUCCESS); +} + + +/** Function to get the interrupt polarity register content. + * Added here based on code from ADuCM302x + */ +static ADI_GPIO_RESULT adi_gpio_GetGroupInterruptPolarity(const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins, + uint16_t* const pValue) +{ + ADI_GPIO_TypeDef *pPort; /* pointer to port registers */ + ADI_GPIO_TypeDef *pReg[ADI_GPIO_NUM_PORTS] = {pADI_GPIO0, pADI_GPIO1, pADI_GPIO2, pADI_GPIO3}; + + pPort = pReg[Port]; + + *pValue = (pPort->POL & Pins); + + return (ADI_GPIO_SUCCESS); +} + + +/** Function to clear the relevant interrupt enable bits in both the IENA and IENB registers + * for the given GPIO pin. + */ +static void disable_pin_interrupt(ADI_GPIO_PORT port, uint32_t pin_number) +{ + uint16_t int_reg_val; + + // Read the current content of the IENA register + adi_gpio_GetGroupInterruptPins(port, SYS_GPIO_INTA_IRQn, 1 << pin_number, &int_reg_val); + + // clear the bit for the pin + int_reg_val &= ~(1 << pin_number); + + // write the interrupt register + adi_gpio_SetGroupInterruptPins(port, SYS_GPIO_INTA_IRQn, int_reg_val); + + // Do the same to IENB + adi_gpio_GetGroupInterruptPins(port, SYS_GPIO_INTB_IRQn, 1 << pin_number, &int_reg_val); + + // clear the bit for the pin + int_reg_val &= ~(1 << pin_number); + + // write the interrupt register + adi_gpio_SetGroupInterruptPins(port, SYS_GPIO_INTB_IRQn, int_reg_val); +} + + +/** Function to set the relevant interrupt enable bits in either the IENA and IENB registers + * for the given GPIO pin. + */ +static void enable_pin_interrupt(ADI_GPIO_PORT port, uint32_t pin_number, IRQn_Type eIrq) +{ + uint16_t int_reg_val; + + // Read the current interrupt enable register content + adi_gpio_GetGroupInterruptPins(port, eIrq, 1 << pin_number, &int_reg_val); + + // set the bit for the pin + int_reg_val |= (1 << pin_number); + + // write the interrupt register + adi_gpio_SetGroupInterruptPins(port, eIrq, int_reg_val); +} + + +/** Initialize the GPIO IRQ pin + * + * @param obj The GPIO object to initialize + * @param pin The GPIO pin name + * @param handler The handler to be attached to GPIO IRQ + * @param id The object ID (id != 0, 0 is reserved) + * @return -1 if pin is NC, 0 otherwise + */ +int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id) +{ + uint32_t port = pin >> GPIO_PORT_SHIFT; + uint32_t pin_num = pin & 0xFF; + + // check for valid pin and ID + if ((pin == NC) || (id == 0)) + return -1; + + // make sure gpio driver has been initialized + if (!gpio_initialized) { + adi_gpio_Init(gpioMemory,ADI_GPIO_MEMORY_SIZE); + gpio_initialized = 1; + } + + // save the handler + if (handler) + irq_handler = handler; + + // disable the interrupt for the given pin + disable_pin_interrupt((ADI_GPIO_PORT)port, pin_num); + + // set the port pin as input + adi_gpio_InputEnable(port, 1 << pin_num, true); + + // save the ID for future reference + channel_ids[port][pin_num].id = id; + channel_ids[port][pin_num].event = IRQ_NONE; + channel_ids[port][pin_num].int_enable = 0; + obj->id = id; + obj->pinname = pin; + + return 0; +} + +/** Release the GPIO IRQ PIN + * + * @param obj The gpio object + */ +void gpio_irq_free(gpio_irq_t *obj) +{ + uint32_t port = obj->pinname >> GPIO_PORT_SHIFT; + uint32_t pin_num = obj->pinname & 0xFF; + + // disable interrupt for the given pin + gpio_irq_disable(obj); + + // clear the status table + channel_ids[port][pin_num].id = 0; + channel_ids[port][pin_num].event = IRQ_NONE; + channel_ids[port][pin_num].int_enable = 0; +} + +/** Enable/disable pin IRQ event + * + * @param obj The GPIO object + * @param event The GPIO IRQ event + * @param enable The enable flag + */ +void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) +{ + uint16_t int_polarity_reg; + uint32_t port = obj->pinname >> GPIO_PORT_SHIFT; + uint32_t pin_num = obj->pinname & 0xFF; + + if (event == IRQ_NONE) + return; + + // read the current polarity register + adi_gpio_GetGroupInterruptPolarity((ADI_GPIO_PORT)port, 1 << pin_num, &int_polarity_reg); + + if (event == IRQ_RISE) + int_polarity_reg |= (1 << pin_num); + else + int_polarity_reg &= ~(1 << pin_num); + + // set the polarity register + adi_gpio_SetGroupInterruptPolarity((ADI_GPIO_PORT)port, int_polarity_reg); + + channel_ids[port][pin_num].event = event; + + // enable interrupt for this pin if enable flag is set + if (enable) + gpio_irq_enable(obj); + else + gpio_irq_disable(obj); +} + +/** Enable GPIO IRQ + * + * This is target dependent, as it might enable the entire port or just a pin + * @param obj The GPIO object + */ +void gpio_irq_enable(gpio_irq_t *obj) +{ + uint32_t port = obj->pinname >> GPIO_PORT_SHIFT; + uint32_t pin_num = obj->pinname & 0xFF; + + if (channel_ids[port][pin_num].event == IRQ_NONE) + return; + + // Group all RISE interrupts in INTA and FALL interrupts in INTB + if (channel_ids[port][pin_num].event == IRQ_RISE) { + // set the callback routine + adi_gpio_RegisterCallback(SYS_GPIO_INTA_IRQn, gpio_irq_callback, obj); + enable_pin_interrupt((ADI_GPIO_PORT)port, pin_num, SYS_GPIO_INTA_IRQn); + } else if (channel_ids[port][pin_num].event == IRQ_FALL) { + // set the callback routine + adi_gpio_RegisterCallback(SYS_GPIO_INTB_IRQn, gpio_irq_callback, obj); + enable_pin_interrupt((ADI_GPIO_PORT)port, pin_num, SYS_GPIO_INTB_IRQn); + } + + channel_ids[port][pin_num].int_enable = 1; +} + +/** Disable GPIO IRQ + * + * This is target dependent, as it might disable the entire port or just a pin + * @param obj The GPIO object + */ +void gpio_irq_disable(gpio_irq_t *obj) +{ + uint32_t port = obj->pinname >> GPIO_PORT_SHIFT; + uint32_t pin_num = obj->pinname & 0xFF; + + if (channel_ids[port][pin_num].event == IRQ_NONE) + return; + + // Group all RISE interrupts in INTA and FALL interrupts in INTB + if (channel_ids[port][pin_num].event == IRQ_RISE) + disable_pin_interrupt((ADI_GPIO_PORT)port, pin_num); + else if (channel_ids[port][pin_num].event == IRQ_FALL) + disable_pin_interrupt((ADI_GPIO_PORT)port, pin_num); + + channel_ids[port][pin_num].int_enable = 0; +} + +#endif // #ifdef DEVICE_INTERRUPTIN diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_object.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_object.h new file mode 100755 index 0000000000..8d59616b7f --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_object.h @@ -0,0 +1,61 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#ifndef MBED_GPIO_OBJECT_H +#define MBED_GPIO_OBJECT_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PinName pin; +} gpio_t; + +static inline int gpio_is_connected(const gpio_t *obj) +{ + return obj->pin != (PinName)NC; +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/i2c_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/i2c_api.c new file mode 100755 index 0000000000..7a883ff245 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/i2c_api.c @@ -0,0 +1,238 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "mbed_assert.h" +#include "i2c_api.h" + +#if DEVICE_I2C + +#include "cmsis.h" +#include "pinmap.h" +#include "mbed_error.h" +#include "PeripheralPins.h" +#include "drivers/i2c/adi_i2c.h" + + + +#if defined(BUILD_I2C_MI_DYNAMIC) +#if defined(ADI_DEBUG) +#warning "BUILD_I2C_MI_DYNAMIC is defined. Memory allocation for I2C will be dynamic" +int adi_i2c_memtype = 0; +#endif +#else +static uint8_t i2c_Mem[ADI_I2C_MEMORY_SIZE]; +static ADI_I2C_HANDLE i2c_Handle; +#if defined(ADI_DEBUG) +#warning "BUILD_I2C_MI_DYNAMIC is NOT defined. Memory allocation for I2C will be static" +int adi_i2c_memtype = 1; +#endif +#endif + + + +void i2c_init(i2c_t *obj, PinName sda, PinName scl) +{ + uint32_t i2c_sda = pinmap_peripheral(sda, PinMap_I2C_SDA); + uint32_t i2c_scl = pinmap_peripheral(scl, PinMap_I2C_SCL); + ADI_I2C_HANDLE *pI2C_Handle; + uint8_t *I2C_Mem; + ADI_I2C_RESULT I2C_Return = ADI_I2C_SUCCESS; + uint32_t I2C_DevNum = I2C_0; /* ADuCM4050 only has 1 I2C port */ + + +#if defined(BUILD_I2C_MI_DYNAMIC) + I2C_DevNum = I2C_0; + pI2C_Handle = &obj->I2C_Handle; + obj->pI2C_Handle = pI2C_Handle; + I2C_Mem = obj->I2C_Mem; +#else + I2C_DevNum = I2C_0; + pI2C_Handle = &i2c_Handle; + obj->pI2C_Handle = pI2C_Handle; + I2C_Mem = &i2c_Mem[0]; +#endif + + + obj->instance = pinmap_merge(i2c_sda, i2c_scl); + MBED_ASSERT((int)obj->instance != NC); + pinmap_pinout(sda, PinMap_I2C_SDA); + pinmap_pinout(scl, PinMap_I2C_SCL); + SystemCoreClockUpdate(); + I2C_Return = adi_i2c_Open(I2C_DevNum, I2C_Mem, ADI_I2C_MEMORY_SIZE, pI2C_Handle); + if (I2C_Return) { + obj->error = I2C_EVENT_ERROR; + return; + } + I2C_Return = adi_i2c_Reset(*pI2C_Handle); + if (I2C_Return) { + obj->error = I2C_EVENT_ERROR; + return; + } +} + + +int i2c_start(i2c_t *obj) +{ + return 0; +} + + +int i2c_stop(i2c_t *obj) +{ + return 0; +} + + +void i2c_frequency(i2c_t *obj, int hz) +{ + ADI_I2C_HANDLE I2C_Handle; + ADI_I2C_RESULT I2C_Return = ADI_I2C_SUCCESS; + + + I2C_Handle = *obj->pI2C_Handle; + I2C_Return = adi_i2c_SetBitRate(I2C_Handle, (uint32_t) hz); + if (I2C_Return) { + obj->error = I2C_EVENT_ERROR; + return; + } +} + + +int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) +{ + ADI_I2C_RESULT I2C_Return; + ADI_I2C_TRANSACTION I2C_inst; + uint8_t I2C_PrologueData = 0x00; + uint32_t I2C_Errors; /* HW Error result */ + ADI_I2C_HANDLE I2C_Handle; + + + I2C_Handle = *obj->pI2C_Handle; + I2C_Return = adi_i2c_SetSlaveAddress(I2C_Handle, (address & 0x0000FFFF)); + I2C_inst.pPrologue = &I2C_PrologueData; + I2C_inst.nPrologueSize = 0; + I2C_inst.pData = (uint8_t*) data; + I2C_inst.nDataSize = length; + I2C_inst.bReadNotWrite = true; + I2C_inst.bRepeatStart = stop; + I2C_Return = adi_i2c_ReadWrite(I2C_Handle, &I2C_inst, &I2C_Errors); + if (I2C_Return) { + obj->error = I2C_EVENT_ERROR; + return -1; + } else { + return length; + } +} + + +int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) +{ + ADI_I2C_RESULT I2C_Return = ADI_I2C_SUCCESS; + ADI_I2C_TRANSACTION I2C_inst; + uint8_t I2C_PrologueData = 0x00; + uint32_t I2C_Errors; /* HW Error result */ + ADI_I2C_HANDLE I2C_Handle; + + + I2C_Handle = *obj->pI2C_Handle; + I2C_Return = adi_i2c_SetSlaveAddress(I2C_Handle, (address & 0x0000FFFF)); + I2C_inst.pPrologue = &I2C_PrologueData; + I2C_inst.nPrologueSize = 0; + I2C_inst.pData = (uint8_t*) data; + I2C_inst.nDataSize = length; + I2C_inst.bReadNotWrite = false; + I2C_inst.bRepeatStart = stop; + I2C_Return = adi_i2c_ReadWrite(I2C_Handle, &I2C_inst, &I2C_Errors); + if (I2C_Return) { + obj->error = I2C_EVENT_ERROR; + return -1; + } else { + return length; + } +} + + +void i2c_reset(i2c_t *obj) +{ + return; +} + + +int i2c_byte_read(i2c_t *obj, int last) +{ + return 0; +} + + +int i2c_byte_write(i2c_t *obj, int data) +{ + return 0; +} + + + +#if DEVICE_I2CSLAVE +void i2c_slave_mode(i2c_t *obj, int enable_slave) +{ + +} + +int i2c_slave_receive(i2c_t *obj) +{ + +} + +int i2c_slave_read(i2c_t *obj, char *data, int length) +{ + return length; +} + +int i2c_slave_write(i2c_t *obj, const char *data, int length) +{ + return length; +} + +void i2c_slave_address(i2c_t *obj, int idx, uint32_t address, uint32_t mask) +{ + +} +#endif // #if DEVICE_I2CSLAVE + +#endif // #if DEVICE_I2C diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/lp_ticker_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/lp_ticker_api.c new file mode 100755 index 0000000000..5d46471c4a --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/lp_ticker_api.c @@ -0,0 +1,269 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include +#include "lp_ticker_api.h" +#include +#include +#include "adi_rtc_def.h" + + +#ifdef DEVICE_LOWPOWERTIMER + +// define base LF clock frequncy in Hz +#define LFCLK_FREQUENCY_HZ 32768 +// RTC prescaler for the LF clock +#define RTC_PRESCALER 0 + +/* time for each tick of the LF clock in us */ +#define TIME_US_PER_TICK ((float)1000000/(float)(LFCLK_FREQUENCY_HZ>>RTC_PRESCALER)) + +// The number of RTC clock ticks it takes to set & enable the alarm +#define TICKS_TO_ENABLE_ALARM 10 + +// Mask to limit the value of the RTC value to 27 bits so the converted time in us fits +// in 32-bits +#define MAX_TICK_MASK ((1 << 27) - 1) + +static unsigned char rtc1_memory[ADI_RTC_MEMORY_SIZE]; +static ADI_RTC_HANDLE hRTC1_Device; + + +/** + * \defgroup hal_LpTicker Low Power Ticker Functions + * @{ + */ +/** + * Local stream-lined alarm setting function. + * + */ +static int set_rtc_alarm_interrupt(ADI_RTC_HANDLE const hDevice, uint32_t nAlarm) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + uint16_t cr0; + ADI_INT_STATUS_ALLOC(); + + // Section to enable interrupts + // The interrupt used is ADI_RTC_ALARM_INT + // Set the Alarm interrupt enable and Alarm enable bits in cr0 + cr0 = BITM_RTC_CR0_ALMEN | (1u << BITP_RTC_CR0_ALMINTEN); + + // Set the alarm value + /* Wait till previously posted write to Alram Register to complete */ + PEND_BEFORE_WRITE(SR1,(BITM_RTC_SR1_WPNDALM0|BITM_RTC_SR1_WPNDALM1)) + + ADI_ENTER_CRITICAL_REGION(); + /* Program the alarm count registers. */ + pDevice->pRTCRegs->ALM0 = (uint16_t)nAlarm; + pDevice->pRTCRegs->ALM1 = (uint16_t)(nAlarm >> 16); + pDevice->pRTCRegs->ALM2 = 0u; + ADI_EXIT_CRITICAL_REGION(); + + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR0,(BITM_RTC_SR0_WSYNCALM0|BITM_RTC_SR0_WSYNCALM1)) + + // Enable alarm + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR1,BITM_RTC_SR1_WPNDALM1|BITM_RTC_SR1_WPNDALM0) + + ADI_ENTER_CRITICAL_REGION(); + /* set RTC alarm and interrupt enable */ + pDevice->pRTCRegs->CR0 |= cr0; + ADI_EXIT_CRITICAL_REGION(); + + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR0,BITM_RTC_SR0_WSYNCCR0) + + return ADI_RTC_SUCCESS; +} + + + +/** + * Local RTC 1 ISR callback function. + * + */ +static void rtc1_Callback (void *pCBParam, uint32_t nEvent, void *EventArg) +{ + /* process RTC interrupts (cleared by driver) */ + if (ADI_RTC_ALARM_INT & nEvent) { + lp_ticker_irq_handler(); + } +} + + +/** Get low power ticker's data + * + * @return The low power ticker data + */ +/* +const ticker_data_t* get_lp_ticker_data() +{ +}*/ + + +/* HAL lp ticker */ + +/** Initialize the low power ticker + * + */ +void lp_ticker_init() +{ + // open the rtc device + adi_rtc_Open(1, rtc1_memory, ADI_RTC_MEMORY_SIZE, &hRTC1_Device); + + // set the prescaler value + adi_rtc_SetPreScale(hRTC1_Device, RTC_PRESCALER); + + // register call back for events + adi_rtc_RegisterCallback(hRTC1_Device, rtc1_Callback, hRTC1_Device); + + // reset the RTC counter + adi_rtc_SetCount(hRTC1_Device, 0); + + // set the trim value + adi_rtc_SetTrim(hRTC1_Device, ADI_RTC_TRIM_INTERVAL_14, ADI_RTC_TRIM_1, ADI_RTC_TRIM_SUB); + + adi_rtc_EnableTrim(hRTC1_Device, true); + + // enable the RTC + adi_rtc_Enable(hRTC1_Device, true); +} + +/** Read the current counter + * + * @return The current timer's counter value in microseconds + */ +uint32_t lp_ticker_read() +{ + uint32_t count; + float t; + + // get current count + adi_rtc_GetCount(hRTC1_Device, &count); + + // Throw away top 5 bits to avoid overflow and convert ticks to us + count &= MAX_TICK_MASK; + t = (float)count * TIME_US_PER_TICK; + + return (uint32_t)t; +} + +/** Set interrupt for specified timestamp + * + * @param timestamp The time in microseconds to be set + */ +void lp_ticker_set_interrupt(timestamp_t timestamp) +{ + uint32_t rtcCount, trunc_rtcCount, set_tick, tick_delta, alarm_tick; + + // compute the tick value based on the given alarm time + set_tick = (uint32_t)((float)(timestamp) / TIME_US_PER_TICK); + + // get current count + adi_rtc_GetCount(hRTC1_Device, &rtcCount); + + // compute the number of ticks required for the alarm + trunc_rtcCount = rtcCount & MAX_TICK_MASK; + + // if set_tick is less than the current RTC count, the counter has + // missed the desired time, so set tick_delta to 0 + if (set_tick >= trunc_rtcCount) { + tick_delta = set_tick - trunc_rtcCount; + } else { + tick_delta = 0; + } + + // compute the absolute RTC alarm count required + alarm_tick = rtcCount + tick_delta; + + // check if the desired alarm duration is less than TICKS_TO_ENABLE_ALARM, + // if so just wait it out rather than setting the alarm + if (tick_delta <= TICKS_TO_ENABLE_ALARM) { + // otherwise if the alarm time is less than the current RTC count + the time + // it takes to enable the alarm, just wait until the desired number of counts + // has expired rather than using the interrupt, then call the user ISR directly. + do { + adi_rtc_GetCount(hRTC1_Device, &rtcCount); + } while (rtcCount < alarm_tick); + + rtc1_Callback(NULL, ADI_RTC_ALARM_INT, NULL); + return; + } + + // set the alarm otherwise + set_rtc_alarm_interrupt(hRTC1_Device, alarm_tick); +} + +/** Disable low power ticker interrupt + * + */ +void lp_ticker_disable_interrupt() +{ + adi_rtc_EnableInterrupts(hRTC1_Device, ADI_RTC_ALARM_INT, false); +} + +/** Clear the low power ticker interrupt + * + */ +void lp_ticker_clear_interrupt() +{ + ADI_RTC_DEVICE *pDevice = hRTC1_Device; + + NVIC_ClearPendingIRQ(pDevice->eIRQn); + + return; +} + + +/** Set pending interrupt that should be fired right away. + * + * The ticker should be initialized prior calling this function. + */ +void lp_ticker_fire_interrupt(void) +{ + ADI_RTC_DEVICE *pDevice = hRTC1_Device; + + NVIC_SetPendingIRQ(pDevice->eIRQn); +} + + +#endif +/**@}*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/objects.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/objects.h new file mode 100755 index 0000000000..7b316f5c32 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/objects.h @@ -0,0 +1,112 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#ifndef MBED_OBJECTS_H +#define MBED_OBJECTS_H + +#include "cmsis.h" +#include "PeripheralNames.h" +#include "PinNames.h" +//#include "target_config.h" +#include "gpio_object.h" + +#include "adi_i2c.h" +#include "adi_spi.h" +#include "adi_adc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct gpio_irq_s { + unsigned int id; + PinName pinname; +}; + +struct sleep_s { + int temp; +}; + +struct serial_s { + int index; +}; + +struct trng_s { + uint8_t dummy; +}; + +#define BUILD_I2C_MI_DYNAMIC +struct i2c_s { + uint32_t instance; + uint32_t error; + ADI_I2C_HANDLE *pI2C_Handle; +#if defined(BUILD_I2C_MI_DYNAMIC) + ADI_I2C_HANDLE I2C_Handle; + uint8_t I2C_Mem[ADI_I2C_MEMORY_SIZE]; +#endif +}; + +#define BUILD_SPI_MI_DYNAMIC +struct spi_s { + uint32_t instance; + uint32_t error; + ADI_SPI_HANDLE *pSPI_Handle; +#if defined(BUILD_SPI_MI_DYNAMIC) + ADI_SPI_HANDLE SPI_Handle; + uint8_t SPI_Mem[ADI_SPI_MEMORY_SIZE]; +#endif +}; + +#include "gpio_object.h" + +struct analogin_s { + ADI_ADC_HANDLE hDevice; + ADI_ADC_BUFFER UserBuffer; + uint8_t DelayCycles; + uint8_t SampleCycles; +}; + + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/pinmap.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/pinmap.c new file mode 100755 index 0000000000..bb061e0ba4 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/pinmap.c @@ -0,0 +1,103 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "mbed_assert.h" +#include "pinmap.h" +#include "mbed_error.h" + +#include "PinNames.h" +#include "adi_gpio.h" + +void pin_function(PinName pin, int function) +{ + // pin is composed of port and pin + // function is the function number (the mux selection number shifted by the pin value + // and written to pin mux register, each pin mux takes 2 bits hence multiplying by 2) + + MBED_ASSERT(pin != (PinName)NC); + + uint8_t port = pin >> GPIO_PORT_SHIFT; + uint32_t cfg_reg, mask; + volatile uint32_t *pGPIO_CFG; + + switch (port) { + case 0: + pGPIO_CFG = (volatile uint32_t *)REG_GPIO0_CFG; + break; + case 1: + pGPIO_CFG = (volatile uint32_t *)REG_GPIO1_CFG; + break; + case 2: + pGPIO_CFG = (volatile uint32_t *)REG_GPIO2_CFG; + break; + + default: + return; + } + + cfg_reg = *pGPIO_CFG; + // clear the corresponding 2 bit field first before writing the function + // bits + mask = ~(3 << (pin * 2)); + cfg_reg = cfg_reg & mask | (function << (pin*2)); + *pGPIO_CFG = cfg_reg; +} + +void pin_mode(PinName pin, PinMode mode) +{ + MBED_ASSERT(pin != (PinName)NC); + + uint8_t port = pin >> GPIO_PORT_SHIFT; + uint32_t pin_reg_value = 2 ^ (0xFF & pin); + + switch (mode) { + case PullNone: + adi_gpio_PullUpEnable((ADI_GPIO_PORT)port, (ADI_GPIO_DATA) pin_reg_value,false); + break; + + case PullDown: + case PullUp: + adi_gpio_PullUpEnable((ADI_GPIO_PORT)port, (ADI_GPIO_DATA) pin_reg_value,true); + break; + + default: + break; + } +} diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/rtc_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/rtc_api.c new file mode 100755 index 0000000000..8b650705fc --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/rtc_api.c @@ -0,0 +1,94 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "rtc_api.h" + +#if DEVICE_RTC + +#include "adi_rtc.h" +#include "adi_pwr.h" + +#define RTC_DEVICE_NUM 0 +static uint8_t aRtcDevMem0[ADI_RTC_MEMORY_SIZE]; +static ADI_RTC_HANDLE hDevice0 = NULL; + + +void rtc_init(void) +{ + /* initialize driver */ + adi_rtc_Open(RTC_DEVICE_NUM,aRtcDevMem0,ADI_RTC_MEMORY_SIZE,&hDevice0); + + adi_rtc_Enable(hDevice0, true); +} + +void rtc_free(void) +{ + adi_rtc_Close(hDevice0); +} + +/* + * Little check routine to see if the RTC has been enabled + * 0 = Disabled, 1 = Enabled + */ +int rtc_isenabled(void) +{ + uint32_t ControlReg; + + adi_rtc_GetControl (hDevice0, ADI_RTC_CONTROL_REGISTER_0,&ControlReg); + + return((int) (ControlReg & BITM_RTC_CR0_CNTEN)); +} + +time_t rtc_read(void) +{ + time_t currentCount; + + adi_rtc_GetCount(hDevice0, (uint32_t *)(¤tCount)); + + return(currentCount); +} + +void rtc_write(time_t t) +{ + adi_rtc_SetCount (hDevice0, t); +} + +#endif // #if DEVICE_RTC + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c new file mode 100755 index 0000000000..8764be8803 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c @@ -0,0 +1,352 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "serial_api.h" + +#if DEVICE_SERIAL + +// math.h required for floating point operations for baud rate calculation +#include +#include "mbed_assert.h" + +#include + +#include "cmsis.h" +#include "pinmap.h" +#include "PeripheralPins.h" +#include "drivers/uart/adi_uart.h" +#define ADI_UART_MEMORY_SIZE (ADI_UART_BIDIR_MEMORY_SIZE) +#define ADI_UART_NUM_DEVICES 2 + +static ADI_UART_HANDLE hDevice[ADI_UART_NUM_DEVICES]; +static uint32_t UartDeviceMem[ADI_UART_NUM_DEVICES][(ADI_UART_MEMORY_SIZE + 3)/4]; +static uint32_t serial_irq_ids[ADI_UART_NUM_DEVICES] = {0}; +static uart_irq_handler irq_handler = NULL; +int stdio_uart_inited = 0; +serial_t stdio_uart; +int rxbuffer[2]; +int txbuffer[2]; + +static void uart_callback(void *pCBParam, uint32_t Event, void *pArg) +{ + MBED_ASSERT(irq_handler); + serial_t *obj = pCBParam; + if (Event == ADI_UART_EVENT_TX_BUFFER_PROCESSED) + irq_handler(serial_irq_ids[obj->index], TxIrq); + else if (Event == ADI_UART_EVENT_RX_BUFFER_PROCESSED) + irq_handler(serial_irq_ids[obj->index], RxIrq); +} + + +void serial_free(serial_t *obj) +{ + adi_uart_Close(hDevice[obj->index]); +} + +void serial_baud(serial_t *obj, int baudrate) +{ + uint32_t uartdivc,uartdivm,uartdivn,uartosr; + + // figures based on PCLK of 26MHz + switch (baudrate) { + case 9600: + uartdivc= 28; + uartdivm= 3; + uartdivn= 46; + uartosr= 3; + break; + case 19200: + uartdivc= 14; + uartdivm= 3; + uartdivn= 46; + uartosr= 3; + break; + case 38400: + uartdivc= 07; + uartdivm= 3; + uartdivn= 46; + uartosr= 3; + break; + case 57600: + uartdivc= 14; + uartdivm= 1; + uartdivn= 15; + uartosr= 3; + break; + case 115200: + uartdivc= 03; + uartdivm= 2; + uartdivn= 719; + uartosr= 3; + break; + case 230400: + uartdivc= 03; + uartdivm= 1; + uartdivn= 359; + uartosr= 3; + break; + default: // default of 9600kbps + uartdivc= 28; + uartdivm= 3; + uartdivn= 46; + uartosr= 3; + break; + } + + adi_uart_ConfigBaudRate(hDevice[obj->index],uartdivc,uartdivm,uartdivn,uartosr); +} + +void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) +{ + int convertedparity = ADI_UART_NO_PARITY; + int convertedstopbits = ADI_UART_ONE_STOPBIT; + + if (stop_bits) + convertedstopbits = ADI_UART_ONE_AND_HALF_TWO_STOPBITS; + + if (parity == ParityOdd) + convertedparity = ADI_UART_ODD_PARITY; + else if (parity == ParityEven) + convertedparity = ADI_UART_EVEN_PARITY; + else if (parity == ParityForced1) + convertedparity = ADI_UART_ODD_PARITY_STICKY; + else if (parity == ParityForced0) + convertedparity = ADI_UART_EVEN_PARITY_STICKY; + + adi_uart_SetConfiguration(hDevice[obj->index], convertedparity, convertedstopbits, (data_bits - 5)); +} +#ifndef ADI_UART_TRANSFER_MODE + +void serial_init(serial_t *obj, PinName tx, PinName rx) +{ + uint32_t uart_tx = pinmap_peripheral(tx, PinMap_UART_TX); + uint32_t uart_rx = pinmap_peripheral(rx, PinMap_UART_RX); + obj->index = pinmap_merge(uart_tx, uart_rx); + MBED_ASSERT((int)obj->index != NC); + adi_uart_Open(obj->index,ADI_UART_DIR_BIDIRECTION,UartDeviceMem[obj->index],ADI_UART_MEMORY_SIZE,&hDevice[obj->index]); + serial_baud(obj, 9600); + serial_format(obj, 8, ParityNone, 1); + pinmap_pinout(tx, PinMap_UART_TX); + pinmap_pinout(rx, PinMap_UART_RX); + if (tx != NC) { + pin_mode(tx, PullUp); + } + if (rx != NC) { + pin_mode(rx, PullUp); + } + if (obj->index == STDIO_UART) { + stdio_uart_inited = 1; + memcpy(&stdio_uart, obj, sizeof(serial_t)); + } +} + +int serial_readable(serial_t *obj) +{ + bool bAvailable = false; + adi_uart_IsRxBufferAvailable(hDevice[obj->index], &bAvailable); + return bAvailable; +} + +int serial_getc(serial_t *obj) +{ + int c; + void *pBuff; + uint32_t pHwError; + adi_uart_SubmitRxBuffer(hDevice[obj->index], &rxbuffer[obj->index], 1, 1); + adi_uart_GetRxBuffer(hDevice[obj->index], &pBuff, &pHwError); + c = (unsigned) rxbuffer[obj->index]; + return (c); +} + +int serial_writable(serial_t *obj) +{ + bool bAvailable = false; + adi_uart_IsTxBufferAvailable(hDevice[obj->index], &bAvailable); + return bAvailable; +} + +void serial_putc(serial_t *obj, int c) +{ + void *pBuff; + uint32_t pHwError; + txbuffer[obj->index]= (char) c; + adi_uart_SubmitTxBuffer(hDevice[obj->index],&txbuffer[obj->index], 1, 1); + adi_uart_GetTxBuffer(hDevice[obj->index], &pBuff, &pHwError); + return; +} + +#else + +void serial_init(serial_t *obj, PinName tx, PinName rx) +{ + uint32_t uart_tx = pinmap_peripheral(tx, PinMap_UART_TX); + uint32_t uart_rx = pinmap_peripheral(rx, PinMap_UART_RX); + + obj->index = pinmap_merge(uart_tx, uart_rx); + MBED_ASSERT((int)obj->index != NC); + + adi_uart_Open(obj->index, ADI_UART_DIR_BIDIRECTION, UartDeviceMem[obj->index], ADI_UART_MEMORY_SIZE, &hDevice[obj->index]); + + serial_baud(obj, 9600); + serial_format(obj, 8, ParityNone, 1); + + pinmap_pinout(tx, PinMap_UART_TX); + pinmap_pinout(rx, PinMap_UART_RX); + + if (tx != NC) { + pin_mode(tx, PullUp); + } + + if (rx != NC) { + pin_mode(rx, PullUp); + } + + if (obj->index == STDIO_UART) { + stdio_uart_inited = 1; + memcpy(&stdio_uart, obj, sizeof(serial_t)); + } + + // set maximum FIFO depth + adi_uart_SetRxFifoTriggerLevel(hDevice[obj->index], ADI_UART_RX_FIFO_TRIG_LEVEL_14BYTE); + + // enable FIFO + adi_uart_EnableFifo(hDevice[obj->index], true); +} + +int serial_getc(serial_t *obj) +{ + int c; + uint32_t hwErr; + + adi_uart_Read(hDevice[obj->index], (void *) &c, 1, false, &hwErr); + return (c); +} + +void serial_putc(serial_t *obj, int c) +{ + uint32_t hwErr; + + adi_uart_Write(hDevice[obj->index], &c, 1, false, &hwErr); + return; +} + +int serial_readable(serial_t *obj) +{ + return 0; +} + +int serial_writable(serial_t *obj) +{ + return 0; +} +#endif +void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) +{ + MBED_ASSERT(obj); + + adi_uart_RegisterCallback(hDevice[obj->index], &uart_callback, obj); + if (enable) { + } else { + } +} + +void serial_pinout_tx(PinName tx) +{ + pinmap_pinout(tx, PinMap_UART_TX); +} + +void serial_break_set(serial_t *obj) +{ + adi_uart_ForceTxBreak(hDevice[obj->index], true); +} + +void serial_break_clear(serial_t *obj) +{ + adi_uart_ForceTxBreak(hDevice[obj->index], false); +} + +#if DEVICE_SERIAL_ASYNCH +uint8_t serial_tx_active(serial_t *obj) +{ + return 0; +} + +uint8_t serial_rx_active(serial_t *obj) +{ + return 0; +} + +int serial_irq_handler_asynch(serial_t *obj) +{ + return 0; +} + + + +int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx_width, uint32_t handler, uint32_t event, DMAUsage hint) +{ + return 0; +} + +void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_width, uint32_t handler, uint32_t event, uint8_t char_match, DMAUsage hint) +{ + +} + +void serial_tx_abort_asynch(serial_t *obj) +{ + +} + +void serial_rx_abort_asynch(serial_t *obj) +{ + +} +#endif +void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) +{ + + MBED_ASSERT(obj); + + irq_handler = handler; + serial_irq_ids[obj->index] = id; +} + +#endif diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/sleep.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/sleep.c new file mode 100755 index 0000000000..c323b51ca5 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/sleep.c @@ -0,0 +1,255 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include "sleep_api.h" + +#ifdef DEVICE_SLEEP + +#include "adi_pwr.h" +#include "adi_pwr_def.h" +#include "adi_rtos_map.h" +#include "adi_ADuCM4050_device.h" +#include "sleep.h" + +/** + * Function to put processor into sleep (FLEXI mode only). + */ +static void go_into_WFI(const ADI_PWR_POWER_MODE PowerMode) +{ + uint32_t savedPriority; + uint16_t savedWDT; + uint16_t ActiveWDT; + uint32_t scrSetBits = 0u; + uint32_t scrClrBits = 0u; + uint32_t IntStatus = 0u; + + /* pre-calculate the sleep-on-exit set/clear bits */ + scrSetBits |= SCB_SCR_SLEEPONEXIT_Msk; + + /* wfi without deepsleep or sleep-on-exit */ + scrClrBits |= (uint32_t)(BITM_NVIC_INTCON0_SLEEPDEEP | BITM_NVIC_INTCON0_SLEEPONEXIT); + + ADI_ENTER_CRITICAL_REGION(); + + { /* these lines must be in a success-checking loop if they are not inside critical section */ + /* Uninterruptable unlock sequence */ + pADI_PMG0->PWRKEY = ADI_PMG_KEY; + + /* Clear the previous mode and set new mode */ + pADI_PMG0->PWRMOD = (uint32_t) ( ( pADI_PMG0->PWRMOD & (uint32_t) (~BITM_PMG_PWRMOD_MODE) ) | PowerMode ); + } + + /* Update the SCR (sleepdeep and sleep-on-exit bits) */ + SCB->SCR = ((SCB->SCR | scrSetBits) & ~scrClrBits); + + /* save/restore current Base Priority Level */ + savedPriority = __get_BASEPRI(); + + /* assert caller's priority threshold (left-justified), currently set to 0, i.e. disable interrupt masking */ + __set_BASEPRI(0); + + /* save/restore WDT control register (which is not retained during hibernation) */ + savedWDT = pADI_WDT0->CTL; + + /* optimization: compute local WDT enable flag once (outside the loop) */ + ActiveWDT = ((savedWDT & BITM_WDT_CTL_EN) >> BITP_WDT_CTL_EN); + + /* SAR-51938: insure WDT is fully synchronized or looping on interrupts + in hibernate mode may lock out the sync bits. + + In hibernate mode (during which the WDT registers are not retained), + the WDT registers will have been reset to default values after each + interrupt exit and we require a WDT clock domain sync. + + We also need to insure a clock domain sync before (re)entering the WFI + in case an interrupt did a watchdog kick. + + Optimization: only incur WDT sync overhead (~100us) if the WDT is enabled. + */ + if (ActiveWDT > 0u) { + while ((pADI_WDT0->STAT & (uint32_t)(BITM_WDT_STAT_COUNTING | BITM_WDT_STAT_LOADING | BITM_WDT_STAT_CLRIRQ)) != 0u) { + ; + } + } + + __DSB(); /* bus sync to insure register writes from interrupt handlers are always complete before WFI */ + + /* NOTE: aggressive compiler optimizations can muck up critical timing here, so reduce if hangs are present */ + + /* The WFI loop MUST reside in a critical section because we need to insure that the interrupt + that is planned to take us out of WFI (via a call to adi_pwr_ExitLowPowerMode()) is not + dispatched until we get into the WFI. If that interrupt sneaks in prior to our getting to the + WFI, then we may end up waiting (potentially forever) for an interrupt that has already occurred. + */ + __WFI(); + + /* Recycle the critical section so that other (non-wakeup) interrupts are dispatched. + This allows *pnInterruptOccurred to be set from any interrupt context. + */ + ADI_EXIT_CRITICAL_REGION(); + /* nop */ + ADI_ENTER_CRITICAL_REGION(); + + /* ...still within critical section... */ + + /* Restore previous base priority */ + __set_BASEPRI(savedPriority); + + /* conditionally, restore WDT control register. + avoid unnecessary WDT writes which will invoke a sync problem + described above as SAR-51938: going into hibernation with pending, + unsynchronized WDT writes may lock out the sync bits. + + Note: it takes over 1000us to sync WDT writes between the 26MHz and + 32kHz clock domains, so this write may actually impact the NEXT + low-power entry. + */ + if (ActiveWDT > 0u) { + pADI_WDT0->CTL = savedWDT; + } + + /* clear sleep-on-exit bit to avoid sleeping on exception return to thread level */ + SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk; + + __DSB(); /* bus sync before re-enabling interrupts */ + + ADI_EXIT_CRITICAL_REGION(); +} + + +/** + * Function to enable/disable clock gating for the available clocks. + * PCLK overrides all the other clocks. + */ +void set_clock_gating(peripheral_clk_t eClk, int enable) +{ + uint32_t flag; + + switch (eClk) { + case PCLK: + flag = 1 << BITP_CLKG_CLK_CTL5_PERCLKOFF; + break; + case GPT0_CLOCK: + flag = 1 << BITP_CLKG_CLK_CTL5_GPTCLK0OFF; + break; + case GPT1_CLOCK: + flag = 1 << BITP_CLKG_CLK_CTL5_GPTCLK1OFF; + break; + case GPT2_CLOCK: + flag = 1 << BITP_CLKG_CLK_CTL5_GPTCLK2OFF; + break; + case I2C_CLOCK: + flag = 1 << BITP_CLKG_CLK_CTL5_UCLKI2COFF; + break; + case GPIO_CLOCK: + flag = 1 << BITP_CLKG_CLK_CTL5_GPIOCLKOFF; + break; + case TIMER_RGB_CLOCK: + flag = 1 << BITP_CLKG_CLK_CTL5_TMRRGBCLKOFF; + break; + default: + return; + } + + // if enable, set the bit otherwise clear the bit + if (enable) + pADI_CLKG0_CLK->CTL5 |= flag; + else + pADI_CLKG0_CLK->CTL5 &= (~flag); +} + + + +/** Send the microcontroller to sleep + * + * The processor is setup ready for sleep, and sent to sleep using __WFI(). In this mode, the + * system clock to the core is stopped until a reset or an interrupt occurs. This eliminates + * dynamic power used by the processor, memory systems and buses. The processor, peripheral and + * memory state are maintained, and the peripherals continue to work and can generate interrupts. + * + * The processor can be woken up by any internal peripheral interrupt or external pin interrupt. + * + * @note + * The mbed interface semihosting is disconnected as part of going to sleep, and can not be restored. + * Flash re-programming and the USB serial port will remain active, but the mbed program will no longer be + * able to access the LocalFileSystem + * + * This mode puts the processor into FLEXI mode however the peripheral clocks are not gated + * hence they are still active. + */ +void hal_sleep(void) +{ + // set to go into the FLEXI mode where the processor is asleep and all peripherals are + // still active + go_into_WFI(ADI_PWR_MODE_FLEXI); +} + + +/** Send the microcontroller to deep sleep + * + * This processor is setup ready for deep sleep, and sent to sleep using __WFI(). This mode + * has the same sleep features as sleep plus it powers down peripherals and clocks. All state + * is still maintained. + * + * The processor can only be woken up by an external interrupt on a pin or a watchdog timer. + * + * @note + * The mbed interface semihosting is disconnected as part of going to sleep, and can not be restored. + * Flash re-programming and the USB serial port will remain active, but the mbed program will no longer be + * able to access the LocalFileSystem + * + * This mode puts the processor into FLEXI mode and all the peripheral clocks are clock gated + * hence they are inactive until interrupts are generated in which case the processor is awaken + * from sleep. + */ +void hal_deepsleep(void) +{ + // set clock gating to all the peripheral clocks + set_clock_gating(PCLK, 1); + + // set to go into the FLEXI mode with peripheral clocks gated. + go_into_WFI(ADI_PWR_MODE_FLEXI); + + // when exiting, clear all peripheral clock gating bits. This is done to enable clocks that aren't + // automatically re-enabled out of sleep such as the GPIO clock. + pADI_CLKG0_CLK->CTL5 = 0; +} + +#endif // #ifdef DEVICE_SLEEP diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/sleep.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/sleep.h new file mode 100755 index 0000000000..5ba806dbee --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/sleep.h @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#ifndef __SLEEP__H__ +#define __SLEEP__H__ + + +/* Enumeration to specify peripheral clock types: + General purpose timer clocks 0-2, + I2C clock, + GPIO clock, + RGB timer clock. + Peripheral clock (PCLK) controls all the peripheral clocks, including + all the clocks mentioned previously +*/ +typedef enum { + GPT0_CLOCK = 0, + GPT1_CLOCK, + GPT2_CLOCK, + I2C_CLOCK, + GPIO_CLOCK, + TIMER_RGB_CLOCK, + PCLK +} peripheral_clk_t; + + +/* Function to enable/disable clock gating for the available clocks. + PCLK overrides all the other clocks. +*/ +void set_clock_gating(peripheral_clk_t eClk, int enable); + +#endif // #ifndef __SLEEP_H__ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/spi_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/spi_api.c new file mode 100755 index 0000000000..a17dea1ab6 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/spi_api.c @@ -0,0 +1,346 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include +#include "mbed_assert.h" + +#include + +#include "spi_api.h" + +#if DEVICE_SPI + +#include "cmsis.h" +#include "pinmap.h" +#include "mbed_error.h" +#include "PeripheralPins.h" +#include "drivers/spi/adi_spi.h" + + + +#if defined(BUILD_SPI_MI_DYNAMIC) +#if defined(ADI_DEBUG) +#warning "BUILD_SPI_MI_DYNAMIC is defined. Memory allocation for SPI will be dynamic" +int adi_spi_memtype = 0; +#endif +#else +ADI_SPI_HANDLE spi_Handle0; +uint8_t spi_Mem0[ADI_SPI_MEMORY_SIZE]; +ADI_SPI_HANDLE spi_Handle1; +uint8_t spi_Mem1[ADI_SPI_MEMORY_SIZE]; +ADI_SPI_HANDLE spi_Handle2; +uint8_t spi_Mem2[ADI_SPI_MEMORY_SIZE]; +#if defined(ADI_DEBUG) +#warning "BUILD_SPI_MI_DYNAMIC is NOT defined. Memory allocation for SPI will be static" +int adi_spi_memtype = 1; +#endif +#endif + + + +/** Initialize the SPI peripheral + * + * Configures the pins used by SPI, sets a default format and frequency, and enables the peripheral + * @param[out] obj The SPI object to initialize + * @param[in] mosi The pin to use for MOSI + * @param[in] miso The pin to use for MISO + * @param[in] sclk The pin to use for SCLK + * @param[in] ssel The pin to use for SSEL + */ +void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel) +{ + // determine the SPI to use + uint32_t spi_mosi = pinmap_peripheral(mosi, PinMap_SPI_MOSI); + uint32_t spi_miso = pinmap_peripheral(miso, PinMap_SPI_MISO); + uint32_t spi_sclk = pinmap_peripheral(sclk, PinMap_SPI_SCLK); + uint32_t spi_ssel = pinmap_peripheral(ssel, PinMap_SPI_SSEL); + uint32_t spi_data = pinmap_merge(spi_mosi, spi_miso); + uint32_t spi_cntl = pinmap_merge(spi_sclk, spi_ssel); + ADI_SPI_HANDLE *pSPI_Handle; + uint8_t *SPI_Mem; + ADI_SPI_RESULT SPI_Return = ADI_SPI_SUCCESS; + uint32_t nDeviceNum = 0; + ADI_SPI_CHIP_SELECT spi_cs = ADI_SPI_CS_NONE; + + +#if defined(BUILD_SPI_MI_DYNAMIC) + if (mosi == SPI0_MOSI) { + nDeviceNum = SPI_0; + } else if (mosi == SPI1_MOSI) { + nDeviceNum = SPI_1; + } else if (mosi == SPI2_MOSI) { + nDeviceNum = SPI_2; + } + pSPI_Handle = &obj->SPI_Handle; + obj->pSPI_Handle = pSPI_Handle; + SPI_Mem = obj->SPI_Mem; +#else + if (mosi == SPI0_MOSI) { + nDeviceNum = SPI_0; + pSPI_Handle = &spi_Handle0; + SPI_Mem = &spi_Mem0[0]; + } else if (mosi == SPI1_MOSI) { + nDeviceNum = SPI_1; + pSPI_Handle = &spi_Handle1; + SPI_Mem = &spi_Mem1[0]; + } else if (mosi == SPI2_MOSI) { + nDeviceNum = SPI_2; + pSPI_Handle = &spi_Handle2; + SPI_Mem = &spi_Mem2[0]; + } + obj->pSPI_Handle = pSPI_Handle; +#endif + + + obj->instance = pinmap_merge(spi_data, spi_cntl); + MBED_ASSERT((int)obj->instance != NC); + + // pin out the spi pins + pinmap_pinout(mosi, PinMap_SPI_MOSI); + pinmap_pinout(miso, PinMap_SPI_MISO); + pinmap_pinout(sclk, PinMap_SPI_SCLK); + if (ssel != NC) { + pinmap_pinout(ssel, PinMap_SPI_SSEL); + } + + SystemCoreClockUpdate(); + SPI_Return = adi_spi_Open(nDeviceNum, SPI_Mem, ADI_SPI_MEMORY_SIZE, pSPI_Handle); + if (SPI_Return) { + obj->error = SPI_EVENT_ERROR; + return; + } + + if (ssel != NC) { + if ( (ssel == SPI0_CS0) || (ssel == SPI1_CS0) || (ssel == SPI2_CS0)) { + spi_cs = ADI_SPI_CS0; + } else if ( (ssel == SPI0_CS1) || (ssel == SPI1_CS1) || (ssel == SPI2_CS1)) { + spi_cs = ADI_SPI_CS1; + } else if ( (ssel == SPI0_CS2) || (ssel == SPI1_CS2) || (ssel == SPI2_CS2)) { + spi_cs = ADI_SPI_CS2; + } else if ( (ssel == SPI0_CS3) || (ssel == SPI1_CS3) || (ssel == SPI2_CS3)) { + spi_cs = ADI_SPI_CS3; + } + + SPI_Return = adi_spi_SetChipSelect(*pSPI_Handle, spi_cs); + if (SPI_Return) { + obj->error = SPI_EVENT_ERROR; + return; + } + } +} + + +/** Release a SPI object + * + * TODO: spi_free is currently unimplemented + * This will require reference counting at the C++ level to be safe + * + * Return the pins owned by the SPI object to their reset state + * Disable the SPI peripheral + * Disable the SPI clock + * @param[in] obj The SPI object to deinitialize + */ +void spi_free(spi_t *obj) +{ + ADI_SPI_HANDLE SPI_Handle; + ADI_SPI_RESULT SPI_Return = ADI_SPI_SUCCESS; + + SPI_Handle = *obj->pSPI_Handle; + SPI_Return = adi_spi_Close(SPI_Handle); + if (SPI_Return) { + obj->error = SPI_EVENT_ERROR; + return; + } +} + + +/** Configure the SPI format + * + * Set the number of bits per frame, configure clock polarity and phase, shift order and master/slave mode. + * The default bit order is MSB. + * @param[in,out] obj The SPI object to configure + * @param[in] bits The number of bits per frame + * @param[in] mode The SPI mode (clock polarity, phase, and shift direction) + * @param[in] slave Zero for master mode or non-zero for slave mode + * + ** Configure the data transmission format + * + * @param bits Number of bits per SPI frame (4 - 16) + * @param mode Clock polarity and phase mode (0 - 3) + * + * @code + * mode | POL PHA + * -----+-------- + * 0 | 0 0 + * 1 | 0 1 + * 2 | 1 0 + * 3 | 1 1 + * @endcode + */ +void spi_format(spi_t *obj, int bits, int mode, int slave) +{ + ADI_SPI_HANDLE SPI_Handle; + ADI_SPI_RESULT SPI_Return = ADI_SPI_SUCCESS; + bool_t master; + + master = !((bool_t)slave); + SPI_Handle = *obj->pSPI_Handle; + SPI_Return = adi_spi_SetMasterMode(SPI_Handle, master); + if (SPI_Return) { + obj->error = SPI_EVENT_ERROR; + return; + } +} + + +/** Set the SPI baud rate + * + * Actual frequency may differ from the desired frequency due to available dividers and bus clock + * Configures the SPI peripheral's baud rate + * @param[in,out] obj The SPI object to configure + * @param[in] hz The baud rate in Hz + */ +void spi_frequency(spi_t *obj, int hz) +{ + ADI_SPI_HANDLE SPI_Handle; + ADI_SPI_RESULT SPI_Return = ADI_SPI_SUCCESS; + + SPI_Handle = *obj->pSPI_Handle; + SPI_Return = adi_spi_SetBitrate(SPI_Handle, (uint32_t) hz); + if (SPI_Return) { + obj->error = SPI_EVENT_ERROR; + return; + } +} + + +/** Write a byte out in master mode and receive a value + * + * @param[in] obj The SPI peripheral to use for sending + * @param[in] value The value to send + * @return Returns the value received during send + */ +int spi_master_write(spi_t *obj, int value) +{ + ADI_SPI_TRANSCEIVER transceive; + uint8_t TxBuf; + uint8_t RxBuf; + ADI_SPI_HANDLE SPI_Handle; + ADI_SPI_RESULT SPI_Return = ADI_SPI_SUCCESS; + + TxBuf = (uint8_t)value; + + transceive.pReceiver = &RxBuf; + transceive.ReceiverBytes = 1; /* link transceive data size to the remaining count */ + transceive.nRxIncrement = 1; /* auto increment buffer */ + transceive.pTransmitter = &TxBuf; /* initialize data attributes */ + transceive.TransmitterBytes = 1; /* link transceive data size to the remaining count */ + transceive.nTxIncrement = 1; /* auto increment buffer */ + + transceive.bDMA = false; + transceive.bRD_CTL = false; + SPI_Handle = *obj->pSPI_Handle; + SPI_Return = adi_spi_MasterReadWrite(SPI_Handle, &transceive); + if (SPI_Return) { + obj->error = SPI_EVENT_ERROR; + return 1; + } + + return((int)RxBuf); +} + + +/** Check if a value is available to read + * + * @param[in] obj The SPI peripheral to check + * @return non-zero if a value is available + */ +int spi_slave_receive(spi_t *obj) +{ + return 0; +} + + +/** Get a received value out of the SPI receive buffer in slave mode + * + * Blocks until a value is available + * @param[in] obj The SPI peripheral to read + * @return The value received + */ +int spi_slave_read(spi_t *obj) +{ + return 0; +} + + +/** Write a value to the SPI peripheral in slave mode + * + * Blocks until the SPI peripheral can be written to + * @param[in] obj The SPI peripheral to write + * @param[in] value The value to write + */ +void spi_slave_write(spi_t *obj, int value) +{ + return; +} + + +/** Write a block out in master mode and receive a value + * + * The total number of bytes sent and recieved will be the maximum of + * tx_length and rx_length. The bytes written will be padded with the + * value 0xff. + * + * @param[in] obj The SPI peripheral to use for sending + * @param[in] tx_buffer Pointer to the byte-array of data to write to the device + * @param[in] tx_length Number of bytes to write, may be zero + * @param[in] rx_buffer Pointer to the byte-array of data to read from the device + * @param[in] rx_length Number of bytes to read, may be zero + * @param[in] write_fill Default data transmitted while performing a read + * @returns + * The number of bytes written and read from the device. This is + * maximum of tx_length and rx_length. + */ +int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, char write_fill) +{ + return 0; +} + +#endif diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c new file mode 100755 index 0000000000..4012775454 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c @@ -0,0 +1,96 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#if defined(DEVICE_TRNG) + +#include +#include +#include +#include "cmsis.h" +#include "trng_api.h" + +// Sampling counter values +// Prescaler: 0 - 10 +// LenReload: 0 - 4095 +#define TRNG_CNT_VAL 4095 +#define TRNG_PRESCALER 2 + +static ADI_RNG_HANDLE RNGhDevice; /* Memory to handle CRC Device */ +static uint32_t RngDevMem[(ADI_RNG_MEMORY_SIZE + 3)/4]; /* Data buffers for Random numbers */ + +void trng_init(trng_t *obj) +{ + (void)obj; + adi_rng_Open(0,RngDevMem,sizeof(RngDevMem),&RNGhDevice); + + // Set sample length for the H/W RN accumulator + adi_rng_SetSampleLen(RNGhDevice, TRNG_PRESCALER, TRNG_CNT_VAL); + + // Enable the RNG + adi_rng_Enable(RNGhDevice, true); +} + +void trng_free(trng_t *obj) +{ + (void)obj; + adi_rng_Enable(RNGhDevice, false); + adi_rng_Close(RNGhDevice); +} + +int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_length) +{ + (void)obj; + bool bRNGRdy; + uint32_t nRandomNum, i; + + for (i = 0; i < length; ) { + // wait for the RNG ready to give a random number + adi_rng_GetRdyStatus(RNGhDevice, &bRNGRdy); + if (bRNGRdy) { + // read the random number + adi_rng_GetRngData(RNGhDevice, &nRandomNum); + output[i++] = (uint8_t) nRandomNum; + } + } + *output_length = length; + return 0; +} + +#endif diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/us_ticker.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/us_ticker.c new file mode 100755 index 0000000000..f782e4745a --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/us_ticker.c @@ -0,0 +1,346 @@ +/******************************************************************************* + * Copyright (c) 2010-2017 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- + * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF + * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + +#include +#include +#include +#include +#include + +#ifndef BITM_TMR_RGB_CTL_EN +#define BITM_TMR_RGB_CTL_EN BITM_TMR_CTL_EN +#endif + +typedef uint32_t timestamp_t; + +// defined in mbed_us_ticker_api.c which calls the ticker_irq_handler() routine +// defined in mbed_ticker_api.c +void us_ticker_irq_handler(void); + +static int us_ticker_inited = 0; + +static ADI_TMR_CONFIG tmrConfig, tmr2Config; + +static volatile uint32_t Upper_count = 0, largecnt = 0; + +static ADI_TMR_TypeDef * adi_tmr_registers[ADI_TMR_DEVICE_NUM] = {pADI_TMR0, pADI_TMR1, pADI_TMR2}; + +#if defined(__ADUCM302x__) +static const IRQn_Type adi_tmr_interrupt[ADI_TMR_DEVICE_NUM] = {TMR0_EVT_IRQn, TMR1_EVT_IRQn, TMR2_EVT_IRQn}; +#elif defined(__ADUCM4x50__) +static const IRQn_Type adi_tmr_interrupt[ADI_TMR_DEVICE_NUM] = {TMR0_EVT_IRQn, TMR1_EVT_IRQn, TMR2_EVT_IRQn, TMR_RGB_EVT_IRQn}; +#else +#error TMR is not ported for this processor +#endif + + +/*---------------------------------------------------------------------------* + Local functions + *---------------------------------------------------------------------------*/ +static void GP1CallbackFunction(void *pCBParam, uint32_t Event, void * pArg) +{ + Upper_count++; +} + + +static uint32_t get_current_time(void) +{ + uint16_t tmrcnt0, tmrcnt1; + uint32_t totaltmr0, totaltmr1; + uint32_t uc1, tmrpend0, tmrpend1; + + do { + volatile uint32_t *ucptr = &Upper_count; + + /* + * Carefully coded to prevent race conditions. Do not make changes unless you understand all the + * implications. + * + * Note this function can be called with interrupts globally disabled or enabled. It has been coded to work in both cases. + * + * TMR0 and TMR1 both run from the same synchronous clock. TMR0 runs at 26MHz and TMR1 runs at 26/256MHz. + * TMR1 generates an interrupt every time it overflows its 16 bit counter. TMR0 runs faster and provides + * the lowest 8 bits of the current time count. When TMR0 and TMR1 are combined, they provide 24 bits of + * timer precision. i.e. (TMR0.CURCNT & 0xff) + (TMR1.CURCNT << 8) + * + * There are several race conditions protected against: + * 1. TMR0 and TMR1 are both read at the same time, however, on rare occasions, one will have incremented before the other. + * Therefore we read both timer counters, and check if the middle 8 bits match, if they don't then read the counts again + * until they do. This ensures that one or the other counters are stable with respect to each other. + * + * 2. TMR1.CURCNT and Upper_count racing. Prevent this by disabling the TMR1 interrupt, which stops Upper_count increment interrupt (GP1CallbackFunction). + * Then check pending bit of TMR1 to see if we missed Upper_count interrupt, and add it manually later. + * + * 3. Race between the TMR1 pend, and the TMR1.CURCNT read. Even with TMR1 interrupt disabled, the pend bit + * may be set while TMR1.CURCNT is being read. We don't know if the pend bit matches the TMR1 state. + * To prevent this, the pending bit is read twice, and we see if it matches; if it doesn't, loop around again. + * + * Note the TMR1 interrupt is enabled on each iteration of the loop to flush out any pending TMR1 interrupt, + * thereby clearing any TMR1 pend's. This have no effect if this routine is called with interrupts globally disabled. + */ + + NVIC_DisableIRQ(adi_tmr_interrupt[ADI_TMR_DEVICE_GP1]); // Prevent Upper_count increment + tmrpend0 = NVIC_GetPendingIRQ(adi_tmr_interrupt[ADI_TMR_DEVICE_GP1]); + // Check if there is a pending interrupt for timer 1 + + __DMB(); // memory barrier: read GP0 before GP1 + + tmrcnt0 = adi_tmr_registers[ADI_TMR_DEVICE_GP0]->CURCNT; // to minimize skew, read both timers manually + + __DMB(); // memory barrier: read GP0 before GP1 + + tmrcnt1 = adi_tmr_registers[ADI_TMR_DEVICE_GP1]->CURCNT; // read both timers manually + + totaltmr0 = tmrcnt0; // expand to u32 bits + totaltmr1 = tmrcnt1; // expand to u32 bits + + tmrcnt0 &= 0xff00u; + tmrcnt1 <<= 8; + + __DMB(); + + uc1 = *ucptr; // Read Upper_count + + tmrpend1 = NVIC_GetPendingIRQ(adi_tmr_interrupt[ADI_TMR_DEVICE_GP1]); + // Check for a pending interrupt again. Only leave loop if they match + + NVIC_EnableIRQ(adi_tmr_interrupt[ADI_TMR_DEVICE_GP1]); // enable interrupt on every loop to allow TMR1 interrupt to run + } while ((tmrcnt0 != tmrcnt1) || (tmrpend0 != tmrpend1)); + + totaltmr1 <<= 8; // Timer1 runs 256x slower + totaltmr1 += totaltmr0 & 0xffu; // Use last 8 bits of Timer0 as it runs faster + // totaltmr1 now contain 24 bits of significance + + if (tmrpend0) { // If an interrupt is pending, then increment local copy of upper count + uc1++; + } + + uint64_t Uc = totaltmr1; // expand out to 64 bits unsigned + Uc += ((uint64_t) uc1) << 24; // Add on the upper count to get the full precision count + + // Divide Uc by 26 (26MHz converted to 1MHz) todo scale for other clock freqs + + Uc *= 1290555u; // Divide total(1/26) << 25 + Uc >>= 25; // shift back. Fixed point avoid use of floating point divide. + // Compiler does this inline using shifts and adds. + + return Uc; +} + + +static void calc_event_counts(uint32_t timestamp) +{ + uint32_t calc_time, blocks, offset; + uint64_t aa; + + calc_time = get_current_time(); + offset = timestamp - calc_time; // offset in useconds + + if (offset > 0xf0000000u) // if offset is a really big number, assume that timer has already expired (i.e. negative) + offset = 0u; + + if (offset > 10u) { // it takes 10us to user timer routine after interrupt. Offset timer to account for that. + offset -= 10u; + } else + offset = 0u; + + aa = (uint64_t) offset; + aa *= 26u; // convert from 1MHz to 26MHz clock. todo scale for other clock freqs + + blocks = aa >> 7; + blocks++; // round + + largecnt = blocks>>1; // communicate to event_timer() routine +} + +static void event_timer() +{ + if (largecnt) { + uint32_t cnt = largecnt; + + if (cnt > 65535u) { + cnt = 0u; + } else + cnt = 65536u - cnt; + + tmr2Config.nLoad = cnt; + tmr2Config.nAsyncLoad = cnt; + adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP2, tmr2Config); + adi_tmr_Enable(ADI_TMR_DEVICE_GP2, true); + } else { + us_ticker_irq_handler(); + } +} + + +/* + * Interrupt routine for timer 2 + * + * largecnt counts how many timer ticks should be counted to reach timer event. + * Each interrupt happens every 65536 timer ticks, unless there are less than 65536 ticks to count. + * In that case do the remaining timers ticks. + * + * largecnt is a global that is used to communicate between event_timer and the interrupt routine + * On entry, largecnt will be any value larger than 0. + */ +static void GP2CallbackFunction(void *pCBParam, uint32_t Event, void * pArg) +{ + if (largecnt >= 65536u) { + largecnt -= 65536u; + } else + largecnt = 0; + + if (largecnt < 65536u) { + adi_tmr_Enable(ADI_TMR_DEVICE_GP2, false); + event_timer(); + } +} + + +/*---------------------------------------------------------------------------* + us_ticker HAL APIs + *---------------------------------------------------------------------------*/ +void us_ticker_init(void) +{ + if (us_ticker_inited) { + return; + } + + us_ticker_inited = 1; + + /*--------------------- GP TIMER INITIALIZATION --------------------------*/ + + /* Set up GP0 callback function */ + adi_tmr_Init(ADI_TMR_DEVICE_GP0, NULL, NULL, false); + + /* Set up GP1 callback function */ + adi_tmr_Init(ADI_TMR_DEVICE_GP1, GP1CallbackFunction, NULL, true); + + /* Set up GP1 callback function */ + adi_tmr_Init(ADI_TMR_DEVICE_GP2, GP2CallbackFunction, NULL, true); + + /* Configure GP0 to run at 26MHz */ + tmrConfig.bCountingUp = true; + tmrConfig.bPeriodic = true; + tmrConfig.ePrescaler = ADI_TMR_PRESCALER_1; // TMR0 at 26MHz + tmrConfig.eClockSource = ADI_TMR_CLOCK_PCLK; // TMR source is PCLK (most examples use HFOSC) + tmrConfig.nLoad = 0; + tmrConfig.nAsyncLoad = 0; + tmrConfig.bReloading = false; + tmrConfig.bSyncBypass = true; // Allow x1 prescale: requires PCLK as a clk + adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP0, tmrConfig); + + /* Configure GP1 to have a period 256 times longer than GP0 */ + tmrConfig.nLoad = 0; + tmrConfig.nAsyncLoad = 0; + tmrConfig.ePrescaler = ADI_TMR_PRESCALER_256; // TMR1 = 26MHz/256 + adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP1, tmrConfig); + + /* Configure GP2 for doing event counts */ + tmr2Config.bCountingUp = true; + tmr2Config.bPeriodic = true; + tmr2Config.ePrescaler = ADI_TMR_PRESCALER_256; // TMR2 at 26MHz/256 + tmr2Config.eClockSource = ADI_TMR_CLOCK_PCLK; // TMR source is PCLK (most examples use HFOSC) + tmr2Config.nLoad = 0; + tmr2Config.nAsyncLoad = 0; + tmr2Config.bReloading = false; + tmr2Config.bSyncBypass = true; // Allow x1 prescale + adi_tmr_ConfigTimer(ADI_TMR_DEVICE_GP2, tmr2Config); + + + /*------------------------- GP TIMER ENABLE ------------------------------*/ + + /* Manually enable both timers to get them started at the same time + * + */ + adi_tmr_registers[ADI_TMR_DEVICE_GP0]->CTL |= (uint16_t) BITM_TMR_RGB_CTL_EN; + adi_tmr_registers[ADI_TMR_DEVICE_GP1]->CTL |= (uint16_t) BITM_TMR_RGB_CTL_EN; +} + +uint32_t us_ticker_read() +{ + uint32_t curr_time; + + if (!us_ticker_inited) { + us_ticker_init(); + } + + curr_time = get_current_time(); + + return curr_time; +} + +void us_ticker_disable_interrupt(void) +{ + adi_tmr_Enable(ADI_TMR_DEVICE_GP2, false); +} + +void us_ticker_clear_interrupt(void) +{ + NVIC_ClearPendingIRQ(TMR2_EVT_IRQn); +} + +void us_ticker_set_interrupt(timestamp_t timestamp) +{ + + /* timestamp is when interrupt should fire. + * + * This MUST not be called if another timer event is currently enabled. + * + */ + calc_event_counts(timestamp); // use timestamp to calculate largecnt to control number of timer interrupts + event_timer(); // uses largecnt to initiate timer interrupts +} + +/** Set pending interrupt that should be fired right away. + * + * The ticker should be initialized prior calling this function. + * + * This MUST not be called if another timer event is currently enabled. + */ +void us_ticker_fire_interrupt(void) +{ + NVIC_SetPendingIRQ(TMR2_EVT_IRQn); +} + + +/* +** EOF +*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050.h new file mode 100755 index 0000000000..39158f2f9c --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050.h @@ -0,0 +1,26 @@ +/* +** ADuCM4050.h +** +** Copyright (C) 2016 Analog Devices, Inc. All Rights Reserved. +** +*/ + +#ifndef ADUCM4050_H +#define ADUCM4050_H + +#include +#include + +#define __CM4_REV 0x0001U /*!< CM4 Core Revision r0p1 */ +#define __MPU_PRESENT 1u /*!< MPU present */ +#ifndef __FPU_PRESENT +#define __FPU_PRESENT 1u /*!< FPU present */ +#endif +#define __NVIC_PRIO_BITS 3u /*!< Number of Bits for Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< 1 if different SysTick Config is used */ + +#include + +#include "system_ADuCM4050.h" + +#endif /* ADUCM4050_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050_cdef.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050_cdef.h new file mode 100755 index 0000000000..8b6f35d28c --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050_cdef.h @@ -0,0 +1,18 @@ +/* +** ADuCM4050_cdef.h +** +** Copyright (C) 2016 Analog Devices, Inc. All Rights Reserved. +** +*/ + +#ifndef _WRAP_ADUCM4050_CDEF_H +#define _WRAP_ADUCM4050_CDEF_H + +#include + +#include + +#include +#include + +#endif /* _WRAP_ADUCM4050_CDEF_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050_def.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050_def.h new file mode 100755 index 0000000000..222e865aa4 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050_def.h @@ -0,0 +1,34 @@ +/* +** ADuCM4050_def.h +** +** Copyright (C) 2016-2017 Analog Devices, Inc. All Rights Reserved. +** +*/ + +#ifndef _WRAP_ADUCM4050_DEF_H +#define _WRAP_ADUCM4050_DEF_H + +#ifdef __ICCARM__ +/* IAR MISRA C 2004 error suppressions: + * + * Pm008 (rule 2.4): sections of code should not be 'commented out'. + * Some comments are wrongly identified as code. + * + * Pm009 (rule 5.1): identifiers shall not rely on significance of more than 31 characters. + * The YODA-generated headers rely on more. The IAR compiler supports that. + */ +_Pragma("diag_suppress=Pm008,Pm009") +#endif /* __ICCARM__ */ + +#ifdef __IASMARM__ +/* Define masks to plain numeric literal for IAR assembler. */ +#define _ADI_MSK_3( mask, smask, type ) (mask) +#endif /* __IASMARM__ */ + +#include + +#ifdef __ICCARM__ +_Pragma("diag_default=Pm008,Pm009") +#endif /* __ICCARM__ */ + +#endif /* _WRAP_ADUCM4050_DEF_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050_device.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050_device.h new file mode 100755 index 0000000000..28b096bfc0 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050_device.h @@ -0,0 +1,29 @@ +/* +** ADuCM4050_device.h +** +** Copyright (C) 2016 Analog Devices, Inc. All Rights Reserved. +** +*/ + +#ifndef _WRAP_ADUCM4050_DEVICE_H +#define _WRAP_ADUCM4050_DEVICE_H + +#include +#include + +#ifdef __ICCARM__ +/* IAR MISRA C 2004 error suppressions: + * + * Pm093 (rule 18.4): use of union - overlapping storage shall not be used. + * Unions are required by sys/adi_ADuCM4050_device.h. + */ +_Pragma("diag_suppress=Pm093") +#endif /* __ICCARM__ */ + +#include + +#ifdef __ICCARM__ +_Pragma("diag_default=Pm093") +#endif /* __ICCARM__ */ + +#endif /* _WRAP_ADUCM4050_DEVICE_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050_typedefs.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050_typedefs.h new file mode 100755 index 0000000000..6354190e97 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/ADuCM4050_typedefs.h @@ -0,0 +1,31 @@ +/* +** ADuCM4050_typedefs.h +** +** Copyright (C) 2016 Analog Devices, Inc. All Rights Reserved. +** +*/ + +#ifndef _WRAP_ADUCM4050_TYPEDEFS_H +#define _WRAP_ADUCM4050_TYPEDEFS_H + +#include + +#ifdef __ICCARM__ +/* IAR MISRA C 2004 error suppressions: + * + * Pm008 (rule 2.4): sections of code should not be 'commented out'. + * Some comments are wrongly identified as code. + * + * Pm093 (rule 18.4): use of union - overlapping storage shall not be used. + * Unions are required by sys/adi_ADuCM4050_typedefs.h. + */ +_Pragma("diag_suppress=Pm008,Pm093") +#endif /* __ICCARM__ */ + +#include + +#ifdef __ICCARM__ +_Pragma("diag_default=Pm008,Pm093") +#endif /* __ICCARM__ */ + +#endif /* _WRAP_ADUCM4050_TYPEDEFS_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adc/adi_adc.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adc/adi_adc.c new file mode 100755 index 0000000000..ea473df8de --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adc/adi_adc.c @@ -0,0 +1,2371 @@ +/*! ***************************************************************************** + * @file: adi_adc.c + * @brief: ADC device driver global file. + * @details: This file contain the ADC device driver implementation. + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ +/** @addtogroup ADC_Driver ADC Driver + * @{ + * @brief ADC Driver + * @details The ADC driver manages all instances of the ADC peripheral. + * @note - The application must include drivers/adc/adi_adc.h to use this driver. + * @note - This driver also requires the DMA driver. The application must include + the DMA driver sources to avoid link errors. + */ + +#ifndef ADI_ADC_C +/*! \cond PRIVATE */ +#define ADI_ADC_C + +/*============= I N C L U D E S =============*/ + + +/* Header file with definitions specific to ADC driver implementation */ + +/*============= A D C I M P L E M E N T A T I O N S O U R C E F I L E S =============*/ +#include +#include +#include +#include +#include +#include +#include + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm123 (rule 8.5): there shall be no definition of objects or functions in a header file +* This isn't a header as such. +* +* Pm073 (rule 14.7): a function should have a single point of exit +* Pm143 (rule 14.7): a function should have a single point of exit at the end of the function +* Multiple returns are used for error handling. +* +* Pm050 (rule 14.2): a null statement shall only occur on a line by itself +* Needed for null expansion of ADI_INSTALL_HANDLER and others. +* +* Pm088 (rule 17.4): pointer arithmetic should not be used. +* Relying on pointer arithmetic for buffer handling. +* +* Pm140 (rule 11.3): a cast should not be performed between a pointer type and an integral type +* The rule makes an exception for memory-mapped register accesses. +* +* Pm152: (MISRA C 2004 rule 17.4) array indexing shall only be applied to objects defined as an array type +* Accessing the DMA descriptors, which are defined in the system as a pointer to an array of descriptors + +*/ +#pragma diag_suppress=Pm123,Pm073,Pm143,Pm050,Pm088,Pm140,Pm152 +#endif /* __ICCARM__ */ + +#include "adi_adc_def.h" +#include "adi_adc_data.c" + +/*============== D E F I N E S ===============*/ +#ifdef ADI_DEBUG +#define ADI_ADC_INVALID_HANDLE(h) (AdcDevInfo[0].hDevice != (h)) +#endif + +/* Specify the maximum acquisition time, based on the width of the SAMPTIME field. */ +#define ADI_MAX_ACQUISITION_TIME (((uint32_t)BITM_ADC_CNV_TIME_SAMPTIME << BITP_ADC_CNV_TIME_SAMPTIME) + 1u) + +/* The 12bit maximum sample value */ +#define ADI_ADC_SAMPLE_MAX ((uint16_t)(4095u)) + +/*============= C O D E =============*/ + +/*============= D E B U G F U N C T I O N P R O T O T Y P E S =============*/ + +/* Override "weak" default binding in startup_*.c */ +/*! \cond PRIVATE */ +extern void ADC0_Int_Handler(void); +extern void DMA_ADC0_Int_Handler (void); + +/*! \endcond */ + +/* Prototypes for static functions (required by MISRA-C:2004 Rule 8.1) */ +/*============= L O C A L F U N C T I O N S P R O T O T Y P E S =============*/ +static uint16_t ReadOutReg(uint32_t nChannelNum); + +/* ADC management functions, based on transfer method */ +#if ADI_ADC_ENABLE_MULTI_ACQUIRE == 1 +static ADI_ADC_RESULT DmaFIFOManage (ADI_ADC_DEVICE *pDevice, ADC_FIFO_MODE eFifoMode); +#else +static ADI_ADC_RESULT InterruptFIFOManage (ADI_ADC_DEVICE *pDevice, ADC_FIFO_MODE eFifoMode); +#endif + +/* Channel helper functions */ +static uint32_t GetNumChannels(uint32_t nChannels); +static int32_t nGetChannelNumber(ADI_ADC_CHANNEL eChannel); + +/* Buffer management functions */ +static void ManageFifoCompletion(ADI_ADC_DEVICE *pDevice); +static bool InitBufferProcessing(ADI_ADC_DEVICE *pDevice); +static void FlushFifo(ADI_ADC_DEVICE *pDevice, uint32_t nChannels); + +/* Internal configuration functions */ +static void EnableComparator(ADI_ADC_DEVICE *pDevice, bool bEnable); +static void StaticConfiguration(ADI_ADC_DEVICE *pDevice); + +/*! \endcond */ + +/*============= P U B L I C F U N C T I O N S =============*/ + +/** + * @brief Opens an ADC device instance. + * + * @param [in] nDeviceNum Device number to open + * @param [in] pMemory Pointer to a #ADI_ADC_MEMORY_SIZE sized buffer to manage the device + * instance. + * @param [in] nMemorySize Size of the buffer to which "pMemory" points + * @param [out] phDevice Pointer to a location where ADC device handle is to be written. + * + * @return Status + * - #ADI_ADC_SUCCESS Call completed successfully + * - #ADI_ADC_INVALID_DEVICE_NUM [D] Invalid Device Number + * - #ADI_ADC_INSUFFICIENT_MEMORY [D] Memory passed is not sufficient + * - #ADI_ADC_IN_USE [D] ADC driver was already opened + */ +ADI_ADC_RESULT adi_adc_Open ( + uint32_t nDeviceNum, + void *pMemory, + uint32_t nMemorySize, + ADI_ADC_HANDLE *phDevice) +{ + ADI_INT_STATUS_ALLOC(); + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)pMemory; + +#ifdef ADI_DEBUG + if (nDeviceNum > (sizeof (AdcDevInfo)/sizeof(AdcDevInfo[0]))) + { + return ADI_ADC_INVALID_DEVICE_NUM; + } + + if (nMemorySize < ADI_ADC_MEMORY_SIZE) + { + return ADI_ADC_INSUFFICIENT_MEMORY; + } + + if (AdcDevInfo[nDeviceNum].hDevice != NULL) + { + return ADI_ADC_IN_USE; + } + + assert (ADI_ADC_MEMORY_SIZE >= sizeof (ADI_ADC_DEVICE)); +#endif /* ADI_DEBUG */ + + memset (pMemory, 0, nMemorySize); + + ADI_ENTER_CRITICAL_REGION(); + AdcDevInfo[nDeviceNum].hDevice = (ADI_ADC_HANDLE)pDevice; + pDevice->pReg = AdcDevInfo[nDeviceNum].pReg; + ADI_EXIT_CRITICAL_REGION(); + + /* Reset the ADC */ + pDevice->pReg->CFG = BITM_ADC_CFG_RST; + + /* Enable the IRQs */ + NVIC_ClearPendingIRQ(ADC0_EVT_IRQn); + NVIC_EnableIRQ(ADC0_EVT_IRQn); + + /* Initialize the registers to known value */ + pDevice->pReg->IRQ_EN = BITM_ADC_IRQ_EN_RDY | BITM_ADC_IRQ_EN_ALERT | BITM_ADC_IRQ_EN_OVF | BITM_ADC_IRQ_EN_CALDONE | BITM_ADC_IRQ_EN_CNVDONE; + + /* Do the static configuration */ + StaticConfiguration(pDevice); + + /* Create a semaphore for buffer management */ + SEM_CREATE(pDevice, "ADC Sem", ADI_ADC_ERR_RTOS); + + /* Set the default FIFO Manage function */ +#if ADI_ADC_ENABLE_MULTI_ACQUIRE == 1 + pDevice->pfManageFifo = DmaFIFOManage; + /* Make sure the DMA controller and its SRAM based descriptors are initialized */ + adi_dma_Init(); +#else + pDevice->pfManageFifo = InterruptFIFOManage; +#endif + + /* Return the device handle back to the application */ + *phDevice = AdcDevInfo[nDeviceNum].hDevice; + + return ADI_ADC_SUCCESS; +} + + +/** + * @brief Close the given device instance + * + * @param [in] hDevice Handle to the device instance + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully closed the device + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle based to the function + */ +ADI_ADC_RESULT adi_adc_Close (ADI_ADC_HANDLE hDevice) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + ADI_ADC_RESULT eResult; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } +#endif /* ADI_DEBUG */ + + /* Power down the device */ + if ((eResult = adi_adc_PowerUp (hDevice, false)) != ADI_ADC_SUCCESS) { + return eResult; + } + + /* Disable the IRQ */ + pDevice->pReg->IRQ_EN = 0u; + + /* Clear the conversion cfg register to stop any transaction */ + pDevice->pReg->CNV_CFG = 0u; + +#if ADI_ADC_ENABLE_MULTI_ACQUIRE == 1 + /* Close the DMA if configured */ + NVIC_DisableIRQ(DMA0_CH24_DONE_IRQn); +#endif /* ADI_ADC_ENABLE_MULTI_ACQUIRE == 1 */ + + /* Disable the ADC interrupt */ + NVIC_DisableIRQ(ADC0_EVT_IRQn); + + /* Destroy the semaphore */ + SEM_DELETE(pDevice, ADI_ADC_ERR_RTOS); + + /* Finally, zero the device */ + AdcDevInfo[0].hDevice = (NULL); + + return ADI_ADC_SUCCESS; +} + + +/** + * @brief Power up ADC + * + * @param [in] hDevice Handle to the device instance + * + * @param [in] bPowerUp 'true' to power up and 'false' to power down the ADC. + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully closed the device + * - #ADI_ADC_BAD_SYS_CLOCK Unable to obtain PCLK which is needed to calculate + * powerup values. + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the function + */ +ADI_ADC_RESULT adi_adc_PowerUp (ADI_ADC_HANDLE hDevice, bool bPowerUp) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + uint32_t nClock = 0u; + uint16_t nCount = 0u; + ADI_ADC_RESULT eResult = ADI_ADC_SUCCESS; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } +#endif /* ADI_DEBUG */ + + if (bPowerUp == true) + { + if (IS_NOT_IN_ANY_STATE(ADC_STATUS_POWERED_UP)) + { + if(adi_pwr_GetClockFrequency(ADI_CLOCK_PCLK, &nClock) == ADI_PWR_SUCCESS) + { + /* We need the cycles equivelent of 20us entered here, based on the PCLK + * clock. nClock is the frequency of the PCLK, 50000 is the equivalent frequency of 20us + * e.g. 26,000,000Hz, 0.00002s produces 520 cycles.*/ + nCount = (uint16_t)(nClock / 50000u); + + /* Powering up ADC */ + pDevice->pReg->CFG |= BITM_ADC_CFG_PWRUP; + + /* Set ADC_PWRUP.WAIT bits for the new count */ + pDevice->pReg->PWRUP = (uint16_t)(((uint32_t)nCount << BITP_ADC_PWRUP_WAIT) & BITM_ADC_PWRUP_WAIT); + + SET_STATE(ADC_STATUS_POWERED_UP); + } + else + { + eResult = ADI_ADC_BAD_SYS_CLOCK; + } + } + } + else + { + if (IS_IN_STATE(ADC_STATUS_POWERED_UP)) + { + /* If the ADC system is up then disable the ADC subsystem */ + if ( IS_IN_STATE(ADC_STATUS_SUB_SYSTEM_EN) ) + { + eResult = adi_adc_EnableADCSubSystem (hDevice, false); + if (eResult != ADI_ADC_SUCCESS) + { + return eResult; + } + } + + /* Powering down ADC */ + pDevice->pReg->CFG &= (uint16_t)(~(BITM_ADC_CFG_PWRUP)); + CLR_STATE(ADC_STATUS_POWERED_UP); + } + } + + return eResult; +} + + +/** + * @brief Registering a callback function + * + * @param [in] hDevice Handle to the device instance + * @param [in] pfCallback Function pointer to callback function. Passing a NULL pointer will + * unregister the call back function. + * @param [in] pCBParam Call back function parameter + * + * @details This function registers a call back function. Registered function will be called when + * the given computation is over. It will also be called when the digital comparitor is being + * used and a limit has been broken. + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully registerd the callback + * - #ADI_ADC_INVALID_SEQUENCE [D] Callback cannot be registered when ADC is enabled for sampling. + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the function + */ +ADI_ADC_RESULT adi_adc_RegisterCallback ( + ADI_ADC_HANDLE hDevice, + ADI_CALLBACK pfCallback, + void *pCBParam) +{ + ADI_INT_STATUS_ALLOC(); + + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + + if (IS_IN_ANY_STATE(ADC_STATUS_NON_BLOCKING_EN | ADC_STATUS_BLOCKING_EN | ADC_STATUS_COMPARATOR_EN)) + { + return ADI_ADC_INVALID_SEQUENCE; + } + +#endif /* ADI_DEBUG */ + + ADI_ENTER_CRITICAL_REGION(); + pDevice->pfCallback = pfCallback; + pDevice->pCBParam = pCBParam; + ADI_EXIT_CRITICAL_REGION(); + + return ADI_ADC_SUCCESS; +} + +/** + * @brief Enable/Disables the ADC Subsystem + * + * @param [in] hDevice Handle to the device instance + * + * @param [in] bEnable 'true' to Enable and 'false' to Disable` + * + * @details Enables/Disables the ADC Subsystem. The ADC subsystem need to be enabled before using the ADC + * for sampling the signal. The driver should check whether the ADC is ready by calling adi_adc_IsReady + * API before continuing. If internal reference buffer is used as voltage reference then application + * has to wait at least 3.5ms after enabling irrespective of whether adi_adc_IsReady returns ready or not. + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully enabled/disabled the ADC subsystem + * - #ADI_ADC_INVALID_SEQUENCE [D] Can only be called if the ADC is powered up, + * and cannot be disabled when sampling or using + * the camparator. + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the function + */ +ADI_ADC_RESULT adi_adc_EnableADCSubSystem ( + ADI_ADC_HANDLE hDevice, + bool bEnable) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + + if (IS_NOT_IN_STATE(ADC_STATUS_POWERED_UP)) + { + return ADI_ADC_INVALID_SEQUENCE; + } + + if (bEnable == true) { + if (IS_IN_STATE(ADC_STATUS_SUB_SYSTEM_EN)) { + return ADI_ADC_INVALID_SEQUENCE; + } + } else { + if (IS_IN_ANY_STATE(ADC_STATUS_NON_BLOCKING_EN |ADC_STATUS_BLOCKING_EN | ADC_STATUS_COMPARATOR_EN)) { + return ADI_ADC_INVALID_SEQUENCE; + } + } +#endif /* ADI_DEBUG */ + + if (bEnable == true) + { + pDevice->pReg->CFG |= BITM_ADC_CFG_EN; + SET_STATE(ADC_STATUS_SUB_SYSTEM_EN); + } + else + { + pDevice->pReg->CFG &= (uint16_t)(~BITM_ADC_CFG_EN); + CLR_STATE(ADC_STATUS_SUB_SYSTEM_EN | ADC_STATUS_SUB_SYSTEM_READY); + } + + return ADI_ADC_SUCCESS; +} + + +/** + * @brief Returns whether the ADC Subsystem is ready + * + * @param [in] hDevice Handle to the device instance + * + +* @param [in] pbReady Pointer to a bool variable. The variable will be set to 'true' if the ADC is ready else 'false' + * + * @details Returns whether the ADC is ready for sampling. This API should be called after enabling the ADC sub-system using + * adi_adc_EnableADCSubSystem API. If internal reference buffer is used as voltage reference then application + * has to wait at least 3.5ms after enabling irrespective of whether adi_adc_IsReady returns ready or not. + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully returned the ready status + * - #ADI_ADC_INVALID_SEQUENCE [D] Cannot be called if the subsystem is not enabled. + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the function + * - #ADI_ADC_NULL_POINTER [D] pbReady is NULL + */ + +ADI_ADC_RESULT adi_adc_IsReady ( + ADI_ADC_HANDLE hDevice, + bool *pbReady +) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + + if (pbReady == NULL) + { + return ADI_ADC_NULL_POINTER; + } + + if (IS_NOT_IN_STATE(ADC_STATUS_SUB_SYSTEM_EN)) + { + return ADI_ADC_INVALID_SEQUENCE; + } +#endif /* ADI_DEBUG */ + + if (IS_IN_STATE(ADC_STATUS_SUB_SYSTEM_READY)) + { + *pbReady = true; + } + else + { + *pbReady = false; + } + return ADI_ADC_SUCCESS; +} + +/** + * @brief Set the Voltage Reference source + * + * @param [in] hDevice Handle to the device instance + * + * @param [in] eVrefSrc Voltage Reference source to be used + * + * @details The API can be used to select the voltage reference to be used by the ADC. This option need to be + * set before enabling the ADC subsystem. + * + * @return Status + * - #ADI_ADC_SUCCESS Succesfully set the Vref source + * - #ADI_ADC_INVALID_PARAMETER Vref source enum passed is invalid. + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle based to the function. + * - #ADI_ADC_INVALID_SEQUENCE [D] VREF cannot be changed once the ADC subsystem is enabled. + */ + +ADI_ADC_RESULT adi_adc_SetVrefSource ( + ADI_ADC_HANDLE hDevice, + ADI_ADC_VREF_SRC eVrefSrc) +{ + ADI_ADC_RESULT eResult = ADI_ADC_SUCCESS; + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + + if (IS_IN_STATE(ADC_STATUS_SUB_SYSTEM_EN)) + { + return ADI_ADC_INVALID_SEQUENCE; + } +#endif /* ADI_DEBUG */ + + pDevice->pReg->CFG &= (uint16_t)(~(BITM_ADC_CFG_REFBUFEN | BITM_ADC_CFG_VREFSEL | BITM_ADC_CFG_VREFVBAT)); + + switch (eVrefSrc) + { + case ADI_ADC_VREF_SRC_INT_1_25_V: + pDevice->pReg->CFG |= BITM_ADC_CFG_REFBUFEN | BITM_ADC_CFG_VREFSEL; + break; + + case ADI_ADC_VREF_SRC_INT_2_50_V: + pDevice->pReg->CFG |= BITM_ADC_CFG_REFBUFEN; + break; + + case ADI_ADC_VREF_SRC_VBAT: + pDevice->pReg->CFG |= BITM_ADC_CFG_VREFVBAT; + break; + + case ADI_ADC_VREF_SRC_EXT: + break; + + default: + eResult = ADI_ADC_INVALID_PARAMETER; + break; + } + + return eResult; +} + + +/** + * @brief Enable/Disable Current Sink + * + * @param [in] hDevice Handle to the device instance + * + * @param [in] bEnable 'true' to Enable and 'false' to Disable current sink + * + * @details If the volatage reference is required to sink current then this option need to be enabled. + * The ADC subsystem has the capability to sink upto 50uA at Vref of 1.25V and 100uA at Vref of 2.5V + + * @return Status + * - #ADI_ADC_SUCCESS Successfully enabled sink + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + */ + +ADI_ADC_RESULT adi_adc_SinkEnable ( + ADI_ADC_HANDLE hDevice, + bool bEnable) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } +#endif /* ADI_DEBUG */ + + if (bEnable == true) + { + pDevice->pReg->CFG |= BITM_ADC_CFG_SINKEN; + } + else + { + pDevice->pReg->CFG &= (uint16_t)~(BITM_ADC_CFG_SINKEN); + } + + return ADI_ADC_SUCCESS; +} + + +/** + * @brief Start the ADC calibration + * + * @param [in] hDevice Handle to the device instance + * + * @details The call to this function initiate calibration of the ADC. The user is recommended to do calibration of the ADC after + * enabling the ADC subsystem. The status of the calibration can be checked using adi_adc_IsCalibrationDone API. + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully initiated calibration of ADC + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_INVALID_SEQUENCE [D] Sampling cannot be enabled if the ADC is enabled. + */ +ADI_ADC_RESULT adi_adc_StartCalibration(ADI_ADC_HANDLE hDevice) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + + /* Calibration cannot be done when ADC is processing the buffers */ + if (IS_IN_ANY_STATE(ADC_STATUS_NON_BLOCKING_EN |ADC_STATUS_BLOCKING_EN)) + { + return ADI_ADC_INVALID_SEQUENCE; + } + +#endif /* ADI_DEBUG */ + + /* Clear the calibration done state */ + CLR_STATE(ADC_STATUS_CALIBRATION_DONE); + + /* Clear ADC_STAT.CALDONE */ + pDevice->pReg->STAT = BITM_ADC_STAT_CALDONE; + + /* Set the state as calibration enabled. This state will be cleared when we get the + calibration done interrupt. */ + SET_STATE (ADC_STATUS_CALIBRATION_EN); + + /* Start ADC calibration */ + pDevice->pReg->CFG |= BITM_ADC_CFG_STARTCAL; + + return ADI_ADC_SUCCESS; +} + +/** + * @brief Returns the status of the calibration which was initiated. + * + * @param [in] hDevice Handle to the device instance + * + * @param [out] pbCalibrationDone Pointer to the location to which the status of calibration is written. + * 'true' if the calibration started by call to is done else 'false' + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully retrieved the status of ADC calibration. + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_NULL_POINTER [D] pbCalibrationDone is NULL + */ + +ADI_ADC_RESULT adi_adc_IsCalibrationDone ( + ADI_ADC_HANDLE hDevice, + bool *pbCalibrationDone) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + + if (pbCalibrationDone == NULL) + { + return ADI_ADC_NULL_POINTER; + } +#endif /* ADI_DEBUG */ + + /* The driver will check whether the driver is set to calibration done state. This state will + * be set in the driver when the calibration done interrupt is received by the driver + */ + if (IS_IN_STATE(ADC_STATUS_CALIBRATION_DONE)) + { + *pbCalibrationDone = true; + } + else + { + *pbCalibrationDone = false; + } + + return ADI_ADC_SUCCESS; +} + + + +/** + * @brief Set the acquisition time of ADC in ADC clock cycles + * + * @param [in] hDevice Handle to the device instance + * + * @param [in] nAcqTimeInAClkCycles Acquisition time in ADC clock cycles. + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully set the acquisition time of ADC + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_INVALID_SEQUENCE [D] Acquisition time cannot be set when the ADC is enabled for sampling + * - #ADI_ADC_INVALID_PARAMETER [D] nAcqTimeInAClkCycles is not in the valid range + */ +ADI_ADC_RESULT adi_adc_SetAcquisitionTime ( + ADI_ADC_HANDLE hDevice, + uint32_t nAcqTimeInAClkCycles + ) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + uint16_t nCnvTime; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + + if (IS_IN_ANY_STATE(ADC_STATUS_NON_BLOCKING_EN |ADC_STATUS_BLOCKING_EN | ADC_STATUS_COMPARATOR_EN)) + { + return ADI_ADC_INVALID_SEQUENCE; + } + + /* A valid range is 1u to the width of the SAMPTIME field + 1. */ + if ((nAcqTimeInAClkCycles == 0u) || (nAcqTimeInAClkCycles > (ADI_MAX_ACQUISITION_TIME))) + { + return ADI_ADC_INVALID_PARAMETER; + } + +#endif /* ADI_DEBUG */ + + /* Acquisition phase is (ADC_CNV_TIME.SAMPTIME + 1) ACLK cycles */ + nCnvTime = pDevice->pReg->CNV_TIME; + nCnvTime &= (uint16_t)(~BITM_ADC_CNV_TIME_SAMPTIME); + nCnvTime |= (uint16_t)((nAcqTimeInAClkCycles - ((uint32_t)1u)) << BITP_ADC_CNV_TIME_SAMPTIME); + pDevice->pReg->CNV_TIME = nCnvTime; + + return ADI_ADC_SUCCESS; +} + +/** + * @brief Set the delay time of ADC in ADC cycles for multi iteration mode. + * + * @param [in] hDevice Handle to the device instance + * + * @param [in] nDelayInAClkCycles Delay time in ADC clock cycles. + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully set delay time + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_INVALID_PARAMETER [D] nDelayInAClkCycles is not in the valid range + */ +ADI_ADC_RESULT adi_adc_SetDelayTime ( + ADI_ADC_HANDLE hDevice, + uint32_t nDelayInAClkCycles) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + uint16_t nCnvTime; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + + if (nDelayInAClkCycles > (BITM_ADC_CNV_TIME_DLY >> BITP_ADC_CNV_TIME_DLY)) + { + return ADI_ADC_INVALID_PARAMETER; + } +#endif /* ADI_DEBUG */ + + nCnvTime = pDevice->pReg->CNV_TIME; + nCnvTime &= (uint16_t)(~BITM_ADC_CNV_TIME_DLY); + nCnvTime |= (uint16_t)(nDelayInAClkCycles << BITP_ADC_CNV_TIME_DLY); + pDevice->pReg->CNV_TIME = nCnvTime; + + return ADI_ADC_SUCCESS; +} + +/** + * @brief Set the resolution of ADC. he default resolution of ADC is 12-bit and the ADC increases the resolution + * by oversampling. Averaging will be disabled when the resolution is more than 12-bits. + * + * @param [in] hDevice Handle to the device instance + * + * @param [in] eResolution Enum of ADC resolution + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully set the resolution of the ADC. + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_INVALID_SEQUENCE [D] Resolution cannot be changed when the ADC is enabled for sampling + * - #ADI_ADC_INVALID_STATE [D] Resolution cannot be changed from 12-bit if averaging is enabled + * - #ADI_ADC_INVALID_PARAMETER eResolution parameter passed is invalid. + */ +ADI_ADC_RESULT adi_adc_SetResolution ( + ADI_ADC_HANDLE hDevice, + ADI_ADC_RESOLUTION eResolution) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + uint16_t nFactor; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + if (IS_IN_ANY_STATE(ADC_STATUS_NON_BLOCKING_EN | ADC_STATUS_BLOCKING_EN | ADC_STATUS_COMPARATOR_EN)) + { + return ADI_ADC_INVALID_SEQUENCE; + } + if (IS_IN_ANY_STATE(ADC_STATUS_AVGERAGING_EN) && (eResolution != ADI_ADC_RESOLUTION_12_BIT)) + { + return ADI_ADC_INVALID_STATE; + } +#endif /* ADI_DEBUG */ + + switch (eResolution) + { + case ADI_ADC_RESOLUTION_12_BIT: + pDevice->pReg->AVG_CFG &= (uint16_t)(~BITM_ADC_AVG_CFG_OS); + if (IS_NOT_IN_STATE(ADC_STATUS_AVGERAGING_EN)) { + pDevice->pReg->AVG_CFG = 0u; + } + CLR_STATE(ADC_STATUS_OVERSAMPLING_EN); + break; + + case ADI_ADC_RESOLUTION_13_BIT: + case ADI_ADC_RESOLUTION_14_BIT: + case ADI_ADC_RESOLUTION_15_BIT: + case ADI_ADC_RESOLUTION_16_BIT: + /* factor = 0x02 for 13-bit + 0x08 for 14-bit + 0x20 for 15-bit + 0x80 for 16-bit */ + nFactor = (uint16_t)1u << (((uint16_t)eResolution * 2u) - ((uint16_t)1u)); + pDevice->pReg->AVG_CFG = BITM_ADC_AVG_CFG_OS | BITM_ADC_AVG_CFG_EN + | (uint16_t)(nFactor << BITP_ADC_AVG_CFG_FACTOR); + SET_STATE(ADC_STATUS_OVERSAMPLING_EN); + + break; + + default: + return ADI_ADC_INVALID_PARAMETER; + } + + return ADI_ADC_SUCCESS; +} + +/** + * @brief Enable Averaging for all ADC channels. + * + * @param [in] hDevice Handle to the device instance + * + * @param [in] nAveragingSamples Specifies the number of samples used for averaging. The valid value is between 1-256, in the steps of power of 2. 1 is for disabling averaging. + * The averaging require that the resolution of ADC is 12-bit. + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully enabled averaging. + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_INVALID_STATE [D] Averaging cannot be enabled if the resolution is above 12bits + * - #ADI_ADC_INVALID_PARAMETER [D] nAveragingSamples parameter passed is invalid. + */ +ADI_ADC_RESULT adi_adc_EnableAveraging ( + ADI_ADC_HANDLE hDevice, + uint16_t nAveragingSamples + ) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + uint16_t nFactor; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + + if ((nAveragingSamples == 0u) || (nAveragingSamples > 256u) + /* Or nAveragingSamples is not a power of 2 */ + || ((nAveragingSamples & (nAveragingSamples - 1u)) != 0u)) + { + return ADI_ADC_INVALID_PARAMETER; + } + if (IS_IN_STATE(ADC_STATUS_OVERSAMPLING_EN)) + { + return ADI_ADC_INVALID_STATE; + } +#endif /* ADI_DEBUG */ + + /* Disable averaging */ + if (nAveragingSamples == 1u) + { + pDevice->pReg->AVG_CFG &= (uint16_t)(~BITM_ADC_AVG_CFG_EN); + CLR_STATE(ADC_STATUS_AVGERAGING_EN); + } + else + { + nFactor = nAveragingSamples >> 1; + pDevice->pReg->AVG_CFG = BITM_ADC_AVG_CFG_EN | (uint16_t)(nFactor << BITP_ADC_AVG_CFG_FACTOR); + SET_STATE(ADC_STATUS_AVGERAGING_EN); + } + + return ADI_ADC_SUCCESS; +} + +/** + * @brief Configure low limit for an ADC channel when it is used as a digital comparator. + * + * @param [in] hDevice Handle to the device instance + * + * @param [in] eChannel The ADC channel for which to configure the comparator + * + * @param [in] bEnable Enable or disable the low limit of the digital comparator + * + * @param [in] nLowLimit The low limit of the digital comparator. If bEnable is false, this paramter is omitted. + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully configured set the low limit. + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_INVALID_PARAMETER [D] Parameters passed is not valid. + */ +ADI_ADC_RESULT adi_adc_SetLowLimit ( + ADI_ADC_HANDLE hDevice, + ADI_ADC_CHANNEL eChannel, + bool bEnable, + uint16_t nLowLimit + ) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + static volatile uint16_t* pRegister[4] = { + pREG_ADC0_LIM0_LO, pREG_ADC0_LIM1_LO, pREG_ADC0_LIM2_LO, pREG_ADC0_LIM3_LO + }; + int32_t nChannelNum = 0; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + if ((nLowLimit > (BITM_ADC_LIM0_LO_VALUE >> BITP_ADC_LIM0_LO_VALUE)) || (nChannelNum < 0) || (nChannelNum > 3)) + { + return ADI_ADC_INVALID_PARAMETER; + } +#endif /* ADI_DEBUG */ + + nChannelNum = nGetChannelNumber(eChannel); + + if((nChannelNum >= 0) && (nChannelNum <= 3)) { + if (bEnable == true) { + + *pRegister[nChannelNum] = (uint16_t)(*pRegister[nChannelNum] & (uint16_t)(~BITM_ADC_LIM0_LO_VALUE)) | + (uint16_t)(nLowLimit << BITP_ADC_LIM0_LO_VALUE); + + /* Now enable this channel comparitor - unused until the comparitor is enabled */ + pDevice->ComparitorLo |= (1u << nChannelNum); + } + else { + pDevice->ComparitorLo &= ~(1u << nChannelNum); + } + } + + return ADI_ADC_SUCCESS; +} + +/** + * @brief Configure high limit for an ADC channel when it's used as a digital comparator. + * + * @param [in] hDevice Handle to the device instance + * + * @param [in] eChannel The ADC channel for which to configure the comparator + * + * @param [in] bEnable Enable or disable the high limit of the digital comparator + * + * @param [in] nHighLimit The high limit of the digital comparator. If bEnable is false, this paramter is omitted. + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully set the high limit + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_INVALID_PARAMETER [D] Parameters passed is not valid. + */ +ADI_ADC_RESULT adi_adc_SetHighLimit ( + ADI_ADC_HANDLE hDevice, + ADI_ADC_CHANNEL eChannel, + bool bEnable, + uint16_t nHighLimit) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + static volatile uint16_t* pRegister[4] = { + pREG_ADC0_LIM0_HI, pREG_ADC0_LIM1_HI, pREG_ADC0_LIM2_HI, pREG_ADC0_LIM3_HI + }; + int32_t nChannelNum = 0; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + if ((nHighLimit > (BITM_ADC_LIM0_HI_VALUE >> BITP_ADC_LIM0_HI_VALUE)) || (nChannelNum < 0) || (nChannelNum > 3)) + { + return ADI_ADC_INVALID_PARAMETER; + } +#endif /* ADI_DEBUG */ + + nChannelNum = nGetChannelNumber(eChannel); + + if((nChannelNum >= 0) && (nChannelNum <= 3)) { + if (bEnable == true) { + /* Set the given high value - only relevant if the limit is enabled. */ + *pRegister[nChannelNum] = (uint16_t)(*pRegister[nChannelNum] & (uint16_t)(~BITM_ADC_LIM0_HI_VALUE)) + | (uint16_t)(nHighLimit << BITP_ADC_LIM0_HI_VALUE); + + /* Now enable this channel comparitor - unused until the comparitor is enabled */ + pDevice->ComparitorHi |= (1u << nChannelNum); + } + else { + pDevice->ComparitorHi &= ~(1u << nChannelNum); + } + } + return ADI_ADC_SUCCESS; +} + +/** + * @brief Configure hysteresis for an ADC channel when it's used as a digital comparator. + * + * @param [in] hDevice Handle to the device instance + * + * @param [in] eChannel The ADC channel for which to configure the comparator + * + * @param [in] bEnable Enable or disable the hysteresis of the digital comparator + * + * @param [in] nHysteresis The hysteresis to be used. If bEnable is false, this paramter is omitted. + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully configured the comparator + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_INVALID_PARAMETER [D] Parameters passed is not valid. + */ +ADI_ADC_RESULT adi_adc_SetHysteresis ( + ADI_ADC_HANDLE hDevice, + ADI_ADC_CHANNEL eChannel, + bool bEnable, + uint16_t nHysteresis) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + static volatile uint16_t* pRegister[4] = { + pREG_ADC0_HYS0, pREG_ADC0_HYS1, pREG_ADC0_HYS2, pREG_ADC0_HYS3 + }; + int32_t nChannelNum = 0; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + if ((nHysteresis > (BITM_ADC_HYS0_VALUE >> BITP_ADC_HYS0_VALUE)) || (nChannelNum < 0) || (nChannelNum > 3)) + { + return ADI_ADC_INVALID_PARAMETER; + } +#endif /* ADI_DEBUG */ + + nChannelNum = nGetChannelNumber(eChannel); + + if((nChannelNum >= 0) && (nChannelNum <= 3)) { + if (bEnable == true) { + *pRegister[nChannelNum] = (uint16_t)(*pRegister[nChannelNum] & (uint16_t)(~BITM_ADC_HYS0_VALUE)) + | (uint16_t)(nHysteresis << BITP_ADC_HYS0_VALUE); + + /* Now enable this channel hysteresis - unused until the comparitor is enabled */ + pDevice->ComparitorHys |= (1u << nChannelNum); + } + else { + pDevice->ComparitorHys &= ~(1u << nChannelNum); + } + } + + return ADI_ADC_SUCCESS; +} + +/** + * @brief Configure number of monitor cycles for an ADC channel when it's used as a digital comparator. + * + * @param [in] hDevice Handle to the device instance + * + * @param [in] eChannel The ADC channel for which to configure the comparator + * + * @param [in] nNumMonitorCycles Number of Monitor cycles before giving interrupt + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully configured the comparator + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_INVALID_PARAMETER [D] Parameters passed is not valid. + */ +ADI_ADC_RESULT adi_adc_SetNumMonitorCycles( + ADI_ADC_HANDLE hDevice, + ADI_ADC_CHANNEL eChannel, + uint32_t nNumMonitorCycles) +{ + #ifdef ADI_DEBUG + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; +#endif /* ADI_DEBUG */ + + static volatile uint16_t* pRegister[4] = { + pREG_ADC0_HYS0, pREG_ADC0_HYS1, pREG_ADC0_HYS2, pREG_ADC0_HYS3 + }; + int32_t nChannelNum = 0; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + if ((nNumMonitorCycles > (BITM_ADC_HYS0_MONCYC >> BITP_ADC_HYS0_MONCYC)) || (nChannelNum < 0) || (nChannelNum > 3)) + { + return ADI_ADC_INVALID_PARAMETER; + } +#endif /* ADI_DEBUG */ + + nChannelNum = nGetChannelNumber(eChannel); + + if((nChannelNum >= 0) && (nChannelNum <= 3)) { + *pRegister[nChannelNum] = (uint16_t)(*pRegister[nChannelNum] & (uint16_t)(~BITM_ADC_HYS0_MONCYC)) + | (uint16_t)(nNumMonitorCycles << BITP_ADC_HYS0_MONCYC); + } + return ADI_ADC_SUCCESS; +} + + + +/** + * @brief Enable/Disable digital comparator for the given channel(s) + * + * @param [in] hDevice Handle to the device instance + * + * @param [in] bEnableComparator 'true' to Enable and 'false' to disable + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully enabled/disabled digital comparator for the given channels + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_INVALID_STATE [D] Digital comparator cannot be enabled if sampling resolution is more than 12-bit or + * averaging is enabled. Comparator for a given channel cannot be enbaled if none of the limits + * are enabled for the given channel. + * - #ADI_ADC_INVALID_SEQUENCE [D] Comparator cannot be enabled when ADC is enabled for sampling. + * - #ADI_ADC_INVALID_OPERATION [D] Comparator require callback to be registered. + */ +ADI_ADC_RESULT adi_adc_EnableDigitalComparator ( + ADI_ADC_HANDLE hDevice, + bool bEnableComparator +) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + + if (IS_IN_ANY_STATE(ADC_STATUS_NON_BLOCKING_EN |ADC_STATUS_BLOCKING_EN)) + { + return ADI_ADC_INVALID_SEQUENCE; + } + + if (IS_IN_ANY_STATE(ADC_STATUS_AVGERAGING_EN | ADC_STATUS_OVERSAMPLING_EN)) + { + return ADI_ADC_INVALID_STATE; + } + + if (pDevice->pfCallback == NULL) { + return ADI_ADC_INVALID_OPERATION; + } + + if (bEnableComparator == true) { + if((pDevice->ComparitorHi | pDevice->ComparitorLo) == 0u) { + return ADI_ADC_INVALID_STATE; + } + } +#endif /* ADI_DEBUG */ + + EnableComparator(pDevice, bEnableComparator); + + return ADI_ADC_SUCCESS; +} + +/** + * @brief Submit the ADC buffer for processing to the ADC Module + * + * @param [in] hDevice Handle to the device instance. + * @param [in] pBuffer Pointer to the #ADI_ADC_BUFFER structure which contains details + * of the buffers required by the driver. + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully submitted the buffer + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_NULL_POINTER [D] pBuffer is NULL + * - #ADI_ADC_INVALID_BUFFER [D] Buffer parameters are invalid. + * + * @note The driver will take ownership of the ADI_ADC_BUFFER structure passed to the driver. + * The application has to make sure the structure is not used and it's scope is valid till + * the structure is returned back to the application. + */ +ADI_ADC_RESULT adi_adc_SubmitBuffer ( + ADI_ADC_HANDLE hDevice, + ADI_ADC_BUFFER* pBuffer +) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + uint32_t nNumChannels = 0u; + + ADC_INT_BUFFER* pIntBuffer; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + if (pBuffer == NULL) { + return ADI_ADC_NULL_POINTER; + } + if ((pBuffer->nChannels == 0u) || (pBuffer->pDataBuffer == NULL) || (pBuffer->nNumConversionPasses == 0u)) + { + return ADI_ADC_INVALID_BUFFER; + } +#endif /* ADI_DEBUG */ + + nNumChannels = GetNumChannels(pBuffer->nChannels); + + pIntBuffer = &pDevice->s_Buffer; + + pIntBuffer->nConfig = ADC_BUFFER_CONFIG_BUFFER_AUTO_MODE_EN; + pIntBuffer->nStatus = ADC_BUFFER_STATUS_OK; + if (pBuffer->nNumConversionPasses == 1u) + { + pIntBuffer->nConfig |= ADC_BUFFER_CONFIG_BUFFER_SINGLE_CONV_EN; + } + pIntBuffer->pUserBuffer = pBuffer; + pIntBuffer->pCurDataBuffer = pBuffer->pDataBuffer; + pIntBuffer->nNumSamplesRemaining = nNumChannels * pBuffer->nNumConversionPasses; + pIntBuffer->nChannels = pBuffer->nChannels; + + pDevice->pfManageFifo(pDevice, ADC_FIFO_MODE_INIT); + + return ADI_ADC_SUCCESS; +} + +/** + * @brief Get a processed buffer from the ADC Driver. This function is a blocking call and will only return + * once it has the buffer or if any error occurred. If a callback is registered then any call to this + * function will fail. + * + * @param [in] hDevice Handle to the device instance. + * @param [out] ppBuffer Pointer to a pointer to ADI_ADC_BUFFER structure. The returned pointer + * to ADI_ADC_BUFFER is written here. + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully returned the buffer + * - #ADI_ADC_INVALID_STATE adi_adc_GetBuffer cannot be called when no buffer is given to the driver for processing. + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_INVALID_OPERATION [D] adi_adc_GetBuffer cannot be used when callback is registered. + * - #ADI_ADC_NULL_POINTER [D] ppBuffer is NULL + * - #ADI_ADC_INVALID_SEQUENCE [D] adi_adc_GetBuffer cannot be used if non-blocking is not enabled. + * + */ +ADI_ADC_RESULT adi_adc_GetBuffer ( + ADI_ADC_HANDLE hDevice, + ADI_ADC_BUFFER **ppBuffer) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + ADI_ADC_RESULT eADCresult = ADI_ADC_SUCCESS; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + if (ppBuffer == NULL) { + return ADI_ADC_NULL_POINTER; + } + if (pDevice->pfCallback != NULL) { + return ADI_ADC_INVALID_OPERATION; + } + if (IS_NOT_IN_STATE(ADC_STATUS_NON_BLOCKING_EN)) { + return ADI_ADC_INVALID_SEQUENCE; + } +#endif /* ADI_DEBUG */ + + if (pDevice->s_Buffer.pUserBuffer == NULL) { + return ADI_ADC_INVALID_STATE; + } + + /* Wait for read completion */ + SEM_PEND(pDevice, ADI_ADC_ERR_RTOS); + + if ((uint16_t)(pDevice->s_Buffer.nStatus & ADC_BUFFER_STATUS_OVERFLOW) != 0u) { + eADCresult = ADI_ADC_BUFFER_OVERFLOW; + } + *ppBuffer = pDevice->s_Buffer.pUserBuffer; + pDevice->s_Buffer.pUserBuffer = NULL; + CLR_STATE(ADC_STATUS_NON_BLOCKING_EN); + + return eADCresult; +} + +/** + * @brief Enable/Disable ADC for sampling + * + * @param [in] hDevice Handle to the device instance + * + * @param [in] bEnable 'true' to Enable and 'false' to disable + * + * @details + * + * @return Status + * - #ADI_ADC_SUCCESS Succesfully Enabled or disabled ADC for sampling + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_INVALID_STATE [D] Non-blocking cannot be enabled if comparator is enabled or any blocking API is in progress. + */ +ADI_ADC_RESULT adi_adc_Enable ( + ADI_ADC_HANDLE hDevice, + bool bEnable) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + + if (IS_IN_ANY_STATE(ADC_STATUS_BLOCKING_EN | ADC_STATUS_COMPARATOR_EN)) { + return ADI_ADC_INVALID_STATE; + } +#endif /* ADI_DEBUG */ + + if (bEnable == true) { + /* Set the driver to be in non-blocking mode */ + SET_STATE(ADC_STATUS_NON_BLOCKING_EN); + + /* Enable the IRQs */ + NVIC_EnableIRQ(ADC0_EVT_IRQn); + + /* Try to submit possible number of buffers */ + InitBufferProcessing(pDevice); + } else { + /* Disble the IRQs */ + NVIC_DisableIRQ(ADC0_EVT_IRQn); + + /* Abort any transaction if present */ + pDevice->pfManageFifo(pDevice, ADC_FIFO_MODE_ABORT); + + CLR_STATE(ADC_STATUS_NON_BLOCKING_EN); + } + + return ADI_ADC_SUCCESS; +} + + +/** + * @brief This function return whether a filled buffer is available to be returned to the user. + * If this function return true, then a call to adi_adc_GetBuffer will not block + * + * @param [in] hDevice Handle to the device instance. + * @param [out] pbIsBufferAvailable Pointer to a bool variable to which the availability of buffer will be written. + * The variable will be set to 'true' if buffer is available else 'false' + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully returned the status of the buffer availability + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_NULL_POINTER [D] pbIsBufferAvailable is valid + * - #ADI_ADC_INVALID_OPERATION [D] adi_adc_IsBufferAvailable cannot be used when callback is registered. + * + */ +ADI_ADC_RESULT adi_adc_IsBufferAvailable ( + ADI_ADC_HANDLE hDevice, + bool *pbIsBufferAvailable) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + if (pbIsBufferAvailable == NULL) + { + return ADI_ADC_NULL_POINTER; + } + if (pDevice->pfCallback != NULL) { + return ADI_ADC_INVALID_OPERATION; + } +#endif /* ADI_DEBUG */ + + if(IS_IN_STATE(ADC_STATUS_SAMPLING_IN_PROGRESS)) + { + *pbIsBufferAvailable = false; + } + else + { + *pbIsBufferAvailable = true; + } + + return ADI_ADC_SUCCESS; +} + + +/** + * @brief Sample the given channels for the given number of conversion passes and put it into the given buffer. This function only return after + * the channels are sampled the given number of conversion times or if any error occurs. + * + * @param [in] hDevice Handle to the device instance + * + * @param [in] nChannels Channels to sample. Should be an ORed value of ADI_ADC_CHANNEL types. + * + * @param [in] nNumConversionPasses Number of conversion passes. In one conversion pass, the ADC will sample all the given channel(s) once. + * + * @param [in] pBuffer Pointer to the buffer to which the sampled data is put. + * + * @param [in] nBuffLength Length of the buffer. The length of the buffer should be at least + * 2*(Num of Channels)*nNumConversionPasses bytes. + * + * @details Sample all the given channels for the given number of conversion passes and put the samples values into the given buffers. + * The channels will be sampled starting from the lower number. This function only return after + * the channels are sampled the given number of conversion times or if any error occurs. + * + * @return Status + * - #ADI_ADC_SUCCESS Succesfully Enabled or disabled ADC for sampling + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_INVALID_PARAMETER [D] Some parameter passed to the function is not valid + * - #ADI_ADC_INVALID_SEQUENCE [D] adi_adc_ReadChannels cannot be called if camparator is enabled or if + * Non-blocking is enabled or if another blocking API is in progress. + */ + +ADI_ADC_RESULT adi_adc_ReadChannels ( + ADI_ADC_HANDLE hDevice, + uint32_t nChannels, + uint32_t nNumConversionPasses, + void *pBuffer, + uint32_t nBuffLength) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + uint32_t nNumChannels = 0u; + ADI_ADC_RESULT eADCresult = ADI_ADC_SUCCESS; + + ADC_INT_BUFFER* pIntBuffer; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + if ((nChannels == 0u) || (nNumConversionPasses == 0u) || (pBuffer == NULL)) + { + return ADI_ADC_INVALID_PARAMETER; + } + if (IS_IN_ANY_STATE(ADC_STATUS_NON_BLOCKING_EN | ADC_STATUS_BLOCKING_EN | ADC_STATUS_COMPARATOR_EN)) + { + return ADI_ADC_INVALID_SEQUENCE; + } +#endif /* ADI_DEBUG */ + + nNumChannels = GetNumChannels(nChannels); + + if (nBuffLength < ((nNumChannels * sizeof(uint16_t)) * nNumConversionPasses)) + { + return ADI_ADC_INSUFFICIENT_MEMORY; + } + + /* Clear ADC status */ + pDevice->pReg->STAT = 0xFFFFu; + + /* Set the driver to be in blocking mode */ + SET_STATE(ADC_STATUS_BLOCKING_EN); + + /* Get the buffer */ + pIntBuffer = &pDevice->s_Buffer; + + pIntBuffer->nConfig = ADC_BUFFER_CONFIG_BUFFER_AUTO_MODE_EN; + if (nNumConversionPasses == 1u) { + pIntBuffer->nConfig |= ADC_BUFFER_CONFIG_BUFFER_SINGLE_CONV_EN; + } + + pIntBuffer->nStatus = ADC_BUFFER_STATUS_OK; + pIntBuffer->pUserBuffer = NULL; + pIntBuffer->pCurDataBuffer = pBuffer; + pIntBuffer->nNumSamplesRemaining = nNumChannels * nNumConversionPasses; + pIntBuffer->nChannels = nChannels; + + pDevice->pfManageFifo(pDevice, ADC_FIFO_MODE_INIT); + + InitBufferProcessing(pDevice); + + /* Wait for read completion */ + SEM_PEND(pDevice, ADI_ADC_ERR_RTOS); + + if ((uint16_t)(pDevice->s_Buffer.nStatus & ADC_BUFFER_STATUS_OVERFLOW) != 0u) { + eADCresult = ADI_ADC_BUFFER_OVERFLOW; + } + + /* Driver is no longer in blocking mode */ + CLR_STATE(ADC_STATUS_BLOCKING_EN); + + /* Enable the IRQs */ + NVIC_DisableIRQ(ADC0_EVT_IRQn); + + return eADCresult; +} + + +/** + * @brief Returns the battery voltage. + * + * @param [in] hDevice Handle to the device instance. + * + * @param [in] nRefVoltage Reference voltage in fixed point(16.16) format. + * + * @param [out] pnBatVoltage Pointer to a variable to which the voltage of the battery will be written. + * The battery voltage will be in fixed point (16.16) format. + * + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully retrieved the battery voltage. + * - #ADI_ADC_BAD_SYS_CLOCK Unable to obtain CLK which is needed to calculate + * voltage conversion timing values. + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_NULL_POINTER [D] pnBatVoltage is NULL + * - #ADI_ADC_INVALID_SEQUENCE [D] ADC sub system should be up and ADC should be free for getting the battery voltage. + */ +ADI_ADC_RESULT adi_adc_GetBatteryVoltage ( + ADI_ADC_HANDLE hDevice, + uint32_t nRefVoltage, + uint32_t *pnBatVoltage) +{ + ADI_ADC_RESULT eResult = ADI_ADC_SUCCESS; + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + uint16_t nConvTimeBackup; + uint16_t nAvgCfgBackup; + uint32_t nAdcValue = 0u; + uint32_t nClock = 0u; + uint32_t nACLKDIVCNT; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + if (pnBatVoltage == NULL) + { + return ADI_ADC_NULL_POINTER; + } + + if (IS_NOT_IN_STATE(ADC_STATUS_SUB_SYSTEM_EN)) { + return ADI_ADC_INVALID_SEQUENCE; + } + + if (IS_IN_ANY_STATE(ADC_STATUS_NON_BLOCKING_EN |ADC_STATUS_BLOCKING_EN | ADC_STATUS_COMPARATOR_EN)) { + return ADI_ADC_INVALID_SEQUENCE; + } +#endif /* ADI_DEBUG */ + + if(adi_pwr_GetClockFrequency(ADI_CLOCK_PCLK, &nClock) == ADI_PWR_SUCCESS) + { + /* Take the backup of registers that need to be changed */ + nConvTimeBackup = pDevice->pReg->CNV_TIME; + nAvgCfgBackup = pDevice->pReg->AVG_CFG; + + /* Set the required value in the registers. */ + nACLKDIVCNT = (*pREG_CLKG0_CLK_CTL1 & BITM_CLKG_CLK_CTL1_ACLKDIVCNT) >> BITP_CLKG_CLK_CTL1_ACLKDIVCNT; + + /* Calculate the number of cycles required for conversion. + * The conversion time required is 500ns = 2000000Hz + */ + nClock = nClock/nACLKDIVCNT; /* nClock = ACLK frequency Hz */ + pDevice->pReg->CNV_TIME = (uint16_t)((nClock/2000000u) + ((uint16_t)1u)); + pDevice->pReg->AVG_CFG = 0u; + + /* Clear the battery done status */ + pDevice->pReg->STAT = BITM_ADC_STAT_BATDONE; + + /* Clear the battery done state */ + CLR_STATE(ADC_STATUS_BATTERY_DONE); + + /* Set the registers */ + pDevice->pReg->CNV_CFG = (BITM_ADC_CNV_CFG_SINGLE | BITM_ADC_CNV_CFG_BAT); + + /* Wait for the Battery done status */ + while (IS_NOT_IN_STATE(ADC_STATUS_BATTERY_DONE)) { ; } + + /* Clear the conversion register */ + pDevice->pReg->CNV_CFG = 0u; + + /* Restore the changed registers */ + pDevice->pReg->CNV_TIME = nConvTimeBackup; + pDevice->pReg->AVG_CFG = nAvgCfgBackup; + + /* Calculate the battery voltage */ + + /* From HRM: converting ADC result to battery voltage, following calculations should be done: + * VBAT = 4 * (adc_out) * Vref / (2^12 - 1) */ + nAdcValue = pDevice->pReg->BAT_OUT; + *pnBatVoltage = (4u * nAdcValue * nRefVoltage) / ADI_ADC_SAMPLE_MAX; + } + else + { + eResult = ADI_ADC_BAD_SYS_CLOCK; + } + + return eResult; +} +/** + * @brief Enable or disable the temperature sensor + * + * @param [in] hDevice Handle to the device instance. + * + * @param [in] bEnable 'true' to enable and 'false' to disable the temperature sensor + * + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully enabled/disabled the temperature sensor + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + */ +ADI_ADC_RESULT adi_adc_EnableTemperatureSensor ( + ADI_ADC_HANDLE hDevice, + bool bEnable) +{ + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } +#endif /* ADI_DEBUG */ + + if (bEnable == true) + { + pDevice->pReg->CFG |= (uint16_t)BITM_ADC_CFG_TMPEN; + SET_STATE(ADC_STATUS_TEMP_SENSOR_EN); + } + else + { + pDevice->pReg->CFG &= (uint16_t)(~BITM_ADC_CFG_TMPEN); + CLR_STATE(ADC_STATUS_TEMP_SENSOR_EN); + } + + return ADI_ADC_SUCCESS; +} + + +/** + * @brief Return the temperature in fixed point format in degree Celcius. + * + * @param [in] hDevice Handle to the device instance. + * + * @param [in] nRefVoltage Reference voltage in fixed point(16.16) format. + * + * @param [out] pnTemperature Pointer to a variable to which the ADC die temperature (in degree Celsius) will be written. + * The temperature will be in fixed point (16.16) format. + * + * + * @return Status + * - #ADI_ADC_SUCCESS Successfully retrieved the die temperature + * - #ADI_ADC_BAD_SYS_CLOCK Unable to obtain CLK which is needed to calculate + * temperature conversion timing values. + * - #ADI_ADC_INVALID_DEVICE_HANDLE [D] Invalid device handle passed to the API + * - #ADI_ADC_NULL_POINTER [D] pnBatVoltage is NULL + * - #ADI_ADC_INVALID_SEQUENCE [D] ADC sub system should be up and ADC should be free for getting the battery voltage. The Temperator + * sensor also need to be enabled. + * - #ADI_ADC_INVALID_STATE [D] Temperature sensor require an aquisition time of 65us and that cannot be set with the current + * ACLK since only ACLK of 255 can be stored to the sampling register. Decrease the ACLK clock to + * rectify this. + */ +ADI_ADC_RESULT adi_adc_GetTemperature ( + ADI_ADC_HANDLE hDevice, + uint32_t nRefVoltage, + int32_t* pnTemperature + ) +{ + ADI_ADC_RESULT eResult = ADI_ADC_SUCCESS; + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *)hDevice; + uint16_t nConvTimeBackup; + uint16_t nAvgCfgBackup; + uint32_t nAdcTmpValue = 0u; + uint32_t nAdcTmp2Value = 0u; + uint32_t nClock = 0u; + uint32_t nACLKDIVCNT; + uint32_t nCnvTime; + +#ifdef ADI_DEBUG + if (pDevice == NULL) + { + return ADI_ADC_INVALID_DEVICE_HANDLE; + } + if (pnTemperature == NULL) + { + return ADI_ADC_NULL_POINTER; + } + + if (IS_NOT_IN_STATE(ADC_STATUS_SUB_SYSTEM_EN | ADC_STATUS_TEMP_SENSOR_EN)) + { + return ADI_ADC_INVALID_SEQUENCE; + } + + if (IS_IN_ANY_STATE(ADC_STATUS_NON_BLOCKING_EN | ADC_STATUS_BLOCKING_EN | ADC_STATUS_COMPARATOR_EN)) + { + return ADI_ADC_INVALID_SEQUENCE; + } +#endif + + + if(adi_pwr_GetClockFrequency(ADI_CLOCK_PCLK, &nClock) == ADI_PWR_SUCCESS) + { + /* Calculate the conversion time */ + nACLKDIVCNT = (*pREG_CLKG0_CLK_CTL1 & BITM_CLKG_CLK_CTL1_ACLKDIVCNT) >> BITP_CLKG_CLK_CTL1_ACLKDIVCNT; + nCnvTime = ((nClock / nACLKDIVCNT) / (uint16_t)15385u) + 1u; /* 65us acquisition time required = 15385Hz sample */ + + #ifdef ADI_DEBUG + if (nCnvTime >= 256u) { + return ADI_ADC_INVALID_STATE; + } + #endif + /* Take the backup of registers that need to be changed */ + nConvTimeBackup = pDevice->pReg->CNV_TIME; + nAvgCfgBackup = pDevice->pReg->AVG_CFG; + + /* Set the required value in the registers. */ + + pDevice->pReg->CNV_TIME = (uint16_t)((nCnvTime << BITP_ADC_CNV_TIME_SAMPTIME) & BITM_ADC_CNV_TIME_SAMPTIME); + pDevice->pReg->AVG_CFG = 0u; + + /* Clear the temperature done status */ + pDevice->pReg->STAT = BITM_ADC_STAT_TMPDONE | BITM_ADC_STAT_TMP2DONE; + + /* Clear the temperature done state */ + CLR_STATE(ADC_STATUS_TMP_DONE | ADC_STATUS_TMP2_DONE); + + /* Sample Tmp register */ + pDevice->pReg->CNV_CFG = (BITM_ADC_CNV_CFG_SINGLE | BITM_ADC_CNV_CFG_TMP); + while (IS_NOT_IN_STATE(ADC_STATUS_TMP_DONE)) { ; } + nAdcTmpValue = pDevice->pReg->TMP_OUT; + pDevice->pReg->CNV_CFG = 0u; + + + /* Sample Tmp2 register */ + pDevice->pReg->CNV_CFG = (BITM_ADC_CNV_CFG_SINGLE | BITM_ADC_CNV_CFG_TMP2); + while (IS_NOT_IN_STATE(ADC_STATUS_TMP2_DONE)) { ; } + pDevice->pReg->CNV_CFG = 0u; + nAdcTmp2Value = pDevice->pReg->TMP2_OUT; + + /* Restore the changed registers */ + pDevice->pReg->CNV_TIME = nConvTimeBackup; + pDevice->pReg->AVG_CFG = nAvgCfgBackup; + + /* Calculate the temperature voltage. + * From the HRM: Temperature can be calculated as: + * + * T(^0 C)= code1/(code2+RG*code1)*Rvirtualreference/(ideal_sensitivity )-273.15 + * + * Some of these values are constants, and some have been read from registers. + * The above formula, when populated with variables and constants, would look like this: + * T(^0 C)= (nAdcTmpValue/(nAdcTmp2Value + nTempRG * nAdcTmpValue)) * (1.2256/1.2411e-3)) -273.15 + */ + { + uint32_t nRVirRefByIdealSensitivity = 2070960834u; /* 1.2256/1.2411e-3 in 11.21 format */ + + uint32_t nTempRG = 19380u; /* 1.1829 in 2.14 format */ + uint32_t nTmp2 = ((nAdcTmp2Value << 14u) + (nTempRG * nAdcTmpValue)); /* in 14.14 format */ + + uint32_t nOffsetPart = (335544320u/nRefVoltage); /* (1.25 in 4.28 format / ReferenceVoltage(16.16)) = Result in format *.12 */ + uint32_t nOffset = (161u * nOffsetPart); /* 12.12 format */ + + uint32_t nTmp3 = ((nAdcTmpValue << 12) - nOffset) << 8u; /* Format 12.20 */ + uint32_t nRatio = (nTmp3/(nTmp2 >> 10u)); /* nTmp2 resolution reduced by 10 to 14.4 and the result resolution is 0.16 */ + uint32_t nTemp = (nRatio * (nRVirRefByIdealSensitivity >> 16u)) >> 5u; /* Temperature in degree kelvin in 16.16 format */ + + int32_t iTemp = (int32_t)nTemp - ((int32_t)17901158); /* Subtract 273.15 (in 16.16) to get the temperature in degree celcius */ + *pnTemperature = iTemp; + } + } + else + { + eResult = ADI_ADC_BAD_SYS_CLOCK; + } + + return eResult; +} + + +/*! \cond PRIVATE */ + +/*========== S T A T I C F U N C T I O N S ==========*/ +/* Read the output register for the given channel number */ +static uint16_t ReadOutReg(uint32_t nChannelNum) +{ + const volatile uint16_t* pOutRegister = pREG_ADC0_CH0_OUT; + pOutRegister += nChannelNum*2u; + return *pOutRegister; +} + +/* Init buffer processing */ +static bool InitBufferProcessing(ADI_ADC_DEVICE *pDevice) +{ + uint32_t nCnvReg = ((uint32_t)(pDevice->pReg->CNV_CFG) & BITM_ADC_CNV_CFG_DMAEN); + ADC_INT_BUFFER* pIntBuffer = &pDevice->s_Buffer; + + if (IS_NOT_IN_ANY_STATE(ADC_STATUS_SAMPLING_IN_PROGRESS)) + { + /* Clear conversion done flags */ + pDevice->pReg->STAT = 0xFFFFu; + + /* Clear the overflow and alert register */ + pDevice->pReg->OVF = 0xFFFFu; + } + + /* Calculate the conversion register value for the given configuration */ + nCnvReg |= pIntBuffer->nChannels; + if ((uint16_t)(pIntBuffer->nConfig & ADC_BUFFER_CONFIG_BUFFER_AUTO_MODE_EN) != 0u) { + nCnvReg |= BITM_ADC_CNV_CFG_AUTOMODE; + } + if ((pIntBuffer->nConfig & ADC_BUFFER_CONFIG_BUFFER_SINGLE_CONV_EN) != 0u) { + nCnvReg |= BITM_ADC_CNV_CFG_SINGLE; + } else { + nCnvReg |= BITM_ADC_CNV_CFG_MULTI; + } + + SET_STATE(ADC_STATUS_SAMPLING_IN_PROGRESS); + + pDevice->pReg->CNV_CFG |= (uint16_t)nCnvReg; + + pDevice->pfManageFifo(pDevice, ADC_FIFO_MODE_ENABLED); + + return true; +} + + +#if ADI_ADC_ENABLE_MULTI_ACQUIRE == 1 +/* DMA Callback Handler */ +void DMA_ADC0_Int_Handler (void) +{ + ISR_PROLOG(); + ADI_ADC_DEVICE *pDevice = (ADI_ADC_DEVICE *) AdcDevInfo[0].hDevice; + + DmaFIFOManage(pDevice, ADC_FIFO_MODE_DMA_BUFFER_PROCESS); + + ISR_EPILOG(); +} + +static ADI_ADC_RESULT DmaFIFOManage (ADI_ADC_DEVICE *pDevice, ADC_FIFO_MODE eFifoMode) +{ + uint16_t nCount = 0u; + uint16_t chanNum = ADC0_CHANn; + uint16_t IRQ_Backup; + + ADC_INT_BUFFER* pIntBuffer = &pDevice->s_Buffer; + + if(pDevice->s_Buffer.pCurDataBuffer == NULL) { + /* If there is nothing active... */ + if (eFifoMode == ADC_FIFO_MODE_INTERRUPT_PROCESS) { + /* ...it's something leftover, so cleanup. */ + uint16_t nStat = pDevice->pReg->STAT & 0x00FFu; + FlushFifo(pDevice, (uint32_t)nStat); + pDevice->pReg->STAT = nStat; + } + } + else { + switch (eFifoMode) + { + case ADC_FIFO_MODE_INIT: + + /* Enable the interrupt for the given DMA */ + NVIC_EnableIRQ(DMA0_CH24_DONE_IRQn); + + pADI_DMA0->SRCADDR_CLR = 1U << chanNum; + + /* Enable the channel */ + pADI_DMA0->EN_SET = 1U << chanNum; + + /* Enables peripheral to generate DMA requests. */ + pADI_DMA0->RMSK_CLR = 1U << chanNum; + + /* Set the primary as the current DMA descriptor */ + pADI_DMA0->ALT_CLR = 1U << chanNum; /* Should be default */ + + /* Setup the DMA registers */ + nCount = (uint16_t)pIntBuffer->nNumSamplesRemaining; + + /* Point to the end of the DMA source */ + pPrimaryCCD[chanNum].DMASRCEND = (uint32_t)(&(pDevice->pReg->DMA_OUT)); + + /* Point to the end of the DMA write-to destination */ + pPrimaryCCD[chanNum].DMADSTEND = (uint32_t)((void*)pIntBuffer->pCurDataBuffer) + ((nCount * 2u) - 1u); + + /* Configure the DMA itself */ + pPrimaryCCD[chanNum].DMACDC = ((ADI_DMA_INCR_2_BYTE << DMA_BITP_CTL_DST_INC) | /* Increment destination address */ + (ADI_DMA_INCR_NONE << DMA_BITP_CTL_SRC_INC) | /* Don't increment the source address */ + ((uint32_t)ADI_DMA_WIDTH_2_BYTE << DMA_BITP_CTL_SRC_SIZE) | /* 16bit transfers */ + ((nCount - (uint32_t)1U)<< DMA_BITP_CTL_N_MINUS_1) | /* Data size? */ + (DMA_ENUM_CTL_CYCLE_CTL_BASIC << DMA_BITP_CTL_CYCLE_CTL) | /* Basic only */ + ((uint32_t)ADI_DMA_RPOWER_1 << DMA_BITP_CTL_R_POWER)); /* Arbitration */ + + /* Enable DMA */ + pDevice->pReg->CNV_CFG |= BITM_ADC_CNV_CFG_DMAEN; + break; + + case ADC_FIFO_MODE_ENABLED: + break; + + case ADC_FIFO_MODE_INTERRUPT_PROCESS: + /* Clear the status registers */ + pDevice->pReg->STAT = (pDevice->pReg->STAT & 0x00FFu); + break; + + case ADC_FIFO_MODE_INTERRUPT_OVERFLOW: + pIntBuffer->nStatus |= ADC_BUFFER_STATUS_OVERFLOW; + break; + + case ADC_FIFO_MODE_DMA_BUFFER_PROCESS: + pIntBuffer->nNumSamplesRemaining = 0u; + ManageFifoCompletion(pDevice); + break; + + case ADC_FIFO_MODE_ABORT: + + /* Take backup of IRQ */ + IRQ_Backup = pDevice->pReg->IRQ_EN; + + /* Disable the IRQ */ + pDevice->pReg->IRQ_EN = 0u; + + /* Clear the conversion cfg register to stop any transaction */ + pDevice->pReg->CNV_CFG = 0u; + + /* Disable the DMA channel */ + pADI_DMA0->EN_CLR = 1U << chanNum; + + /* Clear the status bits */ + pDevice->pReg->STAT = pDevice->pReg->STAT; + + /* Clear the sampling in progress state */ + CLR_STATE(ADC_STATUS_SAMPLING_IN_PROGRESS); + + /* Read and flush all the buffers */ + FlushFifo(pDevice, 0x00FFu); + + /* Restore the IRQ */ + pDevice->pReg->IRQ_EN = IRQ_Backup; + + break; + + default: + break; + } + } + + return ADI_ADC_SUCCESS; +} +#else /* else ADI_ADC_ENABLE_MULTI_ACQUIRE == 0 */ + +static ADI_ADC_RESULT InterruptFIFOManage (ADI_ADC_DEVICE *pDevice, ADC_FIFO_MODE eFifoMode) +{ + ADC_INT_BUFFER* pIntBuffer = &pDevice->s_Buffer; + + if(pDevice->s_Buffer.pCurDataBuffer == NULL) { + if (eFifoMode == ADC_FIFO_MODE_INTERRUPT_PROCESS) { + uint16_t nStat = pDevice->pReg->STAT & 0x00FFu; + FlushFifo(pDevice, (uint32_t)nStat); + pDevice->pReg->STAT = nStat; + } + return ADI_ADC_SUCCESS; + } + + switch (eFifoMode) + { + case ADC_FIFO_MODE_INIT: + { + /* Enable the conversion done and overflow interrupt */ + pDevice->ActData.nCurChannel = 0u; + } + break; + + case ADC_FIFO_MODE_ENABLED: + break; + + case ADC_FIFO_MODE_INTERRUPT_PROCESS: + { + while (pIntBuffer->nNumSamplesRemaining > 0u) { + uint32_t nConvStatus = ((uint32_t)pDevice->pReg->STAT & (uint32_t)0x00FFu); + if ((nConvStatus & 0x00FFu) == 0u) + { + break; + } + + uint32_t nCurChannelBitM = ((uint32_t)1u << pDevice->ActData.nCurChannel); + while ((nCurChannelBitM & nConvStatus) == 0u) { + pDevice->ActData.nCurChannel++; + if (pDevice->ActData.nCurChannel >= NUM_ADC_CHANNELS) { + pDevice->ActData.nCurChannel = 0u; + } + nCurChannelBitM = ((uint32_t)1u << pDevice->ActData.nCurChannel); + } + + assert ((pIntBuffer->nChannels & ((uint32_t)1u << pDevice->ActData.nCurChannel)) != 0u); + + *pIntBuffer->pCurDataBuffer = ReadOutReg( pDevice->ActData.nCurChannel); + pIntBuffer->pCurDataBuffer++; + + + pDevice->pReg->STAT = (uint16_t)nCurChannelBitM; + pIntBuffer->nNumSamplesRemaining -= 1u; + + pDevice->ActData.nCurChannel += 1u; + if ( pDevice->ActData.nCurChannel >= NUM_ADC_CHANNELS) { + pDevice->ActData.nCurChannel = 0u; + } + } + + if (pIntBuffer->nNumSamplesRemaining == 0u) { + ManageFifoCompletion(pDevice); + } + } + break; + + case ADC_FIFO_MODE_INTERRUPT_OVERFLOW: + { + pIntBuffer->nStatus |= ADC_BUFFER_STATUS_OVERFLOW; + } + break; + + case ADC_FIFO_MODE_ABORT: + { + uint16_t IRQ_Backup; + + /* Take backup of IRQ */ + IRQ_Backup = pDevice->pReg->IRQ_EN; + + /* Disable the IRQ */ + pDevice->pReg->IRQ_EN = 0u; + + /* Clear the conversion cfg register to stop any transaction */ + pDevice->pReg->CNV_CFG = 0u; + + /* Clear the status bits */ + pDevice->pReg->STAT = pDevice->pReg->STAT; + + /* Clear the sampling in progress state */ + CLR_STATE(ADC_STATUS_SAMPLING_IN_PROGRESS); + + /* Read and flush all the buffers */ + FlushFifo(pDevice, 0x00FFu); + + /* Restore the IRQ */ + pDevice->pReg->IRQ_EN = IRQ_Backup; + } + break; + + default: + break; + } + + return ADI_ADC_SUCCESS; +} +#endif + +static void FlushFifo(ADI_ADC_DEVICE *pDevice, uint32_t nChannels) +{ + uint32_t x; + for (x = 0u; x < 8u; x++) { + if ((nChannels & ((uint32_t)1u << x)) != 0u) { + ReadOutReg(x); + } + } +} + + +/* Called when a transfer is complete */ +static void ManageFifoCompletion(ADI_ADC_DEVICE *pDevice) +{ + /* Clear the conversion configuration */ + pDevice->pReg->CNV_CFG = 0u; + CLR_STATE(ADC_STATUS_SAMPLING_IN_PROGRESS); + + SEM_POST(pDevice); +} + + +/* Internal function to extract the number of channels + * in a 32bit word. */ +static uint32_t GetNumChannels(uint32_t nChannels) +{ + uint32_t n = nChannels & 0x000000FFu; + + n = (n & 0x00000055u) + ((n >> 1u) & 0x00000055u); + n = (n & 0x00000033u) + ((n >> 2u) & 0x00000033u); + n = (n + (n >> 4u)) & (0x0000000Fu); + + return n; +} + +/* Returns the channel number based on the ADI_ADC_CHANNEL type. + * i.e. ADI_ADC_CHANNEL1 returns 1. */ +static int32_t nGetChannelNumber(ADI_ADC_CHANNEL eChannel) +{ + int32_t retVal = 0; + uint32_t nChannel = (uint32_t)eChannel & 0x000000FFu; + + if ((nChannel & (nChannel - (uint32_t)1u)) != 0u) { + return -1; + } + if ((nChannel & 0x000000AAu) != 0u) { retVal += 1; } + if ((nChannel & 0x000000CCu) != 0u) { retVal += 2; } + if ((nChannel & 0x000000F0u) != 0u) { retVal += 4; } + + return retVal; +} + +/* Internal function to set static configuration options. */ +static void StaticConfiguration(ADI_ADC_DEVICE *pDevice) +{ + uint16_t nCfgReg = 0u; + + /* Configure the resolution */ +#if ADI_ADC_CFG_RESOLUTION == 12 + pDevice->pReg->AVG_CFG = 0u; +#else + +#if ADI_ADC_CFG_RESOLUTION == 13 + pDevice->pReg->AVG_CFG = BITM_ADC_AVG_CFG_OS | BITM_ADC_AVG_CFG_EN | (0x0002u << BITP_ADC_AVG_CFG_FACTOR); +#elif ADI_ADC_CFG_RESOLUTION == 14 + pDevice->pReg->AVG_CFG = BITM_ADC_AVG_CFG_OS | BITM_ADC_AVG_CFG_EN | (0x0008u << BITP_ADC_AVG_CFG_FACTOR); +#elif ADI_ADC_CFG_RESOLUTION == 15 + pDevice->pReg->AVG_CFG = BITM_ADC_AVG_CFG_OS | BITM_ADC_AVG_CFG_EN | (0x0020u << BITP_ADC_AVG_CFG_FACTOR); +#elif ADI_ADC_CFG_RESOLUTION == 16 + pDevice->pReg->AVG_CFG = BITM_ADC_AVG_CFG_OS | BITM_ADC_AVG_CFG_EN | (0x0080u << BITP_ADC_AVG_CFG_FACTOR); +#else +#error "Invalid Resolution" +#endif + + SET_STATE(ADC_STATUS_OVERSAMPLING_EN); +#endif + + /* Configure the VREF */ +#if ADI_ADC_CFG_VREF == 0 /* 1.25V Internal Reference*/ + nCfgReg |= BITM_ADC_CFG_REFBUFEN | BITM_ADC_CFG_VREFSEL; +#elif ADI_ADC_CFG_VREF == 1 /* 2.5V Internal Reference */ + nCfgReg |= BITM_ADC_CFG_REFBUFEN; +#elif ADI_ADC_CFG_VREF == 2 /* Battery Voltage */ + nCfgReg |= BITM_ADC_CFG_VREFVBAT; +#endif + + pDevice->pReg->CFG = nCfgReg; + +#if ADI_ADC_ENABLE_STATIC_COMPARATOR == 1 + /* High limit registers */ +#if ADI_ADC_COMPARATOR_AIN0_HI_EN == 1 + pDevice->pReg->LIM0_HI = ADI_ADC_COMPARATOR_AIN0_HI_VAL; + pDevice->ComparitorHi |= ADI_ADC_CHANNEL_0; +#endif +#if ADI_ADC_COMPARATOR_AIN1_HI_EN == 1 + pDevice->pReg->LIM1_HI = ADI_ADC_COMPARATOR_AIN1_HI_VAL; + pDevice->ComparitorHi |= ADI_ADC_CHANNEL_1; +#endif +#if ADI_ADC_COMPARATOR_AIN2_HI_EN == 1 + pDevice->pReg->LIM2_HI = ADI_ADC_COMPARATOR_AIN2_HI_VAL; + pDevice->ComparitorHi |= ADI_ADC_CHANNEL_2; +#endif +#if ADI_ADC_COMPARATOR_AIN3_HI_EN == 1 + pDevice->pReg->LIM3_HI = ADI_ADC_COMPARATOR_AIN3_HI_VAL; + pDevice->ComparitorHi |= ADI_ADC_CHANNEL_3; +#endif + /* Low limit registers */ +#if ADI_ADC_COMPARATOR_AIN0_LO_EN == 1 + pDevice->pReg->LIM0_LO = (uint16_t)ADI_ADC_COMPARATOR_AIN0_LO_VAL; + pDevice->ComparitorLo |= ADI_ADC_CHANNEL_0; +#endif +#if ADI_ADC_COMPARATOR_AIN1_LO_EN == 1 + pDevice->pReg->LIM1_LO = ADI_ADC_COMPARATOR_AIN1_LO_VAL; + pDevice->ComparitorLo |= ADI_ADC_CHANNEL_1; +#endif +#if ADI_ADC_COMPARATOR_AIN2_LO_EN == 1 + pDevice->pReg->LIM2_LO = ADI_ADC_COMPARATOR_AIN2_LO_VAL; + pDevice->ComparitorLo |= ADI_ADC_CHANNEL_2; +#endif +#if ADI_ADC_COMPARATOR_AIN3_LO_EN == 1 + pDevice->pReg->LIM3_LO = ADI_ADC_COMPARATOR_AIN3_LO_VAL; + pDevice->ComparitorLo |= ADI_ADC_CHANNEL_3; +#endif + + /* Hysteresis registers */ +#if ADI_ADC_COMPARATOR_AIN0_HYS_EN == 1 + pDevice->pReg->HYS0 = (uint16_t)(ADI_ADC_COMPARATOR_AIN0_HYS_VAL | (ADI_ADC_COMPARATOR_AIN0_HYS_CYC << BITP_ADC_HYS0_MONCYC)); + pDevice->ComparitorHys |= ADI_ADC_CHANNEL_0; +#endif +#if ADI_ADC_COMPARATOR_AIN1_HYS_EN == 1 + pDevice->pReg->HYS1 = (ADI_ADC_COMPARATOR_AIN1_HYS_VAL | (ADI_ADC_COMPARATOR_AIN1_HYS_CYC << BITP_ADC_HYS0_MONCYC)); + pDevice->ComparitorHys |= ADI_ADC_CHANNEL_1; +#endif +#if ADI_ADC_COMPARATOR_AIN2_HYS_EN == 1 + pDevice->pReg->HYS2 = (ADI_ADC_COMPARATOR_AIN2_HYS_VAL | (ADI_ADC_COMPARATOR_AIN2_HYS_CYC << BITP_ADC_HYS0_MONCYC)); + pDevice->ComparitorHys |= ADI_ADC_CHANNEL_2; +#endif +#if ADI_ADC_COMPARATOR_AIN3_HYS_EN == 1 + pDevice->pReg->HYS3 = (ADI_ADC_COMPARATOR_AIN3_HYS_VAL | (ADI_ADC_COMPARATOR_AIN3_HYS_CYC << BITP_ADC_HYS0_MONCYC)); + pDevice->ComparitorHys |= ADI_ADC_CHANNEL_3; +#endif +#endif + +} + +/* Internal function to enable the comparitor for previously-configured channels + * Does not set the limits, only enables. +*/ +static void EnableComparator(ADI_ADC_DEVICE *pDevice, bool bEnable) +{ + uint32_t x; + uint16_t nCnvCfg = 0u; + volatile uint16_t* pLO_Register[4] = {pREG_ADC0_LIM0_LO, pREG_ADC0_LIM1_LO, pREG_ADC0_LIM2_LO, pREG_ADC0_LIM3_LO}; + volatile uint16_t* pHI_Register[4] = {pREG_ADC0_LIM0_HI, pREG_ADC0_LIM1_HI, pREG_ADC0_LIM2_HI, pREG_ADC0_LIM3_HI}; + volatile uint16_t* pHYS_Register[4] = {pREG_ADC0_HYS0, pREG_ADC0_HYS1, pREG_ADC0_HYS2, pREG_ADC0_HYS3}; + + if (bEnable == true) + { + /* Loop round all the channels enabling each part if required. */ + for (x = 0u; x < NUM_ADC_COMPARATOR_CHANNELS; x++) { + if((pDevice->ComparitorHi & (1u << x)) > 0u) { + *pHI_Register[x] |= BITM_ADC_LIM0_HI_EN; + } + if((pDevice->ComparitorLo & (1u << x)) > 0u) { + *pLO_Register[x] |= BITM_ADC_LIM0_LO_EN; + } + if((pDevice->ComparitorHys & (1u << x)) > 0u) { + *pHYS_Register[x] |= BITM_ADC_HYS0_EN; + } + } + nCnvCfg = (uint16_t)((uint16_t)pDevice->ComparitorHi | (uint16_t)pDevice->ComparitorLo); + + pDevice->pReg->IRQ_EN &= (uint16_t)(~BITM_ADC_IRQ_EN_CNVDONE); + pDevice->pReg->CNV_CFG = (uint16_t)nCnvCfg | (uint16_t)(BITM_ADC_CNV_CFG_MULTI | BITM_ADC_CNV_CFG_AUTOMODE); + SET_STATE(ADC_STATUS_COMPARATOR_EN); + } + else { + /* Loop round disabling all. */ + for (x = 0u; x < NUM_ADC_COMPARATOR_CHANNELS; x++) { + *pHI_Register[x] &= (uint16_t)(~(BITM_ADC_LIM0_HI_EN)); + *pLO_Register[x] &= (uint16_t)(~(BITM_ADC_LIM0_LO_EN)); + *pHYS_Register[x] &= (uint16_t)(~(BITM_ADC_HYS0_EN)); + } + pDevice->pReg->CNV_CFG = 0u; + pDevice->pReg->STAT = pDevice->pReg->STAT & 0x00FFu; + CLR_STATE(ADC_STATUS_COMPARATOR_EN); + pDevice->pReg->IRQ_EN |= BITM_ADC_IRQ_EN_CNVDONE; + } +} + + +/* In Handler handles the following cases: + * ADI_ADC_EVENT_ADC_READY + * ADI_ADC_EVENT_CALIBRATION_DONE + * ADC_STATUS_BATTERY_DONE + * ADC_STATUS_TMP_DONE + * ADC_STATUS_TMP2_DONE + * ADI_ADC_EVENT_HIGH_LIMIT_CROSSED + * ADI_ADC_EVENT_LOW_LIMIT_CROSSED +*/ +void ADC0_Int_Handler(void) +{ + ADI_ADC_DEVICE *pDevice; + ISR_PROLOG(); + + pDevice = (ADI_ADC_DEVICE *) AdcDevInfo[0].hDevice; + + if ((pDevice->pReg->STAT & 0x00FFu) != 0u) { + if (IS_NOT_IN_STATE(ADC_STATUS_COMPARATOR_EN)) { + pDevice->pfManageFifo(pDevice, ADC_FIFO_MODE_INTERRUPT_PROCESS); + } else { + pDevice->pReg->STAT = pDevice->pReg->STAT & (0x00FFu); + } + } + if ((uint16_t)(pDevice->pReg->STAT & 0xFF00u) != 0u) { + if ((pDevice->pReg->STAT & BITM_ADC_STAT_RDY) != 0u) { + SET_STATE(ADC_STATUS_SUB_SYSTEM_READY); + pDevice->pReg->STAT = BITM_ADC_STAT_RDY; + if (pDevice->pfCallback != NULL) { + pDevice->pfCallback(pDevice->pCBParam, ADI_ADC_EVENT_ADC_READY, NULL); + } + } + if ((pDevice->pReg->STAT & BITM_ADC_STAT_CALDONE) != 0u) { + SET_STATE(ADC_STATUS_CALIBRATION_DONE); + pDevice->pReg->STAT = BITM_ADC_STAT_CALDONE; + if (pDevice->pfCallback != NULL) { + pDevice->pfCallback(pDevice->pCBParam, ADI_ADC_EVENT_CALIBRATION_DONE, NULL); + } + } + if ((pDevice->pReg->STAT & BITM_ADC_STAT_BATDONE) != 0u) { + SET_STATE(ADC_STATUS_BATTERY_DONE); + pDevice->pReg->STAT = BITM_ADC_STAT_BATDONE; + } + + if ((pDevice->pReg->STAT & BITM_ADC_STAT_TMPDONE) != 0u) { + SET_STATE(ADC_STATUS_TMP_DONE); + pDevice->pReg->STAT = BITM_ADC_STAT_TMPDONE; + } + + if ((pDevice->pReg->STAT & BITM_ADC_STAT_TMP2DONE) != 0u) { + SET_STATE(ADC_STATUS_TMP2_DONE); + pDevice->pReg->STAT = BITM_ADC_STAT_TMP2DONE; + } + } + if (pDevice->pReg->OVF) { + uint16_t nOvrFlowValue = pDevice->pReg->OVF; + if (IS_NOT_IN_STATE(ADC_STATUS_COMPARATOR_EN)) { + pDevice->pfManageFifo(pDevice, ADC_FIFO_MODE_INTERRUPT_OVERFLOW); + } + pDevice->pReg->OVF = nOvrFlowValue; + } + if (pDevice->pReg->ALERT) { + uint32_t nAlertValue = pDevice->pReg->ALERT; + uint32_t channel; + if (IS_IN_STATE(ADC_STATUS_COMPARATOR_EN) && (pDevice->pfCallback != NULL)) { + for (channel = 0u; channel < (NUM_ADC_COMPARATOR_CHANNELS); channel++) { + /* Alert bit positions: hi limits are 0b01, + * lo limit alerts are 0b10. + */ + if((nAlertValue & (1u << (2u * channel))) > 0u) { + pDevice->pfCallback(pDevice->pCBParam, ADI_ADC_EVENT_HIGH_LIMIT_CROSSED, (void*)channel); + } + if((nAlertValue & (1u << ((2u * channel) + ((uint32_t)1u)))) > 0u) + { + pDevice->pfCallback(pDevice->pCBParam, ADI_ADC_EVENT_LOW_LIMIT_CROSSED, (void*)channel); + } + } + } + pDevice->pReg->ALERT = (uint16_t)nAlertValue; + } + ISR_EPILOG(); +} + + +/*! \endcond */ + +#endif /* ADI_ADC_C */ + +/*****/ + +/*@}*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adc/adi_adc_data.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adc/adi_adc_data.c new file mode 100755 index 0000000000..9ebc296297 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adc/adi_adc_data.c @@ -0,0 +1,19 @@ +#ifndef ADI_ADC_DATA_C +#define ADI_ADC_DATA_C + +#include +#include +#include "adi_adc_def.h" + +/*! \cond PRIVATE */ + +static ADI_ADC_INFO AdcDevInfo[] = { + { + NULL, + (ADI_ADC_TypeDef*)REG_ADC0_CFG + } +}; + +/*! \endcond */ + +#endif /* ADI_ADC_DATA_C */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adc/adi_adc_def.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adc/adi_adc_def.h new file mode 100755 index 0000000000..6568f6f277 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adc/adi_adc_def.h @@ -0,0 +1,120 @@ +/*! \cond PRIVATE */ + +#ifndef ADI_ADC_DEF +#define ADI_ADC_DEF + +#include +#include + +#if defined(__ECC__) +#define ALIGN +#define ALIGN4 _Pragma("align(4)") +#elif defined(__ICCARM__) +#define ALIGN _Pragma("pack()") +#define ALIGN4 _Pragma("pack(4)") +#elif defined (__GNUC__) +#define ALIGN _Pragma("pack()") +#define ALIGN4 _Pragma("pack(4)") +#endif + + +#define IS_IN_STATE(X) ((pDevice->nDriverStatus & (uint32_t)(X)) == (uint32_t)(X)) +#define IS_NOT_IN_STATE(X) ((pDevice->nDriverStatus & (uint32_t)(X)) == 0u) +#define IS_IN_ALL_STATES(X) ((pDevice->nDriverStatus & (uint32_t)(X)) == (uint32_t)(X)) +#define IS_IN_ANY_STATE(X) ((pDevice->nDriverStatus & (uint32_t)(X)) != 0u) +#define IS_NOT_IN_ANY_STATE(X) ((pDevice->nDriverStatus & (uint32_t)(X)) == 0u) + +#define SET_STATE(X) (pDevice->nDriverStatus |= (uint32_t)(X)) +#define CLR_STATE(X) (pDevice->nDriverStatus &= ~((uint32_t)(X))) + +#define NUM_ADC_CHANNELS (8u) +#define NUM_ADC_COMPARATOR_CHANNELS (4u) + +/* To keep state for the driver for error checking */ +typedef enum __ADC_STATUS { + ADC_STATUS_POWERED_UP = (1u << 0), + ADC_STATUS_SUB_SYSTEM_EN = (1u << 1), + ADC_STATUS_SUB_SYSTEM_READY = (1u << 2), + + ADC_STATUS_NON_BLOCKING_EN = (1u << 3), + ADC_STATUS_BLOCKING_EN = (1u << 4), + ADC_STATUS_COMPARATOR_EN = (1u << 5), + + ADC_STATUS_SAMPLING_IN_PROGRESS = (1u << 6), + ADC_STATUS_CALIBRATION_EN = (1u << 7), + ADC_STATUS_CALIBRATION_DONE = (1u << 8), + + ADC_STATUS_BATTERY_DONE = (1u << 9), + + ADC_STATUS_OVERSAMPLING_EN = (1u << 10), + ADC_STATUS_AVGERAGING_EN = (1u << 11), + + ADC_STATUS_TEMP_SENSOR_EN = (1u << 12), + + ADC_STATUS_TMP_DONE = (1u << 13), + ADC_STATUS_TMP2_DONE = (1u << 14), +} ADC_STATUS; + +typedef enum __ADC_FIFO_MODE { + ADC_FIFO_MODE_INIT, + ADC_FIFO_MODE_ENABLED, + ADC_FIFO_MODE_INTERRUPT_PROCESS, + ADC_FIFO_MODE_INTERRUPT_OVERFLOW, + ADC_FIFO_MODE_DMA_BUFFER_PROCESS, + ADC_FIFO_MODE_DMA_INVALID_DESC, + ADC_FIFO_MODE_ABORT +} ADC_FIFO_MODE; + +typedef enum __ADC_BUFFER_CONFIG { + ADC_BUFFER_CONFIG_BUFFER_SINGLE_CONV_EN = ((uint32_t)1u << 1u), + ADC_BUFFER_CONFIG_BUFFER_AUTO_MODE_EN = ((uint32_t)1u << 0u), +} ADC_BUFFER_CONFIG; + + +typedef enum __ADC_BUFFER_STATUS { + ADC_BUFFER_STATUS_OK = ((uint32_t)1u << 0u), + ADC_BUFFER_STATUS_OVERFLOW = ((uint32_t)1u << 1u) +} ADC_BUFFER_STATUS; + +typedef struct __ADC_INT_BUFFER { + uint16_t nConfig; + uint16_t nStatus; + ADI_ADC_BUFFER *pUserBuffer; + uint16_t* pCurDataBuffer; + uint32_t nNumSamplesRemaining; + uint32_t nChannels; +} ADC_INT_BUFFER; + +typedef struct __ADC_ACTIVE_DATA { + uint32_t nCurChannel; +} ADC_ACTIVE_DATA; + +typedef ADI_ADC_RESULT (*ADC_MANAGE_FIFO_FUNC)(struct __ADI_ADC_DEVICE *pDevice, ADC_FIFO_MODE eFifoMode); + +typedef struct __ADI_ADC_DEVICE +{ + volatile uint32_t nDriverStatus; + ADI_ADC_TypeDef *pReg; + void* pCBParam; + ADI_CALLBACK pfCallback; + + ADC_ACTIVE_DATA ActData; + ADC_MANAGE_FIFO_FUNC pfManageFifo; + + ADC_INT_BUFFER s_Buffer; + uint8_t ComparitorHi; + uint8_t ComparitorLo; + uint8_t ComparitorHys; + + SEM_VAR_DECLR +} ADI_ADC_DEVICE; + +typedef struct __ADI_ADC_INFO +{ + ADI_ADC_HANDLE hDevice; + ADI_ADC_TypeDef* pReg; +} ADI_ADC_INFO; + +#endif /* ADI_ADC_DEF */ + +/*! \endcond */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_callback.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_callback.h new file mode 100755 index 0000000000..fd2e04f282 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_callback.h @@ -0,0 +1,60 @@ +/*! + ***************************************************************************** + @file: adi_callback.h + @brief: callback APIs. + ----------------------------------------------------------------------------- + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +/*****************************************************************************/ + +#ifndef ADI_CALLBACK_H +#define ADI_CALLBACK_H + +#include + +/** + * @brief Device Drivers Callback function definition + */ +typedef void (* ADI_CALLBACK) ( /*!< Callback function pointer */ + void *pCBParam, /*!< Client supplied callback param */ + uint32_t Event, /*!< Event ID specific to the Driver/Service */ + void *pArg); /*!< Pointer to the event specific argument */ + +#endif /* ADI_CALLBACK_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_cyclecount.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_cyclecount.h new file mode 100755 index 0000000000..a2b5807a62 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_cyclecount.h @@ -0,0 +1,137 @@ +/* + ******************************************************************************* + * @brief: Framework to preform cycle count measurements + * + * @details this is a framework for monitoring the cycle counts + * for ISRs and APIs. The framework uses systick. + +******************************************************************************* + + Copyright(c) 2016 Analog Devices, Inc. All Rights Reserved. + + This software is proprietary and confidential. By using this software you agree + to the terms of the associated Analog Devices License Agreement. + + ******************************************************************************/ + +#ifndef ADI_CYCLECOUNT_H +#define ADI_CYCLECOUNT_H + +#include +#include +#include + + + /** @addtogroup cyclecount_logging Cycle Counting Framework + * @{ + */ + +/*! + * 64-bit integer to record cycle counts. + * Since UINT32_MAX = 4,294,967,296 cycles + * at 26 MHz this would allow us to record for 165 seconds + * before the system would wrap around. + * By moving to a 64-bit integer we can record for 11,248 years. + */ +typedef uint64_t adi_cyclecount_t; + + +/*! + * The systick timer is a 24-bit count down timer + * The initial value can, therefore, be up to 0xFFFFFF + * The larger the value the fewer interrupts that will be taken + * and the less impact cycle counting will have on the system + */ +#define ADI_CYCLECOUNT_SYSTICKS (0xFFFFFFu) + +/*! + * Cycle counting nesting is supported via a cycle counting stack. The initial + * value of the stack index is one less than the starting stack + * index (0) + */ +#define ADI_CYCLECOUNT_INITIAL_STACK_INDEX (-1) + +/*! + * Cycle Count API function return values. + */ +typedef enum { + + ADI_CYCLECOUNT_SUCCESS, /*!< API completed successfully */ + ADI_CYCLECOUNT_ADD_ENTITY_FAILURE, /*!< There is not enough space in the cycle counting entity array. Consider increasing the size via the #ADI_CYCLECOUNT_NUMBER_USER_DEFINED_APIS static configuration macro */ + ADI_CYCLECOUNT_INVALID_ID, /*!< The API/ISR ID is invalid. */ + ADI_CYCLECOUNT_FAILURE /*!< API did not complete successfully. */ +} ADI_CYCLECOUNT_RESULT; + + +/*! + * List of cycle counting IDs for the ISRs and APIs that can record cycle counts. + * Items enumerated here must be aligned with adi_cyclecounting_identifiers + * + * Note that the ID numbering starts at 1. ID==0 is not used. + * Note that the application can extend this list via static configuration (see adi_cycle_counting_config.h) and + * via the adi_cyclecount_addEntity() API. + */ +#define ADI_CYCLECOUNT_ISR_EXT_3 1u /*!< Cycle count ID for EXT3 Interrupt Handler. */ +#define ADI_CYCLECOUNT_ISR_UART 2u /*!< Cycle count ID for UART Interrupt Handler. */ +#define ADI_CYCLECOUNT_ISR_DMA_UART_TX 3u /*!< Cycle count ID for UART DMA TX Interrupt Handler. */ +#define ADI_CYCLECOUNT_ISR_DMA_UART_RX 4u /*!< Cycle count ID for UART DMA RX Interrupt Handler. */ +#define ADI_CYCLECOUNT_ISR_TMR_COMMON 5u /*!< Cycle count ID for Timer Interrupt Handler. */ +#define ADI_CYCLECOUNT_ISR_RTC 6u /*!< Cycle count ID for RTC Interrupt Handler.*/ +#define ADI_CYCLECOUNT_ISR_SPI 7u /*!< Cycle count ID for SPI Interrupt Handler. */ +#define ADI_CYCLECOUNT_ISR_CRC 8u /*!< Cycle count ID for CRC Interrupt Handler. */ +#define ADI_CYCLECOUNT_ISR_SPORT 9u /*!< Cycle count ID for SPORT Interrupt Handler. */ +#define ADI_CYCLECOUNT_ID_COUNT 10u /*!< Number of cycle count ISRs and APIs. Must be one greater than the last ID. */ + + +/*! + * The following are tracked when cycle counting + * Maximum number of cycle counts + * Minimum number of cycle counts + * Average number of cycle counts + */ +typedef struct +{ + adi_cyclecount_t max_cycles_adjusted; /*!< Tracks the adjusted max cycle count */ + adi_cyclecount_t min_cycles_adjusted; /*!< Tracks the adjusted min cycle count */ + adi_cyclecount_t average_cycles_adjusted; /*!< Tracks the adjusted average cycle count */ + + adi_cyclecount_t max_cycles_unadjusted; /*!< Tracks the unadjusted max cycle count */ + adi_cyclecount_t min_cycles_unadjusted; /*!< Tracks the unadjusted min cycle count */ + adi_cyclecount_t average_cycles_unadjusted; /*!< Tracks the unadjusted average cycle count */ + + uint32_t sample_count; /*!< Number of cycle count samples recorded, used to compute the average */ + +} ADI_CYCLECOUNT_LOG; + +/*! + * Cycle counting has to be enabled in the cycle counting configuration file + * If enabled then cycle counting related macros map to the cycle counting APIs. + * If not enabled, then the macros maps to a NOP + */ +#if defined(ADI_CYCLECOUNT_ENABLED) && (ADI_CYCLECOUNT_ENABLED == 1u) + + #define ADI_CYCLECOUNT_INITIALIZE() adi_cyclecount_init() /*!< Initialize the cycle counting data structures */ + #define ADI_CYCLECOUNT_STORE(id) adi_cyclecount_store(id) /*!< Record the number of cycles for the specified ISR or API */ + #define ADI_CYCLECOUNT_REPORT() adi_cyclecount_report() /*!< Generate a cycle counting report */ + +#else + + #define ADI_CYCLECOUNT_INITIALIZE() do{}while(0) /*!< Initialize the cycle counting data structures */ + #define ADI_CYCLECOUNT_STORE(id) do{}while(0) /*!< Record the number of cycles for the specified ISR or API */ + #define ADI_CYCLECOUNT_REPORT() do{}while(0) /*!< Generate a cycle counting report */ +#endif + + +/* Forward API declarations */ +extern ADI_CYCLECOUNT_RESULT adi_cyclecount_start(void); +extern ADI_CYCLECOUNT_RESULT adi_cyclecount_stop(void); +extern adi_cyclecount_t adi_cyclecount_get(void); +extern ADI_CYCLECOUNT_RESULT adi_cyclecount_store(uint32_t id); +extern void adi_cyclecount_init(void); +extern void adi_cyclecount_report(void); +extern ADI_CYCLECOUNT_RESULT adi_cyclecount_addEntity(const char *EntityName, uint32_t *pid); + +/**@}*/ + +#endif /* ADI_CYCLECOUNT_H */ + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_processor.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_processor.h new file mode 100755 index 0000000000..3032a13ac1 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_processor.h @@ -0,0 +1,67 @@ +/*! + ***************************************************************************** + * @file: adi_processor.h + * @brief: Include appropriate CMSIS device header. + *----------------------------------------------------------------------------- + * +Copyright (c) 2010-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *****************************************************************************/ + +#ifndef __ADI_PROCESSOR_H__ +#define __ADI_PROCESSOR_H__ + +/* Default to ADuCM4050 if no processor macro is defined. */ + +#if !defined(__ADUCM4050__) + #define __ADUCM4050__ +#endif + +/* Define a family macro */ + +#if !defined(__ADUCM4x50__) + #define __ADUCM4x50__ +#endif + +/* Include CMSIS device header for selected target processor. */ + +#if defined(__ADUCM4050__) +#include +#endif + +#endif /* __ADI_PROCESSOR_H__ */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_types.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_types.h new file mode 100755 index 0000000000..ca221b8360 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_types.h @@ -0,0 +1,18 @@ +#ifndef __ADI_TYPES_H__ +#define __ADI_TYPES_H__ + +/* obtain integer types ... */ +#include + +/* obtain boolean types ... */ +#include + +/* define required types that are not provided by stdint.h or stdbool.h ... */ +typedef bool bool_t; +typedef char char_t; +typedef float float32_t; +#if !defined(__NO_FLOAT64) +typedef long double float64_t; +#endif + +#endif /* __ADI_TYPES_H__ */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_version.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_version.h new file mode 100755 index 0000000000..6dd08f49bb --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adi_version.h @@ -0,0 +1,63 @@ +/*! + ***************************************************************************** + * @file: adi_version.h + * @brief: Version macros for ADI ADuCMxxx Device Series + *----------------------------------------------------------------------------- + * +Copyright (c) 2010-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + + THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL + PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *****************************************************************************/ + +#ifndef __ADI_VERSION_H__ +#define __ADI_VERSION_H__ + +/* use a 32-bit versioning scheme that supports numerical compares */ +#define ADI_VERSION_MAJOR 1u /* must be <= 255 */ +#define ADI_VERSION_MINOR 0u /* must be <= 255 */ +#define ADI_VERSION_BUILD 0u /* must be <= 255 */ +#define ADI_VERSION_PATCH 0u /* must be <= 255 */ + +#define ADI_CONSTRUCT_VERSION(a,b,c,d) (((a) << 24u) | ((b) << 16u) | ((c) << 8u) | (d)) + +/* known versions */ +#define ADI_VERSION_1_0_0_0 ADI_CONSTRUCT_VERSION(1u,0u,0u,0u) + +/* test current version against known predefines (see SystemInit() example in system.c) */ +#define ADI_VERSION_CURRENT ADI_CONSTRUCT_VERSION(ADI_VERSION_MAJOR, ADI_VERSION_MINOR, ADI_VERSION_BUILD, ADI_VERSION_PATCH) + +#endif /* __ADI_VERSION_H__ */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/beep/adi_beep.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/beep/adi_beep.c new file mode 100755 index 0000000000..0d0054c432 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/beep/adi_beep.c @@ -0,0 +1,751 @@ +/*! ***************************************************************************** + * @file: adi_beep.c + * @brief: BEEP device driver global file. + * @details: This a global file which includes a specific file based on the processor family. + * This included file will be containing BEEP device driver functions. + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ +#include + +#include +#include + +#include +#include +#include "adi_beep_def.h" + +/** @addtogroup BEEP_Driver BEEP Driver + * @{ + * @brief Beeper Driver + * @note The application must include drivers/beep/adi_beep.h to use this driver. + */ + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm123 (rule 8.5): there shall be no definition of objects or functions in a header file +* This isn't a header as such. +* +* Pm073 (rule 14.7): a function should have a single point of exit. +* Pm143 (rule 14.7): a function should have a single point of exit at the end of the function. +* Multiple returns are used for error handling. +* +* Pm050 (rule 14.2): a null statement shall only occur on a line by itself +* Needed for null expansion of ADI_INSTALL_HANDLER and others. +* +* Pm140 (rule 11.3): a cast should not be performed between a pointer type and an integral type +* Required for MMR addresses and callback parameters. +* +* Pm031: (MISRA C 2004 rule 12.7) bitwise operations shall not be performed on signed integer types +* Required for MMR manipulations. +* +* Pm152: (MISRA C 2004 rule 17.4) array indexing shall only be applied to objects defined as an array type +* Required for adi_beep_PlaySequence() to access the user-supplied array of notes. +* +* Pm141: (MISRA C 2004 rule 11.4) a cast should not be performed between a pointer to object type and a +* different pointer to object type, this casts from type. +* Required to store a an array of varying size in a device structure. +* +* Required for adi_beep_PlaySequence() to access the user-supplied array of notes. +*/ +#pragma diag_suppress=Pm123,Pm073,Pm143,Pm050,Pm140,Pm031,Pm152,Pm141 +#endif /* __ICCARM__ */ + +/*========== D A T A ==========*/ +static ADI_BEEP_DRIVER adi_beep_Device[1]; + +/*! \cond PRIVATE */ +/* Handler for the BEEP interrupt */ +void Beep_Int_Handler(void); + +/* debug handle checker */ +#ifdef ADI_DEBUG +#define ADI_BEEP_INVALID_HANDLE(h) (&adi_beep_Device[0] != (h)) +#endif + +/* definition for the BEEP IRQ - there is only ever one instance of the + * BEEP driver, so reducing space by using a #define rather than including + * it in the device structure. */ +#define BEEP_IRQ (BEEP_EVT_IRQn) + +#if ADI_BEEP_CFG_SEQUENCE_REPEAT_VALUE == 0 +/* A single note is requested. Only enable the AEND int. */ +#define INTERRUPT_ON_SEQEND (0) +#define INTERRUPT_ON_AEND (1) +#else +/* A two-tone sequence is requested. Only enable the SEQEND int. */ +#define INTERRUPT_ON_SEQEND (1) +#define INTERRUPT_ON_AEND (0) +#endif + +/*! \endcond */ + +static const ADI_BEEP_STATIC_INIT gBeeperStaticConfigData[ADI_BEEP_MAX_DEVID] = { + /* single instance of Beeper device */ + { + /* configuration register */ + ( (INTERRUPT_ON_SEQEND << BITP_BEEP_CFG_SEQATENDIRQ) + | (INTERRUPT_ON_AEND << BITP_BEEP_CFG_AENDIRQ) + | (ADI_BEEP_CFG_SEQUENCE_REPEAT_VALUE << BITP_BEEP_CFG_SEQREPEAT) + ), + + /* Status register (interrupt clears) */ + (ADI_BEEP_ALL_INTERRUPTS), + + /* ToneA control register */ + ( ((uint32_t)ADI_BEEP_TONEA_DISABLE << BITP_BEEP_TONEA_DIS) + | ((uint32_t)ADI_BEEP_TONEA_FREQUENCY << BITP_BEEP_TONEA_FREQ) + | ((uint32_t)ADI_BEEP_TONEA_DURATION << BITP_BEEP_TONEA_DUR) + ), + + /* ToneB control register */ + ( ((uint32_t)ADI_BEEP_TONEB_DISABLE << BITP_BEEP_TONEB_DIS) + | ((uint32_t)ADI_BEEP_TONEB_FREQUENCY << BITP_BEEP_TONEB_FREQ) + | ((uint32_t)ADI_BEEP_TONEB_DURATION << BITP_BEEP_TONEB_DUR) + ) + } +}; + +/*! \endcond */ + + +/*! + * @brief BEEP Initialization + * + * @param[in] DeviceNum Integer specifying the ID of Beeper to use. + * @param[in] pMemory Pointer to the memory to be used by the driver. + * Size of the memory should be at least #ADI_BEEP_MEMORY_SIZE bytes. + * @param[in] MemorySize Size of the memory passed in pMemory parameter. + * @param[out] phDevice Pointer to a location that the device data pointer + * will be written upon successful initialization. + * + * @return Status + * - #ADI_BEEP_SUCCESS Success: BEEP device driver initialized successfully. + * - #ADI_BEEP_SEMAPHORE_FAILED The BEEP sempahore could not be created. + * - #ADI_BEEP_ALREADY_INITIALIZED [D] The BEEP is already initialized. + * - #ADI_BEEP_NULL_PTR [D] Null pointer. + * - #ADI_BEEP_BAD_DEV_ID [D] The device number is invalid. + * + * Initialize the BEEP device for use. The core NVIC BEEP interrupt is enabled. This API + * must preceed all other beeper API calls and the handle returned must be passed to all other beeper API + * calls. + * + * + * @note The contents of \a phDevice will be set to NULL upon failure.\n\n + * + * @note The BEEP device driver will clear all pending interrupts and disable all beeper + * interrupts during beeper device initialization. + * + * @note CALLBACKS: If a callback is registered, it will be called on + * completion of the note or sequence. The "Event" parameter will + * contain which event occurred, either ADI_BEEP_INTERRUPT_SEQUENCE_END + * or ADI_BEEP_INTERRUPT_NOTE_END. + * + * @warning This API will put the beeper in preconfigured mode as defined in + * adi_beep_config.h file. + * Refer adi_beep_config.h file to see which all features can be preconfigured. + * + * @sa adi_beep_Close(). + */ +ADI_BEEP_RESULT adi_beep_Open(ADI_BEEP_DEV_ID const DeviceNum, + void* const pMemory, + uint32_t const MemorySize, + ADI_BEEP_HANDLE* const phDevice) +{ + ADI_BEEP_DRIVER *pDevice; + ADI_BEEP_DEV_DATA *pData; + /* store a bad handle in case of failure */ + *phDevice = (ADI_BEEP_HANDLE) NULL; + +#ifdef ADI_DEBUG + if (DeviceNum >= ADI_BEEP_MAX_DEVID) + { + return ADI_BEEP_BAD_DEV_ID; + } + + if (pMemory == NULL) + { + return ADI_BEEP_NULL_PTR; + } + + assert (MemorySize >= sizeof(ADI_BEEP_DRIVER)); +#endif + + /* local pointer to instance data */ + pDevice = &adi_beep_Device[DeviceNum]; + pDevice->pReg = pADI_BEEP0; + pDevice->pData = (ADI_BEEP_DEV_DATA*)pMemory; + pData = pDevice->pData; + +#ifdef ADI_DEBUG + if (ADI_BEEP_STATE_UNINITIALIZED != adi_beep_Device[DeviceNum].pData->state) + { + return ADI_BEEP_ALREADY_INITIALIZED; + } +#endif + + pData->cbFunc = NULL; + pData->cbParam = NULL; + SEM_CREATE(pDevice->pData, "BEEP_SEM", ADI_BEEP_SEMAPHORE_FAILED); + + /* set statically configured initialization data */ + ADI_BEEP_STATIC_INIT const* pInitData = &gBeeperStaticConfigData[DeviceNum]; + ADI_BEEP_TypeDef *pReg = pDevice->pReg; + + pReg->CFG = pInitData->BEEP_CFG; + pReg->STAT = pInitData->BEEP_STAT; + pReg->TONEA = pInitData->BEEP_TONEA; + pReg->TONEB = pInitData->BEEP_TONEB; + + /* enable beeper interrupts in NVIC */ + NVIC_EnableIRQ(BEEP_IRQ); + + /* mark driver initialized */ + pData->state = ADI_BEEP_STATE_INITIALIZED; + + /* store handle at application handle pointer */ + *phDevice = (ADI_BEEP_HANDLE)pDevice; + + return ADI_BEEP_SUCCESS; /* initialized */ +} + + +/*! + * @brief Uninitialize and deallocate a BEEP device. + * +* @param[in] hDevice Device handle obtained from #adi_beep_Open(). + * + * @return Status + * - #ADI_BEEP_SUCCESS Success: Call completed successfully. + * - #ADI_BEEP_BAD_DEV_HANDLE [D] Error: Invalid device handle parameter. + * - #ADI_BEEP_NOT_INITIALIZED [D] Error: Device has not been initialized for use, see #adi_beep_Open(). + * + * Uninitialize and release an allocated BEEP device for other use. The core NVIC BEEP interrupt is disabled. + * + * @sa adi_beep_Open(). + */ +ADI_BEEP_RESULT adi_beep_Close(ADI_BEEP_HANDLE const hDevice) +{ + + ADI_BEEP_DRIVER *pDevice; + ADI_BEEP_DEV_DATA *pData; + ADI_BEEP_TypeDef *pReg; + + pDevice = (ADI_BEEP_DRIVER*)hDevice; + pData = pDevice->pData; + pReg = pDevice->pReg; + +#ifdef ADI_DEBUG + if (ADI_BEEP_INVALID_HANDLE(hDevice)) + { + return ADI_BEEP_BAD_DEV_HANDLE; + } + if (ADI_BEEP_STATE_UNINITIALIZED == pData->state) + { + return ADI_BEEP_NOT_INITIALIZED; + } +#endif + + /* uninitialize */ + NVIC_DisableIRQ(BEEP_IRQ); + + pData->state = ADI_BEEP_STATE_UNINITIALIZED; + pData->cbFunc = NULL; + pReg->CFG = 0u; + pReg->STAT = 0u; + pReg->TONEA = 0u; + pReg->TONEB = 0u; + SEM_DELETE(pDevice->pData, ADI_BEEP_SEMAPHORE_FAILED); + return ADI_BEEP_SUCCESS; +} + +/*! + * @brief Register a callback for the beeper driver. + * + * @param[in] hDevice Device handle obtained from #adi_beep_Open(). + * @param[in] pfCallback The application supplied callback which will be called to notify device + * related events. + * @param[in] pCBParam The application supplied callback parameter which can be passed back in + * the callback function. + * + * @return Status + * - #ADI_BEEP_SUCCESS Call completed successfully. + * - #ADI_BEEP_BAD_DEV_HANDLE [D] Invalid device handle parameter. + * - #ADI_BEEP_NOT_INITIALIZED [D] Device has not been initialized for use, see #adi_beep_Open(). + * + * Registers a callback for the beeper interrupts. When an interrupt occurs, the + * driver will handle any required interaction with the hardware and then call + * the registered callback. + * + * @sa adi_beep_Open(). + */ +ADI_BEEP_RESULT adi_beep_RegisterCallback(ADI_BEEP_HANDLE const hDevice, + ADI_CALLBACK pfCallback, + void* const pCBParam) +{ + ADI_BEEP_DRIVER *pDevice = (ADI_BEEP_DRIVER*)hDevice; + + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + if (ADI_BEEP_INVALID_HANDLE(hDevice)) { + return ADI_BEEP_BAD_DEV_HANDLE; + } + + if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) { + return ADI_BEEP_NOT_INITIALIZED; + } +#endif + /* Assign the callback within a critical region. */ + ADI_ENTER_CRITICAL_REGION(); + pDevice->pData->cbFunc = pfCallback; + pDevice->pData->cbParam = pCBParam; + ADI_EXIT_CRITICAL_REGION(); + + return ADI_BEEP_SUCCESS; +} + + +#if ADI_BEEP_INCLUDE_PLAY_SEQUENCE == 1 +/*! + * @brief Play a beeper tone sequence. + * + * @param[in] hDevice Device handle obtained from #adi_beep_Open(). + * @param[in] aSequence The sequence of notes to be played by the beeper. + * @param[in] count The number of notes in the sequence, must be a multiple + * of two, and a maximum size of 254 notes. + * + * @return Status + * - #ADI_BEEP_SUCCESS Success: Call completed successfully. + * - #ADI_BEEP_INVALID_COUNT Sequence count must be multiples of two. + * - #ADI_BEEP_NULL_PTR [D] Null pointer. + * - #ADI_BEEP_BAD_DEV_HANDLE [D] Invalid device handle parameter. + * - #ADI_BEEP_NOT_INITIALIZED [D] Device has not been initialized for use, see #adi_beep_Open(). + * + * Programs the A/B tone pair to play a sequence of notes. The sequnce can be + * stopped by calling adi_beep_Enable(..., false). The beeper will be enabled + * and disabled internally by the driver. This code, and supporting data, can + * be removed by setting ADI_BEEP_INCLUDE_PLAY_SEQUENCE == 0 in the + * adi_beep_config.h configuration file. + * + * @sa adi_beep_Open(). + * @sa adi_beep_Enable() + */ +ADI_BEEP_RESULT adi_beep_PlaySequence(ADI_BEEP_HANDLE const hDevice, + ADI_BEEP_NOTE aSequence[], + uint8_t count) +{ + ADI_BEEP_DRIVER *pDevice = (ADI_BEEP_DRIVER*)hDevice; + ADI_BEEP_TypeDef *pReg = pDevice->pReg; + uint16_t nSeqCnt = 0u; + + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + if (ADI_BEEP_INVALID_HANDLE(hDevice)) { + return ADI_BEEP_BAD_DEV_HANDLE; + } + + if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) { + return ADI_BEEP_NOT_INITIALIZED; + } + + if (NULL == aSequence) { + return ADI_BEEP_NULL_PTR; + } + + /* The sequence count must be a multiple of two, be greater than 1 + * and must be a maximum of (127 * 2) notes in length. The hardware supports a + * sequence of up to 127, and there are two notes associated with that. */ + if (((127u * 2u) < count) || + ((count % 2u) != 0u) || + (count < 2u)) { + return ADI_BEEP_INVALID_COUNT; + } +#endif + + /* Two notes are loaded at a time, and the sequence count refers to + * the number of times that both tone registers should be played. */ + nSeqCnt = ((uint16_t)count) >> 1u; + + ADI_ENTER_CRITICAL_REGION(); + + /* make a hole, and disable the beeper */ + pReg->CFG &= (uint16_t)~(BITM_BEEP_CFG_SEQREPEAT | BITM_BEEP_CFG_AENDIRQ | BITM_BEEP_CFG_EN); + + pReg->TONEA = ( (uint16_t)((uint16_t)aSequence[0].frequency << ADI_BEEP_TONE_FREQ_BITPOS) + |(uint16_t)((uint16_t)aSequence[0].duration << ADI_BEEP_TONE_DUR_BITPOS) ); + + pReg->TONEB = ( (uint16_t)((uint16_t)aSequence[1].frequency << ADI_BEEP_TONE_FREQ_BITPOS) + |(uint16_t)((uint16_t)aSequence[1].duration << ADI_BEEP_TONE_DUR_BITPOS) ); + + + /* program new sequence count, while preserving everything else */ + pReg->CFG |= (BITM_BEEP_CFG_EN | + BITM_BEEP_CFG_BSTARTIRQ | + BITM_BEEP_CFG_SEQATENDIRQ | + (uint16_t)((uint16_t)(nSeqCnt) << BITP_BEEP_CFG_SEQREPEAT)); + + pDevice->pData->pSeqArray = (ADI_BEEP_NOTE(*)[])aSequence; + pDevice->pData->nSeqMax = count; + pDevice->pData->nSeqIndex = 2u; + + /* We're now playing, but not blocked */ + pDevice->pData->state |= (ADI_BEEP_STATE_PLAYING); + + ADI_EXIT_CRITICAL_REGION(); + + return ADI_BEEP_SUCCESS; +} +#endif + +/*! + * @brief Play a single note/beep. + * +* @param[in] hDevice Device handle obtained from #adi_beep_Open(). + * @param[in] note The note to play. + * + * @return Status + * - #ADI_BEEP_SUCCESS Success: Call completed successfully. + * - #ADI_BEEP_BAD_DEV_HANDLE [D] Error: Invalid device handle parameter. + * - #ADI_BEEP_NOT_INITIALIZED [D] Error: Device has not been initialized for use, see #adi_beep_Open(). + * + * Programs the A tone to play a single note. + * + * @sa adi_beep_Open(). + */ +ADI_BEEP_RESULT adi_beep_PlayNote(ADI_BEEP_HANDLE const hDevice, + ADI_BEEP_NOTE note) +{ + ADI_BEEP_DRIVER *pDevice; + ADI_BEEP_TypeDef *pReg; + ADI_INT_STATUS_ALLOC(); + + pDevice = (ADI_BEEP_DRIVER*)hDevice; + pReg = pDevice->pReg; + +#ifdef ADI_DEBUG + if (ADI_BEEP_INVALID_HANDLE(hDevice)) { + return ADI_BEEP_BAD_DEV_HANDLE; + } + + if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) { + return ADI_BEEP_NOT_INITIALIZED; + } +#endif + + ADI_ENTER_CRITICAL_REGION(); + + /* Clear any previous sequence setup, and disable the beeper */ + pReg->CFG &= (uint16_t)~(BITM_BEEP_CFG_SEQREPEAT | BITM_BEEP_CFG_EN); + + /* Set Tone A */ + pReg->TONEA = ( (uint16_t)((uint16_t)note.frequency << ADI_BEEP_TONE_FREQ_BITPOS) + |(uint16_t)((uint16_t)note.duration << ADI_BEEP_TONE_DUR_BITPOS) ); + + /* program new sequence count, while preserving everything else */ + pReg->CFG |= (BITM_BEEP_CFG_EN | BITM_BEEP_CFG_AENDIRQ); + + /* We're now playing but not blocked */ + pDevice->pData->state |= (ADI_BEEP_STATE_PLAYING); + ADI_EXIT_CRITICAL_REGION(); + + return ADI_BEEP_SUCCESS; +} + + +/*! + * @brief Play a a repeating two-tone beep. Similar to an alarm. + * +* @param[in] hDevice Device handle obtained from #adi_beep_Open(). + * @param[in] noteA The note to play first. + * @param[in] noteB The note to play second. + * @param[in] count The number of times to repeat the two-note signal, + * maximum of 127. + * + * + * @return Status + * - #ADI_BEEP_SUCCESS Success: Call completed successfully. + * - #ADI_BEEP_BAD_DEV_HANDLE [D] Error: Invalid device handle parameter. + * - #ADI_BEEP_NOT_INITIALIZED [D] Error: Device has not been initialized for use, see #adi_beep_Open(). + * + * Programs the beeper to play a repeating two-tone signal. + * The count argument refers to the number of iterations of both notes, not + * just a single note. + * + * @sa adi_beep_Open(). + * @sa adi_beep_PlayNote(). + * @sa adi_beep_PlayNSequence(). + */ +ADI_BEEP_RESULT adi_beep_PlayTwoTone(ADI_BEEP_HANDLE const hDevice, + ADI_BEEP_NOTE noteA, + ADI_BEEP_NOTE noteB, + uint8_t count) +{ + ADI_BEEP_DRIVER *pDevice; + ADI_BEEP_TypeDef *pReg; + ADI_INT_STATUS_ALLOC(); + + pDevice = (ADI_BEEP_DRIVER*)hDevice; + pReg = pDevice->pReg; + +#ifdef ADI_DEBUG + if (ADI_BEEP_INVALID_HANDLE(hDevice)) { + return ADI_BEEP_BAD_DEV_HANDLE; + } + + if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) { + return ADI_BEEP_NOT_INITIALIZED; + } +#endif + + ADI_ENTER_CRITICAL_REGION(); + + /* make a hole, and disable the beeper */ + pReg->CFG &= (uint16_t)~(BITM_BEEP_CFG_SEQREPEAT | BITM_BEEP_CFG_AENDIRQ |BITM_BEEP_CFG_EN); + + pReg->TONEA = ( (uint16_t)((uint16_t)noteA.frequency << ADI_BEEP_TONE_FREQ_BITPOS) + |(uint16_t)((uint16_t)noteA.duration << ADI_BEEP_TONE_DUR_BITPOS) ); + + pReg->TONEB = ( (uint16_t)((uint16_t)noteB.frequency << ADI_BEEP_TONE_FREQ_BITPOS) + |(uint16_t)((uint16_t)noteB.duration << ADI_BEEP_TONE_DUR_BITPOS) ); + + /* program new sequence count, while preserving everything else */ + pReg->CFG |= (BITM_BEEP_CFG_EN | BITM_BEEP_CFG_SEQATENDIRQ |(uint16_t)((uint16_t)count << BITP_BEEP_CFG_SEQREPEAT)); + + /* We're now playing but not blocked */ + pDevice->pData->state |= (ADI_BEEP_STATE_PLAYING); + ADI_EXIT_CRITICAL_REGION(); + + return ADI_BEEP_SUCCESS; +} + +/*! + * @brief Enable or disable the beeper. Other APIs will automatically enable the beeper if required, + * so this function is best used in the following situations: + * - when only using static configuration, i.e. start playing the notes + * set up in static adi_beep_config.h. + * - Otherwise, this can be used to stop the beeper during playback, + * when started from any other API. + * + * @param[in] hDevice Device handle obtained from #adi_beep_Open(). + * @param[in] bFlag true to enable the device, false to stop playback. + * + * @return Status + * - #ADI_BEEP_SUCCESS Success: Call completed successfully. + * - #ADI_BEEP_BAD_DEV_HANDLE [D] Error: Invalid device handle parameter. + * - #ADI_BEEP_NOT_INITIALIZED [D] Error: Device has not been initialized for use, see #adi_beep_Open(). + * + * @sa adi_beep_Open(). + */ +ADI_BEEP_RESULT adi_beep_Enable(ADI_BEEP_HANDLE const hDevice, bool const bFlag) +{ + ADI_BEEP_DRIVER *pDevice; + ADI_BEEP_TypeDef *pReg; + ADI_INT_STATUS_ALLOC(); + + pDevice = (ADI_BEEP_DRIVER*)hDevice; + pReg = pDevice->pReg; + +#ifdef ADI_DEBUG + if (ADI_BEEP_INVALID_HANDLE(hDevice)) { + return ADI_BEEP_BAD_DEV_HANDLE; + } + + if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) { + return ADI_BEEP_NOT_INITIALIZED; + } +#endif + + ADI_ENTER_CRITICAL_REGION(); + + if (bFlag == true) { + /* All the registers should already be set - just enable the beep */ + pReg->CFG |= BITM_BEEP_CFG_EN; + pDevice->pData->state |= (ADI_BEEP_STATE_PLAYING); + } + else { + pReg->CFG &= (uint16_t)~(BITM_BEEP_CFG_EN); + pDevice->pData->state &= ~(ADI_BEEP_STATE_PLAYING); + } + + ADI_EXIT_CRITICAL_REGION(); + + return ADI_BEEP_SUCCESS; +} + +/*! + * @brief Wait for the current playback to finish. This is a blocking call, + * that will not return until the current playback (if any) has finished. + * If there is no current playback, it will return immediately. + * +* @param[in] hDevice Device handle obtained from #adi_beep_Open(). + * + * @return Status + * - #ADI_BEEP_SUCCESS Success: Call completed successfully. + * - #ADI_BEEP_FAILURE Error: Semaphore failure. + * - #ADI_BEEP_BAD_DEV_HANDLE [D] Error: Invalid device handle parameter. + * - #ADI_BEEP_NOT_INITIALIZED [D] Error: Device has not been initialized for use, see #adi_beep_Open(). + * + * @sa adi_beep_Open(). + */ +ADI_BEEP_RESULT adi_beep_Wait(ADI_BEEP_HANDLE const hDevice) +{ + ADI_BEEP_DRIVER *pDevice; + bool wait = false; + ADI_INT_STATUS_ALLOC(); + + pDevice = (ADI_BEEP_DRIVER*)hDevice; + +#ifdef ADI_DEBUG + if (ADI_BEEP_INVALID_HANDLE(hDevice)) { + return ADI_BEEP_BAD_DEV_HANDLE; + } + + if (ADI_BEEP_STATE_UNINITIALIZED == pDevice->pData->state) { + return ADI_BEEP_NOT_INITIALIZED; + } +#endif + + ADI_ENTER_CRITICAL_REGION(); + + if((pDevice->pData->state | ADI_BEEP_STATE_PLAYING) > 0u) { + /* We are going to pend on the semaphore, no matter what. */ + pDevice->pData->state |= ADI_BEEP_STATE_BLOCKED; + wait = true; + } + + ADI_EXIT_CRITICAL_REGION(); + + if(wait == true) { + /* Wait for the completion interrupt to post */ + SEM_PEND(pDevice->pData, ADI_BEEP_SEMAPHORE_FAILED); + } + + return ADI_BEEP_SUCCESS; +} + +/*! \cond PRIVATE */ + +/*! @brief BEEP device driver interrupt handler. Overrides weakly-bound + * default interrupt handler in the startup file. */ +void Beep_Int_Handler(void) +{ + ISR_PROLOG(); +#if ADI_BEEP_INCLUDE_PLAY_SEQUENCE == 1 + ADI_BEEP_DEV_DATA *pData; + ADI_BEEP_NOTE noteA, noteB; +#endif + ADI_BEEP_DRIVER *pDevice = &adi_beep_Device[ADI_BEEP_DEVID_0]; /* so far, there is only one BEEP, so this is safe */ + ADI_BEEP_TypeDef *pReg = pDevice->pReg; + uint16_t fired = ADI_BEEP_ALL_INTERRUPTS; + register uint16_t candidate; + + /* Make sure our driver is up and running. */ + if (ADI_BEEP_STATE_UNINITIALIZED != pDevice->pData->state) { + + /* read both status and mask registers */ + candidate = pReg->CFG & ADI_BEEP_ALL_INTERRUPTS; /* Take the fired interrupts */ + fired = candidate; /* ...and a copy. */ + candidate = candidate & pReg->STAT; /* ...and remove the unused set interrupt bits */ + + /* From this driver's perspective, there are only two states + * to watch for - finished playing, or continuing the playing sequence. + * Finished will be handled here. */ + if((candidate & (BITM_BEEP_CFG_SEQATENDIRQ | BITM_BEEP_CFG_AENDIRQ)) > 0u) { + + /* If we are blocked, unblock by posting the semaphore */ + if((pDevice->pData->state | ADI_BEEP_STATE_BLOCKED) > 0u) { + SEM_POST(pDevice->pData); + } + + /* Reset the device playing status. */ + pDevice->pData->state &= ~(ADI_BEEP_STATE_PLAYING | ADI_BEEP_STATE_BLOCKED); + + /* ...and disable the device. */ + pReg->CFG &= (uint16_t)(~(BITM_BEEP_CFG_EN)); + + /* forward the interrupt to the user if they are watching it and it has fired */ + /* pass the interrupt as the event. */ + if (pDevice->pData->cbFunc != NULL) { + pDevice->pData->cbFunc (pDevice->pData->cbParam, (uint32_t)candidate, NULL); + } + } + + #if ADI_BEEP_INCLUDE_PLAY_SEQUENCE == 1 + /* The second state is if we are playing a longer sequence, so this + * interrupt may be to move the sequence along. */ + if ((BITM_BEEP_CFG_BSTARTIRQ & candidate) != 0u) { + + /* Get a local copy of data, to shorten the following code. */ + pData = pDevice->pData; + + /* If there's still data to play */ + if(pData->nSeqIndex < pData->nSeqMax) { + /* Move the sequence along.*/ + noteA = (*pData->pSeqArray)[pData->nSeqIndex]; + pData->nSeqIndex++; + noteB = (*pData->pSeqArray)[pData->nSeqIndex]; + pData->nSeqIndex++; + + /* Any values written will not impact the current tones, + * they will take effect after the current tone is completed */ + pReg->TONEA = ( (uint16_t)((uint16_t)noteA.frequency << ADI_BEEP_TONE_FREQ_BITPOS) + | (uint16_t)((uint16_t)noteA.duration << ADI_BEEP_TONE_DUR_BITPOS) ); + + pReg->TONEB = ( (uint16_t)((uint16_t)noteB.frequency << ADI_BEEP_TONE_FREQ_BITPOS) + | (uint16_t)((uint16_t)noteB.duration << ADI_BEEP_TONE_DUR_BITPOS) ); + } + } +#endif + } + + /* clear the watched interrupt(s) that fired */ + pReg->STAT |= (uint16_t)(fired & ADI_BEEP_ALL_INTERRUPTS); /* only write allowed interrupt bits */ + ISR_EPILOG(); +} +/*! \endcond */ + +/*@}*/ + + + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/beep/adi_beep_def.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/beep/adi_beep_def.h new file mode 100755 index 0000000000..22e0b3a949 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/beep/adi_beep_def.h @@ -0,0 +1,128 @@ +/*! + ***************************************************************************** + * @file: adi_beep_def.h + * @brief: BEEP Device Driver definition + *----------------------------------------------------------------------------- + * + * Copyright (c) 2016 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL + * PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *****************************************************************************/ + +#ifndef _ADI_BEEP_DEF_H_ +#define _ADI_BEEP_DEF_H_ + +/*! \cond PRIVATE */ +#include + +/*! + ***************************************************************************** + * An interrupt mask covering all Beeper interrupts. + *****************************************************************************/ +#define ADI_BEEP_ALL_INTERRUPTS ( BITM_BEEP_CFG_SEQATENDIRQ \ + | BITM_BEEP_CFG_SEQNEARENDIRQ \ + | BITM_BEEP_CFG_BENDIRQ \ + | BITM_BEEP_CFG_BSTARTIRQ \ + | BITM_BEEP_CFG_AENDIRQ \ + | BITM_BEEP_CFG_ASTARTIRQ) + +#define ADI_BEEP_TONE_DISABLE (BITM_BEEP_TONEA_DIS) /*!< Beeper tone disable bit */ + +#define ADI_BEEP_TONE_FREQ_BITPOS (BITP_BEEP_TONEA_FREQ) /*!< Beeper tone frequency bitfield position */ +#define ADI_BEEP_TONE_DUR_BITPOS (BITP_BEEP_TONEA_DUR) /*!< Beeper tone duration bitfield position */ + +#define ADI_BEEP_TONE_FREQ_MASK (BITM_BEEP_TONEA_FREQ) /*!< Beeper tone frequency bitfield mask */ +#define ADI_BEEP_TONE_DUR_MASK (BITM_BEEP_TONEA_DUR) /*!< Beeper tone duration bitfield mask */ + +/*! + ***************************************************************************** + * ADI_BEEP_STATE + * + * BEEP driver state. Used for internal tracking of the BEEP device initialization + * progress during the adi_beep_Open(). Also used to insure the BEEP device has been + * properly initialized as a prerequisite to using the balance of the BEEP API. + * + *****************************************************************************/ +typedef uint8_t ADI_BEEP_STATE; +#define ADI_BEEP_STATE_UNINITIALIZED 0u /*!< BEEP is not initialized. */ +#define ADI_BEEP_STATE_INITIALIZED (1u << 1u) /*!< BEEP is initialized. */ +#define ADI_BEEP_STATE_PLAYING (1u << 2u) /*!< BEEP is currently playing. */ +#define ADI_BEEP_STATE_BLOCKED (1u << 3u) /*!< BEEP has blocked, waiting completion. */ + +/*! + * \struct ADI_BEEP_DEV_DATA + * Beeper device internal instance data structure. + */ +typedef struct _ADI_BEEP_DEV_DATA +{ + volatile ADI_BEEP_STATE state; /*!< Device state */ + ADI_CALLBACK cbFunc; /*!< Callback function */ + void *cbParam; /*!< Callback parameter */ +#if ADI_BEEP_INCLUDE_PLAY_SEQUENCE == 1 + ADI_BEEP_NOTE (*pSeqArray)[]; /*!< Pointer to a user-allocated array of notes. */ + volatile uint8_t nSeqIndex; /*!< Index for incrementing sequence */ + uint8_t nSeqMax; /*!< Size of the sequence */ +#endif + SEM_VAR_DECLR +} ADI_BEEP_DEV_DATA; + + +/*! \struct ADI_BEEP_DRIVER_STRUCT + * BEEP Device Structure + */ +typedef struct _ADI_BEEP_DRIVER_STRUCT +{ + ADI_BEEP_TypeDef *pReg; /*!< Pointer to register base */ + ADI_BEEP_DEV_DATA *pData; /*!< Pointer to device data structure */ +} ADI_BEEP_DRIVER_STRUCT; + +/*! \struct ADI_BEEP_STATIC_INIT + * conditionally create static initialization data based on adi_beep_config.h settings + */ +typedef struct { + uint16_t BEEP_CFG; /*!< Beeper configuration register */ + uint16_t BEEP_STAT; /*!< Beeper status register */ + uint16_t BEEP_TONEA; /*!< Beeper ToneA register */ + uint16_t BEEP_TONEB; /*!< Beeper ToneB register */ +} ADI_BEEP_STATIC_INIT; + +/* alias for the actual device structure */ +typedef ADI_BEEP_DRIVER_STRUCT ADI_BEEP_DRIVER; + +/*! \endcond */ + +#endif /* _ADI_BEEP_DEF_H_ */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/common.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/common.h new file mode 100755 index 0000000000..e35f0bd8c2 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/common.h @@ -0,0 +1,127 @@ +/*! + ***************************************************************************** + * @file: common.h + * @brief: Common include file for all example + *----------------------------------------------------------------------------- + * +Copyright (c) 2010-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************/ + + +#ifndef COMMON_H +#define COMMON_H + +#ifdef __ICCARM__ +/* +* Pm106 (rule 20.9): the input/output library shall not be used in + production code +* The purpose of this header is to provide I/O facilities based on stdio. +*/ +#pragma diag_suppress=Pm106 +#endif /* __ICCARM__ */ + +#include +#include +#include +#include +#include + + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm011 (rule 6.3): The basic types of char, int, short, long, float shall not be used. +* Pm064 (rule 16.1): functions with variable number of arguments shall not be used. +*/ +#pragma diag_suppress=Pm011,Pm064 +#endif /* __ICCARM__ */ + + +#ifdef __cplusplus +extern "C" { +#endif + +/* Enable REDIRECT_OUTPUT_TO_UART to send the output to UART terminal. */ +/* #define REDIRECT_OUTPUT_TO_UART */ + +extern char aDebugString[150]; + +#ifdef __ICCARM__ +/* +* Pm154 (rule 19.10): in the definition of a function-like macro, each instance +* of a parameter shall be enclosed in parentheses +* The __VA_ARGS__ macro cannot be enclosed in parentheses. +*/ +#pragma diag_suppress=Pm154 +#endif /* __ICCARM__ */ + +#define DEBUG_MESSAGE(...) \ + do { \ + sprintf(aDebugString,__VA_ARGS__); \ + common_Perf(aDebugString); \ + } while(0) + +#ifdef __ICCARM__ +#pragma diag_default=Pm154 +#endif /* __ICCARM__ */ + +#define DEBUG_RESULT(s,result,expected_value) \ + do { \ + if ((result) != (expected_value)) { \ + sprintf(aDebugString,"%s %d", __FILE__,__LINE__); \ + common_Fail(aDebugString); \ + sprintf(aDebugString,"%s Error Code: 0x%08X\n\rFailed\n\r",(s),(result)); \ + common_Perf(aDebugString); \ + exit(0); \ + } \ + } while (0) + +/******************************************************************************** +* API function prototypes +*********************************************************************************/ +void common_Init(void); +void common_Pass(void); +void common_Fail(char *FailureReason); +void common_Perf(char *InfoString); + +#ifdef __cplusplus +} +#endif + +#endif /* COMMON_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_adc_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_adc_config.h new file mode 100755 index 0000000000..733f75771c --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_adc_config.h @@ -0,0 +1,342 @@ +/*! + ***************************************************************************** + @file: adi_adc_config.h + @brief: Configuration options for ADC driver. + This is specific to the ADC driver and will be included by the driver. + It is not required for the application to include this header file. + ----------------------------------------------------------------------------- + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_ADC_CONFIG_H +#define ADI_ADC_CONFIG_H +#include +/** @defgroup ADC_Driver_Cfg Static Configuration + * @ingroup ADC_Driver + */ + +/** @addtogroup ADC_Driver_Cfg Static Configuration +* @{ +*/ + +/************* ADC Driver configurations ***************/ + + +/*! Configure the default ADC configuration. Oversampling support must be enabled for resolution >12-bits.\n + Valid values are 12 to 16 +*/ +#define ADI_ADC_CFG_RESOLUTION (12) + +/*! Configure the default Vref\n + 3 - External Reference + 2 - Battery Voltage + 1 - 2.5V Internal Reference\n + 0 - 1.25V Internal Reference\n + +*/ +#define ADI_ADC_CFG_VREF (1) + +/*! Enable/Disable MULTI acquisitions of ADC data. + When enabled, DMA will be used for ADC readings which is + the preferred transfer method for multiple transactions. + Otherwise all will be interrupt driven. \n + 1 - Enable MULTI (DMA) acquisitions \n + 0 - Disable MULTI (use Interrupt) acquisitions \n +*/ +#define ADI_ADC_ENABLE_MULTI_ACQUIRE (1) + +/*! Enable/Disable HI/LO Digital Comparator limits \n + 1 - Enable HI/LO Digital Comparator limits\n + 0 - Disable HI/LO Digital Comparator limits\n +*/ +#define ADI_ADC_ENABLE_STATIC_COMPARATOR (1) + +/*! Enable/Disable Channel0 limit comparator \n + 1 - Enable HI Digital Comparator limit\n + 0 - Disable HI Digital Comparator limit\n +*/ +#define ADI_ADC_COMPARATOR_AIN0_HI_EN (0) /* 0 or 1 */ + +/*! Set the Channel0 limit comparator value \n + Sets the HI limit value for the channel, only \n + relevant if ADI_ADC_COMPARATOR_AIN0_HI_EN is set to 1.\n +*/ +#define ADI_ADC_COMPARATOR_AIN0_HI_VAL (4095) /* Range: 0 to 4095 */ + +/*! Enable/Disable Channel0 limit comparator \n + 1 - Enable LO Digital Comparator limit\n + 0 - Disable LO Digital Comparator limit\n +*/ +#define ADI_ADC_COMPARATOR_AIN0_LO_EN (1) /* 0 or 1 */ + +/*! Set the Channel0 limit comparator value. \n + Sets the LO limit value for the channel, only \n + relevant if ADI_ADC_COMPARATOR_AIN0_LO_EN is set to 1.\n +*/ +#define ADI_ADC_COMPARATOR_AIN0_LO_VAL (0) /* Range: 0 to 4095 */ + +/*! Enable/Disable Channel0 hysteresis and monitor cycles \n + 1 - Enable hysteresis and monitor cycles\n + 0 - Disable hysteresis and monitor cycles\n +*/ +#define ADI_ADC_COMPARATOR_AIN0_HYS_EN (1) /* 0 or 1 */ + +/*! Set the Channel0 limit comparator hysteresis value. \n + Sets the hysteresis value for the channel, only \n + relevant if ADI_ADC_COMPARATOR_AIN0_HYS_EN is set to 1.\n +*/ +#define ADI_ADC_COMPARATOR_AIN0_HYS_VAL (0) /* 9 bits, 0 to 511 */ + +/*! Set the Channel0 limit comparator hysteresis monitor value. \n + Sets the monitor value for the channel, only \n + relevant if ADI_ADC_COMPARATOR_AIN0_HYS_EN is set to 1.\n +*/ +#define ADI_ADC_COMPARATOR_AIN0_HYS_CYC (0) /* 3 bits, 0 to 7 */ + +/*! Enable/Disable Channel1 limit comparator \n + 1 - Enable HI Digital Comparator limit\n + 0 - Disable HI Digital Comparator limit\n +*/ +#define ADI_ADC_COMPARATOR_AIN1_HI_EN (0) /* 0 or 1 */ + +/*! Set the Channel1 limit comparator value \n + Sets the HI limit value for the channel, only \n + relevant if ADI_ADC_COMPARATOR_AIN1_HI_EN is set to 1. \n +*/ +#define ADI_ADC_COMPARATOR_AIN1_HI_VAL (4095) /* Range: 0 to 4095 */ + +/*! Enable/Disable Channel1 limit comparator \n + 1 - Enable LO Digital Comparator limit\n + 0 - Disable LO Digital Comparator limit\n +*/ +#define ADI_ADC_COMPARATOR_AIN1_LO_EN (0) /* 0 or 1 */ + +/*! Set the Channel1 limit comparator value. \n + Sets the LO limit value for the channel, only \n + relevant if ADI_ADC_COMPARATOR_AIN1_LO_EN is set to 1.\n +*/ +#define ADI_ADC_COMPARATOR_AIN1_LO_VAL (0) /* Range: 0 to 4095 */ + +/*! Enable/Disable Channel1 hysteresis and monitor cycles \n + 1 - Enable hysteresis and monitor cycles\n + 0 - Disable hysteresis and monitor cycles\n +*/ +#define ADI_ADC_COMPARATOR_AIN1_HYS_EN (0) /* 0 or 1 */ + +/*! Set the Channel1 limit comparator hysteresis value. \n + Sets the hysteresis value for the channel, only \n + relevant if ADI_ADC_COMPARATOR_AIN1_HYS_EN is set to 1.\n +*/ +#define ADI_ADC_COMPARATOR_AIN1_HYS_VAL (0) /* 9 bits, 0 to 511 */ + +/*! Set the Channel1 limit comparator hysteresis monitor value. \n + Sets the monitor value for the channel, only \n + relevant if ADI_ADC_COMPARATOR_AIN1_HYS_EN is set to 1.\n +*/ +#define ADI_ADC_COMPARATOR_AIN1_HYS_CYC (0) /* 3 bits, 0 to 7 */ + +/*! Enable/Disable Channel2 limit comparator \n + 1 - Enable HI Digital Comparator limit\n + 0 - Disable HI Digital Comparator limit\n +*/ +#define ADI_ADC_COMPARATOR_AIN2_HI_EN (0) /* 0 or 1 */ + +/*! Set the Channel2 limit comparator value \n + Sets the HI limit value for the channel, only \n + relevant if ADI_ADC_COMPARATOR_AIN2_HI_EN is set to 1. \n +*/ +#define ADI_ADC_COMPARATOR_AIN2_HI_VAL (4095) /* Range: 0 to 4095 */ + +/*! Enable/Disable Channel2 limit comparator \n + 1 - Enable LO Digital Comparator limit\n + 0 - Disable LO Digital Comparator limit\n +*/ +#define ADI_ADC_COMPARATOR_AIN2_LO_EN (0) /* 0 or 1 */ + +/*! Set the Channel2 limit comparator value. \n + Sets the LO limit value for the channel, only \n + relevant if ADI_ADC_COMPARATOR_AIN2_LO_EN is set to 1.\n +*/ +#define ADI_ADC_COMPARATOR_AIN2_LO_VAL (0) /* Range: 0 to 4095 */ + +/*! Enable/Disable Channel2 hysteresis and monitor cycles \n + 1 - Enable hysteresis and monitor cycles\n + 0 - Disable hysteresis and monitor cycles\n +*/ +#define ADI_ADC_COMPARATOR_AIN2_HYS_EN (0) /* 0 or 1 */ + +/*! Set the Channel2 limit comparator hysteresis value. \n + Sets the hysteresis value for the channel, only \n + relevant if ADI_ADC_COMPARATOR_AIN2_HYS_EN is set to 1.\n +*/ +#define ADI_ADC_COMPARATOR_AIN2_HYS_VAL (0) /* 9 bits, 0 to 511 */ + +/*! Set the Channel2 limit comparator hysteresis monitor value. \n + Sets the monitor value for the channel, only \n + relevant if ADI_ADC_COMPARATOR_AIN2_HYS_EN is set to 1.\n +*/ +#define ADI_ADC_COMPARATOR_AIN2_HYS_CYC (0) /* 3 bits, 0 to 7 */ + +/*! Enable/Disable Channel3 limit comparator \n + 1 - Enable HI Digital Comparator limit\n + 0 - Disable HI Digital Comparator limit\n +*/ +#define ADI_ADC_COMPARATOR_AIN3_HI_EN (0) /* 0 or 1 */ + +/*! Set the Channel3 limit comparator value \n + Sets the HI limit value for the channel, only \n + relevant if ADI_ADC_COMPARATOR_AIN3_HI_EN is set to 1. \n +*/ +#define ADI_ADC_COMPARATOR_AIN3_HI_VAL (4095) /* Range: 0 to 4095 */ + +/*! Enable/Disable Channel3 limit comparator \n + 1 - Enable LO Digital Comparator limit\n + 0 - Disable LO Digital Comparator limit\n +*/ +#define ADI_ADC_COMPARATOR_AIN3_LO_EN (0) /* 0 or 1 */ + +/*! Set the Channel3 limit comparator value. \n + Sets the LO limit value for the channel, only \n + relevant if ADI_ADC_COMPARATOR_AIN3_LO_EN is set to 1.\n +*/ +#define ADI_ADC_COMPARATOR_AIN3_LO_VAL (0) /* Range: 0 to 4095 */ + +/*! Enable/Disable Channel3 hysteresis and monitor cycles \n + 1 - Enable hysteresis and monitor cycles\n + 0 - Disable hysteresis and monitor cycles\n +*/ +#define ADI_ADC_COMPARATOR_AIN3_HYS_EN (0) /* 0 or 1 */ + +/*! Set the Channel3 limit comparator hysteresis value. \n + Sets the hysteresis value for the channel, only \n + relevant if ADI_ADC_COMPARATOR_AIN3_HYS_EN is set to 1.\n +*/ +#define ADI_ADC_COMPARATOR_AIN3_HYS_VAL (0) /* 9 bits, 0 to 511 */ + +/*! Set the Channel3 limit comparator hysteresis monitor value. \n + Sets the monitor value for the channel, only \n + relevant if ADI_ADC_COMPARATOR_AIN3_HYS_EN is set to 1.\n +*/ +#define ADI_ADC_COMPARATOR_AIN3_HYS_CYC (0) /* 3 bits, 0 to 7 */ + + +/************** Macro validation *****************************/ + +#if (ADI_ADC_CFG_RESOLUTION < 12) || (ADI_ADC_CFG_RESOLUTION > 16) +#error "ADI_ADC_CFG_RESOLUTION is invalid" +#endif + +#if (ADI_ADC_CFG_VREF < 0) || (ADI_ADC_CFG_VREF > 3) +#error "ADI_ADC_CFG_VREF is invalid" +#endif + +#if (ADI_ADC_COMPARATOR_AIN0_HI_VAL < (0)) || (ADI_ADC_COMPARATOR_AIN0_HI_VAL > (4095)) +#error "ADI_ADC_COMPARATOR_AIN0_HI_VAL is invalid" +#endif + +#if (ADI_ADC_COMPARATOR_AIN1_HI_VAL < (0)) || (ADI_ADC_COMPARATOR_AIN1_HI_VAL > (4095)) +#error "ADI_ADC_COMPARATOR_AIN1_HI_VAL is invalid" +#endif + +#if (ADI_ADC_COMPARATOR_AIN2_HI_VAL < (0)) || (ADI_ADC_COMPARATOR_AIN2_HI_VAL > (4095)) +#error "ADI_ADC_COMPARATOR_AIN2_HI_VAL is invalid" +#endif + +#if (ADI_ADC_COMPARATOR_AIN3_HI_VAL < (0)) || (ADI_ADC_COMPARATOR_AIN3_HI_VAL > (4095)) +#error "ADI_ADC_COMPARATOR_AIN3_HI_VAL is invalid" +#endif + + +#if (ADI_ADC_COMPARATOR_AIN0_LO_VAL < (0)) || (ADI_ADC_COMPARATOR_AIN0_LO_VAL > (4095)) +#error "ADI_ADC_COMPARATOR_AIN0_LO_VAL is invalid" +#endif + +#if (ADI_ADC_COMPARATOR_AIN1_LO_VAL < (0)) || (ADI_ADC_COMPARATOR_AIN1_LO_VAL > (4095)) +#error "ADI_ADC_COMPARATOR_AIN1_LO_VAL is invalid" +#endif + +#if (ADI_ADC_COMPARATOR_AIN2_LO_VAL < (0)) || (ADI_ADC_COMPARATOR_AIN2_LO_VAL > (4095)) +#error "ADI_ADC_COMPARATOR_AIN2_LO_VAL is invalid" +#endif + +#if (ADI_ADC_COMPARATOR_AIN3_LO_VAL < (0)) || (ADI_ADC_COMPARATOR_AIN3_LO_VAL > (4095)) +#error "ADI_ADC_COMPARATOR_AIN3_HI_VAL is invalid" +#endif + + +#if (ADI_ADC_COMPARATOR_AIN0_HYS_VAL < (0)) || (ADI_ADC_COMPARATOR_AIN0_HYS_VAL > (511)) +#error "ADI_ADC_COMPARATOR_AIN0_HYS_VAL is invalid" +#endif + +#if (ADI_ADC_COMPARATOR_AIN1_HYS_VAL < (0)) || (ADI_ADC_COMPARATOR_AIN1_HYS_VAL > (511)) +#error "ADI_ADC_COMPARATOR_AIN1_HYS_VAL is invalid" +#endif + +#if (ADI_ADC_COMPARATOR_AIN2_HYS_VAL < (0)) || (ADI_ADC_COMPARATOR_AIN2_HYS_VAL > (511)) +#error "ADI_ADC_COMPARATOR_AIN2_HYS_VAL is invalid" +#endif + +#if (ADI_ADC_COMPARATOR_AIN3_HYS_VAL < (0)) || (ADI_ADC_COMPARATOR_AIN3_HYS_VAL > (511)) +#error "ADI_ADC_COMPARATOR_AIN3_HYS_VAL is invalid" +#endif + + +#if (ADI_ADC_COMPARATOR_AIN0_HYS_CYC < (0)) || (ADI_ADC_COMPARATOR_AIN0_HYS_CYC > (7)) +#error "ADI_ADC_COMPARATOR_AIN0_HYS_CYC is invalid" +#endif + +#if (ADI_ADC_COMPARATOR_AIN1_HYS_CYC < (0)) || (ADI_ADC_COMPARATOR_AIN1_HYS_CYC > (7)) +#error "ADI_ADC_COMPARATOR_AIN1_HYS_CYC is invalid" +#endif + +#if (ADI_ADC_COMPARATOR_AIN2_HYS_CYC < (0)) || (ADI_ADC_COMPARATOR_AIN2_HYS_CYC > (7)) +#error "ADI_ADC_COMPARATOR_AIN2_HYS_CYC is invalid" +#endif + +#if (ADI_ADC_COMPARATOR_AIN3_HYS_CYC < (0)) || (ADI_ADC_COMPARATOR_AIN3_HYS_CYC > (7)) +#error "ADI_ADC_COMPARATOR_AIN3_HYS_CYC is invalid" +#endif + + + + +/*! @} */ + +#endif /* ADI_ADC_CONFIG_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_beep_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_beep_config.h new file mode 100755 index 0000000000..a78814b0c7 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_beep_config.h @@ -0,0 +1,164 @@ +/*! + ***************************************************************************** + @file: adi_beep_config.h + @brief: Configuration options for BEEP driver. + This is specific to the BEEP driver and will be included by the driver. + It is not required for the application to include this header file. + ----------------------------------------------------------------------------- + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_BEEP_CONFIG_H +#define ADI_BEEP_CONFIG_H +#include + +#ifdef __ICCARM__ +/* IAR MISRA C 2004 error suppressions. + * + * Pm009 (rule 5.1): identifiers shall not rely on significance of more than 31 characters. + * IAR compiler supports longer identifiers. + */ +#pragma diag_suppress=Pm009 +#endif /* __ICCARM__ */ + +/** @addtogroup BEEP_Driver_Config Static Configuration + * @ingroup BEEP_Driver + * @{ + */ + +/************* BEEP Driver configurations ***************/ +/*! Enable the inclusion of adi_beep_PlaySequence(). This \n + API requires more data in the device structures to manage \n + the longer playing sequences, along with extra code in \n + the interrupt handler. \n + 0 - adi_beep_PlaySequence() omitted.\n + 1 - adi_beep_PlaySequence() is included. */ +#define ADI_BEEP_INCLUDE_PLAY_SEQUENCE 1 + +/************* BEEP controller static configurations ***************/ + +/*! Configure beeper disable.\n + 0 - Beeper enabled.\n + 1 - Beeper disabled. */ +#define ADI_BEEP_CFG_BEEPER_DISABLE 0 + +/*! Configure beeper sequence, when using static configuration. \n + 0 - Single note (Tone A only).\n + 1-255 - Sequence mode repeat count (Tone A then B sequentially). */ +#define ADI_BEEP_CFG_SEQUENCE_REPEAT_VALUE 5 + + +/* TONEA CONTROL REGISTER */ + +/*! Initial ToneA Disable.\n + 0 - ToneA Enabled.\n + 1 - ToneA Disabled. */ +#define ADI_BEEP_TONEA_DISABLE 0 + +/*! Initial ToneA Frequency.\n + 0-3 - Rest Tone (no oscillation).\n + 4-127 - Oscillate at 32kHz/freq Hz. */ +#define ADI_BEEP_TONEA_FREQUENCY 20 + +/*! Initial ToneA Duration.\n + 0-254 - Play for 4ms*duration.\n + 255 - Play for infinite duration. */ +#define ADI_BEEP_TONEA_DURATION 2 + + + +/* TONEB CONTROL REGISTER */ + +/*! Initial ToneB Disable.\n + 0 - ToneB Enabled.\n + 1 - ToneB Disabled. */ +#define ADI_BEEP_TONEB_DISABLE 0 + +/*! Initial ToneB Frequency. \n + 0-3 - Rest Tone (no oscillation).\n + 4-127 - Oscillate at 32kHz/freq Hz. */ +#define ADI_BEEP_TONEB_FREQUENCY 50 + +/*! Initial ToneB Duration.\n + 0-254 - Play for 4ms*duration.\n + 255 - Play for infinite duration. */ +#define ADI_BEEP_TONEB_DURATION 2 + + + +#ifdef __ICCARM__ +/* +* Pm085 (rule 19.11): identifiers in pre-processor directives should be defined before use +* The macros in the the following #if directives are defined to enum constants by default. +*/ +#pragma diag_suppress=Pm085 +#endif /* __ICCARM__ */ + +#if (ADI_BEEP_TONEA_DISABLE > 1) +#error "Invalid configuration" +#endif + +#if ( ADI_BEEP_TONEA_FREQUENCY > 127 ) +#error "Invalid configuration" +#endif + +#if ( ADI_BEEP_TONEA_DURATION > 255 ) +#error "Invalid configuration" +#endif + +#if (ADI_BEEP_TONEB_DISABLE > 1) +#error "Invalid configuration" +#endif + +#if ( ADI_BEEP_TONEB_FREQUENCY > 127 ) +#error "Invalid configuration" +#endif + +#if ( ADI_BEEP_TONEB_DURATION > 255 ) +#error "Invalid configuration" +#endif + +#ifdef __ICCARM__ +#pragma diag_default=Pm009,Pm085 +#endif /* __ICCARM__ */ + +/*! @} */ + +#endif /* ADI_BEEP_CONFIG_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_crc_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_crc_config.h new file mode 100755 index 0000000000..19737e3a88 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_crc_config.h @@ -0,0 +1,100 @@ +/*! + ***************************************************************************** + @file: adi_crc_config.h + @brief: Configuration options for CRC driver. + This is specific to the CRC driver and will be included by the driver. + It is not required for the application to include this header file. + ----------------------------------------------------------------------------- + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_CRC_CONFIG_H +#define ADI_CRC_CONFIG_H + +#include + +/** @defgroup CRC_Driver_Cfg Static Configuration + * @ingroup CRC_Driver + */ + +/** @addtogroup CRC_Driver_Cfg Static Configuration +* @{ +*/ + +/************* CRC Driver configurations ***************/ +/*! + Enable DMA support in the driver code.\n + 1 - To have the DMA support code in the driver.\n + 0 - To eliminate the DMA support. Operates in core mode.\n +*/ +#define ADI_CRC_CFG_ENABLE_DMA_SUPPORT 0 + +/*! + Enable Byte mirroring option\n + 1 - To enable byte mirroring \n + 0 - To disable the byte mirroring. +*/ +#define ADI_CFG_CRC_ENABLE_BYTE_MIRRORING 0 +/*! + Enable Bit mirroring option\n + 1 - To enable bit mirroring \n + 0 - To disable the bit mirroring. +*/ +#define ADI_CFG_CRC_ENABLE_BIT_MIRRORING 0 + +/*! + To specify the seed value for CRC computation +*/ + +#define ADI_CFG_CRC_SEED_VALUE (0xFFFFFFFFu) + +/*! + To specify the polynomial to be used for CRC computation +*/ +#define ADI_CFG_CRC_POLYNOMIAL (0x04C11DB7u) + +/*! + To specify the Software DMA channel to be used for the CRC computation + 0 -> DMA channel SIP0, ..., 7 -> DMA channel SIP7 +*/ +#define ADI_CFG_CRC_SOFTWARE_DMA_CHANNEL_ID 7 + +#endif /* ADI_CRC_CONFIG_H */ +/*! @} */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_crypto_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_crypto_config.h new file mode 100755 index 0000000000..d67f6ab81c --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_crypto_config.h @@ -0,0 +1,138 @@ +/*! + ***************************************************************************** + @file: adi_crypto_config.h + @brief: Configuration options for Crypto driver. + This is specific to the Crypto driver and will be included by the driver. + It is not required for the application to include this header file. + ----------------------------------------------------------------------------- + +Copyright (c) 2014-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef __ADI_CRYPTO_CONFIG_H__ +#define __ADI_CRYPTO_CONFIG_H__ +#include + +/** @addtogroup Crypto_Driver_Config Static Configuration + * @ingroup Crypto_Driver + * @{ + */ + +/************* Crypto Driver configurations ***************/ + +/*! Enable/Disable ECB Support\n + 1 - Enable ECB Support\n + 0 - Disable ECB Support\n +*/ +#define ADI_CRYPTO_ENABLE_ECB_SUPPORT (1) + +/*! Enable/Disable CTR Support\n + 1 - Enable CTR Support\n + 0 - Disable CTR Support\n +*/ +#define ADI_CRYPTO_ENABLE_CTR_SUPPORT (1) + +/*! Enable/Disable CBC Support\n + 1 - Enable CBC Support\n + 0 - Disable CBC Support\n +*/ +#define ADI_CRYPTO_ENABLE_CBC_SUPPORT (1) + +/*! Enable/Disable CCM Support\n + 1 - Enable CCM Support\n + 0 - Disable CCM Support\n +*/ +#define ADI_CRYPTO_ENABLE_CCM_SUPPORT (1) + +/*! Enable/Disable CMAC Support\n + 1 - Enable CMAC Support\n + 0 - Disable CMAC Support\n +*/ +#define ADI_CRYPTO_ENABLE_CMAC_SUPPORT (1) + +/*! Enable/Disable HMAC Support\n + 1 - Enable HMAC Support\n + 0 - Disable HMAC Support\n +*/ +#define ADI_CRYPTO_ENABLE_HMAC_SUPPORT (1) + +/*! Enable/Disable SHA Support\n + 1 - Enable SHA Support\n + 0 - Disable SHA Support\n +*/ +#define ADI_CRYPTO_ENABLE_SHA_SUPPORT (1) + + +/*! Enable/Disable DMA Support\n + 1 - Enable DMA Support\n + 0 - Disable DMA Support +*/ +#define ADI_CRYPTO_ENABLE_DMA_SUPPORT (1) + +/*! Enable/Disable DMA Transfer by default\n + 1 - Enable DMA \n + 0 - Disable DMA +*/ +#define ADI_CRYPTO_ENABLE_DMA (1) + +/*! SHA output format\n + 1 - Big-Endian \n + 0 - Little-Endian +*/ +#define ADI_CRYPTO_SHA_OUTPUT_FORMAT (1) + + + +/************** Macro validation *****************************/ + +#if ((ADI_CRYPTO_ENABLE_DMA_SUPPORT != 0) && (ADI_CRYPTO_ENABLE_DMA_SUPPORT != 1)) +#error "ADI_CRYPTO_ENABLE_DMA_SUPPORT is invalid" +#endif + +#if ((ADI_CRYPTO_ENABLE_DMA != 0) && (ADI_CRYPTO_ENABLE_DMA != 1)) +#error "ADI_CRYPTO_ENABLE_DMA is invalid" +#endif + +#if ((ADI_CRYPTO_ENABLE_DMA == 1) && (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 0)) +#error "DMA cannot be enabled if DMA support is disabled" +#endif + +/*! @} */ + +#endif /* __ADI_CRYPTO_CONFIG_H__ */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_cycle_counting_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_cycle_counting_config.h new file mode 100755 index 0000000000..4b83c46fd7 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_cycle_counting_config.h @@ -0,0 +1,105 @@ +/*! ***************************************************************************** + * @file adi_cycle_counting_config.h + * @brief Cycle Counting Framework configuration + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + + +#ifndef ADI_CYCLE_COUNTING_CONFIG_H +#define ADI_CYCLE_COUNTING_CONFIG_H + +/** @addtogroup CYCLE_COUNTING_Config Static Configuration + * @ingroup cyclecount_logging + * @{ + */ + + +/************* Cycle Counting Configuration ***************/ + +/*! Global enable. This must be enabled for any other functionality to work\n + 0u disabled + 1u enabled +*/ +#define ADI_CYCLECOUNT_ENABLED (0u) + +/*! SPI Interrupt Mode ISR Cycle Counting Enabled\n + 0 - Disables the recording of SPI ISR cycle counting. + 1 - Enables the recording of SPI ISR cycle counting. +*/ +#define ADI_CYCLECOUNT_SPI_ISR_ENABLED (0u) + + +/*! CRC Interrupt Mode ISR Cycle Counting Enabled\n + 0 - Disables the recording of CRC ISR cycle counting. + 1 - Enables the recording of CRC ISR cycle counting. +*/ +#define ADI_CYCLECOUNT_CRC_ISR_ENABLED (0u) + + +/*! SPORT Interrupt Mode ISR Cycle Counting Enabled\n + 0 - Disables the recording of SPORT ISR cycle counting. + 1 - Enables the recording of SPORT ISR cycle counting. +*/ +#define ADI_CYCLECOUNT_SPORT_ISR_ENABLED (0u) + +/*! UART Interrupt Mode ISR Cycle Counting Enabled\n + 0 - Disables the recording of UART ISR cycle counting. + 1 - Enables the recording of UART ISR cycle counting. +*/ +#define ADI_CYCLECOUNT_UART_ISR_ENABLED (0u) + + +/*! A user application may desire/require cycle counting in an application defined API + or ISR. Set this macro to the number of required. +*/ +#define ADI_CYCLECOUNT_NUMBER_USER_DEFINED_APIS (0u) + +/*! + * Cycle count 'stack' nesting depth. Adjust as needed. + * This should map to the maximum number of nested interrupts an application might experience. + */ +#define ADI_CYCLECOUNT_STACK_SIZE 10 + +/** + * @} + */ + +#endif /* ADI_CYCLE_COUNTING_CONFIG_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_flash_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_flash_config.h new file mode 100755 index 0000000000..5eb4e5a779 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_flash_config.h @@ -0,0 +1,299 @@ +/*! + ***************************************************************************** + @file: adi_flash_config.h + @brief: Configuration options for flash driver. + This is specific to the flash driver and will be included by the driver. + It is not required for the application to include this header file. + @version: $Revision: 33205 $ + @date: $Date: 2016-01-11 05:46:07 -0500 (Mon, 11 Jan 2016) $ + ----------------------------------------------------------------------------- + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_FLASH_CONFIG_H +#define ADI_FLASH_CONFIG_H +#include + +/** @addtogroup Flash_Driver_Config Static Configuration + * @ingroup Flash_Driver + * @{ + */ + + +/****SETTINGS THAT LIVE IN FEE INTERRUPT ENABLE (IEN) REGISTER****/ + + +/*! + * Configure a response to the 2-bit ECC ERROR events (in IEN). + * - 0 Do not generate a response to ECC Error Events. + * - 1 Generate Bus Errors in response to ECC Error Events. + * - 2 Generate IRQs in response to ECC Error Events. + */ +#define ADI_FEE_CFG_ECC_ERROR_RESPONSE (1u) +/*! + * Configure a response to the 1-bit ECC CORRECTION events (in IEN). + * - 0 Do not generate a response to ECC correction Events. + * - 1 Generate Bus Errors in response to ECC correction Events. + * - 2 Generate IRQs in response to ECC correction Events. + */ +#define ADI_FEE_CFG_ECC_CORRECTION_RESPONSE (2u) + + + +/****SETTINGS THAT LIVE IN FEE TIME PARAMETER 0 (TIME_PARAM0) REGISTER****/ + + +/* It is recommended to NOT MODIFY flash timing parameters without keen insight and caution */ +/*! + * Configure flash non-volatile mass erase hold time.\n + * Upper 4-bits of 11-bit value.\n + * (Lower bits are hard-coded to 0x14.)\n + * Hardware default value is 0xb. + */ +#define ADI_FEE_CFG_PARAM0_TNVH1 (0xbu) + +/*! + * Configure flash erase time.\n + * Upper 4-bits of 19-bit value.\n + * (Lower bits are hard-coded to 0x7370.)\n + * Hardware default value is 0x8. + */ +#define ADI_FEE_CFG_PARAM0_TERASE (0x8u) + +/*! + * Configure flash recovery time.\n + * Upper 4-bits of 8-bit value.\n + * (Lower bits are hard-coded to 0x2.)\n + * Hardware default value is 0x9. + */ +#define ADI_FEE_CFG_PARAM0_TRCV (0x9u) + +/*! + * Configure flash non-volatile hold time.\n + * Upper 4-bits of 8-bit value.\n + * (Lower bits are hard-coded to 0x1.)\n + * Hardware default value is 0x5. + */ +#define ADI_FEE_CFG_PARAM0_TNVH (0x5u) + +/*! + * Configure flash program time.\n + * Upper 4-bits of 10-bit value.\n + * (Lower bits are hard-coded to 0x7.)\n + * Hardware default value is 0x0. + */ +#define ADI_FEE_CFG_PARAM0_TPROG (0x0u) + +/*! + * Configure flash NVSTR-to-program setup time.\n + * Upper 4-bits of 8-bit value.\n + * (Lower bits are hard-coded to 0x2.)\n + * Hardware default value is 0x9. + */ +#define ADI_FEE_CFG_PARAM0_TPGS (0x9u) + +/*! + * Configure flash program/erase-to-NVSTR setup time.\n + * Upper 4-bits of 8-bit value.\n + * (Lower bits are hard-coded to 0x1.)\n + * Hardware default value is 0x5. + */ +#define ADI_FEE_CFG_PARAM0_TNVS (0x5u) + +/*! + * Configure flash reference clock divide-by-2 setting.\n + * All timing parameters are referenced to this parameter. + * - 0 Reference clock is not divided. + * - 1 Reference clock is divided by 2.\n + * Hardware default value is 0x0. + */ +#define ADI_FEE_CFG_PARAM0_CLKDIV (0x0u) + + + +/****SETTINGS THAT LIVE IN FEE TIME PARAMETER 1 (TIME_PARAM1) REGISTER****/ + + +/* It is recommended to NOT MODIFY flash timing parameters without keen insight and caution */ +/*! + * Configure flash read access wait states.\n + * Number of 3-bit read access wait states to use.\n + * Maximum allowed value is 0x4.\n + * Hardware default value is 0x0. + */ +#define ADI_FEE_CFG_PARAM1_WAITESTATES (0x0u) + +/*! + * Configure flash sleep mode wake-up time.\n + * Upper 4-bits of 8-bit value.\n + * (Lower bits are hard-coded to 0xb.)\n + * Hardware default value is 0x4. + */ +#define ADI_FEE_CFG_PARAM1_TWK (0x4u) + + + +/****SETTINGS THAT LIVE IN FEE SYSTEM ABOUT ENABLE (ABOUT_EN_XX) REGISTERS****/ + + +/*! + * Configure lower (0-31) flash system interrupt abort enables.\n + * Allows system interrupts to abort an ongoing flash command.\n + * Only 64 system interrupts are supported.\n + * Lower interrupts (0-31) are encoded in ADI_FEE_CFG_ABORT_EN_LO, + * - 0 Corresponding interrupt is prevented from aborting flash command. + * - 1 Corresponding interrupt is allowed to abort flash command.\n + * Hardware default value is 0x0. + */ +#define ADI_FEE_CFG_ABORT_EN_LO (0x0u) + +/*! + * Configure upper (32-63) flash system interrupt abort enables.\n + * Allows system interrupts to abort an ongoing flash command.\n + * Only 64 system interrupts are supported.\n + * Upper interrupts (32-63) are encoded in ADI_FEE_CFG_ABORT_EN_HI. + * - 0 Corresponding interrupt is prevented from aborting flash command. + * - 1 Corresponding interrupt is allowed to abort flash command.\n + * Hardware default value is 0x0. + */ +#define ADI_FEE_CFG_ABORT_EN_HI (0x0u) + + + +/****SETTINGS THAT LIVE IN ECC CONFIG REGISTER (ECC_CFG) REGISTER****/ + + +/*! + * ECC Start Page Pointer (in ECC_CFG). + */ +#define ADI_FEE_CFG_ECC_START_PAGE (0u) + +/*! + * Enable/Disable ECC for info space (in ECC_CFG). + * - 1 Enable Info Space. + * - 0 Disable Info Space. + */ +#define ADI_FEE_CFG_ENABLE_ECC_FOR_INFO_SPACE (0u) + +/*! + * Enable/Disable ECC (in ECC_CFG). + * - 1 Enable ECC. + * - 0 Disable ECC. + */ +#define ADI_FEE_CFG_ENABLE_ECC (0u) + + + +/************* Flash Driver Configuration Settings Checkers ***************/ + + + +/* IEN CHECKS */ +#if ((ADI_FEE_CFG_ECC_ERROR_RESPONSE < 0u) || (ADI_FEE_CFG_ECC_ERROR_RESPONSE > 2u)) +#error "ADI_FEE_CFG_ECC_ERROR_RESPONSE should be in the range 0-2." +#endif +#if ((ADI_FEE_CFG_ECC_CORRECTION_RESPONSE < 0u) || (ADI_FEE_CFG_ECC_CORRECTION_RESPONSE > 2u)) +#error "ADI_FEE_CFG_ECC_CORRECTION_RESPONSE should be in the range 0-2." +#endif + + + +/* PARAM0 CHECKS */ +#if ((ADI_FEE_CFG_PARAM0_TNVH1 < 0u) || (ADI_FEE_CFG_PARAM0_TNVH1 > 15u)) +#error "ADI_FEE_CFG_PARAM0_TNVH1 should be in the range 0-15." +#endif +#if ((ADI_FEE_CFG_PARAM0_TERASE < 0u) || (ADI_FEE_CFG_PARAM0_TERASE > 15u)) +#error "ADI_FEE_CFG_PARAM0_TERASE should be in the range 0-15." +#endif +#if ((ADI_FEE_CFG_PARAM0_TRCV < 0u) || (ADI_FEE_CFG_PARAM0_TRCV > 15u)) +#error "ADI_FEE_CFG_PARAM0_TRCV should be in the range 0-15." +#endif +#if ((ADI_FEE_CFG_PARAM0_TNVH1 < 0u) || (ADI_FEE_CFG_PARAM0_TNVH1 > 15u)) +#error "ADI_FEE_CFG_PARAM0_TNVH1 should be in the range 0-15." +#endif +#if ((ADI_FEE_CFG_PARAM0_TPROG < 0u) || (ADI_FEE_CFG_PARAM0_TPROG > 15u)) +#error "ADI_FEE_CFG_PARAM0_TPROG should be in the range 0-15." +#endif +#if ((ADI_FEE_CFG_PARAM0_TPGS < 0u) || (ADI_FEE_CFG_PARAM0_TPGS > 15u)) +#error "ADI_FEE_CFG_PARAM0_TPGS should be in the range 0-15." +#endif +#if ((ADI_FEE_CFG_PARAM0_TNVS < 0u) || (ADI_FEE_CFG_PARAM0_TNVS > 15u)) +#error "ADI_FEE_CFG_PARAM0_TNVS should be in the range 0-15." +#endif +#if ((ADI_FEE_CFG_PARAM0_CLKDIV < 0u) || (ADI_FEE_CFG_PARAM0_CLKDIV > 1u)) +#error "ADI_FEE_CFG_PARAM0_CLKDIV should be in the range 0-1." +#endif + + + +/* PARAM1 CHECKS */ +#if ((ADI_FEE_CFG_PARAM1_WAITESTATES < 0u) || (ADI_FEE_CFG_PARAM1_WAITESTATES > 4u)) +#error "ADI_FEE_CFG_PARAM1_WAITESTATES should be in the range 0-4." +#endif +#if ((ADI_FEE_CFG_PARAM1_TWK < 0u) || (ADI_FEE_CFG_PARAM1_TWK > 15u)) +#error "ADI_FEE_CFG_PARAM1_TWK should be in the range 0-15." +#endif + + + +/* ABORT_EN_XX CHECKS */ +#if ((ADI_FEE_CFG_ABORT_EN_LO < 0u) || (ADI_FEE_CFG_ABORT_EN_LO > 0XFFFFu)) +#error "ADI_FEE_CFG_ABORT_EN_LO should be in 32-bit range." +#endif +#if ((ADI_FEE_CFG_ABORT_EN_HI < 0u) || (ADI_FEE_CFG_ABORT_EN_HI > 0XFFFFu)) +#error "ADI_FEE_CFG_ABORT_EN_HI should be in 32-bit range." +#endif + + + +/* ECC_CFG CHECKS */ +#if (((ADI_FEE_CFG_ECC_START_PAGE >> 8u) << 8) != ADI_FEE_CFG_ECC_START_PAGE) +#error "ADI_FEE_CFG_ECC_START_PAGE has invalid bits set in lower 8-bits." +#endif +#if ((ADI_FEE_CFG_ENABLE_ECC_FOR_INFO_SPACE != 0u) && (ADI_FEE_CFG_ENABLE_ECC_FOR_INFO_SPACE != 1u)) +#error "ADI_FEE_CFG_ENABLE_ECC_FOR_INFO_SPACE should be 1 or 0." +#endif +#if ((ADI_FEE_CFG_ENABLE_ECC != 0u) && (ADI_FEE_CFG_ENABLE_ECC != 1u)) +#error "ADI_FEE_CFG_ENABLE_ECC should be 1 or 0." +#endif + +/*! @} */ + +#endif /* ADI_FLASH_CONFIG_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_global_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_global_config.h new file mode 100755 index 0000000000..6d205577a3 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_global_config.h @@ -0,0 +1,131 @@ +/*! + ***************************************************************************** + @file: adi_global_config.h + @brief: Configuration options for all the drivers. + ----------------------------------------------------------------------------- + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_GLOBAL_CONFIG_H +#define ADI_GLOBAL_CONFIG_H + +/** @addtogroup GLOBAL_Driver_Config Global Static Configuration + * @brief Configuration options for all the drivers. + * @{ + */ + +/*! @name RTOS used + * In order to be used in a multi-threaded application, the device drivers + * may require the use of some RTOS-specific signals like semaphores or actions + * may be required when entering/exiting an interrupt. By specifying the RTOS + * that the application uses, the drivers can map their requirements to the + * specific RTOS, without requiring an OS abstraction layer. + * @note This macros do not add the RTOS sources to the application, users need + * to set up the source and include paths in their application themselves + * @note If the RTOS specified is not in the list of supported RTOS the build + * mechanism fails + */ +/**@{*/ + +/*! @hideinitializer Indicates that no RTOS is used (bare-metal applications) */ +#define ADI_CFG_RTOS_NO_OS (1) +/*! @hideinitializer Indicates that Micrium uCOS-III is used */ +#define ADI_CFG_RTOS_MICRIUM_III (2) +/*! @hideinitializer Indicates that Micrium FreeRTOS is used */ +#define ADI_CFG_RTOS_FREERTOS (3) + +/*! Configure the RTOS required across the project. + It can be configured to one of the following macros: + - #ADI_CFG_RTOS_NO_OS + - #ADI_CFG_RTOS_MICRIUM_III + - #ADI_CFG_RTOS_FREERTOS + */ +#define ADI_CFG_RTOS ADI_CFG_RTOS_NO_OS + +/**@}*/ + +/*! @name Low power mode support + All applications may have to block when a buffer is being processed. In the + case of an RTOS application, when a task is blocked waiting for a buffer, a + different task can run. If no tasks are available then the idle task runs. + In many RTOS the idle task can be configured so it perform actions like + entering low power modes. + + In the case of a bare-metal (no RTOS) application, since there are no other + tasks to be run, the driver can enter low power modes itself when it blocks. + */ + +/*! Configures the drivers to enter low power mode (Flexi mode) + when waiting for a buffer to be processed. This macro is applicable + only when the drivers are operating in the bare metal mode (No RTOS). + + The possible values it can be configured to are: + + - 1 : Low power mode support required. + - 0 : Low power mode support not required. +*/ +#define ADI_CFG_ENTER_LOW_PWR_MODE_SUPPORT (1) +/**@}*/ + + + +/* +** Verify the macro configuration +*/ +#if ((ADI_CFG_RTOS != ADI_CFG_RTOS_NO_OS) && \ + (ADI_CFG_RTOS != ADI_CFG_RTOS_MICRIUM_III) && \ + (ADI_CFG_RTOS != ADI_CFG_RTOS_FREERTOS)) +#error "ADI_CFG_RTOS macro wrongly configured" +#endif /* ADI_CFG_RTOS verification */ + +#if ((ADI_CFG_ENTER_LOW_PWR_MODE_SUPPORT != 0) && \ + (ADI_CFG_ENTER_LOW_PWR_MODE_SUPPORT != 1)) +#error "ADI_CFG_ENTER_LOW_PWR_MODE_SUPPORT macro is wrongly configured" +#endif + +#if ((ADI_CFG_ENTER_LOW_PWR_MODE_SUPPORT == 1) && \ + (ADI_CFG_RTOS != ADI_CFG_RTOS_NO_OS)) +#error "ADI_CFG_ENTER_LOW_PWR_MODE_SUPPORT cannot be set to 1 in multi-threaded applications" +#endif +/** + * @} + */ + +#endif /* ADI_GLOBAL_CONFIG_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_i2c_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_i2c_config.h new file mode 100755 index 0000000000..0f6bbca875 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_i2c_config.h @@ -0,0 +1,226 @@ +/*! + ***************************************************************************** + @file: adi_i2c_config.h + @brief: Configuration options for I2C driver. + This is specific to the I2C driver and will be included by the driver. + It is not required for the application to include this header file. + ----------------------------------------------------------------------------- + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_I2C_CONFIG_H +#define ADI_I2C_CONFIG_H +#include + +/** @addtogroup I2C_Driver_Config Static Configuration + * @ingroup I2C_Driver + * @{ + */ + +/************* I2C Driver configurations ***************/ + +/*! Master control register TX FIFO decrement control bit.\n + 1 - Decrement master TX FIFO status when a byte has been fully serialized.\n + 0 - Decrement master TX FIFO status when a byte is unloaded from the TX FIFO, + but not yet serialized on the bus. */ +#define ADI_I2C_CFG_MCTL_MXMITDEC (0) + +/*! Master control register STOP condition interrupt enable.\n + 1 - Enable completion interrupt when a STOP condition is detected.\n + 0 - Disable completion interrupt when a STOP condition is detected. */ +#define ADI_I2C_CFG_MCTL_IENCMP (1) + +/*! Master control register NACK (NotACKnowledge) interrupt enable.\n + 1 - Enable NACK interrupt when an acknowledge is not received.\n + 0 - Disable NACK interrupt when an acknowledge is not received. */ +#define ADI_I2C_CFG_MCTL_IENACK (1) + +/*! Master control register ALOST (Arbitration LOST) interrupt enable.\n + 1 - Enable ALOST interrupt when bus arbitration is lost.\n + 0 - Disable ALOST interrupt when bus arbitration is lost. */ +#define ADI_I2C_CFG_MCTL_IENALOST (1) + +/*! Master control register clock stretch enable.\n + 1 - Enable clock stretch by slave device.\n + 0 - Disable clock stretch by slave device. */ +#define ADI_I2C_CFG_MCTL_STRETCHSCL (0) + +/*! Master control register internal loopback enable.\n + 1 - Enable internal looping of SCL and SDA outputs onto their corresponding inputs.\n + 0 - Disable internal looping of SCL and SDA outputs onto their corresponding inputs. */ +#define ADI_I2C_CFG_MCTL_LOOPBACK (0) + +/*! Master control register start condition back-off disable.\n + 1 - Enables controller to compete for bus ownership even if another device is driving a START condition.\n + 0 - Disables controller to compete for bus ownership even if another device is driving a START condition. */ +#define ADI_I2C_CFG_MCTL_COMPLETE (0) + +/*! Master control register device enable.\n + 1 - Enable controller as a Master device.\n + 0 - Disables controller as a Master device. */ +#define ADI_I2C_CFG_MCTL_MASEN (0) + +/*! + * Standard Clock divider Clock-HI settings. + * Assuming a 26 MHz core clock, the following settings + * will be useful: \n + * - For STANDARD (100 kHz) rate, use: HI= 25, LO= 31. \n + * - For FAST (400 kHz) rate, use: HI=123, LO=129. \n + * \n + * @note The clock high setting varies with pull-up loading, + * board layout, slew-rate, etc., so exact settings are somewhat + * empirical. The clock high counter does not start until + * a logic high transition is sensed on the clock line, so + * variability in this logic transaction will alter the + * effective clock rate. This results from the internal + * clock-stretch hardware feature supporting a slave slow device + * that may hold off the master by holding the clock line low. + * + * @sa ADI_I2C_CFG_DIV_LOW + */ +#define ADI_I2C_CFG_DIV_HIGH (25) + +/*! Standard Clock divider Clock-LO setting + * + * @sa ADI_I2C_CFG_DIV_HIGH + */ +#define ADI_I2C_CFG_DIV_LOW (31) + +/*! Shared control reset START/STOP detect circuit.\n + 1 - Reset the SCL and SDA synchronizers, START/STOP detect logic, and LINEBUSY detect logic.\n + 0 - Do nothing. */ +#define ADI_I2C_CFG_SHCTL_RST (0) + +/*! Timing control filter disable.\n + 1 - Disable digital input clock filter.\n + 0 - Enable digital input clock filter (1 PCLK). */ +#define ADI_I2C_CFG_TCTL_FILTEROFF (0) + +/*! Timing control data input hold time requirement to recognize START/STOP condition (5-bit max).\n + Value - Minimum data input hold time count in units of PCLK period. (Value = Thd/PCLK-period) */ +#define ADI_I2C_CFG_TCTL_THDATIN (1) + +/*! Master automatic stretch mode duration (4-bit), e.g., (in binary):\n + - 0b0000 - No SCL clock stretching.\n + - 0b0001 - Timeout after hold SCL LOW 2^1 = 2 bit-times.\n + - 0b0010 - Timeout after hold SCL LOW 2^2 = 4 bit-times.\n + - ...\n + - 0b1110 - Timeout after hold SCL LOW 2^14 = 16,384 bit-times.\n + - 0b1111 - Hold SCL LOW with no timeout.\n +\n + Where "bit-time" is computed by CLKDIV values and incoming UCLK (see HRM). */ +#define ADI_I2C_CFG_ASTRETCH_MST (0) + +/*! Unformatted, 7-bit max width I2C "7-bit Addressing" slave device address value (unshifted and excluding R/W direction bit).\n + For example, the value:\n + 0x50 - Is the "raw" (unencoded) slave address for the "Aardvark Activity Board" ATMEL AT24C02 I2C slave EEPROM device.\n + It is encoded (upshifted by one and ORed with R/W direction bit) on the I2C bus as:\n + - 0xA0 for write operations, or\n + - 0xA1 for read operations */ +#define ADI_I2C_CFG_SLAVE_ADDRESS (0x50) + + +/***********************************\ +|* Check for overflowing values... *| +\***********************************/ + +#if (ADI_I2C_CFG_MCTL_MXMITDEC >> 1) +#error "Decrement TX FIFO status config value too wide" +#endif + +#if (ADI_I2C_CFG_MCTL_IENCMP >> 1) +#error "Transaction complete (STOP) interrupt enable config value too wide" +#endif + +#if (ADI_I2C_CFG_MCTL_IENACK >> 1) +#error "NACK interrupt enable config value too wide" +#endif + +#if (ADI_I2C_CFG_MCTL_IENALOST >> 1) +#error "ALOST interrupt enable config value too wide" +#endif + +#if (ADI_I2C_CFG_MCTL_STRETCHSCL >> 1) +#error "Clock stretch enable config value too wide" +#endif + +#if (ADI_I2C_CFG_MCTL_LOOPBACK >> 1) +#error "Loopback enable config value too wide" +#endif + +#if (ADI_I2C_CFG_MCTL_COMPLETE >> 1) +#error "Start back-off disable config value too wide" +#endif + +#if (ADI_I2C_CFG_MCTL_MASEN >> 1) +#error "Master device enable config value too wide" +#endif + +#if (ADI_I2C_CFG_DIV_HIGH >> 8) +#error "Clock HIGH time config value too wide" +#endif + +#if (ADI_I2C_CFG_DIV_LOW >> 8) +#error "Clock LOW time config value too wide" +#endif + +#if (ADI_I2C_CFG_SHCTL_RST >> 1) +#error "Shared control reset config value too wide" +#endif + +#if (ADI_I2C_CFG_TCTL_FILTEROFF >> 1) +#error "Timing control filter-off config value too wide" +#endif + +#if (ADI_I2C_CFG_TCTL_THDATIN >> 5) +#error "Timing control filter-off config value too wide" +#endif + +#if (ADI_I2C_CFG_ASTRETCH_MST >> 4) +#error "Master clock stretch config value too wide" +#endif + +#if (ADI_I2C_CFG_SLAVE_ADDRESS >> 7) +#error "Slave address config value too wide" +#endif + +/*! @} */ + +#endif /* ADI_I2C_CONFIG_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_pwr_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_pwr_config.h new file mode 100755 index 0000000000..11207b9947 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_pwr_config.h @@ -0,0 +1,638 @@ +/* + ***************************************************************************** + @file: adi_pwr_config.h + @brief: Configuration options for PWR driver. + This is specific to the PWR driver and will be included by the source file. + It is not required for the application to include this header file. + ----------------------------------------------------------------------------- + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_PWR_CONFIG_H +#define ADI_PWR_CONFIG_H +#include +#ifdef __ICCARM__ +/* IAR MISRA C 2004 error suppressions. +* +* Pm009 (rule 5.1): identifiers shall not rely on significance of more than 31 characters. +* The YODA-generated headers rely on more. The IAR compiler supports that. +*/ +#pragma diag_suppress=Pm009 +#endif /* __ICCARM__ */ + +/** @addtogroup PWR_Driver_Config Static Configuration + * @ingroup Power_Driver + * @{ + */ + +/*! Enable the code to support input clock through the GPIO pin + 0 - No support for input clock through the GPIO pin. + 1 - Support for input clock through the GPIO pin. + +*/ +#define ADI_PWR_CFG_ENABLE_CLOCK_SOURCE_GPIO 0 + +/*------------------------------------------------------------------------------- + Set of MACROs for configuring the clock +--------------------------------------------------------------------------------*/ +/* Oscillator Control Register */ + +/*! + 32 KHz clock select mux. This clock connects to beeper, RTC.\n + 0 - Internal 32 KHz oscillator is selected.\n + 1 - External 32 KHz crystal is selected.. +*/ +#define ADI_PWR_LF_CLOCK_MUX 0 + + +/*! + High frequency internal oscillator enable\n + 0 - The HFOSC oscillator is disabled and placed in a low power state\n + 1 - The HFOSC oscillator is enabled. +*/ +#define ADI_PWR_HFOSC_CLOCK_ENABLE 1 + +/*! + Low frequency external oscillator enable and placed in a low power state\n + 0 - The LFXTAL oscillator is disabled\n + 1 - The LFXTAL oscillator is enabled. +*/ +#define ADI_PWR_LFXTAL_CLOCK_ENABLE 0 + +/*! + High frequency external oscillator enable\n + 0 - The HFXTAL oscillator is disabled and placed in a low power state\n + 1 - The HFXTAL oscillator is enabled. +*/ +#define ADI_PWR_HFXTAL_CLOCK_ENABLE 0 + +/*! + Low frequency external clock fail interrupt enable \n + 0 - The LFXTAL clock monitor and clock fail interrupt disabled \n + 1 - The LFXTAL clock monitor and clock fail interrupt enabled. +*/ +#define ADI_PWR_LFXTAL_CLOCK_MON_ENABLE 0 + +/*! + Automatic switching of the LF Mux to LF Oscillator on LFXTAL failure. \n + 0 - Disables Automatic switching of LF Mux to LF Oscillator on LFXTAL failure \n + 1 - Disables Automatic switching of LF Mux to LF Oscillator on LFXTAL failure. +*/ +#define ADI_PWR_LFXTAL_FAIL_AUTO_SWITCH_ENABLE 0 + +/*! + Low frequency crystal Robust mode enable. The Robust mode enables the LFXTAL oscillator to work also when an + additional resistive load is placed between the crystal pins and GND. \n + 0 - Selects Normal mode \n + 1 - Selects Robust mode +*/ +#define ADI_PWR_LFXTAL_ROBUST_MODE_ENABLE 0 + +/*! + Low frequency crystal Robust mode load select. The amount of loading tolerated when robust mode is enabled. \n + 0 - No Trim, and big resistive loads not tolerated. \n + 1 - 20 Mohm load mode, greater than 20 Mohm load allowed. \n + 2 - 10 Mohm load mode, greater than 10 Mohm load allowed. \n + 3 - 5 Mohm load mode, 5 Mohm load allowed on both IO pins. +*/ +#define ADI_PWR_LFXTAL_ROBUST_LOAD_SELECT 0 + + +/*! + Root clock monitor and Clock Fail interrupt enable. + 0 - Disable Root Clock Monitor and Clock Fail interrupt. + 1 - Enable Root Clock Monitor and Clock Fail interrupt. +*/ +#define ADI_PWR_ROOT_CLOCK_MON_INT_ENABLE 0 + + +/*! + Enable Auto switch to High Frequency Oscillator (HFOSC) when Root Clock Fails. + 0 - Disable Automatic switching of the Root Clock. + 1 - Enable Automatic switching of the Root Clock. +*/ +#define ADI_PWR_ROOT_CLOCK_FAIL_AUTOSWITCH_ENABLE 0 + + +/********** Miscellaneous clock setting register CTL0 *************/ + +/*! + Selecting the input clock for Root Clock mux. Determines which single shared clock source + is used by the PCLK, and HCLK dividers. \n + 0 - HFOSC High frequency internal oscillator \n + 1 - HFXTAL High frequency external oscillator\n + 2 - SPLL Output of System PLL is selected\n + 3 - External GPIO port is selected +*/ +#define ADI_PWR_INPUT_TO_ROOT_CLOCK_MUX 0 + +/*! + GPIO clock out select. Selects the clock to be routed to the GPIO clock out pin. \n + 0 - Root Clock (ROOT_CLK)\n + 1 - Low Frequency Clock (LF_CLK) \n + 2 - ADC Clock (ACLK) \n + 3 - HCLK_BUS \n + 4 - HCLK_CORE \n + 5 - Peripheral Clock (PCLK) + 6 - Reference Clock for Flash controller timer (RCLK)\n + 7 - Mux of HFOSC, HFXTAL clock (RHP_CLK)\n + 8 - GP Timer 0 clock (GPT0_CLK)\n + 9 - GP Timer 1 clock (GPT1_CLK)\n + 10 - Peripherals operating at HCLK (HCLK_P)\n + 11 - PLL Clock out (PCLK)\n + 12 - RTC0 Clock \n + 13 - HP Buck Clock (HPBUCK_CLK)\n + 14 - HP Buck Non overlap clock\n + 15 - RTC1 generated clock +*/ +#define ADI_PWR_GPIO_CLOCK_OUT_SELECT 0 + +/*! + Flash reference clock and HPBUCK clock source mux. \n + 0 - sourcing from HFOSC (High frequency internal oscillator) \n + 2 - sourcing from external HFXTAL( High frequency external oscillator 26M Hz )\n + 3 - sourcing from external HFXTAL( High frequency external oscillator 16M Hz ) + +*/ +#define ADI_PWR_INPUT_TO_RCLK_MUX 0 + +/*! + Selecting the input clock for the system PLL clock. \n + 0 - sourcing from HFOSC (High frequency internal oscillator) \n + 1 - sourcing from HFXTAL(High frequency external oscillator) \n + 2 - GPIO Input clock. \n + 3 - GPIO Input clock. +*/ +#define ADI_PWR_INPUT_TO_SPLL_MUX 0 + +/*! + External Low frequency crystal interrupt enable.\n + 0 - Disable the interrupt for LF clock \n + 1 - Enable the interrupt for LF clock +*/ +#define ADI_PWR_LFXTAL_CLOCK_INTERRUPT_ENABLE 0 + +/*! + External Hight frequency crystal interrupt enable.\n + 0 - Disable the interrupt for HFXTAL clock \n + 1 - Enable the interrupt for HFXTAL clock +*/ +#define ADI_PWR_HFXTAL_CLOCK_INTERRUPT_ENABLE 0 + + + +/********** Clock divider register CTL1 ***************/ + +/*! + HCLK divide count.Determines the HCLK rate based on the following equation: HCLK = ROOT_CLK/HCLKDIVCNT. + 0 - 63 is valid range. +*/ +#define ADI_PWR_HCLK_DIVIDE_COUNT 4 + +/*! + PCLK divide count.Determines the PCLK rate based on the following equation: PCLK = ROOT_CLK/PCLKDIVCNT. + 0 - 63 is valid range. +*/ +#define ADI_PWR_PCLK_DIVIDE_COUNT 4 + +/*! + ACLK divide count.Determines the ACLK rate based on the following equation: ACLK = ROOT_CLK/ACLKDIVCNT. + 0 - 63 is valid range. +*/ +#define ADI_PWR_ACLK_DIVIDE_COUNT 16 + + +/************* HF Oscillator divide clock select register CTL2 ***********/ + +/*! + HF Oscillator auto divide by one clock selection during wakeup from Flexi power mode. + + When enabled enabled (Set to 1), the frequency undivided 26MHz HF oscillator clock itself will be used during the wake up. + The undivided HFOSC clock is selected automatically by clearing the HFOSCDIVCLKSEL register content to 0, which selects the HFOSC/1 clock.This updated divided by 1 clock selection will remain same until the new divider value is written to this register. + + When disabled (Set to 0), this fast wake up feature will be disabled and the HFOSCDIVCLKSEL register will remain unchanged + during the wakeup. + + 0 - Auto select HFOSC/1 clock during wakeup from Flexi mode is disable. + 1 - Auto select HFOSC/1 clock during wakeup from Flexi mode is enabled. +*/ +#define ADI_PWR_HFOSC_AUTO_DIV_BY_1 0 + +/*! + HF Oscillator divide select. + 0 - HFOSC/1. \n + 1 - HFOSC/2. \n + 2 - HFOSC/4. \n + 3 - HFOSC/8. \n + 4 - HFOSC/16. \n + 5 - HFOSC/32. +*/ +#define ADI_PWR_HFOSC_DIVIDE_SELECT 0 + + + +/****** System PLL Register CTL3 *****/ +/*! + System PLL N multiplier(SPLL_NSEL). Sets the N value used to obtain the multiplication + factor N/M of the PLL. + 8 - 31 is valid range. +*/ +#define ADI_PWR_SPLL_MUL_FACTOR 26 + +/*! + System PLL division by 2. Controls if an optional divide by two is placed on the PLL output.\n + 0 - The System PLL is not divided. Its output frequency equals that selected by the N/M ratio \n + 1 - The System PLL is divided by two. Its output frequency equals that selected by the N/M ratio + with an additional divide by 2 +*/ +#define ADI_PWR_SPLL_ENABLE_DIV2 0 + +/*! + System PLL enable. Controls if the PLL should be enabled or placed in its low power state. \n + 0 - The system PLL is disabled and is in its power down state\n + 1 - The system PLL is enabled. +*/ +#define ADI_PWR_SPLL_ENABLE 0 + +/*! + System PLL interrupt enable.Controls if the core should be interrupted on a PLL lock/PLL unlock or no interrupt generated.\n + 0 - Disable the SPLL interrupt generation\n + 1 - Enable the SPLL interrupt generation +*/ +#define ADI_PWR_SPLL_INTERRUPT_ENABLE 0 + +/*! + System PLL M Divider(SPLL_MSEL). Sets the M value used to obtain the multiplication + factor N/M of the PLL. + 2 - 15 is valid range. +*/ +#define ADI_PWR_SPLL_DIV_FACTOR 13 + +/*! + system PLL multiply by 2. This bit is used to configure if the VCO clock frequency should be multiplied by 2 or 1.\n + 0 - The System PLL is multiplied by 1.\n + 1 - The System PLL is multiplied by 2. +*/ +#define ADI_PWR_SPLL_ENABLE_MUL2 0 + + +/********** User Clock Gating Control CTL5 ********************/ + +/*! + This can be used to enable/disable clock to GPT0. \n + 0 - Disable the clock to GPT0\n + 1 - Enable the clock to GPT0 +*/ +#define ADI_PWR_GPT0_CLOCK_ENABLE 1 + +/*! + This can be used to enable/disable clock to GPT1. \n + 0 - Disable the clock to GPT1\n + 1 - Enable the clock to GPT1 +*/ +#define ADI_PWR_GPT1_CLOCK_ENABLE 1 +/*! + This can be used to enable/disable clock to GPT2. \n + 0 - Disable the clock to GPT2\n + 1 - Enable the clock to GPT2 +*/ +#define ADI_PWR_GPT2_CLOCK_ENABLE 1 + +/*! + This can be used to enable/disable clock to I2C. \n + 0 - Disable the clock to I2C\n + 1 - Enable the clock to I2C +*/ +#define ADI_PWR_I2C_CLOCK_ENABLE 1 + +/*! + This can be used to enable/disable clock to GPIO. \n + 0 - Disable the clock to GPIO\n + 1 - Enable the clock to GPIO +*/ +#define ADI_PWR_GPIO_CLOCK_ENABLE 1 + + +/*! + This can be used to enable/disable all clocks connected to peripherals. \n + 0 - Disable the Clock supply to peripherals\n + 1 - Enable the Clock supply to peripherals +*/ +#define ADI_PWR_PCLK_ENABLE 0 + + +/*! + This can be used to enable/disable clocks to Timer RGB. \n + 0 - Disable the Clock supply to Timer RGB \n + 1 - Enable the Clock supply to Timer RGB +*/ +#define ADI_PWR_TIMER_RGB_ENABLE 1 + +/*------------------------------------------------------------------------------- + Set of macros for configuring the power management module +--------------------------------------------------------------------------------*/ + +/********* Interrupt enable register IEN ********/ + +/*! + Enabling the interrupt if the Battery voltage falls below 1.8V.\n + 0 - Disable Battery voltage interrupt \n + 1 - Enable Battery voltage interrupt. +*/ +#define ADI_PWR_ENABLE_VBAT_INTERRUPT 0 + +/*! + Enabling the interrupt for under VREG voltage (i.e less than 1V).\n + 0 - Disable VREG under voltage interrupt \n + 1 - Enable VREG under voltage interrupt. +*/ +#define ADI_PWR_ENABLE_VREG_UNDER_VOLTAGE_INTERRUPT 0 + +/*! + Enabling the interrupt for over VREG voltage (i.e above than 1.32V).\n + 0 - Disable VREG over voltage interrupt \n + 1 - Enable VREG over voltage interrupt. +*/ +#define ADI_PWR_ENABLE_VREG_OVER_VOLTAGE_INTERRUPT 0 + +/*! + Enabling the interrupt for Battery range.\n + 0 - Disable battery voltage range interrupt \n + 1 - Enable battery voltage range interrupt +*/ +#define ADI_PWR_ENABLE_BATTERY_VOLTAGE_RANGE_INTERRUPT 0 + +/*! + Battery voltage range for generating the interrupt.\n + 0 - Configure to generate interrupt if VBAT > 2.75V \n + 1 - Configure to generate interrupt if VBAT is between 2.75 and 1.6V \n + 2 - Configure to generate interrupt if VBAT is between 2.3V and 1.6V +*/ +#define ADI_PWR_BATTERY_VOLTAGE_RANGE_FOR_INTERRUPT 0 + +/********* HP Buck control register CTL1 ********/ +/*! + Enable or disable HP Buck.\n + 0 - Disable HP Buck. + 1 - Enable HP Buck. +*/ +#define ADI_PWR_HP_BUCK_ENABLE 0 + +/*! + HP Buck Load mode.\n + 0 - HP Buck low load mode. Can be set when the system is running at + less than 26 Mhz. \n + 1 - HP Buck High load mode. Can be set when the system is running at + more than 26 Mh. +*/ +#define ADI_PWR_HP_BUCK_LOAD_MODE 0 + +/*! + HP Buck low power mode.\n + The HPBUCK Low Power mode can be selected, when the Chip is in Flexi Power mode + and low power modules such as Timer, Beeper only are enabled + + 0 - HPBUCK Low power mode is disabled. \n + 1 - HPBUCK Low power mode is enabled. +*/ +#define ADI_PWR_HP_BUCK_LOW_POWER_MODE 0 + + +/********* Power mode register ********/ + +/*! + Enable or disable monitoring battery voltage (VBAT) during HIBERNATE Mode. \n + 0 - Battery voltage monitoring is enabled. + 1 - Battery voltage monitoring is disabled. + + By default battery voltage monitoring during hibernate is enabled. +*/ +#define ADI_PWR_ENABLE_BATTERY_VOLTAGE_MONITORING 0 + + +/******************************************************************************* + M A C R O V A L I D A T I O N +*******************************************************************************/ + +#if ( ADI_PWR_CFG_ENABLE_CLOCK_SOURCE_GPIO > 1 ) +#error "Invalid configuration set for ADI_PWR_CFG_ENABLE_CLOCK_SOURCE_GPIO" +#endif + +#if ( ADI_PWR_LF_CLOCK_MUX > 1 ) +#error "Invalid configuration set for ADI_PWR_LF_CLOCK_MUX" +#endif + +#if ( ADI_PWR_HFOSC_CLOCK_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_HFOSC_CLOCK_ENABLE" +#endif + +#if ( ADI_PWR_LFXTAL_CLOCK_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_LFXTAL_CLOCK_ENABLE" +#endif + +#if ( ADI_PWR_HFXTAL_CLOCK_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_HFXTAL_CLOCK_ENABLE" +#endif + +#if ( ADI_PWR_LFXTAL_CLOCK_MON_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_LFXTAL_CLOCK_MON_ENABLE" +#endif + +#if ( ADI_PWR_LFXTAL_FAIL_AUTO_SWITCH_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_LFXTAL_FAIL_AUTO_SWITCH_ENABLE" +#endif + +#if ( ADI_PWR_LFXTAL_ROBUST_MODE_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_LFXTAL_ROBUST_MODE_ENABLE" +#endif + +#if ( ADI_PWR_LFXTAL_ROBUST_LOAD_SELECT > 3 ) +#error "Invalid configuration set for ADI_PWR_LFXTAL_ROBUST_LOAD_SELECT" +#endif + +#if ( ADI_PWR_ROOT_CLOCK_MON_INT_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_ROOT_CLOCK_MON_INT_ENABLE" +#endif + +#if ( ADI_PWR_ROOT_CLOCK_FAIL_AUTOSWITCH_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_ROOT_CLOCK_FAIL_AUTOSWITCH_ENABLE" +#endif + +#if ( ADI_PWR_INPUT_TO_ROOT_CLOCK_MUX > 3 ) +#error "Invalid configuration set for ADI_PWR_INPUT_TO_ROOT_CLOCK_MUX" +#endif + +#if ( ADI_PWR_GPIO_CLOCK_OUT_SELECT > 15 ) +#error "Invalid configuration set for ADI_PWR_GPIO_CLOCK_OUT_SELECT" +#endif + +#if ( ADI_PWR_INPUT_TO_RCLK_MUX > 3 ) +#error "Invalid configuration set for ADI_PWR_INPUT_TO_RCLK_MUX" +#endif + +#if ( ADI_PWR_INPUT_TO_SPLL_MUX > 3 ) +#error "Invalid configuration set for ADI_PWR_INPUT_TO_SPLL_MUX" +#endif + +#if ( ADI_PWR_LFXTAL_CLOCK_INTERRUPT_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_LFXTAL_CLOCK_INTERRUPT_ENABLE" +#endif + +#if ( ADI_PWR_HFXTAL_CLOCK_INTERRUPT_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_HFXTAL_CLOCK_INTERRUPT_ENABLE" +#endif + +#if ( ADI_PWR_HCLK_DIVIDE_COUNT > 63 ) +#error "Invalid configuration set for ADI_PWR_HCLK_DIVIDE_COUNT" +#endif + +#if ( ADI_PWR_PCLK_DIVIDE_COUNT > 63 ) +#error "Invalid configuration set for ADI_PWR_PCLK_DIVIDE_COUNT" +#endif + +#if ( ADI_PWR_ACLK_DIVIDE_COUNT > 63 ) +#error "Invalid configuration set for ADI_PWR_ACLK_DIVIDE_COUNT" +#endif + +#if ( ADI_PWR_HFOSC_AUTO_DIV_BY_1 > 1 ) +#error "Invalid configuration set for ADI_PWR_HFOSC_AUTO_DIV_BY_1" +#endif + +#if ( ADI_PWR_HFOSC_DIVIDE_SELECT > 5 ) +#error "Invalid configuration set for ADI_PWR_HFOSC_DIVIDE_SELECT" +#endif + +#if ( ADI_PWR_SPLL_MUL_FACTOR < 8 || ADI_PWR_SPLL_MUL_FACTOR > 31 ) +#error "Invalid configuration set for ADI_PWR_SPLL_MUL_FACTOR" +#endif + +#if ( ADI_PWR_SPLL_ENABLE_DIV2 > 1 ) +#error "Invalid configuration set for ADI_PWR_SPLL_ENABLE_DIV2" +#endif + +#if ( ADI_PWR_SPLL_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_SPLL_ENABLE" +#endif + +#if ( ADI_PWR_SPLL_INTERRUPT_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_SPLL_INTERRUPT_ENABLE" +#endif + +#if ( ADI_PWR_SPLL_DIV_FACTOR < 2 || ADI_PWR_SPLL_DIV_FACTOR > 15 ) +#error "Invalid configuration set for ADI_PWR_SPLL_DIV_FACTOR" +#endif + +#if ( ADI_PWR_SPLL_ENABLE_MUL2 > 1 ) +#error "Invalid configuration set for ADI_PWR_SPLL_ENABLE_MUL2" +#endif + +#if ( ADI_PWR_GPT0_CLOCK_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_GPT0_CLOCK_ENABLE" +#endif + +#if ( ADI_PWR_GPT1_CLOCK_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_GPT1_CLOCK_ENABLE" +#endif + +#if ( ADI_PWR_GPT2_CLOCK_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_GPT2_CLOCK_ENABLE" +#endif + +#if ( ADI_PWR_I2C_CLOCK_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_I2C_CLOCK_ENABLE" +#endif + +#if ( ADI_PWR_GPIO_CLOCK_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_GPIO_CLOCK_ENABLE" +#endif + +#if ( ADI_PWR_PCLK_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_PCLK_ENABLE" +#endif + +#if ( ADI_PWR_TIMER_RGB_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_TIMER_RGB_ENABLE" +#endif + +#if ( ADI_PWR_ENABLE_VBAT_INTERRUPT > 1 ) +#error "Invalid configuration set for ADI_PWR_ENABLE_VBAT_INTERRUPT" +#endif + +#if ( ADI_PWR_ENABLE_VREG_UNDER_VOLTAGE_INTERRUPT > 1 ) +#error "Invalid configuration set for ADI_PWR_ENABLE_VREG_UNDER_VOLTAGE_INTERRUPT" +#endif + +#if ( ADI_PWR_ENABLE_VREG_OVER_VOLTAGE_INTERRUPT > 1 ) +#error "Invalid configuration set for ADI_PWR_ENABLE_VREG_OVER_VOLTAGE_INTERRUPT" +#endif + +#if ( ADI_PWR_ENABLE_BATTERY_VOLTAGE_RANGE_INTERRUPT > 1 ) +#error "Invalid configuration set for ADI_PWR_ENABLE_BATTERY_VOLTAGE_RANGE_INTERRUPT" +#endif + +#if ( ADI_PWR_BATTERY_VOLTAGE_RANGE_FOR_INTERRUPT > 2 ) +#error "Invalid configuration set for ADI_PWR_BATTERY_VOLTAGE_RANGE_FOR_INTERRUPT" +#endif + +#if ( ADI_PWR_HP_BUCK_ENABLE > 1 ) +#error "Invalid configuration set for ADI_PWR_HP_BUCK_ENABLE" +#endif + +#if ( ADI_PWR_HP_BUCK_LOAD_MODE > 1 ) +#error "Invalid configuration set for ADI_PWR_HP_BUCK_LOAD_MODE" +#endif + +#if ( ADI_PWR_HP_BUCK_LOW_POWER_MODE > 1 ) +#error "Invalid configuration set for ADI_PWR_HP_BUCK_LOW_POWER_MODE" +#endif + +#if ( ADI_PWR_ENABLE_BATTERY_VOLTAGE_MONITORING > 1 ) +#error "Invalid configuration set for ADI_PWR_ENABLE_BATTERY_VOLTAGE_MONITORING" +#endif + + + +/*! @} */ + +#ifdef __ICCARM__ +#pragma diag_default=Pm009 +#endif /* __ICCARM__ */ + +#endif /* ADI_PWR_CONFIG_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_rng_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_rng_config.h new file mode 100755 index 0000000000..76afe147cf --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_rng_config.h @@ -0,0 +1,106 @@ +/*! + ***************************************************************************** + @file: adi_rng_config.h + @brief: Configuration options for RNG driver. + This is specific to the RNG driver and will be included by the driver. + It is not required for the application to include this header file. + ----------------------------------------------------------------------------- + +Copyright (c) 2012-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_RNG_CONFIG_H__ +#define ADI_RNG_CONFIG_H__ +#include +/** @defgroup RNG_Driver_Cfg RNG Driver Configuration + * @ingroup RNG_Driver + + */ + +/*! \addtogroup RNG_Driver_Cfg RNG Driver Configuration + * @{ + */ + +/************* RNG Driver configurations ***************/ + +/************* RNG controller configurations ***************/ + +/*! RNG Control Register, bit 3\n + Enable only 8-bit generation\n + 0 - Generate 32-bit random number\n + 1 - Generate only 8-bit random number +*/ +#define RNG0_CFG_ONLY_8_BIT 1 + +/*! RNG Sample Length Register, bits [11:0]\n + The register defines the number of samples to accumulate in the + CRC register when generating a random number.\n + + Bits [11:0] contains the reload value of the sample counter + + */ +#define RNG0_CFG_LENGTH_RELOAD 256u + +/*! RNG Sample Length Register, bits [15:12]\n + The register defines the number of samples to accumulate in the + CRC register when generating a random number. The number of values + accumulated in the counter reload value is scaled by 2^prescaler.\n + + Bits [15:12] contains the prescaler for the sample counter + + */ +#define RNG0_CFG_LENGTH_PRESCALER 0u + +/************** Macro validation *****************************/ + +#if ( RNG0_CFG_ONLY_8_BIT > 1 ) +#error "Invalid configuration" +#endif + +#if ( RNG0_CFG_LENGTH_RELOAD > 4095u ) +#error "Invalid value for reload" +#endif + +#if ( RNG0_CFG_LENGTH_PRESCALER > 10u ) +#error "Invalid value for prescaler" +#endif + +/*! @} */ + +#endif /* __ADI_RNG_CONFIG_H__ */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_rtc_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_rtc_config.h new file mode 100755 index 0000000000..ef97a3b0a4 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_rtc_config.h @@ -0,0 +1,397 @@ +/*! + ***************************************************************************** + @file: adi_rtc_config.h + @brief: Configuration options for Real Time Clock device driver. + This is specific to the RTC driver and will be included by the driver. + It is not required for the application to include this header file. + @version: $Revision: 33005 $ + @date: $Date: 2015-12-12 10:43:13 -0500 (Sat, 12 Dec 2015) $ + ----------------------------------------------------------------------------- + +Copyright (c) 2012-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_RTC_CONFIG_H__ +#define ADI_RTC_CONFIG_H__ +#include + +/** @addtogroup RTC_Driver_Config Static Configuration + * @ingroup RTC_Driver + * @{ + */ + +/*! + * The safe write mode insures any pending writes that have not yet synchronized between the faster core clock + * domain and the internal RTC 32kHz clock domain are reconciled before multiple writes to the same RTC register + * are allowed +*/ + +#define ADI_RTC_CFG_ENABLE_SAFE_WRITE 1 + + +/** @addtogroup RTC_Driver_Config_RTC0 RTC0 Static Configuration + * @ingroup RTC_Driver_Config + * @{ + */ + +/* +=================================================================== + ------------------------RTC-0 CONFIGURATION MACRO----------------- +=================================================================== +*/ +/*! Enable the Alarm */ +#define RTC0_CFG_ENABLE_ALARM 0 + +/*! Enable the Alarm interrupt*/ +#define RTC0_CFG_ENABLE_ALARM_INTERRUPT 0 + +/*! Enable the Trim */ +#define RTC0_CFG_ENABLE_TRIM 0 + +/*! Enable the PENDERROR interrupt*/ +#define RTC0_CFG_ENABLE_PENDERROR_INTERRUPT 0 + +/*! Enable the write sync interrupt*/ +#define RTC0_CFG_ENABLE_WSYNC_INTERRUPT 0 + +/*! Enable the pend write interrupt*/ +#define RTC0_CFG_ENABLE_WRITEPEND_INTERRUPT 0 + +/*! Initial the count Value*/ +#define RTC0_CFG_COUNT_VALUE 0 + +/*! Initial the count Value-0*/ +#define RTC0_CFG_COUNT_VALUE_0 0 + +/*! Initial the count Value-1*/ +#define RTC0_CFG_COUNT_VALUE_1 0 + +/*! Alarm-0 Value*/ +#define RTC0_CFG_ALARM_VALUE_0 0 + +/*! Alarm-1 Value*/ +#define RTC0_CFG_ALARM_VALUE_1 0 + +/*! Trim interval*/ +#define RTC0_CFG_TRIM_INTERVAL 0 + +/*! Trim interval with power of 2*/ +#define RTC0_CFG_POW2_TRIM_INTERVAL 0 + +/*! Trim operation to be performed for RTC0*/ +#define RTC0_CFG_TRIM_OPERATION 0 + +/*! Trim Value for RTC-0*/ +#define RTC0_CFG_TRIM_VALUE 0 + +/*! GPIO Sample around Rising Edge of Sensor Strobe Channel 3. + * Enables sampling of Sensor Strobe GPIO inputs around rising edge of Sensor Strobe Channel 3 pulse. + * + * 0 No sampling of input around rising edge. + * 1 Input sampled one clock cycle before rising edge of Sensor Strobe. + * 10 Input sampled at rising edge of Sensor Strobe. + * 11 Input sampled one clock cycle after rising edge of Sensor Strobe. + */ +#define RTC0_SS3_SMPONRE 0 + +/*! GPIO Sample around Falling Edge of Sensor Strobe Channel 3. + * Enables sampling of Sensor Strobe GPIO inputs around falling edge of Sensor Strobe Channel 3 pulse. + * + * 0 No sampling of input around rising edge. + * 1 Input sampled one clock cycle before rising edge of Sensor Strobe. + * 10 Input sampled at rising edge of Sensor Strobe. + * 11 Input sampled one clock cycle after rising edge of Sensor Strobe. + */ +#define RTC0_SS3_SMPONFE 0 +/*! GPIO Sample around Falling Edge of Sensor Strobe Channel 2. */ +#define RTC0_SS2_SMPONFE 0 +/*! GPIO Sample around Rising Edge of Sensor Strobe Channel 1. */ +#define RTC0_SS1_SMPONRE 0 +/*! GPIO Sample around Falling Edge of Sensor Strobe Channel 1. */ +#define RTC0_SS1_SMPONFE 0 + + +/*! Sensor Strobe's GP Input Sampling Mux + * SS 2 GPIO Pin 1 + * + * GPMUX0/1.SSxGPINySEL 3’b000 3’b001 3’b010 3’b011 3’b100 3’b101 3’b110 3’b111 + * RTCSSxGPIny p0[12] p2[0] p0[9] p0[8] p1[13] p1[2] p2[7] p2[9] + */ +#define RTC0_SS2_GPIN1SEL 0x4 +/*! Sensor Strobe's GP Input Sampling Mux SS 2 GPIO Pin 0*/ +#define RTC0_SS2_GPIN0SEL 0x3 +/*! Sensor Strobe's GP Input Sampling Mux SS 1 GPIO Pin 2*/ +#define RTC0_SS1_GPIN2SEL 0x2 +/*! Sensor Strobe's GP Input Sampling Mux SS 1 GPIO Pin 1*/ +#define RTC0_SS1_GPIN1SEL 0x1 +/*! Sensor Strobe's GP Input Sampling Mux SS 1 GPIO Pin 0*/ +#define RTC0_SS1_GPIN0SEL 0x0 +/*! Sensor Strobe's GP Input Sampling Mux SS 3 GPIO Pin 2*/ +#define RTC0_SS3_GPIN2SEL 0x0 +/*! Sensor Strobe's GP Input Sampling Mux SS 3 GPIO Pin 1*/ +#define RTC0_SS3_GPIN1SEL 0x7 +/*! Sensor Strobe's GP Input Sampling Mux SS 3 GPIO Pin 0*/ +#define RTC0_SS3_GPIN0SEL 0x6 +/*! Sensor Strobe's GP Input Sampling Mux SS 2 GPIO Pin 2*/ +#define RTC0_SS2_GPIN2SEL 0x5 + +/*! Differential output option for Sensor Strobe channel 3. + * Sensor Strobe channel3 is used as differential signal, actual RTC_SS3 out + * for this channel is available in corresponding GPIO. + * RTC_SS4 of Sensor Strobe channel 4 is used to provided inverted signal of RTC_SS3. + */ +#define RTC0_SS3_DIFFOUT 0 +/*! Differential output option for Sensor Strobe channel 1. + * Sensor Strobe channel 1 is used as differential signal, actual RTC_SS1 out + * for this channel is available in corresponding GPIO. + * RTC_SS1 of Sensor Strobe channel 2 is used to provided inverted signal of RTC_SS1. + */ +#define RTC0_SS1_DIFFOUT 0 + + + +/*! @} */ + +/* +=================================================================== + ------------------------RTC-1 CONFIGURATION MACRO----------------- +=================================================================== +*/ + +/** @addtogroup RTC_Driver_Config_RTC1 RTC1 Static Configuration + * @ingroup RTC_Driver_Config + * @{ + */ + + + +/*! Enable the Alarm */ +#define RTC1_CFG_ENABLE_ALARM 0 + +/*! Enable the Alarm interrupt*/ +#define RTC1_CFG_ENABLE_ALARM_INTERRUPT 0 + +/*! Enable the Trim */ +#define RTC1_CFG_ENABLE_TRIM 0 + +/*! Enable the mod-60 Alarm */ +#define RTC1_CFG_ENABLE_MOD60_ALARM 0 + +/*! Enable the mod-60 Alarm period*/ +#define RTC1_CFG_ENABLE_MOD60_ALARM_PERIOD 0 + +/*! Enable the Alarm interrupt*/ +#define RTC1_CFG_ENABLE_MOD60_ALARM_INTERRUPT 0 + +/*! Enable the ISOINT interrupt*/ +#define RTC1_CFG_ENABLE_ISO_INTERRUPT 0 + +/*! Enable the PENDERROR interrupt*/ +#define RTC1_CFG_ENABLE_PENDERROR_INTERRUPT 0 + +/*! Enable the write sync interrupt*/ +#define RTC1_CFG_ENABLE_WSYNC_INTERRUPT 0 + +/*! Enable the pend write interrupt*/ +#define RTC1_CFG_ENABLE_WRITEPEND_INTERRUPT 0 + +/*! Enable the RTC count interrupt*/ +#define RTC1_CFG_ENABLE_COUNT_INTERRUPT 0 + +/*! Enable the prescaled modulo-1 interrupt*/ +#define RTC1_CFG_ENABLE_MOD1_COUNT_INTERRUPT 0 + +/*! Enable the Trim interrupt*/ +#define RTC1_CFG_ENABLE_TRIM_INTERRUPT 0 + +/*! Enable the Mod60 roll over interrupt*/ +#define RTC1_CFG_CNT_MOD60_ROLLLOVER_INTERRUPT 0 + +/*! Prescale value for the RTC1*/ +#define RTC1_CFG_PRESCALE 0 + +/*! Enable the counter roll over interrupt*/ +#define RTC1_CFG_CNT_ROLLLOVER_INTERRUPT 0 + +/*! Initial the count Value-0*/ +#define RTC1_CFG_COUNT_VALUE_0 0 + +/*! Initial the count Value-1*/ +#define RTC1_CFG_COUNT_VALUE_1 0 + +/*! Alarm Value-0*/ +#define RTC1_CFG_ALARM_VALUE_0 0 + +/*! Alarm Value-1*/ +#define RTC1_CFG_ALARM_VALUE_1 0 + +/*! Alarm Value-2*/ +#define RTC1_CFG_ALARM_VALUE_2 0 + +/*! Trim interval*/ +#define RTC1_CFG_TRIM_INTERVAL 0 + +/*! Trim interval with power of 2*/ +#define RTC1_CFG_POW2_TRIM_INTERVAL 0 + +/*! Trim operation to be performed for RTC1*/ +#define RTC1_CFG_TRIM_OPERATION 0 + +/*! Trim Value for RTC-1*/ +#define RTC1_CFG_TRIM_VALUE 0 + +/*! Enable the input capture channel-0*/ +#define RTC1_CFG_IC0_ENABLE 0 + +/*! Enable the input capture channel-2*/ +#define RTC1_CFG_IC2_ENABLE 0 + +/*! Enable the input capture channel-3*/ +#define RTC1_CFG_IC3_ENABLE 0 + +/*! Enable the input capture channel-4*/ +#define RTC1_CFG_IC4_ENABLE 0 + +/*! Enable the Sensor Strobe channel-1*/ +#define RTC1_CFG_SS1_ENABLE 0 +/*! Enable the Sensor Strobe channel-2*/ +#define RTC1_CFG_SS2_ENABLE 0 +/*! Enable the Sensor Strobe channel-3*/ +#define RTC1_CFG_SS3_ENABLE 0 +/*! Enable the Sensor Strobe channel-4*/ +#define RTC1_CFG_SS4_ENABLE 0 + +/*! Enable the interrupt for input capture channel-0*/ +#define RTC1_CFG_IC0_INT_ENABLE 0 + +/*! Enable the interrupt for input capture channel-2*/ +#define RTC1_CFG_IC2_INT_ENABLE 0 + +/*! Enable the interrupt for input capture channel-3*/ +#define RTC1_CFG_IC3_INT_ENABLE 0 + +/*! Enable the interrupt for input capture channel-4*/ +#define RTC1_CFG_IC4_INT_ENABLE 0 + +/*! Enable the over write input capture channels*/ +#define RTC1_CFG_IC_OVER_WRITE_ENABLE 0 + +/*! Polarity for input capture channel-0*/ +#define RTC1_CFG_IC0_EDGE_POLARITY 0 + +/*! Polarity for input capture channel-2*/ +#define RTC1_CFG_IC2_EDGE_POLARITY 0 + +/*! Polarity for input capture channel-3*/ +#define RTC1_CFG_IC3_EDGE_POLARITY 0 + +/*! Polarity for input capture channel-4*/ +#define RTC1_CFG_IC4_EDGE_POLARITY 0 + +/*! Enable the interrupt for Sensor Strobe channel-1*/ +#define RTC1_CFG_SS1_INT_ENABLE 0 +/*! Enable the interrupt for Sensor Strobe channel-2*/ +#define RTC1_CFG_SS2_INT_ENABLE 0 +/*! Enable the interrupt for Sensor Strobe channel-3*/ +#define RTC1_CFG_SS3_INT_ENABLE 0 +/*! Enable the interrupt for Sensor Strobe channel-4*/ +#define RTC1_CFG_SS4_INT_ENABLE 0 + +/*! Enable the masking for Sensor Strobe channel-1*/ +#define RTC1_CFG_SS1_MASK_ENABLE 0 +/*! Enable the masking for Sensor Strobe channel-2*/ +#define RTC1_CFG_SS2_MASK_ENABLE 0 +/*! Enable the masking for Sensor Strobe channel-3*/ +#define RTC1_CFG_SS3_MASK_ENABLE 0 +/*! Enable the masking for Sensor Strobe channel-4*/ +#define RTC1_CFG_SS4_MASK_ENABLE 0 + +/*! Enable the auto-reloading for Sensor Strobe channel-0*/ +#define RTC1_CFG_SS1_AUTO_RELOADING_ENABLE 0 + +/*! Mask for Sensor Strobe channel-0 */ +#define RTC1_CFG_SS1_MASK_VALUE 0 + + +/*! Auto reload value for Sensor Strobe channel-0 */ +#define RTC1_CFG_SS1_AUTO_RELOAD_VALUE 32768/2 + + +/*! Sensor Strobe GP Input Sampling Mux + * SS2 GPIO Pin 1 + * + * GPMUX0/1.SSxGPINySEL 3’b000 3’b001 3’b010 3’b011 3’b100 3’b101 3’b110 3’b111 + * RTCSSxGPIny p0[12] p2[0] p0[9] p0[8] p1[13] p1[2] p2[7] p2[9] + */ +#define RTC1_SS2_GPIN1SEL 0x4 +/*! Sensor Strobe's GP Input Sampling Mux SS 2 GPIO Pin 0*/ +#define RTC1_SS2_GPIN0SEL 0x3 +/*! Sensor Strobe's GP Input Sampling Mux SS 1 GPIO Pin 2*/ +#define RTC1_SS1_GPIN2SEL 0x2 +/*! Sensor Strobe's GP Input Sampling Mux SS 1 GPIO Pin 1*/ +#define RTC1_SS1_GPIN1SEL 0x1 +/*! Sensor Strobe's GP Input Sampling Mux SS 1 GPIO Pin 0*/ +#define RTC1_SS1_GPIN0SEL 0x0 +/*! Sensor Strobe's GP Input Sampling Mux SS 3 GPIO Pin 2*/ +#define RTC1_SS3_GPIN2SEL 0x0 +/*! Sensor Strobe's GP Input Sampling Mux SS 3 GPIO Pin 1*/ +#define RTC1_SS3_GPIN1SEL 0x7 +/*! Sensor Strobe's GP Input Sampling Mux SS 3 GPIO Pin 0*/ +#define RTC1_SS3_GPIN0SEL 0x6 +/*! Sensor Strobe's GP Input Sampling Mux SS 2 GPIO Pin 2*/ +#define RTC1_SS2_GPIN2SEL 0x5 + +/*! Differential output option for Sensor Strobe channel 3. + * Sensor Strobe channel3 is used as differential signal, actual RTC_SS3 out + * for this channel is available in corresponding GPIO. + * RTC_SS4 of Sensor Strobe channel 4 is used to provided inverted signal of RTC_SS3. + */ +#define RTC1_SS3_DIFFOUT 0 +/*! Differential output option for Sensor Strobe channel 1. + * Sensor Strobe channel 1 is used as differential signal, actual RTC_SS1 out + * for this channel is available in corresponding GPIO. + * RTC_SS1 of Sensor Strobe channel 2 is used to provided inverted signal of RTC_SS1. + */ +#define RTC1_SS1_DIFFOUT 0 + + +/*! @} */ + +/*! @} */ +#endif /* ADI_RTC_CONFIG_H__ */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_spi_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_spi_config.h new file mode 100755 index 0000000000..e2a8ccd572 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_spi_config.h @@ -0,0 +1,592 @@ +/*! + ***************************************************************************** + @file: adi_spi_config.h + @brief: Configuration options for SPI driver. + This is specific to the SPI driver and will be included by the driver. + It is not required for the application to include this header file. + ----------------------------------------------------------------------------- + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_SPI_CONFIG_H__ +#define ADI_SPI_CONFIG_H__ +#include +/** @addtogroup SPI_Driver_Config Static Configuration + * @ingroup SPI_Driver + * @{ + */ + + +/*! Set this macro to the system clock frequency in hertz*/ +#define ADI_CFG_SYSTEM_CLOCK_HZ (26000000u) + +/************* SPI controller configurations ***************/ + +/* There are three SPI instances SPI0, SPI1 and SPI2 */ +/* Each SPI has its own configuration macros */ + + +/*----------------------------------------------------------*/ +/* -------------------- SPI0 -------------------------------*/ +/*----------------------------------------------------------*/ + +/** @addtogroup SPI_Driver_Config_SPI0 SPI0 Static Configuration + * @ingroup SPI_Driver_Config + * @{ + */ + + /*! If using SPI0 in master mode set this macro to 1. For slave mode set this macro to 0. */ +#define ADI_SPI0_MASTER_MODE (1u) + + +/*! Set this macro to the SPI0 bit rate in hertz */ +#define ADI_SPI0_CFG_BIT_RATE (2000000u) + +/*! SPI0 enable\n + SPI configuration register: Bit[0]\n + 1 - Enable SPI\n + 0 - Disable SPI */ +#define ADI_SPI0_CFG_ENABLE (0u) + +/*! SPI0 clock phase mode\n + SPI configuration register: Bit[2]\n + 1 - Serial clock pulses at the beginning of each serial bit transfer.\n + 0 - Serial clock pulses at the end of each serial bit transfer. */ +#define ADI_SPI0_CFG_CLK_PHASE (0u) + + + + + +/*! SPI0 clock polarity\n + SPI configuration register: Bit[3]\n + 1 - Serial clock idles high.\n + 0 - Serial clock idles low. */ +#define ADI_SPI0_CFG_CLK_POLARITY (0u) + + +/*! SPI0 wired OR mode\n + SPI configuration register: Bit[4]\n + 1 - Enables open circuit output enable.\n + 0 - Normal output levels. */ +#define ADI_SPI0_CFG_WIRED_OR (0u) + + +/*! SPI0 LSB/MSB\n + SPI configuration register: Bit[5]\n + 1 - MSB transmitted first.\n + 0 - LSB transmitted first. */ +#define ADI_SPI0_CFG_LSB_MSB (0u) + + +/*! SPI0 transfer initiate\n + SPI configuration register: Bit[6]\n + 1 - SPI transfer is initiated with write to Tx FIFO register. Interrupts when Tx is empty.\n + 0 - SPI transfer is initiated with a read of the Rx FIFO register. Interrupts when Rx is full.*/ +#define ADI_SPI0_CFG_TRANSFER_INITIATE (0u) + + +/*! SPI0 Tx FIFO transfers zeros or last bit upon underflow\n + SPI configuration register: Bit[7]\n + 1 - Tx FIFO sends zeros upon underflow.\n + 0 - Tx FIFO repeats last bit upon underflow. */ +#define ADI_SPI0_CFG_TX_UNDERFLOW (0u) + + +/*! SPI0 Rx FIFO overflows with received data or data is discarded\n + SPI configuration register: Bit[8]\n + 1 - Rx FIFO receives data upon overflow.\n + 0 - Rx FIFO discards received data upon overflow. */ +#define ADI_SPI0_CFG_RX_OVERFLOW (0u) + + +/*! SPI0 slave mode MISO enable\n + SPI configuration register: Bit[9]\n + 1 - MISO operates as normal in slave mode.\n + 0 - MISO is disabled in slave mode. */ +#define ADI_SPI0_CFG_MISO_ENABLE (0u) + + +/*! SPI0 internal loopback enable\n + SPI configuration register: Bit[10]\n + 1 - MISO and MOSI is loopbacked internally.\n + 0 - MISO and MOSI operates normally. */ +#define ADI_SPI0_CFG_LOOPBACK (0u) + +/*! SPI0 transfer and interrupt mode\n + SPI configuration register: Bit[11]\n + 1 - SPI continuous transfers in which CS remains asserted until Tx is empty.\n + 0 - SPI disable continuous transfer, each transfer consists of 8 bits of data.*/ +#define ADI_SPI0_CFG_CONTINUOUS (0u) + +/*! SPI0 Rx FIFO flush enable\n + SPI configuration register: Bit[12]\n + 1 - Rx FIFO is flushed and all rx data is ignored and no interrupts are generated.\n + 0 - Rx FIFO flush is disabled. */ +#define ADI_SPI0_CFG_RX_FLUSH (0u) + + +/*! SPI0 Tx FIFO flush enable\n + SPI configuration register: Bit[13]\n + 1 - Tx FIFO is flushed.\n + 0 - Tx FIFO flush is disabled. */ +#define ADI_SPI0_CFG_TX_FLUSH (0u) + + +/*! Reset Mode for CSERR. \n + SPI0 configuration register: Bit[14]\n + 0 - To continue from where it stopped. SPI can receive the remaining bits + when CS gets asserted and Cortex has to ignore the CSERR interrupt.\n + 1 - To enable resetting the bit counter and reset if there is a + CS error condition and the Cortex is expected to clear the SPI_EN bit. +*/ +#define ADI_SPI0_CFG_CSERR_RESET (0u) + + +/*! SPI0 clock divide\n + SPI baud rate selection register: Bit[0:5]\n + Value between 0-63 that is used to divide the UCLK to generate + the SPI serial clock. */ +#define ADI_SPI0_CFG_CLK_DIV (0u) + + +/*! SPI0 high frequency mode\n + SPI baud rate selection register: Bit[6]\n + 1 - High frequency mode enabled.\n + 0 - High frequency mode disabled. */ +#define ADI_SPI0_CFG_HFM (0u) + + +/*! SPI0 reset mode for CSERR\n + SPI baud rate selection register: Bit[7]\n + 1 - clear bit counter on CS error.\n + 0 - do not clear bit counter on CS error. */ +#define ADI_SPI0_CFG_CS_ERR (0u) + + +/*! SPI0 CS interrupt\n + SPI baud rate selection register: Bit[8]\n + 1 - In continuous mode, generate interrupt on CS.\n + 0 - In continuous mode, do not generate interrupt on CS. */ +#define ADI_SPI0_CFG_CS_IRQ (0u) + + +/*! @} */ + +/*----------------------------------------------------------*/ +/* -------------------- SPI1 -------------------------------*/ +/*----------------------------------------------------------*/ + +/** @addtogroup SPI_Driver_Config_SPI1 SPI1 Static Configuration + * @ingroup SPI_Driver_Config + * @{ + */ + + /*! If using SPI1 in master mode set this macro to 1. For slave mode set this macro to 0. */ +#define ADI_SPI1_MASTER_MODE (1u) + +/*! Set this macro to the SPI1 bit rate in hertz */ +#define ADI_SPI1_CFG_BIT_RATE (2000000u) + +/*! SPI1 enable\n + SPI configuration register: Bit[0]\n + 1 - Enable SPI\n + 0 - Disable SPI */ +#define ADI_SPI1_CFG_ENABLE (0u) + +/*! SPI1 clock phase mode\n + SPI configuration register: Bit[2]\n + 1 - Serial clock pulses at the beginning of each serial bit transfer.\n + 0 - Serial clock pulses at the end of each serial bit transfer. */ +#define ADI_SPI1_CFG_CLK_PHASE (0u) + + + + + +/*! SPI1 clock polarity\n + SPI configuration register: Bit[3]\n + 1 - Serial clock idles high.\n + 0 - Serial clock idles low. */ +#define ADI_SPI1_CFG_CLK_POLARITY (0u) + + +/*! SPI1 wired OR mode\n + SPI configuration register: Bit[4]\n + 1 - Enables open circuit output enable.\n + 0 - Normal output levels. */ +#define ADI_SPI1_CFG_WIRED_OR (0u) + + +/*! SPI1 LSB/MSB\n + SPI configuration register: Bit[5]\n + 1 - MSB transmitted first.\n + 0 - LSB transmitted first. */ +#define ADI_SPI1_CFG_LSB_MSB (0u) + + +/*! SPI1 transfer initiate\n + SPI configuration register: Bit[6]\n + 1 - SPI transfer is initiated with write to Tx FIFO register. Interrupts when Tx is empty.\n + 0 - SPI transfer is initiated with a read of the Rx FIFO register. Interrupts when Rx is full.*/ +#define ADI_SPI1_CFG_TRANSFER_INITIATE (0u) + + +/*! SPI1 Tx FIFO transfers zeros or last bit upon underflow\n + SPI configuration register: Bit[7]\n + 1 - Tx FIFO sends zeros upon underflow.\n + 0 - Tx FIFO repeats last bit upon underflow. */ +#define ADI_SPI1_CFG_TX_UNDERFLOW (0u) + + +/*! SPI1 Rx FIFO overflows with received data or data is discarded\n + SPI configuration register: Bit[8]\n + 1 - Rx FIFO receives data upon overflow.\n + 0 - Rx FIFO discards received data upon overflow. */ +#define ADI_SPI1_CFG_RX_OVERFLOW (0u) + + +/*! SPI1 slave mode MISO enable\n + SPI configuration register: Bit[9]\n + 1 - MISO operates as normal in slave mode.\n + 0 - MISO is disabled in slave mode. */ +#define ADI_SPI1_CFG_MISO_ENABLE (0u) + + +/*! SPI1 internal loopback enable\n + SPI configuration register: Bit[10]\n + 1 - MISO and MOSI is loopbacked internally.\n + 0 - MISO and MOSI operates normally. */ +#define ADI_SPI1_CFG_LOOPBACK (0u) + +/*! SPI1 transfer and interrupt mode\n + SPI configuration register: Bit[11]\n + 1 - SPI continuous transfers in which CS remains asserted until Tx is empty.\n + 0 - SPI disable continuous transfer, each transfer consists of 8 bits of data.*/ +#define ADI_SPI1_CFG_CONTINUOUS (0u) + +/*! SPI1 Rx FIFO flush enable\n + SPI configuration register: Bit[12]\n + 1 - Rx FIFO is flushed and all rx data is ignored and no interrupts are generated.\n + 0 - Rx FIFO flush is disabled. */ +#define ADI_SPI1_CFG_RX_FLUSH (0u) + + +/*! SPI1 Tx FIFO flush enable\n + SPI configuration register: Bit[13]\n + 1 - Tx FIFO is flushed.\n + 0 - Tx FIFO flush is disabled. */ +#define ADI_SPI1_CFG_TX_FLUSH (0u) + + +/*! Reset Mode for CSERR. \n + SPI1 configuration register: Bit[14]\n + 0 - To continue from where it stopped. SPI can receive the remaining bits + when CS gets asserted and Cortex has to ignore the CSERR interrupt.\n + 1 - To enable resetting the bit counter and reset if there is a + CS error condition and the Cortex is expected to clear the SPI_EN bit. +*/ +#define ADI_SPI1_CFG_CSERR_RESET (0u) + + +/*! SPI1 clock divide\n + SPI baud rate selection register: Bit[0:5]\n + Value between 0-63 that is used to divide the UCLK to generate + the SPI serial clock. */ +#define ADI_SPI1_CFG_CLK_DIV (0u) + + +/*! SPI1 high frequency mode\n + SPI baud rate selection register: Bit[6]\n + 1 - High frequency mode enabled.\n + 0 - High frequency mode disabled. */ +#define ADI_SPI1_CFG_HFM (0u) + + +/*! SPI1 reset mode for CSERR\n + SPI baud rate selection register: Bit[7]\n + 1 - clear bit counter on CS error.\n + 0 - do not clear bit counter on CS error. */ +#define ADI_SPI1_CFG_CS_ERR (0u) + + +/*! SPI1 CS interrupt\n + SPI baud rate selection register: Bit[8]\n + 1 - In continuous mode, generate interrupt on CS.\n + 0 - In continuous mode, do not generate interrupt on CS. */ +#define ADI_SPI1_CFG_CS_IRQ + +/*! @} */ + +/*----------------------------------------------------------*/ +/* -------------------- SPI2 -------------------------------*/ +/*----------------------------------------------------------*/ + +/** @addtogroup SPI_Driver_Config_SPI2 SPI2 Static Configuration + * @ingroup SP2_Driver_Config + * @{ + */ + +/*! If using SPI2 in master mode set this macro to 1. For slave mode set this macro to 0. */ +#define ADI_SPI2_MASTER_MODE (1u) + +/*! Set this macro to the SPI2 bit rate in hertz */ +#define ADI_SPI2_CFG_BIT_RATE (2000000u) + +/*! SPI2 enable\n + SPI configuration register: Bit[0]\n + 1 - Enable SPI\n + 0 - Disable SPI */ +#define ADI_SPI2_CFG_ENABLE (0u) + +/*! SPI2 clock phase mode\n + SPI configuration register: Bit[2]\n + 1 - Serial clock pulses at the beginning of each serial bit transfer.\n + 0 - Serial clock pulses at the end of each serial bit transfer. */ +#define ADI_SPI2_CFG_CLK_PHASE (0u) + + + + + +/*! SPI2 clock polarity\n + SPI configuration register: Bit[3]\n + 1 - Serial clock idles high.\n + 0 - Serial clock idles low. */ +#define ADI_SPI2_CFG_CLK_POLARITY (0u) + + +/*! SPI2 wired OR mode\n + SPI configuration register: Bit[4]\n + 1 - Enables open circuit output enable.\n + 0 - Normal output levels. */ +#define ADI_SPI2_CFG_WIRED_OR (0u) + + +/*! SPI2 LSB/MSB\n + SPI configuration register: Bit[5]\n + 1 - MSB transmitted first.\n + 0 - LSB transmitted first. */ +#define ADI_SPI2_CFG_LSB_MSB (0u) + + +/*! SPI2 transfer initiate\n + SPI configuration register: Bit[6]\n + 1 - SPI transfer is initiated with write to Tx FIFO register. Interrupts when Tx is empty.\n + 0 - SPI transfer is initiated with a read of the Rx FIFO register. Interrupts when Rx is full.*/ +#define ADI_SPI2_CFG_TRANSFER_INITIATE (0u) + + +/*! SPI2 Tx FIFO transfers zeros or last bit upon underflow\n + SPI configuration register: Bit[7]\n + 1 - Tx FIFO sends zeros upon underflow.\n + 0 - Tx FIFO repeats last bit upon underflow. */ +#define ADI_SPI2_CFG_TX_UNDERFLOW (0u) + + +/*! SPI2 Rx FIFO overflows with received data or data is discarded\n + SPI configuration register: Bit[8]\n + 1 - Rx FIFO receives data upon overflow.\n + 0 - Rx FIFO discards received data upon overflow. */ +#define ADI_SPI2_CFG_RX_OVERFLOW (0u) + + +/*! SPI2 slave mode MISO enable\n + SPI configuration register: Bit[9]\n + 1 - MISO operates as normal in slave mode.\n + 0 - MISO is disabled in slave mode. */ +#define ADI_SPI2_CFG_MISO_ENABLE (0u) + + +/*! SPI2 internal loopback enable\n + SPI configuration register: Bit[10]\n + 1 - MISO and MOSI is loopbacked internally.\n + 0 - MISO and MOSI operates normally. */ +#define ADI_SPI2_CFG_LOOPBACK (0u) + +/*! SPI2 transfer and interrupt mode\n + SPI configuration register: Bit[11]\n + 1 - SPI continuous transfers in which CS remains asserted until Tx is empty.\n + 0 - SPI disable continuous transfer, each transfer consists of 8 bits of data.*/ +#define ADI_SPI2_CFG_CONTINUOUS (0u) + +/*! SPI2 Rx FIFO flush enable\n + SPI configuration register: Bit[12]\n + 1 - Rx FIFO is flushed and all rx data is ignored and no interrupts are generated.\n + 0 - Rx FIFO flush is disabled. */ +#define ADI_SPI2_CFG_RX_FLUSH (0u) + + +/*! SPI2 Tx FIFO flush enable\n + SPI configuration register: Bit[13]\n + 1 - Tx FIFO is flushed.\n + 0 - Tx FIFO flush is disabled. */ +#define ADI_SPI2_CFG_TX_FLUSH (0u) + + +/*! Reset Mode for CSERR. \n + SPI2 configuration register: Bit[14]\n + 0 - To continue from where it stopped. SPI can receive the remaining bits + when CS gets asserted and Cortex has to ignore the CSERR interrupt.\n + 1 - To enable resetting the bit counter and reset if there is a + CS error condition and the Cortex is expected to clear the SPI_EN bit. +*/ +#define ADI_SPI2_CFG_CSERR_RESET (0u) + + +/*! SPI2 clock divide\n + SPI baud rate selection register: Bit[0:5]\n + Value between 0-63 that is used to divide the UCLK to generate + the SPI serial clock. */ +#define ADI_SPI2_CFG_CLK_DIV (0u) + + +/*! SPI2 high frequency mode\n + SPI baud rate selection register: Bit[6]\n + 1 - High frequency mode enabled.\n + 0 - High frequency mode disabled. */ +#define ADI_SPI2_CFG_HFM (0u) + + +/*! SPI2 reset mode for CSERR\n + SPI baud rate selection register: Bit[7]\n + 1 - clear bit counter on CS error.\n + 0 - do not clear bit counter on CS error. */ +#define ADI_SPI2_CFG_CS_ERR (0u) + + +/*! SPI2 CS interrupt\n + SPI baud rate selection register: Bit[8]\n + 1 - In continuous mode, generate interrupt on CS.\n + 0 - In continuous mode, do not generate interrupt on CS. */ +#define ADI_SPI2_CFG_CS_IRQ + +/*! @} */ + +/************** Macro validation *****************************/ + +#if ( ADI_SPI0_CFG_BIT_RATE > (13000000u) ) || \ + ( ADI_SPI0_CFG_BIT_RATE > (13000000u) ) || \ + ( ADI_SPI0_CFG_BIT_RATE > (13000000u) ) +#error "Invalid configuration" +#endif + +#if ( ADI_SPI0_CFG_ENABLE > 1u ) || \ + ( ADI_SPI1_CFG_ENABLE > 1u ) || \ + ( ADI_SPI2_CFG_ENABLE > 1u ) +#error "Invalid configuration" +#endif + +#if ( ADI_SPI0_CFG_CLK_PHASE > 1u ) || \ + ( ADI_SPI1_CFG_CLK_PHASE > 1u ) || \ + ( ADI_SPI2_CFG_CLK_PHASE > 1u ) +#error "Invalid configuration" +#endif + +#if ( ADI_SPI0_CFG_CLK_POLARITY > 1u ) || \ + ( ADI_SPI1_CFG_CLK_POLARITY > 1u ) || \ + ( ADI_SPI2_CFG_CLK_POLARITY > 1u ) +#error "Invalid configuration" +#endif + +#if ( ADI_SPI0_CFG_WIRED_OR > 1u ) || \ + ( ADI_SPI1_CFG_WIRED_OR > 1u ) || \ + ( ADI_SPI2_CFG_WIRED_OR > 1u ) +#error "Invalid configuration" +#endif + +#if ( ADI_SPI0_CFG_LSB_MSB > 1u ) || \ + ( ADI_SPI1_CFG_LSB_MSB > 1u ) || \ + ( ADI_SPI2_CFG_LSB_MSB > 1u ) +#error "Invalid configuration" +#endif + +#if ( ADI_SPI0_CFG_TRANSFER_INITIATE > 1u ) || \ + ( ADI_SPI1_CFG_TRANSFER_INITIATE > 1u ) || \ + ( ADI_SPI2_CFG_TRANSFER_INITIATE > 1u ) +#error "Invalid configuration" +#endif + +#if ( ADI_SPI0_CFG_TX_UNDERFLOW > 1u ) || \ + ( ADI_SPI1_CFG_TX_UNDERFLOW > 1u ) || \ + ( ADI_SPI2_CFG_TX_UNDERFLOW > 1u ) +#error "Invalid configuration" +#endif + +#if ( ADI_SPI0_CFG_RX_OVERFLOW > 1u ) || \ + ( ADI_SPI1_CFG_RX_OVERFLOW > 1u ) || \ + ( ADI_SPI2_CFG_RX_OVERFLOW > 1u ) +#error "Invalid configuration" +#endif + +#if ( ADI_SPI0_CFG_MISO_ENABLE > 1u ) || \ + ( ADI_SPI1_CFG_MISO_ENABLE > 1u ) || \ + ( ADI_SPI2_CFG_MISO_ENABLE > 1u ) +#error "Invalid configuration" +#endif + +#if ( ADI_SPI0_CFG_LOOPBACK > 1u ) || \ + ( ADI_SPI1_CFG_LOOPBACK > 1u ) || \ + ( ADI_SPI2_CFG_LOOPBACK > 1u ) +#error "Invalid configuration" +#endif + +#if ( ADI_SPI0_CFG_CONTINUOUS > 1u ) || \ + ( ADI_SPI1_CFG_CONTINUOUS > 1u ) || \ + ( ADI_SPI2_CFG_CONTINUOUS > 1u ) +#error "Invalid configuration" +#endif + +#if ( ADI_SPI0_CFG_RX_FLUSH > 1u ) || \ + ( ADI_SPI1_CFG_RX_FLUSH > 1u ) || \ + ( ADI_SPI2_CFG_RX_FLUSH > 1u ) +#error "Invalid configuration" +#endif + +#if ( ADI_SPI0_CFG_TX_FLUSH > 1u ) || \ + ( ADI_SPI1_CFG_TX_FLUSH > 1u ) || \ + ( ADI_SPI2_CFG_TX_FLUSH > 1u ) +#error "Invalid configuration" +#endif + + +/*! @} */ + +#endif /* ADI_SPI_CONFIG_H__ */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_sport_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_sport_config.h new file mode 100755 index 0000000000..db0fdb6636 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_sport_config.h @@ -0,0 +1,355 @@ +/*! **************************************************************************** + * @file adi_sport_config.h + * @brief Configuration options for SPORT driver. + * @details This is specific to the SPORT driver and will be included by the + * driver. It is not required for the application to include this + * header file. + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ +#ifndef ADI_SPORT_CONFIG_H +#define ADI_SPORT_CONFIG_H +#include + +/** @addtogroup SPORT_Driver_Config Static Configuration + * @ingroup SPORT_Driver + * @{ + */ + +/************* SPORT Driver configurations FOR SPORT-0-A ***************/ +/*! + Frame Sync Multiplexer Select.\n + 0 - Disable frame sync multiplexing\n + 1 - Enable frame sync multiplexing. +*/ +#define ADI_CFG_SPORT0A_ENABLE_FSMUXSEL (0u) + +/*! + Clock Multiplexer Select.\n + 0 - Disable serial clock multiplexing\n + 1 - Enable serial clock multiplexing. +*/ +#define ADI_CFG_SPORT0A_ENABLE_CKMUXSEL (1u) + +/*! + Least-Significant Bit First.\n + 0 - MSB first sent/received.\n + 1 - LSB first sent/received. +*/ +#define ADI_CFG_SPORT0A_LSB_FIRST (0u) + + +/*! + Serial Word Length in bits.\n + 1 - 32 - SPORT word length +*/ +#define ADI_CFG_SPORT0A_SERIAL_WLEN (32u) + + +/*! + Internal Clock.\n + 0 - External clock.\n + 1 - Internal clock. +*/ +#define ADI_CFG_SPORT0A_INTERNAL_CLK (1u) + +/*! + Operation Mode\n + 0 - DSP standard.\n + 1 - Timer_enable mode. +*/ +#define ADI_CFG_SPORT0A_OPERATION_MODE (0u) + + +/*! + Clock Rising Edge\n + 0 - Clock falling edge\n + 1 - Clock rising edge. +*/ +#define ADI_CFG_SPORT0A_CLOCK_EDGE (0u) + +/*! + Frame Sync Required\n + 0 - No frame sync required \n + 1 - Frame sync required. +*/ +#define ADI_CFG_SPORT0A_FS_REQUIRED (1u) + +/*! + Internal Frame Sync\n + 0 - External frame sync\n + 1 - Internal frame sync +*/ +#define ADI_CFG_SPORT0A_INTERNAL_FS (0u) + + +/*! + Data-Independent Frame Sync\n + 0 - Data-dependent frame sync\n + 1 - Data-independent frame +*/ +#define ADI_CFG_SPORT0A_DATA_INDEPENDENT_FS (0u) + +/*! + Active-Low Frame Sync\n + 0 - Active high frame sync\n + 1 - Active low frame sync +*/ +#define ADI_CFG_SPORT0A_ACTIVE_LOW_FS (0u) + +/*! + Late Frame Sync\n + 0 - Early frame sync\n + 1 - Late frame sync +*/ +#define ADI_CFG_SPORT0A_LATE_FS (0u) + +/*! + Enable Packing \n + 0 - Disable\n + 1 - 8-bit packing enable\n + 2 - 16-bit packing enable +*/ +#define ADI_CFG_SPORT0A_ENABLE_PACKING (0u) + +/*! + Frame Sync Error Operation + 0 - Flag the Frame Sync error\n + 1 - When frame Sync error occurs, discard the receive data +*/ +#define ADI_CFG_SPORT0A_FS_ERROR_OPERATION (1u) + +/*! + Enabling Gated Clock\n + 0 - Disable Gated Clock\n + 1 - Enable Gated Clock +*/ +#define ADI_CFG_SPORT0A_GATED_CLOCK (0u) + +/*! + Serial Clock divisor.\n + 0 - 65535 - Serial Clock Divisor which SPORT device use to calculate the serial + clock (ACLK) from the processor system clock (PCLK). +*/ +#define ADI_CFG_SPORT0A_CLOCK_DIVISOR (2u) + +/*! + Frame Sync Divisor.\n + 0 - 128 - Frame Sync Divisor which select the number of transmit or receive clock + cycles that the half SPORT counts before generating a frame sync pulse. +*/ +#define ADI_CFG_SPORT0A_FS_DIVISOR (0x40u) + + +/*! + CONVT to FS duration.\n + 0 - 128 - Specify the value of the number of clocks which would be programmed + corresponding to the desired time duration from assertion of CONVT + signal to Frame sync signal +*/ +#define ADI_CFG_SPORT0A_CONVT_FS_DURATION (1u) + +/*! + Polarity of the Convt signal.\n + 0 - Active High Polarity\n + 1 - Active low Polarity +*/ +#define ADI_CFG_SPORT0A_CONVT_POLARITY (0u) + +/*! + CONVT signal width.\n + 0 - 15 - Specify the value of the number of serial clocks for which CONVT + signal should be active + +*/ +#define ADI_CFG_SPORT0A_CONVT_WIDTH (1u) + +#if defined(ADI_CFG_SPORT0A_SERIAL_WLEN) +#if (ADI_CFG_SPORT0A_SERIAL_WLEN <= 3u) || (ADI_CFG_SPORT0A_SERIAL_WLEN > 32u) +#error "Invalid word length : it must be between 4 and 32" +#endif +#else +#error "ADI_CFG_SPORT0A_SERIAL_WLEN undefined!!! " +#endif + +/************* SPORT Driver configurations FOR SPORT-0-B ***************/ +/*! + Least-Significant Bit First.\n + 0 - MSB first sent/received.\n + 1 - LSB first sent/received. +*/ +#define ADI_CFG_SPORT0B_LSB_FIRST (0u) + + +/*! + Serial Word Length in bits.\n + 1 - 32 - SPORT word length +*/ +#define ADI_CFG_SPORT0B_SERIAL_WLEN (32u) + + +/*! + Internal Clock.\n + 0 - External clock.\n + 1 - Internal clock. +*/ +#define ADI_CFG_SPORT0B_INTERNAL_CLK (1u) + +/*! + Operation Mode\n + 0 - DSP standard.\n + 1 - Timer_enable mode. +*/ +#define ADI_CFG_SPORT0B_OPERATION_MODE (0u) + + +/*! + Clock Rising Edge\n + 0 - Clock falling edge\n + 1 - Clock rising edge. +*/ +#define ADI_CFG_SPORT0B_CLOCK_EDGE (0u) + +/*! + Frame Sync Required\n + 0 - No frame sync required \n + 1 - Frame sync required. +*/ +#define ADI_CFG_SPORT0B_FS_REQUIRED (1u) + +/*! + Internal Frame Sync\n + 0 - External frame sync\n + 1 - Internal frame sync +*/ +#define ADI_CFG_SPORT0B_INTERNAL_FS (1u) + + +/*! + Data-Independent Frame Sync\n + 0 - Data-dependent frame sync\n + 1 - Data-independent frame +*/ +#define ADI_CFG_SPORT0B_DATA_INDEPENDENT_FS (0u) + +/*! + Active-Low Frame Sync\n + 0 - Active high frame sync\n + 1 - Active low frame sync +*/ +#define ADI_CFG_SPORT0B_ACTIVE_LOW_FS (0u) + +/*! + Late Frame Sync\n + 0 - Early frame sync\n + 1 - Late frame sync +*/ +#define ADI_CFG_SPORT0B_LATE_FS (0u) + +/*! + Enable Packing \n + 0 - Disable\n + 1 - 8-bit packing enable\n + 2 - 16-bit packing enable\n +*/ +#define ADI_CFG_SPORT0B_ENABLE_PACKING (0u) + +/*! + Frame Sync Error Operation\n + 0 - Flag the Frame Sync error\n + 1 - When frame Sync error occurs, discard the receive data +*/ +#define ADI_CFG_SPORT0B_FS_ERROR_OPERATION (1u) + +/*! + Enabling Gated Clock\n + 0 - Disable Gated Clock\n + 1 - Enable Gated Clock +*/ +#define ADI_CFG_SPORT0B_GATED_CLOCK (0u) + +/*! + Serial Clock divisor.\n + 0 - 65535 - Serial Clock Divisor which SPORT device use to calculate the serial + clock (ACLK) from the processor system clock (PCLK). +*/ +#define ADI_CFG_SPORT0B_CLOCK_DIVISOR (2u) + +/*! + Frame Sync Divisor.\n + 0 - 128 - Frame Sync Divisor which select the number of transmit or receive clock + cycles that the half SPORT counts before generating a frame sync pulse. +*/ +#define ADI_CFG_SPORT0B_FS_DIVISOR (0x40u) + + +/*! + CONVT to FS duration.\n + 0 - 128 - Specify the value of the number of clocks which would be programmed + corresponding to the desired time duration from assertion of CONVT + signal to Frame sync signal +*/ +#define ADI_CFG_SPORT0B_CONVT_FS_DURATION (1u) + +/*! + Polarity of the Convt signal.\n + 0 - Active High Polarity\n + 1 - Active low Polarity +*/ +#define ADI_CFG_SPORT0B_CONVT_POLARITY (0u) + +/*! + CONVT signal width.\n + 0-15 - Specify the value of the number of serial clocks for which CONVT + signal should be active + +*/ +#define ADI_CFG_SPORT0B_CONVT_WIDTH (1u) + +#if defined(ADI_CFG_SPORT0B_SERIAL_WLEN) +#if (ADI_CFG_SPORT0B_SERIAL_WLEN <= 3u) || (ADI_CFG_SPORT0B_SERIAL_WLEN > 32u) +#error "Invalid word length : it must be between 4 and 32" +#endif +#else +#error "ADI_CFG_SPORT0B_SERIAL_WLEN undefined!!! " +#endif + +/*! @} */ + +#endif /* ADI_SPORT_CONFIG_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_tmr_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_tmr_config.h new file mode 100755 index 0000000000..8d6ee10347 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_tmr_config.h @@ -0,0 +1,902 @@ +/*! ***************************************************************************** + * @file adi_tmr_config.h + * @brief GP and RGB timer device driver configuration + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + + +#ifndef ADI_TMR_CONFIG_H +#define ADI_TMR_CONFIG_H + + +#include + + +/** @addtogroup TMR_Driver_Config Static Configuration + * @ingroup TMR_Driver + * @{ + */ + + +/*! Static configuration allows all 3 GP timers and the RGB timer to be configured + with the parameters in this file by simply calling #adi_tmr_Init. The user can + then call any of the configuration API's to override the static configuration, + or simply call #adi_tmr_Enable to start the timer. Since all of these parameters + must be stored in arrays for abstraction, using static configuration will increase the + data footprint. If the user doesn't call any of the runtime configuration API's, the + linker will throw them out and the code footprint will be reduced significantly. Using + static configuration also reduces cycle count and simplifies the user application. + Static configuration should be used if the timers need to be configured once and do not + need to be changed during the system lifetime. + + 0 - Disable static confiscation support. User must call #adi_tmr_ConfigTimer and other + configuration API's after calling #adi_tmr_Init and prior to calling #adi_tmr_Enable + in order to set up the timer. + + 1 - Enable static configuration support. The timer registers will be set based on the + settings in this file when #adi_tmr_Init is called. +*/ +#define ADI_TIMER_ENABLE_STATIC_CONFIG_SUPPORT (0u) + + +/************************************************************* + GP Timer 0 Configuration + *************************************************************/ + + /** @addtogroup GPTimer0_Driver_Config GP Timer 0 Static Configuration + * @ingroup TMR_Driver_Config + * @{ + */ + + +/*! Count up or down. Used to control whether the timer increments (counts up) + or decrements (counts down) the Up/Down counter, it can be set to\n + 0 - Timer is set to count down.\n + 1 - Timer is set to count up. +*/ +#define TMR0_CFG_COUNT_UP (0u) + +/*! Timer mode. Used to control whether the timer runs in periodic or + free running mode, it can be set to\n + 0 - Timer is in free running mode.\n + 1 - Timer is in periodic mode. +*/ +#define TMR0_CFG_MODE (1u) + +/*! Prescale factor. Controls the prescaler division factor + to the timer's selected clock. It can be set to\n + + 0 - source_clock/[1 or 4]\n + 1 - source_clock/16\n + 2 - source_clock/64\n + 3 - source_clock/256 +*/ +#define TMR0_CFG_PRESCALE_FACTOR (0u) + +/*! Timer clock source. Used to select a timer clock from the four + available clock sources, it can be set to\n + 0 - Select PCLK\n + 1 - Select HFOSC\n + 2 - Select LFOSC\n + 3 - Select LFXTAL +*/ +#define TMR0_CFG_CLOCK_SOURCE (0u) + +/*! Timer load value. The Up/Down counter is periodically loaded with this + value if periodic mode is selected. LOAD writes during Up/Down counter timeout events + are delayed until the event has passed. It can be set to any value from 0 to 65535. + +*/ +#define TMR0_CFG_LOAD_VALUE (0x8F9Cu) + +/*! Timer asynchrounous load value. The Up/Down counter is periodically loaded with + this value if periodic mode is selected. Writing Asynchronous Load value takes + advantage of having the timer run on PCLK by bypassing clock synchronization + logic otherwise required. It can be set to any value from 0 to 65535. + +*/ +#define TMR0_CFG_ASYNC_LOAD_VALUE (0x8F9Cu) + +/*! Reload control. This allows the user to select whether the Up/Down counter should be + reset only on a timeout event or also when interrupt is cleared. It can be set to\n + 0 - Up/down counter is only reset on a time out event.\n + 1 - Resets the up/down counter when the interrupt is cleared. +*/ +#define TMR0_CFG_ENABLE_RELOADING (0u) + +/*! Enable or disable Synchronization bypass\n + 0 - Disable Synchronization bypass.\n + 1 - Enable Synchronization bypass. +*/ +#define TMR0_CFG_ENABLE_SYNC_BYPASS (0u) + +/************************************************************* + GP Timer 0 Event Configuration + *************************************************************/ + +/*! Enable or disable event capture. It can be set to\n + 0 - Disable event capturing.\n + 1 - Enable event capturing. +*/ +#define TMR0_CFG_ENABLE_EVENT_CAPTURE (1u) + +/*! Enable or disable prescale reset\n + 0 - Disable rescale reset.\n + 1 - Enable rescale reset. +*/ +#define TMR0_CFG_ENABLE_PRESCALE_RESET (0u) + +/*! Event to be captured. One of the selected 40 events associated + with a general purpose time can be captured. It can be set to + a value of 0 - 39. Please refer hardware reference manual to know + which events can be captured by a particular GP timer. +*/ +#define TMR0_CFG_EVENT_CAPTURE (27u) + +/************************************************************* + GP Timer 0 PWM0 Configuration + *************************************************************/ + +/*! Timer PWM Enable Match. This will control PWM operation mode of the timer. + Toggle mode provides a 50% duty cycle and match mode provides a configurable + duty cycle by using the match value. This vlaue can be set to\n + 0 - PWM in toggle mode.\n + 1 - PWM in match mode. +*/ +#define TMR0_CFG_ENABLE_PWM0_MATCH_MODE (1u) + + +/*! Timer PWM Idle state. This will control PWM idle state. It can be set to\n + 0 - PWM idles low.\n + 1 - PWM idles high. +*/ +#define TMR0_CFG_PWM0_IDLE_STATE (1u) + + +/*! PWM Match value. The value is used when the PWM is operating in match mode. + The PWM output is asserted when the Up/Down counter is equal to this match value. + PWM output is deasserted again when a timeout event occurs. + If the match value is never reached, or occurs simultaneous to a timeout event, + the PWM output remains idle. It can be any value from 0 to 65535. +*/ +#define TMR0_CFG_PWM0_MATCH_VALUE (0x0E5Cu) + +/*! @} */ + + +/************************************************************* + GP Timer 1 Configuration + *************************************************************/ + + /** @addtogroup GPTimer1_Driver_Config GP Timer 1 Static Configuration + * @ingroup TMR_Driver_Config + * @{ + */ + + +/*! Count up or down. Used to control whether the timer increments (counts up) + or decrements (counts down) the Up/Down counter, it can be set to\n + 0 - Timer is set to count down.\n + 1 - Timer is set to count up. +*/ +#define TMR1_CFG_COUNT_UP (0u) + +/*! Timer mode. Used to control whether the timer runs in periodic or + free running mode, it can be set to\n + 0 - Timer is in free running mode.\n + 1 - Timer is in periodic mode. +*/ +#define TMR1_CFG_MODE (1u) + +/*! Prescale factor. Controls the prescaler division factor + to the timer's selected clock. It can be set to\n + + 0 - source_clock/[1 or 4]\n + 1 - source_clock/16\n + 2 - source_clock/64\n + 3 - source_clock/256 +*/ +#define TMR1_CFG_PRESCALE_FACTOR (0u) + +/*! Timer clock source. Used to select a timer clock from the four + available clock sources, it can be set to\n + 0 - Select PCLK\n + 1 - Select HFOSC\n + 2 - Select LFOSC\n + 3 - Select LFXTAL +*/ +#define TMR1_CFG_CLOCK_SOURCE (0u) + +/*! Timer load value. The Up/Down counter is periodically loaded with this + value if periodic mode is selected. LOAD writes during Up/Down counter timeout events + are delayed until the event has passed. It can be set to any value from 0 to 65535. + +*/ +#define TMR1_CFG_LOAD_VALUE (0x23E7u) + +/*! Timer asynchronous load value. The Up/Down counter is periodically loaded with + this value if periodic mode is selected. Writing Asynchronous Load value takes + advantage of having the timer run on PCLK by bypassing clock synchronization + logic otherwise required. It can be set to any value from 0 to 65535. + +*/ +#define TMR1_CFG_ASYNC_LOAD_VALUE (0x23E7u) + +/*! Reload control. This allows the user to select whether the Up/Down counter should be + reset only on a timeout event or also when interrupt is cleared. It can be set to\n + 0 - Up/down counter is only reset on a time out event.\n + 1 - Resets the up/down counter when the interrupt is cleared. +*/ +#define TMR1_CFG_ENABLE_RELOADING (0u) + +/*! Enable or disable Synchronization bypass\n + 0 - Disable Synchronization bypass.\n + 1 - Enable Synchronization bypass. +*/ +#define TMR1_CFG_ENABLE_SYNC_BYPASS (0u) + + +/************************************************************* + GP Timer 1 Event Configuration + *************************************************************/ + +/*! Enable or disable event capture. It can be set to\n + 0 - Disable event capturing.\n + 1 - Enable event capturing. +*/ +#define TMR1_CFG_ENABLE_EVENT_CAPTURE (1u) + +/*! Enable or disable prescale reset\n + 0 - Disable rescale reset.\n + 1 - Enable rescale reset. +*/ +#define TMR1_CFG_ENABLE_PRESCALE_RESET (0u) + +/*! Event to be captured. One of the selected 40 events associated + with a general purpose time can be captured. It can be set to + a value of 0 - 39. Please refer hardware reference manual to know + which events can be captured by a particular GP timer. +*/ +#define TMR1_CFG_EVENT_CAPTURE (28u) + +/************************************************************* + GP Timer 1 PWM0 Configuration + *************************************************************/ + +/*! Timer PWM Enable Match. This will control PWM operation mode of the timer. + Toggle mode provides a 50% duty cycle and match mode provides a configurable + duty cycle by using the match value. This value can be set to\n + 0 - PWM in toggle mode.\n + 1 - PWM in match mode. +*/ +#define TMR1_CFG_ENABLE_PWM0_MATCH_MODE (1u) + + +/*! Timer PWM Idle state. This will control PWM idle state. It can be set to\n + 0 - PWM idles low.\n + 1 - PWM idles high. +*/ +#define TMR1_CFG_PWM0_IDLE_STATE (1u) + + +/*! PWM Match value. The value is used when the PWM is operating in match mode. + The PWM output is asserted when the Up/Down counter is equal to this match value. + PWM output is deasserted again when a timeout event occurs. + If the match value is never reached, or occurs simultaneous to a timeout event, + the PWM output remains idle. It can be any value from 0 to 65535. +*/ +#define TMR1_CFG_PWM0_MATCH_VALUE (0x08F9u) + +/*! @} */ + +/************************************************************* + GP Timer 2 Configuration + *************************************************************/ + + /** @addtogroup GPTimer2_Driver_Config GP Timer 2 Static Configuration + * @ingroup TMR_Driver_Config + * @{ + */ + + +/*! Count up or down. Used to control whether the timer increments (counts up) + or decrements (counts down) the Up/Down counter, it can be set to\n + 0 - Timer is set to count down.\n + 1 - Timer is set to count up. +*/ +#define TMR2_CFG_COUNT_UP (0u) + +/*! Timer mode. Used to control whether the timer runs in periodic or + free running mode, it can be set to\n + 0 - Timer is in free running mode.\n + 1 - Timer is in periodic mode. +*/ +#define TMR2_CFG_MODE (1u) + +/*! Prescale factor. Controls the prescaler division factor + to the timer's selected clock. It can be set to\n + + 0 - source_clock/[1 or 4]\n + 1 - source_clock/16\n + 2 - source_clock/64\n + 3 - source_clock/256 +*/ +#define TMR2_CFG_PRESCALE_FACTOR (0u) + +/*! Timer clock source. Used to select a timer clock from the four + available clock sources, it can be set to\n + 0 - Select PCLK\n + 1 - Select HFOSC\n + 2 - Select LFOSC\n + 3 - Select LFXTAL +*/ +#define TMR2_CFG_CLOCK_SOURCE (0u) + +/*! Timer load value. The Up/Down counter is periodically loaded with this + value if periodic mode is selected. LOAD writes during Up/Down counter timeout events + are delayed until the event has passed. It can be set to any value from 0 to 65535. + +*/ +#define TMR2_CFG_LOAD_VALUE (0x0E5Cu) + +/*! Timer asynchronous load value. The Up/Down counter is periodically loaded with + this value if periodic mode is selected. Writing Asynchronous Load value takes + advantage of having the timer run on PCLK by bypassing clock synchronization + logic otherwise required. It can be set to any value from 0 to 65535. + +*/ +#define TMR2_CFG_ASYNC_LOAD_VALUE (0x0E5Cu) + +/*! Reload control. This allows the user to select whether the Up/Down counter should be + reset only on a timeout event or also when interrupt is cleared. It can be set to\n + 0 - Up/down counter is only reset on a time out event.\n + 1 - Resets the up/down counter when the interrupt is cleared. +*/ +#define TMR2_CFG_ENABLE_RELOADING (0u) + +/*! Enable or disable Synchronization bypass\n + 0 - Disable Synchronization bypass.\n + 1 - Enable Synchronization bypass. +*/ +#define TMR2_CFG_ENABLE_SYNC_BYPASS (0u) + +/************************************************************* + GP Timer 2 Event Configuration + *************************************************************/ + +/*! Enable or disable event capture. It can be set to\n + 0 - Disable event capturing.\n + 1 - Enable event capturing. +*/ +#define TMR2_CFG_ENABLE_EVENT_CAPTURE (1u) + +/*! Enable or disable prescale reset\n + 0 - Disable rescale reset.\n + 1 - Enable rescale reset. +*/ +#define TMR2_CFG_ENABLE_PRESCALE_RESET (0u) + +/*! Event to be captured. One of the selected 40 events associated + with a general purpose time can be captured. It can be set to + a value of 0 - 39. Please refer hardware reference manual to know + which events can be captured by a particular GP timer. +*/ +#define TMR2_CFG_EVENT_CAPTURE (27u) + +/************************************************************* + GP Timer 2 PWM0 Configuration + *************************************************************/ + +/*! Timer PWM Enable Match. This will control PWM operation mode of the timer. + Toggle mode provides a 50% duty cycle and match mode provides a configurable + duty cycle by using the match value. This value can be set to\n + 0 - PWM in toggle mode.\n + 1 - PWM in match mode. +*/ +#define TMR2_CFG_ENABLE_PWM0_MATCH_MODE (1u) + + +/*! Timer PWM Idle state. This will control PWM idle state. It can be set to\n + 0 - PWM idles low.\n + 1 - PWM idles high. +*/ +#define TMR2_CFG_PWM0_IDLE_STATE (1u) + + +/*! PWM Match value. The value is used when the PWM is operating in match mode. + The PWM output is asserted when the Up/Down counter is equal to this match value. + PWM output is deasserted again when a timeout event occurs. + If the match value is never reached, or occurs simultaneous to a timeout event, + the PWM output remains idle. It can be any value from 0 to 65535. +*/ +#define TMR2_CFG_PWM0_MATCH_VALUE (0x02DFu) + +/*! @} */ + + +/************************************************************* + RGB Timer Configuration + *************************************************************/ + +/** @addtogroup RGBTimer_Driver_Config RGB Timer Static Configuration + * @ingroup TMR_Driver_Config + * @{ + */ + + +/*! Count up or down. Used to control whether the timer increments (counts up) + or decrements (counts down) the Up/Down counter, it can be set to\n + 0 - Timer is set to count down.\n + 1 - Timer is set to count up. +*/ +#define TMR3_CFG_COUNT_UP (0u) + +/*! Timer mode. Used to control whether the timer runs in periodic or + free running mode, it can be set to\n + 0 - Timer is in free running mode.\n + 1 - Timer is in periodic mode. +*/ +#define TMR3_CFG_MODE (1u) + +/*! Prescale factor. Controls the prescaler division factor + to the timer's selected clock. It can be set to\n + + 0 - source_clock/[1 or 4]\n + 1 - source_clock/16\n + 2 - source_clock/64\n + 3 - source_clock/256 +*/ +#define TMR3_CFG_PRESCALE_FACTOR (0u) + +/*! Timer clock source. Used to select a timer clock from the four + available clock sources, it can be set to\n + 0 - Select PCLK\n + 1 - Select HFOSC\n + 2 - Select LFOSC\n + 3 - Select LFXTAL +*/ +#define TMR3_CFG_CLOCK_SOURCE (0u) + +/*! Timer load value. The Up/Down counter is periodically loaded with this + value if periodic mode is selected. LOAD writes during Up/Down counter timeout events + are delayed until the event has passed. It can be set to any value from 0 to 65535. + +*/ +#define TMR3_CFG_LOAD_VALUE (0x47CEu) + +/*! Timer asynchronous load value. The Up/Down counter is periodically loaded with + this value if periodic mode is selected. Writing asynchronous Load value takes + advantage of having the timer run on PCLK by bypassing clock synchronization + logic otherwise required. It can be set to any value from 0 to 65535. + +*/ +#define TMR3_CFG_ASYNC_LOAD_VALUE (0x47CEu) + +/*! Reload control. This allows the user to select whether the Up/Down counter should be + reset only on a timeout event or also when interrupt is cleared. It can be set to\n + 0 - Up/down counter is only reset on a time out event.\n + 1 - Resets the up/down counter when the interrupt is cleared. +*/ +#define TMR3_CFG_ENABLE_RELOADING (0u) + +/*! Enable or disable Synchronization bypass\n + 0 - Disable Synchronization bypass.\n + 1 - Enable Synchronization bypass. +*/ +#define TMR3_CFG_ENABLE_SYNC_BYPASS (0u) + +/************************************************************* + RGB Timer Event Configuration + *************************************************************/ + +/*! Enable or disable event capture. It can be set to\n + 0 - Disable event capturing.\n + 1 - Enable event capturing. +*/ +#define TMR3_CFG_ENABLE_EVENT_CAPTURE (1u) + +/*! Enable or disable prescale reset\n + 0 - Disable rescale reset.\n + 1 - Enable rescale reset. +*/ +#define TMR3_CFG_ENABLE_PRESCALE_RESET (0u) + +/*! Event to be captured. One of the selected 40 events associated + with a general purpose time can be captured. It can be set to + a value of 0 - 39. Please refer hardware reference manual to know + which events can be captured by a particular GP timer. +*/ +#define TMR3_CFG_EVENT_CAPTURE (28u) + +/************************************************************* + RGB Timer PWM0 Configuration + *************************************************************/ + +/*! Timer PWM Enable Match. This will control PWM operation mode of the timer. + Toggle mode provides a 50% duty cycle and match mode provides a configurable + duty cycle by using the match value. This value can be set to\n + 0 - PWM in toggle mode.\n + 1 - PWM in match mode. +*/ +#define TMR3_CFG_ENABLE_PWM0_MATCH_MODE (1u) + + +/*! Timer PWM Idle state. This will control PWM idle state. It can be set to\n + 0 - PWM idles low.\n + 1 - PWM idles high. +*/ +#define TMR3_CFG_PWM0_IDLE_STATE (1u) + + +/*! PWM Match value. The value is used when the PWM is operating in match mode. + The PWM output is asserted when the Up/Down counter is equal to this match value. + PWM output is deasserted again when a timeout event occurs. + If the match value is never reached, or occurs simultaneous to a timeout event, + the PWM output remains idle. It can be any value from 0 to 65535. +*/ +#define TMR3_CFG_PWM0_MATCH_VALUE (0x23E7u) + +/************************************************************* + RGB Timer PWM1 Configuration + *************************************************************/ + +/*! Timer PWM Enable Match. This will control PWM operation mode of the timer. + Toggle mode provides a 50% duty cycle and match mode provides a configurable + duty cycle by using the match value. This value can be set to\n + 0 - PWM in toggle mode.\n + 1 - PWM in match mode. +*/ +#define TMR3_CFG_ENABLE_PWM1_MATCH_MODE (0u) + + +/*! Timer PWM Idle state. This will control PWM idle state. It can be set to\n + 0 - PWM idles low.\n + 1 - PWM idles high. +*/ +#define TMR3_CFG_PWM1_IDLE_STATE (0u) + + +/*! PWM Match value. The value is used when the PWM is operating in match mode. + The PWM output is asserted when the Up/Down counter is equal to this match value. + PWM output is deasserted again when a timeout event occurs. + If the match value is never reached, or occurs simultaneous to a timeout event, + the PWM output remains idle. It can be any value from 0 to 65535. +*/ +#define TMR3_CFG_PWM1_MATCH_VALUE (0u) + +/************************************************************* + RGB Timer PWM2 Configuration + *************************************************************/ + +/*! Timer PWM Enable Match. This will control PWM operation mode of the timer. + Toggle mode provides a 50% duty cycle and match mode provides a configurable + duty cycle by using the match value. This value can be set to\n + 0 - PWM in toggle mode.\n + 1 - PWM in match mode. +*/ +#define TMR3_CFG_ENABLE_PWM2_MATCH_MODE (0u) + + +/*! Timer PWM Idle state. This will control PWM idle state. It can be set to\n + 0 - PWM idles low.\n + 1 - PWM idles high. +*/ +#define TMR3_CFG_PWM2_IDLE_STATE (0u) + + +/*! PWM Match value. The value is used when the PWM is operating in match mode. + The PWM output is asserted when the Up/Down counter is equal to this match value. + PWM output is deasserted again when a timeout event occurs. + If the match value is never reached, or occurs simultaneous to a timeout event, + the PWM output remains idle. It can be any value from 0 to 65535. +*/ +#define TMR3_CFG_PWM2_MATCH_VALUE (0u) + +/*! @} */ + +/************************************************************* + GP Timer 0 Macro Validation +**************************************************************/ + +#if TMR0_CFG_COUNT_UP > 1u +#error "Invalid configuration" +#endif + +#if TMR0_CFG_MODE > 1u +#error "Invalid configuration" +#endif + +#if TMR0_CFG_PRESCALE_FACTOR > 3u +#error "Invalid configuration" +#endif + +#if TMR0_CFG_CLOCK_SOURCE > 3u +#error "Invalid configuration" +#endif + +#if TMR0_CFG_LOAD_VALUE > 0xFFFFu +#error "Invalid configuration" +#endif + +#if TMR0_CFG_ASYNC_LOAD_VALUE > 0xFFFFu +#error "Invalid configuration" +#endif + +#if TMR0_CFG_ENABLE_RELOADING > 1u +#error "Invalid configuration" +#endif + +#if TMR0_CFG_ENABLE_SYNC_BYPASS > 1u +#error "Invalid configuration" +#endif + +#if TMR0_CFG_ENABLE_PRESCALE_RESET > 1u +#error "Invalid configuration" +#endif + +#if TMR0_CFG_ENABLE_EVENT_CAPTURE > 1u +#error "Invalid configuration" +#endif + +#if TMR0_CFG_EVENT_CAPTURE > 39u +#error "Invalid configuration" +#endif + +#if TMR0_CFG_ENABLE_PWM0_MATCH_MODE > 1u +#error "Invalid configuration" +#endif + +#if TMR0_CFG_PWM0_IDLE_STATE > 1u +#error "Invalid configuration" +#endif + +#if TMR0_CFG_PWM0_MATCH_VALUE > 0xFFFFu +#error "Invalid configuration" +#endif + +/************************************************************* + GP Timer 1 Macro Validation +**************************************************************/ + +#if TMR1_CFG_COUNT_UP > 1u +#error "Invalid configuration" +#endif + +#if TMR1_CFG_MODE > 1u +#error "Invalid configuration" +#endif + +#if TMR1_CFG_PRESCALE_FACTOR > 3u +#error "Invalid configuration" +#endif + +#if TMR1_CFG_CLOCK_SOURCE > 3u +#error "Invalid configuration" +#endif + +#if TMR1_CFG_LOAD_VALUE > 0xFFFFu +#error "Invalid configuration" +#endif + +#if TMR1_CFG_ASYNC_LOAD_VALUE > 0xFFFFu +#error "Invalid configuration" +#endif + +#if TMR1_CFG_ENABLE_RELOADING > 1u +#error "Invalid configuration" +#endif + +#if TMR1_CFG_ENABLE_SYNC_BYPASS > 1u +#error "Invalid configuration" +#endif + +#if TMR1_CFG_ENABLE_PRESCALE_RESET > 1u +#error "Invalid configuration" +#endif + +#if TMR1_CFG_ENABLE_EVENT_CAPTURE > 1u +#error "Invalid configuration" +#endif + +#if TMR1_CFG_EVENT_CAPTURE > 39u +#error "Invalid configuration" +#endif + +#if TMR1_CFG_ENABLE_PWM0_MATCH_MODE > 1u +#error "Invalid configuration" +#endif + +#if TMR1_CFG_PWM0_IDLE_STATE > 1u +#error "Invalid configuration" +#endif + +#if TMR1_CFG_PWM0_MATCH_VALUE > 0xFFFFu +#error "Invalid configuration" +#endif + +/************************************************************* + GP Timer 2 Macro Validation +**************************************************************/ + +#if TMR2_CFG_COUNT_UP > 1u +#error "Invalid configuration" +#endif + +#if TMR2_CFG_MODE > 1u +#error "Invalid configuration" +#endif + +#if TMR2_CFG_PRESCALE_FACTOR > 3u +#error "Invalid configuration" +#endif + +#if TMR2_CFG_CLOCK_SOURCE > 3u +#error "Invalid configuration" +#endif + +#if TMR2_CFG_LOAD_VALUE > 0xFFFFu +#error "Invalid configuration" +#endif + +#if TMR2_CFG_ASYNC_LOAD_VALUE > 0xFFFFu +#error "Invalid configuration" +#endif + +#if TMR2_CFG_ENABLE_RELOADING > 1u +#error "Invalid configuration" +#endif + +#if TMR2_CFG_ENABLE_SYNC_BYPASS > 1u +#error "Invalid configuration" +#endif + +#if TMR2_CFG_ENABLE_PRESCALE_RESET > 1u +#error "Invalid configuration" +#endif + +#if TMR2_CFG_ENABLE_EVENT_CAPTURE > 1u +#error "Invalid configuration" +#endif + +#if TMR2_CFG_EVENT_CAPTURE > 39u +#error "Invalid configuration" +#endif + +#if TMR2_CFG_ENABLE_PWM0_MATCH_MODE > 1u +#error "Invalid configuration" +#endif + +#if TMR2_CFG_PWM0_IDLE_STATE > 1u +#error "Invalid configuration" +#endif + +#if TMR2_CFG_PWM0_MATCH_VALUE > 0xFFFFu +#error "Invalid configuration" +#endif + +/************************************************************* + RGB Timer Macro Validation +**************************************************************/ + +#if TMR3_CFG_COUNT_UP > 1u +#error "Invalid configuration" +#endif + +#if TMR3_CFG_MODE > 1u +#error "Invalid configuration" +#endif + +#if TMR3_CFG_PRESCALE_FACTOR > 3u +#error "Invalid configuration" +#endif + +#if TMR3_CFG_CLOCK_SOURCE > 3u +#error "Invalid configuration" +#endif + +#if TMR3_CFG_LOAD_VALUE > 0xFFFFu +#error "Invalid configuration" +#endif + +#if TMR3_CFG_ASYNC_LOAD_VALUE > 0xFFFFu +#error "Invalid configuration" +#endif + +#if TMR3_CFG_ENABLE_RELOADING > 1u +#error "Invalid configuration" +#endif + +#if TMR3_CFG_ENABLE_SYNC_BYPASS > 1u +#error "Invalid configuration" +#endif + +#if TMR3_CFG_ENABLE_PRESCALE_RESET > 1u +#error "Invalid configuration" +#endif + +#if TMR3_CFG_ENABLE_EVENT_CAPTURE > 1u +#error "Invalid configuration" +#endif + +#if TMR3_CFG_EVENT_CAPTURE > 39u +#error "Invalid configuration" +#endif + +#if TMR3_CFG_ENABLE_PWM0_MATCH_MODE > 1u +#error "Invalid configuration" +#endif + +#if TMR3_CFG_PWM0_IDLE_STATE > 1u +#error "Invalid configuration" +#endif + +#if TMR3_CFG_PWM0_MATCH_VALUE > 0xFFFFu +#error "Invalid configuration" +#endif + +#if TMR3_CFG_ENABLE_PWM1_MATCH_MODE > 1u +#error "Invalid configuration" +#endif + +#if TMR3_CFG_PWM1_IDLE_STATE > 1u +#error "Invalid configuration" +#endif + +#if TMR3_CFG_PWM1_MATCH_VALUE > 0xFFFFu +#error "Invalid configuration" +#endif + +#if TMR3_CFG_ENABLE_PWM2_MATCH_MODE > 1u +#error "Invalid configuration" +#endif + +#if TMR3_CFG_PWM2_IDLE_STATE > 1u +#error "Invalid configuration" +#endif + +#if TMR3_CFG_PWM2_MATCH_VALUE > 0xFFFFu +#error "Invalid configuration" +#endif + +/*! @} */ + + +#endif /* ADI_TMR_CONFIG_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_uart_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_uart_config.h new file mode 100755 index 0000000000..1cf72a4b91 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_uart_config.h @@ -0,0 +1,496 @@ +/*! + ***************************************************************************** + @file: adi_uart_config.h + @brief: Configuration options for UART driver. + This is specific to the UART driver and will be included by the driver. + It is not required for the application to include this header file. + ----------------------------------------------------------------------------- + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_UART_CONFIG_H +#define ADI_UART_CONFIG_H + +/** @addtogroup UART_Driver_Config Static Configuration + * @ingroup UART_Driver + * @{ + */ + + +#include + +/************** Common UART Driver configurations ************** */ +/*! + Enable the autobaud detection. \n + Range: 0 to 1. +*/ +#define ADI_UART_CFG_ENABLE_AUTOBAUD 1 + + +/** @addtogroup UART0_Driver_Config UART0 Static Configuration + * @ingroup UART_Driver_Config + * @{ + */ + +/************** UART Driver configurations FOR UART 0 ************** */ +/*! + Word length Select. \n + 0 - 5 Bits word length. \n + 1 - 6 Bits word length. \n + 2 - 7 Bits word length. \n + 3 - 8 Bits word length. +*/ +#define ADI_UART0_CFG_WORD_LENGTH 3 + + +/*! + Stop bit selection. \n + 0 - Send 1 stop bit regardless of the word length. \n + 1 - Send a number of stop bits based on the word length. \n + WORD-LENGTH 5 Bits => 1.5 Stop Bits. \n + WORD-LENGTH (6/7/8) Bits => 2 Stop Bits. +*/ +#define ADI_UART0_CFG_STOP_BIT 1 + + +/*! + Parity Enable. Used to control the parity bit. \n + 0 - Parity will not be transmitted or checked. \n + 1 - Parity will be transmitted and checked. +*/ +#define ADI_UART0_CFG_ENABLE_PARITY 0 + + +/*! + Parity Select. This bit only has meaning if parity is enabled. \n + 0 - Odd parity will be transmitted and checked. \n + 1 - Even parity will be transmitted and checked. +*/ +#define ADI_UART0_CFG_PARITY_SELECTION 0 + + +/*! + Stick Parity. Used to force parity to defined values. \n + 0 - Parity will not be forced. \n + 1 - Set parity based on the following bit settings: \n + EPS = 1 and PEN = 1, parity will be forced to 0. \n + EPS = 0 and PEN = 1, parity will be forced to 1. \n + EPS = 1/0 and PEN = 0, no parity will be transmitted. +*/ +#define ADI_UART0_CFG_ENABLE_STICKY_PARITY 0 + + +/* + Table 21-2: Baud Rate Examples Based on 26 MHz PCLK + Baud Rate OSR COMDIV DIVM DIVN + 9600 3 24 3 1078 + 19200 3 12 3 1078 + 38400 3 8 2 1321 + 57600 3 4 3 1078 + 115200 3 4 1 1563 + 230400 3 2 1 1563 + 460800 3 1 1 1563 + 921,600 2 1 1 1563 + 1,000,000 2 1 1 1280 + 1,500,000 2 1 1 171 + +These are calculated with the UarDivCalculator tool. +*/ + +/*! + Fractional baud rate N divide value. \n + Range: 0 to 2047. +*/ +#define ADI_UART0_CFG_DIVN 1078 + + +/*! + Fractional baud rate M divide value. \n + Range: 1 to 3. +*/ +#define ADI_UART0_CFG_DIVM 3 + + +/*! + Fractional baud rate C divide value. \n + Range: 1 to 65535. +*/ +#define ADI_UART0_CFG_DIVC 24 + + +/*! + Over Sample Rate value. \n + Range: 0 to 3. \n + 0 - Over sample by 4. \n + 1 - Over sample by 8. \n + 2 - Over sample by 16. \n + 3 - Over sample by 32. + +*/ +#define ADI_UART0_CFG_OSR 3 + + +/*! + Enable Internal FIFO. \n + Range: 0 to 1. +*/ +#define ADI_UART0_CFG_ENABLE_FIFO 1 + + +/*! + TRIG Level for UART device. \n + Range: 0 to 3. \n + 0 - 1 byte to trig RX interrupt. \n + 1 - 4 bytes to trig RX interrupt. \n + 2 - 8 bytes to trig RX interrupt. \n + 3 - 14 bytes to trig RX interrupt. +*/ +#define ADI_UART0_CFG_TRIG_LEVEL 0 + + +/*! + Hold TX while RX is active. \n + Range: 0 to 1. +*/ +#define ADI_UART0_CFG_HOLD_TX 0 + + +/*! + Disable RX when TX is active. \n + Range: 0 to 1. \n + 0 - 1 byte to trig RX interrupt. \n + 1 - 4 bytes to trig RX interrupt. +*/ +#define ADI_UART0_CFG_DISABLE_RX 0 + + +/*! + Configure the SOUT de-assertion earlier than full stop bit(s). \n + Range: 0 to 1. \n + 0 - SOUT_EN de-assert same time as full stop bit(s). \n + 1 - SOUT_EN de-assert half-bit earlier than full stop bit(s). +*/ +#define ADI_UART0_CFG_DEASSERTION 0 + + +/*! + Set the SOUT polarity low. \n + Range: 0 to 1. \n + 0 - Active high. \n + 1 - Active low. +*/ +#define ADI_UART0_CFG_SOUT_POLARITY 0 + +/*! + Enable the RX status interrupt. \n + Range: 0 to 1. +*/ +#define ADI_UART0_CFG_ENABLE_RX_STATUS_INTERRUPT 1 + + +/*! + Enable the Modem status interrupt. \n + Range: 0 to 1. +*/ +#define ADI_UART0_CFG_ENABLE_MODEM_STATUS_INTERRUPT 0 + +/*! @} */ + + +/*************** UART Driver configurations FOR UART 1 **************/ + +/** @addtogroup UART1_Driver_Config UART1 Static Configuration + * @ingroup UART_Driver_Config + * @{ + */ + +/*! + Word length Select. \n + 0 - 5 Bits word length. \n + 1 - 6 Bits word length. \n + 2 - 7 Bits word length. \n + 3 - 8 Bits word length. +*/ +#define ADI_UART1_CFG_WORD_LENGTH 3 + + +/*! + Stop bit selection.\n + 0 - Send 1 stop bit regardless of the word length. \n + 1 - Send a number of stop bits based on the word length. \n + WORD-LENGTH 5 Bits => 1.5 Stop Bits. \n + WORD-LENGTH (6/7/8) Bits => 2 Stop Bits. +*/ +#define ADI_UART1_CFG_STOP_BIT 1 + + +/*! + Parity Enable. Used to control the parity bit. \n + 0 - Parity will not be transmitted or checked. \n + 1 - Parity will be transmitted and checked. +*/ +#define ADI_UART1_CFG_ENABLE_PARITY 0 + + +/*! + Parity Select. This bit only has meaning if parity is enabled. \n + 0 - Odd parity will be transmitted and checked. \n + 1 - Even parity will be transmitted and checked. +*/ +#define ADI_UART1_CFG_PARITY_SELECTION 0 + + +/*! + Stick Parity. Used to force parity to defined values. \n + 0 - Parity will not be forced. \n + 1 - Set parity based on the following bit settings: \n + EPS = 1 and PEN = 1, parity will be forced to 0. \n + EPS = 0 and PEN = 1, parity will be forced to 1. \n + EPS = 1/0 and PEN = 0, no parity will be transmitted. +*/ +#define ADI_UART1_CFG_ENABLE_STICKY_PARITY 0 + + +/* + Table 21-2: Baud Rate Examples Based on 26 MHz PCLK + Baud Rate OSR COMDIV DIVM DIVN + 9600 3 24 3 1078 + 19200 3 12 3 1078 + 38400 3 8 2 1321 + 57600 3 4 3 1078 + 115200 3 4 1 1563 + 230400 3 2 1 1563 + 460800 3 1 1 1563 + 921,600 2 1 1 1563 + 1,000,000 2 1 1 1280 + 1,500,000 2 1 1 171 + +These are calculated with the UarDivCalculator tool. +*/ + +/*! + Fractional baud rate N divide value. \n + Range: 0 to 2047. +*/ +#define ADI_UART1_CFG_DIVN 1563 + + +/*! + Fractional baud rate M divide value. \n + Range: 1 to 3. +*/ +#define ADI_UART1_CFG_DIVM 1 + + +/*! + Fractional baud rate C divide value. \n + Range: 1 to 65535. +*/ +#define ADI_UART1_CFG_DIVC 1 + + +/*! + Over Sample Rate value. \n + Range: 0 to 3. \n + 0 - Over sample by 4. \n + 1 - Over sample by 8. \n + 2 - Over sample by 16. \n + 3 - Over sample by 32. + +*/ +#define ADI_UART1_CFG_OSR 3 + + +/*! + Enable Internal FIFO. \n + Range: 0 to 1. +*/ +#define ADI_UART1_CFG_ENABLE_FIFO 1 + + +/*! + TRIG Level for UART device. \n + Range: 0 to 3. \n + 0 - 1 byte to trig RX interrupt. \n + 1 - 4 bytes to trig RX interrupt. \n + 2 - 8 bytes to trig RX interrupt. \n + 3 - 14 bytes to trig RX interrupt. +*/ +#define ADI_UART1_CFG_TRIG_LEVEL 0 + + +/*! + Hold TX while RX is active. \n + Range: 0 to 1. +*/ +#define ADI_UART1_CFG_HOLD_TX 0 + + +/*! + Disable RX when TX is active. \n + Range: 0 to 1. \n + 0 - 1 byte to trig RX interrupt. \n + 1 - 4 bytes to trig RX interrupt. +*/ +#define ADI_UART1_CFG_DISABLE_RX 0 + + +/*! + Configure the SOUT de-assertion earlier than full stop bit(s). \n + Range: 0 to 1. \n + 0 - SOUT_EN de-assert same time as full stop bit(s). \n + 1 - SOUT_EN de-assert half-bit earlier than full stop bit(s). +*/ +#define ADI_UART1_CFG_DEASSERTION 0 + + +/*! + Set the SOUT polarity low. \n + Range: 0 to 1. \n + 0 - Active high. \n + 1 - Active low. +*/ +#define ADI_UART1_CFG_SOUT_POLARITY 0 + +/*! + Enable the RX status interrupt. \n + Range: 0 to 1. +*/ +#define ADI_UART1_CFG_ENABLE_RX_STATUS_INTERRUPT 1 + + +/*! + Enable the Modem status interrupt. \n + Range: 0 to 1. +*/ +#define ADI_UART1_CFG_ENABLE_MODEM_STATUS_INTERRUPT 0 +/*! @} */ + +/*! @} */ + + +/*************** UART Driver Debug Checks ************** */ + +/* Check word length */ +#if (((ADI_UART0_CFG_WORD_LENGTH < 0) || (ADI_UART0_CFG_WORD_LENGTH > 3)) || ((ADI_UART1_CFG_WORD_LENGTH < 0) || (ADI_UART1_CFG_WORD_LENGTH > 3))) +#error "Word length needs to be between 0 and 3" +#endif + +/* Check stop bit */ +#if (((ADI_UART0_CFG_STOP_BIT < 0) || (ADI_UART0_CFG_STOP_BIT > 1)) || ((ADI_UART1_CFG_STOP_BIT < 0) || (ADI_UART1_CFG_STOP_BIT > 1))) +#error "Stop bit selection needs to be 0 or 1" +#endif + +/* Check parity enable */ +#if (((ADI_UART0_CFG_ENABLE_PARITY < 0) || (ADI_UART0_CFG_ENABLE_PARITY > 1)) || ((ADI_UART1_CFG_ENABLE_PARITY < 0) || (ADI_UART1_CFG_ENABLE_PARITY > 1))) +#error "Parity Enable bit needs to be 0 or 1" +#endif + +/* Check parity select */ +#if (((ADI_UART0_CFG_PARITY_SELECTION < 0) || (ADI_UART0_CFG_PARITY_SELECTION > 1)) || ((ADI_UART1_CFG_PARITY_SELECTION < 0) || (ADI_UART1_CFG_PARITY_SELECTION > 1))) +#error "Parity bit selection needs to be 0 or 1" +#endif + +/* Check enable sticky parity */ +#if (((ADI_UART0_CFG_ENABLE_STICKY_PARITY < 0) || (ADI_UART0_CFG_ENABLE_STICKY_PARITY > 1)) || ((ADI_UART1_CFG_ENABLE_STICKY_PARITY < 0) || (ADI_UART1_CFG_ENABLE_STICKY_PARITY > 1))) +#error "Sticky parity enable needs to be 0 or 1" +#endif + +/* Check fractional baudrate N divider value */ +#if (((ADI_UART0_CFG_DIVN < 0) || (ADI_UART0_CFG_DIVN > 2047)) || ((ADI_UART1_CFG_DIVN < 0) || (ADI_UART1_CFG_DIVN > 2047))) +#error "Fractional baudrate N divider value needs to be between 0 and 2047" +#endif + +/* Check fractional baudrate M divider value */ +#if (((ADI_UART0_CFG_DIVM < 1) || (ADI_UART0_CFG_DIVM > 3)) || ((ADI_UART1_CFG_DIVM < 1) || (ADI_UART1_CFG_DIVM > 3))) +#error "Fractional baudrate M divider value needs to be between 1 and 3" +#endif + +/* Check fractional baudrate C divider value */ +#if (((ADI_UART0_CFG_DIVC < 1) || (ADI_UART0_CFG_DIVC > 65535)) || ((ADI_UART1_CFG_DIVC < 1) || (ADI_UART1_CFG_DIVC > 65535))) +#error "Fractional baudrate C divider value needs to be between 1 and 65535" +#endif + +/* Check over same rate value */ +#if (((ADI_UART0_CFG_OSR < 0) || (ADI_UART0_CFG_OSR > 3)) || ((ADI_UART1_CFG_OSR < 0) || (ADI_UART1_CFG_OSR > 3))) +#error "over sample rate value needs to be between 0 and 3" +#endif + +/* Check enable internal FIFO */ +#if (((ADI_UART0_CFG_ENABLE_FIFO < 0) || (ADI_UART0_CFG_ENABLE_FIFO > 1)) || ((ADI_UART1_CFG_ENABLE_FIFO < 0) || (ADI_UART1_CFG_ENABLE_FIFO > 1))) +#error "Enable internal FIFO needs to be 0 or 1" +#endif + +/* Check UART trig level */ +#if (((ADI_UART0_CFG_TRIG_LEVEL < 0) || (ADI_UART0_CFG_TRIG_LEVEL > 3)) || ((ADI_UART1_CFG_TRIG_LEVEL < 0) || (ADI_UART1_CFG_TRIG_LEVEL > 3))) +#error "Trig level for the UART device needs to be 0 or 1" +#endif + +/* Check value for holding tx while rx is active */ +#if (((ADI_UART0_CFG_HOLD_TX < 0) || (ADI_UART0_CFG_HOLD_TX > 1)) || ((ADI_UART1_CFG_HOLD_TX < 0) || (ADI_UART1_CFG_HOLD_TX > 1))) +#error "Value for holding Tx while Rx is active needs to be 0 or 1" +#endif + +/* Check value de-assertion */ +#if (((ADI_UART0_CFG_DEASSERTION < 0) || (ADI_UART0_CFG_DEASSERTION > 1)) || ((ADI_UART1_CFG_DEASSERTION < 0) || (ADI_UART1_CFG_DEASSERTION > 1))) +#error "Value for de-assertion needs to be 0 or 1" +#endif + +/* Check value for SOUT polarity */ +#if (((ADI_UART0_CFG_SOUT_POLARITY < 0) || (ADI_UART0_CFG_SOUT_POLARITY > 1)) || ((ADI_UART1_CFG_SOUT_POLARITY < 0) || (ADI_UART1_CFG_SOUT_POLARITY > 1))) +#error "Value for SOUT polarity needs to be 0 or 1" +#endif + +/* Check value to enable autobaud detection */ +#if ((ADI_UART_CFG_ENABLE_AUTOBAUD < 0) || (ADI_UART_CFG_ENABLE_AUTOBAUD > 1)) +#error "Value for autobaud enable needs to be 0 or 1" +#endif + +/* Check value to enable Rx status interrupt */ +#if (((ADI_UART0_CFG_ENABLE_RX_STATUS_INTERRUPT < 0) || (ADI_UART0_CFG_ENABLE_RX_STATUS_INTERRUPT > 1)) || ((ADI_UART1_CFG_ENABLE_RX_STATUS_INTERRUPT < 0) || (ADI_UART1_CFG_ENABLE_RX_STATUS_INTERRUPT > 1))) +#error "Value to enable Rx status interrupt needs to be 0 or 1" +#endif + +/* Check value to enable modem status interrupt */ +#if (((ADI_UART0_CFG_ENABLE_MODEM_STATUS_INTERRUPT < 0) || (ADI_UART0_CFG_ENABLE_MODEM_STATUS_INTERRUPT > 1)) || ((ADI_UART1_CFG_ENABLE_MODEM_STATUS_INTERRUPT < 0) || (ADI_UART1_CFG_ENABLE_MODEM_STATUS_INTERRUPT > 1))) +#error "Value to enable modem status interrupt needs to be 0 or 1" +#endif + +#endif /* ADI_UART_CONFIG_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_wdt_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_wdt_config.h new file mode 100755 index 0000000000..25e47a7850 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/config/adi_wdt_config.h @@ -0,0 +1,119 @@ +/*! ***************************************************************************** + * @file adi_wdt_config.h + * @brief WDT device driver configuration + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + + +#ifndef ADI_WDT_CONFIG_H +#define ADI_WDT_CONFIG_H + + +/** @addtogroup WDT_Driver_Config Static Configuration + * @ingroup WDT_Driver + * @{ + */ + + +/************* WDT Static Configuration ***************/ + +/*! WDT Timer Reload Value\n + Value used to reload the WDT count register after count expires.\n + 0-65535 - WDT reload value (default is 0x0100). +*/ +#define ADI_WDT_LOAD_VALUE (0x1000u) + +/*! WDT Timer Mode\n + Selects WDT operating mode.\n + 0 - WDT operates in free-running mode.\n + 1 - WDT operates in periodic mode (default). +*/ +#define ADI_WDT_CONTROL_TIMER_MODE (1u) + +/*! WDT Clock Prescaler\n + Controls WDT clock prescale.\n + 0 - WDT operates at (source clock)/1.\n + 1 - WDT operates at (source clock)/16.\n + 2 - WDT operates at (source clock)/256 (default).\n +*/ +#define ADI_WDT_CONTROL_CLOCK_PRESCALER (2u) + +/*! WDT Timeout Mode\n + Controls WDT timeout behaviour.\n + 0 - WDT issues RESET on timeout (default).\n + 1 - WDT issues INTERRUPT on timeout. +*/ +#define ADI_WDT_CONTROL_TIMEOUT_MODE (0u) + +/*! WDT Power Mode Disable\n + Controls WDT countdown in hibernate or halted mode.\n + 0 - WDT continues to count down when core is halted or in hibernate.\n + 1 - WDT pauses count down when core is halted or in hibernate (default).\n +*/ +#define ADI_WDT_CONTROL_POWER_MODE (1u) + +/************** Macro Validation *****************************/ + +#if ( ADI_WDT_LOAD_VALUE > 65535u ) +#error "Invalid configuration" +#endif + +#if ( ADI_WDT_CONTROL_TIMER_MODE > 1u ) +#error "Invalid configuration" +#endif + +#if ( ADI_WDT_CONTROL_CLOCK_PRESCALER > 2u ) +#error "Invalid configuration" +#endif + +#if ( ADI_WDT_CONTROL_TIMEOUT_MODE > 1u ) +#error "Invalid configuration" +#endif + +#if ( ADI_WDT_CONTROL_POWER_MODE > 1u ) +#error "Invalid configuration" +#endif + +/** + * @} + */ + +#endif /* ADI_WDT_CONFIG_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/crc/adi_crc.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/crc/adi_crc.c new file mode 100755 index 0000000000..4ea2233205 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/crc/adi_crc.c @@ -0,0 +1,1279 @@ +/*! **************************************************************************** + * @file: adi_crc.c + * @brief: CRC device driver global file. + * @details: This file contain the CRC device driver impelementation. + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#include +#include + + +/** @addtogroup CRC_Driver CRC Device Driver + * @{ + +@brief Cyclic Redundancy Check (CRC) peripheral driver +@details + +The CRC peripheral is used to perform the Cyclic Redundancy Check (CRC) of the +block of data that is presented to the peripheral. The peripheral provides a +means to periodically verify the integrity of the system memory and it is based +on a CRC32 engine that computes the signature of 32-bit data presented to the +hardware engine. CRC operations can be core driven or DMA driven depending on +static configuration. + + - #ADI_CRC_CFG_ENABLE_DMA_SUPPORT set to 0 defines a core driven CRC driver + - #ADI_CRC_CFG_ENABLE_DMA_SUPPORT set to a non 0 value defines a DMA driven + CRC driver + +Core driven CRC operations + +The adi_crc_Compute function executes core driven CRC operations to calculate the +CRC on the buffer input with the CRC parameters set in the driver. In this mode, +data in the submitted buffer is transmitted to the CRC directly by the core. + +Memory DMA driver CRC operations + +The adi_crc_Compute function executes DMA driven CRC operations to calculate the +CRC on the buffer input with the CRC parameters set in the driver. In this mode, +data in the submitted buffer is transmitted to the CRC through DMA transfers. + +The software DMA channel reserved for the CRC driver is defined by a macro, +ADI_CFG_CRC_SOFTWARE_DMA_CHANNEL_ID, which can take a value between 0 and 7. +If this macro is not defined, e.g. in a configuration file, then its value +is defaulted to 7: in this case, DMA channel SIP7 is used by the CRC driver +and DMA_SIP7_Int_Handler becomes the interrupt used by the DMA when a transfer +to the CRC is complete. + +Computing CRC + +The CRC engine performs a 32-bit CRC operation on the incoming data stream. + +Sequence of function calls for Computing CRC :\n + - #adi_crc_Open() to open CRC device and get a valid CRC handle. + - #adi_crc_SetPolynomialVal() to set the polynomial value to be used in CRC operations. + - #adi_crc_SetBitMirroring() to enable/disable bit mirroring + - #adi_crc_SetByteMirroring() to enable/disable byte mirroring + - #adi_crc_SetLSBFirst() to indicate if data is Big or Little Endian. + - #adi_crc_IsCrcInProgress() to poll the current status of CRC operation or + wait for callback event. + - #adi_crc_GetFinalCrcVal() to get the CRC value of the data stream if its + CRC value is unknown. (Note that #adi_crc_GetFinalCrcVal resets the CRC + seed to the #ADI_CFG_CRC_SEED_VALUE default value.) + + Note that using statically configured parameters such as + #ADI_CFG_CRC_ENABLE_BYTE_MIRRORING, #ADI_CFG_CRC_ENABLE_BIT_MIRRORING, + #ADI_CFG_CRC_POLYNOMIAL and #ADI_CFG_CRC_SEED_VALUE, functions + #adi_crc_SetBitMirroring, #adi_crc_SetByteMirroring, #adi_crc_SetPolynomialVal + and #adi_crc_SetBitMirroring don't need to be called explicitly in your + application: the parameters will be assigned when opening the driver. + + @note - The application must include drivers/crc/adi_crc.h to use this driver. + @note - This driver also requires the DMA driver. The application must include + the DMA driver sources to avoid link errors. + */ + +/*! \cond PRIVATE */ +/*============= I N C L U D E S =============*/ + +#include +#include +#include "adi_crc_def.h" + +/*============= M I S R A =============*/ + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm123 (rule 8.5): there shall be no definition of objects or functions in a header file +* This isn't a header as such. +* +* Pm088 (rule 17.4): pointer arithmetic should not be used. +* Pm152 (rule 17.4): array indexing shall only be applied to objects defined as an array type +* Relying on pointer arithmetic for buffer handling. +* +* Pm140 (rule 11.3): a cast should not be performed between a pointer type and an integral type +* Casts from pointer to uint32_t needed to determine pointer alignment. +*/ +#pragma diag_suppress=Pm123,Pm088,Pm152,Pm140 +#endif /* __ICCARM__ */ + +/*============== D E F I N E S ===============*/ + +/* CRC Peripheral specific information */ +#define ADI_CRC_NUM_DEVICES (1u) + +/*! \endcond */ + +#if (ADI_CRC_CFG_ENABLE_DMA_SUPPORT != 0) + +/** + * If a DMA channel has not been configured for the CRC driver, +* then a default software DMA channel is assigned: SIP7. + */ + +#ifndef ADI_CFG_CRC_SOFTWARE_DMA_CHANNEL_ID +#define ADI_CFG_CRC_SOFTWARE_DMA_CHANNEL_ID 7 +#pragma message("ADI_CFG_CRC_SOFTWARE_DMA_CHANNEL_ID implicitly defaulted to 7!") +#endif + +/** + * The following macros define + * - the Software DMA channel identifier to be used in CRC DMA driven operations + * - the ISR used by the CRC, which depends on the Software DMA channel + * selected to drive the CRC in DMA driven CRC operations. + * - the interrupt identifier mapped to the software DMA channel; selected for + * the CRC operations + */ +#if (ADI_CFG_CRC_SOFTWARE_DMA_CHANNEL_ID == 0) +#define ADI_CFG_CRC_DMA_CHANNEL SIP0_CHANn +#define ADI_DMA_CRC_ISR DMA_SIP0_Int_Handler +#define ADI_CRC_IRQ_ID DMA0_CH16_DONE_IRQn +#elif (ADI_CFG_CRC_SOFTWARE_DMA_CHANNEL_ID == 1) +#define ADI_CFG_CRC_DMA_CHANNEL SIP1_CHANn +#define ADI_DMA_CRC_ISR DMA_SIP1_Int_Handler +#define ADI_CRC_IRQ_ID DMA0_CH17_DONE_IRQn +#elif (ADI_CFG_CRC_SOFTWARE_DMA_CHANNEL_ID == 2) +#define ADI_CFG_CRC_DMA_CHANNEL SIP2_CHANn +#define ADI_DMA_CRC_ISR DMA_SIP2_Int_Handler +#define ADI_CRC_IRQ_ID DMA0_CH18_DONE_IRQn +#elif (ADI_CFG_CRC_SOFTWARE_DMA_CHANNEL_ID == 3) +#define ADI_CFG_CRC_DMA_CHANNEL SIP3_CHANn +#define ADI_DMA_CRC_ISR DMA_SIP3_Int_Handler +#define ADI_CRC_IRQ_ID DMA0_CH19_DONE_IRQn +#elif (ADI_CFG_CRC_SOFTWARE_DMA_CHANNEL_ID == 4) +#define ADI_CFG_CRC_DMA_CHANNEL SIP4_CHANn +#define ADI_DMA_CRC_ISR DMA_SIP4_Int_Handler +#define ADI_CRC_IRQ_ID DMA0_CH20_DONE_IRQn +#elif (ADI_CFG_CRC_SOFTWARE_DMA_CHANNEL_ID == 5) +#define ADI_CFG_CRC_DMA_CHANNEL SIP5_CHANn +#define ADI_DMA_CRC_ISR DMA_SIP5_Int_Handler +#define ADI_CRC_IRQ_ID DMA0_CH21_DONE_IRQn +#elif (ADI_CFG_CRC_SOFTWARE_DMA_CHANNEL_ID == 6) +#define ADI_CFG_CRC_DMA_CHANNEL SIP6_CHANn +#define ADI_DMA_CRC_ISR DMA_SIP6_Int_Handler +#define ADI_CRC_IRQ_ID DMA0_CH22_DONE_IRQn +#elif (ADI_CFG_CRC_SOFTWARE_DMA_CHANNEL_ID == 7) +#define ADI_CFG_CRC_DMA_CHANNEL SIP7_CHANn +#define ADI_DMA_CRC_ISR DMA_SIP7_Int_Handler +#define ADI_CRC_IRQ_ID DMA0_CH23_DONE_IRQn +#else +#error "Invalid Software DMA channel identifier ADI_CFG_CRC_SOFTWARE_DMA_CHANNEL_ID: it must be between 0 and 7" +#endif + +#endif /* ADI_CRC_CFG_ENABLE_DMA_SUPPORT */ + +/*! \cond PRIVATE */ + +/** Check the validity of a CRC device identifier */ +#define ADI_CRC_VALID_DEVICE_ID(DEVNUM) ((DEVNUM)<(ADI_CRC_NUM_DEVICES)) + +/** Check that a CRC driver is in idle state */ +#define ADI_CRC_DEVICE_IS_IDLE(DEV) (((DEV)->eCrcOpStatus == ADI_CRC_OP_IDLE) ? true : false) + +/*============== D A T A ===============*/ + +/** + * Information for managing all the CRC devices available + */ +static ADI_CRC_INFO crc_device_info[ADI_CRC_NUM_DEVICES] = +{ + { pADI_CRC0, NULL } /* CRC 0 */ +}; + +/*============== M O R E D E F I N E S ===============*/ + +/** Check the validity of a CRC handle for debug mode */ +#define ADI_CRC_INVALID_HANDLE(h) ((NULL == (h)) || (crc_device_info[0].hDevice != (h))) + +/** Condition used to indicate if a CRC driver is already in use */ +#define ADI_CRC_DEVICE_IN_USE(DEVNUM) ((NULL) != crc_device_info[(DEVNUM)].hDevice) + +#ifdef ADI_DEBUG +#define HDL_TO_DEVICE_PTR(HDL) ((ADI_CRC_INVALID_HANDLE(HDL)) ? (NULL) : ((ADI_CRC_DEVICE*) (HDL))) +#else +#define HDL_TO_DEVICE_PTR(HDL) ((ADI_CRC_DEVICE*) (HDL)) +#endif + +/*============= C O D E =============*/ + +#if (ADI_CRC_NUM_DEVICES!=1u) +#error "!!! Current CRC driver implementation can deal with a unique CRC instance !!!" +#endif + +/*============= L O C A L F U N C T I O N S =============*/ + +/* Prototypes for static functions (required by MISRA-C:2004 Rule 8.1) */ + +static ADI_CRC_INFO *crc_DeviceInfo(ADI_CRC_HANDLE hDevice); + +static void crc_ResetRegisters (ADI_CRC_DEVICE *pDevice); + +#if (ADI_CRC_CFG_ENABLE_DMA_SUPPORT == 0) + +/* Functions specific to core driven CRC operations */ + +static ADI_CRC_RESULT crc_ExecuteCoreDrivenOperation (ADI_CRC_DEVICE *pDevice, void *pCrcBuf, uint32_t NumBytes, uint32_t NumBits); + +#else + +/* Functions specific to DMA driven CRC operations */ + +static ADI_CRC_RESULT crc_ExecuteDmaDrivenOperation(ADI_CRC_DEVICE *pDevice, void *pCrcBuf, uint32_t NumBytes, uint32_t NumBits); +static void crc_CalculateCrcForRemaining(ADI_CRC_DEVICE *pDevice, uint8_t *pData, uint32_t NumBytes, uint32_t NumBits); +static void CRC_Callback_For_DMA_Err_Int_Handler(void *pcbparam, uint32_t nEvent, void *pArg); +void ADI_DMA_CRC_ISR(void); + +#endif /* ADI_CRC_CFG_ENABLE_DMA_SUPPORT */ + + +/** + * @brief return a pointer to the CRC device information mapped to the CRC + * device identified by a handle + * + * @param [in] hDevice CRC device handle + * + * @return pointer to CRC device information identified by hDevice + * (NULL if the CRC device handle is invalid) + */ +static ADI_CRC_INFO *crc_DeviceInfo(ADI_CRC_HANDLE hDevice) +{ + ADI_CRC_INFO *pCrcInfo = (ADI_CRC_INVALID_HANDLE(hDevice)) + ? NULL + : (&(crc_device_info[0])); + return pCrcInfo; +} + + +/** + * @brief Reset CRC registers to default values + * + * @details Reset CRC registers to default values as defined in configuration. + * + * @param [in] pDevice Pointer to CRC device + * + * @return None + */ +static void crc_ResetRegisters(ADI_CRC_DEVICE *pDevice) +{ + /* Cast the values to be assigned to the targetted types */ + const uint32_t byte_mirroring_val = (uint32_t) ADI_CFG_CRC_ENABLE_BYTE_MIRRORING; + const uint32_t byte_mirroring_pos = (uint32_t) BITP_CRC_CTL_BYTMIRR; + const uint32_t bit_mirroring_val = (uint32_t) ADI_CFG_CRC_ENABLE_BIT_MIRRORING; + const uint32_t bit_mirroring_pos = (uint32_t) BITP_CRC_CTL_BITMIRR; + const uint32_t seed_value = (uint32_t) ADI_CFG_CRC_SEED_VALUE; + const uint32_t polynomial = (uint32_t) ADI_CFG_CRC_POLYNOMIAL; + + /* Set byte mirroring and bit mirroring in CTL register as configured */ + pDevice->pReg->CTL = ( (byte_mirroring_val << byte_mirroring_pos) + | (bit_mirroring_val << bit_mirroring_pos) + ); + pDevice->pReg->RESULT = seed_value; + pDevice->pReg->POLY = polynomial; +} + +#if (ADI_CRC_CFG_ENABLE_DMA_SUPPORT == 0) + +/* + * @brief Starts core driven CRC operation. + * + * @param [in] pDevice Pointer to CRC device + * @param [in] pCrcBuf Address of data buffer. + * @param [in] NumBytes Number of bytes in data buffer. + * @param [in] NumBits Number of bits, 0 to 7, in the last partial byte + * in CRC data buffer + * + * @return Status + * - ADI_CRC_SUCCESS: Successfully set expected CRC result. + */ +static ADI_CRC_RESULT crc_ExecuteCoreDrivenOperation( + ADI_CRC_DEVICE *pDevice, + void *pCrcBuf, + uint32_t NumBytes, + uint32_t NumBits) +{ + ADI_CRC_RESULT result = ADI_CRC_SUCCESS; + uint8_t *pData = (uint8_t *)pCrcBuf; /* initialize the pointer to data to the start of the data buffer */ + uint32_t lsbFirst = pDevice->pReg->CTL & BITM_CRC_CTL_LSBFIRST; + + pDevice->pReg->CTL |= (BITM_CRC_CTL_EN); /*! enable CRC peripheral */ + + if (((uint32_t)pData & 0x3u) != 0u) /* If the buffer is not 4-byte aligned */ + { + /* feed the CRC byte per byte as long as there are data in the input buffer AND + * the data left in the buffer are not 4-byte aligned */ + while ((NumBytes > 0u) && (((uint32_t)pData & 0x3u) != 0u)) + { + pDevice->pReg->IPBYTE = *pData; /* feed the CRC with the first byte in the buffer */ + pData++; /* get the next byte to feed into CRC */ + NumBytes--; /* decrease the number of bytes to be processed */ + } + } + + /* data left in the input buffer are now 4-byte aligned */ + + while (NumBytes >= 4u) /* if the number of bytes left is greater than 4 bytes */ + { /* feed CRC peripheral with 4-byte data */ + uint32_t nData; /* 32-bit variable to be used to feed the CRC peripheral */ + + /* + * Here we assume memory is little endian. We need change the following + * code if we produce a Cortex-M processor with big endian memory. + */ + if (lsbFirst != 0u) + { + nData = pData[3]; + nData = (nData << 8) | pData[2]; + nData = (nData << 8) | pData[1]; + nData = (nData << 8) | pData[0]; + } + else + { + nData = pData[0]; + nData = (nData << 8) | pData[1]; + nData = (nData << 8) | pData[2]; + nData = (nData << 8) | pData[3]; + } + pDevice->pReg->IPDATA = nData; /* feed the CRC peripheral with 32-bit data input */ + pData += 4; /* move the data pointer in the data buffer */ + NumBytes -= 4u; /* decrease the number of data to be processed */ + } + + while (NumBytes > 0u) /* if the number of data left in the input buffer is smaller than 4 */ + { + pDevice->pReg->IPBYTE = *pData; /* feed the CRC peripheral with the remaining bytes */ + pData++; /* move the pointer to the next byte in input data buffer */ + NumBytes--; /* decrease the number of data to be fed into the CRC peripheral */ + } + + if (NumBits > 0u) /* if the last byte is a partial byte containing less than 8 bits */ + { + pDevice->pReg->IPBITS[NumBits] = *pData;/* feed the CRC peripheral with the remaining bits (use IPBITS[N] to feed N bits) */ + } + + pDevice->pReg->CTL &= ~(BITM_CRC_CTL_EN); /* All the data have been fed into the CRC peripheral : disable it */ + pDevice->eCrcOpStatus = ADI_CRC_OP_IDLE; /* CRC back in idle state */ + return result; +} + +#else /* ADI_CRC_CFG_ENABLE_DMA_SUPPORT */ + +/** + * @brief Send a Memory DMA request to the CRC, which triggers a DMA driven + * CRC operation. + * + * @param [in] pDevice Pointer to CRC device + * @param [in] pCrcBuf Address of data buffer. + * @param [in] NumBytes Number of whole bytes in data buffer. + * @param [in] NumBits Number of bits, 0 to 7, in the last partial byte + * in CRC data buffer + * + * @return Status + * - #ADI_CRC_SUCCESS: Successfully set expected CRC result. + * - #ADI_CRC_INVALID_DMA_CHANNEL: DMA channel cannot be used with CRC + */ +static ADI_CRC_RESULT crc_ExecuteDmaDrivenOperation( + ADI_CRC_DEVICE *pDevice, + void *pCrcBuf, + uint32_t NumBytes, + uint32_t NumBits) +{ + ADI_CRC_RESULT result = ADI_CRC_SUCCESS; + uint8_t *pData = (uint8_t *)pCrcBuf; + bool bUseDma = false; /* assume core driven CRC by default */ + +#ifdef ADI_DEBUG + if (!ADI_CRC_VALID_DMA_CHANNEL(ADI_CFG_CRC_DMA_CHANNEL)) + { + /* Report error as Memory DMA not open */ + result = ADI_CRC_INVALID_DMA_CHANNEL; + } + else +#endif /* ADI_DEBUG */ + { + /* If LSBFIRST, it's easy. */ + if ((pDevice->pReg->CTL & BITM_CRC_CTL_LSBFIRST) != 0u) + { + /* If the buffer is not 4-byte aligned */ + if (((uint32_t)pData & 0x3u) != 0u) + { + /* process the first bytes until a 4-byte aligned data location is reached */ + pDevice->pReg->CTL |= (BITM_CRC_CTL_EN); /* enable CRC */ + while ((NumBytes > 0u) && (((uint32_t)pData & 0x3u) != 0u)) + { + pDevice->pReg->IPBYTE = *pData; /* feed byte into CRC */ + pData++; /* get to the next byte */ + NumBytes--; /* decrease the number of bytes still to be processed */ + } + pDevice->pReg->CTL &= ~(BITM_CRC_CTL_EN); /* disable CRC */ + } + + /* 4-byte aligned data transfer */ + if (NumBytes >= 4u) + { + /* there are enough data for kicking off a DMA driven CRC operation */ + const uint32_t channelId = (uint32_t) ADI_CFG_CRC_DMA_CHANNEL; + const uint32_t channelBit = 1ul << channelId; /* get a value with the bit set at position identified by channelId */ + const uint32_t numData = NumBytes / 4u; /* number of 4-byte data to be transferred */ + const uint32_t src = (uint32_t) pData; /* DMA source address */ + const uint32_t dst = (uint32_t) &pDevice->pReg->IPDATA; /* destination is CRC IPDATA 32-bit register */ + const uint32_t numTransData = ( (numData > DMA_TRANSFER_LIMIT) + ? DMA_TRANSFER_LIMIT + : numData + ); + const uint32_t numTransBytes = (numTransData << 2u); + const uint32_t lastDataPos = (numTransBytes - 4u); /* position of last 32-bit data to be transferred in current DMA request */ + + pDevice->pReg->CTL |= ((uint32_t) BITM_CRC_CTL_EN); /* enable CRC (leave other bits unmodified) */ + + pADI_DMA0->EN_SET = channelBit; /* Enable the channel */ + pADI_DMA0->ALT_CLR = channelBit; /* Set the primary as the current DMA descriptor */ + pADI_DMA0->SRCADDR_CLR = channelBit; /* Ensure decrement for source is cleared */ + pADI_DMA0->DSTADDR_CLR = channelBit; /* Ensure decrement for destination is cleared */ + + pPrimaryCCD[channelId].DMADSTEND = dst; /* destination is CRC IPDATA 32-bit register */ + pPrimaryCCD[channelId].DMASRCEND = src + lastDataPos; /* source end address */ + + pPrimaryCCD[channelId].DMACDC = + ( (((uint32_t) ADI_DMA_INCR_NONE) << ((uint32_t) DMA_BITP_CTL_DST_INC)) /* destination address not incremented */ + | (((uint32_t) ADI_DMA_INCR_4_BYTE) << ((uint32_t) DMA_BITP_CTL_SRC_INC)) /* source address incremented by 4 bytes */ + | (((uint32_t) ADI_DMA_WIDTH_4_BYTE) << ((uint32_t) DMA_BITP_CTL_SRC_SIZE)) /* source data size is 4-byte */ + | ((numTransData - 1u) << ((uint32_t) DMA_BITP_CTL_N_MINUS_1))/* number of DMA transfers (minus 1) */ + | (DMA_ENUM_CTL_CYCLE_CTL_AUTO_REQ << DMA_BITP_CTL_CYCLE_CTL) /* DMA Auto Request transmission */ + ); + pDevice->pRemainingData = (void*)(src + numTransBytes); /* remaining data start address */ + pDevice->RemainingBytes = NumBytes - numTransBytes; /* remaining bytes that cannot be processed in this DMA batch */ + pDevice->RemainingBits = NumBits; /* remaining bits if last byte is a partial byte */ + bUseDma = true; /* there are enough data to run 4-byte DMA transfers to CRC */ + } + } + /* + * If ! LSBFIRST, we need the DMA controller support byte swap for fixed destination address. + * But we don't have such luck, although it supports byte swap for fixed source address. + * So we have to set DMA size to one byte, which is slower. + * + * Another option is using mirroring feature of CRC unit, which would be more complicated. + */ + else + { + if (NumBytes > 0u) + { + /** + * There are enough data for kicking off a DMA driven CRC operation. + * DMA transfers are limited to 1024 bytes : if the buffer is larger + * than 1024 then generate repeated DMA request through the CRC DMA + * interrupt handler, i.e. the interrupt handler used by the software + * DMA channel driving the CRC operations. + */ + const uint32_t channelId = (uint32_t) ADI_CFG_CRC_DMA_CHANNEL; + const uint32_t channelBit = 1ul << channelId; /* get a value with the bit set at position identified by channelId */ + const uint32_t src = (uint32_t) pData; /* DMA source address */ + const uint32_t dst = (uint32_t) &pDevice->pReg->IPBYTE; /* destination is CRC IPBYTE 8-bit register */ + const uint32_t numTransData = ( (NumBytes > DMA_TRANSFER_LIMIT) + ? DMA_TRANSFER_LIMIT + : NumBytes + ); + const uint32_t lastDataPos = (numTransData - 1u); /* position of last data to be transferred in buffer */ + + pDevice->pReg->CTL |= (BITM_CRC_CTL_EN); /* enable CRC (leave other bits unmodified) */ + + pADI_DMA0->EN_SET = channelBit; /* Enable the channel */ + pADI_DMA0->ALT_CLR = channelBit; /* Set the primary as the current DMA descriptor */ + pADI_DMA0->SRCADDR_CLR = channelBit; /* Ensure decrement for source is cleared */ + pADI_DMA0->DSTADDR_CLR = channelBit; /* Ensure decrement for destination is cleared */ + + pPrimaryCCD[channelId].DMADSTEND = dst; /* destination is CRC IPBYTE 8-bit register */ + pPrimaryCCD[channelId].DMASRCEND = src + lastDataPos; /* source end address */ + pPrimaryCCD[channelId].DMACDC = + ( (((uint32_t) ADI_DMA_INCR_NONE) << ((uint32_t) DMA_BITP_CTL_DST_INC)) /* destination address not incremented */ + | (((uint32_t) ADI_DMA_INCR_1_BYTE) << ((uint32_t) DMA_BITP_CTL_SRC_INC)) /* source address incremented by 1 byte */ + | (((uint32_t) ADI_DMA_WIDTH_1_BYTE) << ((uint32_t) DMA_BITP_CTL_SRC_SIZE)) /* source data size is 1-byte */ + | ((numTransData - 1u) << ((uint32_t) DMA_BITP_CTL_N_MINUS_1))/* number of DMA transfers (minus 1) */ + | (DMA_ENUM_CTL_CYCLE_CTL_AUTO_REQ << DMA_BITP_CTL_CYCLE_CTL) /* DMA Auto Request transmission */ + ); + pDevice->pRemainingData = (void*) (src + numTransData); /* remaining data start address */ + pDevice->RemainingBytes = NumBytes - numTransData; /* remaining bytes */ + pDevice->RemainingBits = NumBits; /* remaining bits if last byte is a partial byte */ + bUseDma = true; /* there are enough data to run 4-byte DMA transfers to CRC */ + } + } + + /* if we are in a position to use the DMA to transfer data to the CRC */ + if (bUseDma== true) + { + const uint32_t channelId = (uint32_t) ADI_CFG_CRC_DMA_CHANNEL; + const uint32_t channelBit = 1ul << channelId; /* get a value with the bit set at position identified by channelId */ + pADI_DMA0->SWREQ = channelBit; /* Issue a software DMA request */ + } + else + { + pDevice->pReg->CTL |= (BITM_CRC_CTL_EN); + crc_CalculateCrcForRemaining(pDevice, pData, NumBytes, NumBits); + pDevice->pReg->CTL &= ~(BITM_CRC_CTL_EN); + if(pDevice->pfCallback != NULL) + { + pDevice->pfCallback(pDevice->pCBParam, (uint32_t) ADI_CRC_EVENT_BUFFER_PROCESSED, pData); + } + pDevice->eCrcOpStatus = ADI_CRC_OP_IDLE; /* CRC calculation completed */ + } + } + return result; +} + +/** + * @brief Completes a DMA driven CRC operation by dealing with remaining + * data, usually when the number of bytes left is smaller than 4. + * + * @param [in] pDevice Pointer to CRC device + * @param [in] pData Address of data buffer. + * @param [in] NumBytes Number of whole bytes in data buffer. + * @param [in] NumBits Number of bits, 0 to 7, in the last partial byte + * in CRC data buffer + */ +static void crc_CalculateCrcForRemaining(ADI_CRC_DEVICE *pDevice, uint8_t *pData, uint32_t NumBytes, uint32_t NumBits) +{ + /* process the remaining bytes */ + while (NumBytes > 0u) + { + pDevice->pReg->IPBYTE = *pData; + pData++; + NumBytes--; + } + + /* process the remaining bits in the last byte if the number of bits is smaller than 8 */ + if (NumBits > 0u) + { + pDevice->pReg->IPBITS[NumBits] = *pData; + } +} + +/** + * @brief Callback function used by the DMA when a DMA error occurs + * + * @details Callback function used by the DMA when a DMA error must be reported + * to the CRC driver because it affects the DMA channel driving the CRC. + */ +static void CRC_Callback_For_DMA_Err_Int_Handler(void *pcbparam, uint32_t nEvent, void *pArg) +{ + ADI_CRC_DEVICE *pDevice = HDL_TO_DEVICE_PTR(pcbparam); + + if (NULL != pDevice) + { + /* DMA error detected */ + pDevice->eCrcOpStatus = ADI_CRC_OP_IDLE; /* mark the CRC peripheral as IDLE */ + pDevice->pReg->CTL &= (uint32_t)(~(BITM_CRC_CTL_EN)); /* disable CRC peripheral */ + } +} + +/** + * @brief interrupt handler used by the software DMA channel driving the CRC + * + * @details interrupt handler used by the software DMA channel driving the CRC + * ADI_DMA_CRC_ISR is a macro with the final interrupt handler name + * being DMA_SIP0_Int_Handler, ..., DMA_SIP7_Int_Handler, depending + * on the software DMA channel driving the CRC. + */ +void ADI_DMA_CRC_ISR(void) +{ + ISR_PROLOG(); + + if (ADI_CRC_DEVICE_IN_USE(0)) + { + ADI_CRC_DEVICE * pDevice = HDL_TO_DEVICE_PTR(crc_device_info[0].hDevice); + if (NULL != pDevice) + { + uint8_t *pData = (uint8_t *)(pDevice->pRemainingData); + uint32_t NumBytes = pDevice->RemainingBytes; + uint32_t NumBits = pDevice->RemainingBits; + bool finishing = (NumBytes < 4u); + + if (!finishing) + { + /* there's enough data left for another DMA transfer */ + ADI_CRC_RESULT result = pDevice->pfSubmitBuffer(pDevice, pData, NumBytes, NumBits); + if (ADI_CRC_SUCCESS != result) + { + /* buffer submission failed: complete the task through core driven operations */ + finishing = true; + } + } + + if (finishing) + { + /* There are a very few bytes/bits left to be processed or + * a DMA transfer request could not be sent */ + crc_CalculateCrcForRemaining(pDevice, pData, NumBytes, NumBits); + + /* if a callback function is registered with the interrupt handler + * associated with the software DMA channel driving the CRC */ + if(pDevice->pfCallback != NULL) + { + pDevice->pfCallback(pDevice->pCBParam, (uint32_t) ADI_CRC_EVENT_BUFFER_PROCESSED, NULL); + } + pDevice->eCrcOpStatus = ADI_CRC_OP_IDLE; /* CRC back in idle state */ + + } + } + } + +#if defined(ADI_CYCLECOUNT_CRC_ISR_ENABLED) && (ADI_CYCLECOUNT_CRC_ISR_ENABLED == 1u) + ADI_CYCLECOUNT_STORE(ADI_CYCLECOUNT_ISR_CRC); +#endif + + ISR_EPILOG(); +} + +#endif /* ADI_CRC_CFG_ENABLE_DMA_SUPPORT */ + +/*! \endcond */ + +/*============= P U B L I C F U N C T I O N S =============*/ + +/** + * @brief Opens a CRC device instance. + * + * @param [in] DeviceNum Number identifying the CRC Device to open. + * @param [in] pMemory Pointer to a #ADI_CRC_MEMORY_SIZE. + * sized buffer to manage the device instance. + * @param [in] MemorySize Size of the buffer to which "pMemory" points. + * @param [out] phDevice Pointer to a location where CRC device handle to be written. + * + * @return Status + * - #ADI_CRC_SUCCESS: Successfully opened a CRC device. + * - #ADI_CRC_BAD_DEVICE_NUMBER [D]: Supplied CRC Device ID is invalid. + * - #ADI_CRC_IN_USE [D]: Supplied CRC Device ID is already in use. + * - #ADI_CRC_INSUFFICIENT_MEMORY [D]: Supplied memory is not sufficient to handle a CRC device instance. + * - #ADI_CRC_FAILURE [D]: callback registration failed for CRC function used by DMA Error Interrupt Handler. + * + * @note For the device memory should be of size #ADI_CRC_MEMORY_SIZE. + * + */ +ADI_CRC_RESULT adi_crc_Open( + uint32_t DeviceNum, + void *pMemory, + uint32_t MemorySize, + ADI_CRC_HANDLE *phDevice) +{ + ADI_CRC_RESULT result = ADI_CRC_SUCCESS; + ADI_CRC_DEVICE *pDevice = (ADI_CRC_DEVICE*) pMemory;/* memory block to be used to manage a CRC driver instance */ + +#ifdef ADI_DEBUG /* IF (Debug information enabled) */ + if (!ADI_CRC_VALID_DEVICE_ID(DeviceNum)) /* IF (This is not a valid CRC device number) */ + { + result = ADI_CRC_BAD_DEVICE_NUMBER; /* Report failure as bad device number */ + } + else if (ADI_CRC_DEVICE_IN_USE(DeviceNum)) /* IF (The device is in use) */ + { + result = ADI_CRC_IN_USE; /* return CRC Device in use error */ + } + else if ( (MemorySize < ADI_CRC_MEMORY_SIZE) /* IF (Supplied memory size is insufficient) */ + || (ADI_CRC_MEMORY_SIZE < sizeof(ADI_CRC_DEVICE)) + ) + { + result = ADI_CRC_INSUFFICIENT_MEMORY; /* Report failure as insufficient memory */ + } + else +#endif /* ADI_DEBUG */ + { + /* check that ADI_CRC_MEMORY_SIZE is accurately defined */ + assert(ADI_CRC_MEMORY_SIZE == sizeof(ADI_CRC_DEVICE)); + + memset(pMemory, 0, MemorySize); /* Clear the given memory */ + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); /* Entering critical region, disable interrupts */ + + /* Save the supplied device memory address */ + crc_device_info[DeviceNum].hDevice = (ADI_CRC_HANDLE)pDevice; + pDevice->pReg = crc_device_info[DeviceNum].pReg; + + ADI_EXIT_CRITICAL_REGION(); /* Re-enable interrupts */ + + crc_ResetRegisters(pDevice); /* Reset CRC registers */ + *phDevice = crc_device_info[DeviceNum].hDevice; /* Pass a valid handle to this CRC device */ + +#if (ADI_CRC_CFG_ENABLE_DMA_SUPPORT == 0) + + pDevice->pfSubmitBuffer = &crc_ExecuteCoreDrivenOperation; + +#else /* ADI_CRC_CFG_ENABLE_DMA_SUPPORT */ + + pDevice->pfSubmitBuffer = &crc_ExecuteDmaDrivenOperation; + adi_dma_Init(); + + /* Register CRC DMA callback */ +#ifdef ADI_DEBUG /* IF (Debug information enabled) */ + if (ADI_DMA_SUCCESS != adi_dma_RegisterCallback(ADI_CFG_CRC_DMA_CHANNEL,CRC_Callback_For_DMA_Err_Int_Handler,pDevice)) + { + result = ADI_CRC_FAILURE; + } +#else + adi_dma_RegisterCallback(ADI_CFG_CRC_DMA_CHANNEL,CRC_Callback_For_DMA_Err_Int_Handler,pDevice); +#endif + NVIC_EnableIRQ(ADI_CRC_IRQ_ID); /* Enable the interrupt for the DMA channel used by CRC */ +#endif /* ADI_CRC_CFG_ENABLE_DMA_SUPPORT */ + } + return result; +} + +/** + * @brief Closes CRC device instance opened for use. + * + * @param [in] hDevice Handle to CRC Device instance to close. + * + * @return Status + * - #ADI_CRC_SUCCESS: Successfully closed CRC device. + * - #ADI_CRC_BAD_HANDLE [D]: Supplied CRC handle is invalid. + * - #ADI_CRC_FAILURE [D]: callback un-registration failed for CRC function used by DMA Error Interrupt Handler. + */ +ADI_CRC_RESULT adi_crc_Close(ADI_CRC_HANDLE const hDevice) +{ + ADI_CRC_RESULT result = ADI_CRC_SUCCESS; + ADI_CRC_INFO *pCrcInfo = crc_DeviceInfo(hDevice); /* get CRC info pointer from CRC handle */ +#ifdef ADI_DEBUG + if (NULL == pCrcInfo) + { + result = ADI_CRC_BAD_HANDLE; /* invalid CRC handle being used */ + } + else +#endif + { +#if (ADI_CRC_CFG_ENABLE_DMA_SUPPORT != 0) + NVIC_DisableIRQ(ADI_CRC_IRQ_ID); /* Disable the interrupt for the DMA channel used by CRC. */ + /* Register CRC DMA callback */ +#ifdef ADI_DEBUG /* IF (Debug information enabled) */ + if (ADI_DMA_SUCCESS != adi_dma_RegisterCallback(ADI_CFG_CRC_DMA_CHANNEL,NULL,NULL)) + { + result = ADI_CRC_FAILURE; + } +#else + adi_dma_RegisterCallback(ADI_CFG_CRC_DMA_CHANNEL,NULL,NULL); +#endif +#endif + pCrcInfo->hDevice = NULL; /* Mark CRC driver as closed */ + } + return result; +} +/*! + * @brief Set the bit mirroring. This function should be called only when device is idle, + * i.e. when no data are being processd by the CRC. + * + * @param[in] hDevice Device handle obtained from adi_crc_Open(). + * @param[in] bEnable Boolean flag to enable/disable bit mirroring. + * true : To Enable bit mirroring. + * false : To Disable bit mirroring. + * + * @return Status + * - #ADI_CRC_SUCCESS: Call completed successfully. + * - #ADI_CRC_BAD_HANDLE [D] :Invalid device handle parameter. + * - #ADI_CRC_FN_NOT_PERMITTED [D]: CRC is executing a request, its parameters cannot be altered. + * + * @sa adi_crc_SetByteMirroring(). + * @sa adi_crc_SetWordSwap(). + */ +ADI_CRC_RESULT adi_crc_SetBitMirroring(ADI_CRC_HANDLE const hDevice, const bool bEnable) +{ + ADI_CRC_RESULT result = ADI_CRC_SUCCESS; + ADI_CRC_DEVICE *pDevice = HDL_TO_DEVICE_PTR(hDevice); /* get CRC device pointer from CRC handle */ + +#ifdef ADI_DEBUG + if (NULL == pDevice) /* IF (CRC device handle is invalid) */ + { + result = ADI_CRC_BAD_HANDLE; + } + else if (!ADI_CRC_DEVICE_IS_IDLE(pDevice)) /* IF (CRC in progress) */ + { + result = ADI_CRC_FN_NOT_PERMITTED; /* Function not permitted when CRC operation is in progress */ + } + else +#endif + if(bEnable == true) + { + pDevice->pReg->CTL |= (BITM_CRC_CTL_BITMIRR); /* enable bit mirroring */ + } + else + { + pDevice->pReg->CTL &= (uint32_t)(~(BITM_CRC_CTL_BITMIRR)); /* disable bit mirroring */ + } + return result; +} +/*! + * @brief Set the byte mirroring. This function should be called only when device is disabled. + * + * @param[in] hDevice Device handle obtained from adi_crc_Open(). + * @param[in] bEnable Boolean flag to enable/disable byte mirroring. + * true : To Enable byte mirroring. + * false : To Disable byte mirroring. + * + * @return Status + * - #ADI_CRC_SUCCESS: Call completed successfully. + * - #ADI_CRC_BAD_HANDLE [D]: Invalid device handle parameter. + * - #ADI_CRC_FN_NOT_PERMITTED [D]: CRC is executing a request, its parameters cannot be altered. + * + * + * @sa adi_crc_EnableBitMirroring(). + * @sa adi_crc_EnableWordSwap(). + */ +ADI_CRC_RESULT adi_crc_SetByteMirroring(ADI_CRC_HANDLE const hDevice, const bool bEnable) +{ + ADI_CRC_RESULT result = ADI_CRC_SUCCESS; + ADI_CRC_DEVICE *pDevice = HDL_TO_DEVICE_PTR(hDevice); /* get CRC device pointer from CRC handle */ + +#ifdef ADI_DEBUG + if (NULL == pDevice) /* IF (CRC device handle is invalid) */ + { + result = ADI_CRC_BAD_HANDLE; + } + else if (!ADI_CRC_DEVICE_IS_IDLE(pDevice)) /* IF (CRC in progress) */ + { + result = ADI_CRC_FN_NOT_PERMITTED; /* Function not permitted when CRC operation is in progress */ + } + else +#endif + if(bEnable == true) + { + pDevice->pReg->CTL |= (BITM_CRC_CTL_BYTMIRR); /* enable byte mirroring */ + } + else + { + pDevice->pReg->CTL &= (uint32_t)(~(BITM_CRC_CTL_BYTMIRR)); /* disable byte mirroring */ + } + return result; +} + +/*! + * @brief Enable the LSB first. + * + * @param[in] hDevice Device handle obtained from adi_crc_Open(). + * @param[in] bEnable Boolean flag which indicate whether LSB first OR MSB first for CRC calculation. + * true : For LSB First CRC calculation + * false : For MSB First CRC calculation + * + * @return Status + * - #ADI_CRC_SUCCESS: Call completed successfully. + * - #ADI_CRC_BAD_HANDLE [D]: Invalid device handle parameter. + * - #ADI_CRC_FN_NOT_PERMITTED [D]: CRC is executing a request, its parameters cannot be altered. + * + * + * @sa adi_crc_EnableBitmirroring(). + * @sa adi_crc_EnableWordSwap(). + */ + +ADI_CRC_RESULT adi_crc_SetLSBFirst(ADI_CRC_HANDLE const hDevice, const bool bEnable) +{ + ADI_CRC_RESULT result = ADI_CRC_SUCCESS; + ADI_CRC_DEVICE *pDevice = HDL_TO_DEVICE_PTR(hDevice); /* get CRC device pointer from CRC handle */ + +#ifdef ADI_DEBUG + if (NULL == pDevice) /* IF (CRC device handle is invalid) */ + { + result = ADI_CRC_BAD_HANDLE; + } + else if (!ADI_CRC_DEVICE_IS_IDLE(pDevice)) /* IF (CRC in progress) */ + { + result = ADI_CRC_FN_NOT_PERMITTED; /* function not permitted when CRC operation is in progress */ + } + else +#endif + if(bEnable == true) + { + pDevice->pReg->CTL |= (BITM_CRC_CTL_LSBFIRST); /* enable LSB first (MSB first disable) */ + } + else + { + pDevice->pReg->CTL &= ~(BITM_CRC_CTL_LSBFIRST); /* disable LSB first (MSB first enable) */ + } + return result; +} +/*! + * @brief To enable/disable the word Swap. This function should be called only when device is disabled. + * + * @param[in] hDevice Device handle obtained from adi_crc_Open(). + * @param[in] bEnable Boolean flag to enable/disable word swap. + * true : To Enable word swap. + * false : To Disable word swap. + * + * @return Status + * - #ADI_CRC_SUCCESS: Call completed successfully. + * - #ADI_CRC_BAD_HANDLE [D]: Invalid device handle parameter. + * - #ADI_CRC_FN_NOT_PERMITTED [D]: CRC is executing a request, its parameters cannot be altered. + * + * + * @sa adi_crc_SetBitMirroring(). + * @sa adi_crc_SetByteMirroring(). + */ +ADI_CRC_RESULT adi_crc_EnableWordSwap(ADI_CRC_HANDLE const hDevice, const bool bEnable) +{ + ADI_CRC_RESULT result = ADI_CRC_SUCCESS; + ADI_CRC_DEVICE *pDevice = HDL_TO_DEVICE_PTR(hDevice); + +#ifdef ADI_DEBUG + if (NULL == pDevice) /* IF (CRC device handle is invalid) */ + { + result = ADI_CRC_BAD_HANDLE; + } + else if (!ADI_CRC_DEVICE_IS_IDLE(pDevice)) /* IF (CRC in progress) */ + { + result = ADI_CRC_FN_NOT_PERMITTED; /* function not permitted when CRC operation is in progress */ + } + else +#endif + if(bEnable == true) + { + pDevice->pReg->CTL |= BITM_CRC_CTL_W16SWP; /* enable word swap */ + } + else + { + pDevice->pReg->CTL &= ~BITM_CRC_CTL_W16SWP; /* disable word swap */ + } + + return result; +} +/** + * @brief Sets the initial seed value for the CRC operation that is about to take place. + * + * @param [in] hDevice Handle to CRC device instance to work on. + * @param [in] CrcSeedVal Initial seed value for the CRC operation that is about to take place. + * + * @return Status + * - #ADI_CRC_SUCCESS: Successfully set CRC seed value. + * - #ADI_CRC_BAD_HANDLE [D]: Supplied CRC handle is invalid. + * - #ADI_CRC_FN_NOT_PERMITTED [D] : Function not permitted when CRC operation is in progress. + * + */ +ADI_CRC_RESULT adi_crc_SetCrcSeedVal( + ADI_CRC_HANDLE const hDevice, + uint32_t CrcSeedVal) +{ + ADI_CRC_RESULT result = ADI_CRC_SUCCESS; + ADI_CRC_DEVICE *pDevice = HDL_TO_DEVICE_PTR(hDevice); + +#ifdef ADI_DEBUG + if (NULL == pDevice) /* IF (CRC device handle is invalid) */ + { + result = ADI_CRC_BAD_HANDLE; + } + else if (!ADI_CRC_DEVICE_IS_IDLE(pDevice)) /* IF (CRC in progress) */ + { + result = ADI_CRC_FN_NOT_PERMITTED; /* function not permitted when CRC operation is in progress */ + } + else +#endif /* ADI_DEBUG */ + { + pDevice->pReg->RESULT = CrcSeedVal; /* Load the CRC seed value */ + } + return result; +} + +/** + * @brief Sets the 32-bit polynomial for CRC operations. + * + * @param [in] hDevice Handle to CRC device instance to work on. + * @param [in] PolynomialVal 32-bit CRC polynomial to use for CRC operation. + * + * @return Status + * - #ADI_CRC_SUCCESS: Successfully set polynomial value. + * - #ADI_CRC_BAD_HANDLE [D]: Supplied CRC handle is invalid. + * - #ADI_CRC_FN_NOT_PERMITTED [D]: Function not permitted when CRC operation is in progress. + * + */ +ADI_CRC_RESULT adi_crc_SetPolynomialVal( + ADI_CRC_HANDLE const hDevice, + uint32_t PolynomialVal) +{ + ADI_CRC_RESULT result = ADI_CRC_SUCCESS; + ADI_CRC_DEVICE *pDevice = HDL_TO_DEVICE_PTR(hDevice); + +#ifdef ADI_DEBUG + if (NULL == pDevice) /* IF (CRC device handle is invalid) */ + { + result = ADI_CRC_BAD_HANDLE; + } + else if (!ADI_CRC_DEVICE_IS_IDLE(pDevice)) /* IF (CRC in progress) */ + { + result = ADI_CRC_FN_NOT_PERMITTED; /* function not permitted when CRC operation is in progress */ + } + else +#endif /* ADI_DEBUG */ + { + pDevice->pReg->POLY = PolynomialVal; /* Load Polynomial value */ + } + return result; +} + +/** + * @brief Submits data buffer for CRC computation + * + * @details This API can be used to submit data buffer for CRC computation. + * If NumBits is in [0..7] then the number of bytes to be processed + * is NumBytes plus one partial byte containing NumBits bits. + * If DMA mode of operation is selected, buffer is processed using + * the specified DMA channel. + * + * @param [in] hDevice Handle of CRC device + * @param [in] pCrcBuf Address of CRC data buffer + * @param [in] NumBytes Number of whole bytes in CRC data buffer + * @param [in] NumBits Number of bits, 0 to 7, in the last partial byte + * in CRC data buffer + * + * @return Status + * - #ADI_CRC_SUCCESS: Successfully submitted data buffer. + * - #ADI_CRC_INVALID_PARAMETER [D]: one of the parameter used is invalid. + * - #ADI_CRC_BAD_HANDLE [D]: Supplied CRC handle is invalid. + * - #ADI_CRC_FN_NOT_SUPPORTED [D]: Function not supported by this CRC revision. + * - #ADI_CRC_FN_NOT_PERMITTED [D]: Function not permitted when CRC operation is in progress. + * - #ADI_CRC_INVALID_DMA_CHANNEL: DMA channel cannot be used with CRC (from crc_DmaDrivenOperation) + */ +ADI_CRC_RESULT adi_crc_Compute( + ADI_CRC_HANDLE const hDevice, + void *pCrcBuf, + uint32_t NumBytes, + uint32_t NumBits) +{ + ADI_CRC_RESULT result = ADI_CRC_SUCCESS; + ADI_CRC_DEVICE *pDevice = HDL_TO_DEVICE_PTR(hDevice); +#ifdef ADI_DEBUG + if (NumBits >= 8u) + { + result = ADI_CRC_INVALID_PARAMETER; + } + else if (NULL == pDevice) + { + result = ADI_CRC_BAD_HANDLE; + } + else if (((pDevice->pReg->CTL & BITM_CRC_CTL_REVID) == 0u) && (NumBits != 0u)) + { + result = ADI_CRC_FN_NOT_SUPPORTED; /* Partial byte needs CRC unit revision 1 or up */ + } + else + if (!ADI_CRC_DEVICE_IS_IDLE(pDevice)) /* IF (CRC in progress) */ + { + result = ADI_CRC_FN_NOT_PERMITTED; /* function not permitted when CRC operation is in progress */ + } + else +#endif /* ADI_DEBUG */ + { + pDevice->eCrcOpStatus = ADI_CRC_OP_IN_PROGRESS; /* mark the CRC as in progress */ + result = pDevice->pfSubmitBuffer(pDevice, pCrcBuf, NumBytes, NumBits); + + /* CRC returns in IDLE mode when it has processed all its data, not after submitting a request */ + } + return result; +} + +/** + * @brief Gets the current CRC peripheral status. + * + * @param [in] hDevice Handle to CRC device instance to work on + * @param [in] pbCrcInProgress Pointer to location to store the current status of CRC peripheral. + * 'true' when CRC peripheral is in currently performing a CRC operation. + * + * @return Status + * - #ADI_CRC_SUCCESS: Successfully set expected CRC result. + * - #ADI_CRC_BAD_HANDLE [D}: Supplied CRC handle is invalid. + * + * @note This function is valid only when device is operating in DMA mode. + * + */ +ADI_CRC_RESULT adi_crc_IsCrcInProgress( + ADI_CRC_HANDLE const hDevice, + bool *pbCrcInProgress) +{ + ADI_CRC_RESULT result = ADI_CRC_SUCCESS; + ADI_CRC_DEVICE *pDevice = HDL_TO_DEVICE_PTR(hDevice); + +#ifdef ADI_DEBUG + if (NULL == pDevice) /* IF (CRC device handle is invalid) */ + { + result = ADI_CRC_BAD_HANDLE; + } + else +#endif /* ADI_DEBUG */ + { + + if ((pDevice)->eCrcOpStatus == ADI_CRC_OP_IN_PROGRESS) + { + *pbCrcInProgress = true; + + } + else + { + *pbCrcInProgress = false; + + } + } + return result; +} + +/** + * @brief Gets the final CRC result computed for a data stream + * + * @details This API gets the final CRC result computed for a data stream + * and clears the current and final CRC results register. + * The CRC Current result register holds the current or + * intermediate CRC result. Whenever a CRC operation is initiated, + * the CRC peripheral takes the CRC Current register value as + * initial seed for CRC computation. This API clears both results + * register to start a fresh CRC computation. + * Use the adi_crc_GetCurrentCrcVal() API to get an intermediate + * CRC result without clearing the results register. + * + * @param [in] hDevice Handle to CRC device instance to work on + * @param [out] pFinalCrcVal Pointer to location where the final CRC result of + * a data stream to be processed will be written. + * + * @return Status + * - #ADI_CRC_SUCCESS: Successfully read final CRC result. + * - #ADI_CRC_BAD_HANDLE [D]: Supplied CRC handle is invalid. + */ +ADI_CRC_RESULT adi_crc_GetFinalCrcVal( + ADI_CRC_HANDLE const hDevice, + uint32_t *pFinalCrcVal) +{ + ADI_CRC_RESULT result = ADI_CRC_SUCCESS; + ADI_CRC_DEVICE *pDevice = HDL_TO_DEVICE_PTR(hDevice); + +#ifdef ADI_DEBUG + if (NULL == pDevice) /* IF (CRC device handle is invalid) */ + { + result = ADI_CRC_BAD_HANDLE; + } + else +#endif /* ADI_DEBUG */ + { + const uint32_t seed_value = (uint32_t) ADI_CFG_CRC_SEED_VALUE; + *pFinalCrcVal = pDevice->pReg->RESULT; /* Get the final CRC result */ + pDevice->pReg->RESULT = seed_value; + } + return result; +} + +/** + * @brief Gets the current/intermediate CRC result computed for a data stream. + * + * @param [in] hDevice Handle to CRC device instance to work on + * @param [out] pCurrentCrcVal Pointer to location where the intermediate CRC result of + * a data stream to be processed will be written. + * + * @return Status + * - #ADI_CRC_SUCCESS: Successfully read current CRC result. + * - #ADI_CRC_BAD_HANDLE [D]: Supplied CRC handle is invalid. + */ +ADI_CRC_RESULT adi_crc_GetCurrentCrcVal( + ADI_CRC_HANDLE const hDevice, + uint32_t *pCurrentCrcVal) +{ + ADI_CRC_RESULT result = ADI_CRC_SUCCESS; + ADI_CRC_DEVICE *pDevice = HDL_TO_DEVICE_PTR(hDevice); + +#ifdef ADI_DEBUG + if (NULL == pDevice) /* IF (CRC device handle is invalid) */ + { + result = ADI_CRC_BAD_HANDLE; + } + else +#endif /* ADI_DEBUG */ + { + *pCurrentCrcVal = pDevice->pReg->RESULT; /* Get the current CRC result */ + } + + return result; +} + +/** + * @brief Registers or unregisters a callback with the CRC device + * + * @details It is not required to register a callback for the operation of the + * driver. Data compare or DMA error will be notified via the + * adi_crc_IsCrcInProgress() API. But if an application requires the + * errors/events to be notified immediately it can register a callback + * with the driver which will be called to notify errors/events. + * + * When a callback is registered the API adi_crc_IsCrcInProgress() + * will not return error. + * + * @param [in] hDevice Handle to CRC device instance to work on + * @param [in] pfCallback Pointer to application callback function. The callback function + * has the prototype + * void callback(void *pCBParam, uint32_t nEvent, void *pArg) + * To unregister a callback pass the the pointer to the callback + * function as NULL. + * @param [in] pCBParam Callback parameter which will be returned back to the + * application when the callback function is called. + * + * @return Status + * - #ADI_CRC_SUCCESS: Successfully registered callback. + * - #ADI_CRC_BAD_HANDLE [D]: Supplied CRC handle is invalid. + */ +ADI_CRC_RESULT adi_crc_RegisterCallback( + ADI_CRC_HANDLE const hDevice, + ADI_CALLBACK pfCallback, + void *const pCBParam) +{ + ADI_CRC_RESULT result = ADI_CRC_SUCCESS; + ADI_CRC_DEVICE *pDevice = HDL_TO_DEVICE_PTR(hDevice); + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); /* Entering critical region, disable interrupts */ + +#ifdef ADI_DEBUG + if (NULL == pDevice) /* IF (CRC device handle is invalid) */ + { + result = ADI_CRC_BAD_HANDLE; + } + else +#endif /* ADI_DEBUG */ + { + /* Update CRC Callback information */ + pDevice->pfCallback = pfCallback; + pDevice->pCBParam = pCBParam; + } + + ADI_EXIT_CRITICAL_REGION(); /* Re-enable interrupts */ + + return result; +} + + +/*****/ + +/*@}*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/crc/adi_crc_def.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/crc/adi_crc_def.h new file mode 100755 index 0000000000..1558146d56 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/crc/adi_crc_def.h @@ -0,0 +1,92 @@ +/*! ***************************************************************************** + * @file: adi_crc_def.h + * @brief: Private header file for for CRC driver. + * @details + * This is a private header file for the CRC driver, + * which contains the API declarations, data and + * constant definitions used in driver implementation + ----------------------------------------------------------------------------- +Copyright (c) 2010-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_CRC_DEF_H +#define ADI_CRC_DEF_H + +/* CRC Driver includes */ +#include + +/*! \cond PRIVATE */ + +typedef struct __ADI_CRC_DEVICE ADI_CRC_DEVICE; +typedef ADI_CRC_RESULT (*CRC_BUFFER_SUBMIT) (ADI_CRC_DEVICE *pDevice, void *pBuffer, uint32_t NumBytes, uint32_t NumBits); + +/* Enumeration of CRC operation status */ +typedef enum +{ + ADI_CRC_OP_IDLE = 0u, /* CRC idle */ + ADI_CRC_OP_IN_PROGRESS = 0x01u, /* CRC operation in progress */ +} ADI_CRC_OP_STATUS; + + +#pragma pack() + +/* Structure to handle CRC Peripheral instance */ +struct __ADI_CRC_DEVICE +{ + volatile ADI_CRC_TypeDef *pReg; + CRC_BUFFER_SUBMIT pfSubmitBuffer; /* Function for submitting CRC data buffer for calculation */ + ADI_CALLBACK pfCallback; /* Client supplied callback function */ + void *pCBParam; /* Client supplied callback parameter */ + void *pRemainingData; /* Pointer to the buffer containing remaining bytes */ + uint32_t RemainingBytes; /* Remaining bytes */ + uint32_t RemainingBits; /* Remaining bits */ + ADI_CRC_OP_STATUS eCrcOpStatus; /* Current status of the CRC Operation */ +}; + +/* Structure to hold CRC device specific information */ +typedef struct +{ + volatile ADI_CRC_TypeDef *pReg; /* CRC peripheral Registers */ + ADI_CRC_HANDLE hDevice; /* CRC device handle */ +} ADI_CRC_INFO; + +/*! \endcond */ + +#endif /* ADI_CRC_DEF_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/crypto/adi_crypto.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/crypto/adi_crypto.c new file mode 100755 index 0000000000..e940557165 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/crypto/adi_crypto.c @@ -0,0 +1,1577 @@ +/*! ***************************************************************************** + * @file: adi_crypto.c + * @brief: CRYPTO device driver source file. + * @details: This is the Crypto driver implementation file. + ----------------------------------------------------------------------------- +Copyright (c) 2010-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +/*! \addtogroup Crypto_Driver Crypto Driver + * @{ + * + * @brief Crypto Driver + * + * @details + * + * The Crypto controller provides hardware acceleration of various AES cryptographic + * cipher modes, including: ECB, CBC, CTR, CMAC, CCM, and SGA-256. The Crypto block + * works most efficiently in DMA mode due to the large about of data I/O which would + * otherwise incur a lot of PIO-mode interrupt traffic to manually pump data. + * + * Crypto Driver Static Configuration + * + * A number of Crypto cipher modes are able to be configured statically, such that + * if particular mode(s) are not required, the resulting driver footprint can be reduced + * internally by blocking out chunks of code that are not needed. + * + * @note - The application must include drivers/crypto/adi_crypto.h to use this driver. + * @note - This driver optionally uses the DMA driver if DMA is selected and active. + * In this case, the application must include the DMA driver sources to resolve + * DMA symbols. + */ + + +/*======== I N C L U D E ========*/ + +/*! \cond PRIVATE */ +#include +#include +#include + +/* main crypto include file */ +#include + +/* private crypto defines */ +#include "adi_crypto_def.h" + +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) +/* dma interface */ +#include +#endif + + +/*======== D E F I N E S ========*/ + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm123 (rule 8.5): there shall be no definition of objects or functions in a header file +* Pm140 (rule 11.3): a cast should not be performed between a pointer type and an integral type +* Pm050 (rule 14.2): a null statement shall only occur on a line by itself +* Pm088 (rule 17.4): pointer arithmetic should not be used. +* Pm073 (rule 14.7): a function should have a single point of exit +* Pm143 (rule 14.7): a function should have a single point of exit at the end of the function +* Pm152 (rule 17.4): array indexing shall only be applied to objects defined as an array type +*/ +#pragma diag_suppress=Pm123,Pm140,Pm050,Pm088,Pm073,Pm143,Pm152 +#endif /* __ICCARM__ */ + +/* Utility Macros */ +#define CLR_BITS(REG,BITS) ((REG) &= ~(BITS)) +#define SET_BITS(REG,BITS) ((REG) |= (BITS)) +#define IS_ANY_BIT_SET(REG,BITS) (((REG) & (BITS)) != 0u) + + +/* Number of crypto device for the given processor */ +#define NUM_DEVICES (1u) + +/* Compiler-specific mapping of assebbly-level byte-swap instruction + IAR is "__REV", and we think Keil is "__rev", but lets see how that + goes when it is undefined for Keil. +*/ +#if defined ( __ICCARM__ ) +#define __ADI_BYTE_SWAP(X) __REV(X) +#elif defined (__GNUC__) +#define __ADI_BYTE_SWAP(X) __builtin_bswap32(X) +#elif defined (__CC_ARM) +#define __ADI_BYTE_SWAP(X) __rev(X) +#else +#error "This toolchain is not supported" +#endif + + +/*======== L O C A L F U N C D E C L ========*/ + +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) +static void dmaCallback (void *pCBParam, uint32_t Event, void *pArg); +#endif + +#ifdef ADI_DEBUG +/* Validatation routines */ +static ADI_CRYPTO_RESULT ValidateHandle (ADI_CRYPTO_HANDLE const hDevice); +static ADI_CRYPTO_RESULT ValidateUserBuffer (ADI_CRYPTO_TRANSACTION * const pBuffer); +#endif + +/* Generate a uint32_t value from a pointer to a uint8_t buffer */ +static uint32_t u32FromU8p (uint8_t * const pData); + +/* Initialize the internal device handle object (user memory) */ +static void InitializeDevData (ADI_CRYPTO_HANDLE const hDevice); + +/* Initiate the computation for a buffer */ +static void StartCompute (ADI_CRYPTO_HANDLE const hDevice); + +/* Stop the device */ +static void StopCompute (ADI_CRYPTO_HANDLE const hDevice); + +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) +static void programDMA (ADI_CRYPTO_HANDLE const hDevice); +#endif + +/* PIO mode write input data */ +static void writePioInputData (ADI_CRYPTO_HANDLE const hDevice, uint32_t const status); + +/* PIO mode read output data */ +static void readPioOutputData (ADI_CRYPTO_HANDLE const hDevice, uint32_t const status); + +/* Flush the input and output buffers */ +static void FlushInputOutputRegisters (ADI_CRYPTO_HANDLE const hDevice); + + +/* pre-defined Crypto interrupt handler prototypes, as linked in IVT */ +void Crypto_Int_Handler(void); +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) +void DMA_AES0_IN_Int_Handler (void); +void DMA_AES0_OUT_Int_Handler (void); +#endif + + +/*======== D A T A ========*/ +/* Internal device structure */ + +static CRYPTO_INFO CryptoDevInfo[] = { + {pADI_CRYPT0, /* physical device controller pointer */ + NULL, /* hDevice */ +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) + DMA0_CH13_DONE_IRQn, /* DMA input interrupt number */ + DMA0_CH14_DONE_IRQn, /* DMA output interrupt number */ + AES0_IN_CHANn, /* DMA input channel */ + AES0_OUT_CHANn, /* DMA output channel */ + ADI_CRYPTO_SUCCESS, /* DMA error state */ +#endif + } +}; + +/*! \endcond */ + +/*======== C O D E ========*/ + + +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) + +/* Internal Crypto registered DMA Callback for receiving DMA + fault notifications from the shared DMA error handler */ +static void dmaCallback(void *pCBParam, uint32_t Event, void *pArg) +{ + /* recover device handle */ + ADI_CRYPTO_HANDLE hDevice = CryptoDevInfo[0].hDevice; + + /* recover failing channel number */ + uint32_t failingChannel = (uint32_t)pCBParam; + + /* save the DMA error */ + switch (Event) { + case ADI_DMA_EVENT_ERR_BUS: + hDevice->dmaErrorCode = ADI_CRYPTO_ERR_DMA_BUS_FAULT; + break; + case ADI_DMA_EVENT_ERR_INVALID_DESCRIPTOR: + hDevice->dmaErrorCode = ADI_CRYPTO_ERR_DMA_INVALID_DESCR; + break; + default: + hDevice->dmaErrorCode = ADI_CRYPTO_ERR_DMA_UNKNOWN_ERROR; + break; + } + + /* transfer is toast... post semaphore to unblock any waiters */ + SEM_POST(hDevice); + + /* call user's callback */ + if (0u != hDevice->pfCallback) { + hDevice->pfCallback (hDevice->pCBParam, (uint32_t)hDevice->dmaErrorCode, (void*)failingChannel); + } + + /* game over... */ + StopCompute(hDevice); +} +#endif + + +#ifdef ADI_DEBUG +/* Validate the given handle */ +static ADI_CRYPTO_RESULT ValidateHandle(ADI_CRYPTO_HANDLE const hDevice) +{ + ADI_CRYPTO_RESULT result = ADI_CRYPTO_ERR_BAD_DEV_HANDLE; + uint32_t x; + + for (x = 0u; x < NUM_DEVICES; x++) { + if (CryptoDevInfo[x].hDevice == hDevice) { + result = ADI_CRYPTO_SUCCESS; + break; + } + } + + return result; +} +#endif + + +#ifdef ADI_DEBUG +static ADI_CRYPTO_RESULT ValidateUserBuffer(ADI_CRYPTO_TRANSACTION * const pBuffer) +{ + + /* null pointer and zero count checks */ + if ( + (pBuffer->pInputData == NULL) + || (pBuffer->numInputBytes == 0u) + || (pBuffer->pOutputData == NULL) + || (pBuffer->numOutputBytes == 0u) + || ( + (pBuffer->eAesByteSwap != ADI_CRYPTO_AES_LITTLE_ENDIAN) + && (pBuffer->eAesByteSwap != ADI_CRYPTO_AES_BIG_ENDIAN)) + ) + { + return ADI_CRYPTO_ERR_BAD_BUFFER; + } + + /* check buffer pointers for 32-bit alignment */ + if ( (0u != (3u & (uint32_t)pBuffer->pAuthData)) || (0u != (3u & (uint32_t)pBuffer->pInputData)) || (0u != (3u & (uint32_t)pBuffer->pOutputData)) ) { + return ADI_CRYPTO_ERR_BAD_BUFFER; + } + +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) + /* check buffer sizes for max DMA size */ + if ((MAX_CRYPTO_DMA_BYTES < pBuffer->numAuthBytes) || (MAX_CRYPTO_DMA_BYTES < pBuffer->numInputBytes) || (MAX_CRYPTO_DMA_BYTES < pBuffer->numOutputBytes)) { + return ADI_CRYPTO_ERR_BAD_BUFFER; + } +#endif + +#if ADI_CRYPTO_ENABLE_SHA_SUPPORT == 1 + if (pBuffer->eCipherMode == ADI_CRYPTO_MODE_SHA) + { + /* SHA output digest is 256-bit and hence the output buffer size should be at least 32 bytes */ + if (pBuffer->numOutputBytes < SHA_OUTPUT_SIZE_IN_BYTES) { + return ADI_CRYPTO_ERR_BAD_BUFFER; + } + } + else +#endif + { + +#if ADI_CRYPTO_ENABLE_CMAC_SUPPORT == 1 + if (pBuffer->eCipherMode == ADI_CRYPTO_MODE_CMAC) { + /* CMAC output is always a 128-bit block */ + if (pBuffer->numOutputBytes < CRYPTO_INPUT_SIZE_IN_BYTES) { + return ADI_CRYPTO_ERR_BAD_BUFFER; + } + } + else +#endif + { + if ( + (pBuffer->pKey == NULL) + || ( (pBuffer->eAesKeyLen != ADI_CRYPTO_AES_KEY_LEN_128_BIT) + && (pBuffer->eAesKeyLen != ADI_CRYPTO_AES_KEY_LEN_256_BIT)) + || ( (pBuffer->eCodingMode != ADI_CRYPTO_ENCODE) + && (pBuffer->eCodingMode != ADI_CRYPTO_DECODE))) + { + return ADI_CRYPTO_ERR_BAD_CONFIG; + } + +#if ADI_CRYPTO_ENABLE_CTR_SUPPORT == 1 + if (pBuffer->eCipherMode == ADI_CRYPTO_MODE_CTR) + { + if ((pBuffer->CounterInit & (0xFFF00000u)) != 0u) { + return ADI_CRYPTO_ERR_BAD_BUFFER; + } + } +#endif + +#if ADI_CRYPTO_ENABLE_CCM_SUPPORT == 1 + if (pBuffer->eCipherMode == ADI_CRYPTO_MODE_CCM) + { + if ( ((pBuffer->CounterInit & (0xFFFF0000u)) != 0u) + || ( (pBuffer->pAuthData != NULL) + && ( + (pBuffer->numAuthBytes == 0u) + || (pBuffer->numValidBytes == 0u) + || (pBuffer->numValidBytes > CRYPTO_INPUT_SIZE_IN_BYTES) + || (pBuffer->numOutputBytes < (pBuffer->numInputBytes + CRYPTO_INPUT_SIZE_IN_BYTES)) + ) + ) + ) + { + return ADI_CRYPTO_ERR_BAD_BUFFER; + } + } + else +#endif + { + if (pBuffer->numOutputBytes < pBuffer->numInputBytes) + { + return ADI_CRYPTO_ERR_BAD_BUFFER; + } + } + } + } + +/* FIXME: Issue http://labrea.ad.analog.com/browse/MSKEW-299 describes missing support + for HMAC mode, so reject HMAC submits until support for this mode is implimented. + ***REMOVE THIS BLOCK WHEN HMAC SUPPORT IS ADDED*** +*/ +#if ADI_CRYPTO_ENABLE_HMAC_SUPPORT == 1 + if (pBuffer->eCipherMode == ADI_CRYPTO_MODE_HMAC) + { + return ADI_CRYPTO_ERR_BAD_BUFFER; + } +#endif + + return ADI_CRYPTO_SUCCESS; +} +#endif + + +/** + * @brief Opens a Crypto device instance. + * + * @param [in] nDeviceNum Device number to open. + * @param [in] pMemory Pointer to a #ADI_CRYPTO_MEMORY_SIZE sized buffer to manage the device + * instance. + * @param [in] nMemorySize Size of the buffer to which "pMemory" points. + * @param [out] phDevice Pointer to a location where the Crypto device handle is to be written. + * + * @return Status + * - #ADI_CRYPTO_SUCCESS Call completed successfully. + * - #ADI_CRYPTO_ERR_BAD_DEVICE_NUM [D] Error: The device number is invalid. + * - #ADI_CRYPTO_ERR_INVALID_PARAM [D] Error: A parameter is invalid. + * - #ADI_CRYPTO_ERR_INSUFFICIENT_MEM [D] Error: The memory passed to the device is insufficient. + * - #ADI_CRYPTO_ERR_ALREADY_INITIALIZED [D] Error: The device is already opened. + * - #ADI_CRYPTO_ERR_SEMAPHORE_FAILED Error: Unable to create semaphore. + * - #ADI_CRYPTO_ERR_DMA_REGISTER Error: Unable to register DMA error callback function. + * + * @sa adi_crypto_Close(). + */ +ADI_CRYPTO_RESULT adi_crypto_Open (uint32_t const nDeviceNum, void * const pMemory, uint32_t const nMemorySize, ADI_CRYPTO_HANDLE * const phDevice) +{ + ADI_CRYPTO_HANDLE hDevice = NULL; + +#ifdef ADI_DEBUG + if (nDeviceNum >= NUM_DEVICES) { + return ADI_CRYPTO_ERR_BAD_DEVICE_NUM; + } + + if ((pMemory == NULL) || (phDevice == NULL)) { + return ADI_CRYPTO_ERR_INVALID_PARAM; + } + + if (nMemorySize < ADI_CRYPTO_MEMORY_SIZE) { + return ADI_CRYPTO_ERR_INSUFFICIENT_MEM; + } + + if (CryptoDevInfo[nDeviceNum].hDevice != NULL) { + return ADI_CRYPTO_ERR_ALREADY_INITIALIZED; + } + + /* reality checks */ + assert (ADI_CRYPTO_MEMORY_SIZE == sizeof(ADI_CRYPTO_DEV_DATA_TYPE)); + assert (sizeof(ADI_CRYPTO_TRANSACTION) == sizeof(CRYPTO_COMPUTE)); + +#endif /* ADI_DEBUG */ + + /* store a bad handle in case of failure */ + *phDevice = NULL; + + /* point local device handle to the user memory */ + hDevice = (ADI_CRYPTO_HANDLE)pMemory; + + /* link CRYPTO controller register set */ + hDevice->pDev = CryptoDevInfo[nDeviceNum].pDev; + + /* link device info */ + hDevice->pDevInfo = CryptoDevInfo; + + /* cross-link device handle into device info */ + CryptoDevInfo[nDeviceNum].hDevice = hDevice; + + /* Initialize the driver internals */ + InitializeDevData(hDevice); + + /* create the semaphore */ + SEM_CREATE(hDevice, "crypto_sem", ADI_CRYPTO_ERR_SEMAPHORE_FAILED); + +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) + /* initialize DMA core */ + adi_dma_Init(); + + /* register DMA error callback for INPUT channel */ + if (ADI_DMA_SUCCESS != adi_dma_RegisterCallback(hDevice->pDevInfo->dmaInputChanNum, dmaCallback, (void*)hDevice)) { + /* uninitialize crypto driver and fail */ + adi_crypto_Close(hDevice); + return ADI_CRYPTO_ERR_DMA_REGISTER; + } + /* register DMA error callback for OUTPUT channel */ + if (ADI_DMA_SUCCESS != adi_dma_RegisterCallback(hDevice->pDevInfo->dmaOutputChanNum, dmaCallback, (void*)hDevice)) { + /* uninitialize crypto driver and fail */ + adi_crypto_Close(hDevice); + return ADI_CRYPTO_ERR_DMA_REGISTER; + } +#endif + + /* Give the handle back to the application */ + *phDevice = hDevice; + + /* Return success */ + return ADI_CRYPTO_SUCCESS; +} + +/** + * @brief Close the given device instance. + * + * @param [in] hDevice Handle to the device instance. + * + * @return Status + * - #ADI_CRYPTO_SUCCESS Successfully closed the device. + * - #ADI_CRYPTO_ERR_BAD_DEV_HANDLE [D] Error: Handle Passed is invalid. + * - #ADI_CRYPTO_ERR_SEMAPHORE_FAILED Error: Unable to delete semaphore. + * + * @sa adi_crypto_Open(). + */ +ADI_CRYPTO_RESULT adi_crypto_Close (ADI_CRYPTO_HANDLE const hDevice) +{ + uint32_t x; + ADI_CRYPTO_RESULT result; + +#ifdef ADI_DEBUG + if ((result = ValidateHandle(hDevice)) != ADI_CRYPTO_SUCCESS) { + return result; + } +#endif /* ADI_DEBUG */ + + /* IF (The device is enabled) */ + if (hDevice->bDeviceEnabled) { + result = adi_crypto_Enable(hDevice, false); + if (result != ADI_CRYPTO_SUCCESS) { + return result; + } + } + + /* Destroy the semaphore */ + SEM_DELETE(hDevice, ADI_CRYPTO_ERR_SEMAPHORE_FAILED); + + /* Close the device */ + for (x=0u; x < NUM_DEVICES; x++) { + if (CryptoDevInfo[x].hDevice == hDevice) { + CryptoDevInfo[x].hDevice = NULL; + break; + } + } + + return ADI_CRYPTO_SUCCESS; +} + + +/** + * @brief Register a user callback function. + * + * @param [in] hDevice Handle to the device instance. + * @param [in] pfCallback Function pointer to user callback function. Passing a NULL pointer will + * unregister the callback function. + * @param [in] pCBParam Callback function parameter. + * + * @details This function registers a user callback function. The registered function will be called when + * the given computation is over. Registering an active user callback function implies use of the + * (non-blocking) CALLBACK mode during which any subsequent calls to the (blocking-mode) + * #adi_crypto_GetBuffer() API will be rejected. + * + * + * @return Status + * - #ADI_CRYPTO_SUCCESS Successfully registerd the callback. + * - #ADI_CRYPTO_ERR_BAD_DEV_HANDLE [D] Error: Handle Passed is invalid. + */ + ADI_CRYPTO_RESULT adi_crypto_RegisterCallback (ADI_CRYPTO_HANDLE const hDevice, ADI_CALLBACK const pfCallback, void * const pCBParam) +{ +#ifdef ADI_DEBUG + ADI_CRYPTO_RESULT result; + + if ((result = ValidateHandle(hDevice)) != ADI_CRYPTO_SUCCESS) { + return result; + } +#endif /* ADI_DEBUG */ + + /* store user's callback values (critical section) */ + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + hDevice->pfCallback = pfCallback; + hDevice->pCBParam = pCBParam; + ADI_EXIT_CRITICAL_REGION(); + + return ADI_CRYPTO_SUCCESS; +} + + +/** + * @brief Submit a Crypto transaction buffer for processing. + * + * @param [in] hDevice Handle to the device instance. + * @param [in] pBuffer Pointer to the #ADI_CRYPTO_TRANSACTION structure which contains details + * of the cipher-dependent buffer elements required by the driver. + * + * @return Status + * - #ADI_CRYPTO_SUCCESS Successfully submitted the buffer. + * - #ADI_CRYPTO_ERR_COMPUTE_ACTIVE Error: Buffer already submitted. + * - #ADI_CRYPTO_ERR_BAD_DEV_HANDLE [D] Error: Handle Passed is invalid. + * - #ADI_CRYPTO_ERR_BAD_BUFFER [D] Error: The buffer passed to the device is invalid or unsupported. + * + * The buffer submitted is queued for eventual CRYPTO processing. A single buffer may be submitted + * prior to initiating CRYPTO buffer processing. Buffer processing is initiated with the + * #adi_crypto_Enable() call. As buffer processing is completed, the buffer (and result info) + * is retrieved with the #adi_crypto_GetBuffer() API or through the user callback notification. + * + * @note The driver takes ownership of the ADI_CRYPTO_TRANSACTION structure passed to the driver. + * The application must insure the structure is not used and its scope is valid untill + * the structure is returned back to the application. + * + * @warning The #ADI_CRYPTO_TRANSACTION buffer is a common superset of all possible cipher mode parameters. + * As such, not all parameters pertain to each cipher mode. It is recommended users clear unused + * parameters prior to configuration for the particular cipher mode. The example provided + * illustrates this with a call to: "memset(&Buffer, 0, sizeof(ADI_CRYPTO_TRANSACTION));" + * before configuring and then submitting each transaction. + * + * @sa adi_crypto_Enable(). + * @sa adi_crypto_GetBuffer(). + * @sa adi_crypto_IsBufferAvailable(). + */ + ADI_CRYPTO_RESULT adi_crypto_SubmitBuffer (ADI_CRYPTO_HANDLE const hDevice, ADI_CRYPTO_TRANSACTION * const pBuffer) +{ + ADI_CRYPTO_RESULT result = ADI_CRYPTO_SUCCESS; + + /* reject if we already have a user buffer */ + if (NULL != hDevice->pUserBuffer) { + /* computation already active */ + return ADI_CRYPTO_ERR_COMPUTE_ACTIVE; + } + +#ifdef ADI_DEBUG + if (ADI_CRYPTO_SUCCESS != (result = ValidateHandle(hDevice))) { + return result; + } + + /* validate user Buffer */ + if (ADI_CRYPTO_SUCCESS != (result = ValidateUserBuffer(pBuffer))) { + return result; + } +#endif + + /* store user buffer pointer to return later */ + hDevice->pUserBuffer = pBuffer; + + /* initialize internal compute state from user buffer */ + memcpy(&hDevice->Computation, pBuffer, sizeof(ADI_CRYPTO_TRANSACTION)); + + /* don't initiate transaction until we get adi_crypto_Enable() */ + + /* reset dma error code */ + hDevice->dmaErrorCode = ADI_CRYPTO_SUCCESS; + + return result; +} + + +/** + * @brief Get the submitted transaction buffer back from the driver. + * + * @param [in] hDevice Handle to the device instance. + * @param [out] ppBuffer Pointer to a location to which the address of the buffer structure is written. + * + * @return Status + * - #ADI_CRYPTO_SUCCESS Successfully got a buffer. + * - #ADI_CRYPTO_ERR_INVALID_PARAM [D] Error: Pointer to the buffer is NULL. + * - #ADI_CRYPTO_ERR_BAD_DEV_HANDLE [D] Error: Handle Passed is invalid. + * - #ADI_CRYPTO_ERR_DMA_BUS_FAULT Error: DMA bus fault was reported. + * - #ADI_CRYPTO_ERR_DMA_INVALID_DESCR Error: Invalid DMA descriptor was reported. + * - #ADI_CRYPTO_ERR_DMA_UNKNOWN_ERROR Error: An unexpected DMA error was reported. + * - #ADI_CRYPTO_ERR_SEMAPHORE_FAILED Error: Semaphore pend request failed. + * - #ADI_CRYPTO_ERR_INVALID_STATE Error: Invalid call when using callback mode. + * + * This is a blocking call and will await transaction completion (if not already). + * This function should not be called if a callback function is registered. + * + * @sa adi_crypto_SubmitBuffer(). + * @sa adi_crypto_IsBufferAvailable(). + */ +ADI_CRYPTO_RESULT adi_crypto_GetBuffer (ADI_CRYPTO_HANDLE const hDevice, ADI_CRYPTO_TRANSACTION ** const ppBuffer) +{ + ADI_CRYPTO_RESULT result = ADI_CRYPTO_SUCCESS; + +#ifdef ADI_DEBUG + + if (ppBuffer == NULL) { + return ADI_CRYPTO_ERR_INVALID_PARAM; + } + if (ADI_CRYPTO_SUCCESS != (result = ValidateHandle(hDevice))) { + return result; + } +#endif /* ADI_DEBUG */ + + if (NULL != hDevice->pfCallback) { + return ADI_CRYPTO_ERR_INVALID_STATE; + } + + /* pend on completion (even if already complete) */ + SEM_PEND(hDevice, ADI_CRYPTO_ERR_SEMAPHORE_FAILED); + + /* give back the user's buffer */ + *ppBuffer = hDevice->pUserBuffer; + + /* clear internal user buffer pointer */ + hDevice->pUserBuffer = NULL; + + /* if we had a DMA error, return that instead of success */ + if (ADI_CRYPTO_SUCCESS != hDevice->dmaErrorCode) { + result = hDevice->dmaErrorCode; + } + + return result; +} + + +/** + * @brief Peek function to know whether a submitted transaction is complete. + * + * @param [in] hDevice Handle to the device instance. + * @param [in] pbAvailable Pointer to a Boolean variable. Set to "true" if there is a completed + * buffer and a call to adi_crypto_GetBuffer is ensured to be successful. + * Set to "false" if there is no completed buffer. + * + * @return Status + * - #ADI_CRYPTO_SUCCESS Successfully peeked for a buffer. + * - #ADI_CRYPTO_ERR_INVALID_PARAM [D] Error: The pointer passed is NULL. + * - #ADI_CRYPTO_ERR_BAD_DEV_HANDLE [D] Error: Handle Passed is invalid. + * - #ADI_CRYPTO_ERR_DMA_BUS_FAULT Error: DMA bus fault was reported. + * - #ADI_CRYPTO_ERR_DMA_INVALID_DESCR Error: Invalid DMA descriptor was reported. + * - #ADI_CRYPTO_ERR_DMA_UNKNOWN_ERROR Error: An unexpected DMA error was reported. + * + * @sa adi_crypto_SubmitBuffer(). + * @sa adi_crypto_GetBuffer(). + */ +ADI_CRYPTO_RESULT adi_crypto_IsBufferAvailable (ADI_CRYPTO_HANDLE const hDevice, bool * const pbAvailable) +{ + ADI_CRYPTO_RESULT result = ADI_CRYPTO_SUCCESS; + +#ifdef ADI_DEBUG + if (pbAvailable == NULL) + { + return ADI_CRYPTO_ERR_INVALID_PARAM; + } + if (ADI_CRYPTO_SUCCESS != (result = ValidateHandle(hDevice))) { + return result; + } +#endif /* ADI_DEBUG */ + + /* let the respective PIO/DMA interrupts drive completion... just return that state here */ + *pbAvailable = hDevice->bCompletion; + + /* if we had a DMA error, return that instead of success */ + if (ADI_CRYPTO_SUCCESS != hDevice->dmaErrorCode) { + result = hDevice->dmaErrorCode; + } + + return result; +} + + +/** + * @brief Enable/Disable the device. Enabling the device causes the submitted buffer to be processed. + * + * @param [in] hDevice Handle to the device instance. + * @param [in] bEnable 'true' to enable and 'false' to disable the device. + * + * @return Status + * - #ADI_CRYPTO_SUCCESS Successfully enabled/disabled the device. + * - #ADI_CRYPTO_ERR_BAD_DEV_HANDLE [D] Error: Handle Passed is invalid. + * - #ADI_CRYPTO_ERR_INVALID_STATE [D] Error: Calling enable when device is already enabled or + * disable when the device is already disabled. + * + */ +ADI_CRYPTO_RESULT adi_crypto_Enable (ADI_CRYPTO_HANDLE const hDevice, bool const bEnable) +{ + ADI_CRYPTO_RESULT result = ADI_CRYPTO_SUCCESS; + +#ifdef ADI_DEBUG + + if (ADI_CRYPTO_SUCCESS != (result = ValidateHandle(hDevice))) { + return result; + } + if (bEnable == hDevice->bDeviceEnabled) { + return ADI_CRYPTO_ERR_INVALID_STATE; + } +#endif /* ADI_DEBUG */ + + if (true == bEnable) { + + /* device enable */ + + /* Enable the IRQs */ + NVIC_EnableIRQ(CRYPT_EVT_IRQn); + +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) + /* Enable the DMA interrupts */ + NVIC_EnableIRQ(hDevice->pDevInfo->dmaInputIrqNum); + NVIC_EnableIRQ(hDevice->pDevInfo->dmaOutputIrqNum); +#endif + + /* Mark the device as enabled */ + hDevice->bDeviceEnabled = true; + + /* Start processing buffer */ + StartCompute(hDevice); + + } else { + + /* device disable */ + + /* Disable the IRQs */ + NVIC_DisableIRQ(CRYPT_EVT_IRQn); + +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) + /* Enable the DMA interrupts */ + NVIC_DisableIRQ(hDevice->pDevInfo->dmaInputIrqNum); + NVIC_DisableIRQ(hDevice->pDevInfo->dmaOutputIrqNum); +#endif + + /* Stop the device */ + StopCompute(hDevice); + + /* if we had a DMA error, return that instead of success */ + if (ADI_CRYPTO_SUCCESS != hDevice->dmaErrorCode) { + result = hDevice->dmaErrorCode; + } + } + + /* Return success */ + return result; +} + + +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) +/** + * @brief Dynamically Enable/Disable DMA mode for the device. + * + * @param [in] hDevice Handle to the device instance. + * @param [in] bEnable 'true' will enable DMA and 'false' disables the DMA. + * + * @return Status + * - #ADI_CRYPTO_SUCCESS Successfully enabled/disabled the DMA. + * - #ADI_CRYPTO_ERR_BAD_DEV_HANDLE [D] Error: Handle Passed is invalid. + * - #ADI_CRYPTO_ERR_INVALID_STATE [D] Error: DMA cannot be enabled or disabled when the device is already enabled. + * + * Manage use of DMA mode dynamically. Presupposes DMA support has been enabled statically + * in the static configuration files via the ADI_CRYPTO_ENABLE_DMA_SUPPORT macro. + * + * @note In addition to requiring that DMA support is enabled (see ADI_CRYPTO_ENABLE_DMA_SUPPORT static + * configuration macro) for #adi_crypto_EnableDmaMode() to be available, use of DMA mode may + * also be statically configured (see ADI_CRYPTO_ENABLE_DMA). Both these macros may be set statically + * to both enable DMA support and to activate the DMA mode in a fully static manner, without need of + * calling adi_crypto_EnableDmaMode() at all (in which case, this function may be eliminated by the linker). + */ +ADI_CRYPTO_RESULT adi_crypto_EnableDmaMode (ADI_CRYPTO_HANDLE const hDevice, bool const bEnable) +{ +#ifdef ADI_DEBUG + ADI_CRYPTO_RESULT result; + + if ((result = ValidateHandle(hDevice)) != ADI_CRYPTO_SUCCESS) { + return result; + } + if (hDevice->bDeviceEnabled) { + return ADI_CRYPTO_ERR_INVALID_STATE; + } +#endif /* ADI_DEBUG */ + + if (bEnable) + { + /* Enable DMA and map data pump handler */ + hDevice->bDmaEnabled = true; + + /* Enable the DMA interrupts */ + NVIC_EnableIRQ(hDevice->pDevInfo->dmaInputIrqNum); + NVIC_EnableIRQ(hDevice->pDevInfo->dmaOutputIrqNum); + } + else + { + /* Disable DMA and map data pump handler */ + hDevice->bDmaEnabled = false; + + /* Disable the DMA interrupts */ + NVIC_DisableIRQ(hDevice->pDevInfo->dmaInputIrqNum); + NVIC_DisableIRQ(hDevice->pDevInfo->dmaOutputIrqNum); + } + + /* Return success */ + return ADI_CRYPTO_SUCCESS; +} +#endif + + + +/*! \cond PRIVATE */ + +/*======== L O C A L F U N C T I O N D E F I N I T I O N S ========*/ + +/* Generate a u32 from a pointer to u8 buffer */ +static uint32_t u32FromU8p(uint8_t * const pData) +{ + int32_t x = 0; + uint32_t nValue = pData[3]; + + for (x = 2; x >= 0; x--) { + nValue = (nValue << 8u) | pData[x]; + } + return nValue; +} + + +/* Initialize the device structure */ +static void InitializeDevData (ADI_CRYPTO_HANDLE const hDevice) +{ + /* Clear the device structure */ + memset(hDevice, 0, sizeof(ADI_CRYPTO_HANDLE)); + +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) + #if (ADI_CRYPTO_ENABLE_DMA == 1) + hDevice->bDmaEnabled = true; + NVIC_EnableIRQ(hDevice->pDevInfo->dmaInputIrqNum); + NVIC_EnableIRQ(hDevice->pDevInfo->dmaOutputIrqNum); + #else + hDevice->bDmaEnabled = false; + NVIC_DisableIRQ(hDevice->pDevInfo->dmaInputIrqNum); + NVIC_DisableIRQ(hDevice->pDevInfo->dmaOutputIrqNum); + #endif +#else + /* no DMA support */ + hDevice->bDmaEnabled = false; +#endif +} + + +/* initiate buffer processing (called from crypto enable) */ +static void StartCompute(ADI_CRYPTO_HANDLE const hDevice) +{ + /* clear completion flag */ + hDevice->bCompletion = false; + + /* Get pointer to the compute buffer */ + CRYPTO_COMPUTE* pCompute = &hDevice->Computation; + + /* Clear any pending interrupts (all are R/W1C) */ + hDevice->pDev->STAT = hDevice->pDev->STAT; + + /* reset crypto config register */ + hDevice->pDev->CFG = 0u; + +#if (ADI_CRYPTO_ENABLE_SHA_SUPPORT == 1) + /* reset SHA hardware machine state */ + if (ADI_CRYPTO_MODE_SHA == pCompute->eCipherMode) { + SET_BITS(hDevice->pDev->CFG, BITM_CRYPT_CFG_SHAINIT); + } +#endif + + /* program main config register settings */ + SET_BITS(hDevice->pDev->CFG, + ( (uint32_t)pCompute->eCipherMode /* cipher mode */ + | (uint32_t)pCompute->eKeyByteSwap /* KEY endianness */ + | (uint32_t)pCompute->eShaByteSwap /* SHA endianness */ + | (uint32_t)pCompute->eAesByteSwap /* AES endianness */ + | (uint32_t)pCompute->eAesKeyLen /* AES key length */ + | (uint32_t)pCompute->eCodingMode /* encode mode */ + ) + ); + +#if (CRYPTO_SUPPORT_KEY_REQUIRED) + if (NULL != pCompute->pKey) { + + /* program user key */ + uint32_t volatile *pKeyReg = &hDevice->pDev->AESKEY0; + uint8_t *pUserKey = pCompute->pKey; + uint32_t numKeyWords; + + /* set key length register */ + SET_BITS(hDevice->pDev->CFG, (uint32_t)pCompute->eAesKeyLen); + + /* Set the number of keywords to write to the 32-bit keyword registers */ + switch (pCompute->eAesKeyLen) { + case ADI_CRYPTO_AES_KEY_LEN_128_BIT: + numKeyWords = 4u; + break; + case ADI_CRYPTO_AES_KEY_LEN_256_BIT: + numKeyWords = 8u; + break; + default: + numKeyWords = 0u; /* hardware only supports only 128-bit and 256-bit key length (no 192-bit) */ + break; + } + + /* load the key (key registers have write-no-read attribute) */ + for (uint32_t count = 0u; count < numKeyWords; count++) { + *pKeyReg = u32FromU8p(pUserKey); + pKeyReg++; + pUserKey += sizeof(uint32_t); + } + } +#endif /* (CRYPTO_SUPPORT_KEY_REQUIRED) */ + +#if (ADI_CRYPTO_ENABLE_CMAC_SUPPORT == 1) + if (ADI_CRYPTO_MODE_CMAC == pCompute->eCipherMode) { + /* program CMAC-specific registers */ + /* DATALEN in CMAC mode is number of 128 bit pages (or 16, 8 byte pages) */ + hDevice->pDev->DATALEN = pCompute->numInputBytesRemaining / CRYPTO_INPUT_SIZE_IN_BYTES; + } +#endif /* (ADI_CRYPTO_ENABLE_CMAC_SUPPORT == 1) */ + +#if (ADI_CRYPTO_ENABLE_CCM_SUPPORT == 1) + if (ADI_CRYPTO_MODE_CCM == pCompute->eCipherMode) { + /* program CMM-specific registers */ + hDevice->pDev->PREFIXLEN = pCompute->numAuthBytesRemaining / CRYPTO_INPUT_SIZE_IN_BYTES; + hDevice->pDev->DATALEN = pCompute->numInputBytesRemaining / CRYPTO_INPUT_SIZE_IN_BYTES; + hDevice->pDev->CCM_NUM_VALID_BYTES = pCompute->numValidBytes; + } +#endif /* (ADI_CRYPTO_ENABLE_CCM_SUPPORT == 1) */ + +#if (ADI_CRYPTO_ENABLE_CBC_SUPPORT == 1) || (ADI_CRYPTO_ENABLE_CCM_SUPPORT == 1) || (ADI_CRYPTO_ENABLE_CTR_SUPPORT == 1) + + if ( (ADI_CRYPTO_MODE_CBC == pCompute->eCipherMode) || (ADI_CRYPTO_MODE_CCM == pCompute->eCipherMode) || (ADI_CRYPTO_MODE_CTR == pCompute->eCipherMode) ) + { + /* program NONCE/IV for CBC, CCM and CTR modes */ + assert (NULL != pCompute->pNonceIV); + + /* Configure Counter Init and NONCE values */ + hDevice->pDev->CNTRINIT = pCompute->CounterInit; + + hDevice->pDev->NONCE0 = u32FromU8p(&pCompute->pNonceIV[0]); + hDevice->pDev->NONCE1 = u32FromU8p(&pCompute->pNonceIV[4]); + hDevice->pDev->NONCE2 = u32FromU8p(&pCompute->pNonceIV[8]); + + hDevice->pDev->NONCE3 = ((uint32_t)pCompute->pNonceIV[12] << 0u) | ((uint32_t)pCompute->pNonceIV[13] << 8u); + +#if (ADI_CRYPTO_ENABLE_CBC_SUPPORT == 1) + if (ADI_CRYPTO_MODE_CBC == pCompute->eCipherMode) { + + /* additionally, CBC mode requires remaining IV data */ + hDevice->pDev->NONCE3 |= ( ((uint32_t)pCompute->pNonceIV[14] << 16u) | ((uint32_t)pCompute->pNonceIV[15] << 24u) ); + } +#endif /* (ADI_CRYPTO_ENABLE_CBC_SUPPORT == 1) */ + } +#endif /* (ADI_CRYPTO_ENABLE_CBC_SUPPORT == 1) || (ADI_CRYPTO_ENABLE_CCM_SUPPORT == 1) || (ADI_CRYPTO_ENABLE_CTR_SUPPORT == 1) */ + +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) + + /* onle enable DMA for non-SHA mode or SHA mode with > 4 bytes of input... */ + if ( ((true == hDevice->bDmaEnabled) && (ADI_CRYPTO_MODE_SHA != pCompute->eCipherMode)) + || ((true == hDevice->bDmaEnabled) && (ADI_CRYPTO_MODE_SHA == pCompute->eCipherMode) && (4u < pCompute->numInputBytesRemaining)) ) + { + + /* DMA startup... */ + programDMA(hDevice); + + /* mode-specific DMA interrupt enables */ + switch (pCompute->eCipherMode) { + case ADI_CRYPTO_MODE_HMAC: + /* enable HMAC done and overrun interrupts (via PIO handler) */ + SET_BITS(hDevice->pDev->INTEN, (BITM_CRYPT_INTEN_HMACDONEEN | BITM_CRYPT_INTEN_INOVREN)); + break; + case ADI_CRYPTO_MODE_SHA: + /* enable SHA done and overrun interrupts */ + SET_BITS(hDevice->pDev->INTEN, (BITM_CRYPT_INTEN_SHADONEN | BITM_CRYPT_INTEN_INOVREN)); + SET_BITS(hDevice->pDev->CFG, (BITM_CRYPT_CFG_INDMAEN)); + break; + default: + /* enable DMA I/O interrupts */ + SET_BITS(hDevice->pDev->CFG, (BITM_CRYPT_CFG_OUTDMAEN | BITM_CRYPT_CFG_INDMAEN)); + break; + } + + /* crypto hardware enable */ + SET_BITS(hDevice->pDev->CFG, BITM_CRYPT_CFG_BLKEN); + + } else +#endif + { + /* mode-specific PIO interrupt enables */ + switch (pCompute->eCipherMode) { + case ADI_CRYPTO_MODE_HMAC: + /* HMAC done interrupts via PIO handler (do NOT use INRDY in HMAC mode) */ + SET_BITS(hDevice->pDev->INTEN, (BITM_CRYPT_INTEN_HMACDONEEN | BITM_CRYPT_INTEN_OUTRDYEN | BITM_CRYPT_INTEN_INOVREN)); + break; + case ADI_CRYPTO_MODE_SHA: + /* SHA done interrupts via PIO handler (do NOT use INRDY in SHA mode) */ + SET_BITS(hDevice->pDev->INTEN, (BITM_CRYPT_INTEN_SHADONEN | BITM_CRYPT_INTEN_INOVREN)); + break; + default: + SET_BITS(hDevice->pDev->INTEN, (BITM_CRYPT_INTEN_INOVREN | BITM_CRYPT_INTEN_OUTRDYEN | BITM_CRYPT_INTEN_INRDYEN)); + break; + } + + /* crypto hardware enable */ + SET_BITS(hDevice->pDev->CFG, BITM_CRYPT_CFG_BLKEN); + + /* manual write of 1st input data batch... (interrupt-driven hereafter...) */ + writePioInputData(hDevice, hDevice->pDev->STAT); + } +} + + +/* halt computation */ +static void StopCompute (ADI_CRYPTO_HANDLE const hDevice) +{ + +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) + /* disable Crypto DMA */ + CLR_BITS(hDevice->pDev->CFG, (BITM_CRYPT_CFG_INDMAEN | BITM_CRYPT_CFG_OUTDMAEN)); +#endif + + /* clear all interrupt enables */ + hDevice->pDev->INTEN = 0u; + + /* Flush the buffers */ + FlushInputOutputRegisters(hDevice); + + /* device disable */ + CLR_BITS(hDevice->pDev->CFG, BITM_CRYPT_CFG_BLKEN); + + /* Mark the device as disabled */ + hDevice->bDeviceEnabled = false; +} + + +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) +static void programDMA(ADI_CRYPTO_HANDLE const hDevice) +{ + CRYPTO_COMPUTE* pCompute = &hDevice->Computation; + ADI_DCC_TypeDef* pCCD; /* pointer to DMA Control Data Descriptor */ + uint32_t channelBit; + uint32_t num32BitWords; + + /* start with INPUT channel */ + channelBit = 1u << hDevice->pDevInfo->dmaInputChanNum; + + /* disable various stuff */ + pADI_DMA0->SRCADDR_CLR = channelBit; /* disable src endpointer decrement mode */ + pADI_DMA0->DSTADDR_CLR = channelBit; /* disable dst endpointer decrement mode */ + pADI_DMA0->EN_SET = channelBit; /* channel enable */ + pADI_DMA0->RMSK_CLR = channelBit; /* allow Crypto to request DMA service */ + +#if (ADI_CRYPTO_ENABLE_CBC_SUPPORT == 1) || (ADI_CRYPTO_ENABLE_CCM_SUPPORT == 1) || (ADI_CRYPTO_ENABLE_CTR_SUPPORT == 1) + /* program input descriptor(s) */ + if (0u != pCompute->pNextAuthInput) { + + /* schedule authentication data into primary descriptor (USING ping-pong mode) */ + + pADI_DMA0->ALT_CLR = channelBit; /* activate PRIMARY descriptor */ + pCCD = pPrimaryCCD + hDevice->pDevInfo->dmaInputChanNum; /* point to primary INPUT descriptor */ + + /* setup the endpoints (point to input register & last 4 bytes of input array) */ + pCCD->DMASRCEND = (uint32_t)pCompute->pNextAuthInput + sizeof(uint32_t) * (pCompute->numAuthBytesRemaining / FIFO_WIDTH_IN_BYTES - 1u); + pCCD->DMADSTEND = (uint32_t)&hDevice->pDev->INBUF; + + /* program DMA Control Data Config register */ + num32BitWords = pCompute->numAuthBytesRemaining / sizeof(uint32_t); + pCCD->DMACDC = + ( ((uint32_t)ADI_DMA_INCR_NONE << DMA_BITP_CTL_DST_INC) + | ((uint32_t)ADI_DMA_INCR_4_BYTE << DMA_BITP_CTL_SRC_INC) + | ((uint32_t)ADI_DMA_WIDTH_4_BYTE << DMA_BITP_CTL_SRC_SIZE) + | ((uint32_t)ADI_DMA_RPOWER_4 << DMA_BITP_CTL_R_POWER) + | (uint32_t)((num32BitWords - 1u) << DMA_BITP_CTL_N_MINUS_1) + | ((uint32_t)DMA_ENUM_CTL_CYCLE_CTL_PING_PONG << DMA_BITP_CTL_CYCLE_CTL) ); + + + /* schedule input data into alternate descriptor (in basic mode) */ + pADI_DMA0->PRI_CLR = channelBit; /* activate ALTERNATE descriptor */ + pCCD = pAlternateCCD + hDevice->pDevInfo->dmaInputChanNum; /* point to alternate INPUT descriptor */ + + /* setup the endpoints (point to input register & last 4 bytes of input array) */ + pCCD->DMASRCEND = (uint32_t)pCompute->pNextInput + sizeof(uint32_t) * (pCompute->numInputBytesRemaining / FIFO_WIDTH_IN_BYTES - 1u); + pCCD->DMADSTEND = (uint32_t)&hDevice->pDev->INBUF; + + /* program DMA Control Data Config register */ + num32BitWords = pCompute->numInputBytesRemaining / sizeof(uint32_t); + pCCD->DMACDC = + ( ((uint32_t)ADI_DMA_INCR_NONE << DMA_BITP_CTL_DST_INC) + | ((uint32_t)ADI_DMA_INCR_4_BYTE << DMA_BITP_CTL_SRC_INC) + | ((uint32_t)ADI_DMA_WIDTH_4_BYTE << DMA_BITP_CTL_SRC_SIZE) + | ((uint32_t)ADI_DMA_RPOWER_4 << DMA_BITP_CTL_R_POWER) + | (uint32_t)((num32BitWords - 1u) << DMA_BITP_CTL_N_MINUS_1) + | ((uint32_t)DMA_ENUM_CTL_CYCLE_CTL_BASIC << DMA_BITP_CTL_CYCLE_CTL) ); + + } else +#endif /* #if (ADI_CRYPTO_ENABLE_CBC_SUPPORT == 1) || (ADI_CRYPTO_ENABLE_CCM_SUPPORT == 1) || (ADI_CRYPTO_ENABLE_CTR_SUPPORT == 1) */ + { + + /* no authentication data, just schedule input data into primary descriptor (in basic mode) */ + + pADI_DMA0->ALT_CLR = channelBit; /* activate PRIMARY descriptor */ + pCCD = pPrimaryCCD + hDevice->pDevInfo->dmaInputChanNum; /* point to primary INPUT descriptor */ + + /* setup the endpoints (point to input register & last 4 bytes of input array) */ +#if (ADI_CRYPTO_ENABLE_SHA_SUPPORT == 1) + if (ADI_CRYPTO_MODE_SHA == pCompute->eCipherMode) { + + /* Stop SHA-mode input writes one short of last 32-bit word so the DMA input interrupt + can manually call PIO write function to handle SHA end flag and last write manually. */ + pCCD->DMASRCEND = (uint32_t)pCompute->pNextInput + sizeof(uint32_t) * (pCompute->numInputBytesRemaining / FIFO_WIDTH_IN_BYTES - 2u); + num32BitWords = (pCompute->numInputBytesRemaining - (pCompute->numInputBytesRemaining % sizeof(uint32_t))) / sizeof(uint32_t) - 1u; /* count - 1 */ + } + else +#endif + { + /* stop at last write end */ + pCCD->DMASRCEND = (uint32_t)pCompute->pNextInput + sizeof(uint32_t) * ( pCompute->numInputBytesRemaining / FIFO_WIDTH_IN_BYTES - 1u); + num32BitWords = pCompute->numInputBytesRemaining / sizeof(uint32_t); /* count */ + } + + pCCD->DMADSTEND = (uint32_t)&hDevice->pDev->INBUF; + + /* program DMA Control Data Config register */ + pCCD->DMACDC = + ( ((uint32_t)ADI_DMA_INCR_NONE << DMA_BITP_CTL_DST_INC) + | ((uint32_t)ADI_DMA_INCR_4_BYTE << DMA_BITP_CTL_SRC_INC) + | ((uint32_t)ADI_DMA_WIDTH_4_BYTE << DMA_BITP_CTL_SRC_SIZE) + | ((uint32_t)ADI_DMA_RPOWER_4 << DMA_BITP_CTL_R_POWER) + | (uint32_t)((num32BitWords - 1u) << DMA_BITP_CTL_N_MINUS_1) + | ((uint32_t)DMA_ENUM_CTL_CYCLE_CTL_BASIC << DMA_BITP_CTL_CYCLE_CTL) ); + } + +/* don't program output DMA in SHA mode... */ +#if CRYPTO_SUPPORT_MODE_ANY_NON_SHA + + if (ADI_CRYPTO_MODE_SHA != pCompute->eCipherMode) { + + /* switch to OUTPUT channel */ + channelBit = 1u << hDevice->pDevInfo->dmaOutputChanNum; + + /* disable various stuff */ + pADI_DMA0->SRCADDR_CLR = channelBit; /* disable src endpointer decrement mode */ + pADI_DMA0->DSTADDR_CLR = channelBit; /* disable dst endpointer decrement mode */ + pADI_DMA0->EN_SET = channelBit; /* channel enable */ + pADI_DMA0->RMSK_CLR = channelBit; /* allow Crypto to request DMA service */ + + pADI_DMA0->ALT_CLR = channelBit; /* activate primary descriptor */ + pCCD = pPrimaryCCD + hDevice->pDevInfo->dmaOutputChanNum; /* point to crypto OUTPUT descriptor */ + + + /* setup the endpoints (point to output register & last 4 bytes of output array) */ + pCCD->DMASRCEND = (uint32_t)&hDevice->pDev->OUTBUF; + pCCD->DMADSTEND = (uint32_t)pCompute->pNextOutput + sizeof(uint32_t) * (pCompute->numOutputBytesRemaining / FIFO_WIDTH_IN_BYTES - 1u); + + /* program DMA Control Data Config register */ + num32BitWords = pCompute->numOutputBytesRemaining / sizeof(uint32_t); + pCCD->DMACDC = + ( ((uint32_t)ADI_DMA_INCR_4_BYTE << DMA_BITP_CTL_DST_INC) + | ((uint32_t)ADI_DMA_INCR_NONE << DMA_BITP_CTL_SRC_INC) + | ((uint32_t)ADI_DMA_WIDTH_4_BYTE << DMA_BITP_CTL_SRC_SIZE) + | ((uint32_t)ADI_DMA_RPOWER_4 << DMA_BITP_CTL_R_POWER) + | (uint32_t)((num32BitWords - 1u) << DMA_BITP_CTL_N_MINUS_1) + | ((uint32_t)DMA_ENUM_CTL_CYCLE_CTL_BASIC << DMA_BITP_CTL_CYCLE_CTL) ); + + } /* end non-SHA mode */ + +#endif /* CRYPTO_SUPPORT_MODE_ANY_NON_SHA */ +} +#endif /* #if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) */ + + +static void writePioInputData(ADI_CRYPTO_HANDLE const hDevice, uint32_t const status) +{ + CRYPTO_COMPUTE* pCompute = &hDevice->Computation; + uint32_t numWritable = FIFO_DEPTH - ((status & BITM_CRYPT_STAT_INWORDS) >> BITP_CRYPT_STAT_INWORDS); + +#if (ADI_CRYPTO_ENABLE_CBC_SUPPORT == 1) || (ADI_CRYPTO_ENABLE_CCM_SUPPORT == 1) || (ADI_CRYPTO_ENABLE_CTR_SUPPORT == 1) + /* always send authentication data before input payload is sent */ + if (0u != pCompute->numAuthBytesRemaining) { + + /* fill input FIFO with 32-bit authentication data */ + while ((0u != numWritable) && (0u != pCompute->numAuthBytesRemaining)) { + hDevice->pDev->INBUF = *pCompute->pNextAuthInput; + pCompute->pNextAuthInput++; + pCompute->numAuthBytesRemaining -= FIFO_WIDTH_IN_BYTES; + numWritable--; + } + } else +#endif /* #if (ADI_CRYPTO_ENABLE_CBC_SUPPORT == 1) || (ADI_CRYPTO_ENABLE_CCM_SUPPORT == 1) || (ADI_CRYPTO_ENABLE_CTR_SUPPORT == 1) */ + { + /* no authentication data, process payload input data */ + +#if (ADI_CRYPTO_ENABLE_SHA_SUPPORT == 1) + if (ADI_CRYPTO_MODE_SHA == pCompute->eCipherMode) { + + /* Drive up to a full "chunk" of SHA input message data. + Chunk size is limited to 512-bits (64-bytes) by AES + hardware compute block. + */ + + if (pCompute->numInputBytesRemaining >= SHA_CHUNK_MAX_BYTES) + { + /* This is the simple case, load up an entire chunk and let it go */ + for (uint8_t i = 0u; i < SHA_CHUNK_MAX_WORDS; i++) { + hDevice->pDev->INBUF = *pCompute->pNextInput; + pCompute->pNextInput++; + } + + pCompute->numShaBitsRemaining -= SHA_CHUNK_MAX_BITS; + pCompute->numInputBytesRemaining -= SHA_CHUNK_MAX_BYTES; + } + else + { + /* The final case, we load up any bytes less than a full chunk and trigger the last word */ + while (FIFO_WIDTH_IN_BITS <= pCompute->numShaBitsRemaining) { + hDevice->pDev->INBUF = *pCompute->pNextInput; + pCompute->pNextInput++; + pCompute->numShaBitsRemaining -= FIFO_WIDTH_IN_BITS; + } + + hDevice->pDev->SHA_LAST_WORD = (pCompute->numShaBitsRemaining << BITP_CRYPT_SHA_LAST_WORD_O_BITS_VALID) | BITM_CRYPT_SHA_LAST_WORD_O_LAST_WORD; + + /* Last write is dummy or not, depending on remaining bit count */ + if (0u == pCompute->numShaBitsRemaining) { + /* dummy write */ + hDevice->pDev->INBUF = 0u; + } else { + /* partial data (last remaining message data word) */ + hDevice->pDev->INBUF = *pCompute->pNextInput; + pCompute->pNextInput++; + } + + pCompute->numShaBitsRemaining = 0u; + pCompute->numInputBytesRemaining = 0u; + + /* Use output bytes as a way of confirming that we are really done (can't use input bytes/bits) */ + pCompute->numOutputBytesRemaining -= SHA_OUTPUT_SIZE_IN_BYTES; + } + } /* end of SHA mode */ + else +#endif + { + /* full input FIFO with normal payload write (non-SHA) */ + while ((0u != numWritable) && (0u != pCompute->numInputBytesRemaining)) { + hDevice->pDev->INBUF = *pCompute->pNextInput; + pCompute->pNextInput++; + pCompute->numInputBytesRemaining -= FIFO_WIDTH_IN_BYTES; + numWritable--; + } + } + } +} + + +static void readPioOutputData(ADI_CRYPTO_HANDLE const hDevice, uint32_t const status) +{ + CRYPTO_COMPUTE *pCompute = &hDevice->Computation; + uint32_t numReadable; + +#if ADI_CRYPTO_ENABLE_SHA_SUPPORT == 1 + /* Copy the SHA output if enabled */ + if (pCompute->eCipherMode == ADI_CRYPTO_MODE_SHA) + { + if (IS_ANY_BIT_SET(status, BITM_CRYPT_STAT_SHADONE)) { + + /* Get 1 SHADONE per block + 1 SHADONE when we trigger the last word */ + if (0u == pCompute->numOutputBytesRemaining) { +#if ADI_CRYPTO_SHA_OUTPUT_FORMAT == 0 /* Little Endian */ + pCompute->pNextOutput[0] = hDevice->pDev->SHAH7; + pCompute->pNextOutput[1] = hDevice->pDev->SHAH6; + pCompute->pNextOutput[2] = hDevice->pDev->SHAH5; + pCompute->pNextOutput[3] = hDevice->pDev->SHAH4; + pCompute->pNextOutput[4] = hDevice->pDev->SHAH3; + pCompute->pNextOutput[5] = hDevice->pDev->SHAH2; + pCompute->pNextOutput[6] = hDevice->pDev->SHAH1; + pCompute->pNextOutput[7] = hDevice->pDev->SHAH0; +#else + pCompute->pNextOutput[0] = __ADI_BYTE_SWAP(hDevice->pDev->SHAH0); + pCompute->pNextOutput[1] = __ADI_BYTE_SWAP(hDevice->pDev->SHAH1); + pCompute->pNextOutput[2] = __ADI_BYTE_SWAP(hDevice->pDev->SHAH2); + pCompute->pNextOutput[3] = __ADI_BYTE_SWAP(hDevice->pDev->SHAH3); + pCompute->pNextOutput[4] = __ADI_BYTE_SWAP(hDevice->pDev->SHAH4); + pCompute->pNextOutput[5] = __ADI_BYTE_SWAP(hDevice->pDev->SHAH5); + pCompute->pNextOutput[6] = __ADI_BYTE_SWAP(hDevice->pDev->SHAH6); + pCompute->pNextOutput[7] = __ADI_BYTE_SWAP(hDevice->pDev->SHAH7); +#endif + } + } + } + else +#endif + { + /* read any ready non-SHA output from output FIFO */ + if (IS_ANY_BIT_SET(status, BITM_CRYPT_STAT_OUTRDY)) { + numReadable = ((status & BITM_CRYPT_STAT_OUTWORDS) >> BITP_CRYPT_STAT_OUTWORDS); + while ((0u != numReadable) && (0u != pCompute->numOutputBytesRemaining)) { + *pCompute->pNextOutput = hDevice->pDev->OUTBUF; + pCompute->pNextOutput++; + pCompute->numOutputBytesRemaining -= FIFO_WIDTH_IN_BYTES; + numReadable--; + } + } + } + + /* if output count has gone to zero, set completion flag */ + if (0u == pCompute->numOutputBytesRemaining) { + hDevice->bCompletion = true; + } +} + + +/* Flush the Crypto input and output buffers */ +static void FlushInputOutputRegisters(ADI_CRYPTO_HANDLE const hDevice) +{ + /* Set and clear the flush bits to flush the input and output buffers */ + SET_BITS(hDevice->pDev->CFG, BITM_CRYPT_CFG_INFLUSH | BITM_CRYPT_CFG_OUTFLUSH); + CLR_BITS(hDevice->pDev->CFG, BITM_CRYPT_CFG_INFLUSH | BITM_CRYPT_CFG_OUTFLUSH); +} + + +/*================ INTERRUPT HANDELING ==================*/ + +/* native PIO-mode (non-DMA) interrupt handler */ +void Crypto_Int_Handler(void) +{ + ISR_PROLOG(); + + ADI_CRYPTO_HANDLE hDevice = CryptoDevInfo[0].hDevice; + CRYPTO_COMPUTE *pCompute = &hDevice->Computation; + uint32_t status = hDevice->pDev->STAT; + uint32_t event; + + /* clear status */ + hDevice->pDev->STAT = status; + + /* check for overflow */ + if (IS_ANY_BIT_SET(status, BITM_CRYPT_STAT_INOVR)) { + + /* call user's callback */ + if (0u != hDevice->pfCallback) { + hDevice->pfCallback(hDevice->pCBParam, ADI_CRYPTO_EVENT_STATUS_INPUT_OVERFLOW, (void *)status); + } + + /* stop */ + StopCompute(hDevice); + + /* post the semaphore */ + SEM_POST(hDevice); + + return; + } + + /* pull outputs (updates completion flag) */ + readPioOutputData(hDevice, status); + + if (false == hDevice->bCompletion) { + + /* push more inputs, but not in SHA DMA mode (except for when its perfectly aligned block) */ + if ((pCompute->eCipherMode != ADI_CRYPTO_MODE_SHA) || (hDevice->bDmaEnabled == false) || (pCompute->numInputBytesRemaining == 0u)) + { + writePioInputData(hDevice, status); + } + + } else { + + /* we're done */ + + /* dispatch to user callback if we have one */ + if (0u != hDevice->pfCallback) { + + /* check for overflow first */ + if (0u != (BITM_CRYPT_STAT_INOVR & status)) { + event = ADI_CRYPTO_EVENT_STATUS_INPUT_OVERFLOW; + } else { + /* completion message depends on mode */ + switch (hDevice->Computation.eCipherMode) { +#if (ADI_CRYPTO_ENABLE_CBC_SUPPORT == 1) + case ADI_CRYPTO_MODE_CBC: event = ADI_CRYPTO_EVENT_STATUS_CBC_DONE; break; +#endif +#if (ADI_CRYPTO_ENABLE_CCM_SUPPORT == 1) + case ADI_CRYPTO_MODE_CCM: event = ADI_CRYPTO_EVENT_STATUS_CCM_DONE; break; +#endif +#if (ADI_CRYPTO_ENABLE_CMAC_SUPPORT == 1) + case ADI_CRYPTO_MODE_CMAC: event = ADI_CRYPTO_EVENT_STATUS_CMAC_DONE; break; +#endif +#if (ADI_CRYPTO_ENABLE_CTR_SUPPORT == 1) + case ADI_CRYPTO_MODE_CTR: event = ADI_CRYPTO_EVENT_STATUS_CTR_DONE; break; +#endif +#if (ADI_CRYPTO_ENABLE_ECB_SUPPORT == 1) + case ADI_CRYPTO_MODE_ECB: event = ADI_CRYPTO_EVENT_STATUS_ECB_DONE; break; +#endif +#if (ADI_CRYPTO_ENABLE_HMAC_SUPPORT == 1) + case ADI_CRYPTO_MODE_HMAC: event = ADI_CRYPTO_EVENT_STATUS_HMAC_DONE; break; +#endif +#if (ADI_CRYPTO_ENABLE_SHA_SUPPORT == 1) + case ADI_CRYPTO_MODE_SHA: event = ADI_CRYPTO_EVENT_STATUS_SHA_DONE; break; +#endif + default: event = ADI_CRYPTO_EVENT_STATUS_UNKNOWN; break; + } + } + + /* call user's callback and give back buffer pointer */ + hDevice->pfCallback(hDevice->pCBParam, event, (void*)hDevice->pUserBuffer); + + /* clear private copy of user buffer pointer */ + /* (this is done in GetBuffer in non-Callback mode) */ + hDevice->pUserBuffer = NULL; + } + + /* disable interrupts */ + hDevice->pDev->INTEN = 0u; + + /* post the semaphore */ + SEM_POST(hDevice); + } + + ISR_EPILOG(); +} + + +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) +/* native DMA input interrupt handler */ +void DMA_AES0_IN_Int_Handler (void) +{ + ISR_PROLOG(); + + ADI_CRYPTO_HANDLE hDevice = CryptoDevInfo[0].hDevice; + CRYPTO_COMPUTE *pCompute = &hDevice->Computation; + +#if (ADI_CRYPTO_ENABLE_SHA_SUPPORT == 1) + if (ADI_CRYPTO_MODE_SHA == pCompute->eCipherMode) { + + /* Update the compute structure to reflect the "post DMA" state of the transaction */ + uint32_t numTotalBytes = pCompute->numInputBytesRemaining; + uint32_t num32BitWords = (numTotalBytes - (numTotalBytes % sizeof(uint32_t))) / sizeof(uint32_t) - 1u; + pCompute->numInputBytesRemaining -= num32BitWords*4u; + pCompute->numShaBitsRemaining -= num32BitWords*32u; + pCompute->pNextInput += num32BitWords; + + if ((numTotalBytes % SHA_CHUNK_MAX_BYTES) == 0u) + { + /* For perfect block sizes, need to write the last word WITHOUT triggering SHA_LAST_WORD */ + hDevice->pDev->INBUF = *pCompute->pNextInput; + + pCompute->numInputBytesRemaining = 0u; + pCompute->numShaBitsRemaining = 0u; + } + else + { + /* Go ahead and write the remaining word, and its okay to trigger SHA_LAST_WORD */ + writePioInputData(hDevice, hDevice->pDev->STAT); + } + } +#endif + + /* defer post to output interrupt... */ + + ISR_EPILOG(); +} +#endif + + +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) +/* native DMA output interrupt handler */ +void DMA_AES0_OUT_Int_Handler (void) +{ + ISR_PROLOG(); + ADI_CRYPTO_HANDLE hDevice = CryptoDevInfo[0].hDevice; + uint32_t status = hDevice->pDev->STAT; + uint32_t event; + + /* by the time we get here, everything should be complete */ + + /* dispatch to user callback if we have one */ + if (0u != hDevice->pfCallback) { + + /* check for overflow first */ + if (0u != (BITM_CRYPT_STAT_INOVR & status)) { + event = ADI_CRYPTO_EVENT_STATUS_INPUT_OVERFLOW; + } else { + /* completion message depends on mode */ + switch (hDevice->Computation.eCipherMode) { +#if (ADI_CRYPTO_ENABLE_CBC_SUPPORT == 1) + case ADI_CRYPTO_MODE_CBC: event = ADI_CRYPTO_EVENT_STATUS_CBC_DONE; break; +#endif +#if (ADI_CRYPTO_ENABLE_CCM_SUPPORT == 1) + case ADI_CRYPTO_MODE_CCM: event = ADI_CRYPTO_EVENT_STATUS_CCM_DONE; break; +#endif +#if (ADI_CRYPTO_ENABLE_CMAC_SUPPORT == 1) + case ADI_CRYPTO_MODE_CMAC: event = ADI_CRYPTO_EVENT_STATUS_CMAC_DONE; break; +#endif +#if (ADI_CRYPTO_ENABLE_CTR_SUPPORT == 1) + case ADI_CRYPTO_MODE_CTR: event = ADI_CRYPTO_EVENT_STATUS_CTR_DONE; break; +#endif +#if (ADI_CRYPTO_ENABLE_ECB_SUPPORT == 1) + case ADI_CRYPTO_MODE_ECB: event = ADI_CRYPTO_EVENT_STATUS_ECB_DONE; break; +#endif +#if (ADI_CRYPTO_ENABLE_HMAC_SUPPORT == 1) + case ADI_CRYPTO_MODE_HMAC: event = ADI_CRYPTO_EVENT_STATUS_HMAC_DONE; break; +#endif +#if (ADI_CRYPTO_ENABLE_SHA_SUPPORT == 1) + case ADI_CRYPTO_MODE_SHA: event = ADI_CRYPTO_EVENT_STATUS_SHA_DONE; break; +#endif + default: event = ADI_CRYPTO_EVENT_STATUS_UNKNOWN; break; + } + } + + /* call user's callback and give back buffer pointer */ + hDevice->pfCallback(hDevice->pCBParam, event, (void*)hDevice->pUserBuffer); + + /* clear private copy of user buffer pointer */ + /* this is done in GetBuffer in non-Callback mode */ + hDevice->pUserBuffer = NULL; + } + + /* mark completion */ + hDevice->bCompletion = true; + + /* clear status */ + hDevice->pDev->STAT = status; + + /* post the semaphore */ + SEM_POST(hDevice); + + ISR_EPILOG(); +} +#endif + +/*! \endcond */ + +/*@}*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/crypto/adi_crypto_def.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/crypto/adi_crypto_def.h new file mode 100755 index 0000000000..b9e82e14b3 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/crypto/adi_crypto_def.h @@ -0,0 +1,209 @@ +/*! + ***************************************************************************** + @file: adi_crypto_def.h + @brief: Crypto Device Driver definitions for ADuCM4x50 processor + ----------------------------------------------------------------------------- +Copyright (c) 2012-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ +#ifndef ADI_CRYPTO_DEF_H +#define ADI_CRYPTO_DEF_H + +/*! \cond PRIVATE */ + +#include +#include + +/* pick up compiler-specific alignment directives */ +#include +#define ALIGN4 ALIGNED_PRAGMA(4) + +/* Support Check MACROS */ +#define CRYPTO_SUPPORT_KEY_REQUIRED ( \ + (ADI_CRYPTO_ENABLE_ECB_SUPPORT == 1) \ + || (ADI_CRYPTO_ENABLE_CTR_SUPPORT == 1) \ + || (ADI_CRYPTO_ENABLE_CBC_SUPPORT == 1) \ + || (ADI_CRYPTO_ENABLE_CCM_SUPPORT == 1) \ + || (ADI_CRYPTO_ENABLE_CMAC_SUPPORT == 1) \ + ) + +#define CRYPTO_SUPPORT_MODE_CCM_ONLY ( \ + (ADI_CRYPTO_ENABLE_ECB_SUPPORT != 1) \ + && (ADI_CRYPTO_ENABLE_CTR_SUPPORT != 1) \ + && (ADI_CRYPTO_ENABLE_CBC_SUPPORT != 1) \ + && (ADI_CRYPTO_ENABLE_CCM_SUPPORT == 1) \ + && (ADI_CRYPTO_ENABLE_CMAC_SUPPORT != 1) \ + && (ADI_CRYPTO_ENABLE_SHA_SUPPORT != 1) \ + ) + +#define CRYPTO_SUPPORT_MODE_ANY_NON_CCM ( \ + (ADI_CRYPTO_ENABLE_ECB_SUPPORT == 1) \ + || (ADI_CRYPTO_ENABLE_CTR_SUPPORT == 1) \ + || (ADI_CRYPTO_ENABLE_CBC_SUPPORT == 1) \ + || (ADI_CRYPTO_ENABLE_CMAC_SUPPORT == 1) \ + || (ADI_CRYPTO_ENABLE_SHA_SUPPORT == 1) \ + ) + +#define CRYPTO_SUPPORT_MODE_ANY_NON_SHA ( \ + (ADI_CRYPTO_ENABLE_ECB_SUPPORT == 1) \ + || (ADI_CRYPTO_ENABLE_CTR_SUPPORT == 1) \ + || (ADI_CRYPTO_ENABLE_CBC_SUPPORT == 1) \ + || (ADI_CRYPTO_ENABLE_CMAC_SUPPORT == 1) \ + || (ADI_CRYPTO_ENABLE_CCM_SUPPORT == 1) \ + ) + +/* define local MIN/MAX macros, if not already... */ +#ifndef MIN +#define MIN(a,b) (((a)<(b))?(a):(b)) +#endif +#ifndef MAX +#define MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +/* various size macros */ +#define MAX_CRYPTO_DMA_BYTES (DMA_TRANSFER_LIMIT * sizeof(uint32_t)) + +/* SHA hardware max chunk size attributes */ +#define SHA_CHUNK_MAX_BYTES (64u) +#define SHA_CHUNK_MAX_BITS (SHA_CHUNK_MAX_BYTES * 8U) +#define SHA_CHUNK_MAX_WORDS (16u) + +#define FIFO_WIDTH_IN_BITS (32u) +#define FIFO_WIDTH_IN_BYTES (FIFO_WIDTH_IN_BITS/8u) +#define FIFO_DEPTH (4u) + +#define CRYPTO_INPUT_SIZE_IN_BITS (128u) +#define CRYPTO_INPUT_SIZE_IN_BYTES (CRYPTO_INPUT_SIZE_IN_BITS/8u) + +#define SHA_OUTPUT_SIZE_IN_BITS (256u) +#define SHA_OUTPUT_SIZE_IN_BYTES (SHA_OUTPUT_SIZE_IN_BITS/8u) + + +/* MAKE SURE THIS STRUCT REMAINS *******PERFECTLY ALIGNED******* WITH USER + ADI_CRYPTO_TRANSACTION BECAUSE WE USE BCOPY TO INITIALIZE EACH NEW SUBMIT! + + Internal compute structure reflecting mostly, user ADI_CRYPTO_TRANSACTION, + except for moving data pointers and remaining counts. Contents initialized + directly from from ADI_CRYPTO_TRANSACTION during buffer submit. +*/ +typedef struct _CRYPTO_COMPUTE { + ADI_CRYPTO_CIPHER_MODE eCipherMode; /*!< Cipher mode to use */ + ADI_CRYPTO_CODING_MODE eCodingMode; /*!< Coding Mode (Encryption or Decryption) */ + + ADI_CRYPTO_KEY_BYTE_SWAP eKeyByteSwap; /*!< KEY endianness */ + ADI_CRYPTO_SHA_BYTE_SWAP eShaByteSwap; /*!< SHA endianness */ + ADI_CRYPTO_AES_BYTE_SWAP eAesByteSwap; /*!< AES endianness */ + + uint8_t *pKey; /*!< Pointer to the key data pre-formatted as a byte array, according to eAesKeyLen. */ + ADI_CRYPTO_AES_KEY_LEN eAesKeyLen; /*!< The length of the key */ + + uint32_t *pNextAuthInput; /* CCM mode: pointer to user prefix buffer */ + uint32_t numAuthBytesRemaining; /* Length of the prefix buffer in bytes (should be a multiple of 16 bytes) */ + + uint32_t *pNextInput; /* Pointer to next user 32-bit input location */ + uint32_t numInputBytesRemaining; /* Number of input bytes remaining */ + + uint32_t *pNextOutput; /* Pointer to next user 32-bit output location */ + uint32_t numOutputBytesRemaining; /* Number of output bytes remaining */ + + uint8_t *pNonceIV; /*!< Pointer to user 16-byte array containing one of three values, depending on cipher mode: + CTR mode = 108-bit NONCE + CCM mode = 112-bit NONCE + CBC mode = 128-bit IV (Initialization Vector) + NONCE and IV assume little endian format, for example: CTR NONCE packing is: + NONCE[0] -> 7:0 + NONCE[1] -> 15:8 + ... + NONCE[13] -> 103:96 + NONCE[14](Bits 3:0) -> 107:104 */ + uint32_t CounterInit; /*!< CTR/CCM mode: Counter Initialization Value (CTR=20-bit, CCM=16-bit) */ + uint32_t numValidBytes; /*!< CCM mode: Number of valid bytes in the last (padding) block (1-16) */ + uint32_t numShaBitsRemaining; /*!< SHA mode: Number of bits remaining in the SHA payload, which may be odd-sized */ +} CRYPTO_COMPUTE; + + +/* Crypto device attributes */ +typedef struct _CRYPTO_INFO { + ADI_CRYPT_TypeDef *pDev; /* Pointer to physical Crypto controller */ + ADI_CRYPTO_HANDLE hDevice; /* Device Handle */ +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) + IRQn_Type dmaInputIrqNum; + IRQn_Type dmaOutputIrqNum; + DMA_CHANn_TypeDef dmaInputChanNum; + DMA_CHANn_TypeDef dmaOutputChanNum; + volatile ADI_CRYPTO_RESULT dmaError; /* DMA error collector. */ +#endif +} CRYPTO_INFO; + + +#ifdef __ICCARM__ +/* +* Pm123 (RULE 8.5) there shall be no definition of objects or functions in a header file. +* Exception is to allow the Crypto device data type and instance to be declared simultaniously. +*/ +#pragma diag_suppress=Pm123 +#endif /* __ICCARM__ */ + +/* Crypto driver internal data */ +struct __ADI_CRYPTO_DEV_DATA_TYPE { + bool bDeviceEnabled; /* Boolean flag to signify whether the device is enable/disabled */ + bool bDmaEnabled; /* Boolean flag to signify whether the DMA is enable/disabled */ + bool bCompletion; /* Boolean flag to signify whether a transaction is complete */ + + ADI_CRYPT_TypeDef *pDev; /* Pointer to physical Crypto controller */ + + CRYPTO_INFO *pDevInfo; /* access to device info */ + + CRYPTO_COMPUTE Computation; /* Active computation structure */ + + ADI_CRYPTO_TRANSACTION *pUserBuffer; /* saved user buffer pointer from submit */ + ADI_CALLBACK pfCallback; /* User defined callback function */ + void *pCBParam; /* User defined callback param */ + ADI_CRYPTO_RESULT dmaErrorCode; /* saved DMA error code to return via user API */ + + + SEM_VAR_DECLR /* Blocking object abstraction: "Semaphore" for rtos, "bLowPowerExitFlag" for non-rtos, etc. */ +} ADI_CRYPTO_DEV_DATA_TYPE; + +#ifdef __ICCARM__ +#pragma diag_default=Pm123 +#endif /* __ICCARM__ */ + +/*! \endcond */ + +#endif /* ADI_CRYPTO_DEF_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/dma/adi_dma.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/dma/adi_dma.c new file mode 100755 index 0000000000..7ced9f0449 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/dma/adi_dma.c @@ -0,0 +1,346 @@ +/*! ***************************************************************************** + * @file: adi_dma.c + * @brief: DMA manager global file. + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + + + +/*! \addtogroup DMA_Driver DMA Driver + * uDMA Device Driver. + * @{ + */ + +/*============= I N C L U D E S =============*/ +#include +#include +#include +#include +#include + +/*! \cond PRIVATE */ + +/*============= M I S R A =============*/ + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm011 (rule 6.3): he basic types of char, int, short, long, float, and double should not be used +* Need to use bool. +* +* Pm140 (rule 11.3): a cast should not be performed between a pointer type and an integral type +* The rule makes an exception for memory-mapped register accesses. +*/ +#pragma diag_suppress=Pm011,Pm140 +#endif /* __ICCARM__ */ + +/*============= D E F I N E S =============*/ + +/* CCD array allocation macros */ +#define CCD_ALIGN (0x400) /* Memory alignment required for CCD array */ +#define CCD_SIZE (32u) /* Configure CCD allocation as an integral power of two, + i.e., 24 channels is allocated as 32 */ + +/*============= R E G I S T E R D E F I N E S =============*/ + + + + +/*============= T Y P E D E F I N E S =============*/ + +/*! DMA Channel callback information structure */ +typedef struct _DMA_CHANNEL { + ADI_CALLBACK pfCallback; /*!< Pointer to the callback func */ + void* pCBParam; /*!< Application Callback param */ +} DMA_CHANNEL_CALLBACK_INFO; + +/*! \struct ADI_DMA_DEV_DATA + * DMA Device instance data structure + * + * CallbackInfo[NUM_DMA_CHANNELSn] + * The semantics of indexes used to access CallbackInfo elements is defined by the semantics + * of the bits in registers DMA_ERRCHNL_CLR and DMA_INVALIDDESC_CLR. The position of these + * bits define the channel nodes of the peripheral they map to, e.g. bit N maps to channel + * node N. + */ +typedef struct { + bool Initialized; /*!< track initialization state. See function adi_dma_Init) */ + DMA_CHANNEL_CALLBACK_INFO CallbackInfo[NUM_DMA_CHANNELSn]; + uint32_t ChannelsInUse; /*!< bits 0 to 26 record active channels */ +} ADI_DMA_DEV_DATA; + + +/*============= D A T A =============*/ + +/* DMA descriptor arrays must be contiguous */ +/* AND impose strict alignment requirements */ +/* Each compiler has different alignment directives */ + +/* ALIGNED: DMA channel control data array declaration */ +ADI_ALIGNED_PRAGMA(CCD_ALIGN) +static ADI_DCC_TypeDef gChannelControlDataArray[CCD_SIZE * 2u] ADI_ALIGNED_ATTRIBUTE(CCD_ALIGN) + +#ifdef ADI_DMA_DESCRIPTORS_IN_VOLATILE_MEMORY + /* conditional placement of DMA descriptor table to volatile memory */ + @ "volatile_ram"; +#else + /* default placement to non-volatile memory (no override) */ + ; +#endif + + +/* pointer to the primary CCD array */ +ADI_DCC_TypeDef* const pPrimaryCCD = &gChannelControlDataArray[0]; + +/* pointer to the alternate CCD array */ +ADI_DCC_TypeDef* const pAlternateCCD = &gChannelControlDataArray[CCD_SIZE]; + + +/*! DMA Device Driver Data instance + * 32 Channel Handles initialized to {0, 0}, i.e. call-back function pointer + * set to NULL and call-back function parameters set to NULL + */ +static ADI_DMA_DEV_DATA DMA_DevData = { + + false, /*!< DMA device data not initialized. (See adi_dma_Init) */ + {{0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, + {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, + {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, + {0,0}, {0,0}, {0,0}}, + 0ul /*!< channels-in-use bitfield */ +}; + +/*! pointer to the DMA Device Driver Data instance */ +static ADI_DMA_DEV_DATA* const pDMA_DevData = &DMA_DevData; + +/*============= Local function declarations =============*/ + +/*========== DMA HANDLERS ==========*/ + +/*! DMA Error Handler */ +void DMA_Err_Int_Handler(void); + +/*========== U T I L I T Y M A C R O S ==========*/ + +/*! \endcond*/ +/*============= A P I I M P L E M E N T A T I O N S =============*/ + +/*! + * @brief Initialize the DMA peripheral + * + * @return none + * + * The application must call this API once + * + */ +void adi_dma_Init(void) +{ + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + + if( false == pDMA_DevData->Initialized ) + { + pDMA_DevData->Initialized = true; + + /* Enable the DMA Controller */ + pADI_DMA0->CFG |= BITM_DMA_CFG_MEN; + + /* Set descriptor memory base pointer on DMA controller */ + pADI_DMA0->PDBPTR = (uint32_t)pPrimaryCCD; + + /* Enable the DMA Error Interrupt */ + NVIC_EnableIRQ(DMA_CHAN_ERR_IRQn); + + /* Reset per-channel, bitmapped control registers (W1C) */ + const uint32_t w1r_value = (uint32_t) ((1 << NUM_DMA_CHANNELSn) - 1); + pADI_DMA0->RMSK_SET = w1r_value; + pADI_DMA0->EN_CLR = w1r_value; + pADI_DMA0->ALT_CLR = w1r_value; + pADI_DMA0->PRI_CLR = w1r_value; + pADI_DMA0->ERRCHNL_CLR = w1r_value; + pADI_DMA0->ERR_CLR = w1r_value; + pADI_DMA0->INVALIDDESC_CLR = w1r_value; + } + + ADI_EXIT_CRITICAL_REGION(); +} + +/** + * @brief Register a call-back function for a DMA channel. + * + * @param [in] eChannelID The ID of the DMA channel being assigned a call-back function. + * @param [in] pfCallback Pointer to the application callback function. + * @param [in] pCBParam Application callback parameter. + * + * @details The function registers a call-back function for the DMA channel node + * identified by eChannelID and stores the extra parameters this call-back function + * may require. A NULL callback function pointer means "DMA channel unused". + * + * @return Status + * - #ADI_DMA_SUCCESS Successfully registered a call-back function for the given DMA channel node. + * - #ADI_DMA_ERR_NOT_INITIALIZED [D] adi_dma_Init must be called prior registering a call-back function. + * - #ADI_DMA_ERR_INVALID_PARAMETER [D] Some parameter(s) passed to the function is invalid. + */ +ADI_DMA_RESULT adi_dma_RegisterCallback ( + DMA_CHANn_TypeDef const eChannelID, + ADI_CALLBACK const pfCallback, + void* const pCBParam + ) +{ + ADI_DMA_RESULT result = ADI_DMA_SUCCESS; + +#ifdef ADI_DEBUG + /* DMA must be initialized first */ + if (false == pDMA_DevData->Initialized) { + result = ADI_DMA_ERR_NOT_INITIALIZED; + }else{ + const size_t numChannelId = sizeof(pDMA_DevData->CallbackInfo) / sizeof(DMA_CHANNEL_CALLBACK_INFO); + if (numChannelId <= eChannelID) /*!< pDMA_DevData->CallbackInfo definition is invalid */ + { + result = ADI_DMA_ERR_INVALID_PARAMETER; + } + } + if (ADI_DMA_SUCCESS == result) /* if no errors previously detected */ +#endif + { + /* eChannelID cannot be out of range by definition (we use DMA_CHANn_TypeDef) */ + DMA_CHANNEL_CALLBACK_INFO * pChannel = &pDMA_DevData->CallbackInfo[eChannelID]; + + /* Set the callback parameters */ + pChannel->pfCallback = pfCallback; /* assign the pointer to a callback function */ + pChannel->pCBParam = pCBParam; /* store the parameters to be used with the callback function */ + + const uint32_t nChannelBit = (1u << eChannelID); + if (NULL != pfCallback) { + pDMA_DevData->ChannelsInUse |= nChannelBit; /* set the bit to mark the channel as "being used" */ + }else{ + pDMA_DevData->ChannelsInUse &= (~nChannelBit); /* clear the bit to mark the channel as "not being used" */ + } + } + return result; +} + +/*! \cond PRIVATE */ + + +#if defined(__ICCARM__) + +/* ARM Cortex-M3/M4, IAR compiler (CMSIS standard) */ +#define ADI_CLZ(X) __CLZ(X) + +#elif defined(__GNUC__) + +/* ARM Cortex-M3/M4, GNU-ARM compiler */ +#define ADI_CLZ(X) __builtin_clz(X) + +#elif defined(__CC_ARM) + +/* ARM Cortex-M3/M4, Keil compiler */ +#define ADI_CLZ(X) __clz(X) + +#else + +#error "Macro ADI_CLZ undefined!!!" + +#endif + +/*! DMA Error Handler + * + * The DMA Error handler looks at the channels in use which are flagged in register ERRCHNL_CLR + * or INVALIDDESC_CLR and calls the associated call-back functions, if defined. If a call-back + * function is undefined (NULL pointer) then it means the associated driver ignores these errors. + * + * Then, all the bits set in ERRCHNL_CLR and INVALIDDESC_CLR at the time the handler is called + * are cleared. + */ +void DMA_Err_Int_Handler(void) +{ + ISR_PROLOG() + + const uint32_t nErrClr = pADI_DMA0->ERR_CLR; /* get all the bits set in ERR_CLR */ + const uint32_t nErrChnClr = pADI_DMA0->ERRCHNL_CLR; /* get all the bits set in ERRCHNL_CLR */ + const uint32_t nInvdDescClr = pADI_DMA0->INVALIDDESC_CLR; /* get all the bits set in INVALIDDESC_CLR */ + + /* if there are invalid channel descriptors or channel errors amongts the channels in use */ + uint32_t functionsToBeCalled = pDMA_DevData->ChannelsInUse & (nErrChnClr | nInvdDescClr); + + if (functionsToBeCalled > 0u) + { + const uint32_t numBits = sizeof(uint32_t) << 3; /* maximum number of bits to be considered */ + uint32_t nlz; /* number of leading zeroes in functionsToBeCalled */ + + /* For all the bits set in functionsToBeCalled, starting from the MSB */ + for (nlz = (uint32_t) ADI_CLZ(functionsToBeCalled); nlz < numBits; nlz = (uint32_t) ADI_CLZ(functionsToBeCalled)) + { + const uint32_t bitSet = numBits - nlz - 1u; /* bit position in functionsToBeCalled */ + const uint32_t selected_bit = ((uint32_t)1u << bitSet); + DMA_CHANNEL_CALLBACK_INFO* pChannel = &pDMA_DevData->CallbackInfo[bitSet]; + + /* if there's a callback function to be called */ + if (NULL != pChannel->pfCallback) + { + /* define the nature of the error: DMA bus error or else invalid descriptor */ + uint32_t nEvent = ((nErrChnClr & selected_bit) != 0u) + ? (uint32_t)ADI_DMA_EVENT_ERR_BUS + : (uint32_t)ADI_DMA_EVENT_ERR_INVALID_DESCRIPTOR; + + /* report the error to the peripheral through the callback function */ + pChannel->pfCallback (pChannel->pCBParam, nEvent, NULL ); + } + + functionsToBeCalled &= ~selected_bit; /* clear bit in functionsToBeCalled */ + } + } + + /* Clear the errors processed in the loop above */ + pADI_DMA0->ERRCHNL_CLR = nErrChnClr; /* W1C: clear only all the bits set in nErrChnClr */ + pADI_DMA0->INVALIDDESC_CLR = nInvdDescClr; /* W1C: clear only all the bits set in nInvdDescClr */ + pADI_DMA0->ERR_CLR = nErrClr; /* W1C: clear only all the bits set in nErrClr */ + + ISR_EPILOG() +} + +/*! \endcond*/ + +/**@}*/ + + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/adc/adi_adc.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/adc/adi_adc.h new file mode 100755 index 0000000000..1794f4ab2c --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/adc/adi_adc.h @@ -0,0 +1,346 @@ +/*! ***************************************************************************** + * @file adi_adc.h + * @brief Main include file for ADC Device driver definitions + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_ADC_H +#define ADI_ADC_H + +#include +#include +#include +#include /* for ADI_SEM_SIZE */ + +/** @addtogroup ADC_Driver ADC Driver +* @{ +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/*! Amount of memory(In bytes) required by the ADC device driver for managing the operation + * of a ADC controller. The memory is passed to the driver when the driver is opended. + * The memory is completely owned by the driver till the the driver is closed. + * + */ +#define ADI_ADC_MEMORY_SIZE (48u + ADI_SEM_SIZE) /*!< Memory Size of the buffer required by the ADC driver */ + + +/*! + * \enum ADI_ADC_RESULT + * ADC API return codes + */ +typedef enum { + ADI_ADC_SUCCESS = 0, /*!< No Error, API suceeded */ + ADI_ADC_INVALID_DEVICE_NUM, /*!< Invalid device number passed */ + ADI_ADC_INVALID_DEVICE_HANDLE, /*!< Invalid device handle passed */ + ADI_ADC_INVALID_STATE, /*!< Invalid State */ + ADI_ADC_INSUFFICIENT_MEMORY, /*!< Insufficient memory passed to the driver */ + ADI_ADC_IN_USE, /*!< ADC is alreaady in use */ + ADI_ADC_INVALID_PARAMETER, /*!< Invalid parameter passed to the driver */ + ADI_ADC_NULL_POINTER, /*!< Null pointer passed when expecting a valid pointer */ + ADI_ADC_FAILURE, /*!< General ADC Failure */ + ADI_ADC_INVALID_SEQUENCE, /*!< Invalid sequence of API calls */ + ADI_ADC_ERR_RTOS, /*!< RTOS error occurred */ + ADI_ADC_INVALID_OPERATION, /*!< API call is an invalid operation */ + ADI_ADC_INVALID_BUFFER, /*!< Buffer passed to the application is invalid */ + ADI_ADC_BUFFER_OVERFLOW, /*!< Buffer overflow occurred */ + ADI_ADC_DMA_ERROR, /*!< DMA Error occurred */ + ADI_ADC_BAD_SYS_CLOCK, /*!< Could not retrieve core clock value. */ +} ADI_ADC_RESULT; + +/*! + * \enum ADI_ADC_VREF_SRC + * Voltage Reference source selection. + */ +typedef enum { + ADI_ADC_VREF_SRC_INT_1_25_V, /*!< 1.25V Internal Voltage Reference */ + ADI_ADC_VREF_SRC_INT_2_50_V, /*!< 2.50V Internal Voltage Reference */ + ADI_ADC_VREF_SRC_EXT, /*!< External Voltage Reference */ + ADI_ADC_VREF_SRC_VBAT, /*!< Battery Voltage as Voltage Reference source */ +} ADI_ADC_VREF_SRC; + +/*! + * \enum ADI_ADC_RESOLUTION + * Resolution of the ADC. + */ +typedef enum { + ADI_ADC_RESOLUTION_12_BIT, /*!< 12-bit ADC Resolution */ + ADI_ADC_RESOLUTION_13_BIT, /*!< 13-bit ADC Resolution */ + ADI_ADC_RESOLUTION_14_BIT, /*!< 14-bit ADC Resolution */ + ADI_ADC_RESOLUTION_15_BIT, /*!< 15-bit ADC Resolution */ + ADI_ADC_RESOLUTION_16_BIT /*!< 16-bit ADC Resolution */ +} ADI_ADC_RESOLUTION; + +/*! + * \typedef ADI_ADC_CHANNEL + * Typedef for ADC Channels + */ +typedef uint32_t ADI_ADC_CHANNEL; + +/*! + * defines for ADC Channels + */ +#define ADI_ADC_CHANNEL_0 (1u << 0u) /*!< ADC Channel 0 */ +#define ADI_ADC_CHANNEL_1 (1u << 1u) /*!< ADC Channel 1 */ +#define ADI_ADC_CHANNEL_2 (1u << 2u) /*!< ADC Channel 2 */ +#define ADI_ADC_CHANNEL_3 (1u << 3u) /*!< ADC Channel 3 */ +#define ADI_ADC_CHANNEL_4 (1u << 4u) /*!< ADC Channel 4 */ +#define ADI_ADC_CHANNEL_5 (1u << 5u) /*!< ADC Channel 5 */ +#define ADI_ADC_CHANNEL_6 (1u << 6u) /*!< ADC Channel 6 */ +#define ADI_ADC_CHANNEL_7 (1u << 7u) /*!< ADC Channel 7 */ + +/*! + * \enum ADI_ADC_EVENT + * Callback events from the ADC driver. + */ +typedef enum { + ADI_ADC_EVENT_CALIBRATION_DONE, /*!< Calibration done event. arg to the callback function will be NULL. */ + ADI_ADC_EVENT_ADC_READY, /*!< ADC Ready event. arg to the callback function will be null */ + ADI_ADC_EVENT_OVERFLOW, /*!< Overflow event occurred. The channel(#ADI_ADC_CHANNEL) for which the overflow occurred will be passed as arg to the callback function. */ + ADI_ADC_EVENT_HIGH_LIMIT_CROSSED, /*!< High Limit crossed event. The channel(#ADI_ADC_CHANNEL) for which the limit is crossed will be passed as arg to the callback function. */ + ADI_ADC_EVENT_LOW_LIMIT_CROSSED, /*!< Low Limit crossed event. The channel(#ADI_ADC_CHANNEL) for which the limit is crossed will be passed as arg to the callback function. */ +} ADI_ADC_EVENT; + +/*! Structure which hold the details of the buffer and sampling details */ +typedef struct __ADI_ADC_BUFFER { + uint32_t nChannels; /*!< Channels to sample. Should be an ORed value of #ADI_ADC_CHANNEL enum */ + void* pDataBuffer; /*!< Pointer to the Buffer to read the sample value into. If single channel(say Channel 0) is selected + then the format of buffer will be .... but if + multiple channels (say Channel 1 and Channel2) are selected then the format of buffer will be + .... + \n The pBuffer should be 2 byte aligned. + \n + \n If N is the number of channels selected then in single iteration mode the number of samples + written to in the buffer will be N and for multiple iteration, the driver will try to fill the whole + buffer with data and it is preferred that the nBuffSize be able to accommodate a multiple of N samples. + */ + uint32_t nNumConversionPasses; /*!< Num of conversion passes */ + uint32_t nBuffSize; /*!< Size of the buffer supplied */ +} ADI_ADC_BUFFER; + +/* Type def for the ADC Handle. */ +typedef struct __ADI_ADC_DEVICE* ADI_ADC_HANDLE; /*!< ADC Device Handler */ + + +/*============= A P I F U N C T I O N S P R O T O T Y P E S =============*/ + +/* Opens an ADC device instance. */ +ADI_ADC_RESULT adi_adc_Open ( + uint32_t nDeviceNum, + void* pMemory, + uint32_t nMemorySize, + ADI_ADC_HANDLE* phDevice +); + +/* Close the given device instance */ +ADI_ADC_RESULT adi_adc_Close(ADI_ADC_HANDLE hDevice); + +/* Power up or power down the ADC */ +ADI_ADC_RESULT adi_adc_PowerUp (ADI_ADC_HANDLE hDevice, bool bPowerUp); + +/* Register the callback */ +ADI_ADC_RESULT adi_adc_RegisterCallback( + ADI_ADC_HANDLE hDevice, + ADI_CALLBACK pfCallback, + void *pCBParam +); + +/* Enables/Disables the ADC Subsystem */ + ADI_ADC_RESULT adi_adc_EnableADCSubSystem ( + ADI_ADC_HANDLE hDevice, + bool bEnable +); + +/* Returns whether the ADC subsytem is ready */ +ADI_ADC_RESULT adi_adc_IsReady ( + ADI_ADC_HANDLE hDevice, + bool *pbReady +); + +/* Set the voltage reference source */ +ADI_ADC_RESULT adi_adc_SetVrefSource ( + ADI_ADC_HANDLE hDevice, + ADI_ADC_VREF_SRC eVrefSrc +); + +/* Enable/Disable current sink */ +ADI_ADC_RESULT adi_adc_SinkEnable ( + ADI_ADC_HANDLE hDevice, + bool bEnable +); + +/* Start the ADC Calibration */ +ADI_ADC_RESULT adi_adc_StartCalibration ( + ADI_ADC_HANDLE hDevice +); + + ADI_ADC_RESULT adi_adc_IsCalibrationDone ( + ADI_ADC_HANDLE hDevice, + bool* pbCalibrationDone + ); + + +/* Set the acquisition time of ADC in ADC clock cycles */ +ADI_ADC_RESULT adi_adc_SetAcquisitionTime( + ADI_ADC_HANDLE hDevice, + uint32_t nAcqTimeInAClkCycles +); + +/* Set the delay time of ADC in ADC cycles for multi iteration mode */ +ADI_ADC_RESULT adi_adc_SetDelayTime( + ADI_ADC_HANDLE hDevice, + uint32_t nDelayInAClkCycles +); + +/* set the resolution of ADC. The default resolution of ADC is 12-bit and the ADC increases the resolution by oversampling */ +ADI_ADC_RESULT adi_adc_SetResolution ( + ADI_ADC_HANDLE hDevice, + ADI_ADC_RESOLUTION eResolution +); + +/* Enable Averaging for all ADC channels */ +ADI_ADC_RESULT adi_adc_EnableAveraging ( + ADI_ADC_HANDLE hDevice, + uint16_t nAveragingSamples +); + +/* Configure low limit for an ADC channel when it's used as a digital comparator. */ +ADI_ADC_RESULT adi_adc_SetLowLimit ( + ADI_ADC_HANDLE hDevice, + ADI_ADC_CHANNEL eChannel, + bool bEnable, + uint16_t nLowLimit +); + +/* Configure high limit for an ADC channel when it's used as a digital comparator. */ +ADI_ADC_RESULT adi_adc_SetHighLimit ( + ADI_ADC_HANDLE hDevice, + ADI_ADC_CHANNEL eChannel, + bool bEnable, + uint16_t nHighLimit +); + + +/* Configure hysteresis for an ADC channel when it's used as a digital comparator. */ +ADI_ADC_RESULT adi_adc_SetHysteresis( + ADI_ADC_HANDLE hDevice, + ADI_ADC_CHANNEL eChannel, + bool bEnable, + uint16_t nHysteresis +); + +/* Configure number of monitor cycles for an ADC channel when it's used as a digital comparator. */ +ADI_ADC_RESULT adi_adc_SetNumMonitorCycles( + ADI_ADC_HANDLE hDevice, + ADI_ADC_CHANNEL eChannel, + uint32_t nNumMonitorCycles +); + +/* Enable/Disable digital comparator for the given channel(s) */ +ADI_ADC_RESULT adi_adc_EnableDigitalComparator ( + ADI_ADC_HANDLE hDevice, + bool bEnableComparator +); + +/* Submit buffer for sampling */ +ADI_ADC_RESULT adi_adc_SubmitBuffer ( + ADI_ADC_HANDLE hDevice, + ADI_ADC_BUFFER* pBuffer +); + +/* Get a completed buffer from the driver */ +ADI_ADC_RESULT adi_adc_GetBuffer( + ADI_ADC_HANDLE hDevice, + ADI_ADC_BUFFER** ppBuffer +); + +/* Enable/Disable buffer processing */ +ADI_ADC_RESULT adi_adc_Enable ( + ADI_ADC_HANDLE hDevice, + bool bEnable +); + +/* Check whether a completed buffer is available in the driver */ +ADI_ADC_RESULT adi_adc_IsBufferAvailable( + ADI_ADC_HANDLE hDevice, + bool* pbIsBufferAvailable +); + +/* Read the given channels. This will only return once the given amount of samples are collected */ +ADI_ADC_RESULT adi_adc_ReadChannels ( + ADI_ADC_HANDLE hDevice, + uint32_t nChannels, + uint32_t nNumConversionPasses, + void* pBuffer, + uint32_t nBuffLength +); + +/* Get Battery Voltage */ +ADI_ADC_RESULT adi_adc_GetBatteryVoltage ( + ADI_ADC_HANDLE hDevice, + uint32_t nRefVoltage, + uint32_t* pnBatVoltage +); + +/* Enable/Disable Temperature Sensor */ +ADI_ADC_RESULT adi_adc_EnableTemperatureSensor ( + ADI_ADC_HANDLE hDevice, + bool bEnable + ); + +/* Get the Temperature Value */ +ADI_ADC_RESULT adi_adc_GetTemperature ( + ADI_ADC_HANDLE hDevice, + uint32_t nRefVoltage, + int32_t* pnTemperature + ); + +#ifdef __cplusplus +} +#endif + +/**@}*/ + + +#endif /* ADI_ADC_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/beep/adi_beep.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/beep/adi_beep.h new file mode 100755 index 0000000000..6fa441895e --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/beep/adi_beep.h @@ -0,0 +1,277 @@ +/*! ***************************************************************************** + * @file adi_beep.h + * @brief Main include file for BEEP device driver definitions + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ +/** @addtogroup BEEP_Driver BEEP Driver +* @{ +*/ +#ifndef ADI_BEEP_H +#define ADI_BEEP_H + +#include "adi_processor.h" + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +/*! Amount of memory(In bytes) required by the Beep device driver for managing the operation. + * This memory is completely owned by the driver till the end of the operation. + */ +#if ADI_BEEP_INCLUDE_PLAY_SEQUENCE == 1 +/*! @hideinitializer Indicates the size of the BEEP memory to be used */ +#define ADI_BEEP_MEMORY_SIZE (20u + ADI_SEM_SIZE) +#else +/*! @hideinitializer Indicates the size of the BEEP memory to be used */ +#define ADI_BEEP_MEMORY_SIZE (12u + ADI_SEM_SIZE) +#endif + +/*! + * \enum ADI_BEEP_RESULT + * Beeper API return codes + */ +typedef enum +{ + ADI_BEEP_SUCCESS = 0, /*!< No Error, API suceeded */ + + ADI_BEEP_FAILURE, /*!< An unknown error was detected */ + ADI_BEEP_ALREADY_INITIALIZED, /*!< BEEP is already initialized */ + ADI_BEEP_BAD_DEV_HANDLE, /*!< Invalid device handle passed */ + ADI_BEEP_BAD_DEV_ID, /*!< Asking to initialize an unknown device num */ + ADI_BEEP_NOT_INITIALIZED, /*!< BEEP not yet initialized */ + ADI_BEEP_PARAM_OUT_OF_RANGE, /*!< Parameter is out of range. */ + ADI_BEEP_INVALID_COUNT, /*!< Invalid count for supplied beep sequence */ + ADI_BEEP_NULL_PTR, /*!< Null pointer supplied. */ + ADI_BEEP_SEMAPHORE_FAILED, /*!< BEEP semaphore failure. */ +} ADI_BEEP_RESULT; + + +/*! + * \enum ADI_BEEP_DEV_ID + * @brief Beeper Device IDs. + * @details List of all Beeper Device IDs for the current part + */ +typedef enum +{ + ADI_BEEP_DEVID_0 = 0, /*!< BEEP Timer Device 0 */ + ADI_BEEP_MAX_DEVID /*!< max number of BEEP devices */ +} ADI_BEEP_DEV_ID; + +/*! + * \enum ADI_BEEP_INTERRUPT + * @brief Beeper Interrupt Bits. + * @details List of all Beeper interrupt (enables and status) bits. + */ +typedef enum +{ + ADI_BEEP_INTERRUPT_SEQUENCE_END = BITM_BEEP_CFG_SEQATENDIRQ, /*!< Beeper sequence has finished */ + ADI_BEEP_INTERRUPT_NOTE_END = BITM_BEEP_CFG_AENDIRQ, /*!< Beeper note has finished */ +} ADI_BEEP_INTERRUPT; + + +#define LFCLK_FREQ 32768.0f /*!< Beeper main clock frequency. */ +#define FREQUENCY_ENCODE(x) (uint8_t)(LFCLK_FREQ/(x) + 0.5f) /*!< Beeper tone frequency encoder macro */ + +/*! + * \enum ADI_BEEP_NOTE_FREQUENCY + * @brief Beeper tone frequency list. + * @details List of possible Beeper tone frequencies. + */ +typedef enum { + /* Constants are pre-computed note frequencies (Hz). */ + /* See http://www.phy.mtu.edu/~suits/notefreqs.html. */ + /* Encodings are clock divider values for that note. */ + /* Flats are the same as the lower sharp, so only sharps are listed. */ + /* Even though octaves are simple frequency doublings/halvings */ + /* of adjuacient octaves, we pre-compute each constant (as opposed */ + /* to halving/doubling the encodings between octaves) to */ + /* minimize repeated doubling/halving errors across all octaves. */ + /* !!!ALL ENCODINGS MUST BE IN THE RANGE 4-127!!! */ + + ADI_BEEP_FREQ_REST = (0), /*!< silence */ + + ADI_BEEP_FREQ_C4 = FREQUENCY_ENCODE(261.63f), /*!< Middle C (lowest representable frequency @ 32KHz) */ + ADI_BEEP_FREQ_Cs4 = FREQUENCY_ENCODE(277.18f), + ADI_BEEP_FREQ_D4 = FREQUENCY_ENCODE(293.66f), + ADI_BEEP_FREQ_Ds4 = FREQUENCY_ENCODE(311.13f), + ADI_BEEP_FREQ_E4 = FREQUENCY_ENCODE(329.63f), + ADI_BEEP_FREQ_F4 = FREQUENCY_ENCODE(349.23f), + ADI_BEEP_FREQ_Fs4 = FREQUENCY_ENCODE(369.99f), + ADI_BEEP_FREQ_G4 = FREQUENCY_ENCODE(392.00f), + ADI_BEEP_FREQ_Gs4 = FREQUENCY_ENCODE(415.30f), + ADI_BEEP_FREQ_A4 = FREQUENCY_ENCODE(440.00f), + ADI_BEEP_FREQ_As4 = FREQUENCY_ENCODE(466.16f), + ADI_BEEP_FREQ_B4 = FREQUENCY_ENCODE(493.88f), + + ADI_BEEP_FREQ_C5 = FREQUENCY_ENCODE(523.25f), + ADI_BEEP_FREQ_Cs5 = FREQUENCY_ENCODE(554.37f), + ADI_BEEP_FREQ_D5 = FREQUENCY_ENCODE(587.33f), + ADI_BEEP_FREQ_Ds5 = FREQUENCY_ENCODE(622.25f), + ADI_BEEP_FREQ_E5 = FREQUENCY_ENCODE(659.26f), + ADI_BEEP_FREQ_F5 = FREQUENCY_ENCODE(698.46f), + ADI_BEEP_FREQ_Fs5 = FREQUENCY_ENCODE(739.99f), + ADI_BEEP_FREQ_G5 = FREQUENCY_ENCODE(783.99f), + ADI_BEEP_FREQ_Gs5 = FREQUENCY_ENCODE(830.61f), + ADI_BEEP_FREQ_A5 = FREQUENCY_ENCODE(880.00f), + ADI_BEEP_FREQ_As5 = FREQUENCY_ENCODE(932.33f), + ADI_BEEP_FREQ_B5 = FREQUENCY_ENCODE(987.77f), + + ADI_BEEP_FREQ_C6 = FREQUENCY_ENCODE(1046.50f), + ADI_BEEP_FREQ_Cs6 = FREQUENCY_ENCODE(1108.73f), + ADI_BEEP_FREQ_D6 = FREQUENCY_ENCODE(1174.66f), + ADI_BEEP_FREQ_Ds6 = FREQUENCY_ENCODE(1244.51f), + ADI_BEEP_FREQ_E6 = FREQUENCY_ENCODE(1318.51f), + ADI_BEEP_FREQ_F6 = FREQUENCY_ENCODE(1396.91f), + ADI_BEEP_FREQ_Fs6 = FREQUENCY_ENCODE(1479.98f), + ADI_BEEP_FREQ_G6 = FREQUENCY_ENCODE(1567.98f), + ADI_BEEP_FREQ_Gs6 = FREQUENCY_ENCODE(1661.22f), + ADI_BEEP_FREQ_A6 = FREQUENCY_ENCODE(1760.00f), + ADI_BEEP_FREQ_As6 = FREQUENCY_ENCODE(1864.66f), + ADI_BEEP_FREQ_B6 = FREQUENCY_ENCODE(1975.53f), + + ADI_BEEP_FREQ_C7 = FREQUENCY_ENCODE(2093.00f), + ADI_BEEP_FREQ_Cs7 = FREQUENCY_ENCODE(2217.46f), + ADI_BEEP_FREQ_D7 = FREQUENCY_ENCODE(2349.32f), + ADI_BEEP_FREQ_Ds7 = FREQUENCY_ENCODE(2489.02f), + ADI_BEEP_FREQ_E7 = FREQUENCY_ENCODE(2637.02f), + ADI_BEEP_FREQ_F7 = FREQUENCY_ENCODE(2793.83f), + ADI_BEEP_FREQ_Fs7 = FREQUENCY_ENCODE(2959.96f), + ADI_BEEP_FREQ_G7 = FREQUENCY_ENCODE(3135.96f), + ADI_BEEP_FREQ_Gs7 = FREQUENCY_ENCODE(3322.44f), + ADI_BEEP_FREQ_A7 = FREQUENCY_ENCODE(3520.00f), + ADI_BEEP_FREQ_As7 = FREQUENCY_ENCODE(3729.31f), + ADI_BEEP_FREQ_B7 = FREQUENCY_ENCODE(3951.07f), + + ADI_BEEP_FREQ_C8 = FREQUENCY_ENCODE(4186.01f), + ADI_BEEP_FREQ_Cs8 = FREQUENCY_ENCODE(4434.92f), + ADI_BEEP_FREQ_D8 = FREQUENCY_ENCODE(4698.64f), + ADI_BEEP_FREQ_Ds8 = FREQUENCY_ENCODE(4978.03f), + ADI_BEEP_FREQ_E8 = FREQUENCY_ENCODE(5274.04f), + ADI_BEEP_FREQ_F8 = FREQUENCY_ENCODE(5587.65f), + ADI_BEEP_FREQ_Fs8 = FREQUENCY_ENCODE(5919.91f), + ADI_BEEP_FREQ_G8 = FREQUENCY_ENCODE(6271.93f), +} ADI_BEEP_NOTE_FREQUENCY; + +#define ADI_BEEP_DUR_ZERO (0) /*!< Beeper zero tone duration value */ +#define ADI_BEEP_DUR_MIN (1) /*!< Beeper minimum tone duration value */ +#define ADI_BEEP_DUR_MAX (254) /*!< Beeper maximum tone duration value */ +#define ADI_BEEP_DUR_INFINITE (255) /*!< Beeper infinite tone duration value */ + +/*! A device handle used in all API functions to identify the BEEP device. */ +typedef void * ADI_BEEP_HANDLE; + +#define DURATION_ENCODE(x) (uint8_t)((float)ADI_BEEP_DUR_MAX/(float)(x) + 0.5f) /*!< Beeper tone duration encoder macro */ + +/*! + * \enum ADI_BEEP_NOTE_DURATION + * @brief Beeper tone duration list. + * @details List of possible Beeper tone durations. + */ +typedef enum { + ADI_BEEP_DUR_0 = ADI_BEEP_DUR_ZERO, /*!< stop */ + ADI_BEEP_DUR_32_32 = DURATION_ENCODE(1), /*!< whole note (1.016 seconds) */ + ADI_BEEP_DUR_16_32 = DURATION_ENCODE(2), /*!< half note */ + ADI_BEEP_DUR_12_32 = DURATION_ENCODE(8/3), /*!< three eights note */ + ADI_BEEP_DUR_8_32 = DURATION_ENCODE(4), /*!< one quarter note */ + ADI_BEEP_DUR_6_32 = DURATION_ENCODE(16/3), /*!< three sixteenth note */ + ADI_BEEP_DUR_4_32 = DURATION_ENCODE(8), /*!< one eighth note */ + ADI_BEEP_DUR_2_32 = DURATION_ENCODE(16), /*!< one sixteenth note */ + ADI_BEEP_DUR_1_32 = DURATION_ENCODE(32), /*!< one thirty-secondth note */ + ADI_BEEP_DUR_N = ADI_BEEP_DUR_INFINITE, /*!< continuous play */ +} ADI_BEEP_NOTE_DURATION; + +/*! + * \struct ADI_BEEP_NOTE + * @brief Beeper note structure. + * @details Describes a note in terms of frequency and duration. + */ +typedef struct { + ADI_BEEP_NOTE_FREQUENCY frequency; /*!< Frequency of the note */ + ADI_BEEP_NOTE_DURATION duration; /*!< Duration of the note */ +} ADI_BEEP_NOTE; + + +/*================ E X T E R N A L S ==================*/ + +/* + * Beeper API + */ + +ADI_BEEP_RESULT adi_beep_Open (ADI_BEEP_DEV_ID const DeviceNum, + void* const pMemory, + uint32_t const MemorySize, + ADI_BEEP_HANDLE* const phDevice); + +ADI_BEEP_RESULT adi_beep_RegisterCallback (ADI_BEEP_HANDLE const hDevice, + ADI_CALLBACK pfCallback, + void* const pCBParam); + +ADI_BEEP_RESULT adi_beep_PlayNote (ADI_BEEP_HANDLE const hDevice, + ADI_BEEP_NOTE note); + +ADI_BEEP_RESULT adi_beep_PlayTwoTone (ADI_BEEP_HANDLE const hDevice, + ADI_BEEP_NOTE noteA, + ADI_BEEP_NOTE noteB, + uint8_t count); + +ADI_BEEP_RESULT adi_beep_PlaySequence (ADI_BEEP_HANDLE const hDevice, + ADI_BEEP_NOTE aSequence[], + uint8_t count); + +ADI_BEEP_RESULT adi_beep_Enable (ADI_BEEP_HANDLE const hDevice, + bool const bFlag); + +ADI_BEEP_RESULT adi_beep_Wait (ADI_BEEP_HANDLE const hDevice); + +ADI_BEEP_RESULT adi_beep_Close (ADI_BEEP_HANDLE const hDevice); + +#ifdef __cplusplus +} +#endif + + +#endif /* ADI_BEEP_H */ +/*@}*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/crc/adi_crc.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/crc/adi_crc.h new file mode 100755 index 0000000000..9fddbc6085 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/crc/adi_crc.h @@ -0,0 +1,236 @@ +/*! ***************************************************************************** + * @file adi_crc.h + * @brief CRC (Cyclic Redundancy Check) Device driver global include file + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_CRC_H +#define ADI_CRC_H + +/** @addtogroup CRC_Driver CRC Device Driver + * @{ + */ + +#include + +/*============= I N C L U D E S =============*/ +#include +/* Memory size check */ +#include + +/* DMA Manager includes */ +#include + +/* Include the config file for CRC */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*============== D E F I N E S ===============*/ + +#if (ADI_CRC_CFG_ENABLE_DMA_SUPPORT == 0) + + +/** + * The size of types may vary between building tools (int, char, enumerator, etc.). + * This impacts the memory size required by a CRC driver. + * Consequently, ADI_CRC_MEMORY_SIZE is environment dependent. + */ +#if defined(__ICCARM__) +/** + * The amount of application supplied memory required to operate a core driven CRC device + * using a CRC driver built in IAR environment. + */ +#define ADI_CRC_MEMORY_SIZE (32u) +#else +/** + * The amount of application supplied memory required to operate a core driven CRC device + * using a CRC driver built in a generic built environment. + * Note: Create a new macro definition for your targetted development environment + * if this generic value was not appropriate in your development environment. + */ +#define ADI_CRC_MEMORY_SIZE (32u) +#endif + + +#else /* ADI_CRC_CFG_ENABLE_DMA_SUPPORT */ + + +/** + * The size of types may vary between building tools (int, char, enumerator, etc.). + * This impacts the memory size required by a CRC driver. + * Consequently, ADI_CRC_MEMORY_SIZE is environment dependent. + */ +#if defined(__ICCARM__) +/** + * The amount of application supplied memory required to operate a DMA driven CRC device + * using a CRC driver built in IAR environment. + */ +#define ADI_CRC_MEMORY_SIZE (32u) +#else +/** + * The amount of application supplied memory required to operate a DMA driven CRC device + * using a CRC driver built in a generic built environment. + * Note: Create a new macro definition for your targetted development environment + * if this generic value was not appropriate in your development environment. + */ +#define ADI_CRC_MEMORY_SIZE (32u) +#endif + +/** Check that a DMA channel can be used with CRC */ +#define ADI_CRC_VALID_DMA_CHANNEL(DMA_CHANNEL_ID) ((SIP0_CHANn<=(DMA_CHANNEL_ID)) && ((DMA_CHANNEL_ID)<=SIP7_CHANn)) + +/** + * CRC events used in CRC callback functions to report + * - the completion of a DMA driven CRC request + * - errors detected when executing a DMA driven CRC request + */ +typedef enum __ADI_CRC_EVENT +{ + /*! DMA driven CRC peripheral has completed processing a request */ + ADI_CRC_EVENT_BUFFER_PROCESSED = ADI_DMA_EVENT_BUFFER_PROCESSED, + + /*! DMA driven CRC peripheral has encountered a problem when processing a request */ + ADI_CRC_EVENT_ERROR +} ADI_CRC_EVENT; + +#endif /* ADI_CRC_CFG_ENABLE_DMA_SUPPORT */ + +/** + * A device handle used in all API functions to identify a CRC device. + * This handle is obtained when opening a CRC driver using adi_crc_Open. + * It stops being valid after closing the CRC driver using adi_crc_Close. + */ +typedef struct __ADI_CRC_DEVICE* ADI_CRC_HANDLE; + +/** + * CRC driver return codes + */ +typedef enum +{ + ADI_CRC_SUCCESS = 0, /*!< 0x00 - Generic success */ + ADI_CRC_FAILURE, /*!< 0x01 - Generic failure */ + ADI_CRC_IN_USE, /*!< 0x02 - Supplied CRC device number is already open and in use */ + ADI_CRC_INSUFFICIENT_MEMORY, /*!< 0x03 - Supplied memory is insufficient to operate the CRC device */ + ADI_CRC_FN_NOT_SUPPORTED, /*!< 0x04 - Function not supported */ + ADI_CRC_FN_NOT_PERMITTED, /*!< 0x05 - Function not permitted at current stage */ + ADI_CRC_BAD_HANDLE, /*!< 0x06 - Bad CRC device handle (can be caused by a CRC device not opened)*/ + ADI_CRC_BAD_DEVICE_NUMBER, /*!< 0x07 - There is no CRC device identified by this number */ + ADI_CRC_INVALID_DMA_CHANNEL, /*!< 0x08 - Invalid DMA channel assigned to a CRC driver */ + ADI_CRC_INVALID_PARAMETER, /*!< 0x09 - Invalid parameter used in a CRC function */ +} ADI_CRC_RESULT; + +/*======= P U B L I C P R O T O T Y P E S ========*/ +/* (globally-scoped functions) */ + +/* Opens a CRC device instance */ +ADI_CRC_RESULT adi_crc_Open( + uint32_t DeviceNum, + void *pMemory, + uint32_t MemorySize, + ADI_CRC_HANDLE *phDevice); + +/* Closes a CRC device instance */ +ADI_CRC_RESULT adi_crc_Close( + ADI_CRC_HANDLE const hDevice); + +/* Registers or unregisters a callback, used by the CRC interrupt handler or with DMA driven operations, with the CRC device */ +ADI_CRC_RESULT adi_crc_RegisterCallback( + ADI_CRC_HANDLE const hDevice, + ADI_CALLBACK pfCallback, + void *const pCBParam); + +/* Sets the 32-bit polynomial for CRC operations */ +ADI_CRC_RESULT adi_crc_SetPolynomialVal( + ADI_CRC_HANDLE const hDevice, + uint32_t PolynomialVal); + +/* Submits data buffer for CRC operation */ +ADI_CRC_RESULT adi_crc_Compute( + ADI_CRC_HANDLE const hDevice, + void *pCrcBuf, + uint32_t NumBytes, + uint32_t NumBits); + +/* Gets the current CRC peripheral status */ +ADI_CRC_RESULT adi_crc_IsCrcInProgress( + ADI_CRC_HANDLE const hDevice, + bool *pbCrcInProgress); + +/* Gets the final CRC result computed for a data stream */ +ADI_CRC_RESULT adi_crc_GetFinalCrcVal( + ADI_CRC_HANDLE const hDevice, + uint32_t *pFinalCrcVal); + +/* Gets the current/intermediate CRC result computed for a data stream */ +ADI_CRC_RESULT adi_crc_GetCurrentCrcVal( + ADI_CRC_HANDLE const hDevice, + uint32_t *pCurrentCrcVal); + +ADI_CRC_RESULT adi_crc_SetBitMirroring( + ADI_CRC_HANDLE const hDevice, + const bool bEnable); + +ADI_CRC_RESULT adi_crc_SetByteMirroring( + ADI_CRC_HANDLE const hDevice, + const bool bEnable); + +ADI_CRC_RESULT adi_crc_EnableWordSwap( + ADI_CRC_HANDLE const hDevice, + const bool bEnable); + +ADI_CRC_RESULT adi_crc_SetCrcSeedVal( + ADI_CRC_HANDLE const hDevice, + uint32_t CrcSeedVal); + +ADI_CRC_RESULT adi_crc_SetLSBFirst( + ADI_CRC_HANDLE const hDevice, + const bool bEnable); + +#ifdef __cplusplus +} +#endif + +/*@}*/ + +#endif /* ADI_CRC_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/crypto/adi_crypto.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/crypto/adi_crypto.h new file mode 100755 index 0000000000..54971c2217 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/crypto/adi_crypto.h @@ -0,0 +1,235 @@ +/*! ***************************************************************************** + * @file adi_crypto.h + * @brief Main include file for CRYPTO Device driver definitions + ----------------------------------------------------------------------------- +Copyright (c) 2010-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + + +/** @addtogroup Crypto_Driver Crypto Driver +* @{ +*/ + +#ifndef ADI_CRYPTO_H +#define ADI_CRYPTO_H + + /*! \cond PRIVATE */ +#include +#include +#include /* for ADI_SEM_SIZE */ +/*! \endcond */ +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*! + * \enum ADI_CRYPTO_RESULT + * Crypto API return codes + */ +typedef enum +{ + ADI_CRYPTO_SUCCESS = 0, /*!< No Error, API suceeded. */ + ADI_CRYPTO_ERR_ALREADY_INITIALIZED, /*!< Crypto is already initialized. */ + ADI_CRYPTO_ERR_BAD_BUFFER, /*!< Invalid buffer parameters. */ + ADI_CRYPTO_ERR_BAD_CONFIG, /*!< Invalid device config parameters passed. */ + ADI_CRYPTO_ERR_BAD_DEVICE_NUM, /*!< Invalid device instance number. */ + ADI_CRYPTO_ERR_BAD_DEV_HANDLE, /*!< Invalid device handle passed. */ + ADI_CRYPTO_ERR_COMPUTE_ACTIVE, /*!< Computation underway. */ + ADI_CRYPTO_ERR_DMA_BUS_FAULT, /*!< Runtime DMA bus fault detected. */ + ADI_CRYPTO_ERR_DMA_INVALID_DESCR, /*!< Runtime DMA invalid descriptor detected. */ + ADI_CRYPTO_ERR_DMA_REGISTER, /*!< Error registering DMA error callback function. */ + ADI_CRYPTO_ERR_DMA_UNKNOWN_ERROR, /*!< Unknown runtime DMA error detected. */ + ADI_CRYPTO_ERR_INSUFFICIENT_MEM, /*!< Insufficient memory passed to the driver. */ + ADI_CRYPTO_ERR_INVALID_PARAM, /*!< Invalid function parameter. */ + ADI_CRYPTO_ERR_INVALID_STATE, /*!< Operation failed since the device is in an invalid state. */ + ADI_CRYPTO_ERR_SEMAPHORE_FAILED, /*!< Failure in semaphore functions. */ +} ADI_CRYPTO_RESULT; + +/*! + * \enum ADI_CRYPTO_EVENT + * Crypto callback events + */ +typedef enum +{ + /* successful buffer completion events */ + ADI_CRYPTO_EVENT_STATUS_CBC_DONE, /*!< CBC operation is complete. */ + ADI_CRYPTO_EVENT_STATUS_CCM_DONE, /*!< CCM operation is complete. */ + ADI_CRYPTO_EVENT_STATUS_CMAC_DONE, /*!< CMAC operation is complete. */ + ADI_CRYPTO_EVENT_STATUS_CTR_DONE, /*!< CTR operation is complete. */ + ADI_CRYPTO_EVENT_STATUS_ECB_DONE, /*!< ECB operation is complete. */ + ADI_CRYPTO_EVENT_STATUS_HMAC_DONE, /*!< HMAC operation is complete. */ + ADI_CRYPTO_EVENT_STATUS_SHA_DONE, /*!< SHA operation is complete. */ + + /* other events */ + ADI_CRYPTO_EVENT_DMA_BUS_ERROR, /*!< DMA bus error encountered. */ + ADI_CRYPTO_EVENT_DMA_DESCRIPTOR_ERROR, /*!< DMA descriptor error encountered. */ + ADI_CRYPTO_EVENT_DMA_UNKNOWN_ERROR, /*!< DMA unknown error encountered. */ + ADI_CRYPTO_EVENT_STATUS_INPUT_OVERFLOW, /*!< Input overflow error encountered. */ + ADI_CRYPTO_EVENT_STATUS_UNKNOWN, /*!< Unknown error encountered. */ +} ADI_CRYPTO_EVENT; + +/*! The amount of application supplied memory used by the CRYPTO driver to store internal state. */ +#define ADI_CRYPTO_MEMORY_SIZE (88u + ADI_SEM_SIZE) + +/*! A device handle used in all API functions to identify the flash device. */ +typedef struct __ADI_CRYPTO_DEV_DATA_TYPE* ADI_CRYPTO_HANDLE; + +/*! Number of bytes to allocate for SHA256 hash outputs */ +#define ADI_CRYPTO_SHA_HASH_BYTES (256u/8u) + +/*! Computation mode(Encryption/Decryption) for given buffers */ +typedef enum +{ + ADI_CRYPTO_DECODE = (0u << BITP_CRYPT_CFG_ENCR), /*!< Encoding mode is decryption. */ + ADI_CRYPTO_ENCODE = (1u << BITP_CRYPT_CFG_ENCR), /*!< Encoding mode is encryption. */ +} ADI_CRYPTO_CODING_MODE; + +/*! Enum for the AES KEY Length */ +typedef enum +{ + ADI_CRYPTO_AES_KEY_LEN_128_BIT = (0u << BITP_CRYPT_CFG_AESKEYLEN), /*!< KEY length is 128 bits. */ + ADI_CRYPTO_AES_KEY_LEN_256_BIT = (2u << BITP_CRYPT_CFG_AESKEYLEN), /*!< KEY length is 256 bits. */ +} ADI_CRYPTO_AES_KEY_LEN; + +/*! Enable byte swapping for KEY writes */ +typedef enum +{ + ADI_CRYPTO_KEY_LITTLE_ENDIAN = (0u << BITP_CRYPT_CFG_KEY_BYTESWAP), /*!< Do not apply KEY write byte swaps. */ + ADI_CRYPTO_KEY_BIG_ENDIAN = (1u << BITP_CRYPT_CFG_KEY_BYTESWAP), /*!< Apply KEY write byte swaps. */ +} ADI_CRYPTO_KEY_BYTE_SWAP; + +/*! Byte-swap the SHA Input Data */ +typedef enum +{ + ADI_CRYPTO_SHA_LITTLE_ENDIAN = (0u << BITP_CRYPT_CFG_SHA_BYTESWAP), /*!< Do not apply SHA data write byte swaps. */ + ADI_CRYPTO_SHA_BIG_ENDIAN = (1u << BITP_CRYPT_CFG_SHA_BYTESWAP), /*!< Apply SHA data write byte swaps. */ +} ADI_CRYPTO_SHA_BYTE_SWAP; + +/*! Byte-swap the AES Input Data */ +typedef enum +{ + ADI_CRYPTO_AES_LITTLE_ENDIAN = (0u << BITP_CRYPT_CFG_AES_BYTESWAP), /*!< Do not apply AES data write byte swaps. */ + ADI_CRYPTO_AES_BIG_ENDIAN = (1u << BITP_CRYPT_CFG_AES_BYTESWAP), /*!< Apply AES data write byte swaps. */ +} ADI_CRYPTO_AES_BYTE_SWAP; + +/*! + * \enum ADI_CRYPTO_CIPHER_MODE + * Enum for the cipher modes. + */ +typedef enum { + ADI_CRYPTO_MODE_CBC = BITM_CRYPT_CFG_CBCEN, /*!< Select CBC cipher mode. */ + ADI_CRYPTO_MODE_CCM = BITM_CRYPT_CFG_CCMEN, /*!< Select CCM cipher mode. */ + ADI_CRYPTO_MODE_CMAC = BITM_CRYPT_CFG_CMACEN, /*!< Select CMAC cipher mode. */ + ADI_CRYPTO_MODE_CTR = BITM_CRYPT_CFG_CTREN, /*!< Select CTR cipher mode. */ + ADI_CRYPTO_MODE_ECB = BITM_CRYPT_CFG_ECBEN, /*!< Select ECB cipher mode. */ + ADI_CRYPTO_MODE_HMAC = BITM_CRYPT_CFG_HMACEN, /*!< Select HMAC cipher mode. */ + ADI_CRYPTO_MODE_SHA = BITM_CRYPT_CFG_SHA256EN, /*!< Select SHA cipher mode. */ +} ADI_CRYPTO_CIPHER_MODE; + +/*! superset user Crypto transaction structure (different elements used for different modes) */ +typedef struct +{ + ADI_CRYPTO_CIPHER_MODE eCipherMode; /*!< Cipher mode to use */ + ADI_CRYPTO_CODING_MODE eCodingMode; /*!< Coding Mode (Encryption or Decryption) */ + + ADI_CRYPTO_KEY_BYTE_SWAP eKeyByteSwap; /*!< KEY endianness */ + ADI_CRYPTO_SHA_BYTE_SWAP eShaByteSwap; /*!< SHA endianness */ + ADI_CRYPTO_AES_BYTE_SWAP eAesByteSwap; /*!< AES endianness */ + + uint8_t *pKey; /*!< Pointer to the KEY data: pre-formatted as a byte array, according to eAesKeyLen. */ + ADI_CRYPTO_AES_KEY_LEN eAesKeyLen; /*!< The length of the AES KEY */ + + uint32_t *pAuthData; /*!< CCM mode: pointer to user prefix buffer */ + uint32_t numAuthBytes; /*!< Length of the prefix buffer in bytes (should be a multiple of 16 bytes) */ + + uint32_t *pInputData; /*!< Pointer to user input data buffer */ + uint32_t numInputBytes; /*!< Length of the data buffer in bytes (should be a multiple of 16bytes) */ + + uint32_t *pOutputData; /*!< Pointer to user output buffer */ + uint32_t numOutputBytes; /*!< Length of the output buffer in bytes (should be a multiple of 16bytes) */ + + uint8_t *pNonceIV; /*!< Pointer to user 16-byte array containing one of three values, depending on cipher mode:\n + - CTR mode = 108-bit NONCE\n + - CCM mode = 112-bit NONCE\n + - CBC mode = 128-bit IV (Initialization Vector)\n\n + NONCE and IV assume little endian format, for example: CTR NONCE packing is:\n + - NONCE[0] -> 7:0\n + - NONCE[1] -> 15:8\n + - ...\n + - NONCE[13] -> 103:96\n + - NONCE[14](Bits 3:0) -> 107:104\n + */ + uint32_t CounterInit; /*!< CTR/CCM mode: Counter Initialization Value (CTR=20-bit, CCM=16-bit) */ + uint32_t numValidBytes; /*!< CCM mode: Number of valid bytes in the last (padding) block (1-16) */ + uint32_t numShaBits; /*!< SHA mode: Number of bits in the SHA payload, which may be odd-sized */ +} ADI_CRYPTO_TRANSACTION; + + +/*================ PUBLIC API ==================*/ + + +ADI_CRYPTO_RESULT adi_crypto_Open (uint32_t const nDeviceNum, void * const pMemory, uint32_t const nMemorySize, ADI_CRYPTO_HANDLE * const phDevice); +ADI_CRYPTO_RESULT adi_crypto_Close (ADI_CRYPTO_HANDLE const hDevice); +ADI_CRYPTO_RESULT adi_crypto_RegisterCallback (ADI_CRYPTO_HANDLE const hDevice, ADI_CALLBACK const pfCallback, void * const pCBParam); +ADI_CRYPTO_RESULT adi_crypto_Enable (ADI_CRYPTO_HANDLE const hDevice, bool const bEnable); + +ADI_CRYPTO_RESULT adi_crypto_SubmitBuffer (ADI_CRYPTO_HANDLE const hDevice, ADI_CRYPTO_TRANSACTION * const pBuffer); +ADI_CRYPTO_RESULT adi_crypto_GetBuffer (ADI_CRYPTO_HANDLE const hDevice, ADI_CRYPTO_TRANSACTION ** const ppBuffer); +ADI_CRYPTO_RESULT adi_crypto_IsBufferAvailable (ADI_CRYPTO_HANDLE const hDevice, bool * const pbAvailable); + +#if (ADI_CRYPTO_ENABLE_DMA_SUPPORT == 1) +ADI_CRYPTO_RESULT adi_crypto_EnableDmaMode (ADI_CRYPTO_HANDLE const hDevice, bool const bEnable); +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* include guard */ + +/* +** EOF +*/ + +/*@}*/ + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/dma/adi_dma.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/dma/adi_dma.h new file mode 100755 index 0000000000..63c3bb2cf9 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/dma/adi_dma.h @@ -0,0 +1,274 @@ +/*! + ***************************************************************************** + * @file: adi_dma.h + * @brief: DMA Device Definitions for ADuCxxx + *----------------------------------------------------------------------------- + * +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ADI_DMA_MODE_PING_PONG +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *****************************************************************************/ + +/*! \addtogroup DMA_Driver DMA Driver + * @{ + * @brief DMA Driver + * @details This driver is intended to be used only by the device drivers and not by the application. + * @note The device drivers must include drivers/dma/adi_dma.h to use this driver + */ + +#ifndef ADI_DMA__H__ +#define ADI_DMA__H__ + +#include + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*============= D E F I N E S =============*/ +/*! Amount of memory(In bytes) required by the DMA manager for managing the operation + * This memory is completely owned by the driver till the end of the operation. + */ + +/*============= D A T A T Y P E S =============*/ + + +/*! + * Dma Data Increments + */ +typedef enum +{ + ADI_DMA_INCR_1_BYTE = 0x00u, /*!< Byte increment */ + ADI_DMA_INCR_2_BYTE = 0x01u, /*!< Half word increment */ + ADI_DMA_INCR_4_BYTE = 0x02u, /*!< Word increment */ + ADI_DMA_INCR_NONE = 0x03u, /*!< No increment */ + + ADI_DMA_DECR_1_BYTE = 0x10u, /*!< Byte decrement */ + ADI_DMA_DECR_2_BYTE = 0x11u, /*!< Half word decrement */ + ADI_DMA_DECR_4_BYTE = 0x12u /*!< Word decrement */ + +} ADI_DMA_INCR_TYPE; + +/*! + * DMA Callback Events + */ +typedef enum +{ + ADI_DMA_EVENT_BUFFER_PROCESSED, /*!< Buffer processed event */ + ADI_DMA_EVENT_ERR_BUS, /*!< Bus Error Occurred Event */ + ADI_DMA_EVENT_ERR_INVALID_DESCRIPTOR /*!< Invalid Descriptor Event */ +} ADI_DMA_EVENT; + + +/*! + * Dma Data Widths + */ +typedef enum +{ + ADI_DMA_WIDTH_1_BYTE = 0x0, /*!< 8-bit */ + ADI_DMA_WIDTH_2_BYTE = 0x1, /*!< 16-bit */ + ADI_DMA_WIDTH_4_BYTE = 0x2 /*!< 32-bit */ +} ADI_DMA_WIDTH_TYPE; + + +/*! + * Dma Rearbitration Intervals (chunk size between bus arbitrations) + */ +typedef enum +{ + ADI_DMA_RPOWER_1 = 0, /*!< Rearbitrate after 1 transfer */ + ADI_DMA_RPOWER_2, /*!< Rearbitrate after 2 transfers */ + ADI_DMA_RPOWER_4, /*!< Rearbitrate after 4 transfers */ + ADI_DMA_RPOWER_8, /*!< Rearbitrate after 8 transfers */ + ADI_DMA_RPOWER_16, /*!< Rearbitrate after 16 transfers */ + ADI_DMA_RPOWER_32, /*!< Rearbitrate after 32 transfers */ + ADI_DMA_RPOWER_64, /*!< Rearbitrate after 64 transfers */ + ADI_DMA_RPOWER_128, /*!< Rearbitrate after 128 transfers */ + ADI_DMA_RPOWER_256, /*!< Rearbitrate after 256 transfers */ + ADI_DMA_RPOWER_512, /*!< Rearbitrate after 512 transfers */ + ADI_DMA_RPOWER_1024 /*!< Rearbitrate after 1024 transfers */ +} ADI_DMA_RPOWER; + + +/*! + * Dma Transfer Modes + */ +typedef enum +{ + ADI_DMA_MODE_BASIC, /*!< Basic mode */ + ADI_DMA_MODE_AUTO, /*!< Auto request mode */ + ADI_DMA_MODE_PING_PONG, /*!< Ping pong mode */ + ADI_DMA_MODE_MSG, /*!< Memory Scatter gather mode (not valid as no Memory DMA support) */ + ADI_DMA_MODE_PSG /*!< Peripheral Scatter mode */ +} ADI_DMA_MODE; + + +/*! + * Dma Channel Priority Settings (only HIGH or DEFAULT priority supported) + */ +typedef enum +{ + ADI_DMA_PRIORITY_DEFAULT = 0, /*!< Use DEFAULT channel priority */ + ADI_DMA_PRIORITY_HIGH /*!< Elevate channel to HIGH priority */ +} ADI_DMA_PRIORITY; + + +/*! + * Result Event Type + */ +typedef enum { + ADI_DMA_SUCCESS, /*!< Successfully Completed */ + ADI_DMA_ERR_NOT_INITIALIZED, /*!< DMA not initialized */ + ADI_DMA_ERR_INVALID_PARAMETER, /*!< Input parameter to the function is invalid */ +} ADI_DMA_RESULT; + +/*! \cond PRIVATE*/ +/*! + * \enum DMA_CHANn_TypeDef + * DMA Channel Assignments + */ +typedef enum +{ + SPI2_TX_CHANn = 0, /*!< SPI2 Transmit DMA channel */ + SPI2_RX_CHANn = 1, /*!< SPI2 Receive DMA channel */ + SPORT0A_CHANn = 2, /*!< SPORT0-A DMA channel */ + SPORT0B_CHANn = 3, /*!< SPORT0-B DMA channel */ + SPI0_TX_CHANn = 4, /*!< SPI0 Transmit DMA channel */ + SPI0_RX_CHANn = 5, /*!< SPI0 Receive DMA channel */ + SPI1_TX_CHANn = 6, /*!< SPI1 Transmit DMA channel */ + SPI1_RX_CHANn = 7, /*!< SPI1 Receive DMA channel */ + UART0_TX_CHANn = 8, /*!< UART0 Transmit DMA channel */ + UART0_RX_CHANn = 9, /*!< UART0 Receive DMA channel */ + I2CS_TX_CHANn = 10, /*!< I2C Slave Transmit DMA channel */ + I2CS_RX_CHANn = 11, /*!< I2C Slave Receive DMA channel */ + I2CM_CHANn = 12, /*!< I2C Master DMA channel */ + AES0_IN_CHANn = 13, /*!< AES0-IN DMA channel */ + AES0_OUT_CHANn = 14, /*!< AES0-OUT DMA channel */ + FLASH_CHANn = 15, /*!< FLASH DMA channel */ + SIP0_CHANn = 16, /*!< SIP-0 DMA channel */ + SIP1_CHANn = 17, /*!< SIP-1 DMA channel */ + SIP2_CHANn = 18, /*!< SIP-2 DMA channel */ + SIP3_CHANn = 19, /*!< SIP-3 DMA channel */ + SIP4_CHANn = 20, /*!< SIP-4 DMA channel */ + SIP5_CHANn = 21, /*!< SIP-5 DMA channel */ + SIP6_CHANn = 22, /*!< SIP-6 DMA channel */ + SIP7_CHANn = 23, /*!< SIP-7 DMA channel */ + ADC0_CHANn = 24, /*!< ADC0 DMA channel */ + UART1_TX_CHANn = 25, /*!< UART1 Transmit DMA channel */ + UART1_RX_CHANn = 26, /*!< UART1 Receive DMA channel */ + NUM_DMA_CHANNELSn = 27 /*!< Total Number of DMA channels */ +} DMA_CHANn_TypeDef; /** typedef name for fixed DMA channel assignments */ +/*! \endcond */ + +/*! + * \struct ADI_DCC_TypeDef + * DMA Channel Control MMR Access Template + */ +typedef struct +{ + __IO uint32_t DMASRCEND; /*!< Source End Pointer */ + __IO uint32_t DMADSTEND; /*!< Destination End Pointer */ + __IO uint32_t DMACDC; /*!< Channel Data Configuration */ + uint32_t RESERVED; /*!< Address gap filler */ +} ADI_DCC_TypeDef; + + +/*! \cond PRIVATE */ +/* Bit Position for DMA Descriptor Control */ +#define DMA_BITP_CTL_DST_INC (30u) +#define DMA_BITP_CTL_SRC_INC (26u) +#define DMA_BITP_CTL_SRC_SIZE (24u) +#define DMA_BITP_CTL_R_POWER (14u) +#define DMA_BITP_CTL_N_MINUS_1 (4u) +#define DMA_BITP_CTL_CYCLE_CTL (0u) + +/* Bit Mask for DMA Descriptor Control */ +#define DMA_BITM_CTL_DST_INC ((0x00000003u) << DMA_BITP_CTL_DST_INC) +#define DMA_BITM_CTL_SRC_INC ((0x00000003u) << DMA_BITP_CTL_SRC_INC) +#define DMA_BITM_CTL_SRC_SIZE ((0x00000003u) << DMA_BITP_CTL_SRC_SIZE) +#define DMA_BITM_CTL_R_POWER ((0x0000000Fu) << DMA_BITP_CTL_R_POWER) +#define DMA_BITM_CTL_N_MINUS_1 ((0x000003FFu) << DMA_BITP_CTL_N_MINUS_1) +#define DMA_BITM_CTL_CYCLE_CTL ((0x00000007u) << DMA_BITP_CTL_CYCLE_CTL) + +/* Enum for the DMA Descriptor Cycle Control */ +#define DMA_ENUM_CTL_CYCLE_CTL_INVALID (0u) +#define DMA_ENUM_CTL_CYCLE_CTL_BASIC (1u) +#define DMA_ENUM_CTL_CYCLE_CTL_AUTO_REQ (2u) +#define DMA_ENUM_CTL_CYCLE_CTL_PING_PONG (3u) +#define DMA_ENUM_CTL_CYCLE_CTL_MSG_PRI (4u) +#define DMA_ENUM_CTL_CYCLE_CTL_MSG_ALT (5u) +#define DMA_ENUM_CTL_CYCLE_CTL_PSG_PRI (6u) +#define DMA_ENUM_CTL_CYCLE_CTL_PSG_ALT (7u) + + +#define DMA_BITM_INCR_TYPE_DECR (0x10u) + +#define DMA_BITM_OCTL_SRC_DECR (0x01u) +#define DMA_BITM_OCTL_DST_DECR (0x02u) + +#define DMA_BITM_OCTL_SRC_INCR (0x04u) +#define DMA_BITM_OCTL_DST_INCR (0x08u) + +#define DMA_TRANSFER_LIMIT (1024u) /*!< Maximum number of transfers handled by the DMA in one request */ + +/* pointer to the primary CCD array */ +extern ADI_DCC_TypeDef* const pPrimaryCCD; +/* pointer to the alternate CCD array */ +extern ADI_DCC_TypeDef* const pAlternateCCD; +/*! \endcond */ +/*========== DMA API DECLARATIONS ==========*/ + +extern void adi_dma_Init(void); + +extern ADI_DMA_RESULT adi_dma_RegisterCallback ( + DMA_CHANn_TypeDef const eChannelID, + ADI_CALLBACK const pfCallback, + void* const pCBParam + ); + +#ifdef __cplusplus +} +#endif + +#endif /* include guard */ + +/* +** EOF +*/ + +/**@}*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/flash/adi_flash.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/flash/adi_flash.h new file mode 100755 index 0000000000..c72524e3e4 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/flash/adi_flash.h @@ -0,0 +1,185 @@ +/*! + ***************************************************************************** + @file: adi_flash.h + @brief: Flash device driver definitions + @date: $Date: 2016-07-05 00:49:46 -0400 (Tue, 05 Jul 2016) $ + ----------------------------------------------------------------------------- +Copyright (c) 2012-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +/*! @addtogroup Flash_Driver Flash Driver + * @{ + */ + +#ifndef ADI_FLASH_H +#define ADI_FLASH_H + + /*! \cond PRIVATE */ +#include +#include +#include /* for ADI_SEM_SIZE */ +/*! \endcond */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*! + * \enum ADI_FEE_RESULT + * Flash Controller return codes. + */ + typedef enum { + ADI_FEE_SUCCESS = 0, /*!< The function completed successfully. */ + ADI_FEE_ERR_ALIGNMENT, /*!< The flash write source data pointer is misaligned. */ + ADI_FEE_ERR_ALREADY_INITIALIZED, /*!< The flash device driver is already initialized. */ + ADI_FEE_ERR_BAD_DEVICE_NUM, /*!< Device number passed is invalid. */ + ADI_FEE_ERR_BUFFER_ERR, /*!< An error occurred while processing a write buffer. */ + ADI_FEE_ERR_DEVICE_BUSY, /*!< The device is busy. */ + ADI_FEE_ERR_DMA_BUS_FAULT, /*!< Runtime DMA bus fault detected. */ + ADI_FEE_ERR_DMA_INVALID_DESCR, /*!< Runtime DMA invalid descriptor detected. */ + ADI_FEE_ERR_DMA_REGISTER, /*!< Error registering DMA error callback function. */ + ADI_FEE_ERR_DMA_UNKNOWN_ERROR, /*!< Unknown runtime DMA error detected. */ + ADI_FEE_ERR_HW_ERROR_DETECTED, /*!< An FEE hardware error occurred (pHwErrors param). */ + ADI_FEE_ERR_INSUFFICIENT_MEM, /*!< The memory passed is undersized. */ + ADI_FEE_ERR_INVALID_HANDLE, /*!< Device Handle is invalid. */ + ADI_FEE_ERR_INVALID_PARAM, /*!< A function parameter is invalid. */ + ADI_FEE_ERR_NO_DATA_TO_TRANSFER, /*!< No transfer data detected. */ + ADI_FEE_ERR_TRANSFER_IN_PROGRESS, /*!< Operation already in progress. */ + ADI_FEE_ERR_UNMATCHED_SUBMIT_QUERY, /*!< Unmatched read/write vs. submit/get API call. */ + ADI_FEE_ERR_SEMAPHORE_FAILED, /*!< An semaphore operation failed. */ + } ADI_FEE_RESULT; + + +/*! A device handle used in all API functions to identify the flash device. */ +typedef struct __ADI_FEE_DEV_DATA_TYPE* ADI_FEE_HANDLE; + + +/*! Applications use the "ADI_FEE_MEMORY_SIZE" macro to allocate + required flash driver memory. This memory (and size) are passed + to the flash driver during the "adi_fee_Open()" driver initialization + call. This memory is used to store internal flash driver state. +*/ +#define ADI_FEE_MEMORY_SIZE (44u + ADI_SEM_SIZE) + + +/*! + * \enum ADI_FEE_CALLBACK_EVENT + * Enum for the callback events. + */ +typedef enum { + ADI_FEE_CALLBACK_EVENT_BUFFER_PROCESSED, /*!< Buffer processed successfully event. */ + ADI_FEE_CALLBACK_EVENT_DEVICE_ERROR, /*!< Device error(s) detected during command. */ +} ADI_FEE_CALLBACK_EVENT; + +/*! + * \enum ADI_FEE_ECC_EVENT_TYPE + * Enum for the Error-Correction-Code event type. + */ +typedef enum { + ADI_FEE_ECC_EVENT_TYPE_ERROR, /*!< ECC Error Event. */ + ADI_FEE_ECC_EVENT_TYPE_CORRECT /*!< ECC correction event. */ +} ADI_FEE_ECC_EVENT_TYPE; + +/*! + * \enum ADI_FEE_ECC_RESPONSE + * Error-Correction-Code configuration codes. + */ +typedef enum { + ADI_FEE_ECC_RESPONSE_NONE = 0x0, /*!< No Response. */ + ADI_FEE_ECC_RESPONSE_BUS_ERROR = 0x1, /*!< Generate a Bus Error. */ + ADI_FEE_ECC_RESPONSE_IRQ = 0x2 /*!< Generate an IRQ. */ +} ADI_FEE_ECC_RESPONSE; + + +/*! + * \struct ADI_FEE_TRANSACTION + * Flash write data transaction block. + */ +typedef struct { + uint32_t *pWriteAddr; /*!< Pointer to flash-space (destination) write location. */ + uint32_t *pWriteData; /*!< Pointer to user-space (source) write Data. */ + uint32_t nSize; /*!< Write data size (in bytes). */ + bool bUseDma; /*!< DMA flag controlling use of DMA or not. */ +} ADI_FEE_TRANSACTION; + + +/*================ E X T E R N A L S ==================*/ +/* Flash Controller API */ + +ADI_FEE_RESULT adi_fee_Open (uint32_t const nDeviceNum, void* const pMemory, uint32_t const nMemorySize, ADI_FEE_HANDLE* const phDevice); +ADI_FEE_RESULT adi_fee_Close (ADI_FEE_HANDLE const hDevice); +ADI_FEE_RESULT adi_fee_RegisterCallback (ADI_FEE_HANDLE const hDevice, ADI_CALLBACK const pfCallback, void* const pCBParam); + +ADI_FEE_RESULT adi_fee_PageErase (ADI_FEE_HANDLE const hDevice, uint32_t const nPageNumStart, uint32_t const nPageNumEnd, uint32_t* const pHwErrors); +ADI_FEE_RESULT adi_fee_MassErase (ADI_FEE_HANDLE const hDevice, uint32_t* const pHwErrors); + +ADI_FEE_RESULT adi_fee_Write (ADI_FEE_HANDLE const hDevice, ADI_FEE_TRANSACTION* const pTransaction, uint32_t* const pHwErrors); +ADI_FEE_RESULT adi_fee_SubmitBuffer (ADI_FEE_HANDLE const hDevice, ADI_FEE_TRANSACTION* const pTransaction); + +ADI_FEE_RESULT adi_fee_IsBufferAvailable (ADI_FEE_HANDLE const hDevice, bool* const pbCompletionState); +ADI_FEE_RESULT adi_fee_GetBuffer (ADI_FEE_HANDLE const hDevice, uint32_t* const pHwErrors); + +ADI_FEE_RESULT adi_fee_GetPageNumber (ADI_FEE_HANDLE const hDevice, uint32_t const nAddress, uint32_t* const pnPageNum); +ADI_FEE_RESULT adi_fee_GetBlockNumber (ADI_FEE_HANDLE const hDevice, uint32_t const nAddress, uint32_t* const pnBlockNum); + +ADI_FEE_RESULT adi_fee_VerifySignature (ADI_FEE_HANDLE const hDevice, uint32_t const nStartPage, uint32_t const nEndPage, uint32_t* const pSigResult, uint32_t* const pHwErrors); +ADI_FEE_RESULT adi_fee_WriteProtectBlock (ADI_FEE_HANDLE const hDevice, uint32_t const nBlockNum); + +ADI_FEE_RESULT adi_fee_Sleep (ADI_FEE_HANDLE const hDevice, bool const bSleep); +ADI_FEE_RESULT adi_fee_Abort (ADI_FEE_HANDLE const hDevice); +ADI_FEE_RESULT adi_fee_GetAbortAddr (ADI_FEE_HANDLE const hDevice, uint32_t* const pnAddress); + +ADI_FEE_RESULT adi_fee_ConfigECC (ADI_FEE_HANDLE const hDevice, uint32_t const nStartPage, bool const bInfoECCEnable); +ADI_FEE_RESULT adi_fee_EnableECC (ADI_FEE_HANDLE const hDevice, bool const bEnable); +ADI_FEE_RESULT adi_fee_ConfigECCEvents (ADI_FEE_HANDLE const hDevice, ADI_FEE_ECC_EVENT_TYPE const eEvent, ADI_FEE_ECC_RESPONSE const eResponse); +ADI_FEE_RESULT adi_fee_GetECCErrAddr (ADI_FEE_HANDLE const hDevice, uint32_t* const pnAddress); +ADI_FEE_RESULT adi_fee_GetECCCorrections (ADI_FEE_HANDLE const hDevice, uint32_t* const pnNumCorrections); + +#ifdef __cplusplus +} +#endif + +#endif /* include guard */ + +/* +** EOF +*/ + +/*@}*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/general/adi_data_transfer.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/general/adi_data_transfer.h new file mode 100755 index 0000000000..89ab88d841 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/general/adi_data_transfer.h @@ -0,0 +1,127 @@ +/*! **************************************************************************** + * @file adi_data_transfer.h + * @brief General data transfer types for drivers + * @details General data transfer types for drivers + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ +#ifndef ADI_DATA_TRANSFER_H +#define ADI_DATA_TRANSFER_H + +/*============= I N C L U D E S =============*/ + +#include /* defines types such as uint32_t*/ +#include /* needed for SEM_VAR_DECLR declaration */ + +/*! \cond PRIVATE */ +/** @addtogroup Data_Transfer Common Data Transfer Structures +* @{ +*/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*============== D E F I N E S ===============*/ + +#define ADI_DT_BUFNUM (2u) /*!< Number of buffers available for data transfers in each communication channel */ + +/*! + ******************************************************************************* + * \struct ADI_DT_BUFF_INFO + * Structure for managing buffers submitted to drivers. + ******************************************************************************/ +struct _ADI_DT_BUFF_INFO; + +/*! + ******************************************************************************* + * Structure for managing buffers submitted to drivers. + ******************************************************************************/ +typedef struct _ADI_DT_BUFF_INFO +{ + void * pStartAddress; /*!< Address of buffer passed down a driver. */ + uint32_t nCount; /*!< Size of buffer in bytes. */ + uint32_t nIndex; /*!< Position of first byte to be transmitted. */ + bool bInUse; /*!< Buffer in use flag. */ + bool bDMA; /*!< Transaction is using the DMA flag. */ + struct _ADI_DT_BUFF_INFO * pNextBuffer; /*!< Pointer to the next buffer in the list. */ +} ADI_DT_BUFF_INFO; + +/*! + ******************************************************************************* + * Enumeration of different data transfer modes supported by drivers. + ******************************************************************************/ +typedef enum _ADI_DT_MODE +{ + ADI_DT_MODE_NONE, /*!< Mode of data transfer is not selected. */ + ADI_DT_MODE_BLOCKING, /*!< Only calls to adi_xxx_Read or adi_xxx_Write are allowed for transferring data. */ + ADI_DT_MODE_NONBLOCKING /*!< Only calls to adi_xxx_SubmitBuffer are allowed for transferring data. */ +} ADI_DT_MODE; + +typedef void * ADI_DEVICE_HANDLE; /*!< Generic device handle */ + +/*! + ******************************************************************************* + * Structure for managing pool of buffers submitted to drivers. + ******************************************************************************/ +typedef struct +{ + ADI_DT_BUFF_INFO BufInfo[ADI_DT_BUFNUM]; /*!< Ping Pong Buffers. */ + ADI_DT_BUFF_INFO * pFreeBuffer; /*!< Pointer to free buffer. (Next buffer to submit). */ + ADI_DT_BUFF_INFO * pFillBuffer; /*!< Pointer to the next buffer to be filled. (Needed for the case + where many buffers are "submitted" before a "get" is called.) */ + ADI_DT_BUFF_INFO * pActiveBuffer; /*!< Pointer to active buffer. (Next buffer waiting for completion.)*/ + ADI_DT_MODE eDataTranferMode; /*!< Data transfer mode (blocking or non-blockig). */ + + SEM_VAR_DECLR +} ADI_DT_CHANNEL; + + +/*============= P U B L I C F U N C T I O N S =============*/ + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/*! \endcond */ + +#endif /* ADI_DATA_TRANSFER_H */ +/*@}*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/general/adi_drivers_general.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/general/adi_drivers_general.h new file mode 100755 index 0000000000..0540cea56e --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/general/adi_drivers_general.h @@ -0,0 +1,98 @@ +/*! + ***************************************************************************** + * @file: adi_drivers_general.h + * @brief: Macros and types used in multiple drivers + *----------------------------------------------------------------------------- + * +Copyright (c) 2010-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *****************************************************************************/ +#ifndef ADI_DRIVERS_GENERAL__H +#define ADI_DRIVERS_GENERAL__H + + +/* Macros related to alignment in the different toolchains supported */ + +/* + * These macros are designed to be used as follows: + * ADI_ALIGNED_PRAGMA() + * ADI_ALIGNED_ATTRIBUTE() + */ + +#if defined ( __ICCARM__ ) +/* +* IAR MISRA C 2004 error suppressions. +* +* +* Pm120 (rule 19.10): In the definition of a function-like macro each parameter +* shall be enclosed in parenthesis. +* This is not possible in attributes and pragmas +* Pm154 (rule 19.13): The # and ## preprocessor operators shall not be used. +* We need to do this to abstract the macros for the +* different toolchains +*/ +#pragma diag_suppress=Pm120,Pm154 +#endif + +#define PRAGMA(x) _Pragma(#x) +#define ATTRIBUTE(x) __attribute__((x)) + +#if defined (__GNUC__) + /* Gcc uses attributes */ + #define ADI_ALIGNED_PRAGMA(num) + #define ADI_ALIGNED_ATTRIBUTE(num) ATTRIBUTE(aligned(num)) + #define ADI_UNUSED_ATTRIBUTE ATTRIBUTE(unused) +#elif defined ( __ICCARM__ ) + /* IAR uses a pragma */ + #define ADI_ALIGNED_ATTRIBUTE(num) + #define ADI_ALIGNED_PRAGMA(num) PRAGMA(data_alignment=num) + #define ADI_UNUSED_ATTRIBUTE +#elif defined (__CC_ARM) + /* Keil uses a decorator which is placed in the same position as pragmas */ + #define ADI_ALIGNED_ATTRIBUTE(num) + #define ADI_ALIGNED_PRAGMA(num) __align(##num) + #define ADI_UNUSED_ATTRIBUTE ATTRIBUTE(unused) +#else +#error "Toolchain not supported" +#endif + + +#if defined ( __ICCARM__ ) +#pragma diag_default=Pm120,Pm154 +#endif +#endif /* ADI_DRIVERS_GENERAL__H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/gpio/adi_gpio.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/gpio/adi_gpio.h new file mode 100755 index 0000000000..ad0673a2b5 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/gpio/adi_gpio.h @@ -0,0 +1,174 @@ +/* + ***************************************************************************** + @file: adi_gpio.h + @brief: GPIO definitions and API + ----------------------------------------------------------------------------- + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ +#ifndef ADI_GPIO_H +#define ADI_GPIO_H + +#include +#include + +#ifdef __ICCARM__ +/* IAR MISRA C 2004 error suppressions. + * + * Pm008 (rule 2.4): sections of code should not be 'commented out'. + * Allow code example in doxygen comment. + * Pm011 (rule 6.3): The basic types of char, int, long, float cannot be used. + * bool is used in the APIs as it is not affending the rule. Disabling this as IAR treats it as an error. + */ +#pragma diag_suppress=Pm008,Pm011 +#endif /* __ICCARM__ */ + +/*! \addtogroup GPIO_Driver GPIO Driver + * @{ + */ + +#ifdef __ICCARM__ +#pragma diag_default=Pm008 +#endif /* __ICCARM__ */ + +/* C++ linkage */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*! Amount of memory(in bytes) required by the GPIO device driver for its operation. + * This memory is completely owned by the driver till the end of the operation. + */ +#define ADI_GPIO_MEMORY_SIZE (16u) + +/* typedefs for 16-bit Ports */ +typedef uint16_t ADI_GPIO_DATA; /*!< pin data reg type */ + + +/*! GPIO API function return codes */ +typedef enum +{ + ADI_GPIO_SUCCESS = 0, /*!< No error detected. */ + ADI_GPIO_FAILURE, /*!< The API call failed. */ + ADI_GPIO_ALREADY_INITIALIZED, /*!< GPIO device has already been initialized. */ + ADI_GPIO_NOT_INITIALIZED, /*!< GPIO device has not yet been initialized. */ + ADI_GPIO_NULL_PARAMETER, /*!< The given pointer is pointing to NULL. */ + ADI_GPIO_INVALID_MEMORY_SIZE, /*!< The given memory is not sufficient to operate the driver. */ + ADI_GPIO_INVALID_PINS, /*!< Invalid pin combination. */ + ADI_GPIO_INVALID_INTERRUPT, /*!< Invalid interrupt number. */ + ADI_GPIO_INVALID_TRIGGER, /*!< Invalid trigger condition. */ +} ADI_GPIO_RESULT; + + +/*! GPIO trigger condition enumerations */ +typedef enum { + ADI_GPIO_IRQ_RISING_EDGE =(0x0), /*!< Trigger an interrupt on a rising edge. */ + ADI_GPIO_IRQ_FALLING_EDGE =(0x1), /*!< Trigger an interrupt on a falling edge. */ + ADI_GPIO_IRQ_EITHER_EDGE =(0x2), /*!< Trigger an interrupt on either edge. */ + ADI_GPIO_IRQ_HIGH_LEVEL =(0x3), /*!< Trigger an interrupt on a high level. */ + ADI_GPIO_IRQ_LOW_LEVEL =(0x4) /*!< Trigger an interrupt on a low level. */ +} ADI_GPIO_IRQ_TRIGGER_CONDITION; + +/*! GPIO IRQ enumeration */ +typedef enum { + ADI_GPIO_INTA_IRQ = SYS_GPIO_INTA_IRQn, /*!< GPIO Group Interrupt A. */ + ADI_GPIO_INTB_IRQ = SYS_GPIO_INTB_IRQn, /*!< GPIO Group Interrupt B. */ +} ADI_GPIO_IRQ; + + +/*! GPIO port enumerations */ +typedef enum { + ADI_GPIO_PORT0, /*!< Port 0 */ + ADI_GPIO_PORT1, /*!< Port 1 */ + ADI_GPIO_PORT2, /*!< Port 2 */ + ADI_GPIO_PORT3, /*!< Port 3 */ + ADI_GPIO_NUM_PORTS /*!< maximum number of ports */ +} ADI_GPIO_PORT; + +/* 16-bit port pin defs */ +#define ADI_GPIO_PIN_0 ((ADI_GPIO_DATA)(0x0001)) /*!< Pin 0 */ +#define ADI_GPIO_PIN_1 ((ADI_GPIO_DATA)(0x0002)) /*!< Pin 1 */ +#define ADI_GPIO_PIN_2 ((ADI_GPIO_DATA)(0x0004)) /*!< Pin 2 */ +#define ADI_GPIO_PIN_3 ((ADI_GPIO_DATA)(0x0008)) /*!< Pin 3 */ +#define ADI_GPIO_PIN_4 ((ADI_GPIO_DATA)(0x0010)) /*!< Pin 4 */ +#define ADI_GPIO_PIN_5 ((ADI_GPIO_DATA)(0x0020)) /*!< Pin 5 */ +#define ADI_GPIO_PIN_6 ((ADI_GPIO_DATA)(0x0040)) /*!< Pin 6 */ +#define ADI_GPIO_PIN_7 ((ADI_GPIO_DATA)(0x0080)) /*!< Pin 7 */ +#define ADI_GPIO_PIN_8 ((ADI_GPIO_DATA)(0x0100)) /*!< Pin 8 */ +#define ADI_GPIO_PIN_9 ((ADI_GPIO_DATA)(0x0200)) /*!< Pin 9 */ +#define ADI_GPIO_PIN_10 ((ADI_GPIO_DATA)(0x0400)) /*!< Pin 10 */ +#define ADI_GPIO_PIN_11 ((ADI_GPIO_DATA)(0x0800)) /*!< Pin 11 */ +#define ADI_GPIO_PIN_12 ((ADI_GPIO_DATA)(0x1000)) /*!< Pin 12 */ +#define ADI_GPIO_PIN_13 ((ADI_GPIO_DATA)(0x2000)) /*!< Pin 13 */ +#define ADI_GPIO_PIN_14 ((ADI_GPIO_DATA)(0x4000)) /*!< Pin 14 */ +#define ADI_GPIO_PIN_15 ((ADI_GPIO_DATA)(0x8000)) /*!< Pin 15 */ + +/* GPIO port pins availability mask */ +#define ADI_GPIO_PORT0_PIN_AVL (0xFFFFu) /*!< Port 0 pin mask (16 pins)*/ +#define ADI_GPIO_PORT1_PIN_AVL (0xFFFFu) /*!< Port 1 pin mask (16 pins)*/ +#define ADI_GPIO_PORT2_PIN_AVL (0xFFFFu) /*!< Port 2 pin mask (16 pins)*/ +#define ADI_GPIO_PORT3_PIN_AVL (0x000Fu) /*!< Port 2 pin mask (4 pins) */ + + +/* GPIO API functions */ +ADI_GPIO_RESULT adi_gpio_Init (void* const pMemory, uint32_t const MemorySize); +ADI_GPIO_RESULT adi_gpio_UnInit (void); +ADI_GPIO_RESULT adi_gpio_RegisterCallback (const ADI_GPIO_IRQ eIrq, ADI_CALLBACK const pfCallback, void *const pCBParam ); +ADI_GPIO_RESULT adi_gpio_SetGroupInterruptPins (const ADI_GPIO_PORT Port, const ADI_GPIO_IRQ eIrq, const ADI_GPIO_DATA Pins); +ADI_GPIO_RESULT adi_gpio_SetGroupInterruptPolarity (const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins); +ADI_GPIO_RESULT adi_gpio_OutputEnable (const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins, const bool bFlag); +ADI_GPIO_RESULT adi_gpio_InputEnable (const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins, const bool bFlag); +ADI_GPIO_RESULT adi_gpio_PullUpEnable (const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins, const bool bFlag); +ADI_GPIO_RESULT adi_gpio_SetHigh (const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins); +ADI_GPIO_RESULT adi_gpio_SetLow (const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins); +ADI_GPIO_RESULT adi_gpio_Toggle (const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins); +ADI_GPIO_RESULT adi_gpio_SetData (const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins); +ADI_GPIO_RESULT adi_gpio_GetData (const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins, uint16_t* const pValue); + +#if defined (__ICCARM__) +#pragma diag_default=Pm011 +#endif + +#ifdef __cplusplus +} +#endif + +/**@}*/ + +#endif /* ADI_GPIO_V1_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/i2c/adi_i2c.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/i2c/adi_i2c.h new file mode 100755 index 0000000000..edd398f3f9 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/i2c/adi_i2c.h @@ -0,0 +1,243 @@ +/*! + ***************************************************************************** + @file: adi_i2c.h + @brief: I2C device driver definitions + @details This is the primary header file for the I2C driver, which contains the + API declarations, data and constant definitions used in the APIs. + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*****************************************************************************/ + +#ifndef ADI_I2C_H +#define ADI_I2C_H + + /*! \cond PRIVATE */ +#include +#include /* for ADI_SEM_SIZE */ +/*! \endcond */ + + +/** @addtogroup I2C_Driver I2C Driver + * @{ + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined (__ICCARM__) +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm011 (rule 6.3): Types which specify sign and size should be used +* We use bool which is accepted by MISRA but the toolchain does not accept it +* +*/ +#pragma diag_suppress=Pm011 + +#endif + +/*! + ***************************************************************************** + * \enum ADI_I2C_RESULT + * + * I2C Device Error Codes. #ADI_I2C_SUCCESS is always zero + * The return value of all I2C APIs returning #ADI_I2C_RESULT + * should always be tested at the application level for success or failure. + * Specific I2C bus error conditions are returned as elements of + * #ADI_I2C_RESULT. + * + *****************************************************************************/ +typedef enum +{ + ADI_I2C_SUCCESS = 0, /*!< The API call succeeded. */ + ADI_I2C_BAD_BITRATE, /*!< The bit rate is invalid. */ + ADI_I2C_BAD_DEVICE_HANDLE, /*!< The device handle is invalid. */ + ADI_I2C_BAD_DEVICE_NUMBER, /*!< The device number is invalid. */ + ADI_I2C_BAD_SYS_CLOCK, /*!< Unable to obtain system clock rate. */ + ADI_I2C_DEVICE_IN_USE, /*!< The device is in use. */ + ADI_I2C_DEVICE_NOT_OPEN, /*!< The device is not open. */ + ADI_I2C_FAILURE, /*!< Generic API failure code. */ + ADI_I2C_HW_ERROR_DETECTED, /*!< An I2C hardware error occurred. See #ADI_I2C_HW_ERRORS. */ + ADI_I2C_INSUFFICIENT_MEMORY, /*!< The application supplied memory size is insufficient. */ + ADI_I2C_INVALID_PARAMETER, /*!< An invalid parameter is passed to the function. */ + ADI_I2C_INVALID_SLAVE_ADDRESS, /*!< The application supplied slave address is too wide. */ + ADI_I2C_INVALID_SUBMIT_API, /*!< Unmatched read/write vs. submit/get API call. */ + ADI_I2C_SEMAPHORE_FAILED /*!< Semaphore operation failed. */ + +} ADI_I2C_RESULT; + + +/*! + ***************************************************************************** + * \enum ADI_I2C_HW_ERRORS + * + * I2C Device Hardware Error Codes. Contains one or more hardware (I2C protocol) + * errors. Use this enum to decode hardware errors when the main #ADI_I2C_RESULT + * return result value is #ADI_I2C_HW_ERROR_DETECTED. + * + *****************************************************************************/ +typedef enum +{ + ADI_I2C_HW_ERROR_NONE = 0, /*!< No hardware error. */ + ADI_I2C_HW_ERROR_NACK_ADDR = 0x0001, /*!< A no-acknowledgement occurred for the address. */ + ADI_I2C_HW_ERROR_NACK_DATA = 0x0002, /*!< A no-acknowledgement occurred for the data. */ + ADI_I2C_HW_ERROR_ARBITRATION_LOST = 0x0004, /*!< I2C bus arbitration was Lost. */ + ADI_I2C_HW_ERROR_UNEXPECTED_ERROR = 0x0008, /*!< An unexpected error occurred. */ + +} ADI_I2C_HW_ERRORS; + + +/*! A device handle used in all API functions to identify the I2C device. */ +typedef struct __ADI_I2C_DEV_DATA_TYPE* ADI_I2C_HANDLE; + +/*! Use macro "ADI_I2C_MEMORY_SIZE" to know how much memory to + provide the i2c driver during the "adi_i2c_Open()" driver + initialization call. This memory is used to store internal + driver state data. Use map file to verify. +*/ +#define ADI_I2C_MEMORY_SIZE (44u + ADI_SEM_SIZE) + + +/*! + * \struct ADI_I2C_TRANSACTION + ***************************************************************************** + * I2C Device Command/Data Transaction Structure. This is the called-provided + * data structure used by the blocking #adi_i2c_ReadWrite() and non-blocking + * #adi_i2c_SubmitBuffer() calls to describe the caller's transaction parameters, + * consisting of prologue data and size (the addressing phase), transmit/receive + * data pointer and size (the data phase), and various transaction control parameters. + * + * Each transaction may optionally be prefaced with a prologue block, which may + * describe a read/write memory/register address, a slave-specific command, or + * some other slave-specific protocol that may precede the actual read/write + * data. Set the prologue size to zero if no prologue is desired. + * + * Each call to #adi_i2c_ReadWrite or #adi_i2c_SubmitBuffer() must populate the + * following fields of the ADI_I2C_TRANSACTION block: + * + * @par pPrologue + * Byte pointer to an application-supplied prologue byte array. If the value is + * zero, prologue data is ignored. + * + * @par nPrologueSize + * The number of prologue bytes to be transmitted ahead of the data phase. If the + * value is zero, prologue data is ignored. + * + * @par pData + * Byte pointer to the application-supplied data byte array. This buffer is + * either the source or destination address of the data being transmitted or + * received, respectively. + * + * @par nDataSize + * The number of data bytes to be transmitted or received during the data phase. + * If the value is zero, the data phase is ignored. + * + * @par bReadNotWrite + * Direction control for data phase. If "true", data phase is a read (from + * the slave), if "false", data phase is a write (to the slave). Pertains only + * to the data phase. Any prologue data (addressing/command phase) is always + * transmitted (written to the slave) prior to the data phase. + * + * @par bRepeatStart + * Controls suppression of a Stop Condition between the addressing phase and the + * data phase of an I2C transaction. After the prologue (if present), a + * unidirectional data stream (I2C is a half-duplex protocol) is either + * transmitted or received (depending on the transfer direction). Frequently, a + * Repeat-Start Condition (in reality, just the absence of a Stop Condition + * following the prologue/addressing phase) is required between the addressing + * phase (prologue) and the data phase of a transaction to meet slave device + * protocol requirements. The Repeat-Start requirement can be driven by the + * slave device communications protocol, or simply to just prevent any other + * I2C master from rearbitrating the bus between the prologue (addressing) and + * data phases of a so-called "COMBINED FORMAT" (write-followed-by-read). + * When bRepeatStart is set "true", the usual Stop Condition between the addressing + * phase and the data phase is suppressed and the I2C bus controller issues a + * second Start Condition (Repeat-Start) for the data phase. Without + * Repeat-Start (bRepeatStart "false"), the addressing phase ends with a normal + * Stop Condition ahead of the data phase. Repeat-Start conditions are used + * when "turning the bus around" as in writing a read address (for example), + * immediately followed by a data stream from that read address... without + * releasing bus arbitration. + * + *****************************************************************************/ +typedef struct { + uint8_t *pPrologue; /*!< Prologue pointer. */ + uint16_t nPrologueSize; /*!< Prologue byte count. */ + uint8_t *pData; /*!< Data pointer. */ + uint16_t nDataSize; /*!< Data byte count. */ + bool bReadNotWrite; /*!< Read/write flag. */ + bool bRepeatStart; /*!< Repeat start flag. */ +} ADI_I2C_TRANSACTION; + + +/*! Maximum supported bitrate is "FAST" mode (400 kHz). */ +#define ADI_I2C_MAX_RATE (400000u) + +/*************************************************************** + * Eliminable user API that may be optimized out by the linker * + ***************************************************************/ +ADI_I2C_RESULT adi_i2c_Open (uint32_t const DeviceNum, void* const pMemory, uint32_t const MemorySize, ADI_I2C_HANDLE* const phDevice); +ADI_I2C_RESULT adi_i2c_Close (ADI_I2C_HANDLE const hDevice); + +/* blocking calls... */ +ADI_I2C_RESULT adi_i2c_ReadWrite (ADI_I2C_HANDLE const hDevice, ADI_I2C_TRANSACTION* const pTransaction, uint32_t* const pHwErrors); + +/* non-blocking calls... */ +ADI_I2C_RESULT adi_i2c_SubmitBuffer (ADI_I2C_HANDLE const hDevice, ADI_I2C_TRANSACTION* const pTransaction); +ADI_I2C_RESULT adi_i2c_IsBufferAvailable (ADI_I2C_HANDLE const hDevice, bool* const pbCompletionState); +ADI_I2C_RESULT adi_i2c_GetBuffer (ADI_I2C_HANDLE const hDevice, uint32_t* const pHwErrors); + +/* other (blocking) calls... */ +ADI_I2C_RESULT adi_i2c_Reset (ADI_I2C_HANDLE const hDevice); +ADI_I2C_RESULT adi_i2c_SetBitRate (ADI_I2C_HANDLE const hDevice, uint32_t const requestedBitRate32); +ADI_I2C_RESULT adi_i2c_SetSlaveAddress (ADI_I2C_HANDLE const hDevice, uint16_t const SlaveAddress); +ADI_I2C_RESULT adi_i2c_IssueGeneralCall (ADI_I2C_HANDLE const hDevice, uint8_t* const pData, uint8_t const nDataSize, uint32_t* const pHwErrors); + + +#if defined (__ICCARM__) +#pragma diag_default=Pm011 +#endif + +#ifdef __cplusplus +} +#endif + +/**@}*/ + +#endif /* ADI_I2C_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/pwr/adi_pwr.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/pwr/adi_pwr.h new file mode 100755 index 0000000000..1bb8f41467 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/pwr/adi_pwr.h @@ -0,0 +1,689 @@ +/* + ***************************************************************************** + * @file: adi_pwr.h + * @brief: System clock and power management driver. + *----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + + +/*! \addtogroup Power_Driver Power Driver + * @{ + */ + +#ifndef ADI_PWR_H +#define ADI_PWR_H + +#include +#include + +#ifdef __ICCARM__ +/* IAR MISRA C 2004 error suppressions. + * + * Pm009 (rule 5.1): identifiers shall not rely on significance of more than 31 characters. + * IAR compiler supports longer identifiers. + * Pm011 (rule 6.3): The basic types of char, int, long, float cannot be used. + * bool is used in the APIs as it is not affending the rule. Disabling this as IAR treats it as an error. + */ +#pragma diag_suppress=Pm009,Pm011 +#endif /* __ICCARM__ */ + +#ifdef __cplusplus + extern "C" { +#endif + +/*! Enumeration of clock sources for various peripherals. */ +typedef enum { + /*! Source for all peripherals SPI, SPORT, SIP, CRC, AES, SIP interface, I2C, UART, optionally for timers. */ + ADI_CLOCK_PCLK, + /*! Source for Core,Bus etc. */ + ADI_CLOCK_HCLK, + /*! Source for the ADC. */ + ADI_CLOCK_ACLK + +} ADI_CLOCK_ID; + +/*! Enumeration of input clock sources */ +typedef enum { + /*! Clock ID for 16 MHz or 26 MHz external crystal oscillator called HFXTAL. */ + ADI_CLOCK_SOURCE_HFXTAL, + /*! Clock ID 32 kHz external crystal oscillator called LFXTAL. */ + ADI_CLOCK_SOURCE_LFXTAL, + /*! Clock ID for 26 MHz internal oscillator called HFOSC. */ + ADI_CLOCK_SOURCE_HFOSC, + /*! Clock ID 32 kHz a 32 kHz internal oscillator called LFXTAL. */ + ADI_CLOCK_SOURCE_LFOSC, + /*! Clock ID for output clock for System PLL. */ + ADI_CLOCK_SOURCE_SPLL, + /*! Clock ID for external clock from GPIO. */ + ADI_CLOCK_SOURCE_GPIO +} ADI_CLOCK_SOURCE_ID; + + +/*! + * Enumeration of clock sources for each clock multiplexer. + * The processor has the following clock multiplexers. + * - SPLL Mux (System PLL). + * - Reference clock Mux. + * - Root Clock Mux. + */ +typedef enum { + + /*! Input clock for system PLL mux is HFOSC. */ + ADI_CLOCK_MUX_SPLL_HFOSC, + /*! Input clock for system PLL mux is HFXTAL. */ + ADI_CLOCK_MUX_SPLL_HFXTAL, + /*! Input clock for system PLL mux is provided through GPIO. */ + ADI_CLOCK_MUX_SPLL_GPIO, + + /*! Input clock for low frequency clock mux is LFOSC. */ + ADI_CLOCK_MUX_LFCLK_LFOSC, + /*! Input clock for low frequency clock mux is LFXTAL. */ + ADI_CLOCK_MUX_LFCLK_LFXTAL, + + /*! Input clock to the multiplexer which provides reference clock for Flash + and HPBUCK clock is HFOSC. */ + ADI_CLOCK_MUX_REF_HFOSC_CLK, + /*! Reserved. */ + ADI_CLOCK_MUX_REF_RESERVED, + /*! Input clock to the multiplexer which provides reference clock for Flash + and HPBUCK clock is 26 MHz HFXTAL. */ + ADI_CLOCK_MUX_REF_HFXTAL_26MHZ_CLK, + /*! Input clock to the multiplexer which provides reference clock for Flash + and HPBUCK clock is 16 MHz HFXTAL. */ + ADI_CLOCK_MUX_REF_HFXTAL_16MHZ_CLK, + + /*! Input clock to root multiplexer is HFOSC. */ + ADI_CLOCK_MUX_ROOT_HFOSC, + /*! Input clock to root multiplexer is HFXTAL. */ + ADI_CLOCK_MUX_ROOT_HFXTAL, + /*! Input clock to root multiplexer is SPLL. */ + ADI_CLOCK_MUX_ROOT_SPLL, + /*! Input clock to root multiplexer is from GPIO. */ + ADI_CLOCK_MUX_ROOT_GPIO + +} ADI_CLOCK_MUX_ID; + + +/*! + * Enumeration of clock source status. + */ +typedef enum { + /*! Specified clock source is disabled. */ + ADI_CLOCK_SOURCE_DISABLED = 0, + /*! Specified clock source is not stable. */ + ADI_CLOCK_SOURCE_ENABLED_NOT_STABLE, + /*! Specified clock source is enabled and stable. */ + ADI_CLOCK_SOURCE_ENABLED_STABLE, + /*! Invalid clock ID. */ + ADI_CLOCK_SOURCE_ID_NOT_VALID + +} ADI_CLOCK_SOURCE_STATUS; + +/*! Clock output options through GPIO pin. + The GPIO clock output pin can be driven through one of these clocks. +*/ +typedef enum +{ + /*! Root Clock (ROOT_CLK). */ + ADI_CLOCK_OUTPUT_ROOT_CLK, + + /*! Low Frequency Clock (LF_CLK). */ + ADI_CLOCK_OUTPUT_LF_CLK, + + /*! ADC Clock (ACLK). */ + ADI_CLOCK_OUTPUT_ACLK, + + /*! HCLK_BUS. */ + ADI_CLOCK_OUTPUT_HCLK_BUS, + + /*! HCLK_CORE. */ + ADI_CLOCK_OUTPUT_HCLK_CORE, + + /*! Peripheral Clock (PCLK). */ + ADI_CLOCK_OUTPUT_PCLK, + + /*! Reference Clock for Flash controller timer (RCLK). */ + ADI_CLOCK_OUTPUT_RCLK, + + /*! Mux of HFOSC, HFXTAL clock (RHP_CLK). */ + ADI_CLOCK_OUTPUT_RHP_CLK, + + /*! GP Timer 0 clock (GPT0_CLK). */ + ADI_CLOCK_OUTPUT_GPT0_CLK, + + /*! GP Timer 1 clock (GPT1_CLK). */ + ADI_CLOCK_OUTPUT_GPT1_CLK, + + /*! Peripherals operating at HCLK (HCLK_P). */ + ADI_CLOCK_OUTPUT_HCLK_PERIPHERAL, + + /*! PLL Clock out. */ + ADI_CLOCK_OUTPUT_PLL_OUTPUT, + + /*! RTC0 Clock. */ + ADI_CLOCK_OUTPUT_RTC0_CLK, + + /*! HP Buck Clock (HPBUCK_CLK). */ + ADI_CLOCK_OUTPUT_HPBUCK_CLK, + + /*! HP Buck Non overlap clock. */ + ADI_CLOCK_OUTPUT_HPBUCK_NO_OVERLAP_CLK, + + /*! RTC1 generated clock. */ + ADI_CLOCK_OUTPUT_RTC1_CLK + +}ADI_CLOCK_OUTPUT_ID; + + +/*! Enumeration of clock gates using which the clocks can be gated. */ +typedef enum { + /*! Clock Gate for the GP Timer-0. */ + ADI_CLOCK_GATE_GPT0_CLK = 1 << BITP_CLKG_CLK_CTL5_GPTCLK0OFF, + /*! Clock Gate for the GP Timer-1. */ + ADI_CLOCK_GATE_GPT1_CLK = 1 << BITP_CLKG_CLK_CTL5_GPTCLK1OFF, + /*! Clock Gate for the GP Timer-2. */ + ADI_CLOCK_GATE_GPT2_CLK = 1 << BITP_CLKG_CLK_CTL5_GPTCLK2OFF, + /*! Clock Gate for the I2C. */ + ADI_CLOCK_GATE_I2C_CLK = 1 << BITP_CLKG_CLK_CTL5_UCLKI2COFF, + /*! Clock Gate for the GPIO. */ + ADI_CLOCK_GATE_GPIO_CLK = 1 << BITP_CLKG_CLK_CTL5_GPIOCLKOFF, + /*! Clock Gate for the PCLK. */ + ADI_CLOCK_GATE_PCLK = 1 << BITP_CLKG_CLK_CTL5_PERCLKOFF, + /*! Clock Gate for the RGB Timer. */ + ADI_CLOCK_GATE_TMR_RGB_CLK = 1 << BITP_CLKG_CLK_CTL5_TMRRGBCLKOFF + +} ADI_CLOCK_GATE; + +/*! + * Enumeration of HF oscillator clock divide factor. + */ +typedef enum +{ + /*! Divide by 1. */ + ADI_PWR_HFOSC_DIV_BY_1, + /*! Divide by 2. */ + ADI_PWR_HFOSC_DIV_BY_2, + /*! Divide by 4. */ + ADI_PWR_HFOSC_DIV_BY_4, + /*! Divide by 8. */ + ADI_PWR_HFOSC_DIV_BY_8, + /*! Divide by 16. */ + ADI_PWR_HFOSC_DIV_BY_16, + /*! Divide by 32. */ + ADI_PWR_HFOSC_DIV_BY_32 + +} ADI_PWR_HFOSC_DIV; + + /*! + ***************************************************************************** + * Power driver API return codes + *****************************************************************************/ +typedef enum +{ + /*! No error detected. */ + ADI_PWR_SUCCESS = 0, + /*! Generic unknown error occurred. */ + ADI_PWR_FAILURE, + /*! If the given pointer is pointing to NULL. */ + ADI_PWR_NULL_POINTER, + /*! Requested divide value is out of range. */ + ADI_PWR_INVALID_CLOCK_DIVIDER, + /*! Invalid ADI_CLOCK_ID specified. */ + ADI_PWR_INVALID_CLOCK_ID, + /*! PDIV:HDIV ratio must be integral. */ + ADI_PWR_INVALID_CLOCK_RATIO, + /*! Invalid low-power mode requested. */ + ADI_PWR_INVALID_POWER_MODE, + /*! Invalid clock speed. */ + ADI_PWR_INVALID_CLOCK_SPEED, + /*! Specified operation is not allowed. */ + ADI_PWR_OPERATION_NOT_ALLOWED, + /*! Parameter is out of range. */ + ADI_PWR_INVALID_PARAM, + /*! System not initialized, call the API SystemInit. */ + ADI_PWR_SYSTEM_NOT_INITIALIZED + +} ADI_PWR_RESULT; + +/*! + * Enumeration of the power modes supported by the processor. + */ +typedef enum +{ + /*! Core Sleep power-down mode. */ + ADI_PWR_MODE_FLEXI = 0 << BITP_PMG_PWRMOD_MODE, + /*! Fully Active. (piggy-back on bitmode value "1", normally reserved) */ + ADI_PWR_MODE_ACTIVE = 1 << BITP_PMG_PWRMOD_MODE, + /*! Full Hibernate power-down mode. */ + ADI_PWR_MODE_HIBERNATE = 2 << BITP_PMG_PWRMOD_MODE, + /*! System Sleep power-down mode. */ + ADI_PWR_MODE_SHUTDOWN = 3 << BITP_PMG_PWRMOD_MODE + +} ADI_PWR_POWER_MODE; + + +/*! + * Enumeration of power management interrupts. + */ +typedef enum +{ + /*! Interrupt when battery voltage drops below 1.8V.*/ + ADI_PWR_LOW_BATTERY_VOLTAGE_IEN = 1 << BITP_PMG_IEN_VBAT, + /*! Interrupt when VREG under-voltage: below 1V. */ + ADI_PWR_UNDER_VOLATAGE_IEN = 1 << BITP_PMG_IEN_VREGUNDR, + /*! Interrupt when VREG over-voltage: over- 1.32V. */ + ADI_PWR_OVER_VOLATAGE_IEN = 1 << BITP_PMG_IEN_VREGOVR, + /*! Interrupt when battery voltage falls to the specified range.Please see #adi_pwr_SetVoltageRange.*/ + ADI_PWR_BATTERY_VOLTAGE_RANGE_IEN = 1 << BITP_PMG_IEN_IENBAT + +} ADI_PWR_PMG_IRQ; + + +/*! + * Enumeration of system clock module interrupts. + */ +typedef enum +{ + /*! Interrupt for root clock monitor and Clock Fail. */ + ADI_PWR_ROOT_CLOCK_MON_IEN = 1 << BITP_CLKG_OSC_CTL_ROOT_MON_EN, + /*! Interrupt for LFXTAL clock monitor and Clock Fail. */ + ADI_PWR_LFXTAL_CLOCK_MON_IEN = 1 << BITP_CLKG_OSC_CTL_LFX_MON_EN, + /*! Interrupt when LFXTAL clock becomes stable/unstable. */ + ADI_PWR_LFXTAL_STATUS_IEN = 1 << BITP_CLKG_CLK_CTL0_LFXTALIE, + /*! Interrupt when HFXTAL clock becomes stable/unstable. */ + ADI_PWR_HFXTAL_STATUS_IEN = 1 << BITP_CLKG_CLK_CTL0_HFXTALIE, + /*! Interrupt when PLL-LOCK/PLL-UNLOCK. */ + ADI_PWR_PLL_STATUS_IEN = 1 << BITP_CLKG_CLK_CTL3_SPLLIE + +} ADI_PWR_CLOCK_IRQ; + +/** + * Enumeration of the power driver events notified through the callback. + */ +typedef enum +{ + /*! Event for indicating Over voltage VREG > 1.32v. */ + ADI_PWR_EVENT_VREG_OVER_VOLTAGE, + /*! Event for indicating under voltage VREG < 1V. */ + ADI_PWR_EVENT_VREG_UNDER_VOLTAGE, + + /*! Event for indicating battery voltage below 1.8V. */ + ADI_PWR_EVENT_BATTERY_VOLTAGE_LOW, + /*! Event for indicating battery voltage in specified range-1.VBAT range1 (> 2.75v). */ + ADI_PWR_EVENT_BATTERY_VOLTAGE_RANGE_1, + /*! Event for indicating battery voltage in specified range-2.VBAT range2 (2.75v - 2.3v). */ + ADI_PWR_EVENT_BATTERY_VOLTAGE_RANGE_2, + /*! Event for indicating battery voltage in specified range-3.VBAT range3 (2.3v - 1.6v). */ + ADI_PWR_EVENT_BATTERY_VOLTAGE_RANGE_3, + + /*! Event to indicate that LFXTAL failed and hardware automatically switched to LFOSC. */ + ADI_PWR_EVENT_OSC_LFXTAL_AUTO_SWITCH, + /*! Event to indicate the LFXTAL clock is not stable. */ + ADI_PWR_EVENT_OSC_LFXTAL_MON_FAIL, + /*! Event to indicate the Root clock is not stable. */ + ADI_PWR_EVENT_OSC_ROOT_CLOCK_MON_FAIL, + /*! Event to indicate the Root clock failed and hardware automatically switched to HFOSC. */ + ADI_PWR_EVENT_OSC_ROOT_CLOCK_FAIL_AUTO_SWITCH, + + /*! Event to indicate HF crystal stable. */ + ADI_PWR_EVENT_OSC_HFXTAL_CLOCK_OK, + /*! Event to indicate HF crystal is not stable. */ + ADI_PWR_EVENT_OSC_HFXTAL_CLOCK_NO_OK, + /*! Event to indicate LF crystal is stable. */ + ADI_PWR_EVENT_OSC_LFXTAL_CLOCK_OK, + /*! Event to indicate LF crystal is not stable. */ + ADI_PWR_EVENT_OSC_LFXTAL_CLOCK_NO_OK, + /*! Event for indicating PLL is locked. */ + + ADI_PWR_EVENT_PLLC_LOCK, + /*! Event for indicating PLL is unlocked. */ + ADI_PWR_EVENT_PLLC_UNLOCK + +} ADI_PWR_EVENT; + + +/*! + * Enumeration of processor wake up status. +*/ +typedef enum +{ + /*! Interrupt from External Interrupt 0. */ + ADI_PWR_INT_EXT0, + /*! Interrupt from External Interrupt 1. */ + ADI_PWR_INT_EXT1, + /*! Interrupt from External Interrupt 2. */ + ADI_PWR_INT_EXT2, + /*! Interrupt from RTC. */ + ADI_PWR_INT_RTC + +} ADI_PWR_WAKEUP_STATUS; + +/*! + * Enumeration of the battery voltage ranges for voltage monitoring interrupt generation. +*/ +typedef enum +{ + /*! Voltage range is in safe region. */ + ADI_PWR_BAT_VOLTAGE_RANGE_SAFE, + /*! Battery voltage is in the range of 2.2 to 2.75 V. */ + ADI_PWR_VOLTAGE_RANGE_2_2_TO_2_75, + /*! Battery voltage is in the range of 1.6 to 2.2 V. */ + ADI_PWR_VOLTAGE_RANGE_1_6_TO_2_2 +} ADI_PWR_VOLTAGE_RANGE; + +/*! + * Enumeration of LFXTAL Robust Mode Load select. The amount of loading tolerated when + * LFXTAL robust mode is selected, that is when LFXTAL robust mode is enabled. + */ +typedef enum +{ + /*! No Trim, and big resistive loads not tolerated. */ + ADI_PWR_LFXTAL_LOAD_NONE, + /*! 20 MOHM Load mode, greater than 20 MOHM load allowed. */ + ADI_PWR_LFXTAL_LOAD_20MOHM, + /*! 10 MOHM Load mode, greater than 10 MOHM load allowed. */ + ADI_PWR_LFXTAL_LOAD_10MOHM, + /*! 5 MOHM load resistance allowed on both IO pins, the user can scale the current + down if the load is expected to be smaller than 5 MOHM. */ + ADI_PWR_LFXTAL_LOAD_5MOHM + +}ADI_PWR_LFXTAL_LOAD; + +/*! +* Enumeration of HP Buck load modes. The modes can be used to choose the loading capability +* of the HPBUCK. The low load mode and high load mode are based on the loading in the system. +*/ +typedef enum +{ + /*! HPBUCK Low load mode. This mode can be set if the maximum system clock(HCLK) frequency + is 26 MHz. */ + ADI_PWR_HPBUCK_LD_MODE_LOW, + + /*! HPBUCK High load mode. This mode can be set if the system clock(HCLK) frequency is greater + than 26 MHz. */ + ADI_PWR_HPBUCK_LD_MODE_HIGH + +}ADI_PWR_HPBUCK_LD_MODE; + +/* Related clock APIs */ + +/* + * Initialize the dynamic power management service + */ +ADI_PWR_RESULT adi_pwr_Init(void); + +/* + * ================================================================= + * Clock Management related APIs + * ================================================================= +*/ + +/* + * Update the internal clock variable based on current configuration + */ +ADI_PWR_RESULT adi_pwr_UpdateCoreClock(void); + +/* + * Set the external clock frequency. + */ +ADI_PWR_RESULT adi_pwr_SetExtClkFreq( + const uint32_t ExtClkFreq + ); + +/* + * To Configure the root clock muxing + */ +ADI_PWR_RESULT adi_pwr_SetRootClockMux( + const ADI_CLOCK_MUX_ID eClockID + ); + +/* + * To Configure the root clock muxing + */ +ADI_PWR_RESULT adi_pwr_SetPLLClockMux( + const ADI_CLOCK_MUX_ID eClockID + ); + +/* + * To Configure the root clock muxing + */ +ADI_PWR_RESULT adi_pwr_SetLFClockMux( + const ADI_CLOCK_MUX_ID eClockID + ); + + +/* + * To Enable/Disable the LFXTAL robust mode. + */ +ADI_PWR_RESULT adi_pwr_EnableLFXTALRobustMode( + const bool bEnable + ); + +/* + * To configure the LFXTAL robust mode load. + */ +ADI_PWR_RESULT adi_pwr_SetLFXTALRobustModeLoad( + const ADI_PWR_LFXTAL_LOAD eLoad + ); + +/* + * To Enable/Disable the LFXTAL Fail Auto switch. + */ +ADI_PWR_RESULT adi_pwr_EnableLFXTALFailAutoSwitch( + const bool bEnable + ); + +/* + * To enable/disable auto switching of root clock to HFOSC upon detection + * of Root clock failure. + */ +ADI_PWR_RESULT adi_pwr_EnableRootClockFailAutoSwitch( + const bool bEnable + ); + +/* + * To set the HF Oscillator divide factor + */ +ADI_PWR_RESULT adi_pwr_SetHFOscDivFactor( + const ADI_PWR_HFOSC_DIV eDivFactor + ); + +/* + * To set the HF oscillator automatic divide by 1 during wakeup from Flexi mode + */ +ADI_PWR_RESULT adi_pwr_EnableHFOscAutoDivBy1( + const bool bEnable + ); + +/* + * To Configure the reference clock muxing + */ +ADI_PWR_RESULT adi_pwr_SetRefClockMux( + const ADI_CLOCK_MUX_ID eClockID + ); + +/* + * Get external clock frequency. + */ +ADI_PWR_RESULT adi_pwr_GetExtClkFreq( + uint32_t *pExtClock + ); + +/* + * Get current clock frequency. This API can be used to know PCLK, HCLK. + */ +ADI_PWR_RESULT adi_pwr_GetClockFrequency( + const ADI_CLOCK_ID eClockId, + uint32_t *pClock + ); +/* + * To enable/disable the specific clock. + */ +ADI_PWR_RESULT adi_pwr_EnableClock( + const ADI_CLOCK_GATE eClockGate, + const bool bEnable + ); + +/* + * To enable/disable the specific clock source. + */ +ADI_PWR_RESULT adi_pwr_EnableClockSource( + const ADI_CLOCK_SOURCE_ID eClockSource, + const bool bEnable + ); +/* + * To set the specific clock divider. +*/ +ADI_PWR_RESULT adi_pwr_SetClockDivider( + const ADI_CLOCK_ID eClockId, + const uint16_t nDiv + ); +/* + * To Get the clock status. +*/ +ADI_PWR_RESULT adi_pwr_GetClockStatus( + const ADI_CLOCK_SOURCE_ID eClockSource, + ADI_CLOCK_SOURCE_STATUS *peStatus + ); +/* + * To configure the PLL to generate the SPLL +*/ +ADI_PWR_RESULT adi_pwr_SetPll( + uint8_t nDivFactor, + const uint8_t nMulFactor, + const bool bDiv2, + const bool bMul2 + ); + +/* To enable the interrupt for clock monitoring LFXTAL/HFXTAL/PLL.*/ +ADI_PWR_RESULT adi_pwr_EnableClockInterrupt( + const ADI_PWR_CLOCK_IRQ eIrq, + const bool bEnable + ); + +/* Enabling the LFXTAL bypass mode */ +ADI_PWR_RESULT adi_pwr_EnableLFXTALBypass( + const bool bEnable + ); + + +/* Set the clock output through the GPIO */ +ADI_PWR_RESULT adi_pwr_SetGPIOClockOutput( + const ADI_CLOCK_OUTPUT_ID eClockOutput + ); + +/* + * ================================================================= + * Power Management related APIs + * ================================================================= +*/ +/* To enable the interrupt for voltage monitoring.*/ +ADI_PWR_RESULT adi_pwr_EnablePMGInterrupt( + const ADI_PWR_PMG_IRQ eIrq, + const bool bEnable + ); + +/* + * To know which is interrupt caused the processor to wake up from SHUTDOWN mode. + */ +ADI_PWR_RESULT adi_pwr_GetWakeUpStatus( + ADI_PWR_WAKEUP_STATUS *peStatus + ); + +/* + * To select the voltage range of the battery for monitoring. +*/ +ADI_PWR_RESULT adi_pwr_SetVoltageRange( + const ADI_PWR_VOLTAGE_RANGE eRange + ); + +/* + * For entering the low power mode. +*/ +ADI_PWR_RESULT adi_pwr_EnterLowPowerMode( + const ADI_PWR_POWER_MODE PowerMode, + uint32_t volatile * pnInterruptOccurred, + const uint8_t PriorityMask + ); + +/* + * For exiting the low power mode. +*/ +ADI_PWR_RESULT adi_pwr_ExitLowPowerMode( + uint32_t volatile * pnInterruptOccurred + ); + +/* To enable the HPBUCK */ +ADI_PWR_RESULT adi_pwr_EnableHPBuck( + const bool bEnable + ); + + +/* To enable the HPBUCK Low Power mode */ +ADI_PWR_RESULT adi_pwr_EnableHPBuckLowPowerMode( + const bool bEnable + ); + +/* To enable the HPBUCK Load mode */ +ADI_PWR_RESULT adi_pwr_SetHPBuckLoadMode( + const ADI_PWR_HPBUCK_LD_MODE eLoadMode + ); + +/* + * For registering the call back function . +*/ +ADI_PWR_RESULT adi_pwr_RegisterCallback( + const ADI_CALLBACK pfCallback, + void *pcbParam + ); + +#ifdef __cplusplus +} +#endif + +#endif /* ADI_PWR_H */ + + +/*@}*/ + +/* +** EOF +*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/rng/adi_rng.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/rng/adi_rng.h new file mode 100755 index 0000000000..f5101ef690 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/rng/adi_rng.h @@ -0,0 +1,204 @@ +/*! + ***************************************************************************** + @file adi_rng.h + @brief Random Number Generator Driver + ----------------------------------------------------------------------------- +Copyright (c) 2012-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +/*! \addtogroup RNG_Driver RNG Driver + * Random Number Generator Driver + * @{ + */ + +#ifndef ADI_RNG_H +#define ADI_RNG_H + +#include +#include + +#ifndef __ADUCM4x50__ +#error "Unsupported processor" +#endif + +#include + +#ifdef __ICCARM__ +/* IAR MISRA C 2004 error suppressions. + * + * Pm011 (rule 6.3): The basic types of char, int, long, float cannot be used. + * bool is used in the APIs as it is not affending the rule. Disabling this as IAR treats it as an error. + */ +#pragma diag_suppress=Pm011 +#endif /* __ICCARM__ */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*! + * \enum ADI_RNG_RESULT + * Random Number Generator API return codes + */ +typedef enum +{ + ADI_RNG_SUCCESS = 0, /*!< No Error, API suceeded */ + ADI_RNG_UNKNOWN_ERROR, /*!< Unknown error detected */ + ADI_RNG_ALREADY_INITIALIZED, /*!< RNG is already initialized */ + ADI_RNG_INVALID_PARAM, /*!< Invalid function parameter */ + ADI_RNG_BAD_DEV_HANDLE, /*!< Invalid device handle passed */ + ADI_RNG_BAD_DEVICE_NUM, /*!< Invalid device instance */ + ADI_RNG_NOT_INITIALIZED, /*!< RNG not yet initialized */ + ADI_RNG_INVALID_STATE /*!< Device is in an invalid state */ +} ADI_RNG_RESULT; + +/*! + * \enum ADI_RNG_EVENT + * Random Number Generator callback events + */ +typedef enum +{ + ADI_RNG_EVENT_READY, /*!< Random number ready event */ + ADI_RNG_EVENT_STUCK /*!< The ring oscillator got stuck event */ +} ADI_RNG_EVENT; + + +/*! The amount of application supplied memory required by the RNG driver */ +#define ADI_RNG_MEMORY_SIZE (12u) + + +/*! RNG Device handle typedef */ +typedef void* ADI_RNG_HANDLE; + +/*================ E X T E R N A L S ==================*/ + +/* + * RNG API + */ + +/* Open a random number generator device */ +extern ADI_RNG_RESULT adi_rng_Open( + uint32_t const nDeviceNum, + void* const pMemory, + uint32_t const MemorySize, + ADI_RNG_HANDLE* const phDevice + ); + +/* Close the RNG Device */ +extern ADI_RNG_RESULT adi_rng_Close(ADI_RNG_HANDLE hDevice); + +/* Enable/Disable the device */ +extern ADI_RNG_RESULT adi_rng_Enable ( + ADI_RNG_HANDLE const hDevice, + bool const bFlag + ); +/* Enable/Disable buffering */ +extern ADI_RNG_RESULT adi_rng_EnableBuffering ( + ADI_RNG_HANDLE const hDevice, + bool const bFlag + ); + +/* Set the sample length */ +extern ADI_RNG_RESULT adi_rng_SetSampleLen ( + ADI_RNG_HANDLE const hDevice, + uint16_t const nLenPrescaler, + uint16_t const nLenReload + ); + +/* Get whether the random number is ready */ +extern ADI_RNG_RESULT adi_rng_GetRdyStatus ( + ADI_RNG_HANDLE const hDevice, + bool* const pbFlag + ); + +/* Get whether the ring oscillator output is stuck or not */ +extern ADI_RNG_RESULT adi_rng_GetStuckStatus ( + ADI_RNG_HANDLE const hDevice, + bool* const pbFlag + ); + +/* Get the random number */ +extern ADI_RNG_RESULT adi_rng_GetRngData ( + ADI_RNG_HANDLE const hDevice, + uint32_t* const pRegData + ); + +/* Get the oscillator count */ +extern ADI_RNG_RESULT adi_rng_GetOscCount ( + ADI_RNG_HANDLE const hDevice, + uint32_t* const pOscCount + ); + +/* Get the oscillator count difference value */ +extern ADI_RNG_RESULT adi_rng_GetOscDiff ( + ADI_RNG_HANDLE const hDevice, + uint32_t const nIndex, + uint8_t* const pOscDiff + ); + +/* Register a callback */ +extern ADI_RNG_RESULT adi_rng_RegisterCallback ( + ADI_RNG_HANDLE hDevice, + ADI_CALLBACK cbFunc, + void *pCBParam + ); + +/* Retrieve the current RNG sample length prescale and reload value configured in the device. */ +extern ADI_RNG_RESULT adi_rng_GetSampleLen ( + ADI_RNG_HANDLE const hDevice, + uint16_t* const pLenPrescaler, + uint16_t* const pLenReload + ); + +#ifdef __cplusplus +} +#endif + +#ifdef __ICCARM__ +#pragma diag_default=Pm011 +#endif /* __ICCARM__ */ +#endif /* include guard */ + +/* +** EOF +*/ + +/*@}*/ +/*@}*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/rtc/adi_rtc.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/rtc/adi_rtc.h new file mode 100755 index 0000000000..739bc47dc0 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/rtc/adi_rtc.h @@ -0,0 +1,521 @@ +/*! + ***************************************************************************** + @file adi_rtc.h + @brief Primary include file for Real Time Clock Services. + @version $Revision: 29004 $ + @date $Date: 2014-12-06 10:37:26 -0500 (Sat, 06 Dec 2014) $ + ----------------------------------------------------------------------------- +Copyright (c) 2010-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ +#ifndef ADI_RTC_H__ +#define ADI_RTC_H__ +#include "adi_processor.h" + +#include +#include +#include + +/*! \addtogroup RTC_Driver RTC Driver + * @{ + */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + + +/*! Amount of memory(In bytes) required by the RTC device driver for managing the operation. + * This memory is completely owned by the driver till the end of the operation. + */ +#define ADI_RTC_MEMORY_SIZE (24u) + +/*! Emergency flush command to gatweay register */ +#define ADI_RTC_GATEWAY_FLUSH 0xa2c5 + +/*! A device handle used in all API functions to identify the RTC device. */ +typedef void* ADI_RTC_HANDLE; + +/*! Interrupt bit position-1*/ +#define ADI_RTC_INTERRUPT_OFFSET 16 + +/*! Interrupt bit position-2*/ +#define ADI_RTC_INTERRUPT_OFFSET_IO_CAPTURE 21 + +/*! + * RTC API return codes + */ +typedef enum +{ + /*! No Error, API succeeded */ + ADI_RTC_SUCCESS, + /*! Generic failure */ + ADI_RTC_FAILURE, + /*! RTC is in failsafe mode and not reliable */ + ADI_RTC_CLOCK_FAILSAFE, + /*! RTC is already initialized */ + ADI_RTC_IN_USE, + /*! Invalid device handle passed */ + ADI_RTC_INVALID_HANDLE, + /*! Asking to initialize an unknown instance */ + ADI_RTC_INVALID_INSTANCE, + /*! Parameter is out of range */ + ADI_RTC_INVALID_OPTION, + /*! Specified operation not allowed */ + ADI_RTC_OPERATION_NOT_ALLOWED, + /*! One of the parameters is invalid */ + ADI_RTC_INVALID_PARAM, + /*! Input/SensorStrobe channel is invalid for the specified operation */ + ADI_RTC_INVALID_CHANNEL + +} ADI_RTC_RESULT; + + +/*! + * RTC Interrupt Enable Bits. + */ + + +typedef uint32_t ADI_RTC_INT_TYPE; + +#define ADI_RTC_ALARM_INT 0x00000001u /*!< Alarm interrupt enable bit */ +#define ADI_RTC_MOD60ALM_INT 0x00000002u /*!< modulo 60 Alarm interrupt enable */ +#define ADI_RTC_ISO_DONE_INT 0x00000004u /*!< Power isolation done interrupt enable */ +#define ADI_RTC_WRITE_PENDERR_INT 0x00000008u /*!< Write pend error interrupt enable */ +#define ADI_RTC_WRITE_SYNC_INT 0x00000010u /*!< Write sync interrupt enable */ +#define ADI_RTC_WRITE_PEND_INT 0x00000020u /*!< Write pend interrupt enable */ +#define ADI_RTC_COUNT_INT 0x00000040u /*!< RTC count interrupt source enable */ +#define ADI_RTC_PSI_INT 0x00000080u /*!< Precaled Module 1 interrupt */ +#define ADI_RTC_TRIM_INT 0x00000100u /*!< Enable for the RTC trim interrupt source */ +#define ADI_RTC_COUNT_ROLLOVER_INT 0x00000200u /*!< Enable for the RTC count roll-over interrupt source */ +#define ADI_RTC_MOD60_ROLLOVER_INT 0x00000400u /*!< Enable for the RTC modulo-60 count roll-over interrupt source */ +#define ADI_RTC_SENSOR_STROBE_CH1_INT 0x00000800u /*!< Enable interrupt for sensor strobe channel -1*/ +#define ADI_RTC_SENSOR_STROBE_CH2_INT 0x00001000u /*!< Enable interrupt for sensor strobe channel -2*/ +#define ADI_RTC_SENSOR_STROBE_CH3_INT 0x00002000u /*!< Enable interrupt for sensor strobe channel -3*/ +#define ADI_RTC_SENSOR_STROBE_CH4_INT 0x00004000u /*!< Enable interrupt for sensor strobe channel -4*/ +#define ADI_RTC_INPUT_CAPTURE_CH0_INT 0x00008000u /*!< Enable interrupt for input capture channel -0*/ +#define ADI_RTC_INPUT_CAPTURE_CH2_INT 0x00010000u /*!< Enable interrupt for input capture channel -2*/ +#define ADI_RTC_INPUT_CAPTURE_CH3_INT 0x00020000u /*!< Enable interrupt for input capture channel -3*/ +#define ADI_RTC_INPUT_CAPTURE_CH4_INT 0x00040000u /*!< Enable interrupt for input capture channel -4*/ +#define ADI_RTC_LFXTL_FAILURE_INT 0x00080000u /*!< Interrupt for LFXTL failure. LFXTL failure interrupt is mapped to RTC1 interrupt.*/ +#define ADI_RTC_RTCSS4_FE_INT 0x00100000u /*!< Enable interrupt for Sensor Strobe channel 3*/ +#define ADI_RTC_RTCSS3_FE_INT 0x00200000u /*!< Enable interrupt for Sensor Strobe channel 3*/ +#define ADI_RTC_RTCSS2_FE_INT 0x00400000u /*!< Enable interrupt for Sensor Strobe channel 2*/ +#define ADI_RTC_RTCSS1_FE_INT 0x00800000u /*!< Enable interrupt for Sensor Strobe channel 2*/ +#define ADI_RTC_RTCSS4MSKEN 0x01000000u /*!< Enable interrupt for Sensor Strobe channel 4 Mask */ +#define ADI_RTC_RTCSS3MSKEN 0x02000000u /*!< Enable interrupt for Sensor Strobe channel 3 Mask */ +#define ADI_RTC_RTCSS2MSKEN 0x04000000u /*!< Enable interrupt for Sensor Strobe channel 2 Mask */ +#define ADI_RTC_RTCSS1MSKEN 0x08000000u /*!< Enable interrupt for Sensor Strobe channel 1 Mask */ +#define ADI_RTC_CR5OCS_SS3SMPMTCHIRQEN 0x10000000u /*!< Sample activity Interrupt enable for RTC Sensor Strobe Channel 3 */ +#define ADI_RTC_CR5OCS_SS2SMPMTCHIRQEN 0x20000000u /*!< Sample activity Interrupt enable for RTC Sensor Strobe Channel 2 */ +#define ADI_RTC_CR5OCS_SS1SMPMTCHIRQEN 0x40000000u /*!< Sample activity Interrupt enable for RTC Sensor Strobe Channel 1. */ + + +#define ADI_RTC_NUM_INTERRUPTS 31 /*!< Number of RTC interrupts. */ + + +/*! + * RTC Posted Write Status Bits. + */ +typedef enum +{ + /*! Posted write control register-0 status bit */ + ADI_RTC_WRITE_STATUS_CONTROL0 = 1 << BITP_RTC_SR0_WSYNCCR0, + /*! Posted write status0 register status bit */ + ADI_RTC_WRITE_STATUS_STATUS0 = 1 << BITP_RTC_SR0_WSYNCSR0, + /*! Posted write count0 register status bit */ + ADI_RTC_WRITE_STATUS_COUNT0 = 1 << BITP_RTC_SR0_WSYNCCNT0, + /*! Posted write count1 register status bit */ + ADI_RTC_WRITE_STATUS_COUNT1 = 1 << BITP_RTC_SR0_WSYNCCNT1, + /*! Posted write alarm0 register status bit */ + ADI_RTC_WRITE_STATUS_ALARM0 = 1 << BITP_RTC_SR0_WSYNCALM0, + /*! Posted write alarm1 register status bit */ + ADI_RTC_WRITE_STATUS_ALARM1 = 1 << BITP_RTC_SR0_WSYNCALM1, + /*! Posted write trim register status bit */ + ADI_RTC_WRITE_STATUS_TRIM = 1 << BITP_RTC_SR0_WSYNCTRM +} ADI_RTC_WRITE_STATUS; + + +/*! + * RTC Trim intervals. + */ +typedef enum +{ + /*! Trim interval is 2^2 seconds */ + ADI_RTC_TRIM_INTERVAL_2 = (2 << BITP_RTC_TRM_IVL2EXPMIN | 0x0 << BITP_RTC_TRM_IVL), + /*! Trim interval is 2^3 seconds */ + ADI_RTC_TRIM_INTERVAL_3 = (3 << BITP_RTC_TRM_IVL2EXPMIN | 0x0 << BITP_RTC_TRM_IVL), + /*! Trim interval is 2^4 seconds */ + ADI_RTC_TRIM_INTERVAL_4 = (4 << BITP_RTC_TRM_IVL2EXPMIN | 0x0 << BITP_RTC_TRM_IVL), + /*! Trim interval is 2^5 seconds */ + ADI_RTC_TRIM_INTERVAL_5 = (5 << BITP_RTC_TRM_IVL2EXPMIN | 0x0 << BITP_RTC_TRM_IVL), + /*! Trim interval is 2^6 seconds */ + ADI_RTC_TRIM_INTERVAL_6 = (6 << BITP_RTC_TRM_IVL2EXPMIN | 0x0 << BITP_RTC_TRM_IVL), + /*! Trim interval is 2^7 seconds */ + ADI_RTC_TRIM_INTERVAL_7 = (7 << BITP_RTC_TRM_IVL2EXPMIN | 0x0 << BITP_RTC_TRM_IVL), + /*! Trim interval is 2^8 seconds */ + ADI_RTC_TRIM_INTERVAL_8 = (8 << BITP_RTC_TRM_IVL2EXPMIN | 0x0 << BITP_RTC_TRM_IVL), + /*! Trim interval is 2^9 seconds */ + ADI_RTC_TRIM_INTERVAL_9 = (9 << BITP_RTC_TRM_IVL2EXPMIN | 0x0 << BITP_RTC_TRM_IVL), + /*! Trim interval is 2^10 seconds */ + ADI_RTC_TRIM_INTERVAL_10 = (10 << BITP_RTC_TRM_IVL2EXPMIN | 0x0 << BITP_RTC_TRM_IVL), + /*! Trim interval is 2^11 seconds */ + ADI_RTC_TRIM_INTERVAL_11 = (11 << BITP_RTC_TRM_IVL2EXPMIN | 0x1 << BITP_RTC_TRM_IVL), + /*! Trim interval is 2^12 seconds */ + ADI_RTC_TRIM_INTERVAL_12 = (12 << BITP_RTC_TRM_IVL2EXPMIN | 0x0 << BITP_RTC_TRM_IVL), + /*! Trim interval is 2^13 seconds */ + ADI_RTC_TRIM_INTERVAL_13 = (13 << BITP_RTC_TRM_IVL2EXPMIN | 0x0 << BITP_RTC_TRM_IVL), + /*! Trim interval is 2^14 seconds */ + ADI_RTC_TRIM_INTERVAL_14 = (14 << BITP_RTC_TRM_IVL2EXPMIN | 0x0 << BITP_RTC_TRM_IVL), + /*! Trim interval is 2^15 seconds */ + ADI_RTC_TRIM_INTERVAL_15 = (14 << BITP_RTC_TRM_IVL2EXPMIN | 0x1 << BITP_RTC_TRM_IVL), + /*! Trim interval is 2^16 seconds */ + ADI_RTC_TRIM_INTERVAL_16 = (14 << BITP_RTC_TRM_IVL2EXPMIN | 0x2 << BITP_RTC_TRM_IVL ), + /*! Trim interval is 2^17 seconds */ + ADI_RTC_TRIM_INTERVAL_17 = (14 << BITP_RTC_TRM_IVL2EXPMIN | 0x3 << BITP_RTC_TRM_IVL) + +} ADI_RTC_TRIM_INTERVAL; + +/*! + * RTC input capture channels. + */ +typedef enum +{ + /*! Input capture channel-0 */ + ADI_RTC_INPUT_CHANNEL_0 = 1 << BITP_RTC_CR2IC_IC0EN, + /*! Input capture channel-2 */ + ADI_RTC_INPUT_CHANNEL_2 = 1 << BITP_RTC_CR2IC_IC2EN, + /*! Input capture channel-3 */ + ADI_RTC_INPUT_CHANNEL_3 = 1 << BITP_RTC_CR2IC_IC3EN, + /*! Input capture channel-4 */ + ADI_RTC_INPUT_CHANNEL_4 = 1 << BITP_RTC_CR2IC_IC4EN + +}ADI_RTC_INPUT_CHANNEL; + +/*! + * RTC Sensor Strobe channels. + */ +typedef enum +{ + /*! Sensor Strobe channel-1 */ + ADI_RTC_SS_CHANNEL_1 = 1 << BITP_RTC_CR3SS_SS1EN, + /*! Sensor Strobe channel-2 */ + ADI_RTC_SS_CHANNEL_2 = 1 << BITP_RTC_CR3SS_SS2EN, + /*! Sensor Strobe channel-3 */ + ADI_RTC_SS_CHANNEL_3 = 1 << BITP_RTC_CR3SS_SS3EN, + /*! Sensor Strobe channel-4 */ + ADI_RTC_SS_CHANNEL_4 = 1 << BITP_RTC_CR3SS_SS4EN, + +}ADI_RTC_SS_CHANNEL; + +/*! + * RTC Trim polarity. + */ +typedef enum +{ + /*! Trim value is added every trim interval */ + ADI_RTC_TRIM_ADD = (1 << BITP_RTC_TRM_ADD), + /*! Trim value is subtracted every trim interval */ + ADI_RTC_TRIM_SUB = (0 << BITP_RTC_TRM_ADD), +} ADI_RTC_TRIM_POLARITY; + +/*! + * RTC Trim values. + */ +typedef enum +{ + /*! Trim value is +/- 0 */ + ADI_RTC_TRIM_0 = (0 << BITP_RTC_TRM_VALUE), + /*! Trim value is +/- 1 */ + ADI_RTC_TRIM_1 = (1 << BITP_RTC_TRM_VALUE), + /*! Trim value is +/- 2 */ + ADI_RTC_TRIM_2 = (2 << BITP_RTC_TRM_VALUE), + /*! Trim value is +/- 3 */ + ADI_RTC_TRIM_3 = (3 << BITP_RTC_TRM_VALUE), + /*! Trim value is +/- 4 */ + ADI_RTC_TRIM_4 = (4 << BITP_RTC_TRM_VALUE), + /*! Trim value is +/- 5 */ + ADI_RTC_TRIM_5 = (5 << BITP_RTC_TRM_VALUE), + /*! Trim value is +/- 6 */ + ADI_RTC_TRIM_6 = (6 << BITP_RTC_TRM_VALUE), + /*! Trim value is +/- 7 */ + ADI_RTC_TRIM_7 = (7 << BITP_RTC_TRM_VALUE) +} ADI_RTC_TRIM_VALUE; + +/*! + * RTC control register set. + */ +typedef enum +{ + /*! Specify the RTC-Control register-0 */ + ADI_RTC_CONTROL_REGISTER_0, + /*! Specify the RTC-Control register-1 */ + ADI_RTC_CONTROL_REGISTER_1 +} ADI_RTC_CONTROL_REGISTER; + +/*================ E X T E R N A L S ==================*/ + +/* + */ + +/*************************************/ +/* RTC API */ +/*************************************/ +ADI_RTC_RESULT adi_rtc_Open( + uint32_t DeviceNumber, + void *pDeviceMemory, + uint32_t MemorySize, + ADI_RTC_HANDLE *phDevice + ); + +ADI_RTC_RESULT adi_rtc_Close( + ADI_RTC_HANDLE const hDevice + ); + +/*************************************/ +/* Enable APIs for RTC Device */ +/*************************************/ + +ADI_RTC_RESULT adi_rtc_EnableAlarm( + ADI_RTC_HANDLE const hDevice, + bool bEnable + ); + +ADI_RTC_RESULT adi_rtc_EnableMod60Alarm( + ADI_RTC_HANDLE const hDevice, + bool bEnable + ); + +ADI_RTC_RESULT adi_rtc_Enable( + ADI_RTC_HANDLE const hDevice, + bool bEnable + ); + +ADI_RTC_RESULT adi_rtc_EnableInterrupts( + ADI_RTC_HANDLE const hDevice, + ADI_RTC_INT_TYPE Interrupts, + bool bEnable + ); + +ADI_RTC_RESULT adi_rtc_EnableTrim( + ADI_RTC_HANDLE const hDevice, + bool bEnable + ); + +ADI_RTC_RESULT adi_rtc_EnableAutoReload( + ADI_RTC_HANDLE const hDevice, + ADI_RTC_SS_CHANNEL eSSChannel, + bool bEnable); + +ADI_RTC_RESULT adi_rtc_EnableSensorStrobeOutput ( + ADI_RTC_HANDLE const hDevice, + ADI_RTC_SS_CHANNEL eSSChannel, + bool bEnable); + +ADI_RTC_RESULT adi_rtc_EnableInputCapture ( + ADI_RTC_HANDLE const hDevice, + ADI_RTC_INPUT_CHANNEL eInpChannel, + bool bEnable); + +ADI_RTC_RESULT adi_rtc_EnableSensorStrobeChannelMask( + ADI_RTC_HANDLE const hDevice, + ADI_RTC_SS_CHANNEL eSSChannel, + bool bEnable); + +ADI_RTC_RESULT adi_rtc_EnableOverwriteSnapshot ( + ADI_RTC_HANDLE const hDevice, + bool bEnable); + +/*************************************/ +/* Set APIs for RTC Device */ +/*************************************/ + + +ADI_RTC_RESULT adi_rtc_SetMod60AlarmPeriod( + ADI_RTC_HANDLE const hDevice, + uint8_t nPeriod + ); + +ADI_RTC_RESULT adi_rtc_SetAlarm( + ADI_RTC_HANDLE const hDevice, + uint32_t nAlarm + ); + +ADI_RTC_RESULT adi_rtc_SetAlarmEx( + ADI_RTC_HANDLE const hDevice, + float fAlarm + ); + + +ADI_RTC_RESULT adi_rtc_SetControlRegister( + ADI_RTC_HANDLE const hDevice, + ADI_RTC_CONTROL_REGISTER eRegister, + uint32_t Control + ); + +ADI_RTC_RESULT adi_rtc_SetCount( + ADI_RTC_HANDLE const hDevice, + uint32_t nCount + ); + +ADI_RTC_RESULT adi_rtc_SetGateway( + ADI_RTC_HANDLE const hDevice, + uint16_t Command + ); + + +ADI_RTC_RESULT adi_rtc_SetPreScale( + ADI_RTC_HANDLE const hDevice, + uint8_t nPreScale + ); + +ADI_RTC_RESULT adi_rtc_SetTrim( + ADI_RTC_HANDLE const hDevice, + ADI_RTC_TRIM_INTERVAL eInterval, + ADI_RTC_TRIM_VALUE eTrimValue, + ADI_RTC_TRIM_POLARITY eOperation + ); + +ADI_RTC_RESULT adi_rtc_SetSensorStrobeChannelMask( + ADI_RTC_HANDLE const hDevice, + ADI_RTC_SS_CHANNEL eSSChannel, + uint8_t nMask); + +ADI_RTC_RESULT adi_rtc_SetAutoReloadValue( + ADI_RTC_HANDLE const hDevice, + ADI_RTC_SS_CHANNEL eSSChannel, + uint16_t nValue); + +ADI_RTC_RESULT adi_rtc_SetInputCapturePolarity ( + ADI_RTC_HANDLE const hDevice, + ADI_RTC_INPUT_CHANNEL eInpChannel, + bool bEnable); + +ADI_RTC_RESULT adi_rtc_SetSensorStrobeValue( + ADI_RTC_HANDLE const hDevice, + ADI_RTC_SS_CHANNEL eSSChannel, + uint16_t nValue); + +/*************************************/ +/* Get APIs for RTC Device */ +/*************************************/ + +ADI_RTC_RESULT adi_rtc_GetAlarm ( + ADI_RTC_HANDLE hDevice, + uint32_t *pAlarm + ); + +ADI_RTC_RESULT adi_rtc_GetAlarmEx ( + ADI_RTC_HANDLE hDevice, + float *pAlarm); + +ADI_RTC_RESULT adi_rtc_GetControl ( + ADI_RTC_HANDLE hDevice, + ADI_RTC_CONTROL_REGISTER eRegister , + uint32_t *pControl); + +ADI_RTC_RESULT adi_rtc_GetTrim( + ADI_RTC_HANDLE hDevice, + ADI_RTC_TRIM_VALUE *peTrim + ); + +ADI_RTC_RESULT adi_rtc_GetCount( + ADI_RTC_HANDLE const hDevice, + uint32_t *pCount + ); + +ADI_RTC_RESULT adi_rtc_GetCountEx( + ADI_RTC_HANDLE const hDevice, + float *pfCount + ); + +ADI_RTC_RESULT adi_rtc_GetSnapShot( + ADI_RTC_HANDLE const hDevice, + ADI_RTC_INPUT_CHANNEL eChannel, + uint32_t *pValue, + uint16_t *pFraction); + +ADI_RTC_RESULT adi_rtc_GetInputCaptureValue( + ADI_RTC_HANDLE const hDevice, + ADI_RTC_INPUT_CHANNEL eChannel, + uint16_t *pValue); + +ADI_RTC_RESULT adi_rtc_GetWritePendStatus( + ADI_RTC_HANDLE const hDevice, + ADI_RTC_WRITE_STATUS *pPendBits + ); + +ADI_RTC_RESULT adi_rtc_GetWriteSyncStatus( + ADI_RTC_HANDLE const hDevice, + ADI_RTC_WRITE_STATUS *pSyncBits + ); + +ADI_RTC_RESULT adi_rtc_GetSensorStrobeValue( + ADI_RTC_HANDLE const hDevice, + ADI_RTC_SS_CHANNEL eSSChannel, + uint16_t *pValue); + +ADI_RTC_RESULT adi_rtc_GetCountRegs( + ADI_RTC_HANDLE const hDevice, + uint32_t *pnCount, + uint32_t *pfCount); +/************************************************/ +/* RTC APIs for managing interrupt/sync */ +/***********************************************/ + +ADI_RTC_RESULT adi_rtc_SynchronizeAllWrites( + ADI_RTC_HANDLE const hDevice + ); + +ADI_RTC_RESULT adi_rtc_RegisterCallback( + ADI_RTC_HANDLE const hDevice, + ADI_CALLBACK const pfCallback, + void *const pCBparam + ); + +#ifdef __cplusplus +} +#endif + +/**@}*/ + +#endif /* ADI_RTC_H__ */ + + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/spi/adi_spi.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/spi/adi_spi.h new file mode 100755 index 0000000000..f3aa1118c2 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/spi/adi_spi.h @@ -0,0 +1,386 @@ +/*! ***************************************************************************** + * @file adi_spi.h + * @brief Main include file for SPI Device driver definitions + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here.ADI_SEM_SIZE + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + + +#ifndef ADI_SPI_H__ +#define ADI_SPI_H__ + +#include +#include +#include + +/** @addtogroup SPI_Driver SPI Driver + * @{ + */ + + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +/*! Amount of memory(In bytes) required by the SPI device driver for managing the operation + * of a SPI controller. The memory is passed to the driver when the driver is opened. + * The memory is completely owned by the driver till the the driver is closed. + * + */ + +#define ADI_SPI_MEMORY_SIZE (40u + ADI_SEM_SIZE) + + +/*! + ***************************************************************************** + * \enum ADI_SPI_RESULT + * + * SPI Device Error Codes. #ADI_SPI_SUCCESS is always zero + * The return value of all SPI APIs returning #ADI_SPI_RESULT + * should always be tested at the application level for success or failure. + * + *****************************************************************************/ +typedef enum +{ + /*! Generic success. */ + ADI_SPI_SUCCESS, + /*! Generic Failure. */ + ADI_SPI_FAILURE, + /*! SPI device is already initialized. */ + ADI_SPI_IN_USE, + /*! Invalid device handle. */ + ADI_SPI_INVALID_HANDLE, + /*! Invalid device ID. */ + ADI_SPI_INVALID_DEVICE_NUM, + /*! DMA configuration failure. */ + ADI_SPI_DMA_ERROR , + /*! NULL data pointer not allowed. */ + ADI_SPI_INVALID_POINTER, + /*! Parameter is out of range. */ + ADI_SPI_INVALID_PARAM, + /*! Unsupported mode of operation. */ + ADI_SPI_UNSUPPORTED_MODE, + /*! Semaphore in error . */ + ADI_SPI_SEMAPHORE_FAILED, + /*! Invalid operation */ + ADI_SPI_INVALID_OPERATION, + /*! Buffer Not submitted */ + ADI_SPI_BUFFER_NOT_SUBMITTED, + /*! Could not obtain the system clock */ + ADI_SPI_BAD_SYS_CLOCK, + /*! Blocking PEND failed */ + ADI_SPI_PEND_FAILED, + /*! DMA callback register failed */ + ADI_SPI_DMA_REG_FAILED, + /*! Hardware error occurred */ + ADI_SPI_HW_ERROR_OCCURRED +} ADI_SPI_RESULT; + +/*! + ***************************************************************************** + * \enum ADI_SPI_HW_ERRORS + * + * Enumeration of events notified in the application provided callback. + * More than one event can be recorded at a time so the enumerator symbols + * have to be assigned values of 2^N + *****************************************************************************/ +typedef enum +{ + /*!< The given buffer is processed. Application can use this event to submit + the next buffer to be transmitted. */ + ADI_SPI_HW_ERROR_NONE = 0u, + /*! Tx-underflow interrupt enable */ + ADI_SPI_HW_ERROR_TX_UNDERFLOW = 1u, + /*! Rx-overflow interrupt enable */ + ADI_SPI_HW_ERROR_RX_OVERFLOW = 2u, + /*! Rx DMA channel bus fault detected */ + ADI_SPI_HW_ERROR_RX_CHAN_DMA_BUS_FAULT = 4u, + /*! Tx DMA channel bus fault detected */ + ADI_SPI_HW_ERROR_TX_CHAN_DMA_BUS_FAULT = 8u, + /*! Rx DMA channel bus fault detected */ + ADI_SPI_HW_ERROR_RX_CHAN_DMA_INVALID_DESCR = 16u, + /*! Tx DMA channel bus fault detected */ + ADI_SPI_HW_ERROR_TX_CHAN_DMA_INVALID_DESCR = 32u, + /*! Rx DMA channel unkown error detected */ + ADI_SPI_HW_ERROR_RX_CHAN_DMA_UNKNOWN_ERROR = 64u, + /*! Tx DMA channel unkown error detected */ + ADI_SPI_HW_ERROR_TX_CHAN_DMA_UNKNOWN_ERROR = 128u + +} ADI_SPI_HW_ERRORS; + +/*! + ***************************************************************************** + * \enum ADI_SPI_CHIP_SELECT + * + * SPI Device Chip Select Enumeration. Allows designation of an external + * SPI slave device chip select pin to be driven by the SPI controller. + * Multiple external slave SPI devices may be present on a shared SPI bus, + * and the chip select pin allows each of them to be assigned dedicated selects. + * Use the #adi_spi_SetChipSelect() API to configure the active chip select. + * Note that SPI0 is an internal channel dedicated to the UHF controller and + * hence, has a dedicated SPI0 chip select pin that is not available externally. + * + *****************************************************************************/ +typedef enum +{ + /*! No Slave Chip Select for SPI. */ + ADI_SPI_CS_NONE = 0, + /*! CS0 Slave Chip Select for SPI. */ + ADI_SPI_CS0 = 1, + /*! CS1 Slave Chip Select for SPI. */ + ADI_SPI_CS1 = 2, + /*! CS2 Slave Chip Select for SPI. */ + ADI_SPI_CS2 = 4, + /*! CS3 Slave Chip Select for SPI. */ + ADI_SPI_CS3 = 8 +} ADI_SPI_CHIP_SELECT; + + +/*! SPI Device instance private data handle typedef. */ +typedef struct __ADI_SPI_DEV_DATA_TYPE* ADI_SPI_HANDLE; +/*! SPI Device instance private data handle typedef. 'const' version */ +typedef const struct __ADI_SPI_DEV_DATA_TYPE* ADI_SPI_CONST_HANDLE; + + +/*! + * \struct ADI_SPI_TRANSCEIVER + ***************************************************************************** + * SPI Device Command/Data Transceiver Structure. Data structure used by + * the #adi_spi_MasterReadWrite(),#adi_spi_MasterSubmitBuffer() + * API to convey all parameters, consisting of + * prologue, transmit and receive data and size, and buffer increment flags. + * DMA and Half-Duplex operation are also specified in this structure as T/F. + * + * Each call to #adi_spi_MasterReadWrite or #adi_spi_MasterSubmitBuffer() must populate the following fields of the + * ADI_SPI_TRANSCEIVER block: + * + * @par TransmitterBytes + * The number of bytes to be transmitted. If the value is zero, data will not be transmitted from the + * buffer pointed by pTransmitter. + * + * @par ReceiverBytes + * The number of bytes to be received. If the value is zero, data will not be stored in the + * buffer pointed by pReceiver. + * + * @par pTransmitter + * Pointer to the application-defined transmit data buffer. This is the data sent out + * over the SPI transmit wire (MOSI for Master-mode, MISO for Slave-mode) during the SPI transaction. + * For SPI DMA mode (which is 16-bit based), the transmit buffer must be 16-bit aligned. + * + * @par pReceiver + * Pointer to the application-defined receive data buffer. This is where the receive data + * will be stored from the SPI receive wire (MISO for Master-mode, MOSI for Slave-mode) + * during the SPI transaction. + * For SPI DMA mode (which is 16-bit based), the receive buffer must be 16-bit aligned. + * + * @par bTxIncrement + * Increment to be done for the transmit buffer after every transaction . The transmit data buffer + * pointer is advanced as each byte is sent. If it is set to zero, the transmit data pointer is stationary. + * A stationary buffer pointer is useful for sending the same data to an external device or if + * the source data is from a fixed memory address. + * + * @par bRxIncrement + * Increment to be done for the receive buffer. The transmit data buffer + * pointer is advanced as each byte is sent. If it is value is set to zero, the receive + * data pointer is stationary. A stationary buffer pointer is useful for monitoring commands + * from an external device or if the receive data is going to a fixed memory address. + * + * @par bDMA + * Indicate whether the transaction is to use DMA (true) or not (false). If using DMA SPI + * transactions are limited to 2048 bytes. If more than 2048 bytes are needed then the application + * must use multiple transactions (DMA ping pong mode is not supported in the driver). + * For SPI DMA mode (which is 16-bit based), TransmitterBytes/ReceiverBytes is rounded up to an + * even number by the SPI driver before submitting to DMA. + * Please align the buffer to 16 bit word boundary since the data transfer is 16bit. + * + * + * @par bRD_CTL + * Indicate whether the transaction should enable RD_CTL (true) or not (false). + * RD_CTL effectively provides half-duplex operation as outlined in the HRM. + + *****************************************************************************/ +typedef struct +{ + /*! Pointer to transmit data. */ + uint8_t* pTransmitter; + /*! Pointer to receive data. */ + uint8_t* pReceiver; + /*! Data size for TX(bytes). */ + uint16_t TransmitterBytes; + /*! Data size for RX(bytes). */ + uint16_t ReceiverBytes; + /*! Transmit pointer increment flag. */ + uint8_t nTxIncrement; + /*! Receive pointer increment flag. */ + uint8_t nRxIncrement; + /*! DMA mode operation */ + bool bDMA; + /*! RD_CTL, half-duplex, operation */ + bool bRD_CTL; + +} ADI_SPI_TRANSCEIVER; + + + +/****************************************************************************** + * SPI Device External API function prototypes + *****************************************************************************/ + +/* Device Initialization and Uninitialization Interfaces */ +ADI_SPI_RESULT adi_spi_Open( + uint32_t nDeviceNum, + void *pDevMemory, + uint32_t nMemorySize, + ADI_SPI_HANDLE* const phDevice + ); + +ADI_SPI_RESULT adi_spi_Close( + ADI_SPI_HANDLE const hDevice + ); + +/****************************************************************** + * Eliminatable functions that may be optimized out by the linker * + *****************************************************************/ + +ADI_SPI_RESULT adi_spi_MasterReadWrite( + ADI_SPI_HANDLE const hDevice, + const ADI_SPI_TRANSCEIVER* const pXfr + ); + + +ADI_SPI_RESULT adi_spi_SetMasterMode( + ADI_SPI_CONST_HANDLE const hDevice, + const bool bFlag + ); + +/* Slave Mode APIs */ +ADI_SPI_RESULT adi_spi_SlaveReadWrite( + ADI_SPI_HANDLE const hDevice, + const ADI_SPI_TRANSCEIVER* const pXfr + ); + +/* Command/Data transceiver API */ +ADI_SPI_RESULT adi_spi_MasterSubmitBuffer( + ADI_SPI_HANDLE const hDevice, + const ADI_SPI_TRANSCEIVER* const pXfr + ); + +ADI_SPI_RESULT adi_spi_SlaveSubmitBuffer( + ADI_SPI_HANDLE const hDevice, + const ADI_SPI_TRANSCEIVER* + const pXfr + ); + +ADI_SPI_RESULT adi_spi_RegisterCallback ( + ADI_SPI_HANDLE const hDevice, + ADI_CALLBACK const pfCallback, + void *const pCBParam + ); + + +/* Turn a non-blocking call into a blocking call. Wait for the transaction to complete */ +ADI_SPI_RESULT adi_spi_GetBuffer( + ADI_SPI_HANDLE const hDevice, + uint32_t * const pHWErrors + ); + +/* Query function for the data transfer completion */ +ADI_SPI_RESULT adi_spi_isBufferAvailable( + ADI_SPI_CONST_HANDLE const hDevice, + bool* const bComplete + ); + + + +ADI_SPI_RESULT adi_spi_SetContinuousMode( + ADI_SPI_CONST_HANDLE const hDevice, + const bool bFlag + ); + + +ADI_SPI_RESULT adi_spi_SetLoopback( + ADI_SPI_CONST_HANDLE const hDevice, + const bool bFlag + ); + +ADI_SPI_RESULT adi_spi_SetIrqmode ( + ADI_SPI_CONST_HANDLE const hDevice, + const uint8_t nMode); + +ADI_SPI_RESULT adi_spi_SetReceiveOverflow( + ADI_SPI_CONST_HANDLE const hDevice, + const bool bFlag + ); + +ADI_SPI_RESULT adi_spi_SetTransmitUnderflow( + ADI_SPI_CONST_HANDLE const hDevice, + const bool bFlag + ); + +/* Mode Configuration Interface */ +ADI_SPI_RESULT adi_spi_SetBitrate( + ADI_SPI_CONST_HANDLE const hDevice, + const uint32_t Hertz + ); +ADI_SPI_RESULT adi_spi_SetChipSelect( + ADI_SPI_HANDLE const hDevice, + const ADI_SPI_CHIP_SELECT eChipSelect + ); + +ADI_SPI_RESULT adi_spi_GetBitrate( + ADI_SPI_CONST_HANDLE const hDevice, + uint32_t* const pnBitrate + ); + + +#ifdef __cplusplus +} +#endif + + +/**@}*/ + + +#endif /* ADI_SPI_H__ */ + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/sport/adi_sport.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/sport/adi_sport.h new file mode 100755 index 0000000000..aaf32f2cb0 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/sport/adi_sport.h @@ -0,0 +1,236 @@ +/*! **************************************************************************** + * @file adi_sport.h + * @brief SPORT (Serial Port) Device driver definitions + * @details Header File for the SPORT driver API functions and definitions + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ +#ifndef ADI_SPORT_H +#define ADI_SPORT_H + +/*============= I N C L U D E S =============*/ + +#include +#include +#include +#include + +/** @addtogroup SPORT_Driver SPORT Driver +* @{ +*/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +/*============== D E F I N E S ===============*/ + +/** + * Amount of memory (bytes) required by the SPORT device driver for managing + * the operation in interrupt mode. This memory is completely owned by the + * driver till the end of the operation. + */ +#define ADI_SPORT_MEMORY_SIZE (76u + ADI_SEM_SIZE) + +typedef void* ADI_SPORT_HANDLE; /*!< Handle to the SPORT Device */ + +/** + * Enumeration of different channels of the SPORT + */ +typedef enum +{ + ADI_HALF_SPORT_A = 0, /*!< First half SPORT */ + ADI_HALF_SPORT_B = 1 /*!< Second half SPORT */ +} ADI_SPORT_CHANNEL; + +/** + * Enumeration for the direction of operation. + */ +typedef enum +{ + ADI_SPORT_DIR_RX, /*!< Sport in Rx mode */ + ADI_SPORT_DIR_TX /*!< Sport in Tx mode */ +} ADI_SPORT_DIRECTION; + +/** + * Enumeration for enabling packing. + */ +typedef enum +{ + ADI_SPORT_NO_PACKING = 0, /*!< No Packing */ + ADI_SPORT_8BIT_PACKING = ENUM_SPORT_CTL_A_CTL_PACK_8BIT, /*!< 8-bit packing */ + ADI_SPORT_16BIT_PACKING = ENUM_SPORT_CTL_A_CTL_PACK_16BIT /*!< 16-Bit packing */ +} ADI_SPORT_PACKING_MODE; + +/** + * Enumeration for Hardware Error encountered by the SPORT device. + */ + typedef enum +{ + ADI_SPORT_HW_NO_ERR = 0x00, /*!< No Hardware error */ + ADI_SPORT_HW_ERR_RX_OVERFLOW = 0x02, /*!< Data overflow for Rx (same value as Tx underflow) */ + ADI_SPORT_HW_ERR_TX_UNDERFLOW = 0x02, /*!< Data underflow for Tx (same value as Rx overflow) */ + ADI_SPORT_HW_ERR_FS = 0x04, /*!< Frame sync error */ + ADI_SPORT_HW_ERR_SYSDATAERR = 0x10, /*!< System Data Error */ + + ADI_SPORT_EVENT_RX_BUFFER_PROCESSED = 0x20, /*!< Processed the submitted RX buffer */ + ADI_SPORT_EVENT_TX_BUFFER_PROCESSED = 0x40, /*!< Processed the submitted TX buffer */ + + ADI_SPORT_DMA_ERR_BUS = 0x100, /*!< SPORT DMA bus error detected */ + ADI_SPORT_DMA_ERR_INVALID_DESCRIPTOR = 0x200 /*!< SPORT DMA invalid descriptor error detected */ +}ADI_SPORT_EVENT; + + +/** + * Enumeration for result code returned from the SPORT device driver functions. + */ +typedef enum +{ + ADI_SPORT_SUCCESS, /*!< Success */ + ADI_SPORT_FAILED, /*!< Generic Failure to indicate a call to SPORT driver function returned unsuccessful */ + ADI_SPORT_INVALID_DEVICE_NUM , /*!< Invalid device number */ + ADI_SPORT_INVALID_NULL_POINTER, /*!< Specified pointer is invalid */ + ADI_SPORT_INVALID_HANDLE, /*!< The given handle is invalid */ + ADI_SPORT_INVALID_PARAMETER, /*!< Specified parameter is not valid */ + ADI_SPORT_DMA_REGISTER_FAILED, /*!< Registering DMA error handler failed */ + ADI_SPORT_DEVICE_IN_USE, /*!< The specified SPORT channel is already open and in use */ + ADI_SPORT_INVALID_CONFIGURATION, /*!< The SPORT configuration is invalid */ + ADI_SPORT_BUFFERS_NOT_SUBMITTED, /*!< Buffer submission failed */ + ADI_SPORT_INVALID_WORD_LENGTH, /*!< Invalid word size */ + ADI_SPORT_OPERATION_NOT_ALLOWED, /*!< Specified operation is not allowed when SPORT is transmitting/receiving data */ + ADI_SPORT_HW_ERROR /*!< SPORT hardware or DMA reports an error */ +} ADI_SPORT_RESULT; + +/*============= P U B L I C F U N C T I O N S =============*/ + +/* Opens a SPORT device */ +ADI_SPORT_RESULT adi_sport_Open( + const uint32_t nDevNum, + const ADI_SPORT_CHANNEL eChannel, + const ADI_SPORT_DIRECTION eDirection, + void *pMemory, + const uint32_t nMemSize, + ADI_SPORT_HANDLE * const phDevice + ); + +/* Closes a SPORT device */ +ADI_SPORT_RESULT adi_sport_Close( + ADI_SPORT_HANDLE const hDevice + ); + +/* Submits a buffer to the driver */ +ADI_SPORT_RESULT adi_sport_SubmitBuffer( + ADI_SPORT_HANDLE const hDevice, + void * const pBuffer, + uint32_t const nNumBytes, + bool const bDMA + ); + +/* Get the processed buffer from the driver */ +ADI_SPORT_RESULT adi_sport_GetBuffer( + ADI_SPORT_HANDLE const hDevice, + void ** const ppBuffer, + uint32_t * pHwError + ); + +/* Peek function to know whether an processed buffer is avilable */ +ADI_SPORT_RESULT adi_sport_IsBufferAvailable( + ADI_SPORT_HANDLE const hDevice, + bool * const pbAvailable + ); + +/* To register the callback function */ +ADI_SPORT_RESULT adi_sport_RegisterCallback( + ADI_SPORT_HANDLE const hDevice, + const ADI_CALLBACK pfCallback, + void * const pCBparam + ); + +/* Configure the data */ +ADI_SPORT_RESULT adi_sport_ConfigData( + ADI_SPORT_HANDLE const hDevice, + const uint8_t nWordLength, + const ADI_SPORT_PACKING_MODE ePackMode, + const bool bLSBFirst + ); + +/* Configure the clock */ +ADI_SPORT_RESULT adi_sport_ConfigClock( + ADI_SPORT_HANDLE const hDevice, + const uint16_t nClockRatio, + const bool bUseIntlClock, + const bool bRisingEdge, + const bool bGatedClk + ); + +/* Configure the frame sync */ +ADI_SPORT_RESULT adi_sport_ConfigFrameSync( + ADI_SPORT_HANDLE const hDevice, + const uint16_t nFsDivisor, + const bool bFSRequired, + const bool bInternalFS, + const bool bDataFS, + const bool bActiveLowFS, + const bool bLateFS, + const bool bFSErrorOperation + ); + +/* To mux the half-SPORT; this makes the device to use FS and Clock from other half-SPORT */ +ADI_SPORT_RESULT adi_sport_MultiplexSportSignal( + ADI_SPORT_HANDLE const hDevice, + const bool bUseOtherFS, + const bool bUseOtherClk + ); + +/* To configure the SPORT in timer mode */ +ADI_SPORT_RESULT adi_sport_ConfigTimerMode( + ADI_SPORT_HANDLE const hDevice, + const uint8_t nFSDuration, + const uint8_t nWidth, + const bool bActiveLow + ); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* ADI_SPORT_H */ +/*@}*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/tmr/adi_tmr.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/tmr/adi_tmr.h new file mode 100755 index 0000000000..9331593a12 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/tmr/adi_tmr.h @@ -0,0 +1,253 @@ +/*! ***************************************************************************** + * @file adi_tmr.h + * @brief GP and RGB timer device driver public header file + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + + +#ifndef ADI_TMR_H +#define ADI_TMR_H + + +#include +#include +#include + + +/** @addtogroup TMR_Driver Timer Driver + * @{ + */ + + +/*! + ***************************************************************************** + * \enum ADI_TMR_RESULT + * Enumeration for result code returned from the timer device driver functions. + * The return value of all timer APIs returning #ADI_TMR_RESULT should always + * be tested at the application level for success or failure. + *****************************************************************************/ +typedef enum { + /*! Successful operation */ + ADI_TMR_SUCCESS, + /*! Bad device number supplied by user */ + ADI_TMR_BAD_DEVICE_NUM, + /*! Bad PWM output number supplied by user to #adi_tmr_ConfigPwm */ + ADI_TMR_BAD_PWM_NUM, + /*! Bad event number supplied by user to #adi_tmr_ConfigEvent */ + ADI_TMR_BAD_EVENT_ID, + /*! Bad timer configuration, reloading and free running are mutually exclusive options */ + ADI_TMR_BAD_RELOAD_CONFIGURATION, + /*! Setup or enable function called while the timer is running */ + ADI_TMR_OPERATION_NOT_ALLOWED, + /*! Timeout while waiting for busy bit to clear before writing control register */ + ADI_TMR_DEVICE_BUSY, + /*! User attempts to reload the timer when reloading has not been enabled */ + ADI_TMR_RELOAD_DISABLED, + /*! User attempts to read the current or captured count with a NULL pointer */ + ADI_TMR_NULL_POINTER +} ADI_TMR_RESULT; + +/*! + ***************************************************************************** + * \enum ADI_TMR_DEVICE + * Enumeration for the hardware peripheral being used during the API call + *****************************************************************************/ +typedef enum { + /*! General purpose timer 0 */ + ADI_TMR_DEVICE_GP0 = 0u, + /*! General purpose timer 1 */ + ADI_TMR_DEVICE_GP1 = 1u, + /*! General purpose timer 2 */ + ADI_TMR_DEVICE_GP2 = 2u, + /*! RGB timer */ + ADI_TMR_DEVICE_RGB = 3u, + /*! Total number of devices (private) */ + ADI_TMR_DEVICE_NUM = 4u, +} ADI_TMR_DEVICE; + +/*! + ***************************************************************************** + * \enum ADI_TMR_EVENT + * Enumeration of events notified in the application provided callback. + *****************************************************************************/ +typedef enum { + /*! Timeout event occurred */ + ADI_TMR_EVENT_TIMEOUT = 0x01, + /*! Event capture event occurred */ + ADI_TMR_EVENT_CAPTURE = 0x02, +} ADI_TMR_EVENT; + +/*! + ***************************************************************************** + * \enum ADI_TMR_PRESCALER + * Prescale options when configuring the timer + *****************************************************************************/ +typedef enum { + /*! Count every 1 source clock periods */ + ADI_TMR_PRESCALER_1 = 0u, + /*! Count every 16 source clock periods */ + ADI_TMR_PRESCALER_16 = 1u, + /*! Count every 64 source clock periods */ + ADI_TMR_PRESCALER_64 = 2u, + /*! Count every 256 source clock periods */ + ADI_TMR_PRESCALER_256 = 3u, +} ADI_TMR_PRESCALER; + +/*! + ***************************************************************************** + * \enum ADI_TMR_CLOCK_SOURCE + * Source clock options when configuring the timer + *****************************************************************************/ +typedef enum { + /*! Use periphreal clock (PCLK) */ + ADI_TMR_CLOCK_PCLK = 0u, + /*! Use internal high frequency clock (HFOSC) */ + ADI_TMR_CLOCK_HFOSC = 1u, + /*! Use internal low frequency clock (LFOSC) */ + ADI_TMR_CLOCK_LFOSC = 2u, + /*! Use external low frequency clock (LFXTAL) */ + ADI_TMR_CLOCK_LFXTAL = 3u, +} ADI_TMR_CLOCK_SOURCE; + +/*! + ***************************************************************************** + * \enum ADI_TMR_PWM_OUTPUT + * RGB PWM outputs, used to specify which PWM output to configure. For the GP + * timers only #ADI_TMR_PWM_OUTPUT_0 is allowed. The RGB timer has all three + * outputs. + *****************************************************************************/ +typedef enum { + /*! PWM output 0 */ + ADI_TMR_PWM_OUTPUT_0 = 0u, + /*! PWM output 1 */ + ADI_TMR_PWM_OUTPUT_1 = 1u, + /*! PWM output 2 */ + ADI_TMR_PWM_OUTPUT_2 = 2u, + /*! Total number of outputs (private) */ + ADI_TMR_PWM_OUTPUT_NUM = 3u, +} ADI_TMR_PWM_OUTPUT; + +/*! + ***************************************************************************** + * \struct ADI_TMR_CONFIG + * Configuration structure to fill and pass to #adi_tmr_ConfigTimer when + * configuring the GP or RGB timer + *****************************************************************************/ +typedef struct { + /*! True to count up, false to count down */ + bool bCountingUp; + /*! True for periodic (specific load value), false for free running (0xFFFF) */ + bool bPeriodic; + /*! Prescaler */ + ADI_TMR_PRESCALER ePrescaler; + /*! Clock source */ + ADI_TMR_CLOCK_SOURCE eClockSource; + /*! Load value (only relent in periodic mode) */ + uint16_t nLoad; + /*! Asynchronous load value (only relevant in periodic mode, and when PCLK is used) */ + uint16_t nAsyncLoad; + /*! True to enable reloading, false to disable it (only relevant in periodic mode) */ + bool bReloading; + /*! True to enable sync bypass, false to disable it */ + bool bSyncBypass; +} ADI_TMR_CONFIG; + +/*! + ***************************************************************************** + * \struct ADI_TMR_EVENT_CONFIG + * Configuration structure to fill and pass to #adi_tmr_ConfigEvent when + * configuring event capture + *****************************************************************************/ +typedef struct { + /*! True to enable event capture, false to disable it */ + bool bEnable; + /*! True to reset the counter and prescaler when the selected event occurs, false to let it continue */ + bool bPrescaleReset; + /*! Event identifier, see hardware reference manual for details */ + uint8_t nEventID; +} ADI_TMR_EVENT_CONFIG; + +/*! + ***************************************************************************** + * \struct ADI_TMR_PWM_CONFIG + * Configuration structure to fill and pass to #adi_tmr_ConfigPwm when + * configuring pulse width modulation output + *****************************************************************************/ +typedef struct { + /*! PWM output */ + ADI_TMR_PWM_OUTPUT eOutput; + /*! True if match mode (configurable duty cycle), false if toggle mode (50% duty cycle) */ + bool bMatch; + /*! True for PWM idle high, false for PWM idle low */ + bool bIdleHigh; + /*! Match value, only applicable if in match mode */ + uint16_t nMatchValue; +} ADI_TMR_PWM_CONFIG; + +/****************************************************************************** + * PUBLIC API + * 1.) Eliminate functions that may be optimized out by the linker + * 2.) Ordered by designed function call sequence + *****************************************************************************/ + +/* Initialize timer driver */ +ADI_TMR_RESULT adi_tmr_Init (ADI_TMR_DEVICE const eDevice, ADI_CALLBACK const pfCallback, void * const pCBParam, bool bEnableInt); + +/* Configuration interface functions */ +ADI_TMR_RESULT adi_tmr_ConfigTimer (ADI_TMR_DEVICE const eDevice, ADI_TMR_CONFIG timerConfig); +ADI_TMR_RESULT adi_tmr_ConfigEvent (ADI_TMR_DEVICE const eDevice, ADI_TMR_EVENT_CONFIG eventConfig); +ADI_TMR_RESULT adi_tmr_ConfigPwm (ADI_TMR_DEVICE const eDevice, ADI_TMR_PWM_CONFIG pwmConfig ); + +/* Timer start and stop */ +ADI_TMR_RESULT adi_tmr_Enable (ADI_TMR_DEVICE const eDevice, bool bEnable); + +/* Read functions */ +ADI_TMR_RESULT adi_tmr_GetCurrentCount (ADI_TMR_DEVICE const eDevice, uint16_t *pCount); +ADI_TMR_RESULT adi_tmr_GetCaptureCount (ADI_TMR_DEVICE const eDevice, uint16_t *pCount); + +/* Reload function */ +ADI_TMR_RESULT adi_tmr_Reload (ADI_TMR_DEVICE const eDevice); + + +/*! @} */ + + +#endif /* ADI_TMR_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/uart/adi_uart.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/uart/adi_uart.h new file mode 100755 index 0000000000..abb0bf3109 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/uart/adi_uart.h @@ -0,0 +1,498 @@ +/*! ***************************************************************************** + * @file adi_uart.h + * @brief UART device driver global include file. + * @details This a global file which includes a specific file based on the processor family. + * This included file will be containing UART device driver functions. + ----------------------------------------------------------------------------- +Copyright (c) 2010-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ +#ifndef ADI_UART_H +#define ADI_UART_H + +/** @addtogroup UART_Driver UART Driver +* @{ +*/ + +/*! \cond PRIVATE */ + +/*============= I N C L U D E S =============*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*! \endcond */ + +/*! Amount of memory(bytes) required by the UART device driver for operating unidirectionally(Either RX or TX). + * This memory is completely owned by the driver until the end of the operation. + */ +#define ADI_UART_UNIDIR_MEMORY_SIZE (48u + (60u + ADI_SEM_SIZE)) + +/*! Amount of memory(bytes) required by the UART device driver for operating bidirectionally(Both RX and TX). + * This memory is completely owned by the driver until the end of the operation. + */ +#define ADI_UART_BIDIR_MEMORY_SIZE (48u + (60u + ADI_SEM_SIZE)*2u) + +/*! + * Handle for managing the UART device typedef. + */ +typedef struct _ADI_UART_DEVICE* ADI_UART_HANDLE; + +/*! + * Handle for managing the UART device typedef 'const' version. + */ +typedef const struct _ADI_UART_DEVICE* ADI_UART_CONST_HANDLE; + +/*! + ***************************************************************************** + * \enum ADI_UART_DIRECTION + * Enumeration for the UART direction. + *****************************************************************************/ +typedef enum +{ + ADI_UART_DIR_TRANSMIT, /*!< UART is only transmitting. */ + + ADI_UART_DIR_RECEIVE, /*!< UART is only receiving. */ + + ADI_UART_DIR_BIDIRECTION /*!< UART in bidirectional. */ + +} ADI_UART_DIRECTION; + + +/*! + ***************************************************************************** + * \enum ADI_UART_EVENT + * Enumeration of events notified in the application provided callback. + *****************************************************************************/ + typedef enum +{ + ADI_UART_EVENT_RX_BUFFER_PROCESSED, /*!< Rx buffer is processed. */ + + ADI_UART_EVENT_TX_BUFFER_PROCESSED, /*!< Tx buffer is processed. */ + + ADI_UART_EVENT_NO_RX_BUFFER_EVENT, /*!< No Rx buffer but data is in FIFO. */ + + ADI_UART_EVENT_AUTOBAUD_COMPLETE, /*!< Autobaud is complete. */ + + ADI_UART_EVENT_HW_ERROR_DETECTED, /*!< Hardware error detected. */ + + ADI_UART_EVENT_AUTOBAUD_ERROR_DETECTED /*!< Autobaud error detected. */ + +}ADI_UART_EVENT; + + +/*! + ***************************************************************************** + * \enum ADI_UART_RESULT + * Enumeration for result code returned from the UART device driver functions. + * The return value of all UART APIs returning #ADI_UART_RESULT + * should always be tested at the application level for success or failure. + *****************************************************************************/ + typedef enum +{ + + ADI_UART_SUCCESS, /*!< Generic success. */ + + ADI_UART_FAILED, /*!< Generic failure. */ + + ADI_UART_SEMAPHORE_FAILED, /*!< Semaphore error. */ + + ADI_UART_INVALID_HANDLE, /*!< Invalid device handle. */ + + ADI_UART_DEVICE_IN_USE, /*!< UART device in use. */ + + ADI_UART_INVALID_DEVICE_NUM, /*!< Invalid device number. */ + + ADI_UART_INVALID_POINTER, /*!< NULL data pointer is not allowed. */ + + ADI_UART_INSUFFICIENT_MEMORY, /*!< Insufficent memory. */ + + ADI_UART_INVALID_DIR, /*!< Invalid UART direction. */ + + ADI_UART_OPERATION_NOT_ALLOWED, /*!< Invalid operation. */ + + ADI_UART_INVALID_PARAMETER, /*!< Invalid parameter. */ + + ADI_UART_BUFFER_NOT_SUBMITTED, /*!< Buffer not submitted. */ + + ADI_UART_INVALID_DATA_TRANSFER_MODE, /*!< Invalid transfer mode. + Adi_uart_Read()/adi_uart_Write() is used in nonblocking mode + or adi_uart_SubmitRxBuffer()/adi_uart_SubmitTxBuffer() + is used in blocking mode. */ + + ADI_UART_HW_ERROR_DETECTED, /*!< Hardware error detected. */ + + ADI_UART_AUTOBAUD_ERROR_DETECTED, /*!< Autobaud error detected. */ + + ADI_UART_ERR_DMA_REGISTER, /*!< Error while registering the DMA callback. */ + + ADI_UART_INVALID_DATA_SIZE /*!< Invalid transfer size. Must be less than 1025 bytes */ + +} ADI_UART_RESULT; + +/*! + ***************************************************************************** + * \enum ADI_UART_HW_ERRORS + * Enumeration for UART hardware errors. If hardware error(s) occur in + * either callback or interrupt mode, they are mapped to #ADI_UART_HW_ERRORS. + * Interpretation of the break condition is application specific. + *****************************************************************************/ +typedef enum +{ + ADI_UART_NO_HW_ERROR = 0x00, /*!< No hardware error. */ + + ADI_UART_HW_ERR_FRAMING = 0x10, /*!< Rx framing error. */ + + ADI_UART_HW_ERR_PARITY = 0x20, /*!< Rx parity error. */ + + ADI_UART_HW_ERR_OVERRUN = 0x40, /*!< Receive overrun. */ + + ADI_UART_BREAK_INTERRUPT = 0x80, /*!< Break condition. */ + + ADI_UART_HW_ERR_RX_CHAN_DMA_BUS_FAULT = 0x100, /*!< Rx DMA channel bus fault detected. */ + + ADI_UART_HW_ERR_TX_CHAN_DMA_BUS_FAULT = 0x200, /*!< Tx DMA channel bus fault detected. */ + + ADI_UART_HW_ERR_RX_CHAN_DMA_INVALID_DESCR = 0x400, /*!< Rx DMA channel invalid descriptor detected. */ + + ADI_UART_HW_ERR_TX_CHAN_DMA_INVALID_DESCR = 0x800, /*!< Tx DMA channel invalid descriptor detected. */ + + ADI_UART_HW_ERR_RX_CHAN_DMA_UNKNOWN_ERROR = 0x1000, /*!< Rx DMA channel unknown error detected. */ + + ADI_UART_HW_ERR_TX_CHAN_DMA_UNKNOWN_ERROR = 0x2000, /*!< Tx DMA channel unknown error detected. */ + +}ADI_UART_HW_ERRORS; + +/*! + ***************************************************************************** + * \enum ADI_UART_AUTOBAUD_ERRORS + * Enumeration for UART autobaud errors. If autobaud related error(s) occur + * they are mapped to #ADI_UART_AUTOBAUD_ERRORS. + *****************************************************************************/ +typedef enum +{ + ADI_UART_AUTOBAUD_NO_ERROR = 0x000, /*!< No autobaud error. */ + + ADI_UART_AUTOBAUD_TIMEOUT_NO_START_EDGE = 0x100, /*!< Timeout due to no valid start edge found during autobaud. */ + + ADI_UART_AUTOBAUD_TIMEOUT_LONGBREAK = 0x200, /*!< Timeout due to break condition detected during autobaud. */ + + ADI_UART_AUTOBAUD_TIMEOUT_NO_END_EDGE = 0x400 /*!< Timeout due to no valid end edge found during autobaud. */ + +}ADI_UART_AUTOBAUD_ERRORS; + +/*! + ***************************************************************************** + * \enum ADI_UART_TRIG_LEVEL + * Enumeration for the FIFO trigger level. + *****************************************************************************/ +typedef enum +{ + + ADI_UART_RX_FIFO_TRIG_LEVEL_1BYTE = 0 << BITP_UART_FCR_RFTRIG, /*!< 1-byte to trigger RX interrupt. */ + + ADI_UART_RX_FIFO_TRIG_LEVEL_4BYTE = 1 << BITP_UART_FCR_RFTRIG, /*!< 4-byte to trigger RX interrupt. */ + + ADI_UART_RX_FIFO_TRIG_LEVEL_8BYTE = 2 << BITP_UART_FCR_RFTRIG, /*!< 8-byte to trigger RX interrupt. */ + + ADI_UART_RX_FIFO_TRIG_LEVEL_14BYTE = 3 << BITP_UART_FCR_RFTRIG /*!< 14-byte to trigger RX interrupt. */ + +}ADI_UART_TRIG_LEVEL; + +/*! + ***************************************************************************** + * \enum ADI_UART_WORDLEN + * Enumeration for data width. + *****************************************************************************/ +typedef enum +{ + ADI_UART_WORDLEN_5BITS, /*!< 5 bits wide. */ + + ADI_UART_WORDLEN_6BITS, /*!< 6 bits wide. */ + + ADI_UART_WORDLEN_7BITS, /*!< 7 bits wide. */ + + ADI_UART_WORDLEN_8BITS /*!< 8 bits wide. */ + +} ADI_UART_WORDLEN; + +/*! + ***************************************************************************** + * \enum ADI_UART_PARITY + * Enumeration for parity check. + *****************************************************************************/ +typedef enum +{ + ADI_UART_NO_PARITY = 0x0, /*!< No parity. */ + + ADI_UART_ODD_PARITY = 0x8, /*!< Odd parity. */ + + ADI_UART_EVEN_PARITY = 0x18, /*!< Even Parity. */ + + ADI_UART_ODD_PARITY_STICKY = 0x28, /*!< Sticky odd parity. */ + + ADI_UART_EVEN_PARITY_STICKY = 0x38 /*!< Sticky even parity. */ + +} ADI_UART_PARITY; + +/*! + ***************************************************************************** + * \enum ADI_UART_STOPBITS + * Enumeration for the number of stop bits. + *****************************************************************************/ +typedef enum +{ + + ADI_UART_ONE_STOPBIT = 0x00, /*! One stop bit regardless of the word length */ + + ADI_UART_ONE_AND_HALF_TWO_STOPBITS = 0x04 /*! Number of stop bits based on word length. 1.5 stop bits + for word length of 5 bits and 2 for rest( 6,7,8 bit word length) */ + +} ADI_UART_STOPBITS; + +/*! + ***************************************************************************** + * \enum ADI_UART_TRANSFER_MODE + * Enumeration for data transfer mode. + *****************************************************************************/ +typedef enum +{ + + ADI_UART_DATA_TRANSFER_MODE_NONE, /*! Mode of data transfer is not selected. */ + + ADI_UART_DATA_TRANSFER_MODE_BLOCKING, /*! Blocking mode. Only calls to adi_uart_Read or adi_uart_write + are allowed for sending or receiving data. */ + + ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING /*! Non-Blocking mode. Only calls to adi_uart_SubmitRxBuffer or + adi_uart_SubmitTxBuffer are allowed for sending or receiving data. */ + +} ADI_UART_TRANSFER_MODE; + + +/****************************************************************************** + * UART Device external API function prototypes + *****************************************************************************/ + +/* + * Device initialization and uninitialization interfaces. +*/ +ADI_UART_RESULT adi_uart_Open( + uint32_t const nDeviceNum, + ADI_UART_DIRECTION const eDirection, + void *pMemory, + uint32_t const nMemSize, + ADI_UART_HANDLE *const phDevice +); + +ADI_UART_RESULT adi_uart_Close( + ADI_UART_HANDLE const hDevice +); + + +/****************************************************************************** + * Eliminatable functions that may be optimized out by the linker + *****************************************************************************/ + +/* + * Non-blocking mode functions. +*/ + +ADI_UART_RESULT adi_uart_SubmitTxBuffer( + ADI_UART_HANDLE const hDevice, + void *const pBuffer, + uint32_t const nBufSize, + bool const bDMA +); + +ADI_UART_RESULT adi_uart_SubmitRxBuffer( + ADI_UART_HANDLE const hDevice, + void *const pBuffer, + uint32_t const nBufSize, + bool const bDMA +); + +ADI_UART_RESULT adi_uart_GetTxBuffer( + ADI_UART_HANDLE const hDevice, + void **const ppBuffer, + uint32_t *pHwError +); + +ADI_UART_RESULT adi_uart_GetRxBuffer( + ADI_UART_HANDLE const hDevice, + void **const ppBuffer, + uint32_t *pHwError +); +ADI_UART_RESULT adi_uart_IsTxBufferAvailable( + ADI_UART_HANDLE const hDevice, + bool *const pbAvailable +); + +ADI_UART_RESULT adi_uart_IsRxBufferAvailable( + ADI_UART_HANDLE const hDevice, + bool *const pbAvailable +); + +/* + * Blocking mode functions. +*/ + +ADI_UART_RESULT adi_uart_Write( + ADI_UART_HANDLE const hDevice, + void *const pBuffer, + uint32_t const nBufSize, + bool const bDMA, + uint32_t *pHwError +); + +ADI_UART_RESULT adi_uart_Read( + ADI_UART_HANDLE const hDevice, + void *const pBuffer, + uint32_t const nBufSize, + bool const bDMA, + uint32_t *pHwError +); + + +/* + * Configuration interface functions. +*/ + +ADI_UART_RESULT adi_uart_EnableLoopBack( + ADI_UART_HANDLE const hDevice, + bool const bEnable +); + +ADI_UART_RESULT adi_uart_EnableAutobaud( + ADI_UART_HANDLE const hDevice, + bool const bEnable, + bool const bAutobaudCallbackMode +); + +ADI_UART_RESULT adi_uart_SetRxFifoTriggerLevel( + ADI_UART_CONST_HANDLE const hDevice, + ADI_UART_TRIG_LEVEL const eTriglevel +); + +ADI_UART_RESULT adi_uart_EnableFifo( + ADI_UART_HANDLE const hDevice, + bool const bEnable +); + +ADI_UART_RESULT adi_uart_GetBaudRate( + ADI_UART_HANDLE const hDevice, + uint32_t *pnBaudRate, + uint32_t *pAutobaudError +); + +ADI_UART_RESULT adi_uart_ForceTxBreak( + ADI_UART_HANDLE const hDevice, + bool const bEnable +); + +ADI_UART_RESULT adi_uart_SetConfiguration( + ADI_UART_HANDLE const hDevice, + ADI_UART_PARITY const eParity, + ADI_UART_STOPBITS const eStopBits, + ADI_UART_WORDLEN const eWordLength +); + +ADI_UART_RESULT adi_uart_ConfigBaudRate( + ADI_UART_HANDLE const hDevice, + uint16_t const nDivC, + uint8_t const nDivM, + uint16_t const nDivN, + uint8_t const nOSR +); + +/* + * Channel data control functions. +*/ + +ADI_UART_RESULT adi_uart_FlushTxFifo( + ADI_UART_CONST_HANDLE const hDevice +); + +ADI_UART_RESULT adi_uart_FlushRxFifo( + ADI_UART_CONST_HANDLE const hDevice +); + +ADI_UART_RESULT adi_uart_FlushRxChannel( + ADI_UART_CONST_HANDLE const hDevice +); + + +ADI_UART_RESULT adi_uart_FlushTxChannel( + ADI_UART_CONST_HANDLE const hDevice +); + +ADI_UART_RESULT adi_uart_IsTxComplete( + ADI_UART_HANDLE const hDevice, + bool *const pbComplete +); + +/* + * Callback functions. +*/ + +ADI_UART_RESULT adi_uart_RegisterCallback( + ADI_UART_HANDLE const hDevice, + const ADI_CALLBACK pfCallback, + void *const pCBParam +); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/*@}*/ + +#endif /* ADI_UART_H */ + + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/wdt/adi_wdt.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/wdt/adi_wdt.h new file mode 100755 index 0000000000..834afee018 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/wdt/adi_wdt.h @@ -0,0 +1,77 @@ +/*! ***************************************************************************** + * @file adi_wdt.h + * @brief WDT device driver public header + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_WDT_H +#define ADI_WDT_H + +#include + +/** @addtogroup WDT_Driver WDT Driver + * @{ + */ + +/*! \enum ADI_WDT_RESULT Watchdog Device Error Codes. */ +typedef enum +{ + /*! Generic success. */ + ADI_WDT_SUCCESS, + /*! Timer is locked. */ + ADI_WDT_FAILURE_LOCKED +} ADI_WDT_RESULT; + + +/****************************************************************************** + * PUBLIC API + * 1.) Eliminatable functions that may be optimized out by the linker + * 2.) Ordered by designed function call sequence + *****************************************************************************/ + +ADI_WDT_RESULT adi_wdt_Enable (bool const bEnable, ADI_CALLBACK const pfCallback); +void adi_wdt_Kick (void); +void adi_wdt_GetCount(uint16_t * const pCurCount); + + +/*! @} */ + +#endif /* ADI_WDT_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/xint/adi_xint.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/xint/adi_xint.h new file mode 100755 index 0000000000..ba76911f64 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/drivers/xint/adi_xint.h @@ -0,0 +1,120 @@ +/* + ***************************************************************************** + @file: adi_xint.h + @brief: External interrupt driver definitions and API + ----------------------------------------------------------------------------- + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ +#ifndef ADI_XINT_H +#define ADI_XINT_H + +/*! \addtogroup XINT_Driver External Interrupt Driver + * @{ + */ + +#ifdef __ICCARM__ +#pragma diag_default=Pm008 +#endif /* __ICCARM__ */ + +#include +#include + +#if !defined(__ADUCM4x50__) +#error "Unknown processor family" +#endif + +/* C++ linkage */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/*! Amount of memory(in bytes) required by the External Interrupt device driver for its operation. + * This memory is completely owned by the driver till the end of the operation. + */ +#define ADI_XINT_MEMORY_SIZE (48u) + +/*! External Interrupt Driver API function return codes */ +typedef enum +{ + ADI_XINT_SUCCESS = 0, /*!< API successfully returned. */ + ADI_XINT_FAILURE, /*!< The API call failed. */ + ADI_XINT_ALREADY_INITIALIZED, /*!< External interrupt driver has already been initialized. */ + ADI_XINT_NOT_INITIALIZED, /*!< External interrupt driver has not yet been initialized. */ + ADI_XINT_NULL_PARAMETER, /*!< The given pointer is pointing to NULL. */ + ADI_XINT_INVALID_MEMORY_SIZE, /*!< The given memory is not sufficient to operate the driver. */ + ADI_XINT_INVALID_INTERRUPT /*!< Invalid interrupt number. */ +} ADI_XINT_RESULT; + + +/*! External interrupt trigger condition enumerations */ +typedef enum { + ADI_XINT_IRQ_RISING_EDGE = 0x0, /*!< Trigger an interrupt when a rising edge is detected. */ + ADI_XINT_IRQ_FALLING_EDGE = 0x1, /*!< Trigger an interrupt when on a falling edge is detected. */ + ADI_XINT_IRQ_EITHER_EDGE = 0x2, /*!< Trigger an interrupt on either falling or rising edge is detected. */ + ADI_XINT_IRQ_HIGH_LEVEL = 0x3, /*!< Trigger an interrupt on a logic level high is detected. */ + ADI_XINT_IRQ_LOW_LEVEL = 0x4 /*!< Trigger an interrupt on a logic level low is detected. */ +} ADI_XINT_IRQ_MODE; + +/*! External interrupts. */ +typedef enum { + ADI_XINT_EVENT_INT0 = 0x0, /*!< Event for external interrupt-0 */ + ADI_XINT_EVENT_INT1 = 0x1, /*!< Event for external interrupt-1 */ + ADI_XINT_EVENT_INT2 = 0x2, /*!< Event for external interrupt-2 */ + ADI_XINT_EVENT_INT3 = 0x3, /*!< Event for external interrupt-3 */ + ADI_XINT_EVENT_RESERVED = 0x4, /*!< Event is reserved. */ + ADI_XINT_EVENT_UART_RX = 0x5, /*!< Event for UART Rx activity */ + ADI_XINT_EVENT_MAX = 0x6 /*!< Number of external interrupt events */ +} ADI_XINT_EVENT; + + +/* External Interrupt API functions */ +ADI_XINT_RESULT adi_xint_Init (void* const pMemory, uint32_t const MemorySize); +ADI_XINT_RESULT adi_xint_UnInit (void); +ADI_XINT_RESULT adi_xint_EnableIRQ (const ADI_XINT_EVENT eEvent, const ADI_XINT_IRQ_MODE eMode); +ADI_XINT_RESULT adi_xint_DisableIRQ (const ADI_XINT_EVENT eEvent); +ADI_XINT_RESULT adi_xint_RegisterCallback (const ADI_XINT_EVENT eEvent, ADI_CALLBACK const pfCallback, void *const pCBParam ); + +#ifdef __cplusplus +} +#endif + +/**@}*/ + +#endif /* ADI_XINT_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/flash/adi_flash.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/flash/adi_flash.c new file mode 100755 index 0000000000..66bc3cf1f6 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/flash/adi_flash.c @@ -0,0 +1,1812 @@ +/*! + ***************************************************************************** + @file: adi_flash.c + @brief: Flash Device Driver Implementation + @date: $Date: 2016-06-30 08:06:37 -0400 (Thu, 30 Jun 2016) $ + ----------------------------------------------------------------------------- +Copyright (c) 2012-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +/** @addtogroup Flash_Driver Flash Driver + * @{ + * + * @brief Flash (FEE) Driver + * + * @details + * + * The flash controller provides access to the embedded flash memory. The embedded + * flash has a 72-bit wide data bus providing for two 32-bit words of data and + * one corresponding 8-bit ECC byte per access. + * + * Flash Driver Hardware Errors + * + * Many of the Flash Controller APIs can result in hardware errors. Each such API has a + * a hardware error parameter (pHwErrors), which is a pointer to an application-defined + * variable into which the failing API will store the failing hardware error status.\n + * + * APIs failing with hardware errors are flagged with the #ADI_FEE_ERR_HW_ERROR_DETECTED + * return code.\n + * + * Hardware error details may be decoded according to the flash controller status register + * ("STAT") bit-map, documented in the Hardware Reference Manual (HRM). Flash hardware + * errors are separate and distinct from DMA errors, which have separate and distinct + * return codes (#ADI_FEE_ERR_DMA_BUS_FAULT, #ADI_FEE_ERR_DMA_INVALID_DESCR, and + * #ADI_FEE_ERR_DMA_UNKNOWN_ERROR). + * + * Flash Driver Static Configuration + * + * A number of flash driver APIs manage configurations that very likely do not require + * dynamic (run-time) management. Such cases are documented with the respective APIs. + * In all such cases, the user is encouraged to consider using the static configuration + * equivalents (provided in the adi_flash_config.h file) in lieu of the dynamic APIs. + * In so doing, linker elimination may reduce the resulting code image footprint + * (provided the API is not called). + * + * @note - The application must include drivers/flash/adi_flash.h to use this driver. + * @note - This driver also requires the DMA driver. The application must include + * the DMA driver sources to avoid link errors. + */ + +/*======== I N C L U D E ========*/ + + /*! \cond PRIVATE */ +#include +#include +#include /* for "memset" */ +/*! \endcond */ + +#include + +/*============= M I S R A =============*/ + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm123 (rule 8.5): there shall be no definition of objects or functions in a header file +* This isn't a header as such. +* +* Pm073 (rule 14.7): a function should have a single point of exit +* Pm143 (rule 14.7): a function should have a single point of exit at the end of the function +* Multiple returns are used for error handling. +* +* Pm050 (rule 14.2): a null statement shall only occur on a line by itself +* Needed for null expansion of ADI_INSTALL_HANDLER and others. +* +* Pm088 (rule 17.4): pointer arithmetic should not be used. +* Relying on pointer arithmetic for buffer handling. +* +* Pm140 (rule 11.3): a cast should not be performed between a pointer type and an integral type +* Required for MMR accesses, determining pointer alignment, and a callback argument. +* +* Pm026 (rule 12.4): the right hand operand of an && or || operator shall not contain side effects +* Side effects being mis-reported due to added volatile storage class. +*/ +#pragma diag_suppress=Pm123,Pm073,Pm143,Pm050,Pm088,Pm140,Pm026 +#endif /* __ICCARM__ */ + +/* pull in internal data structures */ +#include "adi_flash_data.c" + +/*======== D E F I N E S ========*/ + +/*! \cond PRIVATE */ + +#ifdef ADI_DEBUG +#define ASSERT(X) assert(X) +#else +#define ASSERT(X) +#endif + +/* internal utility macros */ +#define CLR_BITS(REG, BITS) ((REG) &= ~(BITS)) +#define SET_BITS(REG, BITS) ((REG) |= (BITS)) + +#ifdef ADI_DEBUG +/* Validate Device Handle */ +static bool IsDeviceHandle (ADI_FEE_HANDLE const hDevice); +static bool IsDeviceHandle (ADI_FEE_HANDLE const hDevice) +{ + if ( (fee_device_info[0].hDevice == (hDevice)) && ((hDevice)->pDevInfo->hDevice != NULL) ) { + return true; + } else { + return false; + } +} +#endif + +/* Wait for specified flash status to be clear */ +static void BusyWait (ADI_FEE_HANDLE const hDevice, uint32_t const status); +static void BusyWait (ADI_FEE_HANDLE const hDevice, uint32_t const status) +{ + while ((hDevice->pDev->STAT & status) != 0u) {} +} + +/* Internal DMA Callback for receiving DMA faults from common DMA error handler */ +static void dmaCallback(void *pCBParam, uint32_t Event, void *pArg); +static void dmaCallback(void *pCBParam, uint32_t Event, void *pArg) { + + /* recover the device handle */ + ADI_FEE_HANDLE hDevice = (ADI_FEE_HANDLE)pCBParam; + + /* save the DMA error */ + switch (Event) { + case ADI_DMA_EVENT_ERR_BUS: + hDevice->dmaError = ADI_FEE_ERR_DMA_BUS_FAULT; + break; + case ADI_DMA_EVENT_ERR_INVALID_DESCRIPTOR: + hDevice->dmaError = ADI_FEE_ERR_DMA_INVALID_DESCR; + break; + default: + hDevice->dmaError = ADI_FEE_ERR_DMA_UNKNOWN_ERROR; + break; + } + + /* transfer is toast... post and callback any waiters */ + + SEM_POST(hDevice); + + if (0u != hDevice->pfCallback) { + hDevice->pfCallback (hDevice->pCBParam, (uint32_t)hDevice->dmaError, (void*)NULL); + } +} + +/*! \endcond */ + + +/*======== C O D E ========*/ +/* + * API Implementation + */ + + +/** + * @brief Open the flash controller. + * + * @param [in] nDeviceNum The zero-based device instance number of flash controller to be opened. + * @param [in] pMemory Application supplied memory space for use by the driver. + * @param [in] nMemorySize Size of the application supplied memory (in bytes). + * @param [in,out] phDevice The caller's device handle pointer for storing the initialized + * device instance data pointer. + * + * @return Status + * - #ADI_FEE_SUCCESS The device is opened successfully. + * - #ADI_FEE_ERR_BAD_DEVICE_NUM [D] The device number passed is invalid. + * - #ADI_FEE_ERR_INVALID_PARAM [D] Some pointer(s) passed to the function is NULL. + * - #ADI_FEE_ERR_ALREADY_INITIALIZED [D] The device is already initialized and hence cannot be opened. + * - #ADI_FEE_ERR_INSUFFICIENT_MEM [D] The memory passed to the driver is insufficient. + * - #ADI_FEE_ERR_DMA_REGISTER The required DMA common error handler registration failed. + * - #ADI_FEE_ERR_SEMAPHORE_FAILED The semaphore create operation failed. + * + * Initialize an instance of the flash device driver using default user configuration settings + * (from adi_flash_config.h) and allocate the device for use. + * + * No other flash APIs may be called until the device open function is called. The returned + * device handle is required to be passed to all subsequent flash API calls to identify the + * physical device instance in use. The user device handle (pointed to by phDevice) is set + * to NULL on failure. + * + * @note Currently, only a singular flash physical device instance (device ID "0") exists. + * + * @sa adi_fee_Close(). + */ +ADI_FEE_RESULT adi_fee_Open (uint32_t const nDeviceNum, void* const pMemory, uint32_t const nMemorySize, ADI_FEE_HANDLE* const phDevice) +{ + ADI_FEE_HANDLE hDevice = NULL; /* initially */ + +#ifdef ADI_DEBUG + if (nDeviceNum >= ADI_FEE_NUM_INSTANCES) { + return ADI_FEE_ERR_BAD_DEVICE_NUM; + } + + /* verify device is not already open */ + if (fee_device_info[nDeviceNum].hDevice != NULL) { + return ADI_FEE_ERR_ALREADY_INITIALIZED; + } + + if ((pMemory == NULL) || (phDevice == NULL)) { + return ADI_FEE_ERR_INVALID_PARAM; + } + + if (nMemorySize < ADI_FEE_MEMORY_SIZE) { + return ADI_FEE_ERR_INSUFFICIENT_MEM; + } + + assert (ADI_FEE_MEMORY_SIZE == sizeof(ADI_FEE_DEV_DATA_TYPE)); +#endif + + /* store a bad handle in case of failure */ + *phDevice = NULL; + + /* Link user memory (handle) into ADI_FEE_DEVICE_INFO data structure. + * + * ADI_FEE_DEVICE_INFO <==> ADI_FEE_HANDLE + */ + fee_device_info[nDeviceNum].hDevice = (ADI_FEE_DEV_DATA_TYPE *)pMemory; + + /* Clear the ADI_FEE_HANDLE memory. This also sets all bool + * structure members to false so we do not need to waste cycles + * setting these explicitly (e.g. hDevice->bUseDma = false) + */ + memset(pMemory, 0, nMemorySize); + + /* initialize local device handle and link up device info for this device instance */ + hDevice = (ADI_FEE_HANDLE)pMemory; + hDevice->pDevInfo = &fee_device_info[nDeviceNum]; + + /* Although the ADI_FEE_DEVICE_INFO struct has the physical device pointer + * for this instance, copying it to the ADI_FEE_HANDLE struct (in user memory) + * will minimize the runtime footprint and cycle count when accessing the FEE + * registers. + */ + hDevice->pDev = fee_device_info[nDeviceNum].pDev; + + /* store a pointer to user's static configuration settings for this device instance */ + hDevice->pDevInfo->pConfig = (ADI_FEE_CONFIG*)&gConfigInfo[nDeviceNum]; + + /* create the semaphore */ + SEM_CREATE(hDevice, "fee_sem", ADI_FEE_ERR_SEMAPHORE_FAILED); + + /* grant keyed access */ + hDevice->pDev->KEY = ENUM_FLCC_KEY_USERKEY; + + /* apply the static initializers */ + hDevice->pDev->IEN = hDevice->pDevInfo->pConfig->eccIrqEnables; + hDevice->pDev->TIME_PARAM0 = hDevice->pDevInfo->pConfig->param0; + hDevice->pDev->TIME_PARAM1 = hDevice->pDevInfo->pConfig->param1; + hDevice->pDev->ABORT_EN_LO = hDevice->pDevInfo->pConfig->abortEnableLo; + hDevice->pDev->ABORT_EN_HI = hDevice->pDevInfo->pConfig->abortEnableHi; + hDevice->pDev->ECC_CFG = hDevice->pDevInfo->pConfig->eccConfig; + + /* clear auto-increment and dma enable bits */ + CLR_BITS (hDevice->pDev->UCFG, (BITM_FLCC_UCFG_AUTOINCEN | BITM_FLCC_UCFG_KHDMAEN)); + + /* close keyed access */ + hDevice->pDev->KEY = 0u; + + /* store device handle into user handle */ + *phDevice = (ADI_FEE_HANDLE)hDevice; + + /* initialize DMA service */ + adi_dma_Init(); + + if (ADI_DMA_SUCCESS != adi_dma_RegisterCallback(hDevice->pDevInfo->dmaChanNum, dmaCallback, (void*)hDevice)) { + /* uninitialize flash driver and fail */ + adi_fee_Close(hDevice); + return ADI_FEE_ERR_DMA_REGISTER; + } + + /* NVIC enables */ + NVIC_EnableIRQ(hDevice->pDevInfo->pioIrqNum); + NVIC_EnableIRQ(hDevice->pDevInfo->dmaIrqNum); + + /* return success */ + return ADI_FEE_SUCCESS; +} + + +/** + * @brief Close the flash controller. + * + * @param [in] hDevice The handle to the flash controller device + * + * @return Status + * - #ADI_FEE_SUCCESS The device is closed successfully. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_SEMAPHORE_FAILED The semaphore delete operation failed. + * + * Uninitialize and release an allocated flash device, and memory associated with it + * for other use. + * + * @note The user memory is released from use by the flash driver, but is not freed. + * + * @sa adi_fee_Open(). + */ +ADI_FEE_RESULT adi_fee_Close (ADI_FEE_HANDLE const hDevice) +{ + uint32_t dev; + +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } +#endif + + /* Destroy the semaphore */ + SEM_DELETE(hDevice, ADI_FEE_ERR_SEMAPHORE_FAILED); + + /* Remove the device handle from the list of possible device instances */ + for (dev = 0u; dev < ADI_FEE_NUM_INSTANCES; dev++) + { + if (fee_device_info[dev].hDevice == hDevice) + { + fee_device_info[dev].hDevice = NULL; + break; + } + } + + /* NVIC disables */ + NVIC_DisableIRQ(hDevice->pDevInfo->pioIrqNum); + NVIC_DisableIRQ(hDevice->pDevInfo->dmaIrqNum); + + return ADI_FEE_SUCCESS; +} + + +/** + * @brief Register an application-defined callback function. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in] pfCallback A pointer to an application-supplied calllback function + * which is called to notify the application of device-related + * events. A value of NULL disables driver callbacks. + * @param [in] pCBParam An application-supplied callback parameter which will be passed + * back to the callback function. + * + * @return Status + * - #ADI_FEE_SUCCESS The callback is registered successfully. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_TRANSFER_IN_PROGRESS [D] A flash write operation is in progress and + * the callback registration is ignored. + * + * Links the user-provided callback function into the #adi_fee_SubmitBuffer() API such that + * rather than polling for buffer completion (with #adi_fee_IsBufferAvailable()) and eventually + * reacquiring the buffer (with #adi_fee_GetBuffer()), the user can simply register a callback + * function that will be called upon buffer completion with no further action needed.\n + * + * Error conditions are also passed to the callback, including DMA errors if DMA is active. Make sure + * to always check the event value passed to the callback, just as the various API return codes should + * always be checked.\n + * + * However, callbacks are always made in context of an interrupt, so applications are strongly encouraged + * to exit the callback as quickly as possible so normal interrupt processing is disrupted as little as + * possible. This is also an argument for not using callbacks at at all. + * + * @note When using callbacks to reacquire buffers, DO NOT use the #adi_fee_GetBuffer() API. The two + * methods are mutually exclusive. + * + * @sa adi_fee_SubmitBuffer(). + * @sa adi_fee_IsBufferAvailable(). + * @sa adi_fee_GetBuffer(). + */ +ADI_FEE_RESULT adi_fee_RegisterCallback (ADI_FEE_HANDLE const hDevice, ADI_CALLBACK const pfCallback, void* const pCBParam) +{ +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + /* reject while a transfer is in progress */ + if (true == hDevice->bTransferInProgress) { + return ADI_FEE_ERR_TRANSFER_IN_PROGRESS; + } +#endif + + /* Set the callback function and param in the device */ + hDevice->pfCallback = pfCallback; + hDevice->pCBParam = pCBParam; + + return ADI_FEE_SUCCESS; +} + + +/** + * @brief Erase the given range of (2kB) page(s) within the flash user space memory. This is a blocking call. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in] nPageNumStart Start page number. + * @param [in] nPageNumEnd End page number. + * @param [in,out] pHwErrors Pointer to user location into which any flash hardware errors are reported. + * + * @return Status + * - #ADI_FEE_SUCCESS The page(s) is(are) cleared successfully. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_INVALID_PARAM [D] The page(s) number(s) is(are) incorrect. + * - #ADI_FEE_ERR_TRANSFER_IN_PROGRESS [D] Another transfer is in progress. + * - #ADI_FEE_ERR_HW_ERROR_DETECTED An internal flash controller hardware error was detected. + * - #ADI_FEE_ERR_SEMAPHORE_FAILED The semaphore pend operation failed. + * + * Erases entire page(s). Callers are expected to save/restore any partial page data prior + * to erasure, as needed. Translate literal flash addresses into flash start and end page + * numbers with #adi_fee_GetPageNumber(). + * + * @note Flash hardware errors are flagged with the #ADI_FEE_ERR_HW_ERROR_DETECTED return code. + * Flash hardware error details are written to the location pointed to by the pHwErrors parameter. + * Hardware error details may be decoded according to the flash controller status register ("STAT") + * bit-map, documented in the Hardware Reference Manual (HRM). + * + * @sa adi_fee_GetPageNumber(). + * @sa adi_fee_MassErase(). + */ +ADI_FEE_RESULT adi_fee_PageErase (ADI_FEE_HANDLE const hDevice, uint32_t const nPageNumStart, uint32_t const nPageNumEnd, uint32_t* const pHwErrors) + +{ + ADI_FEE_RESULT result = ADI_FEE_SUCCESS; + + uint32_t page; + +#ifdef ADI_DEBUG + + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + /* reject while a transfer is in progress */ + if (true == hDevice->bTransferInProgress) { + return ADI_FEE_ERR_TRANSFER_IN_PROGRESS; + } + + uint32_t nRelAddrStart = (nPageNumStart << FEE_PAGE_SHIFT); + uint32_t nRelAddrStop = (nPageNumEnd << FEE_PAGE_SHIFT); + + if ( (nPageNumStart > nPageNumEnd) + || (nRelAddrStart >= FEE_FLASH_SIZE) + || (nRelAddrStop >= FEE_FLASH_SIZE)) + { + return ADI_FEE_ERR_INVALID_PARAM; + } +#endif /* defined (ADI_DEBUG) */ + + for (page = nPageNumStart; page <= nPageNumEnd; page++) + { + /* Wait until not busy */ + BusyWait(hDevice, (BITM_FLCC_STAT_CMDBUSY | BITM_FLCC_STAT_WRCLOSE)); + + /* Set the page address */ + hDevice->pDev->PAGE_ADDR0 = (page << FEE_PAGE_SHIFT); + + /* Issue a page erase command */ + result = SendCommand (hDevice, ENUM_FLCC_CMD_ERASEPAGE); + + /* block on command */ + SEM_PEND(hDevice, ADI_FEE_ERR_SEMAPHORE_FAILED); + + if (result != ADI_FEE_SUCCESS) { + break; + } + } + + /* copy out any hardware errors... */ + *pHwErrors = hDevice->feeError; + if (0u != hDevice->feeError) { + /* return the HW error return code */ + return ADI_FEE_ERR_HW_ERROR_DETECTED; + } + + return result; +} + + +/** + * @brief Erase the entire flash user space memory. This is a blocking call. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in,out] pHwErrors Pointer to user location into which any flash hardware errors are reported. + * + * @return Status + * - #ADI_FEE_SUCCESS The flash is cleared successfully. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_TRANSFER_IN_PROGRESS [D] Another transfer is in progress. + * - #ADI_FEE_ERR_HW_ERROR_DETECTED An internal flash controller hardware error was detected. + * - #ADI_FEE_ERR_SEMAPHORE_FAILED The semaphore pend operation failed. + * + * @note Do not call mass erase on or from code that is running from flash. Doing so will leave + * an indeterminate machine state. + * + * @note Flash hardware errors are flagged with the #ADI_FEE_ERR_HW_ERROR_DETECTED return code. + * Flash hardware error details are written to the location pointed to by the pHwErrors parameter. + * Hardware error details may be decoded according to the flash controller status register ("STAT") + * bit-map, documented in the Hardware Reference Manual (HRM). + * + * @sa adi_fee_PageErase(). + */ +ADI_FEE_RESULT adi_fee_MassErase (ADI_FEE_HANDLE const hDevice, uint32_t* const pHwErrors) +{ + ADI_FEE_RESULT result = ADI_FEE_SUCCESS; + +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + /* reject while a transfer is in progress */ + if (true == hDevice->bTransferInProgress) { + return ADI_FEE_ERR_TRANSFER_IN_PROGRESS; + } +#endif + + /* Call the mass erase command */ + result = SendCommand (hDevice, ENUM_FLCC_CMD_MASSERASE); + + /* block on command */ + SEM_PEND(hDevice, ADI_FEE_ERR_SEMAPHORE_FAILED); + + /* copy out any hardware errors... */ + *pHwErrors = hDevice->feeError; + if (0u != hDevice->feeError) { + /* return the HW error return code */ + return ADI_FEE_ERR_HW_ERROR_DETECTED; + } + + return result; +} + + +/** + * @brief Perform a blocking flash data write operation. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in] pTransaction Pointer to a user-defined control block describing the data to be transferred, containing: + * - pWriteAddr; Pointer to a 64-bit-aligned destination address in flash. + * - pWriteData; Pointer to a 32-bit-aligned source data buffer in user memory. + * - nSize; Number of bytes to write (must be an integral multiple of 8). + * - bUseDma; Flag controlling use of DMA to perform the write. + * @param [in,out] pHwErrors Pointer to user location into which any flash hardware errors are reported. + * + * @return Status + * - #ADI_FEE_SUCCESS The buffer is successfully written to the flash. + * - #ADI_FEE_ERR_ALIGNMENT [D] The flash write source data pointer is misaligned. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_INVALID_PARAM [D] Buffer size is not a multiple of 8-bytes (or too large for DMA). + * - #ADI_FEE_ERR_TRANSFER_IN_PROGRESS [D] Another transfer is already in progress. + * - #ADI_FEE_ERR_BUFFER_ERR Error occurred in processing the buffer. + * - #ADI_FEE_ERR_DEVICE_BUSY The flash controller is busy. + * - #ADI_FEE_ERR_DMA_BUS_FAULT A runtime DMA bus fault was detected. + * - #ADI_FEE_ERR_DMA_INVALID_DESCR A runtime DMA invalid descriptor was detected. + * - #ADI_FEE_ERR_DMA_UNKNOWN_ERROR An unknown runtime DMA error was detected. + * - #ADI_FEE_ERR_HW_ERROR_DETECTED An internal flash controller hardware error was detected. + * - #ADI_FEE_ERR_NO_DATA_TO_TRANSFER Transfer ran out of write data unexpectedly. + * - #ADI_FEE_ERR_SEMAPHORE_FAILED The semaphore pend operation failed. + * + * Perform a blocking flash data write operation. This API does not return until the write operation is completed. + * + * @note Flash hardware errors are flagged with the #ADI_FEE_ERR_HW_ERROR_DETECTED return code. + * Flash hardware error details are written to the location pointed to by the pHwErrors parameter. + * Hardware error details may be decoded according to the flash controller status register ("STAT") + * bit-map, documented in the Hardware Reference Manual (HRM). Flash hardware errors are separate + * and distinct from DMA errors, which have separate and distinct return codes, as described above. + */ +ADI_FEE_RESULT adi_fee_Write (ADI_FEE_HANDLE const hDevice, ADI_FEE_TRANSACTION* const pTransaction, uint32_t* const pHwErrors) +{ + ADI_FEE_RESULT result = ADI_FEE_SUCCESS; + +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + /* reject while a transfer is in progress */ + if (true == hDevice->bTransferInProgress) { + return ADI_FEE_ERR_TRANSFER_IN_PROGRESS; + } + + /* check address is 64-bit aligned and data pointer is 32-bit aligned */ + if ( (((uint32_t)pTransaction->pWriteAddr & 0x7u) != 0u) || ((((uint32_t)pTransaction->pWriteData) & 0x3u) != 0u) ) + { + return ADI_FEE_ERR_ALIGNMENT; + } + + /* make sure size is a multiple of 8 */ + if ((pTransaction->nSize & 0x7u) != 0u) { + return ADI_FEE_ERR_INVALID_PARAM; + } + + if (true == pTransaction->bUseDma) { + /* check for max DMA units (32-bit chunks, i.e., 4 bytes at a whack) */ + if (DMA_TRANSFER_LIMIT < (pTransaction->nSize / sizeof(uint32_t))) { + return ADI_FEE_ERR_INVALID_PARAM; + } + } +#endif + + /* reset submit/get safeguard flag */ + hDevice->bSubmitCalled = false; + + /* Fill in the transfer params */ + hDevice->pNextWriteAddress = pTransaction->pWriteAddr; + hDevice->pNextReadAddress = pTransaction->pWriteData; + hDevice->nRemainingBytes = pTransaction->nSize; + hDevice->bUseDma = pTransaction->bUseDma; + + /* Initiate a transfer */ + result = InitiateTransfer (hDevice); + + /* Wait for the completed transfer */ + SEM_PEND(hDevice, ADI_FEE_ERR_SEMAPHORE_FAILED); + + /* issue any flash DMA error status codes... */ + if (0u != hDevice->dmaError) { + return hDevice->dmaError; + } + + /* copy out any hardware errors... */ + *pHwErrors = hDevice->feeError; + if (0u != hDevice->feeError) { + /* return the HW error return code */ + return ADI_FEE_ERR_HW_ERROR_DETECTED; + } + + /* Check for errors in buffer write */ + if (hDevice->nRemainingBytes != 0u) { + return ADI_FEE_ERR_BUFFER_ERR; + } + + return result; +} + + +/** + * @brief Submit a non-blocking flash data write operation for background processing. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in] pTransaction Pointer to a user-defined control block describing the data to be transferred, containing: + * - pWriteAddr; Pointer to a 64-bit-aligned destination address in flash. + * - pWriteData; Pointer to a 32-bit-aligned source data buffer in user memory. + * - nSize; Number of bytes to write (must be an integral multiple of 8). + * - bUseDma; Flag controlling use of DMA to perform the write. + * + * @return Status + * - #ADI_FEE_SUCCESS The buffer is successfully written to the flash. + * - #ADI_FEE_ERR_ALIGNMENT [D] The flash write source data pointer is misaligned. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_INVALID_PARAM [D] Buffer size is not a multiple of 8-bytes (or too large for DMA). + * - #ADI_FEE_ERR_TRANSFER_IN_PROGRESS [D] Another transfer is already in progress. + * - #ADI_FEE_ERR_BUFFER_ERR Error occurred in processing the buffer. + * - #ADI_FEE_ERR_DEVICE_BUSY The flash controller is busy. + * - #ADI_FEE_ERR_NO_DATA_TO_TRANSFER Transfer ran out of write data unexpectedly. + * + * Submit a flash data write transaction. This is a non-blocking function which returns immediately. + * The application may either: poll for transaction completion through the non-blocking #adi_fee_IsBufferAvailable() + * API, and/or await transaction completion through the blocking mode #adi_fee_GetBuffer() API. If an application + * callback has been registered, the application is advised of completion status through the callback. + * + * @note If using callback mode, DO NOT USE the #adi_fee_GetBuffer() API, which are mutually exclusive protocols. + * + * @sa adi_fee_IsBufferAvailable(). + * @sa adi_fee_GetBuffer(). + */ +ADI_FEE_RESULT adi_fee_SubmitBuffer (ADI_FEE_HANDLE const hDevice, ADI_FEE_TRANSACTION* const pTransaction) +{ + ADI_FEE_RESULT result = ADI_FEE_SUCCESS; + +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + /* reject while a transfer is in progress */ + if (true == hDevice->bTransferInProgress) { + return ADI_FEE_ERR_TRANSFER_IN_PROGRESS; + } + + /* check address is 64-bit aligned and data pointer is 32-bit aligned */ + if ( (((uint32_t)pTransaction->pWriteAddr & 0x7u) != 0u) || ((((uint32_t)pTransaction->pWriteData) & 0x3u) != 0u) ) + { + return ADI_FEE_ERR_ALIGNMENT; + } + + /* make sure size is a multiple of 8 */ + if ((pTransaction->nSize & 0x7u) != 0u) { + return ADI_FEE_ERR_INVALID_PARAM; + } + + if (true == pTransaction->bUseDma) { + /* check for max DMA units (32-bit channel width means 4 bytes at a whack) */ + if (DMA_TRANSFER_LIMIT < (pTransaction->nSize / sizeof(uint32_t))) { + return ADI_FEE_ERR_INVALID_PARAM; + } + } +#endif + + /* set submit/get safeguard flag */ + hDevice->bSubmitCalled = true; + + /* Fill in the transfer params */ + hDevice->pNextWriteAddress = pTransaction->pWriteAddr; + hDevice->pNextReadAddress = pTransaction->pWriteData; + hDevice->nRemainingBytes = pTransaction->nSize; + hDevice->bUseDma = pTransaction->bUseDma; + + /* initiate a transfer */ + result = InitiateTransfer (hDevice); + + /* no pend here... just return */ + + return result; +} + + +/** + * @brief Non-blocking check if a write transaction complete. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in,out] pbCompletionState True if transfer is complete, false if not. + * + * @return Status + * - #ADI_FEE_SUCCESS The status of buffer is returned successfully. + * - #ADI_FEE_ERR_INVALID_PARAM [D] Pointer passed is NULL. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_UNMATCHED_SUBMIT_QUERY No matching buffer submit call found. + * + * Check if a non-blocking write transaction that was submitted via adi_fee_SubmitBuffer() is complete. + * + * @sa adi_fee_SubmitBuffer(). + * @sa adi_fee_GetBuffer(). + */ +ADI_FEE_RESULT adi_fee_IsBufferAvailable (ADI_FEE_HANDLE const hDevice, bool* const pbCompletionState) + +{ +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + if (pbCompletionState == NULL) { + return ADI_FEE_ERR_INVALID_PARAM; + } +#endif + + /* fail if not a submit-based transaction */ + if (false == hDevice->bSubmitCalled) { + return ADI_FEE_ERR_UNMATCHED_SUBMIT_QUERY; + } + + if (true == hDevice->bTransferInProgress) { + *pbCompletionState = false; + } else { + *pbCompletionState = true; + } + + return ADI_FEE_SUCCESS; +} + + +/** + * @brief Blocking mode call to await transaction completion. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in,out] pHwErrors Pointer to user location into which any flash hardware errors are reported. + * + * @return Status + * - #ADI_FEE_SUCCESS The buffer is successfully written to the flash. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_BUFFER_ERR Error occurred in processing the buffer. + * - #ADI_FEE_ERR_DMA_BUS_FAULT A runtime DMA bus fault was detected. + * - #ADI_FEE_ERR_DMA_INVALID_DESCR A runtime DMA invalid descriptor was detected. + * - #ADI_FEE_ERR_DMA_UNKNOWN_ERROR An unknown runtime DMA error was detected. + * - #ADI_FEE_ERR_HW_ERROR_DETECTED An internal flash controller hardware error was detected. + * - #ADI_FEE_ERR_SEMAPHORE_FAILED The semaphore pend operation failed. + * - #ADI_FEE_ERR_UNMATCHED_SUBMIT_QUERY No matching buffer submit call found. + * + * This function blocks until a previously-submitted flash write operation has completed. + * + * @note Flash hardware errors are flagged with the #ADI_FEE_ERR_HW_ERROR_DETECTED return code. + * Flash hardware error details are written to the location pointed to by the pHwErrors parameter. + * Hardware error details may be decoded according to the flash controller status register ("STAT") + * bit-map, documented in the Hardware Reference Manual (HRM). + * + * @sa adi_fee_SubmitBuffer(). + * @sa adi_fee_IsBufferAvailable(). + */ +ADI_FEE_RESULT adi_fee_GetBuffer (ADI_FEE_HANDLE const hDevice, uint32_t* const pHwErrors) + +{ +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } +#endif + + /* fail if not a submit-based transaction */ + if (false == hDevice->bSubmitCalled) { + return ADI_FEE_ERR_UNMATCHED_SUBMIT_QUERY; + } + + /* Pend for the semaphore */ + SEM_PEND(hDevice, ADI_FEE_ERR_SEMAPHORE_FAILED); + + /* issue any flash DMA error status codes... */ + if (0u != hDevice->dmaError) { + return hDevice->dmaError; + } + + /* copy out any hardware errors... */ + *pHwErrors = hDevice->feeError; + if (0u != hDevice->feeError) { + /* return the HW error return code */ + return ADI_FEE_ERR_HW_ERROR_DETECTED; + } + + /* Check for errors in buffer write or transfer still in progress */ + if ((0u != hDevice->nRemainingBytes) || (true == hDevice->bTransferInProgress)) { + return ADI_FEE_ERR_BUFFER_ERR; + } + + return ADI_FEE_SUCCESS; +} + + +/** + * @brief Get the (2kB) page number within which a flash address resides. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in] nAddress The flash address for which the page number is required. + * @param [in,out] pnPageNum Pointer to a variable into which the page number corresponding + * to the provided flash address is written. + * + * @return Status + * - #ADI_FEE_SUCCESS The page number is returned successfully. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_INVALID_PARAM [D] Parameter(s) are invalid. + * + * Translates a literal flash address into a page number for use with various page-based flash operations. + * + * @sa adi_fee_PageErase(). + * @sa adi_fee_VerifySignature(). + * @sa adi_fee_ConfigECC(). + * @sa adi_fee_GetBlockNumber(). + * + */ +ADI_FEE_RESULT adi_fee_GetPageNumber (ADI_FEE_HANDLE const hDevice, uint32_t const nAddress, uint32_t* const pnPageNum) +{ +#ifdef ADI_DEBUG + + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + if ( (pnPageNum == NULL) + || (nAddress >= FEE_FLASH_SIZE)) + { + return ADI_FEE_ERR_INVALID_PARAM; + } +#endif + + /* Set the page number for the given flash address */ + *pnPageNum = (nAddress >> FEE_PAGE_SHIFT); + + return ADI_FEE_SUCCESS; +} + + +/** + * @brief Get the (16kB) block number within which a flash address resides. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in] nAddress The flash address for which the block number is required. + * @param [in,out] pnBlockNum Pointer to a variable into which the block number corresponding + * to the provided flash address is written. + * + * @return Status + * - #ADI_FEE_SUCCESS The block number is returned successfully. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_INVALID_PARAM [D] Parameter(s) are invalid. + * + * Translates a literal flash address into a block number for use with setting flash write protection on a block. + * + * @sa adi_fee_WriteProtectBlock(). + * @sa adi_fee_GetPageNumber(). + */ +ADI_FEE_RESULT adi_fee_GetBlockNumber (ADI_FEE_HANDLE const hDevice, uint32_t const nAddress, uint32_t* const pnBlockNum) +{ +#ifdef ADI_DEBUG + + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + if ( (pnBlockNum == NULL) + || (nAddress >= FEE_FLASH_SIZE)) + { + return ADI_FEE_ERR_INVALID_PARAM; + } +#endif + + /* Set the block number */ + *pnBlockNum = (nAddress >> FEE_BLOCK_SHIFT); + + return ADI_FEE_SUCCESS; +} + + +/** + * @brief Generate the CRC signature for a range of flash data page(s). This is a blocking call. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in] nStartPage The lower page number of the signature range. + * @param [in] nEndPage The upper page number of the signature range. + * @param [in,out] pSigResult Pointer to a variable into which the computed signature is stored. + * @param [in,out] pHwErrors Pointer to user location into which any flash hardware errors are reported. + * + * @return Status + * - #ADI_FEE_SUCCESS The signature is verified successfully. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_INVALID_PARAM [D] The page(s) number(s) is(are) incorrect. + * - #ADI_FEE_ERR_TRANSFER_IN_PROGRESS [D] A flash write operation is in progress. + * - #ADI_FEE_ERR_HW_ERROR_DETECTED An internal flash controller hardware error was detected. + * - #ADI_FEE_ERR_SEMAPHORE_FAILED The semaphore pend operation failed. + * + * Compute and return a CRC over a range of contiguous whole flash memory pages(s). The computed CRC + * signature may subsequently be written into the most-significant word of the region over which the + * signature was calculated. This is done in context of enabling bootloader enforcement of CRC signature + * verification during system startup. See HRM for signature storage programming requirements and + * bootloader operation. + * + * @note Flash hardware errors are flagged with the #ADI_FEE_ERR_HW_ERROR_DETECTED return code. + * Flash hardware error details are written to the location pointed to by the pHwErrors parameter. + * Hardware error details may be decoded according to the flash controller status register ("STAT") + * bit-map, documented in the Hardware Reference Manual (HRM). + * + * @sa adi_fee_GetPageNumber(). + */ +ADI_FEE_RESULT adi_fee_VerifySignature (ADI_FEE_HANDLE const hDevice, uint32_t const nStartPage, uint32_t const nEndPage, uint32_t* const pSigResult, uint32_t* const pHwErrors) + +{ + ADI_FEE_RESULT result = ADI_FEE_SUCCESS; + +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + /* reject while a transfer is in progress */ + if (true == hDevice->bTransferInProgress) { + return ADI_FEE_ERR_TRANSFER_IN_PROGRESS; + } + + if ( (pSigResult == NULL) + || (nStartPage > nEndPage) + || (nStartPage >= FEE_MAX_NUM_PAGES) + || (nEndPage >= FEE_MAX_NUM_PAGES) + ) + { + return ADI_FEE_ERR_INVALID_PARAM; + } +#endif + + /* Wait until not busy */ + BusyWait (hDevice, (BITM_FLCC_STAT_CMDBUSY | BITM_FLCC_STAT_WRCLOSE)); + + /* Set the lower and upper page */ + hDevice->pDev->PAGE_ADDR0 = nStartPage << FEE_PAGE_SHIFT; + hDevice->pDev->PAGE_ADDR1 = nEndPage << FEE_PAGE_SHIFT; + + /* Do a SIGN command */ + result = SendCommand(hDevice, ENUM_FLCC_CMD_SIGN); + + /* block on command */ + SEM_PEND(hDevice, ADI_FEE_ERR_SEMAPHORE_FAILED); + + /* Return the signature to the application */ + if (ADI_FEE_SUCCESS == result) { + *pSigResult = hDevice->pDev->SIGNATURE; + } else { + *pSigResult = 0u; + } + + /* copy out any hardware errors... */ + *pHwErrors = hDevice->feeError; + if (0u != hDevice->feeError) { + /* return the HW error return code */ + return ADI_FEE_ERR_HW_ERROR_DETECTED; + } + + return result; +} + + +/** + * @brief Set write protection on an (16kB) block. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in] nBlockNum The block number. + * + * @return Status + * - #ADI_FEE_SUCCESS The block is write protected successfully. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_INVALID_PARAM [D] Block number is invalid. + * - #ADI_FEE_ERR_TRANSFER_IN_PROGRESS [D] Another transfer is already in progress. + * + * Assert memory write-protection for specified block. Note that only entire blocks are protectable, + * with each block spanning 8 pages. + * + * @note Blocks may only be write-protected during user run-time code. Unprotecting is only + * possible with a power-on-reset or a mass erase; write-protection is not otherwise clearable. + * + * @warning Flash-based code that write-protects blocks will cause the write-protection (and data at + * time of write-protect assertion) to apparently not clear... even after a mass erase or power-on-reset. + * This apparently "stuck" write-protection results from the flash-based write-protect code running + * after reset (as usual), but still prior to the debugger halting the target through the debug + * interrupt. The debugger target halt occurs WELL AFTER the flash code has already run, thereby + * relocking the block and making it appear the write-protection was never reset. This can be difficult + * Catch-22 situation to recover from, requiring repeated hardware resets and reflashing new code that + * does not assert the write-protection. + * + * @sa adi_fee_GetBlockNumber(). + */ +ADI_FEE_RESULT adi_fee_WriteProtectBlock (ADI_FEE_HANDLE const hDevice, uint32_t const nBlockNum) + +{ +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + /* reject while a transfer is in progress */ + if (true == hDevice->bTransferInProgress) { + return ADI_FEE_ERR_TRANSFER_IN_PROGRESS; + } + + if (nBlockNum > FEE_MAX_NUM_BLOCKS) { + return ADI_FEE_ERR_INVALID_PARAM; + } +#endif + + /* Set the write protection (by clearing the bit) for the given block */ + hDevice->pDev->KEY = ENUM_FLCC_KEY_USERKEY; + CLR_BITS (hDevice->pDev->WRPROT, 1u << nBlockNum); + hDevice->pDev->KEY = 0u; + + return ADI_FEE_SUCCESS; +} + + +/** + * @brief Sleep or awake the flash controller. This is a blocking call. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in] bSleep 'true' to enable to sleep the flash device + * and 'false' to wake up the device. + * + * @return Status + * - #ADI_FEE_SUCCESS The flash controller is moved to sleep/wake + * up sate successfully. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_TRANSFER_IN_PROGRESS [D] Another transfer is already in progress. + * - #ADI_FEE_ERR_SEMAPHORE_FAILED The semaphore pend operation failed. + * + * Places the flash controller into a low-power sleep mode - see details in Hardware Reference Manual (HRM). + * Default wakeup time is approximately 5us, and is configurable with static configuration parameter + * ADI_FEE_CFG_PARAM1_TWK in adi_flash_config.h file. + */ +ADI_FEE_RESULT adi_fee_Sleep (ADI_FEE_HANDLE const hDevice, bool const bSleep) +{ + ADI_FEE_RESULT result = ADI_FEE_SUCCESS; + +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + /* reject while a transfer is in progress */ + if (true == hDevice->bTransferInProgress) { + return ADI_FEE_ERR_TRANSFER_IN_PROGRESS; + } +#endif + + /* TODO: Check that IDLE can take the controller + * out of sleep + */ + + if (true == bSleep) { + result = SendCommand (hDevice, ENUM_FLCC_CMD_SLEEP); + } else { + result = SendCommand (hDevice, ENUM_FLCC_CMD_IDLE); + } + + /* block on command */ + SEM_PEND(hDevice, ADI_FEE_ERR_SEMAPHORE_FAILED); + + return result; +} + + +/** + * @brief Forcefully ABORT an ongoing flash operation. This is a blocking call. + * + * @param [in] hDevice The handle to the flash controller device. + * + * @return Statuus + * - #ADI_FEE_SUCCESS The command is successfully aborted. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid + * - #ADI_FEE_ERR_SEMAPHORE_FAILED The semaphore pend operation failed. + * + * @warning Use this command sparingly and as a last resort to satisfy critical + * time-sensitive events. Aborting any flash command results in prematurely ending the + * current flash access and may result in corrupted flash data. + * + * @sa adi_fee_GetAbortAddr(). + */ +ADI_FEE_RESULT adi_fee_Abort (ADI_FEE_HANDLE const hDevice) + +{ +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } +#endif + /* Issue the command (abort is keyed) directly */ + /* (avoid SendCommand() here, as it does a busy wait, which may not clear if we're in a recovery mode) */ + hDevice->pDev->KEY = ENUM_FLCC_KEY_USERKEY; + hDevice->pDev->CMD = ENUM_FLCC_CMD_ABORT; + hDevice->pDev->KEY = 0u; + + SEM_PEND(hDevice, ADI_FEE_ERR_SEMAPHORE_FAILED); + + return ADI_FEE_SUCCESS; +} + + +/** + * @brief Get the address of recently aborted write command. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in,out] pnAddress Pointer to which the address is written. + * + * @return Status + * - #ADI_FEE_SUCCESS The abort address is retrieved successfully + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid + * - #ADI_FEE_ERR_INVALID_PARAM [D] Pointer passed is NULL + * + * Users may use this result to determine the flash location(s) affected by a write abort command. + * Subsequent flash commands invalidate the write abort address register. + * + * + * @sa adi_fee_Abort(). + */ +ADI_FEE_RESULT adi_fee_GetAbortAddr (ADI_FEE_HANDLE const hDevice, uint32_t* const pnAddress) +{ +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + if (pnAddress == NULL) { + return ADI_FEE_ERR_INVALID_PARAM; + } +#endif + + /* Write the address of the last write abort to the pointer + * supplied by the application + */ + *pnAddress = hDevice->pDev->WR_ABORT_ADDR; + + return ADI_FEE_SUCCESS; +} + + +/** + * @brief Configure ECC start page and enablement. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in] nStartPage The start page for which ECC will be performed. + * @param [in] bInfoECCEnable Info space ECC enable: + * - 'true' to enable info space ECC, or + * - 'false' to disable info space ECC. + * + * @return Status + * - #ADI_FEE_SUCCESS The ECC was configured successfully + * - #ADI_FEE_ERR_INVALID_PARAM [D] Start page is invalid + * - #ADI_FEE_ERR_TRANSFER_IN_PROGRESS [D] Another transfer is already in progress. + * + * @note The settings this API manages are very likely not needed to be modified dynamically (at run-time). + * If so, consider using the static configuration equivalents (see adi_flash_config.h) in lieu of + * this API... which will reduce the resulting code image footprint through linker elimination. + * + * @warning This API leaves user space ECC disabled. Use #adi_fee_EnableECC() to manage ECC enable/disable. + * + * @sa adi_fee_EnableECC(). + * @sa adi_fee_ConfigECCEvents(). + * @sa adi_fee_GetECCErrAddr(). + * @sa adi_fee_GetECCCorrections(). + */ +ADI_FEE_RESULT adi_fee_ConfigECC (ADI_FEE_HANDLE const hDevice, uint32_t const nStartPage, bool const bInfoECCEnable) +{ + uint32_t nRelAddress = nStartPage << FEE_PAGE_SHIFT; + +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + /* reject while a transfer is in progress */ + if (true == hDevice->bTransferInProgress) { + return ADI_FEE_ERR_TRANSFER_IN_PROGRESS; + } + + if (nStartPage >= FEE_MAX_NUM_PAGES) { + return ADI_FEE_ERR_INVALID_PARAM; + } +#endif + + /* Clear the ECC config bits */ + CLR_BITS (hDevice->pDev->ECC_CFG, (BITM_FLCC_ECC_CFG_PTR | BITM_FLCC_ECC_CFG_INFOEN)); + + /* Set the start page address in the ECC Cfg register */ + hDevice->pDev->ECC_CFG |= (nRelAddress & BITM_FLCC_ECC_CFG_PTR); + + /* enable ECC on info space... if requested */ + if (true == bInfoECCEnable) { + SET_BITS (hDevice->pDev->ECC_CFG, BITM_FLCC_ECC_CFG_INFOEN); + } + + return ADI_FEE_SUCCESS; +} + + +/** + * @brief Enable/Disable user space ECC for the device. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in] bEnable User space ECC enable: + * - 'true' to enable user space ECC, or + * - 'false' to disable user space ECC. + * + * @return Status + * - #ADI_FEE_SUCCESS The ECC is enabled/disabled successfully. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_TRANSFER_IN_PROGRESS [D] Another transfer is already in progress. + * + * Manage enablement of user space ECC function. + * + * @note The settings this API manages are very likely not needed to be modified dynamically (at run-time). + * If so, consider using the static configuration equivalents (see adi_flash_config.h) in lieu of + * this API... which will reduce the resulting code image footprint through linker elimination. + * + * @sa adi_fee_ConfigECC(). + * @sa adi_fee_ConfigECCEvents(). + * @sa adi_fee_GetECCErrAddr(). + * @sa adi_fee_GetECCCorrections(). + */ +ADI_FEE_RESULT adi_fee_EnableECC (ADI_FEE_HANDLE const hDevice, bool const bEnable) +{ +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + /* reject while a transfer is in progress */ + if (true == hDevice->bTransferInProgress) { + return ADI_FEE_ERR_TRANSFER_IN_PROGRESS; + } +#endif + + /* manage flash ECC enable */ + if (true == bEnable) { + SET_BITS(hDevice->pDev->ECC_CFG, BITM_FLCC_ECC_CFG_EN); + } else { + CLR_BITS(hDevice->pDev->ECC_CFG, BITM_FLCC_ECC_CFG_EN); + } + + return ADI_FEE_SUCCESS; +} + + +/** + * @brief Confifure ECC event response. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in] eEvent ECC event - Either error or correction event. + * @param [in] eResponse The response to the eEvent - One of none, bus error, or interrupt. + * + * @return Status + * - #ADI_FEE_SUCCESS The ECC events are configured successfully. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_INVALID_PARAM [D] Parameters are invalid. + * - #ADI_FEE_ERR_TRANSFER_IN_PROGRESS [D] Another transfer is already in progress. + * + * Configures two major aspects of ECC event response: + * - On ECC (2-bit) Error events, generate one of: no response, bus error, or flash interrupt. + * - On ECC (1-bit) Correction events, generate one of: no response, bus error, or flash interrupt. + * + * @note The settings this API manages are very likely not needed to be modified dynamically (at run-time). + * If so, consider using the static configuration equivalents (see adi_flash_config.h) in lieu of + * this API... which will reduce the resulting code image footprint through linker elimination. + * + * @sa adi_fee_ConfigECC(). + * @sa adi_fee_EnableECC(). + * @sa adi_fee_GetECCErrAddr(). + * @sa adi_fee_GetECCCorrections(). + */ +ADI_FEE_RESULT adi_fee_ConfigECCEvents (ADI_FEE_HANDLE const hDevice, ADI_FEE_ECC_EVENT_TYPE const eEvent, ADI_FEE_ECC_RESPONSE const eResponse) + +{ + uint32_t nBitMask; + int32_t nBitPos; + +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + /* reject while a transfer is in progress */ + if (true == hDevice->bTransferInProgress) { + return ADI_FEE_ERR_TRANSFER_IN_PROGRESS; + } + + /* Check the function parameters */ + if ( ( (eEvent != ADI_FEE_ECC_EVENT_TYPE_ERROR) + && (eEvent != ADI_FEE_ECC_EVENT_TYPE_CORRECT)) + + || ( (eResponse != ADI_FEE_ECC_RESPONSE_NONE) + && (eResponse != ADI_FEE_ECC_RESPONSE_BUS_ERROR) + && (eResponse != ADI_FEE_ECC_RESPONSE_IRQ)) + ) + { + return ADI_FEE_ERR_INVALID_PARAM; + } +#endif + + /* Select the correct bit mask and bit pos for the event type */ + if (eEvent == ADI_FEE_ECC_EVENT_TYPE_ERROR) { + nBitMask = BITM_FLCC_IEN_ECC_ERROR; + nBitPos = BITP_FLCC_IEN_ECC_ERROR; + } else { + nBitMask = BITM_FLCC_IEN_ECC_CORRECT; + nBitPos = BITP_FLCC_IEN_ECC_CORRECT; + } + + /* clear the bits */ + CLR_BITS (hDevice->pDev->IEN, nBitMask); + + /* set the response */ + SET_BITS (hDevice->pDev->IEN, ((uint32_t)eResponse) << nBitPos); + + return ADI_FEE_SUCCESS; +} + + +/** + * `@brief Get the address for which the ECC event is detected. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in,out] pnAddress Pointer to which the address is written. + * + * @return Status + * - #ADI_FEE_SUCCESS The ECC error address is retrieved successfully. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_INVALID_PARAM [D] Parameters are invalid. + * + * Returns the address of the first ECC error or correction event to generate an + * interrupt since the last time ECC status bits were cleared (or since reset). + * + * @sa adi_fee_ConfigECC(). + * @sa adi_fee_EnableECC(). + * @sa adi_fee_ConfigECCEvents(). + * @sa adi_fee_GetECCCorrections(). + */ +ADI_FEE_RESULT adi_fee_GetECCErrAddr (ADI_FEE_HANDLE const hDevice, uint32_t* const pnAddress) + +{ +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + if (pnAddress == NULL) { + return ADI_FEE_ERR_INVALID_PARAM; + } +#endif + + /* Write the address of the last ECC error/correction */ + *pnAddress = hDevice->pDev->ECC_ADDR; + + return ADI_FEE_SUCCESS; +} + + +/** + * @brief Get the number of 1-bit error corrections. + * + * @param [in] hDevice The handle to the flash controller device. + * @param [in,out] pnNumCorrections Pointer to which the number of corrections are written. + * + * @return Status + * - #ADI_FEE_SUCCESS The number of ECC corrections are successfully retrieved. + * - #ADI_FEE_ERR_INVALID_HANDLE [D] The device handle passed is invalid. + * - #ADI_FEE_ERR_INVALID_PARAM [D] Parameters are invalid. + * + * See HRM for details on how current ECC configuration affects this reporting. + * + * @sa adi_fee_ConfigECC(). + * @sa adi_fee_EnableECC(). + * @sa adi_fee_ConfigECCEvents(). + * @sa adi_fee_GetECCErrAddr(). + */ +ADI_FEE_RESULT adi_fee_GetECCCorrections (ADI_FEE_HANDLE const hDevice, uint32_t* const pnNumCorrections) +{ + +#ifdef ADI_DEBUG + if (true != IsDeviceHandle(hDevice)) { + return ADI_FEE_ERR_INVALID_HANDLE; + } + + if (pnNumCorrections == NULL) { + return ADI_FEE_ERR_INVALID_PARAM; + } +#endif + + /* Get the number of ECC Error corrections */ + *pnNumCorrections = (hDevice->pDev->STAT & BITM_FLCC_STAT_ECCERRCNT) >> BITP_FLCC_STAT_ECCERRCNT; + + return ADI_FEE_SUCCESS; +} + + +/*======== L O C A L F U N C T I O N D E F I N I T I O N S ========*/ + + +/* Send a command to the flash controller... bot don't block on it... + */ +static ADI_FEE_RESULT SendCommand (ADI_FEE_HANDLE const hDevice, uint32_t const cmd) +{ + /* Wait for the flash to be free */ + BusyWait (hDevice, (BITM_FLCC_STAT_CMDBUSY | BITM_FLCC_STAT_WRCLOSE)); + + /* Clear the command completion status bit + * by acknowledging it + */ + hDevice->pDev->STAT = BITM_FLCC_STAT_CMDCOMP; + + /* Enable command-complete and command-fail interrupt */ + SET_BITS(hDevice->pDev->IEN, (BITM_FLCC_IEN_CMDCMPLT | BITM_FLCC_IEN_CMDFAIL)); + + /* Issue the command (most commands are keyed) */ + hDevice->pDev->KEY = ENUM_FLCC_KEY_USERKEY; + hDevice->pDev->CMD = cmd; + hDevice->pDev->KEY = 0u; + + return ADI_FEE_SUCCESS; +} + + +static ADI_FEE_RESULT InitiatePioTransfer (ADI_FEE_HANDLE const hDevice) +{ + + /* use PIO interrupt mode in non-burst-mode (burst-mode only spans 256-bytes). + Initiate the 1st write here, then let the interrupt handler feed + the remaining data as we process "almost-complete" interrupts. + */ + + /* write the 1st 64-bits of data */ + if (0u != hDevice->nRemainingBytes) { + + /* enable command interrupts */ + SET_BITS (hDevice->pDev->IEN, (BITM_FLCC_IEN_WRALCMPLT | BITM_FLCC_IEN_CMDCMPLT | BITM_FLCC_IEN_CMDFAIL)); + + /* set initial write address*/ + hDevice->pDev->KH_ADDR = (uint32_t)hDevice->pNextWriteAddress; + hDevice->pNextWriteAddress += 2; + + /* set key-hole data registers */ + hDevice->pDev->KH_DATA0 = *hDevice->pNextReadAddress; + hDevice->pNextReadAddress++; + hDevice->pDev->KH_DATA1 = *hDevice->pNextReadAddress; + hDevice->pNextReadAddress++; + hDevice->nRemainingBytes -= sizeof(uint64_t); + + /* write the command register which launches the burst write */ + hDevice->pDev->CMD = ENUM_FLCC_CMD_WRITE; + + } else { + return ADI_FEE_ERR_NO_DATA_TO_TRANSFER; + } + + return ADI_FEE_SUCCESS; +} + + +/* DMA Transfer to FIFO */ +static ADI_FEE_RESULT InitiateDmaTransfer (ADI_FEE_HANDLE const hDevice) +{ + ADI_DCC_TypeDef* pCCD = pPrimaryCCD; /* pointer to primary DMA descriptor array */ + + if (0u != hDevice->nRemainingBytes) { + + /* local channel number */ + uint16_t chan = hDevice->pDevInfo->dmaChanNum; + + /* disable endpointer decrement modes */ + pADI_DMA0->SRCADDR_CLR = 1u << chan; + pADI_DMA0->DSTADDR_CLR = 1u << chan; + + /* enable the channel */ + pADI_DMA0->EN_SET = 1u << chan; + + /* allow flash to request DMA service */ + pADI_DMA0->RMSK_CLR = 1u << chan; + + /* activate primary descriptor */ + pADI_DMA0->ALT_CLR = 1u << chan; + + /* Note: DMA width is 32-bit for the flash controller, but flash writes require + 64-bit writes at a whack. Set DMA R_Power (bus rearbitration rate) to two so + we get two uninterrupted 32-bit DMA writes to the flash with each DMA transfer. + */ + + /* set DMA source endpoint */ + pCCD += chan; /* offset descriptor pointer to flash channel */ + pCCD->DMASRCEND = (uint32_t)hDevice->pNextReadAddress + hDevice->nRemainingBytes - sizeof(uint32_t); + + /* set DMA destination endpoint (no increment) */ + pCCD->DMADSTEND = (uint32_t)&hDevice->pDev->KH_DATA1; + + /* set the initial write address */ + hDevice->pDev->KH_ADDR = (uint32_t)hDevice->pNextWriteAddress; + + /* set the DMA Control Data Configuration register */ + pCCD->DMACDC = + ( ((uint32_t)ADI_DMA_INCR_NONE << DMA_BITP_CTL_DST_INC) + | ((uint32_t)ADI_DMA_INCR_4_BYTE << DMA_BITP_CTL_SRC_INC) + | ((uint32_t)ADI_DMA_WIDTH_4_BYTE << DMA_BITP_CTL_SRC_SIZE) + | ((uint32_t)ADI_DMA_RPOWER_2 << DMA_BITP_CTL_R_POWER) + | (uint32_t)((hDevice->nRemainingBytes/sizeof(uint32_t) - 1u) << DMA_BITP_CTL_N_MINUS_1) + | ((uint32_t)DMA_ENUM_CTL_CYCLE_CTL_BASIC << DMA_BITP_CTL_CYCLE_CTL) ); + + /* set auto-increment and DMA enable bits, launching transder */ + hDevice->pDev->KEY = ENUM_FLCC_KEY_USERKEY; + SET_BITS (hDevice->pDev->UCFG, (BITM_FLCC_UCFG_AUTOINCEN | BITM_FLCC_UCFG_KHDMAEN)); + hDevice->pDev->KEY = 0u; + + } else { + return ADI_FEE_ERR_NO_DATA_TO_TRANSFER; + } + + return ADI_FEE_SUCCESS; +} + + +/* Initiate transfer */ +static ADI_FEE_RESULT InitiateTransfer (ADI_FEE_HANDLE const hDevice) +{ + ADI_FEE_RESULT result = ADI_FEE_SUCCESS; + + /* If a transfer is in progress or if the pending buffers are empty + * the return as there is nothing to be done now + */ + if (true == hDevice->bTransferInProgress) + { + return ADI_FEE_ERR_DEVICE_BUSY; + } + + /* Wait for the flash to not be busy */ + BusyWait (hDevice, BITM_FLCC_STAT_CMDBUSY); + + /* clear internal errors */ + hDevice->feeError = 0u; + hDevice->dmaError = ADI_FEE_SUCCESS; + + /* Set the bool variable to signify that a transfer is in progress */ + hDevice->bTransferInProgress = true; + + /* clear any command interrupt enables */ + CLR_BITS(hDevice->pDev->IEN, (BITM_FLCC_IEN_WRALCMPLT | BITM_FLCC_IEN_CMDCMPLT | BITM_FLCC_IEN_CMDFAIL)); + + /* clear any dangeling command-related status */ + hDevice->pDev->STAT = BITM_FLCC_STAT_WRALCOMP | BITM_FLCC_STAT_CMDCOMP | BITM_FLCC_STAT_CMDFAIL; + + /* clear auto-increment and dma enable bits */ + hDevice->pDev->KEY = ENUM_FLCC_KEY_USERKEY; + CLR_BITS (hDevice->pDev->UCFG, (BITM_FLCC_UCFG_AUTOINCEN | BITM_FLCC_UCFG_KHDMAEN)); + hDevice->pDev->KEY = 0u; + + /* Call the corresponding Transfer functions */ + if (true == hDevice->bUseDma) { + result = InitiateDmaTransfer(hDevice); + } else { + result = InitiatePioTransfer(hDevice); + } + + return result; +} + + +/* hide the interrupt handlers from DoxyGen */ +/*! \cond PRIVATE */ + +/* Flash PIO interrupt handler */ +void Flash0_Int_Handler(void) +{ + ISR_PROLOG(); + + /* post flag */ + bool bPost = false; + bool bError = false; + + /* recover the driver handle */ + ADI_FEE_HANDLE hDevice = fee_device_info[0].hDevice; + +#ifdef ADI_DEBUG + /* Return if the device is not opened - spurious interrupts */ + if (hDevice == NULL) { + return; + } +#endif + + /* update status cache and clear it right away on the controller */ + hDevice->FlashStatusCopy = hDevice->pDev->STAT; + hDevice->pDev->STAT = hDevice->FlashStatusCopy; + + /* check for flash device errors */ + hDevice->feeError = (ADI_FEE_STATUS_ERROR_MASK & hDevice->FlashStatusCopy); + if (0u != hDevice->feeError) { + bError = true; + } + + /* if no errors */ + if (false == bError) { + + if (0u != (BITM_FLCC_STAT_WRALCOMP & hDevice->FlashStatusCopy)) { + + /* write-almost-complete */ + + /* if more data to write... */ + if (0u != hDevice->nRemainingBytes) { + + /* set next write the address */ + hDevice->pDev->KH_ADDR = (uint32_t)hDevice->pNextWriteAddress; + hDevice->pNextWriteAddress += 2; + + /* set next key-hole data */ + hDevice->pDev->KH_DATA0 = *hDevice->pNextReadAddress; + hDevice->pNextReadAddress++; + hDevice->pDev->KH_DATA1 = *hDevice->pNextReadAddress; + hDevice->pNextReadAddress++; + hDevice->nRemainingBytes -= sizeof(uint64_t); + + /* initiate next write */ + hDevice->pDev->CMD = ENUM_FLCC_CMD_WRITE; + + } else { + + /* no more data to write... + wait for current write-almost-complete status to transition to not busy */ + BusyWait (hDevice, BITM_FLCC_STAT_CMDBUSY); + + /* set post flag */ + bPost = true; + } + + } else if (0u != (BITM_FLCC_STAT_CMDCOMP & hDevice->FlashStatusCopy)) { + + /* command-complete */ + + /* this path is for blocking-mode commands (erase, verify, abort, etc.) */ + + /* set post flag */ + bPost = true; + + } else { + /* no other interrupt types expected */ + } + } else { + /* error(s) detected... set the post flag */ + bPost = true; + } + + /* singular post */ + if (true == bPost) { + + /* clear the command interrupt enables */ + CLR_BITS(hDevice->pDev->IEN, (BITM_FLCC_IEN_WRALCMPLT | BITM_FLCC_IEN_CMDCMPLT | BITM_FLCC_IEN_CMDFAIL)); + + /* clear auto-increment and dma enable bits */ + hDevice->pDev->KEY = ENUM_FLCC_KEY_USERKEY; + CLR_BITS (hDevice->pDev->UCFG, (BITM_FLCC_UCFG_AUTOINCEN | BITM_FLCC_UCFG_KHDMAEN)); + hDevice->pDev->KEY = 0u; + + /* mark transfer complete */ + hDevice->bTransferInProgress = false; + + /* dispatch callback (if we have one...) */ + if (0u != hDevice->pfCallback) { + if (false == bError) { + /* no error, pass success flag to callback */ + hDevice->pfCallback (hDevice->pCBParam, (uint32_t)ADI_FEE_CALLBACK_EVENT_BUFFER_PROCESSED, (void*)NULL); + } else { + /* error condition, pass error flag and error status to callback */ + hDevice->pfCallback (hDevice->pCBParam, (uint32_t)ADI_FEE_CALLBACK_EVENT_DEVICE_ERROR, (void*)hDevice->feeError); + } + } + + /* post the semaphore */ + SEM_POST(hDevice); + } + + ISR_EPILOG(); +} + + +/* Flash DMA interrupt handler */ +void DMA_FLASH0_Int_Handler (void) +{ + /* rtos prologue */ + ISR_PROLOG() + ; + + /* recover the driver handle */ + ADI_FEE_HANDLE hDevice = fee_device_info[0].hDevice; + + /* update status cache and clear it right away on the controller */ + hDevice->FlashStatusCopy = hDevice->pDev->STAT; + hDevice->pDev->STAT = hDevice->FlashStatusCopy; + + /* capture any hw error status */ + hDevice->feeError = (ADI_FEE_STATUS_ERROR_MASK & hDevice->FlashStatusCopy); + + /* clear auto-increment and dma enable bits */ + hDevice->pDev->KEY = ENUM_FLCC_KEY_USERKEY; + CLR_BITS (hDevice->pDev->UCFG, (BITM_FLCC_UCFG_AUTOINCEN | BITM_FLCC_UCFG_KHDMAEN)); + hDevice->pDev->KEY = 0u; + + /* clear the remaining count, as it should all have gone in one swoop */ + hDevice->nRemainingBytes = 0u; + + /* mark transfer complete */ + hDevice->bTransferInProgress = false; + + /* dispatch callback (if we have one...) */ + if (0u != hDevice->pfCallback) { + + /* no errors, notify success */ + if ((0u == hDevice->feeError) && (0u == hDevice->dmaError)) { + hDevice->pfCallback (hDevice->pCBParam, (uint32_t)ADI_FEE_CALLBACK_EVENT_BUFFER_PROCESSED, (void*)NULL); + + /* flash hardware error */ + } else if (0u == hDevice->feeError) { + hDevice->pfCallback (hDevice->pCBParam, (uint32_t)ADI_FEE_CALLBACK_EVENT_DEVICE_ERROR, (void*)hDevice->feeError); + + /* flash dma error */ + } else if (0u == hDevice->dmaError) { + /* DMA error */ + hDevice->pfCallback (hDevice->pCBParam, (uint32_t)hDevice->dmaError, NULL); + } else { + /* no other cases... */ + } + } + + /* post the semaphore */ + SEM_POST(hDevice); + + ISR_EPILOG(); +} + +/*! \endcond */ +/*@}*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/flash/adi_flash_data.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/flash/adi_flash_data.c new file mode 100755 index 0000000000..88fe50cf05 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/flash/adi_flash_data.c @@ -0,0 +1,116 @@ +/* + ***************************************************************************** + * @file: adi_flash_data.c + * @brief: Data declaration for Flash Device Driver + * @date: $Date$ + ***************************************************************************** + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be consciously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_FEE_DATA_C +#define ADI_FEE_DATA_C + + /*! \cond PRIVATE */ + +#include "adi_flash_def.h" +#include "adi_flash_config.h" + + +/* Stores the information about the specific device */ +static ADI_FEE_DEVICE_INFO fee_device_info [ADI_FEE_NUM_INSTANCES] = +{ + /* only one flash instance at this time */ + { pADI_FLCC0, /* Flash controller pointer */ + FLCC_EVT_IRQn, /* Flash PIO interrupt number */ + DMA0_CH15_DONE_IRQn, /* Flash DMA interrupt number */ + FLASH_CHANn, /* Flash DMA channel (15) number */ + NULL, /* Flash static config info */ + NULL /* Flash driver handle */ + }, +}; + + +/* build Flash Application configuration array */ +static ADI_FEE_CONFIG gConfigInfo[ADI_FEE_NUM_INSTANCES] = +{ + /* the one-and-only (so far) instance data for FEE0... */ + { + /* ECC interrupt enable settings (IEN register) */ + ( (ADI_FEE_CFG_ECC_ERROR_RESPONSE << BITP_FLCC_IEN_ECC_ERROR) + | (ADI_FEE_CFG_ECC_CORRECTION_RESPONSE << BITP_FLCC_IEN_ECC_CORRECT) + ), + + /* timing parameter settings (TIME_PARAM0 register) */ + ( (ADI_FEE_CFG_PARAM0_TNVH1 << BITP_FLCC_TIME_PARAM0_TNVH1) + | (ADI_FEE_CFG_PARAM0_TERASE << BITP_FLCC_TIME_PARAM0_TERASE) + | (ADI_FEE_CFG_PARAM0_TRCV << BITP_FLCC_TIME_PARAM0_TRCV) + | (ADI_FEE_CFG_PARAM0_TNVH << BITP_FLCC_TIME_PARAM0_TNVH) + | (ADI_FEE_CFG_PARAM0_TPROG << BITP_FLCC_TIME_PARAM0_TPROG) + | (ADI_FEE_CFG_PARAM0_TPGS << BITP_FLCC_TIME_PARAM0_TPGS) + | (ADI_FEE_CFG_PARAM0_TNVS << BITP_FLCC_TIME_PARAM0_TNVS) + | (ADI_FEE_CFG_PARAM0_CLKDIV << BITP_FLCC_TIME_PARAM0_DIVREFCLK) + ), + + /* more timing parameter settings (TIME_PARAM1 register) */ + ( (ADI_FEE_CFG_PARAM1_WAITESTATES << BITP_FLCC_TIME_PARAM1_WAITSTATES) + | (ADI_FEE_CFG_PARAM1_TWK << BITP_FLCC_TIME_PARAM1_TWK) + ), + + /* system interrupt abort enables (ABORT_EN_XX registers) */ + (ADI_FEE_CFG_ABORT_EN_LO), + (ADI_FEE_CFG_ABORT_EN_HI), + + /* ECC configuration register settings (ECC_CFG register) */ + (((ADI_FEE_CFG_ECC_START_PAGE << FEE_PAGE_SHIFT) & BITM_FLCC_ECC_CFG_PTR) +#if (ADI_FEE_CFG_ENABLE_ECC_FOR_INFO_SPACE == 1u) + | (BITM_FLCC_ECC_CFG_INFOEN) +#endif +#if (ADI_FEE_CFG_ENABLE_ECC == 1u) + | (BITM_FLCC_ECC_CFG_EN) +#endif + ) + } /* end device 0 settings */ +}; + +/*! \endcond */ + + +#endif /* ADI_FEE_DATA_C */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/flash/adi_flash_def.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/flash/adi_flash_def.h new file mode 100755 index 0000000000..c14be74be0 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/flash/adi_flash_def.h @@ -0,0 +1,181 @@ +/*! + ***************************************************************************** + @file: adi_flash_def.h + @brief: Internal Flash device driver definitions and macros + @date: $Date: 2014-11-28 01:48:03 -0500 (Fri, 28 Nov 2014) $ + ----------------------------------------------------------------------------- +Copyright (c) 2012-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_FLASH_DEF_H +#define ADI_FLASH_DEF_H + +/*! \cond PRIVATE */ + +#include +#include + +#include + +/* fixed number of flash controllers */ +#define ADI_FEE_NUM_INSTANCES (1u) + +/* STATUS register error mask */ +#define ADI_FEE_STATUS_ERROR_MASK ( BITM_FLCC_STAT_ACCESS_MODE \ + | BITM_FLCC_STAT_CACHESRAMPERR \ + | BITM_FLCC_STAT_ECCDCODE \ + | BITM_FLCC_STAT_ECCINFOSIGN \ + | BITM_FLCC_STAT_SIGNERR \ + | BITM_FLCC_STAT_OVERLAP \ + | BITM_FLCC_STAT_ECCRDERR \ + | BITM_FLCC_STAT_ECCERRCMD \ + | BITM_FLCC_STAT_SLEEPING \ + | BITM_FLCC_STAT_CMDFAIL) + + +#if defined(__ECC__) +#define ALIGN +#define ALIGN4 _Pragma("align(4)") +#elif defined(__ICCARM__) +#define ALIGN _Pragma("pack()") +#define ALIGN4 _Pragma("pack(4)") +#elif defined (__GNUC__) +#define ALIGN _Pragma("pack()") +#define ALIGN4 _Pragma("pack(4)") +#endif + +/* Flash Size and Page/Block macros: + 512kB total user space, broken up as + 256-pages, 2kB/page + 32-blocks, 16kB/block + 8 pages/block +*/ +#define FEE_FLASH_SIZE (0x80000u) /* 512kB total */ +#define FEE_PAGE_SHIFT (11u) /* 2kB page size */ +#define FEE_BLOCK_SHIFT (14u) /* 16kB block size */ +#define FEE_MAX_NUM_PAGES (FEE_FLASH_SIZE >> FEE_PAGE_SHIFT) /* max number of pages (256) */ +#define FEE_MAX_NUM_BLOCKS (FEE_FLASH_SIZE >> FEE_BLOCK_SHIFT) /* max number of blocks (32) */ + +#if (ADI_FEE_CFG_ECC_START_PAGE >= FEE_MAX_NUM_PAGES) +#error "ADI_FEE_CFG_ECC_START_PAGE range is invalid" +#endif + + +/* INTERNAL DRIVER STATIC FUNCTION PROTOTYPES */ + +/* Send a command to the flash controller, but does no pend on it... */ +static ADI_FEE_RESULT SendCommand (ADI_FEE_HANDLE const hDevice, uint32_t const cmd); + +/* generic transfer initiator... dispatches to InitiatePioTransfer() or InitiateDmaTransfer() */ +static ADI_FEE_RESULT InitiateTransfer (ADI_FEE_HANDLE const hDevice); + +/* PIO initiator */ +static ADI_FEE_RESULT InitiatePioTransfer (ADI_FEE_HANDLE const hDevice); + +/* DMA initiator */ +static ADI_FEE_RESULT InitiateDmaTransfer (ADI_FEE_HANDLE const hDevice); + +/* interrupt handlers */ +void Flash0_Int_Handler(void); +void DMA_FLASH0_Int_Handler (void); + +/* INTERNAL DRIVER DATATYPES */ + +/* + ***************************************************************************** + * FEE Configuration structure. + *****************************************************************************/ +typedef struct __ADI_FEE_CONFIG { + uint32_t eccIrqEnables; /* ECC interrupt enables. */ + uint32_t param0; /* TIME_PARAM0 register. */ + uint32_t param1; /* TIME_PARAM1 register. */ + uint32_t abortEnableLo; /* Lower interrupt abort enables (IRQs 0-31). */ + uint32_t abortEnableHi; /* Upper interrupt abort enables (IRQs 32-63.) */ + uint32_t eccConfig; /* ECC_CFG register. */ +} ADI_FEE_CONFIG; + + +/* Flash physical device instance data */ +typedef struct __ADI_FEE_DEVICE_INFO { + + ADI_FLCC_TypeDef *pDev; /* Pointer to the physical controller. */ + IRQn_Type pioIrqNum; /* The flash controller PIO interrupt number. */ + IRQn_Type dmaIrqNum; /* The flash controller DMA interrupt number. */ + DMA_CHANn_TypeDef dmaChanNum; /* The flash controller DMA channel number. */ + ADI_FEE_CONFIG *pConfig; /* Pointer to user config info. */ + ADI_FEE_HANDLE hDevice; /* Pointer the device memory (supplied by the application). */ + +} ADI_FEE_DEVICE_INFO; + + +/* Flash driver instance data structure */ +typedef struct __ADI_FEE_DEV_DATA_TYPE { + + /* make sure to synchronize ANY size changes with ADI_FLASH_MEMORY_SIZE macro in adi_flash.h */ + + /* NOTE: "volatile" storage class on all interrupt-modified valuables */ + + /* device attributes */ + ADI_FLCC_TypeDef *pDev; /* Pointer top physical flash controller. */ + ADI_FEE_DEVICE_INFO *pDevInfo; /* Pointer to hardware device attributes. */ + + /* callback info */ + ADI_CALLBACK pfCallback; /* Registered callback function address. */ + void *pCBParam; /* Registered callback user parameter. */ + + /* internal driver state variables */ + bool bUseDma; /* DMA control flag (from user). */ + bool bSubmitCalled; /* Flag to identify if a buffer was "submitted". */ + volatile uint32_t FlashStatusCopy; /* Clop of latest flash status register. */ + volatile uint32_t feeError; /* Flash error collector. */ + volatile ADI_FEE_RESULT dmaError; /* DMA error collector. */ + volatile bool bTransferInProgress; /* Flag indicating if a transfer is in progress. */ + + /* data info */ + volatile uint32_t *pNextWriteAddress; /* Pointer to next write data in flash space. */ + volatile uint32_t *pNextReadAddress; /* Pointer to next read data in user buffer. */ + volatile uint32_t nRemainingBytes; /* Number of remaining bytes still to transfer. */ + + SEM_VAR_DECLR /* Blocking object: "Semaphore" for rtos, "bLowPowerExitFlag" for non-rtos. */ + +} ADI_FEE_DEV_DATA_TYPE; + +/*! \endcond */ + +#endif /* ADI_FLASH_DEF_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/gpio/adi_gpio.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/gpio/adi_gpio.c new file mode 100755 index 0000000000..3725f72ead --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/gpio/adi_gpio.c @@ -0,0 +1,975 @@ +/* + ***************************************************************************** + @file: adi_gpio.c + @brief: GPIO device driver implementation. + ----------------------------------------------------------------------------- + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +/*****************************************************************************/ + +#include +#include +#include +#include +#include +#include "adi_gpio_def.h" + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm123 (rule 8.5): there shall be no definition of objects or functions in a header file +* This isn't a header as such. +* +* Pm073 (rule 14.7): a function should have a single point of exit +* Pm143 (rule 14.7): a function should have a single point of exit at the end of the function +* Multiple returns are used for error handling. +* +* Pm140 (rule 11.3): a cast should not be performed between a pointer type and an integral type +* The rule makes an exception for memory-mapped register accesses. +*/ +#pragma diag_suppress=Pm123,Pm073,Pm143,Pm140 +#endif /* __ICCARM__ */ + +/* Debug function declarations */ +#ifdef ADI_DEBUG +static bool ArePinsValid (const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins); /*!< tests for pins validity */ +#endif /* ADI_DEBUG */ + + +static void CommonInterruptHandler (const ADI_GPIO_IRQ_INDEX index, const IRQn_Type eIrq); +void GPIO_A_Int_Handler(void); +void GPIO_B_Int_Handler(void); + +/*========== D A T A ==========*/ +static ADI_GPIO_DRIVER adi_gpio_Device = +{ + { + pADI_GPIO0, /* port 0 base address */ + pADI_GPIO1, /* port 1 base address */ + pADI_GPIO2, /* port 2 base address */ + pADI_GPIO3, /* port 3 base address */ + }, + + NULL +}; +/*! \endcond */ + +/*! \addtogroup GPIO_Driver GPIO Driver + * @{ + + @brief GPIO port and pin identifiers + @note The application must include drivers/gpio/adi_gpio.h to use this driver + @details The documented macros can be passed to the following functions: + - adi_gpio_OutputEnable() + - adi_gpio_PullUpEnable() + - adi_gpio_SetHigh() + - adi_gpio_SetLow() + - adi_gpio_Toggle() + - adi_gpio_SetData() + - adi_gpio_GetData() + + To control a single GPIO, these macros can be passed to the functions one + at a time. For example, to set the GPIO on port 2, pin 4 to a logical high + level, the following is used: + +
+      adi_gpio_SetHigh(ADI_GPIO_PORT2, ADI_GPIO_PIN_4)
+      
+ + Multiple GPIOs, so long as they reside on the same port, can be controlled + simultaneously. These macros can be OR-ed together and passed to the + functions. For example, to set the GPIOs on port 2, pins 3, 4 and 7 to + a logical low level, the following is used: + +
+      adi_gpio_SetLow(ADI_GPIO_PORT2, ADI_GPIO_PIN_3 | ADI_GPIO_PIN_4 | ADI_GPIO_PIN_7)
+      
+ + For the sensing, or adi_gpio_Getxxx, functions, the passed pValue parameter is written with + a packed value containing the status of the requested GPIO pins on the given port. + + If information is required for a single pin, return value can be directly used + For example to see if pin 4 on port 2 has the pull up enabled, the following is used: + adi_gpio_GetData(ADI_GPIO_PORT2, ADI_GPIO_PIN_4, &pValue) + pValue will contain the required information. + + If information is required for multiple pins, following method is required: +
+        adi_gpio_GetData(ADI_GPIO_PORT2, (ADI_GPIO_PIN_3 | ADI_GPIO_PIN_4 | ADI_GPIO_PIN_7), &pValue)
+      
+ To test if pin 4 on port 2 has pull up enabled, the following is used: +
+        if   (pValue & ADI_GPIO_PIN_4) {
+                    the pull up is enabled for pin 4 on port 2
+        } else {
+                    the pull up is disabled for pin 4 on port 2
+        }
+      
+ + */ + +/*! + @brief Initializes the GPIO functions. + + @details This function initializes the GPIO driver. This function should be called before calling any of the GPIO + driver APIs. + + @param[in] pMemory Pointer to the memory required for the driver to operate. + The size of the memory should be at least #ADI_GPIO_MEMORY_SIZE bytes. + + @param[in] MemorySize Size of the memory (in bytes) passed in pMemory parameter. + + @return Status + - ADI_GPIO_SUCCESS If successfully initialized the GPIO driver. + - ADI_GPIO_NULL_PARAMETER [D] If the given pointer to the driver memory is pointing to NULL. + - ADI_GPIO_INVALID_MEMORY_SIZE [D] If the given memory size is not sufficient to operate the driver. + + @note This function clears memory reserved for managing the callback function when it is called + for the first time. It is expected from user to call "adi_gpio_UnInit" function when the GPIO service is no longer required. + + @sa adi_gpio_UnInit +*/ +ADI_GPIO_RESULT adi_gpio_Init( + void* const pMemory, + uint32_t const MemorySize +) +{ + +#ifdef ADI_DEBUG + /* Verify the given memory pointer */ + if(NULL == pMemory) + { + return ADI_GPIO_NULL_PARAMETER; + } + /* Check if the memory size is sufficient to operate the driver */ + if(MemorySize < ADI_GPIO_MEMORY_SIZE) + { + return ADI_GPIO_INVALID_MEMORY_SIZE; + } + assert(ADI_GPIO_MEMORY_SIZE == sizeof(ADI_GPIO_DEV_DATA)); +#endif + + /* Only initialize on 1st init call, i.e., preserve callbacks on multiple inits */ + if (NULL == adi_gpio_Device.pData) + { + uint32_t i; + + adi_gpio_Device.pData = (ADI_GPIO_DEV_DATA*)pMemory; + + /* Initialize the callback table */ + for (i = 0u; i < ADI_GPIO_NUM_INTERRUPTS; i++) + { + adi_gpio_Device.pData->CallbackTable[i].pfCallback = NULL; + adi_gpio_Device.pData->CallbackTable[i].pCBParam = NULL; + } + + /* Enable the group interrupts */ + NVIC_EnableIRQ(SYS_GPIO_INTA_IRQn); + NVIC_EnableIRQ(SYS_GPIO_INTB_IRQn); + } + + return (ADI_GPIO_SUCCESS); +} + + +/*! + @brief Un-initialize the GPIO driver. + + @details Terminates the GPIO functions, leaving everything unchanged. + + @return Status + - #ADI_GPIO_SUCCESS if successfully uninitialized + - #ADI_GPIO_NOT_INITIALIZED [D] if not yet initialized + + @sa adi_gpio_Init +*/ +ADI_GPIO_RESULT adi_gpio_UnInit(void) +{ + +#ifdef ADI_DEBUG + /* IF (not initialized) */ + if (NULL == adi_gpio_Device.pData) + { + /* return error if not initialized */ + return (ADI_GPIO_NOT_INITIALIZED); + } +#endif + + /* Clear the data pointer */ + adi_gpio_Device.pData = NULL; + + return (ADI_GPIO_SUCCESS); +} + + +/*! + @brief Group the pins for the given group interrupt. + + @details Group the given pins for the Group A/B interrupt. + Applications can register/unregister a callback using the #adi_gpio_RegisterCallback API + to get a notification when the group interrupt occurs. + + @param[in] Port GPIO port number to be operated on. + @param[in] eIrq Interrupt (Group A/B) to which the pin(s) are to be grouped. + @param[in] Pins The GPIO pins which needs to be grouped. + Pin bits that are set enable the interrupt for the group A/B. + Pin bits that are clear disable the interrupt for the group A/B. + @return Status + - #ADI_GPIO_SUCCESS If successfully grouped the given pins. + - #ADI_GPIO_NOT_INITIALIZED [D] If GPIO driver is not yet initialized. + - #ADI_GPIO_INVALID_PINS [D] The given pins are invalid. + + @sa adi_gpio_RegisterCallback + @sa adi_gpio_SetGroupInterruptPolarity +*/ +ADI_GPIO_RESULT adi_gpio_SetGroupInterruptPins(const ADI_GPIO_PORT Port, const ADI_GPIO_IRQ eIrq, const ADI_GPIO_DATA Pins) +{ + ADI_GPIO_TypeDef *pPort; /* pointer to port registers */ + ADI_INT_STATUS_ALLOC(); +#ifdef ADI_DEBUG + /* make sure we're initialized */ + if (NULL == adi_gpio_Device.pData) + { + return (ADI_GPIO_NOT_INITIALIZED); + } + + /* validate the pins */ + if (!ArePinsValid(Port, Pins)) + { + return (ADI_GPIO_INVALID_PINS); + } +#endif + + pPort = adi_gpio_Device.pReg[Port]; + + ADI_ENTER_CRITICAL_REGION(); + switch (eIrq) + { + case SYS_GPIO_INTA_IRQn: + pPort->IENA = Pins; + break; + case SYS_GPIO_INTB_IRQn: + pPort->IENB = Pins; + break; + default: + break; /* This shall never reach */ + } + ADI_EXIT_CRITICAL_REGION(); + + return (ADI_GPIO_SUCCESS); +} + + +/*! + @brief Set the interrupt polarity for the given pins. + + @details Sets the interrupt polarity for the given pins for the given port. + When the corresponding bit is set an interrupt is generated when the pin transitions from low-to-high. When the corresponding bit is cleared an interrupt is generated when the pin transitions from high-to-low. + + @param[in] Port GPIO port number to be operated on. + @param[in] Pins Pins whose polarity to be set. + + @return Status + - #ADI_GPIO_SUCCESS If successfully set the polarity. + - #ADI_GPIO_NOT_INITIALIZED [D] If not yet initialized. + - #ADI_GPIO_INVALID_PINS [D] If the given pins are invalid. + + @sa adi_gpio_RegisterCallback + @sa adi_gpio_SetGroupInterruptPins +*/ +ADI_GPIO_RESULT adi_gpio_SetGroupInterruptPolarity(const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins) +{ + ADI_GPIO_TypeDef *pPort; /* pointer to port registers */ + +#ifdef ADI_DEBUG + /* make sure we're initialized */ + if (NULL == adi_gpio_Device.pData) + { + return (ADI_GPIO_NOT_INITIALIZED); + } + + /* validate the pins */ + if (!ArePinsValid(Port, Pins)) + { + return (ADI_GPIO_INVALID_PINS); + } +#endif + + pPort = adi_gpio_Device.pReg[Port]; + + pPort->POL = Pins; + + return (ADI_GPIO_SUCCESS); +} + + +/*! + @brief Enables/Disables the Output Drivers for GPIO Pin(s) + + @details Enables/disables the output drivers for the given GPIO pin(s) on + the given port. + + @param[in] Port The GPIO port to be configured. + @param[in] Pins One or more GPIO pins to be configured. GPIO + pins can be passed one at a time or in combination. To + configure a single GPIO pin, a single GPIO value is + passed for this parameter. For example, #ADI_GPIO_PIN_4. + Alternatively, multiple GPIO pins can be configured + simultaneously by OR-ing together GPIO pin values and + passing the resulting value for this parameter. For + example, #ADI_GPIO_PIN_0 | #ADI_GPIO_PIN_5 | #ADI_GPIO_PIN_6. + @param[in] bFlag Boolean value describing the action to be taken + - true enables the output driver + - false disables the output driver + + @return Status + - #ADI_GPIO_SUCCESS If successfully configured + - #ADI_GPIO_NOT_INITIALIZED [D] If GPIO driver not yet initialized. + - #ADI_GPIO_INVALID_PINS [D] If the given pins are invalid. +*/ +ADI_GPIO_RESULT adi_gpio_OutputEnable(const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins, const bool bFlag) +{ + + ADI_GPIO_TypeDef *pPort; /* pointer to port registers */ + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + /* make sure we're initialized */ + if (NULL == adi_gpio_Device.pData) + { + return (ADI_GPIO_NOT_INITIALIZED); + } + + /* validate the pins */ + if (!ArePinsValid(Port, Pins)) + { + return (ADI_GPIO_INVALID_PINS); + } +#endif + + pPort = adi_gpio_Device.pReg[Port]; + + ADI_ENTER_CRITICAL_REGION(); + if (bFlag) + { + /* enable output */ + pPort->OEN |= Pins; + } else + { + /* disable output */ + pPort->OEN &= (uint16_t)~Pins; + } + ADI_EXIT_CRITICAL_REGION(); + + return (ADI_GPIO_SUCCESS); +} + + +/*! + @brief Enables/Disables the Input Drivers for GPIO Pin(s) + + @details Enables/disables the input drivers for the given GPIO pin(s) on + the given port. + + @param[in] Port The GPIO port to be configured. + @param[in] Pins One or more GPIO pins to be configured. GPIO + pins can be passed one at a time or in combination. To + configure a single GPIO pin, a single GPIO value is + passed for this parameter. For example, #ADI_GPIO_PIN_4. + Alternatively, multiple GPIO pins can be configured + simultaneously by OR-ing together GPIO pin values and + passing the resulting value for this parameter. For + example, #ADI_GPIO_PIN_0 | #ADI_GPIO_PIN_5 | #ADI_GPIO_PIN_6. + + @param[in] bFlag Boolean value describing the action to be taken + - true enables the input driver + - false disables the input driver + + @return Status + - #ADI_GPIO_SUCCESS If successfully configured. + - #ADI_GPIO_NOT_INITIALIZED [D] If GPIO driver not yet initialized. + - #ADI_GPIO_INVALID_PINS [D] If the given pins are invalid. +*/ +ADI_GPIO_RESULT adi_gpio_InputEnable(const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins, const bool bFlag) +{ + + ADI_GPIO_TypeDef *pPort; /* pointer to port registers */ + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + /* make sure we're initialized */ + if (NULL == adi_gpio_Device.pData) { + return (ADI_GPIO_NOT_INITIALIZED); + } + + /* validate the pins */ + if (!ArePinsValid(Port, Pins)) { + return (ADI_GPIO_INVALID_PINS); + } +#endif + + pPort = adi_gpio_Device.pReg[Port]; + + ADI_ENTER_CRITICAL_REGION(); + if (bFlag) + { + /* enable input */ + pPort->IEN |= Pins; + } else + { + /* disable input */ + pPort->IEN &= (uint16_t)~Pins; + } + ADI_EXIT_CRITICAL_REGION(); + + return (ADI_GPIO_SUCCESS); +} + + +/*! + @brief Enables/Disables the Pull-Up for GPIO Pin(s) + + @details Enables/disables the internal pull-up for the given GPIO pin(s) on + the given port. API simply enables/disables whatever the hard-wired + pulls (up/down) are. + + @param[in] Port The GPIO port to be configured. + @param[in] Pins One or more GPIO pins to be configured. GPIO + pins can be passed one at a time or in combination. To + configure a single GPIO pin, a single GPIO value is + passed for this parameter. For example, #ADI_GPIO_PIN_4. + Alternatively, multiple GPIO pins can be configured + simultaneously by OR-ing together GPIO pin values and + passing the resulting value for this parameter. For + example, #ADI_GPIO_PIN_0 | #ADI_GPIO_PIN_5 | #ADI_GPIO_PIN_6. + @param[in] bFlag Boolean value describing the action to be taken + - true enables the pull-up + - false disables the pull-up + + @return Status + - #ADI_GPIO_SUCCESS If successfully configured. + - #ADI_GPIO_NOT_INITIALIZED [D] If GPIO driver not yet initialized. + - #ADI_GPIO_INVALID_PINS [D] If the given pins are invalid. +*/ +ADI_GPIO_RESULT adi_gpio_PullUpEnable(const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins, const bool bFlag) +{ + + ADI_GPIO_TypeDef *pPort; /* pointer to port registers */ + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + /* make sure we're initialized */ + if (NULL == adi_gpio_Device.pData) + { + return (ADI_GPIO_NOT_INITIALIZED); + } + + /* validate the pins */ + if (!ArePinsValid(Port, Pins)) + { + return (ADI_GPIO_INVALID_PINS); + } +#endif + + pPort = adi_gpio_Device.pReg[Port]; + + ADI_ENTER_CRITICAL_REGION(); + if (bFlag) + { + pPort->PE |= Pins; + } else + { + pPort->PE &= (uint16_t)(~Pins); + } + ADI_EXIT_CRITICAL_REGION(); + + return (ADI_GPIO_SUCCESS); +} + +/*! + + @brief Sets the Given GPIO pin(s) to a Logical High Level + + @details Sets the given GPIO pin(s) on the given port to a logical high + level. + + @param[in] Port GPIO port whose pins need to be set to logical high level. + @param[in] Pins One or more GPIO pins to be set to logical high. GPIO + pins can be passed one at a time or in combination. To + configure a single GPIO pin, a single GPIO value is + passed for this parameter. For example, #ADI_GPIO_PIN_4. + Alternatively, multiple GPIO pins can be configured + simultaneously by OR-ing together GPIO pin values and + passing the resulting value for this parameter. For + example, #ADI_GPIO_PIN_0 | #ADI_GPIO_PIN_5 | #ADI_GPIO_PIN_6. + + @return Status + - #ADI_GPIO_SUCCESS If successfully configured. + - #ADI_GPIO_NOT_INITIALIZED [D] If GPIO driver not yet initialized. + - #ADI_GPIO_INVALID_PINS [D] If the given pins are invalid. + + @sa adi_gpio_SetLow, adi_gpio_Toggle, adi_gpio_SetData, adi_gpio_GetData +*/ +ADI_GPIO_RESULT adi_gpio_SetHigh(const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins) +{ + + ADI_GPIO_TypeDef *pPort; /* pointer to port registers */ + +#ifdef ADI_DEBUG + /* make sure we're initialized */ + if (NULL == adi_gpio_Device.pData) + { + return (ADI_GPIO_NOT_INITIALIZED); + } + + /* validate the pins */ + if (!ArePinsValid(Port, Pins)) + { + return (ADI_GPIO_INVALID_PINS); + } +#endif + + pPort = adi_gpio_Device.pReg[Port]; + + /* set the given GPIOs high */ + pPort->SET = Pins; + + return (ADI_GPIO_SUCCESS); +} + + +/*! + + @brief Sets the Given GPIO pin(s) to a Logical Low Level + + @details Sets the given GPIO pin(s) on the given port to a logical low + level. + + @param[in] Port The GPIO port whose pins need to be set to logical low level. + @param[in] Pins One or more GPIO pins to be whose logic level to be set. GPIO + pins can be passed one at a time or in combination. To + configure a single GPIO pin, a single GPIO value is + passed for this parameter. For example, #ADI_GPIO_PIN_4. + Alternatively, multiple GPIO pins can be configured + simultaneously by OR-ing together GPIO pin values and + passing the resulting value for this parameter. For + example, #ADI_GPIO_PIN_0 | #ADI_GPIO_PIN_5 | #ADI_GPIO_PIN_6. + + @return Status + - #ADI_GPIO_SUCCESS If successfully configured. + - #ADI_GPIO_NOT_INITIALIZED [D] If GPIO driver not yet initialized. + - #ADI_GPIO_INVALID_PINS [D] If the given pins are invalid. + + @sa adi_gpio_SetHigh, adi_gpio_Toggle, adi_gpio_SetData, adi_gpio_GetData +*/ +ADI_GPIO_RESULT adi_gpio_SetLow(const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins) +{ + + ADI_GPIO_TypeDef *pPort; /* pointer to port registers */ + +#ifdef ADI_DEBUG + /* make sure we're initialized */ + if (NULL == adi_gpio_Device.pData) + { + return (ADI_GPIO_NOT_INITIALIZED); + } + + /* validate the pins */ + if (!ArePinsValid(Port, Pins)) + { + return (ADI_GPIO_INVALID_PINS); + } +#endif + + pPort = adi_gpio_Device.pReg[Port]; + + /* set the given GPIOs low */ + pPort->CLR = Pins; + + return (ADI_GPIO_SUCCESS); +} + + +/*! + + @brief Toggles the Logical Level of the Given GPIO pin(s) + + @details Toggles the logical level of the given GPIO pin(s) on the given port. + If a given GPIO pin is at a logical low level, this function will + change the level to a logical high value. If a given GPIO pin is + at a logical high level, this function will change the level to a + logical low value. + + @param[in] Port The GPIO port whose pins to be toggled. + @param[in] Pins The GPIO pins whose logic level to be toggled. GPIO + pins can be passed one at a time or in combination. To + configure a single GPIO pin, a single GPIO value is + passed for this parameter. For example, #ADI_GPIO_PIN_4. + Alternatively, multiple GPIO pins can be configured + simultaneously by OR-ing together GPIO pin values and + passing the resulting value for this parameter. For + example, #ADI_GPIO_PIN_0 | #ADI_GPIO_PIN_5 | #ADI_GPIO_PIN_6. + + @return Status + - #ADI_GPIO_SUCCESS If successfully configured. + - #ADI_GPIO_NOT_INITIALIZED [D] If GPIO driver not yet initialized. + - #ADI_GPIO_INVALID_PINS [D] If the given pins are invalid. + + @sa adi_gpio_SetHigh, adi_gpio_SetLow, adi_gpio_SetData, adi_gpio_GetData +*/ +ADI_GPIO_RESULT adi_gpio_Toggle(const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins) +{ + + ADI_GPIO_TypeDef *pPort; /* pointer to port registers */ + +#ifdef ADI_DEBUG + /* make sure we're initialized */ + if (NULL == adi_gpio_Device.pData) + { + return (ADI_GPIO_NOT_INITIALIZED); + } + + /* validate the pins */ + if (!ArePinsValid(Port, Pins)) + { + return (ADI_GPIO_INVALID_PINS); + } +#endif + + pPort = adi_gpio_Device.pReg[Port]; + + /* toggle the given GPIOs */ + pPort->TGL = Pins; + + return (ADI_GPIO_SUCCESS); +} + + +/*! + + @brief Sets the logic level of all GPIO pins on the given port to + a given logic level. + + @details Sets the logic level of all the GPIO pins on the given port to the + given value. + + @param[in] Port The GPIO port whose pins logic level to be set. + @param[in] Pins The GPIO pins whose logic level to be set high. All other + GPIO pins on the port will be set to a logical low level. + For example, to set pins 0 and 1 to a logical high level and + all other pins to a logical low level, this parameter should + be passed as #ADI_GPIO_PIN_0 | #ADI_GPIO_PIN_1. + + @return Status + - #ADI_GPIO_SUCCESS If successfully set the given data. + - #ADI_GPIO_NOT_INITIALIZED [D] If GPIO driver not yet initialized. + - #ADI_GPIO_INVALID_PINS [D] If the given pins are invalid. + + @sa adi_gpio_SetHigh, adi_gpio_SetLow, adi_gpio_Toggle, adi_gpio_GetData +*/ +ADI_GPIO_RESULT adi_gpio_SetData(const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins) +{ + + ADI_GPIO_TypeDef *pPort; /* pointer to port registers */ + +#ifdef ADI_DEBUG + /* make sure we're initialized */ + if (NULL == adi_gpio_Device.pData) + { + return (ADI_GPIO_NOT_INITIALIZED); + } + + /* validate the pins */ + if (!ArePinsValid(Port, Pins)) + { + return (ADI_GPIO_INVALID_PINS); + } +#endif + + pPort = adi_gpio_Device.pReg[Port]; + + /* set the GPIOs as directed */ + pPort->OUT = Pins; + + return (ADI_GPIO_SUCCESS); +} + + +/*! + @brief Gets/Senses the input level of all GPIO Pins on the given port. + + @details Gets the level of all GPIO input pins on the given port. + + @param[in] Port The GPIO port whose input level to be sensed. + @param[in] Pins The GPIO pins to be sensed. To sense a single GPIO pin, a single + GPIO value is passed for this parameter. For example, #ADI_GPIO_PIN_4. + Alternatively, multiple GPIO pins can be configured + simultaneously by OR-ing together GPIO pin values and + passing the resulting value for this parameter. For + example, #ADI_GPIO_PIN_0 | #ADI_GPIO_PIN_5 | #ADI_GPIO_PIN_6. + @param[out] pValue The passed pValue parameter is written with a packed value containing + the status of all the requested GPIO pins on the given port. + + To get the status of a single GPIO pin, return value can be directly used. + For example to see if pin 4 on port 2 is a logical high level, the following is used: +
+        adi_gpio_GetData(#ADI_GPIO_PORT2, #ADI_GPIO_PIN_4, &pValue)
+    
+ pValue will contain the required information. + + If information is required for multiple pins, following method is required: +
+        adi_gpio_GetData(#ADI_GPIO_PORT2, (#ADI_GPIO_PIN_3 | #ADI_GPIO_PIN_4 | #ADI_GPIO_PIN_7), &pValue)
+    
+ + To test if pin 4 on port 2 is a logical high level, the following is used: +
+        if  (pValue & ADI_GPIO_PIN_4) {
+            pin 4 on port 2 is a logical high value
+        } else {
+            pin 4 on port 2 is a logical low value
+        }
+    
+ + @return Status + - #ADI_GPIO_SUCCESS If successfully sensed the input pins. + - #ADI_GPIO_NOT_INITIALIZED [D] If GPIO driver not yet initialized. + - #ADI_GPIO_INVALID_PINS [D] If the given pins are invalid. + + @sa adi_gpio_SetHigh, adi_gpio_SetLow, adi_gpio_Toggle, adi_gpio_SetData +*/ +ADI_GPIO_RESULT adi_gpio_GetData (const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins, uint16_t* const pValue) +{ + + ADI_GPIO_TypeDef *pPort; /* pointer to port registers */ + +#ifdef ADI_DEBUG + /* make sure we're initialized */ + if (NULL == adi_gpio_Device.pData) + { + return (ADI_GPIO_NOT_INITIALIZED); + } + + /* validate the pins */ + if (!ArePinsValid(Port, Pins)) + { + return (ADI_GPIO_INVALID_PINS); + } +#endif + + pPort = adi_gpio_Device.pReg[Port]; + + /* return the status of the GPIOs */ + *pValue = (pPort->IN) & Pins; + + return (ADI_GPIO_SUCCESS); +} + + +/*! + @brief Register or unregister an application callback function for group (A/B) interrupts. + + @details Applications may register a callback function that will be called when a + GPIO group (A/B) interrupt occurs. + + The driver dispatches calls to registered callback functions when the + properly configured pin(s) latches an external interrupt input on the GPIO + pin(s). The callback is dispatched with the following parameters, respectively: + - application-provided callback parameter (\a pCBParam), + - The GPIO Port, + - The GPIO Pins. + + @param[in] eIrq The interrupt for which the callback is being registered. + @param[in] pfCallback Pointer to the callback function. This can be passed as NULL to + unregister the callback. + @param[in] pCBParam Callback parameter which will be passed back to the application + when the callback is called.. + + @return Status + - #ADI_GPIO_SUCCESS if successfully registered the callback. + - #ADI_GPIO_NOT_INITIALIZED [D] if not yet initialized + - #ADI_GPIO_INVALID_INTERRUPT [D] if interrupt ID is invalid + + @sa adi_gpio_SetGroupInterruptPolarity +*/ +ADI_GPIO_RESULT adi_gpio_RegisterCallback (const ADI_GPIO_IRQ eIrq, ADI_CALLBACK const pfCallback, void *const pCBParam ) +{ + uint16_t index = 0u; + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + /* make sure we're initialized */ + if (NULL == adi_gpio_Device.pData) + { + return (ADI_GPIO_NOT_INITIALIZED); + } +#endif + + index = (uint16_t)eIrq - (uint16_t)SYS_GPIO_INTA_IRQn + ADI_GPIO_IRQ_GROUPA_INDEX; + + ADI_ENTER_CRITICAL_REGION(); + + adi_gpio_Device.pData->CallbackTable[index].pfCallback = pfCallback; + adi_gpio_Device.pData->CallbackTable[index].pCBParam = pCBParam; + + ADI_EXIT_CRITICAL_REGION(); + + /* return the status */ + return (ADI_GPIO_SUCCESS); +} + + + +/*@}*/ + +/*! \cond PRIVATE */ +/* All of the following is excluded from the doxygen output... */ + +/* Common group (A/B) interrupt handler */ +static void CommonInterruptHandler(const ADI_GPIO_IRQ_INDEX index, const IRQn_Type eIrq) +{ + ADI_GPIO_PORT Port; + ADI_GPIO_TypeDef *pPort; + ADI_GPIO_DATA Pins; + ADI_GPIO_DATA nIntEnabledPins; + + ADI_GPIO_CALLBACK_INFO *pCallbackInfo = &adi_gpio_Device.pData->CallbackTable[index]; + + /* Loop over all the ports. */ + for(Port=ADI_GPIO_PORT0; PortIENA; + } + else /* Is the interrupt is for GROUP B */ + { + nIntEnabledPins = pPort->IENB; + } + + /* Clear only required interrupts */ + Pins = ((pPort->INT) & nIntEnabledPins); + pPort->INT = Pins; + + /* params list is: application-registered cbParam, Port number, and interrupt status */ + if((pCallbackInfo->pfCallback != NULL) && (Pins != 0u)) + { + pCallbackInfo->pfCallback (pCallbackInfo->pCBParam, (uint32_t)Port, &Pins); + } + } +} + +/* Interrupt A handler */ +void GPIO_A_Int_Handler(void) +{ + ISR_PROLOG() + CommonInterruptHandler(ADI_GPIO_IRQ_GROUPA_INDEX, SYS_GPIO_INTA_IRQn); + ISR_EPILOG() +} + +/* Interrupt B handler */ +void GPIO_B_Int_Handler (void) +{ + ISR_PROLOG() + CommonInterruptHandler(ADI_GPIO_IRQ_GROUPB_INDEX, SYS_GPIO_INTB_IRQn); + ISR_EPILOG() +} + +#ifdef ADI_DEBUG + + +/*! + @brief Tests a Pins Parameter for Validity + + @details A debug function that checks a Pins parameter for validity + + @param[in] Pins Logical OR-ing of one or more ADI_GPIO_PIN_x values + + @return Status + - true the Pins value contains valid data + - false the Pins value contains invalid data +*/ +static bool ArePinsValid(const ADI_GPIO_PORT Port, const ADI_GPIO_DATA Pins) +{ + uint32_t PinValid = 0u; + + /* test for a valid pin */ + switch (Port) + { + case ADI_GPIO_PORT0: + PinValid = ~ADI_GPIO_PORT0_PIN_AVL & Pins; + break; + + case ADI_GPIO_PORT1: + PinValid = ~ADI_GPIO_PORT1_PIN_AVL & Pins; + break; + + case ADI_GPIO_PORT2: + PinValid = ~ADI_GPIO_PORT2_PIN_AVL & Pins; + break; + + case ADI_GPIO_PORT3: + PinValid = ~ADI_GPIO_PORT3_PIN_AVL & Pins; + break; + + default: + break; + } + + if (PinValid == 0u) + { + return true; + } + else + { + return false; + } +} +#endif /* ADI_DEBUG */ + +/*! \endcond */ + +/* +** EOF +*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/gpio/adi_gpio_def.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/gpio/adi_gpio_def.h new file mode 100755 index 0000000000..90282625df --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/gpio/adi_gpio_def.h @@ -0,0 +1,94 @@ +/*! + ***************************************************************************** + * @file: adi_gpio_def.h + * @brief: GPIO Device Driver definition + ***************************************************************************** +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ +#ifndef ADI_GPIO_DEF_H +#define ADI_GPIO_DEF_H +/*! \cond PRIVATE */ + + +/*! local enum for callback table indexing */ +typedef enum +{ + /* Group interrupts */ + ADI_GPIO_IRQ_GROUPA_INDEX = (0x0), /*!< GroupA interrupt index. */ + ADI_GPIO_IRQ_GROUPB_INDEX = (0x1), /*!< GroupB interrupt index. */ + + ADI_GPIO_NUM_INTERRUPTS = (0x2), /*!< Number of GPIO interrupts */ + +} ADI_GPIO_IRQ_INDEX; + + +/*! Structure to hold callback function and parameter */ +typedef struct _ADI_GPIO_CALLBACK_INFO +{ + ADI_CALLBACK pfCallback; /*!< Callback function pointer */ + void *pCBParam; /*!< Callback parameter */ +} ADI_GPIO_CALLBACK_INFO; + +/*! Structure to hold callback function and parameter */ +typedef struct _ADI_GPIO_DEV_DATA +{ + ADI_GPIO_CALLBACK_INFO CallbackTable[ADI_GPIO_NUM_INTERRUPTS]; /*!< Callback Info for External interrupts */ +} ADI_GPIO_DEV_DATA; + +/*! \struct ADI_GPIO_DEVICE + + GPIO instance data + + This structure contains the "state" information for the + instance of the device. For GPIO there is only one + of these objects. +*/ +typedef struct _ADI_GPIO_DRIVER_STRUCT +{ + ADI_GPIO_TypeDef *pReg[ADI_GPIO_NUM_PORTS]; /*!< GPIO Ports Register base */ + ADI_GPIO_DEV_DATA *pData; /*!< Pointer to device data */ +} ADI_GPIO_DRIVER_STRUCT; + + +/* alias for the actual device structure */ +typedef ADI_GPIO_DRIVER_STRUCT ADI_GPIO_DRIVER; + +/*! \endcond */ +#endif /* ADI_GPIO_DEF_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/i2c/adi_i2c.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/i2c/adi_i2c.c new file mode 100755 index 0000000000..cb8dba8001 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/i2c/adi_i2c.c @@ -0,0 +1,1169 @@ +/*! ***************************************************************************** + * @file: adi_i2c.c + * @brief: I2C device driver global file. + * @details: This a global file which includes a specific file based on the processor family. + * This file contains the I2C device driver functions. + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +/** @addtogroup I2C_Driver I2C Driver + * @{ + * @brief Inter-Integrated Circuit (I2C) Driver + * @details The I2C Master device driver manages the on-chip I2C hardware to + * control the external two-wire I2C Bus interface, allowing communication with + * multiple I2C slave devices through the I2C slave device addressing scheme. + * @note The application must include drivers/i2c/adi_i2c.h to use this driver + */ + + /*! \cond PRIVATE */ +#include +#include +#include /* for "memset" */ +/*! \endcond */ + +#include +#include + + /*! \cond PRIVATE */ + +#include + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* +* Pm011 (rule 6.3): Types which specify sign and size should be used +* We use bool which is accepted by MISRA but the toolchain does not accept it +* +* Pm123 (rule 8.5): there shall be no definition of objects or functions in a header file +* It is used in the _data.h file which isn't a header as such. +* +* Pm073 (rule 14.7): a function should have a single point of exit +* Pm143 (rule 14.7): a function should have a single point of exit at the end of the function +* Multiple returns are used for error handling. +* +* Pm088 (rule 17.4): pointer arithmetic should not be used. +* Relying on pointer arithmetic for buffer handling. +* +* Pm140 (rule 11.3): a cast should not be performed between a pointer type and an integral type +* The rule makes an exception for memory-mapped register accesses. +*/ + +#pragma diag_suppress=Pm011,Pm123,Pm073,Pm143,Pm088,Pm140 +#endif /* __ICCARM__ */ + +/* pull in internal data structures */ +#include "adi_i2c_data.c" + + +/* handy type-safe zero */ +uint16_t uZero16 = 0u; + +/* central busy checker */ +#define I2C_BUSY (uZero16 != ((hDevice->pDev->MSTAT) & (uint16_t)(BITM_I2C_MSTAT_MBUSY | BITM_I2C_MSTAT_LINEBUSY))) + +/*! + * Read/write bit. + */ + #define READ_NOT_WRITE (1u) + +/* Override "weak" default binding in startup.c */ +/*! \cond PRIVATE */ +extern void I2C0_Master_Int_Handler(void); +/*! \endcond */ + +#if defined(ADI_DEBUG) +/* + * Verifies a pointer to a driver points to one of the driver + * struct's internal to this file. + */ +static bool IsDeviceHandle(ADI_I2C_HANDLE const hDevice); +static bool IsDeviceHandle(ADI_I2C_HANDLE const hDevice) +{ + if ((i2c_device_info[0].hDevice != (hDevice)) && ((hDevice)->pDevInfo->hDevice != NULL)) { + return true; + } else { + return false; + } +} +#endif + + +/*! \endcond */ + + +/**********************************************************************************\ +|**********************************USER INTERFACE**********************************| +\**********************************************************************************/ + + +/*! + * @brief Initialize and allocate an I2C device for use in Master Mode. + * + * @param[in] DeviceNum Zero-based device index designating the I2C device to initialize. + * + * @param [in] pMemory Pointer to a 32-bit aligned buffer of size ADI_I2C_MEMORY_SIZE + * required by the driver for the operation of specified I2C device. + * + * @param [in] MemorySize Size of the buffer to which "pMemory" points. + * + * @param[out] phDevice The caller's device handle pointer for storing the initialized + * device instance data pointer. + * + * @return Status + * - #ADI_I2C_SUCCESS Call completed successfully. + * - #ADI_I2C_BAD_DEVICE_NUMBER [D] Invalid device index. + * - #ADI_I2C_DEVICE_IN_USE [D] Device is already opened. + * - #ADI_I2C_INSUFFICIENT_MEMORY [D] Device memory is not sufficient. + * + * Initialize an I2C device using default user configuration settings (from adi_i2c_config.h) + * and allocate the device for use. Device is opened in Master mode only. + * + * No other I2C APIs may be called until the device open function is called. The returned + * device handle is required to be passed to all subsequent I2C API calls to identify the + * physical device instance to use. The user device handle (pointed to by phDevice) is set + * to NULL on failure. + * + * @note Currently, only a singular I2C physical device instance (device ID "0") exists. + * + * @sa adi_spi_Close(). + */ +ADI_I2C_RESULT adi_i2c_Open (uint32_t const DeviceNum, void* const pMemory, uint32_t const MemorySize, ADI_I2C_HANDLE* const phDevice) { + + /* make a device handle out of the user memory */ + ADI_I2C_HANDLE hDevice = (ADI_I2C_HANDLE)pMemory; + +#if defined(ADI_DEBUG) + /* check requested device number */ + if (DeviceNum >= (uint32_t)ADI_I2C_NUM_INSTANCES) { + return ADI_I2C_BAD_DEVICE_NUMBER; + } + + /* verify device is not already open */ + if (i2c_device_info[DeviceNum].hDevice != NULL) { + return ADI_I2C_DEVICE_IN_USE; + } + + /* verify memory size macro value */ + assert(ADI_I2C_MEMORY_SIZE == sizeof(ADI_I2C_DEV_DATA_TYPE)); + + /* verify user-provided memory meets requirement */ + if ((NULL == pMemory) || (MemorySize < (uint32_t)ADI_I2C_MEMORY_SIZE)) { + return ADI_I2C_INSUFFICIENT_MEMORY; + } +#endif + + /* store a bad handle in case of failure */ + *phDevice = NULL; + + /* + * Link user memory (handle) to ADI_I2C_DEVICE_INFO data structure. + * + * ADI_I2C_DEVICE_INFO <==> ADI_I2C_HANDLE + * + * Clear the ADI_I2C_HANDLE memory. This also sets all bool + * structure members to false so we do not need to waste cycles + * setting these explicitly (e.g. hDevice->bRepearStart = false) + */ + i2c_device_info[DeviceNum].hDevice = (ADI_I2C_DEV_DATA_TYPE *)pMemory; + memset(pMemory, 0, MemorySize); + + /* also link device handle within __ADI_I2C_DEV_DATA_TYPE data structure */ + hDevice->pDevInfo = &i2c_device_info[DeviceNum]; + /* + * Although the ADI_I2C_DEVICE_INFO struct has the physical device pointer + * for this instance, copying it to the ADI_I2C_HANDLE struct (in user memory) + * will minimize the runtime footprint and cycle count when accessing the I2C + * registers. + */ + hDevice->pDev = i2c_device_info[DeviceNum].pDev; + + /* store a pointer to user's static configuration settings */ + hDevice->pDevInfo->pConfig = (ADI_I2C_CONFIG*)&gConfigInfo[DeviceNum]; + + /* create the semaphore */ + SEM_CREATE(hDevice, "i2c_sem", ADI_I2C_SEMAPHORE_FAILED) + ; + + /* reset the driver and HW state */ + ADI_I2C_RESULT ignore ADI_UNUSED_ATTRIBUTE = i2cReset(hDevice); + + /* store device handle into user handle */ + *phDevice = (ADI_I2C_HANDLE)hDevice; + + return ADI_I2C_SUCCESS; +} + + +/*! + * @brief Uninitialize and deallocate an I2C device. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * + * @return Status + * - #ADI_I2C_SUCCESS Call completed successfully. + * - #ADI_I2C_BAD_DEVICE_HANDLE [D] Invalid device handle parameter. + * + * Uninitialize and release an allocated I2C device, and memory associated with it + * for other use. + * + * @note The user memory is released from use by the I2C driver, but is not freed. + * + * @sa adi_spi_Open(). + */ +ADI_I2C_RESULT adi_i2c_Close (ADI_I2C_HANDLE const hDevice) { + +#ifdef ADI_DEBUG + if (IsDeviceHandle(hDevice)) { + return ADI_I2C_BAD_DEVICE_HANDLE; + } +#endif + + /* destroy semaphore */ + SEM_DELETE(hDevice,ADI_I2C_SEMAPHORE_FAILED) + ; + + /* reset the driver and HW state */ + ADI_I2C_RESULT ignore ADI_UNUSED_ATTRIBUTE = i2cReset(hDevice); + + /* stub handle */ + hDevice->pDevInfo->hDevice = NULL; + + return ADI_I2C_SUCCESS; +} + + +/*! + * @brief Blocking I2C Master-Mode data read/write API. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[in] pTransaction Pointer to I2C transaction data struct. + * @param[out] pHwErrors Pointer to hardware error return variable. + * + * @return Status + * - #ADI_I2C_SUCCESS Call completed successfully. + * - #ADI_I2C_BAD_DEVICE_HANDLE [D] Invalid device handle parameter. + * - #ADI_I2C_DEVICE_IN_USE [D] An I2C transaction is already underway. + * - #ADI_I2C_INVALID_PARAMETER [D] Invalid data pointer or count is detected. + * - #ADI_I2C_HW_ERROR_DETECTED A hardware error occurred, check \a pHwErrors. + * + * Request a blocking I2C data transfer (read or write, not both as I2C is unidirectional bus) + * with or without preceding prologue transmitted. Control is not returned to the calling + * application until the transfer is complete. Buffer allocations are made by the calling code + * (the application). + * + * The optional prologue (if present) and MANDATORY transaction data pointers are used to read or + * write data over the I2C serial bus according to the prologue and data pointers and corresponding + * size information contained in the \a pTransaction parameter block. The most recently set slave + * target address (set statically with user configuration settings contained in adi_i2c_config.h file + * or set dynamically (at run-time) via the #adi_i2c_SetSlaveAddress() API) is used to address the + * specific destination slave device on the I2C bus. + * + * If present, the prologue (typically, an addressing phase conveying a memory/register address or + * slave device command) is transmitted prior to the data read or write phase, with or without + * an intervening I2C STOP condition. The prologue data is entirely slave device dependent. + * + * In the case of a prologue followed by a data read operation, the I2C bus direction must be + * reversed following the prologue transmit. In this case, The usual I2C STOP condition following + * the prologue (if present) transmit may be suppressed by setting the \a bRepeatStart transaction + * parameter "true". In this case, a second (repeat) START condition is "transmitted" between the + * addressing phase (prologue transmit) and the data phase of the read sequence... \a without an + * intervening STOP condition. This is commonly referred to as the "combined format" in which the + * I2C bus direction is reversed halfway through the transaction without releasing control of the + * I2C bus arbitration. The REPEAT-START condition is a common I2C bus protocol required by many + * I2C slave devices. + * + * In the case of a prologue followed by a data write operation, there is no need to turn the bus + * around and so the \a bRepeatStart parameter is ignored. + * + * @note Application must check the return code to verify if any I2C Bus errors occurred. Hardware + * errors (I2C Protocol errors) are indicated with the #ADI_I2C_HW_ERROR_DETECTED return code, and + * the set of hardware errors (enum #ADI_I2C_HW_ERRORS) that occurred (there may be multiple) are + * indicated in the value set to user variable pointed to by \a pHwErrors. + * + * @sa adi_i2c_SetSlaveAddress(). + * @sa adi_i2c_SubmitBuffer(). + * @sa adi_i2c_IsBufferAvailable(). + * @sa adi_i2c_GetBuffer(). + * @sa ADI_I2C_TRANSACTION. + * @sa ADI_I2C_HW_ERRORS. + */ +ADI_I2C_RESULT adi_i2c_ReadWrite (ADI_I2C_HANDLE const hDevice, ADI_I2C_TRANSACTION* const pTransaction, uint32_t* const pHwErrors) { + +#ifdef ADI_DEBUG + if (IsDeviceHandle(hDevice)) { + return ADI_I2C_BAD_DEVICE_HANDLE; + } + if (I2C_BUSY) { + return ADI_I2C_DEVICE_IN_USE; + } + /* NULL transaction data pointer or zero transaction data count */ + if ((NULL == pTransaction->pData) || (0u == pTransaction->nDataSize)) { + return ADI_I2C_INVALID_PARAMETER; + } +#endif + + /* reset submit/get safeguard flag */ + hDevice->bSubmitCalled = false; + + /* submit/commence the transaction */ + submitTransaction(hDevice, pTransaction); + + /* block on internal transaction completion/error semaphore */ + if (ADI_I2C_SUCCESS == hDevice->result) { + + SEM_PEND(hDevice, ADI_I2C_SEMAPHORE_FAILED); + + /* completion interrupt comes as FIFO unloads, but serialization may not be complete yet... */ + /* must also wait for hardware busy status to clear before giving back control */ + /* i.e., allow any transmit serialization to complete after last FIFO unload */ + while (I2C_BUSY) { + ; + } + } + + /* copy out any hardware errors... */ + *pHwErrors = hDevice->hwErrors; + if (0u != hDevice->hwErrors) { + /* set the HW error return code */ + hDevice->result = ADI_I2C_HW_ERROR_DETECTED; + } + + /* return transaction result code */ + return hDevice->result; +} + + +/*! + * @brief Non-Blocking I2C Master-Mode data read or data write API. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[in] pTransaction Pointer to I2C transaction data struct. + * + * @return Status + * - #ADI_I2C_SUCCESS Call completed successfully. + * - #ADI_I2C_BAD_DEVICE_HANDLE [D] Invalid device handle parameter. + * - #ADI_I2C_DEVICE_IN_USE [D] An I2C transaction is already underway. + * - #ADI_I2C_INVALID_PARAMETER [D] Invalid data pointer or count is detected. + * + * Request a non-blocking I2C data transfer (read or write) with or without preceding prologue + * transmitted. Control is returned to the calling application immediately, allowing the application + * process other tasks. The transaction result code is retrieved by #adi_i2c_GetBuffer(). + * + * The application may optionally poll the I2C driver via the #adi_i2c_IsBufferAvailable() API while + * the transaction is underway to determine if and when the submitted transaction is complete. + * Eventually, the application \a MUST call the \a MANDATORY #adi_i2c_GetBuffer() API to obtain the + * transaction result and complete the transaction. Buffer allocations are made by the calling + * code (the application). + * + * The #adi_i2c_GetBuffer() API may be called at any time, even if the transaction is incomplete; + * the #adi_i2c_GetBuffer() call will simply block in incomplete transactions until the + * transaction does complete... at which point #adi_i2c_GetBuffer() returns control with + * the transaction result code. Submitting background transactions is useful if the application has + * housekeeping chores to perform when the I2C transaction is started, but later the application + * decides to just block until the transaction is complete. + * + * The prologue and data buffers are handled as they are in the blocking #adi_i2c_ReadWrite() call, + * it's just that the #adi_i2c_SubmitBuffer() API does not block on the data phase. + * + * @note The non-blocking #adi_i2c_SubmitBuffer() call \a REQUIRES a matching #adi_i2c_GetBuffer() call + * to obtain the final transaction result code and to inform the driver that the application wants to + * regain ownership of the buffers. The application should be prepared to wait for this ownership + * until the current transaction completes. The matching #adi_i2c_GetBuffer() call is required even if + * the transaction may have already completed. The #adi_i2c_GetBuffer() call allows the driver to block + * on completion or error events and then synchronize its internal blocking object. The intermediate + * #adi_i2c_IsBufferAvailable() API is optional.\n\n + * + * @note The #adi_i2c_SubmitBuffer() API is singular, i.e., only a single transaction may be submitted + * at a time. Simultaneous submits (e.g., ping-pong mode) are not supported by the I2C driver. + * + * @sa adi_i2c_ReadWrite(). + * @sa adi_i2c_SetSlaveAddress(). + * @sa adi_i2c_IsBufferAvailable(). + * @sa adi_i2c_GetBuffer(). + * @sa ADI_I2C_TRANSACTION. + */ +ADI_I2C_RESULT adi_i2c_SubmitBuffer (ADI_I2C_HANDLE const hDevice, ADI_I2C_TRANSACTION* const pTransaction) { + +#ifdef ADI_DEBUG + if (IsDeviceHandle(hDevice)) { + return ADI_I2C_BAD_DEVICE_HANDLE; + } + if (I2C_BUSY) { + return ADI_I2C_DEVICE_IN_USE; + } + /* NULL transaction data pointer or zero transaction data count */ + if ((NULL == pTransaction->pData) || (0u == pTransaction->nDataSize)) { + return ADI_I2C_INVALID_PARAMETER; + } +#endif + + /* set submit/get safeguard flag */ + hDevice->bSubmitCalled = true; + + /* submit/commence the transaction */ + submitTransaction(hDevice, pTransaction); + + /* no blocking on submit... just return the submit result */ + return hDevice->result; +} + + +/*! + * @brief Query if a non-blocking I2C transfer is complete. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[out] pbCompletionState Pointer to Boolean into which the I2C bus state is written. + * + * @return Status + * - #ADI_I2C_SUCCESS Call completed successfully. + * - #ADI_I2C_BAD_DEVICE_HANDLE [D] Invalid device handle parameter. + * - #ADI_I2C_INVALID_SUBMIT_API No matching submit call. + * + * Sets the application-provided Boolean variable pointed to by pbCompletionState either: + * - true, when the non-blocking transactions is complete, or + * - false, while the non-blocking transactions is still underway. + * + * This API is used in conjunction with a non-blocking #adi_i2c_SubmitBuffer() transfer to + * determine when the transaction is complete. Typically, non-blocking calls are used when the + * calling application has other work to do while I2C controller serializes data over the I2C bus, + * which is an interrupt-driven process. The transaction is submitted as a non-blocking call and + * the submitting API returns immediately, allowing the calling application to perform its other tasks. + * The I2C driver services the interrupts to transfer data while the application performs its + * other tasks. + * + * Non-blocking calls can be polled with this API for completion, or if the application has completed + * its other tasks and wants to just wait on the I2C completion without further polling, it may call + * the associated #adi_i2c_GetBuffer() API to convert the currently unblocked transaction to + * a blocking one. + * + * @note This API is inappropriate in context of blocking calls to #adi_i2c_ReadWrite(). + * + * @sa adi_i2c_ReadWrite(). + * @sa adi_i2c_SubmitBuffer(). + * @sa adi_i2c_GetBuffer(). + * @sa ADI_I2C_TRANSACTION. + */ +ADI_I2C_RESULT adi_i2c_IsBufferAvailable (ADI_I2C_HANDLE const hDevice, bool* const pbCompletionState) { + +#ifdef ADI_DEBUG + if (IsDeviceHandle(hDevice)) { + return ADI_I2C_BAD_DEVICE_HANDLE; + } +#endif + + /* fail if not a submit-based transaction */ + if (false == hDevice->bSubmitCalled) { + return ADI_I2C_INVALID_SUBMIT_API; + } + + /* return true when bus goes quiet */ + if (I2C_BUSY) { + *pbCompletionState = false; + } else { + *pbCompletionState = true; + } + + return ADI_I2C_SUCCESS; +} + + +/*! + * @brief Request ownership of a submitted buffer. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[out] pHwErrors Pointer to hardware error return variable. + * + * @return Status + * - #ADI_I2C_SUCCESS Call completed successfully. + * - #ADI_I2C_BAD_DEVICE_HANDLE [D] Invalid device handle parameter. + * - #ADI_I2C_INVALID_SUBMIT_API No matching submit call. + * - #ADI_I2C_HW_ERROR_DETECTED A hardware error occurred, check \a pHwErrors. + * + * This is a potentially blocking MANDATORY call that the application MUST use to reclaim + * ownership of any "submitted" transaction (submitted via a previous #adi_i2c_SubmitBuffer() + * call) and obtain the transaction success/failure result code. This API blocks until the + * transaction is complete and returns the transaction result code. If the transaction is + * already complete, the blocking is trivial and control is returned immediately. + * + * Non-blocking calls can also be (optionally) polled with the non-blocking + * #adi_i2c_IsBufferAvailable() API to see if and when the transaction is complete. + * + * The #adi_i2c_GetBuffer() call is a MANDATORY compliment to #adi_i2c_SubmitBuffer() and + * allows the I2C driver to synchronize its internal blocking object. + * + * @note Application must check the return code to verify if any I2C Bus errors occurred. Hardware + * errors (I2C Protocol errors) are indicated with the #ADI_I2C_HW_ERROR_DETECTED return code, and + * the set of hardware errors (enum #ADI_I2C_HW_ERRORS) that occurred (there may be multiple) are + * indicated in the value set to user variable pointed to by \a pHwErrors. + * + * @sa adi_i2c_ReadWrite(). + * @sa adi_i2c_SubmitBuffer(). + * @sa adi_i2c_IsBufferAvailable(). + * @sa ADI_I2C_TRANSACTION. + * @sa ADI_I2C_HW_ERRORS. + */ +ADI_I2C_RESULT adi_i2c_GetBuffer (ADI_I2C_HANDLE const hDevice, uint32_t* const pHwErrors) { + +#ifdef ADI_DEBUG + if (IsDeviceHandle(hDevice)) { + return ADI_I2C_BAD_DEVICE_HANDLE; + } +#endif + + /* fail if not a submit-based transaction */ + if (false == hDevice->bSubmitCalled) { + return ADI_I2C_INVALID_SUBMIT_API; + } + + /* block until complete or error interrupt sets the semaphore */ + SEM_PEND(hDevice, ADI_I2C_SEMAPHORE_FAILED); + + /* delay until bus goes quiet */ + while (I2C_BUSY) { + ; + } + + /* copy out any hardware errors... */ + *pHwErrors = hDevice->hwErrors; + if (0u != hDevice->hwErrors) { + /* set the HW error return code */ + hDevice->result = ADI_I2C_HW_ERROR_DETECTED; + } + + /* return transaction result code */ + return hDevice->result; +} + +/*! + * @brief Reset an I2C device and driver instance. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * + * @return Status + * - #ADI_I2C_SUCCESS Call completed successfully. + * - #ADI_I2C_BAD_DEVICE_HANDLE [D] Invalid device handle parameter. + * + * Reset the I2C physical controller and device driver internals. + */ +ADI_I2C_RESULT adi_i2c_Reset (ADI_I2C_HANDLE const hDevice) { + +#ifdef ADI_DEBUG + if (IsDeviceHandle(hDevice)) { + return ADI_I2C_BAD_DEVICE_HANDLE; + } +#endif + + /* destroy/recreate the semaphore to force a clear state */ + SEM_DELETE(hDevice, ADI_I2C_SEMAPHORE_FAILED) + ; + SEM_CREATE(hDevice, "i2c_sem", ADI_I2C_SEMAPHORE_FAILED) + ; + + /* reset the driver and HW state */ + return i2cReset(hDevice); +} + + +/*! + * @brief Set the I2C serial bus speed. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[in] requestedBitRate32 Requested I2C bus clock rate (in Hz). + * + * @return Status + * - #ADI_I2C_SUCCESS Call completed successfully. + * - #ADI_I2C_BAD_DEVICE_HANDLE [D] Invalid device handle parameter. + * - #ADI_I2C_DEVICE_IN_USE [D] Device is busy. + * - #ADI_I2C_BAD_SYS_CLOCK Failure to obtain the current PCLK rate. + * - #ADI_I2C_BAD_BITRATE Requested clock speed exceeds operational specification. + * + * Sets the I2C bus clock speed to the requested user parameter, \a requestedBitRate. + * + * @note Any I2C Bus clock rate may be requested up to and including the "FAST" mode I2C clock + * rate (400 kHz), including the "STANDARD" mode (100 kHz). Faster clock rates beyond "FAST" + * mode (e.g., "FAST+" or "HIGH-SPEED" modes) are not supported by the hardware. Slower clock + * rates below approximately 55 kHz (assuming a 26 MHz system clock) are physically unrealizable + * due to the fixed 8-bit field-width of the 8-bit I2C clock rate divide register.\n\n + * + * @note Default clock rate may be specified statically in the default user configuration file, + * "adi_i2c_config.h". + */ +ADI_I2C_RESULT adi_i2c_SetBitRate (ADI_I2C_HANDLE const hDevice, uint32_t const requestedBitRate32) { + + uint32_t clockFrequency32, halfClock32; + uint16_t halfClock16; + uint16_t highTime16, lowTime16; + +#ifdef ADI_DEBUG + if (IsDeviceHandle(hDevice)) { + return ADI_I2C_BAD_DEVICE_HANDLE; + } + if (I2C_BUSY) { + return ADI_I2C_DEVICE_IN_USE; + } +#endif + + /* get input clockrate from power service */ + if (ADI_PWR_SUCCESS != adi_pwr_GetClockFrequency(ADI_CLOCK_PCLK, &clockFrequency32)) { + return ADI_I2C_BAD_SYS_CLOCK; + } + + /* block requests above max rated 400kHz operation */ + if (ADI_I2C_MAX_RATE < requestedBitRate32) { + return ADI_I2C_BAD_BITRATE; + } + + /* compute half-cycle period in 32-bits (">>1" is divide by 2) */ + halfClock32 = (clockFrequency32 / requestedBitRate32) >> 1; /* HRM equation */ + + /* downcast to 16-bit to match destination field */ + halfClock16 = (uint16_t)(halfClock32 & 0x0000ffffu); + + /* check for lost precision in conversion */ + if (halfClock32 != halfClock16) { + return ADI_I2C_BAD_BITRATE; + } + + /* adjust high and low durations per HRM */ + highTime16 = halfClock16 - 7u; /* empirical: varies with board layout, pullups, etc */ + lowTime16 = halfClock16 - 1u; + + /* shift values into their clock rate divider register positions */ + highTime16 <<= BITP_I2C_DIV_HIGH; + lowTime16 <<= BITP_I2C_DIV_LOW; + + /* check for divider overflows beyond designated (8-bit) field masks */ + if ( (uZero16 != ((uint16_t)highTime16 & (uint16_t)(~(BITM_I2C_DIV_HIGH)))) + || + (uZero16 != ((uint16_t)lowTime16 & (uint16_t)(~(BITM_I2C_DIV_LOW)))) + ) { + return ADI_I2C_BAD_BITRATE; + } + + /* program new values */ + hDevice->pDev->DIV = highTime16 | lowTime16; + + return ADI_I2C_SUCCESS; +} + + +/*! + * @brief Set the I2C serial bus slave address. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[in] SlaveAddress New 7-bit address for targeting a slave device. + * + * @return Status + * - #ADI_I2C_SUCCESS Call completed successfully. + * - #ADI_I2C_BAD_DEVICE_HANDLE [D] Invalid device handle parameter. + * - #ADI_I2C_DEVICE_IN_USE [D] Device is busy. + * - #ADI_I2C_INVALID_SLAVE_ADDRESS Slave address exceeds the 7-bit limit. + * + * Sets the 7-bit (unformatted) slave address for which all subsequent I2C bus traffic is directed. + * Read/write address formatting is performed by the driver, depending on bus direction. + * + * @note This driver does not support the I2C 10-bit extended addressing scheme.\n\n + * + * @note Default slave address may be specified statically in the default user configuration file, + * "adi_i2c_config.h". + */ +ADI_I2C_RESULT adi_i2c_SetSlaveAddress (ADI_I2C_HANDLE const hDevice, uint16_t const SlaveAddress) { + +#ifdef ADI_DEBUG + if (IsDeviceHandle(hDevice)) { + return ADI_I2C_BAD_DEVICE_HANDLE; + } + if (I2C_BUSY) { + return ADI_I2C_DEVICE_IN_USE; + } +#endif + + /* verify no slave address bits fall outside the 7-bit addressing model (10-bit addressing not supported) */ + if (uZero16 != (SlaveAddress & (uint16_t)(~(BITM_I2C_ADDR1_VALUE >> 1)))) { + return ADI_I2C_INVALID_SLAVE_ADDRESS; + } + + /* save new address */ + hDevice->i2cDeviceAddress = SlaveAddress; + + return ADI_I2C_SUCCESS; +} + + +/*! + * @brief Transmit a General Call command to all slave devices on the I2C bus. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[in] pData Pointer to data buffer to transmit. + * @param[in] nDataSize Size of data buffer to transmit. + * @param[out] pHwErrors Pointer to hardware error return variable. + * + * @return Status + * - #ADI_I2C_SUCCESS Call completed successfully. + * - #ADI_I2C_BAD_DEVICE_HANDLE [D] Invalid device handle parameter. + * - #ADI_I2C_DEVICE_IN_USE [D] Device is busy. + * + * Broadcasts the given command buffer across the I2C bus to reserved General Call (GC) + * address (address zero). All, some, or none of the slave devices on the I2C bus will + * respond, depending on their capabilities. All responding slave devices will process + * the GC command according to their capabilities. + * + * The GC command is a blocking transaction. + * + * The application is responsible for formatting the GC command into the data buffer + * according to various Philips Semiconductor (now, NXP) documents, such as the 2014 + * Revision 6 document: "UM10204 I2C-Bus Specification and User Manual" + * (see www.nxp.com/documents/user_manual/UM10204.pdf). + * + * No prologue precedes the GC command data; the GC command data is transmitted verbatim. + * + * @note The currently active slave address is saved and restored when transmitting GC + * commands to the reserved GC address (address zero). + * + */ +ADI_I2C_RESULT adi_i2c_IssueGeneralCall (ADI_I2C_HANDLE const hDevice, uint8_t* const pData, uint8_t const nDataSize, uint32_t* const pHwErrors) { + + ADI_I2C_RESULT result; + ADI_I2C_TRANSACTION xfr; + +#ifdef ADI_DEBUG + if (IsDeviceHandle(hDevice)) { + return ADI_I2C_BAD_DEVICE_HANDLE; + } + if (I2C_BUSY) { + return ADI_I2C_DEVICE_IN_USE; + } +#endif + + /* force general call reserved target address of zero */ + uint16_t savedSlaveAddress = hDevice->i2cDeviceAddress; + hDevice->i2cDeviceAddress = 0u; + + /* setup the transfer */ + xfr.pPrologue = NULL; + xfr.nPrologueSize = 0u; + xfr.pData = pData; + xfr.nDataSize = nDataSize; + xfr.bReadNotWrite = false; + xfr.bRepeatStart = false; + + /* dispatch as a blocking transmit call */ + result = adi_i2c_ReadWrite(hDevice, &xfr, pHwErrors); + + /* always restore saved slave address */ + hDevice->i2cDeviceAddress = savedSlaveAddress; + + if (ADI_I2C_SUCCESS != result) { + return result; /* read/write failure... */ + } else { + return hDevice->result; /* actual result */ + } +} + + + /*! \cond PRIVATE */ + + +/**********************************************************************************\ +|*****************************static helper functions******************************| +\**********************************************************************************/ + +static void submitTransaction(ADI_I2C_HANDLE const hDevice, ADI_I2C_TRANSACTION* const pTransaction) { + + /* reset internal return code */ + hDevice->result = ADI_I2C_SUCCESS; + + /* reset hardware error code */ + hDevice->hwErrors = ADI_I2C_HW_ERROR_NONE; + + /* wait for HW to be ready */ + while (I2C_BUSY) { + ; + } + + /* save common user parameters */ + hDevice->pNextPrologueByte = pTransaction->pPrologue; + hDevice->remainingPrologueCount = pTransaction->nPrologueSize; + hDevice->bRepeatStart = pTransaction->bRepeatStart; + + /* encode (mask and upshift) the slave address, leaving room for the r/w control bit (LSB) */ + hDevice->i2cEncodedDeviceAddress = (hDevice->i2cDeviceAddress & (BITM_I2C_ADDR1_VALUE >> 1)) << 1; + + /* dispatch */ + if (pTransaction->bReadNotWrite) { + + /* setup read parameters */ + hDevice->pNextReadByte = pTransaction->pData; + hDevice->remainingReadCount = pTransaction->nDataSize; + hDevice->pNextWriteByte = NULL; + hDevice->remainingWriteCount = 0u; + + /* set read bit */ + hDevice->i2cEncodedDeviceAddress |= READ_NOT_WRITE; + + /* commence receive */ + commenceReceive(hDevice); + + } else { + + /* setup write parameters */ + hDevice->pNextReadByte = NULL; + hDevice->remainingReadCount = 0u; + hDevice->pNextWriteByte = pTransaction->pData; + hDevice->remainingWriteCount = pTransaction->nDataSize; + + /* clear read bit */ + hDevice->i2cEncodedDeviceAddress &= (~READ_NOT_WRITE); + + /* commence transmit */ + commenceTransmit(hDevice); + } +} + + +static void commenceTransmit(ADI_I2C_HANDLE const hDevice) { + + /* transmit is always pure transmit, whether we have a prologue or not... */ + + /* enable PIO interrupts */ + NVIC_EnableIRQ(hDevice->pDevInfo->pioIRQn); + + /* enable i2c for PIO-based transmit interrupts */ + hDevice->pDev->MCTL |= (BITM_I2C_MCTL_IENMTX | BITM_I2C_MCTL_MASEN); + + /* how many bytes are available in the transmit FIFO (2-deep) */ + uint16_t writableBytes = 2u - (hDevice->pDev->MSTAT & (uint16_t)BITM_I2C_MSTAT_MTXF); + + /* prime transmit FIFO with any prologue data */ + while ((0u < writableBytes) && (hDevice->remainingPrologueCount)) { + hDevice->pDev->MTX = *hDevice->pNextPrologueByte; + hDevice->pNextPrologueByte++; + hDevice->remainingPrologueCount--; + writableBytes--; + } + + /* flesh out any remaining FIFO space with transmit data */ + while ((0u < writableBytes) && (hDevice->remainingWriteCount)) { + hDevice->pDev->MTX = *hDevice->pNextWriteByte; + hDevice->pNextWriteByte++; + hDevice->remainingWriteCount--; + writableBytes--; + } + + /* launch the transmit */ + hDevice->pDev->ADDR1 = hDevice->i2cEncodedDeviceAddress; +} + + +/* initiate receive addressing phase */ +static void commenceReceive(ADI_I2C_HANDLE const hDevice) { + + /* receive can be either pure receive (no prologue), + or a transmit (of prologue) followed by a receive */ + + /* enable PIO interrupts */ + NVIC_EnableIRQ(hDevice->pDevInfo->pioIRQn); + + /* enable i2c for PIO-based receive interrupts */ + hDevice->pDev->MCTL |= (uint16_t)(BITM_I2C_MCTL_IENMRX | BITM_I2C_MCTL_MASEN); + + /* program HW receive count */ + if (hDevice->remainingReadCount > BITM_I2C_MRXCNT_EXTEND) { + hDevice->pDev->MRXCNT = BITM_I2C_MRXCNT_EXTEND; + hDevice->remainingReadCount -= BITM_I2C_MRXCNT_EXTEND; + } else { + hDevice->pDev->MRXCNT = hDevice->remainingReadCount - 1u; + hDevice->remainingReadCount = 0u; + } + + /* if we have prologue (the dreaded "COMBINED FORMAT"), transmit the prologue prior to data receive... */ + if (hDevice->remainingPrologueCount) { + + /* -OR- in transmit interrupt enable if we have prologue data to send */ + hDevice->pDev->MCTL |= BITM_I2C_MCTL_IENMTX; + + /* how many bytes are available in the transmit FIFO (should be 2) */ + uint16_t writableBytes = 2u - (hDevice->pDev->MSTAT & (uint16_t)BITM_I2C_MSTAT_MTXF); + + /* prime transmit FIFO with any prologue data (memory address or command) first */ + while ((0u < writableBytes) && (hDevice->remainingPrologueCount)) { + hDevice->pDev->MTX = *hDevice->pNextPrologueByte; + hDevice->pNextPrologueByte++; + hDevice->remainingPrologueCount--; + writableBytes--; + } + + /* initiate prologue transmit with read bit cleared (for prologue write) */ + /* (read sequence is initiated by transmit handler, *after* prologue is transmitted...) */ + hDevice->pDev->ADDR1 = hDevice->i2cEncodedDeviceAddress & (uint16_t)(~READ_NOT_WRITE); + + } else { + + /* no prologue... initiate pure receive (read bit already set) */ + hDevice->pDev->ADDR1 = hDevice->i2cEncodedDeviceAddress; + } +} + + +/* reset the I2C HW */ +static ADI_I2C_RESULT i2cReset(ADI_I2C_HANDLE const hDevice) { + + volatile uint16_t temp; + /* disable interrupts */ + NVIC_DisableIRQ(hDevice->pDevInfo->pioIRQn); + + /* reset any pending interrupts and TX FIFO (W1C) */ + temp = hDevice->pDev->MSTAT; + hDevice->pDev->MSTAT = temp; + + /* discard any rogue RX FIFO data */ + while (uZero16 != (hDevice->pDev->STAT & (uint16_t)BITM_I2C_STAT_MRXF)) { + volatile uint16_t delme ADI_UNUSED_ATTRIBUTE = hDevice->pDev->MTX; + } + + /* reset i2c control register */ + hDevice->pDev->MCTL = 0u; + + /* reset repeat start logic */ + hDevice->pDev->SHCTL = 1u; + + /* (re)assert controller defaults from user config values */ + hDevice->pDev->MCTL = hDevice->pDevInfo->pConfig->MasterControlRegister; + hDevice->pDev->DIV = hDevice->pDevInfo->pConfig->ClockDividerRegister; + hDevice->pDev->SHCTL = hDevice->pDevInfo->pConfig->SharedControlRegister; + hDevice->pDev->TCTL = hDevice->pDevInfo->pConfig->TimingControlRegister; + hDevice->pDev->ASTRETCH_SCL = hDevice->pDevInfo->pConfig->ClockStretchRegister; + hDevice->i2cDeviceAddress = hDevice->pDevInfo->pConfig->TargetSlaveAddress; + + return ADI_I2C_SUCCESS; +} + + +/**********************************************************************************\ +|********************************interrupt handlers********************************| +\**********************************************************************************/ + + +/* transmit interrupt handler */ +static void transmitHandler(ADI_I2C_HANDLE const hDevice) { + + /* how much room in transmit FIFO? */ + /* DO ***NOT*** USE MSTAT:MTXF... FALSELY INDICATES MOSTLY FULL FIFO! */ + uint16_t writableBytes = 2u - ((hDevice->pDev->STAT & (uint16_t)BITM_I2C_STAT_MTXF) >> BITP_I2C_STAT_MTXF); + + /* for extended prologues, continue pushing prologue data out */ + while ((0u < writableBytes) && (hDevice->remainingPrologueCount)) { + hDevice->pDev->MTX = *hDevice->pNextPrologueByte; + hDevice->pNextPrologueByte++; + hDevice->remainingPrologueCount--; + writableBytes--; + } + + /* once the prologue is done... */ + if (0u == hDevice->remainingPrologueCount) { + + /* if we have a completed prologue associated with a read sequence... */ + if (0u < hDevice->remainingReadCount) { + + /* initiate the read (subsequently driven by receive interrupt handler) */ + hDevice->pDev->ADDR1 = hDevice->i2cEncodedDeviceAddress; + + } else { + + /* normal transmit interrupt: just push transmit data */ + while ((0u < writableBytes) && (hDevice->remainingWriteCount)) { + hDevice->pDev->MTX = *hDevice->pNextWriteByte; + hDevice->pNextWriteByte++; + hDevice->remainingWriteCount--; + writableBytes--; + } + } + } + + /* clear TX interrupt as we complete transmit writes */ + if (0u == hDevice->remainingWriteCount) { + hDevice->pDev->MSTAT = BITM_I2C_MSTAT_MTXREQ; + } +} + + +/* receive interrupt handler */ +static void receiveHandler(ADI_I2C_HANDLE const hDevice) { + + /* note: we never need to deal with prologue data here... it will already be transmitted... */ + + /* how many bytes in receive FIFO? */ + uint16_t readableBytes = (hDevice->pDev->STAT & (uint16_t)BITM_I2C_STAT_MRXF) >> BITP_I2C_STAT_MRXF; + + /* pull bytes from fifo */ + while (0u < readableBytes) { + + readableBytes--; + + /* pull one byte */ + *hDevice->pNextReadByte = (uint8_t)hDevice->pDev->MRX; + hDevice->pNextReadByte++; + + if ((0u == hDevice->pDev->MCRXCNT) && (hDevice->remainingReadCount)) { + + /* if HW read counter goes to zero with remaining data to read, reprogram read count */ + if (hDevice->remainingReadCount > BITM_I2C_MRXCNT_EXTEND) { + /* use extended count flag for large remaining counts... */ + hDevice->pDev->MRXCNT = BITM_I2C_MRXCNT_EXTEND; + hDevice->remainingReadCount -= BITM_I2C_MRXCNT_EXTEND; + } else { + /* new count fits... no need for extended count */ + hDevice->pDev->MRXCNT = hDevice->remainingReadCount - 1u; + hDevice->remainingReadCount = 0u; + } + } + } +} + +/* completion interrupt handler */ +static void completeHandler(ADI_I2C_HANDLE const hDevice) { + + /* block on busy until all transmit data has both left + the fifo AND has been fully serialized to the bus. */ + while (I2C_BUSY) { + ; + } + + /* disable interrupts */ + NVIC_DisableIRQ(hDevice->pDevInfo->pioIRQn); + + /* reset controller to default user config state */ + hDevice->pDev->MCTL = (uint16_t)gConfigInfo->MasterControlRegister; +} + + +/* error interrupt handler */ +static void errorHandler(ADI_I2C_HANDLE const hDevice) { + + /* accumulate I2C bus errors */ + + if (uZero16 != (hDevice->hwStatus & (uint16_t)BITM_I2C_MSTAT_NACKADDR)) { + hDevice->hwErrors |= ADI_I2C_HW_ERROR_NACK_ADDR; + } + + if (uZero16 != (hDevice->hwStatus & (uint16_t)BITM_I2C_MSTAT_NACKDATA)) { + hDevice->hwErrors |= ADI_I2C_HW_ERROR_NACK_DATA; + } + + if (uZero16 != (hDevice->hwStatus & (uint16_t)BITM_I2C_MSTAT_ALOST)) { + hDevice->hwErrors |= ADI_I2C_HW_ERROR_ARBITRATION_LOST; + } + + /* if no other errors exist, note we had an unexpected error */ + if (hDevice->hwErrors == ADI_I2C_HW_ERROR_NONE) { + hDevice->hwErrors = ADI_I2C_HW_ERROR_UNEXPECTED_ERROR; + } +} + + +/**********************************************************************************\ +|*****************************I2C INTERRUPT HANDLER********************************| +\**********************************************************************************/ + + +/* PIO mode I2C interrupt handler */ +void I2C0_Master_Int_Handler(void) { + + bool bPost = false; + + /* rtos prologue */ + ISR_PROLOG() + ; + + /* recover device handle */ + ADI_I2C_HANDLE const hDevice = (ADI_I2C_HANDLE)i2c_device_info[0].hDevice; + + /* save destructive status read... */ + hDevice->hwStatus = hDevice->pDev->MSTAT; + + /* if RepeatStart request is pending, rewrite address register ASAP (and only once) to block stop bit */ + if (hDevice->bRepeatStart) { + hDevice->pDev->ADDR1 = hDevice->i2cEncodedDeviceAddress; + hDevice->bRepeatStart = false; /* just do it once on 1st interrupt */ + } + + /* forward TX interrupts to TX handler */ + if (uZero16 != (hDevice->hwStatus & (uint16_t)BITM_I2C_MSTAT_MTXREQ)) { + transmitHandler(hDevice); + } + + /* forward RX interrupts to RX handler */ + if (uZero16 != (hDevice->hwStatus & (uint16_t)BITM_I2C_MSTAT_MRXREQ)) { + receiveHandler(hDevice); + } + + /* dispatch any errors */ + if (uZero16 != (hDevice->hwStatus & ADI_I2C_STATUS_ERROR_MASK)) { + errorHandler(hDevice); + + /* post on bus error */ + bPost = true; + } + + /* transmit complete */ + if (uZero16 != (hDevice->hwStatus & BITM_I2C_MSTAT_TCOMP)) { + completeHandler(hDevice); + + /* post on completion */ + bPost = true; + } + + /* just post once */ + if (true == bPost) { + SEM_POST(hDevice); + } + + /* rtos epilogue */ + ISR_EPILOG() + ; +} + +/*! \endcond */ + + +/* @} */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/i2c/adi_i2c_data.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/i2c/adi_i2c_data.c new file mode 100755 index 0000000000..c48264eb24 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/i2c/adi_i2c_data.c @@ -0,0 +1,120 @@ +/* + ***************************************************************************** + * @file: adi_i2c_data.c + * @brief: Data declaration for I2C Device Driver + ***************************************************************************** + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be coni2ccuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef ADI_I2C_DATA_C +#define ADI_I2C_DATA_C + + /*! \cond PRIVATE */ + +#include "adi_i2c_def.h" +#include "adi_i2c_config.h" + + +/* Stores the information about the specific device */ +static ADI_I2C_DEVICE_INFO i2c_device_info [ADI_I2C_NUM_INSTANCES] = +{ + /* fixed instance data for the singular I2C0 controller */ + { + I2C_MST_EVT_IRQn, /* pio interrupt number */ + (ADI_I2C_TypeDef *)pADI_I2C0, /* i2c controller pointer */ + NULL, /* pointer to user config data */ + NULL /* i2c device handle (user mem) */ + }, + + /* no other i2c instances at this time */ +}; + +/* build I2C Application configuration array */ +static ADI_I2C_CONFIG gConfigInfo[ADI_I2C_NUM_INSTANCES] = +{ + /* the one-and-only (so far) instance data for I2C, I2C0... */ + { + /**** I2C_MCTL Master Control register *** */ + ( + /* note: Master IENMTX and IENMRX (transmit and receive interrupts) are managed dynamically */ + ( ADI_I2C_CFG_MCTL_MXMITDEC << BITP_I2C_MCTL_MXMITDEC ) | + ( ADI_I2C_CFG_MCTL_IENCMP << BITP_I2C_MCTL_IENCMP ) | + ( ADI_I2C_CFG_MCTL_IENACK << BITP_I2C_MCTL_IENACK ) | + ( ADI_I2C_CFG_MCTL_IENALOST << BITP_I2C_MCTL_IENALOST ) | + ( ADI_I2C_CFG_MCTL_STRETCHSCL << BITP_I2C_MCTL_STRETCHSCL ) | + ( ADI_I2C_CFG_MCTL_LOOPBACK << BITP_I2C_MCTL_LOOPBACK ) | + ( ADI_I2C_CFG_MCTL_COMPLETE << BITP_I2C_MCTL_COMPLETE ) | + ( ADI_I2C_CFG_MCTL_MASEN << BITP_I2C_MCTL_MASEN ) + ), + + /**** I2C_DIV Clock Divider register *** */ + ( + ( ADI_I2C_CFG_DIV_HIGH << BITP_I2C_DIV_HIGH ) | + ( ADI_I2C_CFG_DIV_LOW << BITP_I2C_DIV_LOW ) + ), + + /**** I2C_SHCTL Shared Control register *** */ + ( + ( ADI_I2C_CFG_SHCTL_RST << BITP_I2C_TCTL_FILTEROFF ) + ), + + /**** I2C_TCTL Timing control register *** */ + ( + ( ADI_I2C_CFG_TCTL_FILTEROFF << BITP_I2C_SHCTL_RST ) | + ( ADI_I2C_CFG_TCTL_THDATIN << BITP_I2C_TCTL_THDATIN ) + ), + + /**** I2C_ASTRETCH Master Clock Stretch register *** */ + ( + ( ADI_I2C_CFG_ASTRETCH_MST << BITP_I2C_ASTRETCH_SCL_MST ) + ), + + /**** Target Slave configuration value (not a register) *** */ + ( + ( ADI_I2C_CFG_SLAVE_ADDRESS ) + ), + } +}; + +/*! \endcond */ + + +#endif /* ADI_I2C_DATA_C */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/i2c/adi_i2c_def.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/i2c/adi_i2c_def.h new file mode 100755 index 0000000000..03ba0b5bf9 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/i2c/adi_i2c_def.h @@ -0,0 +1,129 @@ +/*! + ***************************************************************************** + @file: adi_i2c_def.h + @brief: Internal I2C device driver definitions and macros + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*****************************************************************************/ +#ifndef ADI_I2C_DEF_H +#define ADI_I2C_DEF_H + +/*! \cond PRIVATE */ + +#include + +#define ADI_I2C_NUM_INSTANCES (1u) +#define ADI_I2C_STATUS_ERROR_MASK ( (1u << BITP_I2C_MSTAT_NACKADDR) \ + | (1u << BITP_I2C_MSTAT_NACKDATA) \ + | (1u << BITP_I2C_MSTAT_ALOST) ) + +/* Internal Actions */ +static void submitTransaction (ADI_I2C_HANDLE const hDevice, ADI_I2C_TRANSACTION* const pTransaction); +static void commenceTransmit (ADI_I2C_HANDLE const hDevice); +static void commenceReceive (ADI_I2C_HANDLE const hDevice); +static ADI_I2C_RESULT i2cReset (ADI_I2C_HANDLE const hDevice); + +/* interrupt event handlers */ +static void transmitHandler (ADI_I2C_HANDLE const hDevice); +static void receiveHandler (ADI_I2C_HANDLE const hDevice); +static void completeHandler (ADI_I2C_HANDLE const hDevice); +static void errorHandler (ADI_I2C_HANDLE const hDevice); + + +/* + ***************************************************************************** + * I2C Configuration structure. + *****************************************************************************/ +typedef struct __ADI_I2C_CONFIG { + uint16_t MasterControlRegister; /* I2C_MCTL register configuration. */ + uint16_t ClockDividerRegister; /* I2C_DIV register. */ + uint16_t SharedControlRegister; /* I2C_DIV register. */ + uint16_t TimingControlRegister; /* I2C_TCTL register. */ + uint16_t ClockStretchRegister; /* I2C_ASTRETCH register. */ + uint16_t TargetSlaveAddress; /* slave address value (not a register). */ +} ADI_I2C_CONFIG; + + +/* I2C physical device instance data */ +typedef struct __ADI_I2C_DEVICE_INFO { + IRQn_Type pioIRQn; /* PIO interrupt number */ + ADI_I2C_TypeDef *pDev; /* pointer to i2c controller */ + ADI_I2C_CONFIG *pConfig; /* pointer to user config info */ + ADI_I2C_HANDLE hDevice; /* I2C handle or NULL if uninitialized */ +} ADI_I2C_DEVICE_INFO; + +/* I2C driver instance data structure */ +typedef struct __ADI_I2C_DEV_DATA_TYPE { + + /* make sure to synchronize ANY size changes with ADI_I2C_MEMORY_SIZE macro in adi_i2c.h */ + + /* device attributes */ + ADI_I2C_TypeDef *pDev; + ADI_I2C_DEVICE_INFO *pDevInfo; + + + /* driver state */ + uint16_t hwStatus; + bool bRepeatStart; + uint16_t i2cDeviceAddress; + uint16_t i2cEncodedDeviceAddress; /* encoded as 7-bit device address + r/w LSB */ + bool bSubmitCalled; + + /* prologue data */ + volatile uint8_t *pNextPrologueByte; + volatile uint16_t remainingPrologueCount; + + /* write data */ + volatile uint8_t *pNextWriteByte; + volatile uint16_t remainingWriteCount; + + /* read data */ + volatile uint8_t *pNextReadByte; + volatile uint16_t remainingReadCount; + + ADI_I2C_RESULT result; /* collector for return status */ + ADI_I2C_HW_ERRORS hwErrors; /* collector for error status */ + + SEM_VAR_DECLR /* blocking object: "Semaphore" for rtos, "nLowPowerExitFlag" for non-rtos */ + +} ADI_I2C_DEV_DATA_TYPE; + +/*! \endcond */ + +#endif /* end of ifndef ADI_I2C_DEF_H */ + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/pwr/adi_pwr.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/pwr/adi_pwr.c new file mode 100755 index 0000000000..a91c53e02c --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/pwr/adi_pwr.c @@ -0,0 +1,1904 @@ +/* + ***************************************************************************** + * @file: adi_pwr.c + * @brief: Power Management driver implementation. + *----------------------------------------------------------------------------- + * +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *****************************************************************************/ + +/*! \addtogroup Power_Driver Power Driver + * @{ + * @brief Power Management Driver + * @note The application must include drivers/pwr/adi_pwr.h to use this driver + * @note The API #adi_pwr_EnableClockSource requires the GPIO driver if + * #ADI_PWR_CFG_ENABLE_CLOCK_SOURCE_GPIO is set to 1. In that case the + * application must include the GPIO driver sources to avoid link errors. + */ + + +#include /* for 'NULL' */ +#include +#include "adi_pwr_def.h" +#include +#include +#include +#include + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm011 (rule 6.3): Types which specify sign and size should be used +* We use bool which is accepted by MISRA but the toolchain does not accept it +* Pm073 (rule 14.7): a function should have a single point of exit +* Pm143 (rule 14.7): a function should have a single point of exit at the end of the function +* Multiple returns are used for error handling. +* Pm140 (rule 11.3): a cast should not be performed between a pointer type and an integral type +* The rule makes an exception for memory-mapped register accesses. +* Pm057 (rule 15.2): Every non-empty case clause in a switch statement shall be terminated with a break statement. +* In some cases we have return statement instead of break. It is not valid to both return and break in MISRA 2012. +*/ +#pragma diag_suppress=Pm011,Pm073,Pm050,Pm140,Pm143,Pm057 +#endif /* __ICCARM__ */ + +/*! \cond PRIVATE */ + +/*---------------------------------------------------------------------------- + Internal Clock Variables. The external ones are defined in system.c + *---------------------------------------------------------------------------*/ +#ifdef ADI_DEBUG +/* not needed unless its debug mode */ +extern uint32_t lfClock; /* "lf_clk" coming out of LF mux */ +#endif + +extern uint32_t hfClock; /* "root_clk" output of HF mux */ +extern uint32_t gpioClock; /* external GPIO clock */ + +static ADI_CALLBACK gpfCallbackFunction; +static void *gpPowcbParam = NULL; +static uint32_t gnLowPowerIntOccFlag = 0u; + +/*! \endcond */ + +/*---------------------------------------------------------------------------- + Clock functions + *---------------------------------------------------------------------------*/ +/** + * Initialize the clock configuration register with the default values. + * + * @return Status + * - #ADI_PWR_SUCCESS : Successfully initialized the power service. + */ +ADI_PWR_RESULT adi_pwr_Init (void) +{ + /* Enable internal HF oscillators */ + pADI_CLKG0_OSC->KEY = ADI_OSC_KEY; + + pADI_CLKG0_OSC->CTL = OSCCTRL_CONFIG_VALUE; + + gpfCallbackFunction = NULL; + pADI_CLKG0_OSC->KEY = ADI_OSC_KEY; + + /* Switch on the internal HF oscillator */ + pADI_CLKG0_OSC->CTL |= BITM_CLKG_OSC_CTL_HFOSC_EN; + + /* wait for HF OSC to stabilize */ + while ((pADI_CLKG0_OSC->CTL & (1U << BITP_CLKG_OSC_CTL_HFOSC_OK)) == 0u) + { + } + + /* Switch over to the internal HF oscillator */ + pADI_CLKG0_CLK->CTL0 &= ~(BITM_CLKG_CLK_CTL0_CLKMUX); + + /* complete remaining reset sequence */ + pADI_CLKG0_CLK->CTL0 = CLOCK_CTL0_CONFIG_VALUE; + pADI_CLKG0_CLK->CTL1 = CLOCK_CTL1_CONFIG_VALUE; + pADI_CLKG0_CLK->CTL2 = CLOCK_CTL2_CONFIG_VALUE; + pADI_CLKG0_CLK->CTL3 = CLOCK_CTL3_CONFIG_VALUE; + /* No CLK CTL4 */ + pADI_CLKG0_CLK->CTL5 = CLOCK_CTL5_CONFIG_VALUE; + + /* + * Configure the power management registers + */ + pADI_PMG0->IEN = PWM_INTERRUPT_CONFIG; + pADI_PMG0->PWRMOD = PWM_PWRMOD_CONFIG; + pADI_PMG0->CTL1 = PWM_HPBUCK_CONTROL; + + /* disable external HF crystal oscillator */ + /* (don't disable LF crystal or the RTC will lose time */ + pADI_CLKG0_OSC->KEY = ADI_OSC_KEY; + pADI_CLKG0_OSC->CTL &= ~BITM_CLKG_OSC_CTL_HFX_EN; + + NVIC_EnableIRQ(PMG0_VREG_OVR_IRQn); + NVIC_EnableIRQ(PMG0_BATT_RANGE_IRQn); + + NVIC_EnableIRQ(CLKG_XTAL_OSC_EVT_IRQn); + NVIC_EnableIRQ(CLKG_PLL_EVT_IRQn); + + /* compute new internal clocks based on the newly reset controller */ + SystemCoreClockUpdate(); + + return(ADI_PWR_SUCCESS); +} + + +/** + * @brief Updates the internal SystemCoreClock variable with current core + * Clock retrieved from cpu registers. + * + * @return Status + * - #ADI_PWR_SUCCESS : Updated core system core clock variables. + * + * Updates the internal SystemCoreClock variable with current core + * Clock retrieved from cpu registers. + * + * @sa adi_pwr_GetClockFrequency () + */ +ADI_PWR_RESULT adi_pwr_UpdateCoreClock (void) +{ + SystemCoreClockUpdate(); + return(ADI_PWR_SUCCESS); +} + +/** + * @brief Registers or unregister the callback function. + * + * @details Application can register or unregister the callback function which + * will be called to notify the events from the driver. + * + * @param[in] pfCallback : Callback function pointer. + * @param[in] pcbParam : Callback parameter. + * + * @return Status + * - #ADI_PWR_SUCCESS : Successfully installed the callback function. + * - #ADI_PWR_NULL_POINTER [D] : Failed to install the callback function since the call back function pointer is NULL. + */ +ADI_PWR_RESULT adi_pwr_RegisterCallback( + const ADI_CALLBACK pfCallback, + void *pcbParam + ) +{ + +#ifdef ADI_DEBUG + if(pfCallback == NULL) + { + return(ADI_PWR_NULL_POINTER); + } +#endif + + gpfCallbackFunction = pfCallback; + gpPowcbParam = pcbParam; + + return ADI_PWR_SUCCESS; +} + +/** + * @brief Sets the system external clock frequency + * + * @param[in] ExtClkFreq: External clock frequency in Hz + + * @return Status + * - #ADI_PWR_SUCCESS : Successfully set the external clock as source. + * - #ADI_PWR_INVALID_CLOCK_SPEED [D]: Specified clock is out of range. + * + * @sa adi_pwr_GetClockFrequency () + */ +ADI_PWR_RESULT adi_pwr_SetExtClkFreq (const uint32_t ExtClkFreq) +{ +#ifdef ADI_DEBUG + if(ExtClkFreq > MAXIMUM_EXT_CLOCK) + { + return(ADI_PWR_INVALID_CLOCK_SPEED); + } +#endif + gpioClock = ExtClkFreq; + return(ADI_PWR_SUCCESS); +} + +/** + * @brief Sets the input clock source for PLL multiplexer. + * + * @param[in] eClockID: Clock source to the System PLL multiplexer. + * + * @return Status + * - #ADI_PWR_SUCCESS : Successfully set the PLL multiplexer clock source. + * - #ADI_PWR_INVALID_CLOCK_ID [D] : Specified clock ID is invalid. + * + * @sa adi_pwr_SetLFClockMux() + */ +ADI_PWR_RESULT adi_pwr_SetPLLClockMux(const ADI_CLOCK_MUX_ID eClockID) +{ + uint32_t tmp; + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + /* Validate the given clock ID */ + switch (eClockID) + { + case ADI_CLOCK_MUX_SPLL_HFOSC: + case ADI_CLOCK_MUX_SPLL_HFXTAL: + case ADI_CLOCK_MUX_SPLL_GPIO: + break; + /* Any other clock ID is not valid since we are configuring the SPLL clock multiplexer. + * Only valid input clock to the multiplexer is HFOSC, HFXTAL, GPIO */ + default: + return(ADI_PWR_INVALID_CLOCK_ID); + } +#endif /* ADI_DEBUG */ + + /* update the mux setting inside a critical region */ + ADI_ENTER_CRITICAL_REGION(); + tmp = (pADI_CLKG0_CLK->CTL0 & ~BITM_CLKG_CLK_CTL0_PLL_IPSEL); + tmp |= (( (uint32_t)eClockID - (uint32_t)ADI_CLOCK_MUX_SPLL_HFOSC) << BITP_CLKG_CLK_CTL0_PLL_IPSEL); + pADI_CLKG0_CLK->CTL0 = tmp; + ADI_EXIT_CRITICAL_REGION(); + + return(ADI_PWR_SUCCESS); +} + +/** + * @brief Sets the input clock for low frequency clock multiplexer. + * + * @param[in] eClockID: Clock source to the low frequency clock multiplexer. + * + * @return Status + * - #ADI_PWR_SUCCESS : Successfully LF clock multiplexer clock source. + * - #ADI_PWR_INVALID_CLOCK_ID [D] : Specified clock ID is invalid. + * + * @sa adi_pwr_SetRootClockMux() + * @sa adi_pwr_SetPLLClockMux() + */ +ADI_PWR_RESULT adi_pwr_SetLFClockMux(const ADI_CLOCK_MUX_ID eClockID) +{ + uint32_t tmp; + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + switch (eClockID) + { + + case ADI_CLOCK_MUX_LFCLK_LFOSC: + case ADI_CLOCK_MUX_LFCLK_LFXTAL: + break; + /* Any other clock ID is not valid since we are configuring the Low frequency clock multiplexer. + * Only valid input clock to the multiplexer is LFOSC, LFXTAL */ + + default: + return(ADI_PWR_INVALID_CLOCK_ID); + + } +#endif /* ADI_DEBUG */ + + /* update the mux setting inside a critical region */ + ADI_ENTER_CRITICAL_REGION(); + + pADI_CLKG0_OSC->KEY = ADI_OSC_KEY; + tmp = (pADI_CLKG0_OSC->CTL & ~BITM_CLKG_OSC_CTL_LFCLK_MUX); + tmp |=(((uint32_t)eClockID - (uint32_t)ADI_CLOCK_MUX_LFCLK_LFOSC) << BITP_CLKG_OSC_CTL_LFCLK_MUX); + pADI_CLKG0_OSC->CTL = tmp; + + ADI_EXIT_CRITICAL_REGION(); + + return(ADI_PWR_SUCCESS); +} + +/** + * @brief Sets clock source for the Reference clock multiplexer. + * + * @param[in] eClockID: Clock source to the reference clock multiplexer. + * + * @return Status + * - #ADI_PWR_SUCCESS : Successfully set the source for reference clock multiplexer. + * - #ADI_PWR_INVALID_CLOCK_ID [D] : Specified clock ID is invalid. + * + * @sa adi_pwr_SetLFClockMux() + * @sa adi_pwr_SetRootClockMux() + * @sa adi_pwr_SetPLLClockMux() + */ + +ADI_PWR_RESULT adi_pwr_SetRefClockMux(const ADI_CLOCK_MUX_ID eClockID) +{ + uint32_t tmp; + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + switch (eClockID) + { + + case ADI_CLOCK_MUX_REF_HFOSC_CLK: + case ADI_CLOCK_MUX_REF_HFXTAL_26MHZ_CLK: + case ADI_CLOCK_MUX_REF_HFXTAL_16MHZ_CLK: + break; + /* Any other clock ID is not valid since we are configuring the out clock multiplexer.*/ + + default: + return(ADI_PWR_INVALID_CLOCK_ID); + } +#endif /* ADI_DEBUG */ + + /* update the mux setting inside a critical region */ + ADI_ENTER_CRITICAL_REGION(); + + tmp = (pADI_CLKG0_CLK->CTL0 & ~BITM_CLKG_CLK_CTL0_RCLKMUX); + tmp |=(((uint32_t)eClockID - (uint32_t)ADI_CLOCK_MUX_REF_HFOSC_CLK) << BITP_CLKG_CLK_CTL0_RCLKMUX); + pADI_CLKG0_CLK->CTL0 = tmp; + + ADI_EXIT_CRITICAL_REGION(); + + return(ADI_PWR_SUCCESS); +} + +/** + * @brief Sets the source for the root clock multiplexer. + * + * @param[in] eClockID: Clock source to the root clock multiplexer. + * + * @return Status + * - #ADI_PWR_SUCCESS : Successfully set the source for root clock multiplexer. + * - #ADI_PWR_INVALID_CLOCK_ID [D] : Specified clock ID is invalid. + * + * @sa adi_pwr_SetLFClockMux() + * @sa adi_pwr_SetPLLClockMux() + */ +ADI_PWR_RESULT adi_pwr_SetRootClockMux(const ADI_CLOCK_MUX_ID eClockID) +{ + uint32_t tmp; + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + switch (eClockID) + { + case ADI_CLOCK_MUX_ROOT_HFOSC: + case ADI_CLOCK_MUX_ROOT_HFXTAL: + case ADI_CLOCK_MUX_ROOT_SPLL: + case ADI_CLOCK_MUX_ROOT_GPIO: + break; + /* Any other clock ID is not valid since we are configuring the root clock multiplexer. + * Only valid input clock to the multiplexer is HFOSC, HFXTAL, SPLL, GPIO */ + default: + return(ADI_PWR_INVALID_CLOCK_ID); + } +#endif /* ADI_DEBUG */ + + /* update the mux setting inside a critical region */ + ADI_ENTER_CRITICAL_REGION(); + + tmp = (pADI_CLKG0_CLK->CTL0 & ~BITM_CLKG_CLK_CTL0_CLKMUX); + tmp |= (((uint32_t)eClockID - (uint32_t)ADI_CLOCK_MUX_ROOT_HFOSC) << BITP_CLKG_CLK_CTL0_CLKMUX); + pADI_CLKG0_CLK->CTL0 = tmp; + + ADI_EXIT_CRITICAL_REGION(); + + return(ADI_PWR_SUCCESS); +} + + +/** + * @brief Gets the system external clock frequency. + * Gets the clock frequency of the source connected to the external GPIO clock input source. + * + * @param [in] pExtClock : Pointer to write the external clock frequency. + * + * @return Status + * - #ADI_PWR_SUCCESS : Successfully returning the external clock frequency. + * - #ADI_PWR_NULL_POINTER [D] : If the given pointer is pointing to NULL. + * - #ADI_PWR_FAILURE [D] : The system is not initialized yet. Call SystemInit before calling this API. + */ +ADI_PWR_RESULT adi_pwr_GetExtClkFreq (uint32_t *pExtClock) +{ +#ifdef ADI_DEBUG + /* Trap here if the app fails to set the external clock frequency. */ + if (0u == gpioClock) + { + return (ADI_PWR_FAILURE); + } + + if(pExtClock == NULL) + { + return (ADI_PWR_NULL_POINTER); + } +#endif + *pExtClock = gpioClock; + return ADI_PWR_SUCCESS; +} + + +/*! + * @brief Get the frequency of the given clock. + * Obtain individual peripheral clock frequencies + * + * @param[in] eClockId : Clock identifier + * @param[out] pClock : Pointer to a location to store the clock frequency. + * + * @return Status + * - #ADI_PWR_SUCCESS : Successfully returned the queried clock. + * - #ADI_PWR_SYSTEM_NOT_INITIALIZED [D] : The system is not initialized yet. Call SystemInit before calling this API. + * + * @sa adi_PWR_SetClockDivide + * @sa SystemSetClockDivider +*/ +ADI_PWR_RESULT adi_pwr_GetClockFrequency (const ADI_CLOCK_ID eClockId, uint32_t *pClock ) +{ + uint32_t src, nDiv; + +#ifdef ADI_DEBUG + /* trap here if the app fails to call SystemInit(). */ + if ((0u == hfClock) || (0u == lfClock)) + { + return ADI_PWR_SYSTEM_NOT_INITIALIZED; + } +#endif + + /* refresh internal clock variables */ + SystemCoreClockUpdate(); + src = hfClock; + + switch (eClockId) { + + /* HCLOCK domain */ + case ADI_CLOCK_HCLK: + nDiv = (pADI_CLKG0_CLK->CTL1 & BITM_CLKG_CLK_CTL1_HCLKDIVCNT) >> BITP_CLKG_CLK_CTL1_HCLKDIVCNT; + break; + + /* PCLOCK domain */ + case ADI_CLOCK_PCLK: + nDiv = (pADI_CLKG0_CLK->CTL1 & BITM_CLKG_CLK_CTL1_PCLKDIVCNT) >> BITP_CLKG_CLK_CTL1_PCLKDIVCNT; + break; + + default: + return ADI_PWR_INVALID_CLOCK_ID; + } /* end switch */ + + if(nDiv == 0u) + { + nDiv = 1u; + } + + *pClock = (src/nDiv); + + return ADI_PWR_SUCCESS; +} + + +/*! + @brief Enable/disable individual peripheral clocks. + + @param[in] eClockGate Clock identifier + @param[in] bEnable Flag to indicate whether to enable/disable individual clock. + true - to enable individual clock. + false - to disable individual clock. + + @return Status + - #ADI_PWR_SUCCESS if we have successfully enabled or disabled the clock. + + @details Manage individual peripheral clock gates to enable or disable the clocks to the peripheral. +*/ +ADI_PWR_RESULT adi_pwr_EnableClock (const ADI_CLOCK_GATE eClockGate, const bool bEnable) +{ + uint32_t mask; + ADI_INT_STATUS_ALLOC(); + + mask = (uint16_t)eClockGate; + /* update the Clock Gate register in a critical region */ + ADI_ENTER_CRITICAL_REGION(); + + /* NOTE NEGATIVE LOGIC!!! */ + if (bEnable == true) { + + /* clear disable bit */ + pADI_CLKG0_CLK->CTL5 &= ~mask; + } else { + /* set disable bit */ + pADI_CLKG0_CLK->CTL5 |= mask; + } + + /* end critical region */ + ADI_EXIT_CRITICAL_REGION(); + + return ADI_PWR_SUCCESS; +} + + +/*! + @brief Sets the clock divide factor for an individual clock group. + + @param[in] eClockId Clock domain identifier. + @param[in] nDiv Clock divide value to be set (right-justified uint16_t). + + @return Status + - #ADI_PWR_SUCCESS if successfully set the given clock divide factor. + - #ADI_PWR_INVALID_CLOCK_DIVIDER [D] if the divider is out of range. + - #ADI_PWR_INVALID_CLOCK_ID [D] if the given clock is invalid. + - #ADI_PWR_INVALID_CLOCK_RATIO [D] if the given clock ratio invalid. + + @details Manage individual peripheral clock dividers. + + @sa SystemGetClockFrequency +*/ +ADI_PWR_RESULT adi_pwr_SetClockDivider (const ADI_CLOCK_ID eClockId, const uint16_t nDiv) +{ + uint32_t mask; + uint32_t value; + uint32_t tmp; + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + uint32_t hdiv, pdiv; +#endif /*ADI_DEBUG*/ + + switch (eClockId) + { + case ADI_CLOCK_HCLK: +#ifdef ADI_DEBUG + /* Verify the divide factor is within the range */ + if ((nDiv > CLOCK_MAX_DIV_VALUE) || (nDiv < CLOCK_MIN_DIV_VALUE)) + { + return ADI_PWR_INVALID_CLOCK_DIVIDER; + } + + /* verify PCLK freq is <= requested HCLK */ + pdiv = (pADI_CLKG0_CLK->CTL1 & BITM_CLKG_CLK_CTL1_PCLKDIVCNT) >> BITP_CLKG_CLK_CTL1_PCLKDIVCNT; + hdiv = nDiv; + if (hdiv > pdiv) { + return ADI_PWR_INVALID_CLOCK_SPEED; + } + + /* verify new PDIV:HDIV ratio will be integral */ + if ((pdiv % hdiv) != 0u) + { + return ADI_PWR_INVALID_CLOCK_RATIO; + } +#endif /*ADI_DEBUG*/ + + mask = BITM_CLKG_CLK_CTL1_HCLKDIVCNT; + value = (uint32_t)nDiv << BITP_CLKG_CLK_CTL1_HCLKDIVCNT; + break; + + case ADI_CLOCK_PCLK: +#ifdef ADI_DEBUG + + /* Verify the divide factor is within the range */ + if ((nDiv > CLOCK_MAX_DIV_VALUE) || (nDiv < CLOCK_MIN_DIV_VALUE)) + { + return ADI_PWR_INVALID_CLOCK_DIVIDER; + } + + /* verify requested PCLK freq is <= HCLK */ + pdiv = nDiv; + hdiv = (pADI_CLKG0_CLK->CTL1 & BITM_CLKG_CLK_CTL1_HCLKDIVCNT) >> BITP_CLKG_CLK_CTL1_HCLKDIVCNT; + if (hdiv > pdiv) { + return ADI_PWR_INVALID_CLOCK_SPEED; + } + + /* verify new PDIV:HDIV ratio will be integral */ + if ((pdiv % hdiv) != 0u) + { + return ADI_PWR_INVALID_CLOCK_RATIO; + } +#endif /*ADI_DEBUG*/ + mask = BITM_CLKG_CLK_CTL1_PCLKDIVCNT; + value = (uint32_t)nDiv << BITP_CLKG_CLK_CTL1_PCLKDIVCNT; + break; + + case ADI_CLOCK_ACLK: +#ifdef ADI_DEBUG + /* Verify the divide factor is within the range */ + if ((nDiv > ACLK_MAX_DIV_VALUE) || (nDiv < ACLK_MIN_DIV_VALUE)) + { + return ADI_PWR_INVALID_CLOCK_DIVIDER; + } + + /* verify requested ACLK freq is <= HCLK */ + pdiv = nDiv; + hdiv = (pADI_CLKG0_CLK->CTL1 & BITM_CLKG_CLK_CTL1_HCLKDIVCNT) >> BITP_CLKG_CLK_CTL1_HCLKDIVCNT; + if (hdiv > pdiv) { + return ADI_PWR_INVALID_CLOCK_SPEED; + } + + /* verify new PDIV:HDIV ratio will be integral */ + if ((pdiv % hdiv) != 0u) + { + return ADI_PWR_INVALID_CLOCK_RATIO; + } +#endif /*ADI_DEBUG*/ + + mask = BITM_CLKG_CLK_CTL1_ACLKDIVCNT; + value = (uint32_t)nDiv << BITP_CLKG_CLK_CTL1_ACLKDIVCNT; + break; + + + default: + return ADI_PWR_INVALID_CLOCK_ID; + } /* end switch */ + + /* critical region */ + ADI_ENTER_CRITICAL_REGION(); + + /* read-modify-write without any interrupts */ + /* change in a tmp variable and write entire new value all at once */ + tmp = pADI_CLKG0_CLK->CTL1; + tmp &= ~mask; /* blank the field */ + tmp |= value; /* set the new value */ + pADI_CLKG0_CLK->CTL1 = tmp; /* write the new value */ + + /* end critical region */ + ADI_EXIT_CRITICAL_REGION(); + + /* refresh internal clock variables */ + SystemCoreClockUpdate(); + + return ADI_PWR_SUCCESS; +} + +/*! + * @brief To Enable/disable clock sources. + * + * @param[in] eClockSource : Clock source identifier. + * @param[in] bEnable : Enable (true) or disable (false) the clock source. + * + * @return Status + * - #ADI_PWR_SUCCESS if the clock source powers up successfully. + * - #ADI_PWR_INVALID_PARAM if the clock source is not valid. + * + * @details Enables or disables clock sources without additional checks, by writing a "1" or "0" to the enable bit. + * + */ +ADI_PWR_RESULT adi_pwr_EnableClockSource (const ADI_CLOCK_SOURCE_ID eClockSource, const bool bEnable) +{ + uint32_t val = 0u; + volatile uint32_t *pReg = NULL; + uint32_t nMask = 0u; + ADI_INT_STATUS_ALLOC(); + + /* This switch statement does not handle every value in the ADI_CLOCK_SOURCE_ID enumeration + * which results on a gcc warning. This is done intentionally: + * ADI_CLOCK_SOURCE_LFOSC is not checked because it is enabled always and it cannot be disabled + * ADI_CLOCK_SOURCE_GPIO is only checked if a specific configuration macro is defined + */ + switch(eClockSource) + { + case ADI_CLOCK_SOURCE_HFXTAL: + val = (1u << BITP_CLKG_OSC_CTL_HFX_EN); + pReg = &pADI_CLKG0_OSC->CTL; + nMask = BITM_CLKG_OSC_CTL_HFX_OK; + break; + + case ADI_CLOCK_SOURCE_LFXTAL: + val = (1u << BITP_CLKG_OSC_CTL_LFX_EN); + pReg = &pADI_CLKG0_OSC->CTL; + nMask = BITM_CLKG_OSC_CTL_LFX_OK; + break; + + case ADI_CLOCK_SOURCE_HFOSC: + val = (1u << BITP_CLKG_OSC_CTL_HFOSC_EN); + pReg = &pADI_CLKG0_OSC->CTL; + nMask = BITM_CLKG_OSC_CTL_HFOSC_OK; + break; + + case ADI_CLOCK_SOURCE_SPLL: + val = (1u << BITP_CLKG_CLK_CTL3_SPLLEN); + pReg = &pADI_CLKG0_CLK->CTL3; + nMask = BITM_CLKG_CLK_CTL3_SPLLEN; + break; + +#if (ADI_PWR_CFG_ENABLE_CLOCK_SOURCE_GPIO == 1) + case ADI_CLOCK_SOURCE_GPIO: + if(adi_gpio_PullUpEnable(ADI_GPIO_PORT1,ADI_GPIO_PIN_10,false) != ADI_GPIO_SUCCESS) + { + return(ADI_PWR_FAILURE); + } + if(adi_gpio_InputEnable(ADI_GPIO_PORT1,ADI_GPIO_PIN_10,true) != ADI_GPIO_SUCCESS) + { + return ADI_PWR_SUCCESS; + } + break; +#endif + + default: + return(ADI_PWR_INVALID_PARAM); + + } /* end switch */ + + ADI_ENTER_CRITICAL_REGION(); + + pADI_CLKG0_OSC->KEY = ADI_OSC_KEY; + if (bEnable == true) + { + *pReg |= val; + } + else + { + *pReg &= ~val; + } + + ADI_EXIT_CRITICAL_REGION(); + + if((nMask !=0u) && (bEnable == true)) + { + while(0u== (pADI_CLKG0_OSC->CTL & nMask)){} + } + + return (ADI_PWR_SUCCESS); +} + + +/*! + * @brief Return the status of a clock source. + * + * @param[in] eClockSource : Clock source identifier. + * @param[out] peStatus : Pointer to variable of type #ADI_CLOCK_SOURCE_STATUS for storing clock source status. + * + * @return Status + * - #ADI_PWR_SUCCESS if the clock source is disabled. + * - #ADI_PWR_NULL_POINTER [D] if the given pointer is pointing to NULL. + + * @details Return the status of a clock source. + * + */ +ADI_PWR_RESULT adi_pwr_GetClockStatus (const ADI_CLOCK_SOURCE_ID eClockSource, ADI_CLOCK_SOURCE_STATUS *peStatus) +{ + uint32_t val = pADI_CLKG0_OSC->CTL; + +#ifdef ADI_DEBUG + if(peStatus == NULL) + { + return ADI_PWR_NULL_POINTER; + } +#endif /* ADI_DEBUG */ + + *peStatus = ADI_CLOCK_SOURCE_DISABLED; + + switch(eClockSource) + { + case ADI_CLOCK_SOURCE_HFOSC: + if ((val & BITM_CLKG_OSC_CTL_HFOSC_EN) != 0u) + { + /* Clock source enabled, now check for stable */ + if ((val & BITM_CLKG_OSC_CTL_HFOSC_OK) != 0u) + { + *peStatus = ADI_CLOCK_SOURCE_ENABLED_STABLE; + } + else + { + *peStatus = ADI_CLOCK_SOURCE_ENABLED_NOT_STABLE; + } + } + break; + + case ADI_CLOCK_SOURCE_HFXTAL: + if ((val & BITM_CLKG_OSC_CTL_HFX_EN) != 0u) + { + /* Clock source enabled, now check for stable */ + if ((val & BITM_CLKG_OSC_CTL_HFX_OK) != 0u) + { + *peStatus = ADI_CLOCK_SOURCE_ENABLED_STABLE; + } + else + { + *peStatus = ADI_CLOCK_SOURCE_ENABLED_NOT_STABLE; + } + } + break; + + case ADI_CLOCK_SOURCE_LFXTAL: + if ((val & BITM_CLKG_OSC_CTL_LFX_EN) != 0u) + { + /* Clock source enabled, now check for stable */ + if ((val & BITM_CLKG_OSC_CTL_LFX_OK) != 0u) + { + *peStatus = ADI_CLOCK_SOURCE_ENABLED_STABLE; + } + else + { + *peStatus = ADI_CLOCK_SOURCE_ENABLED_NOT_STABLE; + } + } + break; + + case ADI_CLOCK_SOURCE_LFOSC: + /* Clock source enabled, now check for stable */ + if ((val & BITM_CLKG_OSC_CTL_LFOSC_OK) != 0u) + { + *peStatus = ADI_CLOCK_SOURCE_ENABLED_STABLE; + } + else + { + *peStatus = ADI_CLOCK_SOURCE_ENABLED_NOT_STABLE; + } + break; + + /* Since the clock through GPIO is supplied externally we cannot get + the clock status for GPIO */ + case ADI_CLOCK_SOURCE_GPIO: + default: + *peStatus = ADI_CLOCK_SOURCE_ID_NOT_VALID; + break; + + } /* end switch */ + + return ADI_PWR_SUCCESS; +} + +/*! + * @brief Enable/Disable the clock interrupt to monitor status of LFXTAL, HFXTAL and PLL. + * + * @param[in] eIrq : Specify which interrupt need to be enable/disabled. + @param[in] bEnable : Specifies to enable/disable the specified interrupt. + * + * @return Status + * - #ADI_PWR_SUCCESS Enabled the specified interrupt. + * + * @sa adi_pwr_SetVoltageRange() + */ + +ADI_PWR_RESULT adi_pwr_EnableClockInterrupt(const ADI_PWR_CLOCK_IRQ eIrq, const bool bEnable) +{ + ADI_INT_STATUS_ALLOC(); + volatile uint32_t *pReg = NULL; + uint32_t tmp; + + switch(eIrq) + { + /*! Interrupt for root clock monitor and Clock Fail */ + case ADI_PWR_ROOT_CLOCK_MON_IEN: + pReg = &pADI_CLKG0_OSC->CTL; + break; + + /*! Interrupt for LFXTAL clock monitor and Clock Fail */ + case ADI_PWR_LFXTAL_CLOCK_MON_IEN: + pReg = &pADI_CLKG0_OSC->CTL; + break; + + /*! Interrupt when LFXTAL clock becomes stable/unstable */ + case ADI_PWR_LFXTAL_STATUS_IEN: + pReg = &pADI_CLKG0_CLK->CTL0; + break; + + /*! Interrupt when HFXTAL clock becomes stable/unstable */ + case ADI_PWR_HFXTAL_STATUS_IEN: + pReg = &pADI_CLKG0_CLK->CTL0; + break; + + /*! Interrupt when PLL-LOCK/PLL-UNLOCK */ + case ADI_PWR_PLL_STATUS_IEN: + pReg = &pADI_CLKG0_CLK->CTL3; + break; + + default: + break; + } + + ADI_ENTER_CRITICAL_REGION(); + + tmp = *pReg; + + if(bEnable == true) + { + tmp |= (uint32_t)eIrq; + } + else + { + tmp &= ~((uint32_t)eIrq); + } + + /* If we have to write to oscillator control register unlock it */ + if(pReg == &pADI_CLKG0_OSC->CTL) + { + pADI_CLKG0_OSC->KEY = ADI_OSC_KEY; + } + *pReg = tmp; + + ADI_EXIT_CRITICAL_REGION(); + + return(ADI_PWR_SUCCESS); +} + + +/*! + * @brief Program PLL frequency. + * + * @param[in] nDivFactor PLL divider(M). + * @param[in] nMulFactor PLL Multiplier(N) + * @param[in] bDiv2 PLL DIV2 parameter. + * @param[in] bMul2 PLL DIV2 parameter. + * + * @return Status + * - #ADI_PWR_SUCCESS if the PLL has been programmed successfully. + * - #ADI_PWR_OPERATION_NOT_ALLOWED [D] if trying to program SPLL and SPLL drives the system clock. + * - #ADI_PWR_INVALID_CLOCK_ID [D] if the clock identifier does not match either PLL. + * + * @details Program PLL frequency (parameters M, N, DIV2) forSystem PLL(SPLL). + * + * SPLL = input clock * ["(N * (1+ bMul2 )" / "((1+bDiv2)*M)" ] + * where input clock can be HFOSC or HFXTAL. + */ +ADI_PWR_RESULT adi_pwr_SetPll(uint8_t nDivFactor, const uint8_t nMulFactor, const bool bDiv2, const bool bMul2) +{ + uint32_t val, cfg = 0u; + uint8_t nTempDivFactor = nDivFactor, nTempMulFactor = nMulFactor; + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + /* Check if multiplication factor and division factor is more than 6 bits */ + if (((nMulFactor & ~0x3Fu) != 0u) || ((nDivFactor & ~0x3Fu) != 0u)) + { + return ADI_PWR_INVALID_CLOCK_DIVIDER; + } + + /* Check if the PLL is multipexed in as root clock source, parameters should not change in that case */ + if((pADI_CLKG0_CLK->CTL0 & BITM_CLKG_CLK_CTL0_CLKMUX) == + ((uint32_t)((ADI_CLOCK_MUX_ROOT_SPLL - ADI_CLOCK_MUX_ROOT_HFOSC) << BITP_CLKG_CLK_CTL0_CLKMUX))) + { + return ADI_PWR_OPERATION_NOT_ALLOWED; + } +#endif + + if(nTempDivFactor < MINIMUM_PLL_DIVIDER) + { + nTempDivFactor = MINIMUM_PLL_DIVIDER; + } + if(nTempMulFactor < MINIMUM_PLL_MULTIPLIER) + { + nTempMulFactor = MINIMUM_PLL_MULTIPLIER; + } + + cfg = (((uint32_t)nTempDivFactor) << BITP_CLKG_CLK_CTL3_SPLLMSEL)|( ((uint32_t) nTempMulFactor) << BITP_CLKG_CLK_CTL3_SPLLNSEL); + + if(bDiv2 == true) + { + cfg |= (1u <CTL3; + val &= ~( BITM_CLKG_CLK_CTL3_SPLLMUL2 | BITM_CLKG_CLK_CTL3_SPLLMSEL | BITM_CLKG_CLK_CTL3_SPLLDIV2 | BITM_CLKG_CLK_CTL3_SPLLNSEL); + val |= cfg; + pADI_CLKG0_CLK->CTL3 = val; + + /* end critical region */ + ADI_EXIT_CRITICAL_REGION(); + + return ADI_PWR_SUCCESS; +} + + +/*! + * @brief Enable/Disable the power management interrupt. + * + * @param[in] eIrq : Specify which interrupt need to be enable/disabled. + @param[in] bEnable : Specifies to enable/disable the interrupt. + * + * @return Status + * - #ADI_PWR_SUCCESS Enabled the specified interrupt. + * - #ADI_PWR_FAILURE [D] Enabling the battery monitoring interrupt when range is set to safe range (VBAT > 2.75 ). + * + * @note : User should configure the appropriate voltage range before enabling the interrupt for battery voltage range. + * + * @sa adi_pwr_SetVoltageRange() + */ +ADI_PWR_RESULT adi_pwr_EnablePMGInterrupt(const ADI_PWR_PMG_IRQ eIrq, const bool bEnable) +{ + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + if(((pADI_PMG0->IEN & BITM_PMG_IEN_RANGEBAT) == 0u) || (eIrq != ADI_PWR_BATTERY_VOLTAGE_RANGE_IEN)) + { + return(ADI_PWR_FAILURE); + } +#endif + + ADI_ENTER_CRITICAL_REGION(); + if(bEnable == true) + { + pADI_PMG0->IEN |= (uint32_t)eIrq; + } + else + { + pADI_PMG0->IEN &= ~(uint32_t)(eIrq); + } + ADI_EXIT_CRITICAL_REGION(); + + return(ADI_PWR_SUCCESS); +} + + + +/*! + * @brief Enable/disable LFXTAL bypass mode. + * + @param[in] bEnable : Specifies to enable/disable the LFXTAL bypass mode + *\n true: To enable LFXTAL bypass mode. + * \n false: To disable LFXTAL bypass mode. + * @return Status + * - #ADI_PWR_SUCCESS Enabled/Disabled LFXTAL bypass mode. + * - #ADI_PWR_FAILURE[D] Failed to Enable/Disable LFXTAL bypass mode. + * + */ +ADI_PWR_RESULT adi_pwr_EnableLFXTALBypass(const bool bEnable) +{ + volatile uint32_t nDelay = 0xFFFFFFu; + if(bEnable == true) + { + /* Write the oscillator key */ + pADI_CLKG0_OSC->KEY = ADI_OSC_KEY; + /* Disable the LFXTAL */ + pADI_CLKG0_OSC->CTL &= ~(BITM_CLKG_OSC_CTL_LFX_EN); + /* Wait till status de-asserted. */ + while(nDelay != 0u) + { + if((pADI_CLKG0_OSC->CTL & BITM_CLKG_OSC_CTL_LFX_OK) == 0u) + { + break; + } + nDelay--; + } +#ifdef ADI_DEBUG + if(nDelay == 0u) + { + return(ADI_PWR_FAILURE); + } +#endif + pADI_CLKG0_OSC->KEY = ADI_OSC_KEY; + /* Enable the BYPASS mode */ + pADI_CLKG0_OSC->CTL |= (BITM_CLKG_OSC_CTL_LFX_BYP); + /* Wait till status asserted. */ + nDelay = 0xFFFFFFu; + while(nDelay != 0u) + { + if(((pADI_CLKG0_OSC->CTL & BITM_CLKG_OSC_CTL_LFX_OK)== BITM_CLKG_OSC_CTL_LFX_OK)) + { + break; + } + nDelay--; + } +#ifdef ADI_DEBUG + if(nDelay == 0u) + { + return(ADI_PWR_FAILURE); + } +#endif + + } + else + { + /* Write the oscillator key */ + pADI_CLKG0_OSC->KEY = ADI_OSC_KEY; + /* Disable the BYPASS mode */ + pADI_CLKG0_OSC->CTL &= ~(BITM_CLKG_OSC_CTL_LFX_BYP); + /* Wait till status de-asserted. */ + while(nDelay != 0u) + { + if((pADI_CLKG0_OSC->CTL & BITM_CLKG_OSC_CTL_LFX_OK) == 0u) + { + break; + } + nDelay--; + } +#ifdef ADI_DEBUG + if(nDelay == 0u) + { + return(ADI_PWR_FAILURE); + } +#endif + } + + return(ADI_PWR_SUCCESS); +} + + + +/*! + * @brief Enables or disables the LFXTAL Robust mode. + * The Robust mode enables the LFXTAL oscillator to work also when an additional resistive + * load is placed between the crystal pins and GND. This feature is capable of tolerating + * the presence of impurities on the PCB board, where these impurities allow a high-resistance + * leakage path from the crystal pins to ground, which can cause problems to the circuit operation + * + * @param[in] bEnable : Flag which indicates whether to enable or disable LFXTAL Robust mode. + true - Enable Robust mode. + false - Disable Robust mode. + * @return Status + * - #ADI_PWR_SUCCESS Enabled/Disabled LFXTAL Robust mode. + * + * @sa adi_pwr_SetLFXTALRobustModeLoad() + */ +ADI_PWR_RESULT adi_pwr_EnableLFXTALRobustMode( const bool bEnable ) +{ + /* Write the oscillator key */ + pADI_CLKG0_OSC->KEY = ADI_OSC_KEY; + + if(bEnable == true) + { + pADI_CLKG0_OSC->CTL |= BITM_CLKG_OSC_CTL_LFX_ROBUST_EN; + } + else + { + pADI_CLKG0_OSC->CTL &= ~(BITM_CLKG_OSC_CTL_LFX_ROBUST_EN); + } + + return(ADI_PWR_SUCCESS); +} + +/*! + * @brief Enable/Disable the LFXTAL Fail Auto switch. + * Enables/Disable automatic Switching of the LF Mux to LF OSC on LF XTAL Failure. + * + * @param[in] bEnable : Flag which indicates whether to enable/disable LFXTAL Auto switch. + * true - Enable LFXTAL Auto switch. + * false - Disable LFXTAL Auto switch. + * @return Status + * - #ADI_PWR_SUCCESS Enabled/Disabled LFXTAL Auto switch mode. + */ +ADI_PWR_RESULT adi_pwr_EnableLFXTALFailAutoSwitch( const bool bEnable ) +{ + /* Write the oscillator key */ + pADI_CLKG0_OSC->KEY = ADI_OSC_KEY; + + if(bEnable == true) + { + pADI_CLKG0_OSC->CTL |= BITM_CLKG_OSC_CTL_LFX_AUTSW_EN; + } + else + { + pADI_CLKG0_OSC->CTL &= ~(BITM_CLKG_OSC_CTL_LFX_AUTSW_EN); + } + return(ADI_PWR_SUCCESS); +} + + +/*! + * @brief Sets the LFXT Robust Mode Load. + * Selects the amount of loading tolerated when LFXTAL robust mode is enabled. + * + * @param[in] eLoad : Amount of loading tolerance required. + * @return Status + * - #ADI_PWR_SUCCESS Successfully set the load tolerance for LFXTAL Robust mode. + * + * @sa adi_pwr_EnableLFXTALRobustMode() + */ +ADI_PWR_RESULT adi_pwr_SetLFXTALRobustModeLoad( const ADI_PWR_LFXTAL_LOAD eLoad ) +{ + uint32_t tmp; + + tmp = pADI_CLKG0_OSC->CTL & ~BITM_CLKG_OSC_CTL_LFX_ROBUST_LD; + tmp |= ((uint32_t)eLoad) << BITP_CLKG_OSC_CTL_LFX_ROBUST_LD; + + /* Write the oscillator key */ + pADI_CLKG0_OSC->KEY = ADI_OSC_KEY; + pADI_CLKG0_OSC->CTL = tmp; + + return(ADI_PWR_SUCCESS); +} + +/*! + * @brief To enable/disable auto switching of root clock to HFOSC upon detection of Root clock failure. + * This feature is valid only when the ROOT clock monitor is enabled. The root clock monitoring + * can be enabled by using the API #adi_pwr_EnableClockInterrupt. + * + * @param[in] bEnable : Flag which indicates whether to enable or disable Root clock auto switch. + * true - Enable Root clock auto switch. + false - Disable Root clock auto switch. + * @return Status + * - #ADI_PWR_SUCCESS Successfully set the load tolerance for LFXTAL Robust mode. + * + * @sa adi_pwr_EnableClockInterrupt() + */ +ADI_PWR_RESULT adi_pwr_EnableRootClockFailAutoSwitch( const bool bEnable ) +{ + /* Write the oscillator key */ + pADI_CLKG0_OSC->KEY = ADI_OSC_KEY; + + if(bEnable == true) + { + pADI_CLKG0_OSC->CTL |= BITM_CLKG_OSC_CTL_ROOT_AUTSW_EN; + } + else + { + pADI_CLKG0_OSC->CTL &= ~(BITM_CLKG_OSC_CTL_ROOT_AUTSW_EN); + } + + return(ADI_PWR_SUCCESS); +} + + +/*! + * @brief Sets the HF Oscillator divide factor. + * + * Sets the divide factor for the clocks derived from the HF oscillator clock. + * + * @param[in] eDivFactor : HF Clock divide factor to be set. + * + * @return Status + * - #ADI_PWR_SUCCESS Successfully set the clock divide factor for HF Oscillator. + * + * @note When the HF Oscillator auto divide by 1 is set, the divide factor set is automatically + * changed to 1 when coming out of Flexi mode. Application should set it back to the + * required divide after coming out of Flexi mode. + * + * @sa adi_pwr_EnableHFOscAutoDivBy1() + */ +ADI_PWR_RESULT adi_pwr_SetHFOscDivFactor( const ADI_PWR_HFOSC_DIV eDivFactor ) +{ + uint32_t tmp; + + tmp = (pADI_CLKG0_CLK->CTL2 & ~BITM_CLKG_CLK_CTL2_HFOSCDIVCLKSEL); + tmp |= ((uint32_t) eDivFactor << BITP_CLKG_CLK_CTL2_HFOSCDIVCLKSEL); + pADI_CLKG0_CLK->CTL2 = tmp; + + return(ADI_PWR_SUCCESS); +} + + +/*! + * @brief Enable or disable the HF oscillator automatic divide by 1 during wakeup from Flexi mode. + * + * This is used to enable/disable the fast wakeup from Flexi power mode. When the fast wakeup + * from Flexi mode is enabled, the frequency undivided 26MHz HF oscillator clock itself will + * be used during the wake up. The undivided HFOSC clock is selected automatically by setting + * the HF oscillator divide factor to 1. This updated divided by 1 clock selection will remain + * same until the new divider value is set. + * + * When disabled the HF Oscillator divide factor will remain unchanged during the wakeup. + * + * @param[in] bEnable : Flag which indicates whether HF oscillator automatic divide by 1 is enabled/disabled. + * 'true' - To enable automatic divide by 1. + * 'false' - To disable automatic divide by 1. + * + * @return Status + * - #ADI_PWR_SUCCESS Successfully enable/disabled HF Oscillator automatic divide by 1. + * + * @sa adi_pwr_SetHFOscDivFactor() + */ +ADI_PWR_RESULT adi_pwr_EnableHFOscAutoDivBy1( const bool bEnable ) +{ + if(bEnable == true) + { + pADI_CLKG0_CLK->CTL2 |= BITM_CLKG_CLK_CTL2_HFOSCAUTODIV_EN; + } + else + { + pADI_CLKG0_CLK->CTL2 &= ~(BITM_CLKG_CLK_CTL2_HFOSCAUTODIV_EN); + } + + return(ADI_PWR_SUCCESS); +} + + +/*! + * @brief Set the clock output through the GPIO. + * + * @param[in] eClockOutput : Clock to be output through the GPIO pin. + * + * @return Status + * - #ADI_PWR_SUCCESS Successfully set the GPIO clock output. + */ +ADI_PWR_RESULT adi_pwr_SetGPIOClockOutput( const ADI_CLOCK_OUTPUT_ID eClockOutput ) +{ + uint32_t tmp; + + tmp = (pADI_CLKG0_CLK->CTL0 & ~BITM_CLKG_CLK_CTL0_CLKOUT); + tmp |= ((uint32_t)eClockOutput << BITP_CLKG_CLK_CTL0_CLKOUT); + pADI_CLKG0_CLK->CTL0 = tmp; + + return(ADI_PWR_SUCCESS); +} + + +/*! + * @brief Enables or disables the HP Buck. + * + * @param[in] bEnable : Flag which indicates whether to enable or disable HPBuck + * 'true' - To enable HPBuck. + * 'false' - To disable HPBuck. + * @return Status + * - #ADI_PWR_SUCCESS Successfully enabled or disabled HPBUCK successfully. + */ +ADI_PWR_RESULT adi_pwr_EnableHPBuck(const bool bEnable) +{ + if(bEnable == true) + { + pADI_PMG0->CTL1 |= BITM_PMG_CTL1_HPBUCKEN; + } + else + { + pADI_PMG0->CTL1 &= ~(BITM_PMG_CTL1_HPBUCKEN); + } + + return(ADI_PWR_SUCCESS); +} + + +/*! + * @brief Enable or disable the HPBuck Low Power mode. + * The HPBUCK Low Power mode can be selected, when the Chip is in Flexi Power mode + * and low power modules such as Timer, Beeper only are enabled. + * + * @param[in] bEnable : Flag which indicates whether to enable or disable HPBuck low power mode. + * 'true' - Enable HPBuck low power mode. + * 'false' - Disable HPBuck low power mode. + * @return Status + * - #ADI_PWR_SUCCESS Successfully enabled or disabled the HPBuck low power mode. + */ +ADI_PWR_RESULT adi_pwr_EnableHPBuckLowPowerMode( const bool bEnable ) +{ + if(bEnable == true) + { + pADI_PMG0->CTL1 |= BITM_PMG_CTL1_HPBUCK_LOWPWR_MODE; + } + else + { + pADI_PMG0->CTL1 &= ~(BITM_PMG_CTL1_HPBUCK_LOWPWR_MODE); + } + + return(ADI_PWR_SUCCESS); +} + +/*! + * @brief Set the HP Buck load mode. + * + * HP Buck load mode can be set based on the system load. + * The low load mode can be set when the system is running below 26Mhz. + * The High load mode can be set when the system is running at greater than 26Mhz. + * + * @param[in] eLoadMode : Load mode to be set. + * + * @return Status + * - #ADI_PWR_SUCCESS Successfully set the load mode. + */ +ADI_PWR_RESULT adi_pwr_SetHPBuckLoadMode( const ADI_PWR_HPBUCK_LD_MODE eLoadMode ) +{ + if(eLoadMode == ADI_PWR_HPBUCK_LD_MODE_HIGH) + { + pADI_PMG0->CTL1 |= BITM_PMG_CTL1_HPBUCK_LD_MODE; + } + else + { + pADI_PMG0->CTL1 &= ~(BITM_PMG_CTL1_HPBUCK_LD_MODE); + } + + return(ADI_PWR_SUCCESS); +} + + +/*! + * @brief Function to retrieve the wakeup from shut down mode status. + * + * @param[in] peStatus : Pointer to #ADI_PWR_WAKEUP_STATUS for returning the wakeup status. + * + * @return Status + * - #ADI_PWR_SUCCESS: Successfully returned the shut down status. + */ +ADI_PWR_RESULT adi_pwr_GetWakeUpStatus(ADI_PWR_WAKEUP_STATUS *peStatus) +{ + *peStatus =(ADI_PWR_WAKEUP_STATUS) pADI_PMG0->SHDN_STAT; + return(ADI_PWR_SUCCESS); +} + + +/*! + * @brief To Monitor voltage range of battery. + * + * @param[in] eRange : Specify the voltage range for the battery. + * + * @return Status + * - #ADI_PWR_SUCCESS: Successfully programmed battery range. + * @details + * + */ +ADI_PWR_RESULT adi_pwr_SetVoltageRange(const ADI_PWR_VOLTAGE_RANGE eRange) +{ + uint32_t tmp; + + tmp = (pADI_PMG0->IEN & ~BITM_PMG_IEN_RANGEBAT); + tmp |= ((uint32_t)eRange << BITP_PMG_IEN_RANGEBAT); + pADI_PMG0->IEN = tmp; + + return(ADI_PWR_SUCCESS); +} + +/*! \cond PRIVATE */ + +/* + * Interrupt handler for PLL interrupts. + */ +void PLL_Int_Handler(void) +{ + ISR_PROLOG(); + + /* As the same status word is shared between two interrupts + Crystal_osc_Int_Handler and PLL_Int_Handler + check and clear status bits handled in this handler */ + uint32_t nStatus = (pADI_CLKG0_CLK->STAT0 & + (BITM_CLKG_CLK_STAT0_SPLLUNLK | BITM_CLKG_CLK_STAT0_SPLLLK)); + + /* If a callback is registered notify the events */ + if(gpfCallbackFunction != NULL) + { + if((nStatus & BITM_CLKG_CLK_STAT0_SPLLUNLK ) != 0u) + { + /* PLL unlock event */ + gpfCallbackFunction( gpPowcbParam, ADI_PWR_EVENT_PLLC_UNLOCK,(void *)0); + } + else if((nStatus & BITM_CLKG_CLK_STAT0_SPLLLK) != 0u) + { + /* PLL lock event */ + gpfCallbackFunction( gpPowcbParam, ADI_PWR_EVENT_PLLC_LOCK,(void *)0); + } + else + { + /* Do nothing */ + } + } + + /* Clear the status bits */ + pADI_CLKG0_CLK->STAT0 = nStatus; + + ISR_EPILOG(); +} + +/* + * Interrupt handler for oscillator interrupts. + */ +void Crystal_osc_Int_Handler(void) +{ + ISR_PROLOG(); + + /* As the same status word is shared between two interrupts + Crystal_osc_Int_Handler and PLL_Int_Handler + check and clear status bits handled in this handler */ + uint32_t nClkStatus = (pADI_CLKG0_CLK->STAT0 & + (BITM_CLKG_CLK_STAT0_HFXTALNOK | + BITM_CLKG_CLK_STAT0_HFXTALOK | + BITM_CLKG_CLK_STAT0_LFXTALOK | + BITM_CLKG_CLK_STAT0_LFXTALNOK)); + + /* Check if the interrupt was generated due to failure in Root Clock or LFXTAL */ + uint32_t nOscStatus = (pADI_CLKG0_OSC->CTL & (BITM_CLKG_OSC_CTL_LFX_FAIL_STA | + BITM_CLKG_OSC_CTL_ROOT_FAIL_STA | + BITM_CLKG_OSC_CTL_ROOT_AUTSW_STA | + BITM_CLKG_OSC_CTL_LFX_AUTSW_STA )); + + uint32_t nEvent = 0u; + + + if(gpfCallbackFunction != NULL) + { + /* Is the interrupt caused due to HFXTAL or LFXTAL status */ + if(nClkStatus != 0u) + { + if ((nClkStatus & BITM_CLKG_CLK_STAT0_HFXTALNOK) != 0u) { nEvent |= ADI_PWR_EVENT_OSC_HFXTAL_CLOCK_NO_OK; } + else if ((nClkStatus & BITM_CLKG_CLK_STAT0_HFXTALOK) != 0u) { nEvent |= ADI_PWR_EVENT_OSC_HFXTAL_CLOCK_OK; } + else if ((nClkStatus & BITM_CLKG_CLK_STAT0_LFXTALOK) != 0u) { nEvent |= ADI_PWR_EVENT_OSC_LFXTAL_CLOCK_OK; } + else if ((nClkStatus & BITM_CLKG_CLK_STAT0_LFXTALNOK) != 0u) { nEvent |= ADI_PWR_EVENT_OSC_LFXTAL_CLOCK_NO_OK; } + else { /* do nothing */ } + + if(nEvent != 0u) { gpfCallbackFunction( gpPowcbParam, nEvent, (void *)0u); } + + } + /* Or is the interrupt caused due to Root Clock or LFXTAL failure status */ + else if(nOscStatus != 0u) + { + /* Did the LFXTAL failed */ + if( (nOscStatus & BITM_CLKG_OSC_CTL_LFX_FAIL_STA) != 0u) + { + /* Notifiy LFXTAL failure */ + gpfCallbackFunction( gpPowcbParam, ADI_PWR_EVENT_OSC_LFXTAL_MON_FAIL, (void *)0u); + + /* Did the HW auto switched to LFOSC due to LFXTAL failure */ + if((nOscStatus & BITM_CLKG_OSC_CTL_LFX_AUTSW_STA) != 0u) + { + /* Notify about the auto switch to LFOSC */ + gpfCallbackFunction( gpPowcbParam, ADI_PWR_EVENT_OSC_LFXTAL_AUTO_SWITCH, (void *)0u); + } + } + /* Did the root clock failed */ + else if((nOscStatus & BITM_CLKG_OSC_CTL_ROOT_FAIL_STA) != 0u) + { + /* Indicate about the root clock failure */ + gpfCallbackFunction( gpPowcbParam, ADI_PWR_EVENT_OSC_ROOT_CLOCK_MON_FAIL, (void *)0u); + + /* Did the HW auto switched to HFOSC due to root clock failure */ + if((nOscStatus & BITM_CLKG_OSC_CTL_ROOT_AUTSW_STA) != 0u) + { + /* Notify about auto switch to HFOSC */ + gpfCallbackFunction( gpPowcbParam, ADI_PWR_EVENT_OSC_ROOT_CLOCK_FAIL_AUTO_SWITCH, (void *)0u); + } + } + else + { + /* Do nothing */ + } + } + else + { + /* Do nothing */ + } + } + + /* Clear the staus bits */ + if(nClkStatus != 0u) + { + pADI_CLKG0_CLK->STAT0 = nClkStatus; + } + else if(nOscStatus != 0u) + { + /* Write the oscillator key to clear the status bits */ + pADI_CLKG0_OSC->KEY = ADI_OSC_KEY; + + /* Clear only status bits */ + pADI_CLKG0_OSC->CTL |= nOscStatus; + } + else + { + /* Do nothing */ + } + + ISR_EPILOG(); +} + +/* + * Interrupt handler for battery voltage interrupt. + */ +void Battery_Voltage_Int_Handler(void) +{ + ISR_PROLOG(); + uint32_t nStatus = pADI_PMG0->PSM_STAT; + + if ((nStatus & BITM_PMG_PSM_STAT_VBATUNDR) != 0u) + { + if(gpfCallbackFunction != NULL) + { + gpfCallbackFunction( gpPowcbParam, (uint32_t)nStatus, (void *)0); + } + pADI_PMG0->PSM_STAT |= (BITM_PMG_PSM_STAT_VBATUNDR); + } + ISR_EPILOG(); +} + +/* + * Interrupt handler for battery voltage interrupt. + */ +void Vreg_over_Int_Handler(void) +{ + ISR_PROLOG(); + uint32_t nStatus = pADI_PMG0->PSM_STAT; + + if(gpfCallbackFunction != NULL) + { + if ((nStatus & BITM_PMG_PSM_STAT_VREGOVR) != 0u) + { + gpfCallbackFunction(gpPowcbParam, (uint32_t)ADI_PWR_EVENT_VREG_OVER_VOLTAGE, NULL); + } + if ((nStatus & BITM_PMG_PSM_STAT_VREGUNDR) != 0u) + { + gpfCallbackFunction(gpPowcbParam, (uint32_t)ADI_PWR_EVENT_VREG_UNDER_VOLTAGE, NULL); + } + } + pADI_PMG0->PSM_STAT |= (nStatus &(BITM_PMG_PSM_STAT_VREGOVR | BITM_PMG_PSM_STAT_VREGUNDR)); + ISR_EPILOG(); +} + +/*! \endcond */ +/*! + @brief Puts the processor into given low power mode. + + @param[in] PowerMode One of the ADI_PWR_POWER_MODE enum values, defining the specific + low-power modes to use. + + @param[in,out] pnInterruptOccurred + Control parameter selection low-power operation. Either a NULL pointer + for automatic hardware-based sleeping between interrupts, or a pointer + to uint32_t for software looping sleep between interrupts. + + If a pointer to uint32_t is passed in, the integer must be \b 0 on entry, + and will be set to \b 0 on exit. + + When a NULL is passed, it means the application wants the low-power + implementation to use the automatic "sleep-on-exit" hardware sleep + mode in which wakeup interrupts are dispatched and then automatically + put the processor back to sleep on exit. All interrupts execute the + same WFI instruction (no looping) under hardware control, which results + in a faster re-sleep than the software mode. + + When a non-NULL value is passed, it is interpreted as a pointer to a + shared integer application control variable allowing the wake-up + interrupts to control whether/when the control loop should re-sleep the + processor as each interrupt exits. Any interrupt that sets the variable + will cause the sleep loop to exit. Otherwise, exiting interrupts will + cause the core to re-sleep until the variable is set. Each interrupt executes + a different WFI instruction inside a software loop (slower re-sleep). + + @param[in] PriorityMask A right-justified (un shifted) wakeup interrupt priority mask, corresponding + to the programmable interrupt priority encoding scheme defined by the Cortex + NVIC controller. The \a PriorityMask value blocks interrupts with an equal + or lower priority than the specified level, such that only higher-priority + interrupts (less in numerical value) than the priority mask awake the + processor. A zero-valued \a PriorityMask disables interrupt masking. + + @return Status + - #ADI_PWR_SUCCESS If successfully put the processor into low power mode. + - #ADI_PWR_INVALID_PARAM[D] PriorityMask contains unimplemented hardware bits. + + + + Puts the processor into a low-power mode with interrupt-based wakeup(s). Applications specify the low-power + mode, a pointer to an application-defined interrupt variable, and an interrupt priority mask controlling the + interrupt priority level that may awake the processor. + + @par pnInterruptOccurred + When NULL, the processor is automatically put back to sleep as awaking interrupts exit. This mode employs + the hardware "sleep-on-exit" system control register bit: SLEEPONEXIT_BIT in conjunction with the "wait-for- + interrupt" (WFI) instruction to implement a persistent sleep mode. + + When non-Null, a software strategy is used to control sleeping. As awakening interrupts are processed, they + can increment the interrupt controlling variable and thereby cause the sleep mode to be exited. Note that all + interrupts share a common variable and any interrupt that sets the variable will cause the sleep mode to be + exited. + + Use of the \a pnInterruptOccurred parameter provides a mechanism to resolve two potential hibernation trouble + spots: 1) the inherent race between the intended wakeup interrupt and the execution of the Wait-For-Interrupt + instruction (WFI) used to sleep the processor, and 2) unrelated interrupts (of sufficient priority) + that may terminate the wait prematurely. + + In the first case of the race condition, the race is avoided by testing the \a pnInterruptOccurred variable prior + to the WFI within a common critical section. This allows the #adi_pwr_EnterLowPowerMode() implementation + to insure the intended wakeup interrupt has not occurred already and control whether to sleep the processor. + This insures the intended wakeup interrupt has not already occurred prior to the wait, thereby eliminating the + race condition otherwise present. + + In the second case of an unrelated interrupt terminating the sleep prematurely, the problem is solved by + requiring the interrupt handler(s) which is(are) intended to awake the sleeping processor to set the + application-defined \a pnInterruptOccurred variable in their respective interrupt handler(s). This insures only those + interrupts that explicitly set the variable will break the sleeping processor out of the sleep cycle. Other + (incidental) interrupts put the processor back to sleep after the interrupt because the variable would not have been set. + This is why there is a loop around the WFI instruction. + + The \a pnInterruptOccurred variable must be initialized to zero before first use, and this should be done + prior to enabling any interrupt which may set it (otherwise interrupts may be missed). If this variable is + global or static then static initialization to zero or false will be sufficient. + + The variable should only be set, from an interrupt handler, by calling adi_pwr_ExitLowPowerMode() and passing + the variable by reference. The variable should not be assigned to directly, other than for initialization. + + #adi_pwr_EnterLowPowerMode() will always clear the variable again before returning, so it does not + need to be cleared by user code on each use. Explicitly clearing the variable, outside of #adi_pwr_EnterLowPowerMode() + runs the risk of missing interrupts. + + @par PriorityMask + A zero-valued \a PriorityMask disables interrupt masking, leaving all interrupts eligible to awake the + sleeping processor. This means that zero-valued interrupts cannot be masked. A non-zero \a PriorityMask + limits interrupts that may awake the sleeping processor to those with a higher priority level (lower + numerically) than the specified \a PriorityMask value. + + Each "programmable" peripheral interrupt has an associated priority-level register (which defaults to + zero) within the Nested Vectored Interrupt Controller (NVIC). The number of interrupt priority encoding + bits is defined by constant __NVIC_PRIO_BITS and is a fixed silicon attribute configured during chip + design. The interrupt priority-level registers range in width from 3 to 8 bits. + + This processor uses 3-bit priority encoding, allowing priority levels ranging between 0 (the highest, + default programmable priority) and 7 (the lowest). For example, if the \a PriorityMask parameter is + set to 3, only interrupts with assigned priority 0, 1, and 2 may awake the processor. Since default + priority of all programmable interrupts is 0, setting up maskable interrupts requires that they be + demoted in priority (raised numerically) relative to interrupts that are intended to awake the processor. + + @note The number of priority levels is uncorrelated with the actual number of interrupts or their position + in the Interrupt Vector Table (IVT). Interrupt priorities may be programmed individually.\n\n + + @note The priority levels are actually stored in the core as a left-justified value in an 8-bit field. + The #adi_pwr_EnterLowPowerMode() API takes care of aligning the passed \a PriorityMask value to the + core register (BASEPRI).\n\n + + @note The default priority level for all interrupts is zero, which implies it is impossible to mask interrupts + with a default zero-level priority encoding. All interrupt priorities must be managed to create meaningful + interrupt masks for low-power wakeups, as described above.\n\n + + @warning Do not modify the BASEPRI register (used for masking interrupt priority) during interrupts that take + the core out of low-power mode momentarily. The BASEPRI register is saved/restored on low-power mode + entry/exit to honor user priority requests. Interrupt-level changes to BASEPRI will be clobbered on + low-power exit as the saved value is restored.\n\n + + @sa adi_pwr_ExitLowPowerMode +*/ +ADI_PWR_RESULT adi_pwr_EnterLowPowerMode ( const ADI_PWR_POWER_MODE PowerMode, + uint32_t volatile * pnInterruptOccurred, + const uint8_t PriorityMask + ) +{ + uint32_t savedPriority; + uint32_t scrSetBits = 0u; + uint32_t scrClrBits = 0u; + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + + /* verify the requested priority mask bits are right-justified and don't exceed __NVIC_PRIO_BITS in width */ + if ((PriorityMask & ~((1u << __NVIC_PRIO_BITS) - 1u)) != 0u) + { + return ADI_PWR_INVALID_PARAM; + } + +#endif /* ADI_DEBUG */ + + /* pre-calculate the sleep-on-exit set/clear bits */ + if(NULL == pnInterruptOccurred) { + scrSetBits |= SCB_SCR_SLEEPONEXIT_Msk; + + /* point to private control variable when in hardware (sleep-on-exit) mode */ + pnInterruptOccurred = &gnLowPowerIntOccFlag; + } + + /* pre-calculate the deepsleep and sleep-on-exit set/clear bits */ + switch (PowerMode) { + + case ADI_PWR_MODE_ACTIVE: /* Note: this value is a "reserved" PWRMODE register code. */ + return ADI_PWR_SUCCESS; /* avoids the reserved value "1" being written to PWRMODE. */ + + case ADI_PWR_MODE_FLEXI: /* wfi without deepsleep or sleep-on-exit */ + scrClrBits |= (uint32_t)(BITM_NVIC_INTCON0_SLEEPDEEP | BITM_NVIC_INTCON0_SLEEPONEXIT); + break; + + case ADI_PWR_MODE_HIBERNATE: /* wfi with deepsleep and sleep-on-exit per pnInterruptOccurred setting */ + scrSetBits |= BITM_NVIC_INTCON0_SLEEPDEEP; + + break; + + case ADI_PWR_MODE_SHUTDOWN: /* wfi with both deepsleep and sleep-on-exit */ + /* Note: sleep-on-exit causes WFI to never exit and wakeup is only through system reset. */ + scrSetBits |= (uint32_t)(BITM_NVIC_INTCON0_SLEEPDEEP | BITM_NVIC_INTCON0_SLEEPONEXIT); + break; + + default: + return ADI_PWR_INVALID_POWER_MODE; + + } /* end switch */ + + /* put the power mode and system control mods, as well as the WFI loop inside a critical section */ + ADI_ENTER_CRITICAL_REGION(); + + { /* these lines must be in a success-checking loop if they are not inside critical section */ + /* Uninterruptable unlock sequence */ + pADI_PMG0->PWRKEY = ADI_PMG_KEY; + + /* Clear the previous mode and set new mode */ + pADI_PMG0->PWRMOD = (uint32_t) ( ( pADI_PMG0->PWRMOD & (uint32_t) (~BITM_PMG_PWRMOD_MODE) ) | PowerMode ); + } + + /* Update the SCR (sleepdeep and sleep-on-exit bits) */ + SCB->SCR = ((SCB->SCR | scrSetBits) & ~scrClrBits); + + /* save/restore current Base Priority Level */ + savedPriority = __get_BASEPRI(); + + /* assert caller's priority threshold (left-justified) */ + __set_BASEPRI((uint32_t)PriorityMask << (8u -__NVIC_PRIO_BITS)); + + /* if we are in the software looping mode, loop on the user's variable until set */ + while (0u == *pnInterruptOccurred) { + + __DSB(); /* bus sync to insure register writes from interrupt handlers are always complete before WFI */ + + /* NOTE: aggressive compiler optimizations can muck up critical timing here, so reduce if hangs are present */ + + /* The WFI loop MUST reside in a critical section because we need to insure that the interrupt + that is planned to take us out of WFI (via a call to adi_pwr_ExitLowPowerMode()) is not + dispatched until we get into the WFI. If that interrupt sneaks in prior to our getting to the + WFI, then we may end up waiting (potentially forever) for an interrupt that has already occurred. + */ + __WFI(); + + /* Recycle the critical section so that other (non-wakeup) interrupts are dispatched. + This allows *pnInterruptOccurred to be set from any interrupt context. + */ + ADI_EXIT_CRITICAL_REGION(); + /* nop */ + ADI_ENTER_CRITICAL_REGION(); + + } /* end while */ + + /* ...still within critical section... */ + + (*pnInterruptOccurred)--; /* decrement the completion variable on exit */ + + /* Restore previous base priority */ + __set_BASEPRI(savedPriority); + + /* clear sleep-on-exit bit to avoid sleeping on exception return to thread level */ + SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk; + + __DSB(); /* bus sync before re-enabling interrupts */ + + ADI_EXIT_CRITICAL_REGION(); + + return ADI_PWR_SUCCESS; +} + + +/*! + * Companion function to #adi_pwr_EnterLowPowerMode() that allows interrupts to \n + * break out of the "FLEXI" mode in which the processor stays in \n + * sleep while peripherals are active. \n + + @param[in,out] pnInterruptOccurred + Control parameter selection low-power operation. Either a NULL pointer \n + for hardware sleep-on-exit feature, or a pointer to uint32_t for software \n + looping sleep between interrupts. + @return Status + - #ADI_PWR_SUCCESS If successfully exited from low power mode. + + * @sa adi_pwr_EnterLowPowerMode + */ +ADI_PWR_RESULT adi_pwr_ExitLowPowerMode(uint32_t volatile * pnInterruptOccurred) +{ + ADI_INT_STATUS_ALLOC(); + + /* Manage the exit depending on pnInterruptOccurred convention... */ + /* NULL pointer means we are using the hardware sleep-on-exit feature */ + /* non-NULL pointer means we are using a software looping variable top sleep */ + + if (NULL == pnInterruptOccurred) { + + pnInterruptOccurred = &gnLowPowerIntOccFlag; /* point to private control variable in hardware mode */ + + /* clear hardware sleep-on-exit feature */ + ADI_ENTER_CRITICAL_REGION(); + + SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk; + __DSB(); /* bus sync before interrupt exit */ + + ADI_EXIT_CRITICAL_REGION(); + } + + /* set control variable (whether hardware or software based) so WFI exits in SystemEnterLowPowerMode() */ + (*pnInterruptOccurred)++; + return ADI_PWR_SUCCESS; +} + +/* +** EOF +*/ + +/*! @} */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/pwr/adi_pwr_def.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/pwr/adi_pwr_def.h new file mode 100755 index 0000000000..c5f372ed34 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/pwr/adi_pwr_def.h @@ -0,0 +1,172 @@ +/* + ***************************************************************************** + * @file: adi_pwr_def.h + * @brief: Definitions for the system clock and power management. + *----------------------------------------------------------------------------- + * + * Copyright (c) 2016 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL + * PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *****************************************************************************/ + +#ifndef ADI_PWR_DEF_H +#define ADI_PWR_DEF_H + + /*Power control register access key */ +#define ADI_PMG_KEY (0x4859u) + + /*Osc control register access key */ +#define ADI_OSC_KEY (0xCB14u) + + /*HCLK/PCLK minimum Divider value */ +#define CLOCK_MIN_DIV_VALUE (0x1u) + + /*HCLK/PCLK maximum Divider value */ +#define CLOCK_MAX_DIV_VALUE (32u) + + /*ADC Clock minimum Divider value */ +#define ACLK_MIN_DIV_VALUE (0x1u) + + /*ADC Clock maximum Divider value */ +#define ACLK_MAX_DIV_VALUE (511u) + +/* Minimum divider for PLL */ +#define MINIMUM_PLL_DIVIDER (0x02u) + +/* Minimum multiplier for PLL */ +#define MINIMUM_PLL_MULTIPLIER (0x08u) + +/* Maximum external clock */ +#define MAXIMUM_EXT_CLOCK (26000000u) + + /* Default osc control register value */ +#define OSCCTRL_CONFIG_VALUE \ + ( (uint32_t) ADI_PWR_LF_CLOCK_MUX << BITP_CLKG_OSC_CTL_LFCLK_MUX | \ + (uint32_t) ADI_PWR_HFOSC_CLOCK_ENABLE << BITP_CLKG_OSC_CTL_HFOSC_EN | \ + (uint32_t) ADI_PWR_LFXTAL_CLOCK_ENABLE << BITP_CLKG_OSC_CTL_LFX_EN | \ + (uint32_t) ADI_PWR_HFXTAL_CLOCK_ENABLE << BITP_CLKG_OSC_CTL_HFX_EN | \ + (uint32_t) ADI_PWR_LFXTAL_CLOCK_MON_ENABLE << BITP_CLKG_OSC_CTL_LFX_MON_EN | \ + (uint32_t) ADI_PWR_LFXTAL_FAIL_AUTO_SWITCH_ENABLE << BITP_CLKG_OSC_CTL_LFX_AUTSW_EN | \ + (uint32_t) ADI_PWR_LFXTAL_ROBUST_MODE_ENABLE << BITP_CLKG_OSC_CTL_LFX_ROBUST_EN | \ + (uint32_t) ADI_PWR_LFXTAL_ROBUST_LOAD_SELECT << BITP_CLKG_OSC_CTL_LFX_ROBUST_LD | \ + (uint32_t) ADI_PWR_ROOT_CLOCK_MON_INT_ENABLE << BITP_CLKG_OSC_CTL_ROOT_MON_EN | \ + (uint32_t) ADI_PWR_ROOT_CLOCK_FAIL_AUTOSWITCH_ENABLE << BITP_CLKG_OSC_CTL_ROOT_AUTSW_EN ) + + /* Default clock control register-0 value */ +#define CLOCK_CTL0_CONFIG_VALUE \ + ( (uint32_t) ADI_PWR_INPUT_TO_ROOT_CLOCK_MUX << BITP_CLKG_CLK_CTL0_CLKMUX | \ + (uint32_t) ADI_PWR_GPIO_CLOCK_OUT_SELECT << BITP_CLKG_CLK_CTL0_CLKOUT | \ + (uint32_t) ADI_PWR_INPUT_TO_RCLK_MUX << BITP_CLKG_CLK_CTL0_RCLKMUX | \ + (uint32_t) ADI_PWR_INPUT_TO_SPLL_MUX << BITP_CLKG_CLK_CTL0_PLL_IPSEL | \ + (uint32_t) ADI_PWR_LFXTAL_CLOCK_INTERRUPT_ENABLE << BITP_CLKG_CLK_CTL0_LFXTALIE | \ + (uint32_t) ADI_PWR_HFXTAL_CLOCK_INTERRUPT_ENABLE << BITP_CLKG_CLK_CTL0_HFXTALIE ) + + /* Default clock control register-1 value */ +#define CLOCK_CTL1_CONFIG_VALUE \ + ( (uint32_t) ADI_PWR_HCLK_DIVIDE_COUNT << BITP_CLKG_CLK_CTL1_HCLKDIVCNT | \ + (uint32_t) ADI_PWR_PCLK_DIVIDE_COUNT << BITP_CLKG_CLK_CTL1_PCLKDIVCNT | \ + (uint32_t) ADI_PWR_ACLK_DIVIDE_COUNT << BITP_CLKG_CLK_CTL1_ACLKDIVCNT ) + +/* Default clock control register-2 value */ +#define CLOCK_CTL2_CONFIG_VALUE \ + ( (uint32_t) ADI_PWR_HFOSC_AUTO_DIV_BY_1 << BITP_CLKG_CLK_CTL2_HFOSCAUTODIV_EN | \ + (uint32_t) ADI_PWR_HFOSC_DIVIDE_SELECT << BITP_CLKG_CLK_CTL2_HFOSCDIVCLKSEL ) + + /* Default clock control register-3 value */ +#define CLOCK_CTL3_CONFIG_VALUE \ + ( (uint32_t) ADI_PWR_SPLL_MUL_FACTOR << BITP_CLKG_CLK_CTL3_SPLLNSEL | \ + (uint32_t) ADI_PWR_SPLL_ENABLE_DIV2 << BITP_CLKG_CLK_CTL3_SPLLDIV2 | \ + (uint32_t) ADI_PWR_SPLL_ENABLE << BITP_CLKG_CLK_CTL3_SPLLEN | \ + (uint32_t) ADI_PWR_SPLL_INTERRUPT_ENABLE << BITP_CLKG_CLK_CTL3_SPLLIE | \ + (uint32_t) ADI_PWR_SPLL_DIV_FACTOR << BITP_CLKG_CLK_CTL3_SPLLMSEL | \ + (uint32_t) ADI_PWR_SPLL_ENABLE_MUL2 << BITP_CLKG_CLK_CTL3_SPLLMUL2 ) + + /* Default clock control register-5 value */ +#define CLOCK_CTL5_CONFIG_VALUE \ + ( (uint32_t) ADI_PWR_GPT0_CLOCK_ENABLE << BITP_CLKG_CLK_CTL5_GPTCLK0OFF | \ + (uint32_t) ADI_PWR_GPT1_CLOCK_ENABLE << BITP_CLKG_CLK_CTL5_GPTCLK1OFF | \ + (uint32_t) ADI_PWR_GPT2_CLOCK_ENABLE << BITP_CLKG_CLK_CTL5_GPTCLK2OFF | \ + (uint32_t) ADI_PWR_I2C_CLOCK_ENABLE << BITP_CLKG_CLK_CTL5_UCLKI2COFF | \ + (uint32_t) ADI_PWR_GPIO_CLOCK_ENABLE << BITP_CLKG_CLK_CTL5_GPIOCLKOFF | \ + (uint32_t) ADI_PWR_PCLK_ENABLE << BITP_CLKG_CLK_CTL5_PERCLKOFF | \ + (uint32_t) ADI_PWR_TIMER_RGB_ENABLE << BITP_CLKG_CLK_CTL5_TMRRGBCLKOFF ) + +/* Default configuration for Power supply monitor Interrupt Enable Register */ +#define PWM_INTERRUPT_CONFIG \ + ( (uint32_t) ADI_PWR_ENABLE_VBAT_INTERRUPT << BITP_PMG_IEN_VBAT | \ + (uint32_t) ADI_PWR_ENABLE_VREG_UNDER_VOLTAGE_INTERRUPT << BITP_PMG_IEN_VREGUNDR | \ + (uint32_t) ADI_PWR_ENABLE_VREG_OVER_VOLTAGE_INTERRUPT << BITP_PMG_IEN_VREGOVR | \ + (uint32_t) ADI_PWR_ENABLE_BATTERY_VOLTAGE_RANGE_INTERRUPT << BITP_PMG_IEN_IENBAT | \ + (uint32_t) ADI_PWR_BATTERY_VOLTAGE_RANGE_FOR_INTERRUPT << BITP_PMG_IEN_RANGEBAT ) + + /* Default configuration for Power Mode Register */ + #define PWM_PWRMOD_CONFIG \ + ( (uint32_t) ADI_PWR_ENABLE_BATTERY_VOLTAGE_MONITORING << BITP_PMG_PWRMOD_MONVBATN ) + +/* Default configuration for HP Buck Control register */ +#define PWM_HPBUCK_CONTROL \ + ( (uint32_t) ADI_PWR_HP_BUCK_ENABLE << BITP_PMG_CTL1_HPBUCKEN | \ + (uint32_t) ADI_PWR_HP_BUCK_LOAD_MODE << BITP_PMG_CTL1_HPBUCK_LD_MODE | \ + (uint32_t) ADI_PWR_HP_BUCK_LOW_POWER_MODE << BITP_PMG_CTL1_HPBUCK_LOWPWR_MODE ) + + /*Selecting HFOSC as input for generating root clock*/ +#define HFMUX_INTERNAL_OSC_VAL (0u << BITP_CLKG_CLK_CTL0_CLKMUX) + + /*Selecting HFXTAL as input for generating root clock*/ +#define HFMUX_EXTERNAL_XTAL_VAL (1u << BITP_CLKG_CLK_CTL0_CLKMUX) + + /*Selecting SPLL as input for generating root clock*/ +#define HFMUX_SYSTEM_SPLL_VAL (2u << BITP_CLKG_CLK_CTL0_CLKMUX) + + /*Selecting GPIO as input for generating root clock*/ +#define HFMUX_GPIO_VAL (3u << BITP_CLKG_CLK_CTL0_CLKMUX) + +/* Interrupt handler for the battery voltage interrupt */ +void Battery_Voltage_Int_Handler(void); +/* Interrupt handler for the VREG under/over voltage interrupt */ +void Vreg_over_Int_Handler(void); +/* Interrupt handler for PLL interrupts. */ +void PLL_Int_Handler(void); +/*Interrupt handler for oscillator interrupts.*/ +void Crystal_osc_Int_Handler(void); + +#endif /* ADI_PWR_DEF_H */ + + +/* +** EOF +*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/retarget_uart_config.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/retarget_uart_config.h new file mode 100755 index 0000000000..a9f0e37275 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/retarget_uart_config.h @@ -0,0 +1,27 @@ +/* +** I/O redirection support over UART, via SSL/DD. +** Copyright (C) 2017 Analog Devices, Inc. All Rights Reserved. +** +** This file is intended for use with the ARM:Compiler:IO:*:User +** components, which set up redirection of stdout and stderr. +*/ + +#ifndef RETARGET_UART_CONFIG_H +#define RETARGET_UART_CONFIG_H + +// --- <<< Use Configuration Wizard in Context Menu >>> --- + +// UART Configuration for STDOUT and STDERR + +// Configure Pinmuxing for UART. +// Enable pinmux configuration for UART on first output. +#define ADI_UART_SETUP_PINMUX 1 + +// Raise Breakpoint on exit() +// Cause a breakpoint event in exit() rather than looping forever. +#define ADI_UART_EXIT_BREAKPOINT 1 + + +// + +#endif /* RETARGET_UART_CONFIG_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rng/adi_rng.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rng/adi_rng.c new file mode 100755 index 0000000000..75eb73a6cb --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rng/adi_rng.c @@ -0,0 +1,796 @@ +/*! + ***************************************************************************** + * @file: adi_rng.c + * @brief: Random Number Generator Driver + *---------------------------------------------------------------------------- + * +Copyright (c) 2012-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +/*! \addtogroup RNG_Driver RNG Driver + * Random Number Generator Driver + * @{ + */ + + /*! \cond PRIVATE */ + +#include /* for 'NULL' definition */ +#include + +#include +#include +#include "adi_rng_def.h" +#include + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm011 (rule 6.3): Types which specify sign and size should be used +* We use bool which is accepted by MISRA but the toolchain does not accept it +* +* Pm073 (rule 14.7): a function should have a single point of exit +* Pm143 (rule 14.7): a function should have a single point of exit at the end of the function +* Multiple returns are used for error handling. +* +* Pm050 (rule 14.2): a null statement shall only occur on a line by itself +* Needed for null expansion of ISR_PROLOG in no-OS case and others. +* Pm140 (rule 11.3): a cast should not be performed between a pointer type and an integral type +* The rule makes an exception for memory-mapped register accesses. +*/ +#pragma diag_suppress=Pm011,Pm073,Pm143,Pm050 +#endif /* __ICCARM__ */ + +#ifdef __ADUCM4x50__ +#define NUM_RNG_DEVICES (1u) +#else +#error "Unsupported processor" +#endif + +/*============== D A T A ===============*/ + +/** + * Information for managing all the RNG devices available + */ +#ifdef __ICCARM__ +#pragma diag_suppress=Pm140 +#endif + +static ADI_RNG_DEV_TYPE gRNG_Device[NUM_RNG_DEVICES] = +{ + {(ADI_RNG_TypeDef*)pADI_RNG0,NULL} /* RNG0 */ +}; +#ifdef __ICCARM__ +#pragma diag_default=Pm140 +#endif + +/* Forward prototypes */ +void RNG_Int_Handler(void); + +/** Check the validity of a handle for debug mode */ +#ifdef ADI_DEBUG +#define ADI_RNG_INVALID_HANDLE(h) (&gRNG_Device[0] != (h)) +#endif + +/*! \endcond */ + +/*! + @brief Opena a Random Number Generator Device + + @param[in] nDeviceNum Device number to be opened. + @param[in] pMemory Pointer to the memory to be used by the driver. + Size of the memory should be at least #ADI_RNG_MEMORY_SIZE bytes. + @param[in] MemorySize Size of the memory passed in pMemory parameter. + @param[out] phDevice Pointer to a location in the calling function memory space to which + the device handle will be written upon successful driver initialization. + + @return Status + - #ADI_RNG_SUCCESS RNG device driver opened successfully. + - #ADI_RNG_INVALID_PARAM [D] The memory passed to the API is either NULL or its size is not sufficient. + - #ADI_RNG_ALREADY_INITIALIZED [D] The RNG is already initialized. + - #ADI_RNG_BAD_DEVICE_NUM [D] The device number is invalid. + + Initialize and allocate a RNG device for other use. The core NVIC RNG interrupt is enabled. This API + must preceed all other RNG API calls and the handle returned must be passed to all other RNG API calls. + + @note The contents of \a ppDevice will be set to NULL upon failure.\n\n + + @note The RNG device driver will clear all pending interrupts and disable all RNG + interrupts during RNG device initialization. + + @sa adi_rng_Close(). +*/ +ADI_RNG_RESULT adi_rng_Open( + uint32_t const nDeviceNum, + void* const pMemory, + uint32_t const MemorySize, + ADI_RNG_HANDLE* const phDevice + ) +{ + ADI_RNG_DEV_TYPE *pDevice; + + /* store a bad handle in case of failure */ + *phDevice = (ADI_RNG_HANDLE) NULL; + +#ifdef ADI_DEBUG + if (nDeviceNum >= NUM_RNG_DEVICES) + { + return ADI_RNG_BAD_DEVICE_NUM; + } + + if ((NULL == pMemory) || ( MemorySize < (uint32_t) ADI_RNG_MEMORY_SIZE)) + { + return ADI_RNG_INVALID_PARAM; + } + assert (ADI_RNG_MEMORY_SIZE == sizeof(ADI_RNG_DEV_DATA_TYPE)); +#endif + + /* local pointer to instance data */ + pDevice = &gRNG_Device[nDeviceNum]; + +#ifdef ADI_DEBUG + if (NULL != pDevice->pData) + { + return ADI_RNG_ALREADY_INITIALIZED; + } +#endif + + /* Set the internal device data */ + pDevice->pData = pMemory; + + /* initialize internal device data */ + pDevice->pData->IRQn = RNG0_EVT_IRQn; + pDevice->pData->CBFunc = NULL; + + /* clear any pending interrupts. Both bits are write 1 to clear */ + pDevice->pRNG->STAT = BITM_RNG_STAT_RNRDY | BITM_RNG_STAT_STUCK; + + /* Set the RNG register based on static configuration */ + pDevice->pRNG->CTL = (uint16_t)RNG0_CFG_ONLY_8_BIT << BITP_RNG_CTL_SINGLE; + pDevice->pRNG->LEN = (RNG0_CFG_LENGTH_RELOAD << BITP_RNG_LEN_RELOAD) + | (RNG0_CFG_LENGTH_PRESCALER << BITP_RNG_LEN_PRESCALE); + + /* The interrupt handler only gets used in the case of callback mode so its + * enabling only happens in the adi_rng_RegisterCallBack API. + */ + NVIC_ClearPendingIRQ(pDevice->pData->IRQn); + + /* store handle at application handle pointer */ + *phDevice = pDevice; + + return ADI_RNG_SUCCESS; +} + + +/*! + * @brief Uninitializes and deallocates the RNG device. + * + * @param[in] hDevice Device handle obtained from adi_rng_Open(). + * + * @return Status + * - #ADI_RNG_SUCCESS Call completed successfully. + * - #ADI_RNG_BAD_DEV_HANDLE [D] Invalid device handle parameter. + * - #ADI_RNG_NOT_INITIALIZED [D] Device has not been initialized for use, see #adi_rng_Open(). + * + * Uninitialize and release an allocated RNG device for other use. The core NVIC RNG interrupt is disabled. + * + * @sa adi_rng_Open(). + */ +ADI_RNG_RESULT adi_rng_Close(ADI_RNG_HANDLE hDevice) +{ + ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice; + +#ifdef ADI_DEBUG + if (ADI_RNG_INVALID_HANDLE(pDevice)){ + return ADI_RNG_BAD_DEV_HANDLE; + } + + if (NULL == pDevice->pData) { + return ADI_RNG_NOT_INITIALIZED; + } +#endif + + /* uninitialize */ + NVIC_DisableIRQ(pDevice->pData->IRQn); + pDevice->pData = NULL; + + return ADI_RNG_SUCCESS; +} + +/*! + * @brief Enables/Disables the RNG device. + * + * @param[in] hDevice Device handle obtained from adi_rng_Open(). + * @param[in] bFlag Flag to specify whether to enable or disable RNG device. + * + * @return Status + * - #ADI_RNG_SUCCESS Call completed successfully. + * - #ADI_RNG_BAD_DEV_HANDLE [D] Invalid device handle parameter. + * - #ADI_RNG_NOT_INITIALIZED [D] Device has not been initialized for use, see #adi_rng_Open(). + * + * @sa adi_rng_Open(). + * @sa adi_rng_RegisterCallback(). + */ +ADI_RNG_RESULT adi_rng_Enable (ADI_RNG_HANDLE const hDevice, bool const bFlag) +{ + ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice; + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + if (ADI_RNG_INVALID_HANDLE(pDevice)) { + return ADI_RNG_BAD_DEV_HANDLE; + } + + if (NULL == pDevice->pData) { + return ADI_RNG_NOT_INITIALIZED; + } +#endif + + ADI_ENTER_CRITICAL_REGION(); + if (true == bFlag) { + pDevice->pRNG->CTL |= BITM_RNG_CTL_EN; + } else { + pDevice->pRNG->CTL &= (uint16_t)~(BITM_RNG_CTL_EN); + } + ADI_EXIT_CRITICAL_REGION(); + + return ADI_RNG_SUCCESS; +} + +/*! + * @brief Enables/Disables Buffering for RNG. + * + * @param[in] hDevice Device handle obtained from adi_rng_Open(). + * @param[in] bFlag Flag to specify whether to enable or disable buffering for RNG device. + * When buffering is enabled, adi_rng_GetRngData returns 32-bit values. + * When buffering is disabled the API returns 8-bit values. + * + * @return Status + * - #ADI_RNG_SUCCESS Call completed successfully. + * - #ADI_RNG_BAD_DEV_HANDLE [D] Invalid device handle parameter. + * - #ADI_RNG_NOT_INITIALIZED [D] Device has not been initialized for use, see #adi_rng_Open(). + * + * @sa adi_rng_Open(). + * @sa adi_rng_RegisterCallback(). + * @sa adi_rng_GetRngData(). + */ +ADI_RNG_RESULT adi_rng_EnableBuffering (ADI_RNG_HANDLE const hDevice, bool const bFlag) +{ + ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice; + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + if (ADI_RNG_INVALID_HANDLE(pDevice)) { + return ADI_RNG_BAD_DEV_HANDLE; + } + + if (NULL == pDevice->pData) { + return ADI_RNG_NOT_INITIALIZED; + } +#endif + + ADI_ENTER_CRITICAL_REGION(); + if (true == bFlag) { + pDevice->pRNG->CTL &= (uint16_t)~(BITM_RNG_CTL_SINGLE); + } else { + pDevice->pRNG->CTL |= BITM_RNG_CTL_SINGLE; + } + ADI_EXIT_CRITICAL_REGION(); + + return ADI_RNG_SUCCESS; +} + +/*! + * @brief Sets the reload and prescale value for the sample counter. + * The Sample Length will be nLenReload*2^nLenPrescaler. + * + * @param[in] hDevice Device handle obtained from adi_rng_Open(). + * @param[in] nLenPrescaler Prescaler value for the sample counter (0-10). + * @param[in] nLenReload Reload value for the sample counter (0-4095) + * + * @return Status + * - #ADI_RNG_SUCCESS Call completed successfully. + * - #ADI_RNG_BAD_DEV_HANDLE [D] Invalid device handle parameter. + * - #ADI_RNG_NOT_INITIALIZED [D] Device has not been initialized for use, see #adi_rng_Open(). + * + * @sa adi_rng_Open(). + * @sa adi_rng_RegisterCallback(). + */ +ADI_RNG_RESULT adi_rng_SetSampleLen ( + ADI_RNG_HANDLE const hDevice, + uint16_t const nLenPrescaler, + uint16_t const nLenReload + ) +{ + ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice; + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + if (ADI_RNG_INVALID_HANDLE(pDevice)){ + return ADI_RNG_BAD_DEV_HANDLE; + } + + if (NULL == pDevice->pData) { + return ADI_RNG_NOT_INITIALIZED; + } + + if ( (nLenPrescaler > 10u) + || ((0u == nLenPrescaler) && (0u == nLenReload)) + || (nLenReload > 4095u)) { + return ADI_RNG_INVALID_PARAM; + } +#endif + + ADI_ENTER_CRITICAL_REGION(); + /* Set the sample reload and prescaler value */ + pDevice->pRNG->LEN = (uint16_t)((uint16_t)(nLenReload << BITP_RNG_LEN_RELOAD) & BITM_RNG_LEN_RELOAD) + | (uint16_t)((uint16_t)(nLenPrescaler << BITP_RNG_LEN_PRESCALE) & BITM_RNG_LEN_PRESCALE); + ADI_EXIT_CRITICAL_REGION(); + + return ADI_RNG_SUCCESS; +} + + +/*! + * @brief Retrieves the current state of RNG data/CRC accumulator register. + * + * @param[in] hDevice Device handle obtained from adi_rng_Open(). + * @param[out] pbFlag Pointer to an application-defined boolean variable into which to write the result: + * - true = RNG data is ready to be read. + * - false = RNG data is not ready. + * + * @return Status + * - #ADI_RNG_SUCCESS Call completed successfully. + * - #ADI_RNG_BAD_DEV_HANDLE [D] Invalid device handle parameter. + * - #ADI_RNG_NOT_INITIALIZED [D] Device has not been initialized for use, see #adi_rng_Open(). + - #ADI_RNG_INVALID_PARAM [D] Argument is incorrect. + * + * Retrieve the current state of RNG data/CRC accumulator register. The register holds the final entropy value + * accumulated by RNG and it should to read only when the data is ready. + * + * @sa adi_rng_Open(). + * @sa adi_rng_GetRngData(). + * @sa adi_rng_RegisterCallback(). + */ +ADI_RNG_RESULT adi_rng_GetRdyStatus (ADI_RNG_HANDLE const hDevice, bool* const pbFlag) +{ + ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice; + +#ifdef ADI_DEBUG + if (ADI_RNG_INVALID_HANDLE(pDevice)){ + return ADI_RNG_BAD_DEV_HANDLE; + } + + if (NULL == pDevice->pData) { + return ADI_RNG_NOT_INITIALIZED; + } + + if (NULL == pbFlag) { + return ADI_RNG_INVALID_PARAM; + } +#endif + + /* Get the RNG Ready status bit */ + if ((pDevice->pRNG->STAT & BITM_RNG_STAT_RNRDY) != 0u) + { + *pbFlag = true; + } + else + { + *pbFlag = false; + } + + return ADI_RNG_SUCCESS; +} + +/*! + * @brief Retrieve whether the RNG oscillator output is stuck at a constant value + * + * @param[in] hDevice Device handle obtained from adi_rng_Open(). + * @param[out] pbFlag Pointer to an application-defined boolean variable into which to write the result: + * - true = RNG oscillator is stuck at a constant value. + * - false = RNG oscillator is not stuck at a constant value. + * + * @return Status + * - #ADI_RNG_SUCCESS Call completed successfully. + * - #ADI_RNG_BAD_DEV_HANDLE [D] Invalid device handle parameter. + * - #ADI_RNG_NOT_INITIALIZED [D] Device has not been initialized for use, see #adi_rng_Open(). + - #ADI_RNG_INVALID_PARAM [D] Argument is incorrect. + * + * @sa adi_rng_Open(). + * @sa adi_rng_GetRngData(). + * @sa adi_rng_RegisterCallback(). + */ +ADI_RNG_RESULT adi_rng_GetStuckStatus ( + ADI_RNG_HANDLE const hDevice, + bool* const pbFlag + ) +{ + ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice; + +#ifdef ADI_DEBUG + if (ADI_RNG_INVALID_HANDLE(pDevice)){ + return ADI_RNG_BAD_DEV_HANDLE; + } + + if (pDevice->pData == NULL) { + return ADI_RNG_NOT_INITIALIZED; + } + + if (NULL == pbFlag) { + return ADI_RNG_INVALID_PARAM; + } +#endif + + /* Get the stuck status bit */ + if ((pDevice->pRNG->STAT & BITM_RNG_STAT_STUCK) != 0u) + { + *pbFlag = true; + } + else + { + *pbFlag = false; + } + + return ADI_RNG_SUCCESS; +} + + +/*! + * @brief Retrieve the current value of the RNG data register. + * + * @param[in] hDevice Device handle obtained from adi_rng_Open(). + * @param[in] pRegData Pointer to an application-defined variable into which to write the result. + * Only lower 8-bit is valid if buffering is not enabled + * + * @return Status + * - #ADI_RNG_SUCCESS Call completed successfully. + * - #ADI_RNG_BAD_DEV_HANDLE [D] Invalid device handle parameter. + * - #ADI_RNG_NOT_INITIALIZED [D] Device has not been initialized for use, see #adi_rng_Open(). + * - #ADI_RNG_INVALID_PARAM [D] pRegData is a NULL pointer. + * - #ADI_RNG_INVALID_STATE[D] Random number ready status is not set + * + * Retrieve the current value of RNG data register. If the buffering is enabled all 32-bit of value written to + * pRegData is valid else only the lower 8-bit is valid. + * + * @sa adi_rng_Open(). + * @sa adi_rng_GetRdyStatus(). + * @sa adi_rng_RegisterCallback(). + */ +ADI_RNG_RESULT adi_rng_GetRngData (ADI_RNG_HANDLE const hDevice, uint32_t* const pRegData) +{ + ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice; + +#ifdef ADI_DEBUG + if (ADI_RNG_INVALID_HANDLE(pDevice)){ + return ADI_RNG_BAD_DEV_HANDLE; + } + + if (NULL == pDevice->pData) { + return ADI_RNG_NOT_INITIALIZED; + } + + if (NULL == pRegData) { + return ADI_RNG_INVALID_PARAM; + } + + if ((pDevice->pRNG->STAT & BITM_RNG_STAT_RNRDY) == 0u) { + return ADI_RNG_INVALID_STATE; + } +#endif + + /* Get the RNG CRC accumulator value */ + *pRegData = pDevice->pRNG->DATA; + + return ADI_RNG_SUCCESS; +} + + +/*! + * @brief Retrieve the current RNG Oscillator count. + * + * @param[in] hDevice Device handle obtained from adi_rng_Open(). + * @param[in] pOscCount Pointer to an application-defined variable into which to write the result. + * + * @return Status + * - #ADI_RNG_SUCCESS Call completed successfully. + * - #ADI_RNG_BAD_DEV_HANDLE [D] Invalid device handle parameter. + * - #ADI_RNG_NOT_INITIALIZED [D] Device has not been initialized for use, see #adi_rng_Open(). + * - #ADI_RNG_INVALID_STATE[D] Random number ready status is not set + - #ADI_RNG_INVALID_PARAM [D] Argument is incorrect. + * + * @sa adi_rng_Open(). + * @sa adi_rng_RegisterCallback(). + */ +ADI_RNG_RESULT adi_rng_GetOscCount (ADI_RNG_HANDLE const hDevice, uint32_t* const pOscCount) +{ + ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice; + +#ifdef ADI_DEBUG + if (ADI_RNG_INVALID_HANDLE(pDevice)){ + return ADI_RNG_BAD_DEV_HANDLE; + } + + if (NULL == pDevice->pData) { + return ADI_RNG_NOT_INITIALIZED; + } + + if (NULL == pOscCount) { + return (ADI_RNG_INVALID_PARAM); + } + + if ((pDevice->pRNG->STAT & BITM_RNG_STAT_RNRDY) == 0u) { + return ADI_RNG_INVALID_STATE; + } +#endif + + /* Get the oscillator count high count */ + *pOscCount = pDevice->pRNG->OSCCNT; + + return ADI_RNG_SUCCESS; +} + +/*! + * @brief Retrieve the current RNG Oscillator difference value for the given index. + * + * @param[in] hDevice Device handle obtained from adi_rng_Open(). + * @param[in] nIndex Index of the difference register. + * @param[out] pOscDiff Pointer to an application-defined variable into which to + * write the oscillator difference value for the given index. + * + * @return Status + * - #ADI_RNG_SUCCESS Call completed successfully. + * - #ADI_RNG_BAD_DEV_HANDLE [D] Invalid device handle parameter. + * - #ADI_RNG_NOT_INITIALIZED [D] Device has not been initialized for use, see #adi_rng_Open(). + * - #ADI_RNG_INVALID_STATE[D] Random number ready status is not set + - #ADI_RNG_INVALID_PARAM [D] Argument is incorrect. + * + * @sa adi_rng_Open(). + * @sa adi_Rng_RegisterCallback(). + */ +ADI_RNG_RESULT adi_rng_GetOscDiff ( + ADI_RNG_HANDLE const hDevice, + uint32_t const nIndex, + uint8_t* const pOscDiff + ) +{ + ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice; + +#ifdef ADI_DEBUG + if (ADI_RNG_INVALID_HANDLE(pDevice)){ + return ADI_RNG_BAD_DEV_HANDLE; + } + + if (NULL == pDevice->pData) { + return ADI_RNG_NOT_INITIALIZED; + } + + if ((NULL == pOscDiff) || (nIndex > 3u)) { + return( ADI_RNG_INVALID_PARAM ); + } + + if ((pDevice->pRNG->STAT & BITM_RNG_STAT_RNRDY) == 0u) { + return ADI_RNG_INVALID_STATE; + } +#endif + + /* Get the Osc Difference Register */ + *pOscDiff = (uint8_t)pDevice->pRNG->OSCDIFF[nIndex]; + + return ADI_RNG_SUCCESS; +} + +/*! + * @brief Retrieve the current RNG sample length prescale and reload value configured in the device. + * + * @param[in] hDevice Device handle obtained from adi_rng_Open(). + * @param[out] pLenPrescaler Pointer to an application-defined variable into which the prescaler value is written. + * @param[out] pLenReload Pointer to an application-defined variable into which the reload value for the sample counter is written. + * + * @return Status + * - #ADI_RNG_SUCCESS Call completed successfully. + * - #ADI_RNG_BAD_DEV_HANDLE [D] Invalid device handle parameter. + * - #ADI_RNG_NOT_INITIALIZED [D] Device has not been initialized for use, see #adi_rng_Open(). + - #ADI_RNG_INVALID_PARAM [D] Argument is incorrect. + * + * + * @sa adi_rng_Open(). + * @sa adi_rng_RegisterCallback(). + */ +ADI_RNG_RESULT adi_rng_GetSampleLen ( + ADI_RNG_HANDLE const hDevice, + uint16_t* const pLenPrescaler, + uint16_t* const pLenReload + ) +{ + ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice; + +#ifdef ADI_DEBUG + if (ADI_RNG_INVALID_HANDLE(pDevice)){ + return ADI_RNG_BAD_DEV_HANDLE; + } + + if (NULL == pDevice->pData) { + return ADI_RNG_NOT_INITIALIZED; + } + + if ((NULL == pLenPrescaler) || (NULL == pLenReload)) { + return ADI_RNG_INVALID_PARAM; + } +#endif + + *pLenPrescaler = (pDevice->pRNG->LEN & BITM_RNG_LEN_PRESCALE) >> BITP_RNG_LEN_PRESCALE; + *pLenReload = (pDevice->pRNG->LEN & BITM_RNG_LEN_RELOAD) >> BITP_RNG_LEN_RELOAD; + + return ADI_RNG_SUCCESS; +} + + +/************************************************************************************************* +************************************************************************************************** +***************************************** CALLBACKS ****************************************** +***************************************** AND ****************************************** +***************************************** INTERRUPT ****************************************** +************************************************************************************************** +*************************************************************************************************/ + + +/*! + @brief RNG Application callback registration API. + + @param[in] hDevice Device handle obtained from #adi_rng_Open(). + @param[in] cbFunc Application callback address; the function to call on the interrupt. + @param[in] pCBParam Application handle to be passed in the call back. + + @return Status + - #ADI_RNG_SUCCESS The callback is successfully registered. + - #ADI_RNG_BAD_DEV_HANDLE [D] Invalid device handle parameter. + - #ADI_RNG_NOT_INITIALIZED [D] Device has not been initialized for use, see #adi_rng_Open(). + + Registers an application-defined callback \a cbFunc function address of type ADI_CALLBACK with the RNG device driver. + Callbacks are made in response to received RNG interrupts. + + The callback to the application is made in context of the originating interrupt (i.e., the RNG driver's + RNG interrupt handler that is registered in the system's interrupt vector table). Extended processing + during the callback (an extension of the RNG's interrupt handler) is discouraged so as to avoid lower-priority + interrupt blocking. Also, any register read-modify-write operations should be protected using the + ADI_ENTER_CRITICAL_REGION()/ADI_EXIT_CRITICAL_REGION() pair to prevent higher-priority interrupts from modifying + said register during the read-modify-write operation. + + @note CALLBACKS: RNG interrupt callbacks are \b disabled by default during RNG device driver + initialization (#adi_rng_Open()). The application uses the #adi_rng_RegisterCallback() + API to request an application-defined callback from the RNG device driver. The RNG device + driver clears the interrupt when the callback exits. + The application callback should avoid extended processing + during callbacks as the callback is executing context of the initiating interrupt and will + block lower-priority interrupts. If extended application-level interrupt processing is + required, the application should schedule it for the main application loop and exit the + callback as soon as possible.\n + + + @sa adi_rng_Open(). +*/ +ADI_RNG_RESULT adi_rng_RegisterCallback ( + ADI_RNG_HANDLE hDevice, + ADI_CALLBACK cbFunc, + void *pCBParam) +{ + ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)hDevice; + +#ifdef ADI_DEBUG + if (ADI_RNG_INVALID_HANDLE(pDevice)){ + return ADI_RNG_BAD_DEV_HANDLE; + } + + if (NULL == pDevice->pData) { + return ADI_RNG_NOT_INITIALIZED; + } +#endif + + /* save the callback info */ + pDevice->pData->CBFunc = cbFunc; + pDevice->pData->pCBParam = pCBParam; + + if (NULL != cbFunc) { + /* enable RNG interrupts in NVIC */ + NVIC_EnableIRQ(pDevice->pData->IRQn); + } else { + NVIC_DisableIRQ(pDevice->pData->IRQn); + } + + return ADI_RNG_SUCCESS; +} + +/*! \cond PRIVATE */ +/* RNG driver interrupt handler. Overrides weak default handler in startup file */ +void RNG_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_RNG_DEV_TYPE *pDevice = &gRNG_Device[0]; + register uint16_t candidate; + + /* if we have an initialized driver... */ + if (NULL != pDevice->pData) + { + /* if we have a registered callback */ + if (NULL != pDevice->pData->CBFunc) + { + ADI_INT_STATUS_ALLOC(); + + ADI_ENTER_CRITICAL_REGION(); + /* read status register without other interrupts in between */ + candidate = pDevice->pRNG->STAT; + ADI_EXIT_CRITICAL_REGION(); + + /* Only have bits in stat that are necessary */ + candidate = candidate & (BITM_RNG_STAT_STUCK | BITM_RNG_STAT_RNRDY); + + while (0u != candidate) { + uint32_t nEvent; + + if (0u != (candidate & BITM_RNG_STAT_RNRDY)) { + nEvent = ADI_RNG_EVENT_READY; + candidate &= (uint16_t)~BITM_RNG_STAT_RNRDY; + } else if (0u != (candidate & BITM_RNG_STAT_STUCK)) { + nEvent = ADI_RNG_EVENT_STUCK; + candidate &= (uint16_t)~BITM_RNG_STAT_STUCK; + } else { + break; + } + + pDevice->pData->CBFunc ( + pDevice->pData->pCBParam, + nEvent, + NULL + ); + } + + pDevice->pRNG->STAT = BITM_RNG_STAT_RNRDY | BITM_RNG_STAT_STUCK; + } + } + ISR_EPILOG(); +} +/*! \endcond */ + +/* +** EOF +*/ + +/*@}*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rng/adi_rng_def.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rng/adi_rng_def.h new file mode 100755 index 0000000000..462861d976 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rng/adi_rng_def.h @@ -0,0 +1,69 @@ +/*! + ***************************************************************************** + * @file: adi_rng_def.h + * @brief: Random Number Generator Driver private data structures + *---------------------------------------------------------------------------- + * +Copyright (c) 2012-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ +#ifndef ADI_RNG_DEF_H +#define ADI_RNG_DEF_H + + /*! \cond PRIVATE */ + + +/*! RNG device internal instance data structure */ +typedef struct __ADI_RNG_DEV_DATA_TYPE +{ + IRQn_Type IRQn; /*!< RNG interrupt number */ + ADI_CALLBACK CBFunc; /*!< Callback function */ + void *pCBParam; /*!< Callback parameter */ +} ADI_RNG_DEV_DATA_TYPE; + +/*! RNG device internal data structure */ +typedef struct __ADI_RNG_DEV_TYPE +{ + volatile ADI_RNG_TypeDef *pRNG; /*!< MMR address for this RNG */ + ADI_RNG_DEV_DATA_TYPE *pData; /*!< Pointer to instance data */ +} ADI_RNG_DEV_TYPE; + + +/*! \endcond */ +#endif /* ADI_RNG_DEF_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc.c new file mode 100755 index 0000000000..f4b91d4adb --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc.c @@ -0,0 +1,2608 @@ +/*! + ***************************************************************************** + * @file: adi_rtc.c + * @brief: Real-Time Clock Device Implementations. + * @version: $Revision: 35155 $ + * @date: $Date: 2016-07-26 13:09:22 -0400 (Tue, 26 Jul 2016) $ + *---------------------------------------------------------------------------- + * +Copyright (c) 2010-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ +/*! \addtogroup RTC_Driver RTC Driver + * @{ + * @brief Real Time Clock (RTC) Driver + * @details The RTC driver manages all instances of the RTC peripheral. + * @note The application must include drivers/rtc/adi_rtc.h to use this driver + */ + + +/*! \cond PRIVATE */ + + +#if defined ( __ADSPGCC__ ) +#define UNUSED __attribute__ ((unused)) +#else +#define UNUSED +#endif + +#include /* for 'NULL" definition */ +#include +#include +#include + + + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm011 (rule 6.3): Types which specify sign and size should be used +* We use bool which is accepted by MISRA but the toolchain does not accept it +* +* Pm123 (rule 8.5): there shall be no definition of objects or functions in a header file +* This isn't a header as such. +* +* Pm073 (rule 14.7): a function should have a single point of exit +* Pm143 (rule 14.7): a function should have a single point of exit at the end of the function +* Multiple returns are used for error handling. +* +* Pm050 (rule 14.2): a null statement shall only occur on a line by itself +* Needed for null expansion of ADI_INSTALL_HANDLER and others. +* +* Pm109 (rule 20.12): the time handling functions of library shall not be used +* Pm150 (rule 20.2): the names of standard library macros, objects and function shall not be reused +* Needed to implement the functions here. +* +* Pm129 (rule 12.7): bitwise operations shall not be performed on signed integer types +* The rule makes an exception for valid expressions. +* +* Pm029: this bitwise operation is in a boolean context - logical operators should not be confused with bitwise operators +* The rule is suppressed as the bitwise and logical operators are being used correctly and are not being confused +* +* Pm126: if the bitwise operators ~ and << are applied to an operand of underlying type 'unsigned char' or 'unsigned short', the result shall be immediately cast to the underlying type of the operand +* The behaviour as described is correct +* +* Pm031: bitwise operations shall not be performed on signed integer types +* Device drivers often require bit banging on MMRs that are defined as signed + +*/ +#pragma diag_suppress=Pm011,Pm123,Pm073,Pm143,Pm050,Pm109,Pm150,Pm140,Pm129,Pm029,Pm126,Pm031 +#endif /* __ICCARM__ */ +/*! \endcond */ + + +#include + + +/*! \cond PRIVATE */ + + +#include "adi_rtc_data.c" + + + + +/* Forward prototypes */ +void RTC0_Int_Handler(void); +void RTC1_Int_Handler(void); + + + +#ifdef ADI_DEBUG +static ADI_RTC_RESULT ValidateHandle( ADI_RTC_DEVICE *pInDevice) +{ + /* Return code */ + ADI_RTC_RESULT nResult = ADI_RTC_INVALID_HANDLE; + uint32_t i; + for(i = 0u; i < ADI_RTC_NUM_INSTANCE; i++) + { + if(aRTCDeviceInfo[i].hDevice == pInDevice) + { + return(ADI_RTC_SUCCESS); + } + } + return (nResult); +} +#endif +/*! \endcond */ + +/*! + @brief RTC Initialization + + * @param[in] DeviceNumber The RTC device instance number to be opened. + * @param[in] pDeviceMemory The pointer to the device memory passed by application. + * @param[in] MemorySize The memory size passed by application. + * @param[out] phDevice The pointer to a location where the handle to the opened RTC device is written. + @return Status + - #ADI_RTC_SUCCESS RTC device driver initialized successfully. + - #ADI_RTC_INVALID_INSTANCE [D] The RTC instance number is invalid. + - #ADI_RTC_FAILURE General RTC initialization failure. + + The RTC controller interrupt enable state is unaltered during driver initialization. + Use the #adi_rtc_EnableInterrupts API to manage interrupting. + + @note The contents of phDevice will be set to NULL upon failure.\n\n + + @note On #ADI_RTC_SUCCESS the RTC device driver is initialized and made ready for use, + though pending interrupts may be latched. During initialization, the content of the + various RTC control, count, alarm and status registers are untouched to preserve prior + RTC initializations and operation. The core NVIC RTC interrupt is enabled.\n\n + + + @note SAFE WRITES: The "safe write" mode is enabled by default and can be changed using the macro + "ADI_RTC_CFG_ENABLE_SAFE_WRITE" defined in adi_rtc_config.h file. + + @sa adi_rtc_Enable(). + @sa adi_rtc_EnableInterrupts(). + @sa adi_rtc_SetCount(). + @sa adi_rtc_Close() +*/ +ADI_RTC_RESULT adi_rtc_Open( + uint32_t DeviceNumber, + void *pDeviceMemory, + uint32_t MemorySize, + ADI_RTC_HANDLE *phDevice + ) +{ + ADI_RTC_DEVICE *pDevice = pDeviceMemory; + + /* store a bad handle in case of failure */ + *phDevice = (ADI_RTC_HANDLE) NULL; + +#ifdef ADI_DEBUG + if ( DeviceNumber >= ADI_RTC_NUM_INSTANCE) + { + return ADI_RTC_INVALID_INSTANCE; + } + assert(ADI_RTC_MEMORY_SIZE == sizeof(ADI_RTC_DEVICE)); + if (aRTCDeviceInfo[DeviceNumber].hDevice != NULL) + { + return ADI_RTC_IN_USE; + } + if(MemorySize < ADI_RTC_MEMORY_SIZE) + { + return(ADI_RTC_FAILURE); + } +#endif + + memset(pDeviceMemory,0,MemorySize); + /* initialize device data entries */ + pDevice->pRTCRegs = aRTCDeviceInfo[DeviceNumber].pRTCRegs; + + PEND_BEFORE_WRITE(SR1,BITM_RTC_SR1_WPNDCR0) + + pDevice->pRTCRegs->CR0 = 0u; + pDevice->pRTCRegs->CR1 = 0u; + + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR0,BITM_RTC_SR0_WSYNCCR0) + + PEND_BEFORE_WRITE(SR1,BITM_RTC_SR1_WPNDSR0) + + pDevice->pRTCRegs->SR0 = ADI_RTC_SR3_IRQ_STATUS_MASK; + SYNC_AFTER_WRITE(SR0,BITM_RTC_SR0_WSYNCSR0) + + pDevice->pRTCRegs->CNT0 = 0u; + pDevice->pRTCRegs->CNT1 = 0u; + SYNC_AFTER_WRITE(SR0,BITM_RTC_SR0_WSYNCCNT0) + + /* local pointer to instance data */ + aRTCDeviceInfo[DeviceNumber].hDevice = pDevice; + pDevice->pDeviceInfo = &aRTCDeviceInfo[DeviceNumber]; + + /* Use static configuration to initialize the RTC */ + rtc_init(pDevice,&aRTCConfig[DeviceNumber]); + + /* store handle at application handle pointer */ + *phDevice = pDevice; + pDevice->eIRQn = aRTCDeviceInfo[DeviceNumber].eIRQn; + /* Enable RTC interrupts in NVIC */ + NVIC_EnableIRQ((IRQn_Type)(pDevice->eIRQn)); + + return ADI_RTC_SUCCESS; /* initialized */ +} + + +/*! + * @brief Uninitialize and deallocate an RTC device. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + * Uninitialize and release an allocated RTC device for other use. The core NVIC RTC interrupt is disabled. + * + * @sa adi_rtc_Open(). + */ +ADI_RTC_RESULT adi_rtc_Close(ADI_RTC_HANDLE const hDevice) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + + /* uninitialize */ + NVIC_DisableIRQ( pDevice->eIRQn); + + pDevice->pRTCRegs = NULL; + pDevice->pfCallback = NULL; + pDevice->pCBParam = NULL; + pDevice->cbWatch = 0u; + + pDevice->pDeviceInfo->hDevice = NULL; + return ADI_RTC_SUCCESS; +} + + +/************************************************************************************************* +************************************************************************************************** +**************************************** ENABLE APIS ******************************************* +************************************************************************************************** +*************************************************************************************************/ + + +/*! + * @brief Enable RTC alarm. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] bEnable boolean Flag to enable/disable alarm logic. + * - true : Enable alarm logic. + * - false : Disable alarm logic. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + * Enable/disable operation of RTC internal alarm logic. + * + * Alarm events and interrupt notifications are gated by enabling the alarm logic. + * RTC alarm interrupts require both RTC device and RTC alarm interrupt to be enabled + * to have been set. + * + * The alarm is relative to some future alarm value match against the RTC counter. + * + * @note The RTC device driver does not modify the alarm enable on the hardware except through use of this API. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_Enable(). + * @sa adi_rtc_EnableInterrupts(). + * @sa adi_rtc_GetAlarm(). + * @sa adi_rtc_GetCount(). + * @sa adi_rtc_SetAlarm(). + * @sa adi_rtc_SetCount(). + */ +ADI_RTC_RESULT adi_rtc_EnableAlarm(ADI_RTC_HANDLE const hDevice, bool bEnable) +{ + ADI_RTC_DEVICE *pDevice = hDevice; +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR1,BITM_RTC_SR1_WPNDCR0) + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + /* set/clear RTC alarm enable */ + if (bEnable) + { + pDevice->pRTCRegs->CR0 |= BITM_RTC_CR0_ALMEN; + } + else + { + pDevice->pRTCRegs->CR0 &= (uint16_t)(~BITM_RTC_CR0_ALMEN); + } + ADI_EXIT_CRITICAL_REGION(); + + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR0,BITM_RTC_SR0_WSYNCCR0) + + return ADI_RTC_SUCCESS; +} + +/*! + * @brief Enable MOD60 RTC alarm. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] bEnable boolean Flag for enable/disable mod60 alarm logic. + * - true : Enable mod60 alarm logic. + * - false : Disable mod60 alarm logic. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + * Enable/disable operation of RTC internal MOD60 alarm logic. + * + * Alarm events and interrupt notifications are gated by enabling the alarm logic. + * RTC alarm interrupts require both RTC device and RTC alarm interrupt to be enabled + * to have been set. + * + * The alarm is relative to some future alarm value match against the RTC counter. + * + * @note The RTC device driver does not modify the alarm enable on the hardware except through use of this API. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_Enable(). + * @sa adi_rtc_EnableInterrupts(). + * @sa adi_rtc_GetAlarm(). + * @sa adi_rtc_GetCount(). + * @sa adi_rtc_SetAlarm(). + * @sa adi_rtc_SetCount(). + */ +ADI_RTC_RESULT adi_rtc_EnableMod60Alarm(ADI_RTC_HANDLE const hDevice, bool bEnable) +{ + ADI_RTC_DEVICE *pDevice = hDevice; +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } + /* Mod-60 Alarm is present only in RTC-1 */ + if(pDevice->pRTCRegs == pADI_RTC0) + { + return(ADI_RTC_OPERATION_NOT_ALLOWED); + } + +#endif + + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR1,BITM_RTC_SR1_WPNDCR0) + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + /* set/clear RTC alarm enable */ + if (bEnable) + { + pDevice->pRTCRegs->CR0 |= BITM_RTC_CR0_MOD60ALMEN; + } + else + { + pDevice->pRTCRegs->CR0 &= (uint16_t)(~BITM_RTC_CR0_MOD60ALMEN); + } + ADI_EXIT_CRITICAL_REGION(); + + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR0,BITM_RTC_SR0_WSYNCCR0) + + return ADI_RTC_SUCCESS; +} + +/*! + * @brief Enable RTC device. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] bEnable boolean Flag for enabling/disabling the RTC device. + * - true : Enable RTC device. + * - false : Disable RTC device. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + * Global enable/disable of the RTC controller. Enables counting of elapsed real time and acts + * as a master enable for the RTC. + * + * @note When enabled, the RTC input clock pre-scaler and trim interval are realigned. + * + * @note The RTC device driver does not modify the device enable on the hardware except through use of this API. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_EnableAlarm(). + */ + +ADI_RTC_RESULT adi_rtc_Enable(ADI_RTC_HANDLE const hDevice, bool bEnable) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR1,BITM_RTC_SR1_WPNDCR0) + + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + /* set/clear RTC device enable */ + if (bEnable) + { + pDevice->pRTCRegs->CR0 |= BITM_RTC_CR0_CNTEN; + } + else + { + pDevice->pRTCRegs->CR0 &=(uint16_t)(~BITM_RTC_CR0_CNTEN); + } + ADI_EXIT_CRITICAL_REGION(); + + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR0,BITM_RTC_SR0_WSYNCCR0) + + return ADI_RTC_SUCCESS; +} + + +/* Data structures used to manage the enabling of all RTC interrupts */ +static uint16_t cr0 = 0u, cr1 = 0u, cr3oc = 0u, cr4oc = 0u, cr2ic = 0u, cr5ocs = 0u; + +static struct xxx +{ + uint16_t *cr; + uint16_t bitPositionl; +} +Interrupt_Details[ADI_RTC_NUM_INTERRUPTS] = +{ + { &cr0, BITP_RTC_CR0_ALMINTEN }, + { &cr0, BITP_RTC_CR0_MOD60ALMINTEN }, + { &cr0, BITP_RTC_CR0_ISOINTEN }, + { &cr0, BITP_RTC_CR0_WPNDERRINTEN }, + { &cr0, BITP_RTC_CR0_WSYNCINTEN }, + { &cr0, BITP_RTC_CR0_WPNDINTEN }, + { &cr1, BITP_RTC_CR1_CNTINTEN }, + { &cr1, BITP_RTC_CR1_PSINTEN }, + { &cr1, BITP_RTC_CR1_TRMINTEN }, + { &cr1, BITP_RTC_CR1_CNTROLLINTEN }, + { &cr1, BITP_RTC_CR1_CNTMOD60ROLLINTEN }, + { &cr3oc, BITP_RTC_CR3SS_SS1IRQEN }, + { &cr3oc, BITP_RTC_CR3SS_SS2IRQEN }, + { &cr3oc, BITP_RTC_CR3SS_SS2IRQEN }, + { &cr3oc, BITP_RTC_CR3SS_SS4IRQEN }, + { &cr2ic, BITP_RTC_CR2IC_IC0IRQEN }, + { &cr2ic, BITP_RTC_CR2IC_IC2IRQEN }, + { &cr2ic, BITP_RTC_CR2IC_IC3IRQEN }, + { &cr2ic, BITP_RTC_CR2IC_IC4IRQEN }, + { &cr2ic, BITP_CLKG_OSC_CTL_LFX_FAIL_STA }, + { &cr3oc, BITM_RTC_CR3SS_SS4FEIRQEN}, + { &cr3oc, BITM_RTC_CR3SS_SS3FEIRQEN}, + { &cr3oc, BITM_RTC_CR3SS_SS2FEIRQEN}, + { &cr3oc, BITM_RTC_CR3SS_SS1FEIRQEN}, + { &cr4oc, BITP_RTC_CR4SS_SS4MSKEN}, + { &cr4oc, BITP_RTC_CR4SS_SS3MSKEN}, + { &cr4oc, BITP_RTC_CR4SS_SS2MSKEN}, + { &cr4oc, BITP_RTC_CR4SS_SS1MSKEN}, + { &cr5ocs, BITP_RTC_CR5SSS_SS3SMPMTCHIRQEN}, + { &cr5ocs, BITP_RTC_CR5SSS_SS2SMPMTCHIRQEN}, + { &cr5ocs, BITP_RTC_CR5SSS_SS1SMPMTCHIRQEN} + +}; + + +/*! + * @brief Manage interrupt enable/disable in the RTC and NVIC controller. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] Interrupts Conveys which interrupts are affected. + * @param[in] bEnable Flag which controls whether to enable or disable RTC interrupt. + * - true : Enable RTC interrupts. + * - false : Disable RTC interrupts. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + * Enable/disable RTC interrupt as well as manage global NVIC enable/disable for the RTC. + * Input parameter \a Interrupts is a interrupt ID of type #ADI_RTC_INT_TYPE designating the + * interrupt to be enabled or disabled. The interrupt parameter may be zero, which will then simply + * manage the NVIC RTC enable and leave the individual RTC interrupt enables unchanged. + * Input parameter \a bEnable controls whether to enable or disable the designated set of interrupts. + * + * @note The RTC device driver does not modify the interrupt enables on the hardware except through use of this API. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_Enable(). + */ +ADI_RTC_RESULT adi_rtc_EnableInterrupts (ADI_RTC_HANDLE const hDevice, ADI_RTC_INT_TYPE Interrupts, bool bEnable) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } + if( (pDevice->pRTCRegs == pADI_RTC0) &&(((uint16_t)((ADI_RTC_MOD60ALM_INT | ADI_RTC_ISO_DONE_INT| + ADI_RTC_COUNT_INT | + ADI_RTC_TRIM_INT | ADI_RTC_COUNT_ROLLOVER_INT | + ADI_RTC_MOD60_ROLLOVER_INT + )) & (uint16_t)Interrupts) != 0u)) + { + return(ADI_RTC_INVALID_PARAM); + } + + assert(sizeof(Interrupt_Details)/sizeof(Interrupt_Details[0]) == ADI_RTC_NUM_INTERRUPTS); +#endif + + /* TODO - more sync for new registers */ + PEND_BEFORE_WRITE(SR1,BITM_RTC_SR1_WPNDCR0) + PEND_BEFORE_WRITE(SR2,BITM_RTC_SR2_WPNDCR1MIR) + + uint8_t ndx = 0u; + cr0 = 0u; cr1 = 0u; cr3oc = 0u; cr4oc = 0u; cr2ic = 0u; cr5ocs = 0u; + + while( Interrupts ) + { + if( 0u != (Interrupts & 1u) ) + { + uint16_t *cr = Interrupt_Details[ndx].cr; + uint16_t enableBitPosition = Interrupt_Details[ndx].bitPositionl; + *cr = *cr | (1u << enableBitPosition); + } + Interrupts >>= 1; + ndx++; + } + /* set/clear interrupt enable bit(s) in control register */ + if (bEnable) + { + pDevice->pRTCRegs->CR0 |= cr0; + pDevice->pRTCRegs->CR1 |= cr1; + pDevice->pRTCRegs->CR3SS |= cr3oc; + pDevice->pRTCRegs->CR4SS |= cr4oc; + pDevice->pRTCRegs->CR2IC |= cr2ic; + pDevice->pRTCRegs->CR5SSS |= cr5ocs; + + } + else + { + pDevice->pRTCRegs->CR0 &= ~cr0; + pDevice->pRTCRegs->CR1 &= ~cr1; + pDevice->pRTCRegs->CR3SS &= ~cr3oc; + pDevice->pRTCRegs->CR4SS &= ~cr4oc; + pDevice->pRTCRegs->CR2IC &= ~cr2ic; + pDevice->pRTCRegs->CR5SSS &= ~cr5ocs; + } + SYNC_AFTER_WRITE(SR0,BITM_RTC_SR0_WSYNCCR0) + SYNC_AFTER_WRITE(SR2,BITM_RTC_SR2_WSYNCCR1MIR) + return ADI_RTC_SUCCESS; +} + + +/*! + * @brief Enable RTC automatic clock trimming. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] bEnable Flag controlling RTC enabling trim. + * - true Enable RTC trimming. + * - false Disable RTC trimming. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + * Enable/disable automatic application of trim values to the main RTC clock. Allows application + * of periodic real-time RTC clock adjustments to correct for drift. Trim values are pre-calibrated + * and stored at manufacture. Trim values may be recalibrated by monitoring the RTC clock externally + * and computing/storing new trim values (see #adi_rtc_SetTrim). + * + * @note The trim interval is reset with device enable, #adi_rtc_Enable(). + * + * @note The RTC device driver does not modify the trim enable on the hardware except through use of this API. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_Enable(). + * @sa adi_rtc_GetTrim(). + * @sa adi_rtc_SetTrim(). + */ +ADI_RTC_RESULT adi_rtc_EnableTrim (ADI_RTC_HANDLE const hDevice, bool bEnable) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR1,BITM_RTC_SR1_WPNDCR0) + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + /* set/clear trim enable bit(s) in control register */ + if (bEnable) + { + pDevice->pRTCRegs->CR0 |= BITM_RTC_CR0_TRMEN; + } + else + { + pDevice->pRTCRegs->CR0 &=(uint16_t)(~BITM_RTC_CR0_TRMEN); + } + ADI_EXIT_CRITICAL_REGION(); + + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR0,BITM_RTC_SR0_WSYNCCR0) + + return ADI_RTC_SUCCESS; +} +/*! + * @brief Enable input capture for the specified channel. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] eInpChannel Specify input compare channel. + * @param[in] bEnable Flag for enabling RTC input capture for specified channel. + * - true Enable input capture. + * - false Disable input capture. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + */ +ADI_RTC_RESULT adi_rtc_EnableInputCapture (ADI_RTC_HANDLE const hDevice,ADI_RTC_INPUT_CHANNEL eInpChannel, bool bEnable) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDCR2IC) + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + /* set/clear trim input capture enable for specified channel*/ + if (bEnable) + { + pDevice->pRTCRegs->CR2IC |=(uint16_t)eInpChannel; + } + else + { + pDevice->pRTCRegs->CR2IC &= (uint16_t)(~(uint16_t)eInpChannel); + } + ADI_EXIT_CRITICAL_REGION(); + + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR4,BITM_RTC_SR4_WSYNCCR2IC) + + return ADI_RTC_SUCCESS; +} + +/*! + * @brief Enable Overwrite of Unread Snapshots for all RTC Input Capture Channels. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] bEnable Flag for enabling overwriting the unread snapshot. + * - true Enable overwrite snapshot. + * - false Disable overwrite of snapshot. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + */ +ADI_RTC_RESULT adi_rtc_EnableOverwriteSnapshot (ADI_RTC_HANDLE const hDevice, bool bEnable) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDCR2IC) + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + /* set/clear trim input capture enable for specified channel*/ + if (bEnable) + { + pDevice->pRTCRegs->CR2IC |= BITM_RTC_CR2IC_ICOWUSEN; + } + else + { + pDevice->pRTCRegs->CR2IC &= (uint16_t)~BITM_RTC_CR2IC_ICOWUSEN; + } + ADI_EXIT_CRITICAL_REGION(); + + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR4,BITM_RTC_SR4_WSYNCCR2IC) + + return ADI_RTC_SUCCESS; +} + +/*! + * @brief Set input capture polarity for the specified channel. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] eInpChannel Specify which input capture channel. + * @param[in] bEnable Flag for selecting RTC input capture polarity. + * - false channel uses a *high-to-low* transition on its GPIO pin to signal an input capture event + * - true channel uses a *low-to-high* transition on its GPIO pin to signal an input capture event. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + */ +ADI_RTC_RESULT adi_rtc_SetInputCapturePolarity (ADI_RTC_HANDLE const hDevice,ADI_RTC_INPUT_CHANNEL eInpChannel, bool bEnable) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + uint32_t nInpChannel = (uint16_t)eInpChannel; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDCR2IC) + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + /* set/clear trim input capture enable for specified channel*/ + if (bEnable) + { + pDevice->pRTCRegs->CR2IC |= (uint16_t)(nInpChannel << BITP_RTC_CR2IC_IC0LH); + } + else + { + pDevice->pRTCRegs->CR2IC &= (uint16_t)~(nInpChannel << BITP_RTC_CR2IC_IC0LH); + } + ADI_EXIT_CRITICAL_REGION(); + + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR4,BITM_RTC_SR4_WSYNCCR2IC) + + return ADI_RTC_SUCCESS; +} +/*! + * @brief Enable output for the specified Sensor Strobe Channel. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] eSSChannel Specify which Sensor Strobe channel. + * @param[in] bEnable Flag for enabling output for specified Sensor Strobe channel. + * - true Enable output. + * - false Disable output. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + */ +ADI_RTC_RESULT adi_rtc_EnableSensorStrobeOutput (ADI_RTC_HANDLE const hDevice, ADI_RTC_SS_CHANNEL eSSChannel, bool bEnable) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDCR3SS) + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + /* set/clear Sensor Strobe enable for specified channel*/ + if (bEnable) + { + pDevice->pRTCRegs->CR3SS |=(uint16_t)eSSChannel; + } + else + { + pDevice->pRTCRegs->CR3SS &= (uint16_t)(~(uint16_t)eSSChannel); + } + ADI_EXIT_CRITICAL_REGION(); + + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR4,BITM_RTC_SR4_WSYNCCR3SS) + + return ADI_RTC_SUCCESS; +} + +/*! + * @brief Enable auto reload for given Sensor Strobe Channel. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] eSSChannel Sensor Strobe Channel number. + * @param[in] bEnable Flag to enable auto reload for given Sensor Strobe Channel. + * - true Enable auto reload. + * - false Disable auto reload. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + */ +ADI_RTC_RESULT adi_rtc_EnableAutoReload(ADI_RTC_HANDLE const hDevice, ADI_RTC_SS_CHANNEL eSSChannel, bool bEnable) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDCR4SS) + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + /* set/clear auto reload enable options */ + /* Note that channel 4 does not have this feature */ + if (bEnable) + { + switch( eSSChannel) + { + case ADI_RTC_SS_CHANNEL_1: + pDevice->pRTCRegs->CR4SS |= BITM_RTC_CR4SS_SS1ARLEN; + break; + case ADI_RTC_SS_CHANNEL_2: + pDevice->pRTCRegs->CR4SS |= BITM_RTC_CR4SS_SS2ARLEN; + break; + case ADI_RTC_SS_CHANNEL_3: + pDevice->pRTCRegs->CR4SS |= BITM_RTC_CR4SS_SS3ARLEN; + break; + default: + return ADI_RTC_FAILURE; + } + + } + else + { + switch( eSSChannel) + { + case ADI_RTC_SS_CHANNEL_1: + pDevice->pRTCRegs->CR4SS &= (uint16_t)~BITM_RTC_CR4SS_SS1ARLEN; + break; + case ADI_RTC_SS_CHANNEL_2: + pDevice->pRTCRegs->CR4SS &= (uint16_t)~BITM_RTC_CR4SS_SS2ARLEN; + break; + case ADI_RTC_SS_CHANNEL_3: + pDevice->pRTCRegs->CR4SS &= (uint16_t)~BITM_RTC_CR4SS_SS3ARLEN; + break; + default: + return ADI_RTC_FAILURE; + } + } + ADI_EXIT_CRITICAL_REGION(); + + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR4,BITM_RTC_SR4_WSYNCCR4SS) + + return ADI_RTC_SUCCESS; +} +/*! + * @brief Set auto reload value for the given Sensor Strobe channel. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] eSSChannel Sensor Strobe channel for which auto reload to be set. + * @param[in] nValue Auto reload value to be set. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + * + */ +ADI_RTC_RESULT adi_rtc_SetAutoReloadValue(ADI_RTC_HANDLE const hDevice, ADI_RTC_SS_CHANNEL eSSChannel, uint16_t nValue) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + + switch( eSSChannel ) + { + case ADI_RTC_SS_CHANNEL_1: + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDSS1) + pDevice->pRTCRegs->SS1 = nValue; + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR4,BITM_RTC_SR4_WSYNCSS1) + break; + + case ADI_RTC_SS_CHANNEL_2: + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDSS2) + pDevice->pRTCRegs->SS2 = nValue; + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR4,BITM_RTC_SR4_WSYNCSS2) + break; + + case ADI_RTC_SS_CHANNEL_3: + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDSS3) + pDevice->pRTCRegs->SS3 = nValue; + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR4,BITM_RTC_SR4_WSYNCSS3) + break; + + case ADI_RTC_SS_CHANNEL_4: + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDSS4) + pDevice->pRTCRegs->SS4 = nValue; + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR4,BITM_RTC_SR4_WSYNCSS4) + break; + + default: + return ADI_RTC_FAILURE; + + } + + return ADI_RTC_SUCCESS; +} +/*! + * @brief Enable or disable thermometer-code masking for the given Sensor Strobe Channel. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] eSSChannel Sensor Strobe channel for which thermometer-code masking to be enabled or disabled. + * @param[in] bEnable Flag to enable or disable masking for the given Sensor Strobe channel. + * - true Enable masking . + * - false Disable masking. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + */ +ADI_RTC_RESULT adi_rtc_EnableSensorStrobeChannelMask(ADI_RTC_HANDLE const hDevice, ADI_RTC_SS_CHANNEL eSSChannel, bool bEnable) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR5, BITM_RTC_SR5_WPENDCR4SS) + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + /* set/clear auto reload enable options */ + if (bEnable) + { + pDevice->pRTCRegs->CR4SS |= (uint16_t)eSSChannel; + } + else + { + pDevice->pRTCRegs->CR4SS &= (uint16_t)~(uint16_t)eSSChannel; + } + ADI_EXIT_CRITICAL_REGION(); + + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR4,BITM_RTC_SR4_WSYNCCR4SS) + + return ADI_RTC_SUCCESS; +} + +/*! + * @brief To set channel mask for the given Sensor Strobe channel. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] eSSChannel Sensor Strobe Channel for which the mask to be set. + * @param[in] nMask Channel Mask to be set for Sensor Strobe channel. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_RTC_INVALID_CHANNEL The given channel is invalid. + */ +ADI_RTC_RESULT adi_rtc_SetSensorStrobeChannelMask(ADI_RTC_HANDLE const hDevice, ADI_RTC_SS_CHANNEL eSSChannel, uint8_t nMask) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + uint16_t MaskPos = 0u; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + + switch( eSSChannel ) + { + case ADI_RTC_SS_CHANNEL_1: + MaskPos = (uint16_t)BITP_RTC_SSMSK_SS1MSK; + break; + + case ADI_RTC_SS_CHANNEL_2: + MaskPos = (uint16_t)BITP_RTC_SSMSK_SS2MSK; + break; + + case ADI_RTC_SS_CHANNEL_3: + MaskPos = (uint16_t)BITP_RTC_SSMSK_SS3MSK; + break; + + case ADI_RTC_SS_CHANNEL_4: + MaskPos = (uint16_t)BITP_RTC_SSMSK_SS4MSK; + break; + + default: + return ADI_RTC_INVALID_CHANNEL; + } + + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR5, BITM_RTC_SR5_WPENDSSMSK) + + pDevice->pRTCRegs->SSMSK = ((uint16_t)nMask & 0xFu) << MaskPos; + + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR4, BITM_RTC_SR4_WSYNCSSMSK) + + return ADI_RTC_SUCCESS; +} + +/************************************************************************************************* +************************************************************************************************** +****************************************** GET APIS ****************************************** +************************************************************************************************** +*************************************************************************************************/ + + +/*! + * @brief Get current RTC alarm value. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[out] pAlarm Pointer to application memory where the alarm value is written. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_RTC_INVALID_PARAM [D] NULL pointer for input parameter. + * + * Read the currently programmed 32-bit RTC alarm value and write it to the address provided by parameter \a pAlarm. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_SetAlarm(). + */ +ADI_RTC_RESULT adi_rtc_GetAlarm (ADI_RTC_HANDLE hDevice, uint32_t *pAlarm) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + uint32_t nAlarm; +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR1,(BITM_RTC_SR1_WPNDALM0|BITM_RTC_SR1_WPNDALM1)) + + /* disable interrupts during paired read */ + NVIC_DisableIRQ(pDevice->eIRQn); + nAlarm =(uint32_t) pDevice->pRTCRegs->ALM1 << 16u; + nAlarm |= (uint32_t)pDevice->pRTCRegs->ALM0; + NVIC_EnableIRQ((IRQn_Type)(pDevice->eIRQn)); + + *pAlarm = nAlarm; + + return ADI_RTC_SUCCESS; +} +/*! + * @brief Get current RTC alarm value with fractional part also. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[out] pAlarm Pointer to application memory where the alarm value is written. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_RTC_INVALID_PARAM [D] NULL pointer for input parameter. + * + * Read the currently programmed 32-bit RTC alarm value and write it to the address provided by parameter \a pAlarm. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_SetAlarm(). + */ +ADI_RTC_RESULT adi_rtc_GetAlarmEx (ADI_RTC_HANDLE hDevice, float *pAlarm) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + uint32_t nAlarm,nTemp; + uint16_t nPreScale; + float fFraction; +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR1,(BITM_RTC_SR1_WPNDALM0|BITM_RTC_SR1_WPNDALM1)) + nPreScale = (pDevice->pRTCRegs->CR1&BITM_RTC_CR1_PRESCALE2EXP)>>BITP_RTC_CR1_PRESCALE2EXP; + /* disable interrupts during paired read */ + NVIC_DisableIRQ(pDevice->eIRQn); + nAlarm = (uint32_t)pDevice->pRTCRegs->ALM1 << 16u; + nAlarm |= (uint32_t)pDevice->pRTCRegs->ALM0; + NVIC_EnableIRQ((IRQn_Type)pDevice->eIRQn); + nTemp = 1lu<pRTCRegs->ALM2 /(float)(nTemp); + + *pAlarm = (float)nAlarm+fFraction; + + return ADI_RTC_SUCCESS; +} + + +/*! + * @brief Get current RTC control register value. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] eRegister Specify which register content need to be returned. + * + * @param[out] pControl Pointer to application memory where the control register value is written. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_RTC_INVALID_PARAM [D] NULL pointer for input parameter. + * + * Read the currently programmed 16-bit RTC control register value and write it to the address provided by parameter \a pControl. + * + * @sa adi_rtc_Open(). + * @sa adi_rtcSetControl(). + */ +ADI_RTC_RESULT adi_rtc_GetControl (ADI_RTC_HANDLE hDevice, ADI_RTC_CONTROL_REGISTER eRegister ,uint32_t *pControl) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR1,BITM_RTC_SR1_WPNDCR0) + + switch(eRegister) + { + case ADI_RTC_CONTROL_REGISTER_0: + *pControl = pDevice->pRTCRegs->CR0; + break; + case ADI_RTC_CONTROL_REGISTER_1: + *pControl = pDevice->pRTCRegs->CR1; + break; + default: + return(ADI_RTC_FAILURE); + } + return ADI_RTC_SUCCESS; +} + + +/*! + * @brief Get current RTC count value. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[out] pCount Pointer to application memory where the count value is written. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_RTC_INVALID_PARAM [D] NULL pointer for input parameter. + * + * Read the current 32-bit RTC count value and write it to the address provided by parameter \a pCount. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_Enable(). + * @sa adi_rtc_SetCount(). + */ +ADI_RTC_RESULT adi_rtc_GetCount(ADI_RTC_HANDLE const hDevice, uint32_t *pCount) +{ + uint32_t nCount; + ADI_RTC_DEVICE *pDevice = hDevice; +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + + /* Wait till previously posted write to couunt Register to complete */ + PEND_BEFORE_WRITE(SR1,(BITM_RTC_SR1_WPNDCNT0|BITM_RTC_SR1_WPNDCNT1)) + + /* disable interrupts during paired read */ + NVIC_DisableIRQ(pDevice->eIRQn); + nCount = (uint32_t)pDevice->pRTCRegs->CNT1 << 16u; + nCount |= pDevice->pRTCRegs->CNT0; + *pCount = nCount; + NVIC_EnableIRQ((IRQn_Type)pDevice->eIRQn); + + return ADI_RTC_SUCCESS; +} +/*! + * @brief Get current RTC count value with fraction. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[out] pfCount Pointer to application memory where the count(with fraction) value is written. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_RTC_INVALID_PARAM [D] NULL pointer for input parameter. + * + * Read the current 32-bit RTC count value and write it to the address provided by parameter \a pCount. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_Enable(). + * @sa adi_rtc_SetCount(). + */ +ADI_RTC_RESULT adi_rtc_GetCountEx(ADI_RTC_HANDLE const hDevice, float *pfCount) +{ + uint32_t nCount,nTemp; + uint16_t nPrescale; + ADI_RTC_DEVICE *pDevice = hDevice; + float fFraction; +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + /* Wait till previously posted write to couunt Register to complete */ + PEND_BEFORE_WRITE(SR1,(BITM_RTC_SR1_WPNDCNT0|BITM_RTC_SR1_WPNDCNT1)) + nPrescale = (pDevice->pRTCRegs->CR1&BITM_RTC_CR1_PRESCALE2EXP)>>BITP_RTC_CR1_PRESCALE2EXP; + /* disable interrupts during paired read */ + NVIC_DisableIRQ(pDevice->eIRQn); + nCount = (uint32_t)pDevice->pRTCRegs->CNT1 << 16u; + nCount |= pDevice->pRTCRegs->CNT0; + nTemp = (1lu<pRTCRegs->CNT2/(float)(nTemp); + NVIC_EnableIRQ((IRQn_Type)pDevice->eIRQn); + *pfCount = (float)nCount+ fFraction; + + return ADI_RTC_SUCCESS; +} +/*! + * @brief Get current RTC count value of all registers. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[out] pnCount Pointer to application memory where the count's 32 MSB are written. + * @param[out] pfCount Pointer to application memory where the count's 16 LSB are written. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_RTC_INVALID_PARAM [D] NULL pointer for input parameter. + * + * Read the current 32-bit RTC count integer value and fractional value in the integer format. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_Enable(). + * @sa adi_rtc_SetCount(). + */ +ADI_RTC_RESULT adi_rtc_GetCountRegs(ADI_RTC_HANDLE const hDevice, uint32_t *pnCount, uint32_t *pfCount) +{ + uint32_t nCount; + ADI_RTC_DEVICE *pDevice = hDevice; +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + /* Wait till previously posted write to couunt Register to complete */ + PEND_BEFORE_WRITE(SR1,(BITM_RTC_SR1_WPNDCNT0|BITM_RTC_SR1_WPNDCNT1)) + /* disable interrupts during paired read */ + NVIC_DisableIRQ(pDevice->eIRQn); + nCount = (uint32_t)pDevice->pRTCRegs->CNT1 << 16u; + nCount |= pDevice->pRTCRegs->CNT0; + *pnCount= nCount; + *pfCount = (uint32_t)pDevice->pRTCRegs->CNT2; + NVIC_EnableIRQ((IRQn_Type)pDevice->eIRQn); + return ADI_RTC_SUCCESS; +} + + + +/*! + * @brief Get current RTC clock trim value. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[out] peTrim Pointer to #ADI_RTC_TRIM_VALUE where the trim value is to be written. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_RTC_INVALID_PARAM [D] NULL pointer for input parameter. + * + * Read the current 16-bit RTC trim value and write it to the address provided by parameter \a pTrim. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_EnableInterrupts(). + * @sa adi_rtc_EnableTrim(). + * @sa adi_rtc_GetWritePendStatus(). + * @sa adi_rtc_GetWriteSyncStatus(). + * @sa adi_rtc_SetTrim(). + */ +ADI_RTC_RESULT adi_rtc_GetTrim (ADI_RTC_HANDLE hDevice, ADI_RTC_TRIM_VALUE *peTrim) +{ + ADI_RTC_DEVICE *pDevice = hDevice; +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } + if(peTrim == NULL) + { + return( ADI_RTC_INVALID_PARAM); + } +#endif + + /* Wait till previously posted write to couunt Register to complete */ + PEND_BEFORE_WRITE(SR1,BITM_RTC_SR1_WPNDTRM); + + *peTrim =(ADI_RTC_TRIM_VALUE)(pDevice->pRTCRegs->TRM & BITM_RTC_TRM_VALUE); + + return ADI_RTC_SUCCESS; +} +/*! + * @brief Get Sensor Strobe value for the given Sensor Strobe channel. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] eSSChannel Sensor Strobe Channel whose value to be read. + * @param[out] pValue Pointer to application memory where the Sensor Strobe value to be written. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_RTC_INVALID_PARAM [D] NULL pointer for input parameter. + * + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_Enable(). + * @sa adi_rtc_SetCount(). + */ +ADI_RTC_RESULT adi_rtc_GetSensorStrobeValue(ADI_RTC_HANDLE const hDevice, ADI_RTC_SS_CHANNEL eSSChannel, uint16_t *pValue) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + switch( eSSChannel ) + { + case ADI_RTC_SS_CHANNEL_1: + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDSS1) + *pValue = pDevice->pRTCRegs->SS1; + break; + + case ADI_RTC_SS_CHANNEL_2: + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDSS2) + *pValue = pDevice->pRTCRegs->SS2; + break; + + case ADI_RTC_SS_CHANNEL_3: + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDSS3) + *pValue = pDevice->pRTCRegs->SS3; + break; + + case ADI_RTC_SS_CHANNEL_4: + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDSS4) + *pValue = pDevice->pRTCRegs->SS4; + break; + + default: + return ADI_RTC_FAILURE; + } + + + + return ADI_RTC_SUCCESS; +} +/*! + * @brief Set Sensor Strobe value for the given Sensor Strobe channel. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] eSSChannel Sensor Strobe Channel. + * @param[out] nValue Sensor Strobe value to be set for the given Sensor Strobe channel . + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_RTC_INVALID_PARAM [D] NULL pointer for input parameter. + * + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_Enable(). + * @sa adi_rtc_SetCount(). + */ +ADI_RTC_RESULT adi_rtc_SetSensorStrobeValue(ADI_RTC_HANDLE const hDevice, ADI_RTC_SS_CHANNEL eSSChannel, uint16_t nValue) +{ + ADI_RTC_DEVICE *pDevice = hDevice; +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + + switch( eSSChannel ) + { + case ADI_RTC_SS_CHANNEL_1: + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDSS1) + pDevice->pRTCRegs->SS1 = nValue; + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR4,BITM_RTC_SR4_WSYNCSS1) + break; + + case ADI_RTC_SS_CHANNEL_2: + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDSS2) + pDevice->pRTCRegs->SS2 = nValue; + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR4,BITM_RTC_SR4_WSYNCSS2) + break; + + case ADI_RTC_SS_CHANNEL_3: + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDSS3) + pDevice->pRTCRegs->SS3 = nValue; + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR4,BITM_RTC_SR4_WSYNCSS3) + break; + + case ADI_RTC_SS_CHANNEL_4: + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR5,BITM_RTC_SR5_WPENDSS4) + pDevice->pRTCRegs->SS4 = nValue; + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR4,BITM_RTC_SR4_WSYNCSS4) + break; + + default: + return ADI_RTC_FAILURE; + } + + return ADI_RTC_SUCCESS; +} + +/*! + * @brief Get input capture value for specified input channel. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] eChannel Specify which input capture channel. + * @param[out] pValue Pointer to application memory where the input capture value to be written. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_RTC_INVALID_PARAM [D] NULL pointer for input parameter. + * - #ADI_RTC_INVALID_CHANNEL [D] Input channel-0 is not valid for this operation since + * channel-0 can provide precise (47bit) capture value. + * + * + * + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_Enable(). + * @sa adi_rtc_SetCount(). + */ +ADI_RTC_RESULT adi_rtc_GetInputCaptureValue(ADI_RTC_HANDLE const hDevice,ADI_RTC_INPUT_CHANNEL eChannel, uint16_t *pValue) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + ADI_RTC_RESULT eResult= ADI_RTC_SUCCESS; + +#ifdef ADI_DEBUG + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + switch(eChannel) + { + case ADI_RTC_INPUT_CHANNEL_2: + *pValue = pDevice->pRTCRegs->IC2; + break; + case ADI_RTC_INPUT_CHANNEL_3: + *pValue = pDevice->pRTCRegs->IC3; + break; + + case ADI_RTC_INPUT_CHANNEL_4: + *pValue = pDevice->pRTCRegs->IC4; + break; + default: + eResult = ADI_RTC_INVALID_CHANNEL; + break; + } + return(eResult); +} +/*! + * @brief Get snapshot of the value of RTC . + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] eChannel Specify input channel from which captured value to be obtained. + * @param[in] pFraction Pointer to application memory where the fractional part of snap shot value to be written. + * @param[out] pValue Pointer to application memory where the snap shot value of RTC to be written. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_RTC_INVALID_PARAM [D] NULL pointer for input parameter. + * + * + * + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_Enable(). + * @sa adi_rtc_SetCount(). + */ +ADI_RTC_RESULT adi_rtc_GetSnapShot(ADI_RTC_HANDLE const hDevice,ADI_RTC_INPUT_CHANNEL eChannel, uint32_t *pValue, uint16_t *pFraction) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + ADI_RTC_RESULT eResult= ADI_RTC_SUCCESS; + uint32_t nCount = 0u; +#ifdef ADI_DEBUG + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + /* disable interrupts during paired read */ + NVIC_DisableIRQ(pDevice->eIRQn); + nCount = (uint32_t)pDevice->pRTCRegs->SNAP1 << 16u; + nCount |= pDevice->pRTCRegs->SNAP0; + *pFraction = pDevice->pRTCRegs->SNAP2; + *pValue = nCount; + NVIC_EnableIRQ((IRQn_Type)pDevice->eIRQn); + return(eResult); +} + + +/*! + * @brief Get current RTC posted write pending status. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[out] pPendBits Pointer to application memory where the posted write status is written. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_RTC_INVALID_PARAM [D] NULL pointer for input parameter. + * + * + * \b Pending \b Writes: Register writes to internal RTC registers take time to complete because the RTC controller + * clock is running at a much slower (32kHz) rate than the core processor clock. So each RTC write register has a + * one-deep FIFO to hold write values until the RTC can effect them. This gives rise to the notion of a \a pending + * \a write state: if a write is already pending and another write from the core comes along before the first (pending) + * write has cleared to its destination register, the second write may be lost because the FIFO is full already. + * + * To avoid data loss, the user may tell the RTC device driver to enforce safe writes with the configuration switch + * ADI_RTC_CFG_ENABLE_SAFE_WRITE. Enabeling safe writes (on be default) insures write data is never lost by + * detecting and pausing on pending writes prior writing new data. The penalty in using safe writes is the stall + * overhead in execution (which is not incurred if there is nothing pending). Additionally, \a all pending writes + * may also be synchronized manually with the #adi_rtc_SynchronizeAllWrites() API, which will pause until all + * pending RTC writes have completed. + * + * The distinction between "pend" status (#adi_rtc_GetWritePendStatus()) and "sync" (#adi_rtc_GetWriteSyncStatus()) + * status is that the \a pend state is normally clear and is set only while no room remains in a register's write FIFO, + * whereas \a sync state is normally set and is clear only while the effects of the write are not yet apparent. + * + * Each write error + * source may be configured to interrupt the core by enabling the appropriate + * write error interrupt mask bit in the RTC control register (see the + * #adi_rtc_EnableInterrupts() API), at which time, the RTC interrupt handler + * will be dispatched. + * + * @sa adi_rtc_Open(). + * @sa #adi_rtc_EnableInterrupts(). + * @sa adi_rtc_GetWriteSyncStatus(). + * @sa adi_rtc_SynchronizeAllWrites(). + */ +ADI_RTC_RESULT adi_rtc_GetWritePendStatus (ADI_RTC_HANDLE const hDevice, ADI_RTC_WRITE_STATUS *pPendBits) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + uint16_t nPendBits; +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + /* get the value */ + nPendBits = pDevice->pRTCRegs->SR1 & ADI_RTC_WRITE_STATUS_MASK; + *pPendBits = (ADI_RTC_WRITE_STATUS)nPendBits; + + return ADI_RTC_SUCCESS; +} + + +/*! + * @brief Get current RTC posted write synchronization status. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[out] pSyncBits Pointer to application memory where the posted write status is written. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_RTC_INVALID_PARAM [D] NULL pointer for input parameter. + * + * + * \b Pending \b Writes: Register writes to internal RTC registers take time to complete because the RTC controller + * clock is running at a much slower (32kHz) rate than the core processor clock. So each RTC write register has a + * one-deep FIFO to hold write values until the RTC can effect them. This gives rise to the notion of a \a pending + * \a write state: if a write is already pending and another write from the core comes along before the first (pending) + * write has cleared to its destination register, the second write may be lost because the FIFO is full already. + * + * To avoid data loss, the user may tell the RTC device driver to enforce safe writes with the + * #ADI_RTC_CFG_ENABLE_SAFE_WRITE switch. Enabling safe writes (on be default) insures write data is never lost by + * detecting and pausing on pending writes prior writing new data. The penalty in using safe writes is the stall + * overhead in execution (which is not incurred if there is nothing pending). Additionally, \a all pending writes + * may also be synchronized manually with the #adi_rtc_SynchronizeAllWrites() API, which will pause until all + * pending RTC writes have completed. + * + * The distinction between "pend" status (#adi_rtc_GetWritePendStatus()) and "sync" (#adi_rtc_GetWriteSyncStatus()) + * status is that the \a pend state is normally clear is set only while no room remains in a register's write FIFO, + * whereas \a sync state is normally set and is clear only while the effects of the write are not yet apparent. + * + * Each write error source may be configured to interrupt the core by enabling + * the appropriate write error interrupt mask bit in the RTC control register + * (see the #adi_rtc_EnableInterrupts() API), at which time, the RTC interrupt + * handler will be dispatched. + * + * @sa adi_rtc_Open(). + * @sa #adi_rtc_EnableInterrupts(). + * @sa adi_rtc_GetWritePendStatus(). + * @sa adi_rtcStallOnPendingWrites(). + * @sa adi_rtc_SynchronizeAllWrites(). + */ +ADI_RTC_RESULT adi_rtc_GetWriteSyncStatus (ADI_RTC_HANDLE const hDevice, ADI_RTC_WRITE_STATUS *pSyncBits) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + uint16_t nSyncBits; +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + /* Wait till previously posted write to couunt Register to complete */ + PEND_BEFORE_WRITE(SR1,BITM_RTC_SR1_WPNDSR0); + + /* get the value */ + nSyncBits = pDevice->pRTCRegs->SR0 & ADI_RTC_WRITE_STATUS_MASK; + *pSyncBits = (ADI_RTC_WRITE_STATUS)nSyncBits; + + return ADI_RTC_SUCCESS; +} + + +/************************************************************************************************* +************************************************************************************************** +****************************************** SET APIS ****************************************** +************************************************************************************************** +*************************************************************************************************/ + + +/*! + * @brief Set a new RTC alarm value. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] nAlarm New alarm value to set. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + * Writes the 32-bit RTC alarm comparator with the value provided by \a Alarm. + * + * Honours the safe write mode if set. Otherwise, it is the application's responsibility to + * synchronize any multiple writes to the same register. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_GetAlarm(). + * @sa adi_rtc_EnableAlarm(). + * @sa adi_rtc_GetWritePendStatus(). + * @sa adi_rtc_SynchronizeAllWrites(). + */ +ADI_RTC_RESULT adi_rtc_SetAlarm (ADI_RTC_HANDLE const hDevice, uint32_t nAlarm) +{ + ADI_RTC_DEVICE *pDevice = hDevice; +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + + /* Wait till previously posted write to Alram Register to complete */ + PEND_BEFORE_WRITE(SR1,(BITM_RTC_SR1_WPNDALM0|BITM_RTC_SR1_WPNDALM1)) + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + /* RTC hardware insures paired write, so no need to disable interrupts */ + pDevice->pRTCRegs->ALM0 = (uint16_t)nAlarm; + pDevice->pRTCRegs->ALM1 = (uint16_t)(nAlarm >> 16); + pDevice->pRTCRegs->ALM2 = 0u; + ADI_EXIT_CRITICAL_REGION(); + + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR0,(BITM_RTC_SR0_WSYNCALM0|BITM_RTC_SR0_WSYNCALM1)) + + return ADI_RTC_SUCCESS; +} + +/*! + * @brief Set Prescale. This is power of 2 division factor for the RTC base clock. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] nPreScale Prescale value to be set. if "nPreScale" is 5, RTC base clock is + divided by 32. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_GetAlarm(). + * @sa adi_rtc_EnableAlarm(). + * @sa adi_rtc_GetWritePendStatus(). + * @sa adi_rtc_SynchronizeAllWrites(). + */ +ADI_RTC_RESULT adi_rtc_SetPreScale(ADI_RTC_HANDLE const hDevice, uint8_t nPreScale ) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + uint16_t nTemp; +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } + /* Pre scale is invalid for RTC0 */ + if(pDevice->pRTCRegs == pADI_RTC0) + { + return(ADI_RTC_OPERATION_NOT_ALLOWED); + } +#endif + PEND_BEFORE_WRITE(SR2,BITM_RTC_SR2_WPNDCR1MIR) + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + /* RTC hardware insures paired write, so no need to disable interrupts */ + /* format is Alarm1(16-32) Alarm0(0-16).Alarm2(fraction)*/ + nTemp = pDevice->pRTCRegs->CR1 & (uint16_t)~BITM_RTC_CR1_PRESCALE2EXP; + nTemp |= (uint16_t)((uint16_t)nPreScale << BITP_RTC_CR1_PRESCALE2EXP); + pDevice->pRTCRegs->CR1 = nTemp; + ADI_EXIT_CRITICAL_REGION(); + + SYNC_AFTER_WRITE(SR2,BITM_RTC_SR2_WSYNCCR1MIR) + return ADI_RTC_SUCCESS; +} +/*! + * @brief Set the pre-scale. This is power of 2 division factor for the RTC base clock. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] nPeriod Periodic, modulo-60 alarm time in pre-scaled RTC time units beyond a modulo-60 boundary. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + * @note This API helps the CPU to position a periodic (repeating) alarm interrupt from the RTC at any integer number of pre-scaled RTC time units from a modulo-60 boundary (roll-over event) of the value of count. + * @sa adi_rtc_Open(). + * @sa adi_rtc_GetAlarm(). + * @sa adi_rtc_EnableAlarm(). + * @sa adi_rtc_GetWritePendStatus(). + * @sa adi_rtc_SynchronizeAllWrites(). + */ +ADI_RTC_RESULT adi_rtc_SetMod60AlarmPeriod(ADI_RTC_HANDLE const hDevice, uint8_t nPeriod ) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + uint16_t nTemp; +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } + + /* Mod60 Alarm is valid only in RTC-1 */ + if(pDevice->pRTCRegs == pADI_RTC0) + { + return(ADI_RTC_OPERATION_NOT_ALLOWED); + } + +#endif + + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR1,BITM_RTC_SR1_WPNDCR0) + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + /* RTC hardware insures paired write, so no need to disable interrupts */ + /* format is Alarm1(16-32) Alarm0(0-16).Alarm2(fraction)*/ + nTemp = pDevice->pRTCRegs->CR0 & BITM_RTC_CR0_MOD60ALM; + nTemp |= (uint16_t)((uint16_t)nPeriod << BITP_RTC_CR0_MOD60ALM); + pDevice->pRTCRegs->CR0 = nTemp; + ADI_EXIT_CRITICAL_REGION(); + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR0,BITM_RTC_SR0_WSYNCCR0) + + return ADI_RTC_SUCCESS; +} +/*! + * @brief Set a new RTC alarm value with fractional value. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] fAlarm New alarm value to set. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + * Writes the 32-bit RTC alarm comparator with the value provided by \a Alarm. + * + * Honours the safe write mode if set. Otherwise, it is the application's responsibility to + * synchronize any multiple writes to the same register. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_GetAlarm(). + * @sa adi_rtc_EnableAlarm(). + * @sa adi_rtc_GetWritePendStatus(). + * @sa adi_rtc_SynchronizeAllWrites(). + */ +ADI_RTC_RESULT adi_rtc_SetAlarmEx(ADI_RTC_HANDLE const hDevice, float fAlarm) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + uint32_t nAlarm = (uint32_t)fAlarm,nTemp; + uint16_t nPreScale; + float fFraction; +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } + /* Only 1Hz clocking is supported in RTC-0.So no fractional Alarm. */ + if(pDevice->pRTCRegs == pADI_RTC0) + { + return(ADI_RTC_OPERATION_NOT_ALLOWED); + } + +#endif + + /* Wait till previously posted write to Alarm Register to complete */ + PEND_BEFORE_WRITE(SR1,(BITM_RTC_SR1_WPNDALM0|BITM_RTC_SR1_WPNDALM1)) + nPreScale = (pDevice->pRTCRegs->CR1&BITM_RTC_CR1_PRESCALE2EXP)>>BITP_RTC_CR1_PRESCALE2EXP; + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + /* RTC hardware insures paired write, so no need to disable interrupts */ + /* format is Alarm1(16-32) Alarm0(0-16).Alarm2(fraction)*/ + pDevice->pRTCRegs->ALM0 = (uint16_t)nAlarm; + pDevice->pRTCRegs->ALM1 = (uint16_t)(nAlarm >> 16); + nTemp = 1lu<pRTCRegs->ALM2 = (uint16_t)(fFraction); + ADI_EXIT_CRITICAL_REGION(); + /* Wait till write to Alarm Register to take effect */ + SYNC_AFTER_WRITE(SR0,(BITM_RTC_SR0_WSYNCALM0|BITM_RTC_SR0_WSYNCALM1)) + + return ADI_RTC_SUCCESS; +} + +/*! + * @brief Set a new RTC control register value. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] eRegister Specify which register need to be initialized. + * @param[in] Control New control register value to set. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + * Writes the 16-bit RTC control register with the value provided by \a Control. + * + * Honours the safe write mode if set. Otherwise, it is the application's responsibility to + * synchronize any multiple writes to the same register. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_GetControlRegister(). + * @sa adi_rtc_GetWritePendStatus(). + * @sa adi_rtc_SynchronizeAllWrites(). + */ +ADI_RTC_RESULT adi_rtc_SetControlRegister(ADI_RTC_HANDLE const hDevice,ADI_RTC_CONTROL_REGISTER eRegister, uint32_t Control) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR1,BITM_RTC_SR1_WPNDCR0) + + switch(eRegister) + { + case ADI_RTC_CONTROL_REGISTER_0: + pDevice->pRTCRegs->CR0 = (uint16_t)Control; + break; + case ADI_RTC_CONTROL_REGISTER_1: + pDevice->pRTCRegs->CR1 = (uint16_t)Control; + break; + default: + return(ADI_RTC_FAILURE); + } + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR0,BITM_RTC_SR0_WSYNCCR0) + + return ADI_RTC_SUCCESS; + +} + +/*! + * @brief Registers a Callback function with the RTC device driver. The registered call + * back function will be called when an event is detected. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param [in] pfCallback Function pointer to Callback function. Passing a NULL pointer will + * unregister the call back function. + * + * @param [in] pCBparam Call back function parameter. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + * @sa adi_rtc_Open(). + */ +ADI_RTC_RESULT adi_rtc_RegisterCallback( + ADI_RTC_HANDLE const hDevice, + ADI_CALLBACK const pfCallback, + void *const pCBparam + ) + +{ + ADI_RTC_DEVICE *pDevice = hDevice; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + +#if (ADI_RTC_CFG_ENABLE_SAFE_WRITE == 1) + /* pause on pending writes to CR to avoid data loss */ + while((pDevice->pRTCRegs->SR1 & (uint32_t)ADI_RTC_WRITE_STATUS_CONTROL0)!=0u) + { + } +#endif + /* Store the address of the callback function */ + pDevice->pfCallback = pfCallback; + /* Store the call back parameter */ + pDevice->pCBParam = pCBparam; + + return ADI_RTC_SUCCESS; + +} + +/*! + * @brief Set a new RTC count value. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] nCount New count value to set. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + * Writes the main 32-bit RTC counter with the value provided by \a Count. + * + * Honours the safe write mode if set. Otherwise, it is the application's responsibility to + * synchronize any multiple writes to the same register. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_SetCount(). + * @sa adi_rtc_GetWritePendStatus(). + * @sa adi_rtc_SynchronizeAllWrites(). + */ +ADI_RTC_RESULT adi_rtc_SetCount (ADI_RTC_HANDLE const hDevice, uint32_t nCount) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + +#if (ADI_RTC_CFG_ENABLE_SAFE_WRITE == 1) + /* pause on pending writes to CR to avoid data loss */ + while((pDevice->pRTCRegs->SR1 & (uint32_t)(ADI_RTC_WRITE_STATUS_COUNT0 | ADI_RTC_WRITE_STATUS_COUNT1)) !=0u) + { + + } +#endif + + /* Wait till previously posted write to count Register to complete */ + PEND_BEFORE_WRITE(SR1,(BITM_RTC_SR1_WPNDCNT0|BITM_RTC_SR1_WPNDCNT1)) + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + /* RTC hardware insures paired write, so no need to disable interrupts */ + pDevice->pRTCRegs->CNT0 = (uint16_t)nCount; + pDevice->pRTCRegs->CNT1 = (uint16_t)(nCount >> 16); + ADI_EXIT_CRITICAL_REGION(); + + /* Wait till write to count Register to take effect */ + SYNC_AFTER_WRITE(SR0,(BITM_RTC_SR0_WSYNCCNT0|BITM_RTC_SR0_WSYNCCNT1)) + + return ADI_RTC_SUCCESS; +} + + +/*! + * @brief Set an RTC gateway command. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] Command Gateway command value. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + * Writes the 16-bit RTC gateway register with the command provided by \a Command. + * + * The gateway register is used to force the RTC to perform some urgent action. + * + * Currently, only the #ADI_RTC_GATEWAY_FLUSH command is defined, which will cancel all + * RTC register write transactions, both pending and executing. It is intended to truncate + * all core interactions in preparation for an imminent power loss when the RTC power + * isolation barrier will be activated. + * + * @sa adi_rtc_Open(). + */ +ADI_RTC_RESULT adi_rtc_SetGateway(ADI_RTC_HANDLE const hDevice, uint16_t Command) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } +#endif + /* set the command */ + pDevice->pRTCRegs->GWY = Command; + return ADI_RTC_SUCCESS; +} + + + +/*! + * @brief Set a new RTC trim value. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * @param[in] eInterval Specify the trimming interval and will always in the range of (2^2 to S^17 pre-scaled RTC clock ). + * @param[in] eTrimValue Specify the trimming value. + * @param[in] eOperation Specify the operation(Add or subtract) need to be performed for trimming. + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_RTC_INVALID_PARAM [D] Input parameter out of range. + * + * The RTC hardware has the ability to automatically trim the clock to compensate for variations + * in oscillator tolerance . Automatic trimming is enabled with the #adi_rtc_EnableTrim() API. + * + * @note Alarms are not affected by automatic trim operations. + * + * @note The trim boundary (interval) alignment is reset when new trim values are written. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_EnableTrim(). + * @sa adi_rtc_GetTrim(). + */ +ADI_RTC_RESULT adi_rtc_SetTrim(ADI_RTC_HANDLE const hDevice, ADI_RTC_TRIM_INTERVAL eInterval, ADI_RTC_TRIM_VALUE eTrimValue, ADI_RTC_TRIM_POLARITY eOperation) +{ + ADI_RTC_DEVICE *pDevice = hDevice; + uint32_t trm = (uint32_t)eInterval | (uint32_t)eTrimValue | (uint32_t)eOperation; + +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } + +#endif + + /* Wait till previously posted write to Control Register to complete */ + PEND_BEFORE_WRITE(SR1,BITM_RTC_SR1_WPNDTRM) + + pDevice->pRTCRegs->TRM = (uint16_t)trm; + + /* Wait till write to Control Register to take effect */ + SYNC_AFTER_WRITE(SR0,BITM_RTC_SR0_WSYNCTRM) + + return ADI_RTC_SUCCESS; +} + + +/************************************************************************************************* +************************************************************************************************** +************************************ SYNCHRONIZATION API ************************************* +************************************************************************************************** +*************************************************************************************************/ + + +/*! + * @brief Force synchronization of all pending writes. + * + * @param[in] hDevice Device handle obtained from adi_rtc_Open(). + * + * @return Status + * - #ADI_RTC_SUCCESS Call completed successfully. + * - #ADI_RTC_INVALID_HANDLE [D] Invalid device handle parameter. + * + * Blocking call to coerce all outstanding posted RTC register writes to fully flush and synchronize. + * + * @sa adi_rtc_Open(). + * @sa adi_rtc_GetWritePendStatus(). + * @sa adi_rtc_GetWriteSyncStatus(). +*/ +ADI_RTC_RESULT adi_rtc_SynchronizeAllWrites (ADI_RTC_HANDLE const hDevice) +{ + ADI_RTC_DEVICE *pDevice = hDevice; +#ifdef ADI_DEBUG + ADI_RTC_RESULT eResult; + if((eResult = ValidateHandle(pDevice)) != ADI_RTC_SUCCESS) + { + return eResult; + } + +#endif + + /* forced block until all SYNC bits are set (ignore bSafe) */ + while (ADI_RTC_WRITE_STATUS_MASK != (pDevice->pRTCRegs->SR0 & ADI_RTC_WRITE_STATUS_MASK)) + { + + } + + return ADI_RTC_SUCCESS; +} + + +/*! \cond PRIVATE */ + +/* + * @brief Initializes the device using static configuration + * + * @param[in] pDevice Pointer to RTC device . + pConfig Pointer to static configuration device structure. + * +*/ + +static void rtc_init(ADI_RTC_DEVICE *pDevice,ADI_RTC_CONFIG *pConfig) +{ + + /* FIXME - static init is even more now */ + + /* Control register -0 which controls all main stream activity of RTC0 */ + pDevice->pRTCRegs->CR0 = pConfig->CR0; + /* Control register -1 which is granularity of RTC control register */ + pDevice->pRTCRegs->CR1 = pConfig->CR1; + /*CNT0 contains the lower 16 bits of the RTC counter */ + pDevice->pRTCRegs->CNT0 = pConfig->CNT0; + /*CNT1 contains the lower 16 bits of the RTC counter */ + pDevice->pRTCRegs->CNT1 = pConfig->CNT1; + /* ALM0 contains the lower 16 bits of the Alarm register */ + pDevice->pRTCRegs->ALM0 = pConfig->ALM0; + /* ALM1 contains the upper 16 bits of the Alarm register */ + pDevice->pRTCRegs->ALM1 = pConfig->ALM1; + /* ALM1 contains the fractional part of the Alarm register */ + pDevice->pRTCRegs->ALM2 = pConfig->ALM2; + /* Set Input capture/sensor strobe registers only for RTC1 */ + if(pDevice->pRTCRegs == pADI_RTC1) + { + pDevice->pRTCRegs->CR2IC = pConfig->CR2IC; + pDevice->pRTCRegs->CR3SS = pConfig->CR3SS; + pDevice->pRTCRegs->CR4SS = pConfig->CR4SS; + pDevice->pRTCRegs->SSMSK = pConfig->SSMSK; + pDevice->pRTCRegs->SS1 = pConfig->SS1; + pDevice->pRTCRegs->CR5SSS = pConfig->CR5SSS; + pDevice->pRTCRegs->CR6SSS = pConfig->CR6SSS; + pDevice->pRTCRegs->CR7SSS = pConfig->CR7SSS; + pDevice->pRTCRegs->GPMUX0 = pConfig->GPMUX0; + pDevice->pRTCRegs->GPMUX1 = pConfig->GPMUX1; + } +} + + + +/*! @brief RTC device driver interrupt handler. Overrides weakly-bound default interrupt handler in _startup.c. */ +void RTC0_Int_Handler(void) +{ + ISR_PROLOG(); + uint16_t nIntSrc0, nIntSrc2, nIntSrc3; + uint32_t fired = 0u, enables = 0u; + ADI_RTC_DEVICE *pDevice = aRTCDeviceInfo[0].hDevice; + + /* determine qualified interrupt source(s) */ + /* need to test each interrupt source and whether it is enabled before notifying */ + /* because each source is latched regardless of whether it is enabled or not :-( */ + + /* CR0 SR0 */ + enables = (uint32_t)pDevice->pRTCRegs->CR0 & ADI_RTC_INT_ENA_MASK_CR0; + nIntSrc0 = pDevice->pRTCRegs->SR0 & ADI_RTC_INT_SOURCE_MASK_SR0; + if( nIntSrc0 && enables ) + { + if( (enables & BITM_RTC_CR0_MOD60ALMEN) && (nIntSrc0 & BITM_RTC_SR0_MOD60ALMINT)) + { + fired |= ADI_RTC_MOD60ALM_INT; + } + if( (enables & BITM_RTC_CR0_ALMINTEN) && (nIntSrc0 & BITM_RTC_SR0_ALMINT)) + { + fired |= ADI_RTC_ALARM_INT; + } + if( (enables & BITM_RTC_CR0_ISOINTEN) && (nIntSrc0 & BITM_RTC_SR0_ISOINT)) + { + fired |= ADI_RTC_ISO_DONE_INT; + } + if( (enables & BITM_RTC_CR0_WPNDINTEN) && (nIntSrc0 & BITM_RTC_SR0_WPNDINT)) + { + fired |= ADI_RTC_WRITE_PEND_INT; + } + if( (enables & BITM_RTC_CR0_WSYNCINTEN) && (nIntSrc0 & BITM_RTC_SR0_WSYNCINT)) + { + fired |= ADI_RTC_WRITE_SYNC_INT; + } + if( (enables & BITM_RTC_CR0_WPNDERRINTEN) && (nIntSrc0 & BITM_RTC_SR0_WPNDERRINT)) + { + fired |= ADI_RTC_WRITE_PENDERR_INT; + } + } + + /* CR1 SR2 */ + enables = (uint32_t)pDevice->pRTCRegs->CR1 & ADI_RTC_INT_ENA_MASK_CR1; + nIntSrc2 = pDevice->pRTCRegs->SR2 & ADI_RTC_INT_SOURCE_MASK_SR2; + if( nIntSrc2 && enables ) + { + if( (enables & BITM_RTC_CR1_CNTMOD60ROLLINTEN) && (nIntSrc2 & BITM_RTC_SR2_CNTMOD60ROLLINT)) + { + fired |= ADI_RTC_MOD60_ROLLOVER_INT; + } + if( (enables & BITM_RTC_CR1_CNTROLLINTEN) && (nIntSrc2 & BITM_RTC_SR2_CNTROLLINT)) + { + fired |= ADI_RTC_COUNT_ROLLOVER_INT; + } + if( (enables & BITM_RTC_CR1_TRMINTEN) && (nIntSrc2 & BITM_RTC_SR2_TRMINT)) + { + fired |= ADI_RTC_TRIM_INT; + } + if( (enables & BITM_RTC_CR1_PSINTEN) && (nIntSrc2 & BITM_RTC_SR2_PSINT)) + { + fired |= ADI_RTC_PSI_INT; + } + if( (enables & BITM_RTC_CR1_CNTINTEN) && (nIntSrc2 & BITM_RTC_SR2_CNTINT)) + { + fired |= ADI_RTC_COUNT_INT; + } + } + + /* CR3OC, CR2IC SR3*/ + enables = pDevice->pRTCRegs->CR3SS & (uint16_t)ADI_RTC_INT_ENA_MASK_CR3SS; + nIntSrc3 = pDevice->pRTCRegs->SR3 & ADI_RTC_SR3_IRQ_STATUS_MASK; + if( nIntSrc3 && enables ) + { + if( (enables & BITM_RTC_CR3SS_SS4IRQEN) && (nIntSrc3 & BITM_RTC_SR3_SS4IRQ)) + { + fired |= ADI_RTC_SENSOR_STROBE_CH4_INT; + } + if( (enables & BITM_RTC_CR3SS_SS3IRQEN) && (nIntSrc3 & BITM_RTC_SR3_SS3IRQ)) + { + fired |= ADI_RTC_SENSOR_STROBE_CH3_INT; + } + if( (enables & BITM_RTC_CR3SS_SS2IRQEN) && (nIntSrc3 & BITM_RTC_SR3_SS2IRQ)) + { + fired |= ADI_RTC_SENSOR_STROBE_CH2_INT; + } + if( (enables & BITM_RTC_CR3SS_SS1IRQEN) && (nIntSrc3 & BITM_RTC_SR3_SS1IRQ)) + { + fired |= ADI_RTC_SENSOR_STROBE_CH1_INT; + } + + if( (enables & BITM_RTC_CR3SS_SS4FEIRQEN) && (nIntSrc3 & BITM_RTC_SR3_SS4FEIRQ)) + { + fired |= ADI_RTC_RTCSS4_FE_INT; + } + if( (enables & BITM_RTC_CR3SS_SS3FEIRQEN) && (nIntSrc3 & BITM_RTC_SR3_SS2FEIRQ)) + { + fired |= ADI_RTC_RTCSS3_FE_INT; + } + if( (enables & BITM_RTC_CR3SS_SS2FEIRQEN) && (nIntSrc3 & BITM_RTC_SR3_SS3FEIRQ)) + { + fired |= ADI_RTC_RTCSS2_FE_INT; + } + if( (enables & BITM_RTC_CR3SS_SS1FEIRQEN) && (nIntSrc3 & BITM_RTC_SR3_SS1FEIRQ)) + { + fired |= ADI_RTC_RTCSS1_FE_INT; + } + } + enables = pDevice->pRTCRegs->CR3SS & (uint16_t)ADI_RTC_INT_ENA_MASK_CR2IC; + if( nIntSrc3 && enables ) + { + if( (enables & BITM_RTC_CR2IC_IC4IRQEN) && (nIntSrc3 & BITM_RTC_SR3_IC4IRQ)) + { + fired |= ADI_RTC_INPUT_CAPTURE_CH4_INT; + } + if( (enables & BITM_RTC_CR2IC_IC3IRQEN) && (nIntSrc3 & BITM_RTC_SR3_IC3IRQ)) + { + fired |= ADI_RTC_INPUT_CAPTURE_CH3_INT; + } + if( (enables & BITM_RTC_CR2IC_IC2IRQEN) && (nIntSrc3 & BITM_RTC_SR3_IC2IRQ)) + { + fired |= ADI_RTC_INPUT_CAPTURE_CH2_INT; + } + if( (enables & BITM_RTC_CR2IC_IC0IRQEN) && (nIntSrc3 & BITM_RTC_SR3_IC0IRQ)) + { + fired |= ADI_RTC_INPUT_CAPTURE_CH0_INT; + } + } + + + if (pDevice->pfCallback != NULL) { + + /* forward to the user if he is watching this interrupt */ + /* pass the "fired" value as the event. argument param is not used */ + if ( fired) + { + pDevice->pfCallback (pDevice->pCBParam, fired, NULL); + } + } + + /* Write 1 to clear the interrupts */ + pDevice->pRTCRegs->SR0 |= nIntSrc0; + pDevice->pRTCRegs->SR2 |= nIntSrc2; + pDevice->pRTCRegs->SR3 |= nIntSrc3; + ISR_EPILOG(); +} + +/*! @brief RTC device driver interrupt handler. Overrides weakly-bound default interrupt handler in _startup.c. */ +void RTC1_Int_Handler(void) +{ + ISR_PROLOG(); + uint16_t nIntSrc0, nIntSrc2, nIntSrc3; + uint32_t fired = 0u, enables = 0u; + ADI_RTC_DEVICE *pDevice = aRTCDeviceInfo[1].hDevice; + + /* determine qualified interrupt source(s) */ + /* need to test each interrupt source and whether it is enabled before notifying */ + /* because each source is latched regardless of whether it is enabled or not :-( */ + + /* CR0 SR0 */ + enables = (uint32_t)pDevice->pRTCRegs->CR0 & ADI_RTC_INT_ENA_MASK_CR0; + nIntSrc0 = pDevice->pRTCRegs->SR0 & ADI_RTC_INT_SOURCE_MASK_SR0; + if( nIntSrc0 && enables ) + { + if( (enables & BITM_RTC_CR0_MOD60ALMEN) && (nIntSrc0 & BITM_RTC_SR0_MOD60ALMINT)) + { + fired |= ADI_RTC_MOD60ALM_INT; + } + if( (enables & BITM_RTC_CR0_ALMINTEN) && (nIntSrc0 & BITM_RTC_SR0_ALMINT)) + { + fired |= ADI_RTC_ALARM_INT; + } + if( (enables & BITM_RTC_CR0_ISOINTEN) && (nIntSrc0 & BITM_RTC_SR0_ISOINT)) + { + fired |= ADI_RTC_ISO_DONE_INT; + } + if( (enables & BITM_RTC_CR0_WPNDINTEN) && (nIntSrc0 & BITM_RTC_SR0_WPNDINT)) + { + fired |= ADI_RTC_WRITE_PEND_INT; + } + if( (enables & BITM_RTC_CR0_WSYNCINTEN) && (nIntSrc0 & BITM_RTC_SR0_WSYNCINT)) + { + fired |= ADI_RTC_WRITE_SYNC_INT; + } + if( (enables & BITM_RTC_CR0_WPNDERRINTEN) && (nIntSrc0 & BITM_RTC_SR0_WPNDERRINT)) + { + fired |= ADI_RTC_WRITE_PENDERR_INT; + } + } + + /* CR1 SR2 */ + enables = (uint32_t)pDevice->pRTCRegs->CR1 & ADI_RTC_INT_ENA_MASK_CR1; + nIntSrc2 = pDevice->pRTCRegs->SR2 & ADI_RTC_INT_SOURCE_MASK_SR2; + if( nIntSrc2 && enables ) + { + if( (enables & BITM_RTC_CR1_CNTMOD60ROLLINTEN) && (nIntSrc2 & BITM_RTC_SR2_CNTMOD60ROLLINT)) + { + fired |= ADI_RTC_MOD60_ROLLOVER_INT; + } + if( (enables & BITM_RTC_CR1_CNTROLLINTEN) && (nIntSrc2 & BITM_RTC_SR2_CNTROLLINT)) + { + fired |= ADI_RTC_COUNT_ROLLOVER_INT; + } + if( (enables & BITM_RTC_CR1_TRMINTEN) && (nIntSrc2 & BITM_RTC_SR2_TRMINT)) + { + fired |= ADI_RTC_TRIM_INT; + } + if( (enables & BITM_RTC_CR1_PSINTEN) && (nIntSrc2 & BITM_RTC_SR2_PSINT)) + { + fired |= ADI_RTC_PSI_INT; + } + if( (enables & BITM_RTC_CR1_CNTINTEN) && (nIntSrc2 & BITM_RTC_SR2_CNTINT)) + { + fired |= ADI_RTC_COUNT_INT; + } + } + + /* CR3OC, CR2IC SR3*/ + enables = pDevice->pRTCRegs->CR3SS & (uint32_t)ADI_RTC_INT_ENA_MASK_CR3SS; + nIntSrc3 = pDevice->pRTCRegs->SR3 & ADI_RTC_SR3_IRQ_STATUS_MASK; + if( nIntSrc3 && enables ) + { + if( (enables & BITM_RTC_CR3SS_SS4IRQEN) && (nIntSrc3 & BITM_RTC_SR3_SS4IRQ)) + { + fired |= ADI_RTC_SENSOR_STROBE_CH4_INT; + } + if( (enables & BITM_RTC_CR3SS_SS3IRQEN) && (nIntSrc3 & BITM_RTC_SR3_SS3IRQ)) + { + fired |= ADI_RTC_SENSOR_STROBE_CH3_INT; + } + if( (enables & BITM_RTC_CR3SS_SS2IRQEN) && (nIntSrc3 & BITM_RTC_SR3_SS2IRQ)) + { + fired |= ADI_RTC_SENSOR_STROBE_CH2_INT; + } + if( (enables & BITM_RTC_CR3SS_SS1IRQEN) && (nIntSrc3 & BITM_RTC_SR3_SS1IRQ)) + { + fired |= ADI_RTC_SENSOR_STROBE_CH1_INT; + } + + if( (enables & BITM_RTC_CR3SS_SS4FEIRQEN) && (nIntSrc3 & BITM_RTC_SR3_SS4FEIRQ)) + { + fired |= ADI_RTC_RTCSS4_FE_INT; + } + if( (enables & BITM_RTC_CR3SS_SS3FEIRQEN) && (nIntSrc3 & BITM_RTC_SR3_SS2FEIRQ)) + { + fired |= ADI_RTC_RTCSS3_FE_INT; + } + if( (enables & BITM_RTC_CR3SS_SS2FEIRQEN) && (nIntSrc3 & BITM_RTC_SR3_SS3FEIRQ)) + { + fired |= ADI_RTC_RTCSS2_FE_INT; + } + if( (enables & BITM_RTC_CR3SS_SS1FEIRQEN) && (nIntSrc3 & BITM_RTC_SR3_SS1FEIRQ)) + { + fired |= ADI_RTC_RTCSS1_FE_INT; + } + } + enables = pDevice->pRTCRegs->CR2IC & (uint32_t)ADI_RTC_INT_ENA_MASK_CR2IC; + if( nIntSrc3 && enables ) + { + if( (enables & BITM_RTC_CR2IC_IC4IRQEN) && (nIntSrc3 & BITM_RTC_SR3_IC4IRQ)) + { + fired |= ADI_RTC_INPUT_CAPTURE_CH4_INT; + } + if( (enables & BITM_RTC_CR2IC_IC3IRQEN) && (nIntSrc3 & BITM_RTC_SR3_IC3IRQ)) + { + fired |= ADI_RTC_INPUT_CAPTURE_CH3_INT; + } + if( (enables & BITM_RTC_CR2IC_IC2IRQEN) && (nIntSrc3 & BITM_RTC_SR3_IC2IRQ)) + { + fired |= ADI_RTC_INPUT_CAPTURE_CH2_INT; + } + if( (enables & BITM_RTC_CR2IC_IC0IRQEN) && (nIntSrc3 & BITM_RTC_SR3_IC0IRQ)) + { + fired |= ADI_RTC_INPUT_CAPTURE_CH0_INT; + } + } + + if (pDevice->pfCallback != NULL) { + + /* forward to the user if he is watching this interrupt */ + /* pass the "fired" value as the event. argument param is not used */ + if ( fired) + { + pDevice->pfCallback (pDevice->pCBParam, fired, NULL); + } + } + + /* Write 1 to clear the interrupts */ + pDevice->pRTCRegs->SR0 |= nIntSrc0; + pDevice->pRTCRegs->SR2 |= nIntSrc2; + pDevice->pRTCRegs->SR3 |= nIntSrc3; + + ISR_EPILOG(); +} + +/*! \endcond */ + +/* @} */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc_data.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc_data.c new file mode 100755 index 0000000000..1cd5f0c773 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc_data.c @@ -0,0 +1,190 @@ +/*! + ***************************************************************************** + * @file: adi_rtc_data.c + * @brief: rtc device data file + * @version: $Revision: 34933 $ + * @date: $Date: 2016-06-28 07:11:25 -0400 (Tue, 28 Jun 2016) $ + *----------------------------------------------------------------------------- + * +Copyright (c) 2010-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *****************************************************************************/ + +/*! \cond PRIVATE */ +#ifndef ADI_RTC_DATA_C_ +#define ADI_RTC_DATA_C_ + +#include +#include "adi_rtc_def.h" + +static ADI_RTC_DEVICE_INFO aRTCDeviceInfo[ADI_RTC_NUM_INSTANCE] = +{ + { + (ADI_RTC_TypeDef *)pADI_RTC0,RTC0_EVT_IRQn, NULL + }, + { + (ADI_RTC_TypeDef *)pADI_RTC1,RTC1_EVT_IRQn,NULL, + } +}; + + +static ADI_RTC_CONFIG aRTCConfig[ADI_RTC_NUM_INSTANCE] = +{ + { + /* CR0 */ + RTC0_CFG_ENABLE_ALARM << BITP_RTC_CR0_ALMEN | + RTC0_CFG_ENABLE_ALARM_INTERRUPT << BITP_RTC_CR0_ALMINTEN | + RTC0_CFG_ENABLE_TRIM << BITP_RTC_CR0_TRMEN | + RTC0_CFG_ENABLE_PENDERROR_INTERRUPT << BITP_RTC_CR0_WPNDERRINTEN | + RTC0_CFG_ENABLE_WSYNC_INTERRUPT << BITP_RTC_CR0_WSYNCINTEN | + RTC0_CFG_ENABLE_WRITEPEND_INTERRUPT << BITP_RTC_CR0_WPNDINTEN , + /* CR1 */ + 0, + /* CNT0 */ + RTC0_CFG_COUNT_VALUE_0, + /* CNT1 */ + RTC0_CFG_COUNT_VALUE_1, + /* ALM0 */ + RTC0_CFG_ALARM_VALUE_0, + /* ALM1 */ + RTC0_CFG_ALARM_VALUE_1, + /* ALM2 */ + 0, + /* TRIM */ + RTC0_CFG_POW2_TRIM_INTERVAL << BITP_RTC_TRM_IVL2EXPMIN | + RTC0_CFG_TRIM_INTERVAL << BITP_RTC_TRM_IVL | + RTC0_CFG_TRIM_OPERATION << BITP_RTC_TRM_ADD | + RTC0_CFG_TRIM_VALUE << BITP_RTC_TRM_VALUE, + 0, /* CR2IC */ + 0, /* CR3SS */ + 0, /* CR4SS */ + 0, /* SSMSK */ + 0, /* SS1 */ + 0, /* CR5SSS */ + 0, /* CR6SSS */ + 0, /* CR7SSS */ + 0, /* GPMUX0 */ + 0 /* GPMUX1 */ + + }, + /* RTC-1 */ + { + /* CR0 */ + RTC1_CFG_ENABLE_ALARM << BITP_RTC_CR0_ALMEN | + RTC1_CFG_ENABLE_ALARM_INTERRUPT << BITP_RTC_CR0_ALMINTEN | + RTC1_CFG_ENABLE_TRIM << BITP_RTC_CR0_TRMEN | + RTC1_CFG_ENABLE_MOD60_ALARM << BITP_RTC_CR0_MOD60ALMEN | + RTC1_CFG_ENABLE_MOD60_ALARM_PERIOD << BITP_RTC_CR0_MOD60ALM | + RTC1_CFG_ENABLE_MOD60_ALARM_INTERRUPT << BITP_RTC_CR0_MOD60ALMINTEN | + RTC1_CFG_ENABLE_ISO_INTERRUPT << BITP_RTC_CR0_ISOINTEN | + RTC1_CFG_ENABLE_PENDERROR_INTERRUPT << BITP_RTC_CR0_WPNDERRINTEN | + RTC1_CFG_ENABLE_WSYNC_INTERRUPT << BITP_RTC_CR0_WSYNCINTEN | + RTC1_CFG_ENABLE_WRITEPEND_INTERRUPT << BITP_RTC_CR0_WPNDINTEN , + /* CR1 */ + RTC1_CFG_ENABLE_COUNT_INTERRUPT << BITP_RTC_CR1_CNTINTEN | + RTC1_CFG_ENABLE_MOD1_COUNT_INTERRUPT << BITP_RTC_CR1_PSINTEN | + RTC1_CFG_ENABLE_TRIM_INTERRUPT << BITP_RTC_CR1_TRMINTEN | + RTC1_CFG_CNT_MOD60_ROLLLOVER_INTERRUPT << BITP_RTC_CR1_CNTROLLINTEN | + RTC1_CFG_PRESCALE << BITP_RTC_CR1_PRESCALE2EXP | + RTC1_CFG_CNT_ROLLLOVER_INTERRUPT << BITP_RTC_CR1_CNTMOD60ROLLINTEN , + /* CNT0 */ + RTC1_CFG_COUNT_VALUE_0, + /* CNT1 */ + RTC1_CFG_COUNT_VALUE_1, + + /* ALM[123] */ + RTC1_CFG_ALARM_VALUE_0, + RTC1_CFG_ALARM_VALUE_1, + RTC1_CFG_ALARM_VALUE_2, + + /* TRIM */ + RTC1_CFG_POW2_TRIM_INTERVAL << BITP_RTC_TRM_IVL2EXPMIN | + RTC1_CFG_TRIM_INTERVAL << BITP_RTC_TRM_IVL | + RTC1_CFG_TRIM_OPERATION << BITP_RTC_TRM_ADD | + RTC1_CFG_TRIM_VALUE << BITP_RTC_TRM_VALUE, + + /* CR2IC */ + RTC1_CFG_IC0_ENABLE << BITP_RTC_CR2IC_IC0EN | + RTC1_CFG_IC2_ENABLE << BITP_RTC_CR2IC_IC2EN | + RTC1_CFG_IC3_ENABLE << BITP_RTC_CR2IC_IC3EN | + RTC1_CFG_IC4_ENABLE << BITP_RTC_CR2IC_IC4EN | + RTC1_CFG_IC0_INT_ENABLE << BITP_RTC_CR2IC_IC0IRQEN | + RTC1_CFG_IC0_INT_ENABLE << BITP_RTC_CR2IC_IC2IRQEN | + RTC1_CFG_IC0_INT_ENABLE << BITP_RTC_CR2IC_IC3IRQEN | + RTC1_CFG_IC0_INT_ENABLE << BITP_RTC_CR2IC_IC4IRQEN | + RTC1_CFG_IC0_EDGE_POLARITY << BITP_RTC_CR2IC_IC0LH | + RTC1_CFG_IC2_EDGE_POLARITY << BITP_RTC_CR2IC_IC2LH | + RTC1_CFG_IC3_EDGE_POLARITY << BITP_RTC_CR2IC_IC3LH | + RTC1_CFG_IC4_EDGE_POLARITY << BITP_RTC_CR2IC_IC4LH | + RTC1_CFG_IC_OVER_WRITE_ENABLE << BITP_RTC_CR2IC_ICOWUSEN, + + /* CR3SS */ + RTC1_CFG_SS1_ENABLE << BITP_RTC_CR3SS_SS1EN | + RTC1_CFG_SS2_ENABLE << BITP_RTC_CR3SS_SS2EN | + RTC1_CFG_SS3_ENABLE << BITP_RTC_CR3SS_SS3EN | + RTC1_CFG_SS4_ENABLE << BITP_RTC_CR3SS_SS4EN | + RTC1_CFG_SS1_INT_ENABLE << BITP_RTC_CR3SS_SS1IRQEN | + RTC1_CFG_SS2_INT_ENABLE << BITP_RTC_CR3SS_SS2IRQEN | + RTC1_CFG_SS3_INT_ENABLE << BITP_RTC_CR3SS_SS3IRQEN | + RTC1_CFG_SS4_INT_ENABLE << BITP_RTC_CR3SS_SS4IRQEN, + + /* CR4SS */ + RTC1_CFG_SS1_MASK_ENABLE << BITP_RTC_CR4SS_SS1MSKEN | + RTC1_CFG_SS2_MASK_ENABLE << BITP_RTC_CR4SS_SS2MSKEN | + RTC1_CFG_SS3_MASK_ENABLE << BITP_RTC_CR4SS_SS3MSKEN | + RTC1_CFG_SS4_MASK_ENABLE << BITP_RTC_CR4SS_SS4MSKEN | + RTC1_CFG_SS1_AUTO_RELOADING_ENABLE << BITP_RTC_CR4SS_SS1ARLEN, + + /* SSMSK */ + RTC1_CFG_SS1_MASK_VALUE, + + /* SS1 */ + RTC1_CFG_SS1_AUTO_RELOAD_VALUE, + + 0, /* CR5SSS */ /* TODO: Add the following to the static configuration macros */ + 0, /* CR6SSS */ + 0, /* CR7SSS */ + 0x4688, /* GPMUX0 */ + 0x01F5, /* GPMUX1 */ + + } + +}; + +#endif +/*! \endcond */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc_def.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc_def.h new file mode 100755 index 0000000000..4b5afa44ef --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc_def.h @@ -0,0 +1,163 @@ +/*! + ***************************************************************************** + * @file: adi_rtc_def.h + * @brief: RTC def file + * @version: $Revision: 33205 $ + * @date: $Date: 2016-01-11 05:46:07 -0500 (Mon, 11 Jan 2016) $ + *----------------------------------------------------------------------------- + * + * Copyright (c) 2010-2016 Analog Devices, Inc. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Modified versions of the software must be conspicuously marked as such. + * - This software is licensed solely and exclusively for use with processors + * manufactured by or for Analog Devices, Inc. + * - This software may not be combined or merged with other code in any manner + * that would cause the software to become subject to terms and conditions + * which differ from those listed here. + * - Neither the name of Analog Devices, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * - The use of this software may or may not infringe the patent rights of one + * or more patent holders. This license does not release you from the + * requirement that you obtain separate licenses from these patent holders + * to use this software. + * + * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, + * TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL + * PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *****************************************************************************/ + +#ifndef ADI_RTC_DEF_H__ +#define ADI_RTC_DEF_H__ + +/*! \cond PRIVATE */ +#define ADI_RTC_NUM_INSTANCE 2u + + + +#define ADI_RTC_INT_ENA_MASK_CR0 0XF804u + +#define ADI_RTC_INT_ENA_MASK_CR1 0X1Fu + +#define ADI_RTC_INT_ENA_MASK_CR2IC 0xF41C +#define ADI_RTC_INT_ENA_MASK_CR3SS 0x1FFE +#define ADI_RTC_INT_ENA_MASK_CR4SS 0x0E0E +#define ADI_RTC_INT_ENA_MASK_CR5SSS 0x0FFF + +#define ADI_RTC_INT_SOURCE_MASK_SR0 0x007Eu +#define ADI_RTC_INT_SOURCE_MASK_SR2 0x001Fu + +#define ADI_RTC_WRITE_STATUS_MASK 0XCF8u +#define ADI_RTC_SR2_IRQ_STATUS_MASK 0X1Fu +#define ADI_RTC_SR3_IRQ_STATUS_MASK 0X1FFFu + + + +#define ADI_RTC_TRIM_MASK (BITM_RTC_TRM_VALUE | BITM_RTC_TRM_ADD|BITM_RTC_TRM_IVL | BITM_RTC_TRM_IVL2EXPMIN ) + +#if (ADI_RTC_CFG_ENABLE_SAFE_WRITE == 1) + /* pause on pending writes to CR to avoid data loss */ + +#ifdef __ICCARM__ +/* +* Pm154 (rule 19.10): in the definition of a function-like macro, each instance +* of a parameter shall be enclosed in parentheses +* Parameter use without parentheses needed for struct field name in register access macro. +*/ +#pragma diag_suppress=Pm154 +#endif /* __ICCARM__ */ + +#define PEND_BEFORE_WRITE(reg,mask) while((pDevice->pRTCRegs->reg&(mask))!=0u)\ + {\ + } + +#define SYNC_AFTER_WRITE(reg,mask) while((pDevice->pRTCRegs->reg&(mask))==0u)\ + {\ + } + +#ifdef __ICCARM__ +#pragma diag_default=Pm154 +#endif /* __ICCARM__ */ + +#else + /* pause on pending writes to CR to avoid data loss */ +#define PEND_BEFORE_WRITE(reg,mask) +#define SYNC_AFTER_WRITE(reg,mask) +#endif + +/* + * The following is used for static configuration + */ +typedef struct +{ + uint16_t CR0; /*!< CR0 16 bit control register-0 value */ + uint16_t CR1; /*!< CR1 16 bit control register-1 value */ + uint16_t CNT0; /*!< CNT0 16 bit count register value */ + uint16_t CNT1; /*!< CNT1 16 bit count register value */ + + uint16_t ALM0; /*!< ALM0 16 bit integer part of alarm value */ + uint16_t ALM1; /*!< ALM1 16 bit integer part of alarm value */ + uint16_t ALM2; /*!< ALM2 16 bit integer part of alarm value */ + uint16_t TRIM; /*!< 16 bit trim register value */ + uint16_t CR2IC; /*!< CR2IC 16 bit control (which controls the input capture ) register-2 value */ + uint16_t CR3SS; /*!< CR3SS 16 bit control ( Controls enabling sensor strobe /IRQ etc )register-3 value */ + uint16_t CR4SS; /*!< CR4SS 16 bit control ( controls Auto reload and mask for sensor strobe ) register-4 value */ + uint16_t SSMSK; /*!< OCMSK Mask register for sensor strobe channel */ + uint16_t SS1; /*!< 16 bit Auto reload value */ + + uint16_t CR5SSS; /*!< Configure Sensor Strobe Channel GPIO Sampling Register */ + uint16_t CR6SSS; /*!< Configure Sensor Strobe Channel GPIO Sampling Register */ + uint16_t CR7SSS; /*!< Configure Sensor Strobe Channel GPIO Sampling Register */ + uint16_t GPMUX0; /*!< Control register for selecting a GPIO (pin) as data to be sampled by a Sensor Strobe channel */ + uint16_t GPMUX1; /*!< Control register for selecting a GPIO (pin) as data to be sampled by a Sensor Strobe channel */ +}ADI_RTC_CONFIG; + +/* Device information structure */ +typedef struct _ADI_RTC_DEVICE_INFO +{ + volatile ADI_RTC_TypeDef *pRTCRegs; /* Base address of the SPORT registers */ + const IRQn_Type eIRQn; /* IRQn */ + ADI_RTC_HANDLE hDevice; /* RTC handle */ +}ADI_RTC_DEVICE_INFO; + +/*! RTC driver instance data */ +typedef struct _ADI_RTC_DEVICE +{ + volatile ADI_RTC_TypeDef *pRTCRegs; /* Pointer to RTC Memory Mapped Registers */ + + ADI_CALLBACK pfCallback; /* Function pointer for callback function. */ + + void *pCBParam; /* Parameter to callback function. */ + IRQn_Type eIRQn; /* IRQn */ + uint32_t cbWatch; + ADI_RTC_DEVICE_INFO *pDeviceInfo; /* Parameter to callback function. */ + +} ADI_RTC_DEVICE; + + +static void rtc_init(ADI_RTC_DEVICE *pDevice,ADI_RTC_CONFIG *pConfig); + +#ifdef ADI_DEBUG +static ADI_RTC_RESULT ValidateHandle( ADI_RTC_DEVICE *pInDevice); +#endif +/*! \endcond */ +#endif /* ADI_RTC_DEF_H__ */ + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map.h new file mode 100755 index 0000000000..7224c14faa --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map.h @@ -0,0 +1,71 @@ +/*! + ***************************************************************************** + @file: adi_rtos_map.h + @brief: RTOS API mapping file. + This is the main RTOS mapping header file which will include other + RTOS mapping files based on the RTOS selection. + + The purpose of RTOS mapping file is for mapping the abstracted + RTOS macros to the RTOS API calls based on the chosen RTOS. + + NOTE: This file is intended to be used by only the drivers. Not at + the application level. + + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*****************************************************************************/ +#ifndef ADI_RTOS_MAP_H +#define ADI_RTOS_MAP_H + +#include + +#if (ADI_CFG_RTOS == ADI_CFG_RTOS_MICRIUM_III) + +#include "rtos_map/adi_rtos_map_ucos_iii.h" + +#elif (ADI_CFG_RTOS == ADI_CFG_RTOS_FREERTOS) + +#include "rtos_map/adi_rtos_map_freertos.h" + +#else + +#include "rtos_map/adi_rtos_map_noos.h" + +#endif /* ADI_CFG_RTOS_MICRIUM_III */ + +#endif /* ADI_RTOS_MAP_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map_freertos.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map_freertos.h new file mode 100755 index 0000000000..97cbcaeeb7 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map_freertos.h @@ -0,0 +1,144 @@ +/*! + ***************************************************************************** + @file: adi_rtos_map_freertos.h + @brief: FreeRTOS RTOS API mapping file. + + This file maps the RTOS macros to FreeRTOS APIs + + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*****************************************************************************/ + +#ifndef ADI_RTOS_MAP_FREERTOS_H +#define ADI_RTOS_MAP_FREERTOS_H + +/* If building a c file */ +#if defined(__STDC__) + +#include +#include "semphr.h" + +extern BaseType_t xHigherPriorityTaskWoken; + +/*! Macro that declares the semaphore type that the drivers use. + The macro should be used within the device data structure. + It should not be used to declare the semaphore as a global variable. */ +#define SEM_VAR_DECLR \ + StaticQueue_t hSemaphore; + +/*! Memory required for semaphore in terms bytes. This size is used to compute + the total memory required for the operation of the driver. FreeRtos does not + require semaphore memory to be passed by application. But memory is required + to store the handle. */ +#define ADI_SEM_SIZE (sizeof(StaticQueue_t)) + +/*! Macro that creates a semaphore and returns the error specified in case of failure. DEV is the handle to the device driver structure that contains the semaphore/semaphore handle. */ + + /*! Macro that creates a semaphore and returns the error specified in case of failure. DEV is the handle to the device driver structure that contains the semaphore/semaphore handle. */ +#define SEM_CREATE(DEV, name, error) \ + do { \ + xSemaphoreCreateBinaryStatic(&(DEV)->hSemaphore); \ + } while (0) + +/*! Macro that deletes a semaphore and returns the error specified in case of failure. DEV is the handle to the device driver structure that contains the semaphore/semaphore handle. */ +#define SEM_DELETE(DEV, error) \ + do { \ + vSemaphoreDelete (&(DEV)->hSemaphore); \ + } while (0) + + +/*! Macro that blocks indefinitely on a semaphore and returns error in case of failure. DEV is the handle to the device driver structure that contains the semaphore handle.*/ +#define SEM_PEND(DEV, error) \ + do { \ + if(xSemaphoreTake (&(DEV)->hSemaphore, portMAX_DELAY) != pdTRUE) \ + return((error)); \ + } while (0) + +/*! Macro that posts a semaphore. DEV is the handle to the device driver structure that contains the semaphore handle. */ +/* Note that priority inversion is supported */ +#define SEM_POST(DEV) \ + do { \ + /* Assume that a higher priority task can be schedule in */ \ + BaseType_t xHigherPriorityTaskWoken = pdTRUE; \ + xSemaphoreGiveFromISR(&(DEV)->hSemaphore, &xHigherPriorityTaskWoken); \ + } while (0) + +/*! Defines a local variable where interrupt status register value is stored. + This macro should be used within a function in which critical section + macros ADI_ENTER_CRITICAL_REGION and ADI_EXIT_CRITICAL_REGION are + used. + + @sa ADI_ENTER_CRITICAL_REGION() + @sa ADI_EXIT_CRITICAL_REGION() + */ +#define ADI_INT_STATUS_ALLOC() + +/*! Macro to enter critical section. To use this macro, the + interrupt status variable should be defined (ADI_INT_STATUS_ALLOC) + in the same scope. + + @sa ADI_INT_STATUS_ALLOC() +*/ +#define ADI_ENTER_CRITICAL_REGION() vPortEnterCritical() + +/*! Macro to exit critical section.To use this macro, the + interrupt status variable should be defined (ADI_INT_STATUS_ALLOC) + in the same scope. + + @sa ADI_INT_STATUS_ALLOC() +*/ +#define ADI_EXIT_CRITICAL_REGION() vPortExitCritical() + +/*! Code that uCOS requires to be run in the beginning of an interrupt handler. + @sa ISR_EPILOG() +*/ +#define ISR_PROLOG() + +/*! Code that uCOS requires to be run in the end of an interrupt handler. + @sa ISR_PROLOG() +*/ +#define ISR_EPILOG() portYIELD() + +#endif /* __STDC__ */ + +#define PENDSV_HANDLER xPortPendSVHandler +#define SYSTICK_HANDLER xPortSysTickHandler +#define SVC_HANDLER vPortSVCHandler + + +#endif /* ADI_RTOS_MAP_FREERTOS_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map_noos.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map_noos.h new file mode 100755 index 0000000000..e508f1ccf5 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map_noos.h @@ -0,0 +1,180 @@ +/*! + ***************************************************************************** + @file: adi_rtos_map_noos.h + @brief: No OS API mapping file. + + This file maps the RTOS macros to No OS APIs + + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*****************************************************************************/ + +#ifndef ADI_RTOS_MAP_NOOS_H +#define ADI_RTOS_MAP_NOOS_H + +/* If building a c file */ +#if defined(__STDC__) + +#include +#include +#include +#include + +/*! Defines a local variable where interrupt status register value is stored. + This macro should be used within a function in which critical section + macros ADI_ENTER_CRITICAL_REGION and ADI_EXIT_CRITICAL_REGION are + used. + + @sa ADI_ENTER_CRITICAL_REGION() + @sa ADI_EXIT_CRITICAL_REGION() + */ +#define ADI_INT_STATUS_ALLOC() uint32_t IntStatus = 0u + +/*! Macro to enter critical section. To use this macro, the + interrupt status variable should be defined (ADI_INT_STATUS_ALLOC) + in the same scope. + + @sa ADI_INT_STATUS_ALLOC() +*/ +#define ADI_ENTER_CRITICAL_REGION() \ +do { \ + IntStatus = __get_PRIMASK(); \ + __disable_irq(); \ +} while (0) + + +/*! Macro to exit critical section.To use this macro, the + interrupt status variable should be defined (ADI_INT_STATUS_ALLOC) + in the same scope. + + @sa ADI_INT_STATUS_ALLOC() +*/ +#define ADI_EXIT_CRITICAL_REGION() \ +do { \ + __set_PRIMASK(IntStatus); \ +} while (0) + + +/*! Memory required for semaphore in terms bytes. This size is used to compute + the total memory required for the operation of the driver. */ +#define ADI_SEM_SIZE (sizeof(uint32_t)) + +/*! Code that uCOS requires to be run in the beginning of an interrupt handler. + @sa ISR_EPILOG() +*/ +#if defined(ADI_CYCLECOUNT_ENABLED) && (ADI_CYCLECOUNT_ENABLED == 1u) +#define ISR_PROLOG() adi_cyclecount_start(); +#else +#define ISR_PROLOG() +#endif + + +/*! Code that uCOS requires to be run in the end of an interrupt handler. + @sa ISR_PROLOG() +*/ +#if defined(ADI_CYCLECOUNT_ENABLED) && (ADI_CYCLECOUNT_ENABLED == 1u) +#define ISR_EPILOG() adi_cyclecount_stop(); +#else +#define ISR_EPILOG() +#endif + +#if (ADI_CFG_ENTER_LOW_PWR_MODE_SUPPORT == 1) + +/*! Macro that declares the semaphore type that the drivers use. + The macro should be used within the device data structure. + It should not be used to declare the semaphore as a global variable. */ +#define SEM_VAR_DECLR volatile uint32_t nLowPowerExitFlag; + +/*! Macro that creates a semaphore and returns the error specified in case of failure. DEV is the handle to the device driver structure that contains the semaphore/semaphore handle */ +#define SEM_CREATE(DEV, name, error) \ + (DEV)->nLowPowerExitFlag = 0u + +/*! Macro that deletes a semaphore and returns the error specified in case of failure. DEV is the handle to the device driver structure that contains the semaphore/semaphore handle */ +#define SEM_DELETE(DEV, error) do { } while(0) + +/*! Macro that blocks indefinitely on a semaphore and returns error in case of failure. DEV is the handle to the device driver structure that contains the semaphore handle. */ +#define SEM_PEND(DEV, error) \ + do { \ + ADI_PWR_RESULT eResult; \ + eResult = adi_pwr_EnterLowPowerMode(ADI_PWR_MODE_FLEXI, &(DEV)->nLowPowerExitFlag, 0u); \ + if(eResult != ADI_PWR_SUCCESS) { return ((error)); } \ + } while(0) + + +/*! Macro that posts a semaphore. DEV is the handle to the device driver structure that contains the semaphore handle. */ +#define SEM_POST(DEV) \ + do { \ + adi_pwr_ExitLowPowerMode(&(DEV)->nLowPowerExitFlag); \ + } while(0) + + +#else /* ADI_CFG_ENTER_LOW_PWR_MODE_SUPPORT == 0 */ + +/*! Macro that declares the semaphore type that the drivers use. + The macro should be used within the device data structure. + It should not be used to declare the semaphore as a global variable. */ +#define SEM_VAR_DECLR volatile uint32_t nSemCount; + +/*! Macro that creates a semaphore and returns the error specified in case of failure. DEV is the handle to the device driver structure that contains the semaphore/semaphore handle */ +#define SEM_CREATE(DEV, name, error) \ + (DEV)->nSemCount = 0 + +/*! Macro that deletes a semaphore and returns the error specified in case of failure. DEV is the handle to the device driver structure that contains the semaphore/semaphore handle */ +#define SEM_DELETE(DEV, error) do { } while(0) + +/*! Macro that blocks indefinitely on a semaphore and returns error in case of failure. DEV is the handle to the device driver structure that contains the semaphore handle. */ +#define SEM_PEND(DEV, error) \ + while ((DEV)->nSemCount == 0u) {} \ + (DEV)->nSemCount-- + +/*! Macro that posts a semaphore. DEV is the handle to the device driver structure that contains the semaphore handle. */ +#define SEM_POST(DEV) { \ + (DEV)->nSemCount++; \ +} + +#endif /* ADI_CFG_ENTER_LOW_PWR_MODE_SUPPORT */ + +#endif /* __STDC__ */ + +#define PENDSV_HANDLER PendSV_Handler +#define SYSTICK_HANDLER SysTick_Handler +#define SVC_HANDLER SVC_Handler + + +#endif /* ADI_RTOS_MAP_NOOS_H */ + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map_ucos_ii.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map_ucos_ii.h new file mode 100755 index 0000000000..20ee60f610 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map_ucos_ii.h @@ -0,0 +1,149 @@ +/*! + ***************************************************************************** + @file: adi_rtos_map_ucos_ii.h + @brief: uCOS-III RTOS API mapping file. + + This file maps the RTOS macros to uCOS-II APIs + + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*****************************************************************************/ + +#ifndef ADI_RTOS_MAP_UCOS_II_H +#define ADI_RTOS_MAP_UCOS_II_H + +/* If building a c file */ +#if defined(__STDC__) + +#include +#include +#include +#include + +/*! Macro that declares the semaphore type that the drivers use. + The macro should be used within the device data structure. + It should not be used to declare the semaphore as a global variable. */ +#define SEM_VAR_DECLR \ + OS_EVENT *hSemaphore; + +/*! Memory size required for semaphore in terms bytes. This size is used to compute + the total memory required for the operation of the driver. In case of uCOS-II + there is no requirement to provide the memory to create the semaphore, but + memory is required to store the handle */ +#define ADI_SEM_SIZE sizeof(OS_EVENT) + +/*! Macro that creates a semaphore and returns the error specified in case of failure. DEV is the handle to the device driver structure that contains the semaphore/semaphore handle */ +#define SEM_CREATE(DEV, name, error) \ + do { \ + ((DEV)->hSemaphore) = OSSemCreate(0u); \ + if((DEV)->hSemaphore == NULL) {return((error));} \ + } while (0) + +/*! Macro that deletes a semaphore and returns the error specified in case of failure. DEV is the handle to the device driver structure that contains the semaphore/semaphore handle */ +#define SEM_DELETE(DEV, error) \ + do { \ + INT8U os_error; \ + OSSemDel( (DEV)->hSemaphore, OS_DEL_NO_PEND, &os_error ); \ + if(os_error != OS_ERR_NONE) {return((error));} \ + } while (0) + + +/*! Macro that blocks indefinitely on a semaphore and returns error in case of failure. DEV is the handle to the device driver structure that contains the semaphore handle. */ +#define SEM_PEND(DEV, error) \ + do { \ + INT8U os_error; \ + OSSemPend ((DEV)->hSemaphore, 0u, &os_error); \ + if(os_error != OS_ERR_NONE) {return((error));} \ + } while (0) + +/*! Macro that posts a semaphore. DEV is the handle to the device driver structure that contains the semaphore handle. */ +#define SEM_POST(DEV) \ + do { \ + OSSemPost((DEV)->hSemaphore ); \ + } while (0) + +/*! Defines a local variable where interrupt status register value is stored. + This macro should be used within a function in which critical section + macros ADI_ENTER_CRITICAL_REGION and ADI_EXIT_CRITICAL_REGION are + used. + + @sa ADI_ENTER_CRITICAL_REGION() + @sa ADI_EXIT_CRITICAL_REGION() + */ +#define ADI_INT_STATUS_ALLOC() CPU_SR_ALLOC() + +/*! Macro to enter critical section. To use this macro, the + interrupt status variable should be defined (ADI_INT_STATUS_ALLOC) + in the same scope. + + @sa ADI_INT_STATUS_ALLOC() +*/ +#define ADI_ENTER_CRITICAL_REGION() CPU_CRITICAL_ENTER() + +/*! Macro to exit critical section.To use this macro, the + interrupt status variable should be defined (ADI_INT_STATUS_ALLOC) + in the same scope. + + @sa ADI_INT_STATUS_ALLOC() +*/ +#define ADI_EXIT_CRITICAL_REGION() CPU_CRITICAL_EXIT() + +/*! Code that uCOS requires to be run in the beginning of an interrupt handler. + @sa ISR_EPILOG() +*/ +#define ISR_PROLOG() \ + do { \ + CPU_SR_ALLOC(); \ + CPU_CRITICAL_ENTER(); \ + OSIntEnter(); \ + CPU_CRITICAL_EXIT(); \ + } while (0); + +/*! Code that uCOS requires to be run in the end of an interrupt handler. + @sa ISR_PROLOG() +*/ +#define ISR_EPILOG() OSIntExit(); + +#endif /* __STDC__ */ + +#define PENDSV_HANDLER OS_CPU_PendSVHandler +#define SYSTICK_HANDLER OS_CPU_SysTickHandler +#define SVC_HANDLER SVC_Handler + + +#endif /* ADI_RTOS_MAP_UCOS_II_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map_ucos_iii.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map_ucos_iii.h new file mode 100755 index 0000000000..e055b7010f --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtos_map/adi_rtos_map_ucos_iii.h @@ -0,0 +1,167 @@ +/*! + ***************************************************************************** + @file: adi_rtos_map_ucos_iii.h + @brief: uCOS-III RTOS API mapping file. + + This file maps the RTOS macros to uCOS-III APIs + + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*****************************************************************************/ + +#ifndef ADI_RTOS_MAP_UCOS_III_H +#define ADI_RTOS_MAP_UCOS_III_H + +/* If building a c file */ +#if defined(__STDC__) + +#include +#include +#include +#include + +/*! Macro that declares the semaphore type that the drivers use. + The macro should be used within the device data structure. + It should not be used to declare the semaphore as a global variable. */ +#define SEM_VAR_DECLR \ + OS_SEM Semaphore; + +/*! Memory required for semaphore in terms bytes. This size is used to compute + the total memory required for the operation of the driver. uCOS-III requires + semaphore memory to be passed by application. But there is no memory required + to store the handle. For every semaphore related call the same memory pointer + that was used during create will be passed. */ +#define ADI_SEM_SIZE (sizeof(OS_SEM)) + +/*! Macro that creates a semaphore and returns the error specified in case of failure. DEV is the handle to the device driver structure that contains the semaphore/semaphore handle. */ +#define SEM_CREATE(DEV, name, error) \ + do { \ + OS_ERR os_error; \ + OSSemCreate(&((DEV)->Semaphore), name ,0u, &os_error); \ + if(OS_ERR_NONE != os_error) {return((error));} \ + } while (0) + +/*! Macro that deletes a semaphore and returns the error specified in case of failure. DEV is the handle to the device driver structure that contains the semaphore/semaphore handle. */ +#define SEM_DELETE(DEV, error) \ + do { \ + OS_ERR os_error; \ + OSSemDel( &((DEV)->Semaphore), OS_OPT_DEL_NO_PEND, &os_error ); \ + if(OS_ERR_NONE != os_error) {return((error));} \ + } while (0) + + +/*! Macro that blocks indefinitely on a semaphore and returns error in case of failure. DEV is the handle to the device driver structure that contains the semaphore handle.*/ +#define SEM_PEND(DEV, error) \ + do { \ + OS_ERR os_error; \ + OSSemPend (&((DEV)->Semaphore), 0u, OS_OPT_PEND_BLOCKING , NULL, &os_error); \ + if(OS_ERR_NONE != os_error) {return((error));} \ + } while (0) + +/*! Macro that posts a semaphore. DEV is the handle to the device driver structure that contains the semaphore handle. */ +#define SEM_POST(DEV) \ + do { \ + OS_ERR os_error; \ + OSSemPost(&((DEV)->Semaphore), OS_OPT_POST_1, &os_error); \ + } while (0) + + +/*! Defines a local variable where interrupt status register value is stored. + This macro should be used within a function in which critical section + macros ADI_ENTER_CRITICAL_REGION and ADI_EXIT_CRITICAL_REGION are + used. + + @sa ADI_ENTER_CRITICAL_REGION() + @sa ADI_EXIT_CRITICAL_REGION() +*/ +#define ADI_INT_STATUS_ALLOC() CPU_SR_ALLOC() + +/*! Macro to enter critical section. To use this macro, the + interrupt status variable should be defined (ADI_INT_STATUS_ALLOC) + in the same scope. + + @sa ADI_INT_STATUS_ALLOC() +*/ +#define ADI_ENTER_CRITICAL_REGION() CPU_CRITICAL_ENTER() + +/*! Macro to exit critical section.To use this macro, the + interrupt status variable should be defined (ADI_INT_STATUS_ALLOC) + in the same scope. + + @sa ADI_INT_STATUS_ALLOC() +*/ +#define ADI_EXIT_CRITICAL_REGION() CPU_CRITICAL_EXIT() + + +/*! Code that uCOS requires to be run in the beginning of an interrupt handler. + @sa ISR_EPILOG() +*/ +#if defined(ADI_CYCLECOUNT_ENABLED) && (ADI_CYCLECOUNT_ENABLED == 1) +#define ADI_RTOS_UCOS_III_CYCLECOUNT_START adi_cyclecount_start(); +#define ADI_RTOS_UCOS_III_CYCLECOUNT_STOP adi_cyclecount_stop(); +#else +#define ADI_RTOS_UCOS_III_CYCLECOUNT_START +#define ADI_RTOS_UCOS_III_CYCLECOUNT_STOP +#endif + +#define ISR_PROLOG() \ + do { \ + CPU_SR_ALLOC(); \ + CPU_CRITICAL_ENTER(); \ + OSIntEnter(); \ + CPU_CRITICAL_EXIT(); \ + ADI_RTOS_UCOS_III_CYCLECOUNT_START \ + } while (0); + +/*! Code that uCOS requires to be run in the end of an interrupt handler. + @sa ISR_PROLOG() +*/ +#define ISR_EPILOG() \ + do { \ + ADI_RTOS_UCOS_III_CYCLECOUNT_STOP \ + OSIntExit(); \ + } while (0); \ + +#endif /* __STDC__ */ + +#define PENDSV_HANDLER OS_CPU_PendSVHandler +#define SYSTICK_HANDLER OS_CPU_SysTickHandler +#define SVC_HANDLER SVC_Handler + + +#endif /* ADI_RTOS_MAP_UCOS_III_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/spi/adi_spi.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/spi/adi_spi.c new file mode 100755 index 0000000000..7c8c0e3022 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/spi/adi_spi.c @@ -0,0 +1,1892 @@ +/*! ***************************************************************************** + * @file: adi_spi.c + * @brief: SPI device driver global file. + * @details: This a global file which includes a specific file based on the processor family. + * This included file will be containing SPI device driver functions. + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +/** @addtogroup SPI_Driver SPI Driver + * @{ + * @brief Serial Peripheral Interface (SPI) Driver + * @details The SPI driver manages all instances of the SPI peripheral. + * @note The application must include drivers/spi/adi_spi.h to use this driver. + * @note This driver requires the DMA driver.The application must include the DMA driver sources to avoid link errors. + * @note Also note that the SPI will be configured by default to operate in Master mode. + * @note To configure the driver to operate in slave mode the static configuration file adi_spi_config.h must be modified. + * @note Specifically, the macro ADI_SPIx_MASTER_MODE must be set to '0' to indicate that slave mode functionality is needed. + * @note Since there are three SPI devices there are three macros, ADI_SPI0_MASTER_MODE, ADI_SPI1_MASTER_MODE and ADI_SPI2_MASTER_MODE to control the functionality of each SPI controller. + * @note Each instance of the SPI operates independently from all other instances. + * @note + * @note When operating the SPI at high bit rates the application may need to modify the IRQ interrupt mode. The API adi_spi_SetIrqmode() can be used for this. + * @note At higher bit rates the ISR could mask a TX/RX interrupt. Specifically, it is possible that while servicing a TX/RX event another TX/RX event could occur. It is + * @note possible, therefore, that when the ISR clears the interrupt status it will not only be clearing the current TX event but the next TX/RX event as well. The result + * @note could that a final TX/RX event will not be processed. One way to work around this would be to set IRQMODE such that TX/RX events will occur only after N bytes + * @note are in the FIFO. This will only work for short bursts less than the size of the FIFO. For larger transfer DMA mode, which will not have any of these issues, should be used. + * @note Finally, if interrupt mode is required at hight bit rates note that the SPI ISR has been designed with minimal cycle count as the highest priority. + * @note The ISR could certainly be modified to re-examine the FIFO before existing at the cost of additional cycles. + */ + + /*! \cond PRIVATE */ +#include +/*! \endcond */ + +#include /* for 'NULL" definition */ +#include + +#include +#include +#include +#include +#include +#include "adi_spi_config.h" +#include + + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm123 (rule 8.5): there shall be no definition of objects or functions in a header file +* This isn't a header as such. +* +* Pm073 (rule 14.7): a function should have a single point of exit +* Pm143 (rule 14.7): a function should have a single point of exit at the end of the function +* Multiple returns are used for error handling. +* +* Pm088 (rule 17.4): pointer arithmetic should not be used. +* Relying on pointer arithmetic for buffer handling. +* +* Pm152: (MISRA C 2004 rule 17.4) array indexing shall only be applied to objects defined as an array type +* Accessing the DMA descriptors, which are defined in the system as a pointer to an array of descriptors +* +* Pm151 (rule 17.4): array indexing shall only be applied to objects of array type +* Pm123 (rule 18.5): there shall be no definition of objects in a header file +* +* Pm50: (MISRA C 2004 rule 14.3) a null statement shall only occur on a line by itself, and shall not have any other text on the same line +* Some Macros, such as ISR_PROLOGUE, may not have any expansion resulting in just the terminating ';' +* +*Pm140: (MISRA C 2004 rule 11.3) a cast should not be performed between a pointer type and an integral type +* MMR addresses are defined as simple constants. Accessing the MMR requires casting to a pointer type +* +* Pm031: (MISRA C 2004 rule 12.7) bitwise operations shall not be performed on signed integer types +* MMR macros are beyond the control of the driver. +* +*/ +#pragma diag_suppress=Pm050,Pm073,Pm088,Pm123,Pm143,Pm152,Pm140,Pm031 + +#endif /* __ICCARM__ */ + +#include "adi_spi_data.c" + +/*! \cond PRIVATE */ + +/* handle checker for debug mode */ +#define ADI_SPI_VALIDATE_HANDLE(h) ((spi_device_info[0].hDevice != (h)) && (spi_device_info[1].hDevice != (h)) && (spi_device_info[2].hDevice != (h))) + +/*! \endcond */ + +/* + * Local prototypes + */ +static void common_SPI_Int_Handler (ADI_SPI_DEV_DATA_TYPE* pDD); +static void StartTransaction (ADI_SPI_HANDLE const hDevice, const ADI_SPI_TRANSCEIVER* const pXfr); +static void TxDmaErrorCallback (void *pCBParam, uint32_t Event, void *pArg); +static void RxDmaErrorCallback (void *pCBParam, uint32_t Event, void *pArg); + +/* ISR forward declarations */ +/*! \cond PRIVATE */ +void SPI0_Int_Handler(void); +void SPI1_Int_Handler(void); +void SPI2_Int_Handler(void); +void DMA_SPI0_TX_Int_Handler(void); +void DMA_SPI0_RX_Int_Handler(void); +void DMA_SPI1_TX_Int_Handler(void); +void DMA_SPI1_RX_Int_Handler(void); +void DMA_SPIH_TX_Int_Handler(void); +void DMA_SPIH_RX_Int_Handler(void); +/*! \endcond */ + +/* + ////////////////////////////////////////////////////////////////////////////// + ////////////////////// API IMPLEMENTATIONS /////////////////////////////// + ////////////////////////////////////////////////////////////////////////////// +*/ + +/*! + * @brief Initialize and allocate an SPI device for use in Master Mode. + * + * @param[in] nDeviceNum Zero-based device index designating which device to initialize. + *\n + * @param [in] pDevMemory Pointer to a buffer of size ADI_SPI_MEMORY_SIZE + *\n required by the driver for the operation of specified SPI device. + * + * @param [in] nMemorySize Size of the buffer to which "pMemory" points. + * + * @param[out] phDevice The caller's device handle pointer for storing the initialized device instance data pointer. + * + * @return Status + * - #ADI_SPI_INVALID_DEVICE_NUM [D] Invalid device index. + * - #ADI_SPI_INVALID_PARAM [D] Invalid parameter. + * - #ADI_SPI_SEMAPHORE_FAILED Semaphore creation failed. + * - #ADI_SPI_DMA_REG_FAILED Failed to register DMA callbacks with common DMA service. + * - #ADI_SPI_IN_USE SPI is already open and in use. + * - #ADI_SPI_SUCCESS Call completed successfully. + * +* @note : No other SPI APIs may be called until the device open function is called. + *\n Initialize an SPI device using internal default configuration settings and allocate the + *\n device for use.The returned device handle is required to be passed to all subsequent + *\n calls to convey which device instance to operate on. + *\n The contents of phDevice will be set to NULL upon failure. Device is opened in Master mode. + *\n + * @sa adi_spi_SetMasterMode() + * @sa adi_spi_Close(). + */ +ADI_SPI_RESULT adi_spi_Open(uint32_t nDeviceNum, + void *pDevMemory, + uint32_t nMemorySize, + ADI_SPI_HANDLE* const phDevice) +{ + +#ifdef ADI_DEBUG + + if (nDeviceNum >= ADI_SPI_NUM_INSTANCES) + { + return ADI_SPI_INVALID_DEVICE_NUM; + } + + if (nMemorySize != sizeof(struct __ADI_SPI_DEV_DATA_TYPE)) + { + return ADI_SPI_INVALID_PARAM; + } + + if( spi_device_info[nDeviceNum].hDevice != NULL ) + { + return ADI_SPI_IN_USE; + } + +#endif + + ADI_SPI_HANDLE hDevice = pDevMemory; + + /* + * Link the two data structures together. + * + * ADI_SPI_DEVICE_INFO <==> ADI_SPI_HANDLE + * + * Clear the ADI_SPI_HANDLE memory. This also sets all bool + * structure members to false so we do not need to waste cycles + * setting these explicitly (e.g. hDevice->bDMA = false) + * + * Other fields, such as callback related fields, are also zeroed + * and therefore properly initialized. + */ + + spi_device_info[nDeviceNum].hDevice = (ADI_SPI_DEV_DATA_TYPE *)pDevMemory; + memset(pDevMemory,0,nMemorySize); + hDevice->pDevInfo = &spi_device_info[nDeviceNum]; + + + /* + * Although the ADI_SPI_DEVICE_INFO struct has the address of the SPI registers + * for this instance, copying it to the ADI_SPI_HANDLE struct will minimize + * the runtime footprint and cycle count when accessing the SPI registers + */ + hDevice->pSpi = spi_device_info[nDeviceNum].pSpiRegs; + + SEM_CREATE(hDevice, "SPI_SEM", ADI_SPI_SEMAPHORE_FAILED); + + /* Static Configuration */ + /* Initialize the device based on the given configuration parameters */ + ADI_SPI_CFG_TYPE const* pSPICfg = &gSPICfg[nDeviceNum]; + hDevice->pSpi->CTL = pSPICfg->SPI_CTL; + hDevice->pSpi->DIV = pSPICfg->SPI_DIV; + + /* write the device data pointer into the caller's handle */ + *phDevice = hDevice; + hDevice->pSpi->CTL |= BITM_SPI_CTL_SPIEN; + + /* Make sure the DMA controller and its SRAM based descriptors are initialized */ + adi_dma_Init(); + + /* Setup the DMA TX callback */ + if (ADI_DMA_SUCCESS != adi_dma_RegisterCallback((DMA_CHANn_TypeDef) hDevice->pDevInfo->dmaTxChannelNumber, TxDmaErrorCallback, (void *) hDevice)) + { + return ADI_SPI_DMA_REG_FAILED; + } + + /* Setup the DMA RX callback */ + if (ADI_DMA_SUCCESS != adi_dma_RegisterCallback((DMA_CHANn_TypeDef) hDevice->pDevInfo->dmaRxChannelNumber, RxDmaErrorCallback, (void *) hDevice)) + { + return ADI_SPI_DMA_REG_FAILED; + } + + return ADI_SPI_SUCCESS; +} + + +/*! + * @brief Uninitialize and deallocate an SPI device. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * + * @return Status + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_SPI_SUCCESS Call completed successfully. + * + * Uninitialize and release an allocated SPI device,and memory associated with it for other use. + * + * @sa adi_spi_Open(). + */ +ADI_SPI_RESULT adi_spi_Close (ADI_SPI_HANDLE const hDevice) +{ + + ADI_SPI_RESULT result = ADI_SPI_SUCCESS; +#ifdef ADI_DEBUG + if (ADI_SPI_VALIDATE_HANDLE(hDevice)) + { + return ADI_SPI_INVALID_HANDLE; + } + +#endif + + + /* disable Interrupt */ + NVIC_DisableIRQ(hDevice->pDevInfo->eIRQn); + + + /* destroy semaphore */ + SEM_DELETE((ADI_SPI_HANDLE) hDevice,ADI_SPI_SEMAPHORE_FAILED); + + /* invalidate initialization state */ + hDevice->pDevInfo->hDevice = NULL; + return result; +} + + +/*! + * @brief Register or unregister the callback. + * + * @param [in] hDevice Device handle obtained from adi_spi_Open(). + * @param [in] pfCallback Pointer to the callback function. Can be passed as NULL to unregister the + *\n previously registered callback. + * @param [in] pCBParam Callback parameter which will be passed back to the application when the + *\n callback is called. + * + * @return Status + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_SPI_SUCCESS Call completed successfully. + */ +ADI_SPI_RESULT adi_spi_RegisterCallback (ADI_SPI_HANDLE const hDevice, ADI_CALLBACK const pfCallback, void *const pCBParam ) +{ +#ifdef ADI_DEBUG + if (ADI_SPI_VALIDATE_HANDLE(hDevice)) { + return ADI_SPI_INVALID_HANDLE; + } + +#endif + /* Save the application provided callback and callback parameters */ + hDevice->pfCallback = pfCallback; + hDevice->pCBParam = pCBParam; + + return ADI_SPI_SUCCESS; +} + +/*! + * @brief Set the IRQ mode. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[in] nMode IRQ mode value to set. +* - true Set continuous transfer mode. +* - false Clear continuous transfer mode. + * + * @return Status + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_SPI_SUCCESS Call completed successfully. + * + * These bits configure when the Tx/Rx interrupts occur in a transfer. + * For DMA Rxtransfer, these bits should be 0. + * Value values are 0-7 + * Tx interrupt occurs when (nMode+1) byte(s) has been transferred. + * Rx interrupt occurs when (nMode+1) or more bytes have been received into the FIFO. + * + * @note The application will have to carefully manage IRQMODE relative to a transaction's buffer size. + * @note Specifically, the application must ensure that the last byte causes an interrupt else the + * @note transaction will not terminate. As explained in the SPI driver overview, this functionality + * @note is typically needed when operating in interrupt mode with a high SPI bit rate (typically issues + * @note are seen at SPI clock rates of 4MHz or greater). The max clock rate will vary depending on the application. + * @note The max clock rate is a function of the SPI ISR cycle count plus any other delay that might be caused + * @note by other parts of the system. Finally, please note that while sustaining interrupt mode SPI transaction + * @note at high bit rates will work buffers that are the size of the SPI FIFO or less, transactions that are + * @note larger that the size of the FIFO may run into issues associated with masked/lost interrupts. If this + * @note does prove to be an issue for an applicatoon then the SPI ISR could be modified to examine the FIFO + * @note status on a continuous basis in the ISR (as opposed to examining the FIFO status just once at the start + * @note of the ISR). However, adding this functionality to the ISR will increase the ISR cycle count and footprint. + * + */ +ADI_SPI_RESULT adi_spi_SetIrqmode (ADI_SPI_CONST_HANDLE const hDevice, const uint8_t nMode) +{ + +#ifdef ADI_DEBUG + if (ADI_SPI_VALIDATE_HANDLE(hDevice)) { + return ADI_SPI_INVALID_HANDLE; + } + +#endif + + uint16_t ien = hDevice->pSpi->IEN; + ien = ien & (uint16_t)~BITM_SPI_IEN_IRQMODE; + ien = ien | (nMode & BITM_SPI_IEN_IRQMODE); + hDevice->pSpi->IEN = ien; + + return ADI_SPI_SUCCESS; +} + + +/*! + * @brief Set the continuous transfer mode. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[in] bFlag Flag to manage SPI continuous transfer mode. +* - true Set continuous transfer mode. +* - false Clear continuous transfer mode. + * + * @return Status + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_SPI_SUCCESS Call completed successfully. + * + * Setting this mode causes the SPI controller to drive the Chip Select signal continuously until the transaction + * is complete. Clearing it causes Chip Select to cycle between bytes. + * + * + */ +ADI_SPI_RESULT adi_spi_SetContinuousMode (ADI_SPI_CONST_HANDLE const hDevice, const bool bFlag) +{ + +#ifdef ADI_DEBUG + if (ADI_SPI_VALIDATE_HANDLE(hDevice)) { + return ADI_SPI_INVALID_HANDLE; + } + +#endif + + if (true == bFlag) { + hDevice->pSpi->CTL |= (BITM_SPI_CTL_CON); + } else { + hDevice->pSpi->CTL &= (uint16_t)~BITM_SPI_CTL_CON; + } + + return ADI_SPI_SUCCESS; +} + +/*! + * @brief Set the internal loopback mode. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[in] bFlag Flag to manage internal SPI loopback mode. + * - true Set internal loopback mode. + * - false Clear internal loopback mode. + * + * @return Status + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_SPI_SUCCESS Call completed successfully. + * + * Set or clear the internal SPI loopback mode. Primarily used for testing. + * + */ +ADI_SPI_RESULT adi_spi_SetLoopback (ADI_SPI_CONST_HANDLE const hDevice, const bool bFlag) +{ + +#ifdef ADI_DEBUG + if (ADI_SPI_VALIDATE_HANDLE(hDevice)) + { + return ADI_SPI_INVALID_HANDLE; + } + +#endif + + if (true == bFlag) { + hDevice->pSpi->CTL |= (BITM_SPI_CTL_LOOPBACK); + } else { + hDevice->pSpi->CTL &= (uint16_t)~BITM_SPI_CTL_LOOPBACK; + } + + return ADI_SPI_SUCCESS; +} + +/*! + * @brief Set SPI Master-Mode operation. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[in] bFlag Flag to select either Master-Mode or Slave-Mode operation. + *\n - true Enable Master-Mode. Default. + *\n - false Enable Slave-Mode. + * + * @return Status + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_SPI_SUCCESS Call completed successfully. + * + * Controls SPI Master/Slave mode of operation, set for Master-Mode, clear for Slave-Mode. + * + */ +ADI_SPI_RESULT adi_spi_SetMasterMode (ADI_SPI_CONST_HANDLE const hDevice, const bool bFlag) +{ + +#ifdef ADI_DEBUG + if (ADI_SPI_VALIDATE_HANDLE(hDevice)) + { + return ADI_SPI_INVALID_HANDLE; + } + +#endif + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + if (true == bFlag) { /* hardware default */ + hDevice->pSpi->CTL |= (ADI_SPI_MASTERCON_INITIALIZER); + } else { + hDevice->pSpi->CNT = 0u; + hDevice->pSpi->CTL &= (uint16_t)~BITM_SPI_CTL_MASEN; + hDevice->pSpi->CTL |= (ADI_SPI_SLAVECON_INITIALIZER); + } + ADI_EXIT_CRITICAL_REGION(); + return ADI_SPI_SUCCESS; +} + + +/*! + * @brief Set the SPI receive FIFO overflow mode. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[in] bFlag Flag to manage receive FIFO overflow behaviour. + *\n - true Discard old data on receive FIFO overflow. + *\n - false Discard new data on receive FIFO overflow. + * + * @return Status + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_SPI_SUCCESS Call completed successfully. + * + * Controls what to do with excess incoming data when the receive FIFO becomes full. + * Either the new data or the old data is discarded. Set the receive FIFO overflow mode + * to replace data in the RX register (top of receive FIFO) with the incoming new data. + * Clear it to discard incoming new data and preserve old unread data. + + * + */ +ADI_SPI_RESULT adi_spi_SetReceiveOverflow (ADI_SPI_CONST_HANDLE const hDevice, const bool bFlag) +{ + +#ifdef ADI_DEBUG + if (ADI_SPI_VALIDATE_HANDLE(hDevice)) + { + return ADI_SPI_INVALID_HANDLE; + } + +#endif + + if (true == bFlag) { + hDevice->pSpi->CTL |= (BITM_SPI_CTL_RXOF); + } else { + hDevice->pSpi->CTL &= (uint16_t)~BITM_SPI_CTL_RXOF; + } + + return ADI_SPI_SUCCESS; +} + + +/*! + * @brief Set the SPI transmit FIFO underflow mode. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[in] bFlag Flag to manage transmit FIFO underflow behaviour. + *\n - true Send zeroes on transmit FIFO underflow. + *\n - false Resend last data on transmit FIFO underflow. + * + * @return Status + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_SPI_SUCCESS Call completed successfully. + * + *\n Controls what to transmit when lacking valid data because the transmit FIFO is empty. + *\n Either zeros or the last valid data are transmitted. Set transmit FIFO underflow mode to send zeros. + *\n Clear it to resend the last transmitted data. + * + */ +ADI_SPI_RESULT adi_spi_SetTransmitUnderflow (ADI_SPI_CONST_HANDLE const hDevice, const bool bFlag) +{ + +#ifdef ADI_DEBUG + if (ADI_SPI_VALIDATE_HANDLE(hDevice)) + { + return ADI_SPI_INVALID_HANDLE; + } +#endif + + if (true == bFlag) { + hDevice->pSpi->CTL |= (BITM_SPI_CTL_ZEN); + } else { + hDevice->pSpi->CTL &= (uint16_t)~BITM_SPI_CTL_ZEN; + } + + return ADI_SPI_SUCCESS; +} + + + + + + +/*! + * @brief Set the SPI serial clock frequency. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open() + * @param[in] Hertz Target frequency (in Hz) for SPI bitrate. + * + * @return Status + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_SPI_INVALID_PARAM Specified frequency is out of range. + * - #ADI_SPI_BAD_SYS_CLOCK Unable to obtain PCLK which is needed to calculate the new bit rate. + * - #ADI_SPI_SUCCESS Call completed successfully. + * + * Compute and set the internal SPI clock rate divider register to produce + *\n the desired serial clock frequency. Resulting frequency is subject to arithmetic rounding errors. + *\n Use #adi_spi_GetBitrate() to obtain the exact frequency produced, including rounding errors. + * + * @sa adi_spi_GetBitrate(). + */ +ADI_SPI_RESULT adi_spi_SetBitrate (ADI_SPI_CONST_HANDLE const hDevice, const uint32_t Hertz) +{ + uint32_t incoming_clock; + uint16_t Div; + +#ifdef ADI_DEBUG + if (ADI_SPI_VALIDATE_HANDLE(hDevice)) + { + return ADI_SPI_INVALID_HANDLE; + } +#endif + + if( adi_pwr_GetClockFrequency(ADI_CLOCK_PCLK, &incoming_clock) != ADI_PWR_SUCCESS) + { + return ADI_SPI_INVALID_HANDLE; + } + + /* requested rate needs to be 2x or less than incoming clock */ + if ((2U * Hertz) > incoming_clock) + { + return ADI_SPI_BAD_SYS_CLOCK; + } + + /* compute the SPI divider value */ + Div = (uint16_t) ((incoming_clock / Hertz) >> 1U) - 1U; /* '>>1' is really a divide by 2 */ + + /* range check that computed divider fits */ + if (Div != (Div & BITM_SPI_DIV_VALUE)) + { + return ADI_SPI_INVALID_PARAM; + } + + /* store it in core */ + hDevice->pSpi->DIV = Div; + + return ADI_SPI_SUCCESS; +} + + +/*! + * @brief Get the SPI serial clock frequency. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open() + * \n + * @param[out] pnBitrate Pointer to the location where Bitrate need to be written. + * + * @return + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_SPI_SUCCESS Call completed successfully. + * + * Get the current serial clock frequency. The returned value is exact but + *\n may not exactly match the value set with #adi_spi_SetBitrate() due to + *\n computational round-off errors resulting from fixed register size and + *\n finite-precision arithmetic. + * + * @sa adi_spi_SetBitrate(). + */ +ADI_SPI_RESULT adi_spi_GetBitrate (ADI_SPI_CONST_HANDLE const hDevice, uint32_t* const pnBitrate) +{ + uint32_t incoming_clock; + ADI_PWR_RESULT ePwrResult; + uint32_t Div; + +#ifdef ADI_DEBUG + if (ADI_SPI_VALIDATE_HANDLE(hDevice)) + { + return ADI_SPI_INVALID_HANDLE; + } +#endif + Div = hDevice->pSpi->DIV; /* assumes this is always a right-justified value */ + + ePwrResult = adi_pwr_GetClockFrequency(ADI_CLOCK_PCLK, &incoming_clock); + if(ePwrResult != ADI_PWR_SUCCESS) + { + *pnBitrate= 0u; + return(ADI_SPI_FAILURE); + } + *pnBitrate= (incoming_clock / (Div + 1U)) >> 1U; /* '>>1' is divide by 2 */ + return(ADI_SPI_SUCCESS); + +} + + +/*! + * @brief Set the chip select. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[in] eChipSelect An enum value representing the requested Chip Select. + * + * @return Status + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_SPI_SUCCESS Call completed successfully. + * + * Sets the desired chip select to use for activating an external slave device. + * + * @note Chip select \a ADI_SPI0_CSn is reserved for SPI device 0 (SPI0) internal chip select line + * dedicated for communications with the UHF device. + * + */ +ADI_SPI_RESULT adi_spi_SetChipSelect (ADI_SPI_HANDLE const hDevice, const ADI_SPI_CHIP_SELECT eChipSelect) +{ + +#ifdef ADI_DEBUG + if (ADI_SPI_VALIDATE_HANDLE(hDevice)) + { + return ADI_SPI_INVALID_HANDLE; + } +#endif + + hDevice->ChipSelect = eChipSelect; + + return ADI_SPI_SUCCESS; +} + +/*! + * @brief Submit data buffers for SPI Master-Mode transaction in "Blocking mode".This function + *\n returns only after the data transfer is complete + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[in] pXfr Pointer to transfer data struct #ADI_SPI_TRANSCEIVER. + * + * @return Status + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_SPI_BUFFER_NOT_SUBMITTED [D] Failed to submit the buffer. + * - #ADI_SPI_INVALID_POINTER [D] Invalid data pointer detected (NULL). + * - #ADI_SPI_INVALID_PARAM [D] Invalid size parameter detected (0). + * - #ADI_SPI_SUCCESS Call completed successfully. + * + *\n + *\n Request a non-blocking mode transmit and receive of multiple data bytes + *\n over the SPI serial channel. + *\n Buffer allocations are made by the calling code (the application). + *\n + *\n The transmit buffer is sent and the receive buffer is written according + *\n to the size and increment information contained by the \a pXft transfer + *\n data structure parameter. + *\n + *\n + * @sa adi_spi_MasterSubmitBuffer(). + * @sa ADI_SPI_TRANSCEIVER + */ +ADI_SPI_RESULT adi_spi_MasterReadWrite (ADI_SPI_HANDLE const hDevice, const ADI_SPI_TRANSCEIVER* const pXfr) +{ + ADI_SPI_RESULT eResult; + hDevice->bBlockingMode = true; + eResult = adi_spi_MasterSubmitBuffer(hDevice,pXfr); + hDevice->bBlockingMode = false; + if( (eResult == ADI_SPI_SUCCESS) && (hDevice->HWErrors != 0u)) + { + eResult = ADI_SPI_HW_ERROR_OCCURRED; + } + return(eResult); +} + +/*! + * @brief Submit data buffers for SPI Master-Mode transaction. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[in] pXfr Pointer to transfer data struct. + * + * @return Status + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_SPI_IN_USE [D] DMA transaction already under way. + * - #ADI_SPI_INVALID_POINTER [D] Invalid data pointer detected (NULL). + * - #ADI_SPI_INVALID_PARAM [D] Invalid size parameter detected (0). + * - #ADI_SPI_SUCCESS Call completed successfully. + * + *\n Request a blocking mode transmit and receive of multiple data bytes + *\n over the SPI serial channel. + *\n Buffer allocations are made by the calling code (the application). + *\n + *\n The transmit buffer is sent and the receive buffer is written according + *\n to the size and increment information contained by the \a pXft transfer + *\n data structure parameter. + * + * + * @sa adi_spi_MasterReadWrite(). + * @sa adi_spi_isBufferAvailable() + * @sa ADI_SPI_TRANSCEIVER + */ + +ADI_SPI_RESULT adi_spi_MasterSubmitBuffer (ADI_SPI_HANDLE const hDevice, const ADI_SPI_TRANSCEIVER* const pXfr) +{ + ADI_SPI_RESULT result = ADI_SPI_SUCCESS; + volatile uint16_t nStatus; + +#ifdef ADI_DEBUG + if (ADI_SPI_VALIDATE_HANDLE(hDevice)) + { + return ADI_SPI_INVALID_HANDLE; + } + + if ((NULL == pXfr->pTransmitter) && (NULL == pXfr->pReceiver)) + { + return ADI_SPI_INVALID_POINTER; + } + + if( (pXfr->bRD_CTL == true) && (pXfr->TransmitterBytes > 16u)) + { + return ADI_SPI_INVALID_PARAM; + } + +#endif /* ADI_DEBUG */ + + /* Initialize the transaction. 'hDevice' must hold the transaction values as pXfr is owned by the application */ + hDevice->pTxBuffer = pXfr->pTransmitter; + hDevice->pRxBuffer = pXfr->pReceiver; + hDevice->TxRemaining = pXfr->TransmitterBytes; + hDevice->RxRemaining = pXfr->ReceiverBytes; + hDevice->TxIncrement = (uint8_t)pXfr->nTxIncrement; + hDevice->RxIncrement = (uint8_t)pXfr->nRxIncrement; + hDevice->bDmaMode = pXfr->bDMA; + hDevice->bRdCtlMode = pXfr->bRD_CTL; + hDevice->bTransferComplete = false; + hDevice->HWErrors = ADI_SPI_HW_ERROR_NONE; + + + /* + * + * TIM + * If set: initiate transfer with write to SPI_TX register + * If clear: initiate transfer with a read from SPI_RX register + * + * RFLUSH + * Clear this bit to ensure that incoming data is ignored + * + * TFLUSH + * Clear this not to ensure that transmitted data is not a zero (if SPI_CTL.ZEN is set) or last transmitted byte + * + */ + + + hDevice->pSpi->CTL &= (uint16_t)~(BITM_SPI_CTL_TIM | BITM_SPI_CTL_RFLUSH | BITM_SPI_CTL_TFLUSH); + + /* + * If in DMA mode then make sure XFRDONE interrupt is not set. DMA mode will generate three interrupts + * TX DMA + * RX DMA + * XFRDONE + * + * There is a race condition between XFRDONE and DMA interrupts. They are on different clocks. + * + * SPI XfrDone is counted on SPI clock (SCL) edge, which is a fixed timing related to SPI bit protocol. + * But the DMA works upon system clock (HCLK) and it could finish on various timing upon SCL/HCLK ratio. + * And bus bandwidth (e.g., DMA hold off until processor frees up the bus). So SPI RX DMA done interrupt + * could be issued earlier or later than SPI XferDone interrupt. + * + */ + if( hDevice->bDmaMode==true ) { + /* The race condition has been between RX and XFRDONE. If there are no bytes to receive then */ + /* do not clear XFRDONE */ + if( hDevice->RxRemaining != 0u) { + hDevice->pSpi->IEN &= (uint16_t)~(BITM_SPI_IEN_XFRDONE); + } else { + hDevice->pSpi->IEN |= (BITM_SPI_IEN_XFRDONE); + } + + } else { + + /* In interrupt mode always enable XFRDONE */ + uint16_t activeInterrupts = BITM_SPI_IEN_XFRDONE; + /* Enable underflow on;y if sending bytes */ + if( hDevice->TxRemaining ) { + activeInterrupts |= BITM_SPI_IEN_TXUNDR; + } + /* Enable overflow only if receiving bytes */ + if( hDevice->RxRemaining ) { + activeInterrupts |= BITM_SPI_IEN_RXOVR; + } + + hDevice->pSpi->IEN |= activeInterrupts; + + /* + * In interrupt mode, when there is nothing to receive, need to initiate a transaction + * on an TX write only. Initiating on an RX read will start the transaction, but just for + * a single byte (and we're not sure why this is true) + */ + + if( hDevice->RxRemaining == 0u) { + hDevice->pSpi->CTL |= ( BITM_SPI_CTL_TIM ); + } + + } + + + /* STAT bits are cleared by writing a '1' to them. Clear any residual status*/ + nStatus = hDevice->pSpi->STAT; + hDevice->pSpi->STAT = nStatus; + + /* Make sure we are in master mode */ + hDevice->pSpi->CTL |= ( BITM_SPI_CTL_MASEN); + + /* Set ChipSelect */ + hDevice->pSpi->CS_CTL = hDevice->ChipSelect; + + StartTransaction(hDevice, pXfr); + + + /* block if required */ + if (hDevice->bBlockingMode == true) + { + SEM_PEND(hDevice,ADI_SPI_PEND_FAILED); + } + + return result; +} + +/*********************************************************************************************************/ +/* */ +/* SPI DRIVER Master Mode transaction start */ +/* */ +/*********************************************************************************************************/ + +static void StartTransaction(ADI_SPI_HANDLE const hDevice, const ADI_SPI_TRANSCEIVER* const pXfr) +{ + /* Transaction completion is determined by the number of bytes to be received */ + uint16_t nCount; + + /* Effectively flush the FIFOs before the start of the next transaction */ + hDevice->pSpi->CTL |= (BITM_SPI_CTL_RFLUSH|BITM_SPI_CTL_TFLUSH); + hDevice->pSpi->CTL &= (uint16_t)~(BITM_SPI_CTL_RFLUSH|BITM_SPI_CTL_TFLUSH); + + /* Disable any prior notion of DMA */ + hDevice->pSpi->DMA &= (uint16_t)~(BITM_SPI_DMA_EN | BITM_SPI_DMA_RXEN | BITM_SPI_DMA_TXEN); + + + /* + * If the transaction is DMA based then set up the DMA descriptors for this transaction + */ + + uint16_t dmaFlags = 0u; + + if( hDevice->bDmaMode == true) + { + dmaFlags = BITM_SPI_DMA_EN; + + uint16_t sz = pXfr->TransmitterBytes; + if( sz ) + { + uint16_t TxChanNum = hDevice->pDevInfo->dmaTxChannelNumber; + + /* Enable the interrupt for the given DMA */ + NVIC_EnableIRQ((IRQn_Type)(hDevice->pDevInfo->dmaTxIrqNumber)); + + /* Disables source address decrement for TX channel */ + pADI_DMA0->SRCADDR_CLR = 1U << TxChanNum; + + /* Enable the channel */ + pADI_DMA0->EN_SET = 1U << TxChanNum; + + /* Enables SPI peripheral to generate DMA requests. */ + pADI_DMA0->RMSK_CLR = 1U << TxChanNum; + + /* Set the primary as the current DMA descriptor */ + pADI_DMA0->ALT_CLR = 1U << TxChanNum; + + /* fill in the DMA RAM descriptors */ + if( (sz & 1U) != 0u ) + { + /* DMA is performed on 16-bit data. Make sure the DMA engine is properly aligned to even counts */ + /* The SPI_CNT register will hold the "real" transfer count */ + sz++; + } + + pPrimaryCCD[TxChanNum].DMASRCEND = (uint32_t)(pXfr->pTransmitter + (sz - 2U)); + + pPrimaryCCD[TxChanNum].DMADSTEND = (uint32_t)&hDevice->pSpi->TX; + + pPrimaryCCD[TxChanNum].DMACDC = ((uint32_t)ADI_DMA_INCR_NONE << DMA_BITP_CTL_DST_INC) | + (ADI_DMA_INCR_2_BYTE << DMA_BITP_CTL_SRC_INC) | + (ADI_DMA_WIDTH_2_BYTE << DMA_BITP_CTL_SRC_SIZE) | + ((sz/2U -1U)<< DMA_BITP_CTL_N_MINUS_1) | + (DMA_ENUM_CTL_CYCLE_CTL_BASIC << DMA_BITP_CTL_CYCLE_CTL); + + dmaFlags |= (BITM_SPI_DMA_TXEN); + } + + sz = pXfr->ReceiverBytes; + if( sz ) + { + + uint16_t RxChanNum = hDevice->pDevInfo->dmaRxChannelNumber; + NVIC_EnableIRQ((IRQn_Type)(hDevice->pDevInfo->dmaRxIrqNumber)); + + /* Disables destination address decrement for RX channel */ + pADI_DMA0->DSTADDR_CLR = 1U << RxChanNum; + + /* Enable the channel */ + pADI_DMA0->EN_SET = 1U << RxChanNum; + + /* Enables SPI peripheral to generate DMA requests. */ + pADI_DMA0->RMSK_CLR = 1U << RxChanNum; + + /* Set the primary as the current DMA descriptor */ + pADI_DMA0->ALT_CLR = 1U << RxChanNum; + + if( (sz & 1U) != 0u ) + { + /* DMA is performed on 16-bit data. Make sure the DMA engine is properly aligned to even counts */ + /* The SPI_CNT register will hold the "real" transfer count */ + sz++; + } + + pPrimaryCCD[RxChanNum].DMASRCEND = (uint32_t)&hDevice->pSpi->RX; + + pPrimaryCCD[RxChanNum].DMADSTEND = (uint32_t)(pXfr->pReceiver + (sz - 2U)); + + pPrimaryCCD[RxChanNum].DMACDC = (ADI_DMA_INCR_2_BYTE << DMA_BITP_CTL_DST_INC) | + (ADI_DMA_INCR_NONE << DMA_BITP_CTL_SRC_INC) | + (ADI_DMA_WIDTH_2_BYTE << DMA_BITP_CTL_SRC_SIZE) | + ((sz/2U -1U) << DMA_BITP_CTL_N_MINUS_1) | + (DMA_ENUM_CTL_CYCLE_CTL_BASIC << DMA_BITP_CTL_CYCLE_CTL); + + dmaFlags |= (BITM_SPI_DMA_RXEN ); + + } + } + + /* + * SPI CNT register + * Non Read Mode: Size of the entire transactions + * Read Mode: Size of the RX transaction + * + * RD_CTL.SZ + * Read Mode: Size of the TX transaction + */ + + hDevice->pSpi->RD_CTL = 0u; + if( hDevice->bRdCtlMode) + { + /* "Half Duplex Mode" */ + + /* The number of bytes to be transmitted */ + uint32_t nBytes = hDevice->TxRemaining - 1U; + + /* Enable RD_CTL and set the TX count for the half-duplex mode of operation */ + hDevice->pSpi->RD_CTL &= (uint16_t)~((uint16_t)(BITM_SPI_RD_CTL_TXBYTES << BITP_SPI_RD_CTL_TXBYTES)); + + hDevice->pSpi->RD_CTL |= (uint16_t)( (uint16_t)(nBytes << BITP_SPI_RD_CTL_TXBYTES) | + (uint16_t)(1 << BITP_SPI_RD_CTL_CMDEN)); + + /* RD_CTL requires continuous mode operation. */ + hDevice->pSpi->CTL |= (BITM_SPI_CTL_CON); + + /* CNT represent the number of bytes to receive */ + hDevice->pSpi->CNT = hDevice->RxRemaining; + + } + else + { + /* Full duplex mode of operation */ + if(hDevice->RxRemaining == 0u) + { + /* There is nothing to receive. Flush the RX FIFO and to ignore all incoming data */ + hDevice->pSpi->CTL |= (BITM_SPI_CTL_RFLUSH); + } + else if(hDevice->TxRemaining == 0u) + { + /* If there is nothing to transmit then clear the TX FIFO */ + hDevice->pSpi->CTL |= (BITM_SPI_CTL_TFLUSH); + } + else + { + /* Misra compliance: All if/else chains should end with a final else clause */ + } + + /* Set CNT to MAX of RX/TX */ + + nCount = hDevice->RxRemaining > hDevice->TxRemaining ? hDevice->RxRemaining : hDevice->TxRemaining; + hDevice->pSpi->CNT = (uint16_t)nCount; + + } + + + if( hDevice->bDmaMode == false) + { + /* Make sure that the application passed in a TX Buffer */ + if( hDevice->pTxBuffer != NULL) + { + /* interrupt mode: Fill in the FIFO */ + nCount = 0u; + while((nCount < ADI_SPI_FIFO_SIZE) && (hDevice->TxRemaining != 0u)) + { + /* grab the lead byte */ + hDevice->pSpi->TX = *hDevice->pTxBuffer; + /* modify tx pointer and buffer count prior to interrupt */ + hDevice->pTxBuffer += hDevice->TxIncrement; + /* decrement the byte count */ + hDevice->TxRemaining--; + nCount++; + } + } + + } else { + + hDevice->pSpi->DMA |= dmaFlags; + } + + if((hDevice->pSpi->CTL & BITM_SPI_CTL_TIM) != BITM_SPI_CTL_TIM) + { + uint16_t byte ADI_UNUSED_ATTRIBUTE = hDevice->pSpi->RX; + } + + + NVIC_EnableIRQ(hDevice->pDevInfo->eIRQn); + + return; +} + +/*! + * @brief Block until the SPI transaction is complete. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + *\n + * @param[out] pHWErrors Pointer to hardware error return variable. + *\n + * @return Status + * - #ADI_SPI_SUCCESS Call completed successfully. + * - #ADI_SPI_SEMAPHORE_FAILED Semaphore Pend failed + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * + * @sa adi_spi_MasterSubmitBuffer(). + * @sa adi_spi_SlaveSubmitBuffer(). + */ +ADI_SPI_RESULT adi_spi_GetBuffer( + ADI_SPI_HANDLE const hDevice, + uint32_t * const pHWErrors + ) +{ +#ifdef ADI_DEBUG + if (ADI_SPI_VALIDATE_HANDLE(hDevice)) + { + *pHWErrors = ADI_SPI_HW_ERROR_NONE; + return ADI_SPI_INVALID_HANDLE; + } +#endif + + SEM_PEND(hDevice,ADI_SPI_SEMAPHORE_FAILED); + *pHWErrors = hDevice->HWErrors; + return(ADI_SPI_SUCCESS); +} + +/*! + * @brief Get the SPI transaction completion status. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + *\n + * @param[out] bComplete Pointer to boolean variable that indicates + *\n - true DMA transmit sequence is complete. + *\n - false DMA transmit sequence is incomplete. + *\n + * @return Status + * - #ADI_SPI_SUCCESS Call completed successfully. + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * + * @sa adi_spi_MasterSubmitBuffer(). + * @sa adi_spi_SlaveSubmitBuffer(). + */ + +ADI_SPI_RESULT adi_spi_isBufferAvailable(ADI_SPI_CONST_HANDLE const hDevice, bool* const bComplete) +{ +#ifdef ADI_DEBUG + if (ADI_SPI_VALIDATE_HANDLE(hDevice)) + { + return ADI_SPI_INVALID_HANDLE; + } +#endif + + *bComplete = hDevice->bTransferComplete; + return(ADI_SPI_SUCCESS); +} + +/*! + * @brief Submit data buffers for SPI Slave-Mode transaction. + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[in] pXfr Pointer to transfer data struct. + * + * @return Status + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_SPI_IN_USE [D] DMA transaction already under way. + * - #ADI_SPI_INVALID_POINTER [D] Invalid data pointer detected (NULL). + * - #ADI_SPI_INVALID_PARAM [D] Invalid size parameter detected (0). + * - #ADI_SPI_SUCCESS Call completed successfully. + * + *\n Request a non-blocking transmit and receive of multiple data bytes + *\n over the SPI serial channel. Honours current blocking and DMA modes. + *\n Buffer allocations are made by the calling code (the application). + *\n + *\n The transmit buffer is sent and the receive buffer is written according + *\n to the size and increment information contained by the \a pXft transfer + *\n data structure parameter. + *\n + *\n The application must make a call to adi_spi_GetBuffer() to retrieve the buffer + *\n + *\n @note: + * + * @sa adi_spi_MasterReadWrite(). + * @sa adi_spi_EnableDmaMode(). + * @sa adi_spi_isBufferAvailable(). + * @sa adi_spi_GetBuffer(). + */ +ADI_SPI_RESULT adi_spi_SlaveSubmitBuffer (ADI_SPI_HANDLE const hDevice, const ADI_SPI_TRANSCEIVER* const pXfr) +{ + volatile uint16_t ADI_UNUSED_ATTRIBUTE byte; + uint32_t nCount = 0u; + +#ifdef ADI_DEBUG + if (ADI_SPI_VALIDATE_HANDLE(hDevice)) + { + return ADI_SPI_INVALID_HANDLE; + } + if ((NULL == pXfr->pTransmitter) && (NULL == pXfr->pReceiver)) + { + return ADI_SPI_INVALID_POINTER; + } + + if ((0u == pXfr->pTransmitter) && (0u == pXfr->pReceiver) ) + { + return ADI_SPI_INVALID_PARAM; + } + /* Return error if the RX buffer is not null and count is equal to zero or vice versa.*/ + if (((pXfr->pReceiver != NULL) && (pXfr->ReceiverBytes == 0u)) || ((pXfr->pReceiver == NULL) && ((pXfr->ReceiverBytes > 0u)))) + { + return ADI_SPI_INVALID_PARAM; + } + + /* Return error if the Tx buffer is not null and count is equal to zero or vice versa.*/ + if (((pXfr->pTransmitter != NULL) && (pXfr->TransmitterBytes == 0u)) || ((pXfr->pTransmitter == NULL) && (pXfr->TransmitterBytes > 0u))) + { + return ADI_SPI_INVALID_PARAM; + } + + /* DMA count register is only 8 bits, so block size is limited to 255 */ + if ((pXfr->bDMA==true) && (pXfr->TransmitterBytes != 0u) &&(((uint32_t)pXfr->pTransmitter&0x1U) !=0u ) ) + { + return ADI_SPI_INVALID_PARAM; + } + +#endif /* ADI_DEBUG */ + + /* Effectively flush the FIFOs before the start of the next transaction */ + hDevice->pSpi->CTL |= (BITM_SPI_CTL_RFLUSH|BITM_SPI_CTL_TFLUSH); + hDevice->pSpi->CTL &= (uint16_t)~(BITM_SPI_CTL_RFLUSH|BITM_SPI_CTL_TFLUSH); + + /* Shut down any DMA enables that are still lingering from a prior transaction */ + hDevice->pSpi->DMA &= (uint16_t)~(BITM_SPI_DMA_EN | BITM_SPI_DMA_RXEN | BITM_SPI_DMA_TXEN); + + hDevice->bTransferComplete = false; + hDevice->pTxBuffer = pXfr->pTransmitter; + hDevice->pRxBuffer = pXfr->pReceiver; + hDevice->TxRemaining = pXfr->TransmitterBytes; + hDevice->RxRemaining = pXfr->ReceiverBytes; + hDevice->TxIncrement = (uint8_t)pXfr->nTxIncrement; + hDevice->RxIncrement = (uint8_t)pXfr->nRxIncrement; + hDevice->pSpi->CNT = (uint16_t)nCount; + hDevice->bDmaMode = pXfr->bDMA; + hDevice->bRdCtlMode = pXfr->bRD_CTL; + hDevice->HWErrors = ADI_SPI_HW_ERROR_NONE; + + + /* Configure SPI. First step is to clear CTL bits that may have been set previously */ + hDevice->pSpi->CTL &= (uint16_t)~(BITM_SPI_CTL_TIM | BITM_SPI_CTL_RFLUSH | BITM_SPI_CTL_TFLUSH | BITM_SPI_CTL_CON); + if( hDevice->TxRemaining == 0u ) + { + /* This will prevent TX underflow interrupts from occurring */ + hDevice->pSpi->CTL |= BITM_SPI_CTL_TFLUSH; + } + if( hDevice->RxRemaining == 0u ) + { + /* This will prevent data from entering RX. Also prevents overflow interrupts from occurring */ + hDevice->pSpi->CTL |= BITM_SPI_CTL_RFLUSH; + + /* If SPI_CTL.TIM is set, the Tx FIFO status causes the interrupt. */ + if( hDevice->bDmaMode != true) { + hDevice->pSpi->CTL |= BITM_SPI_CTL_TIM; + } + + } + + hDevice->pSpi->CNT = (uint16_t) hDevice->TxRemaining > hDevice->RxRemaining ? hDevice->TxRemaining : hDevice->RxRemaining; + + uint16_t nDMAFlags = 0u; + + if( hDevice->bDmaMode == true) + { + uint16_t sz = pXfr->TransmitterBytes; + if( sz ) + { + uint16_t TxChanNum = hDevice->pDevInfo->dmaTxChannelNumber; + + /* Enable the interrupt for the given DMA */ + NVIC_EnableIRQ((IRQn_Type)(hDevice->pDevInfo->dmaTxIrqNumber)); + + /* Disables source address decrement for TX channel */ + pADI_DMA0->SRCADDR_CLR = 1U << TxChanNum; + + /* Enable the channel */ + pADI_DMA0->EN_SET = 1U << TxChanNum; + + /* Enables SPI peripheral to generate DMA requests. */ + pADI_DMA0->RMSK_CLR = 1U << TxChanNum; + + /* Set the primary as the current DMA descriptor */ + pADI_DMA0->ALT_CLR = 1U << TxChanNum; + + /* fill in the DMA RAM descriptors */ + if( (sz & 1U) != 0u ) + { + /* DMA is performed on 16-bit data. Make sure the DMA engine is properly aligned to even counts */ + /* The SPI_CNT register will hold the "real" transfer count */ + sz++; + } + + pPrimaryCCD[TxChanNum].DMASRCEND = (uint32_t)(pXfr->pTransmitter + (sz - 2U)); + + pPrimaryCCD[TxChanNum].DMADSTEND = (uint32_t)&hDevice->pSpi->TX; + + pPrimaryCCD[TxChanNum].DMACDC = ((uint32_t)ADI_DMA_INCR_NONE << DMA_BITP_CTL_DST_INC) | + (ADI_DMA_INCR_2_BYTE << DMA_BITP_CTL_SRC_INC) | + (ADI_DMA_WIDTH_2_BYTE << DMA_BITP_CTL_SRC_SIZE) | + ((sz/2U -1U)<< DMA_BITP_CTL_N_MINUS_1) | + (DMA_ENUM_CTL_CYCLE_CTL_BASIC << DMA_BITP_CTL_CYCLE_CTL); + + nDMAFlags |= (BITM_SPI_DMA_TXEN); + } + + sz = pXfr->ReceiverBytes; + if( sz ) + { + + uint16_t RxChanNum = hDevice->pDevInfo->dmaRxChannelNumber; + NVIC_EnableIRQ((IRQn_Type)(hDevice->pDevInfo->dmaRxIrqNumber)); + + /* Disables destination address decrement for RX channel */ + pADI_DMA0->DSTADDR_CLR = 1U << RxChanNum; + + /* Enable the channel */ + pADI_DMA0->EN_SET = 1U << RxChanNum; + + /* Enables SPI peripheral to generate DMA requests. */ + pADI_DMA0->RMSK_CLR = 1U << RxChanNum; + + /* Set the primary as the current DMA descriptor */ + pADI_DMA0->ALT_CLR = 1U << RxChanNum; + + if( (sz & 1U) != 0u ) + { + /* DMA is performed on 16-bit data. Make sure the DMA engine is properly aligned to even counts */ + /* The SPI_CNT register will hold the "real" transfer count */ + sz++; + } + + pPrimaryCCD[RxChanNum].DMASRCEND = (uint32_t)&hDevice->pSpi->RX; + + pPrimaryCCD[RxChanNum].DMADSTEND = (uint32_t)(pXfr->pReceiver + (sz - 2U)); + + pPrimaryCCD[RxChanNum].DMACDC = (ADI_DMA_INCR_2_BYTE << DMA_BITP_CTL_DST_INC) | + (ADI_DMA_INCR_NONE << DMA_BITP_CTL_SRC_INC) | + (ADI_DMA_WIDTH_2_BYTE << DMA_BITP_CTL_SRC_SIZE) | + ((sz/2U -1U) << DMA_BITP_CTL_N_MINUS_1) | + (DMA_ENUM_CTL_CYCLE_CTL_BASIC << DMA_BITP_CTL_CYCLE_CTL); + + nDMAFlags |= (BITM_SPI_DMA_RXEN ); + + } + } + + /* Make sure XFRDONE is shut down. This IEN has no affect in slave mode */ + hDevice->pSpi->IEN &= (uint16_t)~BITM_SPI_IEN_XFRDONE; + + if( hDevice->bDmaMode == false) { + /* Make sure we are not in continuous mode from a prior DMA transaction */ + hDevice->pSpi->CTL &= (uint16_t)~BITM_SPI_CTL_CON; + + + /* interrupt mode: Enable the UNDERFLOW and OVERFLOW interrupts */ + /* XFRDONE is invalid in slave mode */ + uint16_t activeInterrupts = 0u; + /* Enable underflow on;y if sending bytes */ + if( hDevice->TxRemaining ) { + activeInterrupts |= BITM_SPI_IEN_TXUNDR; + } + /* Enable overflow only if receiving bytes */ + if( hDevice->RxRemaining ) { + activeInterrupts |= BITM_SPI_IEN_RXOVR; + } + hDevice->pSpi->IEN |= activeInterrupts; + + /* interrupt mode: Fill in the FIFO and enable the TX by a dummy read. */ + while((nCount < ADI_SPI_FIFO_SIZE) && (hDevice->TxRemaining != 0u)) + { + /* grab the lead byte */ + hDevice->pSpi->TX = *hDevice->pTxBuffer; + /* modify tx pointer and buffer count prior to interrupt */ + hDevice->pTxBuffer += hDevice->TxIncrement; + /* decrement the byte count */ + hDevice->TxRemaining--; + nCount++; + } + } else { + + /* DMA mode. Enable the controller */ + hDevice->pSpi->DMA |= (uint16_t)(BITM_SPI_DMA_EN | nDMAFlags); + } + + if((hDevice->pSpi->CTL & BITM_SPI_CTL_TIM) != BITM_SPI_CTL_TIM) + { + byte = hDevice->pSpi->RX; + } + NVIC_EnableIRQ(hDevice->pDevInfo->eIRQn); + + if (hDevice->bBlockingMode == true) + { + SEM_PEND(hDevice,ADI_SPI_SEMAPHORE_FAILED); + } + + return ADI_SPI_SUCCESS; +} + + + +/*! + * @brief Submit data buffers for SPI Slave-Mode transaction in "Blocking mode".This function + *\n returns only after the data transfer is complete + * + * @param[in] hDevice Device handle obtained from adi_spi_Open(). + * @param[in] pXfr Pointer to transfer data struct #ADI_SPI_TRANSCEIVER. + * + * @return Status + * - #ADI_SPI_INVALID_HANDLE [D] Invalid device handle parameter. + * - #ADI_SPI_BUFFER_NOT_SUBMITTED [D] Failed to submit the buffer. + * - #ADI_SPI_INVALID_POINTER [D] Invalid data pointer detected (NULL). + * - #ADI_SPI_INVALID_PARAM [D] Invalid size parameter detected (0). + * - #ADI_SPI_SUCCESS Call completed successfully. + * + *\n + *\n Request a non-blocking mode transmit and receive of multiple data bytes + *\n over the SPI serial channel. + *\n Buffer allocations are made by the calling code (the application). + *\n + *\n The transmit buffer is sent and the receive buffer is written according + *\n to the size and increment information contained by the \a pXft transfer + *\n data structure parameter. + *\n + *\n + * @sa adi_spi_SlaveSubmitBuffer(). + * @sa ADI_SPI_TRANSCEIVER + */ +ADI_SPI_RESULT adi_spi_SlaveReadWrite (ADI_SPI_HANDLE const hDevice, const ADI_SPI_TRANSCEIVER* const pXfr) +{ + ADI_SPI_RESULT eResult; + hDevice->bBlockingMode = true; + eResult = adi_spi_SlaveSubmitBuffer(hDevice,pXfr); + hDevice->bBlockingMode = false; + if( (eResult == ADI_SPI_SUCCESS) && (hDevice->HWErrors != 0u)) + { + eResult = ADI_SPI_HW_ERROR_OCCURRED; + } + return(eResult); +} + +/* + ***************************************************************************** + * SPI Internal Static Support Functions + *****************************************************************************/ + + + /*! \cond PRIVATE */ + + +/*----------------------------------------------------------------------------- + * + * SPI ISR + * + *----------------------------------------------------------------------------*/ + + + +static void common_SPI_Int_Handler (ADI_SPI_DEV_DATA_TYPE* pDD) +{ + + /* read status register - first thing */ + volatile uint16_t nFifoStatus = pDD->pSpi->FIFO_STAT; + uint16_t nErrorStatus = pDD->pSpi->STAT; + + uint16_t writableBytes; + uint16_t readableBytes; + + + + /* Trap overflow/underflow errors and terminate the current transaction if there is an error. */ + if( BITM_SPI_STAT_RXOVR == (BITM_SPI_STAT_RXOVR & nErrorStatus)) { + pDD->HWErrors |= (uint32_t)ADI_SPI_HW_ERROR_RX_OVERFLOW; + } else if( BITM_SPI_STAT_TXUNDR == (BITM_SPI_STAT_TXUNDR & nErrorStatus)) { + pDD->HWErrors |= (uint32_t)ADI_SPI_HW_ERROR_TX_UNDERFLOW; + } + else + { + + /* calculate number of bytes that can be written to tx fifo */ + writableBytes = ADI_SPI_FIFO_SIZE - ((BITM_SPI_FIFO_STAT_TX & nFifoStatus) >> BITP_SPI_FIFO_STAT_TX); + /* calculate number of bytes to read from rx fifo */ + readableBytes = ((BITM_SPI_FIFO_STAT_RX & nFifoStatus) >> BITP_SPI_FIFO_STAT_RX); + + /* fill tx fifo */ + while ((writableBytes != 0u) && (pDD->TxRemaining != 0u)) + { + pDD->pSpi->TX = *pDD->pTxBuffer; + pDD->pTxBuffer += pDD->TxIncrement; + pDD->TxRemaining--; + writableBytes--; + } + + /* + * Now focus on the RX FIFO but only if we are not in RD_CTL mode OR, if we + * are in RD_CTL mode, TX bytes are all transmitted + */ + + if( (pDD->bRdCtlMode==false) || (pDD->TxRemaining==0u) ) + { + /* empty rx fifo */ + while ((readableBytes != 0u) &&(pDD->RxRemaining != 0u)) + { + + *pDD->pRxBuffer = (uint8_t) pDD->pSpi->RX; + pDD->pRxBuffer += pDD->RxIncrement; + pDD->RxRemaining--; + readableBytes--; + } + } + } + + + /* Terminate the transaction and notify the caller + * 1) Master mode: If there are no more bytes to RX or TX and XFRDONE is set + * 2) Slave mode: If there are no more bytes to RX or TX (XFRDONE is invalid in slave mode) + * 3) If there was a HW error + */ + bool terminate = false; + if( (pDD->RxRemaining == 0u) && (pDD->TxRemaining == 0u)) + { + if( BITM_SPI_CTL_MASEN == (pDD->pSpi->CTL & BITM_SPI_CTL_MASEN )) + { + /* Master mode */ + if( BITM_SPI_STAT_XFRDONE == (pDD->pSpi->STAT & BITM_SPI_STAT_XFRDONE )) + { + /* Master mode XFRDONE */ + terminate = true; + } + } else { + /* Slave mode - we're all done here */ + terminate = true; + } + } + + if( terminate || (pDD->HWErrors != (uint32_t)ADI_SPI_HW_ERROR_NONE)) + { + + /* Clear possible interrupt sources: XFRDONE and underflow and overflow */ + pDD->pSpi->IEN &= ~(BITM_SPI_IEN_XFRDONE|BITM_SPI_IEN_RXOVR|BITM_SPI_IEN_TXUNDR); + pDD->bTransferComplete = true; + NVIC_DisableIRQ(pDD->pDevInfo->eIRQn); + + /* If a callback is registered notify the buffer processed event to the application */ + if(NULL != pDD->pfCallback ){ + pDD->pfCallback(pDD->pCBParam, pDD->HWErrors, NULL); + } + else + { + SEM_POST(pDD); + } + + } + + /* All interrupts are cleared by a write of 1 to the status register bits (W1C) */ + pDD->pSpi->STAT = nErrorStatus; + +#if defined(ADI_CYCLECOUNT_SPI_ISR_ENABLED) && (ADI_CYCLECOUNT_SPI_ISR_ENABLED == 1u) + ADI_CYCLECOUNT_STORE(ADI_CYCLECOUNT_ISR_SPI); +#endif + + + +} + + +/* Internal DMA Callback for receiving DMA faults from common DMA error handler. */ +static void RxDmaErrorCallback(void *pCBParam, uint32_t Event, void *pArg) { + + /* Recover the device handle. */ + ADI_SPI_HANDLE hDevice = (ADI_SPI_HANDLE) pCBParam; + + /* Save the DMA error. */ + switch (Event) { + case ADI_DMA_EVENT_ERR_BUS: + hDevice->HWErrors |= ADI_SPI_HW_ERROR_RX_CHAN_DMA_BUS_FAULT; + break; + case ADI_DMA_EVENT_ERR_INVALID_DESCRIPTOR: + hDevice->HWErrors |= ADI_SPI_HW_ERROR_RX_CHAN_DMA_INVALID_DESCR; + break; + default: + hDevice->HWErrors |= ADI_SPI_HW_ERROR_RX_CHAN_DMA_UNKNOWN_ERROR; + break; + } +} + + +/* Internal DMA Callback for receiving DMA faults from common DMA error handler. */ +static void TxDmaErrorCallback(void *pCBParam, uint32_t Event, void *pArg) { + + /* Recover the device handle. */ + ADI_SPI_HANDLE hDevice = (ADI_SPI_HANDLE) pArg; + + /* Save the DMA error. */ + switch (Event) { + case ADI_DMA_EVENT_ERR_BUS: + hDevice->HWErrors |= ADI_SPI_HW_ERROR_TX_CHAN_DMA_BUS_FAULT; + break; + case ADI_DMA_EVENT_ERR_INVALID_DESCRIPTOR: + hDevice->HWErrors |= ADI_SPI_HW_ERROR_TX_CHAN_DMA_INVALID_DESCR; + break; + default: + hDevice->HWErrors |= ADI_SPI_HW_ERROR_TX_CHAN_DMA_UNKNOWN_ERROR; + break; + } +} + + +/*! + * @brief SPI0 Interrupt Handler. + * + * @return void. + * + * Overrides default SPI0 interrupt handler. + */ +void SPI0_Int_Handler(void) { + ISR_PROLOG(); + common_SPI_Int_Handler(spi_device_info[0].hDevice ); + ISR_EPILOG(); +} + + +/*! + * @brief SPI1 Interrupt Handler. + * + * @return void. + * + * Overrides default SPI1 interrupt handler. + */ +void SPI1_Int_Handler(void) { + ISR_PROLOG(); + common_SPI_Int_Handler(spi_device_info[1].hDevice); + ISR_EPILOG(); +} + +/*! + * @brief SPI2 Interrupt Handler. + * + * @return void. + * + * Overrides default SPI2 interrupt handler. + */ +void SPI2_Int_Handler(void) { + ISR_PROLOG(); + common_SPI_Int_Handler(spi_device_info[2].hDevice ); + ISR_EPILOG(); +} + + +/* + ////////////////////////////////////////////////////////////////////////////// + ////////////////////////// DMA-RELATED /////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////// +*/ + + +/* + * SPI DMA interrupt handlers + */ + + +#if defined(ADI_SPI0_MASTER_MODE) && (ADI_SPI0_MASTER_MODE==1u) +void DMA_SPI0_TX_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_SPI_HANDLE pDD = spi_device_info[0].hDevice; + pDD->TxRemaining = 0u; + ISR_EPILOG(); +} + +/* Master mode DMA ISR */ +void DMA_SPI0_RX_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_SPI_HANDLE pDD = spi_device_info[0].hDevice; + pDD->RxRemaining = 0u; + /* Disable DMA */ + pDD->pSpi->DMA &= (uint16_t)~(BITM_SPI_DMA_EN | BITM_SPI_DMA_RXEN | BITM_SPI_DMA_TXEN); + /* Master mode: Now allow the XFRDONE interrupt to occur. It's the SPI ISR that really ends the transaction */ + /* The slave mode is not affected by this setting */ + pDD->pSpi->IEN |= BITM_SPI_IEN_XFRDONE; + ISR_EPILOG(); +} +#endif +#if defined(ADI_SPI0_MASTER_MODE) && (ADI_SPI0_MASTER_MODE==0u) +/* Slave mode DMA ISRs */ +void DMA_SPI0_TX_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_SPI_HANDLE pDD = spi_device_info[0].hDevice; + pDD->TxRemaining = 0u; + if( pDD->RxRemaining == 0) + { + /* If a callback is registered notify the buffer processed event to the application */ + if(NULL != pDD->pfCallback ){ + pDD->pfCallback(pDD->pCBParam, pDD->HWErrors, NULL); + } + else + { + SEM_POST(pDD); + } + } + ISR_EPILOG(); +} +void DMA_SPI0_RX_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_SPI_HANDLE pDD = spi_device_info[0].hDevice; + pDD->RxRemaining = 0u; + /* Disable DMA */ + pDD->pSpi->DMA &= (uint16_t)~(BITM_SPI_DMA_EN | BITM_SPI_DMA_RXEN | BITM_SPI_DMA_TXEN); + pDD->pSpi->IEN &= ~(BITM_SPI_IEN_XFRDONE|BITM_SPI_IEN_RXOVR|BITM_SPI_IEN_TXUNDR); + pDD->bTransferComplete = true; + NVIC_DisableIRQ(pDD->pDevInfo->eIRQn); + + /* If a callback is registered notify the buffer processed event to the application */ + if(NULL != pDD->pfCallback ){ + pDD->pfCallback(pDD->pCBParam, pDD->HWErrors, NULL); + } + else + { + SEM_POST(pDD); + } + ISR_EPILOG(); +} +#endif + + + + +#if defined(ADI_SPI1_MASTER_MODE) && (ADI_SPI1_MASTER_MODE==1u) +/* Master mode DMA ISR */ +void DMA_SPI1_TX_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_SPI_HANDLE pDD = spi_device_info[1].hDevice; + pDD->TxRemaining = 0u; + ISR_EPILOG(); +} + +void DMA_SPI1_RX_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_SPI_HANDLE pDD = spi_device_info[1].hDevice; + pDD->RxRemaining = 0u; + /* Disable DMA */ + pDD->pSpi->DMA &= (uint16_t)~(BITM_SPI_DMA_EN | BITM_SPI_DMA_RXEN | BITM_SPI_DMA_TXEN); + /* Master mode: Now allow the XFRDONE interrupt to occur. It's the SPI ISR that really ends the transaction */ + /* The slave mode is not affected by this setting */ + pDD->pSpi->IEN |= BITM_SPI_IEN_XFRDONE; + ISR_EPILOG(); +} +#endif + + +#if defined(ADI_SPI1_MASTER_MODE) && (ADI_SPI1_MASTER_MODE==0u) +/* Slave mode DMA ISRs */ +void DMA_SPI1_TX_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_SPI_HANDLE pDD = spi_device_info[1].hDevice; + pDD->TxRemaining = 0u; + if( pDD->RxRemaining == 0) + { + /* If a callback is registered notify the buffer processed event to the application */ + if(NULL != pDD->pfCallback ){ + pDD->pfCallback(pDD->pCBParam, pDD->HWErrors, NULL); + } + else + { + SEM_POST(pDD); + } + } + ISR_EPILOG(); +} + + +void DMA_SPI1_RX_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_SPI_HANDLE pDD = spi_device_info[1].hDevice; + pDD->RxRemaining = 0u; + /* Disable DMA */ + pDD->pSpi->DMA &= (uint16_t)~(BITM_SPI_DMA_EN | BITM_SPI_DMA_RXEN | BITM_SPI_DMA_TXEN); + pDD->pSpi->IEN &= ~(BITM_SPI_IEN_XFRDONE|BITM_SPI_IEN_RXOVR|BITM_SPI_IEN_TXUNDR); + pDD->bTransferComplete = true; + NVIC_DisableIRQ(pDD->pDevInfo->eIRQn); + + /* If a callback is registered notify the buffer processed event to the application */ + if(NULL != pDD->pfCallback ){ + pDD->pfCallback(pDD->pCBParam, pDD->HWErrors, NULL); + } + else + { + SEM_POST(pDD); + } + ISR_EPILOG(); +} +#endif + + +#if defined(ADI_SPI2_MASTER_MODE) && (ADI_SPI2_MASTER_MODE==1u) +/* Master mode DMA ISR */ + +void DMA_SPIH_TX_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_SPI_HANDLE pDD = spi_device_info[2].hDevice; + pDD->TxRemaining = 0u; + ISR_EPILOG(); +} + +void DMA_SPIH_RX_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_SPI_HANDLE pDD = spi_device_info[2].hDevice; + pDD->RxRemaining = 0u; + /* Disable DMA */ + pDD->pSpi->DMA &= (uint16_t)~(BITM_SPI_DMA_EN | BITM_SPI_DMA_RXEN | BITM_SPI_DMA_TXEN); + /* Master mode: Now allow the XFRDONE interrupt to occur. It's the SPI ISR that really ends the transaction */ + /* The slave mode is not affected by this setting */ + pDD->pSpi->IEN |= BITM_SPI_IEN_XFRDONE; + ISR_EPILOG(); +} +#endif +#if defined(ADI_SPI2_MASTER_MODE) && (ADI_SPI2_MASTER_MODE==0u) +/* Master mode DMA ISRs */ + +void DMA_SPIH_TX_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_SPI_HANDLE pDD = spi_device_info[2].hDevice; + pDD->TxRemaining = 0u; + ISR_EPILOG(); + if( pDD->RxRemaining == 0) + { + /* If a callback is registered notify the buffer processed event to the application */ + if(NULL != pDD->pfCallback ){ + pDD->pfCallback(pDD->pCBParam, pDD->HWErrors, NULL); + } + else + { + SEM_POST(pDD); + } + } + ISR_EPILOG(); +} + +void DMA_SPIH_RX_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_SPI_HANDLE pDD = spi_device_info[2].hDevice; + pDD->RxRemaining = 0u; + /* Disable DMA */ + pDD->pSpi->DMA &= (uint16_t)~(BITM_SPI_DMA_EN | BITM_SPI_DMA_RXEN | BITM_SPI_DMA_TXEN); + pDD->pSpi->IEN &= ~(BITM_SPI_IEN_XFRDONE|BITM_SPI_IEN_RXOVR|BITM_SPI_IEN_TXUNDR); + pDD->bTransferComplete = true; + NVIC_DisableIRQ(pDD->pDevInfo->eIRQn); + + /* If a callback is registered notify the buffer processed event to the application */ + if(NULL != pDD->pfCallback ){ + pDD->pfCallback(pDD->pCBParam, pDD->HWErrors, NULL); + } + else + { + SEM_POST(pDD); + } + ISR_EPILOG(); +} +#endif + + + + +/*! \endcond */ + + +/* @} */ + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/spi/adi_spi_data.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/spi/adi_spi_data.c new file mode 100755 index 0000000000..9d8f001a37 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/spi/adi_spi_data.c @@ -0,0 +1,162 @@ +/* + ***************************************************************************** + * @file: adi_spi_data.c + * @brief: Data declaration for SPORT Device Driver + ***************************************************************************** + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifndef _ADI_SPI_DATA_C_ +#define _ADI_SPI_DATA_C_ + + /*! \cond PRIVATE */ + +#include "adi_spi_def.h" +#include "adi_spi_config.h" +#include + +/* Stores the information about the specific device */ +static ADI_SPI_DEVICE_INFO spi_device_info [ADI_SPI_NUM_INSTANCES]= +{ + { + DMA0_CH4_DONE_IRQn, + SPI0_TX_CHANn, + DMA0_CH5_DONE_IRQn, + SPI0_RX_CHANn, + (volatile ADI_SPI_TypeDef *)pADI_SPI0, + SPI0_EVT_IRQn, + NULL + }, + { + DMA0_CH6_DONE_IRQn, + SPI1_TX_CHANn, + DMA0_CH7_DONE_IRQn, + SPI1_RX_CHANn, + (volatile ADI_SPI_TypeDef *)pADI_SPI1, + SPI1_EVT_IRQn, + NULL + }, + + { + DMA0_CH0_DONE_IRQn, + SPI2_TX_CHANn, + DMA0_CH1_DONE_IRQn, + SPI2_RX_CHANn, + (volatile ADI_SPI_TypeDef *)pADI_SPI2, + SPI2_EVT_IRQn, + NULL + } +}; + +/* SPI Application configuration array */ +static const ADI_SPI_CFG_TYPE gSPICfg[ADI_SPI_NUM_INSTANCES] = +{ + /* Initialize SPI0 Instance configuration. */ + { + /**** SPI_CFG register configuration *** */ + (( ADI_SPI0_CFG_ENABLE << BITP_SPI_CTL_SPIEN ) | + ( ADI_SPI0_CFG_CLK_PHASE << BITP_SPI_CTL_CPHA ) | + ( ADI_SPI0_CFG_CLK_POLARITY << BITP_SPI_CTL_CPOL ) | + ( ADI_SPI0_CFG_WIRED_OR << BITP_SPI_CTL_WOM ) | + ( ADI_SPI0_CFG_LSB_MSB << BITP_SPI_CTL_LSB ) | + ( ADI_SPI0_CFG_TRANSFER_INITIATE << BITP_SPI_CTL_TIM ) | + ( ADI_SPI0_CFG_TX_UNDERFLOW << BITP_SPI_CTL_ZEN ) | + ( ADI_SPI0_CFG_RX_OVERFLOW << BITP_SPI_CTL_RXOF ) | + ( ADI_SPI0_CFG_MISO_ENABLE << BITP_SPI_CTL_OEN ) | + ( ADI_SPI0_CFG_LOOPBACK << BITP_SPI_CTL_LOOPBACK ) | + ( ADI_SPI0_CFG_CONTINUOUS << BITP_SPI_CTL_CON ) | + ( ADI_SPI0_CFG_RX_FLUSH << BITP_SPI_CTL_RFLUSH ) | + ( ADI_SPI0_CFG_TX_FLUSH << BITP_SPI_CTL_TFLUSH ) | + ( ADI_SPI0_CFG_CSERR_RESET << BITP_SPI_CTL_CSRST )), + + /**** SPI_DIV buad rate selection register *** */ + (((((ADI_CFG_SYSTEM_CLOCK_HZ / (ADI_SPI0_CFG_BIT_RATE)) >>1u)-1u))\ + << BITP_SPI_DIV_VALUE ) + }, + /* Initialize SPI1 Instance configuration. */ + { + /**** SPI_CFG register configuration *** */ + (( ADI_SPI1_CFG_ENABLE << BITP_SPI_CTL_SPIEN ) | + ( ADI_SPI1_CFG_CLK_PHASE << BITP_SPI_CTL_CPHA ) | + ( ADI_SPI1_CFG_CLK_POLARITY << BITP_SPI_CTL_CPOL ) | + ( ADI_SPI1_CFG_WIRED_OR << BITP_SPI_CTL_WOM ) | + ( ADI_SPI1_CFG_LSB_MSB << BITP_SPI_CTL_LSB ) | + ( ADI_SPI1_CFG_TRANSFER_INITIATE << BITP_SPI_CTL_TIM ) | + ( ADI_SPI1_CFG_TX_UNDERFLOW << BITP_SPI_CTL_ZEN ) | + ( ADI_SPI1_CFG_RX_OVERFLOW << BITP_SPI_CTL_RXOF ) | + ( ADI_SPI1_CFG_MISO_ENABLE << BITP_SPI_CTL_OEN ) | + ( ADI_SPI1_CFG_LOOPBACK << BITP_SPI_CTL_LOOPBACK ) | + ( ADI_SPI1_CFG_CONTINUOUS << BITP_SPI_CTL_CON ) | + ( ADI_SPI1_CFG_RX_FLUSH << BITP_SPI_CTL_RFLUSH ) | + ( ADI_SPI1_CFG_TX_FLUSH << BITP_SPI_CTL_TFLUSH ) | + ( ADI_SPI1_CFG_CSERR_RESET << BITP_SPI_CTL_CSRST )), + + /**** SPI_DIV buad rate selection register *** */ + (((((ADI_CFG_SYSTEM_CLOCK_HZ / (ADI_SPI1_CFG_BIT_RATE)) >>1u)-1u))\ + << BITP_SPI_DIV_VALUE ) + }, + /* Initialize SPI2 Instance configuration. */ + { + /**** SPI_CFG register configuration *** */ + (( ADI_SPI2_CFG_ENABLE << BITP_SPI_CTL_SPIEN ) | + ( ADI_SPI2_CFG_CLK_PHASE << BITP_SPI_CTL_CPHA ) | + ( ADI_SPI2_CFG_CLK_POLARITY << BITP_SPI_CTL_CPOL ) | + ( ADI_SPI2_CFG_WIRED_OR << BITP_SPI_CTL_WOM ) | + ( ADI_SPI2_CFG_LSB_MSB << BITP_SPI_CTL_LSB ) | + ( ADI_SPI2_CFG_TRANSFER_INITIATE << BITP_SPI_CTL_TIM ) | + ( ADI_SPI2_CFG_TX_UNDERFLOW << BITP_SPI_CTL_ZEN ) | + ( ADI_SPI2_CFG_RX_OVERFLOW << BITP_SPI_CTL_RXOF ) | + ( ADI_SPI2_CFG_MISO_ENABLE << BITP_SPI_CTL_OEN ) | + ( ADI_SPI2_CFG_LOOPBACK << BITP_SPI_CTL_LOOPBACK ) | + ( ADI_SPI2_CFG_CONTINUOUS << BITP_SPI_CTL_CON ) | + ( ADI_SPI2_CFG_RX_FLUSH << BITP_SPI_CTL_RFLUSH ) | + ( ADI_SPI2_CFG_TX_FLUSH << BITP_SPI_CTL_TFLUSH ) | + ( ADI_SPI2_CFG_CSERR_RESET << BITP_SPI_CTL_CSRST )), + + /**** SPI_DIV buad rate selection register *** */ + (((((ADI_CFG_SYSTEM_CLOCK_HZ / (ADI_SPI2_CFG_BIT_RATE)) >>1u)-1u))\ + << BITP_SPI_DIV_VALUE ) + } +}; + +/*! \endcond */ + +#endif /* _ADI_SPI_DATA_C_ */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/spi/adi_spi_def.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/spi/adi_spi_def.h new file mode 100755 index 0000000000..8cbbf1b8d7 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/spi/adi_spi_def.h @@ -0,0 +1,148 @@ +/*! + ***************************************************************************** + * @file: adi_spi_def.h + * @brief: SPI Device Driver definition + ***************************************************************************** +Copyright (c) 2010-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ +#ifndef ADI_SPI_DEF_H_ +#define ADI_SPI_DEF_H_ + + + +#include + +#define ADI_SPI_NUM_INSTANCES (3u) +#define ADI_SPI_FIFO_SIZE (8u) + + + /*! \cond PRIVATE */ + +/* + ***************************************************************************** + * SPI Bitrate Initializer. Sets a default serial clockrate for the SPI channel. + *****************************************************************************/ +/* #define ADI_SPI_BITRATE_INITIALIZER 4000000 // 4MHz default bitrate */ +#define ADI_SPI_BITRATE_INITIALIZER 250000u /* depends on processor */ + +/* + ***************************************************************************** + * SPI0/SPI1 Control Register Initializer. This macro configures default + * settings for the SPI configuration control register when operated in Master-mode. + *****************************************************************************/ +/* SPI master DMA mode control configuration */ +#define ADI_SPI_MASTERCON_INITIALIZER BITM_SPI_CTL_MASEN + +/* + ***************************************************************************** + * SPI0/SPI1 Control Register Initializer. This macro configures default + * settings for the SPI configuration control register when operated in Slave-mode. + *****************************************************************************/ + #define ADI_SPI_SLAVECON_INITIALIZER BITM_SPI_CTL_OEN \ + | BITM_SPI_CTL_ZEN \ + | BITM_SPI_CTL_SPIEN + +/* 16-bit DMA... (two-byte size and increment) */ +#define ADI_DMA_DATA_WIDTH ADI_DMA_WIDTH_2_BYTE /*!< DMA data attribute */ +#define ADI_DMA_DATA_INCREMENT ADI_DMA_INCR_HALFWORD /*!< DMA data attribute */ + + + +/*! + ***************************************************************************** + * SPI Configuration structure. + *****************************************************************************/ +typedef struct ADI_SPI_CONFIG +{ + uint16_t SPI_CTL; /*!< SPI_CTL register configuration. */ + uint16_t SPI_DIV; /*!< SPI_DIV register. */ +} ADI_SPI_CFG_TYPE; + +/*! SPI device information */ + +typedef struct __ADI_SPI_DEVICE_INFO +{ + const uint16_t dmaTxIrqNumber; /* DMA channel ID-Tx */ + const uint16_t dmaTxChannelNumber; /* Tx */ + const uint16_t dmaRxIrqNumber; /* DMA channel ID-Rx */ + const uint16_t dmaRxChannelNumber; /* DMA channel ID-Rx */ + volatile ADI_SPI_TypeDef *pSpiRegs; /* Base address of the SPI registers */ + const IRQn_Type eIRQn; /* IRQn */ + ADI_SPI_HANDLE hDevice; /* SPI handle */ +}ADI_SPI_DEVICE_INFO; + + +/*! \struct ADI_SPI_DEV_DATA_TYPE SPI Device instance data structure */ +typedef struct __ADI_SPI_DEV_DATA_TYPE +{ + + /* device attributes */ + volatile ADI_SPI_TypeDef *pSpi; /*!< track MMR device pointer */ + ADI_SPI_DEVICE_INFO *pDevInfo; + + /* Callback and Callback parameters */ + ADI_CALLBACK pfCallback; /*!< Callback address */ + void * pCBParam; /*!< Callback parameter */ + /* The last recorded SPI event */ + uint32_t HWErrors; /*!< HW transaction status */ + + uint8_t* pTxBuffer; /*!< Transmit Buffer */ + uint8_t* pRxBuffer; /*!< Receive Buffer */ + uint16_t TxRemaining; /*!< Transmit Count */ + uint16_t RxRemaining; /*!< Receive Count */ + uint8_t TxIncrement; /*!< Transmit Increment */ + uint8_t RxIncrement; /*!< Receive Increment */ + + volatile bool bTransferComplete; /*!< Transfer Complete Flag */ + + bool bDmaMode; /*!< DMA mode flag */ + bool bRdCtlMode; /* Use half duplex read control feature */ + bool bBlockingMode; /*!< blocking mode flag */ + ADI_SPI_CHIP_SELECT ChipSelect; /*!< track chip select */ + + SEM_VAR_DECLR +} ADI_SPI_DEV_DATA_TYPE; + + + +/*! \endcond */ + +#endif /* ADI_SPI_DEF_H__ */ + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sport/adi_sport.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sport/adi_sport.c new file mode 100755 index 0000000000..5c352c2bc5 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sport/adi_sport.c @@ -0,0 +1,1771 @@ +/*! **************************************************************************** + * @file: adi_sport.c + * @brief: SPORT (Serial Port) device driver source file. + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*******************************************************************************/ + +/** @addtogroup SPORT_Driver SPORT Driver + * @{ + */ + +/*! \cond PRIVATE */ + +/*============= I N C L U D E S =============*/ + +#include +#include /* memset declaration */ + +#include +#include +#include +#include +#include "adi_sport_def.h" + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm123 (rule 8.5): there shall be no definition of objects or functions in a header file +* This isn't a header as such. +* +* Pm073 (rule 14.7): a function should have a single point of exit +* Pm143 (rule 14.7): a function should have a single point of exit at the end of the function +* Multiple returns are used for error handling. +* +* Pm050 (rule 14.2): a null statement shall only occur on a line by itself +* Needed for null expansion of ADI_INSTALL_HANDLER and others. +* +* Pm088 (rule 17.4): pointer arithmetic should not be used. +* Relying on pointer arithmetic for buffer handling. +* +* Pm140 (rule 11.3): a cast should not be performed between a pointer type and an integral type +* The rule makes an exception for memory-mapped register accesses. +* +* Pm152: (MISRA C 2004 rule 17.4) array indexing shall only be applied to objects defined as an array type +* Accessing the DMA descriptors, which are defined in the system as a pointer to an array of descriptors + +*/ +#pragma diag_suppress=Pm026,Pm050,Pm073,Pm088,Pm123,Pm140,Pm143,Pm152,Pm153 +#endif /* __ICCARM__ */ + +/*============== D A T A ===============*/ + +#define SPORT0_A_REGS ((volatile ADI_SPORT_TypeDef*)REG_SPORT0_CTL_A) +#define SPORT0_B_REGS ((volatile ADI_SPORT_TypeDef*)REG_SPORT0_CTL_B) + +#define SPORT0_A_CFG { 0u, 0u, 0u, 0u, 0u } +#define SPORT0_B_CFG { 0u, 0u, 0u, 0u, 0u } + +#define DXS_FIFO_IS_FULL(STAT) (((STAT) & BITM_SPORT_STAT_A_DXS) == BITM_SPORT_STAT_A_DXS) +#define DXS_FIFO_IS_EMPTY(STAT) (((STAT) & BITM_SPORT_STAT_A_DXS) == 0u) + +static ADI_SPORT_DEVICE_INFO gSportDevInfo [ADI_SPORT_NUM_INSTANCES][ADI_SPORT_NUM_CHANNELS] = +{ + {/* registers configuration initial state DMA channel DMA IRQ SPORT IRQ handle */ + {SPORT0_A_REGS, SPORT0_A_CFG, ADI_SPORT_STATE_UNINITIALIZED, SPORT0A_CHANn, DMA0_CH2_DONE_IRQn, SPORT_A_EVT_IRQn, NULL}, + {SPORT0_B_REGS, SPORT0_B_CFG, ADI_SPORT_STATE_UNINITIALIZED, SPORT0B_CHANn, DMA0_CH3_DONE_IRQn, SPORT_B_EVT_IRQn, NULL}, + }, +}; + + +static const ADI_SPORT_CONFIG gSportCfg[ADI_SPORT_NUM_INSTANCES][ADI_SPORT_NUM_CHANNELS] = +{ + { /* configuration for SPORT 0 */ + /* Configuration for half-SPORT A */ + { /* SPORT_CTL register */ + ((ADI_CFG_SPORT0A_ENABLE_FSMUXSEL) << BITP_SPORT_CTL_A_FSMUXSEL) | + ((ADI_CFG_SPORT0A_ENABLE_CKMUXSEL) << BITP_SPORT_CTL_A_CKMUXSEL) | + ((ADI_CFG_SPORT0A_LSB_FIRST) << BITP_SPORT_CTL_A_LSBF) | + ((ADI_CFG_SPORT0A_SERIAL_WLEN - 1u) << BITP_SPORT_CTL_A_SLEN) | + ((ADI_CFG_SPORT0A_INTERNAL_CLK) << BITP_SPORT_CTL_A_ICLK) | + ((ADI_CFG_SPORT0A_OPERATION_MODE) << BITP_SPORT_CTL_A_OPMODE) | + ((ADI_CFG_SPORT0A_CLOCK_EDGE) << BITP_SPORT_CTL_A_CKRE) | + ((ADI_CFG_SPORT0A_FS_REQUIRED) << BITP_SPORT_CTL_A_FSR) | + ((ADI_CFG_SPORT0A_INTERNAL_FS) << BITP_SPORT_CTL_A_IFS) | + ((ADI_CFG_SPORT0A_DATA_INDEPENDENT_FS) << BITP_SPORT_CTL_A_DIFS) | + ((ADI_CFG_SPORT0A_ACTIVE_LOW_FS) << BITP_SPORT_CTL_A_LFS) | + ((ADI_CFG_SPORT0A_LATE_FS) << BITP_SPORT_CTL_A_LAFS) | + ((ADI_CFG_SPORT0A_ENABLE_PACKING) << BITP_SPORT_CTL_A_PACK) | + ((ADI_CFG_SPORT0A_FS_ERROR_OPERATION) << BITP_SPORT_CTL_A_FSERRMODE) | + ((ADI_CFG_SPORT0A_GATED_CLOCK) << BITP_SPORT_CTL_A_GCLKEN), + + /* SPORT_DIV register */ + ((ADI_CFG_SPORT0A_CLOCK_DIVISOR) << BITP_SPORT_DIV_A_CLKDIV) | + ((ADI_CFG_SPORT0A_FS_DIVISOR) << BITP_SPORT_DIV_A_FSDIV), + + /* SPORT_CONVT register */ + ((ADI_CFG_SPORT0A_CONVT_WIDTH) << BITP_SPORT_CNVT_A_WID) | + ((ADI_CFG_SPORT0A_CONVT_POLARITY) << BITP_SPORT_CNVT_A_POL) | + ((ADI_CFG_SPORT0A_CONVT_FS_DURATION) << BITP_SPORT_CNVT_A_CNVT2FS), + + /* Default DMA data size for SPORT */ + ADI_DMA_WIDTH_4_BYTE, + + /* Default DMA data increment for SPORT */ + ADI_DMA_INCR_4_BYTE + }, + + /* Configuration for half-SPORT B */ + { /* SPORT_CTL register */ + ((ADI_CFG_SPORT0B_LSB_FIRST) << BITP_SPORT_CTL_B_LSBF) | + ((ADI_CFG_SPORT0B_SERIAL_WLEN - 1u) << BITP_SPORT_CTL_B_SLEN) | + ((ADI_CFG_SPORT0B_INTERNAL_CLK) << BITP_SPORT_CTL_B_ICLK) | + ((ADI_CFG_SPORT0B_OPERATION_MODE) << BITP_SPORT_CTL_B_OPMODE) | + ((ADI_CFG_SPORT0B_CLOCK_EDGE) << BITP_SPORT_CTL_B_CKRE) | + ((ADI_CFG_SPORT0B_FS_REQUIRED) << BITP_SPORT_CTL_B_FSR) | + ((ADI_CFG_SPORT0B_INTERNAL_FS) << BITP_SPORT_CTL_B_IFS) | + ((ADI_CFG_SPORT0B_DATA_INDEPENDENT_FS) << BITP_SPORT_CTL_B_DIFS) | + ((ADI_CFG_SPORT0B_ACTIVE_LOW_FS) << BITP_SPORT_CTL_B_LFS) | + ((ADI_CFG_SPORT0B_LATE_FS) << BITP_SPORT_CTL_B_LAFS) | + ((ADI_CFG_SPORT0B_ENABLE_PACKING) << BITP_SPORT_CTL_B_PACK) | + ((ADI_CFG_SPORT0B_FS_ERROR_OPERATION) << BITP_SPORT_CTL_B_FSERRMODE) | + ((ADI_CFG_SPORT0B_GATED_CLOCK) << BITP_SPORT_CTL_B_GCLKEN), + + /* SPORT_DIV register */ + ((ADI_CFG_SPORT0B_CLOCK_DIVISOR) << BITP_SPORT_DIV_B_CLKDIV) | + ((ADI_CFG_SPORT0B_FS_DIVISOR) << BITP_SPORT_DIV_B_FSDIV), + + /* SPORT_CONVT register */ + ((ADI_CFG_SPORT0B_CONVT_WIDTH) << BITP_SPORT_CNVT_B_WID) | + ((ADI_CFG_SPORT0B_CONVT_POLARITY) << BITP_SPORT_CNVT_B_POL) | + ((ADI_CFG_SPORT0B_CONVT_FS_DURATION) << BITP_SPORT_CNVT_B_CNVT2FS), + + /* Default DMA data size for SPORT */ + ADI_DMA_WIDTH_4_BYTE, + + /* Default DMA data increment for SPORT */ + ADI_DMA_INCR_4_BYTE + } + } +}; + +/*! \endcond */ + +/*============= C O D E =============*/ + +extern void SPORT0A_Int_Handler(void); /*!< Interrupt handler for the SPORT0-A */ +extern void SPORT0B_Int_Handler(void); /*!< Interrupt handler for the SPORT0-B */ +extern void DMA_SPORT0A_Int_Handler(void); /*!< DMA handler for the SPORT0-A */ +extern void DMA_SPORT0B_Int_Handler(void); /*!< DMA handler for the SPORT0-B */ + +/*============= L O C A L F U N C T I O N S =============*/ + +/*============= P U B L I C F U N C T I O N S =============*/ + +/** + * @brief Initialization function for SPORT device. + * @details Initialization function for SPORT device. This function must be + * called before operating any SPORT device. + * + * @param [in] nDevNum SPORT Device instance to be opened. + * @param [in] eChannel Channel ID of the SPORT device (A or B) + * @param [in] eDirection Direction of the SPORT operation (i.e Rx or Tx) + * @param [in] pMemory Pointer to a 32 bit aligned buffer containing + * ADI_SPORT_MEMORY_SIZE bytes. This buffer is + * required by the SPORT driver for its operations. + * The "ADI_SPORT_MEMORY_SIZE" varies based on the + * configuration. + * @param [in] nMemSize Size of the buffer to which "pMemory" points. + * @param [out] phDevice Pointer to a location where a handle to the + * opened SPORT driver can be stored. This handle + * will be used to identity a SPORT device when + * calling SPORT management functions. + * + * @return Status + * - #ADI_SPORT_SUCCESS Successful device initialization. + * - #ADI_SPORT_DEVICE_IN_USE Device already initialized. + * - #ADI_SPORT_FAILED Failed initialize a semaphore for managing device. + * - #ADI_SPORT_INVALID_DEVICE_NUM Invalid SPORT device identifier + * - #ADI_SPORT_INVALID_NULL_POINTER Invalid pointer (callback function or device handle). + * + * @sa adi_sport_Close() + */ +ADI_SPORT_RESULT adi_sport_Open( + const uint32_t nDevNum, + const ADI_SPORT_CHANNEL eChannel, + const ADI_SPORT_DIRECTION eDirection, + void *pMemory, + const uint32_t nMemSize, + ADI_SPORT_HANDLE * const phDevice + ) +{ + ADI_SPORT_RESULT result = ADI_SPORT_SUCCESS; + + assert(ADI_SPORT_MEMORY_SIZE == sizeof(ADI_SPORT_DEVICE)); /* validate the memory size macro */ +#ifdef ADI_DEBUG + if (nDevNum >= ADI_SPORT_NUM_INSTANCES) + { + result = ADI_SPORT_INVALID_DEVICE_NUM; /* SPORT identifier must be within [0..ADI_SPORT_NUM_INSTANCES-1] */ + } + else if (phDevice == NULL) + { + result = ADI_SPORT_INVALID_NULL_POINTER; /* the pointer to device handle must be valid */ + } + else if (ADI_SPORT_MEMORY_SIZE != nMemSize) + { + result = ADI_SPORT_FAILED; + } + else if (ADI_SPORT_STATE_UNINITIALIZED != gSportDevInfo[nDevNum][eChannel].eState) + { + result = ADI_SPORT_DEVICE_IN_USE; /* the device instance must not be in use */ + } + else +#endif /* ADI_DEBUG */ + { + ADI_SPORT_DEVICE * pDevice = pMemory; /* Pointer to the SPORT device instance (from supplied memory) */ + ADI_SPORT_DEVICE_INFO * sportInfo = &gSportDevInfo[nDevNum][eChannel]; /* SPORT info for HSPORT A or HSPORT B */ + ADI_SPORT_CONFIG const * sportCfg = &gSportCfg[nDevNum][eChannel]; /* SPORT configuration for HSPORT A or HSPORT B */ + + assert(eChannel < ADI_SPORT_NUM_CHANNELS); + + memset(pMemory, 0, nMemSize); /* clear the device instance data before initializing it */ + + pDevice->pSportInfo = sportInfo; /* Initialize the pointer which provides the device information (HSPORT A or HSPORT B). */ + pDevice->eDirection = eDirection; /* Initialize the direction (BEFORE calling sport_Configure)*/ + pDevice->nHwError = (uint32_t) ADI_SPORT_HW_NO_ERR; + + adi_dma_Init(); /* Set up the DMA Controller. */ + sport_Init(pDevice); /* Initialize the data transmission buffers */ + sport_Configure(pDevice,sportCfg); /* Configure the SPORT */ + + if (ADI_DMA_SUCCESS != adi_dma_RegisterCallback(sportInfo->eDMAChnlID, sport_DmaErrorCallback, pDevice)) + { + adi_sport_Close(pDevice); + result = ADI_SPORT_DMA_REGISTER_FAILED; + } + + if (ADI_SPORT_SUCCESS == result) + { + ADI_SPORT_DEVICE_INFO * devInfo = &gSportDevInfo[nDevNum][eChannel]; + + /* Create a "semaphore" (varies per OS) used for blocking buffer resource management. */ + if (ADI_HALF_SPORT_A == eChannel) + { + SEM_CREATE(&pDevice->sportChannel, "SPORT0_A_SEM", ADI_SPORT_FAILED); + }else{ + SEM_CREATE(&pDevice->sportChannel, "SPORT0_B_SEM", ADI_SPORT_FAILED); + } + + /* Change the state of the specified device */ + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + devInfo->eState = ADI_SPORT_STATE_INITIALIZED; + devInfo->hDevice = pDevice; + ADI_EXIT_CRITICAL_REGION(); + *phDevice = pDevice; /* Return the device handle to the application */ + } + } + + return result; +} + +/** + * @brief Closes the operation of specified SPORT device. + * + * @details Closes the operation of specified SPORT device. + * Device need to be opened again for any further use. + * + * @param [in] hDevice SPORT device handle whose operation is to be closed. + * This handle was obtained when a SPORT device is opened + * successfully. + * + * @return Status + * + * - #ADI_SPORT_SUCCESS Successfully closed the specified device. + * - #ADI_SPORT_INVALID_HANDLE [D] Invalid SPORT device handle. + * - #ADI_SPORT_FAILED [D] SPORT device internal error. + * + * @note It is user's responsibility to free/reuse the memory supplied + * during the opening of the device. + * + * @sa adi_sport_Open() + */ +ADI_SPORT_RESULT adi_sport_Close(ADI_SPORT_HANDLE const hDevice) +{ + ADI_SPORT_RESULT result = ADI_SPORT_SUCCESS; /* return code */ + ADI_SPORT_DEVICE * pDevice = (ADI_SPORT_DEVICE *) hDevice; /* Pointer to SPORT device instance */ +#ifdef ADI_DEBUG + if (ADI_SPORT_SUCCESS == (result=ValidateHandle(pDevice))) /* Validate the given handle */ +#endif /* ADI_DEBUG */ + { + ADI_SPORT_DEVICE_INFO * pSportInfo = pDevice->pSportInfo; + + /* Free up the device */ + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + NVIC_DisableIRQ(pSportInfo->eIRQn); /* Disable SPORT event interrupts. */ + NVIC_DisableIRQ(pSportInfo->eDMAn); /* Disable DMA SPORT interrupts. */ + pSportInfo->eState = ADI_SPORT_STATE_UNINITIALIZED; + pSportInfo->hDevice = NULL; /* Free up the device memory. */ + ADI_EXIT_CRITICAL_REGION(); + + SEM_DELETE(&pDevice->sportChannel, ADI_SPORT_FAILED); /* Delete SPORT channel semaphore. */ + + adi_dma_RegisterCallback(pSportInfo->eDMAChnlID, NULL, NULL); /* unregister the callback function in the DMA error handler */ + + pSportInfo->pSportRegs->CTL_A = 0u; + } + return result; +} + +/** + * @brief Submit the buffer for transmitting/receiving the data. This function can + * be used to submit the buffers for both transmitting and receiving. It will + * be returned after successfully submitting the buffer for transmitting data. + * User will be notified if a call back function is registered with an event code + * #ADI_SPORT_EVENT_RX_BUFFER_PROCESSED or #ADI_SPORT_EVENT_TX_BUFFER_PROCESSED" + * depending on the direction in which device is operating. + * + * @param [in] hDevice Device handle to SPORT device is obtained when a SPORT device is opened + * successfully. + * + * @param [in] pBuffer Pointer to buffer from where data need to be transmitted OR to which + * received data need to to be written. + * + * @param [in] nNumBytes Size in bytes of the data to be transmitted/received. + * @param [in] bDMA True if the buffer must be processed through DMA-driven SPORT operations. + * + * @return Status + * + * - #ADI_SPORT_SUCCESS Buffer successfully submitted to the specified SPORT. + * - #ADI_SPORT_INVALID_HANDLE Invalid SPORT device handle. + * - #ADI_SPORT_INVALID_PARAMETER Number of bytes is too large for a SPORT transfer or the buffer is mis-aligned + * - #ADI_SPORT_BUFFERS_NOT_SUBMITTED All the SPORT buffers are already being used + * + * @sa adi_sport_GetBuffer() + * + */ +ADI_SPORT_RESULT adi_sport_SubmitBuffer(ADI_SPORT_HANDLE const hDevice, + void * const pBuffer, + uint32_t const nNumBytes, + bool const bDMA + ) +{ + ADI_SPORT_DEVICE * pDevice = (ADI_SPORT_DEVICE *) hDevice; /* pointer to SPORT device instance */ + ADI_SPORT_RESULT result = ADI_SPORT_SUCCESS; /* return code */ + +#ifdef ADI_DEBUG + ADI_SPORT_CONFIG * pSportCfg = &pDevice->pSportInfo->sportCfg; /* short cut to SPORT configuration */ + + if(ADI_SPORT_SUCCESS != (result=ValidateHandle(hDevice))) /* validate the given handle */ + { + } + else if ( ((2u >= nNumBytes) && ((pDevice->pSportInfo->pSportRegs->CTL_A & BITM_SPORT_CTL_A_OPMODE) != 0u)) + || (0u != (nNumBytes & ~(BITM_SPORT_NUMTRAN_A_VALUE))) /* buffer size limited by SPORT transmission capabilities */ + ) + { + result = ADI_SPORT_INVALID_PARAMETER; + } + else +#endif /* ADI_DEBUG */ + /* Check that there is a free buffer to use for this transmit operation. pFreeBuffer + is the next buffer available, so if it is in use we can make the assumption that + there are no buffers available. The start address is set to NULL once the buffer + has finished being processed in "adi_sport_GetBuffer()". + */ + if (NULL != pDevice->sportChannel.pFreeBuffer->pStartAddress) + { + result = ADI_SPORT_BUFFERS_NOT_SUBMITTED; + } + else + { +#ifdef ADI_DEBUG + const uint32_t addr = (uint32_t) pBuffer; + + if (true == bDMA) + { + /** + * Using SPORT configuration data, let's define information such as data + * size in bytes, data number, number of data and bytes in the DMA transfer + * being prepared, last byte position for the DMA transfer + * + * It's important to keep in mind that for buffer that contain too many data + * multiple DMA transfers are needed: it's up to the application to split the + * DMA requests in requests which have an appropriate number of data. + */ + const uint32_t dataSizeInBytes = GetBytesPerSportData(pSportCfg->CTL); + const uint32_t full = nNumBytes / dataSizeInBytes; /* number of full data to transmit/receive */ + const uint32_t partial = nNumBytes % dataSizeInBytes; /* number of partial data to transmit/receive */ + const uint32_t misaligned = addr % dataSizeInBytes; /* number of data to transmit/receive */ + + if ( (full > DMA_TRANSFER_LIMIT) /* number of data to process too large for DMA */ + || (0u != partial) /* buffer size not a multiple of dataSizeInBytes */ + || (0u != misaligned) /* buffer mis-aligned */ + ) + { + result = ADI_SPORT_INVALID_PARAMETER; + } + } else { + const uint32_t misAligned = addr % 4u; + const uint32_t invalidNum = nNumBytes % 4u; + + if ( (0u != misAligned) /* mis-aligned buffer */ + || (0u != invalidNum) /* number of bytes not a multiple of 32-bit */ + ) + { + result = ADI_SPORT_INVALID_PARAMETER; /* reject the buffer submission */ + } + } + if (ADI_SPORT_SUCCESS == result) +#endif /* ADI_DEBUG */ + { + ADI_DT_CHANNEL * pSportChnl = &pDevice->sportChannel; + + pSportChnl->pFreeBuffer->pStartAddress = pBuffer; /* Set the start address of the data buffer */ + pSportChnl->pFreeBuffer->nCount = nNumBytes; /* Set the buffer size */ + pSportChnl->pFreeBuffer->nIndex = 0u; /* Initialize the buffer index to zero (1st data in buffer) */ + pSportChnl->pFreeBuffer->bDMA = bDMA; /* Set the DMA boolean value. */ + pSportChnl->pFreeBuffer->bInUse = true; /* this buffer is now being used by the SPORT */ + + /* Now that this "pFreeBuffer" is no longer free for use, update the + "pFreeBuffer" to the next buffer. "pFreeBuffer" will only be updated + during the process of submitting a buffer or a read/write operation. + */ + pSportChnl->pFreeBuffer = pSportChnl->pFreeBuffer->pNextBuffer; + + /* Set the data transfer mode in case it was #ADI_DT_MODE_NONE. This + will be set back to #ADI_DT_MODE_NONE once this transaction is complete. + Then, if a buffer is not currently active, set up the interrupts for + this transaction. Otherwise if a buffer is currently active, this will + be taken care of in the ISR. + */ + if (pSportChnl->eDataTranferMode == ADI_DT_MODE_NONE) /* if the SPORT is available for a transmission */ + { + pSportChnl->eDataTranferMode = ADI_DT_MODE_NONBLOCKING; + + /* call an appropriate function based on mode in which device is operating */ + if (true == bDMA) /* select a DMA driven or a core driven non-blocking transmission */ + { + result = sport_SubmitBufferDmaMode(pDevice, pSportChnl->pFillBuffer); + } else { + result = sport_SubmitBufferIntMode(pDevice, pSportChnl->pFillBuffer); + } + } + + if(ADI_SPORT_SUCCESS != result) /* if an error occurred...*/ + { + pSportChnl->eDataTranferMode = ADI_DT_MODE_NONE; /* SPORT is available */ + } + } + } + + return result; +} + +/* + * @brief Submit a buffer for SPORT Rx or Tx DMA driven transmission. + * + * @param [in] pDevice Pointer to SPORT device. + * + * @param [in] pBuffer Pointer to data transfer buffer information. + * + * @return Status + * + * - #ADI_SPORT_SUCCESS buffer successfully submitted to the DMA associated with the SPORT. + * - #ADI_SPORT_BUFFERS_NOT_SUBMITTED Failed to submit the buffer to the DMA associated with the SPORT. + */ +/** Function prototype for submitting a buffer for SPORT Rx or Tx DMA driven transmission */ +static ADI_SPORT_RESULT sport_SubmitBufferDmaMode(ADI_SPORT_DEVICE * pDevice, + ADI_DT_BUFF_INFO * pBuff) +{ + ADI_SPORT_RESULT result = ADI_SPORT_SUCCESS; + ADI_SPORT_DEVICE_INFO * pSportInfo = pDevice->pSportInfo; /* short cut to SPORT information */ + ADI_SPORT_CONFIG * pSportCfg = &pSportInfo->sportCfg; /* short cut to SPORT configuration */ + +#ifdef ADI_DEBUG + if ( (pBuff != pDevice->sportChannel.pFillBuffer) /* a submitted buffer should always be the current fill buffer */ + || (true != pBuff->bInUse) /* Processed buffers should already be marked as being used */ + || (0u != pBuff->nIndex) /* processing should start from index 0 */ + ) + { + result = ADI_SPORT_FAILED; + } + else +#endif + { + volatile ADI_SPORT_TypeDef* pSportRegs = pSportInfo->pSportRegs;/* short cut to SPORT registers */ + const uint32_t dmaChnlId = (uint32_t) pSportInfo->eDMAChnlID; /* identifier for the DMA channel to be used */ + const uint32_t dmaChnlBit = (1u << dmaChnlId); /* bit representing the DMA channel to be used */ + + /** + * Using SPORT configuration data, let's define information such as data + * size in bytes, data number, number of data and bytes in the DMA transfer + * being prepared, last byte position for the DMA transfer + * + * It's important to keep in mind that for buffer that contain too many data + * multiple DMA transfers are needed, so a buffer may have had part of its + * content already DMA-transferred: nIndex defines the position of the first + * byte in a buffer that has not been DMA-transferred yet. + */ + const uint32_t dmaIncNone = (uint32_t) ADI_DMA_INCR_NONE; + const uint32_t dmaDcc = (uint32_t) DMA_ENUM_CTL_CYCLE_CTL_BASIC; + const uint32_t bytesPerData = GetBytesPerSportData(pSportCfg->CTL); + + const uint32_t dataSizeInBytes = (1u << pSportCfg->DMA_WIDTH); /* number of bytes in each data to transmit/receive */ + uint32_t numDmaData = pBuff->nCount / dataSizeInBytes; /* number of DMA data to transmit/receive */ + const uint32_t dmaDataEnd = (pBuff->nCount - dataSizeInBytes); /* position of last <8,16,32>-bit data in the DMA transfer being setup */ + const uint32_t startAddress = (uint32_t) pBuff->pStartAddress; /* address of the first byte in the data buffer */ + const uint32_t numSportData = pBuff->nCount / bytesPerData; /* number of SPORT data to transmit/receive */ + + assert(pBuff->nCount == (numSportData * bytesPerData)); + assert(numSportData <= 0xFFFu); + assert(0u == (pBuff->nCount % dataSizeInBytes)); + assert(numDmaData <= DMA_TRANSFER_LIMIT); + assert((ADI_SPORT_DIR_RX == pDevice->eDirection) || (ADI_SPORT_DIR_TX == pDevice->eDirection)); + SPORT_CHECK_CFG_CTL(pSportCfg->CTL); + + pSportRegs->CTL_A = 0u; /* make sure SPORT is disable */ + pADI_DMA0->SRCADDR_CLR = dmaChnlBit; /* Clear source address decrement for TX channel DMA. */ + pADI_DMA0->EN_SET = dmaChnlBit; /* Enable channel DMA. */ + pADI_DMA0->RMSK_CLR = dmaChnlBit; /* Enable SPORT peripheral to generate DMA requests. */ + pADI_DMA0->ALT_CLR = dmaChnlBit; /* Set the primary control data structure as the current DMA descriptor. */ + pADI_DMA0->PRI_SET = dmaChnlBit; + + if (ADI_SPORT_DIR_RX == pDevice->eDirection) + { + pPrimaryCCD[dmaChnlId].DMASRCEND = (uint32_t) &pSportRegs->RX_A; /* address of the last src data in the DMA transfer being setup */ + pPrimaryCCD[dmaChnlId].DMADSTEND = startAddress + dmaDataEnd; /* address of the last dst data in the DMA transfer being setup */ + pPrimaryCCD[dmaChnlId].DMACDC = + (pSportCfg->DMA_INC << ((uint32_t)DMA_BITP_CTL_DST_INC)) | /* destination address incremented by N bytes */ + (dmaIncNone << ((uint32_t)DMA_BITP_CTL_SRC_INC)); /* source address not incremented */ + } + else /* ADI_SPORT_DIR_TX */ + { + pPrimaryCCD[dmaChnlId].DMASRCEND = startAddress + dmaDataEnd; /* address of the last src data in the DMA transfer being setup */ + pPrimaryCCD[dmaChnlId].DMADSTEND = (uint32_t) &pSportRegs->TX_A; /* address of the last dst data in the DMA transfer being setup */ + pPrimaryCCD[dmaChnlId].DMACDC = + (dmaIncNone << ((uint32_t)DMA_BITP_CTL_DST_INC)) | /* destination address not incremented */ + (pSportCfg->DMA_INC << ((uint32_t)DMA_BITP_CTL_SRC_INC)); /* source address incremented by N byte */ + + /** + * Fix for data transmission when DMA is used with packed data. + */ + if (numDmaData < numSportData) + { + pPrimaryCCD[dmaChnlId].DMASRCEND = startAddress + dmaDataEnd + dataSizeInBytes; /* address of the last src data in the DMA transfer being setup */ + numDmaData++; + } + } + pPrimaryCCD[dmaChnlId].DMACDC |= + (pSportCfg->DMA_WIDTH << ((uint32_t)DMA_BITP_CTL_SRC_SIZE)) | /* source data size in bytes */ + (0u << ((uint32_t) DMA_BITP_CTL_R_POWER)) | + ((numDmaData - 1u) << ((uint32_t)DMA_BITP_CTL_N_MINUS_1)) | /* number of DMA transfers (minus 1) */ + (dmaDcc << ((uint32_t)DMA_BITP_CTL_CYCLE_CTL)); + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + pDevice->pSportInfo->eState = ADI_SPORT_STATE_DATA_FLOW_ENABLED; + pSportRegs->NUMTRAN_A = numSportData; + + /* Enable SPORT DMA request interrupt for the SPORT tx channel. */ + NVIC_ClearPendingIRQ(pSportInfo->eIRQn); + NVIC_ClearPendingIRQ(pSportInfo->eDMAn); + + uint32_t ien_a = ((uint32_t)BITM_SPORT_IEN_A_SYSDATERR) | + ((uint32_t)BITM_SPORT_IEN_A_FSERRMSK) | + ((uint32_t)BITM_SPORT_IEN_A_DERRMSK); + if (ADI_SPORT_DIR_RX == pDevice->eDirection) + { + /* Allow SPORT DMA interrupt handling to mark SPORT Rx as complete */ + NVIC_EnableIRQ(pSportInfo->eDMAn); + } + else + { + /* SPORT DMA Tx is complete when TFI is raised: enable TFI */ + ien_a |= ((uint32_t)BITM_SPORT_IEN_A_TF); + } + + NVIC_EnableIRQ(pSportInfo->eIRQn); + + pSportRegs->IEN_A = ien_a; + pSportRegs->CTL_A = pSportCfg->CTL | + ((uint32_t)BITM_SPORT_CTL_A_SPEN) | + ((uint32_t)BITM_SPORT_CTL_A_DMAEN); + ADI_EXIT_CRITICAL_REGION(); + + SPORT_CHECK_CFG_CTL(pSportCfg->CTL); + } + return result; +} + +/** Function prototype for */ +/* + * @brief Submit a buffer for SPORT Rx or Tx core driven transmission. + * + * @details Submit a buffer for SPORT Rx or Tx core driven transmission. + * The buffer must be 32-bit aligned and contain N * 32-bit data. + * + * @param [in] pDevice Pointer to SPORT device. + * + * @param [in] pBuffer Pointer to data transfer buffer information. + * + * @return Status + * + * - #ADI_SPORT_SUCCESS Successfully submitted the buffer for data transfer. + * + * - #ADI_SPORT_BUFFERS_NOT_SUBMITTED No free descriptor for data transfer. + * + * + */ +static ADI_SPORT_RESULT sport_SubmitBufferIntMode(ADI_SPORT_DEVICE * pDevice, ADI_DT_BUFF_INFO * pBuff) +{ + ADI_SPORT_RESULT result = ADI_SPORT_SUCCESS; +#ifdef ADI_DEBUG + if ( (pBuff != pDevice->sportChannel.pFillBuffer) /* a submitted buffer should always be the current fill buffer */ + || (true != pBuff->bInUse) /* Processed buffers should already be marked as being used */ + || (0u != pBuff->nIndex) /* processing should start from index 0 */ + ) + { + result = ADI_SPORT_FAILED; + } + else +#endif /* ADI_DEBUG */ + { + ADI_SPORT_CONFIG * pSportCfg = &pDevice->pSportInfo->sportCfg; + volatile ADI_SPORT_TypeDef * pSportRegs = pDevice->pSportInfo->pSportRegs; + uint32_t ctl = pSportCfg->CTL; + uint32_t bytesPerData = GetBytesPerSportData(ctl); + + /** + * Buffer can be too large for being processed in one submission. + * Consequently, if pBuff->nCount requires more than than 12-bit, + * multiple buffer submissions will be required by the application; + * the SPORT driver cannot process large buffers implicitly. + * The number of bytes in submitted buffers must be a multiple of 4 + * because data are processed by the SPORT driver as 32-bit data. + */ + + /* use the SPORT configuration to setup the SPORT registers */ + + pBuff->nCount /= bytesPerData; /* number of data to be transmitted */ + +#ifdef ADI_DEBUG + uint32_t pack = SPORT_GET_PACKEN(pSportCfg->CTL); + assert( ((9u > bytesPerData) && (1u == pack)) || ((17u > bytesPerData) && (2u == pack)) || (0u == pack)); +#endif + assert(pBuff->nCount <= 0xFFFu); + SPORT_CHECK_CFG_CTL(pSportCfg->CTL); + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + pSportRegs->CTL_A = 0u; /* make sure SPORT is disable */ + pSportRegs->NUMTRAN_A = pBuff->nCount; + pDevice->pSportInfo->eState = ADI_SPORT_STATE_DATA_FLOW_ENABLED; + + /* Enable SPORT Interrupt. */ + NVIC_ClearPendingIRQ(pDevice->pSportInfo->eIRQn); + NVIC_EnableIRQ(pDevice->pSportInfo->eIRQn); + pSportRegs->IEN_A |= ((uint32_t) ( BITM_SPORT_IEN_A_DATA + | BITM_SPORT_IEN_A_SYSDATERR + | BITM_SPORT_IEN_A_FSERRMSK + | BITM_SPORT_IEN_A_DERRMSK + | BITM_SPORT_IEN_A_TF + ) + ); + pSportRegs->CTL_A = pSportCfg->CTL | ((uint32_t)BITM_SPORT_CTL_A_SPEN); + ADI_EXIT_CRITICAL_REGION(); + } + return result; +} + +/** + * @brief This function returns the address of a processed buffer. This + * is a blocking function: it waits until a buffer has been dealt + * with. This function returns an error if a callback function is + * registered. #adi_sport_IsBufferAvailable can be used as a peek + * function to know whether a buffer is available. + * + * @param [in] hDevice Device handle to SPORT device, obtained when a SPORT + * device is openedsuccessfully. + * + * @param [out] ppBuffer Pointer to a location where the the address of the + * buffer is to be written. Contains the address of an + * "empty" buffer (i.e the content of the buffer is + * transmitted) OR "filled" buffer which contains the + * received data. + * + * @param [out] pHwError Pointer to 32-bit value reporting SPORT/DMA events + * that can occur when processing buffer ppBuffer. + * + * @return Status + * + * - #ADI_SPORT_SUCCESS Successfully returned. ppBuffer points + * to the address of the buffer. + * + * - #ADI_SPORT_FAILED Failed to get the buffer since device + * is operating in call back mode. + * ppBuffer points NULL. + * + * - #ADI_SPORT_HW_ERROR SPORT hardware or DMA error detected + * + * - #ADI_SPORT_INVALID_HANDLE [D] Invalid SPORT device handle. + * + * @sa adi_sport_SubmitBuffer() + * @sa adi_sport_IsBufferAvailable() + * + */ +ADI_SPORT_RESULT adi_sport_GetBuffer(ADI_SPORT_HANDLE const hDevice, + void ** const ppBuffer, + uint32_t * pHwError) +{ + ADI_SPORT_RESULT result = ADI_SPORT_SUCCESS; + ADI_SPORT_DEVICE * pDevice = (ADI_SPORT_DEVICE*) hDevice; /* Pointer to SPORT device instance */ + + *ppBuffer = NULL; +#ifdef ADI_DEBUG + if (ADI_SPORT_SUCCESS != (result=ValidateHandle(pDevice))) /* Validate the given handle */ + { + } + else +#endif /* ADI_DEBUG */ + if (NULL != pDevice->pfCallback) + { + result = ADI_SPORT_FAILED; + } else { + ADI_DT_CHANNEL * pSportChnl = &pDevice->sportChannel; + + SEM_PEND(pSportChnl,ADI_SPORT_FAILED); /* wait for a submitted buffer to be processed */ + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + *pHwError = pDevice->nHwError; + pDevice->nHwError = 0u; + *ppBuffer = pSportChnl->pActiveBuffer->pStartAddress; /* return the buffer start address in *ppBuffer */ + pSportChnl->pActiveBuffer->pStartAddress = NULL; /* clear the free buffer address */ + pSportChnl->pActiveBuffer = pSportChnl->pActiveBuffer->pNextBuffer; + ADI_EXIT_CRITICAL_REGION(); + if (0u != *pHwError) + { + result = ADI_SPORT_HW_ERROR; + } + } + return result; +} + +/** + * @brief Peek function to know whether an empty/filled buffer is available. Call to this + * function is valid only if the call back function is not registered. Call to this + * function results in error if a call back function is registered. + * + * @param [in] hDevice Device handle to SPORT device obtained when a SPORT device is opened + * successfully. + * + * @param [out] pbAvailable Pointer to a boolean variable. Contains "True" if there is an + * empty/filled buffer and a call to #adi_sport_GetBuffer is ensured to be + * successful. Contains "false" if there is no empty buffer. + * + * @return Status + * + * - #ADI_SPORT_SUCCESS Successfully retrieved the status of availability of the buffer. + * - #ADI_SPORT_INVALID_HANDLE Failed to retrieve the status of the buffer availability. + * - #ADI_SPORT_OPERATION_NOT_ALLOWED Function cannot be called (no buffer to be processed or callback function registered). + * - ADI_SPORT_PERIPHERAL_ERROR Hardware error detected + * + * @sa adi_sport_GetBuffer() + * @sa adi_sport_GetBuffer() + * + */ +ADI_SPORT_RESULT adi_sport_IsBufferAvailable(ADI_SPORT_HANDLE const hDevice, + bool * const pbAvailable) +{ + ADI_SPORT_RESULT result = ADI_SPORT_SUCCESS; + ADI_SPORT_DEVICE * pDevice = (ADI_SPORT_DEVICE*) hDevice; /* Pointer to SPORT device instance */ + + *pbAvailable = false; +#ifdef ADI_DEBUG + if (ADI_SPORT_SUCCESS != (result=ValidateHandle(pDevice))) /* Validate the given handle */ + { + } + else +#endif /* ADI_DEBUG */ + if (NULL != pDevice->pfCallback) + { + result = ADI_SPORT_OPERATION_NOT_ALLOWED; + } + else + { + ADI_DT_BUFF_INFO * pActiveBuffer = pDevice->sportChannel.pActiveBuffer; + + if (pActiveBuffer->pStartAddress == NULL) + { + result = ADI_SPORT_OPERATION_NOT_ALLOWED; + } + else if (false == pActiveBuffer->bInUse) /* this buffer has been processed by the SPORT */ + { + *pbAvailable = true; + } + else + { + } + } + return result; +} + +/** + * @brief Register and unregister a Callback function with the SPORT device driver. + * A registered call back function will be called, if not NULL, when a buffer + * is processed OR hardware error(s) encountered. + * + * @param [in] hDevice Device handle to SPORT device is obtained when a SPORT device is opened + * successfully. + * + * @param [in] pfCallback Function pointer to Callback function. Passing a NULL pointer will + * unregister the call back function. + * + * @param [in] pCBparam Call back function parameter. + * + * @return Status + * + * - #ADI_SPORT_SUCCESS Successfully registered specified callback function. + * + * - #ADI_SPORT_INVALID_HANDLE [D] Invalid SPORT device handle. + * + * - #ADI_SPORT_OPERATION_NOT_ALLOWED [D] Operation is not allowed when data flow is enabled. + * + */ +ADI_SPORT_RESULT adi_sport_RegisterCallback(ADI_SPORT_HANDLE const hDevice, + ADI_CALLBACK const pfCallback, + void * const pCBparam) +{ + ADI_SPORT_RESULT result = ADI_SPORT_SUCCESS; + ADI_SPORT_DEVICE * pDevice = (ADI_SPORT_DEVICE *) hDevice; /* Pointer to SPORT device instance */ +#ifdef ADI_DEBUG + /* Validate the given handle */ + if (ADI_SPORT_SUCCESS != (result = ValidateHandle(pDevice))) + { + } + /* Check if the data flow is already enabled */ + else if (ADI_SPORT_STATE_DATA_FLOW_ENABLED == pDevice->pSportInfo->eState) + { + /* Not allowed to register a callback if the data flow is enabled. */ + result = ADI_SPORT_OPERATION_NOT_ALLOWED; + } + else +#endif /* ADI_DEBUG */ + { + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + pDevice->pfCallback = pfCallback; /* Store the address of the callback function */ + pDevice->pCBParam = pCBparam; /* Store the call back parameter */ + ADI_EXIT_CRITICAL_REGION(); + } + return result; +} + +/** + * @brief Sets data format for the specified SPORT device. + * + * @details Sets data type,Big endian (MSB first) OR Little endian (LSB first) and word + * length(in bits) for the specified SPORT device.This function return error if the + * device is already enabled. + * + * @param [in] hDevice Device handle to SPORT device. + * + * @param [in] nWordLength Specify the word size of the data. Valid range is from + * 4(nWordLength = 3) to 32(nWordLength =31). + * + * @param [in] bLSBFirst Configure the specified SPORT device to operate either LSB + * first or MSB first. + * \n + * \n true : LSB first (Little endian) . + * \n + * \n false : MSB first (Big endian) + * + * @param [in] ePackMode Mode of packging need to configured. Please refer #ADI_SPORT_PACKING_MODE. + * + * + * @return Status + * + * - #ADI_SPORT_SUCCESS Successfully configured the device to operate in + * specified data format. + * + * - #ADI_SPORT_INVALID_HANDLE [D] Invalid SPORT device handle. + * + * - #ADI_SPORT_INVALID_WORD_LENGTH [D] Invalid word size. + * + * - #ADI_SPORT_OPERATION_NOT_ALLOWED [D] Operation is not allowed when data flow is enabled. + * + */ +ADI_SPORT_RESULT adi_sport_ConfigData(ADI_SPORT_HANDLE const hDevice, + const uint8_t nWordLength, + const ADI_SPORT_PACKING_MODE ePackMode, + const bool bLSBFirst + ) +{ + ADI_SPORT_RESULT result = ADI_SPORT_SUCCESS; + ADI_SPORT_DEVICE * pDevice = (ADI_SPORT_DEVICE *) hDevice; /* Pointer to SPORT device instance */ +#ifdef ADI_DEBUG + if (ADI_SPORT_SUCCESS != (result = ValidateHandle(pDevice))) + { + } + if(pDevice->pSportInfo->eState == ADI_SPORT_STATE_DATA_FLOW_ENABLED) /* Not allowed to change when data flow is enabled */ + { + result = ADI_SPORT_OPERATION_NOT_ALLOWED; + } + else +#endif /* ADI_DEBUG */ + if (nWordLength > SPORT_WORD_TRANSFER_LENGTH) + { + result = ADI_SPORT_INVALID_WORD_LENGTH; + } + else + { + ADI_SPORT_DEVICE_INFO * pSportInfo = pDevice->pSportInfo; /* short cut to SPORT information */ + ADI_SPORT_CONFIG * pSportCfg = &pSportInfo->sportCfg; /* short cut to SPORT configuration */ + const uint32_t bytesPerData = ((nWordLength < 9u) ? (1u) : ((nWordLength < 17u) ? (2u) : (4u))); + + const uint32_t wordPos = (uint32_t) BITP_SPORT_CTL_A_SLEN; + const uint32_t wordLen = (uint32_t) nWordLength; + const uint32_t ctlSlen = (wordLen - 1u) << wordPos; + const uint32_t packMode = (uint32_t) ePackMode; + const uint32_t ctlSlenBits = (0x1Fu << wordPos); + const uint32_t ctlDataMask = ~(BITM_SPORT_DATA_CONFIG | ctlSlenBits | BITM_SPORT_CTL_A_LSBF); + + uint32_t ctl = pDevice->pSportInfo->sportCfg.CTL; + ctl &= ctlDataMask; /* clear all the fields(i.e Set to "0" ) */ + ctl |= (packMode | ctlSlen); /* assign packing and slen information */ + if (true == bLSBFirst) + { + ctl |= BITM_SPORT_CTL_A_LSBF; /* set the the LSB first field */ + } + pDevice->pSportInfo->sportCfg.CTL = ctl; /* CTL value set - CTL_A is assigned when submitting a buffer */ + + SPORT_CHECK_CFG_CTL(pDevice->pSportInfo->sportCfg.CTL); + + switch (bytesPerData) + { + case 1u: + if (((uint32_t) ADI_SPORT_8BIT_PACKING) == packMode) + { + pSportCfg->DMA_WIDTH = ADI_DMA_WIDTH_4_BYTE; + pSportCfg->DMA_INC = ADI_DMA_INCR_4_BYTE; + } else { + pSportCfg->DMA_WIDTH = ADI_DMA_WIDTH_1_BYTE; + pSportCfg->DMA_INC = ADI_DMA_INCR_1_BYTE; + + assert(((uint32_t) ADI_SPORT_NO_PACKING) == packMode); + } + break; + + case 2u: + if (((uint32_t) ADI_SPORT_16BIT_PACKING) == packMode) + { + pSportCfg->DMA_WIDTH = ADI_DMA_WIDTH_4_BYTE; + pSportCfg->DMA_INC = ADI_DMA_INCR_4_BYTE; + } else { + pSportCfg->DMA_WIDTH = ADI_DMA_WIDTH_2_BYTE; + pSportCfg->DMA_INC = ADI_DMA_INCR_2_BYTE; + + assert(((uint32_t) ADI_SPORT_NO_PACKING) == packMode); + } + break; + + default: + pSportCfg->DMA_WIDTH = ADI_DMA_WIDTH_4_BYTE; + pSportCfg->DMA_INC = ADI_DMA_INCR_4_BYTE; + assert((4u == bytesPerData) || (((uint32_t) ADI_SPORT_NO_PACKING) == packMode)); + break; + } + } + return result; +} + +/** + * @brief Configure the clock for the specified SPORT device. + * + * @details Configure the SPORT device to use the "internal/external " rising/falling clock + * edge,clock edge and for enabling the gated Clock Mode. + * + * @details fspclk = fsclk/(2*( nClockRatio + 1)) + * + * @details fspclk: frequency of SPORT clock + * + * @param [in] hDevice Device handle to SPORT device. + * + * @param [in] nClockRatio The value which determines the ratio between System clock and SPORT + * clock as explained above. + * + * + * @param [in] bUseIntlClock Boolean flag to indicate whether to use internal clock or external + * clock for data transmission. By default, device is configured to use + * the external clock. + * \n + * \n true : Device configured to use Internal clock. + * \n + * \n false : Device configured to use external clock.. + * + * @param [in] bRisingEdge Boolean flag to indicate whether to drive data and internal frame + * sync with rising edge OR falling edge of SP clock. + * \n + * \n true : Use falling edge of the clock. + * \n + * \n false : Use rising edge of the clock. + * + * @param [in] bGatedClk Boolean flag to indicate whether to enable/disable gated clock for + * the specified SPORT channel.Ignored in Multi channel mode. Clock will + * be active only when active data is getting transmitted or received + * when this mode is enabled. + * \n true : Enable gated clock mode. + * \n + * \n false : Disable gated clock mode. + * + * @return Status + * + * - #ADI_SPORT_SUCCESS Successfully configured clock for the specified device. + * + * - #ADI_SPORT_INVALID_HANDLE [D] Invalid SPORT device handle. + * + * - #ADI_SPORT_OPERATION_NOT_ALLOWED [D] Operation is not allowed when data flow is enabled. + * + */ +ADI_SPORT_RESULT adi_sport_ConfigClock(ADI_SPORT_HANDLE const hDevice, + const uint16_t nClockRatio, + const bool bUseIntlClock, + const bool bRisingEdge, + const bool bGatedClk) +{ + ADI_SPORT_RESULT result = ADI_SPORT_SUCCESS; + ADI_SPORT_DEVICE * pDevice = (ADI_SPORT_DEVICE *) hDevice; /* Pointer to SPORT device instance */ + +#ifdef ADI_DEBUG + if (ADI_SPORT_SUCCESS != (result = ValidateHandle(pDevice))) + { + } + else if (ADI_SPORT_STATE_DATA_FLOW_ENABLED == pDevice->pSportInfo->eState) + { + result = ADI_SPORT_OPERATION_NOT_ALLOWED; + } + else +#endif /* ADI_DEBUG */ + { + ADI_SPORT_CONFIG * pSportCfg = &pDevice->pSportInfo->sportCfg; + uint32_t clockRatio = (uint32_t) nClockRatio; + + uint32_t ctl = pSportCfg->CTL; + uint32_t dv = pSportCfg->DIV; + + ctl &= ~BITM_SPORT_CLOCK_CONFIG; /* clear all clock configuration fields */ + + dv &= ~BITM_SPORT_DIV_A_CLKDIV; + dv |= (clockRatio & BITM_SPORT_DIV_A_CLKDIV); /* update the clock divisior value */ + + if (true == bUseIntlClock) + { + ctl |= BITM_SPORT_CTL_A_ICLK; /* select the internal clock */ + } + if (true == bRisingEdge) + { + ctl |= BITM_SPORT_CTL_A_CKRE; /* select the rising edge of the clock */ + } + if (true == bGatedClk) + { + ctl |= BITM_SPORT_CTL_A_GCLKEN; /* Enable the Gated clock */ + } + pDevice->pSportInfo->pSportRegs->DIV_A = pSportCfg->DIV = dv; /* DIV value set */ + pSportCfg->CTL = ctl; /* CTL value set - CTL_A is assigned when submitting a buffer */ + + SPORT_CHECK_CFG_CTL(pSportCfg->CTL); + } + return result; +} + +/** + * @brief Frame Sync(FS) configuration for the specified SPORT. + * + * @details Configure the SPORT to use internal/external frame sync,level/edge sensitive + * early/late frame sync etc. + * + * @param [in] hDevice Device handle to SPORT device. + * + * @param [in] nFsDivisor The value which decides the number of SPORT clock cycles between + * each frame count. + * + * @param [in] bFSRequired Boolean flag to indicate whether frame sync required OR not to + * the frame sync for the data transfer. + * \n + * \n true : Device requires a frame sync for its operation. + * \n + * \n false : Device does not requires a frame sync for its operation + * \n + * \n + * + * @param [in] bInternalFS Boolean flag to indicate whether to configure the specified SPORT + * device to use the internal frame sync OR external frame sync as + * below. + * \n + * \n true : Use internal frame sync. + * \n + * \n false : Use external frame sync + * \n + * \n + * + * @param [in] bDataFS Boolean flag to indicate whether to configure the specified SPORT + * device to use the data-independent frame sync OR Serial port uses + * a data-dependent frame sync. Valid only if the specified device is + * in "transmit"(TX)mode . Ignored if the device is opened in + * "receive"(RX) mode. + * \n + * \n true : Use data-independent frame sync. + * \n + * \n false : Use data-dependent frame sync. + * \n + * \n + * + * @param [in] bActiveLowFS Boolean flag to indicate whether to configure the specified SPORT + * device for active low frame sync OR active high frame sync. Call + * to this function will return error if SPORT is configured in I2S + * mode. + * \n + * \n true : Use active low frame sync. + * \n + * \n false : Use active high frame sync. + * \n + * \n + * + * @param [in] bLateFS Boolean flag to indicate whether to use the late frame sync OR + * Early frame sync. + * \n + * \n true : Use late frame sync. + * \n + * \n false : Use Early frame sync. + * \n + * \n + * +* @param [in] bFSErrorOperation Frame Sync Error Operation. This + *\n decides the way the SPORT responds when a frame sync error occurs. + * \n + * \n true : When frame Sync error occurs, discard the receive data. + * \n + * \n false : Flag the Frame Sync error and continue normal operation + * \n + * \n + * + * @return Status + * + * - #ADI_SPORT_SUCCESS Successfully configured the frame sync requirement. + * + * - #ADI_SPORT_INVALID_HANDLE [D] Invalid SPORT device handle. + * + * - #ADI_SPORT_OPERATION_NOT_ALLOWED [D] Operation is not allowed when data flow is enabled. + * + */ +ADI_SPORT_RESULT adi_sport_ConfigFrameSync(ADI_SPORT_HANDLE const hDevice, + const uint16_t nFsDivisor, + const bool bFSRequired, + const bool bInternalFS, + const bool bDataFS, + const bool bActiveLowFS, + const bool bLateFS, + const bool bFSErrorOperation) +{ + ADI_SPORT_DEVICE * pDevice = (ADI_SPORT_DEVICE *) hDevice; /* Pointer to SPORT device instance */ + ADI_SPORT_RESULT result = ADI_SPORT_SUCCESS; + +#ifdef ADI_DEBUG + /* Validate the given handle */ + if (ADI_SPORT_SUCCESS != (result = ValidateHandle(pDevice))) + { + } + else if(pDevice->pSportInfo->eState == ADI_SPORT_STATE_DATA_FLOW_ENABLED) + { + result = ADI_SPORT_OPERATION_NOT_ALLOWED; + } + else +#endif /* ADI_DEBUG */ + { + ADI_SPORT_CONFIG * pSportCfg = &pDevice->pSportInfo->sportCfg; + const uint32_t fsDivisor = (uint32_t) nFsDivisor; + + uint32_t ctl = pSportCfg->CTL; + uint32_t dv = pSportCfg->DIV; + + dv &= ~BITM_SPORT_DIV_A_FSDIV; /* clear all the fields of frame sync */ + dv |= (fsDivisor << BITP_SPORT_DIV_A_FSDIV); + + ctl &= ~BITM_SPORT_FS_CONFIG; /* clear all the fields of frame sync */ + + if ((ADI_SPORT_DIR_RX == pDevice->eDirection) || (true == bDataFS)) + { + ctl |= BITM_SPORT_CTL_A_DIFS; /* Set this bit when SPORT is opened in RX mode */ + } + if (true == bFSRequired) /* "Frame sync required" is reserved when device */ + { /* is operating in I2S and MC mode */ + ctl |= BITM_SPORT_CTL_A_FSR; /* Frame Sync(FS) is required */ + } + if (true == bInternalFS) + { + ctl |= BITM_SPORT_CTL_A_IFS; /* Select the internal Frame Sync(FS)*/ + } + if (true == bActiveLowFS) + { + ctl |= BITM_SPORT_CTL_A_LFS; /* Select the Active High Frame Sync(FS)*/ + } + if (true == bLateFS) + { + ctl |= BITM_SPORT_CTL_A_LAFS; /* Select the Late Frame Sync(FS)*/ + } + if (true == bFSErrorOperation) + { + ctl |= BITM_SPORT_CTL_A_FSERRMODE; /* Select the edge sensitive Frame Sync(FS)*/ + } + pDevice->pSportInfo->pSportRegs->DIV_A = pSportCfg->DIV = dv; /* DIV value set */ + pSportCfg->CTL = ctl; /* CTL value set - CTL_A is assigned when submitting a buffer */ + + SPORT_CHECK_CFG_CTL(pSportCfg->CTL); + } + return result; +} + +/** + * @brief Configure the SPORT use the Clocks and Frame Sync of other Half-Sport + * + * @param [in] hDevice Device handle to SPORT device. + * + * @param [in] bUseOtherFS Boolean flag to indicate whether to use own Frame Sync(false) OR to + * use frame sync of other half SPORT (true). + * \n + * \n true : Use frame sync of other half SPORT device. + * \n + * \n false : Use own frame sync. + * + * @param [in] bUseOtherClk Boolean flag to indicate whether to use own clock clock(false) OR to + * use clock of other half SPORT(true). + * \n + * \n true : Use clock of other half SPORT device. + * \n + * \n false : Use own clock. + * + * @return Status + * + * - #ADI_SPORT_SUCCESS Successfully enabled the specified SPORT to use the clk + * and FS of other half SPORT. + * + * - #ADI_SPORT_INVALID_HANDLE [D] Invalid SPORT device handle. + * + * - #ADI_SPORT_OPERATION_NOT_ALLOWED [D] Operation is not allowed when data flow is enabled. + * + */ +ADI_SPORT_RESULT adi_sport_MultiplexSportSignal(ADI_SPORT_HANDLE const hDevice, + const bool bUseOtherFS, + const bool bUseOtherClk) +{ + ADI_SPORT_RESULT result = ADI_SPORT_SUCCESS; + ADI_SPORT_DEVICE * pDevice = (ADI_SPORT_DEVICE *)hDevice; /* Pointer to SPORT device instance */ +#ifdef ADI_DEBUG + if((result = ValidateHandle(pDevice)) != ADI_SPORT_SUCCESS) /* Validate the given handle */ + { + } + else if (pDevice->pSportInfo->eState == ADI_SPORT_STATE_DATA_FLOW_ENABLED) + { + result = ADI_SPORT_OPERATION_NOT_ALLOWED; + } + else +#endif /* ADI_DEBUG */ + { + ADI_SPORT_CONFIG * pSportCfg = &pDevice->pSportInfo->sportCfg; + uint32_t ctl = pSportCfg->CTL; + + /* clear the muxing fields of the control register 2 */ + ctl &= (uint32_t)(~(BITM_SPORT_CTL_A_CKMUXSEL | BITM_SPORT_CTL_A_FSMUXSEL)); + if (true == bUseOtherFS) + { + ctl |= BITM_SPORT_CTL_A_FSMUXSEL; /* Use the the frame sync of other half sport*/ + } + if(bUseOtherClk == true) + { + ctl |= BITM_SPORT_CTL_A_CKMUXSEL; /* Use the the clock of other half sport*/ + } + pSportCfg->CTL = ctl; /* CTL value set - CTL_A is assigned when submitting a buffer */ + + SPORT_CHECK_CFG_CTL(pSportCfg->CTL); + } + + return result; +} +/** + * @brief Configure the SPORT use the Clocks and Frame Sync of other Half-Sport + * + * @param [in] hDevice Device handle to SPORT device. + * + * @param [in] nFSDuration Specify the value of the number of clocks which would be programmed corresponding to the + * desired time duration from assertion of CONVT signal to Frame sync signal + * + * @param [in] nWidth Specify the value of the number of serial clocks for which CONVT signal should be active. + + * + * @param [in] bActiveLow Boolean flag to indicate the polarity of the Convt signal. + * \n + * \n true : Active low Polarity. + * \n + * \n false : Active High Polarity. + * + * @return Status + * + * - #ADI_SPORT_SUCCESS Successfully enabled the specified SPORT to use the clk + * and FS of other half SPORT. + * + * - #ADI_SPORT_INVALID_HANDLE [D] Invalid SPORT device handle. + * + * - #ADI_SPORT_OPERATION_NOT_ALLOWED [D] Operation is not allowed when data flow is enabled. + * + */ +ADI_SPORT_RESULT adi_sport_ConfigTimerMode(ADI_SPORT_HANDLE const hDevice, + const uint8_t nFSDuration, + const uint8_t nWidth, + const bool bActiveLow) +{ + ADI_SPORT_RESULT result = ADI_SPORT_SUCCESS; + ADI_SPORT_DEVICE * pDevice = (ADI_SPORT_DEVICE*) hDevice; /* Pointer to SPORT device instance */ + +#ifdef ADI_DEBUG /* Validate the given handle */ + if (ADI_SPORT_SUCCESS != (result = ValidateHandle(pDevice))) + { + } + else if (ADI_SPORT_STATE_DATA_FLOW_ENABLED == pDevice->pSportInfo->eState) + { + result = ADI_SPORT_OPERATION_NOT_ALLOWED; + } + else +#endif /* ADI_DEBUG */ + { + ADI_SPORT_CONFIG * pSportCfg = &pDevice->pSportInfo->sportCfg; + uint32_t cnvt = pSportCfg->TIM_CONVT; + + /* clear the muxing fields of the control register 2 */ + cnvt &= (uint32_t)(~(BITM_SPORT_CNVT_A_POL | BITM_SPORT_CNVT_A_WID | BITM_SPORT_CNVT_A_CNVT2FS )); + cnvt |= (((uint32_t) nFSDuration << ((uint32_t) BITP_SPORT_CNVT_A_CNVT2FS)) | ((uint32_t) nWidth)); + if(bActiveLow == true) + { + cnvt |= ((uint32_t) BITM_SPORT_CNVT_A_POL); /* Use the the clock of other half sport*/ + } + pDevice->pSportInfo->pSportRegs->CNVT_A = pSportCfg->TIM_CONVT = cnvt; + } + return result; +} + +/*! \cond PRIVATE */ + +/** + * @brief Create a circular linked list for buffer management. + * + * @details Create a circular linked list for buffer management and + * initialize the free buffer, the fill buffer and he active + * buffer with the first buffer in this circular array. + * + * @param [in] hDevice Device handle to SPORT device. + * + * @param [in] NumDesc Number of descriptorS. + * + */ +static inline void sport_Init (ADI_SPORT_DEVICE *pDevice) +{ + uint32_t i; + ADI_DT_CHANNEL *pChannel = &pDevice->sportChannel; + ADI_DT_BUFF_INFO *pBufInfo = &pChannel->BufInfo[0]; /* initialize this variable with the first array element */ + ADI_SPORT_DEVICE_INFO * pSportInfo = pDevice->pSportInfo; /* short cut to SPORT information */ + ADI_SPORT_CONFIG * pSportCfg = &pSportInfo->sportCfg; /* short cut to SPORT configuration */ + const uint32_t bytesPerData = GetBytesPerSportData(pSportCfg->CTL); /* number of bytes in SPORT data (1, 2, or 4) */ + const uint32_t packMode = SPORT_GET_PACKEN(pSportCfg->CTL); /* SPORT data pack mode */ + + /* Initialize the all descriptors. Make it circular. */ + for(i = 0u; i < ADI_DT_BUFNUM; i++) + { + pBufInfo[i].pStartAddress = NULL; + pBufInfo[i].nCount = 0u; + pBufInfo[i].nIndex = 0u; + pBufInfo[i].pNextBuffer = &pBufInfo[(i+1u) % ADI_DT_BUFNUM]; /* link the buffers in a circular way */ + } + pChannel->pFreeBuffer = &pChannel->BufInfo[0u]; /* the first free buffer is the first array element */ + pChannel->pActiveBuffer = &pChannel->BufInfo[0u]; /* the first active buffer is the first array element */ + pChannel->pFillBuffer = &pChannel->BufInfo[0u]; /* the first fill buffer is the first array element */ + + switch (bytesPerData) + { + case 1u: + if (SPORT_BIT_PACK_8 == packMode) + { + pSportCfg->DMA_WIDTH = ADI_DMA_WIDTH_4_BYTE; + pSportCfg->DMA_INC = ADI_DMA_INCR_4_BYTE; + } else { + pSportCfg->DMA_WIDTH = ADI_DMA_WIDTH_1_BYTE; + pSportCfg->DMA_INC = ADI_DMA_INCR_1_BYTE; + + assert(SPORT_BIT_PACK_NONE == packMode); + } + break; + + case 2u: + if (SPORT_BIT_PACK_16 == packMode) + { + pSportCfg->DMA_WIDTH = ADI_DMA_WIDTH_4_BYTE; + pSportCfg->DMA_INC = ADI_DMA_INCR_4_BYTE; + } else { + pSportCfg->DMA_WIDTH = ADI_DMA_WIDTH_2_BYTE; + pSportCfg->DMA_INC = ADI_DMA_INCR_2_BYTE; + + assert(SPORT_BIT_PACK_NONE == packMode); + } + break; + + default: + pSportCfg->DMA_WIDTH = ADI_DMA_WIDTH_4_BYTE; + pSportCfg->DMA_INC = ADI_DMA_INCR_4_BYTE; + assert((4u == bytesPerData) || (SPORT_BIT_PACK_NONE == packMode)); + break; + } +} + +/* + * @brief Configure the registers with the half-SPORT + * + * @param [in] hDevice Device handle to SPORT device. + * @param [in] sportCfg SPORT configuration to be used. + * + * @return None + */ +static inline void sport_Configure (ADI_SPORT_DEVICE *pDevice, ADI_SPORT_CONFIG const * sportCfg) +{ + /* Configure the SPORT device using static configuration parameters. + * pSportInfo is mapped to one of the half-SPORT available; this is the + * half-SPORT configured. (CTL_A, DIV_A, CNVT_A and NUMTRAN_A map either + * to half-SPORT A registers or half-SPORT B registers, depending on + * sportRegs.) + */ + volatile ADI_SPORT_TypeDef * sportRegs = pDevice->pSportInfo->pSportRegs; + ADI_SPORT_CONFIG * pSportCfg = &pDevice->pSportInfo->sportCfg; + + /* record the SPORT default configuration */ + memcpy(pSportCfg, sportCfg, sizeof(ADI_SPORT_CONFIG)); + + switch (pDevice->eDirection) /* Set the direction of operation */ + { + case ADI_SPORT_DIR_RX: + pSportCfg->CTL &= ~BITM_SPORT_CTL_A_SPTRAN; + break; + case ADI_SPORT_DIR_TX: + pSportCfg->CTL |= BITM_SPORT_CTL_A_SPTRAN; + break; + default: + assert(0); + break; + } + /* use the SPORT configuration to setup the SPORT registers */ + sportRegs->CTL_A = pSportCfg->CTL; + sportRegs->DIV_A = pSportCfg->DIV; + sportRegs->CNVT_A = pSportCfg->TIM_CONVT; + sportRegs->NUMTRAN_A = 0u; + + SPORT_CHECK_CFG_CTL(pSportCfg->CTL); +} + +#ifdef ADI_DEBUG +static ADI_SPORT_RESULT ValidateHandle(ADI_SPORT_HANDLE const hDevice) +{ + ADI_SPORT_RESULT result = ADI_SPORT_INVALID_HANDLE; + ADI_SPORT_DEVICE * pInDevice = (ADI_SPORT_DEVICE*) hDevice; + ADI_SPORT_DEVICE_INFO *poDeviceInfo = &gSportDevInfo[0][0]; + uint32_t i; + + /* Pointer to SPORT device instance */ + for (i=0u; i<(ADI_SPORT_NUM_INSTANCES << 1u); i++) /* 2 half-devices per SPORT */ + { + if (pInDevice == poDeviceInfo->hDevice) + { + result = ADI_SPORT_SUCCESS; + break; + } + poDeviceInfo++; + } + return result; +} +#endif /* ADI_DEBUG */ + +/* mask for events to be recorded in the driver HW error */ +#define recEvt ((uint32_t) (BITM_SPORT_STAT_A_SYSDATERR | BITM_SPORT_STAT_A_FSERR | BITM_SPORT_STAT_A_DERR)) + +/* bits to be cleared by the ISR */ +#define clrEvt ((recEvt | BITM_SPORT_STAT_A_TFI)) + +static void sport_Terminate(ADI_SPORT_DEVICE * pDevice) +{ + ADI_SPORT_DEVICE_INFO * pSportInfo = pDevice->pSportInfo; /* get SPORT device information */ + volatile ADI_SPORT_TypeDef * pRegs = pSportInfo->pSportRegs; /* access SPORT registers */ + + ADI_DT_CHANNEL * pSportChnl = &pDevice->sportChannel; + ADI_DT_BUFF_INFO * pBuff = pSportChnl->pFillBuffer; + + pRegs->CTL_A &= ~BITM_SPORT_CTL_A_SPEN; /* disable SPORT */ + pRegs->IEN_A &= ~(BITM_SPORT_IEN_A_TF | BITM_SPORT_IEN_A_DATA); /* disable SPORT interrupts */ + pRegs->NUMTRAN_A = 0u; + +#ifdef ADI_DEBUG + { + /* ============================================= */ + /* Check the number of data transmitted/received */ + /* nIndex is incremented each time a data packed */ + /* or unpacked in received. The size in bytes of */ + /* each data depends on the SPORT configuration. */ + /* In core driven operations, nCount represents */ + /* the number of 32-bit words transmitted. */ + /* In DMA driven operations, nCount represents */ + /* the number of DMA data transmitted */ + /* ============================================= */ + const uint32_t ctl = pRegs->CTL_A; + const uint32_t bytesPerData = GetBytesPerSportData(ctl); + const uint32_t nIndex = pBuff->nIndex * (4u / bytesPerData); + assert((nIndex>=pBuff->nCount)||(true==pBuff->bDMA)); /* buffer must be fully processed */ + } +#endif + + pBuff->bInUse = false; /* mark buffer as ready */ + + NVIC_DisableIRQ(pSportInfo->eIRQn); /* suspend SPORT Interrupt */ + NVIC_DisableIRQ(pSportInfo->eDMAn); /* suspend SPORT DMA interrupt */ + + pDevice->pSportInfo->eState = ADI_SPORT_STATE_PAUSED; + + if(NULL != pDevice->pfCallback) /* Call the callback function if one is registered. */ + { + uint32_t evt = ( (ADI_SPORT_DIR_RX == pDevice->eDirection) + ? ((uint32_t) ADI_SPORT_EVENT_RX_BUFFER_PROCESSED) + : ((uint32_t) ADI_SPORT_EVENT_TX_BUFFER_PROCESSED) + ); + + pDevice->pfCallback(pDevice->pCBParam,evt,pBuff->pStartAddress); + pBuff->pStartAddress = NULL; /* No need to keep the processed buffer address */ + } + else + { + SEM_POST(pSportChnl); /* signal the buffer availability through a semaphore */ + } + pRegs->STAT_A = clrEvt; /* clear status register bits (W1C) */ + pSportChnl->eDataTranferMode = ADI_DT_MODE_NONE; /* SPORT is available */ + pBuff = pBuff->pNextBuffer; /* point to the next buffer to process */ + pSportChnl->pFillBuffer = pBuff; /* this is the new pFillBuffer */ + + if ((0u != pBuff->pStartAddress) && (true == pBuff->bInUse)) /* valid buffer not being processed yet */ + { + ADI_SPORT_RESULT result; + + pSportChnl->eDataTranferMode = ADI_DT_MODE_NONBLOCKING; + if (true == pBuff->bDMA) + { + result = sport_SubmitBufferDmaMode(pDevice, pBuff); + } + else + { + result = sport_SubmitBufferIntMode(pDevice, pBuff); + } + + if(ADI_SPORT_SUCCESS != result) /* if an error occurred...*/ + { + pSportChnl->eDataTranferMode = ADI_DT_MODE_NONE; /* SPORT is available */ + } + } +} + +/* + * @brief Common SPORT interrupt handler function called by SPORT0 A and SPORT0 B ISRs. + * + * @details Process SPORT0 A and B interrupts, recording HW errors that must be reported, + * reading/writing transmitted data, launching new SPORT transmissions if more + * buffers are to be processed, and deactivating the SPORT device if there are + * no pending requests. (Common fucntion for both core driven and DMA driven + * SPORT operations.) + * + * @param [in] pDevice Sport device pointer related to the calling ISR. + */ +static void sport_InterruptHandler(ADI_SPORT_DEVICE * pDevice) +{ + ADI_SPORT_DEVICE_INFO * pSportInfo = pDevice->pSportInfo; /* get SPORT device information */ + volatile ADI_SPORT_TypeDef * pRegs = pSportInfo->pSportRegs; /* access SPORT registers */ + const uint32_t sportStatus = pRegs->STAT_A; /* read SPORT status */ + const uint32_t dataRequest = (sportStatus & BITM_SPORT_STAT_A_DATA);/* set if any data to be processed by the SPORT */ + const uint32_t hwEvents = sportStatus & recEvt; /* HW events to be recorded in the driver */ + + + /* This implementation assumes an identity mapping between BITM_SPORT_STAT values + * and their equivalent event in ADI_SPORT_EVENT, e.g. ADI_SPORT_HW_ERR_FS and + * BITM_SPORT_STAT_A_FSERR share the same value. This simplifies event processing + * and reports. */ + assert(((uint32_t) ADI_SPORT_HW_ERR_RX_OVERFLOW) == BITM_SPORT_STAT_A_DERR); + assert(((uint32_t) ADI_SPORT_HW_ERR_TX_UNDERFLOW) == BITM_SPORT_STAT_A_DERR); + assert(((uint32_t) ADI_SPORT_HW_ERR_FS) == BITM_SPORT_STAT_A_FSERR); + assert(((uint32_t) ADI_SPORT_HW_ERR_SYSDATAERR) == BITM_SPORT_STAT_A_SYSDATERR); + + if (0u != hwEvents) /* any event recorded? */ + { + if (NULL != pDevice->pfCallback) /* if a callback has been registered ? */ + { + pDevice->pfCallback(pDevice->pCBParam,hwEvents,NULL); /* then call it */ + } else { + pDevice->nHwError |= hwEvents; /* else set the driver HW error */ + SEM_POST(&pDevice->sportChannel); /* and signal this through a semaphore */ + } + } + + if (0u != dataRequest) /* Tx FIFO is not full or Rx FIFO is not empty */ + { + ADI_DT_BUFF_INFO * pBuff = pDevice->sportChannel.pFillBuffer; + uint32_t * pNextWord = (uint32_t*) pBuff->pStartAddress; + + if ((NULL != pNextWord) && (pBuff->nIndex < pBuff->nCount)) /* This buffer has not been fully processed yet */ + { + if (ADI_SPORT_DIR_RX == pDevice->eDirection) + { + pNextWord[pBuff->nIndex++] = pRegs->RX_A; /* Read the data received in RX and increment the index */ + while (!DXS_FIFO_IS_EMPTY(pRegs->STAT_A)) /* and if there are more data available in the FIFO */ + { + pNextWord[pBuff->nIndex++] = pRegs->RX_A; /* Read remaining data received in RX and increment the index */ + } + } + else + { + pRegs->TX_A = pNextWord[pBuff->nIndex++]; /* Write the data to be sent into TX and increment the index */ + while ( (pBuff->nIndex < pBuff->nCount) /* and if there are more data to be sent */ + && (!DXS_FIFO_IS_FULL(pRegs->STAT_A)) /* and there is still room in the FIFO */ + ) + { + pRegs->TX_A = pNextWord[pBuff->nIndex++]; /* then write more data to be sent into TX and increment the index */ + } + } + } + } + + /* ========================================================== */ + /* Common to core driven operations and DMA driven operations */ + /* ========================================================== */ + if (0u != (pRegs->STAT_A & BITM_SPORT_STAT_A_TFI)) /* If a SPORT Tx/Rx request has finished */ + { + sport_Terminate(pDevice); + } + +#if defined(ADI_CYCLECOUNT_SPORT_ISR_ENABLED) && (ADI_CYCLECOUNT_SPORT_ISR_ENABLED == 1u) + ADI_CYCLECOUNT_STORE(ADI_CYCLECOUNT_ISR_SPORT); +#endif +} + +/** Interrupt handler for SPORT0 A */ +void SPORT0A_Int_Handler(void) +{ + ISR_PROLOG(); + sport_InterruptHandler(gSportDevInfo[0][ADI_HALF_SPORT_A].hDevice); + ISR_EPILOG(); +} + +/** Interrupt handler for SPORT0 B */ +void SPORT0B_Int_Handler(void) +{ + ISR_PROLOG(); + sport_InterruptHandler(gSportDevInfo[0][ADI_HALF_SPORT_B].hDevice); + ISR_EPILOG(); +} + +void DMA_SPORT0A_Int_Handler(void) +{ + ISR_PROLOG(); + /** + * if SPORT is in Rx mode, then the DMA interrupt is the signal for + * end of transmission: buffer is ready. (In Tx mode, the signal is + * the TFI event and SPORT DMA interrup is not enabled). + */ + sport_Terminate(gSportDevInfo[0][ADI_HALF_SPORT_A].hDevice); +#if defined(ADI_CYCLECOUNT_SPORT_ISR_ENABLED) && (ADI_CYCLECOUNT_SPORT_ISR_ENABLED == 1u) + ADI_CYCLECOUNT_STORE(ADI_CYCLECOUNT_ISR_SPORT); +#endif + ISR_EPILOG(); +} + +void DMA_SPORT0B_Int_Handler(void) +{ + ISR_PROLOG(); + /** + * if SPORT is in Rx mode, then the DMA interrupt is the signal for + * end of transmission: buffer is ready. (In Tx mode, the signal is + * the TFI event and SPORT DMA interrup is not enabled). + */ + sport_Terminate(gSportDevInfo[0][ADI_HALF_SPORT_B].hDevice); +#if defined(ADI_CYCLECOUNT_SPORT_ISR_ENABLED) && (ADI_CYCLECOUNT_SPORT_ISR_ENABLED == 1u) + ADI_CYCLECOUNT_STORE(ADI_CYCLECOUNT_ISR_SPORT); +#endif + ISR_EPILOG(); +} + +static void sport_DmaErrorCallback(void *pCBParam, uint32_t Event, void *pArg) +{ + ADI_SPORT_DEVICE * pDevice = (ADI_SPORT_DEVICE*) pCBParam; /* Recover the device handle. */ + ADI_DT_BUFF_INFO * pFillBuffer = pDevice->sportChannel.pFillBuffer; + ADI_DT_BUFF_INFO * pNextBuffer = pFillBuffer->pNextBuffer; + uint32_t nEvent = 0u; + + if (ADI_DMA_EVENT_ERR_BUS == Event) + { + nEvent = (uint32_t) ADI_SPORT_DMA_ERR_BUS; /* SPORT DMA bus error detected */ + } else { + assert(ADI_DMA_EVENT_ERR_INVALID_DESCRIPTOR == Event); + nEvent = (uint32_t) ADI_SPORT_DMA_ERR_INVALID_DESCRIPTOR; /* SPORT DMA invalid descriptor error detected */ + } + + pDevice->nHwError |= nEvent; + sport_InterruptHandler(pDevice); + + while ( (NULL != pNextBuffer->pStartAddress) + && (true == pNextBuffer->bInUse) + && (true == pNextBuffer->bDMA) + ) /* another buffer is pending for a DMA driven request */ + { + pDevice->nHwError |= nEvent; + pNextBuffer->bInUse = false; + sport_InterruptHandler(pDevice); + pNextBuffer = pNextBuffer->pNextBuffer; + } +} + +static inline uint32_t GetBytesPerSportData(const uint32_t ctlVal) +{ + const uint32_t wlen = SPORT_GET_WLEN(ctlVal); + const uint32_t bytesPerData = ((wlen < 9u) ? (1u) : ((wlen < 17u) ? (2u) : (4u))); + return bytesPerData; +} + +/*! \endcond */ + +/*@}*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sport/adi_sport_def.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sport/adi_sport_def.h new file mode 100755 index 0000000000..7244562e9a --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sport/adi_sport_def.h @@ -0,0 +1,193 @@ +/*! ***************************************************************************** + * @file: adi_sport_def.h + * @brief: UART Device Driver definition for processor + ----------------------------------------------------------------------------- +Copyright (c) 2010-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ +/*! \cond PRIVATE */ +#ifndef ADI_SPORT_DEF_H +#define ADI_SPORT_DEF_H + +#include + +#if defined(ADI_CFG_SPORT0A_SERIAL_WLEN) +#if (ADI_CFG_SPORT0A_SERIAL_WLEN <= 3u) || (ADI_CFG_SPORT0A_SERIAL_WLEN > 32u) +#error "Invalid word length : it must be between 4 and 32" +#endif +#else +#error "ADI_CFG_SPORT0A_SERIAL_WLEN undefined!!! " +#endif + +#if defined(ADI_CFG_SPORT0B_SERIAL_WLEN) +#if (ADI_CFG_SPORT0B_SERIAL_WLEN <= 3u) || (ADI_CFG_SPORT0B_SERIAL_WLEN > 32u) +#error "Invalid word length : it must be between 4 and 32" +#endif +#else +#error "ADI_CFG_SPORT0B_SERIAL_WLEN undefined!!! " +#endif + +#define ADI_SPORT_NUM_INSTANCES (1u) /*!< Number of SPORT devices available */ +#define ADI_SPORT_NUM_CHANNELS (2u) /*!< Number of SPORT channel for each SPORT devcie */ + +#define BITM_SPORT_DATA_CONFIG ( BITM_SPORT_CTL_A_LSBF \ + | BITM_SPORT_CTL_A_PACK) + +#define BITM_SPORT_CLOCK_CONFIG ( BITM_SPORT_CTL_A_ICLK \ + | BITM_SPORT_CTL_A_CKRE \ + | BITM_SPORT_CTL_A_GCLKEN) + +#define BITM_SPORT_FS_CONFIG ( BITM_SPORT_CTL_A_FSR \ + | BITM_SPORT_CTL_A_IFS \ + | BITM_SPORT_CTL_A_DIFS \ + | BITM_SPORT_CTL_A_LFS \ + | BITM_SPORT_CTL_A_LAFS \ + | BITM_SPORT_CTL_A_FSERRMODE) + +#define SPORT_BYTE_TRANSFER_LENGTH (8u) +#define SPORT_HALFWORD_TRANSFER_LENGTH (16u) +#define SPORT_WORD_TRANSFER_LENGTH (32u) + +#define SPORT_GET_WLEN(ctlVal) ((((ctlVal) & (uint32_t) BITM_SPORT_CTL_A_SLEN) >> ((uint32_t) BITP_SPORT_CTL_A_SLEN)) + 1u) +#define SPORT_GET_PACKEN(ctlVal) ((ctlVal) & (uint32_t) BITM_SPORT_CTL_A_PACK) >> ((uint32_t) BITP_SPORT_CTL_A_PACK) + +#define SPORT_CHECK_CFG_CTL(CFG) assert(0u == ((CFG) & (((uint32_t)BITM_SPORT_CTL_A_SPEN) | ((uint32_t)BITM_SPORT_CTL_A_DMAEN)))) + + +#define SPORT_BIT_PACK_NONE (((uint32_t) ADI_SPORT_NO_PACKING) >> ((uint32_t) BITP_SPORT_CTL_A_PACK)) +#define SPORT_BIT_PACK_8 (((uint32_t) ADI_SPORT_8BIT_PACKING) >> ((uint32_t) BITP_SPORT_CTL_A_PACK)) +#define SPORT_BIT_PACK_16 (((uint32_t) ADI_SPORT_16BIT_PACKING) >> ((uint32_t) BITP_SPORT_CTL_A_PACK)) + +/*! + ***************************************************************************** + * \struct ADI_SPORT_STATE + * Enumeration of different SPORT states. + *****************************************************************************/ +typedef enum +{ + ADI_SPORT_STATE_UNINITIALIZED = 0, /*!< SPORT is not yet initialized */ + ADI_SPORT_STATE_INITIALIZED, /*!< SPORT is initialized */ + ADI_SPORT_STATE_DATA_FLOW_ENABLED, /*!< SPORT Tx or Rx data flow is enabled (SPORT peripheral cannot be re-configured) */ + ADI_SPORT_STATE_DATA_FLOW_DISABLED, /*!< SPORT Tx or Rx data flow is disabled (SPORT peripheral can be re-configured) */ + ADI_SPORT_STATE_PAUSED +} ADI_SPORT_STATE; + +/*! + ***************************************************************************** + * \struct ADI_SPORT_CONFIG + * Structure for initializing the static config. + *****************************************************************************/ + +typedef struct _ADI_SPORT_CONFIG +{ + uint32_t CTL; /*!< SPORT_CTL register. */ + uint32_t DIV; /*!< SPORT_DIV register. */ + uint32_t TIM_CONVT; /*!< TIM_CONVT Register. */ + uint32_t DMA_WIDTH; /*!< DMA_WIDTH */ + uint32_t DMA_INC; /*!< DMA_INC */ +} ADI_SPORT_CONFIG; + +/*! + ***************************************************************************** + * \struct ADI_SPORT_DEVICE_INFO + * SPORT device information. + *****************************************************************************/ +typedef struct _ADI_SPORT_DEVICE_INFO +{ + volatile ADI_SPORT_TypeDef* pSportRegs; /*!< Base address of the SPORT registers */ + ADI_SPORT_CONFIG sportCfg; /*!< SPORT configuration data */ + ADI_SPORT_STATE eState; /*!< To indicate the state of the device */ + const DMA_CHANn_TypeDef eDMAChnlID; /*!< DMA channel ID */ + const IRQn_Type eDMAn; /*!< DMA channel IRQ identifier */ + const IRQn_Type eIRQn; /*!< SPORT IRQ identifier */ + ADI_SPORT_HANDLE hDevice; /*!< SPORT handle */ +} ADI_SPORT_DEVICE_INFO; + +/****************************************************************************** + * SPORT Device internal API function prototypes + *****************************************************************************/ + +#define NUM_SPORT_BUFFER (2u) + +/** SPORT driver instance data */ +typedef struct _ADI_SPORT_DEVICE +{ + ADI_SPORT_DEVICE_INFO * pSportInfo; /*!< pointer to the structure which stores the information about the SPORT instances.*/ + ADI_SPORT_DIRECTION eDirection; /*!< Direction in which the SPORT is opened */ + ADI_CALLBACK pfCallback; /*!< Function pointer for callback function. */ + void * pCBParam; /*!< Parameter to callback function. */ + ADI_DT_CHANNEL sportChannel; /*!< SPORT channel to manage transmitted data buffers */ + volatile uint32_t nHwError; /*!< variable to store the hardware status */ +} ADI_SPORT_DEVICE; + +/** Initialize a SPORT device */ +static inline void sport_Init (ADI_SPORT_DEVICE * pDevice); + +/** Configure a SPORT device */ +static inline void sport_Configure (ADI_SPORT_DEVICE *pDevice, ADI_SPORT_CONFIG const * sportCfg); + +/** Function prototype for submitting a buffer for SPORT Rx or Tx DMA driven transmission */ +static ADI_SPORT_RESULT sport_SubmitBufferDmaMode(ADI_SPORT_DEVICE * pDevice, ADI_DT_BUFF_INFO * pBuff); + +/** Function prototype for submitting a buffer for SPORT Rx or Tx core driven transmission */ +static ADI_SPORT_RESULT sport_SubmitBufferIntMode(ADI_SPORT_DEVICE * pDevice, ADI_DT_BUFF_INFO * pBuff); + +/** Fucntion prototype for completing a SPORT transmission (Rx or Tx) */ +static void sport_Terminate(ADI_SPORT_DEVICE * pDevice); + +/** Interrupt Handlers */ + +/** SPORT interrupt handler */ +static void sport_InterruptHandler(ADI_SPORT_DEVICE * pDevice); + +static inline void sport_DmaErrorCallback(void *pCBParam, uint32_t Event, void *pArg); + +static inline uint32_t GetBytesPerSportData(const uint32_t ctlVal); + +/* + * Handle Validation function +*/ +#ifdef ADI_DEBUG +static ADI_SPORT_RESULT ValidateHandle(ADI_SPORT_HANDLE const hDevice); +#endif /* ADI_DEBUG */ + +#endif /* end of ifndef ADI_SPORT_DEF_H */ +/*! \endcond */ + + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050.h new file mode 100755 index 0000000000..d2a7a908a4 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050.h @@ -0,0 +1,5339 @@ +/* ================================================================================ + + Project : ADuCM4050 + File : ADuCM4050.h + Description : Register Definitions + + Date : Feb 7, 2017 + + Copyright (c) 2014-2017 Analog Devices, Inc. All Rights Reserved. + This software is proprietary and confidential to Analog Devices, Inc. and + its licensors. + + This file was auto-generated. Do not make local changes to this file. + + ================================================================================ */ + +#ifndef _DEF_ADUCM4050_H +#define _DEF_ADUCM4050_H + +#if defined(_LANGUAGE_C) || (defined(__GNUC__) && !defined(__ASSEMBLER__)) +#include +#endif /* _LANGUAGE_C */ + + +#if defined (_MISRA_RULES) +#pragma diag(push) +#pragma diag(suppress:misra_rule_5_1:"Allow names over 32 character limit") +#pragma diag(suppress:misra_rule_19_7:"ADI header allows function-like macros") +#pragma diag(suppress:misra_rule_19_13:"ADI headers can use the # and ## preprocessor operators") +#endif /* _MISRA_RULES */ + +/* _ADI_MSK_3 might be defined in wrapper includes - otherwise provide a default */ +#if !defined(_ADI_MSK_3) +/* do not add casts to literal constants in assembly code */ +#if defined(_LANGUAGE_ASM) || defined(__ASSEMBLER__) +/* Use unsuffixed literals for BITM macros */ +#define _ADI_MSK_3( mask, smask, type ) (mask) +#else +/* Use casted suffixed literals for BITM macros */ +#define _ADI_MSK_3( mask, smask, type ) ((type)(smask)) +#endif +#endif + +#ifndef __ADI_GENERATED_DEF_HEADERS__ +#define __ADI_GENERATED_DEF_HEADERS__ 1 +#endif + +#define __ADI_HAS_ADC__ 1 +#define __ADI_HAS_BEEP__ 1 +#define __ADI_HAS_BUSM__ 1 +#define __ADI_HAS_CLKG_OSC__ 1 +#define __ADI_HAS_CLKG__ 1 +#define __ADI_HAS_CLKG_CLK__ 1 +#define __ADI_HAS_CRC__ 1 +#define __ADI_HAS_CRYPT__ 1 +#define __ADI_HAS_DMA__ 1 +#define __ADI_HAS_XINT__ 1 +#define __ADI_HAS_FLCC__ 1 +#define __ADI_HAS_FLCC_CACHE__ 1 +#define __ADI_HAS_FLCC_DFT__ 1 +#define __ADI_HAS_FLCC_TEST__ 1 +#define __ADI_HAS_GPIO__ 1 +#define __ADI_HAS_TMR__ 1 +#define __ADI_HAS_I2C__ 1 +#define __ADI_HAS_NVIC__ 1 +#define __ADI_HAS_PMG__ 1 +#define __ADI_HAS_PMG_TST__ 1 +#define __ADI_HAS_PTI__ 1 +#define __ADI_HAS_RNG__ 1 +#define __ADI_HAS_RTC__ 1 +#define __ADI_HAS_SPI__ 1 +#define __ADI_HAS_SPORT__ 1 +#define __ADI_HAS_SYS__ 1 +#define __ADI_HAS_TMR_RGB__ 1 +#define __ADI_HAS_UART__ 1 +#define __ADI_HAS_WDT__ 1 + +/* ============================================================================================================================ + General Purpose Timer + ============================================================================================================================ */ + +/* ============================================================================================================================ + TMR0 + ============================================================================================================================ */ +#define REG_TMR0_LOAD 0x40000000 /* TMR0 16-bit Load Value */ +#define REG_TMR0_CURCNT 0x40000004 /* TMR0 16-bit Timer Value */ +#define REG_TMR0_CTL 0x40000008 /* TMR0 Control */ +#define REG_TMR0_CLRINT 0x4000000C /* TMR0 Clear Interrupt */ +#define REG_TMR0_CAPTURE 0x40000010 /* TMR0 Capture */ +#define REG_TMR0_ALOAD 0x40000014 /* TMR0 16-bit Load Value, Asynchronous */ +#define REG_TMR0_ACURCNT 0x40000018 /* TMR0 16-bit Timer Value, Asynchronous */ +#define REG_TMR0_STAT 0x4000001C /* TMR0 Status */ +#define REG_TMR0_PWMCTL 0x40000020 /* TMR0 PWM Control Register */ +#define REG_TMR0_PWMMATCH 0x40000024 /* TMR0 PWM Match Value */ +#define REG_TMR0_EVENTSELECT 0x40000028 /* TMR0 Timer Event Selection Register */ + +/* ============================================================================================================================ + TMR1 + ============================================================================================================================ */ +#define REG_TMR1_LOAD 0x40000400 /* TMR1 16-bit Load Value */ +#define REG_TMR1_CURCNT 0x40000404 /* TMR1 16-bit Timer Value */ +#define REG_TMR1_CTL 0x40000408 /* TMR1 Control */ +#define REG_TMR1_CLRINT 0x4000040C /* TMR1 Clear Interrupt */ +#define REG_TMR1_CAPTURE 0x40000410 /* TMR1 Capture */ +#define REG_TMR1_ALOAD 0x40000414 /* TMR1 16-bit Load Value, Asynchronous */ +#define REG_TMR1_ACURCNT 0x40000418 /* TMR1 16-bit Timer Value, Asynchronous */ +#define REG_TMR1_STAT 0x4000041C /* TMR1 Status */ +#define REG_TMR1_PWMCTL 0x40000420 /* TMR1 PWM Control Register */ +#define REG_TMR1_PWMMATCH 0x40000424 /* TMR1 PWM Match Value */ +#define REG_TMR1_EVENTSELECT 0x40000428 /* TMR1 Timer Event Selection Register */ + +/* ============================================================================================================================ + TMR2 + ============================================================================================================================ */ +#define REG_TMR2_LOAD 0x40000800 /* TMR2 16-bit Load Value */ +#define REG_TMR2_CURCNT 0x40000804 /* TMR2 16-bit Timer Value */ +#define REG_TMR2_CTL 0x40000808 /* TMR2 Control */ +#define REG_TMR2_CLRINT 0x4000080C /* TMR2 Clear Interrupt */ +#define REG_TMR2_CAPTURE 0x40000810 /* TMR2 Capture */ +#define REG_TMR2_ALOAD 0x40000814 /* TMR2 16-bit Load Value, Asynchronous */ +#define REG_TMR2_ACURCNT 0x40000818 /* TMR2 16-bit Timer Value, Asynchronous */ +#define REG_TMR2_STAT 0x4000081C /* TMR2 Status */ +#define REG_TMR2_PWMCTL 0x40000820 /* TMR2 PWM Control Register */ +#define REG_TMR2_PWMMATCH 0x40000824 /* TMR2 PWM Match Value */ +#define REG_TMR2_EVENTSELECT 0x40000828 /* TMR2 Timer Event Selection Register */ + +/* ============================================================================================================================ + TMR Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_LOAD Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_LOAD_VALUE 0 /* Load Value */ +#define BITM_TMR_LOAD_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Load Value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_CURCNT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_CURCNT_VALUE 0 /* Current Count */ +#define BITM_TMR_CURCNT_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Current Count */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_CTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_CTL_SYNCBYP 15 /* Synchronization Bypass */ +#define BITP_TMR_CTL_RSTEN 14 /* Counter and Prescale Reset Enable */ +#define BITP_TMR_CTL_EVTEN 13 /* Event Select */ +#define BITP_TMR_CTL_RLD 7 /* Reload Control */ +#define BITP_TMR_CTL_CLK 5 /* Clock Select */ +#define BITP_TMR_CTL_EN 4 /* Timer Enable */ +#define BITP_TMR_CTL_MODE 3 /* Timer Mode */ +#define BITP_TMR_CTL_UP 2 /* Count up */ +#define BITP_TMR_CTL_PRE 0 /* Prescaler */ +#define BITM_TMR_CTL_SYNCBYP (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Synchronization Bypass */ +#define BITM_TMR_CTL_RSTEN (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Counter and Prescale Reset Enable */ +#define BITM_TMR_CTL_EVTEN (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Event Select */ +#define BITM_TMR_CTL_RLD (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Reload Control */ +#define BITM_TMR_CTL_CLK (_ADI_MSK_3(0x00000060,0x00000060U, uint16_t )) /* Clock Select */ +#define BITM_TMR_CTL_EN (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Timer Enable */ +#define BITM_TMR_CTL_MODE (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Timer Mode */ +#define BITM_TMR_CTL_UP (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Count up */ +#define BITM_TMR_CTL_PRE (_ADI_MSK_3(0x00000003,0x00000003U, uint16_t )) /* Prescaler */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_CLRINT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_CLRINT_EVTCAPT 1 /* Clear Captured Event Interrupt */ +#define BITP_TMR_CLRINT_TIMEOUT 0 /* Clear Timeout Interrupt */ +#define BITM_TMR_CLRINT_EVTCAPT (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Clear Captured Event Interrupt */ +#define BITM_TMR_CLRINT_TIMEOUT (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Clear Timeout Interrupt */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_CAPTURE Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_CAPTURE_VALUE 0 /* 16-bit Captured Value */ +#define BITM_TMR_CAPTURE_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* 16-bit Captured Value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_ALOAD Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_ALOAD_VALUE 0 /* Load Value, Asynchronous */ +#define BITM_TMR_ALOAD_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Load Value, Asynchronous */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_ACURCNT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_ACURCNT_VALUE 0 /* Counter Value */ +#define BITM_TMR_ACURCNT_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Counter Value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_STAT_CNTRST 8 /* Counter Reset Occurring */ +#define BITP_TMR_STAT_PDOK 7 /* Clear Interrupt Register Synchronization */ +#define BITP_TMR_STAT_BUSY 6 /* Timer Busy */ +#define BITP_TMR_STAT_CAPTURE 1 /* Capture Event Pending */ +#define BITP_TMR_STAT_TIMEOUT 0 /* Timeout Event Occurred */ +#define BITM_TMR_STAT_CNTRST (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Counter Reset Occurring */ +#define BITM_TMR_STAT_PDOK (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Clear Interrupt Register Synchronization */ +#define BITM_TMR_STAT_BUSY (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Timer Busy */ +#define BITM_TMR_STAT_CAPTURE (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Capture Event Pending */ +#define BITM_TMR_STAT_TIMEOUT (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Timeout Event Occurred */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_PWMCTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_PWMCTL_IDLESTATE 1 /* PWM Idle State */ +#define BITP_TMR_PWMCTL_MATCH 0 /* PWM Match Enabled */ +#define BITM_TMR_PWMCTL_IDLESTATE (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* PWM Idle State */ +#define BITM_TMR_PWMCTL_MATCH (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* PWM Match Enabled */ +#define ENUM_TMR_PWMCTL_IDLE_LOW (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* IDLESTATE: PWM idles low */ +#define ENUM_TMR_PWMCTL_IDLE_HIGH (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* IDLESTATE: PWM idles high */ +#define ENUM_TMR_PWMCTL_PWM_TOGGLE (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* MATCH: PWM in toggle mode */ +#define ENUM_TMR_PWMCTL_PWM_MATCH (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* MATCH: PWM in match mode */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_PWMMATCH Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_PWMMATCH_VALUE 0 /* PWM Match Value */ +#define BITM_TMR_PWMMATCH_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* PWM Match Value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_EVENTSELECT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_EVENTSELECT_EVTRANGE 0 /* Event Select Range */ +#define BITM_TMR_EVENTSELECT_EVTRANGE (_ADI_MSK_3(0x0000003F,0x0000003FU, uint16_t )) /* Event Select Range */ + + +/* ============================================================================================================================ + Timer_RGB with 3 PWM outputs + ============================================================================================================================ */ + +/* ============================================================================================================================ + TMR_RGB + ============================================================================================================================ */ +#define REG_TMR_RGB_LOAD 0x40000C00 /* TMR_RGB 16-bit load value */ +#define REG_TMR_RGB_CURCNT 0x40000C04 /* TMR_RGB 16-bit timer value */ +#define REG_TMR_RGB_CTL 0x40000C08 /* TMR_RGB Control */ +#define REG_TMR_RGB_CLRINT 0x40000C0C /* TMR_RGB Clear interrupt */ +#define REG_TMR_RGB_CAPTURE 0x40000C10 /* TMR_RGB Capture */ +#define REG_TMR_RGB_ALOAD 0x40000C14 /* TMR_RGB 16-bit load value, asynchronous */ +#define REG_TMR_RGB_ACURCNT 0x40000C18 /* TMR_RGB 16-bit timer value, asynchronous */ +#define REG_TMR_RGB_STAT 0x40000C1C /* TMR_RGB Status */ +#define REG_TMR_RGB_PWM0CTL 0x40000C20 /* TMR_RGB PWM0 Control Register */ +#define REG_TMR_RGB_PWM0MATCH 0x40000C24 /* TMR_RGB PWM0 Match Value */ +#define REG_TMR_RGB_EVENTSELECT 0x40000C28 /* TMR_RGB Timer Event selection Register */ +#define REG_TMR_RGB_PWM1CTL 0x40000C2C /* TMR_RGB PWM1 Control Register */ +#define REG_TMR_RGB_PWM1MATCH 0x40000C30 /* TMR_RGB PWM1 Match Value */ +#define REG_TMR_RGB_PWM2CTL 0x40000C34 /* TMR_RGB PWM2 Control Register */ +#define REG_TMR_RGB_PWM2MATCH 0x40000C38 /* TMR_RGB PWM2 Match Value */ + +/* ============================================================================================================================ + TMR_RGB Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_RGB_LOAD Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_RGB_LOAD_VALUE 0 /* Load value */ +#define BITM_TMR_RGB_LOAD_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Load value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_RGB_CURCNT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_RGB_CURCNT_VALUE 0 /* Current count */ +#define BITM_TMR_RGB_CURCNT_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Current count */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_RGB_CTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_RGB_CTL_SYNCBYP 15 /* Synchronization bypass */ +#define BITP_TMR_RGB_CTL_RSTEN 14 /* Counter and prescale reset enable */ +#define BITP_TMR_RGB_CTL_EVTEN 13 /* Event select */ +#define BITP_TMR_RGB_CTL_RLD 7 /* Reload control */ +#define BITP_TMR_RGB_CTL_CLK 5 /* Clock select */ +#define BITP_TMR_RGB_CTL_EN 4 /* Timer enable */ +#define BITP_TMR_RGB_CTL_MODE 3 /* Timer mode */ +#define BITP_TMR_RGB_CTL_UP 2 /* Count up */ +#define BITP_TMR_RGB_CTL_PRE 0 /* Prescaler */ +#define BITM_TMR_RGB_CTL_SYNCBYP (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Synchronization bypass */ +#define BITM_TMR_RGB_CTL_RSTEN (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Counter and prescale reset enable */ +#define BITM_TMR_RGB_CTL_EVTEN (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Event select */ +#define BITM_TMR_RGB_CTL_RLD (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Reload control */ +#define BITM_TMR_RGB_CTL_CLK (_ADI_MSK_3(0x00000060,0x00000060U, uint16_t )) /* Clock select */ +#define BITM_TMR_RGB_CTL_EN (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Timer enable */ +#define BITM_TMR_RGB_CTL_MODE (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Timer mode */ +#define BITM_TMR_RGB_CTL_UP (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Count up */ +#define BITM_TMR_RGB_CTL_PRE (_ADI_MSK_3(0x00000003,0x00000003U, uint16_t )) /* Prescaler */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_RGB_CLRINT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_RGB_CLRINT_EVTCAPT 1 /* Clear captured event interrupt */ +#define BITP_TMR_RGB_CLRINT_TIMEOUT 0 /* Clear timeout interrupt */ +#define BITM_TMR_RGB_CLRINT_EVTCAPT (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Clear captured event interrupt */ +#define BITM_TMR_RGB_CLRINT_TIMEOUT (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Clear timeout interrupt */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_RGB_CAPTURE Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_RGB_CAPTURE_VALUE 0 /* 16-bit captured value */ +#define BITM_TMR_RGB_CAPTURE_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* 16-bit captured value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_RGB_ALOAD Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_RGB_ALOAD_VALUE 0 /* Load value, asynchronous */ +#define BITM_TMR_RGB_ALOAD_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Load value, asynchronous */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_RGB_ACURCNT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_RGB_ACURCNT_VALUE 0 /* Counter value */ +#define BITM_TMR_RGB_ACURCNT_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Counter value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_RGB_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_RGB_STAT_CNTRST 8 /* Counter reset occurring */ +#define BITP_TMR_RGB_STAT_PDOK 7 /* Clear Interrupt Register synchronization */ +#define BITP_TMR_RGB_STAT_BUSY 6 /* Timer Busy */ +#define BITP_TMR_RGB_STAT_CAPTURE 1 /* Capture event pending */ +#define BITP_TMR_RGB_STAT_TIMEOUT 0 /* Timeout event occurred */ +#define BITM_TMR_RGB_STAT_CNTRST (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Counter reset occurring */ +#define BITM_TMR_RGB_STAT_PDOK (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Clear Interrupt Register synchronization */ +#define BITM_TMR_RGB_STAT_BUSY (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Timer Busy */ +#define BITM_TMR_RGB_STAT_CAPTURE (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Capture event pending */ +#define BITM_TMR_RGB_STAT_TIMEOUT (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Timeout event occurred */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_RGB_PWM0CTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_RGB_PWM0CTL_IDLESTATE 1 /* PWM Idle State */ +#define BITP_TMR_RGB_PWM0CTL_MATCH 0 /* PWM Match enabled */ +#define BITM_TMR_RGB_PWM0CTL_IDLESTATE (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* PWM Idle State */ +#define BITM_TMR_RGB_PWM0CTL_MATCH (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* PWM Match enabled */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_RGB_PWM0MATCH Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_RGB_PWM0MATCH_VALUE 0 /* PWM Match Value */ +#define BITM_TMR_RGB_PWM0MATCH_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* PWM Match Value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_RGB_EVENTSELECT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_RGB_EVENTSELECT_EVTRANGE 0 /* Event select range */ +#define BITM_TMR_RGB_EVENTSELECT_EVTRANGE (_ADI_MSK_3(0x0000003F,0x0000003FU, uint16_t )) /* Event select range */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_RGB_PWM1CTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_RGB_PWM1CTL_IDLESTATE 1 /* PWM Idle State */ +#define BITP_TMR_RGB_PWM1CTL_MATCH 0 /* PWM Match enabled */ +#define BITM_TMR_RGB_PWM1CTL_IDLESTATE (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* PWM Idle State */ +#define BITM_TMR_RGB_PWM1CTL_MATCH (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* PWM Match enabled */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_RGB_PWM1MATCH Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_RGB_PWM1MATCH_VALUE 0 /* PWM Match Value */ +#define BITM_TMR_RGB_PWM1MATCH_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* PWM Match Value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_RGB_PWM2CTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_RGB_PWM2CTL_IDLESTATE 1 /* PWM Idle State */ +#define BITP_TMR_RGB_PWM2CTL_MATCH 0 /* PWM Match enabled */ +#define BITM_TMR_RGB_PWM2CTL_IDLESTATE (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* PWM Idle State */ +#define BITM_TMR_RGB_PWM2CTL_MATCH (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* PWM Match enabled */ + +/* ------------------------------------------------------------------------------------------------------------------------- + TMR_RGB_PWM2MATCH Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_TMR_RGB_PWM2MATCH_VALUE 0 /* PWM Match Value */ +#define BITM_TMR_RGB_PWM2MATCH_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* PWM Match Value */ + + +/* ============================================================================================================================ + Real-Time Clock + ============================================================================================================================ */ + +/* ============================================================================================================================ + RTC0 + ============================================================================================================================ */ +#define REG_RTC0_CR0 0x40001000 /* RTC0 RTC Control 0 */ +#define REG_RTC0_SR0 0x40001004 /* RTC0 RTC Status 0 */ +#define REG_RTC0_SR1 0x40001008 /* RTC0 RTC Status 1 */ +#define REG_RTC0_CNT0 0x4000100C /* RTC0 RTC Count 0 */ +#define REG_RTC0_CNT1 0x40001010 /* RTC0 RTC Count 1 */ +#define REG_RTC0_ALM0 0x40001014 /* RTC0 RTC Alarm 0 */ +#define REG_RTC0_ALM1 0x40001018 /* RTC0 RTC Alarm 1 */ +#define REG_RTC0_TRM 0x4000101C /* RTC0 RTC Trim */ +#define REG_RTC0_GWY 0x40001020 /* RTC0 RTC Gateway */ +#define REG_RTC0_CR1 0x40001028 /* RTC0 RTC Control 1 */ +#define REG_RTC0_SR2 0x4000102C /* RTC0 RTC Status 2 */ +#define REG_RTC0_SNAP0 0x40001030 /* RTC0 RTC Snapshot 0 */ +#define REG_RTC0_SNAP1 0x40001034 /* RTC0 RTC Snapshot 1 */ +#define REG_RTC0_SNAP2 0x40001038 /* RTC0 RTC Snapshot 2 */ +#define REG_RTC0_MOD 0x4000103C /* RTC0 RTC Modulo */ +#define REG_RTC0_CNT2 0x40001040 /* RTC0 RTC Count 2 */ +#define REG_RTC0_ALM2 0x40001044 /* RTC0 RTC Alarm 2 */ +#define REG_RTC0_SR3 0x40001048 /* RTC0 RTC Status 3 */ +#define REG_RTC0_CR2IC 0x4000104C /* RTC0 RTC Control 2 for Configuring Input Capture Channels */ +#define REG_RTC0_CR3SS 0x40001050 /* RTC0 RTC Control 3 for Configuring SensorStrobe Channel */ +#define REG_RTC0_CR4SS 0x40001054 /* RTC0 RTC Control 4 for Configuring SensorStrobe Channel */ +#define REG_RTC0_SSMSK 0x40001058 /* RTC0 RTC Mask for SensorStrobe Channel */ +#define REG_RTC0_IC2 0x40001064 /* RTC0 RTC Input Capture Channel 2 */ +#define REG_RTC0_IC3 0x40001068 /* RTC0 RTC Input Capture Channel 3 */ +#define REG_RTC0_IC4 0x4000106C /* RTC0 RTC Input Capture Channel 4 */ +#define REG_RTC0_SS1 0x40001070 /* RTC0 RTC SensorStrobe Channel 1 */ +#define REG_RTC0_SS2 0x40001074 /* RTC0 RTC SensorStrobe Channel 2 */ +#define REG_RTC0_SS3 0x40001078 /* RTC0 RTC SensorStrobe Channel 3 */ +#define REG_RTC0_SS4 0x4000107C /* RTC0 RTC SensorStrobe Channel 4 */ +#define REG_RTC0_SR4 0x40001080 /* RTC0 RTC Status 4 */ +#define REG_RTC0_SR5 0x40001084 /* RTC0 RTC Status 5 */ +#define REG_RTC0_SR6 0x40001088 /* RTC0 RTC Status 6 */ +#define REG_RTC0_SS1TGT 0x4000108C /* RTC0 RTC SensorStrobe Channel 1 Target */ +#define REG_RTC0_FRZCNT 0x40001090 /* RTC0 RTC Freeze Count */ +#define REG_RTC0_SS2TGT 0x40001094 /* RTC0 RTC SensorStrobe Channel 2 Target */ +#define REG_RTC0_SS3TGT 0x40001098 /* RTC0 RTC SensorStrobe Channel 3 Target */ +#define REG_RTC0_SS1LOWDUR 0x400010A0 /* RTC0 RTC Auto-Reload Low Duration for SensorStrobe Channel 1 */ +#define REG_RTC0_SS2LOWDUR 0x400010A4 /* RTC0 RTC Auto-Reload Low Duration for SensorStrobe Channel 2 */ +#define REG_RTC0_SS3LOWDUR 0x400010A8 /* RTC0 RTC Auto-Reload Low Duration for SensorStrobe Channel 3 */ +#define REG_RTC0_SS1HIGHDUR 0x400010B0 /* RTC0 RTC Auto-Reload High Duration for SensorStrobe Channel 1 */ +#define REG_RTC0_SS2HIGHDUR 0x400010B4 /* RTC0 RTC Auto-Reload High Duration for SensorStrobe Channel 2 */ +#define REG_RTC0_SS3HIGHDUR 0x400010B8 /* RTC0 RTC Auto-Reload High Duration for SensorStrobe Channel 3 */ +#define REG_RTC0_SSMSKOT 0x400010C0 /* RTC0 RTC Masks for SensorStrobe Channels on Time Control */ +#define REG_RTC0_CR5SSS 0x400010C4 /* RTC0 RTC Control 5 for Configuring SensorStrobe Channel GPIO Sampling */ +#define REG_RTC0_CR6SSS 0x400010C8 /* RTC0 RTC Control 6 for Configuring SensorStrobe Channel GPIO Sampling Edge */ +#define REG_RTC0_CR7SSS 0x400010CC /* RTC0 RTC Control 7 for Configuring SensorStrobe Channel GPIO Sampling Activity */ +#define REG_RTC0_SR7 0x400010D0 /* RTC0 RTC Status 7 */ +#define REG_RTC0_SR8 0x400010D4 /* RTC0 RTC Status 8 */ +#define REG_RTC0_SR9 0x400010D8 /* RTC0 RTC Status 9 */ +#define REG_RTC0_GPMUX0 0x400010E0 /* RTC0 RTC GPIO Pin Mux Control Register 0 */ +#define REG_RTC0_GPMUX1 0x400010E4 /* RTC0 RTC GPIO Pin Mux Control Register 1 */ + +/* ============================================================================================================================ + RTC1 + ============================================================================================================================ */ +#define REG_RTC1_CR0 0x40001400 /* RTC1 RTC Control 0 */ +#define REG_RTC1_SR0 0x40001404 /* RTC1 RTC Status 0 */ +#define REG_RTC1_SR1 0x40001408 /* RTC1 RTC Status 1 */ +#define REG_RTC1_CNT0 0x4000140C /* RTC1 RTC Count 0 */ +#define REG_RTC1_CNT1 0x40001410 /* RTC1 RTC Count 1 */ +#define REG_RTC1_ALM0 0x40001414 /* RTC1 RTC Alarm 0 */ +#define REG_RTC1_ALM1 0x40001418 /* RTC1 RTC Alarm 1 */ +#define REG_RTC1_TRM 0x4000141C /* RTC1 RTC Trim */ +#define REG_RTC1_GWY 0x40001420 /* RTC1 RTC Gateway */ +#define REG_RTC1_CR1 0x40001428 /* RTC1 RTC Control 1 */ +#define REG_RTC1_SR2 0x4000142C /* RTC1 RTC Status 2 */ +#define REG_RTC1_SNAP0 0x40001430 /* RTC1 RTC Snapshot 0 */ +#define REG_RTC1_SNAP1 0x40001434 /* RTC1 RTC Snapshot 1 */ +#define REG_RTC1_SNAP2 0x40001438 /* RTC1 RTC Snapshot 2 */ +#define REG_RTC1_MOD 0x4000143C /* RTC1 RTC Modulo */ +#define REG_RTC1_CNT2 0x40001440 /* RTC1 RTC Count 2 */ +#define REG_RTC1_ALM2 0x40001444 /* RTC1 RTC Alarm 2 */ +#define REG_RTC1_SR3 0x40001448 /* RTC1 RTC Status 3 */ +#define REG_RTC1_CR2IC 0x4000144C /* RTC1 RTC Control 2 for Configuring Input Capture Channels */ +#define REG_RTC1_CR3SS 0x40001450 /* RTC1 RTC Control 3 for Configuring SensorStrobe Channel */ +#define REG_RTC1_CR4SS 0x40001454 /* RTC1 RTC Control 4 for Configuring SensorStrobe Channel */ +#define REG_RTC1_SSMSK 0x40001458 /* RTC1 RTC Mask for SensorStrobe Channel */ +#define REG_RTC1_IC2 0x40001464 /* RTC1 RTC Input Capture Channel 2 */ +#define REG_RTC1_IC3 0x40001468 /* RTC1 RTC Input Capture Channel 3 */ +#define REG_RTC1_IC4 0x4000146C /* RTC1 RTC Input Capture Channel 4 */ +#define REG_RTC1_SS1 0x40001470 /* RTC1 RTC SensorStrobe Channel 1 */ +#define REG_RTC1_SS2 0x40001474 /* RTC1 RTC SensorStrobe Channel 2 */ +#define REG_RTC1_SS3 0x40001478 /* RTC1 RTC SensorStrobe Channel 3 */ +#define REG_RTC1_SS4 0x4000147C /* RTC1 RTC SensorStrobe Channel 4 */ +#define REG_RTC1_SR4 0x40001480 /* RTC1 RTC Status 4 */ +#define REG_RTC1_SR5 0x40001484 /* RTC1 RTC Status 5 */ +#define REG_RTC1_SR6 0x40001488 /* RTC1 RTC Status 6 */ +#define REG_RTC1_SS1TGT 0x4000148C /* RTC1 RTC SensorStrobe Channel 1 Target */ +#define REG_RTC1_FRZCNT 0x40001490 /* RTC1 RTC Freeze Count */ +#define REG_RTC1_SS2TGT 0x40001494 /* RTC1 RTC SensorStrobe Channel 2 Target */ +#define REG_RTC1_SS3TGT 0x40001498 /* RTC1 RTC SensorStrobe Channel 3 Target */ +#define REG_RTC1_SS1LOWDUR 0x400014A0 /* RTC1 RTC Auto-Reload Low Duration for SensorStrobe Channel 1 */ +#define REG_RTC1_SS2LOWDUR 0x400014A4 /* RTC1 RTC Auto-Reload Low Duration for SensorStrobe Channel 2 */ +#define REG_RTC1_SS3LOWDUR 0x400014A8 /* RTC1 RTC Auto-Reload Low Duration for SensorStrobe Channel 3 */ +#define REG_RTC1_SS1HIGHDUR 0x400014B0 /* RTC1 RTC Auto-Reload High Duration for SensorStrobe Channel 1 */ +#define REG_RTC1_SS2HIGHDUR 0x400014B4 /* RTC1 RTC Auto-Reload High Duration for SensorStrobe Channel 2 */ +#define REG_RTC1_SS3HIGHDUR 0x400014B8 /* RTC1 RTC Auto-Reload High Duration for SensorStrobe Channel 3 */ +#define REG_RTC1_SSMSKOT 0x400014C0 /* RTC1 RTC Masks for SensorStrobe Channels on Time Control */ +#define REG_RTC1_CR5SSS 0x400014C4 /* RTC1 RTC Control 5 for Configuring SensorStrobe Channel GPIO Sampling */ +#define REG_RTC1_CR6SSS 0x400014C8 /* RTC1 RTC Control 6 for Configuring SensorStrobe Channel GPIO Sampling Edge */ +#define REG_RTC1_CR7SSS 0x400014CC /* RTC1 RTC Control 7 for Configuring SensorStrobe Channel GPIO Sampling Activity */ +#define REG_RTC1_SR7 0x400014D0 /* RTC1 RTC Status 7 */ +#define REG_RTC1_SR8 0x400014D4 /* RTC1 RTC Status 8 */ +#define REG_RTC1_SR9 0x400014D8 /* RTC1 RTC Status 9 */ +#define REG_RTC1_GPMUX0 0x400014E0 /* RTC1 RTC GPIO Pin Mux Control Register 0 */ +#define REG_RTC1_GPMUX1 0x400014E4 /* RTC1 RTC GPIO Pin Mux Control Register 1 */ + +/* ============================================================================================================================ + RTC Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_CR0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_CR0_WPNDINTEN 15 /* Enable Write Pending Sourced Interrupts to the CPU */ +#define BITP_RTC_CR0_WSYNCINTEN 14 /* Enable Write Synchronization Sourced Interrupts to the CPU */ +#define BITP_RTC_CR0_WPNDERRINTEN 13 /* Enable Write Pending Error Sourced Interrupts to the CPU When an RTC Register-write Pending Error Occurs */ +#define BITP_RTC_CR0_ISOINTEN 12 /* Enable ISOINT Sourced Interrupts to the CPU When Isolation of the RTC Power Domain is Activated and Subsequently De-activated */ +#define BITP_RTC_CR0_MOD60ALMINTEN 11 /* Enable Periodic Modulo-60 RTC Alarm Sourced Interrupts to the CPU */ +#define BITP_RTC_CR0_MOD60ALM 5 /* Periodic, Modulo-60 Alarm Time in Prescaled RTC Time Units Beyond a Modulo-60 Boundary */ +#define BITP_RTC_CR0_MOD60ALMEN 4 /* Enable RTC Modulo-60 Counting of Time Past a Modulo-60 Boundary */ +#define BITP_RTC_CR0_TRMEN 3 /* Enable RTC Digital Trimming */ +#define BITP_RTC_CR0_ALMINTEN 2 /* Enable ALMINT Sourced Alarm Interrupts to the CPU */ +#define BITP_RTC_CR0_ALMEN 1 /* Enable the RTC Alarm (Absolute) Operation */ +#define BITP_RTC_CR0_CNTEN 0 /* Global Enable for the RTC */ +#define BITM_RTC_CR0_WPNDINTEN (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Enable Write Pending Sourced Interrupts to the CPU */ +#define BITM_RTC_CR0_WSYNCINTEN (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Enable Write Synchronization Sourced Interrupts to the CPU */ +#define BITM_RTC_CR0_WPNDERRINTEN (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Enable Write Pending Error Sourced Interrupts to the CPU When an RTC Register-write Pending Error Occurs */ +#define BITM_RTC_CR0_ISOINTEN (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Enable ISOINT Sourced Interrupts to the CPU When Isolation of the RTC Power Domain is Activated and Subsequently De-activated */ +#define BITM_RTC_CR0_MOD60ALMINTEN (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Enable Periodic Modulo-60 RTC Alarm Sourced Interrupts to the CPU */ +#define BITM_RTC_CR0_MOD60ALM (_ADI_MSK_3(0x000007E0,0x000007E0U, uint16_t )) /* Periodic, Modulo-60 Alarm Time in Prescaled RTC Time Units Beyond a Modulo-60 Boundary */ +#define BITM_RTC_CR0_MOD60ALMEN (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Enable RTC Modulo-60 Counting of Time Past a Modulo-60 Boundary */ +#define BITM_RTC_CR0_TRMEN (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Enable RTC Digital Trimming */ +#define BITM_RTC_CR0_ALMINTEN (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Enable ALMINT Sourced Alarm Interrupts to the CPU */ +#define BITM_RTC_CR0_ALMEN (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Enable the RTC Alarm (Absolute) Operation */ +#define BITM_RTC_CR0_CNTEN (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Global Enable for the RTC */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SR0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SR0_ISOENB 14 /* Visibility of 32kHz Sourced Registers */ +#define BITP_RTC_SR0_WSYNCTRM 13 /* Synchronisation Status of Posted Writes to TRM */ +#define BITP_RTC_SR0_WSYNCALM1 12 /* Synchronisation Status of Posted Writes to ALM1 */ +#define BITP_RTC_SR0_WSYNCALM0 11 /* Synchronisation Status of Posted Writes to ALM0 */ +#define BITP_RTC_SR0_WSYNCCNT1 10 /* Synchronisation Status of Posted Writes to CNT1 */ +#define BITP_RTC_SR0_WSYNCCNT0 9 /* Synchronisation Status of Posted Writes to CNT0 */ +#define BITP_RTC_SR0_WSYNCSR0 8 /* Synchronisation Status of Posted Writes to SR0 */ +#define BITP_RTC_SR0_WSYNCCR0 7 /* Synchronisation Status of Posted Writes to CR0 */ +#define BITP_RTC_SR0_WPNDINT 6 /* Write Pending Interrupt */ +#define BITP_RTC_SR0_WSYNCINT 5 /* Write Synchronisation Interrupt */ +#define BITP_RTC_SR0_WPNDERRINT 4 /* Write Pending Error Interrupt Source */ +#define BITP_RTC_SR0_ISOINT 3 /* RTC Power-Domain Isolation Interrupt Source */ +#define BITP_RTC_SR0_MOD60ALMINT 2 /* Modulo-60 RTC Alarm Interrupt Source */ +#define BITP_RTC_SR0_ALMINT 1 /* Alarm Interrupt Source */ +#define BITM_RTC_SR0_ISOENB (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Visibility of 32kHz Sourced Registers */ +#define BITM_RTC_SR0_WSYNCTRM (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Synchronisation Status of Posted Writes to TRM */ +#define BITM_RTC_SR0_WSYNCALM1 (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Synchronisation Status of Posted Writes to ALM1 */ +#define BITM_RTC_SR0_WSYNCALM0 (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Synchronisation Status of Posted Writes to ALM0 */ +#define BITM_RTC_SR0_WSYNCCNT1 (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Synchronisation Status of Posted Writes to CNT1 */ +#define BITM_RTC_SR0_WSYNCCNT0 (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Synchronisation Status of Posted Writes to CNT0 */ +#define BITM_RTC_SR0_WSYNCSR0 (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Synchronisation Status of Posted Writes to SR0 */ +#define BITM_RTC_SR0_WSYNCCR0 (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Synchronisation Status of Posted Writes to CR0 */ +#define BITM_RTC_SR0_WPNDINT (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Write Pending Interrupt */ +#define BITM_RTC_SR0_WSYNCINT (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Write Synchronisation Interrupt */ +#define BITM_RTC_SR0_WPNDERRINT (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Write Pending Error Interrupt Source */ +#define BITM_RTC_SR0_ISOINT (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* RTC Power-Domain Isolation Interrupt Source */ +#define BITM_RTC_SR0_MOD60ALMINT (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Modulo-60 RTC Alarm Interrupt Source */ +#define BITM_RTC_SR0_ALMINT (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Alarm Interrupt Source */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SR1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SR1_WPNDTRM 13 /* Pending Status of Posted Writes to TRM */ +#define BITP_RTC_SR1_WPNDALM1 12 /* Pending Status of Posted Writes to ALM1 */ +#define BITP_RTC_SR1_WPNDALM0 11 /* Pending Status of Posted Writes to ALM0 */ +#define BITP_RTC_SR1_WPNDCNT1 10 /* Pending Status of Posted Writes to CNT1 */ +#define BITP_RTC_SR1_WPNDCNT0 9 /* Pending Status of Posted Writes to CNT0 */ +#define BITP_RTC_SR1_WPNDSR0 8 /* Pending Status of Posted Clearances of Interrupt Sources in SR0 */ +#define BITP_RTC_SR1_WPNDCR0 7 /* Pending Status of Posted Writes to CR0 */ +#define BITM_RTC_SR1_WPNDTRM (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Pending Status of Posted Writes to TRM */ +#define BITM_RTC_SR1_WPNDALM1 (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Pending Status of Posted Writes to ALM1 */ +#define BITM_RTC_SR1_WPNDALM0 (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Pending Status of Posted Writes to ALM0 */ +#define BITM_RTC_SR1_WPNDCNT1 (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Pending Status of Posted Writes to CNT1 */ +#define BITM_RTC_SR1_WPNDCNT0 (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Pending Status of Posted Writes to CNT0 */ +#define BITM_RTC_SR1_WPNDSR0 (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Pending Status of Posted Clearances of Interrupt Sources in SR0 */ +#define BITM_RTC_SR1_WPNDCR0 (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Pending Status of Posted Writes to CR0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_CNT0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_CNT0_VALUE 0 /* Lower 16 Prescaled (Non-Fractional) Bits of the RTC Real-Time Count */ +#define BITM_RTC_CNT0_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Lower 16 Prescaled (Non-Fractional) Bits of the RTC Real-Time Count */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_CNT1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_CNT1_VALUE 0 /* Upper 16 Prescaled (Non-Fractional) Bits of the RTC Real-Time Count */ +#define BITM_RTC_CNT1_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Upper 16 Prescaled (Non-Fractional) Bits of the RTC Real-Time Count */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_ALM0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_ALM0_VALUE 0 /* Lower 16 Prescaled (i.e. Non-Fractional) Bits of the RTC Alarm Target Time */ +#define BITM_RTC_ALM0_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Lower 16 Prescaled (i.e. Non-Fractional) Bits of the RTC Alarm Target Time */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_ALM1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_ALM1_VALUE 0 /* Upper 16 Prescaled (Non-Fractional) Bits of the RTC Alarm Target Time */ +#define BITM_RTC_ALM1_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Upper 16 Prescaled (Non-Fractional) Bits of the RTC Alarm Target Time */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_TRM Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_TRM_IVL2EXPMIN 6 /* Minimum Power-of-two Interval of Prescaled RTC Time Units Which TRM:TRMIVL TRMIVL Can Select */ +#define BITP_RTC_TRM_IVL 4 /* Trim Interval in Prescaled RTC Time Units */ +#define BITP_RTC_TRM_ADD 3 /* Trim Polarity */ +#define BITP_RTC_TRM_VALUE 0 /* Trim Value in Prescaled RTC Time Units to Be Added or Subtracted from the RTC Count at the End of a Periodic Interval Selected by TRM:TRMIVL */ +#define BITM_RTC_TRM_IVL2EXPMIN (_ADI_MSK_3(0x000003C0,0x000003C0U, uint16_t )) /* Minimum Power-of-two Interval of Prescaled RTC Time Units Which TRM:TRMIVL TRMIVL Can Select */ +#define BITM_RTC_TRM_IVL (_ADI_MSK_3(0x00000030,0x00000030U, uint16_t )) /* Trim Interval in Prescaled RTC Time Units */ +#define BITM_RTC_TRM_ADD (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Trim Polarity */ +#define BITM_RTC_TRM_VALUE (_ADI_MSK_3(0x00000007,0x00000007U, uint16_t )) /* Trim Value in Prescaled RTC Time Units to Be Added or Subtracted from the RTC Count at the End of a Periodic Interval Selected by TRM:TRMIVL */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_GWY Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_GWY_SWKEY 0 /* Software-keyed Command Issued by the CPU */ +#define BITM_RTC_GWY_SWKEY (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Software-keyed Command Issued by the CPU */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_CR1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_CR1_PRESCALE2EXP 5 /* Prescale Power of 2 Division Factor for the RTC Base Clock */ +#define BITP_RTC_CR1_CNTMOD60ROLLINTEN 4 /* Enable for the RTC Modulo-60 Count Roll-Over Interrupt Source, in SR2:RTCCNTMOD60ROLLINT */ +#define BITP_RTC_CR1_CNTROLLINTEN 3 /* Enable for the RTC Count Roll-Over Interrupt Source, in SR2:RTCCNTROLLINT */ +#define BITP_RTC_CR1_TRMINTEN 2 /* Enable for the RTC Trim Interrupt Source, in SR2:RTCTRMINT */ +#define BITP_RTC_CR1_PSINTEN 1 /* Enable for the Prescaled, Modulo-1 Interrupt Source, in SR2:RTCPSINT */ +#define BITP_RTC_CR1_CNTINTEN 0 /* Enable for the RTC Count Interrupt Source */ +#define BITM_RTC_CR1_PRESCALE2EXP (_ADI_MSK_3(0x000001E0,0x000001E0U, uint16_t )) /* Prescale Power of 2 Division Factor for the RTC Base Clock */ +#define BITM_RTC_CR1_CNTMOD60ROLLINTEN (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Enable for the RTC Modulo-60 Count Roll-Over Interrupt Source, in SR2:RTCCNTMOD60ROLLINT */ +#define BITM_RTC_CR1_CNTROLLINTEN (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Enable for the RTC Count Roll-Over Interrupt Source, in SR2:RTCCNTROLLINT */ +#define BITM_RTC_CR1_TRMINTEN (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Enable for the RTC Trim Interrupt Source, in SR2:RTCTRMINT */ +#define BITM_RTC_CR1_PSINTEN (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Enable for the Prescaled, Modulo-1 Interrupt Source, in SR2:RTCPSINT */ +#define BITM_RTC_CR1_CNTINTEN (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Enable for the RTC Count Interrupt Source */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SR2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SR2_WSYNCALM2MIR 15 /* Synchronization Status of Posted Writes to ALM2 */ +#define BITP_RTC_SR2_WSYNCCR1MIR 14 /* Synchronization Status of Posted Writes to CR1 */ +#define BITP_RTC_SR2_WPNDALM2MIR 13 /* Pending Status of Posted Writes to ALM2 */ +#define BITP_RTC_SR2_WPNDCR1MIR 12 /* Pending Status of Posted Writes to CR1 */ +#define BITP_RTC_SR2_TRMBDYMIR 7 /* Mirror of MOD:RTCTRMBDY */ +#define BITP_RTC_SR2_CNTMOD60ROLL 6 /* RTC Count Modulo-60 Roll-Over */ +#define BITP_RTC_SR2_CNTROLL 5 /* RTC Count Roll-Over */ +#define BITP_RTC_SR2_CNTMOD60ROLLINT 4 /* RTC Modulo-60 Count Roll-Over Interrupt Source */ +#define BITP_RTC_SR2_CNTROLLINT 3 /* RTC Count Roll-Over Interrupt Source */ +#define BITP_RTC_SR2_TRMINT 2 /* RTC Trim Interrupt Source */ +#define BITP_RTC_SR2_PSINT 1 /* RTC Prescaled, Modulo-1 Boundary Interrupt Source */ +#define BITP_RTC_SR2_CNTINT 0 /* RTC Count Interrupt Source */ +#define BITM_RTC_SR2_WSYNCALM2MIR (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Synchronization Status of Posted Writes to ALM2 */ +#define BITM_RTC_SR2_WSYNCCR1MIR (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Synchronization Status of Posted Writes to CR1 */ +#define BITM_RTC_SR2_WPNDALM2MIR (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Pending Status of Posted Writes to ALM2 */ +#define BITM_RTC_SR2_WPNDCR1MIR (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Pending Status of Posted Writes to CR1 */ +#define BITM_RTC_SR2_TRMBDYMIR (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Mirror of MOD:RTCTRMBDY */ +#define BITM_RTC_SR2_CNTMOD60ROLL (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* RTC Count Modulo-60 Roll-Over */ +#define BITM_RTC_SR2_CNTROLL (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* RTC Count Roll-Over */ +#define BITM_RTC_SR2_CNTMOD60ROLLINT (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* RTC Modulo-60 Count Roll-Over Interrupt Source */ +#define BITM_RTC_SR2_CNTROLLINT (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* RTC Count Roll-Over Interrupt Source */ +#define BITM_RTC_SR2_TRMINT (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* RTC Trim Interrupt Source */ +#define BITM_RTC_SR2_PSINT (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* RTC Prescaled, Modulo-1 Boundary Interrupt Source */ +#define BITM_RTC_SR2_CNTINT (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* RTC Count Interrupt Source */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SNAP0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SNAP0_VALUE 0 /* Constituent Part of the 47-bit Input Capture Channel 0, Containing a Sticky Snapshot of CNT0 */ +#define BITM_RTC_SNAP0_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Constituent Part of the 47-bit Input Capture Channel 0, Containing a Sticky Snapshot of CNT0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SNAP1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SNAP1_VALUE 0 /* Part of the 47-bit Input Capture Channel 0 Containing a Sticky Snapshot of CNT1 */ +#define BITM_RTC_SNAP1_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Part of the 47-bit Input Capture Channel 0 Containing a Sticky Snapshot of CNT1 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SNAP2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SNAP2_VALUE 0 /* Part of the 47-bit Input Capture Channel 0 Containing a Sticky Snapshot of CNT2 */ +#define BITM_RTC_SNAP2_VALUE (_ADI_MSK_3(0x00007FFF,0x00007FFFU, uint16_t )) /* Part of the 47-bit Input Capture Channel 0 Containing a Sticky Snapshot of CNT2 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_MOD Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_MOD_CNT0_4TOZERO 11 /* Mirror of CNT0[4:0] */ +#define BITP_RTC_MOD_TRMBDY 10 /* Trim Boundary Indicator */ +#define BITP_RTC_MOD_INCR 6 /* Most Recent Increment Value Added to the RTC Count in CNT1 and CNT0 */ +#define BITP_RTC_MOD_CNTMOD60 0 /* Modulo-60 Value of the RTC Count: CNT1 and CNT0 */ +#define BITM_RTC_MOD_CNT0_4TOZERO (_ADI_MSK_3(0x0000F800,0x0000F800U, uint16_t )) /* Mirror of CNT0[4:0] */ +#define BITM_RTC_MOD_TRMBDY (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Trim Boundary Indicator */ +#define BITM_RTC_MOD_INCR (_ADI_MSK_3(0x000003C0,0x000003C0U, uint16_t )) /* Most Recent Increment Value Added to the RTC Count in CNT1 and CNT0 */ +#define BITM_RTC_MOD_CNTMOD60 (_ADI_MSK_3(0x0000003F,0x0000003FU, uint16_t )) /* Modulo-60 Value of the RTC Count: CNT1 and CNT0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_CNT2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_CNT2_VALUE 0 /* Fractional Bits of the RTC Real-Time Count */ +#define BITM_RTC_CNT2_VALUE (_ADI_MSK_3(0x00007FFF,0x00007FFFU, uint16_t )) /* Fractional Bits of the RTC Real-Time Count */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_ALM2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_ALM2_VALUE 0 /* Fractional Bits of the Alarm Target Time */ +#define BITM_RTC_ALM2_VALUE (_ADI_MSK_3(0x00007FFF,0x00007FFFU, uint16_t )) /* Fractional Bits of the Alarm Target Time */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SR3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SR3_ALMINTMIR 13 /* Read-only Mirror of the SR0:ALMINT Interrupt Source */ +#define BITP_RTC_SR3_SS4IRQ 12 /* Sticky Interrupt Source for the SensorStrobe Channel 4 */ +#define BITP_RTC_SR3_SS3IRQ 11 /* Sticky Interrupt Source for the SensorStrobe Channel 3 */ +#define BITP_RTC_SR3_SS2IRQ 10 /* Sticky Interrupt Source for the SensorStrobe Channel 2 */ +#define BITP_RTC_SR3_SS1IRQ 9 /* Sticky Interrupt Source for SensorStrobe Channel 1 */ +#define BITP_RTC_SR3_SS4FEIRQ 8 /* Sticky Interrupt Source for the SensorStrobe Channel 4 Falling Edge */ +#define BITP_RTC_SR3_SS3FEIRQ 7 /* Sticky Interrupt Source for the SensorStrobe Channel 3 Falling Edge */ +#define BITP_RTC_SR3_SS2FEIRQ 6 /* Sticky Interrupt Source for the SensorStrobe Channel 2 Falling Edge */ +#define BITP_RTC_SR3_SS1FEIRQ 5 /* Sticky Interrupt Source for the SensorStrobe Channel 1 Falling Edge */ +#define BITP_RTC_SR3_IC4IRQ 4 /* Sticky Interrupt Source for the RTC Input Capture Channel 4 */ +#define BITP_RTC_SR3_IC3IRQ 3 /* Sticky Interrupt Source for the RTC Input Capture Channel 3 */ +#define BITP_RTC_SR3_IC2IRQ 2 /* Sticky Interrupt Source for the RTC Input Capture Channel 2 */ +#define BITP_RTC_SR3_IC0IRQ 0 /* Sticky Interrupt Source for the RTC Input Capture Channel 0 */ +#define BITM_RTC_SR3_ALMINTMIR (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Read-only Mirror of the SR0:ALMINT Interrupt Source */ +#define BITM_RTC_SR3_SS4IRQ (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Sticky Interrupt Source for the SensorStrobe Channel 4 */ +#define BITM_RTC_SR3_SS3IRQ (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Sticky Interrupt Source for the SensorStrobe Channel 3 */ +#define BITM_RTC_SR3_SS2IRQ (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Sticky Interrupt Source for the SensorStrobe Channel 2 */ +#define BITM_RTC_SR3_SS1IRQ (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Sticky Interrupt Source for SensorStrobe Channel 1 */ +#define BITM_RTC_SR3_SS4FEIRQ (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Sticky Interrupt Source for the SensorStrobe Channel 4 Falling Edge */ +#define BITM_RTC_SR3_SS3FEIRQ (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Sticky Interrupt Source for the SensorStrobe Channel 3 Falling Edge */ +#define BITM_RTC_SR3_SS2FEIRQ (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Sticky Interrupt Source for the SensorStrobe Channel 2 Falling Edge */ +#define BITM_RTC_SR3_SS1FEIRQ (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Sticky Interrupt Source for the SensorStrobe Channel 1 Falling Edge */ +#define BITM_RTC_SR3_IC4IRQ (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Sticky Interrupt Source for the RTC Input Capture Channel 4 */ +#define BITM_RTC_SR3_IC3IRQ (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Sticky Interrupt Source for the RTC Input Capture Channel 3 */ +#define BITM_RTC_SR3_IC2IRQ (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Sticky Interrupt Source for the RTC Input Capture Channel 2 */ +#define BITM_RTC_SR3_IC0IRQ (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Sticky Interrupt Source for the RTC Input Capture Channel 0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_CR2IC Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_CR2IC_ICOWUSEN 15 /* Enable Overwrite of Unread Snapshots for All Input Capture Channels */ +#define BITP_RTC_CR2IC_IC4IRQEN 14 /* Interrupt Enable for the RTC Input Capture Channel 4 */ +#define BITP_RTC_CR2IC_IC3IRQEN 13 /* Interrupt Enable for the RTC Input Capture Channel 3 */ +#define BITP_RTC_CR2IC_IC2IRQEN 12 /* Interrupt Enable for the RTC Input Capture Channel 2 */ +#define BITP_RTC_CR2IC_IC0IRQEN 10 /* Interrupt Enable for the RTC Input Capture Channel 0 */ +#define BITP_RTC_CR2IC_IC4LH 9 /* Polarity of the Active-going Capture Edge for the Input Capture Channel 4 */ +#define BITP_RTC_CR2IC_IC3LH 8 /* Polarity of the Active-going Capture Edge for the Input Capture Channel 3 */ +#define BITP_RTC_CR2IC_IC2LH 7 /* Polarity of the Active-going Capture Edge for the Input Capture Channel 2 */ +#define BITP_RTC_CR2IC_IC0LH 5 /* Polarity of the Active-Going Capture Edge for the RTC Input Capture Channel 0 */ +#define BITP_RTC_CR2IC_IC4EN 4 /* Enable for the RTC Input Capture Channel 4 */ +#define BITP_RTC_CR2IC_IC3EN 3 /* Enable for the RTC Input Capture Channel 3 */ +#define BITP_RTC_CR2IC_IC2EN 2 /* Enable for the RTC Input Capture Channel 2 */ +#define BITP_RTC_CR2IC_IC0EN 0 /* Enable for the RTC Input Capture Channel 0 */ +#define BITM_RTC_CR2IC_ICOWUSEN (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Enable Overwrite of Unread Snapshots for All Input Capture Channels */ +#define BITM_RTC_CR2IC_IC4IRQEN (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Interrupt Enable for the RTC Input Capture Channel 4 */ +#define BITM_RTC_CR2IC_IC3IRQEN (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Interrupt Enable for the RTC Input Capture Channel 3 */ +#define BITM_RTC_CR2IC_IC2IRQEN (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Interrupt Enable for the RTC Input Capture Channel 2 */ +#define BITM_RTC_CR2IC_IC0IRQEN (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Interrupt Enable for the RTC Input Capture Channel 0 */ +#define BITM_RTC_CR2IC_IC4LH (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Polarity of the Active-going Capture Edge for the Input Capture Channel 4 */ +#define BITM_RTC_CR2IC_IC3LH (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Polarity of the Active-going Capture Edge for the Input Capture Channel 3 */ +#define BITM_RTC_CR2IC_IC2LH (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Polarity of the Active-going Capture Edge for the Input Capture Channel 2 */ +#define BITM_RTC_CR2IC_IC0LH (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Polarity of the Active-Going Capture Edge for the RTC Input Capture Channel 0 */ +#define BITM_RTC_CR2IC_IC4EN (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Enable for the RTC Input Capture Channel 4 */ +#define BITM_RTC_CR2IC_IC3EN (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Enable for the RTC Input Capture Channel 3 */ +#define BITM_RTC_CR2IC_IC2EN (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Enable for the RTC Input Capture Channel 2 */ +#define BITM_RTC_CR2IC_IC0EN (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Enable for the RTC Input Capture Channel 0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_CR3SS Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_CR3SS_SS4IRQEN 12 /* Posedge EdgeInterrupt Enable for the SensorStrobe Channel 4 */ +#define BITP_RTC_CR3SS_SS3IRQEN 11 /* Posedge EdgeInterrupt Enable for the SensorStrobe Channel 3 */ +#define BITP_RTC_CR3SS_SS2IRQEN 10 /* Posedge EdgeInterrupt Enable for the SensorStrobe Channel 2 */ +#define BITP_RTC_CR3SS_SS1IRQEN 9 /* Interrupt Enable for SensorStrobe Channel 1 */ +#define BITP_RTC_CR3SS_SS4FEIRQEN 8 /* Falling Edge Interrupt Enable for the SensorStrobe Channel 4 */ +#define BITP_RTC_CR3SS_SS3FEIRQEN 7 /* Falling Edge Interrupt Enable for the SensorStrobe Channel 3 */ +#define BITP_RTC_CR3SS_SS2FEIRQEN 6 /* Falling Edge Interrupt Enable for the SensorStrobe Channel 2 */ +#define BITP_RTC_CR3SS_SS1FEIRQEN 5 /* Falling Edge Interrupt Enable for the SensorStrobe Channel 1 */ +#define BITP_RTC_CR3SS_SS4EN 4 /* Enable for the SensorStrobe Channel 4 */ +#define BITP_RTC_CR3SS_SS3EN 3 /* Enable for the SensorStrobe Channel 3 */ +#define BITP_RTC_CR3SS_SS2EN 2 /* Enable for the SensorStrobe Channel 2 */ +#define BITP_RTC_CR3SS_SS1EN 1 /* Enable for SensorStrobe Channel 1 */ +#define BITM_RTC_CR3SS_SS4IRQEN (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Posedge EdgeInterrupt Enable for the SensorStrobe Channel 4 */ +#define BITM_RTC_CR3SS_SS3IRQEN (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Posedge EdgeInterrupt Enable for the SensorStrobe Channel 3 */ +#define BITM_RTC_CR3SS_SS2IRQEN (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Posedge EdgeInterrupt Enable for the SensorStrobe Channel 2 */ +#define BITM_RTC_CR3SS_SS1IRQEN (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Interrupt Enable for SensorStrobe Channel 1 */ +#define BITM_RTC_CR3SS_SS4FEIRQEN (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Falling Edge Interrupt Enable for the SensorStrobe Channel 4 */ +#define BITM_RTC_CR3SS_SS3FEIRQEN (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Falling Edge Interrupt Enable for the SensorStrobe Channel 3 */ +#define BITM_RTC_CR3SS_SS2FEIRQEN (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Falling Edge Interrupt Enable for the SensorStrobe Channel 2 */ +#define BITM_RTC_CR3SS_SS1FEIRQEN (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Falling Edge Interrupt Enable for the SensorStrobe Channel 1 */ +#define BITM_RTC_CR3SS_SS4EN (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Enable for the SensorStrobe Channel 4 */ +#define BITM_RTC_CR3SS_SS3EN (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Enable for the SensorStrobe Channel 3 */ +#define BITM_RTC_CR3SS_SS2EN (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Enable for the SensorStrobe Channel 2 */ +#define BITM_RTC_CR3SS_SS1EN (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Enable for SensorStrobe Channel 1 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_CR4SS Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_CR4SS_SS3ARLEN 11 /* Enable for Fine Control on SensorStrobe Channel 3 Period and Duty Cycle */ +#define BITP_RTC_CR4SS_SS2ARLEN 10 /* Enable for Fine Control on SensorStrobe Channel 2 Period and Duty Cycle */ +#define BITP_RTC_CR4SS_SS1ARLEN 9 /* Enable for Fine Control on SensorStrobe Channel 1 Period and Duty Cycle */ +#define BITP_RTC_CR4SS_SS4POL 8 /* SensorStrobe Channel 4 Polarity Control */ +#define BITP_RTC_CR4SS_SS3POL 7 /* SensorStrobe Channel 3 Polarity Control */ +#define BITP_RTC_CR4SS_SS2POL 6 /* SensorStrobe Channel 2 Polarity Control */ +#define BITP_RTC_CR4SS_SS1POL 5 /* SensorSTrobe Channel 1 Polarity Control */ +#define BITP_RTC_CR4SS_SS4MSKEN 4 /* Enable for Thermometer-Code Masking of the SensorStrobe Channel 4 */ +#define BITP_RTC_CR4SS_SS3MSKEN 3 /* Enable for Thermometer-Code Masking of the SensorStrobe Channel 3 */ +#define BITP_RTC_CR4SS_SS2MSKEN 2 /* Enable for Thermometer-Code Masking of the SensorStrobe Channel 2 */ +#define BITP_RTC_CR4SS_SS1MSKEN 1 /* Enable for Thermometer-Code Masking of the SensorStrobe Channel 1 */ +#define BITM_RTC_CR4SS_SS3ARLEN (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Enable for Fine Control on SensorStrobe Channel 3 Period and Duty Cycle */ +#define BITM_RTC_CR4SS_SS2ARLEN (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Enable for Fine Control on SensorStrobe Channel 2 Period and Duty Cycle */ +#define BITM_RTC_CR4SS_SS1ARLEN (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Enable for Fine Control on SensorStrobe Channel 1 Period and Duty Cycle */ +#define BITM_RTC_CR4SS_SS4POL (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* SensorStrobe Channel 4 Polarity Control */ +#define BITM_RTC_CR4SS_SS3POL (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* SensorStrobe Channel 3 Polarity Control */ +#define BITM_RTC_CR4SS_SS2POL (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* SensorStrobe Channel 2 Polarity Control */ +#define BITM_RTC_CR4SS_SS1POL (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* SensorSTrobe Channel 1 Polarity Control */ +#define BITM_RTC_CR4SS_SS4MSKEN (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Enable for Thermometer-Code Masking of the SensorStrobe Channel 4 */ +#define BITM_RTC_CR4SS_SS3MSKEN (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Enable for Thermometer-Code Masking of the SensorStrobe Channel 3 */ +#define BITM_RTC_CR4SS_SS2MSKEN (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Enable for Thermometer-Code Masking of the SensorStrobe Channel 2 */ +#define BITM_RTC_CR4SS_SS1MSKEN (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Enable for Thermometer-Code Masking of the SensorStrobe Channel 1 */ +#define ENUM_RTC_CR4SS_NO_MSK (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* SS1MSKEN: Do not apply a mask to SensorStrobe Channel 1 Register */ +#define ENUM_RTC_CR4SS_THERM_MSK (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* SS1MSKEN: Apply thermometer decoded mask */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SSMSK Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SSMSK_SS4MSK 12 /* SensorStrobe Channel 4 Period Control */ +#define BITP_RTC_SSMSK_SS3MSK 8 /* SensorStrobe Channel 3 Period Control */ +#define BITP_RTC_SSMSK_SS2MSK 4 /* SensorStrobe Channel 2 Period Control */ +#define BITP_RTC_SSMSK_SS1MSK 0 /* Concatenation of Thermometer-Encoded Masks for the 16-bit SensorStrobe Channels */ +#define BITM_RTC_SSMSK_SS4MSK (_ADI_MSK_3(0x0000F000,0x0000F000U, uint16_t )) /* SensorStrobe Channel 4 Period Control */ +#define BITM_RTC_SSMSK_SS3MSK (_ADI_MSK_3(0x00000F00,0x00000F00U, uint16_t )) /* SensorStrobe Channel 3 Period Control */ +#define BITM_RTC_SSMSK_SS2MSK (_ADI_MSK_3(0x000000F0,0x000000F0U, uint16_t )) /* SensorStrobe Channel 2 Period Control */ +#define BITM_RTC_SSMSK_SS1MSK (_ADI_MSK_3(0x0000000F,0x0000000FU, uint16_t )) /* Concatenation of Thermometer-Encoded Masks for the 16-bit SensorStrobe Channels */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_IC2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_IC2_IC2 0 /* RTC Input Capture Channel 2 */ +#define BITM_RTC_IC2_IC2 (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* RTC Input Capture Channel 2 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_IC3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_IC3_IC3 0 /* RTC Input Capture Channel 3 */ +#define BITM_RTC_IC3_IC3 (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* RTC Input Capture Channel 3 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_IC4 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_IC4_IC4 0 /* RTC Input Capture Channel 4 */ +#define BITM_RTC_IC4_IC4 (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* RTC Input Capture Channel 4 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SS1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SS1_SS1 0 /* SensorStrobe Channel 1 */ +#define BITM_RTC_SS1_SS1 (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* SensorStrobe Channel 1 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SS2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SS2_SS2 0 /* SensorStrobe Channel 2 */ +#define BITM_RTC_SS2_SS2 (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* SensorStrobe Channel 2 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SS3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SS3_SS3 0 /* SensorStrobe Channel 3 */ +#define BITM_RTC_SS3_SS3 (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* SensorStrobe Channel 3 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SS4 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SS4_SS4 0 /* SensorStrobe Channel 4 */ +#define BITM_RTC_SS4_SS4 (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* SensorStrobe Channel 4 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SR4 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SR4_WSYNCSSMSKOT 15 /* Synchronization Status of Posted Reads Writes to Mask for SensorStrobe Channels on Time Control Register */ +#define BITP_RTC_SR4_RSYNCIC4 14 /* Synchronization Status of Posted Reads of RTC Input Channel 4 */ +#define BITP_RTC_SR4_RSYNCIC3 13 /* Synchronization Status of Posted Reads of RTC Input Channel 3 */ +#define BITP_RTC_SR4_RSYNCIC2 12 /* Synchronization Status of Posted Reads of RTC Input Channel 2 */ +#define BITP_RTC_SR4_RSYNCIC0 10 /* Synchronization Status of Posted Reads of RTC Input Channel 0 */ +#define BITP_RTC_SR4_WSYNCSS4 9 /* Synchronization Status of Posted Writes to SensorStrobe Channel 4 */ +#define BITP_RTC_SR4_WSYNCSS3 8 /* Synchronization Status of Posted Writes to SensorStrobe Channel 3 */ +#define BITP_RTC_SR4_WSYNCSS2 7 /* Synchronization Status of Posted Writes to SensorStrobe Channel 2 */ +#define BITP_RTC_SR4_WSYNCSS1 6 /* Synchronization Status of Posted Writes to SensorStrobe Channel 1 */ +#define BITP_RTC_SR4_WSYNCSSMSK 4 /* Synchronization Status of Posted Writes to Masks for SensorStrobe Channel Register */ +#define BITP_RTC_SR4_WSYNCCR4SS 3 /* Synchronization Status of Posted Writes to RTC Control 4 for Configuring SensorStrobe Channel Register */ +#define BITP_RTC_SR4_WSYNCCR3SS 2 /* Synchronization Status of Posted Writes to RTC Control 3 for Configuring SensorStrobe Channel Register */ +#define BITP_RTC_SR4_WSYNCCR2IC 1 /* Synchronization Status of Posted Writes to RTC Control 2 for Configuring Input Capture Channels Register */ +#define BITP_RTC_SR4_WSYNCSR3 0 /* Synchronisation Status of Posted Writes to SR3 */ +#define BITM_RTC_SR4_WSYNCSSMSKOT (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Synchronization Status of Posted Reads Writes to Mask for SensorStrobe Channels on Time Control Register */ +#define BITM_RTC_SR4_RSYNCIC4 (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Synchronization Status of Posted Reads of RTC Input Channel 4 */ +#define BITM_RTC_SR4_RSYNCIC3 (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Synchronization Status of Posted Reads of RTC Input Channel 3 */ +#define BITM_RTC_SR4_RSYNCIC2 (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Synchronization Status of Posted Reads of RTC Input Channel 2 */ +#define BITM_RTC_SR4_RSYNCIC0 (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Synchronization Status of Posted Reads of RTC Input Channel 0 */ +#define BITM_RTC_SR4_WSYNCSS4 (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Synchronization Status of Posted Writes to SensorStrobe Channel 4 */ +#define BITM_RTC_SR4_WSYNCSS3 (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Synchronization Status of Posted Writes to SensorStrobe Channel 3 */ +#define BITM_RTC_SR4_WSYNCSS2 (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Synchronization Status of Posted Writes to SensorStrobe Channel 2 */ +#define BITM_RTC_SR4_WSYNCSS1 (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Synchronization Status of Posted Writes to SensorStrobe Channel 1 */ +#define BITM_RTC_SR4_WSYNCSSMSK (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Synchronization Status of Posted Writes to Masks for SensorStrobe Channel Register */ +#define BITM_RTC_SR4_WSYNCCR4SS (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Synchronization Status of Posted Writes to RTC Control 4 for Configuring SensorStrobe Channel Register */ +#define BITM_RTC_SR4_WSYNCCR3SS (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Synchronization Status of Posted Writes to RTC Control 3 for Configuring SensorStrobe Channel Register */ +#define BITM_RTC_SR4_WSYNCCR2IC (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Synchronization Status of Posted Writes to RTC Control 2 for Configuring Input Capture Channels Register */ +#define BITM_RTC_SR4_WSYNCSR3 (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Synchronisation Status of Posted Writes to SR3 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SR5 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SR5_WPENDSSMSKOT 15 /* Pending Status of Posted Writes to RTC Masks for SensorStrobe Channel Register */ +#define BITP_RTC_SR5_RPENDIC4 14 /* Pending Status of Posted Reads of IC4 */ +#define BITP_RTC_SR5_RPENDIC3 13 /* Pending Status of Posted Reads of IC3 */ +#define BITP_RTC_SR5_RPENDIC2 12 /* Pending Status of Posted Reads of IC2 */ +#define BITP_RTC_SR5_RPENDIC0 10 /* Pending Status of Posted Reads of Input Capture Channel 0 */ +#define BITP_RTC_SR5_WPENDSS4 9 /* Pending Status of Posted Writes to SensorStrobe Channel 4 */ +#define BITP_RTC_SR5_WPENDSS3 8 /* Pending Status of Posted Writes to SensorStrobe Channel 3 */ +#define BITP_RTC_SR5_WPENDSS2 7 /* Pending Status of Posted Writes to SensorStrobe Channel 2 */ +#define BITP_RTC_SR5_WPENDSS1 6 /* Pending Status of Posted Writes to SensorStrobe Channel 1 */ +#define BITP_RTC_SR5_WPENDSSMSK 4 /* Pending Status of Posted Writes to RTC Masks for SensorStrobe Channel Register */ +#define BITP_RTC_SR5_WPENDCR4SS 3 /* Pending Status of Posted Writes to RTC Control 4 for Configuring SensorStrobe Channel Register */ +#define BITP_RTC_SR5_WPENDCR3SS 2 /* Pending Status of Posted Writes to RTC Control 3 for Configuring SensorStrobe Channel Register */ +#define BITP_RTC_SR5_WPENDCR2IC 1 /* Pending Status of Posted Writes to RTC Control 2 for Configuring Input Capture Channels Register */ +#define BITP_RTC_SR5_WPENDSR3 0 /* Pending Status of Posted Clearances of Interrupt Sources in RTC Status 3 Register */ +#define BITM_RTC_SR5_WPENDSSMSKOT (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Pending Status of Posted Writes to RTC Masks for SensorStrobe Channel Register */ +#define BITM_RTC_SR5_RPENDIC4 (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Pending Status of Posted Reads of IC4 */ +#define BITM_RTC_SR5_RPENDIC3 (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Pending Status of Posted Reads of IC3 */ +#define BITM_RTC_SR5_RPENDIC2 (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Pending Status of Posted Reads of IC2 */ +#define BITM_RTC_SR5_RPENDIC0 (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Pending Status of Posted Reads of Input Capture Channel 0 */ +#define BITM_RTC_SR5_WPENDSS4 (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Pending Status of Posted Writes to SensorStrobe Channel 4 */ +#define BITM_RTC_SR5_WPENDSS3 (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Pending Status of Posted Writes to SensorStrobe Channel 3 */ +#define BITM_RTC_SR5_WPENDSS2 (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Pending Status of Posted Writes to SensorStrobe Channel 2 */ +#define BITM_RTC_SR5_WPENDSS1 (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Pending Status of Posted Writes to SensorStrobe Channel 1 */ +#define BITM_RTC_SR5_WPENDSSMSK (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Pending Status of Posted Writes to RTC Masks for SensorStrobe Channel Register */ +#define BITM_RTC_SR5_WPENDCR4SS (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Pending Status of Posted Writes to RTC Control 4 for Configuring SensorStrobe Channel Register */ +#define BITM_RTC_SR5_WPENDCR3SS (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Pending Status of Posted Writes to RTC Control 3 for Configuring SensorStrobe Channel Register */ +#define BITM_RTC_SR5_WPENDCR2IC (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Pending Status of Posted Writes to RTC Control 2 for Configuring Input Capture Channels Register */ +#define BITM_RTC_SR5_WPENDSR3 (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Pending Status of Posted Clearances of Interrupt Sources in RTC Status 3 Register */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SR6 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SR6_FRZCNTPTR 9 /* Pointer for the Triple-Read Sequence of FRZCNT */ +#define BITP_RTC_SR6_IC0SNAP 8 /* Confirmation That RTC Snapshot 0, 1, 2 Registers Reflect the Value of Input-Capture Channel RTC Input Capture Channel 0 */ +#define BITP_RTC_SR6_IC4UNR 4 /* Sticky Unread Status of the Input Capture Channel 4 */ +#define BITP_RTC_SR6_IC3UNR 3 /* Sticky Unread Status of the Input Capture Channel 3 */ +#define BITP_RTC_SR6_IC2UNR 2 /* Sticky Unread Status of the Input Capture Channel 2 */ +#define BITP_RTC_SR6_IC0UNR 0 /* Sticky Unread Status of the Input Capture Channel 0 */ +#define BITM_RTC_SR6_FRZCNTPTR (_ADI_MSK_3(0x00000600,0x00000600U, uint16_t )) /* Pointer for the Triple-Read Sequence of FRZCNT */ +#define BITM_RTC_SR6_IC0SNAP (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Confirmation That RTC Snapshot 0, 1, 2 Registers Reflect the Value of Input-Capture Channel RTC Input Capture Channel 0 */ +#define BITM_RTC_SR6_IC4UNR (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Sticky Unread Status of the Input Capture Channel 4 */ +#define BITM_RTC_SR6_IC3UNR (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Sticky Unread Status of the Input Capture Channel 3 */ +#define BITM_RTC_SR6_IC2UNR (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Sticky Unread Status of the Input Capture Channel 2 */ +#define BITM_RTC_SR6_IC0UNR (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Sticky Unread Status of the Input Capture Channel 0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SS1TGT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SS1TGT_SS1TGT 0 /* Current Target Value for the SensorStrobe Channel 1 */ +#define BITM_RTC_SS1TGT_SS1TGT (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Current Target Value for the SensorStrobe Channel 1 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_FRZCNT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_FRZCNT_FRZCNT 0 /* RTC Freeze Count. Coherent, Triple 16-Bit Read of the 47-Bit RTC Count */ +#define BITM_RTC_FRZCNT_FRZCNT (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* RTC Freeze Count. Coherent, Triple 16-Bit Read of the 47-Bit RTC Count */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SS2TGT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SS2TGT_SS2TGT 0 /* Current, Cumulative Target Time for SensorStrobe Channel 2, Taking Account of Any Auto-reloading */ +#define BITM_RTC_SS2TGT_SS2TGT (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Current, Cumulative Target Time for SensorStrobe Channel 2, Taking Account of Any Auto-reloading */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SS3TGT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SS3TGT_SS3TGT 0 /* Current, Cumulative Target Time for SensorStrobe Channel 3, Taking Account of Any Auto-reloading */ +#define BITM_RTC_SS3TGT_SS3TGT (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Current, Cumulative Target Time for SensorStrobe Channel 3, Taking Account of Any Auto-reloading */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SS1LOWDUR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SS1LOWDUR_SS1LOWDUR 0 /* Low Duration for SensorStrobe Channel 1. */ +#define BITM_RTC_SS1LOWDUR_SS1LOWDUR (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Low Duration for SensorStrobe Channel 1. */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SS2LOWDUR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SS2LOWDUR_SS2LOWDUR 0 /* Low Duration for SensorStrobe Channel 2. */ +#define BITM_RTC_SS2LOWDUR_SS2LOWDUR (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Low Duration for SensorStrobe Channel 2. */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SS3LOWDUR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SS3LOWDUR_SS3LOWDUR 0 /* Low Duration for SensorStrobe Channel 3. */ +#define BITM_RTC_SS3LOWDUR_SS3LOWDUR (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Low Duration for SensorStrobe Channel 3. */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SS1HIGHDUR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SS1HIGHDUR_SS1HIGHDUR 0 /* High Duration for SensorStrobe Channel 1. */ +#define BITM_RTC_SS1HIGHDUR_SS1HIGHDUR (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* High Duration for SensorStrobe Channel 1. */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SS2HIGHDUR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SS2HIGHDUR_SS2HIGHDUR 0 /* High Duration for SensorStrobe Channel 2. */ +#define BITM_RTC_SS2HIGHDUR_SS2HIGHDUR (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* High Duration for SensorStrobe Channel 2. */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SS3HIGHDUR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SS3HIGHDUR_SS3HIGHDUR 0 /* High Duration for SensorStrobe Channel 3. */ +#define BITM_RTC_SS3HIGHDUR_SS3HIGHDUR (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* High Duration for SensorStrobe Channel 3. */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SSMSKOT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SSMSKOT_SS4MSKOT 12 /* SensorStrobe Channel 4 on Time Control */ +#define BITP_RTC_SSMSKOT_SS3MSKOT 8 /* SensorStrobe Channel 3 on Time Control */ +#define BITP_RTC_SSMSKOT_SS2MSKOT 4 /* SensorStrobe Channel 2 on Time Control */ +#define BITP_RTC_SSMSKOT_SS1MSKOT 0 /* Concatenation of Thermometer-encoded Masks for the 16-bit SensorStrobe Channels */ +#define BITM_RTC_SSMSKOT_SS4MSKOT (_ADI_MSK_3(0x0000F000,0x0000F000U, uint16_t )) /* SensorStrobe Channel 4 on Time Control */ +#define BITM_RTC_SSMSKOT_SS3MSKOT (_ADI_MSK_3(0x00000F00,0x00000F00U, uint16_t )) /* SensorStrobe Channel 3 on Time Control */ +#define BITM_RTC_SSMSKOT_SS2MSKOT (_ADI_MSK_3(0x000000F0,0x000000F0U, uint16_t )) /* SensorStrobe Channel 2 on Time Control */ +#define BITM_RTC_SSMSKOT_SS1MSKOT (_ADI_MSK_3(0x0000000F,0x0000000FU, uint16_t )) /* Concatenation of Thermometer-encoded Masks for the 16-bit SensorStrobe Channels */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_CR5SSS Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_CR5SSS_SS3SMPMTCHIRQEN 11 /* Sample Activity Interrupt Enable for SensorStrobe Channel 3 */ +#define BITP_RTC_CR5SSS_SS3SMPEN 8 /* GPIO Input Sample Enable for SensorStrobe Channel 3 */ +#define BITP_RTC_CR5SSS_SS2SMPMTCHIRQEN 7 /* Sample Activity Interrupt Enable for SensorStrobe Channel 2 */ +#define BITP_RTC_CR5SSS_SS2SMPEN 4 /* GPIO Input Sample Enable for SensorStrobe Channel 2 */ +#define BITP_RTC_CR5SSS_SS1SMPMTCHIRQEN 3 /* Sample Activity Interrupt Enable for SensorStrobe Channel 1 */ +#define BITP_RTC_CR5SSS_SS1SMPEN 0 /* GPIO Input Sample Enable for SensorStrobe Channel 1 */ +#define BITM_RTC_CR5SSS_SS3SMPMTCHIRQEN (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Sample Activity Interrupt Enable for SensorStrobe Channel 3 */ +#define BITM_RTC_CR5SSS_SS3SMPEN (_ADI_MSK_3(0x00000700,0x00000700U, uint16_t )) /* GPIO Input Sample Enable for SensorStrobe Channel 3 */ +#define BITM_RTC_CR5SSS_SS2SMPMTCHIRQEN (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Sample Activity Interrupt Enable for SensorStrobe Channel 2 */ +#define BITM_RTC_CR5SSS_SS2SMPEN (_ADI_MSK_3(0x00000070,0x00000070U, uint16_t )) /* GPIO Input Sample Enable for SensorStrobe Channel 2 */ +#define BITM_RTC_CR5SSS_SS1SMPMTCHIRQEN (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Sample Activity Interrupt Enable for SensorStrobe Channel 1 */ +#define BITM_RTC_CR5SSS_SS1SMPEN (_ADI_MSK_3(0x00000007,0x00000007U, uint16_t )) /* GPIO Input Sample Enable for SensorStrobe Channel 1 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_CR6SSS Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_CR6SSS_SS3SMPONRE 10 /* GPIO Sample Around Rising Edge of SensorStrobe Channel 3 */ +#define BITP_RTC_CR6SSS_SS3SMPONFE 8 /* GPIO Sample Around Falling Edge of SensorStrobe Channel 3 */ +#define BITP_RTC_CR6SSS_SS2SMPONRE 6 /* GPIO Sample Around Rising Edge of SensorStrobe Channel 2 */ +#define BITP_RTC_CR6SSS_SS2SMPONFE 4 /* GPIO Sample Around Falling Edge of SensorStrobe Channel 2 */ +#define BITP_RTC_CR6SSS_SS1SMPONRE 2 /* GPIO Sample Around Rising Edge of SensorStrobe Channel 1 */ +#define BITP_RTC_CR6SSS_SS1SMPONFE 0 /* GPIO Sample Around Falling Edge of SensorStrobe Channel 1 */ +#define BITM_RTC_CR6SSS_SS3SMPONRE (_ADI_MSK_3(0x00000C00,0x00000C00U, uint16_t )) /* GPIO Sample Around Rising Edge of SensorStrobe Channel 3 */ +#define BITM_RTC_CR6SSS_SS3SMPONFE (_ADI_MSK_3(0x00000300,0x00000300U, uint16_t )) /* GPIO Sample Around Falling Edge of SensorStrobe Channel 3 */ +#define BITM_RTC_CR6SSS_SS2SMPONRE (_ADI_MSK_3(0x000000C0,0x000000C0U, uint16_t )) /* GPIO Sample Around Rising Edge of SensorStrobe Channel 2 */ +#define BITM_RTC_CR6SSS_SS2SMPONFE (_ADI_MSK_3(0x00000030,0x00000030U, uint16_t )) /* GPIO Sample Around Falling Edge of SensorStrobe Channel 2 */ +#define BITM_RTC_CR6SSS_SS1SMPONRE (_ADI_MSK_3(0x0000000C,0x0000000CU, uint16_t )) /* GPIO Sample Around Rising Edge of SensorStrobe Channel 1 */ +#define BITM_RTC_CR6SSS_SS1SMPONFE (_ADI_MSK_3(0x00000003,0x00000003U, uint16_t )) /* GPIO Sample Around Falling Edge of SensorStrobe Channel 1 */ +#define ENUM_RTC_CR6SSS_SS3NORES (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* SS3SMPONRE: No sampling of input around rising edge */ +#define ENUM_RTC_CR6SSS_SS3BRES (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* SS3SMPONRE: Input sampled one clock cycle before rising edge of the SensorStrobe channel 3 */ +#define ENUM_RTC_CR6SSS_SS3RES (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* SS3SMPONRE: Input sampled at rising edge of the SensorStrobe channel 3 */ +#define ENUM_RTC_CR6SSS_SS3ARES (_ADI_MSK_3(0x00000C00,0x00000C00U, uint16_t )) /* SS3SMPONRE: Input sampled one clock cycle after rising edge of the SensorStrobe channel 3 */ +#define ENUM_RTC_CR6SSS_SS3NOFES (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* SS3SMPONFE: No sampling of input around falling edge */ +#define ENUM_RTC_CR6SSS_SS3BFES (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* SS3SMPONFE: Input sampled one clock cycle before falling edge of the SensorStrobe channel 3 */ +#define ENUM_RTC_CR6SSS_SS3FES (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* SS3SMPONFE: Input sampled at falling edge of the SensorStrobe channel 3 */ +#define ENUM_RTC_CR6SSS_SS3AFES (_ADI_MSK_3(0x00000300,0x00000300U, uint16_t )) /* SS3SMPONFE: Input sampled one clock cycle after falling edge of the SensorStrobe channel 3 */ +#define ENUM_RTC_CR6SSS_SS2NORES (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* SS2SMPONRE: No sampling of input around rising edge */ +#define ENUM_RTC_CR6SSS_SS2BRES (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* SS2SMPONRE: Input sampled one clock cycle before rising edge of the SensorStrobe channel 2 */ +#define ENUM_RTC_CR6SSS_SS2RES (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* SS2SMPONRE: Input sampled at rising edge of the SensorStrobe channel 2 */ +#define ENUM_RTC_CR6SSS_SS2ARES (_ADI_MSK_3(0x000000C0,0x000000C0U, uint16_t )) /* SS2SMPONRE: Input sampled one clock cycle after rising edge of the SensorStrobe channel 2 */ +#define ENUM_RTC_CR6SSS_SS2NOFES (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* SS2SMPONFE: No sampling of input around falling edge */ +#define ENUM_RTC_CR6SSS_SS2BFES (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* SS2SMPONFE: Input sampled one clock cycle before falling edge of the SensorStrobe channel 2 */ +#define ENUM_RTC_CR6SSS_SS2FES (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* SS2SMPONFE: Input sampled at falling edge of the SensorStrobe channel 2 */ +#define ENUM_RTC_CR6SSS_SS2AFES (_ADI_MSK_3(0x00000030,0x00000030U, uint16_t )) /* SS2SMPONFE: Input sampled one clock cycle after falling edge of the SensorStrobe channel 2 */ +#define ENUM_RTC_CR6SSS_SS1NORES (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* SS1SMPONRE: No sampling of input around rising edge */ +#define ENUM_RTC_CR6SSS_SS1BRES (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* SS1SMPONRE: Input sampled one clock cycle before rising edge of the SensorStrobe channel 1 */ +#define ENUM_RTC_CR6SSS_SS1RES (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* SS1SMPONRE: Input sampled at rising edge of the SensorStrobe channel 1 */ +#define ENUM_RTC_CR6SSS_SS1ARES (_ADI_MSK_3(0x0000000C,0x0000000CU, uint16_t )) /* SS1SMPONRE: Input sampled one clock cycle after rising edge of the SensorStrobe channel 1 */ +#define ENUM_RTC_CR6SSS_SS1NOFES (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* SS1SMPONFE: No sampling of input around falling edge */ +#define ENUM_RTC_CR6SSS_SS1BFES (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* SS1SMPONFE: Input sampled one clock cycle before falling edge of the SensorStrobe channel 1 */ +#define ENUM_RTC_CR6SSS_SS1FES (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* SS1SMPONFE: Input sampled at falling edge of the SensorStrobe channel 1 */ +#define ENUM_RTC_CR6SSS_SS1AFES (_ADI_MSK_3(0x00000003,0x00000003U, uint16_t )) /* SS1SMPONFE: Input sampled one clock cycle after falling edge of the SensorStrobe channel 1 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_CR7SSS Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_CR7SSS_SS3SMPPTRN 13 /* Sample Activity Selection for SensorStrobe Channel 3 */ +#define BITP_RTC_CR7SSS_SS3SMPEXP 10 /* Expected GPIO Sample for SensorStrobe Channel 3 */ +#define BITP_RTC_CR7SSS_SS2SMPPTRN 8 /* Sample Activity Selection for SensorStrobe Channel 2 */ +#define BITP_RTC_CR7SSS_SS2SMPEXP 5 /* Expected GPIO Sample for SensorStrobe Channel 2 */ +#define BITP_RTC_CR7SSS_SS1SMPPTRN 3 /* Sample Activity Selection for SensorStrobe Channel 1 */ +#define BITP_RTC_CR7SSS_SS1SMPEXP 0 /* Expected GPIO Sample for SensorStrobe Channel 1 */ +#define BITM_RTC_CR7SSS_SS3SMPPTRN (_ADI_MSK_3(0x00006000,0x00006000U, uint16_t )) /* Sample Activity Selection for SensorStrobe Channel 3 */ +#define BITM_RTC_CR7SSS_SS3SMPEXP (_ADI_MSK_3(0x00001C00,0x00001C00U, uint16_t )) /* Expected GPIO Sample for SensorStrobe Channel 3 */ +#define BITM_RTC_CR7SSS_SS2SMPPTRN (_ADI_MSK_3(0x00000300,0x00000300U, uint16_t )) /* Sample Activity Selection for SensorStrobe Channel 2 */ +#define BITM_RTC_CR7SSS_SS2SMPEXP (_ADI_MSK_3(0x000000E0,0x000000E0U, uint16_t )) /* Expected GPIO Sample for SensorStrobe Channel 2 */ +#define BITM_RTC_CR7SSS_SS1SMPPTRN (_ADI_MSK_3(0x00000018,0x00000018U, uint16_t )) /* Sample Activity Selection for SensorStrobe Channel 1 */ +#define BITM_RTC_CR7SSS_SS1SMPEXP (_ADI_MSK_3(0x00000007,0x00000007U, uint16_t )) /* Expected GPIO Sample for SensorStrobe Channel 1 */ +#define ENUM_RTC_CR7SSS_SS3SMPCHNG (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* SS3SMPPTRN: Current GPIO sample is not same as previous sample */ +#define ENUM_RTC_CR7SSS_SS3SMPSAME (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* SS3SMPPTRN: Current GPIO sample is same as previous sample */ +#define ENUM_RTC_CR7SSS_SS3SMPMTCH (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* SS3SMPPTRN: Current GPIO sample is same as expected sample */ +#define ENUM_RTC_CR7SSS_SS3SMPNOMTCH (_ADI_MSK_3(0x00006000,0x00006000U, uint16_t )) /* SS3SMPPTRN: Current GPIO sample is not same as expected sample */ +#define ENUM_RTC_CR7SSS_SS2SMPCHNG (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* SS2SMPPTRN: Current GPIO sample is not same as previous sample */ +#define ENUM_RTC_CR7SSS_SS2SMPSAME (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* SS2SMPPTRN: Current GPIO sample is same as previous sample */ +#define ENUM_RTC_CR7SSS_SS2SMPMTCH (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* SS2SMPPTRN: Current GPIO sample is same as expected sample */ +#define ENUM_RTC_CR7SSS_SS2SMPNOMTCH (_ADI_MSK_3(0x00000300,0x00000300U, uint16_t )) /* SS2SMPPTRN: Current GPIO sample is not same as expected sample */ +#define ENUM_RTC_CR7SSS_SS1SMPCHNG (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* SS1SMPPTRN: Current GPIO sample is not same as previous sample */ +#define ENUM_RTC_CR7SSS_SS1SMPSAME (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* SS1SMPPTRN: Current GPIO sample is same as previous sample */ +#define ENUM_RTC_CR7SSS_SS1SMPMTCH (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* SS1SMPPTRN: Current GPIO sample is same as expected sample */ +#define ENUM_RTC_CR7SSS_SS1SMPNOMTCH (_ADI_MSK_3(0x00000018,0x00000018U, uint16_t )) /* SS1SMPPTRN: Current GPIO sample is not same as expected sample */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SR7 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SR7_SS4OUT 15 /* Output Value for SensorStrobe Channel 4 */ +#define BITP_RTC_SR7_SS3OUT 14 /* Output Value for SensorStrobe Channel 3 */ +#define BITP_RTC_SR7_SS2OUT 13 /* Output Value for SensorStrobe Channel 2 */ +#define BITP_RTC_SR7_SS1OUT 12 /* Output Value for SensorStrobe Channel 1 */ +#define BITP_RTC_SR7_SS3SMPMTCHIRQ 11 /* Sticky Status of GPIO Sample Pattern Match for SensorStrobe Channel 3 */ +#define BITP_RTC_SR7_SS3SMP 8 /* Latest GPIO Sample for SensorStrobe Channel 3 */ +#define BITP_RTC_SR7_SS2SMPMTCHIRQ 7 /* Sticky Status of GPIO Sample Pattern Match for SensorStrobe Channel 2 */ +#define BITP_RTC_SR7_SS2SMP 4 /* Latest GPIO Sample for SensorStrobe Channel 2 */ +#define BITP_RTC_SR7_SS1SMPMTCHIRQ 3 /* Sticky Status of GPIO Sample Pattern Match for SensorStrobe Channel 1 */ +#define BITP_RTC_SR7_SS1SMP 0 /* Latest GPIO Sample for SensorStrobe Channel 1 */ +#define BITM_RTC_SR7_SS4OUT (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Output Value for SensorStrobe Channel 4 */ +#define BITM_RTC_SR7_SS3OUT (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Output Value for SensorStrobe Channel 3 */ +#define BITM_RTC_SR7_SS2OUT (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Output Value for SensorStrobe Channel 2 */ +#define BITM_RTC_SR7_SS1OUT (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Output Value for SensorStrobe Channel 1 */ +#define BITM_RTC_SR7_SS3SMPMTCHIRQ (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Sticky Status of GPIO Sample Pattern Match for SensorStrobe Channel 3 */ +#define BITM_RTC_SR7_SS3SMP (_ADI_MSK_3(0x00000700,0x00000700U, uint16_t )) /* Latest GPIO Sample for SensorStrobe Channel 3 */ +#define BITM_RTC_SR7_SS2SMPMTCHIRQ (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Sticky Status of GPIO Sample Pattern Match for SensorStrobe Channel 2 */ +#define BITM_RTC_SR7_SS2SMP (_ADI_MSK_3(0x00000070,0x00000070U, uint16_t )) /* Latest GPIO Sample for SensorStrobe Channel 2 */ +#define BITM_RTC_SR7_SS1SMPMTCHIRQ (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Sticky Status of GPIO Sample Pattern Match for SensorStrobe Channel 1 */ +#define BITM_RTC_SR7_SS1SMP (_ADI_MSK_3(0x00000007,0x00000007U, uint16_t )) /* Latest GPIO Sample for SensorStrobe Channel 1 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SR8 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SR8_WSYNCGPMUX1 13 /* Synchronisation Status of Posted Writes to GPIO Pin Mux Control Register 1 */ +#define BITP_RTC_SR8_WSYNCGPMUX0 12 /* Synchronisation Status of Posted Writes to GPIO Pin Mux Control Register 0 */ +#define BITP_RTC_SR8_WSYNCSR7 11 /* Synchronisation Status of Posted Writes to Status 7 Register */ +#define BITP_RTC_SR8_WSYNCCR7SSS 10 /* Synchronisation Status of Posted Writes to Control 7 for Configuring SensorStrobe Channel Register */ +#define BITP_RTC_SR8_WSYNCCR6SSS 9 /* Synchronisation Status of Posted Writes to Control 6 for Configuring SensorStrobe Channel Register */ +#define BITP_RTC_SR8_WSYNCCR5SSS 8 /* Synchronisation Status of Posted Writes to Control 5 for Configuring SensorStrobe Channel Register */ +#define BITP_RTC_SR8_WSYNCSS3HIGHDUR 6 /* Synchronisation Status of Posted Writes to SensorStrobe Channel 3 High Duration Register */ +#define BITP_RTC_SR8_WSYNCSS2HIGHDUR 5 /* Synchronisation Status of Posted Writes to SensorStrobe Channel 2 High Duration Register */ +#define BITP_RTC_SR8_WSYNCSS1HIGHDUR 4 /* Synchronisation Status of Posted Writes to SensorStrobe Channel 1 High Duration Register */ +#define BITP_RTC_SR8_WSYNCSS3LOWDUR 2 /* Synchronisation Status of Posted Writes to SensorStrobe Channel 3 Low Duration Register */ +#define BITP_RTC_SR8_WSYNCSS2LOWDUR 1 /* Synchronisation Status of Posted Writes to SensorStrobe Channel 2 Low Duration Register */ +#define BITP_RTC_SR8_WSYNCSS1LOWDUR 0 /* Synchronisation Status of Posted Writes to SensorStrobe Channel 1 Low Duration Register */ +#define BITM_RTC_SR8_WSYNCGPMUX1 (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Synchronisation Status of Posted Writes to GPIO Pin Mux Control Register 1 */ +#define BITM_RTC_SR8_WSYNCGPMUX0 (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Synchronisation Status of Posted Writes to GPIO Pin Mux Control Register 0 */ +#define BITM_RTC_SR8_WSYNCSR7 (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Synchronisation Status of Posted Writes to Status 7 Register */ +#define BITM_RTC_SR8_WSYNCCR7SSS (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Synchronisation Status of Posted Writes to Control 7 for Configuring SensorStrobe Channel Register */ +#define BITM_RTC_SR8_WSYNCCR6SSS (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Synchronisation Status of Posted Writes to Control 6 for Configuring SensorStrobe Channel Register */ +#define BITM_RTC_SR8_WSYNCCR5SSS (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Synchronisation Status of Posted Writes to Control 5 for Configuring SensorStrobe Channel Register */ +#define BITM_RTC_SR8_WSYNCSS3HIGHDUR (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Synchronisation Status of Posted Writes to SensorStrobe Channel 3 High Duration Register */ +#define BITM_RTC_SR8_WSYNCSS2HIGHDUR (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Synchronisation Status of Posted Writes to SensorStrobe Channel 2 High Duration Register */ +#define BITM_RTC_SR8_WSYNCSS1HIGHDUR (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Synchronisation Status of Posted Writes to SensorStrobe Channel 1 High Duration Register */ +#define BITM_RTC_SR8_WSYNCSS3LOWDUR (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Synchronisation Status of Posted Writes to SensorStrobe Channel 3 Low Duration Register */ +#define BITM_RTC_SR8_WSYNCSS2LOWDUR (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Synchronisation Status of Posted Writes to SensorStrobe Channel 2 Low Duration Register */ +#define BITM_RTC_SR8_WSYNCSS1LOWDUR (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Synchronisation Status of Posted Writes to SensorStrobe Channel 1 Low Duration Register */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_SR9 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_SR9_WPENDGPMUX1 13 /* Pending Status of Posted Writes to GPMUX1 */ +#define BITP_RTC_SR9_WPENDGPMUX0 12 /* Pending Status of Posted Writes to GPMUX0 */ +#define BITP_RTC_SR9_WPENDSR7 11 /* Pending Status of Posted Writes to SR7 */ +#define BITP_RTC_SR9_WPENDCR7SSS 10 /* Pending Status of Posted Writes to Control 7 for Configuring SensorStrobe Channel Register */ +#define BITP_RTC_SR9_WPENDCR6SSS 9 /* Pending Status of Posted Writes to Control 6 for Configuring SensorStrobe Channel Register */ +#define BITP_RTC_SR9_WPENDCR5SSS 8 /* Pending Status of Posted Writes to Control 5 for Configuring SensorStrobe Channel Register */ +#define BITP_RTC_SR9_WPENDSS3HIGHDUR 6 /* Pending Status of Posted Writes to SensortStrobe Channel 3 High Duration Register */ +#define BITP_RTC_SR9_WPENDSS2HIGHDUR 5 /* Pending Status of Posted Writes to SensortStrobe Channel 2 High Duration Register */ +#define BITP_RTC_SR9_WPENDSS1HIGHDUR 4 /* Pending Status of Posted Writes to SensortStrobe Channel 1 High Duration Register */ +#define BITP_RTC_SR9_WPENDSS3LOWDUR 2 /* Pending Status of Posted Writes to SensortStrobe Channel 3 Low Duration Register */ +#define BITP_RTC_SR9_WPENDSS2LOWDUR 1 /* Pending Status of Posted Writes to SensortStrobe Channel 2 Low Duration Register */ +#define BITP_RTC_SR9_WPENDSS1LOWDUR 0 /* Pending Status of Posted Writes to SensortStrobe Channel 1 Low Duration Register */ +#define BITM_RTC_SR9_WPENDGPMUX1 (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Pending Status of Posted Writes to GPMUX1 */ +#define BITM_RTC_SR9_WPENDGPMUX0 (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Pending Status of Posted Writes to GPMUX0 */ +#define BITM_RTC_SR9_WPENDSR7 (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Pending Status of Posted Writes to SR7 */ +#define BITM_RTC_SR9_WPENDCR7SSS (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Pending Status of Posted Writes to Control 7 for Configuring SensorStrobe Channel Register */ +#define BITM_RTC_SR9_WPENDCR6SSS (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Pending Status of Posted Writes to Control 6 for Configuring SensorStrobe Channel Register */ +#define BITM_RTC_SR9_WPENDCR5SSS (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Pending Status of Posted Writes to Control 5 for Configuring SensorStrobe Channel Register */ +#define BITM_RTC_SR9_WPENDSS3HIGHDUR (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Pending Status of Posted Writes to SensortStrobe Channel 3 High Duration Register */ +#define BITM_RTC_SR9_WPENDSS2HIGHDUR (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Pending Status of Posted Writes to SensortStrobe Channel 2 High Duration Register */ +#define BITM_RTC_SR9_WPENDSS1HIGHDUR (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Pending Status of Posted Writes to SensortStrobe Channel 1 High Duration Register */ +#define BITM_RTC_SR9_WPENDSS3LOWDUR (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Pending Status of Posted Writes to SensortStrobe Channel 3 Low Duration Register */ +#define BITM_RTC_SR9_WPENDSS2LOWDUR (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Pending Status of Posted Writes to SensortStrobe Channel 2 Low Duration Register */ +#define BITM_RTC_SR9_WPENDSS1LOWDUR (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Pending Status of Posted Writes to SensortStrobe Channel 1 Low Duration Register */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_GPMUX0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_GPMUX0_SS2GPIN1SEL 12 /* GPIO Mux Selection for SensorStrobe Channel 2 Input 1 */ +#define BITP_RTC_GPMUX0_SS2GPIN0SEL 9 /* GPIO Mux Selection for SensorStrobe Channel 2 Input 0 */ +#define BITP_RTC_GPMUX0_SS1GPIN2SEL 6 /* GPIO Mux Selection for SensorStrobe Channel 1 Input 2 */ +#define BITP_RTC_GPMUX0_SS1GPIN1SEL 3 /* GPIO Mux Selection for SensorStrobe Channel 1 Input 1 */ +#define BITP_RTC_GPMUX0_SS1GPIN0SEL 0 /* GPIO Mux Selection for SensorStrobe Channel 1 Input0 */ +#define BITM_RTC_GPMUX0_SS2GPIN1SEL (_ADI_MSK_3(0x00007000,0x00007000U, uint16_t )) /* GPIO Mux Selection for SensorStrobe Channel 2 Input 1 */ +#define BITM_RTC_GPMUX0_SS2GPIN0SEL (_ADI_MSK_3(0x00000E00,0x00000E00U, uint16_t )) /* GPIO Mux Selection for SensorStrobe Channel 2 Input 0 */ +#define BITM_RTC_GPMUX0_SS1GPIN2SEL (_ADI_MSK_3(0x000001C0,0x000001C0U, uint16_t )) /* GPIO Mux Selection for SensorStrobe Channel 1 Input 2 */ +#define BITM_RTC_GPMUX0_SS1GPIN1SEL (_ADI_MSK_3(0x00000038,0x00000038U, uint16_t )) /* GPIO Mux Selection for SensorStrobe Channel 1 Input 1 */ +#define BITM_RTC_GPMUX0_SS1GPIN0SEL (_ADI_MSK_3(0x00000007,0x00000007U, uint16_t )) /* GPIO Mux Selection for SensorStrobe Channel 1 Input0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RTC_GPMUX1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RTC_GPMUX1_SS3DIFFOUT 15 /* Differential SensorStrobe Out Option for SensorStrobe Channel 3 */ +#define BITP_RTC_GPMUX1_SS1DIFFOUT 14 /* Differential SensorStrobe Out Option for SensorStrobe Channel 1 */ +#define BITP_RTC_GPMUX1_SS3GPIN2SEL 9 /* GPIO Mux Selection for SensorStrobe Channel 3 Input 2 */ +#define BITP_RTC_GPMUX1_SS3GPIN1SEL 6 /* GPIO Mux Selection for SensorStrobe Channel 3 Input 1 */ +#define BITP_RTC_GPMUX1_SS3GPIN0SEL 3 /* GPIO Mux Selection for SensorStrobe Channel 3 Input 0 */ +#define BITP_RTC_GPMUX1_SS2GPIN2SEL 0 /* GPIO Mux Selection for SensorStrobe Channel 2 Input 2 */ +#define BITM_RTC_GPMUX1_SS3DIFFOUT (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Differential SensorStrobe Out Option for SensorStrobe Channel 3 */ +#define BITM_RTC_GPMUX1_SS1DIFFOUT (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Differential SensorStrobe Out Option for SensorStrobe Channel 1 */ +#define BITM_RTC_GPMUX1_SS3GPIN2SEL (_ADI_MSK_3(0x00000E00,0x00000E00U, uint16_t )) /* GPIO Mux Selection for SensorStrobe Channel 3 Input 2 */ +#define BITM_RTC_GPMUX1_SS3GPIN1SEL (_ADI_MSK_3(0x000001C0,0x000001C0U, uint16_t )) /* GPIO Mux Selection for SensorStrobe Channel 3 Input 1 */ +#define BITM_RTC_GPMUX1_SS3GPIN0SEL (_ADI_MSK_3(0x00000038,0x00000038U, uint16_t )) /* GPIO Mux Selection for SensorStrobe Channel 3 Input 0 */ +#define BITM_RTC_GPMUX1_SS2GPIN2SEL (_ADI_MSK_3(0x00000007,0x00000007U, uint16_t )) /* GPIO Mux Selection for SensorStrobe Channel 2 Input 2 */ + + +/* ============================================================================================================================ + System Identification and Debug Enable + ============================================================================================================================ */ + +/* ============================================================================================================================ + SYS + ============================================================================================================================ */ +#define REG_SYS_ADIID 0x40002020 /* SYS ADI Identification */ +#define REG_SYS_CHIPID 0x40002024 /* SYS Chip Identifier */ +#define REG_SYS_SWDEN 0x40002040 /* SYS Serial Wire Debug Enable */ + +/* ============================================================================================================================ + SYS Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + SYS_ADIID Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SYS_ADIID_VALUE 0 /* Reads a fixed value of 0x4144 to indicate to debuggers that they are connected to an Analog Devices implemented Cortex based part */ +#define BITM_SYS_ADIID_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Reads a fixed value of 0x4144 to indicate to debuggers that they are connected to an Analog Devices implemented Cortex based part */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SYS_CHIPID Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SYS_CHIPID_PARTID 4 /* Part identifier */ +#define BITP_SYS_CHIPID_REV 0 /* Silicon revision */ +#define BITM_SYS_CHIPID_PARTID (_ADI_MSK_3(0x0000FFF0,0x0000FFF0U, uint16_t )) /* Part identifier */ +#define BITM_SYS_CHIPID_REV (_ADI_MSK_3(0x0000000F,0x0000000FU, uint16_t )) /* Silicon revision */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SYS_SWDEN Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SYS_SWDEN_VALUE 0 /* To enable SWD interface */ +#define BITM_SYS_SWDEN_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* To enable SWD interface */ + + +/* ============================================================================================================================ + Watchdog Timer + ============================================================================================================================ */ + +/* ============================================================================================================================ + WDT0 + ============================================================================================================================ */ +#define REG_WDT0_LOAD 0x40002C00 /* WDT0 Load Value */ +#define REG_WDT0_CCNT 0x40002C04 /* WDT0 Current Count Value */ +#define REG_WDT0_CTL 0x40002C08 /* WDT0 Control */ +#define REG_WDT0_RESTART 0x40002C0C /* WDT0 Clear Interrupt */ +#define REG_WDT0_STAT 0x40002C18 /* WDT0 Status */ + +/* ============================================================================================================================ + WDT Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + WDT_LOAD Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_WDT_LOAD_VALUE 0 /* Load Value */ +#define BITM_WDT_LOAD_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Load Value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + WDT_CCNT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_WDT_CCNT_VALUE 0 /* Current Count Value */ +#define BITM_WDT_CCNT_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Current Count Value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + WDT_CTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_WDT_CTL_SPARE 7 /* Unused Spare Bit */ +#define BITP_WDT_CTL_MODE 6 /* Timer Mode */ +#define BITP_WDT_CTL_EN 5 /* Timer Enable */ +#define BITP_WDT_CTL_PRE 2 /* Prescaler */ +#define BITP_WDT_CTL_IRQ 1 /* Timer Interrupt */ +#define BITM_WDT_CTL_SPARE (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Unused Spare Bit */ +#define BITM_WDT_CTL_MODE (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Timer Mode */ +#define BITM_WDT_CTL_EN (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Timer Enable */ +#define BITM_WDT_CTL_PRE (_ADI_MSK_3(0x0000000C,0x0000000CU, uint16_t )) /* Prescaler */ +#define BITM_WDT_CTL_IRQ (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Timer Interrupt */ +#define ENUM_WDT_CTL_FREE_RUN (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* MODE: Free running mode */ +#define ENUM_WDT_CTL_PERIODIC (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* MODE: Periodic mode */ +#define ENUM_WDT_CTL_WDT_DIS (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* EN: WDT not enabled */ +#define ENUM_WDT_CTL_WDT_EN (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* EN: WDT enabled */ +#define ENUM_WDT_CTL_DIV1 (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* PRE: Source clock/1 */ +#define ENUM_WDT_CTL_DIV16 (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* PRE: Source clock/16 */ +#define ENUM_WDT_CTL_DIV256 (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* PRE: Source clock/256 (default) */ +#define ENUM_WDT_CTL_RST (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* IRQ: WDT asserts reset when timed out */ +#define ENUM_WDT_CTL_INT (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* IRQ: WDT generates interrupt when timed out */ + +/* ------------------------------------------------------------------------------------------------------------------------- + WDT_RESTART Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_WDT_RESTART_CLRWORD 0 /* Clear Watchdog */ +#define BITM_WDT_RESTART_CLRWORD (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Clear Watchdog */ + +/* ------------------------------------------------------------------------------------------------------------------------- + WDT_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_WDT_STAT_RSTCTL 5 /* Reset Control Register Written and Locked */ +#define BITP_WDT_STAT_LOCKED 4 /* Lock Status Bit */ +#define BITP_WDT_STAT_COUNTING 3 /* Control Register Write Sync in Progress */ +#define BITP_WDT_STAT_LOADING 2 /* Load Register Write Sync in Progress */ +#define BITP_WDT_STAT_CLRIRQ 1 /* Clear Interrupt Register Write Sync in Progress */ +#define BITP_WDT_STAT_IRQ 0 /* WDT Interrupt */ +#define BITM_WDT_STAT_RSTCTL (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Reset Control Register Written and Locked */ +#define BITM_WDT_STAT_LOCKED (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Lock Status Bit */ +#define BITM_WDT_STAT_COUNTING (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Control Register Write Sync in Progress */ +#define BITM_WDT_STAT_LOADING (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Load Register Write Sync in Progress */ +#define BITM_WDT_STAT_CLRIRQ (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Clear Interrupt Register Write Sync in Progress */ +#define BITM_WDT_STAT_IRQ (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* WDT Interrupt */ + + +/* ============================================================================================================================ + I2C Master/Slave + ============================================================================================================================ */ + +/* ============================================================================================================================ + I2C0 + ============================================================================================================================ */ +#define REG_I2C0_MCTL 0x40003000 /* I2C0 Master Control */ +#define REG_I2C0_MSTAT 0x40003004 /* I2C0 Master Status */ +#define REG_I2C0_MRX 0x40003008 /* I2C0 Master Receive Data */ +#define REG_I2C0_MTX 0x4000300C /* I2C0 Master Transmit Data */ +#define REG_I2C0_MRXCNT 0x40003010 /* I2C0 Master Receive Data Count */ +#define REG_I2C0_MCRXCNT 0x40003014 /* I2C0 Master Current Receive Data Count */ +#define REG_I2C0_ADDR1 0x40003018 /* I2C0 Master Address Byte 1 */ +#define REG_I2C0_ADDR2 0x4000301C /* I2C0 Master Address Byte 2 */ +#define REG_I2C0_BYT 0x40003020 /* I2C0 Start Byte */ +#define REG_I2C0_DIV 0x40003024 /* I2C0 Serial Clock Period Divisor */ +#define REG_I2C0_SCTL 0x40003028 /* I2C0 Slave Control */ +#define REG_I2C0_SSTAT 0x4000302C /* I2C0 Slave I2C Status/Error/IRQ */ +#define REG_I2C0_SRX 0x40003030 /* I2C0 Slave Receive */ +#define REG_I2C0_STX 0x40003034 /* I2C0 Slave Transmit */ +#define REG_I2C0_ALT 0x40003038 /* I2C0 Hardware General Call ID */ +#define REG_I2C0_ID0 0x4000303C /* I2C0 First Slave Address Device ID */ +#define REG_I2C0_ID1 0x40003040 /* I2C0 Second Slave Address Device ID */ +#define REG_I2C0_ID2 0x40003044 /* I2C0 Third Slave Address Device ID */ +#define REG_I2C0_ID3 0x40003048 /* I2C0 Fourth Slave Address Device ID */ +#define REG_I2C0_STAT 0x4000304C /* I2C0 Master and Slave FIFO Status */ +#define REG_I2C0_SHCTL 0x40003050 /* I2C0 Shared Control */ +#define REG_I2C0_TCTL 0x40003054 /* I2C0 Timing Control Register */ +#define REG_I2C0_ASTRETCH_SCL 0x40003058 /* I2C0 Automatic Stretch SCL */ + +/* ============================================================================================================================ + I2C Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_MCTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_MCTL_STOPBUSCLR 13 /* Prestop Bus Clear */ +#define BITP_I2C_MCTL_BUSCLR 12 /* Bus-Clear Enable */ +#define BITP_I2C_MCTL_MTXDMA 11 /* Enable Master Tx DMA Request */ +#define BITP_I2C_MCTL_MRXDMA 10 /* Enable Master Rx DMA Request */ +#define BITP_I2C_MCTL_MXMITDEC 9 /* Decrement Master Tx FIFO Status When a Byte Txed */ +#define BITP_I2C_MCTL_IENCMP 8 /* Transaction Completed (or Stop Detected) Interrupt Enable */ +#define BITP_I2C_MCTL_IENACK 7 /* ACK Not Received Interrupt Enable */ +#define BITP_I2C_MCTL_IENALOST 6 /* Arbitration Lost Interrupt Enable */ +#define BITP_I2C_MCTL_IENMTX 5 /* Transmit Request Interrupt Enable */ +#define BITP_I2C_MCTL_IENMRX 4 /* Receive Request Interrupt Enable */ +#define BITP_I2C_MCTL_STRETCHSCL 3 /* Stretch SCL Enable */ +#define BITP_I2C_MCTL_LOOPBACK 2 /* Internal Loopback Enable */ +#define BITP_I2C_MCTL_COMPLETE 1 /* Start Back-off Disable */ +#define BITP_I2C_MCTL_MASEN 0 /* Master Enable */ +#define BITM_I2C_MCTL_STOPBUSCLR (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Prestop Bus Clear */ +#define BITM_I2C_MCTL_BUSCLR (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Bus-Clear Enable */ +#define BITM_I2C_MCTL_MTXDMA (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Enable Master Tx DMA Request */ +#define BITM_I2C_MCTL_MRXDMA (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Enable Master Rx DMA Request */ +#define BITM_I2C_MCTL_MXMITDEC (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Decrement Master Tx FIFO Status When a Byte Txed */ +#define BITM_I2C_MCTL_IENCMP (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Transaction Completed (or Stop Detected) Interrupt Enable */ +#define BITM_I2C_MCTL_IENACK (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* ACK Not Received Interrupt Enable */ +#define BITM_I2C_MCTL_IENALOST (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Arbitration Lost Interrupt Enable */ +#define BITM_I2C_MCTL_IENMTX (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Transmit Request Interrupt Enable */ +#define BITM_I2C_MCTL_IENMRX (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Receive Request Interrupt Enable */ +#define BITM_I2C_MCTL_STRETCHSCL (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Stretch SCL Enable */ +#define BITM_I2C_MCTL_LOOPBACK (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Internal Loopback Enable */ +#define BITM_I2C_MCTL_COMPLETE (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Start Back-off Disable */ +#define BITM_I2C_MCTL_MASEN (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Master Enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_MSTAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_MSTAT_SCLFILT 14 /* State of SCL Line */ +#define BITP_I2C_MSTAT_SDAFILT 13 /* State of SDA Line */ +#define BITP_I2C_MSTAT_MTXUNDR 12 /* Master Transmit Underflow */ +#define BITP_I2C_MSTAT_MSTOP 11 /* STOP Driven by This I2C Master */ +#define BITP_I2C_MSTAT_LINEBUSY 10 /* Line is Busy */ +#define BITP_I2C_MSTAT_MRXOVR 9 /* Master Receive FIFO Overflow */ +#define BITP_I2C_MSTAT_TCOMP 8 /* Transaction Complete or Stop Detected */ +#define BITP_I2C_MSTAT_NACKDATA 7 /* ACK Not Received in Response to Data Write */ +#define BITP_I2C_MSTAT_MBUSY 6 /* Master Busy */ +#define BITP_I2C_MSTAT_ALOST 5 /* Arbitration Lost */ +#define BITP_I2C_MSTAT_NACKADDR 4 /* ACK Not Received in Response to an Address */ +#define BITP_I2C_MSTAT_MRXREQ 3 /* Master Receive Request */ +#define BITP_I2C_MSTAT_MTXREQ 2 /* Master Transmit Request/Clear Master Transmit Interrupt */ +#define BITP_I2C_MSTAT_MTXF 0 /* Master Transmit FIFO Status */ +#define BITM_I2C_MSTAT_SCLFILT (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* State of SCL Line */ +#define BITM_I2C_MSTAT_SDAFILT (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* State of SDA Line */ +#define BITM_I2C_MSTAT_MTXUNDR (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Master Transmit Underflow */ +#define BITM_I2C_MSTAT_MSTOP (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* STOP Driven by This I2C Master */ +#define BITM_I2C_MSTAT_LINEBUSY (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Line is Busy */ +#define BITM_I2C_MSTAT_MRXOVR (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Master Receive FIFO Overflow */ +#define BITM_I2C_MSTAT_TCOMP (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Transaction Complete or Stop Detected */ +#define BITM_I2C_MSTAT_NACKDATA (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* ACK Not Received in Response to Data Write */ +#define BITM_I2C_MSTAT_MBUSY (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Master Busy */ +#define BITM_I2C_MSTAT_ALOST (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Arbitration Lost */ +#define BITM_I2C_MSTAT_NACKADDR (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* ACK Not Received in Response to an Address */ +#define BITM_I2C_MSTAT_MRXREQ (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Master Receive Request */ +#define BITM_I2C_MSTAT_MTXREQ (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Master Transmit Request/Clear Master Transmit Interrupt */ +#define BITM_I2C_MSTAT_MTXF (_ADI_MSK_3(0x00000003,0x00000003U, uint16_t )) /* Master Transmit FIFO Status */ +#define ENUM_I2C_MSTAT_FIFO_EMPTY (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* MTXF: FIFO Empty. */ +#define ENUM_I2C_MSTAT_FIFO_1BYTE (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* MTXF: 1 byte in FIFO. */ +#define ENUM_I2C_MSTAT_FIFO_FULL (_ADI_MSK_3(0x00000003,0x00000003U, uint16_t )) /* MTXF: FIFO Full. */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_MRX Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_MRX_VALUE 0 /* Master Receive Register */ +#define BITM_I2C_MRX_VALUE (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Master Receive Register */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_MTX Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_MTX_VALUE 0 /* Master Transmit Register */ +#define BITM_I2C_MTX_VALUE (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Master Transmit Register */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_MRXCNT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_MRXCNT_EXTEND 8 /* Extended Read */ +#define BITP_I2C_MRXCNT_VALUE 0 /* Receive Count */ +#define BITM_I2C_MRXCNT_EXTEND (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Extended Read */ +#define BITM_I2C_MRXCNT_VALUE (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Receive Count */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_MCRXCNT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_MCRXCNT_VALUE 0 /* Current Receive Count */ +#define BITM_I2C_MCRXCNT_VALUE (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Current Receive Count */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_ADDR1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_ADDR1_VALUE 0 /* Address Byte 1 */ +#define BITM_I2C_ADDR1_VALUE (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Address Byte 1 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_ADDR2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_ADDR2_VALUE 0 /* Address Byte 2 */ +#define BITM_I2C_ADDR2_VALUE (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Address Byte 2 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_BYT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_BYT_SBYTE 0 /* Start Byte */ +#define BITM_I2C_BYT_SBYTE (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Start Byte */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_DIV Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_DIV_HIGH 8 /* Serial Clock High Time */ +#define BITP_I2C_DIV_LOW 0 /* Serial Clock Low Time */ +#define BITM_I2C_DIV_HIGH (_ADI_MSK_3(0x0000FF00,0x0000FF00U, uint16_t )) /* Serial Clock High Time */ +#define BITM_I2C_DIV_LOW (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Serial Clock Low Time */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_SCTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_SCTL_STXDMA 14 /* Enable Slave Tx DMA Request */ +#define BITP_I2C_SCTL_SRXDMA 13 /* Enable Slave Rx DMA Request */ +#define BITP_I2C_SCTL_IENREPST 12 /* Repeated Start Interrupt Enable */ +#define BITP_I2C_SCTL_STXDEC 11 /* Decrement Slave Tx FIFO Status When a Byte is Txed */ +#define BITP_I2C_SCTL_IENSTX 10 /* Slave Transmit Request Interrupt Enable */ +#define BITP_I2C_SCTL_IENSRX 9 /* Slave Receive Request Interrupt Enable */ +#define BITP_I2C_SCTL_IENSTOP 8 /* Stop Condition Detected Interrupt Enable */ +#define BITP_I2C_SCTL_NACK 7 /* NACK Next Communication */ +#define BITP_I2C_SCTL_EARLYTXR 5 /* Early Transmit Request Mode */ +#define BITP_I2C_SCTL_GCSBCLR 4 /* General Call Status Bit Clear */ +#define BITP_I2C_SCTL_HGCEN 3 /* Hardware General Call Enable */ +#define BITP_I2C_SCTL_GCEN 2 /* General Call Enable */ +#define BITP_I2C_SCTL_ADR10EN 1 /* Enabled 10-bit Addressing */ +#define BITP_I2C_SCTL_SLVEN 0 /* Slave Enable */ +#define BITM_I2C_SCTL_STXDMA (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Enable Slave Tx DMA Request */ +#define BITM_I2C_SCTL_SRXDMA (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Enable Slave Rx DMA Request */ +#define BITM_I2C_SCTL_IENREPST (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Repeated Start Interrupt Enable */ +#define BITM_I2C_SCTL_STXDEC (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Decrement Slave Tx FIFO Status When a Byte is Txed */ +#define BITM_I2C_SCTL_IENSTX (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Slave Transmit Request Interrupt Enable */ +#define BITM_I2C_SCTL_IENSRX (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Slave Receive Request Interrupt Enable */ +#define BITM_I2C_SCTL_IENSTOP (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Stop Condition Detected Interrupt Enable */ +#define BITM_I2C_SCTL_NACK (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* NACK Next Communication */ +#define BITM_I2C_SCTL_EARLYTXR (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Early Transmit Request Mode */ +#define BITM_I2C_SCTL_GCSBCLR (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* General Call Status Bit Clear */ +#define BITM_I2C_SCTL_HGCEN (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Hardware General Call Enable */ +#define BITM_I2C_SCTL_GCEN (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* General Call Enable */ +#define BITM_I2C_SCTL_ADR10EN (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Enabled 10-bit Addressing */ +#define BITM_I2C_SCTL_SLVEN (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Slave Enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_SSTAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_SSTAT_START 14 /* Start and Matching Address */ +#define BITP_I2C_SSTAT_REPSTART 13 /* Repeated Start and Matching Address */ +#define BITP_I2C_SSTAT_IDMAT 11 /* Device ID Matched */ +#define BITP_I2C_SSTAT_STOP 10 /* Stop After Start and Matching Address */ +#define BITP_I2C_SSTAT_GCID 8 /* General ID */ +#define BITP_I2C_SSTAT_GCINT 7 /* General Call Interrupt */ +#define BITP_I2C_SSTAT_SBUSY 6 /* Slave Busy */ +#define BITP_I2C_SSTAT_NOACK 5 /* ACK Not Generated by the Slave */ +#define BITP_I2C_SSTAT_SRXOVR 4 /* Slave Receive FIFO Overflow */ +#define BITP_I2C_SSTAT_SRXREQ 3 /* Slave Receive Request */ +#define BITP_I2C_SSTAT_STXREQ 2 /* Slave Transmit Request/Slave Transmit Interrupt */ +#define BITP_I2C_SSTAT_STXUNDR 1 /* Slave Transmit FIFO Underflow */ +#define BITP_I2C_SSTAT_STXFSEREQ 0 /* Slave Tx FIFO Status or Early Request */ +#define BITM_I2C_SSTAT_START (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Start and Matching Address */ +#define BITM_I2C_SSTAT_REPSTART (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Repeated Start and Matching Address */ +#define BITM_I2C_SSTAT_IDMAT (_ADI_MSK_3(0x00001800,0x00001800U, uint16_t )) /* Device ID Matched */ +#define BITM_I2C_SSTAT_STOP (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Stop After Start and Matching Address */ +#define BITM_I2C_SSTAT_GCID (_ADI_MSK_3(0x00000300,0x00000300U, uint16_t )) /* General ID */ +#define BITM_I2C_SSTAT_GCINT (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* General Call Interrupt */ +#define BITM_I2C_SSTAT_SBUSY (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Slave Busy */ +#define BITM_I2C_SSTAT_NOACK (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* ACK Not Generated by the Slave */ +#define BITM_I2C_SSTAT_SRXOVR (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Slave Receive FIFO Overflow */ +#define BITM_I2C_SSTAT_SRXREQ (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Slave Receive Request */ +#define BITM_I2C_SSTAT_STXREQ (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Slave Transmit Request/Slave Transmit Interrupt */ +#define BITM_I2C_SSTAT_STXUNDR (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Slave Transmit FIFO Underflow */ +#define BITM_I2C_SSTAT_STXFSEREQ (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Slave Tx FIFO Status or Early Request */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_SRX Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_SRX_VALUE 0 /* Slave Receive Register */ +#define BITM_I2C_SRX_VALUE (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Slave Receive Register */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_STX Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_STX_VALUE 0 /* Slave Transmit Register */ +#define BITM_I2C_STX_VALUE (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Slave Transmit Register */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_ALT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_ALT_ID 0 /* Slave Alt */ +#define BITM_I2C_ALT_ID (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Slave Alt */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_ID0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_ID0_VALUE 0 /* Slave Device ID 0 */ +#define BITM_I2C_ID0_VALUE (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Slave Device ID 0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_ID1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_ID1_VALUE 0 /* Slave Device ID 1 */ +#define BITM_I2C_ID1_VALUE (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Slave Device ID 1 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_ID2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_ID2_VALUE 0 /* Slave Device ID 2 */ +#define BITM_I2C_ID2_VALUE (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Slave Device ID 2 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_ID3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_ID3_VALUE 0 /* Slave Device ID 3 */ +#define BITM_I2C_ID3_VALUE (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Slave Device ID 3 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_STAT_MFLUSH 9 /* Flush the Master Transmit FIFO */ +#define BITP_I2C_STAT_SFLUSH 8 /* Flush the Slave Transmit FIFO */ +#define BITP_I2C_STAT_MRXF 6 /* Master Receive FIFO Status */ +#define BITP_I2C_STAT_MTXF 4 /* Master Transmit FIFO Status */ +#define BITP_I2C_STAT_SRXF 2 /* Slave Receive FIFO Status */ +#define BITP_I2C_STAT_STXF 0 /* Slave Transmit FIFO Status */ +#define BITM_I2C_STAT_MFLUSH (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Flush the Master Transmit FIFO */ +#define BITM_I2C_STAT_SFLUSH (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Flush the Slave Transmit FIFO */ +#define BITM_I2C_STAT_MRXF (_ADI_MSK_3(0x000000C0,0x000000C0U, uint16_t )) /* Master Receive FIFO Status */ +#define BITM_I2C_STAT_MTXF (_ADI_MSK_3(0x00000030,0x00000030U, uint16_t )) /* Master Transmit FIFO Status */ +#define BITM_I2C_STAT_SRXF (_ADI_MSK_3(0x0000000C,0x0000000CU, uint16_t )) /* Slave Receive FIFO Status */ +#define BITM_I2C_STAT_STXF (_ADI_MSK_3(0x00000003,0x00000003U, uint16_t )) /* Slave Transmit FIFO Status */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_SHCTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_SHCTL_RST 0 /* Reset START STOP Detect Circuit */ +#define BITM_I2C_SHCTL_RST (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Reset START STOP Detect Circuit */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_TCTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_TCTL_FILTEROFF 8 /* Input Filter Control */ +#define BITP_I2C_TCTL_THDATIN 0 /* Data in Hold Start */ +#define BITM_I2C_TCTL_FILTEROFF (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Input Filter Control */ +#define BITM_I2C_TCTL_THDATIN (_ADI_MSK_3(0x0000001F,0x0000001FU, uint16_t )) /* Data in Hold Start */ + +/* ------------------------------------------------------------------------------------------------------------------------- + I2C_ASTRETCH_SCL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_I2C_ASTRETCH_SCL_SLVTMO 9 /* Slave Automatic Stretch Timeout */ +#define BITP_I2C_ASTRETCH_SCL_MSTTMO 8 /* Master Automatic Stretch Timeout */ +#define BITP_I2C_ASTRETCH_SCL_SLV 4 /* Slave Automatic Stretch Mode */ +#define BITP_I2C_ASTRETCH_SCL_MST 0 /* Master Automatic Stretch Mode */ +#define BITM_I2C_ASTRETCH_SCL_SLVTMO (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Slave Automatic Stretch Timeout */ +#define BITM_I2C_ASTRETCH_SCL_MSTTMO (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Master Automatic Stretch Timeout */ +#define BITM_I2C_ASTRETCH_SCL_SLV (_ADI_MSK_3(0x000000F0,0x000000F0U, uint16_t )) /* Slave Automatic Stretch Mode */ +#define BITM_I2C_ASTRETCH_SCL_MST (_ADI_MSK_3(0x0000000F,0x0000000FU, uint16_t )) /* Master Automatic Stretch Mode */ + + +/* ============================================================================================================================ + Serial Peripheral Interface + ============================================================================================================================ */ + +/* ============================================================================================================================ + SPI0 + ============================================================================================================================ */ +#define REG_SPI0_STAT 0x40004000 /* SPI0 Status */ +#define REG_SPI0_RX 0x40004004 /* SPI0 Receive */ +#define REG_SPI0_TX 0x40004008 /* SPI0 Transmit */ +#define REG_SPI0_DIV 0x4000400C /* SPI0 SPI Baud Rate Selection */ +#define REG_SPI0_CTL 0x40004010 /* SPI0 SPI Configuration */ +#define REG_SPI0_IEN 0x40004014 /* SPI0 SPI Interrupts Enable */ +#define REG_SPI0_CNT 0x40004018 /* SPI0 Transfer Byte Count */ +#define REG_SPI0_DMA 0x4000401C /* SPI0 SPI DMA Enable */ +#define REG_SPI0_FIFO_STAT 0x40004020 /* SPI0 FIFO Status */ +#define REG_SPI0_RD_CTL 0x40004024 /* SPI0 Read Control */ +#define REG_SPI0_FLOW_CTL 0x40004028 /* SPI0 Flow Control */ +#define REG_SPI0_WAIT_TMR 0x4000402C /* SPI0 Wait Timer for Flow Control */ +#define REG_SPI0_CS_CTL 0x40004030 /* SPI0 Chip Select Control for Multi-slave Connections */ +#define REG_SPI0_CS_OVERRIDE 0x40004034 /* SPI0 Chip Select Override */ + +/* ============================================================================================================================ + SPI1 + ============================================================================================================================ */ +#define REG_SPI1_STAT 0x40004400 /* SPI1 Status */ +#define REG_SPI1_RX 0x40004404 /* SPI1 Receive */ +#define REG_SPI1_TX 0x40004408 /* SPI1 Transmit */ +#define REG_SPI1_DIV 0x4000440C /* SPI1 SPI Baud Rate Selection */ +#define REG_SPI1_CTL 0x40004410 /* SPI1 SPI Configuration */ +#define REG_SPI1_IEN 0x40004414 /* SPI1 SPI Interrupts Enable */ +#define REG_SPI1_CNT 0x40004418 /* SPI1 Transfer Byte Count */ +#define REG_SPI1_DMA 0x4000441C /* SPI1 SPI DMA Enable */ +#define REG_SPI1_FIFO_STAT 0x40004420 /* SPI1 FIFO Status */ +#define REG_SPI1_RD_CTL 0x40004424 /* SPI1 Read Control */ +#define REG_SPI1_FLOW_CTL 0x40004428 /* SPI1 Flow Control */ +#define REG_SPI1_WAIT_TMR 0x4000442C /* SPI1 Wait Timer for Flow Control */ +#define REG_SPI1_CS_CTL 0x40004430 /* SPI1 Chip Select Control for Multi-slave Connections */ +#define REG_SPI1_CS_OVERRIDE 0x40004434 /* SPI1 Chip Select Override */ + +/* ============================================================================================================================ + SPI2 + ============================================================================================================================ */ +#define REG_SPI2_STAT 0x40024000 /* SPI2 Status */ +#define REG_SPI2_RX 0x40024004 /* SPI2 Receive */ +#define REG_SPI2_TX 0x40024008 /* SPI2 Transmit */ +#define REG_SPI2_DIV 0x4002400C /* SPI2 SPI Baud Rate Selection */ +#define REG_SPI2_CTL 0x40024010 /* SPI2 SPI Configuration */ +#define REG_SPI2_IEN 0x40024014 /* SPI2 SPI Interrupts Enable */ +#define REG_SPI2_CNT 0x40024018 /* SPI2 Transfer Byte Count */ +#define REG_SPI2_DMA 0x4002401C /* SPI2 SPI DMA Enable */ +#define REG_SPI2_FIFO_STAT 0x40024020 /* SPI2 FIFO Status */ +#define REG_SPI2_RD_CTL 0x40024024 /* SPI2 Read Control */ +#define REG_SPI2_FLOW_CTL 0x40024028 /* SPI2 Flow Control */ +#define REG_SPI2_WAIT_TMR 0x4002402C /* SPI2 Wait Timer for Flow Control */ +#define REG_SPI2_CS_CTL 0x40024030 /* SPI2 Chip Select Control for Multi-slave Connections */ +#define REG_SPI2_CS_OVERRIDE 0x40024034 /* SPI2 Chip Select Override */ + +/* ============================================================================================================================ + SPI Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + SPI_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPI_STAT_RDY 15 /* Detected an Edge on Ready Indicator for Flow Control */ +#define BITP_SPI_STAT_CSFALL 14 /* Detected a Falling Edge on CS, in Slave CON Mode */ +#define BITP_SPI_STAT_CSRISE 13 /* Detected a Rising Edge on CS, in Slave CON Mode */ +#define BITP_SPI_STAT_CSERR 12 /* Detected a CS Error Condition in Slave Mode */ +#define BITP_SPI_STAT_CS 11 /* CS Status */ +#define BITP_SPI_STAT_RXOVR 7 /* SPI Rx FIFO Overflow */ +#define BITP_SPI_STAT_RXIRQ 6 /* SPI Rx IRQ */ +#define BITP_SPI_STAT_TXIRQ 5 /* SPI Tx IRQ */ +#define BITP_SPI_STAT_TXUNDR 4 /* SPI Tx FIFO Underflow */ +#define BITP_SPI_STAT_TXDONE 3 /* SPI Tx Done in Read Command Mode */ +#define BITP_SPI_STAT_TXEMPTY 2 /* SPI Tx FIFO Empty Interrupt */ +#define BITP_SPI_STAT_XFRDONE 1 /* SPI Transfer Completion */ +#define BITP_SPI_STAT_IRQ 0 /* SPI Interrupt Status */ +#define BITM_SPI_STAT_RDY (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Detected an Edge on Ready Indicator for Flow Control */ +#define BITM_SPI_STAT_CSFALL (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Detected a Falling Edge on CS, in Slave CON Mode */ +#define BITM_SPI_STAT_CSRISE (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Detected a Rising Edge on CS, in Slave CON Mode */ +#define BITM_SPI_STAT_CSERR (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Detected a CS Error Condition in Slave Mode */ +#define BITM_SPI_STAT_CS (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* CS Status */ +#define BITM_SPI_STAT_RXOVR (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* SPI Rx FIFO Overflow */ +#define BITM_SPI_STAT_RXIRQ (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* SPI Rx IRQ */ +#define BITM_SPI_STAT_TXIRQ (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* SPI Tx IRQ */ +#define BITM_SPI_STAT_TXUNDR (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* SPI Tx FIFO Underflow */ +#define BITM_SPI_STAT_TXDONE (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* SPI Tx Done in Read Command Mode */ +#define BITM_SPI_STAT_TXEMPTY (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* SPI Tx FIFO Empty Interrupt */ +#define BITM_SPI_STAT_XFRDONE (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* SPI Transfer Completion */ +#define BITM_SPI_STAT_IRQ (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* SPI Interrupt Status */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPI_RX Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPI_RX_BYTE2 8 /* 8-bit Receive Buffer, Used Only in DMA Modes */ +#define BITP_SPI_RX_BYTE1 0 /* 8-bit Receive Buffer */ +#define BITM_SPI_RX_BYTE2 (_ADI_MSK_3(0x0000FF00,0x0000FF00U, uint16_t )) /* 8-bit Receive Buffer, Used Only in DMA Modes */ +#define BITM_SPI_RX_BYTE1 (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* 8-bit Receive Buffer */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPI_TX Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPI_TX_BYTE2 8 /* 8-bit Transmit Buffer, Used Only in DMA Modes */ +#define BITP_SPI_TX_BYTE1 0 /* 8-bit Transmit Buffer */ +#define BITM_SPI_TX_BYTE2 (_ADI_MSK_3(0x0000FF00,0x0000FF00U, uint16_t )) /* 8-bit Transmit Buffer, Used Only in DMA Modes */ +#define BITM_SPI_TX_BYTE1 (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* 8-bit Transmit Buffer */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPI_DIV Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPI_DIV_VALUE 0 /* SPI Clock Divider */ +#define BITM_SPI_DIV_VALUE (_ADI_MSK_3(0x0000003F,0x0000003FU, uint16_t )) /* SPI Clock Divider */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPI_CTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPI_CTL_CSRST 14 /* Reset Mode for CS Error Bit */ +#define BITP_SPI_CTL_TFLUSH 13 /* SPI Tx FIFO Flush Enable */ +#define BITP_SPI_CTL_RFLUSH 12 /* SPI Rx FIFO Flush Enable */ +#define BITP_SPI_CTL_CON 11 /* Continuous Transfer Enable */ +#define BITP_SPI_CTL_LOOPBACK 10 /* Loopback Enable */ +#define BITP_SPI_CTL_OEN 9 /* Slave MISO Output Enable */ +#define BITP_SPI_CTL_RXOF 8 /* Rx Overflow Overwrite Enable */ +#define BITP_SPI_CTL_ZEN 7 /* Transmit Zeros Enable */ +#define BITP_SPI_CTL_TIM 6 /* SPI Transfer and Interrupt Mode */ +#define BITP_SPI_CTL_LSB 5 /* LSB First Transfer Enable */ +#define BITP_SPI_CTL_WOM 4 /* SPI Wired-OR Mode */ +#define BITP_SPI_CTL_CPOL 3 /* Serial Clock Polarity */ +#define BITP_SPI_CTL_CPHA 2 /* Serial Clock Phase Mode */ +#define BITP_SPI_CTL_MASEN 1 /* Master Mode Enable */ +#define BITP_SPI_CTL_SPIEN 0 /* SPI Enable */ +#define BITM_SPI_CTL_CSRST (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Reset Mode for CS Error Bit */ +#define BITM_SPI_CTL_TFLUSH (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* SPI Tx FIFO Flush Enable */ +#define BITM_SPI_CTL_RFLUSH (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* SPI Rx FIFO Flush Enable */ +#define BITM_SPI_CTL_CON (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Continuous Transfer Enable */ +#define BITM_SPI_CTL_LOOPBACK (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Loopback Enable */ +#define BITM_SPI_CTL_OEN (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Slave MISO Output Enable */ +#define BITM_SPI_CTL_RXOF (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Rx Overflow Overwrite Enable */ +#define BITM_SPI_CTL_ZEN (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Transmit Zeros Enable */ +#define BITM_SPI_CTL_TIM (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* SPI Transfer and Interrupt Mode */ +#define BITM_SPI_CTL_LSB (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* LSB First Transfer Enable */ +#define BITM_SPI_CTL_WOM (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* SPI Wired-OR Mode */ +#define BITM_SPI_CTL_CPOL (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Serial Clock Polarity */ +#define BITM_SPI_CTL_CPHA (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Serial Clock Phase Mode */ +#define BITM_SPI_CTL_MASEN (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Master Mode Enable */ +#define BITM_SPI_CTL_SPIEN (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* SPI Enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPI_IEN Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPI_IEN_TXEMPTY 14 /* Tx FIFO Empty Interrupt Enable */ +#define BITP_SPI_IEN_XFRDONE 13 /* SPI Transfer Completion Interrupt Enable */ +#define BITP_SPI_IEN_TXDONE 12 /* SPI Transmit Done Interrupt Enable */ +#define BITP_SPI_IEN_RDY 11 /* Ready Signal Edge Interrupt Enable */ +#define BITP_SPI_IEN_RXOVR 10 /* Rx Overflow Interrupt Enable */ +#define BITP_SPI_IEN_TXUNDR 9 /* Tx Underflow Interrupt Enable */ +#define BITP_SPI_IEN_CS 8 /* Enable Interrupt on Every CS Edge in Slave CON Mode */ +#define BITP_SPI_IEN_IRQMODE 0 /* SPI IRQ Mode Bits */ +#define BITM_SPI_IEN_TXEMPTY (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Tx FIFO Empty Interrupt Enable */ +#define BITM_SPI_IEN_XFRDONE (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* SPI Transfer Completion Interrupt Enable */ +#define BITM_SPI_IEN_TXDONE (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* SPI Transmit Done Interrupt Enable */ +#define BITM_SPI_IEN_RDY (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Ready Signal Edge Interrupt Enable */ +#define BITM_SPI_IEN_RXOVR (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Rx Overflow Interrupt Enable */ +#define BITM_SPI_IEN_TXUNDR (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Tx Underflow Interrupt Enable */ +#define BITM_SPI_IEN_CS (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Enable Interrupt on Every CS Edge in Slave CON Mode */ +#define BITM_SPI_IEN_IRQMODE (_ADI_MSK_3(0x00000007,0x00000007U, uint16_t )) /* SPI IRQ Mode Bits */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPI_CNT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPI_CNT_FRAMECONT 15 /* Continue Frame */ +#define BITP_SPI_CNT_VALUE 0 /* Transfer Byte Count */ +#define BITM_SPI_CNT_FRAMECONT (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Continue Frame */ +#define BITM_SPI_CNT_VALUE (_ADI_MSK_3(0x00003FFF,0x00003FFFU, uint16_t )) /* Transfer Byte Count */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPI_DMA Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPI_DMA_RXEN 2 /* Enable Receive DMA Request */ +#define BITP_SPI_DMA_TXEN 1 /* Enable Transmit DMA Request */ +#define BITP_SPI_DMA_EN 0 /* Enable DMA for Data Transfer */ +#define BITM_SPI_DMA_RXEN (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Enable Receive DMA Request */ +#define BITM_SPI_DMA_TXEN (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Enable Transmit DMA Request */ +#define BITM_SPI_DMA_EN (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Enable DMA for Data Transfer */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPI_FIFO_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPI_FIFO_STAT_RX 8 /* SPI Rx FIFO Dtatus */ +#define BITP_SPI_FIFO_STAT_TX 0 /* SPI Tx FIFO Status */ +#define BITM_SPI_FIFO_STAT_RX (_ADI_MSK_3(0x00000F00,0x00000F00U, uint16_t )) /* SPI Rx FIFO Dtatus */ +#define BITM_SPI_FIFO_STAT_TX (_ADI_MSK_3(0x0000000F,0x0000000FU, uint16_t )) /* SPI Tx FIFO Status */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPI_RD_CTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPI_RD_CTL_THREEPIN 8 /* Three Pin SPI Mode */ +#define BITP_SPI_RD_CTL_TXBYTES 2 /* Transmit Byte Count - 1 (Read Command) */ +#define BITP_SPI_RD_CTL_OVERLAP 1 /* Tx/Rx Overlap Mode */ +#define BITP_SPI_RD_CTL_CMDEN 0 /* Read Command Enable */ +#define BITM_SPI_RD_CTL_THREEPIN (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Three Pin SPI Mode */ +#define BITM_SPI_RD_CTL_TXBYTES (_ADI_MSK_3(0x0000003C,0x0000003CU, uint16_t )) /* Transmit Byte Count - 1 (Read Command) */ +#define BITM_SPI_RD_CTL_OVERLAP (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Tx/Rx Overlap Mode */ +#define BITM_SPI_RD_CTL_CMDEN (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Read Command Enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPI_FLOW_CTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPI_FLOW_CTL_RDBURSTSZ 6 /* Read Data Burst Size - 1 */ +#define BITP_SPI_FLOW_CTL_RDYPOL 4 /* Polarity of RDY/MISO Line */ +#define BITP_SPI_FLOW_CTL_MODE 0 /* Flow Control Mode */ +#define BITM_SPI_FLOW_CTL_RDBURSTSZ (_ADI_MSK_3(0x0000FFC0,0x0000FFC0U, uint16_t )) /* Read Data Burst Size - 1 */ +#define BITM_SPI_FLOW_CTL_RDYPOL (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Polarity of RDY/MISO Line */ +#define BITM_SPI_FLOW_CTL_MODE (_ADI_MSK_3(0x00000003,0x00000003U, uint16_t )) /* Flow Control Mode */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPI_WAIT_TMR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPI_WAIT_TMR_VALUE 0 /* Wait Timer */ +#define BITM_SPI_WAIT_TMR_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Wait Timer */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPI_CS_CTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPI_CS_CTL_SEL 0 /* Chip Select Control */ +#define BITM_SPI_CS_CTL_SEL (_ADI_MSK_3(0x0000000F,0x0000000FU, uint16_t )) /* Chip Select Control */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPI_CS_OVERRIDE Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPI_CS_OVERRIDE_CTL 0 /* CS Override Control */ +#define BITM_SPI_CS_OVERRIDE_CTL (_ADI_MSK_3(0x00000003,0x00000003U, uint16_t )) /* CS Override Control */ + + +/* ============================================================================================================================ + + ============================================================================================================================ */ + +/* ============================================================================================================================ + UART0 + ============================================================================================================================ */ +#define REG_UART0_RX 0x40005000 /* UART0 Receive Buffer Register */ +#define REG_UART0_TX 0x40005000 /* UART0 Transmit Holding Register */ +#define REG_UART0_IEN 0x40005004 /* UART0 Interrupt Enable */ +#define REG_UART0_IIR 0x40005008 /* UART0 Interrupt ID */ +#define REG_UART0_LCR 0x4000500C /* UART0 Line Control */ +#define REG_UART0_MCR 0x40005010 /* UART0 Modem Control */ +#define REG_UART0_LSR 0x40005014 /* UART0 Line Status */ +#define REG_UART0_MSR 0x40005018 /* UART0 Modem Status */ +#define REG_UART0_SCR 0x4000501C /* UART0 Scratch Buffer */ +#define REG_UART0_FCR 0x40005020 /* UART0 FIFO Control */ +#define REG_UART0_FBR 0x40005024 /* UART0 Fractional Baud Rate */ +#define REG_UART0_DIV 0x40005028 /* UART0 Baud Rate Divider */ +#define REG_UART0_LCR2 0x4000502C /* UART0 Second Line Control */ +#define REG_UART0_CTL 0x40005030 /* UART0 UART Control Register */ +#define REG_UART0_RFC 0x40005034 /* UART0 RX FIFO Byte Count */ +#define REG_UART0_TFC 0x40005038 /* UART0 TX FIFO Byte Count */ +#define REG_UART0_RSC 0x4000503C /* UART0 RS485 Half-duplex Control */ +#define REG_UART0_ACR 0x40005040 /* UART0 Auto Baud Control */ +#define REG_UART0_ASRL 0x40005044 /* UART0 Auto Baud Status (Low) */ +#define REG_UART0_ASRH 0x40005048 /* UART0 Auto Baud Status (High) */ + +/* ============================================================================================================================ + UART1 + ============================================================================================================================ */ +#define REG_UART1_RX 0x40005400 /* UART1 Receive Buffer Register */ +#define REG_UART1_TX 0x40005400 /* UART1 Transmit Holding Register */ +#define REG_UART1_IEN 0x40005404 /* UART1 Interrupt Enable */ +#define REG_UART1_IIR 0x40005408 /* UART1 Interrupt ID */ +#define REG_UART1_LCR 0x4000540C /* UART1 Line Control */ +#define REG_UART1_MCR 0x40005410 /* UART1 Modem Control */ +#define REG_UART1_LSR 0x40005414 /* UART1 Line Status */ +#define REG_UART1_MSR 0x40005418 /* UART1 Modem Status */ +#define REG_UART1_SCR 0x4000541C /* UART1 Scratch Buffer */ +#define REG_UART1_FCR 0x40005420 /* UART1 FIFO Control */ +#define REG_UART1_FBR 0x40005424 /* UART1 Fractional Baud Rate */ +#define REG_UART1_DIV 0x40005428 /* UART1 Baud Rate Divider */ +#define REG_UART1_LCR2 0x4000542C /* UART1 Second Line Control */ +#define REG_UART1_CTL 0x40005430 /* UART1 UART Control Register */ +#define REG_UART1_RFC 0x40005434 /* UART1 RX FIFO Byte Count */ +#define REG_UART1_TFC 0x40005438 /* UART1 TX FIFO Byte Count */ +#define REG_UART1_RSC 0x4000543C /* UART1 RS485 Half-duplex Control */ +#define REG_UART1_ACR 0x40005440 /* UART1 Auto Baud Control */ +#define REG_UART1_ASRL 0x40005444 /* UART1 Auto Baud Status (Low) */ +#define REG_UART1_ASRH 0x40005448 /* UART1 Auto Baud Status (High) */ + +/* ============================================================================================================================ + UART Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + UART_RX Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_RX_RBR 0 /* Receive Buffer Register */ +#define BITM_UART_RX_RBR (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Receive Buffer Register */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_TX Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_TX_THR 0 /* Transmit Holding Register */ +#define BITM_UART_TX_THR (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Transmit Holding Register */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_IEN Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_IEN_EDMAR 5 /* DMA Requests in Receive Mode */ +#define BITP_UART_IEN_EDMAT 4 /* DMA Requests in Transmit Mode */ +#define BITP_UART_IEN_EDSSI 3 /* Modem Status Interrupt */ +#define BITP_UART_IEN_ELSI 2 /* Rx Status Interrupt */ +#define BITP_UART_IEN_ETBEI 1 /* Transmit Buffer Empty Interrupt */ +#define BITP_UART_IEN_ERBFI 0 /* Receive Buffer Full Interrupt */ +#define BITM_UART_IEN_EDMAR (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* DMA Requests in Receive Mode */ +#define BITM_UART_IEN_EDMAT (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* DMA Requests in Transmit Mode */ +#define BITM_UART_IEN_EDSSI (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Modem Status Interrupt */ +#define BITM_UART_IEN_ELSI (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Rx Status Interrupt */ +#define BITM_UART_IEN_ETBEI (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Transmit Buffer Empty Interrupt */ +#define BITM_UART_IEN_ERBFI (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Receive Buffer Full Interrupt */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_IIR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_IIR_FEND 6 /* FIFO Enabled */ +#define BITP_UART_IIR_STAT 1 /* Interrupt Status */ +#define BITP_UART_IIR_NIRQ 0 /* Interrupt Flag */ +#define BITM_UART_IIR_FEND (_ADI_MSK_3(0x000000C0,0x000000C0U, uint16_t )) /* FIFO Enabled */ +#define BITM_UART_IIR_STAT (_ADI_MSK_3(0x0000000E,0x0000000EU, uint16_t )) /* Interrupt Status */ +#define BITM_UART_IIR_NIRQ (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Interrupt Flag */ +#define ENUM_UART_IIR_STAT_EDSSI (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* STAT: Modem status interrupt (Read MSR register to clear) */ +#define ENUM_UART_IIR_STAT_ETBEI (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* STAT: Transmit buffer empty interrupt (Write to Tx register or read IIR register to clear) */ +#define ENUM_UART_IIR_STAT_ERBFI (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* STAT: Receive buffer full interrupt (Read Rx register to clear) */ +#define ENUM_UART_IIR_STAT_RLSI (_ADI_MSK_3(0x00000006,0x00000006U, uint16_t )) /* STAT: Receive line status interrupt (Read LSR register to clear) */ +#define ENUM_UART_IIR_STAT_RFTOI (_ADI_MSK_3(0x0000000C,0x0000000CU, uint16_t )) /* STAT: Receive FIFO time-out interrupt (Read Rx register to clear) */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_LCR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_LCR_BRK 6 /* Set Break */ +#define BITP_UART_LCR_SP 5 /* Stick Parity */ +#define BITP_UART_LCR_EPS 4 /* Parity Select */ +#define BITP_UART_LCR_PEN 3 /* Parity Enable */ +#define BITP_UART_LCR_STOP 2 /* Stop Bit */ +#define BITP_UART_LCR_WLS 0 /* Word Length Select */ +#define BITM_UART_LCR_BRK (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Set Break */ +#define BITM_UART_LCR_SP (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Stick Parity */ +#define BITM_UART_LCR_EPS (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Parity Select */ +#define BITM_UART_LCR_PEN (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Parity Enable */ +#define BITM_UART_LCR_STOP (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Stop Bit */ +#define BITM_UART_LCR_WLS (_ADI_MSK_3(0x00000003,0x00000003U, uint16_t )) /* Word Length Select */ +#define ENUM_UART_LCR_PAR_NOTFORCED (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* SP: Parity will not be forced based on Parity Select and Parity Enable bits. */ +#define ENUM_UART_LCR_PAR_FORCED (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* SP: Parity forced based on Parity Select and Parity Enable bits. */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_MCR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_MCR_LOOPBACK 4 /* Loopback Mode */ +#define BITP_UART_MCR_OUT2 3 /* Output 2 */ +#define BITP_UART_MCR_OUT1 2 /* Output 1 */ +#define BITP_UART_MCR_RTS 1 /* Request to Send */ +#define BITP_UART_MCR_DTR 0 /* Data Terminal Ready */ +#define BITM_UART_MCR_LOOPBACK (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Loopback Mode */ +#define BITM_UART_MCR_OUT2 (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Output 2 */ +#define BITM_UART_MCR_OUT1 (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Output 1 */ +#define BITM_UART_MCR_RTS (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Request to Send */ +#define BITM_UART_MCR_DTR (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Data Terminal Ready */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_LSR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_LSR_FIFOERR 7 /* Rx FIFO Parity Error/Frame Error/Break Indication */ +#define BITP_UART_LSR_TEMT 6 /* Transmit and Shift Register Empty Status */ +#define BITP_UART_LSR_THRE 5 /* Transmit Register Empty */ +#define BITP_UART_LSR_BI 4 /* Break Indicator */ +#define BITP_UART_LSR_FE 3 /* Framing Error */ +#define BITP_UART_LSR_PE 2 /* Parity Error */ +#define BITP_UART_LSR_OE 1 /* Overrun Error */ +#define BITP_UART_LSR_DR 0 /* Data Ready */ +#define BITM_UART_LSR_FIFOERR (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Rx FIFO Parity Error/Frame Error/Break Indication */ +#define BITM_UART_LSR_TEMT (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Transmit and Shift Register Empty Status */ +#define BITM_UART_LSR_THRE (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Transmit Register Empty */ +#define BITM_UART_LSR_BI (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Break Indicator */ +#define BITM_UART_LSR_FE (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Framing Error */ +#define BITM_UART_LSR_PE (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Parity Error */ +#define BITM_UART_LSR_OE (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Overrun Error */ +#define BITM_UART_LSR_DR (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Data Ready */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_MSR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_MSR_DCD 7 /* Data Carrier Detect */ +#define BITP_UART_MSR_RI 6 /* Ring Indicator */ +#define BITP_UART_MSR_DSR 5 /* Data Set Ready */ +#define BITP_UART_MSR_CTS 4 /* Clear to Send */ +#define BITP_UART_MSR_DDCD 3 /* Delta DCD */ +#define BITP_UART_MSR_TERI 2 /* Trailing Edge RI */ +#define BITP_UART_MSR_DDSR 1 /* Delta DSR */ +#define BITP_UART_MSR_DCTS 0 /* Delta CTS */ +#define BITM_UART_MSR_DCD (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Data Carrier Detect */ +#define BITM_UART_MSR_RI (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Ring Indicator */ +#define BITM_UART_MSR_DSR (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Data Set Ready */ +#define BITM_UART_MSR_CTS (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Clear to Send */ +#define BITM_UART_MSR_DDCD (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Delta DCD */ +#define BITM_UART_MSR_TERI (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Trailing Edge RI */ +#define BITM_UART_MSR_DDSR (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Delta DSR */ +#define BITM_UART_MSR_DCTS (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Delta CTS */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_SCR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_SCR_SCR 0 /* Scratch */ +#define BITM_UART_SCR_SCR (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Scratch */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_FCR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_FCR_RFTRIG 6 /* Rx FIFO Trigger Level */ +#define BITP_UART_FCR_FDMAMD 3 /* FIFO DMA Mode */ +#define BITP_UART_FCR_TFCLR 2 /* Clear Tx FIFO */ +#define BITP_UART_FCR_RFCLR 1 /* Clear Rx FIFO */ +#define BITP_UART_FCR_FIFOEN 0 /* FIFO Enable as to Work in 16550 Mode */ +#define BITM_UART_FCR_RFTRIG (_ADI_MSK_3(0x000000C0,0x000000C0U, uint16_t )) /* Rx FIFO Trigger Level */ +#define BITM_UART_FCR_FDMAMD (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* FIFO DMA Mode */ +#define BITM_UART_FCR_TFCLR (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Clear Tx FIFO */ +#define BITM_UART_FCR_RFCLR (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Clear Rx FIFO */ +#define BITM_UART_FCR_FIFOEN (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* FIFO Enable as to Work in 16550 Mode */ +#define ENUM_UART_FCR_MODE0 (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* FDMAMD: In DMA mode 0, RX DMA request will be asserted whenever there's data in RBR or RX FIFO and de-assert whenever RBR or RX FIFO is empty; TX DMA request will be asserted whenever THR or TX FIFO is empty and de-assert whenever data written to. */ +#define ENUM_UART_FCR_MODE1 (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* FDMAMD: in DMA mode 1, RX DMA request will be asserted whenever RX FIFO trig level or time out reached and de-assert thereafter when RX FIFO is empty; TX DMA request will be asserted whenever TX FIFO is empty and de-assert thereafter when TX FIFO is completely filled up full. */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_FBR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_FBR_FBEN 15 /* Fractional Baud Rate Generator Enable */ +#define BITP_UART_FBR_DIVM 11 /* Fractional Baud Rate M Divide Bits 1 to 3 */ +#define BITP_UART_FBR_DIVN 0 /* Fractional Baud Rate N Divide Bits 0 to 2047 */ +#define BITM_UART_FBR_FBEN (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Fractional Baud Rate Generator Enable */ +#define BITM_UART_FBR_DIVM (_ADI_MSK_3(0x00001800,0x00001800U, uint16_t )) /* Fractional Baud Rate M Divide Bits 1 to 3 */ +#define BITM_UART_FBR_DIVN (_ADI_MSK_3(0x000007FF,0x000007FFU, uint16_t )) /* Fractional Baud Rate N Divide Bits 0 to 2047 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_DIV Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_DIV_DIV 0 /* Baud Rate Divider */ +#define BITM_UART_DIV_DIV (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Baud Rate Divider */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_LCR2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_LCR2_OSR 0 /* Over Sample Rate */ +#define BITM_UART_LCR2_OSR (_ADI_MSK_3(0x00000003,0x00000003U, uint16_t )) /* Over Sample Rate */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_CTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_CTL_REV 8 /* UART Revision ID */ +#define BITP_UART_CTL_RXINV 4 /* Invert Receiver Line */ +#define BITP_UART_CTL_FORCECLK 1 /* Force UCLK on */ +#define BITM_UART_CTL_REV (_ADI_MSK_3(0x0000FF00,0x0000FF00U, uint16_t )) /* UART Revision ID */ +#define BITM_UART_CTL_RXINV (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Invert Receiver Line */ +#define BITM_UART_CTL_FORCECLK (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Force UCLK on */ +#define ENUM_UART_CTL_NOTINV_RX (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* RXINV: Don't invert receiver line (idling high). */ +#define ENUM_UART_CTL_INV_RX (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* RXINV: Invert receiver line (idling low). */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_RFC Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_RFC_RFC 0 /* Current Rx FIFO Data Bytes */ +#define BITM_UART_RFC_RFC (_ADI_MSK_3(0x0000001F,0x0000001FU, uint16_t )) /* Current Rx FIFO Data Bytes */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_TFC Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_TFC_TFC 0 /* Current Tx FIFO Data Bytes */ +#define BITM_UART_TFC_TFC (_ADI_MSK_3(0x0000001F,0x0000001FU, uint16_t )) /* Current Tx FIFO Data Bytes */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_RSC Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_RSC_DISTX 3 /* Hold off Tx When Receiving */ +#define BITP_UART_RSC_DISRX 2 /* Disable Rx When Transmitting */ +#define BITP_UART_RSC_OENSP 1 /* SOUT_EN De-assert Before Full Stop Bit(s) */ +#define BITP_UART_RSC_OENP 0 /* SOUT_EN Polarity */ +#define BITM_UART_RSC_DISTX (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Hold off Tx When Receiving */ +#define BITM_UART_RSC_DISRX (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Disable Rx When Transmitting */ +#define BITM_UART_RSC_OENSP (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* SOUT_EN De-assert Before Full Stop Bit(s) */ +#define BITM_UART_RSC_OENP (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* SOUT_EN Polarity */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_ACR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_ACR_EEC 8 /* Ending Edge Count */ +#define BITP_UART_ACR_SEC 4 /* Starting Edge Count */ +#define BITP_UART_ACR_TOIEN 2 /* Enable Time-out Interrupt */ +#define BITP_UART_ACR_DNIEN 1 /* Enable Done Interrupt */ +#define BITP_UART_ACR_ABE 0 /* Auto Baud Enable */ +#define BITM_UART_ACR_EEC (_ADI_MSK_3(0x00000F00,0x00000F00U, uint16_t )) /* Ending Edge Count */ +#define BITM_UART_ACR_SEC (_ADI_MSK_3(0x00000070,0x00000070U, uint16_t )) /* Starting Edge Count */ +#define BITM_UART_ACR_TOIEN (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Enable Time-out Interrupt */ +#define BITM_UART_ACR_DNIEN (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Enable Done Interrupt */ +#define BITM_UART_ACR_ABE (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Auto Baud Enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_ASRL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_ASRL_CNT 4 /* Auto Baud Counter Value */ +#define BITP_UART_ASRL_NEETO 3 /* Timed Out Due to No Valid Ending Edge Found */ +#define BITP_UART_ASRL_NSETO 2 /* Timed Out Due to No Valid Start Edge Found */ +#define BITP_UART_ASRL_BRKTO 1 /* Timed Out Due to Long Time Break Condition */ +#define BITP_UART_ASRL_DONE 0 /* Auto Baud Done Successfully */ +#define BITM_UART_ASRL_CNT (_ADI_MSK_3(0x0000FFF0,0x0000FFF0U, uint16_t )) /* Auto Baud Counter Value */ +#define BITM_UART_ASRL_NEETO (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Timed Out Due to No Valid Ending Edge Found */ +#define BITM_UART_ASRL_NSETO (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Timed Out Due to No Valid Start Edge Found */ +#define BITM_UART_ASRL_BRKTO (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Timed Out Due to Long Time Break Condition */ +#define BITM_UART_ASRL_DONE (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Auto Baud Done Successfully */ + +/* ------------------------------------------------------------------------------------------------------------------------- + UART_ASRH Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_UART_ASRH_CNT 0 /* Auto Baud Counter Value */ +#define BITM_UART_ASRH_CNT (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Auto Baud Counter Value */ + + +/* ============================================================================================================================ + Beeper Driver + ============================================================================================================================ */ + +/* ============================================================================================================================ + BEEP0 + ============================================================================================================================ */ +#define REG_BEEP0_CFG 0x40005C00 /* BEEP0 Beeper Configuration */ +#define REG_BEEP0_STAT 0x40005C04 /* BEEP0 Beeper Status */ +#define REG_BEEP0_TONEA 0x40005C08 /* BEEP0 Tone A Data */ +#define REG_BEEP0_TONEB 0x40005C0C /* BEEP0 Tone B Data */ + +/* ============================================================================================================================ + BEEP Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + BEEP_CFG Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_BEEP_CFG_SEQATENDIRQ 15 /* Sequence End IRQ */ +#define BITP_BEEP_CFG_SEQNEARENDIRQ 14 /* Sequence 1 Cycle from End IRQ */ +#define BITP_BEEP_CFG_BENDIRQ 13 /* Tone B End IRQ */ +#define BITP_BEEP_CFG_BSTARTIRQ 12 /* Tone B Start IRQ */ +#define BITP_BEEP_CFG_AENDIRQ 11 /* Tone A End IRQ */ +#define BITP_BEEP_CFG_ASTARTIRQ 10 /* Tone A Start IRQ */ +#define BITP_BEEP_CFG_EN 8 /* Beeper Enable */ +#define BITP_BEEP_CFG_SEQREPEAT 0 /* Beeper Sequence Repeat Value */ +#define BITM_BEEP_CFG_SEQATENDIRQ (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Sequence End IRQ */ +#define BITM_BEEP_CFG_SEQNEARENDIRQ (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Sequence 1 Cycle from End IRQ */ +#define BITM_BEEP_CFG_BENDIRQ (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Tone B End IRQ */ +#define BITM_BEEP_CFG_BSTARTIRQ (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Tone B Start IRQ */ +#define BITM_BEEP_CFG_AENDIRQ (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Tone A End IRQ */ +#define BITM_BEEP_CFG_ASTARTIRQ (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Tone A Start IRQ */ +#define BITM_BEEP_CFG_EN (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Beeper Enable */ +#define BITM_BEEP_CFG_SEQREPEAT (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Beeper Sequence Repeat Value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + BEEP_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_BEEP_STAT_SEQENDED 15 /* Sequencer Has Ended */ +#define BITP_BEEP_STAT_SEQNEAREND 14 /* Sequencer Last Tone-pair Has Started */ +#define BITP_BEEP_STAT_BENDED 13 /* Tone B Has Ended */ +#define BITP_BEEP_STAT_BSTARTED 12 /* Tone B Has Started */ +#define BITP_BEEP_STAT_AENDED 11 /* Tone A Has Ended */ +#define BITP_BEEP_STAT_ASTARTED 10 /* Tone A Has Started */ +#define BITP_BEEP_STAT_BUSY 8 /* Beeper is Busy */ +#define BITP_BEEP_STAT_SEQREMAIN 0 /* Remaining Tone-pair Iterations to Play in Sequence Mode */ +#define BITM_BEEP_STAT_SEQENDED (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Sequencer Has Ended */ +#define BITM_BEEP_STAT_SEQNEAREND (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Sequencer Last Tone-pair Has Started */ +#define BITM_BEEP_STAT_BENDED (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Tone B Has Ended */ +#define BITM_BEEP_STAT_BSTARTED (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Tone B Has Started */ +#define BITM_BEEP_STAT_AENDED (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Tone A Has Ended */ +#define BITM_BEEP_STAT_ASTARTED (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Tone A Has Started */ +#define BITM_BEEP_STAT_BUSY (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Beeper is Busy */ +#define BITM_BEEP_STAT_SEQREMAIN (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Remaining Tone-pair Iterations to Play in Sequence Mode */ + +/* ------------------------------------------------------------------------------------------------------------------------- + BEEP_TONEA Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_BEEP_TONEA_DIS 15 /* Output Disable */ +#define BITP_BEEP_TONEA_FREQ 8 /* Tone Frequency */ +#define BITP_BEEP_TONEA_DUR 0 /* Tone Duration */ +#define BITM_BEEP_TONEA_DIS (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Output Disable */ +#define BITM_BEEP_TONEA_FREQ (_ADI_MSK_3(0x00007F00,0x00007F00U, uint16_t )) /* Tone Frequency */ +#define BITM_BEEP_TONEA_DUR (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Tone Duration */ + +/* ------------------------------------------------------------------------------------------------------------------------- + BEEP_TONEB Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_BEEP_TONEB_DIS 15 /* Output Disable */ +#define BITP_BEEP_TONEB_FREQ 8 /* Tone Frequency */ +#define BITP_BEEP_TONEB_DUR 0 /* Tone Duration */ +#define BITM_BEEP_TONEB_DIS (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Output Disable */ +#define BITM_BEEP_TONEB_FREQ (_ADI_MSK_3(0x00007F00,0x00007F00U, uint16_t )) /* Tone Frequency */ +#define BITM_BEEP_TONEB_DUR (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Tone Duration */ + + +/* ============================================================================================================================ + + ============================================================================================================================ */ + +/* ============================================================================================================================ + ADC0 + ============================================================================================================================ */ +#define REG_ADC0_CFG 0x40007000 /* ADC0 ADC Configuration */ +#define REG_ADC0_PWRUP 0x40007004 /* ADC0 ADC Power-up Time */ +#define REG_ADC0_CAL_WORD 0x40007008 /* ADC0 Calibration Word */ +#define REG_ADC0_CNV_CFG 0x4000700C /* ADC0 ADC Conversion Configuration */ +#define REG_ADC0_CNV_TIME 0x40007010 /* ADC0 ADC Conversion Time */ +#define REG_ADC0_AVG_CFG 0x40007014 /* ADC0 Averaging Configuration */ +#define REG_ADC0_IRQ_EN 0x40007020 /* ADC0 Interrupt Enable */ +#define REG_ADC0_STAT 0x40007024 /* ADC0 ADC Status */ +#define REG_ADC0_OVF 0x40007028 /* ADC0 Overflow of Output Registers */ +#define REG_ADC0_ALERT 0x4000702C /* ADC0 Alert Indication */ +#define REG_ADC0_CH0_OUT 0x40007030 /* ADC0 Conversion Result Channel 0 */ +#define REG_ADC0_CH1_OUT 0x40007034 /* ADC0 Conversion Result Channel 1 */ +#define REG_ADC0_CH2_OUT 0x40007038 /* ADC0 Conversion Result Channel 2 */ +#define REG_ADC0_CH3_OUT 0x4000703C /* ADC0 Conversion Result Channel 3 */ +#define REG_ADC0_CH4_OUT 0x40007040 /* ADC0 Conversion Result Channel 4 */ +#define REG_ADC0_CH5_OUT 0x40007044 /* ADC0 Conversion Result Channel 5 */ +#define REG_ADC0_CH6_OUT 0x40007048 /* ADC0 Conversion Result Channel 6 */ +#define REG_ADC0_CH7_OUT 0x4000704C /* ADC0 Conversion Result Channel 7 */ +#define REG_ADC0_BAT_OUT 0x40007050 /* ADC0 Battery Monitoring Result */ +#define REG_ADC0_TMP_OUT 0x40007054 /* ADC0 Temperature Result */ +#define REG_ADC0_TMP2_OUT 0x40007058 /* ADC0 Temperature Result 2 */ +#define REG_ADC0_DMA_OUT 0x4000705C /* ADC0 DMA Output Register */ +#define REG_ADC0_LIM0_LO 0x40007060 /* ADC0 Channel 0 Low Limit */ +#define REG_ADC0_LIM0_HI 0x40007064 /* ADC0 Channel 0 High Limit */ +#define REG_ADC0_HYS0 0x40007068 /* ADC0 Channel 0 Hysteresis */ +#define REG_ADC0_LIM1_LO 0x40007070 /* ADC0 Channel 1 Low Limit */ +#define REG_ADC0_LIM1_HI 0x40007074 /* ADC0 Channel 1 High Limit */ +#define REG_ADC0_HYS1 0x40007078 /* ADC0 Channel 1 Hysteresis */ +#define REG_ADC0_LIM2_LO 0x40007080 /* ADC0 Channel 2 Low Limit */ +#define REG_ADC0_LIM2_HI 0x40007084 /* ADC0 Channel 2 High Limit */ +#define REG_ADC0_HYS2 0x40007088 /* ADC0 Channel 2 Hysteresis */ +#define REG_ADC0_LIM3_LO 0x40007090 /* ADC0 Channel 3 Low Limit */ +#define REG_ADC0_LIM3_HI 0x40007094 /* ADC0 Channel 3 High Limit */ +#define REG_ADC0_HYS3 0x40007098 /* ADC0 Channel 3 Hysteresis */ +#define REG_ADC0_CFG1 0x400070C0 /* ADC0 Reference Buffer Low Power Mode */ + +/* ============================================================================================================================ + ADC Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_CFG Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_CFG_VREFVBAT_DEL 10 /* Set to 1 after minimum delay of 700 us from VREFBAT field being set to 1 */ +#define BITP_ADC_CFG_FAST_DISCH 9 /* For fast switchover of Vref from 2.5 V to 1.25 V */ +#define BITP_ADC_CFG_TMPEN 8 /* To power up temperature sensor */ +#define BITP_ADC_CFG_SINKEN 7 /* To enable additional 50 uA sink current capability @1.25 V, 100 uA current capability @2.5 V */ +#define BITP_ADC_CFG_RST 6 /* Resets internal buffers and registers when high */ +#define BITP_ADC_CFG_STARTCAL 5 /* To start a new offset calibration cycle */ +#define BITP_ADC_CFG_EN 4 /* To enable ADC subsystem */ +#define BITP_ADC_CFG_VREFVBAT 3 /* VRef VBAT */ +#define BITP_ADC_CFG_REFBUFEN 2 /* To enable internal reference buffer */ +#define BITP_ADC_CFG_VREFSEL 1 /* To select Vref as 1.25 V or 2.5 V */ +#define BITP_ADC_CFG_PWRUP 0 /* Powering up ADC */ +#define BITM_ADC_CFG_VREFVBAT_DEL (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Set to 1 after minimum delay of 700 us from VREFBAT field being set to 1 */ +#define BITM_ADC_CFG_FAST_DISCH (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* For fast switchover of Vref from 2.5 V to 1.25 V */ +#define BITM_ADC_CFG_TMPEN (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* To power up temperature sensor */ +#define BITM_ADC_CFG_SINKEN (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* To enable additional 50 uA sink current capability @1.25 V, 100 uA current capability @2.5 V */ +#define BITM_ADC_CFG_RST (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Resets internal buffers and registers when high */ +#define BITM_ADC_CFG_STARTCAL (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* To start a new offset calibration cycle */ +#define BITM_ADC_CFG_EN (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* To enable ADC subsystem */ +#define BITM_ADC_CFG_VREFVBAT (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* VRef VBAT */ +#define BITM_ADC_CFG_REFBUFEN (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* To enable internal reference buffer */ +#define BITM_ADC_CFG_VREFSEL (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* To select Vref as 1.25 V or 2.5 V */ +#define BITM_ADC_CFG_PWRUP (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Powering up ADC */ +#define ENUM_ADC_CFG_EXT_REF (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* REFBUFEN: External reference is used */ +#define ENUM_ADC_CFG_BUF_REF (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* REFBUFEN: Reference buffer is enabled */ +#define ENUM_ADC_CFG_V_2P5 (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* VREFSEL: Vref = 2.5 V */ +#define ENUM_ADC_CFG_V_1P25 (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* VREFSEL: Vref = 1.25 V */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_PWRUP Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_PWRUP_WAIT 0 /* Program this count to generate 20us wait time with respect to the PCLK frequency */ +#define BITM_ADC_PWRUP_WAIT (_ADI_MSK_3(0x000007FF,0x000007FFU, uint16_t )) /* Program this count to generate 20us wait time with respect to the PCLK frequency */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_CAL_WORD Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_CAL_WORD_VALUE 0 /* Offset calibration word */ +#define BITM_ADC_CAL_WORD_VALUE (_ADI_MSK_3(0x0000007F,0x0000007FU, uint16_t )) /* Offset calibration word */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_CNV_CFG Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_CNV_CFG_MULTI 15 /* Set to start multiple conversions */ +#define BITP_ADC_CNV_CFG_SINGLE 14 /* Set to start single conversion */ +#define BITP_ADC_CNV_CFG_DMAEN 13 /* To enable DMA channel */ +#define BITP_ADC_CNV_CFG_AUTOMODE 12 /* To enable auto mode */ +#define BITP_ADC_CNV_CFG_TMP2 10 /* To select temperature measurement 2 */ +#define BITP_ADC_CNV_CFG_TMP 9 /* To select temperature measurement 1 */ +#define BITP_ADC_CNV_CFG_BAT 8 /* To enable battery monitoring */ +#define BITP_ADC_CNV_CFG_SEL 0 /* To select channel(s) to convert */ +#define BITM_ADC_CNV_CFG_MULTI (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Set to start multiple conversions */ +#define BITM_ADC_CNV_CFG_SINGLE (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Set to start single conversion */ +#define BITM_ADC_CNV_CFG_DMAEN (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* To enable DMA channel */ +#define BITM_ADC_CNV_CFG_AUTOMODE (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* To enable auto mode */ +#define BITM_ADC_CNV_CFG_TMP2 (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* To select temperature measurement 2 */ +#define BITM_ADC_CNV_CFG_TMP (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* To select temperature measurement 1 */ +#define BITM_ADC_CNV_CFG_BAT (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* To enable battery monitoring */ +#define BITM_ADC_CNV_CFG_SEL (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* To select channel(s) to convert */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_CNV_TIME Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_CNV_TIME_DLY 8 /* Delay between two consecutive conversions in terms of number of ACLK cycles */ +#define BITP_ADC_CNV_TIME_SAMPTIME 0 /* Number of clock cycles (ACLK) required for sampling */ +#define BITM_ADC_CNV_TIME_DLY (_ADI_MSK_3(0x0000FF00,0x0000FF00U, uint16_t )) /* Delay between two consecutive conversions in terms of number of ACLK cycles */ +#define BITM_ADC_CNV_TIME_SAMPTIME (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Number of clock cycles (ACLK) required for sampling */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_AVG_CFG Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_AVG_CFG_EN 15 /* To enable averaging on Channels enabled in enable register */ +#define BITP_ADC_AVG_CFG_OS 14 /* Enable oversampling */ +#define BITP_ADC_AVG_CFG_FACTOR 0 /* Program averaging factor for averaging enabled channels (1-256) */ +#define BITM_ADC_AVG_CFG_EN (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* To enable averaging on Channels enabled in enable register */ +#define BITM_ADC_AVG_CFG_OS (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Enable oversampling */ +#define BITM_ADC_AVG_CFG_FACTOR (_ADI_MSK_3(0x000000FF,0x000000FFU, uint16_t )) /* Program averaging factor for averaging enabled channels (1-256) */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_IRQ_EN Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_IRQ_EN_RDY 13 /* Set to enable interrupt when ADC is ready to convert */ +#define BITP_ADC_IRQ_EN_ALERT 12 /* Set to enable interrupt on crossing lower or higher limit */ +#define BITP_ADC_IRQ_EN_OVF 11 /* Set to enable interrupt in case of overflow */ +#define BITP_ADC_IRQ_EN_CALDONE 10 /* Set it to enable interrupt for calibration done */ +#define BITP_ADC_IRQ_EN_CNVDONE 0 /* Set it to enable interrupt after conversion is done */ +#define BITM_ADC_IRQ_EN_RDY (_ADI_MSK_3(0x00002000,0x00002000U, uint16_t )) /* Set to enable interrupt when ADC is ready to convert */ +#define BITM_ADC_IRQ_EN_ALERT (_ADI_MSK_3(0x00001000,0x00001000U, uint16_t )) /* Set to enable interrupt on crossing lower or higher limit */ +#define BITM_ADC_IRQ_EN_OVF (_ADI_MSK_3(0x00000800,0x00000800U, uint16_t )) /* Set to enable interrupt in case of overflow */ +#define BITM_ADC_IRQ_EN_CALDONE (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Set it to enable interrupt for calibration done */ +#define BITM_ADC_IRQ_EN_CNVDONE (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Set it to enable interrupt after conversion is done */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_STAT_RDY 15 /* Indicates ADC is ready to start converting, when using external reference buffer */ +#define BITP_ADC_STAT_CALDONE 14 /* Indicates calibration is done */ +#define BITP_ADC_STAT_TMP2DONE 10 /* Indicates conversion is done for temperature sensing 2 */ +#define BITP_ADC_STAT_TMPDONE 9 /* Indicates conversion is done for temperature sensing */ +#define BITP_ADC_STAT_BATDONE 8 /* Indicates conversion done for battery monitoring */ +#define BITP_ADC_STAT_DONE7 7 /* Indicates conversion done on Channel 7 */ +#define BITP_ADC_STAT_DONE6 6 /* Indicates conversion done on Channel 6 */ +#define BITP_ADC_STAT_DONE5 5 /* Indicates conversion done on Channel 5 */ +#define BITP_ADC_STAT_DONE4 4 /* Indicates conversion done on Channel 4 */ +#define BITP_ADC_STAT_DONE3 3 /* Indicates conversion done on Channel 3 */ +#define BITP_ADC_STAT_DONE2 2 /* Indicates conversion done on Channel 2 */ +#define BITP_ADC_STAT_DONE1 1 /* Indicates conversion done on Channel 1 */ +#define BITP_ADC_STAT_DONE0 0 /* Indicates conversion done on Channel 0 */ +#define BITM_ADC_STAT_RDY (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* Indicates ADC is ready to start converting, when using external reference buffer */ +#define BITM_ADC_STAT_CALDONE (_ADI_MSK_3(0x00004000,0x00004000U, uint16_t )) /* Indicates calibration is done */ +#define BITM_ADC_STAT_TMP2DONE (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Indicates conversion is done for temperature sensing 2 */ +#define BITM_ADC_STAT_TMPDONE (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Indicates conversion is done for temperature sensing */ +#define BITM_ADC_STAT_BATDONE (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Indicates conversion done for battery monitoring */ +#define BITM_ADC_STAT_DONE7 (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Indicates conversion done on Channel 7 */ +#define BITM_ADC_STAT_DONE6 (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Indicates conversion done on Channel 6 */ +#define BITM_ADC_STAT_DONE5 (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Indicates conversion done on Channel 5 */ +#define BITM_ADC_STAT_DONE4 (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Indicates conversion done on Channel 4 */ +#define BITM_ADC_STAT_DONE3 (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Indicates conversion done on Channel 3 */ +#define BITM_ADC_STAT_DONE2 (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Indicates conversion done on Channel 2 */ +#define BITM_ADC_STAT_DONE1 (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Indicates conversion done on Channel 1 */ +#define BITM_ADC_STAT_DONE0 (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Indicates conversion done on Channel 0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_OVF Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_OVF_TMP2 10 /* Indicates overflow in temperature 2 output register */ +#define BITP_ADC_OVF_TMP 9 /* Indicates overflow in temperature output register */ +#define BITP_ADC_OVF_BAT 8 /* Indicates overflow in battery monitoring output register */ +#define BITP_ADC_OVF_CH7 7 /* Indicates overflow in channel 7 output register */ +#define BITP_ADC_OVF_CH6 6 /* Indicates overflow in channel 6 output register */ +#define BITP_ADC_OVF_CH5 5 /* Indicates overflow in channel 5 output register */ +#define BITP_ADC_OVF_CH4 4 /* Indicates overflow in channel 4 output register */ +#define BITP_ADC_OVF_CH3 3 /* Indicates overflow in channel 3 output register */ +#define BITP_ADC_OVF_CH2 2 /* Indicates overflow in channel 2 output register */ +#define BITP_ADC_OVF_CH1 1 /* Indicates overflow in channel 1 output register */ +#define BITP_ADC_OVF_CH0 0 /* Indicates overflow in channel 0 output register */ +#define BITM_ADC_OVF_TMP2 (_ADI_MSK_3(0x00000400,0x00000400U, uint16_t )) /* Indicates overflow in temperature 2 output register */ +#define BITM_ADC_OVF_TMP (_ADI_MSK_3(0x00000200,0x00000200U, uint16_t )) /* Indicates overflow in temperature output register */ +#define BITM_ADC_OVF_BAT (_ADI_MSK_3(0x00000100,0x00000100U, uint16_t )) /* Indicates overflow in battery monitoring output register */ +#define BITM_ADC_OVF_CH7 (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Indicates overflow in channel 7 output register */ +#define BITM_ADC_OVF_CH6 (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Indicates overflow in channel 6 output register */ +#define BITM_ADC_OVF_CH5 (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Indicates overflow in channel 5 output register */ +#define BITM_ADC_OVF_CH4 (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Indicates overflow in channel 4 output register */ +#define BITM_ADC_OVF_CH3 (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Indicates overflow in channel 3 output register */ +#define BITM_ADC_OVF_CH2 (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Indicates overflow in channel 2 output register */ +#define BITM_ADC_OVF_CH1 (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Indicates overflow in channel 1 output register */ +#define BITM_ADC_OVF_CH0 (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Indicates overflow in channel 0 output register */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_ALERT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_ALERT_LO3 7 /* Channel 3 Low alert status */ +#define BITP_ADC_ALERT_HI3 6 /* Channel 3 High alert status */ +#define BITP_ADC_ALERT_LO2 5 /* Channel 2 Low alert status */ +#define BITP_ADC_ALERT_HI2 4 /* Channel 2 High alert status */ +#define BITP_ADC_ALERT_LO1 3 /* Channel 1 Low alert status */ +#define BITP_ADC_ALERT_HI1 2 /* Channel 1 High alert status */ +#define BITP_ADC_ALERT_LO0 1 /* Channel 0 Low alert status */ +#define BITP_ADC_ALERT_HI0 0 /* Channel 0 High alert status */ +#define BITM_ADC_ALERT_LO3 (_ADI_MSK_3(0x00000080,0x00000080U, uint16_t )) /* Channel 3 Low alert status */ +#define BITM_ADC_ALERT_HI3 (_ADI_MSK_3(0x00000040,0x00000040U, uint16_t )) /* Channel 3 High alert status */ +#define BITM_ADC_ALERT_LO2 (_ADI_MSK_3(0x00000020,0x00000020U, uint16_t )) /* Channel 2 Low alert status */ +#define BITM_ADC_ALERT_HI2 (_ADI_MSK_3(0x00000010,0x00000010U, uint16_t )) /* Channel 2 High alert status */ +#define BITM_ADC_ALERT_LO1 (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Channel 1 Low alert status */ +#define BITM_ADC_ALERT_HI1 (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* Channel 1 High alert status */ +#define BITM_ADC_ALERT_LO0 (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Channel 0 Low alert status */ +#define BITM_ADC_ALERT_HI0 (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Channel 0 High alert status */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_CH0_OUT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_CH0_OUT_RESULT 0 /* Conversion result of channel 0 is stored here */ +#define BITM_ADC_CH0_OUT_RESULT (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Conversion result of channel 0 is stored here */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_CH1_OUT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_CH1_OUT_RESULT 0 /* Conversion result of channel 1 is stored here */ +#define BITM_ADC_CH1_OUT_RESULT (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Conversion result of channel 1 is stored here */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_CH2_OUT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_CH2_OUT_RESULT 0 /* Conversion result of channel 2 is stored here */ +#define BITM_ADC_CH2_OUT_RESULT (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Conversion result of channel 2 is stored here */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_CH3_OUT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_CH3_OUT_RESULT 0 /* Conversion result of channel 3 is stored here */ +#define BITM_ADC_CH3_OUT_RESULT (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Conversion result of channel 3 is stored here */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_CH4_OUT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_CH4_OUT_RESULT 0 /* Conversion result of channel 4 is stored here */ +#define BITM_ADC_CH4_OUT_RESULT (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Conversion result of channel 4 is stored here */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_CH5_OUT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_CH5_OUT_RESULT 0 /* Conversion result of channel 5 is stored here */ +#define BITM_ADC_CH5_OUT_RESULT (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Conversion result of channel 5 is stored here */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_CH6_OUT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_CH6_OUT_RESULT 0 /* Conversion result of channel 6 is stored here */ +#define BITM_ADC_CH6_OUT_RESULT (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Conversion result of channel 6 is stored here */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_CH7_OUT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_CH7_OUT_RESULT 0 /* Conversion result of channel 7 is stored here */ +#define BITM_ADC_CH7_OUT_RESULT (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Conversion result of channel 7 is stored here */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_BAT_OUT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_BAT_OUT_RESULT 0 /* Conversion result of battery monitoring is stored here */ +#define BITM_ADC_BAT_OUT_RESULT (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Conversion result of battery monitoring is stored here */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_TMP_OUT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_TMP_OUT_RESULT 0 /* Conversion result of Temperature measurement 1 is stored here */ +#define BITM_ADC_TMP_OUT_RESULT (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Conversion result of Temperature measurement 1 is stored here */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_TMP2_OUT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_TMP2_OUT_RESULT 0 /* Conversion result of Temperature measurement 2 is stored here */ +#define BITM_ADC_TMP2_OUT_RESULT (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Conversion result of Temperature measurement 2 is stored here */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_DMA_OUT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_DMA_OUT_RESULT 0 /* Register to store conversion result for DMA */ +#define BITM_ADC_DMA_OUT_RESULT (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Register to store conversion result for DMA */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_LIM0_LO Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_LIM0_LO_EN 15 /* To enable low limit comparison on Channel 0 */ +#define BITP_ADC_LIM0_LO_VALUE 0 /* Low limit value for channel 0 */ +#define BITM_ADC_LIM0_LO_EN (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* To enable low limit comparison on Channel 0 */ +#define BITM_ADC_LIM0_LO_VALUE (_ADI_MSK_3(0x00000FFF,0x00000FFFU, uint16_t )) /* Low limit value for channel 0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_LIM0_HI Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_LIM0_HI_EN 15 /* To enable high limit comparison on Channel 0 */ +#define BITP_ADC_LIM0_HI_VALUE 0 /* High limit value for channel 0 */ +#define BITM_ADC_LIM0_HI_EN (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* To enable high limit comparison on Channel 0 */ +#define BITM_ADC_LIM0_HI_VALUE (_ADI_MSK_3(0x00000FFF,0x00000FFFU, uint16_t )) /* High limit value for channel 0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_HYS0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_HYS0_EN 15 /* To enable hysteresis for comparison on Channel 0 */ +#define BITP_ADC_HYS0_MONCYC 12 /* Program number of conversion cycles to monitor channel 0 before raising alert */ +#define BITP_ADC_HYS0_VALUE 0 /* Hysteresis value for Channel 0 */ +#define BITM_ADC_HYS0_EN (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* To enable hysteresis for comparison on Channel 0 */ +#define BITM_ADC_HYS0_MONCYC (_ADI_MSK_3(0x00007000,0x00007000U, uint16_t )) /* Program number of conversion cycles to monitor channel 0 before raising alert */ +#define BITM_ADC_HYS0_VALUE (_ADI_MSK_3(0x000001FF,0x000001FFU, uint16_t )) /* Hysteresis value for Channel 0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_LIM1_LO Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_LIM1_LO_EN 15 /* To enable low limit comparison on Channel 1 */ +#define BITP_ADC_LIM1_LO_VALUE 0 /* Low limit value for channel 1 */ +#define BITM_ADC_LIM1_LO_EN (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* To enable low limit comparison on Channel 1 */ +#define BITM_ADC_LIM1_LO_VALUE (_ADI_MSK_3(0x00000FFF,0x00000FFFU, uint16_t )) /* Low limit value for channel 1 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_LIM1_HI Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_LIM1_HI_EN 15 /* To enable high limit comparison on Channel 1 */ +#define BITP_ADC_LIM1_HI_VALUE 0 /* High limit value for channel 1 */ +#define BITM_ADC_LIM1_HI_EN (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* To enable high limit comparison on Channel 1 */ +#define BITM_ADC_LIM1_HI_VALUE (_ADI_MSK_3(0x00000FFF,0x00000FFFU, uint16_t )) /* High limit value for channel 1 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_HYS1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_HYS1_EN 15 /* To enable hysteresis for comparison on Channel 1 */ +#define BITP_ADC_HYS1_MONCYC 12 /* Program number of conversion cycles to monitor channel 1 before raising alert */ +#define BITP_ADC_HYS1_VALUE 0 /* Hysteresis value for Channel 1 */ +#define BITM_ADC_HYS1_EN (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* To enable hysteresis for comparison on Channel 1 */ +#define BITM_ADC_HYS1_MONCYC (_ADI_MSK_3(0x00007000,0x00007000U, uint16_t )) /* Program number of conversion cycles to monitor channel 1 before raising alert */ +#define BITM_ADC_HYS1_VALUE (_ADI_MSK_3(0x000001FF,0x000001FFU, uint16_t )) /* Hysteresis value for Channel 1 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_LIM2_LO Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_LIM2_LO_EN 15 /* To enable low limit comparison on Channel 2 */ +#define BITP_ADC_LIM2_LO_VALUE 0 /* Low limit value for channel 2 */ +#define BITM_ADC_LIM2_LO_EN (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* To enable low limit comparison on Channel 2 */ +#define BITM_ADC_LIM2_LO_VALUE (_ADI_MSK_3(0x00000FFF,0x00000FFFU, uint16_t )) /* Low limit value for channel 2 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_LIM2_HI Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_LIM2_HI_EN 15 /* To enable high limit comparison on Channel 2 */ +#define BITP_ADC_LIM2_HI_VALUE 0 /* High limit value for channel 2 */ +#define BITM_ADC_LIM2_HI_EN (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* To enable high limit comparison on Channel 2 */ +#define BITM_ADC_LIM2_HI_VALUE (_ADI_MSK_3(0x00000FFF,0x00000FFFU, uint16_t )) /* High limit value for channel 2 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_HYS2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_HYS2_EN 15 /* To enable hysteresis for comparison on Channel 2 */ +#define BITP_ADC_HYS2_MONCYC 12 /* Program number of conversion cycles to monitor channel 2 before raising alert */ +#define BITP_ADC_HYS2_VALUE 0 /* Hysteresis value for Channel 2 */ +#define BITM_ADC_HYS2_EN (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* To enable hysteresis for comparison on Channel 2 */ +#define BITM_ADC_HYS2_MONCYC (_ADI_MSK_3(0x00007000,0x00007000U, uint16_t )) /* Program number of conversion cycles to monitor channel 2 before raising alert */ +#define BITM_ADC_HYS2_VALUE (_ADI_MSK_3(0x000001FF,0x000001FFU, uint16_t )) /* Hysteresis value for Channel 2 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_LIM3_LO Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_LIM3_LO_EN 15 /* To enable low limit comparison on Channel 3 */ +#define BITP_ADC_LIM3_LO_VALUE 0 /* Low limit value for channel 3 */ +#define BITM_ADC_LIM3_LO_EN (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* To enable low limit comparison on Channel 3 */ +#define BITM_ADC_LIM3_LO_VALUE (_ADI_MSK_3(0x00000FFF,0x00000FFFU, uint16_t )) /* Low limit value for channel 3 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_LIM3_HI Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_LIM3_HI_EN 15 /* To enable high limit comparison on Channel 3 */ +#define BITP_ADC_LIM3_HI_VALUE 0 /* High limit value for channel 3 */ +#define BITM_ADC_LIM3_HI_EN (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* To enable high limit comparison on Channel 3 */ +#define BITM_ADC_LIM3_HI_VALUE (_ADI_MSK_3(0x00000FFF,0x00000FFFU, uint16_t )) /* High limit value for channel 3 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_HYS3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_HYS3_EN 15 /* To enable hysteresis for comparison on Channel 3 */ +#define BITP_ADC_HYS3_MONCYC 12 /* Program number of conversion cycles to monitor channel 3 before raising alert */ +#define BITP_ADC_HYS3_VALUE 0 /* Hysteresis value for Channel 3 */ +#define BITM_ADC_HYS3_EN (_ADI_MSK_3(0x00008000,0x00008000U, uint16_t )) /* To enable hysteresis for comparison on Channel 3 */ +#define BITM_ADC_HYS3_MONCYC (_ADI_MSK_3(0x00007000,0x00007000U, uint16_t )) /* Program number of conversion cycles to monitor channel 3 before raising alert */ +#define BITM_ADC_HYS3_VALUE (_ADI_MSK_3(0x000001FF,0x000001FFU, uint16_t )) /* Hysteresis value for Channel 3 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + ADC_CFG1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_ADC_CFG1_RBUFLP 0 /* Enable low power mode for reference buffer */ +#define BITM_ADC_CFG1_RBUFLP (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Enable low power mode for reference buffer */ + + +/* ============================================================================================================================ + DMA + ============================================================================================================================ */ + +/* ============================================================================================================================ + DMA0 + ============================================================================================================================ */ +#define REG_DMA0_STAT 0x40010000 /* DMA0 DMA Status */ +#define REG_DMA0_CFG 0x40010004 /* DMA0 DMA Configuration */ +#define REG_DMA0_PDBPTR 0x40010008 /* DMA0 DMA Channel Primary Control Database Pointer */ +#define REG_DMA0_ADBPTR 0x4001000C /* DMA0 DMA Channel Alternate Control Database Pointer */ +#define REG_DMA0_SWREQ 0x40010014 /* DMA0 DMA Channel Software Request */ +#define REG_DMA0_RMSK_SET 0x40010020 /* DMA0 DMA Channel Request Mask Set */ +#define REG_DMA0_RMSK_CLR 0x40010024 /* DMA0 DMA Channel Request Mask Clear */ +#define REG_DMA0_EN_SET 0x40010028 /* DMA0 DMA Channel Enable Set */ +#define REG_DMA0_EN_CLR 0x4001002C /* DMA0 DMA Channel Enable Clear */ +#define REG_DMA0_ALT_SET 0x40010030 /* DMA0 DMA Channel Primary Alternate Set */ +#define REG_DMA0_ALT_CLR 0x40010034 /* DMA0 DMA Channel Primary Alternate Clear */ +#define REG_DMA0_PRI_SET 0x40010038 /* DMA0 DMA Channel Priority Set */ +#define REG_DMA0_PRI_CLR 0x4001003C /* DMA0 DMA Channel Priority Clear */ +#define REG_DMA0_ERRCHNL_CLR 0x40010048 /* DMA0 DMA per Channel Error Clear */ +#define REG_DMA0_ERR_CLR 0x4001004C /* DMA0 DMA Bus Error Clear */ +#define REG_DMA0_INVALIDDESC_CLR 0x40010050 /* DMA0 DMA per Channel Invalid Descriptor Clear */ +#define REG_DMA0_BS_SET 0x40010800 /* DMA0 DMA Channel Bytes Swap Enable Set */ +#define REG_DMA0_BS_CLR 0x40010804 /* DMA0 DMA Channel Bytes Swap Enable Clear */ +#define REG_DMA0_SRCADDR_SET 0x40010810 /* DMA0 DMA Channel Source Address Decrement Enable Set */ +#define REG_DMA0_SRCADDR_CLR 0x40010814 /* DMA0 DMA Channel Source Address Decrement Enable Clear */ +#define REG_DMA0_DSTADDR_SET 0x40010818 /* DMA0 DMA Channel Destination Address Decrement Enable Set */ +#define REG_DMA0_DSTADDR_CLR 0x4001081C /* DMA0 DMA Channel Destination Address Decrement Enable Clear */ +#define REG_DMA0_REVID 0x40010FE0 /* DMA0 DMA Controller Revision ID */ + +/* ============================================================================================================================ + DMA Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_STAT_CHANM1 16 /* Number of Available DMA Channels Minus 1 */ +#define BITP_DMA_STAT_MEN 0 /* Enable Status of the Controller */ +#define BITM_DMA_STAT_CHANM1 (_ADI_MSK_3(0x001F0000,0x001F0000UL, uint32_t )) /* Number of Available DMA Channels Minus 1 */ +#define BITM_DMA_STAT_MEN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Enable Status of the Controller */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_CFG Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_CFG_MEN 0 /* Controller Enable */ +#define BITM_DMA_CFG_MEN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Controller Enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_PDBPTR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_PDBPTR_ADDR 0 /* Pointer to the Base Address of the Primary Data Structure */ +#define BITM_DMA_PDBPTR_ADDR (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Pointer to the Base Address of the Primary Data Structure */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_ADBPTR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_ADBPTR_ADDR 0 /* Base Address of the Alternate Data Structure */ +#define BITM_DMA_ADBPTR_ADDR (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Base Address of the Alternate Data Structure */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_SWREQ Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_SWREQ_CHAN 0 /* Generate Software Request */ +#define BITM_DMA_SWREQ_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Generate Software Request */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_RMSK_SET Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_RMSK_SET_CHAN 0 /* Mask Requests from DMA Channels */ +#define BITM_DMA_RMSK_SET_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Mask Requests from DMA Channels */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_RMSK_CLR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_RMSK_CLR_CHAN 0 /* Clear Request Mask Set Bits */ +#define BITM_DMA_RMSK_CLR_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Clear Request Mask Set Bits */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_EN_SET Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_EN_SET_CHAN 0 /* Enable DMA Channels */ +#define BITM_DMA_EN_SET_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Enable DMA Channels */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_EN_CLR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_EN_CLR_CHAN 0 /* Disable DMA Channels */ +#define BITM_DMA_EN_CLR_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Disable DMA Channels */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_ALT_SET Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_ALT_SET_CHAN 0 /* Control Structure Status / Select Alternate Structure */ +#define BITM_DMA_ALT_SET_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Control Structure Status / Select Alternate Structure */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_ALT_CLR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_ALT_CLR_CHAN 0 /* Select Primary Data Structure */ +#define BITM_DMA_ALT_CLR_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Select Primary Data Structure */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_PRI_SET Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_PRI_SET_CHAN 0 /* Configure Channel for High Priority */ +#define BITM_DMA_PRI_SET_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Configure Channel for High Priority */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_PRI_CLR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_PRI_CLR_CHPRICLR 0 /* Configure Channel for Default Priority Level */ +#define BITM_DMA_PRI_CLR_CHPRICLR (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Configure Channel for Default Priority Level */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_ERRCHNL_CLR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_ERRCHNL_CLR_CHAN 0 /* Per Channel Bus Error Status/Clear */ +#define BITM_DMA_ERRCHNL_CLR_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Per Channel Bus Error Status/Clear */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_ERR_CLR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_ERR_CLR_CHAN 0 /* Bus Error Status */ +#define BITM_DMA_ERR_CLR_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Bus Error Status */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_INVALIDDESC_CLR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_INVALIDDESC_CLR_CHAN 0 /* Per Channel Invalid Descriptor Status/Clear */ +#define BITM_DMA_INVALIDDESC_CLR_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Per Channel Invalid Descriptor Status/Clear */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_BS_SET Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_BS_SET_CHAN 0 /* Byte Swap Status */ +#define BITM_DMA_BS_SET_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Byte Swap Status */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_BS_CLR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_BS_CLR_CHAN 0 /* Disable Byte Swap */ +#define BITM_DMA_BS_CLR_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Disable Byte Swap */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_SRCADDR_SET Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_SRCADDR_SET_CHAN 0 /* Source Address Decrement Status */ +#define BITM_DMA_SRCADDR_SET_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Source Address Decrement Status */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_SRCADDR_CLR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_SRCADDR_CLR_CHAN 0 /* Disable Source Address Decrement */ +#define BITM_DMA_SRCADDR_CLR_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Disable Source Address Decrement */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_DSTADDR_SET Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_DSTADDR_SET_CHAN 0 /* Destination Address Decrement Status */ +#define BITM_DMA_DSTADDR_SET_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Destination Address Decrement Status */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_DSTADDR_CLR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_DSTADDR_CLR_CHAN 0 /* Disable Destination Address Decrement */ +#define BITM_DMA_DSTADDR_CLR_CHAN (_ADI_MSK_3(0x07FFFFFF,0x07FFFFFFUL, uint32_t )) /* Disable Destination Address Decrement */ + +/* ------------------------------------------------------------------------------------------------------------------------- + DMA_REVID Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_DMA_REVID_VALUE 0 /* DMA Controller Revision ID */ +#define BITM_DMA_REVID_VALUE (_ADI_MSK_3(0x000000FF,0x000000FFUL, uint32_t )) /* DMA Controller Revision ID */ + + +/* ============================================================================================================================ + Flash Controller + ============================================================================================================================ */ + +/* ============================================================================================================================ + FLCC0 + ============================================================================================================================ */ +#define REG_FLCC0_STAT 0x40018000 /* FLCC0 Status */ +#define REG_FLCC0_IEN 0x40018004 /* FLCC0 Interrupt Enable */ +#define REG_FLCC0_CMD 0x40018008 /* FLCC0 Command */ +#define REG_FLCC0_KH_ADDR 0x4001800C /* FLCC0 Write Address */ +#define REG_FLCC0_KH_DATA0 0x40018010 /* FLCC0 Write Lower Data */ +#define REG_FLCC0_KH_DATA1 0x40018014 /* FLCC0 Write Upper Data */ +#define REG_FLCC0_PAGE_ADDR0 0x40018018 /* FLCC0 Lower Page Address */ +#define REG_FLCC0_PAGE_ADDR1 0x4001801C /* FLCC0 Upper Page Address */ +#define REG_FLCC0_KEY 0x40018020 /* FLCC0 Key */ +#define REG_FLCC0_WR_ABORT_ADDR 0x40018024 /* FLCC0 Write Abort Address */ +#define REG_FLCC0_WRPROT 0x40018028 /* FLCC0 Write Protection */ +#define REG_FLCC0_SIGNATURE 0x4001802C /* FLCC0 Signature */ +#define REG_FLCC0_UCFG 0x40018030 /* FLCC0 User Configuration */ +#define REG_FLCC0_TIME_PARAM0 0x40018034 /* FLCC0 Time Parameter 0 */ +#define REG_FLCC0_TIME_PARAM1 0x40018038 /* FLCC0 Time Parameter 1 */ +#define REG_FLCC0_ABORT_EN_LO 0x4001803C /* FLCC0 IRQ Abort Enable (Lower Bits) */ +#define REG_FLCC0_ABORT_EN_HI 0x40018040 /* FLCC0 IRQ Abort Enable (Upper Bits) */ +#define REG_FLCC0_ECC_CFG 0x40018044 /* FLCC0 ECC Configuration */ +#define REG_FLCC0_ECC_ADDR 0x40018048 /* FLCC0 ECC Status (Address) */ +#define REG_FLCC0_POR_SEC 0x40018050 /* FLCC0 Flash Security */ +#define REG_FLCC0_VOL_CFG 0x40018054 /* FLCC0 Volatile Flash Configuration */ + +/* ============================================================================================================================ + FLCC Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_STAT_ACCESS_MODE 31 /* Access Mode */ +#define BITP_FLCC_STAT_CACHESRAMPERR 29 /* SRAM parity errors in Cache Controller */ +#define BITP_FLCC_STAT_ECCDCODE 27 /* DCode AHB Bus Error ECC status */ +#define BITP_FLCC_STAT_ECCICODE 25 /* ICode AHB Bus Error ECC status */ +#define BITP_FLCC_STAT_ECCERRCNT 17 /* ECC correction counter */ +#define BITP_FLCC_STAT_ECCINFOSIGN 15 /* ECC status of flash initialization */ +#define BITP_FLCC_STAT_INIT 14 /* Flash controller initialization in progress */ +#define BITP_FLCC_STAT_SIGNERR 13 /* Signature check failure during initialization */ +#define BITP_FLCC_STAT_OVERLAP 11 /* Overlapping Command */ +#define BITP_FLCC_STAT_ECCRDERR 9 /* ECC IRQ cause */ +#define BITP_FLCC_STAT_ECCERRCMD 7 /* ECC errors detected during user issued SIGN command */ +#define BITP_FLCC_STAT_SLEEPING 6 /* Flash array is in low power (sleep) mode */ +#define BITP_FLCC_STAT_CMDFAIL 4 /* Provides information on command failures */ +#define BITP_FLCC_STAT_WRALCOMP 3 /* Write almost complete */ +#define BITP_FLCC_STAT_CMDCOMP 2 /* Command complete */ +#define BITP_FLCC_STAT_WRCLOSE 1 /* WRITE registers are closed */ +#define BITP_FLCC_STAT_CMDBUSY 0 /* Command busy */ +#define BITM_FLCC_STAT_ACCESS_MODE (_ADI_MSK_3(0x80000000,0x80000000UL, uint32_t )) /* Access Mode */ +#define BITM_FLCC_STAT_CACHESRAMPERR (_ADI_MSK_3(0x20000000,0x20000000UL, uint32_t )) /* SRAM parity errors in Cache Controller */ +#define BITM_FLCC_STAT_ECCDCODE (_ADI_MSK_3(0x18000000,0x18000000UL, uint32_t )) /* DCode AHB Bus Error ECC status */ +#define BITM_FLCC_STAT_ECCICODE (_ADI_MSK_3(0x06000000,0x06000000UL, uint32_t )) /* ICode AHB Bus Error ECC status */ +#define BITM_FLCC_STAT_ECCERRCNT (_ADI_MSK_3(0x000E0000,0x000E0000UL, uint32_t )) /* ECC correction counter */ +#define BITM_FLCC_STAT_ECCINFOSIGN (_ADI_MSK_3(0x00018000,0x00018000UL, uint32_t )) /* ECC status of flash initialization */ +#define BITM_FLCC_STAT_INIT (_ADI_MSK_3(0x00004000,0x00004000UL, uint32_t )) /* Flash controller initialization in progress */ +#define BITM_FLCC_STAT_SIGNERR (_ADI_MSK_3(0x00002000,0x00002000UL, uint32_t )) /* Signature check failure during initialization */ +#define BITM_FLCC_STAT_OVERLAP (_ADI_MSK_3(0x00000800,0x00000800UL, uint32_t )) /* Overlapping Command */ +#define BITM_FLCC_STAT_ECCRDERR (_ADI_MSK_3(0x00000600,0x00000600UL, uint32_t )) /* ECC IRQ cause */ +#define BITM_FLCC_STAT_ECCERRCMD (_ADI_MSK_3(0x00000180,0x00000180UL, uint32_t )) /* ECC errors detected during user issued SIGN command */ +#define BITM_FLCC_STAT_SLEEPING (_ADI_MSK_3(0x00000040,0x00000040UL, uint32_t )) /* Flash array is in low power (sleep) mode */ +#define BITM_FLCC_STAT_CMDFAIL (_ADI_MSK_3(0x00000030,0x00000030UL, uint32_t )) /* Provides information on command failures */ +#define BITM_FLCC_STAT_WRALCOMP (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* Write almost complete */ +#define BITM_FLCC_STAT_CMDCOMP (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Command complete */ +#define BITM_FLCC_STAT_WRCLOSE (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* WRITE registers are closed */ +#define BITM_FLCC_STAT_CMDBUSY (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Command busy */ +#define ENUM_FLCC_STAT_DIRECT (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* ACCESS_MODE: Flash controller is currently in Direct Access mode; user access to all registers is enabled */ +#define ENUM_FLCC_STAT_INDIRECT (_ADI_MSK_3(0x80000000,0x80000000UL, uint32_t )) /* ACCESS_MODE: Flash Controller is currently in Indirect Access mode; user access to registers is limited to read-only access of the status register. Full register access will be restored when the Cryptographic module releases control of the flash controller (crypto completes the ongoing operation within the protected key storage region) */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_IEN Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_IEN_ECC_ERROR 6 /* Control whether to generate bus errors, interrupts, or neither in response to 2-bit ECC Error events */ +#define BITP_FLCC_IEN_ECC_CORRECT 4 /* Control whether to generate bus errors, interrupts, or neither in response to 1-bit ECC Correction events */ +#define BITP_FLCC_IEN_CMDFAIL 2 /* Command fail interrupt enable */ +#define BITP_FLCC_IEN_WRALCMPLT 1 /* Write almost complete interrupt enable */ +#define BITP_FLCC_IEN_CMDCMPLT 0 /* Command complete interrupt enable */ +#define BITM_FLCC_IEN_ECC_ERROR (_ADI_MSK_3(0x000000C0,0x000000C0UL, uint32_t )) /* Control whether to generate bus errors, interrupts, or neither in response to 2-bit ECC Error events */ +#define BITM_FLCC_IEN_ECC_CORRECT (_ADI_MSK_3(0x00000030,0x00000030UL, uint32_t )) /* Control whether to generate bus errors, interrupts, or neither in response to 1-bit ECC Correction events */ +#define BITM_FLCC_IEN_CMDFAIL (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Command fail interrupt enable */ +#define BITM_FLCC_IEN_WRALCMPLT (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Write almost complete interrupt enable */ +#define BITM_FLCC_IEN_CMDCMPLT (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Command complete interrupt enable */ +#define ENUM_FLCC_IEN_NONE_ERR (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* ECC_ERROR: Do not generate a response to ECC events */ +#define ENUM_FLCC_IEN_BUS_ERR_ERR (_ADI_MSK_3(0x00000040,0x00000040UL, uint32_t )) /* ECC_ERROR: Generate Bus Errors in response to ECC events */ +#define ENUM_FLCC_IEN_IRQ_ERR (_ADI_MSK_3(0x00000080,0x00000080UL, uint32_t )) /* ECC_ERROR: Generate IRQs in response to ECC events */ +#define ENUM_FLCC_IEN_NONE_COR (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* ECC_CORRECT: Do not generate a response to ECC events */ +#define ENUM_FLCC_IEN_BUS_ERR_COR (_ADI_MSK_3(0x00000010,0x00000010UL, uint32_t )) /* ECC_CORRECT: Generate Bus Errors in response to ECC events */ +#define ENUM_FLCC_IEN_IRQ_COR (_ADI_MSK_3(0x00000020,0x00000020UL, uint32_t )) /* ECC_CORRECT: Generate IRQs in response to ECC events */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_CMD Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_CMD_VALUE 0 /* Commands */ +#define BITM_FLCC_CMD_VALUE (_ADI_MSK_3(0x0000000F,0x0000000FUL, uint32_t )) /* Commands */ +#define ENUM_FLCC_CMD_IDLE (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* VALUE: IDLE */ +#define ENUM_FLCC_CMD_ABORT (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* VALUE: ABORT */ +#define ENUM_FLCC_CMD_SLEEP (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* VALUE: Requests flash to enter Sleep mode */ +#define ENUM_FLCC_CMD_SIGN (_ADI_MSK_3(0x00000003,0x00000003UL, uint32_t )) /* VALUE: SIGN */ +#define ENUM_FLCC_CMD_WRITE (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* VALUE: WRITE */ +#define ENUM_FLCC_CMD_BLANK_CHECK (_ADI_MSK_3(0x00000005,0x00000005UL, uint32_t )) /* VALUE: Checks all of User Space; fails if any bits in user space are cleared */ +#define ENUM_FLCC_CMD_ERASEPAGE (_ADI_MSK_3(0x00000006,0x00000006UL, uint32_t )) /* VALUE: ERASEPAGE */ +#define ENUM_FLCC_CMD_MASSERASE (_ADI_MSK_3(0x00000007,0x00000007UL, uint32_t )) /* VALUE: MASSERASE */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_KH_ADDR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_KH_ADDR_VALUE 3 /* Address to be written on a WRITE command */ +#define BITM_FLCC_KH_ADDR_VALUE (_ADI_MSK_3(0x000FFFF8,0x000FFFF8UL, uint32_t )) /* Address to be written on a WRITE command */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_KH_DATA0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_KH_DATA0_VALUE 0 /* Lower half of 64-bit dual word data to be written on a Write command */ +#define BITM_FLCC_KH_DATA0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Lower half of 64-bit dual word data to be written on a Write command */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_KH_DATA1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_KH_DATA1_VALUE 0 /* Upper half of 64-bit dual word data to be written on a Write command */ +#define BITM_FLCC_KH_DATA1_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Upper half of 64-bit dual word data to be written on a Write command */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_PAGE_ADDR0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_PAGE_ADDR0_VALUE 10 /* Lower address bits of the page address */ +#define BITM_FLCC_PAGE_ADDR0_VALUE (_ADI_MSK_3(0x000FFC00,0x000FFC00UL, uint32_t )) /* Lower address bits of the page address */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_PAGE_ADDR1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_PAGE_ADDR1_VALUE 10 /* Upper address bits of the page address */ +#define BITM_FLCC_PAGE_ADDR1_VALUE (_ADI_MSK_3(0x000FFC00,0x000FFC00UL, uint32_t )) /* Upper address bits of the page address */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_KEY Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_KEY_VALUE 0 /* Key register */ +#define BITM_FLCC_KEY_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Key register */ +#define ENUM_FLCC_KEY_USERKEY (_ADI_MSK_3(0x676C7565,0x676C7565UL, uint32_t )) /* VALUE: USERKEY */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_WR_ABORT_ADDR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_WR_ABORT_ADDR_VALUE 0 /* Address of recently aborted write command */ +#define BITM_FLCC_WR_ABORT_ADDR_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Address of recently aborted write command */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_WRPROT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_WRPROT_WORD 0 /* Clear bits to write protect related groups of user space pages */ +#define BITM_FLCC_WRPROT_WORD (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Clear bits to write protect related groups of user space pages */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_SIGNATURE Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_SIGNATURE_VALUE 0 /* Read signature */ +#define BITM_FLCC_SIGNATURE_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Read signature */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_UCFG Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_UCFG_AUTOINCEN 1 /* Auto Address Increment for Key Hole Access */ +#define BITP_FLCC_UCFG_KHDMAEN 0 /* Key hole DMA enable */ +#define BITM_FLCC_UCFG_AUTOINCEN (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Auto Address Increment for Key Hole Access */ +#define BITM_FLCC_UCFG_KHDMAEN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Key hole DMA enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_TIME_PARAM0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_TIME_PARAM0_TNVH1 28 /* NVSTR Hold time during Mass Erase */ +#define BITP_FLCC_TIME_PARAM0_TERASE 24 /* Erase Time */ +#define BITP_FLCC_TIME_PARAM0_TRCV 20 /* Recovery time */ +#define BITP_FLCC_TIME_PARAM0_TNVH 16 /* NVSTR Hold time */ +#define BITP_FLCC_TIME_PARAM0_TPROG 12 /* Program time */ +#define BITP_FLCC_TIME_PARAM0_TPGS 8 /* NVSTR to Program setup time */ +#define BITP_FLCC_TIME_PARAM0_TNVS 4 /* PROG/ERASE to NVSTR setup time */ +#define BITP_FLCC_TIME_PARAM0_DIVREFCLK 0 /* Divide Reference Clock (by 2) */ +#define BITM_FLCC_TIME_PARAM0_TNVH1 (_ADI_MSK_3(0xF0000000,0xF0000000UL, uint32_t )) /* NVSTR Hold time during Mass Erase */ +#define BITM_FLCC_TIME_PARAM0_TERASE (_ADI_MSK_3(0x0F000000,0x0F000000UL, uint32_t )) /* Erase Time */ +#define BITM_FLCC_TIME_PARAM0_TRCV (_ADI_MSK_3(0x00F00000,0x00F00000UL, uint32_t )) /* Recovery time */ +#define BITM_FLCC_TIME_PARAM0_TNVH (_ADI_MSK_3(0x000F0000,0x000F0000UL, uint32_t )) /* NVSTR Hold time */ +#define BITM_FLCC_TIME_PARAM0_TPROG (_ADI_MSK_3(0x0000F000,0x0000F000UL, uint32_t )) /* Program time */ +#define BITM_FLCC_TIME_PARAM0_TPGS (_ADI_MSK_3(0x00000F00,0x00000F00UL, uint32_t )) /* NVSTR to Program setup time */ +#define BITM_FLCC_TIME_PARAM0_TNVS (_ADI_MSK_3(0x000000F0,0x000000F0UL, uint32_t )) /* PROG/ERASE to NVSTR setup time */ +#define BITM_FLCC_TIME_PARAM0_DIVREFCLK (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Divide Reference Clock (by 2) */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_TIME_PARAM1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_TIME_PARAM1_CURWAITSTATES 8 /* Current wait states [2:0] */ +#define BITP_FLCC_TIME_PARAM1_WAITSTATES 4 /* Number of wait states to access flash */ +#define BITP_FLCC_TIME_PARAM1_TWK 0 /* Wake up time */ +#define BITM_FLCC_TIME_PARAM1_CURWAITSTATES (_ADI_MSK_3(0x00000700,0x00000700UL, uint32_t )) /* Current wait states [2:0] */ +#define BITM_FLCC_TIME_PARAM1_WAITSTATES (_ADI_MSK_3(0x00000070,0x00000070UL, uint32_t )) /* Number of wait states to access flash */ +#define BITM_FLCC_TIME_PARAM1_TWK (_ADI_MSK_3(0x0000000F,0x0000000FUL, uint32_t )) /* Wake up time */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_ABORT_EN_LO Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_ABORT_EN_LO_VALUE 0 /* Sys IRQ Abort Enable */ +#define BITM_FLCC_ABORT_EN_LO_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Sys IRQ Abort Enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_ABORT_EN_HI Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_ABORT_EN_HI_VALUE 0 /* Sys IRQ Abort Enable */ +#define BITM_FLCC_ABORT_EN_HI_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Sys IRQ Abort Enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_ECC_CFG Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_ECC_CFG_PTR 8 /* ECC start page pointer */ +#define BITP_FLCC_ECC_CFG_INFOEN 1 /* Info space ECC Enable bit */ +#define BITP_FLCC_ECC_CFG_EN 0 /* ECC Enable */ +#define BITM_FLCC_ECC_CFG_PTR (_ADI_MSK_3(0xFFFFFF00,0xFFFFFF00UL, uint32_t )) /* ECC start page pointer */ +#define BITM_FLCC_ECC_CFG_INFOEN (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Info space ECC Enable bit */ +#define BITM_FLCC_ECC_CFG_EN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* ECC Enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_ECC_ADDR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_ECC_ADDR_VALUE 0 /* This register has the address for which ECC error is detected */ +#define BITM_FLCC_ECC_ADDR_VALUE (_ADI_MSK_3(0x000FFFFF,0x000FFFFFUL, uint32_t )) /* This register has the address for which ECC error is detected */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_POR_SEC Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_POR_SEC_SECURE 0 /* Set this bit to prevent read or write access to User Space (sticky when set) */ +#define BITM_FLCC_POR_SEC_SECURE (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Set this bit to prevent read or write access to User Space (sticky when set) */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_VOL_CFG Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_VOL_CFG_INFO_REMAP 0 /* Alias the info space to the base address of user space */ +#define BITM_FLCC_VOL_CFG_INFO_REMAP (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Alias the info space to the base address of user space */ + + +/* ============================================================================================================================ + Cache Controller + ============================================================================================================================ */ + +/* ============================================================================================================================ + FLCC0_CACHE + ============================================================================================================================ */ +#define REG_FLCC0_CACHE_STAT 0x40018058 /* FLCC0_CACHE Cache Status Register */ +#define REG_FLCC0_CACHE_SETUP 0x4001805C /* FLCC0_CACHE Cache Setup Register */ +#define REG_FLCC0_CACHE_KEY 0x40018060 /* FLCC0_CACHE Cache Key Register */ + +/* ============================================================================================================================ + FLCC_CACHE Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_CACHE_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_CACHE_STAT_ICEN 0 /* If this bit is set, I-Cache is enabled */ +#define BITM_FLCC_CACHE_STAT_ICEN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* If this bit is set, I-Cache is enabled */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_CACHE_SETUP Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_CACHE_SETUP_LCKIC 1 /* If this bit is set, I-Cache contents are locked */ +#define BITP_FLCC_CACHE_SETUP_ICEN 0 /* If this bit set, I-Cache is enabled for AHB accesses */ +#define BITM_FLCC_CACHE_SETUP_LCKIC (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* If this bit is set, I-Cache contents are locked */ +#define BITM_FLCC_CACHE_SETUP_ICEN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* If this bit set, I-Cache is enabled for AHB accesses */ + +/* ------------------------------------------------------------------------------------------------------------------------- + FLCC_CACHE_KEY Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_FLCC_CACHE_KEY_VALUE 0 /* Cache Key */ +#define BITM_FLCC_CACHE_KEY_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Cache Key */ + + +/* ============================================================================================================================ + + ============================================================================================================================ */ + +/* ============================================================================================================================ + GPIO0 + ============================================================================================================================ */ +#define REG_GPIO0_CFG 0x40020000 /* GPIO0 Port Configuration */ +#define REG_GPIO0_OEN 0x40020004 /* GPIO0 Port Output Enable */ +#define REG_GPIO0_PE 0x40020008 /* GPIO0 Port Output Pull-up/Pull-down Enable */ +#define REG_GPIO0_IEN 0x4002000C /* GPIO0 Port Input Path Enable */ +#define REG_GPIO0_IN 0x40020010 /* GPIO0 Port Registered Data Input */ +#define REG_GPIO0_OUT 0x40020014 /* GPIO0 Port Data Output */ +#define REG_GPIO0_SET 0x40020018 /* GPIO0 Port Data Out Set */ +#define REG_GPIO0_CLR 0x4002001C /* GPIO0 Port Data Out Clear */ +#define REG_GPIO0_TGL 0x40020020 /* GPIO0 Port Pin Toggle */ +#define REG_GPIO0_POL 0x40020024 /* GPIO0 Port Interrupt Polarity */ +#define REG_GPIO0_IENA 0x40020028 /* GPIO0 Port Interrupt A Enable */ +#define REG_GPIO0_IENB 0x4002002C /* GPIO0 Port Interrupt B Enable */ +#define REG_GPIO0_INT 0x40020030 /* GPIO0 Port Interrupt Status */ +#define REG_GPIO0_DS 0x40020034 /* GPIO0 Port Drive Strength Select */ + +/* ============================================================================================================================ + GPIO1 + ============================================================================================================================ */ +#define REG_GPIO1_CFG 0x40020040 /* GPIO1 Port Configuration */ +#define REG_GPIO1_OEN 0x40020044 /* GPIO1 Port Output Enable */ +#define REG_GPIO1_PE 0x40020048 /* GPIO1 Port Output Pull-up/Pull-down Enable */ +#define REG_GPIO1_IEN 0x4002004C /* GPIO1 Port Input Path Enable */ +#define REG_GPIO1_IN 0x40020050 /* GPIO1 Port Registered Data Input */ +#define REG_GPIO1_OUT 0x40020054 /* GPIO1 Port Data Output */ +#define REG_GPIO1_SET 0x40020058 /* GPIO1 Port Data Out Set */ +#define REG_GPIO1_CLR 0x4002005C /* GPIO1 Port Data Out Clear */ +#define REG_GPIO1_TGL 0x40020060 /* GPIO1 Port Pin Toggle */ +#define REG_GPIO1_POL 0x40020064 /* GPIO1 Port Interrupt Polarity */ +#define REG_GPIO1_IENA 0x40020068 /* GPIO1 Port Interrupt A Enable */ +#define REG_GPIO1_IENB 0x4002006C /* GPIO1 Port Interrupt B Enable */ +#define REG_GPIO1_INT 0x40020070 /* GPIO1 Port Interrupt Status */ +#define REG_GPIO1_DS 0x40020074 /* GPIO1 Port Drive Strength Select */ + +/* ============================================================================================================================ + GPIO2 + ============================================================================================================================ */ +#define REG_GPIO2_CFG 0x40020080 /* GPIO2 Port Configuration */ +#define REG_GPIO2_OEN 0x40020084 /* GPIO2 Port Output Enable */ +#define REG_GPIO2_PE 0x40020088 /* GPIO2 Port Output Pull-up/Pull-down Enable */ +#define REG_GPIO2_IEN 0x4002008C /* GPIO2 Port Input Path Enable */ +#define REG_GPIO2_IN 0x40020090 /* GPIO2 Port Registered Data Input */ +#define REG_GPIO2_OUT 0x40020094 /* GPIO2 Port Data Output */ +#define REG_GPIO2_SET 0x40020098 /* GPIO2 Port Data Out Set */ +#define REG_GPIO2_CLR 0x4002009C /* GPIO2 Port Data Out Clear */ +#define REG_GPIO2_TGL 0x400200A0 /* GPIO2 Port Pin Toggle */ +#define REG_GPIO2_POL 0x400200A4 /* GPIO2 Port Interrupt Polarity */ +#define REG_GPIO2_IENA 0x400200A8 /* GPIO2 Port Interrupt A Enable */ +#define REG_GPIO2_IENB 0x400200AC /* GPIO2 Port Interrupt B Enable */ +#define REG_GPIO2_INT 0x400200B0 /* GPIO2 Port Interrupt Status */ +#define REG_GPIO2_DS 0x400200B4 /* GPIO2 Port Drive Strength Select */ + +/* ============================================================================================================================ + GPIO3 + ============================================================================================================================ */ +#define REG_GPIO3_CFG 0x400200C0 /* GPIO3 Port Configuration */ +#define REG_GPIO3_OEN 0x400200C4 /* GPIO3 Port Output Enable */ +#define REG_GPIO3_PE 0x400200C8 /* GPIO3 Port Output Pull-up/Pull-down Enable */ +#define REG_GPIO3_IEN 0x400200CC /* GPIO3 Port Input Path Enable */ +#define REG_GPIO3_IN 0x400200D0 /* GPIO3 Port Registered Data Input */ +#define REG_GPIO3_OUT 0x400200D4 /* GPIO3 Port Data Output */ +#define REG_GPIO3_SET 0x400200D8 /* GPIO3 Port Data Out Set */ +#define REG_GPIO3_CLR 0x400200DC /* GPIO3 Port Data Out Clear */ +#define REG_GPIO3_TGL 0x400200E0 /* GPIO3 Port Pin Toggle */ +#define REG_GPIO3_POL 0x400200E4 /* GPIO3 Port Interrupt Polarity */ +#define REG_GPIO3_IENA 0x400200E8 /* GPIO3 Port Interrupt A Enable */ +#define REG_GPIO3_IENB 0x400200EC /* GPIO3 Port Interrupt B Enable */ +#define REG_GPIO3_INT 0x400200F0 /* GPIO3 Port Interrupt Status */ +#define REG_GPIO3_DS 0x400200F4 /* GPIO3 Port Drive Strength Select */ + +/* ============================================================================================================================ + GPIO Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + GPIO_CFG Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_GPIO_CFG_PIN15 30 /* Pin 15 configuration bits */ +#define BITP_GPIO_CFG_PIN14 28 /* Pin 14 configuration bits */ +#define BITP_GPIO_CFG_PIN13 26 /* Pin 13 configuration bits */ +#define BITP_GPIO_CFG_PIN12 24 /* Pin 12 configuration bits */ +#define BITP_GPIO_CFG_PIN11 22 /* Pin 11 configuration bits */ +#define BITP_GPIO_CFG_PIN10 20 /* Pin 10 configuration bits */ +#define BITP_GPIO_CFG_PIN09 18 /* Pin 9 configuration bits */ +#define BITP_GPIO_CFG_PIN08 16 /* Pin 8 configuration bits */ +#define BITP_GPIO_CFG_PIN07 14 /* Pin 7 configuration bits */ +#define BITP_GPIO_CFG_PIN06 12 /* Pin 6 configuration bits */ +#define BITP_GPIO_CFG_PIN05 10 /* Pin 5 configuration bits */ +#define BITP_GPIO_CFG_PIN04 8 /* Pin 4 configuration bits */ +#define BITP_GPIO_CFG_PIN03 6 /* Pin 3 configuration bits */ +#define BITP_GPIO_CFG_PIN02 4 /* Pin 2 configuration bits */ +#define BITP_GPIO_CFG_PIN01 2 /* Pin 1 configuration bits */ +#define BITP_GPIO_CFG_PIN00 0 /* Pin 0 configuration bits */ +#define BITM_GPIO_CFG_PIN15 (_ADI_MSK_3(0xC0000000,0xC0000000UL, uint32_t )) /* Pin 15 configuration bits */ +#define BITM_GPIO_CFG_PIN14 (_ADI_MSK_3(0x30000000,0x30000000UL, uint32_t )) /* Pin 14 configuration bits */ +#define BITM_GPIO_CFG_PIN13 (_ADI_MSK_3(0x0C000000,0x0C000000UL, uint32_t )) /* Pin 13 configuration bits */ +#define BITM_GPIO_CFG_PIN12 (_ADI_MSK_3(0x03000000,0x03000000UL, uint32_t )) /* Pin 12 configuration bits */ +#define BITM_GPIO_CFG_PIN11 (_ADI_MSK_3(0x00C00000,0x00C00000UL, uint32_t )) /* Pin 11 configuration bits */ +#define BITM_GPIO_CFG_PIN10 (_ADI_MSK_3(0x00300000,0x00300000UL, uint32_t )) /* Pin 10 configuration bits */ +#define BITM_GPIO_CFG_PIN09 (_ADI_MSK_3(0x000C0000,0x000C0000UL, uint32_t )) /* Pin 9 configuration bits */ +#define BITM_GPIO_CFG_PIN08 (_ADI_MSK_3(0x00030000,0x00030000UL, uint32_t )) /* Pin 8 configuration bits */ +#define BITM_GPIO_CFG_PIN07 (_ADI_MSK_3(0x0000C000,0x0000C000UL, uint32_t )) /* Pin 7 configuration bits */ +#define BITM_GPIO_CFG_PIN06 (_ADI_MSK_3(0x00003000,0x00003000UL, uint32_t )) /* Pin 6 configuration bits */ +#define BITM_GPIO_CFG_PIN05 (_ADI_MSK_3(0x00000C00,0x00000C00UL, uint32_t )) /* Pin 5 configuration bits */ +#define BITM_GPIO_CFG_PIN04 (_ADI_MSK_3(0x00000300,0x00000300UL, uint32_t )) /* Pin 4 configuration bits */ +#define BITM_GPIO_CFG_PIN03 (_ADI_MSK_3(0x000000C0,0x000000C0UL, uint32_t )) /* Pin 3 configuration bits */ +#define BITM_GPIO_CFG_PIN02 (_ADI_MSK_3(0x00000030,0x00000030UL, uint32_t )) /* Pin 2 configuration bits */ +#define BITM_GPIO_CFG_PIN01 (_ADI_MSK_3(0x0000000C,0x0000000CUL, uint32_t )) /* Pin 1 configuration bits */ +#define BITM_GPIO_CFG_PIN00 (_ADI_MSK_3(0x00000003,0x00000003UL, uint32_t )) /* Pin 0 configuration bits */ + +/* ------------------------------------------------------------------------------------------------------------------------- + GPIO_OEN Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_GPIO_OEN_VALUE 0 /* Pin Output Drive enable */ +#define BITM_GPIO_OEN_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Pin Output Drive enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + GPIO_PE Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_GPIO_PE_VALUE 0 /* Pin Pull enable */ +#define BITM_GPIO_PE_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Pin Pull enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + GPIO_IEN Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_GPIO_IEN_VALUE 0 /* Input path enable */ +#define BITM_GPIO_IEN_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Input path enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + GPIO_IN Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_GPIO_IN_VALUE 0 /* Registered data input */ +#define BITM_GPIO_IN_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Registered data input */ + +/* ------------------------------------------------------------------------------------------------------------------------- + GPIO_OUT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_GPIO_OUT_VALUE 0 /* Data out */ +#define BITM_GPIO_OUT_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Data out */ + +/* ------------------------------------------------------------------------------------------------------------------------- + GPIO_SET Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_GPIO_SET_VALUE 0 /* Set the output HIGH for the pin */ +#define BITM_GPIO_SET_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Set the output HIGH for the pin */ + +/* ------------------------------------------------------------------------------------------------------------------------- + GPIO_CLR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_GPIO_CLR_VALUE 0 /* Set the output low for the port pin */ +#define BITM_GPIO_CLR_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Set the output low for the port pin */ + +/* ------------------------------------------------------------------------------------------------------------------------- + GPIO_TGL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_GPIO_TGL_VALUE 0 /* Toggle the output of the port pin */ +#define BITM_GPIO_TGL_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Toggle the output of the port pin */ + +/* ------------------------------------------------------------------------------------------------------------------------- + GPIO_POL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_GPIO_POL_VALUE 0 /* Interrupt polarity */ +#define BITM_GPIO_POL_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Interrupt polarity */ + +/* ------------------------------------------------------------------------------------------------------------------------- + GPIO_IENA Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_GPIO_IENA_VALUE 0 /* Interrupt A enable */ +#define BITM_GPIO_IENA_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Interrupt A enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + GPIO_IENB Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_GPIO_IENB_VALUE 0 /* Interrupt B enable */ +#define BITM_GPIO_IENB_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Interrupt B enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + GPIO_INT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_GPIO_INT_VALUE 0 /* Interrupt Status */ +#define BITM_GPIO_INT_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Interrupt Status */ + +/* ------------------------------------------------------------------------------------------------------------------------- + GPIO_DS Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_GPIO_DS_VALUE 0 /* Drive strength select */ +#define BITM_GPIO_DS_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Drive strength select */ + + +/* ============================================================================================================================ + Serial Port + ============================================================================================================================ */ + +/* ============================================================================================================================ + SPORT0 + ============================================================================================================================ */ +#define REG_SPORT0_CTL_A 0x40038000 /* SPORT0 Half SPORT 'A' Control Register */ +#define REG_SPORT0_DIV_A 0x40038004 /* SPORT0 Half SPORT 'A' Divisor Register */ +#define REG_SPORT0_IEN_A 0x40038008 /* SPORT0 Half SPORT A's Interrupt Enable register */ +#define REG_SPORT0_STAT_A 0x4003800C /* SPORT0 Half SPORT 'A' Status register */ +#define REG_SPORT0_NUMTRAN_A 0x40038010 /* SPORT0 Half SPORT A Number of transfers register */ +#define REG_SPORT0_CNVT_A 0x40038014 /* SPORT0 Half SPORT 'A' CNV width */ +#define REG_SPORT0_TX_A 0x40038020 /* SPORT0 Half SPORT 'A' Tx Buffer Register */ +#define REG_SPORT0_RX_A 0x40038028 /* SPORT0 Half SPORT 'A' Rx Buffer Register */ +#define REG_SPORT0_CTL_B 0x40038040 /* SPORT0 Half SPORT 'B' Control Register */ +#define REG_SPORT0_DIV_B 0x40038044 /* SPORT0 Half SPORT 'B' Divisor Register */ +#define REG_SPORT0_IEN_B 0x40038048 /* SPORT0 Half SPORT B's Interrupt Enable register */ +#define REG_SPORT0_STAT_B 0x4003804C /* SPORT0 Half SPORT 'B' Status register */ +#define REG_SPORT0_NUMTRAN_B 0x40038050 /* SPORT0 Half SPORT B Number of transfers register */ +#define REG_SPORT0_CNVT_B 0x40038054 /* SPORT0 Half SPORT 'B' CNV width register */ +#define REG_SPORT0_TX_B 0x40038060 /* SPORT0 Half SPORT 'B' Tx Buffer Register */ +#define REG_SPORT0_RX_B 0x40038068 /* SPORT0 Half SPORT 'B' Rx Buffer Register */ + +/* ============================================================================================================================ + SPORT Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + SPORT_CTL_A Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPORT_CTL_A_DMAEN 26 /* DMA Enable */ +#define BITP_SPORT_CTL_A_SPTRAN 25 /* Serial Port Transfer Direction */ +#define BITP_SPORT_CTL_A_GCLKEN 21 /* Gated Clock Enable */ +#define BITP_SPORT_CTL_A_FSERRMODE 20 /* Frame Sync Error Operation */ +#define BITP_SPORT_CTL_A_PACK 18 /* Packing Enable */ +#define BITP_SPORT_CTL_A_LAFS 17 /* Late Frame Sync */ +#define BITP_SPORT_CTL_A_LFS 16 /* Active-Low Frame Sync */ +#define BITP_SPORT_CTL_A_DIFS 15 /* Data-Independent Frame Sync */ +#define BITP_SPORT_CTL_A_IFS 14 /* Internal Frame Sync */ +#define BITP_SPORT_CTL_A_FSR 13 /* Frame Sync Required */ +#define BITP_SPORT_CTL_A_CKRE 12 /* Clock Rising Edge */ +#define BITP_SPORT_CTL_A_OPMODE 11 /* Operation mode */ +#define BITP_SPORT_CTL_A_ICLK 10 /* Internal Clock */ +#define BITP_SPORT_CTL_A_SLEN 4 /* Serial Word Length */ +#define BITP_SPORT_CTL_A_LSBF 3 /* Least-Significant Bit First */ +#define BITP_SPORT_CTL_A_CKMUXSEL 2 /* Clock Multiplexer Select */ +#define BITP_SPORT_CTL_A_FSMUXSEL 1 /* Frame Sync Multiplexer Select */ +#define BITP_SPORT_CTL_A_SPEN 0 /* Serial Port Enable */ +#define BITM_SPORT_CTL_A_DMAEN (_ADI_MSK_3(0x04000000,0x04000000UL, uint32_t )) /* DMA Enable */ +#define BITM_SPORT_CTL_A_SPTRAN (_ADI_MSK_3(0x02000000,0x02000000UL, uint32_t )) /* Serial Port Transfer Direction */ +#define BITM_SPORT_CTL_A_GCLKEN (_ADI_MSK_3(0x00200000,0x00200000UL, uint32_t )) /* Gated Clock Enable */ +#define BITM_SPORT_CTL_A_FSERRMODE (_ADI_MSK_3(0x00100000,0x00100000UL, uint32_t )) /* Frame Sync Error Operation */ +#define BITM_SPORT_CTL_A_PACK (_ADI_MSK_3(0x000C0000,0x000C0000UL, uint32_t )) /* Packing Enable */ +#define BITM_SPORT_CTL_A_LAFS (_ADI_MSK_3(0x00020000,0x00020000UL, uint32_t )) /* Late Frame Sync */ +#define BITM_SPORT_CTL_A_LFS (_ADI_MSK_3(0x00010000,0x00010000UL, uint32_t )) /* Active-Low Frame Sync */ +#define BITM_SPORT_CTL_A_DIFS (_ADI_MSK_3(0x00008000,0x00008000UL, uint32_t )) /* Data-Independent Frame Sync */ +#define BITM_SPORT_CTL_A_IFS (_ADI_MSK_3(0x00004000,0x00004000UL, uint32_t )) /* Internal Frame Sync */ +#define BITM_SPORT_CTL_A_FSR (_ADI_MSK_3(0x00002000,0x00002000UL, uint32_t )) /* Frame Sync Required */ +#define BITM_SPORT_CTL_A_CKRE (_ADI_MSK_3(0x00001000,0x00001000UL, uint32_t )) /* Clock Rising Edge */ +#define BITM_SPORT_CTL_A_OPMODE (_ADI_MSK_3(0x00000800,0x00000800UL, uint32_t )) /* Operation mode */ +#define BITM_SPORT_CTL_A_ICLK (_ADI_MSK_3(0x00000400,0x00000400UL, uint32_t )) /* Internal Clock */ +#define BITM_SPORT_CTL_A_SLEN (_ADI_MSK_3(0x000001F0,0x000001F0UL, uint32_t )) /* Serial Word Length */ +#define BITM_SPORT_CTL_A_LSBF (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* Least-Significant Bit First */ +#define BITM_SPORT_CTL_A_CKMUXSEL (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Clock Multiplexer Select */ +#define BITM_SPORT_CTL_A_FSMUXSEL (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Frame Sync Multiplexer Select */ +#define BITM_SPORT_CTL_A_SPEN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Serial Port Enable */ +#define ENUM_SPORT_CTL_A_CTL_RX (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* SPTRAN: Receive */ +#define ENUM_SPORT_CTL_A_CTL_TX (_ADI_MSK_3(0x02000000,0x02000000UL, uint32_t )) /* SPTRAN: Transmit */ +#define ENUM_SPORT_CTL_A_CTL_GCLK_DIS (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* GCLKEN: Disable */ +#define ENUM_SPORT_CTL_A_CTL_GCLK_EN (_ADI_MSK_3(0x00200000,0x00200000UL, uint32_t )) /* GCLKEN: Enable */ +#define ENUM_SPORT_CTL_A_CTL_PACK_DIS (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* PACK: Disable */ +#define ENUM_SPORT_CTL_A_CTL_PACK_8BIT (_ADI_MSK_3(0x00040000,0x00040000UL, uint32_t )) /* PACK: 8-bit packing enable */ +#define ENUM_SPORT_CTL_A_CTL_PACK_16BIT (_ADI_MSK_3(0x00080000,0x00080000UL, uint32_t )) /* PACK: 16-bit packing enable */ +#define ENUM_SPORT_CTL_A_CTL_EARLY_FS (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* LAFS: Early frame sync */ +#define ENUM_SPORT_CTL_A_CTL_LATE_FS (_ADI_MSK_3(0x00020000,0x00020000UL, uint32_t )) /* LAFS: Late frame sync */ +#define ENUM_SPORT_CTL_A_CTL_FS_LO (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* LFS: Active high frame sync */ +#define ENUM_SPORT_CTL_A_CTL_FS_HI (_ADI_MSK_3(0x00010000,0x00010000UL, uint32_t )) /* LFS: Active low frame sync */ +#define ENUM_SPORT_CTL_A_CTL_DATA_DEP_FS (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* DIFS: Data-dependent frame sync */ +#define ENUM_SPORT_CTL_A_CTL_DATA_INDP_FS (_ADI_MSK_3(0x00008000,0x00008000UL, uint32_t )) /* DIFS: Data-independent frame sync */ +#define ENUM_SPORT_CTL_A_CTL_EXTERNAL_FS (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* IFS: External frame sync */ +#define ENUM_SPORT_CTL_A_CTL_INTERNAL_FS (_ADI_MSK_3(0x00004000,0x00004000UL, uint32_t )) /* IFS: Internal frame sync */ +#define ENUM_SPORT_CTL_A_CTL_FS_NOT_REQ (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* FSR: No frame sync required */ +#define ENUM_SPORT_CTL_A_CTL_FS_REQ (_ADI_MSK_3(0x00002000,0x00002000UL, uint32_t )) /* FSR: Frame sync required */ +#define ENUM_SPORT_CTL_A_CTL_CLK_FALL_EDGE (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* CKRE: Clock falling edge */ +#define ENUM_SPORT_CTL_A_CTL_CLK_RISE_EDGE (_ADI_MSK_3(0x00001000,0x00001000UL, uint32_t )) /* CKRE: Clock rising edge */ +#define ENUM_SPORT_CTL_A_CTL_SERIAL (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* OPMODE: DSP standard */ +#define ENUM_SPORT_CTL_A_CTL_TIMER_EN_MODE (_ADI_MSK_3(0x00000800,0x00000800UL, uint32_t )) /* OPMODE: Timer_enable mode */ +#define ENUM_SPORT_CTL_A_CTL_EXTERNAL_CLK (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* ICLK: External clock */ +#define ENUM_SPORT_CTL_A_CTL_INTERNAL_CLK (_ADI_MSK_3(0x00000400,0x00000400UL, uint32_t )) /* ICLK: Internal clock */ +#define ENUM_SPORT_CTL_A_CTL_MSB_FIRST (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* LSBF: MSB first sent/received */ +#define ENUM_SPORT_CTL_A_CTL_LSB_FIRST (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* LSBF: LSB first sent/received */ +#define ENUM_SPORT_CTL_A_CTL_CLK_MUX_DIS (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* CKMUXSEL: Disable serial clock multiplexing */ +#define ENUM_SPORT_CTL_A_CTL_CLK_MUX_EN (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* CKMUXSEL: Enable serial clock multiplexing */ +#define ENUM_SPORT_CTL_A_CTL_FS_MUX_DIS (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* FSMUXSEL: Disable frame sync multiplexing */ +#define ENUM_SPORT_CTL_A_CTL_FS_MUX_EN (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* FSMUXSEL: Enable frame sync multiplexing */ +#define ENUM_SPORT_CTL_A_CTL_DIS (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* SPEN: Disable */ +#define ENUM_SPORT_CTL_A_CTL_EN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* SPEN: Enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPORT_DIV_A Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPORT_DIV_A_FSDIV 16 /* Frame Sync Divisor */ +#define BITP_SPORT_DIV_A_CLKDIV 0 /* Clock Divisor */ +#define BITM_SPORT_DIV_A_FSDIV (_ADI_MSK_3(0x00FF0000,0x00FF0000UL, uint32_t )) /* Frame Sync Divisor */ +#define BITM_SPORT_DIV_A_CLKDIV (_ADI_MSK_3(0x0000FFFF,0x0000FFFFUL, uint32_t )) /* Clock Divisor */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPORT_IEN_A Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPORT_IEN_A_SYSDATERR 4 /* Data error for system writes or reads */ +#define BITP_SPORT_IEN_A_DATA 3 /* Data request interrupt to the core */ +#define BITP_SPORT_IEN_A_FSERRMSK 2 /* Frame Sync Error (Interrupt) Mask */ +#define BITP_SPORT_IEN_A_DERRMSK 1 /* Data Error (Interrupt) Mask */ +#define BITP_SPORT_IEN_A_TF 0 /* Transfer Finish Interrupt Enable */ +#define BITM_SPORT_IEN_A_SYSDATERR (_ADI_MSK_3(0x00000010,0x00000010UL, uint32_t )) /* Data error for system writes or reads */ +#define BITM_SPORT_IEN_A_DATA (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* Data request interrupt to the core */ +#define BITM_SPORT_IEN_A_FSERRMSK (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Frame Sync Error (Interrupt) Mask */ +#define BITM_SPORT_IEN_A_DERRMSK (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Data Error (Interrupt) Mask */ +#define BITM_SPORT_IEN_A_TF (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Transfer Finish Interrupt Enable */ +#define ENUM_SPORT_IEN_A_CTL_TXFIN_DIS (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* TF: Transfer finish Interrupt is disabled */ +#define ENUM_SPORT_IEN_A_CTL_TXFIN_EN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* TF: Transfer Finish Interrupt is Enabled */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPORT_STAT_A Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPORT_STAT_A_DXS 8 /* Data Transfer Buffer Status */ +#define BITP_SPORT_STAT_A_SYSDATERR 4 /* System Data Error Status */ +#define BITP_SPORT_STAT_A_DATA 3 /* Data Buffer status */ +#define BITP_SPORT_STAT_A_FSERR 2 /* Frame Sync Error Status */ +#define BITP_SPORT_STAT_A_DERR 1 /* Data Error Status */ +#define BITP_SPORT_STAT_A_TFI 0 /* Transmit Finish Interrupt Status */ +#define BITM_SPORT_STAT_A_DXS (_ADI_MSK_3(0x00000300,0x00000300UL, uint32_t )) /* Data Transfer Buffer Status */ +#define BITM_SPORT_STAT_A_SYSDATERR (_ADI_MSK_3(0x00000010,0x00000010UL, uint32_t )) /* System Data Error Status */ +#define BITM_SPORT_STAT_A_DATA (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* Data Buffer status */ +#define BITM_SPORT_STAT_A_FSERR (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Frame Sync Error Status */ +#define BITM_SPORT_STAT_A_DERR (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Data Error Status */ +#define BITM_SPORT_STAT_A_TFI (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Transmit Finish Interrupt Status */ +#define ENUM_SPORT_STAT_A_CTL_EMPTY (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* DXS: Empty */ +#define ENUM_SPORT_STAT_A_CTL_PART_FULL (_ADI_MSK_3(0x00000200,0x00000200UL, uint32_t )) /* DXS: Partially full */ +#define ENUM_SPORT_STAT_A_CTL_FULL (_ADI_MSK_3(0x00000300,0x00000300UL, uint32_t )) /* DXS: Full */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPORT_NUMTRAN_A Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPORT_NUMTRAN_A_VALUE 0 /* Number of transfers (Half SPORT A) */ +#define BITM_SPORT_NUMTRAN_A_VALUE (_ADI_MSK_3(0x00000FFF,0x00000FFFUL, uint32_t )) /* Number of transfers (Half SPORT A) */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPORT_CNVT_A Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPORT_CNVT_A_CNVT2FS 16 /* CNV to FS duration: Half SPORT A */ +#define BITP_SPORT_CNVT_A_POL 8 /* Polarity of the CNV signal */ +#define BITP_SPORT_CNVT_A_WID 0 /* CNV signal width: Half SPORT A */ +#define BITM_SPORT_CNVT_A_CNVT2FS (_ADI_MSK_3(0x00FF0000,0x00FF0000UL, uint32_t )) /* CNV to FS duration: Half SPORT A */ +#define BITM_SPORT_CNVT_A_POL (_ADI_MSK_3(0x00000100,0x00000100UL, uint32_t )) /* Polarity of the CNV signal */ +#define BITM_SPORT_CNVT_A_WID (_ADI_MSK_3(0x0000000F,0x0000000FUL, uint32_t )) /* CNV signal width: Half SPORT A */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPORT_TX_A Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPORT_TX_A_VALUE 0 /* Transmit Buffer */ +#define BITM_SPORT_TX_A_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Transmit Buffer */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPORT_RX_A Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPORT_RX_A_VALUE 0 /* Receive Buffer */ +#define BITM_SPORT_RX_A_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Receive Buffer */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPORT_CTL_B Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPORT_CTL_B_DMAEN 26 /* DMA Enable */ +#define BITP_SPORT_CTL_B_SPTRAN 25 /* Serial Port Transfer Direction */ +#define BITP_SPORT_CTL_B_GCLKEN 21 /* Gated Clock Enable */ +#define BITP_SPORT_CTL_B_FSERRMODE 20 /* Frame Sync Error Operation */ +#define BITP_SPORT_CTL_B_PACK 18 /* Packing Enable */ +#define BITP_SPORT_CTL_B_LAFS 17 /* Late Frame Sync */ +#define BITP_SPORT_CTL_B_LFS 16 /* Active-Low Frame Sync */ +#define BITP_SPORT_CTL_B_DIFS 15 /* Data-Independent Frame Sync */ +#define BITP_SPORT_CTL_B_IFS 14 /* Internal Frame Sync */ +#define BITP_SPORT_CTL_B_FSR 13 /* Frame Sync Required */ +#define BITP_SPORT_CTL_B_CKRE 12 /* Clock Rising Edge */ +#define BITP_SPORT_CTL_B_OPMODE 11 /* Operation mode */ +#define BITP_SPORT_CTL_B_ICLK 10 /* Internal Clock */ +#define BITP_SPORT_CTL_B_SLEN 4 /* Serial Word Length */ +#define BITP_SPORT_CTL_B_LSBF 3 /* Least-Significant Bit First */ +#define BITP_SPORT_CTL_B_SPEN 0 /* Serial Port Enable */ +#define BITM_SPORT_CTL_B_DMAEN (_ADI_MSK_3(0x04000000,0x04000000UL, uint32_t )) /* DMA Enable */ +#define BITM_SPORT_CTL_B_SPTRAN (_ADI_MSK_3(0x02000000,0x02000000UL, uint32_t )) /* Serial Port Transfer Direction */ +#define BITM_SPORT_CTL_B_GCLKEN (_ADI_MSK_3(0x00200000,0x00200000UL, uint32_t )) /* Gated Clock Enable */ +#define BITM_SPORT_CTL_B_FSERRMODE (_ADI_MSK_3(0x00100000,0x00100000UL, uint32_t )) /* Frame Sync Error Operation */ +#define BITM_SPORT_CTL_B_PACK (_ADI_MSK_3(0x000C0000,0x000C0000UL, uint32_t )) /* Packing Enable */ +#define BITM_SPORT_CTL_B_LAFS (_ADI_MSK_3(0x00020000,0x00020000UL, uint32_t )) /* Late Frame Sync */ +#define BITM_SPORT_CTL_B_LFS (_ADI_MSK_3(0x00010000,0x00010000UL, uint32_t )) /* Active-Low Frame Sync */ +#define BITM_SPORT_CTL_B_DIFS (_ADI_MSK_3(0x00008000,0x00008000UL, uint32_t )) /* Data-Independent Frame Sync */ +#define BITM_SPORT_CTL_B_IFS (_ADI_MSK_3(0x00004000,0x00004000UL, uint32_t )) /* Internal Frame Sync */ +#define BITM_SPORT_CTL_B_FSR (_ADI_MSK_3(0x00002000,0x00002000UL, uint32_t )) /* Frame Sync Required */ +#define BITM_SPORT_CTL_B_CKRE (_ADI_MSK_3(0x00001000,0x00001000UL, uint32_t )) /* Clock Rising Edge */ +#define BITM_SPORT_CTL_B_OPMODE (_ADI_MSK_3(0x00000800,0x00000800UL, uint32_t )) /* Operation mode */ +#define BITM_SPORT_CTL_B_ICLK (_ADI_MSK_3(0x00000400,0x00000400UL, uint32_t )) /* Internal Clock */ +#define BITM_SPORT_CTL_B_SLEN (_ADI_MSK_3(0x000001F0,0x000001F0UL, uint32_t )) /* Serial Word Length */ +#define BITM_SPORT_CTL_B_LSBF (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* Least-Significant Bit First */ +#define BITM_SPORT_CTL_B_SPEN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Serial Port Enable */ +#define ENUM_SPORT_CTL_B_CTL_PACK_DIS (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* PACK: Disable */ +#define ENUM_SPORT_CTL_B_CTL_PACK_8BIT (_ADI_MSK_3(0x00040000,0x00040000UL, uint32_t )) /* PACK: 8-bit packing enable */ +#define ENUM_SPORT_CTL_B_CTL_PACK_16BIT (_ADI_MSK_3(0x00080000,0x00080000UL, uint32_t )) /* PACK: 16-bit packing enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPORT_DIV_B Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPORT_DIV_B_FSDIV 16 /* Frame Sync Divisor */ +#define BITP_SPORT_DIV_B_CLKDIV 0 /* Clock Divisor */ +#define BITM_SPORT_DIV_B_FSDIV (_ADI_MSK_3(0x00FF0000,0x00FF0000UL, uint32_t )) /* Frame Sync Divisor */ +#define BITM_SPORT_DIV_B_CLKDIV (_ADI_MSK_3(0x0000FFFF,0x0000FFFFUL, uint32_t )) /* Clock Divisor */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPORT_IEN_B Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPORT_IEN_B_SYSDATERR 4 /* Data error for system writes or reads */ +#define BITP_SPORT_IEN_B_DATA 3 /* Data request interrupt to the core */ +#define BITP_SPORT_IEN_B_FSERRMSK 2 /* Frame Sync Error (Interrupt) Mask */ +#define BITP_SPORT_IEN_B_DERRMSK 1 /* Data Error (Interrupt) Mask */ +#define BITP_SPORT_IEN_B_TF 0 /* Transmit Finish Interrupt Enable */ +#define BITM_SPORT_IEN_B_SYSDATERR (_ADI_MSK_3(0x00000010,0x00000010UL, uint32_t )) /* Data error for system writes or reads */ +#define BITM_SPORT_IEN_B_DATA (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* Data request interrupt to the core */ +#define BITM_SPORT_IEN_B_FSERRMSK (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Frame Sync Error (Interrupt) Mask */ +#define BITM_SPORT_IEN_B_DERRMSK (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Data Error (Interrupt) Mask */ +#define BITM_SPORT_IEN_B_TF (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Transmit Finish Interrupt Enable */ +#define ENUM_SPORT_IEN_B_CTL_TXFIN_DIS (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* TF: Transfer Finish Interrupt is disabled */ +#define ENUM_SPORT_IEN_B_CTL_TXFIN_EN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* TF: Transfer Finish Interrupt is Enabled */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPORT_STAT_B Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPORT_STAT_B_DXS 8 /* Data Transfer Buffer Status */ +#define BITP_SPORT_STAT_B_SYSDATERR 4 /* System Data Error Status */ +#define BITP_SPORT_STAT_B_DATA 3 /* Data Buffer status */ +#define BITP_SPORT_STAT_B_FSERR 2 /* Frame Sync Error Status */ +#define BITP_SPORT_STAT_B_DERR 1 /* Data Error Status */ +#define BITP_SPORT_STAT_B_TFI 0 /* Transmit Finish Interrupt Status */ +#define BITM_SPORT_STAT_B_DXS (_ADI_MSK_3(0x00000300,0x00000300UL, uint32_t )) /* Data Transfer Buffer Status */ +#define BITM_SPORT_STAT_B_SYSDATERR (_ADI_MSK_3(0x00000010,0x00000010UL, uint32_t )) /* System Data Error Status */ +#define BITM_SPORT_STAT_B_DATA (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* Data Buffer status */ +#define BITM_SPORT_STAT_B_FSERR (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Frame Sync Error Status */ +#define BITM_SPORT_STAT_B_DERR (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Data Error Status */ +#define BITM_SPORT_STAT_B_TFI (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Transmit Finish Interrupt Status */ +#define ENUM_SPORT_STAT_B_CTL_EMPTY (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* DXS: Empty */ +#define ENUM_SPORT_STAT_B_CTL_PART_FULL (_ADI_MSK_3(0x00000200,0x00000200UL, uint32_t )) /* DXS: Partially full */ +#define ENUM_SPORT_STAT_B_CTL_FULL (_ADI_MSK_3(0x00000300,0x00000300UL, uint32_t )) /* DXS: Full */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPORT_NUMTRAN_B Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPORT_NUMTRAN_B_VALUE 0 /* Number of transfers (Half SPORT A) */ +#define BITM_SPORT_NUMTRAN_B_VALUE (_ADI_MSK_3(0x00000FFF,0x00000FFFUL, uint32_t )) /* Number of transfers (Half SPORT A) */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPORT_CNVT_B Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPORT_CNVT_B_CNVT2FS 16 /* CNV to FS duration: Half SPORT B */ +#define BITP_SPORT_CNVT_B_POL 8 /* Polarity of the CNV signal */ +#define BITP_SPORT_CNVT_B_WID 0 /* CNV signal width: Half SPORT B */ +#define BITM_SPORT_CNVT_B_CNVT2FS (_ADI_MSK_3(0x00FF0000,0x00FF0000UL, uint32_t )) /* CNV to FS duration: Half SPORT B */ +#define BITM_SPORT_CNVT_B_POL (_ADI_MSK_3(0x00000100,0x00000100UL, uint32_t )) /* Polarity of the CNV signal */ +#define BITM_SPORT_CNVT_B_WID (_ADI_MSK_3(0x0000000F,0x0000000FUL, uint32_t )) /* CNV signal width: Half SPORT B */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPORT_TX_B Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPORT_TX_B_VALUE 0 /* Transmit Buffer */ +#define BITM_SPORT_TX_B_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Transmit Buffer */ + +/* ------------------------------------------------------------------------------------------------------------------------- + SPORT_RX_B Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_SPORT_RX_B_VALUE 0 /* Receive Buffer */ +#define BITM_SPORT_RX_B_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Receive Buffer */ + + +/* ============================================================================================================================ + CRC Accelerator + ============================================================================================================================ */ + +/* ============================================================================================================================ + CRC0 + ============================================================================================================================ */ +#define REG_CRC0_CTL 0x40040000 /* CRC0 CRC Control */ +#define REG_CRC0_IPDATA 0x40040004 /* CRC0 Input Data Word */ +#define REG_CRC0_RESULT 0x40040008 /* CRC0 CRC Result */ +#define REG_CRC0_POLY 0x4004000C /* CRC0 Programmable CRC Polynomial */ +#define REG_CRC0_IPBITS0 0x40040010 /* CRC0 Input Data Bits */ +#define REG_CRC0_IPBITS1 0x40040011 /* CRC0 Input Data Bits */ +#define REG_CRC0_IPBITS2 0x40040012 /* CRC0 Input Data Bits */ +#define REG_CRC0_IPBITS3 0x40040013 /* CRC0 Input Data Bits */ +#define REG_CRC0_IPBITS4 0x40040014 /* CRC0 Input Data Bits */ +#define REG_CRC0_IPBITS5 0x40040015 /* CRC0 Input Data Bits */ +#define REG_CRC0_IPBITS6 0x40040016 /* CRC0 Input Data Bits */ +#define REG_CRC0_IPBITS7 0x40040017 /* CRC0 Input Data Bits */ +#define REG_CRC0_IPBITSn(i) (REG_CRC0_IPBITS0 + ((i) * 1)) +#define REG_CRC0_IPBITSn_COUNT 8 +#define REG_CRC0_IPBYTE 0x40040010 /* CRC0 Input Data Byte */ + +/* ============================================================================================================================ + CRC Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + CRC_CTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRC_CTL_REVID 28 /* Revision ID */ +#define BITP_CRC_CTL_W16SWP 4 /* Word16 Swap */ +#define BITP_CRC_CTL_BYTMIRR 3 /* Byte Mirroring */ +#define BITP_CRC_CTL_BITMIRR 2 /* Bit Mirroring */ +#define BITP_CRC_CTL_LSBFIRST 1 /* LSB First Calculation Order */ +#define BITP_CRC_CTL_EN 0 /* CRC Peripheral Enable */ +#define BITM_CRC_CTL_REVID (_ADI_MSK_3(0xF0000000,0xF0000000UL, uint32_t )) /* Revision ID */ +#define BITM_CRC_CTL_W16SWP (_ADI_MSK_3(0x00000010,0x00000010UL, uint32_t )) /* Word16 Swap */ +#define BITM_CRC_CTL_BYTMIRR (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* Byte Mirroring */ +#define BITM_CRC_CTL_BITMIRR (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Bit Mirroring */ +#define BITM_CRC_CTL_LSBFIRST (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* LSB First Calculation Order */ +#define BITM_CRC_CTL_EN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* CRC Peripheral Enable */ +#define ENUM_CRC_CTL_W16SP_DIS (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* W16SWP: Word16 Swap disabled */ +#define ENUM_CRC_CTL_W16SP_EN (_ADI_MSK_3(0x00000010,0x00000010UL, uint32_t )) /* W16SWP: Word16 Swap enabled */ +#define ENUM_CRC_CTL_BYTEMIR_DIS (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* BYTMIRR: Byte Mirroring is disabled */ +#define ENUM_CRC_CTL_BYTEMIR_EN (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* BYTMIRR: Byte Mirroring is enabled */ +#define ENUM_CRC_CTL_BITMIRR_DIS (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* BITMIRR: Bit Mirroring is disabled */ +#define ENUM_CRC_CTL_BITMIRR_EN (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* BITMIRR: Bit Mirroring is enabled */ +#define ENUM_CRC_CTL_MSB_FIRST (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* LSBFIRST: MSB First CRC calculation is done */ +#define ENUM_CRC_CTL_LSB_FIRST (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* LSBFIRST: LSB First CRC calculation is done */ +#define ENUM_CRC_CTL_CRC_DIS (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* EN: CRC peripheral is disabled */ +#define ENUM_CRC_CTL_CRC_EN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* EN: CRC peripheral is enabled */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRC_IPDATA Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRC_IPDATA_VALUE 0 /* Data Input */ +#define BITM_CRC_IPDATA_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Data Input */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRC_RESULT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRC_RESULT_VALUE 0 /* CRC Residue */ +#define BITM_CRC_RESULT_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* CRC Residue */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRC_POLY Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRC_POLY_VALUE 0 /* CRC Reduction Polynomial */ +#define BITM_CRC_POLY_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* CRC Reduction Polynomial */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRC_IPBITS[n] Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRC_IPBITS_DATA_BITS 0 /* Input Data Bits */ +#define BITM_CRC_IPBITS_DATA_BITS (_ADI_MSK_3(0x000000FF,0x000000FFU, uint8_t )) /* Input Data Bits */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRC_IPBYTE Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRC_IPBYTE_DATA_BYTE 0 /* Input Data Byte */ +#define BITM_CRC_IPBYTE_DATA_BYTE (_ADI_MSK_3(0x000000FF,0x000000FFU, uint8_t )) /* Input Data Byte */ + + +/* ============================================================================================================================ + Random Number Generator + ============================================================================================================================ */ + +/* ============================================================================================================================ + RNG0 + ============================================================================================================================ */ +#define REG_RNG0_CTL 0x40040400 /* RNG0 RNG Control Register */ +#define REG_RNG0_LEN 0x40040404 /* RNG0 RNG Sample Length Register */ +#define REG_RNG0_STAT 0x40040408 /* RNG0 RNG Status Register */ +#define REG_RNG0_DATA 0x4004040C /* RNG0 RNG Data Register */ +#define REG_RNG0_OSCCNT 0x40040410 /* RNG0 Oscillator Count */ +#define REG_RNG0_OSCDIFF0 0x40040414 /* RNG0 Oscillator Difference */ +#define REG_RNG0_OSCDIFF1 0x40040415 /* RNG0 Oscillator Difference */ +#define REG_RNG0_OSCDIFF2 0x40040416 /* RNG0 Oscillator Difference */ +#define REG_RNG0_OSCDIFF3 0x40040417 /* RNG0 Oscillator Difference */ +#define REG_RNG0_OSCDIFFn(i) (REG_RNG0_OSCDIFF0 + ((i) * 1)) +#define REG_RNG0_OSCDIFFn_COUNT 4 + +/* ============================================================================================================================ + RNG Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + RNG_CTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RNG_CTL_SINGLE 3 /* Generate a Single Number */ +#define BITP_RNG_CTL_EN 0 /* RNG Enable */ +#define BITM_RNG_CTL_SINGLE (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* Generate a Single Number */ +#define BITM_RNG_CTL_EN (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* RNG Enable */ +#define ENUM_RNG_CTL_WORD (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* SINGLE: Buffer Word */ +#define ENUM_RNG_CTL_SINGLE (_ADI_MSK_3(0x00000008,0x00000008U, uint16_t )) /* SINGLE: Single Byte */ +#define ENUM_RNG_CTL_DISABLE (_ADI_MSK_3(0x00000000,0x00000000U, uint16_t )) /* EN: Disable the RNG */ +#define ENUM_RNG_CTL_ENABLE (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* EN: Enable the RNG */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RNG_LEN Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RNG_LEN_PRESCALE 12 /* Prescaler for the Sample Counter */ +#define BITP_RNG_LEN_RELOAD 0 /* Reload Value for the Sample Counter */ +#define BITM_RNG_LEN_PRESCALE (_ADI_MSK_3(0x0000F000,0x0000F000U, uint16_t )) /* Prescaler for the Sample Counter */ +#define BITM_RNG_LEN_RELOAD (_ADI_MSK_3(0x00000FFF,0x00000FFFU, uint16_t )) /* Reload Value for the Sample Counter */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RNG_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RNG_STAT_STUCK 1 /* Sampled Data Stuck High or Low */ +#define BITP_RNG_STAT_RNRDY 0 /* Random Number Ready */ +#define BITM_RNG_STAT_STUCK (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Sampled Data Stuck High or Low */ +#define BITM_RNG_STAT_RNRDY (_ADI_MSK_3(0x00000001,0x00000001U, uint16_t )) /* Random Number Ready */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RNG_DATA Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RNG_DATA_BUFF 8 /* Buffer for RNG Data */ +#define BITP_RNG_DATA_VALUE 0 /* Value of the CRC Accumulator */ +#define BITM_RNG_DATA_BUFF (_ADI_MSK_3(0xFFFFFF00,0xFFFFFF00UL, uint32_t )) /* Buffer for RNG Data */ +#define BITM_RNG_DATA_VALUE (_ADI_MSK_3(0x000000FF,0x000000FFUL, uint32_t )) /* Value of the CRC Accumulator */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RNG_OSCCNT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RNG_OSCCNT_VALUE 0 /* Oscillator Count */ +#define BITM_RNG_OSCCNT_VALUE (_ADI_MSK_3(0x0FFFFFFF,0x0FFFFFFFUL, uint32_t )) /* Oscillator Count */ + +/* ------------------------------------------------------------------------------------------------------------------------- + RNG_OSCDIFF[n] Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_RNG_OSCDIFF_DELTA 0 /* Oscillator Count Difference */ +#define BITM_RNG_OSCDIFF_DELTA (_ADI_MSK_3(0x000000FF,0x000000FF, int8_t )) /* Oscillator Count Difference */ + + +/* ============================================================================================================================ + Register Map for the Crypto Block + ============================================================================================================================ */ + +/* ============================================================================================================================ + CRYPT0 + ============================================================================================================================ */ +#define REG_CRYPT0_CFG 0x40044000 /* CRYPT0 Configuration Register */ +#define REG_CRYPT0_DATALEN 0x40044004 /* CRYPT0 Payload Data Length */ +#define REG_CRYPT0_PREFIXLEN 0x40044008 /* CRYPT0 Authentication Data Length */ +#define REG_CRYPT0_INTEN 0x4004400C /* CRYPT0 Interrupt Enable Register */ +#define REG_CRYPT0_STAT 0x40044010 /* CRYPT0 Status Register */ +#define REG_CRYPT0_INBUF 0x40044014 /* CRYPT0 Input Buffer */ +#define REG_CRYPT0_OUTBUF 0x40044018 /* CRYPT0 Output Buffer */ +#define REG_CRYPT0_NONCE0 0x4004401C /* CRYPT0 Nonce Bits [31:0] */ +#define REG_CRYPT0_NONCE1 0x40044020 /* CRYPT0 Nonce Bits [63:32] */ +#define REG_CRYPT0_NONCE2 0x40044024 /* CRYPT0 Nonce Bits [95:64] */ +#define REG_CRYPT0_NONCE3 0x40044028 /* CRYPT0 Nonce Bits [127:96] */ +#define REG_CRYPT0_AESKEY0 0x4004402C /* CRYPT0 AES Key Bits [31:0] */ +#define REG_CRYPT0_AESKEY1 0x40044030 /* CRYPT0 AES Key Bits [63:32] */ +#define REG_CRYPT0_AESKEY2 0x40044034 /* CRYPT0 AES Key Bits [95:64] */ +#define REG_CRYPT0_AESKEY3 0x40044038 /* CRYPT0 AES Key Bits [127:96] */ +#define REG_CRYPT0_AESKEY4 0x4004403C /* CRYPT0 AES Key Bits [159:128] */ +#define REG_CRYPT0_AESKEY5 0x40044040 /* CRYPT0 AES Key Bits [191:160] */ +#define REG_CRYPT0_AESKEY6 0x40044044 /* CRYPT0 AES Key Bits [223:192] */ +#define REG_CRYPT0_AESKEY7 0x40044048 /* CRYPT0 AES Key Bits [255:224] */ +#define REG_CRYPT0_CNTRINIT 0x4004404C /* CRYPT0 Counter Initialization Vector */ +#define REG_CRYPT0_SHAH0 0x40044050 /* CRYPT0 SHA Bits [31:0] */ +#define REG_CRYPT0_SHAH1 0x40044054 /* CRYPT0 SHA Bits [63:32] */ +#define REG_CRYPT0_SHAH2 0x40044058 /* CRYPT0 SHA Bits [95:64] */ +#define REG_CRYPT0_SHAH3 0x4004405C /* CRYPT0 SHA Bits [127:96] */ +#define REG_CRYPT0_SHAH4 0x40044060 /* CRYPT0 SHA Bits [159:128] */ +#define REG_CRYPT0_SHAH5 0x40044064 /* CRYPT0 SHA Bits [191:160] */ +#define REG_CRYPT0_SHAH6 0x40044068 /* CRYPT0 SHA Bits [223:192] */ +#define REG_CRYPT0_SHAH7 0x4004406C /* CRYPT0 SHA Bits [255:224] */ +#define REG_CRYPT0_SHA_LAST_WORD 0x40044070 /* CRYPT0 SHA Last Word and Valid Bits Information */ +#define REG_CRYPT0_CCM_NUM_VALID_BYTES 0x40044074 /* CRYPT0 NUM_VALID_BYTES */ +#define REG_CRYPT0_PRKSTORCFG 0x40044078 /* CRYPT0 PRKSTOR Configuration */ +#define REG_CRYPT0_KUW0 0x40044080 /* CRYPT0 Key Wrap Unwrap Register 0 */ +#define REG_CRYPT0_KUW1 0x40044084 /* CRYPT0 Key Wrap Unwrap Register 1 */ +#define REG_CRYPT0_KUW2 0x40044088 /* CRYPT0 Key Wrap Unwrap Register 2 */ +#define REG_CRYPT0_KUW3 0x4004408C /* CRYPT0 Key Wrap Unwrap Register 3 */ +#define REG_CRYPT0_KUW4 0x40044090 /* CRYPT0 Key Wrap Unwrap Register 4 */ +#define REG_CRYPT0_KUW5 0x40044094 /* CRYPT0 Key Wrap Unwrap Register 5 */ +#define REG_CRYPT0_KUW6 0x40044098 /* CRYPT0 Key Wrap Unwrap Register 6 */ +#define REG_CRYPT0_KUW7 0x4004409C /* CRYPT0 Key Wrap Unwrap Register 7 */ +#define REG_CRYPT0_KUW8 0x400440A0 /* CRYPT0 Key Wrap Unwrap Register 8 */ +#define REG_CRYPT0_KUW9 0x400440A4 /* CRYPT0 Key Wrap Unwrap Register 9 */ +#define REG_CRYPT0_KUW10 0x400440A8 /* CRYPT0 Key Wrap Unwrap Register 10 */ +#define REG_CRYPT0_KUW11 0x400440AC /* CRYPT0 Key Wrap Unwrap Register 11 */ +#define REG_CRYPT0_KUW12 0x400440B0 /* CRYPT0 Key Wrap Unwrap Register 12 */ +#define REG_CRYPT0_KUW13 0x400440B4 /* CRYPT0 Key Wrap Unwrap Register 13 */ +#define REG_CRYPT0_KUW14 0x400440B8 /* CRYPT0 Key Wrap Unwrap Register 14 */ +#define REG_CRYPT0_KUW15 0x400440BC /* CRYPT0 Key Wrap Unwrap Register 15 */ +#define REG_CRYPT0_KUWVALSTR1 0x400440C0 /* CRYPT0 Key Wrap Unwrap Validation String [63:32] */ +#define REG_CRYPT0_KUWVALSTR2 0x400440C4 /* CRYPT0 Key Wrap Unwrap Validation String [31:0] */ + +/* ============================================================================================================================ + CRYPT Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_CFG Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_CFG_REVID 28 /* Rev ID for Crypto */ +#define BITP_CRYPT_CFG_SHAINIT 26 /* Restarts SHA Computation */ +#define BITP_CRYPT_CFG_SHA256EN 25 /* Enable SHA-256 Operation */ +#define BITP_CRYPT_CFG_HMACEN 21 /* HMAC Enable */ +#define BITP_CRYPT_CFG_CMACEN 20 /* Enable CMAC Mode Operation */ +#define BITP_CRYPT_CFG_CCMEN 19 /* Enable CCM/CCM* Mode Operation */ +#define BITP_CRYPT_CFG_CBCEN 18 /* Enable CBC Mode Operation */ +#define BITP_CRYPT_CFG_CTREN 17 /* Enable CTR Mode Operation */ +#define BITP_CRYPT_CFG_ECBEN 16 /* Enable ECB Mode Operation */ +#define BITP_CRYPT_CFG_PRKSTOREN 15 /* Enable PRKSTOR Commands */ +#define BITP_CRYPT_CFG_KEY_BYTESWAP 14 /* Use Key Unwrap Before HMAC */ +#define BITP_CRYPT_CFG_SHA_BYTESWAP 13 /* Enable Key Wrap */ +#define BITP_CRYPT_CFG_AES_BYTESWAP 12 /* Byteswap for AES Input */ +#define BITP_CRYPT_CFG_KUWKEYLEN 10 /* Key Length Key Wrap Unwrap */ +#define BITP_CRYPT_CFG_AESKEYLEN 8 /* Select Key Length for AES Cipher */ +#define BITP_CRYPT_CFG_OUTFLUSH 5 /* Output Buffer Flush */ +#define BITP_CRYPT_CFG_INFLUSH 4 /* Input Buffer Flush */ +#define BITP_CRYPT_CFG_OUTDMAEN 3 /* Enable DMA Channel Request for Output Buffer */ +#define BITP_CRYPT_CFG_INDMAEN 2 /* Enable DMA Channel Request for Input Buffer */ +#define BITP_CRYPT_CFG_ENCR 1 /* Encrypt or Decrypt */ +#define BITP_CRYPT_CFG_BLKEN 0 /* Enable Bit for Crypto Block */ +#define BITM_CRYPT_CFG_REVID (_ADI_MSK_3(0xF0000000,0xF0000000UL, uint32_t )) /* Rev ID for Crypto */ +#define BITM_CRYPT_CFG_SHAINIT (_ADI_MSK_3(0x04000000,0x04000000UL, uint32_t )) /* Restarts SHA Computation */ +#define BITM_CRYPT_CFG_SHA256EN (_ADI_MSK_3(0x02000000,0x02000000UL, uint32_t )) /* Enable SHA-256 Operation */ +#define BITM_CRYPT_CFG_HMACEN (_ADI_MSK_3(0x00200000,0x00200000UL, uint32_t )) /* HMAC Enable */ +#define BITM_CRYPT_CFG_CMACEN (_ADI_MSK_3(0x00100000,0x00100000UL, uint32_t )) /* Enable CMAC Mode Operation */ +#define BITM_CRYPT_CFG_CCMEN (_ADI_MSK_3(0x00080000,0x00080000UL, uint32_t )) /* Enable CCM/CCM* Mode Operation */ +#define BITM_CRYPT_CFG_CBCEN (_ADI_MSK_3(0x00040000,0x00040000UL, uint32_t )) /* Enable CBC Mode Operation */ +#define BITM_CRYPT_CFG_CTREN (_ADI_MSK_3(0x00020000,0x00020000UL, uint32_t )) /* Enable CTR Mode Operation */ +#define BITM_CRYPT_CFG_ECBEN (_ADI_MSK_3(0x00010000,0x00010000UL, uint32_t )) /* Enable ECB Mode Operation */ +#define BITM_CRYPT_CFG_PRKSTOREN (_ADI_MSK_3(0x00008000,0x00008000UL, uint32_t )) /* Enable PRKSTOR Commands */ +#define BITM_CRYPT_CFG_KEY_BYTESWAP (_ADI_MSK_3(0x00004000,0x00004000UL, uint32_t )) /* Use Key Unwrap Before HMAC */ +#define BITM_CRYPT_CFG_SHA_BYTESWAP (_ADI_MSK_3(0x00002000,0x00002000UL, uint32_t )) /* Enable Key Wrap */ +#define BITM_CRYPT_CFG_AES_BYTESWAP (_ADI_MSK_3(0x00001000,0x00001000UL, uint32_t )) /* Byteswap for AES Input */ +#define BITM_CRYPT_CFG_KUWKEYLEN (_ADI_MSK_3(0x00000C00,0x00000C00UL, uint32_t )) /* Key Length Key Wrap Unwrap */ +#define BITM_CRYPT_CFG_AESKEYLEN (_ADI_MSK_3(0x00000300,0x00000300UL, uint32_t )) /* Select Key Length for AES Cipher */ +#define BITM_CRYPT_CFG_OUTFLUSH (_ADI_MSK_3(0x00000020,0x00000020UL, uint32_t )) /* Output Buffer Flush */ +#define BITM_CRYPT_CFG_INFLUSH (_ADI_MSK_3(0x00000010,0x00000010UL, uint32_t )) /* Input Buffer Flush */ +#define BITM_CRYPT_CFG_OUTDMAEN (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* Enable DMA Channel Request for Output Buffer */ +#define BITM_CRYPT_CFG_INDMAEN (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Enable DMA Channel Request for Input Buffer */ +#define BITM_CRYPT_CFG_ENCR (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Encrypt or Decrypt */ +#define BITM_CRYPT_CFG_BLKEN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Enable Bit for Crypto Block */ +#define ENUM_CRYPT_CFG_LEN128 (_ADI_MSK_3(0x00000400,0x00000400UL, uint32_t )) /* KUWKeyLen: The key size of KUW key is 128 bits */ +#define ENUM_CRYPT_CFG_LEN256 (_ADI_MSK_3(0x00000800,0x00000800UL, uint32_t )) /* KUWKeyLen: The key size of KUW key is 256 bits */ +#define ENUM_CRYPT_CFG_LEN512 (_ADI_MSK_3(0x00000C00,0x00000C00UL, uint32_t )) /* KUWKeyLen: The key size of KUW key is 512 bits */ +#define ENUM_CRYPT_CFG_AESKEYLEN128 (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* AESKEYLEN: Uses 128-bit long key */ +#define ENUM_CRYPT_CFG_AESKEYLEN256 (_ADI_MSK_3(0x00000200,0x00000200UL, uint32_t )) /* AESKEYLEN: Uses 256-bit long key */ +#define ENUM_CRYPT_CFG_DMA_DISABLE_OUTBUF (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* OUTDMAEN: Disable DMA Requesting for Output Buffer */ +#define ENUM_CRYPT_CFG_DMA_ENABLE_OUTBUF (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* OUTDMAEN: Enable DMA Requesting for Output Buffer */ +#define ENUM_CRYPT_CFG_DMA_DISABLE_INBUF (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* INDMAEN: Disable DMA Requesting for Input Buffer */ +#define ENUM_CRYPT_CFG_DMA_ENABLE_INBUF (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* INDMAEN: Enable DMA Requesting for Input Buffer */ +#define ENUM_CRYPT_CFG_ENABLE (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* BLKEN: Enable Crypto Block */ +#define ENUM_CRYPT_CFG_DISABLE (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* BLKEN: Disable Crypto Block */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_DATALEN Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_DATALEN_VALUE 0 /* Length of Payload Data */ +#define BITM_CRYPT_DATALEN_VALUE (_ADI_MSK_3(0x000FFFFF,0x000FFFFFUL, uint32_t )) /* Length of Payload Data */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_PREFIXLEN Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_PREFIXLEN_VALUE 0 /* Length of Associated Data */ +#define BITM_CRYPT_PREFIXLEN_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFUL, uint32_t )) /* Length of Associated Data */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_INTEN Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_INTEN_PRKSTRCMDONEEN 8 /* PRKSTOR CMD DONE INTEN */ +#define BITP_CRYPT_INTEN_HMACMSGRDYEN 7 /* Status Bit for HMAC Message Input Ready */ +#define BITP_CRYPT_INTEN_HMACDONEEN 6 /* Interrupt Enable for HMAC Done */ +#define BITP_CRYPT_INTEN_SHADONEN 5 /* Enable SHA_Done Interrupt */ +#define BITP_CRYPT_INTEN_INOVREN 2 /* Enable Input Overflow Interrupt */ +#define BITP_CRYPT_INTEN_OUTRDYEN 1 /* Enables the Output Ready Interrupt */ +#define BITP_CRYPT_INTEN_INRDYEN 0 /* Enable Input Ready Interrupt */ +#define BITM_CRYPT_INTEN_PRKSTRCMDONEEN (_ADI_MSK_3(0x00000100,0x00000100UL, uint32_t )) /* PRKSTOR CMD DONE INTEN */ +#define BITM_CRYPT_INTEN_HMACMSGRDYEN (_ADI_MSK_3(0x00000080,0x00000080UL, uint32_t )) /* Status Bit for HMAC Message Input Ready */ +#define BITM_CRYPT_INTEN_HMACDONEEN (_ADI_MSK_3(0x00000040,0x00000040UL, uint32_t )) /* Interrupt Enable for HMAC Done */ +#define BITM_CRYPT_INTEN_SHADONEN (_ADI_MSK_3(0x00000020,0x00000020UL, uint32_t )) /* Enable SHA_Done Interrupt */ +#define BITM_CRYPT_INTEN_INOVREN (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Enable Input Overflow Interrupt */ +#define BITM_CRYPT_INTEN_OUTRDYEN (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Enables the Output Ready Interrupt */ +#define BITM_CRYPT_INTEN_INRDYEN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Enable Input Ready Interrupt */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_STAT_PRKSTOR_BUSY 31 /* Indicates PrKSTOR is Busy */ +#define BITP_CRYPT_STAT_CMD_ISSUED 27 /* Last Command Issued to PrKStor; */ +#define BITP_CRYPT_STAT_PRKSTOR_RET_STATUS 25 /* ECC Errors in the PRKSTOR_RETRIEVE Command */ +#define BITP_CRYPT_STAT_PRKSTOR_CMD_FAIL 24 /* Indicates Last Command Issued Failed */ +#define BITP_CRYPT_STAT_PRKSTOR_CMD_DONE 23 /* Indicates Command Done for PrKStor */ +#define BITP_CRYPT_STAT_HMACMSGRDY 15 /* Status Bit Indicates HMAC is Message Ready */ +#define BITP_CRYPT_STAT_HMACDONE 14 /* Status Bit Indicates HMAC Done */ +#define BITP_CRYPT_STAT_HMACBUSY 13 /* Status Bit Indicates HMAC Busy */ +#define BITP_CRYPT_STAT_OUTWORDS 10 /* Number of Words in the Output Buffer */ +#define BITP_CRYPT_STAT_INWORDS 7 /* Number of Words in the Input Buffer */ +#define BITP_CRYPT_STAT_SHABUSY 6 /* SHA Busy. in Computation */ +#define BITP_CRYPT_STAT_SHADONE 5 /* SHA Computation Complete */ +#define BITP_CRYPT_STAT_INOVR 2 /* Overflow in the Input Buffer */ +#define BITP_CRYPT_STAT_OUTRDY 1 /* Output Data Ready */ +#define BITP_CRYPT_STAT_INRDY 0 /* Input Buffer Status */ +#define BITM_CRYPT_STAT_PRKSTOR_BUSY (_ADI_MSK_3(0x80000000,0x80000000UL, uint32_t )) /* Indicates PrKSTOR is Busy */ +#define BITM_CRYPT_STAT_CMD_ISSUED (_ADI_MSK_3(0x78000000,0x78000000UL, uint32_t )) /* Last Command Issued to PrKStor; */ +#define BITM_CRYPT_STAT_PRKSTOR_RET_STATUS (_ADI_MSK_3(0x06000000,0x06000000UL, uint32_t )) /* ECC Errors in the PRKSTOR_RETRIEVE Command */ +#define BITM_CRYPT_STAT_PRKSTOR_CMD_FAIL (_ADI_MSK_3(0x01000000,0x01000000UL, uint32_t )) /* Indicates Last Command Issued Failed */ +#define BITM_CRYPT_STAT_PRKSTOR_CMD_DONE (_ADI_MSK_3(0x00800000,0x00800000UL, uint32_t )) /* Indicates Command Done for PrKStor */ +#define BITM_CRYPT_STAT_HMACMSGRDY (_ADI_MSK_3(0x00008000,0x00008000UL, uint32_t )) /* Status Bit Indicates HMAC is Message Ready */ +#define BITM_CRYPT_STAT_HMACDONE (_ADI_MSK_3(0x00004000,0x00004000UL, uint32_t )) /* Status Bit Indicates HMAC Done */ +#define BITM_CRYPT_STAT_HMACBUSY (_ADI_MSK_3(0x00002000,0x00002000UL, uint32_t )) /* Status Bit Indicates HMAC Busy */ +#define BITM_CRYPT_STAT_OUTWORDS (_ADI_MSK_3(0x00001C00,0x00001C00UL, uint32_t )) /* Number of Words in the Output Buffer */ +#define BITM_CRYPT_STAT_INWORDS (_ADI_MSK_3(0x00000380,0x00000380UL, uint32_t )) /* Number of Words in the Input Buffer */ +#define BITM_CRYPT_STAT_SHABUSY (_ADI_MSK_3(0x00000040,0x00000040UL, uint32_t )) /* SHA Busy. in Computation */ +#define BITM_CRYPT_STAT_SHADONE (_ADI_MSK_3(0x00000020,0x00000020UL, uint32_t )) /* SHA Computation Complete */ +#define BITM_CRYPT_STAT_INOVR (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Overflow in the Input Buffer */ +#define BITM_CRYPT_STAT_OUTRDY (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Output Data Ready */ +#define BITM_CRYPT_STAT_INRDY (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Input Buffer Status */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_INBUF Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_INBUF_VALUE 0 /* Input Buffer */ +#define BITM_CRYPT_INBUF_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Input Buffer */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_OUTBUF Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_OUTBUF_VALUE 0 /* Output Buffer */ +#define BITM_CRYPT_OUTBUF_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Output Buffer */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_NONCE0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_NONCE0_VALUE 0 /* Word 0: Nonce Bits [31:0] */ +#define BITM_CRYPT_NONCE0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Word 0: Nonce Bits [31:0] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_NONCE1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_NONCE1_VALUE 0 /* Word 1: Nonce Bits [63:32] */ +#define BITM_CRYPT_NONCE1_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Word 1: Nonce Bits [63:32] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_NONCE2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_NONCE2_VALUE 0 /* Word 2: Nonce Bits [95:64] */ +#define BITM_CRYPT_NONCE2_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Word 2: Nonce Bits [95:64] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_NONCE3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_NONCE3_VALUE 0 /* Word 3: Nonce Bits [127:96] */ +#define BITM_CRYPT_NONCE3_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Word 3: Nonce Bits [127:96] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_AESKEY0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_AESKEY0_VALUE 0 /* Key: Bytes [3:0] */ +#define BITM_CRYPT_AESKEY0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Key: Bytes [3:0] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_AESKEY1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_AESKEY1_VALUE 0 /* Key: Bytes [7:4] */ +#define BITM_CRYPT_AESKEY1_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Key: Bytes [7:4] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_AESKEY2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_AESKEY2_VALUE 0 /* Key: Bytes [11:8] */ +#define BITM_CRYPT_AESKEY2_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Key: Bytes [11:8] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_AESKEY3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_AESKEY3_VALUE 0 /* Key: Bytes [15:12] */ +#define BITM_CRYPT_AESKEY3_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Key: Bytes [15:12] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_AESKEY4 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_AESKEY4_VALUE 0 /* Key: Bytes [19:16] */ +#define BITM_CRYPT_AESKEY4_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Key: Bytes [19:16] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_AESKEY5 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_AESKEY5_VALUE 0 /* Key: Bytes [23:20] */ +#define BITM_CRYPT_AESKEY5_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Key: Bytes [23:20] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_AESKEY6 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_AESKEY6_VALUE 0 /* Key: Bytes [27:24] */ +#define BITM_CRYPT_AESKEY6_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Key: Bytes [27:24] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_AESKEY7 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_AESKEY7_VALUE 0 /* Key: Bytes [31:28] */ +#define BITM_CRYPT_AESKEY7_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Key: Bytes [31:28] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_CNTRINIT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_CNTRINIT_VALUE 0 /* Counter Initialization Value */ +#define BITM_CRYPT_CNTRINIT_VALUE (_ADI_MSK_3(0x000FFFFF,0x000FFFFFUL, uint32_t )) /* Counter Initialization Value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_SHAH0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_SHAH0_SHAHASH0 0 /* Word 0: SHA Hash */ +#define BITM_CRYPT_SHAH0_SHAHASH0 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Word 0: SHA Hash */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_SHAH1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_SHAH1_SHAHASH1 0 /* Word 1: SHA Hash */ +#define BITM_CRYPT_SHAH1_SHAHASH1 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Word 1: SHA Hash */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_SHAH2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_SHAH2_SHAHASH2 0 /* Word 2: SHA Hash */ +#define BITM_CRYPT_SHAH2_SHAHASH2 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Word 2: SHA Hash */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_SHAH3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_SHAH3_SHAHASH3 0 /* Word 3: SHA Hash */ +#define BITM_CRYPT_SHAH3_SHAHASH3 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Word 3: SHA Hash */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_SHAH4 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_SHAH4_SHAHASH4 0 /* Word 4: SHA Hash */ +#define BITM_CRYPT_SHAH4_SHAHASH4 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Word 4: SHA Hash */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_SHAH5 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_SHAH5_SHAHASH5 0 /* Word 5: SHA Hash */ +#define BITM_CRYPT_SHAH5_SHAHASH5 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Word 5: SHA Hash */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_SHAH6 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_SHAH6_SHAHASH6 0 /* Word 6: SHA Hash */ +#define BITM_CRYPT_SHAH6_SHAHASH6 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Word 6: SHA Hash */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_SHAH7 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_SHAH7_SHAHASH7 0 /* Word 7: SHA Hash */ +#define BITM_CRYPT_SHAH7_SHAHASH7 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Word 7: SHA Hash */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_SHA_LAST_WORD Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_SHA_LAST_WORD_O_BITS_VALID 1 /* Bits Valid in SHA Last Word Input */ +#define BITP_CRYPT_SHA_LAST_WORD_O_LAST_WORD 0 /* Last SHA Input Word */ +#define BITM_CRYPT_SHA_LAST_WORD_O_BITS_VALID (_ADI_MSK_3(0x0000003E,0x0000003EUL, uint32_t )) /* Bits Valid in SHA Last Word Input */ +#define BITM_CRYPT_SHA_LAST_WORD_O_LAST_WORD (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Last SHA Input Word */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_CCM_NUM_VALID_BYTES Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_CCM_NUM_VALID_BYTES_NUM_VALID_BYTES 0 /* Number of Valid Bytes in CCM Last Data */ +#define BITM_CRYPT_CCM_NUM_VALID_BYTES_NUM_VALID_BYTES (_ADI_MSK_3(0x0000000F,0x0000000FUL, uint32_t )) /* Number of Valid Bytes in CCM Last Data */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_PRKSTORCFG Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_PRKSTORCFG_CMD 7 /* Command Input for PRKSTOR */ +#define BITP_CRYPT_PRKSTORCFG_KEY_INDEX 0 /* Index of Key in PRKSTOR */ +#define BITM_CRYPT_PRKSTORCFG_CMD (_ADI_MSK_3(0x00000780,0x00000780UL, uint32_t )) /* Command Input for PRKSTOR */ +#define BITM_CRYPT_PRKSTORCFG_KEY_INDEX (_ADI_MSK_3(0x0000007F,0x0000007FUL, uint32_t )) /* Index of Key in PRKSTOR */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUW0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUW0_KUW0 0 /* KUW [31:0] */ +#define BITM_CRYPT_KUW0_KUW0 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* KUW [31:0] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUW1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUW1_KUW1 0 /* KUW [63:32] */ +#define BITM_CRYPT_KUW1_KUW1 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* KUW [63:32] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUW2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUW2_KUW2 0 /* KUW [95:64] */ +#define BITM_CRYPT_KUW2_KUW2 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* KUW [95:64] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUW3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUW3_KUW3 0 /* KUW [127:96] */ +#define BITM_CRYPT_KUW3_KUW3 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* KUW [127:96] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUW4 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUW4_KUW4 0 /* KUW [159:128] */ +#define BITM_CRYPT_KUW4_KUW4 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* KUW [159:128] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUW5 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUW5_KUW5 0 /* KUW [191:160] */ +#define BITM_CRYPT_KUW5_KUW5 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* KUW [191:160] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUW6 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUW6_KUW6 0 /* KUW [223:192] */ +#define BITM_CRYPT_KUW6_KUW6 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* KUW [223:192] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUW7 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUW7_KUW7 0 /* KUW [255:224] */ +#define BITM_CRYPT_KUW7_KUW7 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* KUW [255:224] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUW8 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUW8_KUW8 0 /* KUW [287:256] */ +#define BITM_CRYPT_KUW8_KUW8 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* KUW [287:256] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUW9 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUW9_KUW9 0 /* KUW [319:288] */ +#define BITM_CRYPT_KUW9_KUW9 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* KUW [319:288] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUW10 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUW10_KUW10 0 /* KUW [351:320] */ +#define BITM_CRYPT_KUW10_KUW10 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* KUW [351:320] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUW11 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUW11_KUW11 0 /* KUW [383:352] */ +#define BITM_CRYPT_KUW11_KUW11 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* KUW [383:352] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUW12 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUW12_KUW12 0 /* KUW [415:384] */ +#define BITM_CRYPT_KUW12_KUW12 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* KUW [415:384] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUW13 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUW13_KUW13 0 /* KUW [447:416] */ +#define BITM_CRYPT_KUW13_KUW13 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* KUW [447:416] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUW14 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUW14_KUW14 0 /* KUW [479:448] */ +#define BITM_CRYPT_KUW14_KUW14 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* KUW [479:448] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUW15 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUW15_KUW15 0 /* KUW [511:480] */ +#define BITM_CRYPT_KUW15_KUW15 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* KUW [511:480] */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUWVALSTR1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUWVALSTR1_INITALVALUE0 0 /* Initial Value */ +#define BITM_CRYPT_KUWVALSTR1_INITALVALUE0 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Initial Value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CRYPT_KUWVALSTR2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CRYPT_KUWVALSTR2_INITIALVALUE1 0 /* Initial Value */ +#define BITM_CRYPT_KUWVALSTR2_INITIALVALUE1 (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Initial Value */ + + +/* ============================================================================================================================ + Power Management Registers + ============================================================================================================================ */ + +/* ============================================================================================================================ + PMG0 + ============================================================================================================================ */ +#define REG_PMG0_IEN 0x4004C000 /* PMG0 Power Supply Monitor Interrupt Enable */ +#define REG_PMG0_PSM_STAT 0x4004C004 /* PMG0 Power Supply Monitor Status */ +#define REG_PMG0_PWRMOD 0x4004C008 /* PMG0 Power Mode Register */ +#define REG_PMG0_PWRKEY 0x4004C00C /* PMG0 Key Protection for PWRMOD and SRAMRET */ +#define REG_PMG0_SHDN_STAT 0x4004C010 /* PMG0 Shutdown Status Register */ +#define REG_PMG0_SRAMRET 0x4004C014 /* PMG0 Control for Retention SRAM in Hibernate Mode */ +#define REG_PMG0_TRIM 0x4004C038 /* PMG0 Trimming Bits */ +#define REG_PMG0_RST_STAT 0x4004C040 /* PMG0 Reset Status */ +#define REG_PMG0_CTL1 0x4004C044 /* PMG0 HPBUCK Control */ + +/* ============================================================================================================================ + PMG Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + PMG_IEN Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PMG_IEN_IENBAT 10 /* Interrupt enable for VBAT range */ +#define BITP_PMG_IEN_RANGEBAT 8 /* Battery Monitor Range */ +#define BITP_PMG_IEN_VREGOVR 2 /* Enable Interrupt when VREG over-voltage (above 1.32 V) */ +#define BITP_PMG_IEN_VREGUNDR 1 /* Enable Interrupt when VREG under-voltage (below 1 V) */ +#define BITP_PMG_IEN_VBAT 0 /* Enable Interrupt for VBAT */ +#define BITM_PMG_IEN_IENBAT (_ADI_MSK_3(0x00000400,0x00000400UL, uint32_t )) /* Interrupt enable for VBAT range */ +#define BITM_PMG_IEN_RANGEBAT (_ADI_MSK_3(0x00000300,0x00000300UL, uint32_t )) /* Battery Monitor Range */ +#define BITM_PMG_IEN_VREGOVR (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Enable Interrupt when VREG over-voltage (above 1.32 V) */ +#define BITM_PMG_IEN_VREGUNDR (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Enable Interrupt when VREG under-voltage (below 1 V) */ +#define BITM_PMG_IEN_VBAT (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Enable Interrupt for VBAT */ +#define ENUM_PMG_IEN_REGION1 (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* RANGEBAT: Configure to generate interrupt if VBAT in Region1 */ +#define ENUM_PMG_IEN_REGION2 (_ADI_MSK_3(0x00000100,0x00000100UL, uint32_t )) /* RANGEBAT: Configure to generate interrupt if VBAT in Region2 */ +#define ENUM_PMG_IEN_REGION3 (_ADI_MSK_3(0x00000200,0x00000200UL, uint32_t )) /* RANGEBAT: Configure to generate interrupt if VBAT in Region3 */ +#define ENUM_PMG_IEN_NA (_ADI_MSK_3(0x00000300,0x00000300UL, uint32_t )) /* RANGEBAT: NA */ + +/* ------------------------------------------------------------------------------------------------------------------------- + PMG_PSM_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PMG_PSM_STAT_RORANGE3 15 /* VBAT range3 */ +#define BITP_PMG_PSM_STAT_RORANGE2 14 /* VBAT range2 */ +#define BITP_PMG_PSM_STAT_RORANGE1 13 /* VBAT range1 */ +#define BITP_PMG_PSM_STAT_RANGE3 10 /* VBAT range3 */ +#define BITP_PMG_PSM_STAT_RANGE2 9 /* VBAT range2 */ +#define BITP_PMG_PSM_STAT_RANGE1 8 /* VBAT range1 */ +#define BITP_PMG_PSM_STAT_WICENACK 7 /* WIC Enable Acknowledge from Cortex */ +#define BITP_PMG_PSM_STAT_VREGOVR 2 /* Status bit for alarm indicating Over Voltage for VREG */ +#define BITP_PMG_PSM_STAT_VREGUNDR 1 /* Status bit for Alarm indicating VREG is below 1 V */ +#define BITP_PMG_PSM_STAT_VBATUNDR 0 /* Status bit indicating an Alarm that battery is below 1.8 V */ +#define BITM_PMG_PSM_STAT_RORANGE3 (_ADI_MSK_3(0x00008000,0x00008000UL, uint32_t )) /* VBAT range3 */ +#define BITM_PMG_PSM_STAT_RORANGE2 (_ADI_MSK_3(0x00004000,0x00004000UL, uint32_t )) /* VBAT range2 */ +#define BITM_PMG_PSM_STAT_RORANGE1 (_ADI_MSK_3(0x00002000,0x00002000UL, uint32_t )) /* VBAT range1 */ +#define BITM_PMG_PSM_STAT_RANGE3 (_ADI_MSK_3(0x00000400,0x00000400UL, uint32_t )) /* VBAT range3 */ +#define BITM_PMG_PSM_STAT_RANGE2 (_ADI_MSK_3(0x00000200,0x00000200UL, uint32_t )) /* VBAT range2 */ +#define BITM_PMG_PSM_STAT_RANGE1 (_ADI_MSK_3(0x00000100,0x00000100UL, uint32_t )) /* VBAT range1 */ +#define BITM_PMG_PSM_STAT_WICENACK (_ADI_MSK_3(0x00000080,0x00000080UL, uint32_t )) /* WIC Enable Acknowledge from Cortex */ +#define BITM_PMG_PSM_STAT_VREGOVR (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Status bit for alarm indicating Over Voltage for VREG */ +#define BITM_PMG_PSM_STAT_VREGUNDR (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Status bit for Alarm indicating VREG is below 1 V */ +#define BITM_PMG_PSM_STAT_VBATUNDR (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Status bit indicating an Alarm that battery is below 1.8 V */ +#define ENUM_PMG_PSM_STAT_BATSTAT1 (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* RORANGE1: VBAT NOT in the range specified */ +#define ENUM_PMG_PSM_STAT_BATSTAT0 (_ADI_MSK_3(0x00002000,0x00002000UL, uint32_t )) /* RORANGE1: VBAT in the range specified */ + +/* ------------------------------------------------------------------------------------------------------------------------- + PMG_PWRMOD Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PMG_PWRMOD_MONVBATN 3 /* Monitor VBAT during Hibernate Mode. Monitors VBAT by default */ +#define BITP_PMG_PWRMOD_MODE 0 /* Power Mode Bits */ +#define BITM_PMG_PWRMOD_MONVBATN (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* Monitor VBAT during Hibernate Mode. Monitors VBAT by default */ +#define BITM_PMG_PWRMOD_MODE (_ADI_MSK_3(0x00000003,0x00000003UL, uint32_t )) /* Power Mode Bits */ +#define ENUM_PMG_PWRMOD_FLEXI (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* MODE: Flexi Mode */ +#define ENUM_PMG_PWRMOD_HIBERNATE (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* MODE: Hibernate Mode */ +#define ENUM_PMG_PWRMOD_SHUTDOWN (_ADI_MSK_3(0x00000003,0x00000003UL, uint32_t )) /* MODE: Shutdown Mode */ + +/* ------------------------------------------------------------------------------------------------------------------------- + PMG_PWRKEY Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PMG_PWRKEY_VALUE 0 /* Power Control Key */ +#define BITM_PMG_PWRKEY_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFUL, uint32_t )) /* Power Control Key */ + +/* ------------------------------------------------------------------------------------------------------------------------- + PMG_SHDN_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PMG_SHDN_STAT_RTC 3 /* Interrupt from RTC */ +#define BITP_PMG_SHDN_STAT_EXTINT2 2 /* Interrupt from External Interrupt 2 */ +#define BITP_PMG_SHDN_STAT_EXTINT1 1 /* Interrupt from External Interrupt 1 */ +#define BITP_PMG_SHDN_STAT_EXTINT0 0 /* Interrupt from External Interrupt 0 */ +#define BITM_PMG_SHDN_STAT_RTC (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* Interrupt from RTC */ +#define BITM_PMG_SHDN_STAT_EXTINT2 (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Interrupt from External Interrupt 2 */ +#define BITM_PMG_SHDN_STAT_EXTINT1 (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Interrupt from External Interrupt 1 */ +#define BITM_PMG_SHDN_STAT_EXTINT0 (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Interrupt from External Interrupt 0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + PMG_SRAMRET Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PMG_SRAMRET_HIBERNATE_SRAM_LOAD_MODE 23 /* Hibernate mode SRAM load mode control */ +#define BITP_PMG_SRAMRET_RET4 9 /* Enable retention bank 6 and bank 7 (32 KB) */ +#define BITP_PMG_SRAMRET_RET3 8 /* Enable retention bank 5 (32 KB) */ +#define BITP_PMG_SRAMRET_RET2 1 /* Enable retention bank 3 and bank 4 (32 KB) */ +#define BITP_PMG_SRAMRET_RET1 0 /* Enable retention bank 1 (12 KB) */ +#define BITM_PMG_SRAMRET_HIBERNATE_SRAM_LOAD_MODE (_ADI_MSK_3(0x00800000,0x00800000UL, uint32_t )) /* Hibernate mode SRAM load mode control */ +#define BITM_PMG_SRAMRET_RET4 (_ADI_MSK_3(0x00000200,0x00000200UL, uint32_t )) /* Enable retention bank 6 and bank 7 (32 KB) */ +#define BITM_PMG_SRAMRET_RET3 (_ADI_MSK_3(0x00000100,0x00000100UL, uint32_t )) /* Enable retention bank 5 (32 KB) */ +#define BITM_PMG_SRAMRET_RET2 (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Enable retention bank 3 and bank 4 (32 KB) */ +#define BITM_PMG_SRAMRET_RET1 (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Enable retention bank 1 (12 KB) */ + +/* ------------------------------------------------------------------------------------------------------------------------- + PMG_TRIM Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PMG_TRIM_HIBERNATE_LOAD_MODE 29 /* Hibernate mode load mode control */ +#define BITM_PMG_TRIM_HIBERNATE_LOAD_MODE (_ADI_MSK_3(0xE0000000,0xE0000000UL, uint32_t )) /* Hibernate mode load mode control */ +#define ENUM_PMG_TRIM_HIGH_LOAD (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* hibernate_load_mode: High hibernate load */ +#define ENUM_PMG_TRIM_LOW_LOAD (_ADI_MSK_3(0xE0000000,0xE0000000UL, uint32_t )) /* hibernate_load_mode: Low hibernate load */ + +/* ------------------------------------------------------------------------------------------------------------------------- + PMG_RST_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PMG_RST_STAT_PORSRC 4 /* Power on reset Source */ +#define BITP_PMG_RST_STAT_SWRST 3 /* Software reset */ +#define BITP_PMG_RST_STAT_WDRST 2 /* Watchdog timeout */ +#define BITP_PMG_RST_STAT_EXTRST 1 /* External reset */ +#define BITP_PMG_RST_STAT_POR 0 /* Power-on reset */ +#define BITM_PMG_RST_STAT_PORSRC (_ADI_MSK_3(0x00000030,0x00000030UL, uint32_t )) /* Power on reset Source */ +#define BITM_PMG_RST_STAT_SWRST (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* Software reset */ +#define BITM_PMG_RST_STAT_WDRST (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Watchdog timeout */ +#define BITM_PMG_RST_STAT_EXTRST (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* External reset */ +#define BITM_PMG_RST_STAT_POR (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Power-on reset */ +#define ENUM_PMG_RST_STAT_FAILSAFE_HV (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* PORSRC: POR triggered because VBAT drops below Fail Safe */ +#define ENUM_PMG_RST_STAT_RST_VBAT (_ADI_MSK_3(0x00000010,0x00000010UL, uint32_t )) /* PORSRC: POR trigger because VBAT supply (VBAT < 1.7 V) */ +#define ENUM_PMG_RST_STAT_RST_VREG (_ADI_MSK_3(0x00000020,0x00000020UL, uint32_t )) /* PORSRC: POR triggered because VDD supply (VDD < 1.08 V) */ +#define ENUM_PMG_RST_STAT_FAILSAFE_LV (_ADI_MSK_3(0x00000030,0x00000030UL, uint32_t )) /* PORSRC: POR triggered because VREG drops below Fail Safe */ + +/* ------------------------------------------------------------------------------------------------------------------------- + PMG_CTL1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PMG_CTL1_HPBUCK_LOWPWR_MODE 2 /* HP Buck low power mode */ +#define BITP_PMG_CTL1_HPBUCK_LD_MODE 1 /* HP Buck load mode */ +#define BITP_PMG_CTL1_HPBUCKEN 0 /* Enable HP Buck */ +#define BITM_PMG_CTL1_HPBUCK_LOWPWR_MODE (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* HP Buck low power mode */ +#define BITM_PMG_CTL1_HPBUCK_LD_MODE (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* HP Buck load mode */ +#define BITM_PMG_CTL1_HPBUCKEN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Enable HP Buck */ +#define ENUM_PMG_CTL1_LOWPWRDISABLE (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* HPBUCK_LOWPWR_MODE: HPBUCK Low power mode is disabled */ +#define ENUM_PMG_CTL1_LOWPWRENABLE (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* HPBUCK_LOWPWR_MODE: HPBUCK Low power mode is enabled */ +#define ENUM_PMG_CTL1_HPBUCKLOWLOAD (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* HPBUCK_LD_MODE: HPBUCK Low load mode is enabled */ +#define ENUM_PMG_CTL1_HPBUCKHIGHLOAD (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* HPBUCK_LD_MODE: HPBUCK High load mode is enabled */ + + +/* ============================================================================================================================ + External interrupt configuration + ============================================================================================================================ */ + +/* ============================================================================================================================ + XINT0 + ============================================================================================================================ */ +#define REG_XINT0_CFG0 0x4004C080 /* XINT0 External Interrupt configuration */ +#define REG_XINT0_EXT_STAT 0x4004C084 /* XINT0 External Wakeup Interrupt Status register */ +#define REG_XINT0_CLR 0x4004C090 /* XINT0 External Interrupt clear */ +#define REG_XINT0_NMICLR 0x4004C094 /* XINT0 Non-maskable interrupt clear */ + +/* ============================================================================================================================ + XINT Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + XINT_CFG0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_XINT_CFG0_UART_RX_MDE 21 /* External Interrupt using UART_RX wakeup Mode registers */ +#define BITP_XINT_CFG0_UART_RX_EN 20 /* External Interrupt using SIP_UPDATE enable bit */ +#define BITP_XINT_CFG0_IRQ3EN 15 /* External Interrupt 3 enable bit */ +#define BITP_XINT_CFG0_IRQ3MDE 12 /* External Interrupt 3 Mode registers */ +#define BITP_XINT_CFG0_IRQ2EN 11 /* External Interrupt 2 Enable bit */ +#define BITP_XINT_CFG0_IRQ2MDE 8 /* External Interrupt 2 Mode registers */ +#define BITP_XINT_CFG0_IRQ1EN 7 /* External Interrupt 1 Enable bit */ +#define BITP_XINT_CFG0_IRQ1MDE 4 /* External Interrupt 1 Mode registers */ +#define BITP_XINT_CFG0_IRQ0EN 3 /* External Interrupt 0 Enable bit */ +#define BITP_XINT_CFG0_IRQ0MDE 0 /* External Interrupt 0 Mode registers */ +#define BITM_XINT_CFG0_UART_RX_MDE (_ADI_MSK_3(0x00E00000,0x00E00000UL, uint32_t )) /* External Interrupt using UART_RX wakeup Mode registers */ +#define BITM_XINT_CFG0_UART_RX_EN (_ADI_MSK_3(0x00100000,0x00100000UL, uint32_t )) /* External Interrupt using SIP_UPDATE enable bit */ +#define BITM_XINT_CFG0_IRQ3EN (_ADI_MSK_3(0x00008000,0x00008000UL, uint32_t )) /* External Interrupt 3 enable bit */ +#define BITM_XINT_CFG0_IRQ3MDE (_ADI_MSK_3(0x00007000,0x00007000UL, uint32_t )) /* External Interrupt 3 Mode registers */ +#define BITM_XINT_CFG0_IRQ2EN (_ADI_MSK_3(0x00000800,0x00000800UL, uint32_t )) /* External Interrupt 2 Enable bit */ +#define BITM_XINT_CFG0_IRQ2MDE (_ADI_MSK_3(0x00000700,0x00000700UL, uint32_t )) /* External Interrupt 2 Mode registers */ +#define BITM_XINT_CFG0_IRQ1EN (_ADI_MSK_3(0x00000080,0x00000080UL, uint32_t )) /* External Interrupt 1 Enable bit */ +#define BITM_XINT_CFG0_IRQ1MDE (_ADI_MSK_3(0x00000070,0x00000070UL, uint32_t )) /* External Interrupt 1 Mode registers */ +#define BITM_XINT_CFG0_IRQ0EN (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* External Interrupt 0 Enable bit */ +#define BITM_XINT_CFG0_IRQ0MDE (_ADI_MSK_3(0x00000007,0x00000007UL, uint32_t )) /* External Interrupt 0 Mode registers */ + +/* ------------------------------------------------------------------------------------------------------------------------- + XINT_EXT_STAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_XINT_EXT_STAT_STAT_UART_RXWKUP 5 /* Interrupt status bit for UART RX WAKEUP interrupt */ +#define BITP_XINT_EXT_STAT_STAT_EXTINT3 3 /* Interrupt status bit for External Interrupt 3 */ +#define BITP_XINT_EXT_STAT_STAT_EXTINT2 2 /* Interrupt status bit for External Interrupt 2 */ +#define BITP_XINT_EXT_STAT_STAT_EXTINT1 1 /* Interrupt status bit for External Interrupt 1 */ +#define BITP_XINT_EXT_STAT_STAT_EXTINT0 0 /* Interrupt status bit for External Interrupt 0 */ +#define BITM_XINT_EXT_STAT_STAT_UART_RXWKUP (_ADI_MSK_3(0x00000020,0x00000020UL, uint32_t )) /* Interrupt status bit for UART RX WAKEUP interrupt */ +#define BITM_XINT_EXT_STAT_STAT_EXTINT3 (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* Interrupt status bit for External Interrupt 3 */ +#define BITM_XINT_EXT_STAT_STAT_EXTINT2 (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Interrupt status bit for External Interrupt 2 */ +#define BITM_XINT_EXT_STAT_STAT_EXTINT1 (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Interrupt status bit for External Interrupt 1 */ +#define BITM_XINT_EXT_STAT_STAT_EXTINT0 (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Interrupt status bit for External Interrupt 0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + XINT_CLR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_XINT_CLR_UART_RX_CLR 5 /* External interrupt Clear for UART_RX WAKEUP interrupt */ +#define BITP_XINT_CLR_IRQ3 3 /* External interrupt 3 */ +#define BITP_XINT_CLR_IRQ2 2 /* External interrupt 2 */ +#define BITP_XINT_CLR_IRQ1 1 /* External interrupt 1 */ +#define BITP_XINT_CLR_IRQ0 0 /* External interrupt 0 */ +#define BITM_XINT_CLR_UART_RX_CLR (_ADI_MSK_3(0x00000020,0x00000020UL, uint32_t )) /* External interrupt Clear for UART_RX WAKEUP interrupt */ +#define BITM_XINT_CLR_IRQ3 (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* External interrupt 3 */ +#define BITM_XINT_CLR_IRQ2 (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* External interrupt 2 */ +#define BITM_XINT_CLR_IRQ1 (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* External interrupt 1 */ +#define BITM_XINT_CLR_IRQ0 (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* External interrupt 0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + XINT_NMICLR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_XINT_NMICLR_CLR 0 /* NMI clear */ +#define BITM_XINT_NMICLR_CLR (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* NMI clear */ + + +/* ============================================================================================================================ + Clocking registers + ============================================================================================================================ */ + +/* ============================================================================================================================ + CLKG0_OSC + ============================================================================================================================ */ +#define REG_CLKG0_OSC_KEY 0x4004C10C /* CLKG0_OSC Key Protection for OSCCTRL */ +#define REG_CLKG0_OSC_CTL 0x4004C110 /* CLKG0_OSC Oscillator Control */ + +/* ============================================================================================================================ + CLKG_OSC Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + CLKG_OSC_KEY Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CLKG_OSC_KEY_VALUE 0 /* Oscillator key */ +#define BITM_CLKG_OSC_KEY_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFUL, uint32_t )) /* Oscillator key */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CLKG_OSC_CTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CLKG_OSC_CTL_LFX_FAIL_STA 31 /* LF XTAL (crystal clock) Not Stable */ +#define BITP_CLKG_OSC_CTL_ROOT_FAIL_STA 30 /* Root clock (crystal clock) Not Stable */ +#define BITP_CLKG_OSC_CTL_ROOT_AUTSW_STA 22 /* Status of automatic switching of the Root clock to HFOSC upon detection of Root clock failure */ +#define BITP_CLKG_OSC_CTL_ROOT_AUTSW_EN 21 /* Enables automatic Switching of the Root clock to HFOSC on Root clock Failure */ +#define BITP_CLKG_OSC_CTL_ROOT_MON_EN 20 /* ROOT clock monitor and Clock FAIL interrupt enable */ +#define BITP_CLKG_OSC_CTL_LFX_ROBUST_LD 15 /* LFXTAL Robust Mode Load select */ +#define BITP_CLKG_OSC_CTL_LFX_ROBUST_EN 14 /* LFXTAL Mode select */ +#define BITP_CLKG_OSC_CTL_LFX_AUTSW_STA 13 /* Status of automatic switching of the LF Mux to LFOSC upon detection of LFXTAL failure */ +#define BITP_CLKG_OSC_CTL_LFX_AUTSW_EN 12 /* Enables automatic Switching of the LF Mux to LFOSC on LFXTAL Failure */ +#define BITP_CLKG_OSC_CTL_HFX_OK 11 /* Status of HFXTAL oscillator */ +#define BITP_CLKG_OSC_CTL_LFX_OK 10 /* Status of LFXTAL oscillator */ +#define BITP_CLKG_OSC_CTL_HFOSC_OK 9 /* Status of HFOSC oscillator */ +#define BITP_CLKG_OSC_CTL_LFOSC_OK 8 /* Status of LFOSC oscillator */ +#define BITP_CLKG_OSC_CTL_LFX_MON_EN 5 /* LFXTAL clock monitor and Clock FAIL interrupt enable */ +#define BITP_CLKG_OSC_CTL_LFX_BYP 4 /* Low frequency crystal oscillator Bypass */ +#define BITP_CLKG_OSC_CTL_HFX_EN 3 /* High frequency crystal oscillator enable */ +#define BITP_CLKG_OSC_CTL_LFX_EN 2 /* Low frequency crystal oscillator enable */ +#define BITP_CLKG_OSC_CTL_HFOSC_EN 1 /* High frequency internal oscillator enable */ +#define BITP_CLKG_OSC_CTL_LFCLK_MUX 0 /* 32 kHz clock select mux */ +#define BITM_CLKG_OSC_CTL_LFX_FAIL_STA (_ADI_MSK_3(0x80000000,0x80000000UL, uint32_t )) /* LF XTAL (crystal clock) Not Stable */ +#define BITM_CLKG_OSC_CTL_ROOT_FAIL_STA (_ADI_MSK_3(0x40000000,0x40000000UL, uint32_t )) /* Root clock (crystal clock) Not Stable */ +#define BITM_CLKG_OSC_CTL_ROOT_AUTSW_STA (_ADI_MSK_3(0x00400000,0x00400000UL, uint32_t )) /* Status of automatic switching of the Root clock to HFOSC upon detection of Root clock failure */ +#define BITM_CLKG_OSC_CTL_ROOT_AUTSW_EN (_ADI_MSK_3(0x00200000,0x00200000UL, uint32_t )) /* Enables automatic Switching of the Root clock to HFOSC on Root clock Failure */ +#define BITM_CLKG_OSC_CTL_ROOT_MON_EN (_ADI_MSK_3(0x00100000,0x00100000UL, uint32_t )) /* ROOT clock monitor and Clock FAIL interrupt enable */ +#define BITM_CLKG_OSC_CTL_LFX_ROBUST_LD (_ADI_MSK_3(0x00018000,0x00018000UL, uint32_t )) /* LFXTAL Robust Mode Load select */ +#define BITM_CLKG_OSC_CTL_LFX_ROBUST_EN (_ADI_MSK_3(0x00004000,0x00004000UL, uint32_t )) /* LFXTAL Mode select */ +#define BITM_CLKG_OSC_CTL_LFX_AUTSW_STA (_ADI_MSK_3(0x00002000,0x00002000UL, uint32_t )) /* Status of automatic switching of the LF Mux to LFOSC upon detection of LFXTAL failure */ +#define BITM_CLKG_OSC_CTL_LFX_AUTSW_EN (_ADI_MSK_3(0x00001000,0x00001000UL, uint32_t )) /* Enables automatic Switching of the LF Mux to LFOSC on LFXTAL Failure */ +#define BITM_CLKG_OSC_CTL_HFX_OK (_ADI_MSK_3(0x00000800,0x00000800UL, uint32_t )) /* Status of HFXTAL oscillator */ +#define BITM_CLKG_OSC_CTL_LFX_OK (_ADI_MSK_3(0x00000400,0x00000400UL, uint32_t )) /* Status of LFXTAL oscillator */ +#define BITM_CLKG_OSC_CTL_HFOSC_OK (_ADI_MSK_3(0x00000200,0x00000200UL, uint32_t )) /* Status of HFOSC oscillator */ +#define BITM_CLKG_OSC_CTL_LFOSC_OK (_ADI_MSK_3(0x00000100,0x00000100UL, uint32_t )) /* Status of LFOSC oscillator */ +#define BITM_CLKG_OSC_CTL_LFX_MON_EN (_ADI_MSK_3(0x00000020,0x00000020UL, uint32_t )) /* LFXTAL clock monitor and Clock FAIL interrupt enable */ +#define BITM_CLKG_OSC_CTL_LFX_BYP (_ADI_MSK_3(0x00000010,0x00000010UL, uint32_t )) /* Low frequency crystal oscillator Bypass */ +#define BITM_CLKG_OSC_CTL_HFX_EN (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* High frequency crystal oscillator enable */ +#define BITM_CLKG_OSC_CTL_LFX_EN (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Low frequency crystal oscillator enable */ +#define BITM_CLKG_OSC_CTL_HFOSC_EN (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* High frequency internal oscillator enable */ +#define BITM_CLKG_OSC_CTL_LFCLK_MUX (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* 32 kHz clock select mux */ + + +/* ============================================================================================================================ + Power Management Registers + ============================================================================================================================ */ + +/* ============================================================================================================================ + PMG0_TST + ============================================================================================================================ */ +#define REG_PMG0_TST_SRAM_CTL 0x4004C260 /* PMG0_TST Control for SRAM Parity and Instruction SRAM */ +#define REG_PMG0_TST_SRAM_INITSTAT 0x4004C264 /* PMG0_TST Initialization Status Register */ +#define REG_PMG0_TST_CLR_LATCH_GPIOS 0x4004C268 /* PMG0_TST Clear GPIO After Shutdown Mode */ +#define REG_PMG0_TST_SCRPAD_IMG 0x4004C26C /* PMG0_TST Scratch Pad Image */ +#define REG_PMG0_TST_SCRPAD_3V_RD 0x4004C270 /* PMG0_TST Scratch Pad Saved in Battery Domain */ +#define REG_PMG0_TST_FAST_SHT_WAKEUP 0x4004C274 /* PMG0_TST Fast Shutdown Wake-up Enable */ + +/* ============================================================================================================================ + PMG_TST Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + PMG_TST_SRAM_CTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PMG_TST_SRAM_CTL_INSTREN 31 /* Enables 32 KB instruction SRAM */ +#define BITP_PMG_TST_SRAM_CTL_PENBNK7 23 /* Enable parity check */ +#define BITP_PMG_TST_SRAM_CTL_PENBNK6 22 /* Enable parity check */ +#define BITP_PMG_TST_SRAM_CTL_PENBNK5 21 /* Enable parity check */ +#define BITP_PMG_TST_SRAM_CTL_PENBNK4 20 /* Enable parity check */ +#define BITP_PMG_TST_SRAM_CTL_PENBNK3 19 /* Enable parity check */ +#define BITP_PMG_TST_SRAM_CTL_PENBNK2 18 /* Enable parity check */ +#define BITP_PMG_TST_SRAM_CTL_PENBNK1 17 /* Enable parity check */ +#define BITP_PMG_TST_SRAM_CTL_PENBNK0 16 /* Enable parity check */ +#define BITP_PMG_TST_SRAM_CTL_ABTINIT 15 /* Abort current initialization. Self-cleared */ +#define BITP_PMG_TST_SRAM_CTL_AUTOINIT 14 /* Automatic initialization on wake up from hibernate mode */ +#define BITP_PMG_TST_SRAM_CTL_STARTINIT 13 /* Write one to trigger initialization. Self-cleared */ +#define BITP_PMG_TST_SRAM_CTL_BNK7EN 7 /* Enable initialization */ +#define BITP_PMG_TST_SRAM_CTL_BNK2EN 2 /* Enable initialization */ +#define BITP_PMG_TST_SRAM_CTL_BNK1EN 1 /* Enable initialization */ +#define BITM_PMG_TST_SRAM_CTL_INSTREN (_ADI_MSK_3(0x80000000,0x80000000UL, uint32_t )) /* Enables 32 KB instruction SRAM */ +#define BITM_PMG_TST_SRAM_CTL_PENBNK7 (_ADI_MSK_3(0x00800000,0x00800000UL, uint32_t )) /* Enable parity check */ +#define BITM_PMG_TST_SRAM_CTL_PENBNK6 (_ADI_MSK_3(0x00400000,0x00400000UL, uint32_t )) /* Enable parity check */ +#define BITM_PMG_TST_SRAM_CTL_PENBNK5 (_ADI_MSK_3(0x00200000,0x00200000UL, uint32_t )) /* Enable parity check */ +#define BITM_PMG_TST_SRAM_CTL_PENBNK4 (_ADI_MSK_3(0x00100000,0x00100000UL, uint32_t )) /* Enable parity check */ +#define BITM_PMG_TST_SRAM_CTL_PENBNK3 (_ADI_MSK_3(0x00080000,0x00080000UL, uint32_t )) /* Enable parity check */ +#define BITM_PMG_TST_SRAM_CTL_PENBNK2 (_ADI_MSK_3(0x00040000,0x00040000UL, uint32_t )) /* Enable parity check */ +#define BITM_PMG_TST_SRAM_CTL_PENBNK1 (_ADI_MSK_3(0x00020000,0x00020000UL, uint32_t )) /* Enable parity check */ +#define BITM_PMG_TST_SRAM_CTL_PENBNK0 (_ADI_MSK_3(0x00010000,0x00010000UL, uint32_t )) /* Enable parity check */ +#define BITM_PMG_TST_SRAM_CTL_ABTINIT (_ADI_MSK_3(0x00008000,0x00008000UL, uint32_t )) /* Abort current initialization. Self-cleared */ +#define BITM_PMG_TST_SRAM_CTL_AUTOINIT (_ADI_MSK_3(0x00004000,0x00004000UL, uint32_t )) /* Automatic initialization on wake up from hibernate mode */ +#define BITM_PMG_TST_SRAM_CTL_STARTINIT (_ADI_MSK_3(0x00002000,0x00002000UL, uint32_t )) /* Write one to trigger initialization. Self-cleared */ +#define BITM_PMG_TST_SRAM_CTL_BNK7EN (_ADI_MSK_3(0x00000080,0x00000080UL, uint32_t )) /* Enable initialization */ +#define BITM_PMG_TST_SRAM_CTL_BNK2EN (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Enable initialization */ +#define BITM_PMG_TST_SRAM_CTL_BNK1EN (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Enable initialization */ + +/* ------------------------------------------------------------------------------------------------------------------------- + PMG_TST_SRAM_INITSTAT Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PMG_TST_SRAM_INITSTAT_BNK7DONE 7 /* Bank 7 initialization status */ +#define BITP_PMG_TST_SRAM_INITSTAT_BNK6DONE 6 /* Bank 6 initialization status */ +#define BITP_PMG_TST_SRAM_INITSTAT_BNK5DONE 5 /* Bank 5 initialization status */ +#define BITP_PMG_TST_SRAM_INITSTAT_BNK4DONE 4 /* Bank 4 initialization status */ +#define BITP_PMG_TST_SRAM_INITSTAT_BNK3DONE 3 /* Bank 3 initialization status */ +#define BITP_PMG_TST_SRAM_INITSTAT_BNK2DONE 2 /* Bank 2 initialization status */ +#define BITP_PMG_TST_SRAM_INITSTAT_BNK1DONE 1 /* Bank 1 initialization status */ +#define BITP_PMG_TST_SRAM_INITSTAT_BNK0DONE 0 /* Bank 0 initialization status */ +#define BITM_PMG_TST_SRAM_INITSTAT_BNK7DONE (_ADI_MSK_3(0x00000080,0x00000080UL, uint32_t )) /* Bank 7 initialization status */ +#define BITM_PMG_TST_SRAM_INITSTAT_BNK6DONE (_ADI_MSK_3(0x00000040,0x00000040UL, uint32_t )) /* Bank 6 initialization status */ +#define BITM_PMG_TST_SRAM_INITSTAT_BNK5DONE (_ADI_MSK_3(0x00000020,0x00000020UL, uint32_t )) /* Bank 5 initialization status */ +#define BITM_PMG_TST_SRAM_INITSTAT_BNK4DONE (_ADI_MSK_3(0x00000010,0x00000010UL, uint32_t )) /* Bank 4 initialization status */ +#define BITM_PMG_TST_SRAM_INITSTAT_BNK3DONE (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* Bank 3 initialization status */ +#define BITM_PMG_TST_SRAM_INITSTAT_BNK2DONE (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* Bank 2 initialization status */ +#define BITM_PMG_TST_SRAM_INITSTAT_BNK1DONE (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* Bank 1 initialization status */ +#define BITM_PMG_TST_SRAM_INITSTAT_BNK0DONE (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Bank 0 initialization status */ +#define ENUM_PMG_TST_SRAM_INITSTAT_NO_BANK7_INIT (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* BNK7DONE: Bank 7 not initialized */ +#define ENUM_PMG_TST_SRAM_INITSTAT_BANK7_INIT (_ADI_MSK_3(0x00000080,0x00000080UL, uint32_t )) /* BNK7DONE: Bank 7 initialized */ +#define ENUM_PMG_TST_SRAM_INITSTAT_NO_BANK6_INIT (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* BNK6DONE: Bank 6 not initialized */ +#define ENUM_PMG_TST_SRAM_INITSTAT_BANK6_INIT (_ADI_MSK_3(0x00000040,0x00000040UL, uint32_t )) /* BNK6DONE: Bank 6 initialized */ +#define ENUM_PMG_TST_SRAM_INITSTAT_NO_BANK5_INIT (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* BNK5DONE: Bank 5 not initialized */ +#define ENUM_PMG_TST_SRAM_INITSTAT_BANK5_INIT (_ADI_MSK_3(0x00000020,0x00000020UL, uint32_t )) /* BNK5DONE: Bank 5 initialized */ +#define ENUM_PMG_TST_SRAM_INITSTAT_NO_BANK4_INIT (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* BNK4DONE: Bank 4 not initialized */ +#define ENUM_PMG_TST_SRAM_INITSTAT_BANK4_INIT (_ADI_MSK_3(0x00000010,0x00000010UL, uint32_t )) /* BNK4DONE: Bank 4 initialized */ +#define ENUM_PMG_TST_SRAM_INITSTAT_NO_BANK3_INIT (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* BNK3DONE: Bank 3 not initialized */ +#define ENUM_PMG_TST_SRAM_INITSTAT_BANK3_INIT (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* BNK3DONE: Bank 3 initialized */ +#define ENUM_PMG_TST_SRAM_INITSTAT_NO_BANK2_INIT (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* BNK2DONE: Bank 2 not initialized */ +#define ENUM_PMG_TST_SRAM_INITSTAT_BANK2_INIT (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* BNK2DONE: Bank 2 initialized */ +#define ENUM_PMG_TST_SRAM_INITSTAT_NO_BANK1_INIT (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* BNK1DONE: Bank 1 not initialized */ +#define ENUM_PMG_TST_SRAM_INITSTAT_BANK1_INIT (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* BNK1DONE: Bank 1 initialized */ +#define ENUM_PMG_TST_SRAM_INITSTAT_NO_BANK0_INIT (_ADI_MSK_3(0x00000000,0x00000000UL, uint32_t )) /* BNK0DONE: Bank 0 not initialized */ +#define ENUM_PMG_TST_SRAM_INITSTAT_BANK0_INIT (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* BNK0DONE: Bank 0 initialized */ + +/* ------------------------------------------------------------------------------------------------------------------------- + PMG_TST_CLR_LATCH_GPIOS Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PMG_TST_CLR_LATCH_GPIOS_VALUE 0 /* Writing 0x58FA creates a pulse to clear the latches for the GPIOs */ +#define BITM_PMG_TST_CLR_LATCH_GPIOS_VALUE (_ADI_MSK_3(0x0000FFFF,0x0000FFFFU, uint16_t )) /* Writing 0x58FA creates a pulse to clear the latches for the GPIOs */ + +/* ------------------------------------------------------------------------------------------------------------------------- + PMG_TST_SCRPAD_IMG Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PMG_TST_SCRPAD_IMG_DATA 0 /* Value written to this register is saved in 3 V when going to shutdown */ +#define BITM_PMG_TST_SCRPAD_IMG_DATA (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Value written to this register is saved in 3 V when going to shutdown */ + +/* ------------------------------------------------------------------------------------------------------------------------- + PMG_TST_SCRPAD_3V_RD Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PMG_TST_SCRPAD_3V_RD_DATA 0 /* Reading the scratch pad stored in shutdown mode */ +#define BITM_PMG_TST_SCRPAD_3V_RD_DATA (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Reading the scratch pad stored in shutdown mode */ + +/* ------------------------------------------------------------------------------------------------------------------------- + PMG_TST_FAST_SHT_WAKEUP Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PMG_TST_FAST_SHT_WAKEUP_FAST_SHT_WAKEUP 0 /* Enables fast shutdown wake-up */ +#define BITM_PMG_TST_FAST_SHT_WAKEUP_FAST_SHT_WAKEUP (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* Enables fast shutdown wake-up */ + + +/* ============================================================================================================================ + Clocking registers + ============================================================================================================================ */ + +/* ============================================================================================================================ + CLKG0_CLK + ============================================================================================================================ */ +#define REG_CLKG0_CLK_CTL0 0x4004C300 /* CLKG0_CLK Misc Clock Settings */ +#define REG_CLKG0_CLK_CTL1 0x4004C304 /* CLKG0_CLK Clock Dividers */ +#define REG_CLKG0_CLK_CTL2 0x4004C308 /* CLKG0_CLK HF Oscillator Divided Clock Select */ +#define REG_CLKG0_CLK_CTL3 0x4004C30C /* CLKG0_CLK System PLL */ +#define REG_CLKG0_CLK_CTL5 0x4004C314 /* CLKG0_CLK User Clock Gating Control */ +#define REG_CLKG0_CLK_STAT0 0x4004C318 /* CLKG0_CLK Clocking Status */ + +/* ============================================================================================================================ + CLKG_CLK Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + CLKG_CLK_CTL0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CLKG_CLK_CTL0_HFXTALIE 15 /* High frequency crystal interrupt enable */ +#define BITP_CLKG_CLK_CTL0_LFXTALIE 14 /* Low frequency crystal interrupt enable */ +#define BITP_CLKG_CLK_CTL0_PLL_IPSEL 11 /* SPLL source select mux */ +#define BITP_CLKG_CLK_CTL0_RCLKMUX 8 /* Flash reference clock and HPBUCK clock source mux */ +#define BITP_CLKG_CLK_CTL0_CLKOUT 3 /* GPIO clock out select */ +#define BITP_CLKG_CLK_CTL0_CLKMUX 0 /* Clock mux select */ +#define BITM_CLKG_CLK_CTL0_HFXTALIE (_ADI_MSK_3(0x00008000,0x00008000UL, uint32_t )) /* High frequency crystal interrupt enable */ +#define BITM_CLKG_CLK_CTL0_LFXTALIE (_ADI_MSK_3(0x00004000,0x00004000UL, uint32_t )) /* Low frequency crystal interrupt enable */ +#define BITM_CLKG_CLK_CTL0_PLL_IPSEL (_ADI_MSK_3(0x00001800,0x00001800UL, uint32_t )) /* SPLL source select mux */ +#define BITM_CLKG_CLK_CTL0_RCLKMUX (_ADI_MSK_3(0x00000300,0x00000300UL, uint32_t )) /* Flash reference clock and HPBUCK clock source mux */ +#define BITM_CLKG_CLK_CTL0_CLKOUT (_ADI_MSK_3(0x00000078,0x00000078UL, uint32_t )) /* GPIO clock out select */ +#define BITM_CLKG_CLK_CTL0_CLKMUX (_ADI_MSK_3(0x00000003,0x00000003UL, uint32_t )) /* Clock mux select */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CLKG_CLK_CTL1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CLKG_CLK_CTL1_ACLKDIVCNT 16 /* ACLK Divide Count */ +#define BITP_CLKG_CLK_CTL1_PCLKDIVCNT 8 /* PCLK divide count */ +#define BITP_CLKG_CLK_CTL1_HCLKDIVCNT 0 /* HCLK divide count */ +#define BITM_CLKG_CLK_CTL1_ACLKDIVCNT (_ADI_MSK_3(0x01FF0000,0x01FF0000UL, uint32_t )) /* ACLK Divide Count */ +#define BITM_CLKG_CLK_CTL1_PCLKDIVCNT (_ADI_MSK_3(0x00003F00,0x00003F00UL, uint32_t )) /* PCLK divide count */ +#define BITM_CLKG_CLK_CTL1_HCLKDIVCNT (_ADI_MSK_3(0x0000003F,0x0000003FUL, uint32_t )) /* HCLK divide count */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CLKG_CLK_CTL2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CLKG_CLK_CTL2_HFOSCDIVCLKSEL 1 /* HF Oscillator divided clock select */ +#define BITP_CLKG_CLK_CTL2_HFOSCAUTODIV_EN 0 /* HF Oscillator auto divide by one clock selection during wakeup from Flexi power mode */ +#define BITM_CLKG_CLK_CTL2_HFOSCDIVCLKSEL (_ADI_MSK_3(0x0000000E,0x0000000EUL, uint32_t )) /* HF Oscillator divided clock select */ +#define BITM_CLKG_CLK_CTL2_HFOSCAUTODIV_EN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* HF Oscillator auto divide by one clock selection during wakeup from Flexi power mode */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CLKG_CLK_CTL3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CLKG_CLK_CTL3_SPLLMUL2 16 /* System PLL multiply by 2 */ +#define BITP_CLKG_CLK_CTL3_SPLLMSEL 11 /* System PLL M Divider */ +#define BITP_CLKG_CLK_CTL3_SPLLIE 10 /* System PLL interrupt enable */ +#define BITP_CLKG_CLK_CTL3_SPLLEN 9 /* System PLL enable */ +#define BITP_CLKG_CLK_CTL3_SPLLDIV2 8 /* System PLL division by 2 */ +#define BITP_CLKG_CLK_CTL3_SPLLNSEL 0 /* System PLL N multiplier */ +#define BITM_CLKG_CLK_CTL3_SPLLMUL2 (_ADI_MSK_3(0x00010000,0x00010000UL, uint32_t )) /* System PLL multiply by 2 */ +#define BITM_CLKG_CLK_CTL3_SPLLMSEL (_ADI_MSK_3(0x00007800,0x00007800UL, uint32_t )) /* System PLL M Divider */ +#define BITM_CLKG_CLK_CTL3_SPLLIE (_ADI_MSK_3(0x00000400,0x00000400UL, uint32_t )) /* System PLL interrupt enable */ +#define BITM_CLKG_CLK_CTL3_SPLLEN (_ADI_MSK_3(0x00000200,0x00000200UL, uint32_t )) /* System PLL enable */ +#define BITM_CLKG_CLK_CTL3_SPLLDIV2 (_ADI_MSK_3(0x00000100,0x00000100UL, uint32_t )) /* System PLL division by 2 */ +#define BITM_CLKG_CLK_CTL3_SPLLNSEL (_ADI_MSK_3(0x0000001F,0x0000001FUL, uint32_t )) /* System PLL N multiplier */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CLKG_CLK_CTL5 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CLKG_CLK_CTL5_TMRRGBCLKOFF 6 /* Timer RGB user control */ +#define BITP_CLKG_CLK_CTL5_PERCLKOFF 5 /* This bit is used to disable all clocks connected to all peripherals */ +#define BITP_CLKG_CLK_CTL5_GPIOCLKOFF 4 /* GPIO clock control */ +#define BITP_CLKG_CLK_CTL5_UCLKI2COFF 3 /* I2C clock user control */ +#define BITP_CLKG_CLK_CTL5_GPTCLK2OFF 2 /* GP Timer 2 user control */ +#define BITP_CLKG_CLK_CTL5_GPTCLK1OFF 1 /* GP Timer 1 user control */ +#define BITP_CLKG_CLK_CTL5_GPTCLK0OFF 0 /* GP Timer 0 user control */ +#define BITM_CLKG_CLK_CTL5_TMRRGBCLKOFF (_ADI_MSK_3(0x00000040,0x00000040UL, uint32_t )) /* Timer RGB user control */ +#define BITM_CLKG_CLK_CTL5_PERCLKOFF (_ADI_MSK_3(0x00000020,0x00000020UL, uint32_t )) /* This bit is used to disable all clocks connected to all peripherals */ +#define BITM_CLKG_CLK_CTL5_GPIOCLKOFF (_ADI_MSK_3(0x00000010,0x00000010UL, uint32_t )) /* GPIO clock control */ +#define BITM_CLKG_CLK_CTL5_UCLKI2COFF (_ADI_MSK_3(0x00000008,0x00000008UL, uint32_t )) /* I2C clock user control */ +#define BITM_CLKG_CLK_CTL5_GPTCLK2OFF (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* GP Timer 2 user control */ +#define BITM_CLKG_CLK_CTL5_GPTCLK1OFF (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* GP Timer 1 user control */ +#define BITM_CLKG_CLK_CTL5_GPTCLK0OFF (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* GP Timer 0 user control */ + +/* ------------------------------------------------------------------------------------------------------------------------- + CLKG_CLK_STAT0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_CLKG_CLK_STAT0_HFXTALNOK 14 /* HF crystal not stable */ +#define BITP_CLKG_CLK_STAT0_HFXTALOK 13 /* HF crystal stable */ +#define BITP_CLKG_CLK_STAT0_HFXTAL 12 /* HF crystal status */ +#define BITP_CLKG_CLK_STAT0_LFXTALNOK 10 /* LF crystal not stable */ +#define BITP_CLKG_CLK_STAT0_LFXTALOK 9 /* LF crystal stable */ +#define BITP_CLKG_CLK_STAT0_LFXTAL 8 /* LF crystal status */ +#define BITP_CLKG_CLK_STAT0_SPLLUNLK 2 /* System PLL unlock */ +#define BITP_CLKG_CLK_STAT0_SPLLLK 1 /* System PLL lock */ +#define BITP_CLKG_CLK_STAT0_SPLL 0 /* System PLL status */ +#define BITM_CLKG_CLK_STAT0_HFXTALNOK (_ADI_MSK_3(0x00004000,0x00004000UL, uint32_t )) /* HF crystal not stable */ +#define BITM_CLKG_CLK_STAT0_HFXTALOK (_ADI_MSK_3(0x00002000,0x00002000UL, uint32_t )) /* HF crystal stable */ +#define BITM_CLKG_CLK_STAT0_HFXTAL (_ADI_MSK_3(0x00001000,0x00001000UL, uint32_t )) /* HF crystal status */ +#define BITM_CLKG_CLK_STAT0_LFXTALNOK (_ADI_MSK_3(0x00000400,0x00000400UL, uint32_t )) /* LF crystal not stable */ +#define BITM_CLKG_CLK_STAT0_LFXTALOK (_ADI_MSK_3(0x00000200,0x00000200UL, uint32_t )) /* LF crystal stable */ +#define BITM_CLKG_CLK_STAT0_LFXTAL (_ADI_MSK_3(0x00000100,0x00000100UL, uint32_t )) /* LF crystal status */ +#define BITM_CLKG_CLK_STAT0_SPLLUNLK (_ADI_MSK_3(0x00000004,0x00000004UL, uint32_t )) /* System PLL unlock */ +#define BITM_CLKG_CLK_STAT0_SPLLLK (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* System PLL lock */ +#define BITM_CLKG_CLK_STAT0_SPLL (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* System PLL status */ + + +/* ============================================================================================================================ + Bus matrix + ============================================================================================================================ */ + +/* ============================================================================================================================ + BUSM0 + ============================================================================================================================ */ +#define REG_BUSM0_ARBIT0 0x4004C800 /* BUSM0 Arbitration Priority Configuration for FLASH and SRAM0 */ +#define REG_BUSM0_ARBIT1 0x4004C804 /* BUSM0 Arbitration Priority Configuration for SRAM1 and SIP */ +#define REG_BUSM0_ARBIT2 0x4004C808 /* BUSM0 Arbitration Priority Configuration for APB32 and APB16 */ +#define REG_BUSM0_ARBIT3 0x4004C80C /* BUSM0 Arbitration Priority Configuration for APB16 priority for core and for DMA1 */ +#define REG_BUSM0_ARBIT4 0x4004C814 /* BUSM0 Arbitration Priority Configuration for SRAM1 and SIP */ + +/* ============================================================================================================================ + BUSM Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + BUSM_ARBIT0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_BUSM_ARBIT0_SRAM0_DMA0 20 /* SRAM0 priority for DMA0 */ +#define BITP_BUSM_ARBIT0_SRAM0_SBUS 18 /* SRAM0 priority for SBUS */ +#define BITP_BUSM_ARBIT0_SRAM0_DCODE 16 /* SRAM0 priority for Dcode */ +#define BITP_BUSM_ARBIT0_FLSH_DMA0 4 /* Flash priority for DMA0 */ +#define BITP_BUSM_ARBIT0_FLSH_SBUS 2 /* Flash priority for SBUS */ +#define BITP_BUSM_ARBIT0_FLSH_DCODE 0 /* Flash priority for DCODE */ +#define BITM_BUSM_ARBIT0_SRAM0_DMA0 (_ADI_MSK_3(0x00300000,0x00300000UL, uint32_t )) /* SRAM0 priority for DMA0 */ +#define BITM_BUSM_ARBIT0_SRAM0_SBUS (_ADI_MSK_3(0x000C0000,0x000C0000UL, uint32_t )) /* SRAM0 priority for SBUS */ +#define BITM_BUSM_ARBIT0_SRAM0_DCODE (_ADI_MSK_3(0x00030000,0x00030000UL, uint32_t )) /* SRAM0 priority for Dcode */ +#define BITM_BUSM_ARBIT0_FLSH_DMA0 (_ADI_MSK_3(0x00000030,0x00000030UL, uint32_t )) /* Flash priority for DMA0 */ +#define BITM_BUSM_ARBIT0_FLSH_SBUS (_ADI_MSK_3(0x0000000C,0x0000000CUL, uint32_t )) /* Flash priority for SBUS */ +#define BITM_BUSM_ARBIT0_FLSH_DCODE (_ADI_MSK_3(0x00000003,0x00000003UL, uint32_t )) /* Flash priority for DCODE */ + +/* ------------------------------------------------------------------------------------------------------------------------- + BUSM_ARBIT1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_BUSM_ARBIT1_SIP_DMA0 20 /* SIP priority for DMA0 */ +#define BITP_BUSM_ARBIT1_SIP_SBUS 18 /* SIP priority for SBUS */ +#define BITP_BUSM_ARBIT1_SIP_DCODE 16 /* SIP priority for DCODE */ +#define BITP_BUSM_ARBIT1_SRAM1_DMA0 4 /* SRAM1 priority for DMA0 */ +#define BITP_BUSM_ARBIT1_SRAM1_SBUS 2 /* SRAM1 priority for SBUS */ +#define BITP_BUSM_ARBIT1_SRAM1_DCODE 0 /* SRAM1 priority for Dcode */ +#define BITM_BUSM_ARBIT1_SIP_DMA0 (_ADI_MSK_3(0x00300000,0x00300000UL, uint32_t )) /* SIP priority for DMA0 */ +#define BITM_BUSM_ARBIT1_SIP_SBUS (_ADI_MSK_3(0x000C0000,0x000C0000UL, uint32_t )) /* SIP priority for SBUS */ +#define BITM_BUSM_ARBIT1_SIP_DCODE (_ADI_MSK_3(0x00030000,0x00030000UL, uint32_t )) /* SIP priority for DCODE */ +#define BITM_BUSM_ARBIT1_SRAM1_DMA0 (_ADI_MSK_3(0x00000030,0x00000030UL, uint32_t )) /* SRAM1 priority for DMA0 */ +#define BITM_BUSM_ARBIT1_SRAM1_SBUS (_ADI_MSK_3(0x0000000C,0x0000000CUL, uint32_t )) /* SRAM1 priority for SBUS */ +#define BITM_BUSM_ARBIT1_SRAM1_DCODE (_ADI_MSK_3(0x00000003,0x00000003UL, uint32_t )) /* SRAM1 priority for Dcode */ + +/* ------------------------------------------------------------------------------------------------------------------------- + BUSM_ARBIT2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_BUSM_ARBIT2_APB16_DMA0 20 /* APB16 priority for DMA0 */ +#define BITP_BUSM_ARBIT2_APB16_SBUS 18 /* APB16 priority for SBUS */ +#define BITP_BUSM_ARBIT2_APB16_DCODE 16 /* APB16 priority for DCODE */ +#define BITP_BUSM_ARBIT2_APB32_DMA0 4 /* APB32 priority for DMA0 */ +#define BITP_BUSM_ARBIT2_APB32_SBUS 2 /* APB32 priority for SBUS */ +#define BITP_BUSM_ARBIT2_APB32_DCODE 0 /* APB32 priority for DCODE */ +#define BITM_BUSM_ARBIT2_APB16_DMA0 (_ADI_MSK_3(0x00300000,0x00300000UL, uint32_t )) /* APB16 priority for DMA0 */ +#define BITM_BUSM_ARBIT2_APB16_SBUS (_ADI_MSK_3(0x000C0000,0x000C0000UL, uint32_t )) /* APB16 priority for SBUS */ +#define BITM_BUSM_ARBIT2_APB16_DCODE (_ADI_MSK_3(0x00030000,0x00030000UL, uint32_t )) /* APB16 priority for DCODE */ +#define BITM_BUSM_ARBIT2_APB32_DMA0 (_ADI_MSK_3(0x00000030,0x00000030UL, uint32_t )) /* APB32 priority for DMA0 */ +#define BITM_BUSM_ARBIT2_APB32_SBUS (_ADI_MSK_3(0x0000000C,0x0000000CUL, uint32_t )) /* APB32 priority for SBUS */ +#define BITM_BUSM_ARBIT2_APB32_DCODE (_ADI_MSK_3(0x00000003,0x00000003UL, uint32_t )) /* APB32 priority for DCODE */ + +/* ------------------------------------------------------------------------------------------------------------------------- + BUSM_ARBIT3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_BUSM_ARBIT3_APB16_4DMA_DMA1 17 /* APB16 for dma priority for DMA1 */ +#define BITP_BUSM_ARBIT3_APB16_4DMA_CORE 16 /* APB16 for dma priority for CORE */ +#define BITP_BUSM_ARBIT3_APB16_DMA1 1 /* APB16 priority for DMA1 */ +#define BITP_BUSM_ARBIT3_APB16_CORE 0 /* APB16 priority for CORE */ +#define BITM_BUSM_ARBIT3_APB16_4DMA_DMA1 (_ADI_MSK_3(0x00020000,0x00020000UL, uint32_t )) /* APB16 for dma priority for DMA1 */ +#define BITM_BUSM_ARBIT3_APB16_4DMA_CORE (_ADI_MSK_3(0x00010000,0x00010000UL, uint32_t )) /* APB16 for dma priority for CORE */ +#define BITM_BUSM_ARBIT3_APB16_DMA1 (_ADI_MSK_3(0x00000002,0x00000002UL, uint32_t )) /* APB16 priority for DMA1 */ +#define BITM_BUSM_ARBIT3_APB16_CORE (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) /* APB16 priority for CORE */ + +/* ------------------------------------------------------------------------------------------------------------------------- + BUSM_ARBIT4 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_BUSM_ARBIT4_SRAM2_DMA0 4 /* SRAM2 priority for DMA0 */ +#define BITP_BUSM_ARBIT4_SRAM2_SBUS 2 /* SRAM2 priority for SBUS */ +#define BITP_BUSM_ARBIT4_SRAM2_DCODE 0 /* SRAM2 priority for Dcode */ +#define BITM_BUSM_ARBIT4_SRAM2_DMA0 (_ADI_MSK_3(0x00000030,0x00000030UL, uint32_t )) /* SRAM2 priority for DMA0 */ +#define BITM_BUSM_ARBIT4_SRAM2_SBUS (_ADI_MSK_3(0x0000000C,0x0000000CUL, uint32_t )) /* SRAM2 priority for SBUS */ +#define BITM_BUSM_ARBIT4_SRAM2_DCODE (_ADI_MSK_3(0x00000003,0x00000003UL, uint32_t )) /* SRAM2 priority for Dcode */ + + +/* ============================================================================================================================ + Parallel Test Interface + ============================================================================================================================ */ + +/* ============================================================================================================================ + PTI0 + ============================================================================================================================ */ +#define REG_PTI0_RST_ISR_STARTADDR 0x4004CD00 /* PTI0 Reset ISR Start Address */ +#define REG_PTI0_RST_STACK_PTR 0x4004CD04 /* PTI0 Reset Stack Pointer */ +#define REG_PTI0_CTL 0x4004CD08 /* PTI0 Parallel Test Interface Control Register */ + +/* ============================================================================================================================ + PTI Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + PTI_RST_ISR_STARTADDR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PTI_RST_ISR_STARTADDR_VALUE 0 +#define BITM_PTI_RST_ISR_STARTADDR_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) + +/* ------------------------------------------------------------------------------------------------------------------------- + PTI_RST_STACK_PTR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PTI_RST_STACK_PTR_VALUE 0 +#define BITM_PTI_RST_STACK_PTR_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) + +/* ------------------------------------------------------------------------------------------------------------------------- + PTI_CTL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_PTI_CTL_EN 0 +#define BITM_PTI_CTL_EN (_ADI_MSK_3(0x00000001,0x00000001UL, uint32_t )) + + +/* ============================================================================================================================ + Cortex-M3 Interrupt Controller + ============================================================================================================================ */ + +/* ============================================================================================================================ + NVIC0 + ============================================================================================================================ */ +#define REG_NVIC0_INTNUM 0xE000E004 /* NVIC0 Interrupt Control Type */ +#define REG_NVIC0_STKSTA 0xE000E010 /* NVIC0 Systick Control and Status */ +#define REG_NVIC0_STKLD 0xE000E014 /* NVIC0 Systick Reload Value */ +#define REG_NVIC0_STKVAL 0xE000E018 /* NVIC0 Systick Current Value */ +#define REG_NVIC0_STKCAL 0xE000E01C /* NVIC0 Systick Calibration Value */ +#define REG_NVIC0_INTSETE0 0xE000E100 /* NVIC0 IRQ0..31 Set_Enable */ +#define REG_NVIC0_INTSETE1 0xE000E104 /* NVIC0 IRQ32..63 Set_Enable */ +#define REG_NVIC0_INTCLRE0 0xE000E180 /* NVIC0 IRQ0..31 Clear_Enable */ +#define REG_NVIC0_INTCLRE1 0xE000E184 /* NVIC0 IRQ32..63 Clear_Enable */ +#define REG_NVIC0_INTSETP0 0xE000E200 /* NVIC0 IRQ0..31 Set_Pending */ +#define REG_NVIC0_INTSETP1 0xE000E204 /* NVIC0 IRQ32..63 Set_Pending */ +#define REG_NVIC0_INTCLRP0 0xE000E280 /* NVIC0 IRQ0..31 Clear_Pending */ +#define REG_NVIC0_INTCLRP1 0xE000E284 /* NVIC0 IRQ32..63 Clear_Pending */ +#define REG_NVIC0_INTACT0 0xE000E300 /* NVIC0 IRQ0..31 Active Bit */ +#define REG_NVIC0_INTACT1 0xE000E304 /* NVIC0 IRQ32..63 Active Bit */ +#define REG_NVIC0_INTPRI0 0xE000E400 /* NVIC0 IRQ0..3 Priority */ +#define REG_NVIC0_INTPRI1 0xE000E404 /* NVIC0 IRQ4..7 Priority */ +#define REG_NVIC0_INTPRI2 0xE000E408 /* NVIC0 IRQ8..11 Priority */ +#define REG_NVIC0_INTPRI3 0xE000E40C /* NVIC0 IRQ12..15 Priority */ +#define REG_NVIC0_INTPRI4 0xE000E410 /* NVIC0 IRQ16..19 Priority */ +#define REG_NVIC0_INTPRI5 0xE000E414 /* NVIC0 IRQ20..23 Priority */ +#define REG_NVIC0_INTPRI6 0xE000E418 /* NVIC0 IRQ24..27 Priority */ +#define REG_NVIC0_INTPRI7 0xE000E41C /* NVIC0 IRQ28..31 Priority */ +#define REG_NVIC0_INTPRI8 0xE000E420 /* NVIC0 IRQ32..35 Priority */ +#define REG_NVIC0_INTPRI9 0xE000E424 /* NVIC0 IRQ36..39 Priority */ +#define REG_NVIC0_INTPRI10 0xE000E428 /* NVIC0 IRQ40..43 Priority */ +#define REG_NVIC0_INTCPID 0xE000ED00 /* NVIC0 CPUID Base */ +#define REG_NVIC0_INTSTA 0xE000ED04 /* NVIC0 Interrupt Control State */ +#define REG_NVIC0_INTVEC 0xE000ED08 /* NVIC0 Vector Table Offset */ +#define REG_NVIC0_INTAIRC 0xE000ED0C /* NVIC0 Application Interrupt/Reset Control */ +#define REG_NVIC0_INTCON0 0xE000ED10 /* NVIC0 System Control */ +#define REG_NVIC0_INTCON1 0xE000ED14 /* NVIC0 Configuration Control */ +#define REG_NVIC0_INTSHPRIO0 0xE000ED18 /* NVIC0 System Handlers 4-7 Priority */ +#define REG_NVIC0_INTSHPRIO1 0xE000ED1C /* NVIC0 System Handlers 8-11 Priority */ +#define REG_NVIC0_INTSHPRIO3 0xE000ED20 /* NVIC0 System Handlers 12-15 Priority */ +#define REG_NVIC0_INTSHCSR 0xE000ED24 /* NVIC0 System Handler Control and State */ +#define REG_NVIC0_INTCFSR 0xE000ED28 /* NVIC0 Configurable Fault Status */ +#define REG_NVIC0_INTHFSR 0xE000ED2C /* NVIC0 Hard Fault Status */ +#define REG_NVIC0_INTDFSR 0xE000ED30 /* NVIC0 Debug Fault Status */ +#define REG_NVIC0_INTMMAR 0xE000ED34 /* NVIC0 Mem Manage Address */ +#define REG_NVIC0_INTBFAR 0xE000ED38 /* NVIC0 Bus Fault Address */ +#define REG_NVIC0_INTAFSR 0xE000ED3C /* NVIC0 Auxiliary Fault Status */ +#define REG_NVIC0_INTPFR0 0xE000ED40 /* NVIC0 Processor Feature Register 0 */ +#define REG_NVIC0_INTPFR1 0xE000ED44 /* NVIC0 Processor Feature Register 1 */ +#define REG_NVIC0_INTDFR0 0xE000ED48 /* NVIC0 Debug Feature Register 0 */ +#define REG_NVIC0_INTAFR0 0xE000ED4C /* NVIC0 Auxiliary Feature Register 0 */ +#define REG_NVIC0_INTMMFR0 0xE000ED50 /* NVIC0 Memory Model Feature Register 0 */ +#define REG_NVIC0_INTMMFR1 0xE000ED54 /* NVIC0 Memory Model Feature Register 1 */ +#define REG_NVIC0_INTMMFR2 0xE000ED58 /* NVIC0 Memory Model Feature Register 2 */ +#define REG_NVIC0_INTMMFR3 0xE000ED5C /* NVIC0 Memory Model Feature Register 3 */ +#define REG_NVIC0_INTISAR0 0xE000ED60 /* NVIC0 ISA Feature Register 0 */ +#define REG_NVIC0_INTISAR1 0xE000ED64 /* NVIC0 ISA Feature Register 1 */ +#define REG_NVIC0_INTISAR2 0xE000ED68 /* NVIC0 ISA Feature Register 2 */ +#define REG_NVIC0_INTISAR3 0xE000ED6C /* NVIC0 ISA Feature Register 3 */ +#define REG_NVIC0_INTISAR4 0xE000ED70 /* NVIC0 ISA Feature Register 4 */ +#define REG_NVIC0_INTTRGI 0xE000EF00 /* NVIC0 Software Trigger Interrupt Register */ +#define REG_NVIC0_INTPID4 0xE000EFD0 /* NVIC0 Peripheral Identification Register 4 */ +#define REG_NVIC0_INTPID5 0xE000EFD4 /* NVIC0 Peripheral Identification Register 5 */ +#define REG_NVIC0_INTPID6 0xE000EFD8 /* NVIC0 Peripheral Identification Register 6 */ +#define REG_NVIC0_INTPID7 0xE000EFDC /* NVIC0 Peripheral Identification Register 7 */ +#define REG_NVIC0_INTPID0 0xE000EFE0 /* NVIC0 Peripheral Identification Bits7:0 */ +#define REG_NVIC0_INTPID1 0xE000EFE4 /* NVIC0 Peripheral Identification Bits15:8 */ +#define REG_NVIC0_INTPID2 0xE000EFE8 /* NVIC0 Peripheral Identification Bits16:23 */ +#define REG_NVIC0_INTPID3 0xE000EFEC /* NVIC0 Peripheral Identification Bits24:31 */ +#define REG_NVIC0_INTCID0 0xE000EFF0 /* NVIC0 Component Identification Bits7:0 */ +#define REG_NVIC0_INTCID1 0xE000EFF4 /* NVIC0 Component Identification Bits15:8 */ +#define REG_NVIC0_INTCID2 0xE000EFF8 /* NVIC0 Component Identification Bits16:23 */ +#define REG_NVIC0_INTCID3 0xE000EFFC /* NVIC0 Component Identification Bits24:31 */ + +/* ============================================================================================================================ + NVIC Register BitMasks, Positions & Enumerations + ============================================================================================================================ */ +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTNUM Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTNUM_VALUE 0 /* Interrupt Control Type */ +#define BITM_NVIC_INTNUM_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Interrupt Control Type */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_STKSTA Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_STKSTA_VALUE 0 /* Systick Control and Status */ +#define BITM_NVIC_STKSTA_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Systick Control and Status */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_STKLD Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_STKLD_VALUE 0 /* Systick Reload Value */ +#define BITM_NVIC_STKLD_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Systick Reload Value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_STKVAL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_STKVAL_VALUE 0 /* Systick Current Value */ +#define BITM_NVIC_STKVAL_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Systick Current Value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_STKCAL Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_STKCAL_VALUE 0 /* Systick Calibration Value */ +#define BITM_NVIC_STKCAL_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Systick Calibration Value */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTSETE0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTSETE0_VALUE 0 /* IRQ0..31 Set_Enable */ +#define BITM_NVIC_INTSETE0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ0..31 Set_Enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTSETE1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTSETE1_VALUE 0 /* IRQ32..63 Set_Enable */ +#define BITM_NVIC_INTSETE1_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ32..63 Set_Enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTCLRE0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTCLRE0_VALUE 0 /* IRQ0..31 Clear_Enable */ +#define BITM_NVIC_INTCLRE0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ0..31 Clear_Enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTCLRE1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTCLRE1_VALUE 0 /* IRQ32..63 Clear_Enable */ +#define BITM_NVIC_INTCLRE1_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ32..63 Clear_Enable */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTSETP0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTSETP0_VALUE 0 /* IRQ0..31 Set_Pending */ +#define BITM_NVIC_INTSETP0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ0..31 Set_Pending */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTSETP1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTSETP1_VALUE 0 /* IRQ32..63 Set_Pending */ +#define BITM_NVIC_INTSETP1_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ32..63 Set_Pending */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTCLRP0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTCLRP0_VALUE 0 /* IRQ0..31 Clear_Pending */ +#define BITM_NVIC_INTCLRP0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ0..31 Clear_Pending */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTCLRP1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTCLRP1_VALUE 0 /* IRQ32..63 Clear_Pending */ +#define BITM_NVIC_INTCLRP1_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ32..63 Clear_Pending */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTACT0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTACT0_VALUE 0 /* IRQ0..31 Active Bit */ +#define BITM_NVIC_INTACT0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ0..31 Active Bit */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTACT1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTACT1_VALUE 0 /* IRQ32..63 Active Bit */ +#define BITM_NVIC_INTACT1_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ32..63 Active Bit */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPRI0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPRI0_VALUE 0 /* IRQ0..3 Priority */ +#define BITM_NVIC_INTPRI0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ0..3 Priority */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPRI1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPRI1_VALUE 0 /* IRQ4..7 Priority */ +#define BITM_NVIC_INTPRI1_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ4..7 Priority */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPRI2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPRI2_VALUE 0 /* IRQ8..11 Priority */ +#define BITM_NVIC_INTPRI2_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ8..11 Priority */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPRI3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPRI3_VALUE 0 /* IRQ12..15 Priority */ +#define BITM_NVIC_INTPRI3_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ12..15 Priority */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPRI4 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPRI4_VALUE 0 /* IRQ16..19 Priority */ +#define BITM_NVIC_INTPRI4_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ16..19 Priority */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPRI5 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPRI5_VALUE 0 /* IRQ20..23 Priority */ +#define BITM_NVIC_INTPRI5_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ20..23 Priority */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPRI6 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPRI6_VALUE 0 /* IRQ24..27 Priority */ +#define BITM_NVIC_INTPRI6_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ24..27 Priority */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPRI7 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPRI7_VALUE 0 /* IRQ28..31 Priority */ +#define BITM_NVIC_INTPRI7_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ28..31 Priority */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPRI8 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPRI8_VALUE 0 /* IRQ32..35 Priority */ +#define BITM_NVIC_INTPRI8_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ32..35 Priority */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPRI9 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPRI9_VALUE 0 /* IRQ36..39 Priority */ +#define BITM_NVIC_INTPRI9_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ36..39 Priority */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPRI10 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPRI10_VALUE 0 /* IRQ40..43 Priority */ +#define BITM_NVIC_INTPRI10_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* IRQ40..43 Priority */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTCPID Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTCPID_VALUE 0 /* CPUID Base */ +#define BITM_NVIC_INTCPID_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* CPUID Base */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTSTA Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTSTA_VALUE 0 /* Interrupt Control State */ +#define BITM_NVIC_INTSTA_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Interrupt Control State */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTVEC Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTVEC_VALUE 0 /* Vector Table Offset */ +#define BITM_NVIC_INTVEC_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Vector Table Offset */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTAIRC Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTAIRC_VALUE 0 /* Application Interrupt/Reset Control */ +#define BITM_NVIC_INTAIRC_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Application Interrupt/Reset Control */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTCON0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTCON0_SLEEPDEEP 2 /* deep sleep flag for HIBERNATE mode */ +#define BITP_NVIC_INTCON0_SLEEPONEXIT 1 /* Sleeps the core on exit from an ISR */ +#define BITM_NVIC_INTCON0_SLEEPDEEP (_ADI_MSK_3(0x00000004,0x00000004U, uint16_t )) /* deep sleep flag for HIBERNATE mode */ +#define BITM_NVIC_INTCON0_SLEEPONEXIT (_ADI_MSK_3(0x00000002,0x00000002U, uint16_t )) /* Sleeps the core on exit from an ISR */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTCON1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTCON1_VALUE 0 /* Configuration Control */ +#define BITM_NVIC_INTCON1_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Configuration Control */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTSHPRIO0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTSHPRIO0_VALUE 0 /* System Handlers 4-7 Priority */ +#define BITM_NVIC_INTSHPRIO0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* System Handlers 4-7 Priority */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTSHPRIO1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTSHPRIO1_VALUE 0 /* System Handlers 8-11 Priority */ +#define BITM_NVIC_INTSHPRIO1_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* System Handlers 8-11 Priority */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTSHPRIO3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTSHPRIO3_VALUE 0 /* System Handlers 12-15 Priority */ +#define BITM_NVIC_INTSHPRIO3_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* System Handlers 12-15 Priority */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTSHCSR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTSHCSR_VALUE 0 /* System Handler Control and State */ +#define BITM_NVIC_INTSHCSR_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* System Handler Control and State */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTCFSR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTCFSR_VALUE 0 /* Configurable Fault Status */ +#define BITM_NVIC_INTCFSR_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Configurable Fault Status */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTHFSR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTHFSR_VALUE 0 /* Hard Fault Status */ +#define BITM_NVIC_INTHFSR_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Hard Fault Status */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTDFSR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTDFSR_VALUE 0 /* Debug Fault Status */ +#define BITM_NVIC_INTDFSR_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Debug Fault Status */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTMMAR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTMMAR_VALUE 0 /* Mem Manage Address */ +#define BITM_NVIC_INTMMAR_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Mem Manage Address */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTBFAR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTBFAR_VALUE 0 /* Bus Fault Address */ +#define BITM_NVIC_INTBFAR_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Bus Fault Address */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTAFSR Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTAFSR_VALUE 0 /* Auxiliary Fault Status */ +#define BITM_NVIC_INTAFSR_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Auxiliary Fault Status */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPFR0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPFR0_VALUE 0 /* Processor Feature Register 0 */ +#define BITM_NVIC_INTPFR0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Processor Feature Register 0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPFR1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPFR1_VALUE 0 /* Processor Feature Register 1 */ +#define BITM_NVIC_INTPFR1_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Processor Feature Register 1 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTDFR0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTDFR0_VALUE 0 /* Debug Feature Register 0 */ +#define BITM_NVIC_INTDFR0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Debug Feature Register 0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTAFR0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTAFR0_VALUE 0 /* Auxiliary Feature Register 0 */ +#define BITM_NVIC_INTAFR0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Auxiliary Feature Register 0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTMMFR0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTMMFR0_VALUE 0 /* Memory Model Feature Register 0 */ +#define BITM_NVIC_INTMMFR0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Memory Model Feature Register 0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTMMFR1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTMMFR1_VALUE 0 /* Memory Model Feature Register 1 */ +#define BITM_NVIC_INTMMFR1_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Memory Model Feature Register 1 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTMMFR2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTMMFR2_VALUE 0 /* Memory Model Feature Register 2 */ +#define BITM_NVIC_INTMMFR2_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Memory Model Feature Register 2 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTMMFR3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTMMFR3_VALUE 0 /* Memory Model Feature Register 3 */ +#define BITM_NVIC_INTMMFR3_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Memory Model Feature Register 3 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTISAR0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTISAR0_VALUE 0 /* ISA Feature Register 0 */ +#define BITM_NVIC_INTISAR0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* ISA Feature Register 0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTISAR1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTISAR1_VALUE 0 /* ISA Feature Register 1 */ +#define BITM_NVIC_INTISAR1_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* ISA Feature Register 1 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTISAR2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTISAR2_VALUE 0 /* ISA Feature Register 2 */ +#define BITM_NVIC_INTISAR2_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* ISA Feature Register 2 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTISAR3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTISAR3_VALUE 0 /* ISA Feature Register 3 */ +#define BITM_NVIC_INTISAR3_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* ISA Feature Register 3 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTISAR4 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTISAR4_VALUE 0 /* ISA Feature Register 4 */ +#define BITM_NVIC_INTISAR4_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* ISA Feature Register 4 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTTRGI Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTTRGI_VALUE 0 /* Software Trigger Interrupt Register */ +#define BITM_NVIC_INTTRGI_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Software Trigger Interrupt Register */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPID4 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPID4_VALUE 0 /* Peripheral Identification Register 4 */ +#define BITM_NVIC_INTPID4_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Peripheral Identification Register 4 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPID5 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPID5_VALUE 0 /* Peripheral Identification Register 5 */ +#define BITM_NVIC_INTPID5_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Peripheral Identification Register 5 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPID6 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPID6_VALUE 0 /* Peripheral Identification Register 6 */ +#define BITM_NVIC_INTPID6_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Peripheral Identification Register 6 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPID7 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPID7_VALUE 0 /* Peripheral Identification Register 7 */ +#define BITM_NVIC_INTPID7_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Peripheral Identification Register 7 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPID0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPID0_VALUE 0 /* Peripheral Identification Bits7:0 */ +#define BITM_NVIC_INTPID0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Peripheral Identification Bits7:0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPID1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPID1_VALUE 0 /* Peripheral Identification Bits15:8 */ +#define BITM_NVIC_INTPID1_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Peripheral Identification Bits15:8 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPID2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPID2_VALUE 0 /* Peripheral Identification Bits16:23 */ +#define BITM_NVIC_INTPID2_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Peripheral Identification Bits16:23 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTPID3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTPID3_VALUE 0 /* Peripheral Identification Bits24:31 */ +#define BITM_NVIC_INTPID3_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Peripheral Identification Bits24:31 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTCID0 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTCID0_VALUE 0 /* Component Identification Bits7:0 */ +#define BITM_NVIC_INTCID0_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Component Identification Bits7:0 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTCID1 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTCID1_VALUE 0 /* Component Identification Bits15:8 */ +#define BITM_NVIC_INTCID1_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Component Identification Bits15:8 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTCID2 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTCID2_VALUE 0 /* Component Identification Bits16:23 */ +#define BITM_NVIC_INTCID2_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Component Identification Bits16:23 */ + +/* ------------------------------------------------------------------------------------------------------------------------- + NVIC_INTCID3 Pos/Masks Description + ------------------------------------------------------------------------------------------------------------------------- */ +#define BITP_NVIC_INTCID3_VALUE 0 /* Component Identification Bits24:31 */ +#define BITM_NVIC_INTCID3_VALUE (_ADI_MSK_3(0xFFFFFFFF,0xFFFFFFFFUL, uint32_t )) /* Component Identification Bits24:31 */ + +/* ==================================================================================================== + * Interrupt Definitions + * ==================================================================================================== */ +#define INTR_RESET (-15) /* Cortex-M4 Reset */ +#define INTR_NonMaskableInt (-14) /* Cortex-M4 Non-maskable Interrupt */ +#define INTR_HardFault (-13) /* Cortex-M4 Hardware Fault */ +#define INTR_MemoryManagement (-12) /* Cortex-M4 Memory Management Interrupt */ +#define INTR_BusFault (-11) /* Cortex-M4 Bus Fault */ +#define INTR_UsageFault (-10) /* Cortex-M4 Usage Fault */ +#define INTR_SVCall ( -5) /* Cortex-M4 SVCall Interrupt */ +#define INTR_DebugMonitor ( -4) /* Cortex-M4 Debug Monitor */ +#define INTR_PendSV ( -2) /* Cortex-M4 PendSV Interrupt */ +#define INTR_SysTick ( -1) /* Cortex-M4 SysTick Interrupt */ +#define INTR_RTC1_EVT 0 /* Event */ +#define INTR_XINT_EVT0 1 /* External Wakeup Interrupt n */ +#define INTR_XINT_EVT1 2 /* External Wakeup Interrupt n */ +#define INTR_XINT_EVT2 3 /* External Wakeup Interrupt n */ +#define INTR_XINT_EVT3 4 /* External Wakeup Interrupt n */ +#define INTR_WDT_EXP 5 /* Expiration */ +#define INTR_PMG0_VREG_OVR 6 /* Voltage Regulator (VREG) Overvoltage */ +#define INTR_PMG0_BATT_RANGE 7 /* Battery Voltage (VBAT) Out of Range */ +#define INTR_RTC0_EVT 8 /* Event */ +#define INTR_SYS_GPIO_INTA 9 /* GPIO Interrupt A */ +#define INTR_SYS_GPIO_INTB 10 /* GPIO Interrupt B */ +#define INTR_TMR0_EVT 11 /* Event */ +#define INTR_TMR1_EVT 12 /* Event */ +#define INTR_FLCC_EVT 13 /* Event */ +#define INTR_UART0_EVT 14 /* UART0 Event */ +#define INTR_SPI0_EVT 15 /* Event */ +#define INTR_SPI2_EVT 16 /* Event */ +#define INTR_I2C_SLV_EVT 17 /* Slave Event */ +#define INTR_I2C_MST_EVT 18 /* Master Event */ +#define INTR_DMA_CHAN_ERR 19 /* Channel Error */ +#define INTR_DMA0_CH0_DONE 20 /* Channel 0 Done */ +#define INTR_DMA0_CH1_DONE 21 /* Channel 1 Done */ +#define INTR_DMA0_CH2_DONE 22 /* Channel 2 Done */ +#define INTR_DMA0_CH3_DONE 23 /* Channel 3 Done */ +#define INTR_DMA0_CH4_DONE 24 /* Channel 4 Done */ +#define INTR_DMA0_CH5_DONE 25 /* Channel 5 Done */ +#define INTR_DMA0_CH6_DONE 26 /* Channel 6 Done */ +#define INTR_DMA0_CH7_DONE 27 /* Channel 7 Done */ +#define INTR_DMA0_CH8_DONE 28 /* Channel 8 Done */ +#define INTR_DMA0_CH9_DONE 29 /* Channel 9 Done */ +#define INTR_DMA0_CH10_DONE 30 /* Channel 10 Done */ +#define INTR_DMA0_CH11_DONE 31 /* Channel 11 Done */ +#define INTR_DMA0_CH12_DONE 32 /* Channel 12 Done */ +#define INTR_DMA0_CH13_DONE 33 /* Channel 13 Done */ +#define INTR_DMA0_CH14_DONE 34 /* Channel 14 Done */ +#define INTR_DMA0_CH15_DONE 35 /* Channel 15 Done */ +#define INTR_SPORT_A_EVT 36 /* Channel A Event */ +#define INTR_SPORT_B_EVT 37 /* Channel B Event */ +#define INTR_CRYPT_EVT 38 /* Event */ +#define INTR_DMA0_CH24_DONE 39 /* Channel 24 Done */ +#define INTR_TMR2_EVT 40 /* Event */ +#define INTR_CLKG_XTAL_OSC_EVT 41 /* Crystal Oscillator Event */ +#define INTR_SPI1_EVT 42 /* Event */ +#define INTR_CLKG_PLL_EVT 43 /* PLL Event */ +#define INTR_RNG0_EVT 44 /* Event */ +#define INTR_BEEP_EVT 45 /* Event */ +#define INTR_ADC0_EVT 46 /* Event */ +#define INTR_DMA0_CH16_DONE 56 /* Channel 16 Done */ +#define INTR_DMA0_CH17_DONE 57 /* Channel 17 Done */ +#define INTR_DMA0_CH18_DONE 58 /* Channel 18 Done */ +#define INTR_DMA0_CH19_DONE 59 /* Channel 19 Done */ +#define INTR_DMA0_CH20_DONE 60 /* Channel 20 Done */ +#define INTR_DMA0_CH21_DONE 61 /* Channel 21 Done */ +#define INTR_DMA0_CH22_DONE 62 /* Channel 22 Done */ +#define INTR_DMA0_CH23_DONE 63 /* Channel 23 Done */ +#define INTR_UART1_EVT 66 /* Event */ +#define INTR_DMA0_CH25_DONE 67 /* Channel 25 Done */ +#define INTR_DMA0_CH26_DONE 68 /* Channel 26 Done */ +#define INTR_TMR_RGB_EVT 69 /* Event */ +#define INTR_CLKG_ROOTCLK_ERR 71 /* Root Clock Error */ + + +#if defined (_MISRA_RULES) +#pragma diag(pop) +#endif /* _MISRA_RULES */ + +#endif /* end ifndef _DEF_ADUCM4050_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050_cdef.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050_cdef.h new file mode 100755 index 0000000000..067c0386a3 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050_cdef.h @@ -0,0 +1,788 @@ +/* ================================================================================ + + Project : ADuCM4050 + File : ADuCM4050_cdef.h + Description : C MMR Pointer Definitions + + Date : Feb 7, 2017 + + Copyright (c) 2014-2017 Analog Devices, Inc. All Rights Reserved. + This software is proprietary and confidential to Analog Devices, Inc. and + its licensors. + + This file was auto-generated. Do not make local changes to this file. + + ================================================================================ */ + +#ifndef _ADUCM4050_CDEF_H +#define _ADUCM4050_CDEF_H + +#if defined(_LANGUAGE_C) || (defined(__GNUC__) && !defined(__ASSEMBLER__)) +#include +#endif /* _LANGUAGE_C */ + +/* pickup register bitfield and bit masks */ +#include "adi_ADuCM4050.h" + + +#ifndef __IO +#ifdef __cplusplus +#define __I volatile /* read-only */ +#define __C +#else +#define __I volatile /* read-only */ +#define __C const +#endif +#define __O volatile /* write-only */ +#define __IO volatile /* read-write */ +#endif +#if defined (_MISRA_RULES) +#pragma diag(push) +#pragma diag(suppress:misra_rule_5_1:"Allow names over 32 character limit") +#pragma diag(suppress:misra_rule_19_7:"ADI header allows function-like macros") +#pragma diag(suppress:misra_rule_19_13:"ADI headers can use the # and ## preprocessor operators") +#endif /* _MISRA_RULES */ + + +/* ================================================================================= + * General Purpose Timer (TMR0) + * ================================================================================= */ +#define pREG_TMR0_LOAD ((__IO uint16_t *) REG_TMR0_LOAD) /* 16-bit Load Value */ +#define pREG_TMR0_CURCNT ((__I __C uint16_t *) REG_TMR0_CURCNT) /* 16-bit Timer Value */ +#define pREG_TMR0_CTL ((__IO uint16_t *) REG_TMR0_CTL) /* Control */ +#define pREG_TMR0_CLRINT ((__O uint16_t *) REG_TMR0_CLRINT) /* Clear Interrupt */ +#define pREG_TMR0_CAPTURE ((__I __C uint16_t *) REG_TMR0_CAPTURE) /* Capture */ +#define pREG_TMR0_ALOAD ((__IO uint16_t *) REG_TMR0_ALOAD) /* 16-bit Load Value, Asynchronous */ +#define pREG_TMR0_ACURCNT ((__I __C uint16_t *) REG_TMR0_ACURCNT) /* 16-bit Timer Value, Asynchronous */ +#define pREG_TMR0_STAT ((__I __C uint16_t *) REG_TMR0_STAT) /* Status */ +#define pREG_TMR0_PWMCTL ((__IO uint16_t *) REG_TMR0_PWMCTL) /* PWM Control Register */ +#define pREG_TMR0_PWMMATCH ((__IO uint16_t *) REG_TMR0_PWMMATCH) /* PWM Match Value */ +#define pREG_TMR0_EVENTSELECT ((__IO uint16_t *) REG_TMR0_EVENTSELECT) /* Timer Event Selection Register */ + +/* ================================================================================= + * General Purpose Timer (TMR1) + * ================================================================================= */ +#define pREG_TMR1_LOAD ((__IO uint16_t *) REG_TMR1_LOAD) /* 16-bit Load Value */ +#define pREG_TMR1_CURCNT ((__I __C uint16_t *) REG_TMR1_CURCNT) /* 16-bit Timer Value */ +#define pREG_TMR1_CTL ((__IO uint16_t *) REG_TMR1_CTL) /* Control */ +#define pREG_TMR1_CLRINT ((__O uint16_t *) REG_TMR1_CLRINT) /* Clear Interrupt */ +#define pREG_TMR1_CAPTURE ((__I __C uint16_t *) REG_TMR1_CAPTURE) /* Capture */ +#define pREG_TMR1_ALOAD ((__IO uint16_t *) REG_TMR1_ALOAD) /* 16-bit Load Value, Asynchronous */ +#define pREG_TMR1_ACURCNT ((__I __C uint16_t *) REG_TMR1_ACURCNT) /* 16-bit Timer Value, Asynchronous */ +#define pREG_TMR1_STAT ((__I __C uint16_t *) REG_TMR1_STAT) /* Status */ +#define pREG_TMR1_PWMCTL ((__IO uint16_t *) REG_TMR1_PWMCTL) /* PWM Control Register */ +#define pREG_TMR1_PWMMATCH ((__IO uint16_t *) REG_TMR1_PWMMATCH) /* PWM Match Value */ +#define pREG_TMR1_EVENTSELECT ((__IO uint16_t *) REG_TMR1_EVENTSELECT) /* Timer Event Selection Register */ + +/* ================================================================================= + * General Purpose Timer (TMR2) + * ================================================================================= */ +#define pREG_TMR2_LOAD ((__IO uint16_t *) REG_TMR2_LOAD) /* 16-bit Load Value */ +#define pREG_TMR2_CURCNT ((__I __C uint16_t *) REG_TMR2_CURCNT) /* 16-bit Timer Value */ +#define pREG_TMR2_CTL ((__IO uint16_t *) REG_TMR2_CTL) /* Control */ +#define pREG_TMR2_CLRINT ((__O uint16_t *) REG_TMR2_CLRINT) /* Clear Interrupt */ +#define pREG_TMR2_CAPTURE ((__I __C uint16_t *) REG_TMR2_CAPTURE) /* Capture */ +#define pREG_TMR2_ALOAD ((__IO uint16_t *) REG_TMR2_ALOAD) /* 16-bit Load Value, Asynchronous */ +#define pREG_TMR2_ACURCNT ((__I __C uint16_t *) REG_TMR2_ACURCNT) /* 16-bit Timer Value, Asynchronous */ +#define pREG_TMR2_STAT ((__I __C uint16_t *) REG_TMR2_STAT) /* Status */ +#define pREG_TMR2_PWMCTL ((__IO uint16_t *) REG_TMR2_PWMCTL) /* PWM Control Register */ +#define pREG_TMR2_PWMMATCH ((__IO uint16_t *) REG_TMR2_PWMMATCH) /* PWM Match Value */ +#define pREG_TMR2_EVENTSELECT ((__IO uint16_t *) REG_TMR2_EVENTSELECT) /* Timer Event Selection Register */ + +/* ================================================================================= + * Timer_RGB with 3 PWM outputs (TMR_RGB) + * ================================================================================= */ +#define pREG_TMR_RGB_LOAD ((__IO uint16_t *) REG_TMR_RGB_LOAD) /* 16-bit load value */ +#define pREG_TMR_RGB_CURCNT ((__I __C uint16_t *) REG_TMR_RGB_CURCNT) /* 16-bit timer value */ +#define pREG_TMR_RGB_CTL ((__IO uint16_t *) REG_TMR_RGB_CTL) /* Control */ +#define pREG_TMR_RGB_CLRINT ((__O uint16_t *) REG_TMR_RGB_CLRINT) /* Clear interrupt */ +#define pREG_TMR_RGB_CAPTURE ((__I __C uint16_t *) REG_TMR_RGB_CAPTURE) /* Capture */ +#define pREG_TMR_RGB_ALOAD ((__IO uint16_t *) REG_TMR_RGB_ALOAD) /* 16-bit load value, asynchronous */ +#define pREG_TMR_RGB_ACURCNT ((__I __C uint16_t *) REG_TMR_RGB_ACURCNT) /* 16-bit timer value, asynchronous */ +#define pREG_TMR_RGB_STAT ((__I __C uint16_t *) REG_TMR_RGB_STAT) /* Status */ +#define pREG_TMR_RGB_PWM0CTL ((__IO uint16_t *) REG_TMR_RGB_PWM0CTL) /* PWM0 Control Register */ +#define pREG_TMR_RGB_PWM0MATCH ((__IO uint16_t *) REG_TMR_RGB_PWM0MATCH) /* PWM0 Match Value */ +#define pREG_TMR_RGB_EVENTSELECT ((__IO uint16_t *) REG_TMR_RGB_EVENTSELECT) /* Timer Event selection Register */ +#define pREG_TMR_RGB_PWM1CTL ((__IO uint16_t *) REG_TMR_RGB_PWM1CTL) /* PWM1 Control Register */ +#define pREG_TMR_RGB_PWM1MATCH ((__IO uint16_t *) REG_TMR_RGB_PWM1MATCH) /* PWM1 Match Value */ +#define pREG_TMR_RGB_PWM2CTL ((__IO uint16_t *) REG_TMR_RGB_PWM2CTL) /* PWM2 Control Register */ +#define pREG_TMR_RGB_PWM2MATCH ((__IO uint16_t *) REG_TMR_RGB_PWM2MATCH) /* PWM2 Match Value */ + +/* ================================================================================= + * Real-Time Clock (RTC0) + * ================================================================================= */ +#define pREG_RTC0_CR0 ((__IO uint16_t *) REG_RTC0_CR0) /* RTC Control 0 */ +#define pREG_RTC0_SR0 ((__IO uint16_t *) REG_RTC0_SR0) /* RTC Status 0 */ +#define pREG_RTC0_SR1 ((__I __C uint16_t *) REG_RTC0_SR1) /* RTC Status 1 */ +#define pREG_RTC0_CNT0 ((__IO uint16_t *) REG_RTC0_CNT0) /* RTC Count 0 */ +#define pREG_RTC0_CNT1 ((__IO uint16_t *) REG_RTC0_CNT1) /* RTC Count 1 */ +#define pREG_RTC0_ALM0 ((__IO uint16_t *) REG_RTC0_ALM0) /* RTC Alarm 0 */ +#define pREG_RTC0_ALM1 ((__IO uint16_t *) REG_RTC0_ALM1) /* RTC Alarm 1 */ +#define pREG_RTC0_TRM ((__IO uint16_t *) REG_RTC0_TRM) /* RTC Trim */ +#define pREG_RTC0_GWY ((__O uint16_t *) REG_RTC0_GWY) /* RTC Gateway */ +#define pREG_RTC0_CR1 ((__IO uint16_t *) REG_RTC0_CR1) /* RTC Control 1 */ +#define pREG_RTC0_SR2 ((__IO uint16_t *) REG_RTC0_SR2) /* RTC Status 2 */ +#define pREG_RTC0_SNAP0 ((__I __C uint16_t *) REG_RTC0_SNAP0) /* RTC Snapshot 0 */ +#define pREG_RTC0_SNAP1 ((__I __C uint16_t *) REG_RTC0_SNAP1) /* RTC Snapshot 1 */ +#define pREG_RTC0_SNAP2 ((__I __C uint16_t *) REG_RTC0_SNAP2) /* RTC Snapshot 2 */ +#define pREG_RTC0_MOD ((__I __C uint16_t *) REG_RTC0_MOD) /* RTC Modulo */ +#define pREG_RTC0_CNT2 ((__I __C uint16_t *) REG_RTC0_CNT2) /* RTC Count 2 */ +#define pREG_RTC0_ALM2 ((__IO uint16_t *) REG_RTC0_ALM2) /* RTC Alarm 2 */ +#define pREG_RTC0_SR3 ((__IO uint16_t *) REG_RTC0_SR3) /* RTC Status 3 */ +#define pREG_RTC0_CR2IC ((__IO uint16_t *) REG_RTC0_CR2IC) /* RTC Control 2 for Configuring Input Capture Channels */ +#define pREG_RTC0_CR3SS ((__IO uint16_t *) REG_RTC0_CR3SS) /* RTC Control 3 for Configuring SensorStrobe Channel */ +#define pREG_RTC0_CR4SS ((__IO uint16_t *) REG_RTC0_CR4SS) /* RTC Control 4 for Configuring SensorStrobe Channel */ +#define pREG_RTC0_SSMSK ((__IO uint16_t *) REG_RTC0_SSMSK) /* RTC Mask for SensorStrobe Channel */ +#define pREG_RTC0_IC2 ((__I __C uint16_t *) REG_RTC0_IC2) /* RTC Input Capture Channel 2 */ +#define pREG_RTC0_IC3 ((__I __C uint16_t *) REG_RTC0_IC3) /* RTC Input Capture Channel 3 */ +#define pREG_RTC0_IC4 ((__I __C uint16_t *) REG_RTC0_IC4) /* RTC Input Capture Channel 4 */ +#define pREG_RTC0_SS1 ((__IO uint16_t *) REG_RTC0_SS1) /* RTC SensorStrobe Channel 1 */ +#define pREG_RTC0_SS2 ((__IO uint16_t *) REG_RTC0_SS2) /* RTC SensorStrobe Channel 2 */ +#define pREG_RTC0_SS3 ((__IO uint16_t *) REG_RTC0_SS3) /* RTC SensorStrobe Channel 3 */ +#define pREG_RTC0_SS4 ((__IO uint16_t *) REG_RTC0_SS4) /* RTC SensorStrobe Channel 4 */ +#define pREG_RTC0_SR4 ((__I __C uint16_t *) REG_RTC0_SR4) /* RTC Status 4 */ +#define pREG_RTC0_SR5 ((__I __C uint16_t *) REG_RTC0_SR5) /* RTC Status 5 */ +#define pREG_RTC0_SR6 ((__I __C uint16_t *) REG_RTC0_SR6) /* RTC Status 6 */ +#define pREG_RTC0_SS1TGT ((__I __C uint16_t *) REG_RTC0_SS1TGT) /* RTC SensorStrobe Channel 1 Target */ +#define pREG_RTC0_FRZCNT ((__I __C uint16_t *) REG_RTC0_FRZCNT) /* RTC Freeze Count */ +#define pREG_RTC0_SS2TGT ((__I __C uint16_t *) REG_RTC0_SS2TGT) /* RTC SensorStrobe Channel 2 Target */ +#define pREG_RTC0_SS3TGT ((__I __C uint16_t *) REG_RTC0_SS3TGT) /* RTC SensorStrobe Channel 3 Target */ +#define pREG_RTC0_SS1LOWDUR ((__IO uint16_t *) REG_RTC0_SS1LOWDUR) /* RTC Auto-Reload Low Duration for SensorStrobe Channel 1 */ +#define pREG_RTC0_SS2LOWDUR ((__IO uint16_t *) REG_RTC0_SS2LOWDUR) /* RTC Auto-Reload Low Duration for SensorStrobe Channel 2 */ +#define pREG_RTC0_SS3LOWDUR ((__IO uint16_t *) REG_RTC0_SS3LOWDUR) /* RTC Auto-Reload Low Duration for SensorStrobe Channel 3 */ +#define pREG_RTC0_SS1HIGHDUR ((__IO uint16_t *) REG_RTC0_SS1HIGHDUR) /* RTC Auto-Reload High Duration for SensorStrobe Channel 1 */ +#define pREG_RTC0_SS2HIGHDUR ((__IO uint16_t *) REG_RTC0_SS2HIGHDUR) /* RTC Auto-Reload High Duration for SensorStrobe Channel 2 */ +#define pREG_RTC0_SS3HIGHDUR ((__IO uint16_t *) REG_RTC0_SS3HIGHDUR) /* RTC Auto-Reload High Duration for SensorStrobe Channel 3 */ +#define pREG_RTC0_SSMSKOT ((__IO uint16_t *) REG_RTC0_SSMSKOT) /* RTC Masks for SensorStrobe Channels on Time Control */ +#define pREG_RTC0_CR5SSS ((__IO uint16_t *) REG_RTC0_CR5SSS) /* RTC Control 5 for Configuring SensorStrobe Channel GPIO Sampling */ +#define pREG_RTC0_CR6SSS ((__IO uint16_t *) REG_RTC0_CR6SSS) /* RTC Control 6 for Configuring SensorStrobe Channel GPIO Sampling Edge */ +#define pREG_RTC0_CR7SSS ((__IO uint16_t *) REG_RTC0_CR7SSS) /* RTC Control 7 for Configuring SensorStrobe Channel GPIO Sampling Activity */ +#define pREG_RTC0_SR7 ((__IO uint16_t *) REG_RTC0_SR7) /* RTC Status 7 */ +#define pREG_RTC0_SR8 ((__I __C uint16_t *) REG_RTC0_SR8) /* RTC Status 8 */ +#define pREG_RTC0_SR9 ((__I __C uint16_t *) REG_RTC0_SR9) /* RTC Status 9 */ +#define pREG_RTC0_GPMUX0 ((__IO uint16_t *) REG_RTC0_GPMUX0) /* RTC GPIO Pin Mux Control Register 0 */ +#define pREG_RTC0_GPMUX1 ((__IO uint16_t *) REG_RTC0_GPMUX1) /* RTC GPIO Pin Mux Control Register 1 */ + +/* ================================================================================= + * Real-Time Clock (RTC1) + * ================================================================================= */ +#define pREG_RTC1_CR0 ((__IO uint16_t *) REG_RTC1_CR0) /* RTC Control 0 */ +#define pREG_RTC1_SR0 ((__IO uint16_t *) REG_RTC1_SR0) /* RTC Status 0 */ +#define pREG_RTC1_SR1 ((__I __C uint16_t *) REG_RTC1_SR1) /* RTC Status 1 */ +#define pREG_RTC1_CNT0 ((__IO uint16_t *) REG_RTC1_CNT0) /* RTC Count 0 */ +#define pREG_RTC1_CNT1 ((__IO uint16_t *) REG_RTC1_CNT1) /* RTC Count 1 */ +#define pREG_RTC1_ALM0 ((__IO uint16_t *) REG_RTC1_ALM0) /* RTC Alarm 0 */ +#define pREG_RTC1_ALM1 ((__IO uint16_t *) REG_RTC1_ALM1) /* RTC Alarm 1 */ +#define pREG_RTC1_TRM ((__IO uint16_t *) REG_RTC1_TRM) /* RTC Trim */ +#define pREG_RTC1_GWY ((__O uint16_t *) REG_RTC1_GWY) /* RTC Gateway */ +#define pREG_RTC1_CR1 ((__IO uint16_t *) REG_RTC1_CR1) /* RTC Control 1 */ +#define pREG_RTC1_SR2 ((__IO uint16_t *) REG_RTC1_SR2) /* RTC Status 2 */ +#define pREG_RTC1_SNAP0 ((__I __C uint16_t *) REG_RTC1_SNAP0) /* RTC Snapshot 0 */ +#define pREG_RTC1_SNAP1 ((__I __C uint16_t *) REG_RTC1_SNAP1) /* RTC Snapshot 1 */ +#define pREG_RTC1_SNAP2 ((__I __C uint16_t *) REG_RTC1_SNAP2) /* RTC Snapshot 2 */ +#define pREG_RTC1_MOD ((__I __C uint16_t *) REG_RTC1_MOD) /* RTC Modulo */ +#define pREG_RTC1_CNT2 ((__I __C uint16_t *) REG_RTC1_CNT2) /* RTC Count 2 */ +#define pREG_RTC1_ALM2 ((__IO uint16_t *) REG_RTC1_ALM2) /* RTC Alarm 2 */ +#define pREG_RTC1_SR3 ((__IO uint16_t *) REG_RTC1_SR3) /* RTC Status 3 */ +#define pREG_RTC1_CR2IC ((__IO uint16_t *) REG_RTC1_CR2IC) /* RTC Control 2 for Configuring Input Capture Channels */ +#define pREG_RTC1_CR3SS ((__IO uint16_t *) REG_RTC1_CR3SS) /* RTC Control 3 for Configuring SensorStrobe Channel */ +#define pREG_RTC1_CR4SS ((__IO uint16_t *) REG_RTC1_CR4SS) /* RTC Control 4 for Configuring SensorStrobe Channel */ +#define pREG_RTC1_SSMSK ((__IO uint16_t *) REG_RTC1_SSMSK) /* RTC Mask for SensorStrobe Channel */ +#define pREG_RTC1_IC2 ((__I __C uint16_t *) REG_RTC1_IC2) /* RTC Input Capture Channel 2 */ +#define pREG_RTC1_IC3 ((__I __C uint16_t *) REG_RTC1_IC3) /* RTC Input Capture Channel 3 */ +#define pREG_RTC1_IC4 ((__I __C uint16_t *) REG_RTC1_IC4) /* RTC Input Capture Channel 4 */ +#define pREG_RTC1_SS1 ((__IO uint16_t *) REG_RTC1_SS1) /* RTC SensorStrobe Channel 1 */ +#define pREG_RTC1_SS2 ((__IO uint16_t *) REG_RTC1_SS2) /* RTC SensorStrobe Channel 2 */ +#define pREG_RTC1_SS3 ((__IO uint16_t *) REG_RTC1_SS3) /* RTC SensorStrobe Channel 3 */ +#define pREG_RTC1_SS4 ((__IO uint16_t *) REG_RTC1_SS4) /* RTC SensorStrobe Channel 4 */ +#define pREG_RTC1_SR4 ((__I __C uint16_t *) REG_RTC1_SR4) /* RTC Status 4 */ +#define pREG_RTC1_SR5 ((__I __C uint16_t *) REG_RTC1_SR5) /* RTC Status 5 */ +#define pREG_RTC1_SR6 ((__I __C uint16_t *) REG_RTC1_SR6) /* RTC Status 6 */ +#define pREG_RTC1_SS1TGT ((__I __C uint16_t *) REG_RTC1_SS1TGT) /* RTC SensorStrobe Channel 1 Target */ +#define pREG_RTC1_FRZCNT ((__I __C uint16_t *) REG_RTC1_FRZCNT) /* RTC Freeze Count */ +#define pREG_RTC1_SS2TGT ((__I __C uint16_t *) REG_RTC1_SS2TGT) /* RTC SensorStrobe Channel 2 Target */ +#define pREG_RTC1_SS3TGT ((__I __C uint16_t *) REG_RTC1_SS3TGT) /* RTC SensorStrobe Channel 3 Target */ +#define pREG_RTC1_SS1LOWDUR ((__IO uint16_t *) REG_RTC1_SS1LOWDUR) /* RTC Auto-Reload Low Duration for SensorStrobe Channel 1 */ +#define pREG_RTC1_SS2LOWDUR ((__IO uint16_t *) REG_RTC1_SS2LOWDUR) /* RTC Auto-Reload Low Duration for SensorStrobe Channel 2 */ +#define pREG_RTC1_SS3LOWDUR ((__IO uint16_t *) REG_RTC1_SS3LOWDUR) /* RTC Auto-Reload Low Duration for SensorStrobe Channel 3 */ +#define pREG_RTC1_SS1HIGHDUR ((__IO uint16_t *) REG_RTC1_SS1HIGHDUR) /* RTC Auto-Reload High Duration for SensorStrobe Channel 1 */ +#define pREG_RTC1_SS2HIGHDUR ((__IO uint16_t *) REG_RTC1_SS2HIGHDUR) /* RTC Auto-Reload High Duration for SensorStrobe Channel 2 */ +#define pREG_RTC1_SS3HIGHDUR ((__IO uint16_t *) REG_RTC1_SS3HIGHDUR) /* RTC Auto-Reload High Duration for SensorStrobe Channel 3 */ +#define pREG_RTC1_SSMSKOT ((__IO uint16_t *) REG_RTC1_SSMSKOT) /* RTC Masks for SensorStrobe Channels on Time Control */ +#define pREG_RTC1_CR5SSS ((__IO uint16_t *) REG_RTC1_CR5SSS) /* RTC Control 5 for Configuring SensorStrobe Channel GPIO Sampling */ +#define pREG_RTC1_CR6SSS ((__IO uint16_t *) REG_RTC1_CR6SSS) /* RTC Control 6 for Configuring SensorStrobe Channel GPIO Sampling Edge */ +#define pREG_RTC1_CR7SSS ((__IO uint16_t *) REG_RTC1_CR7SSS) /* RTC Control 7 for Configuring SensorStrobe Channel GPIO Sampling Activity */ +#define pREG_RTC1_SR7 ((__IO uint16_t *) REG_RTC1_SR7) /* RTC Status 7 */ +#define pREG_RTC1_SR8 ((__I __C uint16_t *) REG_RTC1_SR8) /* RTC Status 8 */ +#define pREG_RTC1_SR9 ((__I __C uint16_t *) REG_RTC1_SR9) /* RTC Status 9 */ +#define pREG_RTC1_GPMUX0 ((__IO uint16_t *) REG_RTC1_GPMUX0) /* RTC GPIO Pin Mux Control Register 0 */ +#define pREG_RTC1_GPMUX1 ((__IO uint16_t *) REG_RTC1_GPMUX1) /* RTC GPIO Pin Mux Control Register 1 */ + +/* ================================================================================= + * System Identification and Debug Enable (SYS) + * ================================================================================= */ +#define pREG_SYS_ADIID ((__I __C uint16_t *) REG_SYS_ADIID) /* ADI Identification */ +#define pREG_SYS_CHIPID ((__I __C uint16_t *) REG_SYS_CHIPID) /* Chip Identifier */ +#define pREG_SYS_SWDEN ((__O uint16_t *) REG_SYS_SWDEN) /* Serial Wire Debug Enable */ + +/* ================================================================================= + * Watchdog Timer (WDT0) + * ================================================================================= */ +#define pREG_WDT0_LOAD ((__IO uint16_t *) REG_WDT0_LOAD) /* Load Value */ +#define pREG_WDT0_CCNT ((__I __C uint16_t *) REG_WDT0_CCNT) /* Current Count Value */ +#define pREG_WDT0_CTL ((__IO uint16_t *) REG_WDT0_CTL) /* Control */ +#define pREG_WDT0_RESTART ((__O uint16_t *) REG_WDT0_RESTART) /* Clear Interrupt */ +#define pREG_WDT0_STAT ((__I __C uint16_t *) REG_WDT0_STAT) /* Status */ + +/* ================================================================================= + * I2C Master/Slave (I2C0) + * ================================================================================= */ +#define pREG_I2C0_MCTL ((__IO uint16_t *) REG_I2C0_MCTL) /* Master Control */ +#define pREG_I2C0_MSTAT ((__IO uint16_t *) REG_I2C0_MSTAT) /* Master Status */ +#define pREG_I2C0_MRX ((__I __C uint16_t *) REG_I2C0_MRX) /* Master Receive Data */ +#define pREG_I2C0_MTX ((__IO uint16_t *) REG_I2C0_MTX) /* Master Transmit Data */ +#define pREG_I2C0_MRXCNT ((__IO uint16_t *) REG_I2C0_MRXCNT) /* Master Receive Data Count */ +#define pREG_I2C0_MCRXCNT ((__I __C uint16_t *) REG_I2C0_MCRXCNT) /* Master Current Receive Data Count */ +#define pREG_I2C0_ADDR1 ((__IO uint16_t *) REG_I2C0_ADDR1) /* Master Address Byte 1 */ +#define pREG_I2C0_ADDR2 ((__IO uint16_t *) REG_I2C0_ADDR2) /* Master Address Byte 2 */ +#define pREG_I2C0_BYT ((__IO uint16_t *) REG_I2C0_BYT) /* Start Byte */ +#define pREG_I2C0_DIV ((__IO uint16_t *) REG_I2C0_DIV) /* Serial Clock Period Divisor */ +#define pREG_I2C0_SCTL ((__IO uint16_t *) REG_I2C0_SCTL) /* Slave Control */ +#define pREG_I2C0_SSTAT ((__IO uint16_t *) REG_I2C0_SSTAT) /* Slave I2C Status/Error/IRQ */ +#define pREG_I2C0_SRX ((__I __C uint16_t *) REG_I2C0_SRX) /* Slave Receive */ +#define pREG_I2C0_STX ((__IO uint16_t *) REG_I2C0_STX) /* Slave Transmit */ +#define pREG_I2C0_ALT ((__IO uint16_t *) REG_I2C0_ALT) /* Hardware General Call ID */ +#define pREG_I2C0_ID0 ((__IO uint16_t *) REG_I2C0_ID0) /* First Slave Address Device ID */ +#define pREG_I2C0_ID1 ((__IO uint16_t *) REG_I2C0_ID1) /* Second Slave Address Device ID */ +#define pREG_I2C0_ID2 ((__IO uint16_t *) REG_I2C0_ID2) /* Third Slave Address Device ID */ +#define pREG_I2C0_ID3 ((__IO uint16_t *) REG_I2C0_ID3) /* Fourth Slave Address Device ID */ +#define pREG_I2C0_STAT ((__IO uint16_t *) REG_I2C0_STAT) /* Master and Slave FIFO Status */ +#define pREG_I2C0_SHCTL ((__O uint16_t *) REG_I2C0_SHCTL) /* Shared Control */ +#define pREG_I2C0_TCTL ((__IO uint16_t *) REG_I2C0_TCTL) /* Timing Control Register */ +#define pREG_I2C0_ASTRETCH_SCL ((__IO uint16_t *) REG_I2C0_ASTRETCH_SCL) /* Automatic Stretch SCL */ + +/* ================================================================================= + * Serial Peripheral Interface (SPI0) + * ================================================================================= */ +#define pREG_SPI0_STAT ((__IO uint16_t *) REG_SPI0_STAT) /* Status */ +#define pREG_SPI0_RX ((__I __C uint16_t *) REG_SPI0_RX) /* Receive */ +#define pREG_SPI0_TX ((__O uint16_t *) REG_SPI0_TX) /* Transmit */ +#define pREG_SPI0_DIV ((__IO uint16_t *) REG_SPI0_DIV) /* SPI Baud Rate Selection */ +#define pREG_SPI0_CTL ((__IO uint16_t *) REG_SPI0_CTL) /* SPI Configuration */ +#define pREG_SPI0_IEN ((__IO uint16_t *) REG_SPI0_IEN) /* SPI Interrupts Enable */ +#define pREG_SPI0_CNT ((__IO uint16_t *) REG_SPI0_CNT) /* Transfer Byte Count */ +#define pREG_SPI0_DMA ((__IO uint16_t *) REG_SPI0_DMA) /* SPI DMA Enable */ +#define pREG_SPI0_FIFO_STAT ((__I __C uint16_t *) REG_SPI0_FIFO_STAT) /* FIFO Status */ +#define pREG_SPI0_RD_CTL ((__IO uint16_t *) REG_SPI0_RD_CTL) /* Read Control */ +#define pREG_SPI0_FLOW_CTL ((__IO uint16_t *) REG_SPI0_FLOW_CTL) /* Flow Control */ +#define pREG_SPI0_WAIT_TMR ((__IO uint16_t *) REG_SPI0_WAIT_TMR) /* Wait Timer for Flow Control */ +#define pREG_SPI0_CS_CTL ((__IO uint16_t *) REG_SPI0_CS_CTL) /* Chip Select Control for Multi-slave Connections */ +#define pREG_SPI0_CS_OVERRIDE ((__IO uint16_t *) REG_SPI0_CS_OVERRIDE) /* Chip Select Override */ + +/* ================================================================================= + * Serial Peripheral Interface (SPI1) + * ================================================================================= */ +#define pREG_SPI1_STAT ((__IO uint16_t *) REG_SPI1_STAT) /* Status */ +#define pREG_SPI1_RX ((__I __C uint16_t *) REG_SPI1_RX) /* Receive */ +#define pREG_SPI1_TX ((__O uint16_t *) REG_SPI1_TX) /* Transmit */ +#define pREG_SPI1_DIV ((__IO uint16_t *) REG_SPI1_DIV) /* SPI Baud Rate Selection */ +#define pREG_SPI1_CTL ((__IO uint16_t *) REG_SPI1_CTL) /* SPI Configuration */ +#define pREG_SPI1_IEN ((__IO uint16_t *) REG_SPI1_IEN) /* SPI Interrupts Enable */ +#define pREG_SPI1_CNT ((__IO uint16_t *) REG_SPI1_CNT) /* Transfer Byte Count */ +#define pREG_SPI1_DMA ((__IO uint16_t *) REG_SPI1_DMA) /* SPI DMA Enable */ +#define pREG_SPI1_FIFO_STAT ((__I __C uint16_t *) REG_SPI1_FIFO_STAT) /* FIFO Status */ +#define pREG_SPI1_RD_CTL ((__IO uint16_t *) REG_SPI1_RD_CTL) /* Read Control */ +#define pREG_SPI1_FLOW_CTL ((__IO uint16_t *) REG_SPI1_FLOW_CTL) /* Flow Control */ +#define pREG_SPI1_WAIT_TMR ((__IO uint16_t *) REG_SPI1_WAIT_TMR) /* Wait Timer for Flow Control */ +#define pREG_SPI1_CS_CTL ((__IO uint16_t *) REG_SPI1_CS_CTL) /* Chip Select Control for Multi-slave Connections */ +#define pREG_SPI1_CS_OVERRIDE ((__IO uint16_t *) REG_SPI1_CS_OVERRIDE) /* Chip Select Override */ + +/* ================================================================================= + * Serial Peripheral Interface (SPI2) + * ================================================================================= */ +#define pREG_SPI2_STAT ((__IO uint16_t *) REG_SPI2_STAT) /* Status */ +#define pREG_SPI2_RX ((__I __C uint16_t *) REG_SPI2_RX) /* Receive */ +#define pREG_SPI2_TX ((__O uint16_t *) REG_SPI2_TX) /* Transmit */ +#define pREG_SPI2_DIV ((__IO uint16_t *) REG_SPI2_DIV) /* SPI Baud Rate Selection */ +#define pREG_SPI2_CTL ((__IO uint16_t *) REG_SPI2_CTL) /* SPI Configuration */ +#define pREG_SPI2_IEN ((__IO uint16_t *) REG_SPI2_IEN) /* SPI Interrupts Enable */ +#define pREG_SPI2_CNT ((__IO uint16_t *) REG_SPI2_CNT) /* Transfer Byte Count */ +#define pREG_SPI2_DMA ((__IO uint16_t *) REG_SPI2_DMA) /* SPI DMA Enable */ +#define pREG_SPI2_FIFO_STAT ((__I __C uint16_t *) REG_SPI2_FIFO_STAT) /* FIFO Status */ +#define pREG_SPI2_RD_CTL ((__IO uint16_t *) REG_SPI2_RD_CTL) /* Read Control */ +#define pREG_SPI2_FLOW_CTL ((__IO uint16_t *) REG_SPI2_FLOW_CTL) /* Flow Control */ +#define pREG_SPI2_WAIT_TMR ((__IO uint16_t *) REG_SPI2_WAIT_TMR) /* Wait Timer for Flow Control */ +#define pREG_SPI2_CS_CTL ((__IO uint16_t *) REG_SPI2_CS_CTL) /* Chip Select Control for Multi-slave Connections */ +#define pREG_SPI2_CS_OVERRIDE ((__IO uint16_t *) REG_SPI2_CS_OVERRIDE) /* Chip Select Override */ + +/* ================================================================================= + * (UART0) + * ================================================================================= */ +#define pREG_UART0_TX ((__O uint16_t *) REG_UART0_TX) /* Transmit Holding Register */ +#define pREG_UART0_RX ((__I __C uint16_t *) REG_UART0_RX) /* Receive Buffer Register */ +#define pREG_UART0_IEN ((__IO uint16_t *) REG_UART0_IEN) /* Interrupt Enable */ +#define pREG_UART0_IIR ((__I __C uint16_t *) REG_UART0_IIR) /* Interrupt ID */ +#define pREG_UART0_LCR ((__IO uint16_t *) REG_UART0_LCR) /* Line Control */ +#define pREG_UART0_MCR ((__IO uint16_t *) REG_UART0_MCR) /* Modem Control */ +#define pREG_UART0_LSR ((__I __C uint16_t *) REG_UART0_LSR) /* Line Status */ +#define pREG_UART0_MSR ((__I __C uint16_t *) REG_UART0_MSR) /* Modem Status */ +#define pREG_UART0_SCR ((__IO uint16_t *) REG_UART0_SCR) /* Scratch Buffer */ +#define pREG_UART0_FCR ((__IO uint16_t *) REG_UART0_FCR) /* FIFO Control */ +#define pREG_UART0_FBR ((__IO uint16_t *) REG_UART0_FBR) /* Fractional Baud Rate */ +#define pREG_UART0_DIV ((__IO uint16_t *) REG_UART0_DIV) /* Baud Rate Divider */ +#define pREG_UART0_LCR2 ((__IO uint16_t *) REG_UART0_LCR2) /* Second Line Control */ +#define pREG_UART0_CTL ((__IO uint16_t *) REG_UART0_CTL) /* UART Control Register */ +#define pREG_UART0_RFC ((__I __C uint16_t *) REG_UART0_RFC) /* RX FIFO Byte Count */ +#define pREG_UART0_TFC ((__I __C uint16_t *) REG_UART0_TFC) /* TX FIFO Byte Count */ +#define pREG_UART0_RSC ((__IO uint16_t *) REG_UART0_RSC) /* RS485 Half-duplex Control */ +#define pREG_UART0_ACR ((__IO uint16_t *) REG_UART0_ACR) /* Auto Baud Control */ +#define pREG_UART0_ASRL ((__I __C uint16_t *) REG_UART0_ASRL) /* Auto Baud Status (Low) */ +#define pREG_UART0_ASRH ((__I __C uint16_t *) REG_UART0_ASRH) /* Auto Baud Status (High) */ + +/* ================================================================================= + * (UART1) + * ================================================================================= */ +#define pREG_UART1_RX ((__I __C uint16_t *) REG_UART1_RX) /* Receive Buffer Register */ +#define pREG_UART1_TX ((__O uint16_t *) REG_UART1_TX) /* Transmit Holding Register */ +#define pREG_UART1_IEN ((__IO uint16_t *) REG_UART1_IEN) /* Interrupt Enable */ +#define pREG_UART1_IIR ((__I __C uint16_t *) REG_UART1_IIR) /* Interrupt ID */ +#define pREG_UART1_LCR ((__IO uint16_t *) REG_UART1_LCR) /* Line Control */ +#define pREG_UART1_MCR ((__IO uint16_t *) REG_UART1_MCR) /* Modem Control */ +#define pREG_UART1_LSR ((__I __C uint16_t *) REG_UART1_LSR) /* Line Status */ +#define pREG_UART1_MSR ((__I __C uint16_t *) REG_UART1_MSR) /* Modem Status */ +#define pREG_UART1_SCR ((__IO uint16_t *) REG_UART1_SCR) /* Scratch Buffer */ +#define pREG_UART1_FCR ((__IO uint16_t *) REG_UART1_FCR) /* FIFO Control */ +#define pREG_UART1_FBR ((__IO uint16_t *) REG_UART1_FBR) /* Fractional Baud Rate */ +#define pREG_UART1_DIV ((__IO uint16_t *) REG_UART1_DIV) /* Baud Rate Divider */ +#define pREG_UART1_LCR2 ((__IO uint16_t *) REG_UART1_LCR2) /* Second Line Control */ +#define pREG_UART1_CTL ((__IO uint16_t *) REG_UART1_CTL) /* UART Control Register */ +#define pREG_UART1_RFC ((__I __C uint16_t *) REG_UART1_RFC) /* RX FIFO Byte Count */ +#define pREG_UART1_TFC ((__I __C uint16_t *) REG_UART1_TFC) /* TX FIFO Byte Count */ +#define pREG_UART1_RSC ((__IO uint16_t *) REG_UART1_RSC) /* RS485 Half-duplex Control */ +#define pREG_UART1_ACR ((__IO uint16_t *) REG_UART1_ACR) /* Auto Baud Control */ +#define pREG_UART1_ASRL ((__I __C uint16_t *) REG_UART1_ASRL) /* Auto Baud Status (Low) */ +#define pREG_UART1_ASRH ((__I __C uint16_t *) REG_UART1_ASRH) /* Auto Baud Status (High) */ + +/* ================================================================================= + * Beeper Driver (BEEP0) + * ================================================================================= */ +#define pREG_BEEP0_CFG ((__IO uint16_t *) REG_BEEP0_CFG) /* Beeper Configuration */ +#define pREG_BEEP0_STAT ((__IO uint16_t *) REG_BEEP0_STAT) /* Beeper Status */ +#define pREG_BEEP0_TONEA ((__IO uint16_t *) REG_BEEP0_TONEA) /* Tone A Data */ +#define pREG_BEEP0_TONEB ((__IO uint16_t *) REG_BEEP0_TONEB) /* Tone B Data */ + +/* ================================================================================= + * (ADC0) + * ================================================================================= */ +#define pREG_ADC0_CFG ((__IO uint16_t *) REG_ADC0_CFG) /* ADC Configuration */ +#define pREG_ADC0_PWRUP ((__IO uint16_t *) REG_ADC0_PWRUP) /* ADC Power-up Time */ +#define pREG_ADC0_CAL_WORD ((__IO uint16_t *) REG_ADC0_CAL_WORD) /* Calibration Word */ +#define pREG_ADC0_CNV_CFG ((__IO uint16_t *) REG_ADC0_CNV_CFG) /* ADC Conversion Configuration */ +#define pREG_ADC0_CNV_TIME ((__IO uint16_t *) REG_ADC0_CNV_TIME) /* ADC Conversion Time */ +#define pREG_ADC0_AVG_CFG ((__IO uint16_t *) REG_ADC0_AVG_CFG) /* Averaging Configuration */ +#define pREG_ADC0_IRQ_EN ((__IO uint16_t *) REG_ADC0_IRQ_EN) /* Interrupt Enable */ +#define pREG_ADC0_STAT ((__IO uint16_t *) REG_ADC0_STAT) /* ADC Status */ +#define pREG_ADC0_OVF ((__IO uint16_t *) REG_ADC0_OVF) /* Overflow of Output Registers */ +#define pREG_ADC0_ALERT ((__IO uint16_t *) REG_ADC0_ALERT) /* Alert Indication */ +#define pREG_ADC0_CH0_OUT ((__I __C uint16_t *) REG_ADC0_CH0_OUT) /* Conversion Result Channel 0 */ +#define pREG_ADC0_CH1_OUT ((__I __C uint16_t *) REG_ADC0_CH1_OUT) /* Conversion Result Channel 1 */ +#define pREG_ADC0_CH2_OUT ((__I __C uint16_t *) REG_ADC0_CH2_OUT) /* Conversion Result Channel 2 */ +#define pREG_ADC0_CH3_OUT ((__I __C uint16_t *) REG_ADC0_CH3_OUT) /* Conversion Result Channel 3 */ +#define pREG_ADC0_CH4_OUT ((__I __C uint16_t *) REG_ADC0_CH4_OUT) /* Conversion Result Channel 4 */ +#define pREG_ADC0_CH5_OUT ((__I __C uint16_t *) REG_ADC0_CH5_OUT) /* Conversion Result Channel 5 */ +#define pREG_ADC0_CH6_OUT ((__I __C uint16_t *) REG_ADC0_CH6_OUT) /* Conversion Result Channel 6 */ +#define pREG_ADC0_CH7_OUT ((__I __C uint16_t *) REG_ADC0_CH7_OUT) /* Conversion Result Channel 7 */ +#define pREG_ADC0_BAT_OUT ((__I __C uint16_t *) REG_ADC0_BAT_OUT) /* Battery Monitoring Result */ +#define pREG_ADC0_TMP_OUT ((__I __C uint16_t *) REG_ADC0_TMP_OUT) /* Temperature Result */ +#define pREG_ADC0_TMP2_OUT ((__I __C uint16_t *) REG_ADC0_TMP2_OUT) /* Temperature Result 2 */ +#define pREG_ADC0_DMA_OUT ((__I __C uint16_t *) REG_ADC0_DMA_OUT) /* DMA Output Register */ +#define pREG_ADC0_LIM0_LO ((__IO uint16_t *) REG_ADC0_LIM0_LO) /* Channel 0 Low Limit */ +#define pREG_ADC0_LIM0_HI ((__IO uint16_t *) REG_ADC0_LIM0_HI) /* Channel 0 High Limit */ +#define pREG_ADC0_HYS0 ((__IO uint16_t *) REG_ADC0_HYS0) /* Channel 0 Hysteresis */ +#define pREG_ADC0_LIM1_LO ((__IO uint16_t *) REG_ADC0_LIM1_LO) /* Channel 1 Low Limit */ +#define pREG_ADC0_LIM1_HI ((__IO uint16_t *) REG_ADC0_LIM1_HI) /* Channel 1 High Limit */ +#define pREG_ADC0_HYS1 ((__IO uint16_t *) REG_ADC0_HYS1) /* Channel 1 Hysteresis */ +#define pREG_ADC0_LIM2_LO ((__IO uint16_t *) REG_ADC0_LIM2_LO) /* Channel 2 Low Limit */ +#define pREG_ADC0_LIM2_HI ((__IO uint16_t *) REG_ADC0_LIM2_HI) /* Channel 2 High Limit */ +#define pREG_ADC0_HYS2 ((__IO uint16_t *) REG_ADC0_HYS2) /* Channel 2 Hysteresis */ +#define pREG_ADC0_LIM3_LO ((__IO uint16_t *) REG_ADC0_LIM3_LO) /* Channel 3 Low Limit */ +#define pREG_ADC0_LIM3_HI ((__IO uint16_t *) REG_ADC0_LIM3_HI) /* Channel 3 High Limit */ +#define pREG_ADC0_HYS3 ((__IO uint16_t *) REG_ADC0_HYS3) /* Channel 3 Hysteresis */ +#define pREG_ADC0_CFG1 ((__IO uint16_t *) REG_ADC0_CFG1) /* Reference Buffer Low Power Mode */ + +/* ================================================================================= + * DMA (DMA0) + * ================================================================================= */ +#define pREG_DMA0_STAT ((__I __C uint32_t *) REG_DMA0_STAT) /* DMA Status */ +#define pREG_DMA0_CFG ((__O uint32_t *) REG_DMA0_CFG) /* DMA Configuration */ +#define pREG_DMA0_PDBPTR ((__IO uint32_t *) REG_DMA0_PDBPTR) /* DMA Channel Primary Control Database Pointer */ +#define pREG_DMA0_ADBPTR ((__I __C uint32_t *) REG_DMA0_ADBPTR) /* DMA Channel Alternate Control Database Pointer */ +#define pREG_DMA0_SWREQ ((__O uint32_t *) REG_DMA0_SWREQ) /* DMA Channel Software Request */ +#define pREG_DMA0_RMSK_SET ((__IO uint32_t *) REG_DMA0_RMSK_SET) /* DMA Channel Request Mask Set */ +#define pREG_DMA0_RMSK_CLR ((__O uint32_t *) REG_DMA0_RMSK_CLR) /* DMA Channel Request Mask Clear */ +#define pREG_DMA0_EN_SET ((__IO uint32_t *) REG_DMA0_EN_SET) /* DMA Channel Enable Set */ +#define pREG_DMA0_EN_CLR ((__O uint32_t *) REG_DMA0_EN_CLR) /* DMA Channel Enable Clear */ +#define pREG_DMA0_ALT_SET ((__IO uint32_t *) REG_DMA0_ALT_SET) /* DMA Channel Primary Alternate Set */ +#define pREG_DMA0_ALT_CLR ((__O uint32_t *) REG_DMA0_ALT_CLR) /* DMA Channel Primary Alternate Clear */ +#define pREG_DMA0_PRI_SET ((__O uint32_t *) REG_DMA0_PRI_SET) /* DMA Channel Priority Set */ +#define pREG_DMA0_PRI_CLR ((__O uint32_t *) REG_DMA0_PRI_CLR) /* DMA Channel Priority Clear */ +#define pREG_DMA0_ERRCHNL_CLR ((__IO uint32_t *) REG_DMA0_ERRCHNL_CLR) /* DMA per Channel Error Clear */ +#define pREG_DMA0_ERR_CLR ((__IO uint32_t *) REG_DMA0_ERR_CLR) /* DMA Bus Error Clear */ +#define pREG_DMA0_INVALIDDESC_CLR ((__IO uint32_t *) REG_DMA0_INVALIDDESC_CLR) /* DMA per Channel Invalid Descriptor Clear */ +#define pREG_DMA0_BS_SET ((__IO uint32_t *) REG_DMA0_BS_SET) /* DMA Channel Bytes Swap Enable Set */ +#define pREG_DMA0_BS_CLR ((__O uint32_t *) REG_DMA0_BS_CLR) /* DMA Channel Bytes Swap Enable Clear */ +#define pREG_DMA0_SRCADDR_SET ((__IO uint32_t *) REG_DMA0_SRCADDR_SET) /* DMA Channel Source Address Decrement Enable Set */ +#define pREG_DMA0_SRCADDR_CLR ((__O uint32_t *) REG_DMA0_SRCADDR_CLR) /* DMA Channel Source Address Decrement Enable Clear */ +#define pREG_DMA0_DSTADDR_SET ((__IO uint32_t *) REG_DMA0_DSTADDR_SET) /* DMA Channel Destination Address Decrement Enable Set */ +#define pREG_DMA0_DSTADDR_CLR ((__O uint32_t *) REG_DMA0_DSTADDR_CLR) /* DMA Channel Destination Address Decrement Enable Clear */ +#define pREG_DMA0_REVID ((__I __C uint32_t *) REG_DMA0_REVID) /* DMA Controller Revision ID */ + +/* ================================================================================= + * Flash Controller (FLCC0) + * ================================================================================= */ +#define pREG_FLCC0_STAT ((__IO uint32_t *) REG_FLCC0_STAT) /* Status */ +#define pREG_FLCC0_IEN ((__IO uint32_t *) REG_FLCC0_IEN) /* Interrupt Enable */ +#define pREG_FLCC0_CMD ((__IO uint32_t *) REG_FLCC0_CMD) /* Command */ +#define pREG_FLCC0_KH_ADDR ((__IO uint32_t *) REG_FLCC0_KH_ADDR) /* Write Address */ +#define pREG_FLCC0_KH_DATA0 ((__IO uint32_t *) REG_FLCC0_KH_DATA0) /* Write Lower Data */ +#define pREG_FLCC0_KH_DATA1 ((__IO uint32_t *) REG_FLCC0_KH_DATA1) /* Write Upper Data */ +#define pREG_FLCC0_PAGE_ADDR0 ((__IO uint32_t *) REG_FLCC0_PAGE_ADDR0) /* Lower Page Address */ +#define pREG_FLCC0_PAGE_ADDR1 ((__IO uint32_t *) REG_FLCC0_PAGE_ADDR1) /* Upper Page Address */ +#define pREG_FLCC0_KEY ((__O uint32_t *) REG_FLCC0_KEY) /* Key */ +#define pREG_FLCC0_WR_ABORT_ADDR ((__I __C uint32_t *) REG_FLCC0_WR_ABORT_ADDR) /* Write Abort Address */ +#define pREG_FLCC0_WRPROT ((__IO uint32_t *) REG_FLCC0_WRPROT) /* Write Protection */ +#define pREG_FLCC0_SIGNATURE ((__I __C uint32_t *) REG_FLCC0_SIGNATURE) /* Signature */ +#define pREG_FLCC0_UCFG ((__IO uint32_t *) REG_FLCC0_UCFG) /* User Configuration */ +#define pREG_FLCC0_TIME_PARAM0 ((__IO uint32_t *) REG_FLCC0_TIME_PARAM0) /* Time Parameter 0 */ +#define pREG_FLCC0_TIME_PARAM1 ((__IO uint32_t *) REG_FLCC0_TIME_PARAM1) /* Time Parameter 1 */ +#define pREG_FLCC0_ABORT_EN_LO ((__IO uint32_t *) REG_FLCC0_ABORT_EN_LO) /* IRQ Abort Enable (Lower Bits) */ +#define pREG_FLCC0_ABORT_EN_HI ((__IO uint32_t *) REG_FLCC0_ABORT_EN_HI) /* IRQ Abort Enable (Upper Bits) */ +#define pREG_FLCC0_ECC_CFG ((__IO uint32_t *) REG_FLCC0_ECC_CFG) /* ECC Configuration */ +#define pREG_FLCC0_ECC_ADDR ((__I __C uint32_t *) REG_FLCC0_ECC_ADDR) /* ECC Status (Address) */ +#define pREG_FLCC0_POR_SEC ((__IO uint32_t *) REG_FLCC0_POR_SEC) /* Flash Security */ +#define pREG_FLCC0_VOL_CFG ((__IO uint32_t *) REG_FLCC0_VOL_CFG) /* Volatile Flash Configuration */ + +/* ================================================================================= + * Cache Controller (FLCC0_CACHE) + * ================================================================================= */ +#define pREG_FLCC0_CACHE_STAT ((__I __C uint32_t *) REG_FLCC0_CACHE_STAT) /* Cache Status Register */ +#define pREG_FLCC0_CACHE_SETUP ((__IO uint32_t *) REG_FLCC0_CACHE_SETUP) /* Cache Setup Register */ +#define pREG_FLCC0_CACHE_KEY ((__O uint32_t *) REG_FLCC0_CACHE_KEY) /* Cache Key Register */ + +/* ================================================================================= + * (GPIO0) + * ================================================================================= */ +#define pREG_GPIO0_CFG ((__IO uint32_t *) REG_GPIO0_CFG) /* Port Configuration */ +#define pREG_GPIO0_OEN ((__IO uint16_t *) REG_GPIO0_OEN) /* Port Output Enable */ +#define pREG_GPIO0_PE ((__IO uint16_t *) REG_GPIO0_PE) /* Port Output Pull-up/Pull-down Enable */ +#define pREG_GPIO0_IEN ((__IO uint16_t *) REG_GPIO0_IEN) /* Port Input Path Enable */ +#define pREG_GPIO0_IN ((__I __C uint16_t *) REG_GPIO0_IN) /* Port Registered Data Input */ +#define pREG_GPIO0_OUT ((__IO uint16_t *) REG_GPIO0_OUT) /* Port Data Output */ +#define pREG_GPIO0_SET ((__O uint16_t *) REG_GPIO0_SET) /* Port Data Out Set */ +#define pREG_GPIO0_CLR ((__O uint16_t *) REG_GPIO0_CLR) /* Port Data Out Clear */ +#define pREG_GPIO0_TGL ((__O uint16_t *) REG_GPIO0_TGL) /* Port Pin Toggle */ +#define pREG_GPIO0_POL ((__IO uint16_t *) REG_GPIO0_POL) /* Port Interrupt Polarity */ +#define pREG_GPIO0_IENA ((__IO uint16_t *) REG_GPIO0_IENA) /* Port Interrupt A Enable */ +#define pREG_GPIO0_IENB ((__IO uint16_t *) REG_GPIO0_IENB) /* Port Interrupt B Enable */ +#define pREG_GPIO0_INT ((__IO uint16_t *) REG_GPIO0_INT) /* Port Interrupt Status */ +#define pREG_GPIO0_DS ((__IO uint16_t *) REG_GPIO0_DS) /* Port Drive Strength Select */ + +/* ================================================================================= + * (GPIO1) + * ================================================================================= */ +#define pREG_GPIO1_CFG ((__IO uint32_t *) REG_GPIO1_CFG) /* Port Configuration */ +#define pREG_GPIO1_OEN ((__IO uint16_t *) REG_GPIO1_OEN) /* Port Output Enable */ +#define pREG_GPIO1_PE ((__IO uint16_t *) REG_GPIO1_PE) /* Port Output Pull-up/Pull-down Enable */ +#define pREG_GPIO1_IEN ((__IO uint16_t *) REG_GPIO1_IEN) /* Port Input Path Enable */ +#define pREG_GPIO1_IN ((__I __C uint16_t *) REG_GPIO1_IN) /* Port Registered Data Input */ +#define pREG_GPIO1_OUT ((__IO uint16_t *) REG_GPIO1_OUT) /* Port Data Output */ +#define pREG_GPIO1_SET ((__O uint16_t *) REG_GPIO1_SET) /* Port Data Out Set */ +#define pREG_GPIO1_CLR ((__O uint16_t *) REG_GPIO1_CLR) /* Port Data Out Clear */ +#define pREG_GPIO1_TGL ((__O uint16_t *) REG_GPIO1_TGL) /* Port Pin Toggle */ +#define pREG_GPIO1_POL ((__IO uint16_t *) REG_GPIO1_POL) /* Port Interrupt Polarity */ +#define pREG_GPIO1_IENA ((__IO uint16_t *) REG_GPIO1_IENA) /* Port Interrupt A Enable */ +#define pREG_GPIO1_IENB ((__IO uint16_t *) REG_GPIO1_IENB) /* Port Interrupt B Enable */ +#define pREG_GPIO1_INT ((__IO uint16_t *) REG_GPIO1_INT) /* Port Interrupt Status */ +#define pREG_GPIO1_DS ((__IO uint16_t *) REG_GPIO1_DS) /* Port Drive Strength Select */ + +/* ================================================================================= + * (GPIO2) + * ================================================================================= */ +#define pREG_GPIO2_CFG ((__IO uint32_t *) REG_GPIO2_CFG) /* Port Configuration */ +#define pREG_GPIO2_OEN ((__IO uint16_t *) REG_GPIO2_OEN) /* Port Output Enable */ +#define pREG_GPIO2_PE ((__IO uint16_t *) REG_GPIO2_PE) /* Port Output Pull-up/Pull-down Enable */ +#define pREG_GPIO2_IEN ((__IO uint16_t *) REG_GPIO2_IEN) /* Port Input Path Enable */ +#define pREG_GPIO2_IN ((__I __C uint16_t *) REG_GPIO2_IN) /* Port Registered Data Input */ +#define pREG_GPIO2_OUT ((__IO uint16_t *) REG_GPIO2_OUT) /* Port Data Output */ +#define pREG_GPIO2_SET ((__O uint16_t *) REG_GPIO2_SET) /* Port Data Out Set */ +#define pREG_GPIO2_CLR ((__O uint16_t *) REG_GPIO2_CLR) /* Port Data Out Clear */ +#define pREG_GPIO2_TGL ((__O uint16_t *) REG_GPIO2_TGL) /* Port Pin Toggle */ +#define pREG_GPIO2_POL ((__IO uint16_t *) REG_GPIO2_POL) /* Port Interrupt Polarity */ +#define pREG_GPIO2_IENA ((__IO uint16_t *) REG_GPIO2_IENA) /* Port Interrupt A Enable */ +#define pREG_GPIO2_IENB ((__IO uint16_t *) REG_GPIO2_IENB) /* Port Interrupt B Enable */ +#define pREG_GPIO2_INT ((__IO uint16_t *) REG_GPIO2_INT) /* Port Interrupt Status */ +#define pREG_GPIO2_DS ((__IO uint16_t *) REG_GPIO2_DS) /* Port Drive Strength Select */ + +/* ================================================================================= + * (GPIO3) + * ================================================================================= */ +#define pREG_GPIO3_CFG ((__IO uint32_t *) REG_GPIO3_CFG) /* Port Configuration */ +#define pREG_GPIO3_OEN ((__IO uint16_t *) REG_GPIO3_OEN) /* Port Output Enable */ +#define pREG_GPIO3_PE ((__IO uint16_t *) REG_GPIO3_PE) /* Port Output Pull-up/Pull-down Enable */ +#define pREG_GPIO3_IEN ((__IO uint16_t *) REG_GPIO3_IEN) /* Port Input Path Enable */ +#define pREG_GPIO3_IN ((__I __C uint16_t *) REG_GPIO3_IN) /* Port Registered Data Input */ +#define pREG_GPIO3_OUT ((__IO uint16_t *) REG_GPIO3_OUT) /* Port Data Output */ +#define pREG_GPIO3_SET ((__O uint16_t *) REG_GPIO3_SET) /* Port Data Out Set */ +#define pREG_GPIO3_CLR ((__O uint16_t *) REG_GPIO3_CLR) /* Port Data Out Clear */ +#define pREG_GPIO3_TGL ((__O uint16_t *) REG_GPIO3_TGL) /* Port Pin Toggle */ +#define pREG_GPIO3_POL ((__IO uint16_t *) REG_GPIO3_POL) /* Port Interrupt Polarity */ +#define pREG_GPIO3_IENA ((__IO uint16_t *) REG_GPIO3_IENA) /* Port Interrupt A Enable */ +#define pREG_GPIO3_IENB ((__IO uint16_t *) REG_GPIO3_IENB) /* Port Interrupt B Enable */ +#define pREG_GPIO3_INT ((__IO uint16_t *) REG_GPIO3_INT) /* Port Interrupt Status */ +#define pREG_GPIO3_DS ((__IO uint16_t *) REG_GPIO3_DS) /* Port Drive Strength Select */ + +/* ================================================================================= + * Serial Port (SPORT0) + * ================================================================================= */ +#define pREG_SPORT0_CTL_A ((__IO uint32_t *) REG_SPORT0_CTL_A) /* Half SPORT 'A' Control Register */ +#define pREG_SPORT0_DIV_A ((__IO uint32_t *) REG_SPORT0_DIV_A) /* Half SPORT 'A' Divisor Register */ +#define pREG_SPORT0_IEN_A ((__IO uint32_t *) REG_SPORT0_IEN_A) /* Half SPORT A's Interrupt Enable register */ +#define pREG_SPORT0_STAT_A ((__IO uint32_t *) REG_SPORT0_STAT_A) /* Half SPORT 'A' Status register */ +#define pREG_SPORT0_NUMTRAN_A ((__IO uint32_t *) REG_SPORT0_NUMTRAN_A) /* Half SPORT A Number of transfers register */ +#define pREG_SPORT0_CNVT_A ((__IO uint32_t *) REG_SPORT0_CNVT_A) /* Half SPORT 'A' CNV width */ +#define pREG_SPORT0_TX_A ((__O uint32_t *) REG_SPORT0_TX_A) /* Half SPORT 'A' Tx Buffer Register */ +#define pREG_SPORT0_RX_A ((__I __C uint32_t *) REG_SPORT0_RX_A) /* Half SPORT 'A' Rx Buffer Register */ +#define pREG_SPORT0_CTL_B ((__IO uint32_t *) REG_SPORT0_CTL_B) /* Half SPORT 'B' Control Register */ +#define pREG_SPORT0_DIV_B ((__IO uint32_t *) REG_SPORT0_DIV_B) /* Half SPORT 'B' Divisor Register */ +#define pREG_SPORT0_IEN_B ((__IO uint32_t *) REG_SPORT0_IEN_B) /* Half SPORT B's Interrupt Enable register */ +#define pREG_SPORT0_STAT_B ((__IO uint32_t *) REG_SPORT0_STAT_B) /* Half SPORT 'B' Status register */ +#define pREG_SPORT0_NUMTRAN_B ((__IO uint32_t *) REG_SPORT0_NUMTRAN_B) /* Half SPORT B Number of transfers register */ +#define pREG_SPORT0_CNVT_B ((__IO uint32_t *) REG_SPORT0_CNVT_B) /* Half SPORT 'B' CNV width register */ +#define pREG_SPORT0_TX_B ((__O uint32_t *) REG_SPORT0_TX_B) /* Half SPORT 'B' Tx Buffer Register */ +#define pREG_SPORT0_RX_B ((__I __C uint32_t *) REG_SPORT0_RX_B) /* Half SPORT 'B' Rx Buffer Register */ + +/* ================================================================================= + * CRC Accelerator (CRC0) + * ================================================================================= */ +#define pREG_CRC0_CTL ((__IO uint32_t *) REG_CRC0_CTL) /* CRC Control */ +#define pREG_CRC0_IPDATA ((__O uint32_t *) REG_CRC0_IPDATA) /* Input Data Word */ +#define pREG_CRC0_RESULT ((__IO uint32_t *) REG_CRC0_RESULT) /* CRC Result */ +#define pREG_CRC0_POLY ((__IO uint32_t *) REG_CRC0_POLY) /* Programmable CRC Polynomial */ +#define pREG_CRC0_IPBYTE ((__O uint8_t *) REG_CRC0_IPBYTE) /* Input Data Byte */ +#define pREG_CRC0_IPBITS0 ((__O uint8_t *) REG_CRC0_IPBITS0) /* Input Data Bits */ +#define pREG_CRC0_IPBITS1 ((__O uint8_t *) REG_CRC0_IPBITS1) /* Input Data Bits */ +#define pREG_CRC0_IPBITS2 ((__O uint8_t *) REG_CRC0_IPBITS2) /* Input Data Bits */ +#define pREG_CRC0_IPBITS3 ((__O uint8_t *) REG_CRC0_IPBITS3) /* Input Data Bits */ +#define pREG_CRC0_IPBITS4 ((__O uint8_t *) REG_CRC0_IPBITS4) /* Input Data Bits */ +#define pREG_CRC0_IPBITS5 ((__O uint8_t *) REG_CRC0_IPBITS5) /* Input Data Bits */ +#define pREG_CRC0_IPBITS6 ((__O uint8_t *) REG_CRC0_IPBITS6) /* Input Data Bits */ +#define pREG_CRC0_IPBITS7 ((__O uint8_t *) REG_CRC0_IPBITS7) /* Input Data Bits */ + +/* ================================================================================= + * Random Number Generator (RNG0) + * ================================================================================= */ +#define pREG_RNG0_CTL ((__IO uint16_t *) REG_RNG0_CTL) /* RNG Control Register */ +#define pREG_RNG0_LEN ((__IO uint16_t *) REG_RNG0_LEN) /* RNG Sample Length Register */ +#define pREG_RNG0_STAT ((__IO uint16_t *) REG_RNG0_STAT) /* RNG Status Register */ +#define pREG_RNG0_DATA ((__I __C uint32_t *) REG_RNG0_DATA) /* RNG Data Register */ +#define pREG_RNG0_OSCCNT ((__I __C uint32_t *) REG_RNG0_OSCCNT) /* Oscillator Count */ +#define pREG_RNG0_OSCDIFF0 ((__I __C int8_t *) REG_RNG0_OSCDIFF0) /* Oscillator Difference */ +#define pREG_RNG0_OSCDIFF1 ((__I __C int8_t *) REG_RNG0_OSCDIFF1) /* Oscillator Difference */ +#define pREG_RNG0_OSCDIFF2 ((__I __C int8_t *) REG_RNG0_OSCDIFF2) /* Oscillator Difference */ +#define pREG_RNG0_OSCDIFF3 ((__I __C int8_t *) REG_RNG0_OSCDIFF3) /* Oscillator Difference */ + +/* ================================================================================= + * Register Map for the Crypto Block (CRYPT0) + * ================================================================================= */ +#define pREG_CRYPT0_CFG ((__IO uint32_t *) REG_CRYPT0_CFG) /* Configuration Register */ +#define pREG_CRYPT0_DATALEN ((__IO uint32_t *) REG_CRYPT0_DATALEN) /* Payload Data Length */ +#define pREG_CRYPT0_PREFIXLEN ((__IO uint32_t *) REG_CRYPT0_PREFIXLEN) /* Authentication Data Length */ +#define pREG_CRYPT0_INTEN ((__IO uint32_t *) REG_CRYPT0_INTEN) /* Interrupt Enable Register */ +#define pREG_CRYPT0_STAT ((__IO uint32_t *) REG_CRYPT0_STAT) /* Status Register */ +#define pREG_CRYPT0_INBUF ((__O uint32_t *) REG_CRYPT0_INBUF) /* Input Buffer */ +#define pREG_CRYPT0_OUTBUF ((__I __C uint32_t *) REG_CRYPT0_OUTBUF) /* Output Buffer */ +#define pREG_CRYPT0_NONCE0 ((__IO uint32_t *) REG_CRYPT0_NONCE0) /* Nonce Bits [31:0] */ +#define pREG_CRYPT0_NONCE1 ((__IO uint32_t *) REG_CRYPT0_NONCE1) /* Nonce Bits [63:32] */ +#define pREG_CRYPT0_NONCE2 ((__IO uint32_t *) REG_CRYPT0_NONCE2) /* Nonce Bits [95:64] */ +#define pREG_CRYPT0_NONCE3 ((__IO uint32_t *) REG_CRYPT0_NONCE3) /* Nonce Bits [127:96] */ +#define pREG_CRYPT0_AESKEY0 ((__O uint32_t *) REG_CRYPT0_AESKEY0) /* AES Key Bits [31:0] */ +#define pREG_CRYPT0_AESKEY1 ((__O uint32_t *) REG_CRYPT0_AESKEY1) /* AES Key Bits [63:32] */ +#define pREG_CRYPT0_AESKEY2 ((__O uint32_t *) REG_CRYPT0_AESKEY2) /* AES Key Bits [95:64] */ +#define pREG_CRYPT0_AESKEY3 ((__O uint32_t *) REG_CRYPT0_AESKEY3) /* AES Key Bits [127:96] */ +#define pREG_CRYPT0_AESKEY4 ((__O uint32_t *) REG_CRYPT0_AESKEY4) /* AES Key Bits [159:128] */ +#define pREG_CRYPT0_AESKEY5 ((__O uint32_t *) REG_CRYPT0_AESKEY5) /* AES Key Bits [191:160] */ +#define pREG_CRYPT0_AESKEY6 ((__O uint32_t *) REG_CRYPT0_AESKEY6) /* AES Key Bits [223:192] */ +#define pREG_CRYPT0_AESKEY7 ((__O uint32_t *) REG_CRYPT0_AESKEY7) /* AES Key Bits [255:224] */ +#define pREG_CRYPT0_CNTRINIT ((__IO uint32_t *) REG_CRYPT0_CNTRINIT) /* Counter Initialization Vector */ +#define pREG_CRYPT0_SHAH0 ((__IO uint32_t *) REG_CRYPT0_SHAH0) /* SHA Bits [31:0] */ +#define pREG_CRYPT0_SHAH1 ((__IO uint32_t *) REG_CRYPT0_SHAH1) /* SHA Bits [63:32] */ +#define pREG_CRYPT0_SHAH2 ((__IO uint32_t *) REG_CRYPT0_SHAH2) /* SHA Bits [95:64] */ +#define pREG_CRYPT0_SHAH3 ((__IO uint32_t *) REG_CRYPT0_SHAH3) /* SHA Bits [127:96] */ +#define pREG_CRYPT0_SHAH4 ((__IO uint32_t *) REG_CRYPT0_SHAH4) /* SHA Bits [159:128] */ +#define pREG_CRYPT0_SHAH5 ((__IO uint32_t *) REG_CRYPT0_SHAH5) /* SHA Bits [191:160] */ +#define pREG_CRYPT0_SHAH6 ((__IO uint32_t *) REG_CRYPT0_SHAH6) /* SHA Bits [223:192] */ +#define pREG_CRYPT0_SHAH7 ((__IO uint32_t *) REG_CRYPT0_SHAH7) /* SHA Bits [255:224] */ +#define pREG_CRYPT0_SHA_LAST_WORD ((__IO uint32_t *) REG_CRYPT0_SHA_LAST_WORD) /* SHA Last Word and Valid Bits Information */ +#define pREG_CRYPT0_CCM_NUM_VALID_BYTES ((__IO uint32_t *) REG_CRYPT0_CCM_NUM_VALID_BYTES) /* NUM_VALID_BYTES */ +#define pREG_CRYPT0_PRKSTORCFG ((__IO uint32_t *) REG_CRYPT0_PRKSTORCFG) /* PRKSTOR Configuration */ +#define pREG_CRYPT0_KUW0 ((__O uint32_t *) REG_CRYPT0_KUW0) /* Key Wrap Unwrap Register 0 */ +#define pREG_CRYPT0_KUW1 ((__O uint32_t *) REG_CRYPT0_KUW1) /* Key Wrap Unwrap Register 1 */ +#define pREG_CRYPT0_KUW2 ((__O uint32_t *) REG_CRYPT0_KUW2) /* Key Wrap Unwrap Register 2 */ +#define pREG_CRYPT0_KUW3 ((__O uint32_t *) REG_CRYPT0_KUW3) /* Key Wrap Unwrap Register 3 */ +#define pREG_CRYPT0_KUW4 ((__O uint32_t *) REG_CRYPT0_KUW4) /* Key Wrap Unwrap Register 4 */ +#define pREG_CRYPT0_KUW5 ((__O uint32_t *) REG_CRYPT0_KUW5) /* Key Wrap Unwrap Register 5 */ +#define pREG_CRYPT0_KUW6 ((__O uint32_t *) REG_CRYPT0_KUW6) /* Key Wrap Unwrap Register 6 */ +#define pREG_CRYPT0_KUW7 ((__O uint32_t *) REG_CRYPT0_KUW7) /* Key Wrap Unwrap Register 7 */ +#define pREG_CRYPT0_KUW8 ((__O uint32_t *) REG_CRYPT0_KUW8) /* Key Wrap Unwrap Register 8 */ +#define pREG_CRYPT0_KUW9 ((__O uint32_t *) REG_CRYPT0_KUW9) /* Key Wrap Unwrap Register 9 */ +#define pREG_CRYPT0_KUW10 ((__O uint32_t *) REG_CRYPT0_KUW10) /* Key Wrap Unwrap Register 10 */ +#define pREG_CRYPT0_KUW11 ((__O uint32_t *) REG_CRYPT0_KUW11) /* Key Wrap Unwrap Register 11 */ +#define pREG_CRYPT0_KUW12 ((__O uint32_t *) REG_CRYPT0_KUW12) /* Key Wrap Unwrap Register 12 */ +#define pREG_CRYPT0_KUW13 ((__O uint32_t *) REG_CRYPT0_KUW13) /* Key Wrap Unwrap Register 13 */ +#define pREG_CRYPT0_KUW14 ((__O uint32_t *) REG_CRYPT0_KUW14) /* Key Wrap Unwrap Register 14 */ +#define pREG_CRYPT0_KUW15 ((__O uint32_t *) REG_CRYPT0_KUW15) /* Key Wrap Unwrap Register 15 */ +#define pREG_CRYPT0_KUWVALSTR1 ((__O uint32_t *) REG_CRYPT0_KUWVALSTR1) /* Key Wrap Unwrap Validation String [63:32] */ +#define pREG_CRYPT0_KUWVALSTR2 ((__O uint32_t *) REG_CRYPT0_KUWVALSTR2) /* Key Wrap Unwrap Validation String [31:0] */ + +/* ================================================================================= + * Power Management (PMG0) + * ================================================================================= */ +#define pREG_PMG0_IEN ((__IO uint32_t *) REG_PMG0_IEN) /* Power Supply Monitor Interrupt Enable */ +#define pREG_PMG0_PSM_STAT ((__IO uint32_t *) REG_PMG0_PSM_STAT) /* Power Supply Monitor Status */ +#define pREG_PMG0_PWRMOD ((__IO uint32_t *) REG_PMG0_PWRMOD) /* Power Mode Register */ +#define pREG_PMG0_PWRKEY ((__O uint32_t *) REG_PMG0_PWRKEY) /* Key Protection for PWRMOD and SRAMRET */ +#define pREG_PMG0_SHDN_STAT ((__I __C uint32_t *) REG_PMG0_SHDN_STAT) /* Shutdown Status Register */ +#define pREG_PMG0_SRAMRET ((__IO uint32_t *) REG_PMG0_SRAMRET) /* Control for Retention SRAM in Hibernate Mode */ +#define pREG_PMG0_TRIM ((__IO uint32_t *) REG_PMG0_TRIM) /* Trimming Bits */ +#define pREG_PMG0_RST_STAT ((__IO uint32_t *) REG_PMG0_RST_STAT) /* Reset Status */ +#define pREG_PMG0_CTL1 ((__IO uint32_t *) REG_PMG0_CTL1) /* HPBUCK Control */ + +/* ================================================================================= + * External interrupt configuration (XINT0) + * ================================================================================= */ +#define pREG_XINT0_CFG0 ((__IO uint32_t *) REG_XINT0_CFG0) /* External Interrupt configuration */ +#define pREG_XINT0_EXT_STAT ((__I __C uint32_t *) REG_XINT0_EXT_STAT) /* External Wakeup Interrupt Status register */ +#define pREG_XINT0_CLR ((__IO uint32_t *) REG_XINT0_CLR) /* External Interrupt clear */ +#define pREG_XINT0_NMICLR ((__IO uint32_t *) REG_XINT0_NMICLR) /* Non-maskable interrupt clear */ + +/* ================================================================================= + * Clocking (CLKG0_OSC) + * ================================================================================= */ +#define pREG_CLKG0_OSC_KEY ((__O uint32_t *) REG_CLKG0_OSC_KEY) /* Key Protection for OSCCTRL */ +#define pREG_CLKG0_OSC_CTL ((__IO uint32_t *) REG_CLKG0_OSC_CTL) /* Oscillator Control */ + +/* ================================================================================= + * Power Management (PMG0_TST) + * ================================================================================= */ +#define pREG_PMG0_TST_SRAM_CTL ((__IO uint32_t *) REG_PMG0_TST_SRAM_CTL) /* Control for SRAM Parity and Instruction SRAM */ +#define pREG_PMG0_TST_SRAM_INITSTAT ((__I __C uint32_t *) REG_PMG0_TST_SRAM_INITSTAT) /* Initialization Status Register */ +#define pREG_PMG0_TST_CLR_LATCH_GPIOS ((__O uint16_t *) REG_PMG0_TST_CLR_LATCH_GPIOS) /* Clear GPIO After Shutdown Mode */ +#define pREG_PMG0_TST_SCRPAD_IMG ((__IO uint32_t *) REG_PMG0_TST_SCRPAD_IMG) /* Scratch Pad Image */ +#define pREG_PMG0_TST_SCRPAD_3V_RD ((__I __C uint32_t *) REG_PMG0_TST_SCRPAD_3V_RD) /* Scratch Pad Saved in Battery Domain */ +#define pREG_PMG0_TST_FAST_SHT_WAKEUP ((__IO uint32_t *) REG_PMG0_TST_FAST_SHT_WAKEUP) /* Fast Shutdown Wake-up Enable */ + +/* ================================================================================= + * Clocking (CLKG0_CLK) + * ================================================================================= */ +#define pREG_CLKG0_CLK_CTL0 ((__IO uint32_t *) REG_CLKG0_CLK_CTL0) /* Misc Clock Settings */ +#define pREG_CLKG0_CLK_CTL1 ((__IO uint32_t *) REG_CLKG0_CLK_CTL1) /* Clock Dividers */ +#define pREG_CLKG0_CLK_CTL2 ((__IO uint32_t *) REG_CLKG0_CLK_CTL2) /* HF Oscillator Divided Clock Select */ +#define pREG_CLKG0_CLK_CTL3 ((__IO uint32_t *) REG_CLKG0_CLK_CTL3) /* System PLL */ +#define pREG_CLKG0_CLK_CTL5 ((__IO uint32_t *) REG_CLKG0_CLK_CTL5) /* User Clock Gating Control */ +#define pREG_CLKG0_CLK_STAT0 ((__IO uint32_t *) REG_CLKG0_CLK_STAT0) /* Clocking Status */ + +/* ================================================================================= + * Bus matrix (BUSM0) + * ================================================================================= */ +#define pREG_BUSM0_ARBIT0 ((__IO uint32_t *) REG_BUSM0_ARBIT0) /* Arbitration Priority Configuration for FLASH and SRAM0 */ +#define pREG_BUSM0_ARBIT1 ((__IO uint32_t *) REG_BUSM0_ARBIT1) /* Arbitration Priority Configuration for SRAM1 and SIP */ +#define pREG_BUSM0_ARBIT2 ((__IO uint32_t *) REG_BUSM0_ARBIT2) /* Arbitration Priority Configuration for APB32 and APB16 */ +#define pREG_BUSM0_ARBIT3 ((__IO uint32_t *) REG_BUSM0_ARBIT3) /* Arbitration Priority Configuration for APB16 priority for core and for DMA1 */ +#define pREG_BUSM0_ARBIT4 ((__IO uint32_t *) REG_BUSM0_ARBIT4) /* Arbitration Priority Configuration for SRAM1 and SIP */ + +/* ================================================================================= + * Parallel Test Interface (PTI0) + * ================================================================================= */ +#define pREG_PTI0_RST_ISR_STARTADDR ((__IO uint32_t *) REG_PTI0_RST_ISR_STARTADDR) /* Reset ISR Start Address */ +#define pREG_PTI0_RST_STACK_PTR ((__IO uint32_t *) REG_PTI0_RST_STACK_PTR) /* Reset Stack Pointer */ +#define pREG_PTI0_CTL ((__IO uint32_t *) REG_PTI0_CTL) /* Parallel Test Interface Control Register */ + +/* ================================================================================= + * Cortex-M3 Interrupt Controller (NVIC0) + * ================================================================================= */ +#define pREG_NVIC0_INTNUM ((__IO uint32_t *) REG_NVIC0_INTNUM) /* Interrupt Control Type */ +#define pREG_NVIC0_STKSTA ((__IO uint32_t *) REG_NVIC0_STKSTA) /* Systick Control and Status */ +#define pREG_NVIC0_STKLD ((__IO uint32_t *) REG_NVIC0_STKLD) /* Systick Reload Value */ +#define pREG_NVIC0_STKVAL ((__IO uint32_t *) REG_NVIC0_STKVAL) /* Systick Current Value */ +#define pREG_NVIC0_STKCAL ((__IO uint32_t *) REG_NVIC0_STKCAL) /* Systick Calibration Value */ +#define pREG_NVIC0_INTSETE0 ((__IO uint32_t *) REG_NVIC0_INTSETE0) /* IRQ0..31 Set_Enable */ +#define pREG_NVIC0_INTSETE1 ((__IO uint32_t *) REG_NVIC0_INTSETE1) /* IRQ32..63 Set_Enable */ +#define pREG_NVIC0_INTCLRE0 ((__IO uint32_t *) REG_NVIC0_INTCLRE0) /* IRQ0..31 Clear_Enable */ +#define pREG_NVIC0_INTCLRE1 ((__IO uint32_t *) REG_NVIC0_INTCLRE1) /* IRQ32..63 Clear_Enable */ +#define pREG_NVIC0_INTSETP0 ((__IO uint32_t *) REG_NVIC0_INTSETP0) /* IRQ0..31 Set_Pending */ +#define pREG_NVIC0_INTSETP1 ((__IO uint32_t *) REG_NVIC0_INTSETP1) /* IRQ32..63 Set_Pending */ +#define pREG_NVIC0_INTCLRP0 ((__IO uint32_t *) REG_NVIC0_INTCLRP0) /* IRQ0..31 Clear_Pending */ +#define pREG_NVIC0_INTCLRP1 ((__IO uint32_t *) REG_NVIC0_INTCLRP1) /* IRQ32..63 Clear_Pending */ +#define pREG_NVIC0_INTACT0 ((__IO uint32_t *) REG_NVIC0_INTACT0) /* IRQ0..31 Active Bit */ +#define pREG_NVIC0_INTACT1 ((__IO uint32_t *) REG_NVIC0_INTACT1) /* IRQ32..63 Active Bit */ +#define pREG_NVIC0_INTPRI0 ((__IO uint32_t *) REG_NVIC0_INTPRI0) /* IRQ0..3 Priority */ +#define pREG_NVIC0_INTPRI1 ((__IO uint32_t *) REG_NVIC0_INTPRI1) /* IRQ4..7 Priority */ +#define pREG_NVIC0_INTPRI2 ((__IO uint32_t *) REG_NVIC0_INTPRI2) /* IRQ8..11 Priority */ +#define pREG_NVIC0_INTPRI3 ((__IO uint32_t *) REG_NVIC0_INTPRI3) /* IRQ12..15 Priority */ +#define pREG_NVIC0_INTPRI4 ((__IO uint32_t *) REG_NVIC0_INTPRI4) /* IRQ16..19 Priority */ +#define pREG_NVIC0_INTPRI5 ((__IO uint32_t *) REG_NVIC0_INTPRI5) /* IRQ20..23 Priority */ +#define pREG_NVIC0_INTPRI6 ((__IO uint32_t *) REG_NVIC0_INTPRI6) /* IRQ24..27 Priority */ +#define pREG_NVIC0_INTPRI7 ((__IO uint32_t *) REG_NVIC0_INTPRI7) /* IRQ28..31 Priority */ +#define pREG_NVIC0_INTPRI8 ((__IO uint32_t *) REG_NVIC0_INTPRI8) /* IRQ32..35 Priority */ +#define pREG_NVIC0_INTPRI9 ((__IO uint32_t *) REG_NVIC0_INTPRI9) /* IRQ36..39 Priority */ +#define pREG_NVIC0_INTPRI10 ((__IO uint32_t *) REG_NVIC0_INTPRI10) /* IRQ40..43 Priority */ +#define pREG_NVIC0_INTCPID ((__IO uint32_t *) REG_NVIC0_INTCPID) /* CPUID Base */ +#define pREG_NVIC0_INTSTA ((__IO uint32_t *) REG_NVIC0_INTSTA) /* Interrupt Control State */ +#define pREG_NVIC0_INTVEC ((__IO uint32_t *) REG_NVIC0_INTVEC) /* Vector Table Offset */ +#define pREG_NVIC0_INTAIRC ((__IO uint32_t *) REG_NVIC0_INTAIRC) /* Application Interrupt/Reset Control */ +#define pREG_NVIC0_INTCON0 ((__IO uint16_t *) REG_NVIC0_INTCON0) /* System Control */ +#define pREG_NVIC0_INTCON1 ((__IO uint32_t *) REG_NVIC0_INTCON1) /* Configuration Control */ +#define pREG_NVIC0_INTSHPRIO0 ((__IO uint32_t *) REG_NVIC0_INTSHPRIO0) /* System Handlers 4-7 Priority */ +#define pREG_NVIC0_INTSHPRIO1 ((__IO uint32_t *) REG_NVIC0_INTSHPRIO1) /* System Handlers 8-11 Priority */ +#define pREG_NVIC0_INTSHPRIO3 ((__IO uint32_t *) REG_NVIC0_INTSHPRIO3) /* System Handlers 12-15 Priority */ +#define pREG_NVIC0_INTSHCSR ((__IO uint32_t *) REG_NVIC0_INTSHCSR) /* System Handler Control and State */ +#define pREG_NVIC0_INTCFSR ((__IO uint32_t *) REG_NVIC0_INTCFSR) /* Configurable Fault Status */ +#define pREG_NVIC0_INTHFSR ((__IO uint32_t *) REG_NVIC0_INTHFSR) /* Hard Fault Status */ +#define pREG_NVIC0_INTDFSR ((__IO uint32_t *) REG_NVIC0_INTDFSR) /* Debug Fault Status */ +#define pREG_NVIC0_INTMMAR ((__IO uint32_t *) REG_NVIC0_INTMMAR) /* Mem Manage Address */ +#define pREG_NVIC0_INTBFAR ((__IO uint32_t *) REG_NVIC0_INTBFAR) /* Bus Fault Address */ +#define pREG_NVIC0_INTAFSR ((__IO uint32_t *) REG_NVIC0_INTAFSR) /* Auxiliary Fault Status */ +#define pREG_NVIC0_INTPFR0 ((__IO uint32_t *) REG_NVIC0_INTPFR0) /* Processor Feature Register 0 */ +#define pREG_NVIC0_INTPFR1 ((__IO uint32_t *) REG_NVIC0_INTPFR1) /* Processor Feature Register 1 */ +#define pREG_NVIC0_INTDFR0 ((__IO uint32_t *) REG_NVIC0_INTDFR0) /* Debug Feature Register 0 */ +#define pREG_NVIC0_INTAFR0 ((__IO uint32_t *) REG_NVIC0_INTAFR0) /* Auxiliary Feature Register 0 */ +#define pREG_NVIC0_INTMMFR0 ((__IO uint32_t *) REG_NVIC0_INTMMFR0) /* Memory Model Feature Register 0 */ +#define pREG_NVIC0_INTMMFR1 ((__IO uint32_t *) REG_NVIC0_INTMMFR1) /* Memory Model Feature Register 1 */ +#define pREG_NVIC0_INTMMFR2 ((__IO uint32_t *) REG_NVIC0_INTMMFR2) /* Memory Model Feature Register 2 */ +#define pREG_NVIC0_INTMMFR3 ((__IO uint32_t *) REG_NVIC0_INTMMFR3) /* Memory Model Feature Register 3 */ +#define pREG_NVIC0_INTISAR0 ((__IO uint32_t *) REG_NVIC0_INTISAR0) /* ISA Feature Register 0 */ +#define pREG_NVIC0_INTISAR1 ((__IO uint32_t *) REG_NVIC0_INTISAR1) /* ISA Feature Register 1 */ +#define pREG_NVIC0_INTISAR2 ((__IO uint32_t *) REG_NVIC0_INTISAR2) /* ISA Feature Register 2 */ +#define pREG_NVIC0_INTISAR3 ((__IO uint32_t *) REG_NVIC0_INTISAR3) /* ISA Feature Register 3 */ +#define pREG_NVIC0_INTISAR4 ((__IO uint32_t *) REG_NVIC0_INTISAR4) /* ISA Feature Register 4 */ +#define pREG_NVIC0_INTTRGI ((__IO uint32_t *) REG_NVIC0_INTTRGI) /* Software Trigger Interrupt Register */ +#define pREG_NVIC0_INTPID4 ((__IO uint32_t *) REG_NVIC0_INTPID4) /* Peripheral Identification Register 4 */ +#define pREG_NVIC0_INTPID5 ((__IO uint32_t *) REG_NVIC0_INTPID5) /* Peripheral Identification Register 5 */ +#define pREG_NVIC0_INTPID6 ((__IO uint32_t *) REG_NVIC0_INTPID6) /* Peripheral Identification Register 6 */ +#define pREG_NVIC0_INTPID7 ((__IO uint32_t *) REG_NVIC0_INTPID7) /* Peripheral Identification Register 7 */ +#define pREG_NVIC0_INTPID0 ((__IO uint32_t *) REG_NVIC0_INTPID0) /* Peripheral Identification Bits7:0 */ +#define pREG_NVIC0_INTPID1 ((__IO uint32_t *) REG_NVIC0_INTPID1) /* Peripheral Identification Bits15:8 */ +#define pREG_NVIC0_INTPID2 ((__IO uint32_t *) REG_NVIC0_INTPID2) /* Peripheral Identification Bits16:23 */ +#define pREG_NVIC0_INTPID3 ((__IO uint32_t *) REG_NVIC0_INTPID3) /* Peripheral Identification Bits24:31 */ +#define pREG_NVIC0_INTCID0 ((__IO uint32_t *) REG_NVIC0_INTCID0) /* Component Identification Bits7:0 */ +#define pREG_NVIC0_INTCID1 ((__IO uint32_t *) REG_NVIC0_INTCID1) /* Component Identification Bits15:8 */ +#define pREG_NVIC0_INTCID2 ((__IO uint32_t *) REG_NVIC0_INTCID2) /* Component Identification Bits16:23 */ +#define pREG_NVIC0_INTCID3 ((__IO uint32_t *) REG_NVIC0_INTCID3) /* Component Identification Bits24:31 */ + +#if defined (_MISRA_RULES) +#pragma diag(pop) +#endif /* _MISRA_RULES */ + + +#endif + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050_device.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050_device.h new file mode 100755 index 0000000000..858848297b --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050_device.h @@ -0,0 +1,1338 @@ +/* ================================================================================ + + Project : ADuCM4050 + File : ADuCM4050_device.h + Description : C Register Definitions + + Date : Feb 7, 2017 + + Copyright (c) 2014-2017 Analog Devices, Inc. All Rights Reserved. + This software is proprietary and confidential to Analog Devices, Inc. and + its licensors. + + This file was auto-generated. Do not make local changes to this file. + + ================================================================================ */ + +#ifndef _ADUCM4050_DEVICE_H +#define _ADUCM4050_DEVICE_H + +/* pickup integer types */ +#if defined(_LANGUAGE_C) || (defined(__GNUC__) && !defined(__ASSEMBLER__)) +#include +#endif /* _LANGUAGE_C */ + +/* pickup register bitfield and bit masks */ +#include "adi_ADuCM4050_typedefs.h" + +#if defined ( __CC_ARM ) +#pragma push +#pragma anon_unions +#endif + + +#ifndef __IO +#ifdef __cplusplus +#define __I volatile /* read-only */ +#define __C +#else +#define __I volatile /* read-only */ +#define __C const +#endif +#define __O volatile /* write-only */ +#define __IO volatile /* read-write */ +#endif + +#if defined (_MISRA_RULES) +/* + anonymous unions violate ISO 9899:1990 and therefore MISRA Rule 1.1. + Use of unions violates MISRA Rule 18.4. + Anonymous unions are required for this implementation. + Re-use of identifiers violates MISRA Rule 5.7. + Field names are repeated for the ADuCM4050 register map. +*/ +#pragma diag(push) +#pragma diag(suppress:misra_rule_1_1:"Allow anonymous unions") +#pragma diag(suppress:misra_rule_5_1:"Allow names over 32 character limit") +#pragma diag(suppress:misra_rule_5_3:"Header will re-use typedef identifiers") +#pragma diag(suppress:misra_rule_5_6:"Header will re-use identifiers in the same scope") +#pragma diag(suppress:misra_rule_5_7:"Header will re-use identifiers") +#pragma diag(suppress:misra_rule_18_4:"Allow the use of a union") +#endif /* _MISRA_RULES */ + +/** @defgroup TMR General Purpose Timer (TMR) Module + * General Purpose Timer + * @{ + */ + +/*! ========================================================================== + * \struct ADI_TMR_TypeDef + * \brief General Purpose Timer + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_TypeDef__ +typedef struct _ADI_TMR_TypeDef +{ + __IO uint16_t LOAD; /*!< 16-bit Load Value */ + __I __C uint8_t RESERVED0[2]; + __I __C uint16_t CURCNT; /*!< 16-bit Timer Value */ + __I __C uint8_t RESERVED1[2]; + __IO uint16_t CTL; /*!< Control */ + __I __C uint8_t RESERVED2[2]; + __O uint16_t CLRINT; /*!< Clear Interrupt */ + __I __C uint8_t RESERVED3[2]; + __I __C uint16_t CAPTURE; /*!< Capture */ + __I __C uint8_t RESERVED4[2]; + __IO uint16_t ALOAD; /*!< 16-bit Load Value, Asynchronous */ + __I __C uint8_t RESERVED5[2]; + __I __C uint16_t ACURCNT; /*!< 16-bit Timer Value, Asynchronous */ + __I __C uint8_t RESERVED6[2]; + __I __C uint16_t STAT; /*!< Status */ + __I __C uint8_t RESERVED7[2]; + __IO uint16_t PWMCTL; /*!< PWM Control Register */ + __I __C uint8_t RESERVED8[2]; + __IO uint16_t PWMMATCH; /*!< PWM Match Value */ + __I __C uint8_t RESERVED9[2]; + __IO uint16_t EVENTSELECT; /*!< Timer Event Selection Register */ +} ADI_TMR_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_TypeDef__ */ + +/*!@}*/ + +/** @defgroup TMR_RGB Timer_RGB with 3 PWM outputs (TMR_RGB) Module + * Timer_RGB with 3 PWM outputs + * @{ + */ + +/*! ========================================================================== + * \struct ADI_TMR_RGB_TypeDef + * \brief Timer_RGB with 3 PWM outputs + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_RGB_TypeDef__ +typedef struct _ADI_TMR_RGB_TypeDef +{ + __IO uint16_t LOAD; /*!< 16-bit load value */ + __I __C uint8_t RESERVED0[2]; + __I __C uint16_t CURCNT; /*!< 16-bit timer value */ + __I __C uint8_t RESERVED1[2]; + __IO uint16_t CTL; /*!< Control */ + __I __C uint8_t RESERVED2[2]; + __O uint16_t CLRINT; /*!< Clear interrupt */ + __I __C uint8_t RESERVED3[2]; + __I __C uint16_t CAPTURE; /*!< Capture */ + __I __C uint8_t RESERVED4[2]; + __IO uint16_t ALOAD; /*!< 16-bit load value, asynchronous */ + __I __C uint8_t RESERVED5[2]; + __I __C uint16_t ACURCNT; /*!< 16-bit timer value, asynchronous */ + __I __C uint8_t RESERVED6[2]; + __I __C uint16_t STAT; /*!< Status */ + __I __C uint8_t RESERVED7[2]; + __IO uint16_t PWM0CTL; /*!< PWM0 Control Register */ + __I __C uint8_t RESERVED8[2]; + __IO uint16_t PWM0MATCH; /*!< PWM0 Match Value */ + __I __C uint8_t RESERVED9[2]; + __IO uint16_t EVENTSELECT; /*!< Timer Event selection Register */ + __I __C uint8_t RESERVED10[2]; + __IO uint16_t PWM1CTL; /*!< PWM1 Control Register */ + __I __C uint8_t RESERVED11[2]; + __IO uint16_t PWM1MATCH; /*!< PWM1 Match Value */ + __I __C uint8_t RESERVED12[2]; + __IO uint16_t PWM2CTL; /*!< PWM2 Control Register */ + __I __C uint8_t RESERVED13[2]; + __IO uint16_t PWM2MATCH; /*!< PWM2 Match Value */ +} ADI_TMR_RGB_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_RGB_TypeDef__ */ + +/*!@}*/ + +/** @defgroup RTC Real-Time Clock (RTC) Module + * Real-Time Clock + * @{ + */ + +/*! ========================================================================== + * \struct ADI_RTC_TypeDef + * \brief Real-Time Clock + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_TypeDef__ +typedef struct _ADI_RTC_TypeDef +{ + __IO uint16_t CR0; /*!< RTC Control 0 */ + __I __C uint8_t RESERVED0[2]; + __IO uint16_t SR0; /*!< RTC Status 0 */ + __I __C uint8_t RESERVED1[2]; + __I __C uint16_t SR1; /*!< RTC Status 1 */ + __I __C uint8_t RESERVED2[2]; + __IO uint16_t CNT0; /*!< RTC Count 0 */ + __I __C uint8_t RESERVED3[2]; + __IO uint16_t CNT1; /*!< RTC Count 1 */ + __I __C uint8_t RESERVED4[2]; + __IO uint16_t ALM0; /*!< RTC Alarm 0 */ + __I __C uint8_t RESERVED5[2]; + __IO uint16_t ALM1; /*!< RTC Alarm 1 */ + __I __C uint8_t RESERVED6[2]; + __IO uint16_t TRM; /*!< RTC Trim */ + __I __C uint8_t RESERVED7[2]; + __O uint16_t GWY; /*!< RTC Gateway */ + __I __C uint8_t RESERVED8[6]; + __IO uint16_t CR1; /*!< RTC Control 1 */ + __I __C uint8_t RESERVED9[2]; + __IO uint16_t SR2; /*!< RTC Status 2 */ + __I __C uint8_t RESERVED10[2]; + __I __C uint16_t SNAP0; /*!< RTC Snapshot 0 */ + __I __C uint8_t RESERVED11[2]; + __I __C uint16_t SNAP1; /*!< RTC Snapshot 1 */ + __I __C uint8_t RESERVED12[2]; + __I __C uint16_t SNAP2; /*!< RTC Snapshot 2 */ + __I __C uint8_t RESERVED13[2]; + __I __C uint16_t MOD; /*!< RTC Modulo */ + __I __C uint8_t RESERVED14[2]; + __I __C uint16_t CNT2; /*!< RTC Count 2 */ + __I __C uint8_t RESERVED15[2]; + __IO uint16_t ALM2; /*!< RTC Alarm 2 */ + __I __C uint8_t RESERVED16[2]; + __IO uint16_t SR3; /*!< RTC Status 3 */ + __I __C uint8_t RESERVED17[2]; + __IO uint16_t CR2IC; /*!< RTC Control 2 for Configuring Input Capture Channels */ + __I __C uint8_t RESERVED18[2]; + __IO uint16_t CR3SS; /*!< RTC Control 3 for Configuring SensorStrobe Channel */ + __I __C uint8_t RESERVED19[2]; + __IO uint16_t CR4SS; /*!< RTC Control 4 for Configuring SensorStrobe Channel */ + __I __C uint8_t RESERVED20[2]; + __IO uint16_t SSMSK; /*!< RTC Mask for SensorStrobe Channel */ + __I __C uint8_t RESERVED21[10]; + __I __C uint16_t IC2; /*!< RTC Input Capture Channel 2 */ + __I __C uint8_t RESERVED22[2]; + __I __C uint16_t IC3; /*!< RTC Input Capture Channel 3 */ + __I __C uint8_t RESERVED23[2]; + __I __C uint16_t IC4; /*!< RTC Input Capture Channel 4 */ + __I __C uint8_t RESERVED24[2]; + __IO uint16_t SS1; /*!< RTC SensorStrobe Channel 1 */ + __I __C uint8_t RESERVED25[2]; + __IO uint16_t SS2; /*!< RTC SensorStrobe Channel 2 */ + __I __C uint8_t RESERVED26[2]; + __IO uint16_t SS3; /*!< RTC SensorStrobe Channel 3 */ + __I __C uint8_t RESERVED27[2]; + __IO uint16_t SS4; /*!< RTC SensorStrobe Channel 4 */ + __I __C uint8_t RESERVED28[2]; + __I __C uint16_t SR4; /*!< RTC Status 4 */ + __I __C uint8_t RESERVED29[2]; + __I __C uint16_t SR5; /*!< RTC Status 5 */ + __I __C uint8_t RESERVED30[2]; + __I __C uint16_t SR6; /*!< RTC Status 6 */ + __I __C uint8_t RESERVED31[2]; + __I __C uint16_t SS1TGT; /*!< RTC SensorStrobe Channel 1 Target */ + __I __C uint8_t RESERVED32[2]; + __I __C uint16_t FRZCNT; /*!< RTC Freeze Count */ + __I __C uint8_t RESERVED33[2]; + __I __C uint16_t SS2TGT; /*!< RTC SensorStrobe Channel 2 Target */ + __I __C uint8_t RESERVED34[2]; + __I __C uint16_t SS3TGT; /*!< RTC SensorStrobe Channel 3 Target */ + __I __C uint8_t RESERVED35[6]; + __IO uint16_t SS1LOWDUR; /*!< RTC Auto-Reload Low Duration for SensorStrobe Channel 1 */ + __I __C uint8_t RESERVED36[2]; + __IO uint16_t SS2LOWDUR; /*!< RTC Auto-Reload Low Duration for SensorStrobe Channel 2 */ + __I __C uint8_t RESERVED37[2]; + __IO uint16_t SS3LOWDUR; /*!< RTC Auto-Reload Low Duration for SensorStrobe Channel 3 */ + __I __C uint8_t RESERVED38[6]; + __IO uint16_t SS1HIGHDUR; /*!< RTC Auto-Reload High Duration for SensorStrobe Channel 1 */ + __I __C uint8_t RESERVED39[2]; + __IO uint16_t SS2HIGHDUR; /*!< RTC Auto-Reload High Duration for SensorStrobe Channel 2 */ + __I __C uint8_t RESERVED40[2]; + __IO uint16_t SS3HIGHDUR; /*!< RTC Auto-Reload High Duration for SensorStrobe Channel 3 */ + __I __C uint8_t RESERVED41[6]; + __IO uint16_t SSMSKOT; /*!< RTC Masks for SensorStrobe Channels on Time Control */ + __I __C uint8_t RESERVED42[2]; + __IO uint16_t CR5SSS; /*!< RTC Control 5 for Configuring SensorStrobe Channel GPIO Sampling */ + __I __C uint8_t RESERVED43[2]; + __IO uint16_t CR6SSS; /*!< RTC Control 6 for Configuring SensorStrobe Channel GPIO Sampling Edge */ + __I __C uint8_t RESERVED44[2]; + __IO uint16_t CR7SSS; /*!< RTC Control 7 for Configuring SensorStrobe Channel GPIO Sampling Activity */ + __I __C uint8_t RESERVED45[2]; + __IO uint16_t SR7; /*!< RTC Status 7 */ + __I __C uint8_t RESERVED46[2]; + __I __C uint16_t SR8; /*!< RTC Status 8 */ + __I __C uint8_t RESERVED47[2]; + __I __C uint16_t SR9; /*!< RTC Status 9 */ + __I __C uint8_t RESERVED48[6]; + __IO uint16_t GPMUX0; /*!< RTC GPIO Pin Mux Control Register 0 */ + __I __C uint8_t RESERVED49[2]; + __IO uint16_t GPMUX1; /*!< RTC GPIO Pin Mux Control Register 1 */ +} ADI_RTC_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_TypeDef__ */ + +/*!@}*/ + +/** @defgroup SYS System Identification and Debug Enable (SYS) Module + * System Identification and Debug Enable + * @{ + */ + +/*! ========================================================================== + * \struct ADI_SYS_TypeDef + * \brief System Identification and Debug Enable + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SYS_TypeDef__ +typedef struct _ADI_SYS_TypeDef +{ + __I __C uint8_t RESERVED0[32]; + __I __C uint16_t ADIID; /*!< ADI Identification */ + __I __C uint8_t RESERVED1[2]; + __I __C uint16_t CHIPID; /*!< Chip Identifier */ + __I __C uint8_t RESERVED2[26]; + __O uint16_t SWDEN; /*!< Serial Wire Debug Enable */ +} ADI_SYS_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SYS_TypeDef__ */ + +/*!@}*/ + +/** @defgroup WDT Watchdog Timer (WDT) Module + * Watchdog Timer + * @{ + */ + +/*! ========================================================================== + * \struct ADI_WDT_TypeDef + * \brief Watchdog Timer + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_WDT_TypeDef__ +typedef struct _ADI_WDT_TypeDef +{ + __IO uint16_t LOAD; /*!< Load Value */ + __I __C uint8_t RESERVED0[2]; + __I __C uint16_t CCNT; /*!< Current Count Value */ + __I __C uint8_t RESERVED1[2]; + __IO uint16_t CTL; /*!< Control */ + __I __C uint8_t RESERVED2[2]; + __O uint16_t RESTART; /*!< Clear Interrupt */ + __I __C uint8_t RESERVED3[10]; + __I __C uint16_t STAT; /*!< Status */ +} ADI_WDT_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_WDT_TypeDef__ */ + +/*!@}*/ + +/** @defgroup I2C I2C Master/Slave (I2C) Module + * I2C Master/Slave + * @{ + */ + +/*! ========================================================================== + * \struct ADI_I2C_TypeDef + * \brief I2C Master/Slave + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_TypeDef__ +typedef struct _ADI_I2C_TypeDef +{ + __IO uint16_t MCTL; /*!< Master Control */ + __I __C uint8_t RESERVED0[2]; + __IO uint16_t MSTAT; /*!< Master Status */ + __I __C uint8_t RESERVED1[2]; + __I __C uint16_t MRX; /*!< Master Receive Data */ + __I __C uint8_t RESERVED2[2]; + __IO uint16_t MTX; /*!< Master Transmit Data */ + __I __C uint8_t RESERVED3[2]; + __IO uint16_t MRXCNT; /*!< Master Receive Data Count */ + __I __C uint8_t RESERVED4[2]; + __I __C uint16_t MCRXCNT; /*!< Master Current Receive Data Count */ + __I __C uint8_t RESERVED5[2]; + __IO uint16_t ADDR1; /*!< Master Address Byte 1 */ + __I __C uint8_t RESERVED6[2]; + __IO uint16_t ADDR2; /*!< Master Address Byte 2 */ + __I __C uint8_t RESERVED7[2]; + __IO uint16_t BYT; /*!< Start Byte */ + __I __C uint8_t RESERVED8[2]; + __IO uint16_t DIV; /*!< Serial Clock Period Divisor */ + __I __C uint8_t RESERVED9[2]; + __IO uint16_t SCTL; /*!< Slave Control */ + __I __C uint8_t RESERVED10[2]; + __IO uint16_t SSTAT; /*!< Slave I2C Status/Error/IRQ */ + __I __C uint8_t RESERVED11[2]; + __I __C uint16_t SRX; /*!< Slave Receive */ + __I __C uint8_t RESERVED12[2]; + __IO uint16_t STX; /*!< Slave Transmit */ + __I __C uint8_t RESERVED13[2]; + __IO uint16_t ALT; /*!< Hardware General Call ID */ + __I __C uint8_t RESERVED14[2]; + __IO uint16_t ID0; /*!< First Slave Address Device ID */ + __I __C uint8_t RESERVED15[2]; + __IO uint16_t ID1; /*!< Second Slave Address Device ID */ + __I __C uint8_t RESERVED16[2]; + __IO uint16_t ID2; /*!< Third Slave Address Device ID */ + __I __C uint8_t RESERVED17[2]; + __IO uint16_t ID3; /*!< Fourth Slave Address Device ID */ + __I __C uint8_t RESERVED18[2]; + __IO uint16_t STAT; /*!< Master and Slave FIFO Status */ + __I __C uint8_t RESERVED19[2]; + __O uint16_t SHCTL; /*!< Shared Control */ + __I __C uint8_t RESERVED20[2]; + __IO uint16_t TCTL; /*!< Timing Control Register */ + __I __C uint8_t RESERVED21[2]; + __IO uint16_t ASTRETCH_SCL; /*!< Automatic Stretch SCL */ +} ADI_I2C_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_TypeDef__ */ + +/*!@}*/ + +/** @defgroup SPI Serial Peripheral Interface (SPI) Module + * Serial Peripheral Interface + * @{ + */ + +/*! ========================================================================== + * \struct ADI_SPI_TypeDef + * \brief Serial Peripheral Interface + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPI_TypeDef__ +typedef struct _ADI_SPI_TypeDef +{ + __IO uint16_t STAT; /*!< Status */ + __I __C uint8_t RESERVED0[2]; + __I __C uint16_t RX; /*!< Receive */ + __I __C uint8_t RESERVED1[2]; + __O uint16_t TX; /*!< Transmit */ + __I __C uint8_t RESERVED2[2]; + __IO uint16_t DIV; /*!< SPI Baud Rate Selection */ + __I __C uint8_t RESERVED3[2]; + __IO uint16_t CTL; /*!< SPI Configuration */ + __I __C uint8_t RESERVED4[2]; + __IO uint16_t IEN; /*!< SPI Interrupts Enable */ + __I __C uint8_t RESERVED5[2]; + __IO uint16_t CNT; /*!< Transfer Byte Count */ + __I __C uint8_t RESERVED6[2]; + __IO uint16_t DMA; /*!< SPI DMA Enable */ + __I __C uint8_t RESERVED7[2]; + __I __C uint16_t FIFO_STAT; /*!< FIFO Status */ + __I __C uint8_t RESERVED8[2]; + __IO uint16_t RD_CTL; /*!< Read Control */ + __I __C uint8_t RESERVED9[2]; + __IO uint16_t FLOW_CTL; /*!< Flow Control */ + __I __C uint8_t RESERVED10[2]; + __IO uint16_t WAIT_TMR; /*!< Wait Timer for Flow Control */ + __I __C uint8_t RESERVED11[2]; + __IO uint16_t CS_CTL; /*!< Chip Select Control for Multi-slave Connections */ + __I __C uint8_t RESERVED12[2]; + __IO uint16_t CS_OVERRIDE; /*!< Chip Select Override */ + __I __C uint8_t RESERVED13[4]; +} ADI_SPI_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPI_TypeDef__ */ + +/*!@}*/ + +/** @defgroup UART (UART) Module + * + * @{ + */ + +/*! ========================================================================== + * \struct ADI_UART_TypeDef + * \brief + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_TypeDef__ +typedef struct _ADI_UART_TypeDef +{ + union { + __I __C uint16_t RX; /*!< Receive Buffer Register */ + __O uint16_t TX; /*!< Transmit Holding Register */ + }; + __I __C uint8_t RESERVED0[2]; + __IO uint16_t IEN; /*!< Interrupt Enable */ + __I __C uint8_t RESERVED1[2]; + __I __C uint16_t IIR; /*!< Interrupt ID */ + __I __C uint8_t RESERVED2[2]; + __IO uint16_t LCR; /*!< Line Control */ + __I __C uint8_t RESERVED3[2]; + __IO uint16_t MCR; /*!< Modem Control */ + __I __C uint8_t RESERVED4[2]; + __I __C uint16_t LSR; /*!< Line Status */ + __I __C uint8_t RESERVED5[2]; + __I __C uint16_t MSR; /*!< Modem Status */ + __I __C uint8_t RESERVED6[2]; + __IO uint16_t SCR; /*!< Scratch Buffer */ + __I __C uint8_t RESERVED7[2]; + __IO uint16_t FCR; /*!< FIFO Control */ + __I __C uint8_t RESERVED8[2]; + __IO uint16_t FBR; /*!< Fractional Baud Rate */ + __I __C uint8_t RESERVED9[2]; + __IO uint16_t DIV; /*!< Baud Rate Divider */ + __I __C uint8_t RESERVED10[2]; + __IO uint16_t LCR2; /*!< Second Line Control */ + __I __C uint8_t RESERVED11[2]; + __IO uint16_t CTL; /*!< UART Control Register */ + __I __C uint8_t RESERVED12[2]; + __I __C uint16_t RFC; /*!< RX FIFO Byte Count */ + __I __C uint8_t RESERVED13[2]; + __I __C uint16_t TFC; /*!< TX FIFO Byte Count */ + __I __C uint8_t RESERVED14[2]; + __IO uint16_t RSC; /*!< RS485 Half-duplex Control */ + __I __C uint8_t RESERVED15[2]; + __IO uint16_t ACR; /*!< Auto Baud Control */ + __I __C uint8_t RESERVED16[2]; + __I __C uint16_t ASRL; /*!< Auto Baud Status (Low) */ + __I __C uint8_t RESERVED17[2]; + __I __C uint16_t ASRH; /*!< Auto Baud Status (High) */ +} ADI_UART_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_TypeDef__ */ + +/*!@}*/ + +/** @defgroup BEEP Beeper Driver (BEEP) Module + * Beeper Driver + * @{ + */ + +/*! ========================================================================== + * \struct ADI_BEEP_TypeDef + * \brief Beeper Driver + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_BEEP_TypeDef__ +typedef struct _ADI_BEEP_TypeDef +{ + __IO uint16_t CFG; /*!< Beeper Configuration */ + __I __C uint8_t RESERVED0[2]; + __IO uint16_t STAT; /*!< Beeper Status */ + __I __C uint8_t RESERVED1[2]; + __IO uint16_t TONEA; /*!< Tone A Data */ + __I __C uint8_t RESERVED2[2]; + __IO uint16_t TONEB; /*!< Tone B Data */ +} ADI_BEEP_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_BEEP_TypeDef__ */ + +/*!@}*/ + +/** @defgroup ADC (ADC) Module + * + * @{ + */ + +/*! ========================================================================== + * \struct ADI_ADC_TypeDef + * \brief + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_TypeDef__ +typedef struct _ADI_ADC_TypeDef +{ + __IO uint16_t CFG; /*!< ADC Configuration */ + __I __C uint8_t RESERVED0[2]; + __IO uint16_t PWRUP; /*!< ADC Power-up Time */ + __I __C uint8_t RESERVED1[2]; + __IO uint16_t CAL_WORD; /*!< Calibration Word */ + __I __C uint8_t RESERVED2[2]; + __IO uint16_t CNV_CFG; /*!< ADC Conversion Configuration */ + __I __C uint8_t RESERVED3[2]; + __IO uint16_t CNV_TIME; /*!< ADC Conversion Time */ + __I __C uint8_t RESERVED4[2]; + __IO uint16_t AVG_CFG; /*!< Averaging Configuration */ + __I __C uint8_t RESERVED5[10]; + __IO uint16_t IRQ_EN; /*!< Interrupt Enable */ + __I __C uint8_t RESERVED6[2]; + __IO uint16_t STAT; /*!< ADC Status */ + __I __C uint8_t RESERVED7[2]; + __IO uint16_t OVF; /*!< Overflow of Output Registers */ + __I __C uint8_t RESERVED8[2]; + __IO uint16_t ALERT; /*!< Alert Indication */ + __I __C uint8_t RESERVED9[2]; + __I __C uint16_t CH0_OUT; /*!< Conversion Result Channel 0 */ + __I __C uint8_t RESERVED10[2]; + __I __C uint16_t CH1_OUT; /*!< Conversion Result Channel 1 */ + __I __C uint8_t RESERVED11[2]; + __I __C uint16_t CH2_OUT; /*!< Conversion Result Channel 2 */ + __I __C uint8_t RESERVED12[2]; + __I __C uint16_t CH3_OUT; /*!< Conversion Result Channel 3 */ + __I __C uint8_t RESERVED13[2]; + __I __C uint16_t CH4_OUT; /*!< Conversion Result Channel 4 */ + __I __C uint8_t RESERVED14[2]; + __I __C uint16_t CH5_OUT; /*!< Conversion Result Channel 5 */ + __I __C uint8_t RESERVED15[2]; + __I __C uint16_t CH6_OUT; /*!< Conversion Result Channel 6 */ + __I __C uint8_t RESERVED16[2]; + __I __C uint16_t CH7_OUT; /*!< Conversion Result Channel 7 */ + __I __C uint8_t RESERVED17[2]; + __I __C uint16_t BAT_OUT; /*!< Battery Monitoring Result */ + __I __C uint8_t RESERVED18[2]; + __I __C uint16_t TMP_OUT; /*!< Temperature Result */ + __I __C uint8_t RESERVED19[2]; + __I __C uint16_t TMP2_OUT; /*!< Temperature Result 2 */ + __I __C uint8_t RESERVED20[2]; + __I __C uint16_t DMA_OUT; /*!< DMA Output Register */ + __I __C uint8_t RESERVED21[2]; + __IO uint16_t LIM0_LO; /*!< Channel 0 Low Limit */ + __I __C uint8_t RESERVED22[2]; + __IO uint16_t LIM0_HI; /*!< Channel 0 High Limit */ + __I __C uint8_t RESERVED23[2]; + __IO uint16_t HYS0; /*!< Channel 0 Hysteresis */ + __I __C uint8_t RESERVED24[6]; + __IO uint16_t LIM1_LO; /*!< Channel 1 Low Limit */ + __I __C uint8_t RESERVED25[2]; + __IO uint16_t LIM1_HI; /*!< Channel 1 High Limit */ + __I __C uint8_t RESERVED26[2]; + __IO uint16_t HYS1; /*!< Channel 1 Hysteresis */ + __I __C uint8_t RESERVED27[6]; + __IO uint16_t LIM2_LO; /*!< Channel 2 Low Limit */ + __I __C uint8_t RESERVED28[2]; + __IO uint16_t LIM2_HI; /*!< Channel 2 High Limit */ + __I __C uint8_t RESERVED29[2]; + __IO uint16_t HYS2; /*!< Channel 2 Hysteresis */ + __I __C uint8_t RESERVED30[6]; + __IO uint16_t LIM3_LO; /*!< Channel 3 Low Limit */ + __I __C uint8_t RESERVED31[2]; + __IO uint16_t LIM3_HI; /*!< Channel 3 High Limit */ + __I __C uint8_t RESERVED32[2]; + __IO uint16_t HYS3; /*!< Channel 3 Hysteresis */ + __I __C uint8_t RESERVED33[38]; + __IO uint16_t CFG1; /*!< Reference Buffer Low Power Mode */ + __I __C uint8_t RESERVED34[576]; +} ADI_ADC_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_TypeDef__ */ + +/*!@}*/ + +/** @defgroup DMA DMA (DMA) Module + * DMA + * @{ + */ + +/*! ========================================================================== + * \struct ADI_DMA_TypeDef + * \brief DMA + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_TypeDef__ +typedef struct _ADI_DMA_TypeDef +{ + __I __C uint32_t STAT; /*!< DMA Status */ + __O uint32_t CFG; /*!< DMA Configuration */ + __IO uint32_t PDBPTR; /*!< DMA Channel Primary Control Database Pointer */ + __I __C uint32_t ADBPTR; /*!< DMA Channel Alternate Control Database Pointer */ + __I __C uint8_t RESERVED0[4]; + __O uint32_t SWREQ; /*!< DMA Channel Software Request */ + __I __C uint8_t RESERVED1[8]; + __IO uint32_t RMSK_SET; /*!< DMA Channel Request Mask Set */ + __O uint32_t RMSK_CLR; /*!< DMA Channel Request Mask Clear */ + __IO uint32_t EN_SET; /*!< DMA Channel Enable Set */ + __O uint32_t EN_CLR; /*!< DMA Channel Enable Clear */ + __IO uint32_t ALT_SET; /*!< DMA Channel Primary Alternate Set */ + __O uint32_t ALT_CLR; /*!< DMA Channel Primary Alternate Clear */ + __O uint32_t PRI_SET; /*!< DMA Channel Priority Set */ + __O uint32_t PRI_CLR; /*!< DMA Channel Priority Clear */ + __I __C uint8_t RESERVED2[8]; + __IO uint32_t ERRCHNL_CLR; /*!< DMA per Channel Error Clear */ + __IO uint32_t ERR_CLR; /*!< DMA Bus Error Clear */ + __IO uint32_t INVALIDDESC_CLR; /*!< DMA per Channel Invalid Descriptor Clear */ + __I __C uint8_t RESERVED3[1964]; + __IO uint32_t BS_SET; /*!< DMA Channel Bytes Swap Enable Set */ + __O uint32_t BS_CLR; /*!< DMA Channel Bytes Swap Enable Clear */ + __I __C uint8_t RESERVED4[8]; + __IO uint32_t SRCADDR_SET; /*!< DMA Channel Source Address Decrement Enable Set */ + __O uint32_t SRCADDR_CLR; /*!< DMA Channel Source Address Decrement Enable Clear */ + __IO uint32_t DSTADDR_SET; /*!< DMA Channel Destination Address Decrement Enable Set */ + __O uint32_t DSTADDR_CLR; /*!< DMA Channel Destination Address Decrement Enable Clear */ + __I __C uint8_t RESERVED5[1984]; + __I __C uint32_t REVID; /*!< DMA Controller Revision ID */ +} ADI_DMA_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_TypeDef__ */ + +/*!@}*/ + +/** @defgroup FLCC Flash Controller (FLCC) Module + * Flash Controller + * @{ + */ + +/*! ========================================================================== + * \struct ADI_FLCC_TypeDef + * \brief Flash Controller + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_TypeDef__ +typedef struct _ADI_FLCC_TypeDef +{ + __IO uint32_t STAT; /*!< Status */ + __IO uint32_t IEN; /*!< Interrupt Enable */ + __IO uint32_t CMD; /*!< Command */ + __IO uint32_t KH_ADDR; /*!< Write Address */ + __IO uint32_t KH_DATA0; /*!< Write Lower Data */ + __IO uint32_t KH_DATA1; /*!< Write Upper Data */ + __IO uint32_t PAGE_ADDR0; /*!< Lower Page Address */ + __IO uint32_t PAGE_ADDR1; /*!< Upper Page Address */ + __O uint32_t KEY; /*!< Key */ + __I __C uint32_t WR_ABORT_ADDR; /*!< Write Abort Address */ + __IO uint32_t WRPROT; /*!< Write Protection */ + __I __C uint32_t SIGNATURE; /*!< Signature */ + __IO uint32_t UCFG; /*!< User Configuration */ + __IO uint32_t TIME_PARAM0; /*!< Time Parameter 0 */ + __IO uint32_t TIME_PARAM1; /*!< Time Parameter 1 */ + __IO uint32_t ABORT_EN_LO; /*!< IRQ Abort Enable (Lower Bits) */ + __IO uint32_t ABORT_EN_HI; /*!< IRQ Abort Enable (Upper Bits) */ + __IO uint32_t ECC_CFG; /*!< ECC Configuration */ + __I __C uint32_t ECC_ADDR; /*!< ECC Status (Address) */ + __I __C uint8_t RESERVED0[4]; + __IO uint32_t POR_SEC; /*!< Flash Security */ + __IO uint32_t VOL_CFG; /*!< Volatile Flash Configuration */ +} ADI_FLCC_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_TypeDef__ */ + +/*!@}*/ + +/** @defgroup FLCC_CACHE Cache Controller (FLCC_CACHE) Module + * Cache Controller + * @{ + */ + +/*! ========================================================================== + * \struct ADI_FLCC_CACHE_TypeDef + * \brief Cache Controller + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_CACHE_TypeDef__ +typedef struct _ADI_FLCC_CACHE_TypeDef +{ + __I __C uint32_t STAT; /*!< Cache Status Register */ + __IO uint32_t SETUP; /*!< Cache Setup Register */ + __O uint32_t KEY; /*!< Cache Key Register */ + __I __C uint8_t RESERVED0[40]; +} ADI_FLCC_CACHE_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_CACHE_TypeDef__ */ + +/*!@}*/ + +/** @defgroup GPIO (GPIO) Module + * + * @{ + */ + +/*! ========================================================================== + * \struct ADI_GPIO_TypeDef + * \brief + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_GPIO_TypeDef__ +typedef struct _ADI_GPIO_TypeDef +{ + __IO uint32_t CFG; /*!< Port Configuration */ + __IO uint16_t OEN; /*!< Port Output Enable */ + __I __C uint8_t RESERVED0[2]; + __IO uint16_t PE; /*!< Port Output Pull-up/Pull-down Enable */ + __I __C uint8_t RESERVED1[2]; + __IO uint16_t IEN; /*!< Port Input Path Enable */ + __I __C uint8_t RESERVED2[2]; + __I __C uint16_t IN; /*!< Port Registered Data Input */ + __I __C uint8_t RESERVED3[2]; + __IO uint16_t OUT; /*!< Port Data Output */ + __I __C uint8_t RESERVED4[2]; + __O uint16_t SET; /*!< Port Data Out Set */ + __I __C uint8_t RESERVED5[2]; + __O uint16_t CLR; /*!< Port Data Out Clear */ + __I __C uint8_t RESERVED6[2]; + __O uint16_t TGL; /*!< Port Pin Toggle */ + __I __C uint8_t RESERVED7[2]; + __IO uint16_t POL; /*!< Port Interrupt Polarity */ + __I __C uint8_t RESERVED8[2]; + __IO uint16_t IENA; /*!< Port Interrupt A Enable */ + __I __C uint8_t RESERVED9[2]; + __IO uint16_t IENB; /*!< Port Interrupt B Enable */ + __I __C uint8_t RESERVED10[2]; + __IO uint16_t INT; /*!< Port Interrupt Status */ + __I __C uint8_t RESERVED11[2]; + __IO uint16_t DS; /*!< Port Drive Strength Select */ +} ADI_GPIO_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_GPIO_TypeDef__ */ + +/*!@}*/ + +/** @defgroup SPORT Serial Port (SPORT) Module + * Serial Port + * @{ + */ + +/*! ========================================================================== + * \struct ADI_SPORT_TypeDef + * \brief Serial Port + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_TypeDef__ +typedef struct _ADI_SPORT_TypeDef +{ + __IO uint32_t CTL_A; /*!< Half SPORT 'A' Control Register */ + __IO uint32_t DIV_A; /*!< Half SPORT 'A' Divisor Register */ + __IO uint32_t IEN_A; /*!< Half SPORT A's Interrupt Enable register */ + __IO uint32_t STAT_A; /*!< Half SPORT 'A' Status register */ + __IO uint32_t NUMTRAN_A; /*!< Half SPORT A Number of transfers register */ + __IO uint32_t CNVT_A; /*!< Half SPORT 'A' CNV width */ + __I __C uint8_t RESERVED0[8]; + __O uint32_t TX_A; /*!< Half SPORT 'A' Tx Buffer Register */ + __I __C uint8_t RESERVED1[4]; + __I __C uint32_t RX_A; /*!< Half SPORT 'A' Rx Buffer Register */ + __I __C uint8_t RESERVED2[20]; + __IO uint32_t CTL_B; /*!< Half SPORT 'B' Control Register */ + __IO uint32_t DIV_B; /*!< Half SPORT 'B' Divisor Register */ + __IO uint32_t IEN_B; /*!< Half SPORT B's Interrupt Enable register */ + __IO uint32_t STAT_B; /*!< Half SPORT 'B' Status register */ + __IO uint32_t NUMTRAN_B; /*!< Half SPORT B Number of transfers register */ + __IO uint32_t CNVT_B; /*!< Half SPORT 'B' CNV width register */ + __I __C uint8_t RESERVED3[8]; + __O uint32_t TX_B; /*!< Half SPORT 'B' Tx Buffer Register */ + __I __C uint8_t RESERVED4[4]; + __I __C uint32_t RX_B; /*!< Half SPORT 'B' Rx Buffer Register */ + __I __C uint8_t RESERVED5[16]; +} ADI_SPORT_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_TypeDef__ */ + +/*!@}*/ + +/** @defgroup CRC CRC Accelerator (CRC) Module + * CRC Accelerator + * @{ + */ + +/*! ========================================================================== + * \struct ADI_CRC_TypeDef + * \brief CRC Accelerator + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRC_TypeDef__ +typedef struct _ADI_CRC_TypeDef +{ + __IO uint32_t CTL; /*!< CRC Control */ + __O uint32_t IPDATA; /*!< Input Data Word */ + __IO uint32_t RESULT; /*!< CRC Result */ + __IO uint32_t POLY; /*!< Programmable CRC Polynomial */ + union { + __O uint8_t IPBITS[8]; /*!< Input Data Bits */ + __O uint8_t IPBYTE; /*!< Input Data Byte */ + }; +} ADI_CRC_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRC_TypeDef__ */ + +/*!@}*/ + +/** @defgroup RNG Random Number Generator (RNG) Module + * Random Number Generator + * @{ + */ + +/*! ========================================================================== + * \struct ADI_RNG_TypeDef + * \brief Random Number Generator + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RNG_TypeDef__ +typedef struct _ADI_RNG_TypeDef +{ + __IO uint16_t CTL; /*!< RNG Control Register */ + __I __C uint8_t RESERVED0[2]; + __IO uint16_t LEN; /*!< RNG Sample Length Register */ + __I __C uint8_t RESERVED1[2]; + __IO uint16_t STAT; /*!< RNG Status Register */ + __I __C uint8_t RESERVED2[2]; + __I __C uint32_t DATA; /*!< RNG Data Register */ + __I __C uint32_t OSCCNT; /*!< Oscillator Count */ + __I __C int8_t OSCDIFF[4]; /*!< Oscillator Difference */ +} ADI_RNG_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RNG_TypeDef__ */ + +/*!@}*/ + +/** @defgroup CRYPT Register Map for the Crypto Block (CRYPT) Module + * Register Map for the Crypto Block + * @{ + */ + +/*! ========================================================================== + * \struct ADI_CRYPT_TypeDef + * \brief Register Map for the Crypto Block + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_TypeDef__ +typedef struct _ADI_CRYPT_TypeDef +{ + __IO uint32_t CFG; /*!< Configuration Register */ + __IO uint32_t DATALEN; /*!< Payload Data Length */ + __IO uint32_t PREFIXLEN; /*!< Authentication Data Length */ + __IO uint32_t INTEN; /*!< Interrupt Enable Register */ + __IO uint32_t STAT; /*!< Status Register */ + __O uint32_t INBUF; /*!< Input Buffer */ + __I __C uint32_t OUTBUF; /*!< Output Buffer */ + __IO uint32_t NONCE0; /*!< Nonce Bits [31:0] */ + __IO uint32_t NONCE1; /*!< Nonce Bits [63:32] */ + __IO uint32_t NONCE2; /*!< Nonce Bits [95:64] */ + __IO uint32_t NONCE3; /*!< Nonce Bits [127:96] */ + __O uint32_t AESKEY0; /*!< AES Key Bits [31:0] */ + __O uint32_t AESKEY1; /*!< AES Key Bits [63:32] */ + __O uint32_t AESKEY2; /*!< AES Key Bits [95:64] */ + __O uint32_t AESKEY3; /*!< AES Key Bits [127:96] */ + __O uint32_t AESKEY4; /*!< AES Key Bits [159:128] */ + __O uint32_t AESKEY5; /*!< AES Key Bits [191:160] */ + __O uint32_t AESKEY6; /*!< AES Key Bits [223:192] */ + __O uint32_t AESKEY7; /*!< AES Key Bits [255:224] */ + __IO uint32_t CNTRINIT; /*!< Counter Initialization Vector */ + __IO uint32_t SHAH0; /*!< SHA Bits [31:0] */ + __IO uint32_t SHAH1; /*!< SHA Bits [63:32] */ + __IO uint32_t SHAH2; /*!< SHA Bits [95:64] */ + __IO uint32_t SHAH3; /*!< SHA Bits [127:96] */ + __IO uint32_t SHAH4; /*!< SHA Bits [159:128] */ + __IO uint32_t SHAH5; /*!< SHA Bits [191:160] */ + __IO uint32_t SHAH6; /*!< SHA Bits [223:192] */ + __IO uint32_t SHAH7; /*!< SHA Bits [255:224] */ + __IO uint32_t SHA_LAST_WORD; /*!< SHA Last Word and Valid Bits Information */ + __IO uint32_t CCM_NUM_VALID_BYTES; /*!< NUM_VALID_BYTES */ + __IO uint32_t PRKSTORCFG; /*!< PRKSTOR Configuration */ + __I __C uint8_t RESERVED0[4]; + __O uint32_t KUW0; /*!< Key Wrap Unwrap Register 0 */ + __O uint32_t KUW1; /*!< Key Wrap Unwrap Register 1 */ + __O uint32_t KUW2; /*!< Key Wrap Unwrap Register 2 */ + __O uint32_t KUW3; /*!< Key Wrap Unwrap Register 3 */ + __O uint32_t KUW4; /*!< Key Wrap Unwrap Register 4 */ + __O uint32_t KUW5; /*!< Key Wrap Unwrap Register 5 */ + __O uint32_t KUW6; /*!< Key Wrap Unwrap Register 6 */ + __O uint32_t KUW7; /*!< Key Wrap Unwrap Register 7 */ + __O uint32_t KUW8; /*!< Key Wrap Unwrap Register 8 */ + __O uint32_t KUW9; /*!< Key Wrap Unwrap Register 9 */ + __O uint32_t KUW10; /*!< Key Wrap Unwrap Register 10 */ + __O uint32_t KUW11; /*!< Key Wrap Unwrap Register 11 */ + __O uint32_t KUW12; /*!< Key Wrap Unwrap Register 12 */ + __O uint32_t KUW13; /*!< Key Wrap Unwrap Register 13 */ + __O uint32_t KUW14; /*!< Key Wrap Unwrap Register 14 */ + __O uint32_t KUW15; /*!< Key Wrap Unwrap Register 15 */ + __O uint32_t KUWVALSTR1; /*!< Key Wrap Unwrap Validation String [63:32] */ + __O uint32_t KUWVALSTR2; /*!< Key Wrap Unwrap Validation String [31:0] */ +} ADI_CRYPT_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_TypeDef__ */ + +/*!@}*/ + +/** @defgroup PMG Power Management (PMG) Module + * Power Management + * @{ + */ + +/*! ========================================================================== + * \struct ADI_PMG_TypeDef + * \brief Power Management + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_TypeDef__ +typedef struct _ADI_PMG_TypeDef +{ + __IO uint32_t IEN; /*!< Power Supply Monitor Interrupt Enable */ + __IO uint32_t PSM_STAT; /*!< Power Supply Monitor Status */ + __IO uint32_t PWRMOD; /*!< Power Mode Register */ + __O uint32_t PWRKEY; /*!< Key Protection for PWRMOD and SRAMRET */ + __I __C uint32_t SHDN_STAT; /*!< Shutdown Status Register */ + __IO uint32_t SRAMRET; /*!< Control for Retention SRAM in Hibernate Mode */ + __I __C uint8_t RESERVED0[32]; + __IO uint32_t TRIM; /*!< Trimming Bits */ + __I __C uint8_t RESERVED1[4]; + __IO uint32_t RST_STAT; /*!< Reset Status */ + __IO uint32_t CTL1; /*!< HPBUCK Control */ + __I __C uint8_t RESERVED2[20]; +} ADI_PMG_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_TypeDef__ */ + +/*!@}*/ + +/** @defgroup XINT External interrupt configuration (XINT) Module + * External interrupt configuration + * @{ + */ + +/*! ========================================================================== + * \struct ADI_XINT_TypeDef + * \brief External interrupt configuration + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_XINT_TypeDef__ +typedef struct _ADI_XINT_TypeDef +{ + __IO uint32_t CFG0; /*!< External Interrupt configuration */ + __I __C uint32_t EXT_STAT; /*!< External Wakeup Interrupt Status register */ + __I __C uint8_t RESERVED0[8]; + __IO uint32_t CLR; /*!< External Interrupt clear */ + __IO uint32_t NMICLR; /*!< Non-maskable interrupt clear */ +} ADI_XINT_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_XINT_TypeDef__ */ + +/*!@}*/ + +/** @defgroup CLKG_OSC Clocking (CLKG_OSC) Module + * Clocking + * @{ + */ + +/*! ========================================================================== + * \struct ADI_CLKG_OSC_TypeDef + * \brief Clocking + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CLKG_OSC_TypeDef__ +typedef struct _ADI_CLKG_OSC_TypeDef +{ + __I __C uint8_t RESERVED0[12]; + __O uint32_t KEY; /*!< Key Protection for OSCCTRL */ + __IO uint32_t CTL; /*!< Oscillator Control */ + __I __C uint8_t RESERVED1[8]; +} ADI_CLKG_OSC_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CLKG_OSC_TypeDef__ */ + +/*!@}*/ + +/** @defgroup PMG_TST Power Management (PMG_TST) Module + * Power Management + * @{ + */ + +/*! ========================================================================== + * \struct ADI_PMG_TST_TypeDef + * \brief Power Management + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_TST_TypeDef__ +typedef struct _ADI_PMG_TST_TypeDef +{ + __I __C uint8_t RESERVED0[96]; + __IO uint32_t SRAM_CTL; /*!< Control for SRAM Parity and Instruction SRAM */ + __I __C uint32_t SRAM_INITSTAT; /*!< Initialization Status Register */ + __O uint16_t CLR_LATCH_GPIOS; /*!< Clear GPIO After Shutdown Mode */ + __I __C uint8_t RESERVED1[2]; + __IO uint32_t SCRPAD_IMG; /*!< Scratch Pad Image */ + __I __C uint32_t SCRPAD_3V_RD; /*!< Scratch Pad Saved in Battery Domain */ + __IO uint32_t FAST_SHT_WAKEUP; /*!< Fast Shutdown Wake-up Enable */ +} ADI_PMG_TST_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_TST_TypeDef__ */ + +/*!@}*/ + +/** @defgroup CLKG_CLK Clocking (CLKG_CLK) Module + * Clocking + * @{ + */ + +/*! ========================================================================== + * \struct ADI_CLKG_CLK_TypeDef + * \brief Clocking + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CLKG_CLK_TypeDef__ +typedef struct _ADI_CLKG_CLK_TypeDef +{ + __IO uint32_t CTL0; /*!< Misc Clock Settings */ + __IO uint32_t CTL1; /*!< Clock Dividers */ + __IO uint32_t CTL2; /*!< HF Oscillator Divided Clock Select */ + __IO uint32_t CTL3; /*!< System PLL */ + __I __C uint8_t RESERVED0[4]; + __IO uint32_t CTL5; /*!< User Clock Gating Control */ + __IO uint32_t STAT0; /*!< Clocking Status */ + __I __C uint8_t RESERVED1[20]; +} ADI_CLKG_CLK_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CLKG_CLK_TypeDef__ */ + +/*!@}*/ + +/** @defgroup BUSM Bus matrix (BUSM) Module + * Bus matrix + * @{ + */ + +/*! ========================================================================== + * \struct ADI_BUSM_TypeDef + * \brief Bus matrix + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_BUSM_TypeDef__ +typedef struct _ADI_BUSM_TypeDef +{ + __IO uint32_t ARBIT0; /*!< Arbitration Priority Configuration for FLASH and SRAM0 */ + __IO uint32_t ARBIT1; /*!< Arbitration Priority Configuration for SRAM1 and SIP */ + __IO uint32_t ARBIT2; /*!< Arbitration Priority Configuration for APB32 and APB16 */ + __IO uint32_t ARBIT3; /*!< Arbitration Priority Configuration for APB16 priority for core and for DMA1 */ + __I __C uint8_t RESERVED0[4]; + __IO uint32_t ARBIT4; /*!< Arbitration Priority Configuration for SRAM1 and SIP */ +} ADI_BUSM_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_BUSM_TypeDef__ */ + +/*!@}*/ + +/** @defgroup PTI Parallel Test Interface (PTI) Module + * Parallel Test Interface + * @{ + */ + +/*! ========================================================================== + * \struct ADI_PTI_TypeDef + * \brief Parallel Test Interface + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PTI_TypeDef__ +typedef struct _ADI_PTI_TypeDef +{ + __IO uint32_t RST_ISR_STARTADDR; /*!< Reset ISR Start Address */ + __IO uint32_t RST_STACK_PTR; /*!< Reset Stack Pointer */ + __IO uint32_t CTL; /*!< Parallel Test Interface Control Register */ +} ADI_PTI_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PTI_TypeDef__ */ + +/*!@}*/ + +/** @defgroup NVIC Cortex-M3 Interrupt Controller (NVIC) Module + * Cortex-M3 Interrupt Controller + * @{ + */ + +/*! ========================================================================== + * \struct ADI_NVIC_TypeDef + * \brief Cortex-M3 Interrupt Controller + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_TypeDef__ +typedef struct _ADI_NVIC_TypeDef +{ + __I __C uint8_t RESERVED0[4]; + __IO uint32_t INTNUM; /*!< Interrupt Control Type */ + __I __C uint8_t RESERVED1[8]; + __IO uint32_t STKSTA; /*!< Systick Control and Status */ + __IO uint32_t STKLD; /*!< Systick Reload Value */ + __IO uint32_t STKVAL; /*!< Systick Current Value */ + __IO uint32_t STKCAL; /*!< Systick Calibration Value */ + __I __C uint8_t RESERVED2[224]; + __IO uint32_t INTSETE0; /*!< IRQ0..31 Set_Enable */ + __IO uint32_t INTSETE1; /*!< IRQ32..63 Set_Enable */ + __I __C uint8_t RESERVED3[120]; + __IO uint32_t INTCLRE0; /*!< IRQ0..31 Clear_Enable */ + __IO uint32_t INTCLRE1; /*!< IRQ32..63 Clear_Enable */ + __I __C uint8_t RESERVED4[120]; + __IO uint32_t INTSETP0; /*!< IRQ0..31 Set_Pending */ + __IO uint32_t INTSETP1; /*!< IRQ32..63 Set_Pending */ + __I __C uint8_t RESERVED5[120]; + __IO uint32_t INTCLRP0; /*!< IRQ0..31 Clear_Pending */ + __IO uint32_t INTCLRP1; /*!< IRQ32..63 Clear_Pending */ + __I __C uint8_t RESERVED6[120]; + __IO uint32_t INTACT0; /*!< IRQ0..31 Active Bit */ + __IO uint32_t INTACT1; /*!< IRQ32..63 Active Bit */ + __I __C uint8_t RESERVED7[248]; + __IO uint32_t INTPRI0; /*!< IRQ0..3 Priority */ + __IO uint32_t INTPRI1; /*!< IRQ4..7 Priority */ + __IO uint32_t INTPRI2; /*!< IRQ8..11 Priority */ + __IO uint32_t INTPRI3; /*!< IRQ12..15 Priority */ + __IO uint32_t INTPRI4; /*!< IRQ16..19 Priority */ + __IO uint32_t INTPRI5; /*!< IRQ20..23 Priority */ + __IO uint32_t INTPRI6; /*!< IRQ24..27 Priority */ + __IO uint32_t INTPRI7; /*!< IRQ28..31 Priority */ + __IO uint32_t INTPRI8; /*!< IRQ32..35 Priority */ + __IO uint32_t INTPRI9; /*!< IRQ36..39 Priority */ + __IO uint32_t INTPRI10; /*!< IRQ40..43 Priority */ + __I __C uint8_t RESERVED8[2260]; + __IO uint32_t INTCPID; /*!< CPUID Base */ + __IO uint32_t INTSTA; /*!< Interrupt Control State */ + __IO uint32_t INTVEC; /*!< Vector Table Offset */ + __IO uint32_t INTAIRC; /*!< Application Interrupt/Reset Control */ + __IO uint16_t INTCON0; /*!< System Control */ + __I __C uint8_t RESERVED9[2]; + __IO uint32_t INTCON1; /*!< Configuration Control */ + __IO uint32_t INTSHPRIO0; /*!< System Handlers 4-7 Priority */ + __IO uint32_t INTSHPRIO1; /*!< System Handlers 8-11 Priority */ + __IO uint32_t INTSHPRIO3; /*!< System Handlers 12-15 Priority */ + __IO uint32_t INTSHCSR; /*!< System Handler Control and State */ + __IO uint32_t INTCFSR; /*!< Configurable Fault Status */ + __IO uint32_t INTHFSR; /*!< Hard Fault Status */ + __IO uint32_t INTDFSR; /*!< Debug Fault Status */ + __IO uint32_t INTMMAR; /*!< Mem Manage Address */ + __IO uint32_t INTBFAR; /*!< Bus Fault Address */ + __IO uint32_t INTAFSR; /*!< Auxiliary Fault Status */ + __IO uint32_t INTPFR0; /*!< Processor Feature Register 0 */ + __IO uint32_t INTPFR1; /*!< Processor Feature Register 1 */ + __IO uint32_t INTDFR0; /*!< Debug Feature Register 0 */ + __IO uint32_t INTAFR0; /*!< Auxiliary Feature Register 0 */ + __IO uint32_t INTMMFR0; /*!< Memory Model Feature Register 0 */ + __IO uint32_t INTMMFR1; /*!< Memory Model Feature Register 1 */ + __IO uint32_t INTMMFR2; /*!< Memory Model Feature Register 2 */ + __IO uint32_t INTMMFR3; /*!< Memory Model Feature Register 3 */ + __IO uint32_t INTISAR0; /*!< ISA Feature Register 0 */ + __IO uint32_t INTISAR1; /*!< ISA Feature Register 1 */ + __IO uint32_t INTISAR2; /*!< ISA Feature Register 2 */ + __IO uint32_t INTISAR3; /*!< ISA Feature Register 3 */ + __IO uint32_t INTISAR4; /*!< ISA Feature Register 4 */ + __I __C uint8_t RESERVED10[396]; + __IO uint32_t INTTRGI; /*!< Software Trigger Interrupt Register */ + __I __C uint8_t RESERVED11[204]; + __IO uint32_t INTPID4; /*!< Peripheral Identification Register 4 */ + __IO uint32_t INTPID5; /*!< Peripheral Identification Register 5 */ + __IO uint32_t INTPID6; /*!< Peripheral Identification Register 6 */ + __IO uint32_t INTPID7; /*!< Peripheral Identification Register 7 */ + __IO uint32_t INTPID0; /*!< Peripheral Identification Bits7:0 */ + __IO uint32_t INTPID1; /*!< Peripheral Identification Bits15:8 */ + __IO uint32_t INTPID2; /*!< Peripheral Identification Bits16:23 */ + __IO uint32_t INTPID3; /*!< Peripheral Identification Bits24:31 */ + __IO uint32_t INTCID0; /*!< Component Identification Bits7:0 */ + __IO uint32_t INTCID1; /*!< Component Identification Bits15:8 */ + __IO uint32_t INTCID2; /*!< Component Identification Bits16:23 */ + __IO uint32_t INTCID3; /*!< Component Identification Bits24:31 */ +} ADI_NVIC_TypeDef; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_TypeDef__ */ + +/*!@}*/ + +/* ****************************************************************************** + * Peripheral Memory Map Declarations + * *****************************************************************************/ +/*! @defgroup PMEMMAPDEC Peripheral Memory Map Declarations + * \addtogroup PMEMMAPDEC + * @{ */ +#define ADI_TMR0_BASE 0x40000000 /*!< Base address of TMR0 */ +#define ADI_TMR1_BASE 0x40000400 /*!< Base address of TMR1 */ +#define ADI_TMR2_BASE 0x40000800 /*!< Base address of TMR2 */ +#define ADI_TMR_RGB_BASE 0x40000c00 /*!< Base address of TMR_RGB */ +#define ADI_RTC0_BASE 0x40001000 /*!< Base address of RTC0 */ +#define ADI_RTC1_BASE 0x40001400 /*!< Base address of RTC1 */ +#define ADI_SYS_BASE 0x40002000 /*!< Base address of SYS */ +#define ADI_WDT0_BASE 0x40002c00 /*!< Base address of WDT0 */ +#define ADI_I2C0_BASE 0x40003000 /*!< Base address of I2C0 */ +#define ADI_SPI0_BASE 0x40004000 /*!< Base address of SPI0 */ +#define ADI_SPI1_BASE 0x40004400 /*!< Base address of SPI1 */ +#define ADI_SPI2_BASE 0x40024000 /*!< Base address of SPI2 */ +#define ADI_UART0_BASE 0x40005000 /*!< Base address of UART0 */ +#define ADI_UART1_BASE 0x40005400 /*!< Base address of UART1 */ +#define ADI_BEEP0_BASE 0x40005c00 /*!< Base address of BEEP0 */ +#define ADI_ADC0_BASE 0x40007000 /*!< Base address of ADC0 */ +#define ADI_DMA0_BASE 0x40010000 /*!< Base address of DMA0 */ +#define ADI_FLCC0_BASE 0x40018000 /*!< Base address of FLCC0 */ +#define ADI_FLCC0_CACHE_BASE 0x40018058 /*!< Base address of FLCC0_CACHE */ +#define ADI_GPIO0_BASE 0x40020000 /*!< Base address of GPIO0 */ +#define ADI_GPIO1_BASE 0x40020040 /*!< Base address of GPIO1 */ +#define ADI_GPIO2_BASE 0x40020080 /*!< Base address of GPIO2 */ +#define ADI_GPIO3_BASE 0x400200c0 /*!< Base address of GPIO3 */ +#define ADI_SPORT0_BASE 0x40038000 /*!< Base address of SPORT0 */ +#define ADI_CRC0_BASE 0x40040000 /*!< Base address of CRC0 */ +#define ADI_RNG0_BASE 0x40040400 /*!< Base address of RNG0 */ +#define ADI_CRYPT0_BASE 0x40044000 /*!< Base address of CRYPT0 */ +#define ADI_PMG0_BASE 0x4004c000 /*!< Base address of PMG0 */ +#define ADI_XINT0_BASE 0x4004c080 /*!< Base address of XINT0 */ +#define ADI_CLKG0_OSC_BASE 0x4004c100 /*!< Base address of CLKG0_OSC */ +#define ADI_PMG0_TST_BASE 0x4004c200 /*!< Base address of PMG0_TST */ +#define ADI_CLKG0_CLK_BASE 0x4004c300 /*!< Base address of CLKG0_CLK */ +#define ADI_BUSM0_BASE 0x4004c800 /*!< Base address of BUSM0 */ +#define ADI_PTI0_BASE 0x4004cd00 /*!< Base address of PTI0 */ +#define ADI_NVIC0_BASE 0xe000e000 /*!< Base address of NVIC0 */ + +/*! @} */ + +/* ****************************************************************************** + * Peripheral Pointer Declarations + * *****************************************************************************/ +/*! @Defgroup Pptrdec Peripheral Pointer Declarations + * \Addtogroup Pptrdec + * @{ */ +#define pADI_TMR0 ((ADI_TMR_TypeDef *) ADI_TMR0_BASE ) /*!< Pointer to General Purpose Timer (TMR0) */ +#define pADI_TMR1 ((ADI_TMR_TypeDef *) ADI_TMR1_BASE ) /*!< Pointer to General Purpose Timer (TMR1) */ +#define pADI_TMR2 ((ADI_TMR_TypeDef *) ADI_TMR2_BASE ) /*!< Pointer to General Purpose Timer (TMR2) */ +#define pADI_TMR_RGB ((ADI_TMR_RGB_TypeDef *) ADI_TMR_RGB_BASE ) /*!< Pointer to Timer_RGB with 3 PWM outputs (TMR_RGB) */ +#define pADI_RTC0 ((ADI_RTC_TypeDef *) ADI_RTC0_BASE ) /*!< Pointer to Real-Time Clock (RTC0) */ +#define pADI_RTC1 ((ADI_RTC_TypeDef *) ADI_RTC1_BASE ) /*!< Pointer to Real-Time Clock (RTC1) */ +#define pADI_SYS ((ADI_SYS_TypeDef *) ADI_SYS_BASE ) /*!< Pointer to System Identification and Debug Enable (SYS) */ +#define pADI_WDT0 ((ADI_WDT_TypeDef *) ADI_WDT0_BASE ) /*!< Pointer to Watchdog Timer (WDT0) */ +#define pADI_I2C0 ((ADI_I2C_TypeDef *) ADI_I2C0_BASE ) /*!< Pointer to I2C Master/Slave (I2C0) */ +#define pADI_SPI0 ((ADI_SPI_TypeDef *) ADI_SPI0_BASE ) /*!< Pointer to Serial Peripheral Interface (SPI0) */ +#define pADI_SPI1 ((ADI_SPI_TypeDef *) ADI_SPI1_BASE ) /*!< Pointer to Serial Peripheral Interface (SPI1) */ +#define pADI_SPI2 ((ADI_SPI_TypeDef *) ADI_SPI2_BASE ) /*!< Pointer to Serial Peripheral Interface (SPI2) */ +#define pADI_UART0 ((ADI_UART_TypeDef *) ADI_UART0_BASE ) /*!< Pointer to (UART0) */ +#define pADI_UART1 ((ADI_UART_TypeDef *) ADI_UART1_BASE ) /*!< Pointer to (UART1) */ +#define pADI_BEEP0 ((ADI_BEEP_TypeDef *) ADI_BEEP0_BASE ) /*!< Pointer to Beeper Driver (BEEP0) */ +#define pADI_ADC0 ((ADI_ADC_TypeDef *) ADI_ADC0_BASE ) /*!< Pointer to (ADC0) */ +#define pADI_DMA0 ((ADI_DMA_TypeDef *) ADI_DMA0_BASE ) /*!< Pointer to DMA (DMA0) */ +#define pADI_FLCC0 ((ADI_FLCC_TypeDef *) ADI_FLCC0_BASE ) /*!< Pointer to Flash Controller (FLCC0) */ +#define pADI_FLCC0_CACHE ((ADI_FLCC_CACHE_TypeDef *) ADI_FLCC0_CACHE_BASE) /*!< Pointer to Cache Controller (FLCC0_CACHE) */ +#define pADI_GPIO0 ((ADI_GPIO_TypeDef *) ADI_GPIO0_BASE ) /*!< Pointer to (GPIO0) */ +#define pADI_GPIO1 ((ADI_GPIO_TypeDef *) ADI_GPIO1_BASE ) /*!< Pointer to (GPIO1) */ +#define pADI_GPIO2 ((ADI_GPIO_TypeDef *) ADI_GPIO2_BASE ) /*!< Pointer to (GPIO2) */ +#define pADI_GPIO3 ((ADI_GPIO_TypeDef *) ADI_GPIO3_BASE ) /*!< Pointer to (GPIO3) */ +#define pADI_SPORT0 ((ADI_SPORT_TypeDef *) ADI_SPORT0_BASE ) /*!< Pointer to Serial Port (SPORT0) */ +#define pADI_CRC0 ((ADI_CRC_TypeDef *) ADI_CRC0_BASE ) /*!< Pointer to CRC Accelerator (CRC0) */ +#define pADI_RNG0 ((ADI_RNG_TypeDef *) ADI_RNG0_BASE ) /*!< Pointer to Random Number Generator (RNG0) */ +#define pADI_CRYPT0 ((ADI_CRYPT_TypeDef *) ADI_CRYPT0_BASE ) /*!< Pointer to Register Map for the Crypto Block (CRYPT0) */ +#define pADI_PMG0 ((ADI_PMG_TypeDef *) ADI_PMG0_BASE ) /*!< Pointer to Power Management (PMG0) */ +#define pADI_XINT0 ((ADI_XINT_TypeDef *) ADI_XINT0_BASE ) /*!< Pointer to External interrupt configuration (XINT0) */ +#define pADI_CLKG0_OSC ((ADI_CLKG_OSC_TypeDef *) ADI_CLKG0_OSC_BASE ) /*!< Pointer to Clocking (CLKG0_OSC) */ +#define pADI_PMG0_TST ((ADI_PMG_TST_TypeDef *) ADI_PMG0_TST_BASE ) /*!< Pointer to Power Management (PMG0_TST) */ +#define pADI_CLKG0_CLK ((ADI_CLKG_CLK_TypeDef *) ADI_CLKG0_CLK_BASE ) /*!< Pointer to Clocking (CLKG0_CLK) */ +#define pADI_BUSM0 ((ADI_BUSM_TypeDef *) ADI_BUSM0_BASE ) /*!< Pointer to Bus matrix (BUSM0) */ +#define pADI_PTI0 ((ADI_PTI_TypeDef *) ADI_PTI0_BASE ) /*!< Pointer to Parallel Test Interface (PTI0) */ +#define pADI_NVIC0 ((ADI_NVIC_TypeDef *) ADI_NVIC0_BASE ) /*!< Pointer to Cortex-M3 Interrupt Controller (NVIC0) */ + +/*! @} */ + + +/* ========================================================================= + *! \enum IRQn_Type + *! \brief Interrupt Number Assignments + * ========================================================================= */ +#ifndef __ADI_NO_DECL_ENUM_IRQn_Type__ + +typedef enum +{ + RESET_IRQn = -15, /*!< Cortex-M4 Reset */ + NonMaskableInt_IRQn = -14, /*!< Cortex-M4 Non-maskable Interrupt */ + HardFault_IRQn = -13, /*!< Cortex-M4 Hardware Fault */ + MemoryManagement_IRQn = -12, /*!< Cortex-M4 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< Cortex-M4 Bus Fault */ + UsageFault_IRQn = -10, /*!< Cortex-M4 Usage Fault */ + SVCall_IRQn = -5, /*!< Cortex-M4 SVCall Interrupt */ + DebugMonitor_IRQn = -4, /*!< Cortex-M4 Debug Monitor */ + PendSV_IRQn = -2, /*!< Cortex-M4 PendSV Interrupt */ + SysTick_IRQn = -1, /*!< Cortex-M4 SysTick Interrupt */ + RTC1_EVT_IRQn = 0, /*!< Event */ + XINT_EVT0_IRQn = 1, /*!< External Wakeup Interrupt n */ + XINT_EVT1_IRQn = 2, /*!< External Wakeup Interrupt n */ + XINT_EVT2_IRQn = 3, /*!< External Wakeup Interrupt n */ + XINT_EVT3_IRQn = 4, /*!< External Wakeup Interrupt n */ + WDT_EXP_IRQn = 5, /*!< Expiration */ + PMG0_VREG_OVR_IRQn = 6, /*!< Voltage Regulator (VREG) Overvoltage */ + PMG0_BATT_RANGE_IRQn = 7, /*!< Battery Voltage (VBAT) Out of Range */ + RTC0_EVT_IRQn = 8, /*!< Event */ + SYS_GPIO_INTA_IRQn = 9, /*!< GPIO Interrupt A */ + SYS_GPIO_INTB_IRQn = 10, /*!< GPIO Interrupt B */ + TMR0_EVT_IRQn = 11, /*!< Event */ + TMR1_EVT_IRQn = 12, /*!< Event */ + FLCC_EVT_IRQn = 13, /*!< Event */ + UART0_EVT_IRQn = 14, /*!< UART0 Event */ + SPI0_EVT_IRQn = 15, /*!< Event */ + SPI2_EVT_IRQn = 16, /*!< Event */ + I2C_SLV_EVT_IRQn = 17, /*!< Slave Event */ + I2C_MST_EVT_IRQn = 18, /*!< Master Event */ + DMA_CHAN_ERR_IRQn = 19, /*!< Channel Error */ + DMA0_CH0_DONE_IRQn = 20, /*!< Channel 0 Done */ + DMA0_CH1_DONE_IRQn = 21, /*!< Channel 1 Done */ + DMA0_CH2_DONE_IRQn = 22, /*!< Channel 2 Done */ + DMA0_CH3_DONE_IRQn = 23, /*!< Channel 3 Done */ + DMA0_CH4_DONE_IRQn = 24, /*!< Channel 4 Done */ + DMA0_CH5_DONE_IRQn = 25, /*!< Channel 5 Done */ + DMA0_CH6_DONE_IRQn = 26, /*!< Channel 6 Done */ + DMA0_CH7_DONE_IRQn = 27, /*!< Channel 7 Done */ + DMA0_CH8_DONE_IRQn = 28, /*!< Channel 8 Done */ + DMA0_CH9_DONE_IRQn = 29, /*!< Channel 9 Done */ + DMA0_CH10_DONE_IRQn = 30, /*!< Channel 10 Done */ + DMA0_CH11_DONE_IRQn = 31, /*!< Channel 11 Done */ + DMA0_CH12_DONE_IRQn = 32, /*!< Channel 12 Done */ + DMA0_CH13_DONE_IRQn = 33, /*!< Channel 13 Done */ + DMA0_CH14_DONE_IRQn = 34, /*!< Channel 14 Done */ + DMA0_CH15_DONE_IRQn = 35, /*!< Channel 15 Done */ + SPORT_A_EVT_IRQn = 36, /*!< Channel A Event */ + SPORT_B_EVT_IRQn = 37, /*!< Channel B Event */ + CRYPT_EVT_IRQn = 38, /*!< Event */ + DMA0_CH24_DONE_IRQn = 39, /*!< Channel 24 Done */ + TMR2_EVT_IRQn = 40, /*!< Event */ + CLKG_XTAL_OSC_EVT_IRQn = 41, /*!< Crystal Oscillator Event */ + SPI1_EVT_IRQn = 42, /*!< Event */ + CLKG_PLL_EVT_IRQn = 43, /*!< PLL Event */ + RNG0_EVT_IRQn = 44, /*!< Event */ + BEEP_EVT_IRQn = 45, /*!< Event */ + ADC0_EVT_IRQn = 46, /*!< Event */ + DMA0_CH16_DONE_IRQn = 56, /*!< Channel 16 Done */ + DMA0_CH17_DONE_IRQn = 57, /*!< Channel 17 Done */ + DMA0_CH18_DONE_IRQn = 58, /*!< Channel 18 Done */ + DMA0_CH19_DONE_IRQn = 59, /*!< Channel 19 Done */ + DMA0_CH20_DONE_IRQn = 60, /*!< Channel 20 Done */ + DMA0_CH21_DONE_IRQn = 61, /*!< Channel 21 Done */ + DMA0_CH22_DONE_IRQn = 62, /*!< Channel 22 Done */ + DMA0_CH23_DONE_IRQn = 63, /*!< Channel 23 Done */ + UART1_EVT_IRQn = 66, /*!< Event */ + DMA0_CH25_DONE_IRQn = 67, /*!< Channel 25 Done */ + DMA0_CH26_DONE_IRQn = 68, /*!< Channel 26 Done */ + TMR_RGB_EVT_IRQn = 69, /*!< Event */ + CLKG_ROOTCLK_ERR_IRQn = 71, /*!< Root Clock Error */ +} IRQn_Type; /* typedef name for fixed interrupt numbers */ +#endif /* !__ADI_NO_DECL_ENUM_IRQn_Type__ */ + + + +#if defined (_MISRA_RULES) +#pragma diag(pop) +#endif /* _MISRA_RULES */ + + +#if defined (__CC_ARM) +#pragma pop +#endif + +#endif diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050_typedefs.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050_typedefs.h new file mode 100755 index 0000000000..356eea0165 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_ADuCM4050_typedefs.h @@ -0,0 +1,11252 @@ +/* ================================================================================ + + Project : ADuCM4050 + File : ADuCM4050_typedefs.h + Description : C Register Structures + + Date : Feb 7, 2017 + + Copyright (c) 2014-2017 Analog Devices, Inc. All Rights Reserved. + This software is proprietary and confidential to Analog Devices, Inc. and + its licensors. + + This file was auto-generated. Do not make local changes to this file. + + ================================================================================ */ + +#ifndef _ADUCM4050_TYPEDEFS_H +#define _ADUCM4050_TYPEDEFS_H + +/* pickup integer types */ +#if defined(_LANGUAGE_C) || (defined(__GNUC__) && !defined(__ASSEMBLER__)) +#include +#endif /* _LANGUAGE_C */ + +#if defined ( __CC_ARM ) +#pragma push +#pragma anon_unions +#endif + + +#if defined (_MISRA_RULES) +/* + anonymous unions violate ISO 9899:1990 and therefore MISRA Rule 1.1. + Use of unions violates MISRA Rule 18.4. + Anonymous unions are required for this implementation. + Re-use of identifiers violates MISRA Rule 5.7. + Field names are repeated for the ADuCM4050 register map. +*/ +#pragma diag(push) +#pragma diag(suppress:misra_rule_1_1:"Allow anonymous unions") +#pragma diag(suppress:misra_rule_5_1:"Allow names over 32 character limit") +#pragma diag(suppress:misra_rule_5_3:"Header will re-use typedef identifiers") +#pragma diag(suppress:misra_rule_5_6:"Header will re-use identifiers in the same scope") +#pragma diag(suppress:misra_rule_5_7:"Header will re-use identifiers") +#pragma diag(suppress:misra_rule_18_4:"Allow the use of a union") +#endif /* _MISRA_RULES */ + +/** @defgroup LOAD 16-bit Load Value (LOAD) Register + * 16-bit Load Value (LOAD) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_LOAD_Struct + *! \brief 16-bit Load Value Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_LOAD_t__ +typedef struct _ADI_TMR_LOAD_t { + union { + struct { + unsigned int VALUE : 16; /**< Load Value */ + }; + uint16_t VALUE16; + }; +} ADI_TMR_LOAD_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_LOAD_t__ */ + +/*@}*/ + +/** @defgroup CURCNT 16-bit Timer Value (CURCNT) Register + * 16-bit Timer Value (CURCNT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_CURCNT_Struct + *! \brief 16-bit Timer Value Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_CURCNT_t__ +typedef struct _ADI_TMR_CURCNT_t { + union { + struct { + unsigned int VALUE : 16; /**< Current Count */ + }; + uint16_t VALUE16; + }; +} ADI_TMR_CURCNT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_CURCNT_t__ */ + +/*@}*/ + +/** @defgroup CTL Control (CTL) Register + * Control (CTL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_CTL_Struct + *! \brief Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_CTL_t__ +typedef struct _ADI_TMR_CTL_t { + union { + struct { + unsigned int PRE : 2; /**< Prescaler */ + unsigned int UP : 1; /**< Count up */ + unsigned int MODE : 1; /**< Timer Mode */ + unsigned int EN : 1; /**< Timer Enable */ + unsigned int CLK : 2; /**< Clock Select */ + unsigned int RLD : 1; /**< Reload Control */ + unsigned int reserved8 : 5; + unsigned int EVTEN : 1; /**< Event Select */ + unsigned int RSTEN : 1; /**< Counter and Prescale Reset Enable */ + unsigned int SYNCBYP : 1; /**< Synchronization Bypass */ + }; + uint16_t VALUE16; + }; +} ADI_TMR_CTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_CTL_t__ */ + +/*@}*/ + +/** @defgroup CLRINT Clear Interrupt (CLRINT) Register + * Clear Interrupt (CLRINT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_CLRINT_Struct + *! \brief Clear Interrupt Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_CLRINT_t__ +typedef struct _ADI_TMR_CLRINT_t { + union { + struct { + unsigned int TIMEOUT : 1; /**< Clear Timeout Interrupt */ + unsigned int EVTCAPT : 1; /**< Clear Captured Event Interrupt */ + unsigned int reserved2 : 14; + }; + uint16_t VALUE16; + }; +} ADI_TMR_CLRINT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_CLRINT_t__ */ + +/*@}*/ + +/** @defgroup CAPTURE Capture (CAPTURE) Register + * Capture (CAPTURE) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_CAPTURE_Struct + *! \brief Capture Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_CAPTURE_t__ +typedef struct _ADI_TMR_CAPTURE_t { + union { + struct { + unsigned int VALUE : 16; /**< 16-bit Captured Value */ + }; + uint16_t VALUE16; + }; +} ADI_TMR_CAPTURE_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_CAPTURE_t__ */ + +/*@}*/ + +/** @defgroup ALOAD 16-bit Load Value, Asynchronous (ALOAD) Register + * 16-bit Load Value, Asynchronous (ALOAD) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_ALOAD_Struct + *! \brief 16-bit Load Value, Asynchronous Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_ALOAD_t__ +typedef struct _ADI_TMR_ALOAD_t { + union { + struct { + unsigned int VALUE : 16; /**< Load Value, Asynchronous */ + }; + uint16_t VALUE16; + }; +} ADI_TMR_ALOAD_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_ALOAD_t__ */ + +/*@}*/ + +/** @defgroup ACURCNT 16-bit Timer Value, Asynchronous (ACURCNT) Register + * 16-bit Timer Value, Asynchronous (ACURCNT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_ACURCNT_Struct + *! \brief 16-bit Timer Value, Asynchronous Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_ACURCNT_t__ +typedef struct _ADI_TMR_ACURCNT_t { + union { + struct { + unsigned int VALUE : 16; /**< Counter Value */ + }; + uint16_t VALUE16; + }; +} ADI_TMR_ACURCNT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_ACURCNT_t__ */ + +/*@}*/ + +/** @defgroup STAT Status (STAT) Register + * Status (STAT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_STAT_Struct + *! \brief Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_STAT_t__ +typedef struct _ADI_TMR_STAT_t { + union { + struct { + unsigned int TIMEOUT : 1; /**< Timeout Event Occurred */ + unsigned int CAPTURE : 1; /**< Capture Event Pending */ + unsigned int reserved2 : 4; + unsigned int BUSY : 1; /**< Timer Busy */ + unsigned int PDOK : 1; /**< Clear Interrupt Register Synchronization */ + unsigned int CNTRST : 1; /**< Counter Reset Occurring */ + unsigned int reserved9 : 7; + }; + uint16_t VALUE16; + }; +} ADI_TMR_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_STAT_t__ */ + +/*@}*/ + +/** @defgroup PWMCTL PWM Control Register (PWMCTL) Register + * PWM Control Register (PWMCTL) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_TMR_PWMCTL_MATCH + *! \brief PWM Match Enabled (MATCH) Enumerations + * ========================================================================= */ +typedef enum +{ + TMR_PWMCTL_PWM_TOGGLE = 0, /**< PWM in toggle mode */ + TMR_PWMCTL_PWM_MATCH = 1 /**< PWM in match mode */ +} ADI_TMR_PWMCTL_MATCH; + + +/* ========================================================================= + *! \enum ADI_TMR_PWMCTL_IDLESTATE + *! \brief PWM Idle State (IDLESTATE) Enumerations + * ========================================================================= */ +typedef enum +{ + TMR_PWMCTL_IDLE_LOW = 0, /**< PWM idles low */ + TMR_PWMCTL_IDLE_HIGH = 1 /**< PWM idles high */ +} ADI_TMR_PWMCTL_IDLESTATE; + + +/* ========================================================================== + *! \struct ADI_TMR_PWMCTL_Struct + *! \brief PWM Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_PWMCTL_t__ +typedef struct _ADI_TMR_PWMCTL_t { + union { + struct { + unsigned int MATCH : 1; /**< PWM Match Enabled */ + unsigned int IDLESTATE : 1; /**< PWM Idle State */ + unsigned int reserved2 : 14; + }; + uint16_t VALUE16; + }; +} ADI_TMR_PWMCTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_PWMCTL_t__ */ + +/*@}*/ + +/** @defgroup PWMMATCH PWM Match Value (PWMMATCH) Register + * PWM Match Value (PWMMATCH) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_PWMMATCH_Struct + *! \brief PWM Match Value Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_PWMMATCH_t__ +typedef struct _ADI_TMR_PWMMATCH_t { + union { + struct { + unsigned int VALUE : 16; /**< PWM Match Value */ + }; + uint16_t VALUE16; + }; +} ADI_TMR_PWMMATCH_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_PWMMATCH_t__ */ + +/*@}*/ + +/** @defgroup EVENTSELECT Timer Event Selection Register (EVENTSELECT) Register + * Timer Event Selection Register (EVENTSELECT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_EVENTSELECT_Struct + *! \brief Timer Event Selection Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_EVENTSELECT_t__ +typedef struct _ADI_TMR_EVENTSELECT_t { + union { + struct { + unsigned int EVTRANGE : 6; /**< Event Select Range */ + unsigned int reserved6 : 10; + }; + uint16_t VALUE16; + }; +} ADI_TMR_EVENTSELECT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_EVENTSELECT_t__ */ + +/*@}*/ + +/** @defgroup LOAD 16-bit load value (LOAD) Register + * 16-bit load value (LOAD) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_RGB_LOAD_Struct + *! \brief 16-bit load value Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_RGB_LOAD_t__ +typedef struct _ADI_TMR_RGB_LOAD_t { + union { + struct { + unsigned int VALUE : 16; /**< Load value */ + }; + uint16_t VALUE16; + }; +} ADI_TMR_RGB_LOAD_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_RGB_LOAD_t__ */ + +/*@}*/ + +/** @defgroup CURCNT 16-bit timer value (CURCNT) Register + * 16-bit timer value (CURCNT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_RGB_CURCNT_Struct + *! \brief 16-bit timer value Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_RGB_CURCNT_t__ +typedef struct _ADI_TMR_RGB_CURCNT_t { + union { + struct { + unsigned int VALUE : 16; /**< Current count */ + }; + uint16_t VALUE16; + }; +} ADI_TMR_RGB_CURCNT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_RGB_CURCNT_t__ */ + +/*@}*/ + +/** @defgroup CTL Control (CTL) Register + * Control (CTL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_RGB_CTL_Struct + *! \brief Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_RGB_CTL_t__ +typedef struct _ADI_TMR_RGB_CTL_t { + union { + struct { + unsigned int PRE : 2; /**< Prescaler */ + unsigned int UP : 1; /**< Count up */ + unsigned int MODE : 1; /**< Timer mode */ + unsigned int EN : 1; /**< Timer enable */ + unsigned int CLK : 2; /**< Clock select */ + unsigned int RLD : 1; /**< Reload control */ + unsigned int reserved8 : 5; + unsigned int EVTEN : 1; /**< Event select */ + unsigned int RSTEN : 1; /**< Counter and prescale reset enable */ + unsigned int SYNCBYP : 1; /**< Synchronization bypass */ + }; + uint16_t VALUE16; + }; +} ADI_TMR_RGB_CTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_RGB_CTL_t__ */ + +/*@}*/ + +/** @defgroup CLRINT Clear interrupt (CLRINT) Register + * Clear interrupt (CLRINT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_RGB_CLRINT_Struct + *! \brief Clear interrupt Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_RGB_CLRINT_t__ +typedef struct _ADI_TMR_RGB_CLRINT_t { + union { + struct { + unsigned int TIMEOUT : 1; /**< Clear timeout interrupt */ + unsigned int EVTCAPT : 1; /**< Clear captured event interrupt */ + unsigned int reserved2 : 14; + }; + uint16_t VALUE16; + }; +} ADI_TMR_RGB_CLRINT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_RGB_CLRINT_t__ */ + +/*@}*/ + +/** @defgroup CAPTURE Capture (CAPTURE) Register + * Capture (CAPTURE) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_RGB_CAPTURE_Struct + *! \brief Capture Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_RGB_CAPTURE_t__ +typedef struct _ADI_TMR_RGB_CAPTURE_t { + union { + struct { + unsigned int VALUE : 16; /**< 16-bit captured value */ + }; + uint16_t VALUE16; + }; +} ADI_TMR_RGB_CAPTURE_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_RGB_CAPTURE_t__ */ + +/*@}*/ + +/** @defgroup ALOAD 16-bit load value, asynchronous (ALOAD) Register + * 16-bit load value, asynchronous (ALOAD) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_RGB_ALOAD_Struct + *! \brief 16-bit load value, asynchronous Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_RGB_ALOAD_t__ +typedef struct _ADI_TMR_RGB_ALOAD_t { + union { + struct { + unsigned int VALUE : 16; /**< Load value, asynchronous */ + }; + uint16_t VALUE16; + }; +} ADI_TMR_RGB_ALOAD_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_RGB_ALOAD_t__ */ + +/*@}*/ + +/** @defgroup ACURCNT 16-bit timer value, asynchronous (ACURCNT) Register + * 16-bit timer value, asynchronous (ACURCNT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_RGB_ACURCNT_Struct + *! \brief 16-bit timer value, asynchronous Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_RGB_ACURCNT_t__ +typedef struct _ADI_TMR_RGB_ACURCNT_t { + union { + struct { + unsigned int VALUE : 16; /**< Counter value */ + }; + uint16_t VALUE16; + }; +} ADI_TMR_RGB_ACURCNT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_RGB_ACURCNT_t__ */ + +/*@}*/ + +/** @defgroup STAT Status (STAT) Register + * Status (STAT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_RGB_STAT_Struct + *! \brief Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_RGB_STAT_t__ +typedef struct _ADI_TMR_RGB_STAT_t { + union { + struct { + unsigned int TIMEOUT : 1; /**< Timeout event occurred */ + unsigned int CAPTURE : 1; /**< Capture event pending */ + unsigned int reserved2 : 4; + unsigned int BUSY : 1; /**< Timer Busy */ + unsigned int PDOK : 1; /**< Clear Interrupt Register synchronization */ + unsigned int CNTRST : 1; /**< Counter reset occurring */ + unsigned int reserved9 : 7; + }; + uint16_t VALUE16; + }; +} ADI_TMR_RGB_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_RGB_STAT_t__ */ + +/*@}*/ + +/** @defgroup PWM0CTL PWM0 Control Register (PWM0CTL) Register + * PWM0 Control Register (PWM0CTL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_RGB_PWM0CTL_Struct + *! \brief PWM0 Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_RGB_PWM0CTL_t__ +typedef struct _ADI_TMR_RGB_PWM0CTL_t { + union { + struct { + unsigned int MATCH : 1; /**< PWM Match enabled */ + unsigned int IDLESTATE : 1; /**< PWM Idle State */ + unsigned int reserved2 : 14; + }; + uint16_t VALUE16; + }; +} ADI_TMR_RGB_PWM0CTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_RGB_PWM0CTL_t__ */ + +/*@}*/ + +/** @defgroup PWM0MATCH PWM0 Match Value (PWM0MATCH) Register + * PWM0 Match Value (PWM0MATCH) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_RGB_PWM0MATCH_Struct + *! \brief PWM0 Match Value Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_RGB_PWM0MATCH_t__ +typedef struct _ADI_TMR_RGB_PWM0MATCH_t { + union { + struct { + unsigned int VALUE : 16; /**< PWM Match Value */ + }; + uint16_t VALUE16; + }; +} ADI_TMR_RGB_PWM0MATCH_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_RGB_PWM0MATCH_t__ */ + +/*@}*/ + +/** @defgroup EVENTSELECT Timer Event selection Register (EVENTSELECT) Register + * Timer Event selection Register (EVENTSELECT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_RGB_EVENTSELECT_Struct + *! \brief Timer Event selection Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_RGB_EVENTSELECT_t__ +typedef struct _ADI_TMR_RGB_EVENTSELECT_t { + union { + struct { + unsigned int EVTRANGE : 6; /**< Event select range */ + unsigned int reserved6 : 10; + }; + uint16_t VALUE16; + }; +} ADI_TMR_RGB_EVENTSELECT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_RGB_EVENTSELECT_t__ */ + +/*@}*/ + +/** @defgroup PWM1CTL PWM1 Control Register (PWM1CTL) Register + * PWM1 Control Register (PWM1CTL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_RGB_PWM1CTL_Struct + *! \brief PWM1 Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_RGB_PWM1CTL_t__ +typedef struct _ADI_TMR_RGB_PWM1CTL_t { + union { + struct { + unsigned int MATCH : 1; /**< PWM Match enabled */ + unsigned int IDLESTATE : 1; /**< PWM Idle State */ + unsigned int reserved2 : 14; + }; + uint16_t VALUE16; + }; +} ADI_TMR_RGB_PWM1CTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_RGB_PWM1CTL_t__ */ + +/*@}*/ + +/** @defgroup PWM1MATCH PWM1 Match Value (PWM1MATCH) Register + * PWM1 Match Value (PWM1MATCH) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_RGB_PWM1MATCH_Struct + *! \brief PWM1 Match Value Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_RGB_PWM1MATCH_t__ +typedef struct _ADI_TMR_RGB_PWM1MATCH_t { + union { + struct { + unsigned int VALUE : 16; /**< PWM Match Value */ + }; + uint16_t VALUE16; + }; +} ADI_TMR_RGB_PWM1MATCH_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_RGB_PWM1MATCH_t__ */ + +/*@}*/ + +/** @defgroup PWM2CTL PWM2 Control Register (PWM2CTL) Register + * PWM2 Control Register (PWM2CTL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_RGB_PWM2CTL_Struct + *! \brief PWM2 Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_RGB_PWM2CTL_t__ +typedef struct _ADI_TMR_RGB_PWM2CTL_t { + union { + struct { + unsigned int MATCH : 1; /**< PWM Match enabled */ + unsigned int IDLESTATE : 1; /**< PWM Idle State */ + unsigned int reserved2 : 14; + }; + uint16_t VALUE16; + }; +} ADI_TMR_RGB_PWM2CTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_RGB_PWM2CTL_t__ */ + +/*@}*/ + +/** @defgroup PWM2MATCH PWM2 Match Value (PWM2MATCH) Register + * PWM2 Match Value (PWM2MATCH) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_TMR_RGB_PWM2MATCH_Struct + *! \brief PWM2 Match Value Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_TMR_RGB_PWM2MATCH_t__ +typedef struct _ADI_TMR_RGB_PWM2MATCH_t { + union { + struct { + unsigned int VALUE : 16; /**< PWM Match Value */ + }; + uint16_t VALUE16; + }; +} ADI_TMR_RGB_PWM2MATCH_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_TMR_RGB_PWM2MATCH_t__ */ + +/*@}*/ + +/** @defgroup CR0 RTC Control 0 (CR0) Register + * RTC Control 0 (CR0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_CR0_Struct + *! \brief RTC Control 0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_CR0_t__ +typedef struct _ADI_RTC_CR0_t { + union { + struct { + unsigned int CNTEN : 1; /**< Global Enable for the RTC */ + unsigned int ALMEN : 1; /**< Enable the RTC Alarm (Absolute) Operation */ + unsigned int ALMINTEN : 1; /**< Enable ALMINT Sourced Alarm Interrupts to the CPU */ + unsigned int TRMEN : 1; /**< Enable RTC Digital Trimming */ + unsigned int MOD60ALMEN : 1; /**< Enable RTC Modulo-60 Counting of Time Past a Modulo-60 Boundary */ + unsigned int MOD60ALM : 6; /**< Periodic, Modulo-60 Alarm Time in Prescaled RTC Time Units Beyond a Modulo-60 Boundary */ + unsigned int MOD60ALMINTEN : 1; /**< Enable Periodic Modulo-60 RTC Alarm Sourced Interrupts to the CPU */ + unsigned int ISOINTEN : 1; /**< Enable ISOINT Sourced Interrupts to the CPU When Isolation of the RTC Power Domain is Activated and Subsequently De-activated */ + unsigned int WPNDERRINTEN : 1; /**< Enable Write Pending Error Sourced Interrupts to the CPU When an RTC Register-write Pending Error Occurs */ + unsigned int WSYNCINTEN : 1; /**< Enable Write Synchronization Sourced Interrupts to the CPU */ + unsigned int WPNDINTEN : 1; /**< Enable Write Pending Sourced Interrupts to the CPU */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_CR0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_CR0_t__ */ + +/*@}*/ + +/** @defgroup SR0 RTC Status 0 (SR0) Register + * RTC Status 0 (SR0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SR0_Struct + *! \brief RTC Status 0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SR0_t__ +typedef struct _ADI_RTC_SR0_t { + union { + struct { + unsigned int reserved0 : 1; + unsigned int ALMINT : 1; /**< Alarm Interrupt Source */ + unsigned int MOD60ALMINT : 1; /**< Modulo-60 RTC Alarm Interrupt Source */ + unsigned int ISOINT : 1; /**< RTC Power-Domain Isolation Interrupt Source */ + unsigned int WPNDERRINT : 1; /**< Write Pending Error Interrupt Source */ + unsigned int WSYNCINT : 1; /**< Write Synchronisation Interrupt */ + unsigned int WPNDINT : 1; /**< Write Pending Interrupt */ + unsigned int WSYNCCR0 : 1; /**< Synchronisation Status of Posted Writes to CR0 */ + unsigned int WSYNCSR0 : 1; /**< Synchronisation Status of Posted Writes to SR0 */ + unsigned int WSYNCCNT0 : 1; /**< Synchronisation Status of Posted Writes to CNT0 */ + unsigned int WSYNCCNT1 : 1; /**< Synchronisation Status of Posted Writes to CNT1 */ + unsigned int WSYNCALM0 : 1; /**< Synchronisation Status of Posted Writes to ALM0 */ + unsigned int WSYNCALM1 : 1; /**< Synchronisation Status of Posted Writes to ALM1 */ + unsigned int WSYNCTRM : 1; /**< Synchronisation Status of Posted Writes to TRM */ + unsigned int ISOENB : 1; /**< Visibility of 32kHz Sourced Registers */ + unsigned int reserved15 : 1; + }; + uint16_t VALUE16; + }; +} ADI_RTC_SR0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SR0_t__ */ + +/*@}*/ + +/** @defgroup SR1 RTC Status 1 (SR1) Register + * RTC Status 1 (SR1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SR1_Struct + *! \brief RTC Status 1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SR1_t__ +typedef struct _ADI_RTC_SR1_t { + union { + struct { + unsigned int reserved0 : 7; + unsigned int WPNDCR0 : 1; /**< Pending Status of Posted Writes to CR0 */ + unsigned int WPNDSR0 : 1; /**< Pending Status of Posted Clearances of Interrupt Sources in SR0 */ + unsigned int WPNDCNT0 : 1; /**< Pending Status of Posted Writes to CNT0 */ + unsigned int WPNDCNT1 : 1; /**< Pending Status of Posted Writes to CNT1 */ + unsigned int WPNDALM0 : 1; /**< Pending Status of Posted Writes to ALM0 */ + unsigned int WPNDALM1 : 1; /**< Pending Status of Posted Writes to ALM1 */ + unsigned int WPNDTRM : 1; /**< Pending Status of Posted Writes to TRM */ + unsigned int reserved14 : 2; + }; + uint16_t VALUE16; + }; +} ADI_RTC_SR1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SR1_t__ */ + +/*@}*/ + +/** @defgroup CNT0 RTC Count 0 (CNT0) Register + * RTC Count 0 (CNT0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_CNT0_Struct + *! \brief RTC Count 0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_CNT0_t__ +typedef struct _ADI_RTC_CNT0_t { + union { + struct { + unsigned int VALUE : 16; /**< Lower 16 Prescaled (Non-Fractional) Bits of the RTC Real-Time Count */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_CNT0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_CNT0_t__ */ + +/*@}*/ + +/** @defgroup CNT1 RTC Count 1 (CNT1) Register + * RTC Count 1 (CNT1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_CNT1_Struct + *! \brief RTC Count 1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_CNT1_t__ +typedef struct _ADI_RTC_CNT1_t { + union { + struct { + unsigned int VALUE : 16; /**< Upper 16 Prescaled (Non-Fractional) Bits of the RTC Real-Time Count */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_CNT1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_CNT1_t__ */ + +/*@}*/ + +/** @defgroup ALM0 RTC Alarm 0 (ALM0) Register + * RTC Alarm 0 (ALM0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_ALM0_Struct + *! \brief RTC Alarm 0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_ALM0_t__ +typedef struct _ADI_RTC_ALM0_t { + union { + struct { + unsigned int VALUE : 16; /**< Lower 16 Prescaled (i.e. Non-Fractional) Bits of the RTC Alarm Target Time */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_ALM0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_ALM0_t__ */ + +/*@}*/ + +/** @defgroup ALM1 RTC Alarm 1 (ALM1) Register + * RTC Alarm 1 (ALM1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_ALM1_Struct + *! \brief RTC Alarm 1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_ALM1_t__ +typedef struct _ADI_RTC_ALM1_t { + union { + struct { + unsigned int VALUE : 16; /**< Upper 16 Prescaled (Non-Fractional) Bits of the RTC Alarm Target Time */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_ALM1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_ALM1_t__ */ + +/*@}*/ + +/** @defgroup TRM RTC Trim (TRM) Register + * RTC Trim (TRM) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_TRM_Struct + *! \brief RTC Trim Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_TRM_t__ +typedef struct _ADI_RTC_TRM_t { + union { + struct { + unsigned int VALUE : 3; /**< Trim Value in Prescaled RTC Time Units to Be Added or Subtracted from the RTC Count at the End of a Periodic Interval Selected by TRM:TRMIVL */ + unsigned int ADD : 1; /**< Trim Polarity */ + unsigned int IVL : 2; /**< Trim Interval in Prescaled RTC Time Units */ + unsigned int IVL2EXPMIN : 4; /**< Minimum Power-of-two Interval of Prescaled RTC Time Units Which TRM:TRMIVL TRMIVL Can Select */ + unsigned int reserved10 : 6; + }; + uint16_t VALUE16; + }; +} ADI_RTC_TRM_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_TRM_t__ */ + +/*@}*/ + +/** @defgroup GWY RTC Gateway (GWY) Register + * RTC Gateway (GWY) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_GWY_Struct + *! \brief RTC Gateway Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_GWY_t__ +typedef struct _ADI_RTC_GWY_t { + union { + struct { + unsigned int SWKEY : 16; /**< Software-keyed Command Issued by the CPU */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_GWY_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_GWY_t__ */ + +/*@}*/ + +/** @defgroup CR1 RTC Control 1 (CR1) Register + * RTC Control 1 (CR1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_CR1_Struct + *! \brief RTC Control 1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_CR1_t__ +typedef struct _ADI_RTC_CR1_t { + union { + struct { + unsigned int CNTINTEN : 1; /**< Enable for the RTC Count Interrupt Source */ + unsigned int PSINTEN : 1; /**< Enable for the Prescaled, Modulo-1 Interrupt Source, in SR2:RTCPSINT */ + unsigned int TRMINTEN : 1; /**< Enable for the RTC Trim Interrupt Source, in SR2:RTCTRMINT */ + unsigned int CNTROLLINTEN : 1; /**< Enable for the RTC Count Roll-Over Interrupt Source, in SR2:RTCCNTROLLINT */ + unsigned int CNTMOD60ROLLINTEN : 1; /**< Enable for the RTC Modulo-60 Count Roll-Over Interrupt Source, in SR2:RTCCNTMOD60ROLLINT */ + unsigned int PRESCALE2EXP : 4; /**< Prescale Power of 2 Division Factor for the RTC Base Clock */ + unsigned int reserved9 : 7; + }; + uint16_t VALUE16; + }; +} ADI_RTC_CR1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_CR1_t__ */ + +/*@}*/ + +/** @defgroup SR2 RTC Status 2 (SR2) Register + * RTC Status 2 (SR2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SR2_Struct + *! \brief RTC Status 2 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SR2_t__ +typedef struct _ADI_RTC_SR2_t { + union { + struct { + unsigned int CNTINT : 1; /**< RTC Count Interrupt Source */ + unsigned int PSINT : 1; /**< RTC Prescaled, Modulo-1 Boundary Interrupt Source */ + unsigned int TRMINT : 1; /**< RTC Trim Interrupt Source */ + unsigned int CNTROLLINT : 1; /**< RTC Count Roll-Over Interrupt Source */ + unsigned int CNTMOD60ROLLINT : 1; /**< RTC Modulo-60 Count Roll-Over Interrupt Source */ + unsigned int CNTROLL : 1; /**< RTC Count Roll-Over */ + unsigned int CNTMOD60ROLL : 1; /**< RTC Count Modulo-60 Roll-Over */ + unsigned int TRMBDYMIR : 1; /**< Mirror of MOD:RTCTRMBDY */ + unsigned int reserved8 : 4; + unsigned int WPNDCR1MIR : 1; /**< Pending Status of Posted Writes to CR1 */ + unsigned int WPNDALM2MIR : 1; /**< Pending Status of Posted Writes to ALM2 */ + unsigned int WSYNCCR1MIR : 1; /**< Synchronization Status of Posted Writes to CR1 */ + unsigned int WSYNCALM2MIR : 1; /**< Synchronization Status of Posted Writes to ALM2 */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SR2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SR2_t__ */ + +/*@}*/ + +/** @defgroup SNAP0 RTC Snapshot 0 (SNAP0) Register + * RTC Snapshot 0 (SNAP0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SNAP0_Struct + *! \brief RTC Snapshot 0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SNAP0_t__ +typedef struct _ADI_RTC_SNAP0_t { + union { + struct { + unsigned int VALUE : 16; /**< Constituent Part of the 47-bit Input Capture Channel 0, Containing a Sticky Snapshot of CNT0 */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SNAP0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SNAP0_t__ */ + +/*@}*/ + +/** @defgroup SNAP1 RTC Snapshot 1 (SNAP1) Register + * RTC Snapshot 1 (SNAP1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SNAP1_Struct + *! \brief RTC Snapshot 1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SNAP1_t__ +typedef struct _ADI_RTC_SNAP1_t { + union { + struct { + unsigned int VALUE : 16; /**< Part of the 47-bit Input Capture Channel 0 Containing a Sticky Snapshot of CNT1 */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SNAP1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SNAP1_t__ */ + +/*@}*/ + +/** @defgroup SNAP2 RTC Snapshot 2 (SNAP2) Register + * RTC Snapshot 2 (SNAP2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SNAP2_Struct + *! \brief RTC Snapshot 2 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SNAP2_t__ +typedef struct _ADI_RTC_SNAP2_t { + union { + struct { + unsigned int VALUE : 15; /**< Part of the 47-bit Input Capture Channel 0 Containing a Sticky Snapshot of CNT2 */ + unsigned int reserved15 : 1; + }; + uint16_t VALUE16; + }; +} ADI_RTC_SNAP2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SNAP2_t__ */ + +/*@}*/ + +/** @defgroup MOD RTC Modulo (MOD) Register + * RTC Modulo (MOD) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_MOD_Struct + *! \brief RTC Modulo Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_MOD_t__ +typedef struct _ADI_RTC_MOD_t { + union { + struct { + unsigned int CNTMOD60 : 6; /**< Modulo-60 Value of the RTC Count: CNT1 and CNT0 */ + unsigned int INCR : 4; /**< Most Recent Increment Value Added to the RTC Count in CNT1 and CNT0 */ + unsigned int TRMBDY : 1; /**< Trim Boundary Indicator */ + unsigned int CNT0_4TOZERO : 5; /**< Mirror of CNT0[4:0] */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_MOD_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_MOD_t__ */ + +/*@}*/ + +/** @defgroup CNT2 RTC Count 2 (CNT2) Register + * RTC Count 2 (CNT2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_CNT2_Struct + *! \brief RTC Count 2 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_CNT2_t__ +typedef struct _ADI_RTC_CNT2_t { + union { + struct { + unsigned int VALUE : 15; /**< Fractional Bits of the RTC Real-Time Count */ + unsigned int reserved15 : 1; + }; + uint16_t VALUE16; + }; +} ADI_RTC_CNT2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_CNT2_t__ */ + +/*@}*/ + +/** @defgroup ALM2 RTC Alarm 2 (ALM2) Register + * RTC Alarm 2 (ALM2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_ALM2_Struct + *! \brief RTC Alarm 2 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_ALM2_t__ +typedef struct _ADI_RTC_ALM2_t { + union { + struct { + unsigned int VALUE : 15; /**< Fractional Bits of the Alarm Target Time */ + unsigned int reserved15 : 1; + }; + uint16_t VALUE16; + }; +} ADI_RTC_ALM2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_ALM2_t__ */ + +/*@}*/ + +/** @defgroup SR3 RTC Status 3 (SR3) Register + * RTC Status 3 (SR3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SR3_Struct + *! \brief RTC Status 3 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SR3_t__ +typedef struct _ADI_RTC_SR3_t { + union { + struct { + unsigned int IC0IRQ : 1; /**< Sticky Interrupt Source for the RTC Input Capture Channel 0 */ + unsigned int reserved1 : 1; + unsigned int IC2IRQ : 1; /**< Sticky Interrupt Source for the RTC Input Capture Channel 2 */ + unsigned int IC3IRQ : 1; /**< Sticky Interrupt Source for the RTC Input Capture Channel 3 */ + unsigned int IC4IRQ : 1; /**< Sticky Interrupt Source for the RTC Input Capture Channel 4 */ + unsigned int SS1FEIRQ : 1; /**< Sticky Interrupt Source for the SensorStrobe Channel 1 Falling Edge */ + unsigned int SS2FEIRQ : 1; /**< Sticky Interrupt Source for the SensorStrobe Channel 2 Falling Edge */ + unsigned int SS3FEIRQ : 1; /**< Sticky Interrupt Source for the SensorStrobe Channel 3 Falling Edge */ + unsigned int SS4FEIRQ : 1; /**< Sticky Interrupt Source for the SensorStrobe Channel 4 Falling Edge */ + unsigned int SS1IRQ : 1; /**< Sticky Interrupt Source for SensorStrobe Channel 1 */ + unsigned int SS2IRQ : 1; /**< Sticky Interrupt Source for the SensorStrobe Channel 2 */ + unsigned int SS3IRQ : 1; /**< Sticky Interrupt Source for the SensorStrobe Channel 3 */ + unsigned int SS4IRQ : 1; /**< Sticky Interrupt Source for the SensorStrobe Channel 4 */ + unsigned int ALMINTMIR : 1; /**< Read-only Mirror of the SR0:ALMINT Interrupt Source */ + unsigned int reserved14 : 2; + }; + uint16_t VALUE16; + }; +} ADI_RTC_SR3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SR3_t__ */ + +/*@}*/ + +/** @defgroup CR2IC RTC Control 2 for Configuring Input Capture Channels (CR2IC) Register + * RTC Control 2 for Configuring Input Capture Channels (CR2IC) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_CR2IC_Struct + *! \brief RTC Control 2 for Configuring Input Capture Channels Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_CR2IC_t__ +typedef struct _ADI_RTC_CR2IC_t { + union { + struct { + unsigned int IC0EN : 1; /**< Enable for the RTC Input Capture Channel 0 */ + unsigned int reserved1 : 1; + unsigned int IC2EN : 1; /**< Enable for the RTC Input Capture Channel 2 */ + unsigned int IC3EN : 1; /**< Enable for the RTC Input Capture Channel 3 */ + unsigned int IC4EN : 1; /**< Enable for the RTC Input Capture Channel 4 */ + unsigned int IC0LH : 1; /**< Polarity of the Active-Going Capture Edge for the RTC Input Capture Channel 0 */ + unsigned int reserved6 : 1; + unsigned int IC2LH : 1; /**< Polarity of the Active-going Capture Edge for the Input Capture Channel 2 */ + unsigned int IC3LH : 1; /**< Polarity of the Active-going Capture Edge for the Input Capture Channel 3 */ + unsigned int IC4LH : 1; /**< Polarity of the Active-going Capture Edge for the Input Capture Channel 4 */ + unsigned int IC0IRQEN : 1; /**< Interrupt Enable for the RTC Input Capture Channel 0 */ + unsigned int reserved11 : 1; + unsigned int IC2IRQEN : 1; /**< Interrupt Enable for the RTC Input Capture Channel 2 */ + unsigned int IC3IRQEN : 1; /**< Interrupt Enable for the RTC Input Capture Channel 3 */ + unsigned int IC4IRQEN : 1; /**< Interrupt Enable for the RTC Input Capture Channel 4 */ + unsigned int ICOWUSEN : 1; /**< Enable Overwrite of Unread Snapshots for All Input Capture Channels */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_CR2IC_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_CR2IC_t__ */ + +/*@}*/ + +/** @defgroup CR3SS RTC Control 3 for Configuring SensorStrobe Channel (CR3SS) Register + * RTC Control 3 for Configuring SensorStrobe Channel (CR3SS) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_CR3SS_Struct + *! \brief RTC Control 3 for Configuring SensorStrobe Channel Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_CR3SS_t__ +typedef struct _ADI_RTC_CR3SS_t { + union { + struct { + unsigned int reserved0 : 1; + unsigned int SS1EN : 1; /**< Enable for SensorStrobe Channel 1 */ + unsigned int SS2EN : 1; /**< Enable for the SensorStrobe Channel 2 */ + unsigned int SS3EN : 1; /**< Enable for the SensorStrobe Channel 3 */ + unsigned int SS4EN : 1; /**< Enable for the SensorStrobe Channel 4 */ + unsigned int SS1FEIRQEN : 1; /**< Falling Edge Interrupt Enable for the SensorStrobe Channel 1 */ + unsigned int SS2FEIRQEN : 1; /**< Falling Edge Interrupt Enable for the SensorStrobe Channel 2 */ + unsigned int SS3FEIRQEN : 1; /**< Falling Edge Interrupt Enable for the SensorStrobe Channel 3 */ + unsigned int SS4FEIRQEN : 1; /**< Falling Edge Interrupt Enable for the SensorStrobe Channel 4 */ + unsigned int SS1IRQEN : 1; /**< Interrupt Enable for SensorStrobe Channel 1 */ + unsigned int SS2IRQEN : 1; /**< Posedge EdgeInterrupt Enable for the SensorStrobe Channel 2 */ + unsigned int SS3IRQEN : 1; /**< Posedge EdgeInterrupt Enable for the SensorStrobe Channel 3 */ + unsigned int SS4IRQEN : 1; /**< Posedge EdgeInterrupt Enable for the SensorStrobe Channel 4 */ + unsigned int reserved13 : 3; + }; + uint16_t VALUE16; + }; +} ADI_RTC_CR3SS_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_CR3SS_t__ */ + +/*@}*/ + +/** @defgroup CR4SS RTC Control 4 for Configuring SensorStrobe Channel (CR4SS) Register + * RTC Control 4 for Configuring SensorStrobe Channel (CR4SS) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_RTC_CR4SS_SS1MSKEN + *! \brief Enable for Thermometer-Code Masking of the SensorStrobe Channel 1 (SS1MSKEN) Enumerations + * ========================================================================= */ +typedef enum +{ + RTC_CR4SS_NO_MSK = 0, /**< Do not apply a mask to SensorStrobe Channel 1 Register */ + RTC_CR4SS_THERM_MSK = 1 /**< Apply thermometer decoded mask */ +} ADI_RTC_CR4SS_SS1MSKEN; + + +/* ========================================================================== + *! \struct ADI_RTC_CR4SS_Struct + *! \brief RTC Control 4 for Configuring SensorStrobe Channel Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_CR4SS_t__ +typedef struct _ADI_RTC_CR4SS_t { + union { + struct { + unsigned int reserved0 : 1; + unsigned int SS1MSKEN : 1; /**< Enable for Thermometer-Code Masking of the SensorStrobe Channel 1 */ + unsigned int SS2MSKEN : 1; /**< Enable for Thermometer-Code Masking of the SensorStrobe Channel 2 */ + unsigned int SS3MSKEN : 1; /**< Enable for Thermometer-Code Masking of the SensorStrobe Channel 3 */ + unsigned int SS4MSKEN : 1; /**< Enable for Thermometer-Code Masking of the SensorStrobe Channel 4 */ + unsigned int SS1POL : 1; /**< SensorSTrobe Channel 1 Polarity Control */ + unsigned int SS2POL : 1; /**< SensorStrobe Channel 2 Polarity Control */ + unsigned int SS3POL : 1; /**< SensorStrobe Channel 3 Polarity Control */ + unsigned int SS4POL : 1; /**< SensorStrobe Channel 4 Polarity Control */ + unsigned int SS1ARLEN : 1; /**< Enable for Fine Control on SensorStrobe Channel 1 Period and Duty Cycle */ + unsigned int SS2ARLEN : 1; /**< Enable for Fine Control on SensorStrobe Channel 2 Period and Duty Cycle */ + unsigned int SS3ARLEN : 1; /**< Enable for Fine Control on SensorStrobe Channel 3 Period and Duty Cycle */ + unsigned int reserved12 : 4; + }; + uint16_t VALUE16; + }; +} ADI_RTC_CR4SS_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_CR4SS_t__ */ + +/*@}*/ + +/** @defgroup SSMSK RTC Mask for SensorStrobe Channel (SSMSK) Register + * RTC Mask for SensorStrobe Channel (SSMSK) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SSMSK_Struct + *! \brief RTC Mask for SensorStrobe Channel Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SSMSK_t__ +typedef struct _ADI_RTC_SSMSK_t { + union { + struct { + unsigned int SS1MSK : 4; /**< Concatenation of Thermometer-Encoded Masks for the 16-bit SensorStrobe Channels */ + unsigned int SS2MSK : 4; /**< SensorStrobe Channel 2 Period Control */ + unsigned int SS3MSK : 4; /**< SensorStrobe Channel 3 Period Control */ + unsigned int SS4MSK : 4; /**< SensorStrobe Channel 4 Period Control */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SSMSK_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SSMSK_t__ */ + +/*@}*/ + +/** @defgroup IC2 RTC Input Capture Channel 2 (IC2) Register + * RTC Input Capture Channel 2 (IC2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_IC2_Struct + *! \brief RTC Input Capture Channel 2 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_IC2_t__ +typedef struct _ADI_RTC_IC2_t { + union { + struct { + unsigned int IC2 : 16; /**< RTC Input Capture Channel 2 */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_IC2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_IC2_t__ */ + +/*@}*/ + +/** @defgroup IC3 RTC Input Capture Channel 3 (IC3) Register + * RTC Input Capture Channel 3 (IC3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_IC3_Struct + *! \brief RTC Input Capture Channel 3 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_IC3_t__ +typedef struct _ADI_RTC_IC3_t { + union { + struct { + unsigned int IC3 : 16; /**< RTC Input Capture Channel 3 */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_IC3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_IC3_t__ */ + +/*@}*/ + +/** @defgroup IC4 RTC Input Capture Channel 4 (IC4) Register + * RTC Input Capture Channel 4 (IC4) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_IC4_Struct + *! \brief RTC Input Capture Channel 4 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_IC4_t__ +typedef struct _ADI_RTC_IC4_t { + union { + struct { + unsigned int IC4 : 16; /**< RTC Input Capture Channel 4 */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_IC4_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_IC4_t__ */ + +/*@}*/ + +/** @defgroup SS1 RTC SensorStrobe Channel 1 (SS1) Register + * RTC SensorStrobe Channel 1 (SS1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SS1_Struct + *! \brief RTC SensorStrobe Channel 1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SS1_t__ +typedef struct _ADI_RTC_SS1_t { + union { + struct { + unsigned int SS1 : 16; /**< SensorStrobe Channel 1 */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SS1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SS1_t__ */ + +/*@}*/ + +/** @defgroup SS2 RTC SensorStrobe Channel 2 (SS2) Register + * RTC SensorStrobe Channel 2 (SS2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SS2_Struct + *! \brief RTC SensorStrobe Channel 2 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SS2_t__ +typedef struct _ADI_RTC_SS2_t { + union { + struct { + unsigned int SS2 : 16; /**< SensorStrobe Channel 2 */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SS2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SS2_t__ */ + +/*@}*/ + +/** @defgroup SS3 RTC SensorStrobe Channel 3 (SS3) Register + * RTC SensorStrobe Channel 3 (SS3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SS3_Struct + *! \brief RTC SensorStrobe Channel 3 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SS3_t__ +typedef struct _ADI_RTC_SS3_t { + union { + struct { + unsigned int SS3 : 16; /**< SensorStrobe Channel 3 */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SS3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SS3_t__ */ + +/*@}*/ + +/** @defgroup SS4 RTC SensorStrobe Channel 4 (SS4) Register + * RTC SensorStrobe Channel 4 (SS4) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SS4_Struct + *! \brief RTC SensorStrobe Channel 4 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SS4_t__ +typedef struct _ADI_RTC_SS4_t { + union { + struct { + unsigned int SS4 : 16; /**< SensorStrobe Channel 4 */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SS4_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SS4_t__ */ + +/*@}*/ + +/** @defgroup SR4 RTC Status 4 (SR4) Register + * RTC Status 4 (SR4) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SR4_Struct + *! \brief RTC Status 4 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SR4_t__ +typedef struct _ADI_RTC_SR4_t { + union { + struct { + unsigned int WSYNCSR3 : 1; /**< Synchronisation Status of Posted Writes to SR3 */ + unsigned int WSYNCCR2IC : 1; /**< Synchronization Status of Posted Writes to RTC Control 2 for Configuring Input Capture Channels Register */ + unsigned int WSYNCCR3SS : 1; /**< Synchronization Status of Posted Writes to RTC Control 3 for Configuring SensorStrobe Channel Register */ + unsigned int WSYNCCR4SS : 1; /**< Synchronization Status of Posted Writes to RTC Control 4 for Configuring SensorStrobe Channel Register */ + unsigned int WSYNCSSMSK : 1; /**< Synchronization Status of Posted Writes to Masks for SensorStrobe Channel Register */ + unsigned int reserved5 : 1; + unsigned int WSYNCSS1 : 1; /**< Synchronization Status of Posted Writes to SensorStrobe Channel 1 */ + unsigned int WSYNCSS2 : 1; /**< Synchronization Status of Posted Writes to SensorStrobe Channel 2 */ + unsigned int WSYNCSS3 : 1; /**< Synchronization Status of Posted Writes to SensorStrobe Channel 3 */ + unsigned int WSYNCSS4 : 1; /**< Synchronization Status of Posted Writes to SensorStrobe Channel 4 */ + unsigned int RSYNCIC0 : 1; /**< Synchronization Status of Posted Reads of RTC Input Channel 0 */ + unsigned int reserved11 : 1; + unsigned int RSYNCIC2 : 1; /**< Synchronization Status of Posted Reads of RTC Input Channel 2 */ + unsigned int RSYNCIC3 : 1; /**< Synchronization Status of Posted Reads of RTC Input Channel 3 */ + unsigned int RSYNCIC4 : 1; /**< Synchronization Status of Posted Reads of RTC Input Channel 4 */ + unsigned int WSYNCSSMSKOT : 1; /**< Synchronization Status of Posted Reads Writes to Mask for SensorStrobe Channels on Time Control Register */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SR4_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SR4_t__ */ + +/*@}*/ + +/** @defgroup SR5 RTC Status 5 (SR5) Register + * RTC Status 5 (SR5) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SR5_Struct + *! \brief RTC Status 5 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SR5_t__ +typedef struct _ADI_RTC_SR5_t { + union { + struct { + unsigned int WPENDSR3 : 1; /**< Pending Status of Posted Clearances of Interrupt Sources in RTC Status 3 Register */ + unsigned int WPENDCR2IC : 1; /**< Pending Status of Posted Writes to RTC Control 2 for Configuring Input Capture Channels Register */ + unsigned int WPENDCR3SS : 1; /**< Pending Status of Posted Writes to RTC Control 3 for Configuring SensorStrobe Channel Register */ + unsigned int WPENDCR4SS : 1; /**< Pending Status of Posted Writes to RTC Control 4 for Configuring SensorStrobe Channel Register */ + unsigned int WPENDSSMSK : 1; /**< Pending Status of Posted Writes to RTC Masks for SensorStrobe Channel Register */ + unsigned int reserved5 : 1; + unsigned int WPENDSS1 : 1; /**< Pending Status of Posted Writes to SensorStrobe Channel 1 */ + unsigned int WPENDSS2 : 1; /**< Pending Status of Posted Writes to SensorStrobe Channel 2 */ + unsigned int WPENDSS3 : 1; /**< Pending Status of Posted Writes to SensorStrobe Channel 3 */ + unsigned int WPENDSS4 : 1; /**< Pending Status of Posted Writes to SensorStrobe Channel 4 */ + unsigned int RPENDIC0 : 1; /**< Pending Status of Posted Reads of Input Capture Channel 0 */ + unsigned int reserved11 : 1; + unsigned int RPENDIC2 : 1; /**< Pending Status of Posted Reads of IC2 */ + unsigned int RPENDIC3 : 1; /**< Pending Status of Posted Reads of IC3 */ + unsigned int RPENDIC4 : 1; /**< Pending Status of Posted Reads of IC4 */ + unsigned int WPENDSSMSKOT : 1; /**< Pending Status of Posted Writes to RTC Masks for SensorStrobe Channel Register */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SR5_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SR5_t__ */ + +/*@}*/ + +/** @defgroup SR6 RTC Status 6 (SR6) Register + * RTC Status 6 (SR6) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SR6_Struct + *! \brief RTC Status 6 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SR6_t__ +typedef struct _ADI_RTC_SR6_t { + union { + struct { + unsigned int IC0UNR : 1; /**< Sticky Unread Status of the Input Capture Channel 0 */ + unsigned int reserved1 : 1; + unsigned int IC2UNR : 1; /**< Sticky Unread Status of the Input Capture Channel 2 */ + unsigned int IC3UNR : 1; /**< Sticky Unread Status of the Input Capture Channel 3 */ + unsigned int IC4UNR : 1; /**< Sticky Unread Status of the Input Capture Channel 4 */ + unsigned int reserved5 : 3; + unsigned int IC0SNAP : 1; /**< Confirmation That RTC Snapshot 0, 1, 2 Registers Reflect the Value of Input-Capture Channel RTC Input Capture Channel 0 */ + unsigned int FRZCNTPTR : 2; /**< Pointer for the Triple-Read Sequence of FRZCNT */ + unsigned int reserved11 : 5; + }; + uint16_t VALUE16; + }; +} ADI_RTC_SR6_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SR6_t__ */ + +/*@}*/ + +/** @defgroup SS1TGT RTC SensorStrobe Channel 1 Target (SS1TGT) Register + * RTC SensorStrobe Channel 1 Target (SS1TGT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SS1TGT_Struct + *! \brief RTC SensorStrobe Channel 1 Target Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SS1TGT_t__ +typedef struct _ADI_RTC_SS1TGT_t { + union { + struct { + unsigned int SS1TGT : 16; /**< Current Target Value for the SensorStrobe Channel 1 */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SS1TGT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SS1TGT_t__ */ + +/*@}*/ + +/** @defgroup FRZCNT RTC Freeze Count (FRZCNT) Register + * RTC Freeze Count (FRZCNT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_FRZCNT_Struct + *! \brief RTC Freeze Count Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_FRZCNT_t__ +typedef struct _ADI_RTC_FRZCNT_t { + union { + struct { + unsigned int FRZCNT : 16; /**< RTC Freeze Count. Coherent, Triple 16-Bit Read of the 47-Bit RTC Count */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_FRZCNT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_FRZCNT_t__ */ + +/*@}*/ + +/** @defgroup SS2TGT RTC SensorStrobe Channel 2 Target (SS2TGT) Register + * RTC SensorStrobe Channel 2 Target (SS2TGT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SS2TGT_Struct + *! \brief RTC SensorStrobe Channel 2 Target Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SS2TGT_t__ +typedef struct _ADI_RTC_SS2TGT_t { + union { + struct { + unsigned int SS2TGT : 16; /**< Current, Cumulative Target Time for SensorStrobe Channel 2, Taking Account of Any Auto-reloading */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SS2TGT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SS2TGT_t__ */ + +/*@}*/ + +/** @defgroup SS3TGT RTC SensorStrobe Channel 3 Target (SS3TGT) Register + * RTC SensorStrobe Channel 3 Target (SS3TGT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SS3TGT_Struct + *! \brief RTC SensorStrobe Channel 3 Target Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SS3TGT_t__ +typedef struct _ADI_RTC_SS3TGT_t { + union { + struct { + unsigned int SS3TGT : 16; /**< Current, Cumulative Target Time for SensorStrobe Channel 3, Taking Account of Any Auto-reloading */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SS3TGT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SS3TGT_t__ */ + +/*@}*/ + +/** @defgroup SS1LOWDUR RTC Auto-Reload Low Duration for SensorStrobe Channel 1 (SS1LOWDUR) Register + * RTC Auto-Reload Low Duration for SensorStrobe Channel 1 (SS1LOWDUR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SS1LOWDUR_Struct + *! \brief RTC Auto-Reload Low Duration for SensorStrobe Channel 1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SS1LOWDUR_t__ +typedef struct _ADI_RTC_SS1LOWDUR_t { + union { + struct { + unsigned int SS1LOWDUR : 16; /**< Low Duration for SensorStrobe Channel 1. */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SS1LOWDUR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SS1LOWDUR_t__ */ + +/*@}*/ + +/** @defgroup SS2LOWDUR RTC Auto-Reload Low Duration for SensorStrobe Channel 2 (SS2LOWDUR) Register + * RTC Auto-Reload Low Duration for SensorStrobe Channel 2 (SS2LOWDUR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SS2LOWDUR_Struct + *! \brief RTC Auto-Reload Low Duration for SensorStrobe Channel 2 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SS2LOWDUR_t__ +typedef struct _ADI_RTC_SS2LOWDUR_t { + union { + struct { + unsigned int SS2LOWDUR : 16; /**< Low Duration for SensorStrobe Channel 2. */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SS2LOWDUR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SS2LOWDUR_t__ */ + +/*@}*/ + +/** @defgroup SS3LOWDUR RTC Auto-Reload Low Duration for SensorStrobe Channel 3 (SS3LOWDUR) Register + * RTC Auto-Reload Low Duration for SensorStrobe Channel 3 (SS3LOWDUR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SS3LOWDUR_Struct + *! \brief RTC Auto-Reload Low Duration for SensorStrobe Channel 3 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SS3LOWDUR_t__ +typedef struct _ADI_RTC_SS3LOWDUR_t { + union { + struct { + unsigned int SS3LOWDUR : 16; /**< Low Duration for SensorStrobe Channel 3. */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SS3LOWDUR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SS3LOWDUR_t__ */ + +/*@}*/ + +/** @defgroup SS1HIGHDUR RTC Auto-Reload High Duration for SensorStrobe Channel 1 (SS1HIGHDUR) Register + * RTC Auto-Reload High Duration for SensorStrobe Channel 1 (SS1HIGHDUR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SS1HIGHDUR_Struct + *! \brief RTC Auto-Reload High Duration for SensorStrobe Channel 1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SS1HIGHDUR_t__ +typedef struct _ADI_RTC_SS1HIGHDUR_t { + union { + struct { + unsigned int SS1HIGHDUR : 16; /**< High Duration for SensorStrobe Channel 1. */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SS1HIGHDUR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SS1HIGHDUR_t__ */ + +/*@}*/ + +/** @defgroup SS2HIGHDUR RTC Auto-Reload High Duration for SensorStrobe Channel 2 (SS2HIGHDUR) Register + * RTC Auto-Reload High Duration for SensorStrobe Channel 2 (SS2HIGHDUR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SS2HIGHDUR_Struct + *! \brief RTC Auto-Reload High Duration for SensorStrobe Channel 2 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SS2HIGHDUR_t__ +typedef struct _ADI_RTC_SS2HIGHDUR_t { + union { + struct { + unsigned int SS2HIGHDUR : 16; /**< High Duration for SensorStrobe Channel 2. */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SS2HIGHDUR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SS2HIGHDUR_t__ */ + +/*@}*/ + +/** @defgroup SS3HIGHDUR RTC Auto-Reload High Duration for SensorStrobe Channel 3 (SS3HIGHDUR) Register + * RTC Auto-Reload High Duration for SensorStrobe Channel 3 (SS3HIGHDUR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SS3HIGHDUR_Struct + *! \brief RTC Auto-Reload High Duration for SensorStrobe Channel 3 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SS3HIGHDUR_t__ +typedef struct _ADI_RTC_SS3HIGHDUR_t { + union { + struct { + unsigned int SS3HIGHDUR : 16; /**< High Duration for SensorStrobe Channel 3. */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SS3HIGHDUR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SS3HIGHDUR_t__ */ + +/*@}*/ + +/** @defgroup SSMSKOT RTC Masks for SensorStrobe Channels on Time Control (SSMSKOT) Register + * RTC Masks for SensorStrobe Channels on Time Control (SSMSKOT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SSMSKOT_Struct + *! \brief RTC Masks for SensorStrobe Channels on Time Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SSMSKOT_t__ +typedef struct _ADI_RTC_SSMSKOT_t { + union { + struct { + unsigned int SS1MSKOT : 4; /**< Concatenation of Thermometer-encoded Masks for the 16-bit SensorStrobe Channels */ + unsigned int SS2MSKOT : 4; /**< SensorStrobe Channel 2 on Time Control */ + unsigned int SS3MSKOT : 4; /**< SensorStrobe Channel 3 on Time Control */ + unsigned int SS4MSKOT : 4; /**< SensorStrobe Channel 4 on Time Control */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SSMSKOT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SSMSKOT_t__ */ + +/*@}*/ + +/** @defgroup CR5SSS RTC Control 5 for Configuring SensorStrobe Channel GPIO Sampling (CR5SSS) Register + * RTC Control 5 for Configuring SensorStrobe Channel GPIO Sampling (CR5SSS) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_CR5SSS_Struct + *! \brief RTC Control 5 for Configuring SensorStrobe Channel GPIO Sampling Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_CR5SSS_t__ +typedef struct _ADI_RTC_CR5SSS_t { + union { + struct { + unsigned int SS1SMPEN : 3; /**< GPIO Input Sample Enable for SensorStrobe Channel 1 */ + unsigned int SS1SMPMTCHIRQEN : 1; /**< Sample Activity Interrupt Enable for SensorStrobe Channel 1 */ + unsigned int SS2SMPEN : 3; /**< GPIO Input Sample Enable for SensorStrobe Channel 2 */ + unsigned int SS2SMPMTCHIRQEN : 1; /**< Sample Activity Interrupt Enable for SensorStrobe Channel 2 */ + unsigned int SS3SMPEN : 3; /**< GPIO Input Sample Enable for SensorStrobe Channel 3 */ + unsigned int SS3SMPMTCHIRQEN : 1; /**< Sample Activity Interrupt Enable for SensorStrobe Channel 3 */ + unsigned int reserved12 : 4; + }; + uint16_t VALUE16; + }; +} ADI_RTC_CR5SSS_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_CR5SSS_t__ */ + +/*@}*/ + +/** @defgroup CR6SSS RTC Control 6 for Configuring SensorStrobe Channel GPIO Sampling Edge (CR6SSS) Register + * RTC Control 6 for Configuring SensorStrobe Channel GPIO Sampling Edge (CR6SSS) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_RTC_CR6SSS_SS1SMPONFE + *! \brief GPIO Sample Around Falling Edge of SensorStrobe Channel 1 (SS1SMPONFE) Enumerations + * ========================================================================= */ +typedef enum +{ + RTC_CR6SSS_SS1NOFES = 0, /**< No sampling of input around falling edge */ + RTC_CR6SSS_SS1BFES = 1, /**< Input sampled one clock cycle before falling edge of the SensorStrobe channel 1 */ + RTC_CR6SSS_SS1FES = 2, /**< Input sampled at falling edge of the SensorStrobe channel 1 */ + RTC_CR6SSS_SS1AFES = 3 /**< Input sampled one clock cycle after falling edge of the SensorStrobe channel 1 */ +} ADI_RTC_CR6SSS_SS1SMPONFE; + + +/* ========================================================================= + *! \enum ADI_RTC_CR6SSS_SS1SMPONRE + *! \brief GPIO Sample Around Rising Edge of SensorStrobe Channel 1 (SS1SMPONRE) Enumerations + * ========================================================================= */ +typedef enum +{ + RTC_CR6SSS_SS1NORES = 0, /**< No sampling of input around rising edge */ + RTC_CR6SSS_SS1BRES = 1, /**< Input sampled one clock cycle before rising edge of the SensorStrobe channel 1 */ + RTC_CR6SSS_SS1RES = 2, /**< Input sampled at rising edge of the SensorStrobe channel 1 */ + RTC_CR6SSS_SS1ARES = 3 /**< Input sampled one clock cycle after rising edge of the SensorStrobe channel 1 */ +} ADI_RTC_CR6SSS_SS1SMPONRE; + + +/* ========================================================================= + *! \enum ADI_RTC_CR6SSS_SS2SMPONFE + *! \brief GPIO Sample Around Falling Edge of SensorStrobe Channel 2 (SS2SMPONFE) Enumerations + * ========================================================================= */ +typedef enum +{ + RTC_CR6SSS_SS2NOFES = 0, /**< No sampling of input around falling edge */ + RTC_CR6SSS_SS2BFES = 1, /**< Input sampled one clock cycle before falling edge of the SensorStrobe channel 2 */ + RTC_CR6SSS_SS2FES = 2, /**< Input sampled at falling edge of the SensorStrobe channel 2 */ + RTC_CR6SSS_SS2AFES = 3 /**< Input sampled one clock cycle after falling edge of the SensorStrobe channel 2 */ +} ADI_RTC_CR6SSS_SS2SMPONFE; + + +/* ========================================================================= + *! \enum ADI_RTC_CR6SSS_SS2SMPONRE + *! \brief GPIO Sample Around Rising Edge of SensorStrobe Channel 2 (SS2SMPONRE) Enumerations + * ========================================================================= */ +typedef enum +{ + RTC_CR6SSS_SS2NORES = 0, /**< No sampling of input around rising edge */ + RTC_CR6SSS_SS2BRES = 1, /**< Input sampled one clock cycle before rising edge of the SensorStrobe channel 2 */ + RTC_CR6SSS_SS2RES = 2, /**< Input sampled at rising edge of the SensorStrobe channel 2 */ + RTC_CR6SSS_SS2ARES = 3 /**< Input sampled one clock cycle after rising edge of the SensorStrobe channel 2 */ +} ADI_RTC_CR6SSS_SS2SMPONRE; + + +/* ========================================================================= + *! \enum ADI_RTC_CR6SSS_SS3SMPONFE + *! \brief GPIO Sample Around Falling Edge of SensorStrobe Channel 3 (SS3SMPONFE) Enumerations + * ========================================================================= */ +typedef enum +{ + RTC_CR6SSS_SS3NOFES = 0, /**< No sampling of input around falling edge */ + RTC_CR6SSS_SS3BFES = 1, /**< Input sampled one clock cycle before falling edge of the SensorStrobe channel 3 */ + RTC_CR6SSS_SS3FES = 2, /**< Input sampled at falling edge of the SensorStrobe channel 3 */ + RTC_CR6SSS_SS3AFES = 3 /**< Input sampled one clock cycle after falling edge of the SensorStrobe channel 3 */ +} ADI_RTC_CR6SSS_SS3SMPONFE; + + +/* ========================================================================= + *! \enum ADI_RTC_CR6SSS_SS3SMPONRE + *! \brief GPIO Sample Around Rising Edge of SensorStrobe Channel 3 (SS3SMPONRE) Enumerations + * ========================================================================= */ +typedef enum +{ + RTC_CR6SSS_SS3NORES = 0, /**< No sampling of input around rising edge */ + RTC_CR6SSS_SS3BRES = 1, /**< Input sampled one clock cycle before rising edge of the SensorStrobe channel 3 */ + RTC_CR6SSS_SS3RES = 2, /**< Input sampled at rising edge of the SensorStrobe channel 3 */ + RTC_CR6SSS_SS3ARES = 3 /**< Input sampled one clock cycle after rising edge of the SensorStrobe channel 3 */ +} ADI_RTC_CR6SSS_SS3SMPONRE; + + +/* ========================================================================== + *! \struct ADI_RTC_CR6SSS_Struct + *! \brief RTC Control 6 for Configuring SensorStrobe Channel GPIO Sampling Edge Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_CR6SSS_t__ +typedef struct _ADI_RTC_CR6SSS_t { + union { + struct { + unsigned int SS1SMPONFE : 2; /**< GPIO Sample Around Falling Edge of SensorStrobe Channel 1 */ + unsigned int SS1SMPONRE : 2; /**< GPIO Sample Around Rising Edge of SensorStrobe Channel 1 */ + unsigned int SS2SMPONFE : 2; /**< GPIO Sample Around Falling Edge of SensorStrobe Channel 2 */ + unsigned int SS2SMPONRE : 2; /**< GPIO Sample Around Rising Edge of SensorStrobe Channel 2 */ + unsigned int SS3SMPONFE : 2; /**< GPIO Sample Around Falling Edge of SensorStrobe Channel 3 */ + unsigned int SS3SMPONRE : 2; /**< GPIO Sample Around Rising Edge of SensorStrobe Channel 3 */ + unsigned int reserved12 : 4; + }; + uint16_t VALUE16; + }; +} ADI_RTC_CR6SSS_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_CR6SSS_t__ */ + +/*@}*/ + +/** @defgroup CR7SSS RTC Control 7 for Configuring SensorStrobe Channel GPIO Sampling Activity (CR7SSS) Register + * RTC Control 7 for Configuring SensorStrobe Channel GPIO Sampling Activity (CR7SSS) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_RTC_CR7SSS_SS1SMPPTRN + *! \brief Sample Activity Selection for SensorStrobe Channel 1 (SS1SMPPTRN) Enumerations + * ========================================================================= */ +typedef enum +{ + RTC_CR7SSS_SS1SMPCHNG = 0, /**< Current GPIO sample is not same as previous sample */ + RTC_CR7SSS_SS1SMPSAME = 1, /**< Current GPIO sample is same as previous sample */ + RTC_CR7SSS_SS1SMPMTCH = 2, /**< Current GPIO sample is same as expected sample */ + RTC_CR7SSS_SS1SMPNOMTCH = 3 /**< Current GPIO sample is not same as expected sample */ +} ADI_RTC_CR7SSS_SS1SMPPTRN; + + +/* ========================================================================= + *! \enum ADI_RTC_CR7SSS_SS2SMPPTRN + *! \brief Sample Activity Selection for SensorStrobe Channel 2 (SS2SMPPTRN) Enumerations + * ========================================================================= */ +typedef enum +{ + RTC_CR7SSS_SS2SMPCHNG = 0, /**< Current GPIO sample is not same as previous sample */ + RTC_CR7SSS_SS2SMPSAME = 1, /**< Current GPIO sample is same as previous sample */ + RTC_CR7SSS_SS2SMPMTCH = 2, /**< Current GPIO sample is same as expected sample */ + RTC_CR7SSS_SS2SMPNOMTCH = 3 /**< Current GPIO sample is not same as expected sample */ +} ADI_RTC_CR7SSS_SS2SMPPTRN; + + +/* ========================================================================= + *! \enum ADI_RTC_CR7SSS_SS3SMPPTRN + *! \brief Sample Activity Selection for SensorStrobe Channel 3 (SS3SMPPTRN) Enumerations + * ========================================================================= */ +typedef enum +{ + RTC_CR7SSS_SS3SMPCHNG = 0, /**< Current GPIO sample is not same as previous sample */ + RTC_CR7SSS_SS3SMPSAME = 1, /**< Current GPIO sample is same as previous sample */ + RTC_CR7SSS_SS3SMPMTCH = 2, /**< Current GPIO sample is same as expected sample */ + RTC_CR7SSS_SS3SMPNOMTCH = 3 /**< Current GPIO sample is not same as expected sample */ +} ADI_RTC_CR7SSS_SS3SMPPTRN; + + +/* ========================================================================== + *! \struct ADI_RTC_CR7SSS_Struct + *! \brief RTC Control 7 for Configuring SensorStrobe Channel GPIO Sampling Activity Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_CR7SSS_t__ +typedef struct _ADI_RTC_CR7SSS_t { + union { + struct { + unsigned int SS1SMPEXP : 3; /**< Expected GPIO Sample for SensorStrobe Channel 1 */ + unsigned int SS1SMPPTRN : 2; /**< Sample Activity Selection for SensorStrobe Channel 1 */ + unsigned int SS2SMPEXP : 3; /**< Expected GPIO Sample for SensorStrobe Channel 2 */ + unsigned int SS2SMPPTRN : 2; /**< Sample Activity Selection for SensorStrobe Channel 2 */ + unsigned int SS3SMPEXP : 3; /**< Expected GPIO Sample for SensorStrobe Channel 3 */ + unsigned int SS3SMPPTRN : 2; /**< Sample Activity Selection for SensorStrobe Channel 3 */ + unsigned int reserved15 : 1; + }; + uint16_t VALUE16; + }; +} ADI_RTC_CR7SSS_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_CR7SSS_t__ */ + +/*@}*/ + +/** @defgroup SR7 RTC Status 7 (SR7) Register + * RTC Status 7 (SR7) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SR7_Struct + *! \brief RTC Status 7 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SR7_t__ +typedef struct _ADI_RTC_SR7_t { + union { + struct { + unsigned int SS1SMP : 3; /**< Latest GPIO Sample for SensorStrobe Channel 1 */ + unsigned int SS1SMPMTCHIRQ : 1; /**< Sticky Status of GPIO Sample Pattern Match for SensorStrobe Channel 1 */ + unsigned int SS2SMP : 3; /**< Latest GPIO Sample for SensorStrobe Channel 2 */ + unsigned int SS2SMPMTCHIRQ : 1; /**< Sticky Status of GPIO Sample Pattern Match for SensorStrobe Channel 2 */ + unsigned int SS3SMP : 3; /**< Latest GPIO Sample for SensorStrobe Channel 3 */ + unsigned int SS3SMPMTCHIRQ : 1; /**< Sticky Status of GPIO Sample Pattern Match for SensorStrobe Channel 3 */ + unsigned int SS1OUT : 1; /**< Output Value for SensorStrobe Channel 1 */ + unsigned int SS2OUT : 1; /**< Output Value for SensorStrobe Channel 2 */ + unsigned int SS3OUT : 1; /**< Output Value for SensorStrobe Channel 3 */ + unsigned int SS4OUT : 1; /**< Output Value for SensorStrobe Channel 4 */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_SR7_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SR7_t__ */ + +/*@}*/ + +/** @defgroup SR8 RTC Status 8 (SR8) Register + * RTC Status 8 (SR8) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SR8_Struct + *! \brief RTC Status 8 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SR8_t__ +typedef struct _ADI_RTC_SR8_t { + union { + struct { + unsigned int WSYNCSS1LOWDUR : 1; /**< Synchronisation Status of Posted Writes to SensorStrobe Channel 1 Low Duration Register */ + unsigned int WSYNCSS2LOWDUR : 1; /**< Synchronisation Status of Posted Writes to SensorStrobe Channel 2 Low Duration Register */ + unsigned int WSYNCSS3LOWDUR : 1; /**< Synchronisation Status of Posted Writes to SensorStrobe Channel 3 Low Duration Register */ + unsigned int reserved3 : 1; + unsigned int WSYNCSS1HIGHDUR : 1; /**< Synchronisation Status of Posted Writes to SensorStrobe Channel 1 High Duration Register */ + unsigned int WSYNCSS2HIGHDUR : 1; /**< Synchronisation Status of Posted Writes to SensorStrobe Channel 2 High Duration Register */ + unsigned int WSYNCSS3HIGHDUR : 1; /**< Synchronisation Status of Posted Writes to SensorStrobe Channel 3 High Duration Register */ + unsigned int reserved7 : 1; + unsigned int WSYNCCR5SSS : 1; /**< Synchronisation Status of Posted Writes to Control 5 for Configuring SensorStrobe Channel Register */ + unsigned int WSYNCCR6SSS : 1; /**< Synchronisation Status of Posted Writes to Control 6 for Configuring SensorStrobe Channel Register */ + unsigned int WSYNCCR7SSS : 1; /**< Synchronisation Status of Posted Writes to Control 7 for Configuring SensorStrobe Channel Register */ + unsigned int WSYNCSR7 : 1; /**< Synchronisation Status of Posted Writes to Status 7 Register */ + unsigned int WSYNCGPMUX0 : 1; /**< Synchronisation Status of Posted Writes to GPIO Pin Mux Control Register 0 */ + unsigned int WSYNCGPMUX1 : 1; /**< Synchronisation Status of Posted Writes to GPIO Pin Mux Control Register 1 */ + unsigned int reserved14 : 2; + }; + uint16_t VALUE16; + }; +} ADI_RTC_SR8_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SR8_t__ */ + +/*@}*/ + +/** @defgroup SR9 RTC Status 9 (SR9) Register + * RTC Status 9 (SR9) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_SR9_Struct + *! \brief RTC Status 9 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_SR9_t__ +typedef struct _ADI_RTC_SR9_t { + union { + struct { + unsigned int WPENDSS1LOWDUR : 1; /**< Pending Status of Posted Writes to SensortStrobe Channel 1 Low Duration Register */ + unsigned int WPENDSS2LOWDUR : 1; /**< Pending Status of Posted Writes to SensortStrobe Channel 2 Low Duration Register */ + unsigned int WPENDSS3LOWDUR : 1; /**< Pending Status of Posted Writes to SensortStrobe Channel 3 Low Duration Register */ + unsigned int reserved3 : 1; + unsigned int WPENDSS1HIGHDUR : 1; /**< Pending Status of Posted Writes to SensortStrobe Channel 1 High Duration Register */ + unsigned int WPENDSS2HIGHDUR : 1; /**< Pending Status of Posted Writes to SensortStrobe Channel 2 High Duration Register */ + unsigned int WPENDSS3HIGHDUR : 1; /**< Pending Status of Posted Writes to SensortStrobe Channel 3 High Duration Register */ + unsigned int reserved7 : 1; + unsigned int WPENDCR5SSS : 1; /**< Pending Status of Posted Writes to Control 5 for Configuring SensorStrobe Channel Register */ + unsigned int WPENDCR6SSS : 1; /**< Pending Status of Posted Writes to Control 6 for Configuring SensorStrobe Channel Register */ + unsigned int WPENDCR7SSS : 1; /**< Pending Status of Posted Writes to Control 7 for Configuring SensorStrobe Channel Register */ + unsigned int WPENDSR7 : 1; /**< Pending Status of Posted Writes to SR7 */ + unsigned int WPENDGPMUX0 : 1; /**< Pending Status of Posted Writes to GPMUX0 */ + unsigned int WPENDGPMUX1 : 1; /**< Pending Status of Posted Writes to GPMUX1 */ + unsigned int reserved14 : 2; + }; + uint16_t VALUE16; + }; +} ADI_RTC_SR9_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_SR9_t__ */ + +/*@}*/ + +/** @defgroup GPMUX0 RTC GPIO Pin Mux Control Register 0 (GPMUX0) Register + * RTC GPIO Pin Mux Control Register 0 (GPMUX0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_GPMUX0_Struct + *! \brief RTC GPIO Pin Mux Control Register 0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_GPMUX0_t__ +typedef struct _ADI_RTC_GPMUX0_t { + union { + struct { + unsigned int SS1GPIN0SEL : 3; /**< GPIO Mux Selection for SensorStrobe Channel 1 Input0 */ + unsigned int SS1GPIN1SEL : 3; /**< GPIO Mux Selection for SensorStrobe Channel 1 Input 1 */ + unsigned int SS1GPIN2SEL : 3; /**< GPIO Mux Selection for SensorStrobe Channel 1 Input 2 */ + unsigned int SS2GPIN0SEL : 3; /**< GPIO Mux Selection for SensorStrobe Channel 2 Input 0 */ + unsigned int SS2GPIN1SEL : 3; /**< GPIO Mux Selection for SensorStrobe Channel 2 Input 1 */ + unsigned int reserved15 : 1; + }; + uint16_t VALUE16; + }; +} ADI_RTC_GPMUX0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_GPMUX0_t__ */ + +/*@}*/ + +/** @defgroup GPMUX1 RTC GPIO Pin Mux Control Register 1 (GPMUX1) Register + * RTC GPIO Pin Mux Control Register 1 (GPMUX1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RTC_GPMUX1_Struct + *! \brief RTC GPIO Pin Mux Control Register 1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RTC_GPMUX1_t__ +typedef struct _ADI_RTC_GPMUX1_t { + union { + struct { + unsigned int SS2GPIN2SEL : 3; /**< GPIO Mux Selection for SensorStrobe Channel 2 Input 2 */ + unsigned int SS3GPIN0SEL : 3; /**< GPIO Mux Selection for SensorStrobe Channel 3 Input 0 */ + unsigned int SS3GPIN1SEL : 3; /**< GPIO Mux Selection for SensorStrobe Channel 3 Input 1 */ + unsigned int SS3GPIN2SEL : 3; /**< GPIO Mux Selection for SensorStrobe Channel 3 Input 2 */ + unsigned int reserved12 : 2; + unsigned int SS1DIFFOUT : 1; /**< Differential SensorStrobe Out Option for SensorStrobe Channel 1 */ + unsigned int SS3DIFFOUT : 1; /**< Differential SensorStrobe Out Option for SensorStrobe Channel 3 */ + }; + uint16_t VALUE16; + }; +} ADI_RTC_GPMUX1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RTC_GPMUX1_t__ */ + +/*@}*/ + +/** @defgroup ADIID ADI Identification (ADIID) Register + * ADI Identification (ADIID) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SYS_ADIID_Struct + *! \brief ADI Identification Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SYS_ADIID_t__ +typedef struct _ADI_SYS_ADIID_t { + union { + struct { + unsigned int VALUE : 16; /**< Reads a fixed value of 0x4144 to indicate to debuggers that they are connected to an Analog Devices implemented Cortex based part */ + }; + uint16_t VALUE16; + }; +} ADI_SYS_ADIID_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SYS_ADIID_t__ */ + +/*@}*/ + +/** @defgroup CHIPID Chip Identifier (CHIPID) Register + * Chip Identifier (CHIPID) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SYS_CHIPID_Struct + *! \brief Chip Identifier Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SYS_CHIPID_t__ +typedef struct _ADI_SYS_CHIPID_t { + union { + struct { + unsigned int REV : 4; /**< Silicon revision */ + unsigned int PARTID : 12; /**< Part identifier */ + }; + uint16_t VALUE16; + }; +} ADI_SYS_CHIPID_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SYS_CHIPID_t__ */ + +/*@}*/ + +/** @defgroup SWDEN Serial Wire Debug Enable (SWDEN) Register + * Serial Wire Debug Enable (SWDEN) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SYS_SWDEN_Struct + *! \brief Serial Wire Debug Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SYS_SWDEN_t__ +typedef struct _ADI_SYS_SWDEN_t { + union { + struct { + unsigned int VALUE : 16; /**< To enable SWD interface */ + }; + uint16_t VALUE16; + }; +} ADI_SYS_SWDEN_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SYS_SWDEN_t__ */ + +/*@}*/ + +/** @defgroup LOAD Load Value (LOAD) Register + * Load Value (LOAD) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_WDT_LOAD_Struct + *! \brief Load Value Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_WDT_LOAD_t__ +typedef struct _ADI_WDT_LOAD_t { + union { + struct { + unsigned int VALUE : 16; /**< Load Value */ + }; + uint16_t VALUE16; + }; +} ADI_WDT_LOAD_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_WDT_LOAD_t__ */ + +/*@}*/ + +/** @defgroup CCNT Current Count Value (CCNT) Register + * Current Count Value (CCNT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_WDT_CCNT_Struct + *! \brief Current Count Value Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_WDT_CCNT_t__ +typedef struct _ADI_WDT_CCNT_t { + union { + struct { + unsigned int VALUE : 16; /**< Current Count Value */ + }; + uint16_t VALUE16; + }; +} ADI_WDT_CCNT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_WDT_CCNT_t__ */ + +/*@}*/ + +/** @defgroup CTL Control (CTL) Register + * Control (CTL) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_WDT_CTL_IRQ + *! \brief Timer Interrupt (IRQ) Enumerations + * ========================================================================= */ +typedef enum +{ + WDT_CTL_RST = 0, /**< WDT asserts reset when timed out */ + WDT_CTL_INT = 1 /**< WDT generates interrupt when timed out */ +} ADI_WDT_CTL_IRQ; + + +/* ========================================================================= + *! \enum ADI_WDT_CTL_PRE + *! \brief Prescaler (PRE) Enumerations + * ========================================================================= */ +typedef enum +{ + WDT_CTL_DIV1 = 0, /**< Source clock/1 */ + WDT_CTL_DIV16 = 1, /**< Source clock/16 */ + WDT_CTL_DIV256 = 2 /**< Source clock/256 (default) */ +} ADI_WDT_CTL_PRE; + + +/* ========================================================================= + *! \enum ADI_WDT_CTL_EN + *! \brief Timer Enable (EN) Enumerations + * ========================================================================= */ +typedef enum +{ + WDT_CTL_WDT_DIS = 0, /**< WDT not enabled */ + WDT_CTL_WDT_EN = 1 /**< WDT enabled */ +} ADI_WDT_CTL_EN; + + +/* ========================================================================= + *! \enum ADI_WDT_CTL_MODE + *! \brief Timer Mode (MODE) Enumerations + * ========================================================================= */ +typedef enum +{ + WDT_CTL_FREE_RUN = 0, /**< Free running mode */ + WDT_CTL_PERIODIC = 1 /**< Periodic mode */ +} ADI_WDT_CTL_MODE; + + +/* ========================================================================== + *! \struct ADI_WDT_CTL_Struct + *! \brief Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_WDT_CTL_t__ +typedef struct _ADI_WDT_CTL_t { + union { + struct { + unsigned int reserved0 : 1; + unsigned int IRQ : 1; /**< Timer Interrupt */ + unsigned int PRE : 2; /**< Prescaler */ + unsigned int reserved4 : 1; + unsigned int EN : 1; /**< Timer Enable */ + unsigned int MODE : 1; /**< Timer Mode */ + unsigned int SPARE : 1; /**< Unused Spare Bit */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_WDT_CTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_WDT_CTL_t__ */ + +/*@}*/ + +/** @defgroup RESTART Clear Interrupt (RESTART) Register + * Clear Interrupt (RESTART) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_WDT_RESTART_Struct + *! \brief Clear Interrupt Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_WDT_RESTART_t__ +typedef struct _ADI_WDT_RESTART_t { + union { + struct { + unsigned int CLRWORD : 16; /**< Clear Watchdog */ + }; + uint16_t VALUE16; + }; +} ADI_WDT_RESTART_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_WDT_RESTART_t__ */ + +/*@}*/ + +/** @defgroup STAT Status (STAT) Register + * Status (STAT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_WDT_STAT_Struct + *! \brief Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_WDT_STAT_t__ +typedef struct _ADI_WDT_STAT_t { + union { + struct { + unsigned int IRQ : 1; /**< WDT Interrupt */ + unsigned int CLRIRQ : 1; /**< Clear Interrupt Register Write Sync in Progress */ + unsigned int LOADING : 1; /**< Load Register Write Sync in Progress */ + unsigned int COUNTING : 1; /**< Control Register Write Sync in Progress */ + unsigned int LOCKED : 1; /**< Lock Status Bit */ + unsigned int RSTCTL : 1; /**< Reset Control Register Written and Locked */ + unsigned int reserved6 : 10; + }; + uint16_t VALUE16; + }; +} ADI_WDT_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_WDT_STAT_t__ */ + +/*@}*/ + +/** @defgroup MCTL Master Control (MCTL) Register + * Master Control (MCTL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_MCTL_Struct + *! \brief Master Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_MCTL_t__ +typedef struct _ADI_I2C_MCTL_t { + union { + struct { + unsigned int MASEN : 1; /**< Master Enable */ + unsigned int COMPLETE : 1; /**< Start Back-off Disable */ + unsigned int LOOPBACK : 1; /**< Internal Loopback Enable */ + unsigned int STRETCHSCL : 1; /**< Stretch SCL Enable */ + unsigned int IENMRX : 1; /**< Receive Request Interrupt Enable */ + unsigned int IENMTX : 1; /**< Transmit Request Interrupt Enable */ + unsigned int IENALOST : 1; /**< Arbitration Lost Interrupt Enable */ + unsigned int IENACK : 1; /**< ACK Not Received Interrupt Enable */ + unsigned int IENCMP : 1; /**< Transaction Completed (or Stop Detected) Interrupt Enable */ + unsigned int MXMITDEC : 1; /**< Decrement Master Tx FIFO Status When a Byte Txed */ + unsigned int MRXDMA : 1; /**< Enable Master Rx DMA Request */ + unsigned int MTXDMA : 1; /**< Enable Master Tx DMA Request */ + unsigned int BUSCLR : 1; /**< Bus-Clear Enable */ + unsigned int STOPBUSCLR : 1; /**< Prestop Bus Clear */ + unsigned int reserved14 : 2; + }; + uint16_t VALUE16; + }; +} ADI_I2C_MCTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_MCTL_t__ */ + +/*@}*/ + +/** @defgroup MSTAT Master Status (MSTAT) Register + * Master Status (MSTAT) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_I2C_MSTAT_MTXF + *! \brief Master Transmit FIFO Status (MTXF) Enumerations + * ========================================================================= */ +typedef enum +{ + I2C_MSTAT_FIFO_EMPTY = 0, /**< FIFO Empty. */ + I2C_MSTAT_FIFO_1BYTE = 2, /**< 1 byte in FIFO. */ + I2C_MSTAT_FIFO_FULL = 3 /**< FIFO Full. */ +} ADI_I2C_MSTAT_MTXF; + + +/* ========================================================================== + *! \struct ADI_I2C_MSTAT_Struct + *! \brief Master Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_MSTAT_t__ +typedef struct _ADI_I2C_MSTAT_t { + union { + struct { + unsigned int MTXF : 2; /**< Master Transmit FIFO Status */ + unsigned int MTXREQ : 1; /**< Master Transmit Request/Clear Master Transmit Interrupt */ + unsigned int MRXREQ : 1; /**< Master Receive Request */ + unsigned int NACKADDR : 1; /**< ACK Not Received in Response to an Address */ + unsigned int ALOST : 1; /**< Arbitration Lost */ + unsigned int MBUSY : 1; /**< Master Busy */ + unsigned int NACKDATA : 1; /**< ACK Not Received in Response to Data Write */ + unsigned int TCOMP : 1; /**< Transaction Complete or Stop Detected */ + unsigned int MRXOVR : 1; /**< Master Receive FIFO Overflow */ + unsigned int LINEBUSY : 1; /**< Line is Busy */ + unsigned int MSTOP : 1; /**< STOP Driven by This I2C Master */ + unsigned int MTXUNDR : 1; /**< Master Transmit Underflow */ + unsigned int SDAFILT : 1; /**< State of SDA Line */ + unsigned int SCLFILT : 1; /**< State of SCL Line */ + unsigned int reserved15 : 1; + }; + uint16_t VALUE16; + }; +} ADI_I2C_MSTAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_MSTAT_t__ */ + +/*@}*/ + +/** @defgroup MRX Master Receive Data (MRX) Register + * Master Receive Data (MRX) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_MRX_Struct + *! \brief Master Receive Data Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_MRX_t__ +typedef struct _ADI_I2C_MRX_t { + union { + struct { + unsigned int VALUE : 8; /**< Master Receive Register */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_I2C_MRX_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_MRX_t__ */ + +/*@}*/ + +/** @defgroup MTX Master Transmit Data (MTX) Register + * Master Transmit Data (MTX) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_MTX_Struct + *! \brief Master Transmit Data Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_MTX_t__ +typedef struct _ADI_I2C_MTX_t { + union { + struct { + unsigned int VALUE : 8; /**< Master Transmit Register */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_I2C_MTX_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_MTX_t__ */ + +/*@}*/ + +/** @defgroup MRXCNT Master Receive Data Count (MRXCNT) Register + * Master Receive Data Count (MRXCNT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_MRXCNT_Struct + *! \brief Master Receive Data Count Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_MRXCNT_t__ +typedef struct _ADI_I2C_MRXCNT_t { + union { + struct { + unsigned int VALUE : 8; /**< Receive Count */ + unsigned int EXTEND : 1; /**< Extended Read */ + unsigned int reserved9 : 7; + }; + uint16_t VALUE16; + }; +} ADI_I2C_MRXCNT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_MRXCNT_t__ */ + +/*@}*/ + +/** @defgroup MCRXCNT Master Current Receive Data Count (MCRXCNT) Register + * Master Current Receive Data Count (MCRXCNT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_MCRXCNT_Struct + *! \brief Master Current Receive Data Count Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_MCRXCNT_t__ +typedef struct _ADI_I2C_MCRXCNT_t { + union { + struct { + unsigned int VALUE : 8; /**< Current Receive Count */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_I2C_MCRXCNT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_MCRXCNT_t__ */ + +/*@}*/ + +/** @defgroup ADDR1 Master Address Byte 1 (ADDR1) Register + * Master Address Byte 1 (ADDR1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_ADDR1_Struct + *! \brief Master Address Byte 1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_ADDR1_t__ +typedef struct _ADI_I2C_ADDR1_t { + union { + struct { + unsigned int VALUE : 8; /**< Address Byte 1 */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_I2C_ADDR1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_ADDR1_t__ */ + +/*@}*/ + +/** @defgroup ADDR2 Master Address Byte 2 (ADDR2) Register + * Master Address Byte 2 (ADDR2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_ADDR2_Struct + *! \brief Master Address Byte 2 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_ADDR2_t__ +typedef struct _ADI_I2C_ADDR2_t { + union { + struct { + unsigned int VALUE : 8; /**< Address Byte 2 */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_I2C_ADDR2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_ADDR2_t__ */ + +/*@}*/ + +/** @defgroup BYT Start Byte (BYT) Register + * Start Byte (BYT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_BYT_Struct + *! \brief Start Byte Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_BYT_t__ +typedef struct _ADI_I2C_BYT_t { + union { + struct { + unsigned int SBYTE : 8; /**< Start Byte */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_I2C_BYT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_BYT_t__ */ + +/*@}*/ + +/** @defgroup DIV Serial Clock Period Divisor (DIV) Register + * Serial Clock Period Divisor (DIV) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_DIV_Struct + *! \brief Serial Clock Period Divisor Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_DIV_t__ +typedef struct _ADI_I2C_DIV_t { + union { + struct { + unsigned int LOW : 8; /**< Serial Clock Low Time */ + unsigned int HIGH : 8; /**< Serial Clock High Time */ + }; + uint16_t VALUE16; + }; +} ADI_I2C_DIV_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_DIV_t__ */ + +/*@}*/ + +/** @defgroup SCTL Slave Control (SCTL) Register + * Slave Control (SCTL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_SCTL_Struct + *! \brief Slave Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_SCTL_t__ +typedef struct _ADI_I2C_SCTL_t { + union { + struct { + unsigned int SLVEN : 1; /**< Slave Enable */ + unsigned int ADR10EN : 1; /**< Enabled 10-bit Addressing */ + unsigned int GCEN : 1; /**< General Call Enable */ + unsigned int HGCEN : 1; /**< Hardware General Call Enable */ + unsigned int GCSBCLR : 1; /**< General Call Status Bit Clear */ + unsigned int EARLYTXR : 1; /**< Early Transmit Request Mode */ + unsigned int reserved6 : 1; + unsigned int NACK : 1; /**< NACK Next Communication */ + unsigned int IENSTOP : 1; /**< Stop Condition Detected Interrupt Enable */ + unsigned int IENSRX : 1; /**< Slave Receive Request Interrupt Enable */ + unsigned int IENSTX : 1; /**< Slave Transmit Request Interrupt Enable */ + unsigned int STXDEC : 1; /**< Decrement Slave Tx FIFO Status When a Byte is Txed */ + unsigned int IENREPST : 1; /**< Repeated Start Interrupt Enable */ + unsigned int SRXDMA : 1; /**< Enable Slave Rx DMA Request */ + unsigned int STXDMA : 1; /**< Enable Slave Tx DMA Request */ + unsigned int reserved15 : 1; + }; + uint16_t VALUE16; + }; +} ADI_I2C_SCTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_SCTL_t__ */ + +/*@}*/ + +/** @defgroup SSTAT Slave I2C Status/Error/IRQ (SSTAT) Register + * Slave I2C Status/Error/IRQ (SSTAT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_SSTAT_Struct + *! \brief Slave I2C Status/Error/IRQ Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_SSTAT_t__ +typedef struct _ADI_I2C_SSTAT_t { + union { + struct { + unsigned int STXFSEREQ : 1; /**< Slave Tx FIFO Status or Early Request */ + unsigned int STXUNDR : 1; /**< Slave Transmit FIFO Underflow */ + unsigned int STXREQ : 1; /**< Slave Transmit Request/Slave Transmit Interrupt */ + unsigned int SRXREQ : 1; /**< Slave Receive Request */ + unsigned int SRXOVR : 1; /**< Slave Receive FIFO Overflow */ + unsigned int NOACK : 1; /**< ACK Not Generated by the Slave */ + unsigned int SBUSY : 1; /**< Slave Busy */ + unsigned int GCINT : 1; /**< General Call Interrupt */ + unsigned int GCID : 2; /**< General ID */ + unsigned int STOP : 1; /**< Stop After Start and Matching Address */ + unsigned int IDMAT : 2; /**< Device ID Matched */ + unsigned int REPSTART : 1; /**< Repeated Start and Matching Address */ + unsigned int START : 1; /**< Start and Matching Address */ + unsigned int reserved15 : 1; + }; + uint16_t VALUE16; + }; +} ADI_I2C_SSTAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_SSTAT_t__ */ + +/*@}*/ + +/** @defgroup SRX Slave Receive (SRX) Register + * Slave Receive (SRX) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_SRX_Struct + *! \brief Slave Receive Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_SRX_t__ +typedef struct _ADI_I2C_SRX_t { + union { + struct { + unsigned int VALUE : 8; /**< Slave Receive Register */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_I2C_SRX_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_SRX_t__ */ + +/*@}*/ + +/** @defgroup STX Slave Transmit (STX) Register + * Slave Transmit (STX) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_STX_Struct + *! \brief Slave Transmit Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_STX_t__ +typedef struct _ADI_I2C_STX_t { + union { + struct { + unsigned int VALUE : 8; /**< Slave Transmit Register */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_I2C_STX_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_STX_t__ */ + +/*@}*/ + +/** @defgroup ALT Hardware General Call ID (ALT) Register + * Hardware General Call ID (ALT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_ALT_Struct + *! \brief Hardware General Call ID Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_ALT_t__ +typedef struct _ADI_I2C_ALT_t { + union { + struct { + unsigned int ID : 8; /**< Slave Alt */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_I2C_ALT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_ALT_t__ */ + +/*@}*/ + +/** @defgroup ID0 First Slave Address Device ID (ID0) Register + * First Slave Address Device ID (ID0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_ID0_Struct + *! \brief First Slave Address Device ID Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_ID0_t__ +typedef struct _ADI_I2C_ID0_t { + union { + struct { + unsigned int VALUE : 8; /**< Slave Device ID 0 */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_I2C_ID0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_ID0_t__ */ + +/*@}*/ + +/** @defgroup ID1 Second Slave Address Device ID (ID1) Register + * Second Slave Address Device ID (ID1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_ID1_Struct + *! \brief Second Slave Address Device ID Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_ID1_t__ +typedef struct _ADI_I2C_ID1_t { + union { + struct { + unsigned int VALUE : 8; /**< Slave Device ID 1 */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_I2C_ID1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_ID1_t__ */ + +/*@}*/ + +/** @defgroup ID2 Third Slave Address Device ID (ID2) Register + * Third Slave Address Device ID (ID2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_ID2_Struct + *! \brief Third Slave Address Device ID Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_ID2_t__ +typedef struct _ADI_I2C_ID2_t { + union { + struct { + unsigned int VALUE : 8; /**< Slave Device ID 2 */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_I2C_ID2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_ID2_t__ */ + +/*@}*/ + +/** @defgroup ID3 Fourth Slave Address Device ID (ID3) Register + * Fourth Slave Address Device ID (ID3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_ID3_Struct + *! \brief Fourth Slave Address Device ID Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_ID3_t__ +typedef struct _ADI_I2C_ID3_t { + union { + struct { + unsigned int VALUE : 8; /**< Slave Device ID 3 */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_I2C_ID3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_ID3_t__ */ + +/*@}*/ + +/** @defgroup STAT Master and Slave FIFO Status (STAT) Register + * Master and Slave FIFO Status (STAT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_STAT_Struct + *! \brief Master and Slave FIFO Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_STAT_t__ +typedef struct _ADI_I2C_STAT_t { + union { + struct { + unsigned int STXF : 2; /**< Slave Transmit FIFO Status */ + unsigned int SRXF : 2; /**< Slave Receive FIFO Status */ + unsigned int MTXF : 2; /**< Master Transmit FIFO Status */ + unsigned int MRXF : 2; /**< Master Receive FIFO Status */ + unsigned int SFLUSH : 1; /**< Flush the Slave Transmit FIFO */ + unsigned int MFLUSH : 1; /**< Flush the Master Transmit FIFO */ + unsigned int reserved10 : 6; + }; + uint16_t VALUE16; + }; +} ADI_I2C_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_STAT_t__ */ + +/*@}*/ + +/** @defgroup SHCTL Shared Control (SHCTL) Register + * Shared Control (SHCTL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_SHCTL_Struct + *! \brief Shared Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_SHCTL_t__ +typedef struct _ADI_I2C_SHCTL_t { + union { + struct { + unsigned int RST : 1; /**< Reset START STOP Detect Circuit */ + unsigned int reserved1 : 15; + }; + uint16_t VALUE16; + }; +} ADI_I2C_SHCTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_SHCTL_t__ */ + +/*@}*/ + +/** @defgroup TCTL Timing Control Register (TCTL) Register + * Timing Control Register (TCTL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_TCTL_Struct + *! \brief Timing Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_TCTL_t__ +typedef struct _ADI_I2C_TCTL_t { + union { + struct { + unsigned int THDATIN : 5; /**< Data in Hold Start */ + unsigned int reserved5 : 3; + unsigned int FILTEROFF : 1; /**< Input Filter Control */ + unsigned int reserved9 : 7; + }; + uint16_t VALUE16; + }; +} ADI_I2C_TCTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_TCTL_t__ */ + +/*@}*/ + +/** @defgroup ASTRETCH_SCL Automatic Stretch SCL (ASTRETCH_SCL) Register + * Automatic Stretch SCL (ASTRETCH_SCL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_I2C_ASTRETCH_SCL_Struct + *! \brief Automatic Stretch SCL Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_I2C_ASTRETCH_SCL_t__ +typedef struct _ADI_I2C_ASTRETCH_SCL_t { + union { + struct { + unsigned int MST : 4; /**< Master Automatic Stretch Mode */ + unsigned int SLV : 4; /**< Slave Automatic Stretch Mode */ + unsigned int MSTTMO : 1; /**< Master Automatic Stretch Timeout */ + unsigned int SLVTMO : 1; /**< Slave Automatic Stretch Timeout */ + unsigned int reserved10 : 6; + }; + uint16_t VALUE16; + }; +} ADI_I2C_ASTRETCH_SCL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_I2C_ASTRETCH_SCL_t__ */ + +/*@}*/ + +/** @defgroup STAT Status (STAT) Register + * Status (STAT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPI_STAT_Struct + *! \brief Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPI_STAT_t__ +typedef struct _ADI_SPI_STAT_t { + union { + struct { + unsigned int IRQ : 1; /**< SPI Interrupt Status */ + unsigned int XFRDONE : 1; /**< SPI Transfer Completion */ + unsigned int TXEMPTY : 1; /**< SPI Tx FIFO Empty Interrupt */ + unsigned int TXDONE : 1; /**< SPI Tx Done in Read Command Mode */ + unsigned int TXUNDR : 1; /**< SPI Tx FIFO Underflow */ + unsigned int TXIRQ : 1; /**< SPI Tx IRQ */ + unsigned int RXIRQ : 1; /**< SPI Rx IRQ */ + unsigned int RXOVR : 1; /**< SPI Rx FIFO Overflow */ + unsigned int reserved8 : 3; + unsigned int CS : 1; /**< CS Status */ + unsigned int CSERR : 1; /**< Detected a CS Error Condition in Slave Mode */ + unsigned int CSRISE : 1; /**< Detected a Rising Edge on CS, in Slave CON Mode */ + unsigned int CSFALL : 1; /**< Detected a Falling Edge on CS, in Slave CON Mode */ + unsigned int RDY : 1; /**< Detected an Edge on Ready Indicator for Flow Control */ + }; + uint16_t VALUE16; + }; +} ADI_SPI_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPI_STAT_t__ */ + +/*@}*/ + +/** @defgroup RX Receive (RX) Register + * Receive (RX) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPI_RX_Struct + *! \brief Receive Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPI_RX_t__ +typedef struct _ADI_SPI_RX_t { + union { + struct { + unsigned int BYTE1 : 8; /**< 8-bit Receive Buffer */ + unsigned int BYTE2 : 8; /**< 8-bit Receive Buffer, Used Only in DMA Modes */ + }; + uint16_t VALUE16; + }; +} ADI_SPI_RX_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPI_RX_t__ */ + +/*@}*/ + +/** @defgroup TX Transmit (TX) Register + * Transmit (TX) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPI_TX_Struct + *! \brief Transmit Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPI_TX_t__ +typedef struct _ADI_SPI_TX_t { + union { + struct { + unsigned int BYTE1 : 8; /**< 8-bit Transmit Buffer */ + unsigned int BYTE2 : 8; /**< 8-bit Transmit Buffer, Used Only in DMA Modes */ + }; + uint16_t VALUE16; + }; +} ADI_SPI_TX_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPI_TX_t__ */ + +/*@}*/ + +/** @defgroup DIV SPI Baud Rate Selection (DIV) Register + * SPI Baud Rate Selection (DIV) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPI_DIV_Struct + *! \brief SPI Baud Rate Selection Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPI_DIV_t__ +typedef struct _ADI_SPI_DIV_t { + union { + struct { + unsigned int VALUE : 6; /**< SPI Clock Divider */ + unsigned int reserved6 : 10; + }; + uint16_t VALUE16; + }; +} ADI_SPI_DIV_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPI_DIV_t__ */ + +/*@}*/ + +/** @defgroup CTL SPI Configuration (CTL) Register + * SPI Configuration (CTL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPI_CTL_Struct + *! \brief SPI Configuration Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPI_CTL_t__ +typedef struct _ADI_SPI_CTL_t { + union { + struct { + unsigned int SPIEN : 1; /**< SPI Enable */ + unsigned int MASEN : 1; /**< Master Mode Enable */ + unsigned int CPHA : 1; /**< Serial Clock Phase Mode */ + unsigned int CPOL : 1; /**< Serial Clock Polarity */ + unsigned int WOM : 1; /**< SPI Wired-OR Mode */ + unsigned int LSB : 1; /**< LSB First Transfer Enable */ + unsigned int TIM : 1; /**< SPI Transfer and Interrupt Mode */ + unsigned int ZEN : 1; /**< Transmit Zeros Enable */ + unsigned int RXOF : 1; /**< Rx Overflow Overwrite Enable */ + unsigned int OEN : 1; /**< Slave MISO Output Enable */ + unsigned int LOOPBACK : 1; /**< Loopback Enable */ + unsigned int CON : 1; /**< Continuous Transfer Enable */ + unsigned int RFLUSH : 1; /**< SPI Rx FIFO Flush Enable */ + unsigned int TFLUSH : 1; /**< SPI Tx FIFO Flush Enable */ + unsigned int CSRST : 1; /**< Reset Mode for CS Error Bit */ + unsigned int reserved15 : 1; + }; + uint16_t VALUE16; + }; +} ADI_SPI_CTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPI_CTL_t__ */ + +/*@}*/ + +/** @defgroup IEN SPI Interrupts Enable (IEN) Register + * SPI Interrupts Enable (IEN) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPI_IEN_Struct + *! \brief SPI Interrupts Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPI_IEN_t__ +typedef struct _ADI_SPI_IEN_t { + union { + struct { + unsigned int IRQMODE : 3; /**< SPI IRQ Mode Bits */ + unsigned int reserved3 : 5; + unsigned int CS : 1; /**< Enable Interrupt on Every CS Edge in Slave CON Mode */ + unsigned int TXUNDR : 1; /**< Tx Underflow Interrupt Enable */ + unsigned int RXOVR : 1; /**< Rx Overflow Interrupt Enable */ + unsigned int RDY : 1; /**< Ready Signal Edge Interrupt Enable */ + unsigned int TXDONE : 1; /**< SPI Transmit Done Interrupt Enable */ + unsigned int XFRDONE : 1; /**< SPI Transfer Completion Interrupt Enable */ + unsigned int TXEMPTY : 1; /**< Tx FIFO Empty Interrupt Enable */ + unsigned int reserved15 : 1; + }; + uint16_t VALUE16; + }; +} ADI_SPI_IEN_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPI_IEN_t__ */ + +/*@}*/ + +/** @defgroup CNT Transfer Byte Count (CNT) Register + * Transfer Byte Count (CNT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPI_CNT_Struct + *! \brief Transfer Byte Count Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPI_CNT_t__ +typedef struct _ADI_SPI_CNT_t { + union { + struct { + unsigned int VALUE : 14; /**< Transfer Byte Count */ + unsigned int reserved14 : 1; + unsigned int FRAMECONT : 1; /**< Continue Frame */ + }; + uint16_t VALUE16; + }; +} ADI_SPI_CNT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPI_CNT_t__ */ + +/*@}*/ + +/** @defgroup DMA SPI DMA Enable (DMA) Register + * SPI DMA Enable (DMA) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPI_DMA_Struct + *! \brief SPI DMA Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPI_DMA_t__ +typedef struct _ADI_SPI_DMA_t { + union { + struct { + unsigned int EN : 1; /**< Enable DMA for Data Transfer */ + unsigned int TXEN : 1; /**< Enable Transmit DMA Request */ + unsigned int RXEN : 1; /**< Enable Receive DMA Request */ + unsigned int reserved3 : 13; + }; + uint16_t VALUE16; + }; +} ADI_SPI_DMA_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPI_DMA_t__ */ + +/*@}*/ + +/** @defgroup FIFO_STAT FIFO Status (FIFO_STAT) Register + * FIFO Status (FIFO_STAT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPI_FIFO_STAT_Struct + *! \brief FIFO Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPI_FIFO_STAT_t__ +typedef struct _ADI_SPI_FIFO_STAT_t { + union { + struct { + unsigned int TX : 4; /**< SPI Tx FIFO Status */ + unsigned int reserved4 : 4; + unsigned int RX : 4; /**< SPI Rx FIFO Dtatus */ + unsigned int reserved12 : 4; + }; + uint16_t VALUE16; + }; +} ADI_SPI_FIFO_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPI_FIFO_STAT_t__ */ + +/*@}*/ + +/** @defgroup RD_CTL Read Control (RD_CTL) Register + * Read Control (RD_CTL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPI_RD_CTL_Struct + *! \brief Read Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPI_RD_CTL_t__ +typedef struct _ADI_SPI_RD_CTL_t { + union { + struct { + unsigned int CMDEN : 1; /**< Read Command Enable */ + unsigned int OVERLAP : 1; /**< Tx/Rx Overlap Mode */ + unsigned int TXBYTES : 4; /**< Transmit Byte Count - 1 (Read Command) */ + unsigned int reserved6 : 2; + unsigned int THREEPIN : 1; /**< Three Pin SPI Mode */ + unsigned int reserved9 : 7; + }; + uint16_t VALUE16; + }; +} ADI_SPI_RD_CTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPI_RD_CTL_t__ */ + +/*@}*/ + +/** @defgroup FLOW_CTL Flow Control (FLOW_CTL) Register + * Flow Control (FLOW_CTL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPI_FLOW_CTL_Struct + *! \brief Flow Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPI_FLOW_CTL_t__ +typedef struct _ADI_SPI_FLOW_CTL_t { + union { + struct { + unsigned int MODE : 2; /**< Flow Control Mode */ + unsigned int reserved2 : 2; + unsigned int RDYPOL : 1; /**< Polarity of RDY/MISO Line */ + unsigned int reserved5 : 1; + unsigned int RDBURSTSZ : 10; /**< Read Data Burst Size - 1 */ + }; + uint16_t VALUE16; + }; +} ADI_SPI_FLOW_CTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPI_FLOW_CTL_t__ */ + +/*@}*/ + +/** @defgroup WAIT_TMR Wait Timer for Flow Control (WAIT_TMR) Register + * Wait Timer for Flow Control (WAIT_TMR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPI_WAIT_TMR_Struct + *! \brief Wait Timer for Flow Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPI_WAIT_TMR_t__ +typedef struct _ADI_SPI_WAIT_TMR_t { + union { + struct { + unsigned int VALUE : 16; /**< Wait Timer */ + }; + uint16_t VALUE16; + }; +} ADI_SPI_WAIT_TMR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPI_WAIT_TMR_t__ */ + +/*@}*/ + +/** @defgroup CS_CTL Chip Select Control for Multi-slave Connections (CS_CTL) Register + * Chip Select Control for Multi-slave Connections (CS_CTL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPI_CS_CTL_Struct + *! \brief Chip Select Control for Multi-slave Connections Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPI_CS_CTL_t__ +typedef struct _ADI_SPI_CS_CTL_t { + union { + struct { + unsigned int SEL : 4; /**< Chip Select Control */ + unsigned int reserved4 : 12; + }; + uint16_t VALUE16; + }; +} ADI_SPI_CS_CTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPI_CS_CTL_t__ */ + +/*@}*/ + +/** @defgroup CS_OVERRIDE Chip Select Override (CS_OVERRIDE) Register + * Chip Select Override (CS_OVERRIDE) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPI_CS_OVERRIDE_Struct + *! \brief Chip Select Override Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPI_CS_OVERRIDE_t__ +typedef struct _ADI_SPI_CS_OVERRIDE_t { + union { + struct { + unsigned int CTL : 2; /**< CS Override Control */ + unsigned int reserved2 : 14; + }; + uint16_t VALUE16; + }; +} ADI_SPI_CS_OVERRIDE_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPI_CS_OVERRIDE_t__ */ + +/*@}*/ + +/** @defgroup RX Receive Buffer Register (RX) Register + * Receive Buffer Register (RX) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_UART_RX_Struct + *! \brief Receive Buffer Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_RX_t__ +typedef struct _ADI_UART_RX_t { + union { + struct { + unsigned int RBR : 8; /**< Receive Buffer Register */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_UART_RX_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_RX_t__ */ + +/*@}*/ + +/** @defgroup TX Transmit Holding Register (TX) Register + * Transmit Holding Register (TX) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_UART_TX_Struct + *! \brief Transmit Holding Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_TX_t__ +typedef struct _ADI_UART_TX_t { + union { + struct { + unsigned int THR : 8; /**< Transmit Holding Register */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_UART_TX_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_TX_t__ */ + +/*@}*/ + +/** @defgroup IEN Interrupt Enable (IEN) Register + * Interrupt Enable (IEN) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_UART_IEN_Struct + *! \brief Interrupt Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_IEN_t__ +typedef struct _ADI_UART_IEN_t { + union { + struct { + unsigned int ERBFI : 1; /**< Receive Buffer Full Interrupt */ + unsigned int ETBEI : 1; /**< Transmit Buffer Empty Interrupt */ + unsigned int ELSI : 1; /**< Rx Status Interrupt */ + unsigned int EDSSI : 1; /**< Modem Status Interrupt */ + unsigned int EDMAT : 1; /**< DMA Requests in Transmit Mode */ + unsigned int EDMAR : 1; /**< DMA Requests in Receive Mode */ + unsigned int reserved6 : 10; + }; + uint16_t VALUE16; + }; +} ADI_UART_IEN_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_IEN_t__ */ + +/*@}*/ + +/** @defgroup IIR Interrupt ID (IIR) Register + * Interrupt ID (IIR) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_UART_IIR_STAT + *! \brief Interrupt Status (STAT) Enumerations + * ========================================================================= */ +typedef enum +{ + UART_IIR_STAT_EDSSI = 0, /**< Modem status interrupt (Read MSR register to clear) */ + UART_IIR_STAT_ETBEI = 1, /**< Transmit buffer empty interrupt (Write to Tx register or read IIR register to clear) */ + UART_IIR_STAT_ERBFI = 2, /**< Receive buffer full interrupt (Read Rx register to clear) */ + UART_IIR_STAT_RLSI = 3, /**< Receive line status interrupt (Read LSR register to clear) */ + UART_IIR_STAT_RFTOI = 6 /**< Receive FIFO time-out interrupt (Read Rx register to clear) */ +} ADI_UART_IIR_STAT; + + +/* ========================================================================== + *! \struct ADI_UART_IIR_Struct + *! \brief Interrupt ID Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_IIR_t__ +typedef struct _ADI_UART_IIR_t { + union { + struct { + unsigned int NIRQ : 1; /**< Interrupt Flag */ + unsigned int STAT : 3; /**< Interrupt Status */ + unsigned int reserved4 : 2; + unsigned int FEND : 2; /**< FIFO Enabled */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_UART_IIR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_IIR_t__ */ + +/*@}*/ + +/** @defgroup LCR Line Control (LCR) Register + * Line Control (LCR) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_UART_LCR_SP + *! \brief Stick Parity (SP) Enumerations + * ========================================================================= */ +typedef enum +{ + UART_LCR_PAR_NOTFORCED = 0, /**< Parity will not be forced based on Parity Select and Parity Enable bits. */ + UART_LCR_PAR_FORCED = 1 /**< Parity forced based on Parity Select and Parity Enable bits. */ +} ADI_UART_LCR_SP; + + +/* ========================================================================== + *! \struct ADI_UART_LCR_Struct + *! \brief Line Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_LCR_t__ +typedef struct _ADI_UART_LCR_t { + union { + struct { + unsigned int WLS : 2; /**< Word Length Select */ + unsigned int STOP : 1; /**< Stop Bit */ + unsigned int PEN : 1; /**< Parity Enable */ + unsigned int EPS : 1; /**< Parity Select */ + unsigned int SP : 1; /**< Stick Parity */ + unsigned int BRK : 1; /**< Set Break */ + unsigned int reserved7 : 9; + }; + uint16_t VALUE16; + }; +} ADI_UART_LCR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_LCR_t__ */ + +/*@}*/ + +/** @defgroup MCR Modem Control (MCR) Register + * Modem Control (MCR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_UART_MCR_Struct + *! \brief Modem Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_MCR_t__ +typedef struct _ADI_UART_MCR_t { + union { + struct { + unsigned int DTR : 1; /**< Data Terminal Ready */ + unsigned int RTS : 1; /**< Request to Send */ + unsigned int OUT1 : 1; /**< Output 1 */ + unsigned int OUT2 : 1; /**< Output 2 */ + unsigned int LOOPBACK : 1; /**< Loopback Mode */ + unsigned int reserved5 : 11; + }; + uint16_t VALUE16; + }; +} ADI_UART_MCR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_MCR_t__ */ + +/*@}*/ + +/** @defgroup LSR Line Status (LSR) Register + * Line Status (LSR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_UART_LSR_Struct + *! \brief Line Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_LSR_t__ +typedef struct _ADI_UART_LSR_t { + union { + struct { + unsigned int DR : 1; /**< Data Ready */ + unsigned int OE : 1; /**< Overrun Error */ + unsigned int PE : 1; /**< Parity Error */ + unsigned int FE : 1; /**< Framing Error */ + unsigned int BI : 1; /**< Break Indicator */ + unsigned int THRE : 1; /**< Transmit Register Empty */ + unsigned int TEMT : 1; /**< Transmit and Shift Register Empty Status */ + unsigned int FIFOERR : 1; /**< Rx FIFO Parity Error/Frame Error/Break Indication */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_UART_LSR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_LSR_t__ */ + +/*@}*/ + +/** @defgroup MSR Modem Status (MSR) Register + * Modem Status (MSR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_UART_MSR_Struct + *! \brief Modem Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_MSR_t__ +typedef struct _ADI_UART_MSR_t { + union { + struct { + unsigned int DCTS : 1; /**< Delta CTS */ + unsigned int DDSR : 1; /**< Delta DSR */ + unsigned int TERI : 1; /**< Trailing Edge RI */ + unsigned int DDCD : 1; /**< Delta DCD */ + unsigned int CTS : 1; /**< Clear to Send */ + unsigned int DSR : 1; /**< Data Set Ready */ + unsigned int RI : 1; /**< Ring Indicator */ + unsigned int DCD : 1; /**< Data Carrier Detect */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_UART_MSR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_MSR_t__ */ + +/*@}*/ + +/** @defgroup SCR Scratch Buffer (SCR) Register + * Scratch Buffer (SCR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_UART_SCR_Struct + *! \brief Scratch Buffer Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_SCR_t__ +typedef struct _ADI_UART_SCR_t { + union { + struct { + unsigned int SCR : 8; /**< Scratch */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_UART_SCR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_SCR_t__ */ + +/*@}*/ + +/** @defgroup FCR FIFO Control (FCR) Register + * FIFO Control (FCR) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_UART_FCR_FDMAMD + *! \brief FIFO DMA Mode (FDMAMD) Enumerations + * ========================================================================= */ +typedef enum +{ + UART_FCR_MODE0 = 0, /**< In DMA mode 0, RX DMA request will be asserted whenever there's data in RBR or RX FIFO and de-assert whenever RBR or RX FIFO is empty; TX DMA request will be asserted whenever THR or TX FIFO is empty and de-assert whenever data written to. */ + UART_FCR_MODE1 = 1 /**< in DMA mode 1, RX DMA request will be asserted whenever RX FIFO trig level or time out reached and de-assert thereafter when RX FIFO is empty; TX DMA request will be asserted whenever TX FIFO is empty and de-assert thereafter when TX FIFO is completely filled up full. */ +} ADI_UART_FCR_FDMAMD; + + +/* ========================================================================== + *! \struct ADI_UART_FCR_Struct + *! \brief FIFO Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_FCR_t__ +typedef struct _ADI_UART_FCR_t { + union { + struct { + unsigned int FIFOEN : 1; /**< FIFO Enable as to Work in 16550 Mode */ + unsigned int RFCLR : 1; /**< Clear Rx FIFO */ + unsigned int TFCLR : 1; /**< Clear Tx FIFO */ + unsigned int FDMAMD : 1; /**< FIFO DMA Mode */ + unsigned int reserved4 : 2; + unsigned int RFTRIG : 2; /**< Rx FIFO Trigger Level */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_UART_FCR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_FCR_t__ */ + +/*@}*/ + +/** @defgroup FBR Fractional Baud Rate (FBR) Register + * Fractional Baud Rate (FBR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_UART_FBR_Struct + *! \brief Fractional Baud Rate Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_FBR_t__ +typedef struct _ADI_UART_FBR_t { + union { + struct { + unsigned int DIVN : 11; /**< Fractional Baud Rate N Divide Bits 0 to 2047 */ + unsigned int DIVM : 2; /**< Fractional Baud Rate M Divide Bits 1 to 3 */ + unsigned int reserved13 : 2; + unsigned int FBEN : 1; /**< Fractional Baud Rate Generator Enable */ + }; + uint16_t VALUE16; + }; +} ADI_UART_FBR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_FBR_t__ */ + +/*@}*/ + +/** @defgroup DIV Baud Rate Divider (DIV) Register + * Baud Rate Divider (DIV) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_UART_DIV_Struct + *! \brief Baud Rate Divider Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_DIV_t__ +typedef struct _ADI_UART_DIV_t { + union { + struct { + unsigned int DIV : 16; /**< Baud Rate Divider */ + }; + uint16_t VALUE16; + }; +} ADI_UART_DIV_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_DIV_t__ */ + +/*@}*/ + +/** @defgroup LCR2 Second Line Control (LCR2) Register + * Second Line Control (LCR2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_UART_LCR2_Struct + *! \brief Second Line Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_LCR2_t__ +typedef struct _ADI_UART_LCR2_t { + union { + struct { + unsigned int OSR : 2; /**< Over Sample Rate */ + unsigned int reserved2 : 14; + }; + uint16_t VALUE16; + }; +} ADI_UART_LCR2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_LCR2_t__ */ + +/*@}*/ + +/** @defgroup CTL UART Control Register (CTL) Register + * UART Control Register (CTL) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_UART_CTL_RXINV + *! \brief Invert Receiver Line (RXINV) Enumerations + * ========================================================================= */ +typedef enum +{ + UART_CTL_NOTINV_RX = 0, /**< Don't invert receiver line (idling high). */ + UART_CTL_INV_RX = 1 /**< Invert receiver line (idling low). */ +} ADI_UART_CTL_RXINV; + + +/* ========================================================================== + *! \struct ADI_UART_CTL_Struct + *! \brief UART Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_CTL_t__ +typedef struct _ADI_UART_CTL_t { + union { + struct { + unsigned int reserved0 : 1; + unsigned int FORCECLK : 1; /**< Force UCLK on */ + unsigned int reserved2 : 2; + unsigned int RXINV : 1; /**< Invert Receiver Line */ + unsigned int reserved5 : 3; + unsigned int REV : 8; /**< UART Revision ID */ + }; + uint16_t VALUE16; + }; +} ADI_UART_CTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_CTL_t__ */ + +/*@}*/ + +/** @defgroup RFC RX FIFO Byte Count (RFC) Register + * RX FIFO Byte Count (RFC) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_UART_RFC_Struct + *! \brief RX FIFO Byte Count Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_RFC_t__ +typedef struct _ADI_UART_RFC_t { + union { + struct { + unsigned int RFC : 5; /**< Current Rx FIFO Data Bytes */ + unsigned int reserved5 : 11; + }; + uint16_t VALUE16; + }; +} ADI_UART_RFC_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_RFC_t__ */ + +/*@}*/ + +/** @defgroup TFC TX FIFO Byte Count (TFC) Register + * TX FIFO Byte Count (TFC) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_UART_TFC_Struct + *! \brief TX FIFO Byte Count Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_TFC_t__ +typedef struct _ADI_UART_TFC_t { + union { + struct { + unsigned int TFC : 5; /**< Current Tx FIFO Data Bytes */ + unsigned int reserved5 : 11; + }; + uint16_t VALUE16; + }; +} ADI_UART_TFC_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_TFC_t__ */ + +/*@}*/ + +/** @defgroup RSC RS485 Half-duplex Control (RSC) Register + * RS485 Half-duplex Control (RSC) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_UART_RSC_Struct + *! \brief RS485 Half-duplex Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_RSC_t__ +typedef struct _ADI_UART_RSC_t { + union { + struct { + unsigned int OENP : 1; /**< SOUT_EN Polarity */ + unsigned int OENSP : 1; /**< SOUT_EN De-assert Before Full Stop Bit(s) */ + unsigned int DISRX : 1; /**< Disable Rx When Transmitting */ + unsigned int DISTX : 1; /**< Hold off Tx When Receiving */ + unsigned int reserved4 : 12; + }; + uint16_t VALUE16; + }; +} ADI_UART_RSC_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_RSC_t__ */ + +/*@}*/ + +/** @defgroup ACR Auto Baud Control (ACR) Register + * Auto Baud Control (ACR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_UART_ACR_Struct + *! \brief Auto Baud Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_ACR_t__ +typedef struct _ADI_UART_ACR_t { + union { + struct { + unsigned int ABE : 1; /**< Auto Baud Enable */ + unsigned int DNIEN : 1; /**< Enable Done Interrupt */ + unsigned int TOIEN : 1; /**< Enable Time-out Interrupt */ + unsigned int reserved3 : 1; + unsigned int SEC : 3; /**< Starting Edge Count */ + unsigned int reserved7 : 1; + unsigned int EEC : 4; /**< Ending Edge Count */ + unsigned int reserved12 : 4; + }; + uint16_t VALUE16; + }; +} ADI_UART_ACR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_ACR_t__ */ + +/*@}*/ + +/** @defgroup ASRL Auto Baud Status (Low) (ASRL) Register + * Auto Baud Status (Low) (ASRL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_UART_ASRL_Struct + *! \brief Auto Baud Status (Low) Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_ASRL_t__ +typedef struct _ADI_UART_ASRL_t { + union { + struct { + unsigned int DONE : 1; /**< Auto Baud Done Successfully */ + unsigned int BRKTO : 1; /**< Timed Out Due to Long Time Break Condition */ + unsigned int NSETO : 1; /**< Timed Out Due to No Valid Start Edge Found */ + unsigned int NEETO : 1; /**< Timed Out Due to No Valid Ending Edge Found */ + unsigned int CNT : 12; /**< CNT[11:0] Auto Baud Counter Value */ + }; + uint16_t VALUE16; + }; +} ADI_UART_ASRL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_ASRL_t__ */ + +/*@}*/ + +/** @defgroup ASRH Auto Baud Status (High) (ASRH) Register + * Auto Baud Status (High) (ASRH) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_UART_ASRH_Struct + *! \brief Auto Baud Status (High) Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_UART_ASRH_t__ +typedef struct _ADI_UART_ASRH_t { + union { + struct { + unsigned int CNT : 8; /**< CNT[19:12] Auto Baud Counter Value */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_UART_ASRH_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_UART_ASRH_t__ */ + +/*@}*/ + +/** @defgroup CFG Beeper Configuration (CFG) Register + * Beeper Configuration (CFG) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_BEEP_CFG_Struct + *! \brief Beeper Configuration Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_BEEP_CFG_t__ +typedef struct _ADI_BEEP_CFG_t { + union { + struct { + unsigned int SEQREPEAT : 8; /**< Beeper Sequence Repeat Value */ + unsigned int EN : 1; /**< Beeper Enable */ + unsigned int reserved9 : 1; + unsigned int ASTARTIRQ : 1; /**< Tone A Start IRQ */ + unsigned int AENDIRQ : 1; /**< Tone A End IRQ */ + unsigned int BSTARTIRQ : 1; /**< Tone B Start IRQ */ + unsigned int BENDIRQ : 1; /**< Tone B End IRQ */ + unsigned int SEQNEARENDIRQ : 1; /**< Sequence 1 Cycle from End IRQ */ + unsigned int SEQATENDIRQ : 1; /**< Sequence End IRQ */ + }; + uint16_t VALUE16; + }; +} ADI_BEEP_CFG_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_BEEP_CFG_t__ */ + +/*@}*/ + +/** @defgroup STAT Beeper Status (STAT) Register + * Beeper Status (STAT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_BEEP_STAT_Struct + *! \brief Beeper Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_BEEP_STAT_t__ +typedef struct _ADI_BEEP_STAT_t { + union { + struct { + unsigned int SEQREMAIN : 8; /**< Remaining Tone-pair Iterations to Play in Sequence Mode */ + unsigned int BUSY : 1; /**< Beeper is Busy */ + unsigned int reserved9 : 1; + unsigned int ASTARTED : 1; /**< Tone A Has Started */ + unsigned int AENDED : 1; /**< Tone A Has Ended */ + unsigned int BSTARTED : 1; /**< Tone B Has Started */ + unsigned int BENDED : 1; /**< Tone B Has Ended */ + unsigned int SEQNEAREND : 1; /**< Sequencer Last Tone-pair Has Started */ + unsigned int SEQENDED : 1; /**< Sequencer Has Ended */ + }; + uint16_t VALUE16; + }; +} ADI_BEEP_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_BEEP_STAT_t__ */ + +/*@}*/ + +/** @defgroup TONEA Tone A Data (TONEA) Register + * Tone A Data (TONEA) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_BEEP_TONEA_Struct + *! \brief Tone A Data Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_BEEP_TONEA_t__ +typedef struct _ADI_BEEP_TONEA_t { + union { + struct { + unsigned int DUR : 8; /**< Tone Duration */ + unsigned int FREQ : 7; /**< Tone Frequency */ + unsigned int DIS : 1; /**< Output Disable */ + }; + uint16_t VALUE16; + }; +} ADI_BEEP_TONEA_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_BEEP_TONEA_t__ */ + +/*@}*/ + +/** @defgroup TONEB Tone B Data (TONEB) Register + * Tone B Data (TONEB) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_BEEP_TONEB_Struct + *! \brief Tone B Data Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_BEEP_TONEB_t__ +typedef struct _ADI_BEEP_TONEB_t { + union { + struct { + unsigned int DUR : 8; /**< Tone Duration */ + unsigned int FREQ : 7; /**< Tone Frequency */ + unsigned int DIS : 1; /**< Output Disable */ + }; + uint16_t VALUE16; + }; +} ADI_BEEP_TONEB_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_BEEP_TONEB_t__ */ + +/*@}*/ + +/** @defgroup CFG ADC Configuration (CFG) Register + * ADC Configuration (CFG) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_ADC_CFG_VREFSEL + *! \brief To select Vref as 1.25 V or 2.5 V (VREFSEL) Enumerations + * ========================================================================= */ +typedef enum +{ + ADC_CFG_V_2P5 = 0, /**< Vref = 2.5 V */ + ADC_CFG_V_1P25 = 1 /**< Vref = 1.25 V */ +} ADI_ADC_CFG_VREFSEL; + + +/* ========================================================================= + *! \enum ADI_ADC_CFG_REFBUFEN + *! \brief To enable internal reference buffer (REFBUFEN) Enumerations + * ========================================================================= */ +typedef enum +{ + ADC_CFG_EXT_REF = 0, /**< External reference is used */ + ADC_CFG_BUF_REF = 1 /**< Reference buffer is enabled */ +} ADI_ADC_CFG_REFBUFEN; + + +/* ========================================================================== + *! \struct ADI_ADC_CFG_Struct + *! \brief ADC Configuration Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_CFG_t__ +typedef struct _ADI_ADC_CFG_t { + union { + struct { + unsigned int PWRUP : 1; /**< Powering up ADC */ + unsigned int VREFSEL : 1; /**< To select Vref as 1.25 V or 2.5 V */ + unsigned int REFBUFEN : 1; /**< To enable internal reference buffer */ + unsigned int VREFVBAT : 1; /**< VRef VBAT */ + unsigned int EN : 1; /**< To enable ADC subsystem */ + unsigned int STARTCAL : 1; /**< To start a new offset calibration cycle */ + unsigned int RST : 1; /**< Resets internal buffers and registers when high */ + unsigned int SINKEN : 1; /**< To enable additional 50 uA sink current capability @1.25 V, 100 uA current capability @2.5 V */ + unsigned int TMPEN : 1; /**< To power up temperature sensor */ + unsigned int FAST_DISCH : 1; /**< For fast switchover of Vref from 2.5 V to 1.25 V */ + unsigned int VREFVBAT_DEL : 1; /**< Set to 1 after minimum delay of 700 us from VREFBAT field being set to 1 */ + unsigned int reserved11 : 5; + }; + uint16_t VALUE16; + }; +} ADI_ADC_CFG_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_CFG_t__ */ + +/*@}*/ + +/** @defgroup PWRUP ADC Power-up Time (PWRUP) Register + * ADC Power-up Time (PWRUP) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_PWRUP_Struct + *! \brief ADC Power-up Time Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_PWRUP_t__ +typedef struct _ADI_ADC_PWRUP_t { + union { + struct { + unsigned int WAIT : 11; /**< Program this count to generate 20us wait time with respect to the PCLK frequency */ + unsigned int reserved11 : 5; + }; + uint16_t VALUE16; + }; +} ADI_ADC_PWRUP_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_PWRUP_t__ */ + +/*@}*/ + +/** @defgroup CAL_WORD Calibration Word (CAL_WORD) Register + * Calibration Word (CAL_WORD) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_CAL_WORD_Struct + *! \brief Calibration Word Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_CAL_WORD_t__ +typedef struct _ADI_ADC_CAL_WORD_t { + union { + struct { + unsigned int VALUE : 7; /**< Offset calibration word */ + unsigned int reserved7 : 9; + }; + uint16_t VALUE16; + }; +} ADI_ADC_CAL_WORD_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_CAL_WORD_t__ */ + +/*@}*/ + +/** @defgroup CNV_CFG ADC Conversion Configuration (CNV_CFG) Register + * ADC Conversion Configuration (CNV_CFG) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_CNV_CFG_Struct + *! \brief ADC Conversion Configuration Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_CNV_CFG_t__ +typedef struct _ADI_ADC_CNV_CFG_t { + union { + struct { + unsigned int SEL : 8; /**< To select channel(s) to convert */ + unsigned int BAT : 1; /**< To enable battery monitoring */ + unsigned int TMP : 1; /**< To select temperature measurement 1 */ + unsigned int TMP2 : 1; /**< To select temperature measurement 2 */ + unsigned int reserved11 : 1; + unsigned int AUTOMODE : 1; /**< To enable auto mode */ + unsigned int DMAEN : 1; /**< To enable DMA channel */ + unsigned int SINGLE : 1; /**< Set to start single conversion */ + unsigned int MULTI : 1; /**< Set to start multiple conversions */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_CNV_CFG_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_CNV_CFG_t__ */ + +/*@}*/ + +/** @defgroup CNV_TIME ADC Conversion Time (CNV_TIME) Register + * ADC Conversion Time (CNV_TIME) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_CNV_TIME_Struct + *! \brief ADC Conversion Time Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_CNV_TIME_t__ +typedef struct _ADI_ADC_CNV_TIME_t { + union { + struct { + unsigned int SAMPTIME : 8; /**< Number of clock cycles (ACLK) required for sampling */ + unsigned int DLY : 8; /**< Delay between two consecutive conversions in terms of number of ACLK cycles */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_CNV_TIME_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_CNV_TIME_t__ */ + +/*@}*/ + +/** @defgroup AVG_CFG Averaging Configuration (AVG_CFG) Register + * Averaging Configuration (AVG_CFG) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_AVG_CFG_Struct + *! \brief Averaging Configuration Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_AVG_CFG_t__ +typedef struct _ADI_ADC_AVG_CFG_t { + union { + struct { + unsigned int FACTOR : 8; /**< Program averaging factor for averaging enabled channels (1-256) */ + unsigned int reserved8 : 6; + unsigned int OS : 1; /**< Enable oversampling */ + unsigned int EN : 1; /**< To enable averaging on Channels enabled in enable register */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_AVG_CFG_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_AVG_CFG_t__ */ + +/*@}*/ + +/** @defgroup IRQ_EN Interrupt Enable (IRQ_EN) Register + * Interrupt Enable (IRQ_EN) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_IRQ_EN_Struct + *! \brief Interrupt Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_IRQ_EN_t__ +typedef struct _ADI_ADC_IRQ_EN_t { + union { + struct { + unsigned int CNVDONE : 1; /**< Set it to enable interrupt after conversion is done */ + unsigned int reserved1 : 9; + unsigned int CALDONE : 1; /**< Set it to enable interrupt for calibration done */ + unsigned int OVF : 1; /**< Set to enable interrupt in case of overflow */ + unsigned int ALERT : 1; /**< Set to enable interrupt on crossing lower or higher limit */ + unsigned int RDY : 1; /**< Set to enable interrupt when ADC is ready to convert */ + unsigned int reserved14 : 2; + }; + uint16_t VALUE16; + }; +} ADI_ADC_IRQ_EN_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_IRQ_EN_t__ */ + +/*@}*/ + +/** @defgroup STAT ADC Status (STAT) Register + * ADC Status (STAT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_STAT_Struct + *! \brief ADC Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_STAT_t__ +typedef struct _ADI_ADC_STAT_t { + union { + struct { + unsigned int DONE0 : 1; /**< Indicates conversion done on Channel 0 */ + unsigned int DONE1 : 1; /**< Indicates conversion done on Channel 1 */ + unsigned int DONE2 : 1; /**< Indicates conversion done on Channel 2 */ + unsigned int DONE3 : 1; /**< Indicates conversion done on Channel 3 */ + unsigned int DONE4 : 1; /**< Indicates conversion done on Channel 4 */ + unsigned int DONE5 : 1; /**< Indicates conversion done on Channel 5 */ + unsigned int DONE6 : 1; /**< Indicates conversion done on Channel 6 */ + unsigned int DONE7 : 1; /**< Indicates conversion done on Channel 7 */ + unsigned int BATDONE : 1; /**< Indicates conversion done for battery monitoring */ + unsigned int TMPDONE : 1; /**< Indicates conversion is done for temperature sensing */ + unsigned int TMP2DONE : 1; /**< Indicates conversion is done for temperature sensing 2 */ + unsigned int reserved11 : 3; + unsigned int CALDONE : 1; /**< Indicates calibration is done */ + unsigned int RDY : 1; /**< Indicates ADC is ready to start converting, when using external reference buffer */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_STAT_t__ */ + +/*@}*/ + +/** @defgroup OVF Overflow of Output Registers (OVF) Register + * Overflow of Output Registers (OVF) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_OVF_Struct + *! \brief Overflow of Output Registers Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_OVF_t__ +typedef struct _ADI_ADC_OVF_t { + union { + struct { + unsigned int CH0 : 1; /**< Indicates overflow in channel 0 output register */ + unsigned int CH1 : 1; /**< Indicates overflow in channel 1 output register */ + unsigned int CH2 : 1; /**< Indicates overflow in channel 2 output register */ + unsigned int CH3 : 1; /**< Indicates overflow in channel 3 output register */ + unsigned int CH4 : 1; /**< Indicates overflow in channel 4 output register */ + unsigned int CH5 : 1; /**< Indicates overflow in channel 5 output register */ + unsigned int CH6 : 1; /**< Indicates overflow in channel 6 output register */ + unsigned int CH7 : 1; /**< Indicates overflow in channel 7 output register */ + unsigned int BAT : 1; /**< Indicates overflow in battery monitoring output register */ + unsigned int TMP : 1; /**< Indicates overflow in temperature output register */ + unsigned int TMP2 : 1; /**< Indicates overflow in temperature 2 output register */ + unsigned int reserved11 : 5; + }; + uint16_t VALUE16; + }; +} ADI_ADC_OVF_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_OVF_t__ */ + +/*@}*/ + +/** @defgroup ALERT Alert Indication (ALERT) Register + * Alert Indication (ALERT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_ALERT_Struct + *! \brief Alert Indication Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_ALERT_t__ +typedef struct _ADI_ADC_ALERT_t { + union { + struct { + unsigned int HI0 : 1; /**< Channel 0 High alert status */ + unsigned int LO0 : 1; /**< Channel 0 Low alert status */ + unsigned int HI1 : 1; /**< Channel 1 High alert status */ + unsigned int LO1 : 1; /**< Channel 1 Low alert status */ + unsigned int HI2 : 1; /**< Channel 2 High alert status */ + unsigned int LO2 : 1; /**< Channel 2 Low alert status */ + unsigned int HI3 : 1; /**< Channel 3 High alert status */ + unsigned int LO3 : 1; /**< Channel 3 Low alert status */ + unsigned int reserved8 : 8; + }; + uint16_t VALUE16; + }; +} ADI_ADC_ALERT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_ALERT_t__ */ + +/*@}*/ + +/** @defgroup CH0_OUT Conversion Result Channel 0 (CH0_OUT) Register + * Conversion Result Channel 0 (CH0_OUT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_CH0_OUT_Struct + *! \brief Conversion Result Channel 0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_CH0_OUT_t__ +typedef struct _ADI_ADC_CH0_OUT_t { + union { + struct { + unsigned int RESULT : 16; /**< Conversion result of channel 0 is stored here */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_CH0_OUT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_CH0_OUT_t__ */ + +/*@}*/ + +/** @defgroup CH1_OUT Conversion Result Channel 1 (CH1_OUT) Register + * Conversion Result Channel 1 (CH1_OUT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_CH1_OUT_Struct + *! \brief Conversion Result Channel 1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_CH1_OUT_t__ +typedef struct _ADI_ADC_CH1_OUT_t { + union { + struct { + unsigned int RESULT : 16; /**< Conversion result of channel 1 is stored here */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_CH1_OUT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_CH1_OUT_t__ */ + +/*@}*/ + +/** @defgroup CH2_OUT Conversion Result Channel 2 (CH2_OUT) Register + * Conversion Result Channel 2 (CH2_OUT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_CH2_OUT_Struct + *! \brief Conversion Result Channel 2 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_CH2_OUT_t__ +typedef struct _ADI_ADC_CH2_OUT_t { + union { + struct { + unsigned int RESULT : 16; /**< Conversion result of channel 2 is stored here */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_CH2_OUT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_CH2_OUT_t__ */ + +/*@}*/ + +/** @defgroup CH3_OUT Conversion Result Channel 3 (CH3_OUT) Register + * Conversion Result Channel 3 (CH3_OUT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_CH3_OUT_Struct + *! \brief Conversion Result Channel 3 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_CH3_OUT_t__ +typedef struct _ADI_ADC_CH3_OUT_t { + union { + struct { + unsigned int RESULT : 16; /**< Conversion result of channel 3 is stored here */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_CH3_OUT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_CH3_OUT_t__ */ + +/*@}*/ + +/** @defgroup CH4_OUT Conversion Result Channel 4 (CH4_OUT) Register + * Conversion Result Channel 4 (CH4_OUT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_CH4_OUT_Struct + *! \brief Conversion Result Channel 4 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_CH4_OUT_t__ +typedef struct _ADI_ADC_CH4_OUT_t { + union { + struct { + unsigned int RESULT : 16; /**< Conversion result of channel 4 is stored here */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_CH4_OUT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_CH4_OUT_t__ */ + +/*@}*/ + +/** @defgroup CH5_OUT Conversion Result Channel 5 (CH5_OUT) Register + * Conversion Result Channel 5 (CH5_OUT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_CH5_OUT_Struct + *! \brief Conversion Result Channel 5 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_CH5_OUT_t__ +typedef struct _ADI_ADC_CH5_OUT_t { + union { + struct { + unsigned int RESULT : 16; /**< Conversion result of channel 5 is stored here */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_CH5_OUT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_CH5_OUT_t__ */ + +/*@}*/ + +/** @defgroup CH6_OUT Conversion Result Channel 6 (CH6_OUT) Register + * Conversion Result Channel 6 (CH6_OUT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_CH6_OUT_Struct + *! \brief Conversion Result Channel 6 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_CH6_OUT_t__ +typedef struct _ADI_ADC_CH6_OUT_t { + union { + struct { + unsigned int RESULT : 16; /**< Conversion result of channel 6 is stored here */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_CH6_OUT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_CH6_OUT_t__ */ + +/*@}*/ + +/** @defgroup CH7_OUT Conversion Result Channel 7 (CH7_OUT) Register + * Conversion Result Channel 7 (CH7_OUT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_CH7_OUT_Struct + *! \brief Conversion Result Channel 7 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_CH7_OUT_t__ +typedef struct _ADI_ADC_CH7_OUT_t { + union { + struct { + unsigned int RESULT : 16; /**< Conversion result of channel 7 is stored here */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_CH7_OUT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_CH7_OUT_t__ */ + +/*@}*/ + +/** @defgroup BAT_OUT Battery Monitoring Result (BAT_OUT) Register + * Battery Monitoring Result (BAT_OUT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_BAT_OUT_Struct + *! \brief Battery Monitoring Result Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_BAT_OUT_t__ +typedef struct _ADI_ADC_BAT_OUT_t { + union { + struct { + unsigned int RESULT : 16; /**< Conversion result of battery monitoring is stored here */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_BAT_OUT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_BAT_OUT_t__ */ + +/*@}*/ + +/** @defgroup TMP_OUT Temperature Result (TMP_OUT) Register + * Temperature Result (TMP_OUT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_TMP_OUT_Struct + *! \brief Temperature Result Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_TMP_OUT_t__ +typedef struct _ADI_ADC_TMP_OUT_t { + union { + struct { + unsigned int RESULT : 16; /**< Conversion result of Temperature measurement 1 is stored here */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_TMP_OUT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_TMP_OUT_t__ */ + +/*@}*/ + +/** @defgroup TMP2_OUT Temperature Result 2 (TMP2_OUT) Register + * Temperature Result 2 (TMP2_OUT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_TMP2_OUT_Struct + *! \brief Temperature Result 2 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_TMP2_OUT_t__ +typedef struct _ADI_ADC_TMP2_OUT_t { + union { + struct { + unsigned int RESULT : 16; /**< Conversion result of Temperature measurement 2 is stored here */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_TMP2_OUT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_TMP2_OUT_t__ */ + +/*@}*/ + +/** @defgroup DMA_OUT DMA Output Register (DMA_OUT) Register + * DMA Output Register (DMA_OUT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_DMA_OUT_Struct + *! \brief DMA Output Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_DMA_OUT_t__ +typedef struct _ADI_ADC_DMA_OUT_t { + union { + struct { + unsigned int RESULT : 16; /**< Register to store conversion result for DMA */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_DMA_OUT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_DMA_OUT_t__ */ + +/*@}*/ + +/** @defgroup LIM0_LO Channel 0 Low Limit (LIM0_LO) Register + * Channel 0 Low Limit (LIM0_LO) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_LIM0_LO_Struct + *! \brief Channel 0 Low Limit Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_LIM0_LO_t__ +typedef struct _ADI_ADC_LIM0_LO_t { + union { + struct { + unsigned int VALUE : 12; /**< Low limit value for channel 0 */ + unsigned int reserved12 : 3; + unsigned int EN : 1; /**< To enable low limit comparison on Channel 0 */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_LIM0_LO_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_LIM0_LO_t__ */ + +/*@}*/ + +/** @defgroup LIM0_HI Channel 0 High Limit (LIM0_HI) Register + * Channel 0 High Limit (LIM0_HI) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_LIM0_HI_Struct + *! \brief Channel 0 High Limit Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_LIM0_HI_t__ +typedef struct _ADI_ADC_LIM0_HI_t { + union { + struct { + unsigned int VALUE : 12; /**< High limit value for channel 0 */ + unsigned int reserved12 : 3; + unsigned int EN : 1; /**< To enable high limit comparison on Channel 0 */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_LIM0_HI_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_LIM0_HI_t__ */ + +/*@}*/ + +/** @defgroup HYS0 Channel 0 Hysteresis (HYS0) Register + * Channel 0 Hysteresis (HYS0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_HYS0_Struct + *! \brief Channel 0 Hysteresis Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_HYS0_t__ +typedef struct _ADI_ADC_HYS0_t { + union { + struct { + unsigned int VALUE : 9; /**< Hysteresis value for Channel 0 */ + unsigned int reserved9 : 3; + unsigned int MONCYC : 3; /**< Program number of conversion cycles to monitor channel 0 before raising alert */ + unsigned int EN : 1; /**< To enable hysteresis for comparison on Channel 0 */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_HYS0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_HYS0_t__ */ + +/*@}*/ + +/** @defgroup LIM1_LO Channel 1 Low Limit (LIM1_LO) Register + * Channel 1 Low Limit (LIM1_LO) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_LIM1_LO_Struct + *! \brief Channel 1 Low Limit Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_LIM1_LO_t__ +typedef struct _ADI_ADC_LIM1_LO_t { + union { + struct { + unsigned int VALUE : 12; /**< Low limit value for channel 1 */ + unsigned int reserved12 : 3; + unsigned int EN : 1; /**< To enable low limit comparison on Channel 1 */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_LIM1_LO_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_LIM1_LO_t__ */ + +/*@}*/ + +/** @defgroup LIM1_HI Channel 1 High Limit (LIM1_HI) Register + * Channel 1 High Limit (LIM1_HI) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_LIM1_HI_Struct + *! \brief Channel 1 High Limit Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_LIM1_HI_t__ +typedef struct _ADI_ADC_LIM1_HI_t { + union { + struct { + unsigned int VALUE : 12; /**< High limit value for channel 1 */ + unsigned int reserved12 : 3; + unsigned int EN : 1; /**< To enable high limit comparison on Channel 1 */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_LIM1_HI_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_LIM1_HI_t__ */ + +/*@}*/ + +/** @defgroup HYS1 Channel 1 Hysteresis (HYS1) Register + * Channel 1 Hysteresis (HYS1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_HYS1_Struct + *! \brief Channel 1 Hysteresis Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_HYS1_t__ +typedef struct _ADI_ADC_HYS1_t { + union { + struct { + unsigned int VALUE : 9; /**< Hysteresis value for Channel 1 */ + unsigned int reserved9 : 3; + unsigned int MONCYC : 3; /**< Program number of conversion cycles to monitor channel 1 before raising alert */ + unsigned int EN : 1; /**< To enable hysteresis for comparison on Channel 1 */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_HYS1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_HYS1_t__ */ + +/*@}*/ + +/** @defgroup LIM2_LO Channel 2 Low Limit (LIM2_LO) Register + * Channel 2 Low Limit (LIM2_LO) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_LIM2_LO_Struct + *! \brief Channel 2 Low Limit Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_LIM2_LO_t__ +typedef struct _ADI_ADC_LIM2_LO_t { + union { + struct { + unsigned int VALUE : 12; /**< Low limit value for channel 2 */ + unsigned int reserved12 : 3; + unsigned int EN : 1; /**< To enable low limit comparison on Channel 2 */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_LIM2_LO_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_LIM2_LO_t__ */ + +/*@}*/ + +/** @defgroup LIM2_HI Channel 2 High Limit (LIM2_HI) Register + * Channel 2 High Limit (LIM2_HI) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_LIM2_HI_Struct + *! \brief Channel 2 High Limit Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_LIM2_HI_t__ +typedef struct _ADI_ADC_LIM2_HI_t { + union { + struct { + unsigned int VALUE : 12; /**< High limit value for channel 2 */ + unsigned int reserved12 : 3; + unsigned int EN : 1; /**< To enable high limit comparison on Channel 2 */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_LIM2_HI_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_LIM2_HI_t__ */ + +/*@}*/ + +/** @defgroup HYS2 Channel 2 Hysteresis (HYS2) Register + * Channel 2 Hysteresis (HYS2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_HYS2_Struct + *! \brief Channel 2 Hysteresis Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_HYS2_t__ +typedef struct _ADI_ADC_HYS2_t { + union { + struct { + unsigned int VALUE : 9; /**< Hysteresis value for Channel 2 */ + unsigned int reserved9 : 3; + unsigned int MONCYC : 3; /**< Program number of conversion cycles to monitor channel 2 before raising alert */ + unsigned int EN : 1; /**< To enable hysteresis for comparison on Channel 2 */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_HYS2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_HYS2_t__ */ + +/*@}*/ + +/** @defgroup LIM3_LO Channel 3 Low Limit (LIM3_LO) Register + * Channel 3 Low Limit (LIM3_LO) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_LIM3_LO_Struct + *! \brief Channel 3 Low Limit Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_LIM3_LO_t__ +typedef struct _ADI_ADC_LIM3_LO_t { + union { + struct { + unsigned int VALUE : 12; /**< Low limit value for channel 3 */ + unsigned int reserved12 : 3; + unsigned int EN : 1; /**< To enable low limit comparison on Channel 3 */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_LIM3_LO_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_LIM3_LO_t__ */ + +/*@}*/ + +/** @defgroup LIM3_HI Channel 3 High Limit (LIM3_HI) Register + * Channel 3 High Limit (LIM3_HI) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_LIM3_HI_Struct + *! \brief Channel 3 High Limit Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_LIM3_HI_t__ +typedef struct _ADI_ADC_LIM3_HI_t { + union { + struct { + unsigned int VALUE : 12; /**< High limit value for channel 3 */ + unsigned int reserved12 : 3; + unsigned int EN : 1; /**< To enable high limit comparison on Channel 3 */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_LIM3_HI_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_LIM3_HI_t__ */ + +/*@}*/ + +/** @defgroup HYS3 Channel 3 Hysteresis (HYS3) Register + * Channel 3 Hysteresis (HYS3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_HYS3_Struct + *! \brief Channel 3 Hysteresis Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_HYS3_t__ +typedef struct _ADI_ADC_HYS3_t { + union { + struct { + unsigned int VALUE : 9; /**< Hysteresis value for Channel 3 */ + unsigned int reserved9 : 3; + unsigned int MONCYC : 3; /**< Program number of conversion cycles to monitor channel 3 before raising alert */ + unsigned int EN : 1; /**< To enable hysteresis for comparison on Channel 3 */ + }; + uint16_t VALUE16; + }; +} ADI_ADC_HYS3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_HYS3_t__ */ + +/*@}*/ + +/** @defgroup CFG1 Reference Buffer Low Power Mode (CFG1) Register + * Reference Buffer Low Power Mode (CFG1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_ADC_CFG1_Struct + *! \brief Reference Buffer Low Power Mode Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_ADC_CFG1_t__ +typedef struct _ADI_ADC_CFG1_t { + union { + struct { + unsigned int RBUFLP : 1; /**< Enable low power mode for reference buffer */ + unsigned int reserved1 : 15; + }; + uint16_t VALUE16; + }; +} ADI_ADC_CFG1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_ADC_CFG1_t__ */ + +/*@}*/ + +/** @defgroup STAT DMA Status (STAT) Register + * DMA Status (STAT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_STAT_Struct + *! \brief DMA Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_STAT_t__ +typedef struct _ADI_DMA_STAT_t { + union { + struct { + unsigned int MEN : 1; /**< Enable Status of the Controller */ + unsigned int reserved1 : 15; + unsigned int CHANM1 : 5; /**< Number of Available DMA Channels Minus 1 */ + unsigned int reserved21 : 11; + }; + uint32_t VALUE32; + }; +} ADI_DMA_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_STAT_t__ */ + +/*@}*/ + +/** @defgroup CFG DMA Configuration (CFG) Register + * DMA Configuration (CFG) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_CFG_Struct + *! \brief DMA Configuration Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_CFG_t__ +typedef struct _ADI_DMA_CFG_t { + union { + struct { + unsigned int MEN : 1; /**< Controller Enable */ + unsigned int reserved1 : 31; + }; + uint32_t VALUE32; + }; +} ADI_DMA_CFG_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_CFG_t__ */ + +/*@}*/ + +/** @defgroup PDBPTR DMA Channel Primary Control Database Pointer (PDBPTR) Register + * DMA Channel Primary Control Database Pointer (PDBPTR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_PDBPTR_Struct + *! \brief DMA Channel Primary Control Database Pointer Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_PDBPTR_t__ +typedef struct _ADI_DMA_PDBPTR_t { + union { + struct { + unsigned int ADDR : 32; /**< Pointer to the Base Address of the Primary Data Structure */ + }; + uint32_t VALUE32; + }; +} ADI_DMA_PDBPTR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_PDBPTR_t__ */ + +/*@}*/ + +/** @defgroup ADBPTR DMA Channel Alternate Control Database Pointer (ADBPTR) Register + * DMA Channel Alternate Control Database Pointer (ADBPTR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_ADBPTR_Struct + *! \brief DMA Channel Alternate Control Database Pointer Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_ADBPTR_t__ +typedef struct _ADI_DMA_ADBPTR_t { + union { + struct { + unsigned int ADDR : 32; /**< Base Address of the Alternate Data Structure */ + }; + uint32_t VALUE32; + }; +} ADI_DMA_ADBPTR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_ADBPTR_t__ */ + +/*@}*/ + +/** @defgroup SWREQ DMA Channel Software Request (SWREQ) Register + * DMA Channel Software Request (SWREQ) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_SWREQ_Struct + *! \brief DMA Channel Software Request Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_SWREQ_t__ +typedef struct _ADI_DMA_SWREQ_t { + union { + struct { + unsigned int CHAN : 27; /**< Generate Software Request */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_SWREQ_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_SWREQ_t__ */ + +/*@}*/ + +/** @defgroup RMSK_SET DMA Channel Request Mask Set (RMSK_SET) Register + * DMA Channel Request Mask Set (RMSK_SET) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_RMSK_SET_Struct + *! \brief DMA Channel Request Mask Set Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_RMSK_SET_t__ +typedef struct _ADI_DMA_RMSK_SET_t { + union { + struct { + unsigned int CHAN : 27; /**< Mask Requests from DMA Channels */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_RMSK_SET_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_RMSK_SET_t__ */ + +/*@}*/ + +/** @defgroup RMSK_CLR DMA Channel Request Mask Clear (RMSK_CLR) Register + * DMA Channel Request Mask Clear (RMSK_CLR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_RMSK_CLR_Struct + *! \brief DMA Channel Request Mask Clear Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_RMSK_CLR_t__ +typedef struct _ADI_DMA_RMSK_CLR_t { + union { + struct { + unsigned int CHAN : 27; /**< Clear Request Mask Set Bits */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_RMSK_CLR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_RMSK_CLR_t__ */ + +/*@}*/ + +/** @defgroup EN_SET DMA Channel Enable Set (EN_SET) Register + * DMA Channel Enable Set (EN_SET) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_EN_SET_Struct + *! \brief DMA Channel Enable Set Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_EN_SET_t__ +typedef struct _ADI_DMA_EN_SET_t { + union { + struct { + unsigned int CHAN : 27; /**< Enable DMA Channels */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_EN_SET_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_EN_SET_t__ */ + +/*@}*/ + +/** @defgroup EN_CLR DMA Channel Enable Clear (EN_CLR) Register + * DMA Channel Enable Clear (EN_CLR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_EN_CLR_Struct + *! \brief DMA Channel Enable Clear Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_EN_CLR_t__ +typedef struct _ADI_DMA_EN_CLR_t { + union { + struct { + unsigned int CHAN : 27; /**< Disable DMA Channels */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_EN_CLR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_EN_CLR_t__ */ + +/*@}*/ + +/** @defgroup ALT_SET DMA Channel Primary Alternate Set (ALT_SET) Register + * DMA Channel Primary Alternate Set (ALT_SET) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_ALT_SET_Struct + *! \brief DMA Channel Primary Alternate Set Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_ALT_SET_t__ +typedef struct _ADI_DMA_ALT_SET_t { + union { + struct { + unsigned int CHAN : 27; /**< Control Structure Status / Select Alternate Structure */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_ALT_SET_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_ALT_SET_t__ */ + +/*@}*/ + +/** @defgroup ALT_CLR DMA Channel Primary Alternate Clear (ALT_CLR) Register + * DMA Channel Primary Alternate Clear (ALT_CLR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_ALT_CLR_Struct + *! \brief DMA Channel Primary Alternate Clear Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_ALT_CLR_t__ +typedef struct _ADI_DMA_ALT_CLR_t { + union { + struct { + unsigned int CHAN : 27; /**< Select Primary Data Structure */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_ALT_CLR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_ALT_CLR_t__ */ + +/*@}*/ + +/** @defgroup PRI_SET DMA Channel Priority Set (PRI_SET) Register + * DMA Channel Priority Set (PRI_SET) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_PRI_SET_Struct + *! \brief DMA Channel Priority Set Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_PRI_SET_t__ +typedef struct _ADI_DMA_PRI_SET_t { + union { + struct { + unsigned int CHAN : 27; /**< Configure Channel for High Priority */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_PRI_SET_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_PRI_SET_t__ */ + +/*@}*/ + +/** @defgroup PRI_CLR DMA Channel Priority Clear (PRI_CLR) Register + * DMA Channel Priority Clear (PRI_CLR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_PRI_CLR_Struct + *! \brief DMA Channel Priority Clear Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_PRI_CLR_t__ +typedef struct _ADI_DMA_PRI_CLR_t { + union { + struct { + unsigned int CHPRICLR : 27; /**< Configure Channel for Default Priority Level */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_PRI_CLR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_PRI_CLR_t__ */ + +/*@}*/ + +/** @defgroup ERRCHNL_CLR DMA per Channel Error Clear (ERRCHNL_CLR) Register + * DMA per Channel Error Clear (ERRCHNL_CLR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_ERRCHNL_CLR_Struct + *! \brief DMA per Channel Error Clear Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_ERRCHNL_CLR_t__ +typedef struct _ADI_DMA_ERRCHNL_CLR_t { + union { + struct { + unsigned int CHAN : 27; /**< Per Channel Bus Error Status/Clear */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_ERRCHNL_CLR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_ERRCHNL_CLR_t__ */ + +/*@}*/ + +/** @defgroup ERR_CLR DMA Bus Error Clear (ERR_CLR) Register + * DMA Bus Error Clear (ERR_CLR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_ERR_CLR_Struct + *! \brief DMA Bus Error Clear Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_ERR_CLR_t__ +typedef struct _ADI_DMA_ERR_CLR_t { + union { + struct { + unsigned int CHAN : 27; /**< Bus Error Status */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_ERR_CLR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_ERR_CLR_t__ */ + +/*@}*/ + +/** @defgroup INVALIDDESC_CLR DMA per Channel Invalid Descriptor Clear (INVALIDDESC_CLR) Register + * DMA per Channel Invalid Descriptor Clear (INVALIDDESC_CLR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_INVALIDDESC_CLR_Struct + *! \brief DMA per Channel Invalid Descriptor Clear Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_INVALIDDESC_CLR_t__ +typedef struct _ADI_DMA_INVALIDDESC_CLR_t { + union { + struct { + unsigned int CHAN : 27; /**< Per Channel Invalid Descriptor Status/Clear */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_INVALIDDESC_CLR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_INVALIDDESC_CLR_t__ */ + +/*@}*/ + +/** @defgroup BS_SET DMA Channel Bytes Swap Enable Set (BS_SET) Register + * DMA Channel Bytes Swap Enable Set (BS_SET) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_BS_SET_Struct + *! \brief DMA Channel Bytes Swap Enable Set Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_BS_SET_t__ +typedef struct _ADI_DMA_BS_SET_t { + union { + struct { + unsigned int CHAN : 27; /**< Byte Swap Status */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_BS_SET_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_BS_SET_t__ */ + +/*@}*/ + +/** @defgroup BS_CLR DMA Channel Bytes Swap Enable Clear (BS_CLR) Register + * DMA Channel Bytes Swap Enable Clear (BS_CLR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_BS_CLR_Struct + *! \brief DMA Channel Bytes Swap Enable Clear Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_BS_CLR_t__ +typedef struct _ADI_DMA_BS_CLR_t { + union { + struct { + unsigned int CHAN : 27; /**< Disable Byte Swap */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_BS_CLR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_BS_CLR_t__ */ + +/*@}*/ + +/** @defgroup SRCADDR_SET DMA Channel Source Address Decrement Enable Set (SRCADDR_SET) Register + * DMA Channel Source Address Decrement Enable Set (SRCADDR_SET) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_SRCADDR_SET_Struct + *! \brief DMA Channel Source Address Decrement Enable Set Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_SRCADDR_SET_t__ +typedef struct _ADI_DMA_SRCADDR_SET_t { + union { + struct { + unsigned int CHAN : 27; /**< Source Address Decrement Status */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_SRCADDR_SET_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_SRCADDR_SET_t__ */ + +/*@}*/ + +/** @defgroup SRCADDR_CLR DMA Channel Source Address Decrement Enable Clear (SRCADDR_CLR) Register + * DMA Channel Source Address Decrement Enable Clear (SRCADDR_CLR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_SRCADDR_CLR_Struct + *! \brief DMA Channel Source Address Decrement Enable Clear Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_SRCADDR_CLR_t__ +typedef struct _ADI_DMA_SRCADDR_CLR_t { + union { + struct { + unsigned int CHAN : 27; /**< Disable Source Address Decrement */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_SRCADDR_CLR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_SRCADDR_CLR_t__ */ + +/*@}*/ + +/** @defgroup DSTADDR_SET DMA Channel Destination Address Decrement Enable Set (DSTADDR_SET) Register + * DMA Channel Destination Address Decrement Enable Set (DSTADDR_SET) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_DSTADDR_SET_Struct + *! \brief DMA Channel Destination Address Decrement Enable Set Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_DSTADDR_SET_t__ +typedef struct _ADI_DMA_DSTADDR_SET_t { + union { + struct { + unsigned int CHAN : 27; /**< Destination Address Decrement Status */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_DSTADDR_SET_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_DSTADDR_SET_t__ */ + +/*@}*/ + +/** @defgroup DSTADDR_CLR DMA Channel Destination Address Decrement Enable Clear (DSTADDR_CLR) Register + * DMA Channel Destination Address Decrement Enable Clear (DSTADDR_CLR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_DSTADDR_CLR_Struct + *! \brief DMA Channel Destination Address Decrement Enable Clear Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_DSTADDR_CLR_t__ +typedef struct _ADI_DMA_DSTADDR_CLR_t { + union { + struct { + unsigned int CHAN : 27; /**< Disable Destination Address Decrement */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_DMA_DSTADDR_CLR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_DSTADDR_CLR_t__ */ + +/*@}*/ + +/** @defgroup REVID DMA Controller Revision ID (REVID) Register + * DMA Controller Revision ID (REVID) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_DMA_REVID_Struct + *! \brief DMA Controller Revision ID Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_DMA_REVID_t__ +typedef struct _ADI_DMA_REVID_t { + union { + struct { + unsigned int VALUE : 8; /**< DMA Controller Revision ID */ + unsigned int reserved8 : 24; + }; + uint32_t VALUE32; + }; +} ADI_DMA_REVID_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_DMA_REVID_t__ */ + +/*@}*/ + +/** @defgroup STAT Status (STAT) Register + * Status (STAT) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_FLCC_STAT_ACCESS_MODE + *! \brief Access Mode (ACCESS_MODE) Enumerations + * ========================================================================= */ +typedef enum +{ + FLCC_STAT_DIRECT = 0, /**< Flash controller is currently in Direct Access mode; user access to all registers is enabled */ + FLCC_STAT_INDIRECT = 1 /**< Flash Controller is currently in Indirect Access mode; user access to registers is limited to read-only access of the status register. Full register access will be restored when the Cryptographic module releases control of the flash controller (crypto completes the ongoing operation within the protected key storage region) */ +} ADI_FLCC_STAT_ACCESS_MODE; + + +/* ========================================================================== + *! \struct ADI_FLCC_STAT_Struct + *! \brief Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_STAT_t__ +typedef struct _ADI_FLCC_STAT_t { + union { + struct { + unsigned int CMDBUSY : 1; /**< Command busy */ + unsigned int WRCLOSE : 1; /**< WRITE registers are closed */ + unsigned int CMDCOMP : 1; /**< Command complete */ + unsigned int WRALCOMP : 1; /**< Write almost complete */ + unsigned int CMDFAIL : 2; /**< Provides information on command failures */ + unsigned int SLEEPING : 1; /**< Flash array is in low power (sleep) mode */ + unsigned int ECCERRCMD : 2; /**< ECC errors detected during user issued SIGN command */ + unsigned int ECCRDERR : 2; /**< ECC IRQ cause */ + unsigned int OVERLAP : 1; /**< Overlapping Command */ + unsigned int reserved12 : 1; + unsigned int SIGNERR : 1; /**< Signature check failure during initialization */ + unsigned int INIT : 1; /**< Flash controller initialization in progress */ + unsigned int ECCINFOSIGN : 2; /**< ECC status of flash initialization */ + unsigned int ECCERRCNT : 3; /**< ECC correction counter */ + unsigned int reserved20 : 5; + unsigned int ECCICODE : 2; /**< ICode AHB Bus Error ECC status */ + unsigned int ECCDCODE : 2; /**< DCode AHB Bus Error ECC status */ + unsigned int CACHESRAMPERR : 1; /**< SRAM parity errors in Cache Controller */ + unsigned int reserved30 : 1; + unsigned int ACCESS_MODE : 1; /**< Access Mode */ + }; + uint32_t VALUE32; + }; +} ADI_FLCC_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_STAT_t__ */ + +/*@}*/ + +/** @defgroup IEN Interrupt Enable (IEN) Register + * Interrupt Enable (IEN) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_FLCC_IEN_ECC_CORRECT + *! \brief Control whether to generate bus errors, interrupts, or neither in response to 1-bit ECC Correction events (ECC_CORRECT) Enumerations + * ========================================================================= */ +typedef enum +{ + FLCC_IEN_NONE_COR = 0, /**< Do not generate a response to ECC events */ + FLCC_IEN_BUS_ERR_COR = 1, /**< Generate Bus Errors in response to ECC events */ + FLCC_IEN_IRQ_COR = 2 /**< Generate IRQs in response to ECC events */ +} ADI_FLCC_IEN_ECC_CORRECT; + + +/* ========================================================================= + *! \enum ADI_FLCC_IEN_ECC_ERROR + *! \brief Control whether to generate bus errors, interrupts, or neither in response to 2-bit ECC Error events (ECC_ERROR) Enumerations + * ========================================================================= */ +typedef enum +{ + FLCC_IEN_NONE_ERR = 0, /**< Do not generate a response to ECC events */ + FLCC_IEN_BUS_ERR_ERR = 1, /**< Generate Bus Errors in response to ECC events */ + FLCC_IEN_IRQ_ERR = 2 /**< Generate IRQs in response to ECC events */ +} ADI_FLCC_IEN_ECC_ERROR; + + +/* ========================================================================== + *! \struct ADI_FLCC_IEN_Struct + *! \brief Interrupt Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_IEN_t__ +typedef struct _ADI_FLCC_IEN_t { + union { + struct { + unsigned int CMDCMPLT : 1; /**< Command complete interrupt enable */ + unsigned int WRALCMPLT : 1; /**< Write almost complete interrupt enable */ + unsigned int CMDFAIL : 1; /**< Command fail interrupt enable */ + unsigned int reserved3 : 1; + unsigned int ECC_CORRECT : 2; /**< Control whether to generate bus errors, interrupts, or neither in response to 1-bit ECC Correction events */ + unsigned int ECC_ERROR : 2; /**< Control whether to generate bus errors, interrupts, or neither in response to 2-bit ECC Error events */ + unsigned int reserved8 : 24; + }; + uint32_t VALUE32; + }; +} ADI_FLCC_IEN_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_IEN_t__ */ + +/*@}*/ + +/** @defgroup CMD Command (CMD) Register + * Command (CMD) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_FLCC_CMD_VALUE + *! \brief Commands (VALUE) Enumerations + * ========================================================================= */ +typedef enum +{ + FLCC_CMD_IDLE = 0, /**< IDLE */ + FLCC_CMD_ABORT = 1, /**< ABORT */ + FLCC_CMD_SLEEP = 2, /**< Requests flash to enter Sleep mode */ + FLCC_CMD_SIGN = 3, /**< SIGN */ + FLCC_CMD_WRITE = 4, /**< WRITE */ + FLCC_CMD_BLANK_CHECK = 5, /**< Checks all of User Space; fails if any bits in user space are cleared */ + FLCC_CMD_ERASEPAGE = 6, /**< ERASEPAGE */ + FLCC_CMD_MASSERASE = 7 /**< MASSERASE */ +} ADI_FLCC_CMD_VALUE; + + +/* ========================================================================== + *! \struct ADI_FLCC_CMD_Struct + *! \brief Command Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_CMD_t__ +typedef struct _ADI_FLCC_CMD_t { + union { + struct { + unsigned int VALUE : 4; /**< Commands */ + unsigned int reserved4 : 28; + }; + uint32_t VALUE32; + }; +} ADI_FLCC_CMD_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_CMD_t__ */ + +/*@}*/ + +/** @defgroup KH_ADDR Write Address (KH_ADDR) Register + * Write Address (KH_ADDR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_KH_ADDR_Struct + *! \brief Write Address Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_KH_ADDR_t__ +typedef struct _ADI_FLCC_KH_ADDR_t { + union { + struct { + unsigned int reserved0 : 3; + unsigned int VALUE : 17; /**< Address to be written on a WRITE command */ + unsigned int reserved20 : 12; + }; + uint32_t VALUE32; + }; +} ADI_FLCC_KH_ADDR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_KH_ADDR_t__ */ + +/*@}*/ + +/** @defgroup KH_DATA0 Write Lower Data (KH_DATA0) Register + * Write Lower Data (KH_DATA0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_KH_DATA0_Struct + *! \brief Write Lower Data Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_KH_DATA0_t__ +typedef struct _ADI_FLCC_KH_DATA0_t { + union { + struct { + unsigned int VALUE : 32; /**< Lower half of 64-bit dual word data to be written on a Write command */ + }; + uint32_t VALUE32; + }; +} ADI_FLCC_KH_DATA0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_KH_DATA0_t__ */ + +/*@}*/ + +/** @defgroup KH_DATA1 Write Upper Data (KH_DATA1) Register + * Write Upper Data (KH_DATA1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_KH_DATA1_Struct + *! \brief Write Upper Data Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_KH_DATA1_t__ +typedef struct _ADI_FLCC_KH_DATA1_t { + union { + struct { + unsigned int VALUE : 32; /**< Upper half of 64-bit dual word data to be written on a Write command */ + }; + uint32_t VALUE32; + }; +} ADI_FLCC_KH_DATA1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_KH_DATA1_t__ */ + +/*@}*/ + +/** @defgroup PAGE_ADDR0 Lower Page Address (PAGE_ADDR0) Register + * Lower Page Address (PAGE_ADDR0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_PAGE_ADDR0_Struct + *! \brief Lower Page Address Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_PAGE_ADDR0_t__ +typedef struct _ADI_FLCC_PAGE_ADDR0_t { + union { + struct { + unsigned int reserved0 : 10; + unsigned int VALUE : 10; /**< Lower address bits of the page address */ + unsigned int reserved20 : 12; + }; + uint32_t VALUE32; + }; +} ADI_FLCC_PAGE_ADDR0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_PAGE_ADDR0_t__ */ + +/*@}*/ + +/** @defgroup PAGE_ADDR1 Upper Page Address (PAGE_ADDR1) Register + * Upper Page Address (PAGE_ADDR1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_PAGE_ADDR1_Struct + *! \brief Upper Page Address Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_PAGE_ADDR1_t__ +typedef struct _ADI_FLCC_PAGE_ADDR1_t { + union { + struct { + unsigned int reserved0 : 10; + unsigned int VALUE : 10; /**< Upper address bits of the page address */ + unsigned int reserved20 : 12; + }; + uint32_t VALUE32; + }; +} ADI_FLCC_PAGE_ADDR1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_PAGE_ADDR1_t__ */ + +/*@}*/ + +/** @defgroup KEY Key (KEY) Register + * Key (KEY) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_FLCC_KEY_VALUE + *! \brief Key register (VALUE) Enumerations + * ========================================================================= */ +typedef enum +{ + FLCC_KEY_USERKEY = 1735161189 /**< USERKEY */ +} ADI_FLCC_KEY_VALUE; + + +/* ========================================================================== + *! \struct ADI_FLCC_KEY_Struct + *! \brief Key Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_KEY_t__ +typedef struct _ADI_FLCC_KEY_t { + union { + struct { + unsigned int VALUE : 32; /**< Key register */ + }; + uint32_t VALUE32; + }; +} ADI_FLCC_KEY_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_KEY_t__ */ + +/*@}*/ + +/** @defgroup WR_ABORT_ADDR Write Abort Address (WR_ABORT_ADDR) Register + * Write Abort Address (WR_ABORT_ADDR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_WR_ABORT_ADDR_Struct + *! \brief Write Abort Address Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_WR_ABORT_ADDR_t__ +typedef struct _ADI_FLCC_WR_ABORT_ADDR_t { + union { + struct { + unsigned int VALUE : 32; /**< Address of recently aborted write command */ + }; + uint32_t VALUE32; + }; +} ADI_FLCC_WR_ABORT_ADDR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_WR_ABORT_ADDR_t__ */ + +/*@}*/ + +/** @defgroup WRPROT Write Protection (WRPROT) Register + * Write Protection (WRPROT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_WRPROT_Struct + *! \brief Write Protection Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_WRPROT_t__ +typedef struct _ADI_FLCC_WRPROT_t { + union { + struct { + unsigned int WORD : 32; /**< Clear bits to write protect related groups of user space pages */ + }; + uint32_t VALUE32; + }; +} ADI_FLCC_WRPROT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_WRPROT_t__ */ + +/*@}*/ + +/** @defgroup SIGNATURE Signature (SIGNATURE) Register + * Signature (SIGNATURE) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_SIGNATURE_Struct + *! \brief Signature Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_SIGNATURE_t__ +typedef struct _ADI_FLCC_SIGNATURE_t { + union { + struct { + unsigned int VALUE : 32; /**< Read signature */ + }; + uint32_t VALUE32; + }; +} ADI_FLCC_SIGNATURE_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_SIGNATURE_t__ */ + +/*@}*/ + +/** @defgroup UCFG User Configuration (UCFG) Register + * User Configuration (UCFG) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_UCFG_Struct + *! \brief User Configuration Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_UCFG_t__ +typedef struct _ADI_FLCC_UCFG_t { + union { + struct { + unsigned int KHDMAEN : 1; /**< Key hole DMA enable */ + unsigned int AUTOINCEN : 1; /**< Auto Address Increment for Key Hole Access */ + unsigned int reserved2 : 30; + }; + uint32_t VALUE32; + }; +} ADI_FLCC_UCFG_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_UCFG_t__ */ + +/*@}*/ + +/** @defgroup TIME_PARAM0 Time Parameter 0 (TIME_PARAM0) Register + * Time Parameter 0 (TIME_PARAM0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_TIME_PARAM0_Struct + *! \brief Time Parameter 0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_TIME_PARAM0_t__ +typedef struct _ADI_FLCC_TIME_PARAM0_t { + union { + struct { + unsigned int DIVREFCLK : 1; /**< Divide Reference Clock (by 2) */ + unsigned int reserved1 : 3; + unsigned int TNVS : 4; /**< PROG/ERASE to NVSTR setup time */ + unsigned int TPGS : 4; /**< NVSTR to Program setup time */ + unsigned int TPROG : 4; /**< Program time */ + unsigned int TNVH : 4; /**< NVSTR Hold time */ + unsigned int TRCV : 4; /**< Recovery time */ + unsigned int TERASE : 4; /**< Erase Time */ + unsigned int TNVH1 : 4; /**< NVSTR Hold time during Mass Erase */ + }; + uint32_t VALUE32; + }; +} ADI_FLCC_TIME_PARAM0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_TIME_PARAM0_t__ */ + +/*@}*/ + +/** @defgroup TIME_PARAM1 Time Parameter 1 (TIME_PARAM1) Register + * Time Parameter 1 (TIME_PARAM1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_TIME_PARAM1_Struct + *! \brief Time Parameter 1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_TIME_PARAM1_t__ +typedef struct _ADI_FLCC_TIME_PARAM1_t { + union { + struct { + unsigned int TWK : 4; /**< Wake up time */ + unsigned int WAITSTATES : 3; /**< Number of wait states to access flash */ + unsigned int reserved7 : 1; + unsigned int CURWAITSTATES : 3; /**< Current wait states [2:0] */ + unsigned int reserved11 : 21; + }; + uint32_t VALUE32; + }; +} ADI_FLCC_TIME_PARAM1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_TIME_PARAM1_t__ */ + +/*@}*/ + +/** @defgroup ABORT_EN_LO IRQ Abort Enable (Lower Bits) (ABORT_EN_LO) Register + * IRQ Abort Enable (Lower Bits) (ABORT_EN_LO) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_ABORT_EN_LO_Struct + *! \brief IRQ Abort Enable (Lower Bits) Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_ABORT_EN_LO_t__ +typedef struct _ADI_FLCC_ABORT_EN_LO_t { + union { + struct { + unsigned int VALUE : 32; /**< VALUE[31:0] Sys IRQ Abort Enable */ + }; + uint32_t VALUE32; + }; +} ADI_FLCC_ABORT_EN_LO_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_ABORT_EN_LO_t__ */ + +/*@}*/ + +/** @defgroup ABORT_EN_HI IRQ Abort Enable (Upper Bits) (ABORT_EN_HI) Register + * IRQ Abort Enable (Upper Bits) (ABORT_EN_HI) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_ABORT_EN_HI_Struct + *! \brief IRQ Abort Enable (Upper Bits) Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_ABORT_EN_HI_t__ +typedef struct _ADI_FLCC_ABORT_EN_HI_t { + union { + struct { + unsigned int VALUE : 32; /**< VALUE[63:32] Sys IRQ Abort Enable */ + }; + uint32_t VALUE32; + }; +} ADI_FLCC_ABORT_EN_HI_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_ABORT_EN_HI_t__ */ + +/*@}*/ + +/** @defgroup ECC_CFG ECC Configuration (ECC_CFG) Register + * ECC Configuration (ECC_CFG) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_ECC_CFG_Struct + *! \brief ECC Configuration Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_ECC_CFG_t__ +typedef struct _ADI_FLCC_ECC_CFG_t { + union { + struct { + unsigned int EN : 1; /**< ECC Enable */ + unsigned int INFOEN : 1; /**< Info space ECC Enable bit */ + unsigned int reserved2 : 6; + unsigned int PTR : 24; /**< ECC start page pointer */ + }; + uint32_t VALUE32; + }; +} ADI_FLCC_ECC_CFG_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_ECC_CFG_t__ */ + +/*@}*/ + +/** @defgroup ECC_ADDR ECC Status (Address) (ECC_ADDR) Register + * ECC Status (Address) (ECC_ADDR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_ECC_ADDR_Struct + *! \brief ECC Status (Address) Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_ECC_ADDR_t__ +typedef struct _ADI_FLCC_ECC_ADDR_t { + union { + struct { + unsigned int VALUE : 20; /**< This register has the address for which ECC error is detected */ + unsigned int reserved20 : 12; + }; + uint32_t VALUE32; + }; +} ADI_FLCC_ECC_ADDR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_ECC_ADDR_t__ */ + +/*@}*/ + +/** @defgroup POR_SEC Flash Security (POR_SEC) Register + * Flash Security (POR_SEC) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_POR_SEC_Struct + *! \brief Flash Security Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_POR_SEC_t__ +typedef struct _ADI_FLCC_POR_SEC_t { + union { + struct { + unsigned int SECURE : 1; /**< Set this bit to prevent read or write access to User Space (sticky when set) */ + unsigned int reserved1 : 31; + }; + uint32_t VALUE32; + }; +} ADI_FLCC_POR_SEC_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_POR_SEC_t__ */ + +/*@}*/ + +/** @defgroup VOL_CFG Volatile Flash Configuration (VOL_CFG) Register + * Volatile Flash Configuration (VOL_CFG) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_VOL_CFG_Struct + *! \brief Volatile Flash Configuration Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_VOL_CFG_t__ +typedef struct _ADI_FLCC_VOL_CFG_t { + union { + struct { + unsigned int INFO_REMAP : 1; /**< Alias the info space to the base address of user space */ + unsigned int reserved1 : 31; + }; + uint32_t VALUE32; + }; +} ADI_FLCC_VOL_CFG_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_VOL_CFG_t__ */ + +/*@}*/ + +/** @defgroup STAT Cache Status Register (STAT) Register + * Cache Status Register (STAT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_CACHE_STAT_Struct + *! \brief Cache Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_CACHE_STAT_t__ +typedef struct _ADI_FLCC_CACHE_STAT_t { + union { + struct { + unsigned int ICEN : 1; /**< If this bit is set, I-Cache is enabled */ + unsigned int reserved1 : 31; + }; + uint32_t VALUE32; + }; +} ADI_FLCC_CACHE_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_CACHE_STAT_t__ */ + +/*@}*/ + +/** @defgroup SETUP Cache Setup Register (SETUP) Register + * Cache Setup Register (SETUP) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_CACHE_SETUP_Struct + *! \brief Cache Setup Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_CACHE_SETUP_t__ +typedef struct _ADI_FLCC_CACHE_SETUP_t { + union { + struct { + unsigned int ICEN : 1; /**< If this bit set, I-Cache is enabled for AHB accesses */ + unsigned int LCKIC : 1; /**< If this bit is set, I-Cache contents are locked */ + unsigned int reserved2 : 30; + }; + uint32_t VALUE32; + }; +} ADI_FLCC_CACHE_SETUP_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_CACHE_SETUP_t__ */ + +/*@}*/ + +/** @defgroup KEY Cache Key Register (KEY) Register + * Cache Key Register (KEY) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_FLCC_CACHE_KEY_Struct + *! \brief Cache Key Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_FLCC_CACHE_KEY_t__ +typedef struct _ADI_FLCC_CACHE_KEY_t { + union { + struct { + unsigned int VALUE : 32; /**< Cache Key */ + }; + uint32_t VALUE32; + }; +} ADI_FLCC_CACHE_KEY_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_FLCC_CACHE_KEY_t__ */ + +/*@}*/ + +/** @defgroup CFG Port Configuration (CFG) Register + * Port Configuration (CFG) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_GPIO_CFG_Struct + *! \brief Port Configuration Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_GPIO_CFG_t__ +typedef struct _ADI_GPIO_CFG_t { + union { + struct { + unsigned int PIN00 : 2; /**< Pin 0 configuration bits */ + unsigned int PIN01 : 2; /**< Pin 1 configuration bits */ + unsigned int PIN02 : 2; /**< Pin 2 configuration bits */ + unsigned int PIN03 : 2; /**< Pin 3 configuration bits */ + unsigned int PIN04 : 2; /**< Pin 4 configuration bits */ + unsigned int PIN05 : 2; /**< Pin 5 configuration bits */ + unsigned int PIN06 : 2; /**< Pin 6 configuration bits */ + unsigned int PIN07 : 2; /**< Pin 7 configuration bits */ + unsigned int PIN08 : 2; /**< Pin 8 configuration bits */ + unsigned int PIN09 : 2; /**< Pin 9 configuration bits */ + unsigned int PIN10 : 2; /**< Pin 10 configuration bits */ + unsigned int PIN11 : 2; /**< Pin 11 configuration bits */ + unsigned int PIN12 : 2; /**< Pin 12 configuration bits */ + unsigned int PIN13 : 2; /**< Pin 13 configuration bits */ + unsigned int PIN14 : 2; /**< Pin 14 configuration bits */ + unsigned int PIN15 : 2; /**< Pin 15 configuration bits */ + }; + uint32_t VALUE32; + }; +} ADI_GPIO_CFG_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_GPIO_CFG_t__ */ + +/*@}*/ + +/** @defgroup OEN Port Output Enable (OEN) Register + * Port Output Enable (OEN) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_GPIO_OEN_Struct + *! \brief Port Output Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_GPIO_OEN_t__ +typedef struct _ADI_GPIO_OEN_t { + union { + struct { + unsigned int VALUE : 16; /**< Pin Output Drive enable */ + }; + uint16_t VALUE16; + }; +} ADI_GPIO_OEN_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_GPIO_OEN_t__ */ + +/*@}*/ + +/** @defgroup PE Port Output Pull-up/Pull-down Enable (PE) Register + * Port Output Pull-up/Pull-down Enable (PE) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_GPIO_PE_Struct + *! \brief Port Output Pull-up/Pull-down Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_GPIO_PE_t__ +typedef struct _ADI_GPIO_PE_t { + union { + struct { + unsigned int VALUE : 16; /**< Pin Pull enable */ + }; + uint16_t VALUE16; + }; +} ADI_GPIO_PE_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_GPIO_PE_t__ */ + +/*@}*/ + +/** @defgroup IEN Port Input Path Enable (IEN) Register + * Port Input Path Enable (IEN) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_GPIO_IEN_Struct + *! \brief Port Input Path Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_GPIO_IEN_t__ +typedef struct _ADI_GPIO_IEN_t { + union { + struct { + unsigned int VALUE : 16; /**< Input path enable */ + }; + uint16_t VALUE16; + }; +} ADI_GPIO_IEN_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_GPIO_IEN_t__ */ + +/*@}*/ + +/** @defgroup IN Port Registered Data Input (IN) Register + * Port Registered Data Input (IN) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_GPIO_IN_Struct + *! \brief Port Registered Data Input Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_GPIO_IN_t__ +typedef struct _ADI_GPIO_IN_t { + union { + struct { + unsigned int VALUE : 16; /**< Registered data input */ + }; + uint16_t VALUE16; + }; +} ADI_GPIO_IN_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_GPIO_IN_t__ */ + +/*@}*/ + +/** @defgroup OUT Port Data Output (OUT) Register + * Port Data Output (OUT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_GPIO_OUT_Struct + *! \brief Port Data Output Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_GPIO_OUT_t__ +typedef struct _ADI_GPIO_OUT_t { + union { + struct { + unsigned int VALUE : 16; /**< Data out */ + }; + uint16_t VALUE16; + }; +} ADI_GPIO_OUT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_GPIO_OUT_t__ */ + +/*@}*/ + +/** @defgroup SET Port Data Out Set (SET) Register + * Port Data Out Set (SET) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_GPIO_SET_Struct + *! \brief Port Data Out Set Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_GPIO_SET_t__ +typedef struct _ADI_GPIO_SET_t { + union { + struct { + unsigned int VALUE : 16; /**< Set the output HIGH for the pin */ + }; + uint16_t VALUE16; + }; +} ADI_GPIO_SET_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_GPIO_SET_t__ */ + +/*@}*/ + +/** @defgroup CLR Port Data Out Clear (CLR) Register + * Port Data Out Clear (CLR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_GPIO_CLR_Struct + *! \brief Port Data Out Clear Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_GPIO_CLR_t__ +typedef struct _ADI_GPIO_CLR_t { + union { + struct { + unsigned int VALUE : 16; /**< Set the output low for the port pin */ + }; + uint16_t VALUE16; + }; +} ADI_GPIO_CLR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_GPIO_CLR_t__ */ + +/*@}*/ + +/** @defgroup TGL Port Pin Toggle (TGL) Register + * Port Pin Toggle (TGL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_GPIO_TGL_Struct + *! \brief Port Pin Toggle Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_GPIO_TGL_t__ +typedef struct _ADI_GPIO_TGL_t { + union { + struct { + unsigned int VALUE : 16; /**< Toggle the output of the port pin */ + }; + uint16_t VALUE16; + }; +} ADI_GPIO_TGL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_GPIO_TGL_t__ */ + +/*@}*/ + +/** @defgroup POL Port Interrupt Polarity (POL) Register + * Port Interrupt Polarity (POL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_GPIO_POL_Struct + *! \brief Port Interrupt Polarity Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_GPIO_POL_t__ +typedef struct _ADI_GPIO_POL_t { + union { + struct { + unsigned int VALUE : 16; /**< Interrupt polarity */ + }; + uint16_t VALUE16; + }; +} ADI_GPIO_POL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_GPIO_POL_t__ */ + +/*@}*/ + +/** @defgroup IENA Port Interrupt A Enable (IENA) Register + * Port Interrupt A Enable (IENA) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_GPIO_IENA_Struct + *! \brief Port Interrupt A Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_GPIO_IENA_t__ +typedef struct _ADI_GPIO_IENA_t { + union { + struct { + unsigned int VALUE : 16; /**< Interrupt A enable */ + }; + uint16_t VALUE16; + }; +} ADI_GPIO_IENA_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_GPIO_IENA_t__ */ + +/*@}*/ + +/** @defgroup IENB Port Interrupt B Enable (IENB) Register + * Port Interrupt B Enable (IENB) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_GPIO_IENB_Struct + *! \brief Port Interrupt B Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_GPIO_IENB_t__ +typedef struct _ADI_GPIO_IENB_t { + union { + struct { + unsigned int VALUE : 16; /**< Interrupt B enable */ + }; + uint16_t VALUE16; + }; +} ADI_GPIO_IENB_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_GPIO_IENB_t__ */ + +/*@}*/ + +/** @defgroup INT Port Interrupt Status (INT) Register + * Port Interrupt Status (INT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_GPIO_INT_Struct + *! \brief Port Interrupt Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_GPIO_INT_t__ +typedef struct _ADI_GPIO_INT_t { + union { + struct { + unsigned int VALUE : 16; /**< Interrupt Status */ + }; + uint16_t VALUE16; + }; +} ADI_GPIO_INT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_GPIO_INT_t__ */ + +/*@}*/ + +/** @defgroup DS Port Drive Strength Select (DS) Register + * Port Drive Strength Select (DS) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_GPIO_DS_Struct + *! \brief Port Drive Strength Select Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_GPIO_DS_t__ +typedef struct _ADI_GPIO_DS_t { + union { + struct { + unsigned int VALUE : 16; /**< Drive strength select */ + }; + uint16_t VALUE16; + }; +} ADI_GPIO_DS_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_GPIO_DS_t__ */ + +/*@}*/ + +/** @defgroup CTL_A Half SPORT 'A' Control Register (CTL_A) Register + * Half SPORT 'A' Control Register (CTL_A) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_SPORT_CTL_A_SPEN + *! \brief Serial Port Enable (SPEN) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_CTL_A_CTL_DIS = 0, /**< Disable */ + SPORT_CTL_A_CTL_EN = 1 /**< Enable */ +} ADI_SPORT_CTL_A_SPEN; + + +/* ========================================================================= + *! \enum ADI_SPORT_CTL_A_FSMUXSEL + *! \brief Frame Sync Multiplexer Select (FSMUXSEL) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_CTL_A_CTL_FS_MUX_DIS = 0, /**< Disable frame sync multiplexing */ + SPORT_CTL_A_CTL_FS_MUX_EN = 1 /**< Enable frame sync multiplexing */ +} ADI_SPORT_CTL_A_FSMUXSEL; + + +/* ========================================================================= + *! \enum ADI_SPORT_CTL_A_CKMUXSEL + *! \brief Clock Multiplexer Select (CKMUXSEL) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_CTL_A_CTL_CLK_MUX_DIS = 0, /**< Disable serial clock multiplexing */ + SPORT_CTL_A_CTL_CLK_MUX_EN = 1 /**< Enable serial clock multiplexing */ +} ADI_SPORT_CTL_A_CKMUXSEL; + + +/* ========================================================================= + *! \enum ADI_SPORT_CTL_A_LSBF + *! \brief Least-Significant Bit First (LSBF) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_CTL_A_CTL_MSB_FIRST = 0, /**< MSB first sent/received */ + SPORT_CTL_A_CTL_LSB_FIRST = 1 /**< LSB first sent/received */ +} ADI_SPORT_CTL_A_LSBF; + + +/* ========================================================================= + *! \enum ADI_SPORT_CTL_A_ICLK + *! \brief Internal Clock (ICLK) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_CTL_A_CTL_EXTERNAL_CLK = 0, /**< External clock */ + SPORT_CTL_A_CTL_INTERNAL_CLK = 1 /**< Internal clock */ +} ADI_SPORT_CTL_A_ICLK; + + +/* ========================================================================= + *! \enum ADI_SPORT_CTL_A_OPMODE + *! \brief Operation mode (OPMODE) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_CTL_A_CTL_SERIAL = 0, /**< DSP standard */ + SPORT_CTL_A_CTL_TIMER_EN_MODE = 1 /**< Timer_enable mode */ +} ADI_SPORT_CTL_A_OPMODE; + + +/* ========================================================================= + *! \enum ADI_SPORT_CTL_A_CKRE + *! \brief Clock Rising Edge (CKRE) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_CTL_A_CTL_CLK_FALL_EDGE = 0, /**< Clock falling edge */ + SPORT_CTL_A_CTL_CLK_RISE_EDGE = 1 /**< Clock rising edge */ +} ADI_SPORT_CTL_A_CKRE; + + +/* ========================================================================= + *! \enum ADI_SPORT_CTL_A_FSR + *! \brief Frame Sync Required (FSR) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_CTL_A_CTL_FS_NOT_REQ = 0, /**< No frame sync required */ + SPORT_CTL_A_CTL_FS_REQ = 1 /**< Frame sync required */ +} ADI_SPORT_CTL_A_FSR; + + +/* ========================================================================= + *! \enum ADI_SPORT_CTL_A_IFS + *! \brief Internal Frame Sync (IFS) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_CTL_A_CTL_EXTERNAL_FS = 0, /**< External frame sync */ + SPORT_CTL_A_CTL_INTERNAL_FS = 1 /**< Internal frame sync */ +} ADI_SPORT_CTL_A_IFS; + + +/* ========================================================================= + *! \enum ADI_SPORT_CTL_A_DIFS + *! \brief Data-Independent Frame Sync (DIFS) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_CTL_A_CTL_DATA_DEP_FS = 0, /**< Data-dependent frame sync */ + SPORT_CTL_A_CTL_DATA_INDP_FS = 1 /**< Data-independent frame sync */ +} ADI_SPORT_CTL_A_DIFS; + + +/* ========================================================================= + *! \enum ADI_SPORT_CTL_A_LFS + *! \brief Active-Low Frame Sync (LFS) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_CTL_A_CTL_FS_LO = 0, /**< Active high frame sync */ + SPORT_CTL_A_CTL_FS_HI = 1 /**< Active low frame sync */ +} ADI_SPORT_CTL_A_LFS; + + +/* ========================================================================= + *! \enum ADI_SPORT_CTL_A_LAFS + *! \brief Late Frame Sync (LAFS) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_CTL_A_CTL_EARLY_FS = 0, /**< Early frame sync */ + SPORT_CTL_A_CTL_LATE_FS = 1 /**< Late frame sync */ +} ADI_SPORT_CTL_A_LAFS; + + +/* ========================================================================= + *! \enum ADI_SPORT_CTL_A_PACK + *! \brief Packing Enable (PACK) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_CTL_A_CTL_PACK_DIS = 0, /**< Disable */ + SPORT_CTL_A_CTL_PACK_8BIT = 1, /**< 8-bit packing enable */ + SPORT_CTL_A_CTL_PACK_16BIT = 2 /**< 16-bit packing enable */ +} ADI_SPORT_CTL_A_PACK; + + +/* ========================================================================= + *! \enum ADI_SPORT_CTL_A_GCLKEN + *! \brief Gated Clock Enable (GCLKEN) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_CTL_A_CTL_GCLK_DIS = 0, /**< Disable */ + SPORT_CTL_A_CTL_GCLK_EN = 1 /**< Enable */ +} ADI_SPORT_CTL_A_GCLKEN; + + +/* ========================================================================= + *! \enum ADI_SPORT_CTL_A_SPTRAN + *! \brief Serial Port Transfer Direction (SPTRAN) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_CTL_A_CTL_RX = 0, /**< Receive */ + SPORT_CTL_A_CTL_TX = 1 /**< Transmit */ +} ADI_SPORT_CTL_A_SPTRAN; + + +/* ========================================================================== + *! \struct ADI_SPORT_CTL_A_Struct + *! \brief Half SPORT 'A' Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_CTL_A_t__ +typedef struct _ADI_SPORT_CTL_A_t { + union { + struct { + unsigned int SPEN : 1; /**< Serial Port Enable */ + unsigned int FSMUXSEL : 1; /**< Frame Sync Multiplexer Select */ + unsigned int CKMUXSEL : 1; /**< Clock Multiplexer Select */ + unsigned int LSBF : 1; /**< Least-Significant Bit First */ + unsigned int SLEN : 5; /**< Serial Word Length */ + unsigned int reserved9 : 1; + unsigned int ICLK : 1; /**< Internal Clock */ + unsigned int OPMODE : 1; /**< Operation mode */ + unsigned int CKRE : 1; /**< Clock Rising Edge */ + unsigned int FSR : 1; /**< Frame Sync Required */ + unsigned int IFS : 1; /**< Internal Frame Sync */ + unsigned int DIFS : 1; /**< Data-Independent Frame Sync */ + unsigned int LFS : 1; /**< Active-Low Frame Sync */ + unsigned int LAFS : 1; /**< Late Frame Sync */ + unsigned int PACK : 2; /**< Packing Enable */ + unsigned int FSERRMODE : 1; /**< Frame Sync Error Operation */ + unsigned int GCLKEN : 1; /**< Gated Clock Enable */ + unsigned int reserved22 : 3; + unsigned int SPTRAN : 1; /**< Serial Port Transfer Direction */ + unsigned int DMAEN : 1; /**< DMA Enable */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_SPORT_CTL_A_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_CTL_A_t__ */ + +/*@}*/ + +/** @defgroup DIV_A Half SPORT 'A' Divisor Register (DIV_A) Register + * Half SPORT 'A' Divisor Register (DIV_A) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPORT_DIV_A_Struct + *! \brief Half SPORT 'A' Divisor Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_DIV_A_t__ +typedef struct _ADI_SPORT_DIV_A_t { + union { + struct { + unsigned int CLKDIV : 16; /**< Clock Divisor */ + unsigned int FSDIV : 8; /**< Frame Sync Divisor */ + unsigned int reserved24 : 8; + }; + uint32_t VALUE32; + }; +} ADI_SPORT_DIV_A_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_DIV_A_t__ */ + +/*@}*/ + +/** @defgroup IEN_A Half SPORT A's Interrupt Enable register (IEN_A) Register + * Half SPORT A's Interrupt Enable register (IEN_A) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_SPORT_IEN_A_TF + *! \brief Transfer Finish Interrupt Enable (TF) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_IEN_A_CTL_TXFIN_DIS = 0, /**< Transfer finish Interrupt is disabled */ + SPORT_IEN_A_CTL_TXFIN_EN = 1 /**< Transfer Finish Interrupt is Enabled */ +} ADI_SPORT_IEN_A_TF; + + +/* ========================================================================== + *! \struct ADI_SPORT_IEN_A_Struct + *! \brief Half SPORT A's Interrupt Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_IEN_A_t__ +typedef struct _ADI_SPORT_IEN_A_t { + union { + struct { + unsigned int TF : 1; /**< Transfer Finish Interrupt Enable */ + unsigned int DERRMSK : 1; /**< Data Error (Interrupt) Mask */ + unsigned int FSERRMSK : 1; /**< Frame Sync Error (Interrupt) Mask */ + unsigned int DATA : 1; /**< Data request interrupt to the core */ + unsigned int SYSDATERR : 1; /**< Data error for system writes or reads */ + unsigned int reserved5 : 27; + }; + uint32_t VALUE32; + }; +} ADI_SPORT_IEN_A_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_IEN_A_t__ */ + +/*@}*/ + +/** @defgroup STAT_A Half SPORT 'A' Status register (STAT_A) Register + * Half SPORT 'A' Status register (STAT_A) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_SPORT_STAT_A_DXS + *! \brief Data Transfer Buffer Status (DXS) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_STAT_A_CTL_EMPTY = 0, /**< Empty */ + SPORT_STAT_A_CTL_PART_FULL = 2, /**< Partially full */ + SPORT_STAT_A_CTL_FULL = 3 /**< Full */ +} ADI_SPORT_STAT_A_DXS; + + +/* ========================================================================== + *! \struct ADI_SPORT_STAT_A_Struct + *! \brief Half SPORT 'A' Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_STAT_A_t__ +typedef struct _ADI_SPORT_STAT_A_t { + union { + struct { + unsigned int TFI : 1; /**< Transmit Finish Interrupt Status */ + unsigned int DERR : 1; /**< Data Error Status */ + unsigned int FSERR : 1; /**< Frame Sync Error Status */ + unsigned int DATA : 1; /**< Data Buffer status */ + unsigned int SYSDATERR : 1; /**< System Data Error Status */ + unsigned int reserved5 : 3; + unsigned int DXS : 2; /**< Data Transfer Buffer Status */ + unsigned int reserved10 : 22; + }; + uint32_t VALUE32; + }; +} ADI_SPORT_STAT_A_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_STAT_A_t__ */ + +/*@}*/ + +/** @defgroup NUMTRAN_A Half SPORT A Number of transfers register (NUMTRAN_A) Register + * Half SPORT A Number of transfers register (NUMTRAN_A) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPORT_NUMTRAN_A_Struct + *! \brief Half SPORT A Number of transfers Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_NUMTRAN_A_t__ +typedef struct _ADI_SPORT_NUMTRAN_A_t { + union { + struct { + unsigned int VALUE : 12; /**< Number of transfers (Half SPORT A) */ + unsigned int reserved12 : 20; + }; + uint32_t VALUE32; + }; +} ADI_SPORT_NUMTRAN_A_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_NUMTRAN_A_t__ */ + +/*@}*/ + +/** @defgroup CNVT_A Half SPORT 'A' CNV width (CNVT_A) Register + * Half SPORT 'A' CNV width (CNVT_A) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPORT_CNVT_A_Struct + *! \brief Half SPORT 'A' CNV width Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_CNVT_A_t__ +typedef struct _ADI_SPORT_CNVT_A_t { + union { + struct { + unsigned int WID : 4; /**< CNV signal width: Half SPORT A */ + unsigned int reserved4 : 4; + unsigned int POL : 1; /**< Polarity of the CNV signal */ + unsigned int reserved9 : 7; + unsigned int CNVT2FS : 8; /**< CNV to FS duration: Half SPORT A */ + unsigned int reserved24 : 8; + }; + uint32_t VALUE32; + }; +} ADI_SPORT_CNVT_A_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_CNVT_A_t__ */ + +/*@}*/ + +/** @defgroup TX_A Half SPORT 'A' Tx Buffer Register (TX_A) Register + * Half SPORT 'A' Tx Buffer Register (TX_A) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPORT_TX_A_Struct + *! \brief Half SPORT 'A' Tx Buffer Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_TX_A_t__ +typedef struct _ADI_SPORT_TX_A_t { + union { + struct { + unsigned int VALUE : 32; /**< Transmit Buffer */ + }; + uint32_t VALUE32; + }; +} ADI_SPORT_TX_A_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_TX_A_t__ */ + +/*@}*/ + +/** @defgroup RX_A Half SPORT 'A' Rx Buffer Register (RX_A) Register + * Half SPORT 'A' Rx Buffer Register (RX_A) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPORT_RX_A_Struct + *! \brief Half SPORT 'A' Rx Buffer Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_RX_A_t__ +typedef struct _ADI_SPORT_RX_A_t { + union { + struct { + unsigned int VALUE : 32; /**< Receive Buffer */ + }; + uint32_t VALUE32; + }; +} ADI_SPORT_RX_A_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_RX_A_t__ */ + +/*@}*/ + +/** @defgroup CTL_B Half SPORT 'B' Control Register (CTL_B) Register + * Half SPORT 'B' Control Register (CTL_B) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_SPORT_CTL_B_PACK + *! \brief Packing Enable (PACK) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_CTL_B_CTL_PACK_DIS = 0, /**< Disable */ + SPORT_CTL_B_CTL_PACK_8BIT = 1, /**< 8-bit packing enable */ + SPORT_CTL_B_CTL_PACK_16BIT = 2 /**< 16-bit packing enable */ +} ADI_SPORT_CTL_B_PACK; + + +/* ========================================================================== + *! \struct ADI_SPORT_CTL_B_Struct + *! \brief Half SPORT 'B' Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_CTL_B_t__ +typedef struct _ADI_SPORT_CTL_B_t { + union { + struct { + unsigned int SPEN : 1; /**< Serial Port Enable */ + unsigned int reserved1 : 2; + unsigned int LSBF : 1; /**< Least-Significant Bit First */ + unsigned int SLEN : 5; /**< Serial Word Length */ + unsigned int reserved9 : 1; + unsigned int ICLK : 1; /**< Internal Clock */ + unsigned int OPMODE : 1; /**< Operation mode */ + unsigned int CKRE : 1; /**< Clock Rising Edge */ + unsigned int FSR : 1; /**< Frame Sync Required */ + unsigned int IFS : 1; /**< Internal Frame Sync */ + unsigned int DIFS : 1; /**< Data-Independent Frame Sync */ + unsigned int LFS : 1; /**< Active-Low Frame Sync */ + unsigned int LAFS : 1; /**< Late Frame Sync */ + unsigned int PACK : 2; /**< Packing Enable */ + unsigned int FSERRMODE : 1; /**< Frame Sync Error Operation */ + unsigned int GCLKEN : 1; /**< Gated Clock Enable */ + unsigned int reserved22 : 3; + unsigned int SPTRAN : 1; /**< Serial Port Transfer Direction */ + unsigned int DMAEN : 1; /**< DMA Enable */ + unsigned int reserved27 : 5; + }; + uint32_t VALUE32; + }; +} ADI_SPORT_CTL_B_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_CTL_B_t__ */ + +/*@}*/ + +/** @defgroup DIV_B Half SPORT 'B' Divisor Register (DIV_B) Register + * Half SPORT 'B' Divisor Register (DIV_B) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPORT_DIV_B_Struct + *! \brief Half SPORT 'B' Divisor Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_DIV_B_t__ +typedef struct _ADI_SPORT_DIV_B_t { + union { + struct { + unsigned int CLKDIV : 16; /**< Clock Divisor */ + unsigned int FSDIV : 8; /**< Frame Sync Divisor */ + unsigned int reserved24 : 8; + }; + uint32_t VALUE32; + }; +} ADI_SPORT_DIV_B_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_DIV_B_t__ */ + +/*@}*/ + +/** @defgroup IEN_B Half SPORT B's Interrupt Enable register (IEN_B) Register + * Half SPORT B's Interrupt Enable register (IEN_B) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_SPORT_IEN_B_TF + *! \brief Transmit Finish Interrupt Enable (TF) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_IEN_B_CTL_TXFIN_DIS = 0, /**< Transfer Finish Interrupt is disabled */ + SPORT_IEN_B_CTL_TXFIN_EN = 1 /**< Transfer Finish Interrupt is Enabled */ +} ADI_SPORT_IEN_B_TF; + + +/* ========================================================================== + *! \struct ADI_SPORT_IEN_B_Struct + *! \brief Half SPORT B's Interrupt Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_IEN_B_t__ +typedef struct _ADI_SPORT_IEN_B_t { + union { + struct { + unsigned int TF : 1; /**< Transmit Finish Interrupt Enable */ + unsigned int DERRMSK : 1; /**< Data Error (Interrupt) Mask */ + unsigned int FSERRMSK : 1; /**< Frame Sync Error (Interrupt) Mask */ + unsigned int DATA : 1; /**< Data request interrupt to the core */ + unsigned int SYSDATERR : 1; /**< Data error for system writes or reads */ + unsigned int reserved5 : 27; + }; + uint32_t VALUE32; + }; +} ADI_SPORT_IEN_B_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_IEN_B_t__ */ + +/*@}*/ + +/** @defgroup STAT_B Half SPORT 'B' Status register (STAT_B) Register + * Half SPORT 'B' Status register (STAT_B) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_SPORT_STAT_B_DXS + *! \brief Data Transfer Buffer Status (DXS) Enumerations + * ========================================================================= */ +typedef enum +{ + SPORT_STAT_B_CTL_EMPTY = 0, /**< Empty */ + SPORT_STAT_B_CTL_PART_FULL = 2, /**< Partially full */ + SPORT_STAT_B_CTL_FULL = 3 /**< Full */ +} ADI_SPORT_STAT_B_DXS; + + +/* ========================================================================== + *! \struct ADI_SPORT_STAT_B_Struct + *! \brief Half SPORT 'B' Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_STAT_B_t__ +typedef struct _ADI_SPORT_STAT_B_t { + union { + struct { + unsigned int TFI : 1; /**< Transmit Finish Interrupt Status */ + unsigned int DERR : 1; /**< Data Error Status */ + unsigned int FSERR : 1; /**< Frame Sync Error Status */ + unsigned int DATA : 1; /**< Data Buffer status */ + unsigned int SYSDATERR : 1; /**< System Data Error Status */ + unsigned int reserved5 : 3; + unsigned int DXS : 2; /**< Data Transfer Buffer Status */ + unsigned int reserved10 : 22; + }; + uint32_t VALUE32; + }; +} ADI_SPORT_STAT_B_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_STAT_B_t__ */ + +/*@}*/ + +/** @defgroup NUMTRAN_B Half SPORT B Number of transfers register (NUMTRAN_B) Register + * Half SPORT B Number of transfers register (NUMTRAN_B) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPORT_NUMTRAN_B_Struct + *! \brief Half SPORT B Number of transfers Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_NUMTRAN_B_t__ +typedef struct _ADI_SPORT_NUMTRAN_B_t { + union { + struct { + unsigned int VALUE : 12; /**< Number of transfers (Half SPORT A) */ + unsigned int reserved12 : 20; + }; + uint32_t VALUE32; + }; +} ADI_SPORT_NUMTRAN_B_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_NUMTRAN_B_t__ */ + +/*@}*/ + +/** @defgroup CNVT_B Half SPORT 'B' CNV width register (CNVT_B) Register + * Half SPORT 'B' CNV width register (CNVT_B) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPORT_CNVT_B_Struct + *! \brief Half SPORT 'B' CNV width Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_CNVT_B_t__ +typedef struct _ADI_SPORT_CNVT_B_t { + union { + struct { + unsigned int WID : 4; /**< CNV signal width: Half SPORT B */ + unsigned int reserved4 : 4; + unsigned int POL : 1; /**< Polarity of the CNV signal */ + unsigned int reserved9 : 7; + unsigned int CNVT2FS : 8; /**< CNV to FS duration: Half SPORT B */ + unsigned int reserved24 : 8; + }; + uint32_t VALUE32; + }; +} ADI_SPORT_CNVT_B_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_CNVT_B_t__ */ + +/*@}*/ + +/** @defgroup TX_B Half SPORT 'B' Tx Buffer Register (TX_B) Register + * Half SPORT 'B' Tx Buffer Register (TX_B) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPORT_TX_B_Struct + *! \brief Half SPORT 'B' Tx Buffer Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_TX_B_t__ +typedef struct _ADI_SPORT_TX_B_t { + union { + struct { + unsigned int VALUE : 32; /**< Transmit Buffer */ + }; + uint32_t VALUE32; + }; +} ADI_SPORT_TX_B_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_TX_B_t__ */ + +/*@}*/ + +/** @defgroup RX_B Half SPORT 'B' Rx Buffer Register (RX_B) Register + * Half SPORT 'B' Rx Buffer Register (RX_B) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_SPORT_RX_B_Struct + *! \brief Half SPORT 'B' Rx Buffer Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_SPORT_RX_B_t__ +typedef struct _ADI_SPORT_RX_B_t { + union { + struct { + unsigned int VALUE : 32; /**< Receive Buffer */ + }; + uint32_t VALUE32; + }; +} ADI_SPORT_RX_B_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_SPORT_RX_B_t__ */ + +/*@}*/ + +/** @defgroup CTL CRC Control (CTL) Register + * CRC Control (CTL) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_CRC_CTL_EN + *! \brief CRC Peripheral Enable (EN) Enumerations + * ========================================================================= */ +typedef enum +{ + CRC_CTL_CRC_DIS = 0, /**< CRC peripheral is disabled */ + CRC_CTL_CRC_EN = 1 /**< CRC peripheral is enabled */ +} ADI_CRC_CTL_EN; + + +/* ========================================================================= + *! \enum ADI_CRC_CTL_LSBFIRST + *! \brief LSB First Calculation Order (LSBFIRST) Enumerations + * ========================================================================= */ +typedef enum +{ + CRC_CTL_MSB_FIRST = 0, /**< MSB First CRC calculation is done */ + CRC_CTL_LSB_FIRST = 1 /**< LSB First CRC calculation is done */ +} ADI_CRC_CTL_LSBFIRST; + + +/* ========================================================================= + *! \enum ADI_CRC_CTL_BITMIRR + *! \brief Bit Mirroring (BITMIRR) Enumerations + * ========================================================================= */ +typedef enum +{ + CRC_CTL_BITMIRR_DIS = 0, /**< Bit Mirroring is disabled */ + CRC_CTL_BITMIRR_EN = 1 /**< Bit Mirroring is enabled */ +} ADI_CRC_CTL_BITMIRR; + + +/* ========================================================================= + *! \enum ADI_CRC_CTL_BYTMIRR + *! \brief Byte Mirroring (BYTMIRR) Enumerations + * ========================================================================= */ +typedef enum +{ + CRC_CTL_BYTEMIR_DIS = 0, /**< Byte Mirroring is disabled */ + CRC_CTL_BYTEMIR_EN = 1 /**< Byte Mirroring is enabled */ +} ADI_CRC_CTL_BYTMIRR; + + +/* ========================================================================= + *! \enum ADI_CRC_CTL_W16SWP + *! \brief Word16 Swap (W16SWP) Enumerations + * ========================================================================= */ +typedef enum +{ + CRC_CTL_W16SP_DIS = 0, /**< Word16 Swap disabled */ + CRC_CTL_W16SP_EN = 1 /**< Word16 Swap enabled */ +} ADI_CRC_CTL_W16SWP; + + +/* ========================================================================== + *! \struct ADI_CRC_CTL_Struct + *! \brief CRC Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRC_CTL_t__ +typedef struct _ADI_CRC_CTL_t { + union { + struct { + unsigned int EN : 1; /**< CRC Peripheral Enable */ + unsigned int LSBFIRST : 1; /**< LSB First Calculation Order */ + unsigned int BITMIRR : 1; /**< Bit Mirroring */ + unsigned int BYTMIRR : 1; /**< Byte Mirroring */ + unsigned int W16SWP : 1; /**< Word16 Swap */ + unsigned int reserved5 : 23; + unsigned int RevID : 4; /**< Revision ID */ + }; + uint32_t VALUE32; + }; +} ADI_CRC_CTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRC_CTL_t__ */ + +/*@}*/ + +/** @defgroup IPDATA Input Data Word (IPDATA) Register + * Input Data Word (IPDATA) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRC_IPDATA_Struct + *! \brief Input Data Word Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRC_IPDATA_t__ +typedef struct _ADI_CRC_IPDATA_t { + union { + struct { + unsigned int VALUE : 32; /**< Data Input */ + }; + uint32_t VALUE32; + }; +} ADI_CRC_IPDATA_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRC_IPDATA_t__ */ + +/*@}*/ + +/** @defgroup RESULT CRC Result (RESULT) Register + * CRC Result (RESULT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRC_RESULT_Struct + *! \brief CRC Result Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRC_RESULT_t__ +typedef struct _ADI_CRC_RESULT_t { + union { + struct { + unsigned int VALUE : 32; /**< CRC Residue */ + }; + uint32_t VALUE32; + }; +} ADI_CRC_RESULT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRC_RESULT_t__ */ + +/*@}*/ + +/** @defgroup POLY Programmable CRC Polynomial (POLY) Register + * Programmable CRC Polynomial (POLY) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRC_POLY_Struct + *! \brief Programmable CRC Polynomial Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRC_POLY_t__ +typedef struct _ADI_CRC_POLY_t { + union { + struct { + unsigned int VALUE : 32; /**< CRC Reduction Polynomial */ + }; + uint32_t VALUE32; + }; +} ADI_CRC_POLY_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRC_POLY_t__ */ + +/*@}*/ + +/** @defgroup IPBITS Input Data Bits (IPBITS) Register + * Input Data Bits (IPBITS) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRC_IPBITS_Struct + *! \brief Input Data Bits Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRC_IPBITS_t__ +typedef struct _ADI_CRC_IPBITS_t { + union { + struct { + unsigned int DATA_BITS : 8; /**< Input Data Bits */ + }; + uint8_t VALUE8; + }; +} ADI_CRC_IPBITS_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRC_IPBITS_t__ */ + +/*@}*/ + +/** @defgroup IPBYTE Input Data Byte (IPBYTE) Register + * Input Data Byte (IPBYTE) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRC_IPBYTE_Struct + *! \brief Input Data Byte Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRC_IPBYTE_t__ +typedef struct _ADI_CRC_IPBYTE_t { + union { + struct { + unsigned int DATA_BYTE : 8; /**< Input Data Byte */ + }; + uint8_t VALUE8; + }; +} ADI_CRC_IPBYTE_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRC_IPBYTE_t__ */ + +/*@}*/ + +/** @defgroup CTL RNG Control Register (CTL) Register + * RNG Control Register (CTL) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_RNG_CTL_EN + *! \brief RNG Enable (EN) Enumerations + * ========================================================================= */ +typedef enum +{ + RNG_CTL_DISABLE = 0, /**< Disable the RNG */ + RNG_CTL_ENABLE = 1 /**< Enable the RNG */ +} ADI_RNG_CTL_EN; + + +/* ========================================================================= + *! \enum ADI_RNG_CTL_SINGLE + *! \brief Generate a Single Number (SINGLE) Enumerations + * ========================================================================= */ +typedef enum +{ + RNG_CTL_WORD = 0, /**< Buffer Word */ + RNG_CTL_SINGLE = 1 /**< Single Byte */ +} ADI_RNG_CTL_SINGLE; + + +/* ========================================================================== + *! \struct ADI_RNG_CTL_Struct + *! \brief RNG Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RNG_CTL_t__ +typedef struct _ADI_RNG_CTL_t { + union { + struct { + unsigned int EN : 1; /**< RNG Enable */ + unsigned int reserved1 : 2; + unsigned int SINGLE : 1; /**< Generate a Single Number */ + unsigned int reserved4 : 12; + }; + uint16_t VALUE16; + }; +} ADI_RNG_CTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RNG_CTL_t__ */ + +/*@}*/ + +/** @defgroup LEN RNG Sample Length Register (LEN) Register + * RNG Sample Length Register (LEN) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RNG_LEN_Struct + *! \brief RNG Sample Length Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RNG_LEN_t__ +typedef struct _ADI_RNG_LEN_t { + union { + struct { + unsigned int RELOAD : 12; /**< Reload Value for the Sample Counter */ + unsigned int PRESCALE : 4; /**< Prescaler for the Sample Counter */ + }; + uint16_t VALUE16; + }; +} ADI_RNG_LEN_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RNG_LEN_t__ */ + +/*@}*/ + +/** @defgroup STAT RNG Status Register (STAT) Register + * RNG Status Register (STAT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RNG_STAT_Struct + *! \brief RNG Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RNG_STAT_t__ +typedef struct _ADI_RNG_STAT_t { + union { + struct { + unsigned int RNRDY : 1; /**< Random Number Ready */ + unsigned int STUCK : 1; /**< Sampled Data Stuck High or Low */ + unsigned int reserved2 : 14; + }; + uint16_t VALUE16; + }; +} ADI_RNG_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RNG_STAT_t__ */ + +/*@}*/ + +/** @defgroup DATA RNG Data Register (DATA) Register + * RNG Data Register (DATA) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RNG_DATA_Struct + *! \brief RNG Data Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RNG_DATA_t__ +typedef struct _ADI_RNG_DATA_t { + union { + struct { + unsigned int VALUE : 8; /**< Value of the CRC Accumulator */ + unsigned int BUFF : 24; /**< Buffer for RNG Data */ + }; + uint32_t VALUE32; + }; +} ADI_RNG_DATA_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RNG_DATA_t__ */ + +/*@}*/ + +/** @defgroup OSCCNT Oscillator Count (OSCCNT) Register + * Oscillator Count (OSCCNT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RNG_OSCCNT_Struct + *! \brief Oscillator Count Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RNG_OSCCNT_t__ +typedef struct _ADI_RNG_OSCCNT_t { + union { + struct { + unsigned int VALUE : 28; /**< Oscillator Count */ + unsigned int reserved28 : 4; + }; + uint32_t VALUE32; + }; +} ADI_RNG_OSCCNT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RNG_OSCCNT_t__ */ + +/*@}*/ + +/** @defgroup OSCDIFF Oscillator Difference (OSCDIFF) Register + * Oscillator Difference (OSCDIFF) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_RNG_OSCDIFF_Struct + *! \brief Oscillator Difference Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_RNG_OSCDIFF_t__ +typedef struct _ADI_RNG_OSCDIFF_t { + union { + struct { + signed int DELTA : 8; /**< Oscillator Count Difference */ + }; + int8_t VALUE8; + }; +} ADI_RNG_OSCDIFF_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_RNG_OSCDIFF_t__ */ + +/*@}*/ + +/** @defgroup CFG Configuration Register (CFG) Register + * Configuration Register (CFG) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_CRYPT_CFG_BLKEN + *! \brief Enable Bit for Crypto Block (BLKEN) Enumerations + * ========================================================================= */ +typedef enum +{ + CRYPT_CFG_ENABLE = 0, /**< Enable Crypto Block */ + CRYPT_CFG_DISABLE = 1 /**< Disable Crypto Block */ +} ADI_CRYPT_CFG_BLKEN; + + +/* ========================================================================= + *! \enum ADI_CRYPT_CFG_INDMAEN + *! \brief Enable DMA Channel Request for Input Buffer (INDMAEN) Enumerations + * ========================================================================= */ +typedef enum +{ + CRYPT_CFG_DMA_DISABLE_INBUF = 0, /**< Disable DMA Requesting for Input Buffer */ + CRYPT_CFG_DMA_ENABLE_INBUF = 1 /**< Enable DMA Requesting for Input Buffer */ +} ADI_CRYPT_CFG_INDMAEN; + + +/* ========================================================================= + *! \enum ADI_CRYPT_CFG_OUTDMAEN + *! \brief Enable DMA Channel Request for Output Buffer (OUTDMAEN) Enumerations + * ========================================================================= */ +typedef enum +{ + CRYPT_CFG_DMA_DISABLE_OUTBUF = 0, /**< Disable DMA Requesting for Output Buffer */ + CRYPT_CFG_DMA_ENABLE_OUTBUF = 1 /**< Enable DMA Requesting for Output Buffer */ +} ADI_CRYPT_CFG_OUTDMAEN; + + +/* ========================================================================= + *! \enum ADI_CRYPT_CFG_AESKEYLEN + *! \brief Select Key Length for AES Cipher (AESKEYLEN) Enumerations + * ========================================================================= */ +typedef enum +{ + CRYPT_CFG_AESKEYLEN128 = 0, /**< Uses 128-bit long key */ + CRYPT_CFG_AESKEYLEN256 = 2 /**< Uses 256-bit long key */ +} ADI_CRYPT_CFG_AESKEYLEN; + + +/* ========================================================================= + *! \enum ADI_CRYPT_CFG_KUWKeyLen + *! \brief Key Length Key Wrap Unwrap (KUWKeyLen) Enumerations + * ========================================================================= */ +typedef enum +{ + CRYPT_CFG_LEN128 = 1, /**< The key size of KUW key is 128 bits */ + CRYPT_CFG_LEN256 = 2, /**< The key size of KUW key is 256 bits */ + CRYPT_CFG_LEN512 = 3 /**< The key size of KUW key is 512 bits */ +} ADI_CRYPT_CFG_KUWKeyLen; + + +/* ========================================================================== + *! \struct ADI_CRYPT_CFG_Struct + *! \brief Configuration Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_CFG_t__ +typedef struct _ADI_CRYPT_CFG_t { + union { + struct { + unsigned int BLKEN : 1; /**< Enable Bit for Crypto Block */ + unsigned int ENCR : 1; /**< Encrypt or Decrypt */ + unsigned int INDMAEN : 1; /**< Enable DMA Channel Request for Input Buffer */ + unsigned int OUTDMAEN : 1; /**< Enable DMA Channel Request for Output Buffer */ + unsigned int INFLUSH : 1; /**< Input Buffer Flush */ + unsigned int OUTFLUSH : 1; /**< Output Buffer Flush */ + unsigned int reserved6 : 2; + unsigned int AESKEYLEN : 2; /**< Select Key Length for AES Cipher */ + unsigned int KUWKeyLen : 2; /**< Key Length Key Wrap Unwrap */ + unsigned int AES_BYTESWAP : 1; /**< Byteswap for AES Input */ + unsigned int SHA_BYTESWAP : 1; /**< Enable Key Wrap */ + unsigned int KEY_BYTESWAP : 1; /**< Use Key Unwrap Before HMAC */ + unsigned int PRKSTOREN : 1; /**< Enable PRKSTOR Commands */ + unsigned int ECBEN : 1; /**< Enable ECB Mode Operation */ + unsigned int CTREN : 1; /**< Enable CTR Mode Operation */ + unsigned int CBCEN : 1; /**< Enable CBC Mode Operation */ + unsigned int CCMEN : 1; /**< Enable CCM/CCM* Mode Operation */ + unsigned int CMACEN : 1; /**< Enable CMAC Mode Operation */ + unsigned int HMACEN : 1; /**< HMAC Enable */ + unsigned int reserved22 : 3; + unsigned int SHA256EN : 1; /**< Enable SHA-256 Operation */ + unsigned int SHAINIT : 1; /**< Restarts SHA Computation */ + unsigned int reserved27 : 1; + unsigned int RevID : 4; /**< Rev ID for Crypto */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_CFG_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_CFG_t__ */ + +/*@}*/ + +/** @defgroup DATALEN Payload Data Length (DATALEN) Register + * Payload Data Length (DATALEN) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_DATALEN_Struct + *! \brief Payload Data Length Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_DATALEN_t__ +typedef struct _ADI_CRYPT_DATALEN_t { + union { + struct { + unsigned int VALUE : 20; /**< Length of Payload Data */ + unsigned int reserved20 : 12; + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_DATALEN_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_DATALEN_t__ */ + +/*@}*/ + +/** @defgroup PREFIXLEN Authentication Data Length (PREFIXLEN) Register + * Authentication Data Length (PREFIXLEN) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_PREFIXLEN_Struct + *! \brief Authentication Data Length Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_PREFIXLEN_t__ +typedef struct _ADI_CRYPT_PREFIXLEN_t { + union { + struct { + unsigned int VALUE : 16; /**< Length of Associated Data */ + unsigned int reserved16 : 16; + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_PREFIXLEN_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_PREFIXLEN_t__ */ + +/*@}*/ + +/** @defgroup INTEN Interrupt Enable Register (INTEN) Register + * Interrupt Enable Register (INTEN) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_INTEN_Struct + *! \brief Interrupt Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_INTEN_t__ +typedef struct _ADI_CRYPT_INTEN_t { + union { + struct { + unsigned int INRDYEN : 1; /**< Enable Input Ready Interrupt */ + unsigned int OUTRDYEN : 1; /**< Enables the Output Ready Interrupt */ + unsigned int INOVREN : 1; /**< Enable Input Overflow Interrupt */ + unsigned int reserved3 : 2; + unsigned int SHADONEN : 1; /**< Enable SHA_Done Interrupt */ + unsigned int HMACDONEEN : 1; /**< Interrupt Enable for HMAC Done */ + unsigned int HMACMSGRDYEN : 1; /**< Status Bit for HMAC Message Input Ready */ + unsigned int PRKSTRCMDONEEN : 1; /**< PRKSTOR CMD DONE INTEN */ + unsigned int reserved9 : 23; + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_INTEN_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_INTEN_t__ */ + +/*@}*/ + +/** @defgroup STAT Status Register (STAT) Register + * Status Register (STAT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_STAT_Struct + *! \brief Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_STAT_t__ +typedef struct _ADI_CRYPT_STAT_t { + union { + struct { + unsigned int INRDY : 1; /**< Input Buffer Status */ + unsigned int OUTRDY : 1; /**< Output Data Ready */ + unsigned int INOVR : 1; /**< Overflow in the Input Buffer */ + unsigned int reserved3 : 2; + unsigned int SHADONE : 1; /**< SHA Computation Complete */ + unsigned int SHABUSY : 1; /**< SHA Busy. in Computation */ + unsigned int INWORDS : 3; /**< Number of Words in the Input Buffer */ + unsigned int OUTWORDS : 3; /**< Number of Words in the Output Buffer */ + unsigned int HMACBUSY : 1; /**< Status Bit Indicates HMAC Busy */ + unsigned int HMACDONE : 1; /**< Status Bit Indicates HMAC Done */ + unsigned int HMACMSGRDY : 1; /**< Status Bit Indicates HMAC is Message Ready */ + unsigned int reserved16 : 7; + unsigned int PRKSTOR_CMD_DONE : 1; /**< Indicates Command Done for PrKStor */ + unsigned int PRKSTOR_CMD_FAIL : 1; /**< Indicates Last Command Issued Failed */ + unsigned int PRKSTOR_RET_STATUS : 2; /**< ECC Errors in the PRKSTOR_RETRIEVE Command */ + unsigned int CMD_ISSUED : 4; /**< Last Command Issued to PrKStor; */ + unsigned int PRKSTOR_BUSY : 1; /**< Indicates PrKSTOR is Busy */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_STAT_t__ */ + +/*@}*/ + +/** @defgroup INBUF Input Buffer (INBUF) Register + * Input Buffer (INBUF) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_INBUF_Struct + *! \brief Input Buffer Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_INBUF_t__ +typedef struct _ADI_CRYPT_INBUF_t { + union { + struct { + unsigned int VALUE : 32; /**< Input Buffer */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_INBUF_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_INBUF_t__ */ + +/*@}*/ + +/** @defgroup OUTBUF Output Buffer (OUTBUF) Register + * Output Buffer (OUTBUF) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_OUTBUF_Struct + *! \brief Output Buffer Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_OUTBUF_t__ +typedef struct _ADI_CRYPT_OUTBUF_t { + union { + struct { + unsigned int VALUE : 32; /**< Output Buffer */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_OUTBUF_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_OUTBUF_t__ */ + +/*@}*/ + +/** @defgroup NONCE0 Nonce Bits [31:0] (NONCE0) Register + * Nonce Bits [31:0] (NONCE0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_NONCE0_Struct + *! \brief Nonce Bits [31:0] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_NONCE0_t__ +typedef struct _ADI_CRYPT_NONCE0_t { + union { + struct { + unsigned int VALUE : 32; /**< Word 0: Nonce Bits [31:0] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_NONCE0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_NONCE0_t__ */ + +/*@}*/ + +/** @defgroup NONCE1 Nonce Bits [63:32] (NONCE1) Register + * Nonce Bits [63:32] (NONCE1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_NONCE1_Struct + *! \brief Nonce Bits [63:32] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_NONCE1_t__ +typedef struct _ADI_CRYPT_NONCE1_t { + union { + struct { + unsigned int VALUE : 32; /**< Word 1: Nonce Bits [63:32] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_NONCE1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_NONCE1_t__ */ + +/*@}*/ + +/** @defgroup NONCE2 Nonce Bits [95:64] (NONCE2) Register + * Nonce Bits [95:64] (NONCE2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_NONCE2_Struct + *! \brief Nonce Bits [95:64] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_NONCE2_t__ +typedef struct _ADI_CRYPT_NONCE2_t { + union { + struct { + unsigned int VALUE : 32; /**< Word 2: Nonce Bits [95:64] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_NONCE2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_NONCE2_t__ */ + +/*@}*/ + +/** @defgroup NONCE3 Nonce Bits [127:96] (NONCE3) Register + * Nonce Bits [127:96] (NONCE3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_NONCE3_Struct + *! \brief Nonce Bits [127:96] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_NONCE3_t__ +typedef struct _ADI_CRYPT_NONCE3_t { + union { + struct { + unsigned int VALUE : 32; /**< Word 3: Nonce Bits [127:96] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_NONCE3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_NONCE3_t__ */ + +/*@}*/ + +/** @defgroup AESKEY0 AES Key Bits [31:0] (AESKEY0) Register + * AES Key Bits [31:0] (AESKEY0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_AESKEY0_Struct + *! \brief AES Key Bits [31:0] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_AESKEY0_t__ +typedef struct _ADI_CRYPT_AESKEY0_t { + union { + struct { + unsigned int VALUE : 32; /**< Key: Bytes [3:0] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_AESKEY0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_AESKEY0_t__ */ + +/*@}*/ + +/** @defgroup AESKEY1 AES Key Bits [63:32] (AESKEY1) Register + * AES Key Bits [63:32] (AESKEY1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_AESKEY1_Struct + *! \brief AES Key Bits [63:32] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_AESKEY1_t__ +typedef struct _ADI_CRYPT_AESKEY1_t { + union { + struct { + unsigned int VALUE : 32; /**< Key: Bytes [7:4] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_AESKEY1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_AESKEY1_t__ */ + +/*@}*/ + +/** @defgroup AESKEY2 AES Key Bits [95:64] (AESKEY2) Register + * AES Key Bits [95:64] (AESKEY2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_AESKEY2_Struct + *! \brief AES Key Bits [95:64] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_AESKEY2_t__ +typedef struct _ADI_CRYPT_AESKEY2_t { + union { + struct { + unsigned int VALUE : 32; /**< Key: Bytes [11:8] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_AESKEY2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_AESKEY2_t__ */ + +/*@}*/ + +/** @defgroup AESKEY3 AES Key Bits [127:96] (AESKEY3) Register + * AES Key Bits [127:96] (AESKEY3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_AESKEY3_Struct + *! \brief AES Key Bits [127:96] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_AESKEY3_t__ +typedef struct _ADI_CRYPT_AESKEY3_t { + union { + struct { + unsigned int VALUE : 32; /**< Key: Bytes [15:12] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_AESKEY3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_AESKEY3_t__ */ + +/*@}*/ + +/** @defgroup AESKEY4 AES Key Bits [159:128] (AESKEY4) Register + * AES Key Bits [159:128] (AESKEY4) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_AESKEY4_Struct + *! \brief AES Key Bits [159:128] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_AESKEY4_t__ +typedef struct _ADI_CRYPT_AESKEY4_t { + union { + struct { + unsigned int VALUE : 32; /**< Key: Bytes [19:16] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_AESKEY4_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_AESKEY4_t__ */ + +/*@}*/ + +/** @defgroup AESKEY5 AES Key Bits [191:160] (AESKEY5) Register + * AES Key Bits [191:160] (AESKEY5) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_AESKEY5_Struct + *! \brief AES Key Bits [191:160] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_AESKEY5_t__ +typedef struct _ADI_CRYPT_AESKEY5_t { + union { + struct { + unsigned int VALUE : 32; /**< Key: Bytes [23:20] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_AESKEY5_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_AESKEY5_t__ */ + +/*@}*/ + +/** @defgroup AESKEY6 AES Key Bits [223:192] (AESKEY6) Register + * AES Key Bits [223:192] (AESKEY6) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_AESKEY6_Struct + *! \brief AES Key Bits [223:192] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_AESKEY6_t__ +typedef struct _ADI_CRYPT_AESKEY6_t { + union { + struct { + unsigned int VALUE : 32; /**< Key: Bytes [27:24] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_AESKEY6_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_AESKEY6_t__ */ + +/*@}*/ + +/** @defgroup AESKEY7 AES Key Bits [255:224] (AESKEY7) Register + * AES Key Bits [255:224] (AESKEY7) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_AESKEY7_Struct + *! \brief AES Key Bits [255:224] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_AESKEY7_t__ +typedef struct _ADI_CRYPT_AESKEY7_t { + union { + struct { + unsigned int VALUE : 32; /**< Key: Bytes [31:28] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_AESKEY7_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_AESKEY7_t__ */ + +/*@}*/ + +/** @defgroup CNTRINIT Counter Initialization Vector (CNTRINIT) Register + * Counter Initialization Vector (CNTRINIT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_CNTRINIT_Struct + *! \brief Counter Initialization Vector Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_CNTRINIT_t__ +typedef struct _ADI_CRYPT_CNTRINIT_t { + union { + struct { + unsigned int VALUE : 20; /**< Counter Initialization Value */ + unsigned int reserved20 : 12; + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_CNTRINIT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_CNTRINIT_t__ */ + +/*@}*/ + +/** @defgroup SHAH0 SHA Bits [31:0] (SHAH0) Register + * SHA Bits [31:0] (SHAH0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_SHAH0_Struct + *! \brief SHA Bits [31:0] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_SHAH0_t__ +typedef struct _ADI_CRYPT_SHAH0_t { + union { + struct { + unsigned int SHAHASH0 : 32; /**< Word 0: SHA Hash */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_SHAH0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_SHAH0_t__ */ + +/*@}*/ + +/** @defgroup SHAH1 SHA Bits [63:32] (SHAH1) Register + * SHA Bits [63:32] (SHAH1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_SHAH1_Struct + *! \brief SHA Bits [63:32] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_SHAH1_t__ +typedef struct _ADI_CRYPT_SHAH1_t { + union { + struct { + unsigned int SHAHASH1 : 32; /**< Word 1: SHA Hash */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_SHAH1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_SHAH1_t__ */ + +/*@}*/ + +/** @defgroup SHAH2 SHA Bits [95:64] (SHAH2) Register + * SHA Bits [95:64] (SHAH2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_SHAH2_Struct + *! \brief SHA Bits [95:64] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_SHAH2_t__ +typedef struct _ADI_CRYPT_SHAH2_t { + union { + struct { + unsigned int SHAHASH2 : 32; /**< Word 2: SHA Hash */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_SHAH2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_SHAH2_t__ */ + +/*@}*/ + +/** @defgroup SHAH3 SHA Bits [127:96] (SHAH3) Register + * SHA Bits [127:96] (SHAH3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_SHAH3_Struct + *! \brief SHA Bits [127:96] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_SHAH3_t__ +typedef struct _ADI_CRYPT_SHAH3_t { + union { + struct { + unsigned int SHAHASH3 : 32; /**< Word 3: SHA Hash */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_SHAH3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_SHAH3_t__ */ + +/*@}*/ + +/** @defgroup SHAH4 SHA Bits [159:128] (SHAH4) Register + * SHA Bits [159:128] (SHAH4) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_SHAH4_Struct + *! \brief SHA Bits [159:128] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_SHAH4_t__ +typedef struct _ADI_CRYPT_SHAH4_t { + union { + struct { + unsigned int SHAHASH4 : 32; /**< Word 4: SHA Hash */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_SHAH4_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_SHAH4_t__ */ + +/*@}*/ + +/** @defgroup SHAH5 SHA Bits [191:160] (SHAH5) Register + * SHA Bits [191:160] (SHAH5) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_SHAH5_Struct + *! \brief SHA Bits [191:160] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_SHAH5_t__ +typedef struct _ADI_CRYPT_SHAH5_t { + union { + struct { + unsigned int SHAHASH5 : 32; /**< Word 5: SHA Hash */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_SHAH5_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_SHAH5_t__ */ + +/*@}*/ + +/** @defgroup SHAH6 SHA Bits [223:192] (SHAH6) Register + * SHA Bits [223:192] (SHAH6) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_SHAH6_Struct + *! \brief SHA Bits [223:192] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_SHAH6_t__ +typedef struct _ADI_CRYPT_SHAH6_t { + union { + struct { + unsigned int SHAHASH6 : 32; /**< Word 6: SHA Hash */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_SHAH6_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_SHAH6_t__ */ + +/*@}*/ + +/** @defgroup SHAH7 SHA Bits [255:224] (SHAH7) Register + * SHA Bits [255:224] (SHAH7) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_SHAH7_Struct + *! \brief SHA Bits [255:224] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_SHAH7_t__ +typedef struct _ADI_CRYPT_SHAH7_t { + union { + struct { + unsigned int SHAHASH7 : 32; /**< Word 7: SHA Hash */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_SHAH7_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_SHAH7_t__ */ + +/*@}*/ + +/** @defgroup SHA_LAST_WORD SHA Last Word and Valid Bits Information (SHA_LAST_WORD) Register + * SHA Last Word and Valid Bits Information (SHA_LAST_WORD) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_SHA_LAST_WORD_Struct + *! \brief SHA Last Word and Valid Bits Information Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_SHA_LAST_WORD_t__ +typedef struct _ADI_CRYPT_SHA_LAST_WORD_t { + union { + struct { + unsigned int O_Last_Word : 1; /**< Last SHA Input Word */ + unsigned int O_Bits_Valid : 5; /**< Bits Valid in SHA Last Word Input */ + unsigned int reserved6 : 26; + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_SHA_LAST_WORD_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_SHA_LAST_WORD_t__ */ + +/*@}*/ + +/** @defgroup CCM_NUM_VALID_BYTES NUM_VALID_BYTES (CCM_NUM_VALID_BYTES) Register + * NUM_VALID_BYTES (CCM_NUM_VALID_BYTES) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_CCM_NUM_VALID_BYTES_Struct + *! \brief NUM_VALID_BYTES Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_CCM_NUM_VALID_BYTES_t__ +typedef struct _ADI_CRYPT_CCM_NUM_VALID_BYTES_t { + union { + struct { + unsigned int NUM_VALID_BYTES : 4; /**< Number of Valid Bytes in CCM Last Data */ + unsigned int reserved4 : 28; + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_CCM_NUM_VALID_BYTES_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_CCM_NUM_VALID_BYTES_t__ */ + +/*@}*/ + +/** @defgroup PRKSTORCFG PRKSTOR Configuration (PRKSTORCFG) Register + * PRKSTOR Configuration (PRKSTORCFG) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_PRKSTORCFG_Struct + *! \brief PRKSTOR Configuration Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_PRKSTORCFG_t__ +typedef struct _ADI_CRYPT_PRKSTORCFG_t { + union { + struct { + unsigned int KEY_INDEX : 7; /**< Index of Key in PRKSTOR */ + unsigned int CMD : 4; /**< Command Input for PRKSTOR */ + unsigned int reserved11 : 21; + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_PRKSTORCFG_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_PRKSTORCFG_t__ */ + +/*@}*/ + +/** @defgroup KUW0 Key Wrap Unwrap Register 0 (KUW0) Register + * Key Wrap Unwrap Register 0 (KUW0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUW0_Struct + *! \brief Key Wrap Unwrap Register 0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW0_t__ +typedef struct _ADI_CRYPT_KUW0_t { + union { + struct { + unsigned int KUW0 : 32; /**< KUW [31:0] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUW0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW0_t__ */ + +/*@}*/ + +/** @defgroup KUW1 Key Wrap Unwrap Register 1 (KUW1) Register + * Key Wrap Unwrap Register 1 (KUW1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUW1_Struct + *! \brief Key Wrap Unwrap Register 1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW1_t__ +typedef struct _ADI_CRYPT_KUW1_t { + union { + struct { + unsigned int KUW1 : 32; /**< KUW [63:32] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUW1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW1_t__ */ + +/*@}*/ + +/** @defgroup KUW2 Key Wrap Unwrap Register 2 (KUW2) Register + * Key Wrap Unwrap Register 2 (KUW2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUW2_Struct + *! \brief Key Wrap Unwrap Register 2 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW2_t__ +typedef struct _ADI_CRYPT_KUW2_t { + union { + struct { + unsigned int KUW2 : 32; /**< KUW [95:64] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUW2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW2_t__ */ + +/*@}*/ + +/** @defgroup KUW3 Key Wrap Unwrap Register 3 (KUW3) Register + * Key Wrap Unwrap Register 3 (KUW3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUW3_Struct + *! \brief Key Wrap Unwrap Register 3 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW3_t__ +typedef struct _ADI_CRYPT_KUW3_t { + union { + struct { + unsigned int KUW3 : 32; /**< KUW [127:96] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUW3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW3_t__ */ + +/*@}*/ + +/** @defgroup KUW4 Key Wrap Unwrap Register 4 (KUW4) Register + * Key Wrap Unwrap Register 4 (KUW4) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUW4_Struct + *! \brief Key Wrap Unwrap Register 4 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW4_t__ +typedef struct _ADI_CRYPT_KUW4_t { + union { + struct { + unsigned int KUW4 : 32; /**< KUW [159:128] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUW4_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW4_t__ */ + +/*@}*/ + +/** @defgroup KUW5 Key Wrap Unwrap Register 5 (KUW5) Register + * Key Wrap Unwrap Register 5 (KUW5) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUW5_Struct + *! \brief Key Wrap Unwrap Register 5 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW5_t__ +typedef struct _ADI_CRYPT_KUW5_t { + union { + struct { + unsigned int KUW5 : 32; /**< KUW [191:160] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUW5_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW5_t__ */ + +/*@}*/ + +/** @defgroup KUW6 Key Wrap Unwrap Register 6 (KUW6) Register + * Key Wrap Unwrap Register 6 (KUW6) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUW6_Struct + *! \brief Key Wrap Unwrap Register 6 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW6_t__ +typedef struct _ADI_CRYPT_KUW6_t { + union { + struct { + unsigned int KUW6 : 32; /**< KUW [223:192] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUW6_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW6_t__ */ + +/*@}*/ + +/** @defgroup KUW7 Key Wrap Unwrap Register 7 (KUW7) Register + * Key Wrap Unwrap Register 7 (KUW7) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUW7_Struct + *! \brief Key Wrap Unwrap Register 7 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW7_t__ +typedef struct _ADI_CRYPT_KUW7_t { + union { + struct { + unsigned int KUW7 : 32; /**< KUW [255:224] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUW7_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW7_t__ */ + +/*@}*/ + +/** @defgroup KUW8 Key Wrap Unwrap Register 8 (KUW8) Register + * Key Wrap Unwrap Register 8 (KUW8) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUW8_Struct + *! \brief Key Wrap Unwrap Register 8 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW8_t__ +typedef struct _ADI_CRYPT_KUW8_t { + union { + struct { + unsigned int KUW8 : 32; /**< KUW [287:256] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUW8_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW8_t__ */ + +/*@}*/ + +/** @defgroup KUW9 Key Wrap Unwrap Register 9 (KUW9) Register + * Key Wrap Unwrap Register 9 (KUW9) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUW9_Struct + *! \brief Key Wrap Unwrap Register 9 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW9_t__ +typedef struct _ADI_CRYPT_KUW9_t { + union { + struct { + unsigned int KUW9 : 32; /**< KUW [319:288] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUW9_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW9_t__ */ + +/*@}*/ + +/** @defgroup KUW10 Key Wrap Unwrap Register 10 (KUW10) Register + * Key Wrap Unwrap Register 10 (KUW10) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUW10_Struct + *! \brief Key Wrap Unwrap Register 10 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW10_t__ +typedef struct _ADI_CRYPT_KUW10_t { + union { + struct { + unsigned int KUW10 : 32; /**< KUW [351:320] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUW10_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW10_t__ */ + +/*@}*/ + +/** @defgroup KUW11 Key Wrap Unwrap Register 11 (KUW11) Register + * Key Wrap Unwrap Register 11 (KUW11) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUW11_Struct + *! \brief Key Wrap Unwrap Register 11 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW11_t__ +typedef struct _ADI_CRYPT_KUW11_t { + union { + struct { + unsigned int KUW11 : 32; /**< KUW [383:352] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUW11_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW11_t__ */ + +/*@}*/ + +/** @defgroup KUW12 Key Wrap Unwrap Register 12 (KUW12) Register + * Key Wrap Unwrap Register 12 (KUW12) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUW12_Struct + *! \brief Key Wrap Unwrap Register 12 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW12_t__ +typedef struct _ADI_CRYPT_KUW12_t { + union { + struct { + unsigned int KUW12 : 32; /**< KUW [415:384] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUW12_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW12_t__ */ + +/*@}*/ + +/** @defgroup KUW13 Key Wrap Unwrap Register 13 (KUW13) Register + * Key Wrap Unwrap Register 13 (KUW13) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUW13_Struct + *! \brief Key Wrap Unwrap Register 13 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW13_t__ +typedef struct _ADI_CRYPT_KUW13_t { + union { + struct { + unsigned int KUW13 : 32; /**< KUW [447:416] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUW13_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW13_t__ */ + +/*@}*/ + +/** @defgroup KUW14 Key Wrap Unwrap Register 14 (KUW14) Register + * Key Wrap Unwrap Register 14 (KUW14) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUW14_Struct + *! \brief Key Wrap Unwrap Register 14 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW14_t__ +typedef struct _ADI_CRYPT_KUW14_t { + union { + struct { + unsigned int KUW14 : 32; /**< KUW [479:448] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUW14_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW14_t__ */ + +/*@}*/ + +/** @defgroup KUW15 Key Wrap Unwrap Register 15 (KUW15) Register + * Key Wrap Unwrap Register 15 (KUW15) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUW15_Struct + *! \brief Key Wrap Unwrap Register 15 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW15_t__ +typedef struct _ADI_CRYPT_KUW15_t { + union { + struct { + unsigned int KUW15 : 32; /**< KUW [511:480] */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUW15_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUW15_t__ */ + +/*@}*/ + +/** @defgroup KUWValStr1 Key Wrap Unwrap Validation String [63:32] (KUWValStr1) Register + * Key Wrap Unwrap Validation String [63:32] (KUWValStr1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUWValStr1_Struct + *! \brief Key Wrap Unwrap Validation String [63:32] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUWValStr1_t__ +typedef struct _ADI_CRYPT_KUWValStr1_t { + union { + struct { + unsigned int InitalValue0 : 32; /**< Initial Value */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUWValStr1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUWValStr1_t__ */ + +/*@}*/ + +/** @defgroup KUWValStr2 Key Wrap Unwrap Validation String [31:0] (KUWValStr2) Register + * Key Wrap Unwrap Validation String [31:0] (KUWValStr2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CRYPT_KUWValStr2_Struct + *! \brief Key Wrap Unwrap Validation String [31:0] Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CRYPT_KUWValStr2_t__ +typedef struct _ADI_CRYPT_KUWValStr2_t { + union { + struct { + unsigned int InitialValue1 : 32; /**< Initial Value */ + }; + uint32_t VALUE32; + }; +} ADI_CRYPT_KUWValStr2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CRYPT_KUWValStr2_t__ */ + +/*@}*/ + +/** @defgroup IEN Power Supply Monitor Interrupt Enable (IEN) Register + * Power Supply Monitor Interrupt Enable (IEN) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_PMG_IEN_RANGEBAT + *! \brief Battery Monitor Range (RANGEBAT) Enumerations + * ========================================================================= */ +typedef enum +{ + PMG_IEN_REGION1 = 0, /**< Configure to generate interrupt if VBAT in Region1 */ + PMG_IEN_REGION2 = 1, /**< Configure to generate interrupt if VBAT in Region2 */ + PMG_IEN_REGION3 = 2, /**< Configure to generate interrupt if VBAT in Region3 */ + PMG_IEN_NA = 3 /**< NA */ +} ADI_PMG_IEN_RANGEBAT; + + +/* ========================================================================== + *! \struct ADI_PMG_IEN_Struct + *! \brief Power Supply Monitor Interrupt Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_IEN_t__ +typedef struct _ADI_PMG_IEN_t { + union { + struct { + unsigned int VBAT : 1; /**< Enable Interrupt for VBAT */ + unsigned int VREGUNDR : 1; /**< Enable Interrupt when VREG under-voltage (below 1 V) */ + unsigned int VREGOVR : 1; /**< Enable Interrupt when VREG over-voltage (above 1.32 V) */ + unsigned int reserved3 : 5; + unsigned int RANGEBAT : 2; /**< Battery Monitor Range */ + unsigned int IENBAT : 1; /**< Interrupt enable for VBAT range */ + unsigned int reserved11 : 21; + }; + uint32_t VALUE32; + }; +} ADI_PMG_IEN_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_IEN_t__ */ + +/*@}*/ + +/** @defgroup PSM_STAT Power Supply Monitor Status (PSM_STAT) Register + * Power Supply Monitor Status (PSM_STAT) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_PMG_PSM_STAT_RORANGE1 + *! \brief VBAT range1 (RORANGE1) Enumerations + * ========================================================================= */ +typedef enum +{ + PMG_PSM_STAT_BATSTAT1 = 0, /**< VBAT NOT in the range specified */ + PMG_PSM_STAT_BATSTAT0 = 1 /**< VBAT in the range specified */ +} ADI_PMG_PSM_STAT_RORANGE1; + + +/* ========================================================================== + *! \struct ADI_PMG_PSM_STAT_Struct + *! \brief Power Supply Monitor Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_PSM_STAT_t__ +typedef struct _ADI_PMG_PSM_STAT_t { + union { + struct { + unsigned int VBATUNDR : 1; /**< Status bit indicating an Alarm that battery is below 1.8 V */ + unsigned int VREGUNDR : 1; /**< Status bit for Alarm indicating VREG is below 1 V */ + unsigned int VREGOVR : 1; /**< Status bit for alarm indicating Over Voltage for VREG */ + unsigned int reserved3 : 4; + unsigned int WICENACK : 1; /**< WIC Enable Acknowledge from Cortex */ + unsigned int RANGE1 : 1; /**< VBAT range1 */ + unsigned int RANGE2 : 1; /**< VBAT range2 */ + unsigned int RANGE3 : 1; /**< VBAT range3 */ + unsigned int reserved11 : 2; + unsigned int RORANGE1 : 1; /**< VBAT range1 */ + unsigned int RORANGE2 : 1; /**< VBAT range2 */ + unsigned int RORANGE3 : 1; /**< VBAT range3 */ + unsigned int reserved16 : 16; + }; + uint32_t VALUE32; + }; +} ADI_PMG_PSM_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_PSM_STAT_t__ */ + +/*@}*/ + +/** @defgroup PWRMOD Power Mode Register (PWRMOD) Register + * Power Mode Register (PWRMOD) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_PMG_PWRMOD_MODE + *! \brief Power Mode Bits (MODE) Enumerations + * ========================================================================= */ +typedef enum +{ + PMG_PWRMOD_FLEXI = 0, /**< Flexi Mode */ + PMG_PWRMOD_HIBERNATE = 2, /**< Hibernate Mode */ + PMG_PWRMOD_SHUTDOWN = 3 /**< Shutdown Mode */ +} ADI_PMG_PWRMOD_MODE; + + +/* ========================================================================== + *! \struct ADI_PMG_PWRMOD_Struct + *! \brief Power Mode Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_PWRMOD_t__ +typedef struct _ADI_PMG_PWRMOD_t { + union { + struct { + unsigned int MODE : 2; /**< Power Mode Bits */ + unsigned int reserved2 : 1; + unsigned int MONVBATN : 1; /**< Monitor VBAT during Hibernate Mode. Monitors VBAT by default */ + unsigned int reserved4 : 28; + }; + uint32_t VALUE32; + }; +} ADI_PMG_PWRMOD_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_PWRMOD_t__ */ + +/*@}*/ + +/** @defgroup PWRKEY Key Protection for PWRMOD and SRAMRET (PWRKEY) Register + * Key Protection for PWRMOD and SRAMRET (PWRKEY) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_PMG_PWRKEY_Struct + *! \brief Key Protection for PWRMOD and SRAMRET Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_PWRKEY_t__ +typedef struct _ADI_PMG_PWRKEY_t { + union { + struct { + unsigned int VALUE : 16; /**< Power Control Key */ + unsigned int reserved16 : 16; + }; + uint32_t VALUE32; + }; +} ADI_PMG_PWRKEY_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_PWRKEY_t__ */ + +/*@}*/ + +/** @defgroup SHDN_STAT Shutdown Status Register (SHDN_STAT) Register + * Shutdown Status Register (SHDN_STAT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_PMG_SHDN_STAT_Struct + *! \brief Shutdown Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_SHDN_STAT_t__ +typedef struct _ADI_PMG_SHDN_STAT_t { + union { + struct { + unsigned int EXTINT0 : 1; /**< Interrupt from External Interrupt 0 */ + unsigned int EXTINT1 : 1; /**< Interrupt from External Interrupt 1 */ + unsigned int EXTINT2 : 1; /**< Interrupt from External Interrupt 2 */ + unsigned int RTC : 1; /**< Interrupt from RTC */ + unsigned int reserved4 : 28; + }; + uint32_t VALUE32; + }; +} ADI_PMG_SHDN_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_SHDN_STAT_t__ */ + +/*@}*/ + +/** @defgroup SRAMRET Control for Retention SRAM in Hibernate Mode (SRAMRET) Register + * Control for Retention SRAM in Hibernate Mode (SRAMRET) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_PMG_SRAMRET_Struct + *! \brief Control for Retention SRAM in Hibernate Mode Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_SRAMRET_t__ +typedef struct _ADI_PMG_SRAMRET_t { + union { + struct { + unsigned int RET1 : 1; /**< Enable retention bank 1 (12 KB) */ + unsigned int RET2 : 1; /**< Enable retention bank 3 and bank 4 (32 KB) */ + unsigned int reserved2 : 6; + unsigned int RET3 : 1; /**< Enable retention bank 5 (32 KB) */ + unsigned int RET4 : 1; /**< Enable retention bank 6 and bank 7 (32 KB) */ + unsigned int reserved10 : 13; + unsigned int HIBERNATE_SRAM_LOAD_MODE : 1; /**< Hibernate mode SRAM load mode control */ + unsigned int reserved24 : 8; + }; + uint32_t VALUE32; + }; +} ADI_PMG_SRAMRET_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_SRAMRET_t__ */ + +/*@}*/ + +/** @defgroup TRIM Trimming Bits (TRIM) Register + * Trimming Bits (TRIM) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_PMG_TRIM_hibernate_load_mode + *! \brief Hibernate mode load mode control (hibernate_load_mode) Enumerations + * ========================================================================= */ +typedef enum +{ + PMG_TRIM_HIGH_LOAD = 0, /**< High hibernate load */ + PMG_TRIM_LOW_LOAD = 7 /**< Low hibernate load */ +} ADI_PMG_TRIM_hibernate_load_mode; + + +/* ========================================================================== + *! \struct ADI_PMG_TRIM_Struct + *! \brief Trimming Bits Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_TRIM_t__ +typedef struct _ADI_PMG_TRIM_t { + union { + struct { + unsigned int reserved0 : 29; + unsigned int hibernate_load_mode : 3; /**< Hibernate mode load mode control */ + }; + uint32_t VALUE32; + }; +} ADI_PMG_TRIM_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_TRIM_t__ */ + +/*@}*/ + +/** @defgroup RST_STAT Reset Status (RST_STAT) Register + * Reset Status (RST_STAT) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_PMG_RST_STAT_PORSRC + *! \brief Power on reset Source (PORSRC) Enumerations + * ========================================================================= */ +typedef enum +{ + PMG_RST_STAT_FAILSAFE_HV = 0, /**< POR triggered because VBAT drops below Fail Safe */ + PMG_RST_STAT_RST_VBAT = 1, /**< POR trigger because VBAT supply (VBAT < 1.7 V) */ + PMG_RST_STAT_RST_VREG = 2, /**< POR triggered because VDD supply (VDD < 1.08 V) */ + PMG_RST_STAT_FAILSAFE_LV = 3 /**< POR triggered because VREG drops below Fail Safe */ +} ADI_PMG_RST_STAT_PORSRC; + + +/* ========================================================================== + *! \struct ADI_PMG_RST_STAT_Struct + *! \brief Reset Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_RST_STAT_t__ +typedef struct _ADI_PMG_RST_STAT_t { + union { + struct { + unsigned int POR : 1; /**< Power-on reset */ + unsigned int EXTRST : 1; /**< External reset */ + unsigned int WDRST : 1; /**< Watchdog timeout */ + unsigned int SWRST : 1; /**< Software reset */ + unsigned int PORSRC : 2; /**< Power on reset Source */ + unsigned int reserved6 : 26; + }; + uint32_t VALUE32; + }; +} ADI_PMG_RST_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_RST_STAT_t__ */ + +/*@}*/ + +/** @defgroup CTL1 HPBUCK Control (CTL1) Register + * HPBUCK Control (CTL1) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_PMG_CTL1_HPBUCK_LD_MODE + *! \brief HP Buck load mode (HPBUCK_LD_MODE) Enumerations + * ========================================================================= */ +typedef enum +{ + PMG_CTL1_HPBUCKLOWLOAD = 0, /**< HPBUCK Low load mode is enabled */ + PMG_CTL1_HPBUCKHIGHLOAD = 1 /**< HPBUCK High load mode is enabled */ +} ADI_PMG_CTL1_HPBUCK_LD_MODE; + + +/* ========================================================================= + *! \enum ADI_PMG_CTL1_HPBUCK_LOWPWR_MODE + *! \brief HP Buck low power mode (HPBUCK_LOWPWR_MODE) Enumerations + * ========================================================================= */ +typedef enum +{ + PMG_CTL1_LOWPWRDISABLE = 0, /**< HPBUCK Low power mode is disabled */ + PMG_CTL1_LOWPWRENABLE = 1 /**< HPBUCK Low power mode is enabled */ +} ADI_PMG_CTL1_HPBUCK_LOWPWR_MODE; + + +/* ========================================================================== + *! \struct ADI_PMG_CTL1_Struct + *! \brief HPBUCK Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_CTL1_t__ +typedef struct _ADI_PMG_CTL1_t { + union { + struct { + unsigned int HPBUCKEN : 1; /**< Enable HP Buck */ + unsigned int HPBUCK_LD_MODE : 1; /**< HP Buck load mode */ + unsigned int HPBUCK_LOWPWR_MODE : 1; /**< HP Buck low power mode */ + unsigned int reserved3 : 29; + }; + uint32_t VALUE32; + }; +} ADI_PMG_CTL1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_CTL1_t__ */ + +/*@}*/ + +/** @defgroup CFG0 External Interrupt configuration (CFG0) Register + * External Interrupt configuration (CFG0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_XINT_CFG0_Struct + *! \brief External Interrupt configuration Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_XINT_CFG0_t__ +typedef struct _ADI_XINT_CFG0_t { + union { + struct { + unsigned int IRQ0MDE : 3; /**< External Interrupt 0 Mode registers */ + unsigned int IRQ0EN : 1; /**< External Interrupt 0 Enable bit */ + unsigned int IRQ1MDE : 3; /**< External Interrupt 1 Mode registers */ + unsigned int IRQ1EN : 1; /**< External Interrupt 1 Enable bit */ + unsigned int IRQ2MDE : 3; /**< External Interrupt 2 Mode registers */ + unsigned int IRQ2EN : 1; /**< External Interrupt 2 Enable bit */ + unsigned int IRQ3MDE : 3; /**< External Interrupt 3 Mode registers */ + unsigned int IRQ3EN : 1; /**< External Interrupt 3 enable bit */ + unsigned int reserved16 : 4; + unsigned int UART_RX_EN : 1; /**< External Interrupt using SIP_UPDATE enable bit */ + unsigned int UART_RX_MDE : 3; /**< External Interrupt using UART_RX wakeup Mode registers */ + unsigned int reserved24 : 8; + }; + uint32_t VALUE32; + }; +} ADI_XINT_CFG0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_XINT_CFG0_t__ */ + +/*@}*/ + +/** @defgroup EXT_STAT External Wakeup Interrupt Status register (EXT_STAT) Register + * External Wakeup Interrupt Status register (EXT_STAT) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_XINT_EXT_STAT_Struct + *! \brief External Wakeup Interrupt Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_XINT_EXT_STAT_t__ +typedef struct _ADI_XINT_EXT_STAT_t { + union { + struct { + unsigned int STAT_EXTINT0 : 1; /**< Interrupt status bit for External Interrupt 0 */ + unsigned int STAT_EXTINT1 : 1; /**< Interrupt status bit for External Interrupt 1 */ + unsigned int STAT_EXTINT2 : 1; /**< Interrupt status bit for External Interrupt 2 */ + unsigned int STAT_EXTINT3 : 1; /**< Interrupt status bit for External Interrupt 3 */ + unsigned int reserved4 : 1; + unsigned int STAT_UART_RXWKUP : 1; /**< Interrupt status bit for UART RX WAKEUP interrupt */ + unsigned int reserved6 : 26; + }; + uint32_t VALUE32; + }; +} ADI_XINT_EXT_STAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_XINT_EXT_STAT_t__ */ + +/*@}*/ + +/** @defgroup CLR External Interrupt clear (CLR) Register + * External Interrupt clear (CLR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_XINT_CLR_Struct + *! \brief External Interrupt clear Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_XINT_CLR_t__ +typedef struct _ADI_XINT_CLR_t { + union { + struct { + unsigned int IRQ0 : 1; /**< External interrupt 0 */ + unsigned int IRQ1 : 1; /**< External interrupt 1 */ + unsigned int IRQ2 : 1; /**< External interrupt 2 */ + unsigned int IRQ3 : 1; /**< External interrupt 3 */ + unsigned int reserved4 : 1; + unsigned int UART_RX_CLR : 1; /**< External interrupt Clear for UART_RX WAKEUP interrupt */ + unsigned int reserved6 : 26; + }; + uint32_t VALUE32; + }; +} ADI_XINT_CLR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_XINT_CLR_t__ */ + +/*@}*/ + +/** @defgroup NMICLR Non-maskable interrupt clear (NMICLR) Register + * Non-maskable interrupt clear (NMICLR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_XINT_NMICLR_Struct + *! \brief Non-maskable interrupt clear Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_XINT_NMICLR_t__ +typedef struct _ADI_XINT_NMICLR_t { + union { + struct { + unsigned int CLR : 1; /**< NMI clear */ + unsigned int reserved1 : 31; + }; + uint32_t VALUE32; + }; +} ADI_XINT_NMICLR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_XINT_NMICLR_t__ */ + +/*@}*/ + +/** @defgroup KEY Key Protection for OSCCTRL (KEY) Register + * Key Protection for OSCCTRL (KEY) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CLKG_OSC_KEY_Struct + *! \brief Key Protection for OSCCTRL Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CLKG_OSC_KEY_t__ +typedef struct _ADI_CLKG_OSC_KEY_t { + union { + struct { + unsigned int VALUE : 16; /**< Oscillator key */ + unsigned int reserved16 : 16; + }; + uint32_t VALUE32; + }; +} ADI_CLKG_OSC_KEY_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CLKG_OSC_KEY_t__ */ + +/*@}*/ + +/** @defgroup CTL Oscillator Control (CTL) Register + * Oscillator Control (CTL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CLKG_OSC_CTL_Struct + *! \brief Oscillator Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CLKG_OSC_CTL_t__ +typedef struct _ADI_CLKG_OSC_CTL_t { + union { + struct { + unsigned int LFCLK_MUX : 1; /**< 32 kHz clock select mux */ + unsigned int HFOSC_EN : 1; /**< High frequency internal oscillator enable */ + unsigned int LFX_EN : 1; /**< Low frequency crystal oscillator enable */ + unsigned int HFX_EN : 1; /**< High frequency crystal oscillator enable */ + unsigned int LFX_BYP : 1; /**< Low frequency crystal oscillator Bypass */ + unsigned int LFX_MON_EN : 1; /**< LFXTAL clock monitor and Clock FAIL interrupt enable */ + unsigned int reserved6 : 2; + unsigned int LFOSC_OK : 1; /**< Status of LFOSC oscillator */ + unsigned int HFOSC_OK : 1; /**< Status of HFOSC oscillator */ + unsigned int LFX_OK : 1; /**< Status of LFXTAL oscillator */ + unsigned int HFX_OK : 1; /**< Status of HFXTAL oscillator */ + unsigned int LFX_AUTSW_EN : 1; /**< Enables automatic Switching of the LF Mux to LFOSC on LFXTAL Failure */ + unsigned int LFX_AUTSW_STA : 1; /**< Status of automatic switching of the LF Mux to LFOSC upon detection of LFXTAL failure */ + unsigned int LFX_ROBUST_EN : 1; /**< LFXTAL Mode select */ + unsigned int LFX_ROBUST_LD : 2; /**< LFXTAL Robust Mode Load select */ + unsigned int reserved17 : 3; + unsigned int ROOT_MON_EN : 1; /**< ROOT clock monitor and Clock FAIL interrupt enable */ + unsigned int ROOT_AUTSW_EN : 1; /**< Enables automatic Switching of the Root clock to HFOSC on Root clock Failure */ + unsigned int ROOT_AUTSW_STA : 1; /**< Status of automatic switching of the Root clock to HFOSC upon detection of Root clock failure */ + unsigned int reserved23 : 7; + unsigned int ROOT_FAIL_STA : 1; /**< Root clock (crystal clock) Not Stable */ + unsigned int LFX_FAIL_STA : 1; /**< LF XTAL (crystal clock) Not Stable */ + }; + uint32_t VALUE32; + }; +} ADI_CLKG_OSC_CTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CLKG_OSC_CTL_t__ */ + +/*@}*/ + +/** @defgroup SRAM_CTL Control for SRAM Parity and Instruction SRAM (SRAM_CTL) Register + * Control for SRAM Parity and Instruction SRAM (SRAM_CTL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_PMG_TST_SRAM_CTL_Struct + *! \brief Control for SRAM Parity and Instruction SRAM Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_TST_SRAM_CTL_t__ +typedef struct _ADI_PMG_TST_SRAM_CTL_t { + union { + struct { + unsigned int reserved0 : 1; + unsigned int BNK1EN : 1; /**< Enable initialization */ + unsigned int BNK2EN : 1; /**< Enable initialization */ + unsigned int reserved3 : 4; + unsigned int BNK7EN : 1; /**< Enable initialization */ + unsigned int reserved8 : 5; + unsigned int STARTINIT : 1; /**< Write one to trigger initialization. Self-cleared */ + unsigned int AUTOINIT : 1; /**< Automatic initialization on wake up from hibernate mode */ + unsigned int ABTINIT : 1; /**< Abort current initialization. Self-cleared */ + unsigned int PENBNK0 : 1; /**< Enable parity check */ + unsigned int PENBNK1 : 1; /**< Enable parity check */ + unsigned int PENBNK2 : 1; /**< Enable parity check */ + unsigned int PENBNK3 : 1; /**< Enable parity check */ + unsigned int PENBNK4 : 1; /**< Enable parity check */ + unsigned int PENBNK5 : 1; /**< Enable parity check */ + unsigned int PENBNK6 : 1; /**< Enable parity check */ + unsigned int PENBNK7 : 1; /**< Enable parity check */ + unsigned int reserved24 : 7; + unsigned int INSTREN : 1; /**< Enables 32 KB instruction SRAM */ + }; + uint32_t VALUE32; + }; +} ADI_PMG_TST_SRAM_CTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_TST_SRAM_CTL_t__ */ + +/*@}*/ + +/** @defgroup SRAM_INITSTAT Initialization Status Register (SRAM_INITSTAT) Register + * Initialization Status Register (SRAM_INITSTAT) Register. + * @{ + */ + +/* ========================================================================= + *! \enum ADI_PMG_TST_SRAM_INITSTAT_BNK0DONE + *! \brief Bank 0 initialization status (BNK0DONE) Enumerations + * ========================================================================= */ +typedef enum +{ + PMG_TST_SRAM_INITSTAT_NO_BANK0_INIT = 0, /**< Bank 0 not initialized */ + PMG_TST_SRAM_INITSTAT_BANK0_INIT = 1 /**< Bank 0 initialized */ +} ADI_PMG_TST_SRAM_INITSTAT_BNK0DONE; + + +/* ========================================================================= + *! \enum ADI_PMG_TST_SRAM_INITSTAT_BNK1DONE + *! \brief Bank 1 initialization status (BNK1DONE) Enumerations + * ========================================================================= */ +typedef enum +{ + PMG_TST_SRAM_INITSTAT_NO_BANK1_INIT = 0, /**< Bank 1 not initialized */ + PMG_TST_SRAM_INITSTAT_BANK1_INIT = 1 /**< Bank 1 initialized */ +} ADI_PMG_TST_SRAM_INITSTAT_BNK1DONE; + + +/* ========================================================================= + *! \enum ADI_PMG_TST_SRAM_INITSTAT_BNK2DONE + *! \brief Bank 2 initialization status (BNK2DONE) Enumerations + * ========================================================================= */ +typedef enum +{ + PMG_TST_SRAM_INITSTAT_NO_BANK2_INIT = 0, /**< Bank 2 not initialized */ + PMG_TST_SRAM_INITSTAT_BANK2_INIT = 1 /**< Bank 2 initialized */ +} ADI_PMG_TST_SRAM_INITSTAT_BNK2DONE; + + +/* ========================================================================= + *! \enum ADI_PMG_TST_SRAM_INITSTAT_BNK3DONE + *! \brief Bank 3 initialization status (BNK3DONE) Enumerations + * ========================================================================= */ +typedef enum +{ + PMG_TST_SRAM_INITSTAT_NO_BANK3_INIT = 0, /**< Bank 3 not initialized */ + PMG_TST_SRAM_INITSTAT_BANK3_INIT = 1 /**< Bank 3 initialized */ +} ADI_PMG_TST_SRAM_INITSTAT_BNK3DONE; + + +/* ========================================================================= + *! \enum ADI_PMG_TST_SRAM_INITSTAT_BNK4DONE + *! \brief Bank 4 initialization status (BNK4DONE) Enumerations + * ========================================================================= */ +typedef enum +{ + PMG_TST_SRAM_INITSTAT_NO_BANK4_INIT = 0, /**< Bank 4 not initialized */ + PMG_TST_SRAM_INITSTAT_BANK4_INIT = 1 /**< Bank 4 initialized */ +} ADI_PMG_TST_SRAM_INITSTAT_BNK4DONE; + + +/* ========================================================================= + *! \enum ADI_PMG_TST_SRAM_INITSTAT_BNK5DONE + *! \brief Bank 5 initialization status (BNK5DONE) Enumerations + * ========================================================================= */ +typedef enum +{ + PMG_TST_SRAM_INITSTAT_NO_BANK5_INIT = 0, /**< Bank 5 not initialized */ + PMG_TST_SRAM_INITSTAT_BANK5_INIT = 1 /**< Bank 5 initialized */ +} ADI_PMG_TST_SRAM_INITSTAT_BNK5DONE; + + +/* ========================================================================= + *! \enum ADI_PMG_TST_SRAM_INITSTAT_BNK6DONE + *! \brief Bank 6 initialization status (BNK6DONE) Enumerations + * ========================================================================= */ +typedef enum +{ + PMG_TST_SRAM_INITSTAT_NO_BANK6_INIT = 0, /**< Bank 6 not initialized */ + PMG_TST_SRAM_INITSTAT_BANK6_INIT = 1 /**< Bank 6 initialized */ +} ADI_PMG_TST_SRAM_INITSTAT_BNK6DONE; + + +/* ========================================================================= + *! \enum ADI_PMG_TST_SRAM_INITSTAT_BNK7DONE + *! \brief Bank 7 initialization status (BNK7DONE) Enumerations + * ========================================================================= */ +typedef enum +{ + PMG_TST_SRAM_INITSTAT_NO_BANK7_INIT = 0, /**< Bank 7 not initialized */ + PMG_TST_SRAM_INITSTAT_BANK7_INIT = 1 /**< Bank 7 initialized */ +} ADI_PMG_TST_SRAM_INITSTAT_BNK7DONE; + + +/* ========================================================================== + *! \struct ADI_PMG_TST_SRAM_INITSTAT_Struct + *! \brief Initialization Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_TST_SRAM_INITSTAT_t__ +typedef struct _ADI_PMG_TST_SRAM_INITSTAT_t { + union { + struct { + unsigned int BNK0DONE : 1; /**< Bank 0 initialization status */ + unsigned int BNK1DONE : 1; /**< Bank 1 initialization status */ + unsigned int BNK2DONE : 1; /**< Bank 2 initialization status */ + unsigned int BNK3DONE : 1; /**< Bank 3 initialization status */ + unsigned int BNK4DONE : 1; /**< Bank 4 initialization status */ + unsigned int BNK5DONE : 1; /**< Bank 5 initialization status */ + unsigned int BNK6DONE : 1; /**< Bank 6 initialization status */ + unsigned int BNK7DONE : 1; /**< Bank 7 initialization status */ + unsigned int reserved8 : 24; + }; + uint32_t VALUE32; + }; +} ADI_PMG_TST_SRAM_INITSTAT_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_TST_SRAM_INITSTAT_t__ */ + +/*@}*/ + +/** @defgroup CLR_LATCH_GPIOS Clear GPIO After Shutdown Mode (CLR_LATCH_GPIOS) Register + * Clear GPIO After Shutdown Mode (CLR_LATCH_GPIOS) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_PMG_TST_CLR_LATCH_GPIOS_Struct + *! \brief Clear GPIO After Shutdown Mode Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_TST_CLR_LATCH_GPIOS_t__ +typedef struct _ADI_PMG_TST_CLR_LATCH_GPIOS_t { + union { + struct { + unsigned int VALUE : 16; /**< Writing 0x58FA creates a pulse to clear the latches for the GPIOs */ + }; + uint16_t VALUE16; + }; +} ADI_PMG_TST_CLR_LATCH_GPIOS_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_TST_CLR_LATCH_GPIOS_t__ */ + +/*@}*/ + +/** @defgroup SCRPAD_IMG Scratch Pad Image (SCRPAD_IMG) Register + * Scratch Pad Image (SCRPAD_IMG) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_PMG_TST_SCRPAD_IMG_Struct + *! \brief Scratch Pad Image Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_TST_SCRPAD_IMG_t__ +typedef struct _ADI_PMG_TST_SCRPAD_IMG_t { + union { + struct { + unsigned int DATA : 32; /**< Value written to this register is saved in 3 V when going to shutdown */ + }; + uint32_t VALUE32; + }; +} ADI_PMG_TST_SCRPAD_IMG_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_TST_SCRPAD_IMG_t__ */ + +/*@}*/ + +/** @defgroup SCRPAD_3V_RD Scratch Pad Saved in Battery Domain (SCRPAD_3V_RD) Register + * Scratch Pad Saved in Battery Domain (SCRPAD_3V_RD) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_PMG_TST_SCRPAD_3V_RD_Struct + *! \brief Scratch Pad Saved in Battery Domain Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_TST_SCRPAD_3V_RD_t__ +typedef struct _ADI_PMG_TST_SCRPAD_3V_RD_t { + union { + struct { + unsigned int DATA : 32; /**< Reading the scratch pad stored in shutdown mode */ + }; + uint32_t VALUE32; + }; +} ADI_PMG_TST_SCRPAD_3V_RD_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_TST_SCRPAD_3V_RD_t__ */ + +/*@}*/ + +/** @defgroup FAST_SHT_WAKEUP Fast Shutdown Wake-up Enable (FAST_SHT_WAKEUP) Register + * Fast Shutdown Wake-up Enable (FAST_SHT_WAKEUP) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_PMG_TST_FAST_SHT_WAKEUP_Struct + *! \brief Fast Shutdown Wake-up Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PMG_TST_FAST_SHT_WAKEUP_t__ +typedef struct _ADI_PMG_TST_FAST_SHT_WAKEUP_t { + union { + struct { + unsigned int FAST_SHT_WAKEUP : 1; /**< Enables fast shutdown wake-up */ + unsigned int reserved1 : 31; + }; + uint32_t VALUE32; + }; +} ADI_PMG_TST_FAST_SHT_WAKEUP_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PMG_TST_FAST_SHT_WAKEUP_t__ */ + +/*@}*/ + +/** @defgroup CTL0 Misc Clock Settings (CTL0) Register + * Misc Clock Settings (CTL0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CLKG_CLK_CTL0_Struct + *! \brief Misc Clock Settings Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CLKG_CLK_CTL0_t__ +typedef struct _ADI_CLKG_CLK_CTL0_t { + union { + struct { + unsigned int CLKMUX : 2; /**< Clock mux select */ + unsigned int reserved2 : 1; + unsigned int CLKOUT : 4; /**< GPIO clock out select */ + unsigned int reserved7 : 1; + unsigned int RCLKMUX : 2; /**< Flash reference clock and HPBUCK clock source mux */ + unsigned int reserved10 : 1; + unsigned int PLL_IPSEL : 2; /**< SPLL source select mux */ + unsigned int reserved13 : 1; + unsigned int LFXTALIE : 1; /**< Low frequency crystal interrupt enable */ + unsigned int HFXTALIE : 1; /**< High frequency crystal interrupt enable */ + unsigned int reserved16 : 16; + }; + uint32_t VALUE32; + }; +} ADI_CLKG_CLK_CTL0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CLKG_CLK_CTL0_t__ */ + +/*@}*/ + +/** @defgroup CTL1 Clock Dividers (CTL1) Register + * Clock Dividers (CTL1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CLKG_CLK_CTL1_Struct + *! \brief Clock Dividers Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CLKG_CLK_CTL1_t__ +typedef struct _ADI_CLKG_CLK_CTL1_t { + union { + struct { + unsigned int HCLKDIVCNT : 6; /**< HCLK divide count */ + unsigned int reserved6 : 2; + unsigned int PCLKDIVCNT : 6; /**< PCLK divide count */ + unsigned int reserved14 : 2; + unsigned int ACLKDIVCNT : 9; /**< ACLK Divide Count */ + unsigned int reserved25 : 7; + }; + uint32_t VALUE32; + }; +} ADI_CLKG_CLK_CTL1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CLKG_CLK_CTL1_t__ */ + +/*@}*/ + +/** @defgroup CTL2 HF Oscillator Divided Clock Select (CTL2) Register + * HF Oscillator Divided Clock Select (CTL2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CLKG_CLK_CTL2_Struct + *! \brief HF Oscillator Divided Clock Select Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CLKG_CLK_CTL2_t__ +typedef struct _ADI_CLKG_CLK_CTL2_t { + union { + struct { + unsigned int HFOSCAUTODIV_EN : 1; /**< HF Oscillator auto divide by one clock selection during wakeup from Flexi power mode */ + unsigned int HFOSCDIVCLKSEL : 3; /**< HF Oscillator divided clock select */ + unsigned int reserved4 : 28; + }; + uint32_t VALUE32; + }; +} ADI_CLKG_CLK_CTL2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CLKG_CLK_CTL2_t__ */ + +/*@}*/ + +/** @defgroup CTL3 System PLL (CTL3) Register + * System PLL (CTL3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CLKG_CLK_CTL3_Struct + *! \brief System PLL Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CLKG_CLK_CTL3_t__ +typedef struct _ADI_CLKG_CLK_CTL3_t { + union { + struct { + unsigned int SPLLNSEL : 5; /**< System PLL N multiplier */ + unsigned int reserved5 : 3; + unsigned int SPLLDIV2 : 1; /**< System PLL division by 2 */ + unsigned int SPLLEN : 1; /**< System PLL enable */ + unsigned int SPLLIE : 1; /**< System PLL interrupt enable */ + unsigned int SPLLMSEL : 4; /**< System PLL M Divider */ + unsigned int reserved15 : 1; + unsigned int SPLLMUL2 : 1; /**< System PLL multiply by 2 */ + unsigned int reserved17 : 15; + }; + uint32_t VALUE32; + }; +} ADI_CLKG_CLK_CTL3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CLKG_CLK_CTL3_t__ */ + +/*@}*/ + +/** @defgroup CTL5 User Clock Gating Control (CTL5) Register + * User Clock Gating Control (CTL5) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CLKG_CLK_CTL5_Struct + *! \brief User Clock Gating Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CLKG_CLK_CTL5_t__ +typedef struct _ADI_CLKG_CLK_CTL5_t { + union { + struct { + unsigned int GPTCLK0OFF : 1; /**< GP Timer 0 user control */ + unsigned int GPTCLK1OFF : 1; /**< GP Timer 1 user control */ + unsigned int GPTCLK2OFF : 1; /**< GP Timer 2 user control */ + unsigned int UCLKI2COFF : 1; /**< I2C clock user control */ + unsigned int GPIOCLKOFF : 1; /**< GPIO clock control */ + unsigned int PERCLKOFF : 1; /**< This bit is used to disable all clocks connected to all peripherals */ + unsigned int TMRRGBCLKOFF : 1; /**< Timer RGB user control */ + unsigned int reserved7 : 25; + }; + uint32_t VALUE32; + }; +} ADI_CLKG_CLK_CTL5_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CLKG_CLK_CTL5_t__ */ + +/*@}*/ + +/** @defgroup STAT0 Clocking Status (STAT0) Register + * Clocking Status (STAT0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_CLKG_CLK_STAT0_Struct + *! \brief Clocking Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_CLKG_CLK_STAT0_t__ +typedef struct _ADI_CLKG_CLK_STAT0_t { + union { + struct { + unsigned int SPLL : 1; /**< System PLL status */ + unsigned int SPLLLK : 1; /**< System PLL lock */ + unsigned int SPLLUNLK : 1; /**< System PLL unlock */ + unsigned int reserved3 : 5; + unsigned int LFXTAL : 1; /**< LF crystal status */ + unsigned int LFXTALOK : 1; /**< LF crystal stable */ + unsigned int LFXTALNOK : 1; /**< LF crystal not stable */ + unsigned int reserved11 : 1; + unsigned int HFXTAL : 1; /**< HF crystal status */ + unsigned int HFXTALOK : 1; /**< HF crystal stable */ + unsigned int HFXTALNOK : 1; /**< HF crystal not stable */ + unsigned int reserved15 : 17; + }; + uint32_t VALUE32; + }; +} ADI_CLKG_CLK_STAT0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_CLKG_CLK_STAT0_t__ */ + +/*@}*/ + +/** @defgroup ARBIT0 Arbitration Priority Configuration for FLASH and SRAM0 (ARBIT0) Register + * Arbitration Priority Configuration for FLASH and SRAM0 (ARBIT0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_BUSM_ARBIT0_Struct + *! \brief Arbitration Priority Configuration for FLASH and SRAM0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_BUSM_ARBIT0_t__ +typedef struct _ADI_BUSM_ARBIT0_t { + union { + struct { + unsigned int FLSH_DCODE : 2; /**< Flash priority for DCODE */ + unsigned int FLSH_SBUS : 2; /**< Flash priority for SBUS */ + unsigned int FLSH_DMA0 : 2; /**< Flash priority for DMA0 */ + unsigned int reserved6 : 10; + unsigned int SRAM0_DCODE : 2; /**< SRAM0 priority for Dcode */ + unsigned int SRAM0_SBUS : 2; /**< SRAM0 priority for SBUS */ + unsigned int SRAM0_DMA0 : 2; /**< SRAM0 priority for DMA0 */ + unsigned int reserved22 : 10; + }; + uint32_t VALUE32; + }; +} ADI_BUSM_ARBIT0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_BUSM_ARBIT0_t__ */ + +/*@}*/ + +/** @defgroup ARBIT1 Arbitration Priority Configuration for SRAM1 and SIP (ARBIT1) Register + * Arbitration Priority Configuration for SRAM1 and SIP (ARBIT1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_BUSM_ARBIT1_Struct + *! \brief Arbitration Priority Configuration for SRAM1 and SIP Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_BUSM_ARBIT1_t__ +typedef struct _ADI_BUSM_ARBIT1_t { + union { + struct { + unsigned int SRAM1_DCODE : 2; /**< SRAM1 priority for Dcode */ + unsigned int SRAM1_SBUS : 2; /**< SRAM1 priority for SBUS */ + unsigned int SRAM1_DMA0 : 2; /**< SRAM1 priority for DMA0 */ + unsigned int reserved6 : 10; + unsigned int SIP_DCODE : 2; /**< SIP priority for DCODE */ + unsigned int SIP_SBUS : 2; /**< SIP priority for SBUS */ + unsigned int SIP_DMA0 : 2; /**< SIP priority for DMA0 */ + unsigned int reserved22 : 10; + }; + uint32_t VALUE32; + }; +} ADI_BUSM_ARBIT1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_BUSM_ARBIT1_t__ */ + +/*@}*/ + +/** @defgroup ARBIT2 Arbitration Priority Configuration for APB32 and APB16 (ARBIT2) Register + * Arbitration Priority Configuration for APB32 and APB16 (ARBIT2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_BUSM_ARBIT2_Struct + *! \brief Arbitration Priority Configuration for APB32 and APB16 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_BUSM_ARBIT2_t__ +typedef struct _ADI_BUSM_ARBIT2_t { + union { + struct { + unsigned int APB32_DCODE : 2; /**< APB32 priority for DCODE */ + unsigned int APB32_SBUS : 2; /**< APB32 priority for SBUS */ + unsigned int APB32_DMA0 : 2; /**< APB32 priority for DMA0 */ + unsigned int reserved6 : 10; + unsigned int APB16_DCODE : 2; /**< APB16 priority for DCODE */ + unsigned int APB16_SBUS : 2; /**< APB16 priority for SBUS */ + unsigned int APB16_DMA0 : 2; /**< APB16 priority for DMA0 */ + unsigned int reserved22 : 10; + }; + uint32_t VALUE32; + }; +} ADI_BUSM_ARBIT2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_BUSM_ARBIT2_t__ */ + +/*@}*/ + +/** @defgroup ARBIT3 Arbitration Priority Configuration for APB16 priority for core and for DMA1 (ARBIT3) Register + * Arbitration Priority Configuration for APB16 priority for core and for DMA1 (ARBIT3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_BUSM_ARBIT3_Struct + *! \brief Arbitration Priority Configuration for APB16 priority for core and for DMA1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_BUSM_ARBIT3_t__ +typedef struct _ADI_BUSM_ARBIT3_t { + union { + struct { + unsigned int APB16_CORE : 1; /**< APB16 priority for CORE */ + unsigned int APB16_DMA1 : 1; /**< APB16 priority for DMA1 */ + unsigned int reserved2 : 14; + unsigned int APB16_4DMA_CORE : 1; /**< APB16 for dma priority for CORE */ + unsigned int APB16_4DMA_DMA1 : 1; /**< APB16 for dma priority for DMA1 */ + unsigned int reserved18 : 14; + }; + uint32_t VALUE32; + }; +} ADI_BUSM_ARBIT3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_BUSM_ARBIT3_t__ */ + +/*@}*/ + +/** @defgroup ARBIT4 Arbitration Priority Configuration for SRAM1 and SIP (ARBIT4) Register + * Arbitration Priority Configuration for SRAM1 and SIP (ARBIT4) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_BUSM_ARBIT4_Struct + *! \brief Arbitration Priority Configuration for SRAM1 and SIP Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_BUSM_ARBIT4_t__ +typedef struct _ADI_BUSM_ARBIT4_t { + union { + struct { + unsigned int SRAM2_DCODE : 2; /**< SRAM2 priority for Dcode */ + unsigned int SRAM2_SBUS : 2; /**< SRAM2 priority for SBUS */ + unsigned int SRAM2_DMA0 : 2; /**< SRAM2 priority for DMA0 */ + unsigned int reserved6 : 26; + }; + uint32_t VALUE32; + }; +} ADI_BUSM_ARBIT4_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_BUSM_ARBIT4_t__ */ + +/*@}*/ + +/** @defgroup RST_ISR_STARTADDR Reset ISR Start Address (RST_ISR_STARTADDR) Register + * Reset ISR Start Address (RST_ISR_STARTADDR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_PTI_RST_ISR_STARTADDR_Struct + *! \brief Reset ISR Start Address Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PTI_RST_ISR_STARTADDR_t__ +typedef struct _ADI_PTI_RST_ISR_STARTADDR_t { + union { + struct { + unsigned int VALUE : 32; + }; + uint32_t VALUE32; + }; +} ADI_PTI_RST_ISR_STARTADDR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PTI_RST_ISR_STARTADDR_t__ */ + +/*@}*/ + +/** @defgroup RST_STACK_PTR Reset Stack Pointer (RST_STACK_PTR) Register + * Reset Stack Pointer (RST_STACK_PTR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_PTI_RST_STACK_PTR_Struct + *! \brief Reset Stack Pointer Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PTI_RST_STACK_PTR_t__ +typedef struct _ADI_PTI_RST_STACK_PTR_t { + union { + struct { + unsigned int VALUE : 32; + }; + uint32_t VALUE32; + }; +} ADI_PTI_RST_STACK_PTR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PTI_RST_STACK_PTR_t__ */ + +/*@}*/ + +/** @defgroup CTL Parallel Test Interface Control Register (CTL) Register + * Parallel Test Interface Control Register (CTL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_PTI_CTL_Struct + *! \brief Parallel Test Interface Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_PTI_CTL_t__ +typedef struct _ADI_PTI_CTL_t { + union { + struct { + unsigned int EN : 1; + unsigned int reserved1 : 31; + }; + uint32_t VALUE32; + }; +} ADI_PTI_CTL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_PTI_CTL_t__ */ + +/*@}*/ + +/** @defgroup INTNUM Interrupt Control Type (INTNUM) Register + * Interrupt Control Type (INTNUM) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTNUM_Struct + *! \brief Interrupt Control Type Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTNUM_t__ +typedef struct _ADI_NVIC_INTNUM_t { + union { + struct { + unsigned int VALUE : 32; /**< Interrupt Control Type */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTNUM_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTNUM_t__ */ + +/*@}*/ + +/** @defgroup STKSTA Systick Control and Status (STKSTA) Register + * Systick Control and Status (STKSTA) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_STKSTA_Struct + *! \brief Systick Control and Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_STKSTA_t__ +typedef struct _ADI_NVIC_STKSTA_t { + union { + struct { + unsigned int VALUE : 32; /**< Systick Control and Status */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_STKSTA_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_STKSTA_t__ */ + +/*@}*/ + +/** @defgroup STKLD Systick Reload Value (STKLD) Register + * Systick Reload Value (STKLD) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_STKLD_Struct + *! \brief Systick Reload Value Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_STKLD_t__ +typedef struct _ADI_NVIC_STKLD_t { + union { + struct { + unsigned int VALUE : 32; /**< Systick Reload Value */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_STKLD_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_STKLD_t__ */ + +/*@}*/ + +/** @defgroup STKVAL Systick Current Value (STKVAL) Register + * Systick Current Value (STKVAL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_STKVAL_Struct + *! \brief Systick Current Value Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_STKVAL_t__ +typedef struct _ADI_NVIC_STKVAL_t { + union { + struct { + unsigned int VALUE : 32; /**< Systick Current Value */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_STKVAL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_STKVAL_t__ */ + +/*@}*/ + +/** @defgroup STKCAL Systick Calibration Value (STKCAL) Register + * Systick Calibration Value (STKCAL) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_STKCAL_Struct + *! \brief Systick Calibration Value Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_STKCAL_t__ +typedef struct _ADI_NVIC_STKCAL_t { + union { + struct { + unsigned int VALUE : 32; /**< Systick Calibration Value */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_STKCAL_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_STKCAL_t__ */ + +/*@}*/ + +/** @defgroup INTSETE0 IRQ0..31 Set_Enable (INTSETE0) Register + * IRQ0..31 Set_Enable (INTSETE0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTSETE0_Struct + *! \brief IRQ0..31 Set_Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTSETE0_t__ +typedef struct _ADI_NVIC_INTSETE0_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ0..31 Set_Enable */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTSETE0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTSETE0_t__ */ + +/*@}*/ + +/** @defgroup INTSETE1 IRQ32..63 Set_Enable (INTSETE1) Register + * IRQ32..63 Set_Enable (INTSETE1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTSETE1_Struct + *! \brief IRQ32..63 Set_Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTSETE1_t__ +typedef struct _ADI_NVIC_INTSETE1_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ32..63 Set_Enable */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTSETE1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTSETE1_t__ */ + +/*@}*/ + +/** @defgroup INTCLRE0 IRQ0..31 Clear_Enable (INTCLRE0) Register + * IRQ0..31 Clear_Enable (INTCLRE0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTCLRE0_Struct + *! \brief IRQ0..31 Clear_Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTCLRE0_t__ +typedef struct _ADI_NVIC_INTCLRE0_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ0..31 Clear_Enable */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTCLRE0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTCLRE0_t__ */ + +/*@}*/ + +/** @defgroup INTCLRE1 IRQ32..63 Clear_Enable (INTCLRE1) Register + * IRQ32..63 Clear_Enable (INTCLRE1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTCLRE1_Struct + *! \brief IRQ32..63 Clear_Enable Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTCLRE1_t__ +typedef struct _ADI_NVIC_INTCLRE1_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ32..63 Clear_Enable */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTCLRE1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTCLRE1_t__ */ + +/*@}*/ + +/** @defgroup INTSETP0 IRQ0..31 Set_Pending (INTSETP0) Register + * IRQ0..31 Set_Pending (INTSETP0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTSETP0_Struct + *! \brief IRQ0..31 Set_Pending Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTSETP0_t__ +typedef struct _ADI_NVIC_INTSETP0_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ0..31 Set_Pending */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTSETP0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTSETP0_t__ */ + +/*@}*/ + +/** @defgroup INTSETP1 IRQ32..63 Set_Pending (INTSETP1) Register + * IRQ32..63 Set_Pending (INTSETP1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTSETP1_Struct + *! \brief IRQ32..63 Set_Pending Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTSETP1_t__ +typedef struct _ADI_NVIC_INTSETP1_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ32..63 Set_Pending */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTSETP1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTSETP1_t__ */ + +/*@}*/ + +/** @defgroup INTCLRP0 IRQ0..31 Clear_Pending (INTCLRP0) Register + * IRQ0..31 Clear_Pending (INTCLRP0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTCLRP0_Struct + *! \brief IRQ0..31 Clear_Pending Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTCLRP0_t__ +typedef struct _ADI_NVIC_INTCLRP0_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ0..31 Clear_Pending */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTCLRP0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTCLRP0_t__ */ + +/*@}*/ + +/** @defgroup INTCLRP1 IRQ32..63 Clear_Pending (INTCLRP1) Register + * IRQ32..63 Clear_Pending (INTCLRP1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTCLRP1_Struct + *! \brief IRQ32..63 Clear_Pending Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTCLRP1_t__ +typedef struct _ADI_NVIC_INTCLRP1_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ32..63 Clear_Pending */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTCLRP1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTCLRP1_t__ */ + +/*@}*/ + +/** @defgroup INTACT0 IRQ0..31 Active Bit (INTACT0) Register + * IRQ0..31 Active Bit (INTACT0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTACT0_Struct + *! \brief IRQ0..31 Active Bit Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTACT0_t__ +typedef struct _ADI_NVIC_INTACT0_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ0..31 Active Bit */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTACT0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTACT0_t__ */ + +/*@}*/ + +/** @defgroup INTACT1 IRQ32..63 Active Bit (INTACT1) Register + * IRQ32..63 Active Bit (INTACT1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTACT1_Struct + *! \brief IRQ32..63 Active Bit Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTACT1_t__ +typedef struct _ADI_NVIC_INTACT1_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ32..63 Active Bit */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTACT1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTACT1_t__ */ + +/*@}*/ + +/** @defgroup INTPRI0 IRQ0..3 Priority (INTPRI0) Register + * IRQ0..3 Priority (INTPRI0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPRI0_Struct + *! \brief IRQ0..3 Priority Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI0_t__ +typedef struct _ADI_NVIC_INTPRI0_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ0..3 Priority */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPRI0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI0_t__ */ + +/*@}*/ + +/** @defgroup INTPRI1 IRQ4..7 Priority (INTPRI1) Register + * IRQ4..7 Priority (INTPRI1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPRI1_Struct + *! \brief IRQ4..7 Priority Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI1_t__ +typedef struct _ADI_NVIC_INTPRI1_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ4..7 Priority */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPRI1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI1_t__ */ + +/*@}*/ + +/** @defgroup INTPRI2 IRQ8..11 Priority (INTPRI2) Register + * IRQ8..11 Priority (INTPRI2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPRI2_Struct + *! \brief IRQ8..11 Priority Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI2_t__ +typedef struct _ADI_NVIC_INTPRI2_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ8..11 Priority */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPRI2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI2_t__ */ + +/*@}*/ + +/** @defgroup INTPRI3 IRQ12..15 Priority (INTPRI3) Register + * IRQ12..15 Priority (INTPRI3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPRI3_Struct + *! \brief IRQ12..15 Priority Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI3_t__ +typedef struct _ADI_NVIC_INTPRI3_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ12..15 Priority */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPRI3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI3_t__ */ + +/*@}*/ + +/** @defgroup INTPRI4 IRQ16..19 Priority (INTPRI4) Register + * IRQ16..19 Priority (INTPRI4) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPRI4_Struct + *! \brief IRQ16..19 Priority Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI4_t__ +typedef struct _ADI_NVIC_INTPRI4_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ16..19 Priority */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPRI4_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI4_t__ */ + +/*@}*/ + +/** @defgroup INTPRI5 IRQ20..23 Priority (INTPRI5) Register + * IRQ20..23 Priority (INTPRI5) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPRI5_Struct + *! \brief IRQ20..23 Priority Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI5_t__ +typedef struct _ADI_NVIC_INTPRI5_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ20..23 Priority */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPRI5_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI5_t__ */ + +/*@}*/ + +/** @defgroup INTPRI6 IRQ24..27 Priority (INTPRI6) Register + * IRQ24..27 Priority (INTPRI6) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPRI6_Struct + *! \brief IRQ24..27 Priority Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI6_t__ +typedef struct _ADI_NVIC_INTPRI6_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ24..27 Priority */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPRI6_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI6_t__ */ + +/*@}*/ + +/** @defgroup INTPRI7 IRQ28..31 Priority (INTPRI7) Register + * IRQ28..31 Priority (INTPRI7) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPRI7_Struct + *! \brief IRQ28..31 Priority Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI7_t__ +typedef struct _ADI_NVIC_INTPRI7_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ28..31 Priority */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPRI7_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI7_t__ */ + +/*@}*/ + +/** @defgroup INTPRI8 IRQ32..35 Priority (INTPRI8) Register + * IRQ32..35 Priority (INTPRI8) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPRI8_Struct + *! \brief IRQ32..35 Priority Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI8_t__ +typedef struct _ADI_NVIC_INTPRI8_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ32..35 Priority */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPRI8_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI8_t__ */ + +/*@}*/ + +/** @defgroup INTPRI9 IRQ36..39 Priority (INTPRI9) Register + * IRQ36..39 Priority (INTPRI9) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPRI9_Struct + *! \brief IRQ36..39 Priority Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI9_t__ +typedef struct _ADI_NVIC_INTPRI9_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ36..39 Priority */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPRI9_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI9_t__ */ + +/*@}*/ + +/** @defgroup INTPRI10 IRQ40..43 Priority (INTPRI10) Register + * IRQ40..43 Priority (INTPRI10) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPRI10_Struct + *! \brief IRQ40..43 Priority Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI10_t__ +typedef struct _ADI_NVIC_INTPRI10_t { + union { + struct { + unsigned int VALUE : 32; /**< IRQ40..43 Priority */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPRI10_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPRI10_t__ */ + +/*@}*/ + +/** @defgroup INTCPID CPUID Base (INTCPID) Register + * CPUID Base (INTCPID) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTCPID_Struct + *! \brief CPUID Base Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTCPID_t__ +typedef struct _ADI_NVIC_INTCPID_t { + union { + struct { + unsigned int VALUE : 32; /**< CPUID Base */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTCPID_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTCPID_t__ */ + +/*@}*/ + +/** @defgroup INTSTA Interrupt Control State (INTSTA) Register + * Interrupt Control State (INTSTA) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTSTA_Struct + *! \brief Interrupt Control State Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTSTA_t__ +typedef struct _ADI_NVIC_INTSTA_t { + union { + struct { + unsigned int VALUE : 32; /**< Interrupt Control State */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTSTA_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTSTA_t__ */ + +/*@}*/ + +/** @defgroup INTVEC Vector Table Offset (INTVEC) Register + * Vector Table Offset (INTVEC) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTVEC_Struct + *! \brief Vector Table Offset Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTVEC_t__ +typedef struct _ADI_NVIC_INTVEC_t { + union { + struct { + unsigned int VALUE : 32; /**< Vector Table Offset */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTVEC_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTVEC_t__ */ + +/*@}*/ + +/** @defgroup INTAIRC Application Interrupt/Reset Control (INTAIRC) Register + * Application Interrupt/Reset Control (INTAIRC) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTAIRC_Struct + *! \brief Application Interrupt/Reset Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTAIRC_t__ +typedef struct _ADI_NVIC_INTAIRC_t { + union { + struct { + unsigned int VALUE : 32; /**< Application Interrupt/Reset Control */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTAIRC_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTAIRC_t__ */ + +/*@}*/ + +/** @defgroup INTCON0 System Control (INTCON0) Register + * System Control (INTCON0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTCON0_Struct + *! \brief System Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTCON0_t__ +typedef struct _ADI_NVIC_INTCON0_t { + union { + struct { + unsigned int reserved0 : 1; + unsigned int SLEEPONEXIT : 1; /**< Sleeps the core on exit from an ISR */ + unsigned int SLEEPDEEP : 1; /**< deep sleep flag for HIBERNATE mode */ + unsigned int reserved3 : 13; + }; + uint16_t VALUE16; + }; +} ADI_NVIC_INTCON0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTCON0_t__ */ + +/*@}*/ + +/** @defgroup INTCON1 Configuration Control (INTCON1) Register + * Configuration Control (INTCON1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTCON1_Struct + *! \brief Configuration Control Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTCON1_t__ +typedef struct _ADI_NVIC_INTCON1_t { + union { + struct { + unsigned int VALUE : 32; /**< Configuration Control */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTCON1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTCON1_t__ */ + +/*@}*/ + +/** @defgroup INTSHPRIO0 System Handlers 4-7 Priority (INTSHPRIO0) Register + * System Handlers 4-7 Priority (INTSHPRIO0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTSHPRIO0_Struct + *! \brief System Handlers 4-7 Priority Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTSHPRIO0_t__ +typedef struct _ADI_NVIC_INTSHPRIO0_t { + union { + struct { + unsigned int VALUE : 32; /**< System Handlers 4-7 Priority */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTSHPRIO0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTSHPRIO0_t__ */ + +/*@}*/ + +/** @defgroup INTSHPRIO1 System Handlers 8-11 Priority (INTSHPRIO1) Register + * System Handlers 8-11 Priority (INTSHPRIO1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTSHPRIO1_Struct + *! \brief System Handlers 8-11 Priority Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTSHPRIO1_t__ +typedef struct _ADI_NVIC_INTSHPRIO1_t { + union { + struct { + unsigned int VALUE : 32; /**< System Handlers 8-11 Priority */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTSHPRIO1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTSHPRIO1_t__ */ + +/*@}*/ + +/** @defgroup INTSHPRIO3 System Handlers 12-15 Priority (INTSHPRIO3) Register + * System Handlers 12-15 Priority (INTSHPRIO3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTSHPRIO3_Struct + *! \brief System Handlers 12-15 Priority Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTSHPRIO3_t__ +typedef struct _ADI_NVIC_INTSHPRIO3_t { + union { + struct { + unsigned int VALUE : 32; /**< System Handlers 12-15 Priority */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTSHPRIO3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTSHPRIO3_t__ */ + +/*@}*/ + +/** @defgroup INTSHCSR System Handler Control and State (INTSHCSR) Register + * System Handler Control and State (INTSHCSR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTSHCSR_Struct + *! \brief System Handler Control and State Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTSHCSR_t__ +typedef struct _ADI_NVIC_INTSHCSR_t { + union { + struct { + unsigned int VALUE : 32; /**< System Handler Control and State */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTSHCSR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTSHCSR_t__ */ + +/*@}*/ + +/** @defgroup INTCFSR Configurable Fault Status (INTCFSR) Register + * Configurable Fault Status (INTCFSR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTCFSR_Struct + *! \brief Configurable Fault Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTCFSR_t__ +typedef struct _ADI_NVIC_INTCFSR_t { + union { + struct { + unsigned int VALUE : 32; /**< Configurable Fault Status */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTCFSR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTCFSR_t__ */ + +/*@}*/ + +/** @defgroup INTHFSR Hard Fault Status (INTHFSR) Register + * Hard Fault Status (INTHFSR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTHFSR_Struct + *! \brief Hard Fault Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTHFSR_t__ +typedef struct _ADI_NVIC_INTHFSR_t { + union { + struct { + unsigned int VALUE : 32; /**< Hard Fault Status */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTHFSR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTHFSR_t__ */ + +/*@}*/ + +/** @defgroup INTDFSR Debug Fault Status (INTDFSR) Register + * Debug Fault Status (INTDFSR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTDFSR_Struct + *! \brief Debug Fault Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTDFSR_t__ +typedef struct _ADI_NVIC_INTDFSR_t { + union { + struct { + unsigned int VALUE : 32; /**< Debug Fault Status */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTDFSR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTDFSR_t__ */ + +/*@}*/ + +/** @defgroup INTMMAR Mem Manage Address (INTMMAR) Register + * Mem Manage Address (INTMMAR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTMMAR_Struct + *! \brief Mem Manage Address Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTMMAR_t__ +typedef struct _ADI_NVIC_INTMMAR_t { + union { + struct { + unsigned int VALUE : 32; /**< Mem Manage Address */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTMMAR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTMMAR_t__ */ + +/*@}*/ + +/** @defgroup INTBFAR Bus Fault Address (INTBFAR) Register + * Bus Fault Address (INTBFAR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTBFAR_Struct + *! \brief Bus Fault Address Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTBFAR_t__ +typedef struct _ADI_NVIC_INTBFAR_t { + union { + struct { + unsigned int VALUE : 32; /**< Bus Fault Address */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTBFAR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTBFAR_t__ */ + +/*@}*/ + +/** @defgroup INTAFSR Auxiliary Fault Status (INTAFSR) Register + * Auxiliary Fault Status (INTAFSR) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTAFSR_Struct + *! \brief Auxiliary Fault Status Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTAFSR_t__ +typedef struct _ADI_NVIC_INTAFSR_t { + union { + struct { + unsigned int VALUE : 32; /**< Auxiliary Fault Status */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTAFSR_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTAFSR_t__ */ + +/*@}*/ + +/** @defgroup INTPFR0 Processor Feature Register 0 (INTPFR0) Register + * Processor Feature Register 0 (INTPFR0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPFR0_Struct + *! \brief Processor Feature Register 0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPFR0_t__ +typedef struct _ADI_NVIC_INTPFR0_t { + union { + struct { + unsigned int VALUE : 32; /**< Processor Feature Register 0 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPFR0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPFR0_t__ */ + +/*@}*/ + +/** @defgroup INTPFR1 Processor Feature Register 1 (INTPFR1) Register + * Processor Feature Register 1 (INTPFR1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPFR1_Struct + *! \brief Processor Feature Register 1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPFR1_t__ +typedef struct _ADI_NVIC_INTPFR1_t { + union { + struct { + unsigned int VALUE : 32; /**< Processor Feature Register 1 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPFR1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPFR1_t__ */ + +/*@}*/ + +/** @defgroup INTDFR0 Debug Feature Register 0 (INTDFR0) Register + * Debug Feature Register 0 (INTDFR0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTDFR0_Struct + *! \brief Debug Feature Register 0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTDFR0_t__ +typedef struct _ADI_NVIC_INTDFR0_t { + union { + struct { + unsigned int VALUE : 32; /**< Debug Feature Register 0 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTDFR0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTDFR0_t__ */ + +/*@}*/ + +/** @defgroup INTAFR0 Auxiliary Feature Register 0 (INTAFR0) Register + * Auxiliary Feature Register 0 (INTAFR0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTAFR0_Struct + *! \brief Auxiliary Feature Register 0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTAFR0_t__ +typedef struct _ADI_NVIC_INTAFR0_t { + union { + struct { + unsigned int VALUE : 32; /**< Auxiliary Feature Register 0 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTAFR0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTAFR0_t__ */ + +/*@}*/ + +/** @defgroup INTMMFR0 Memory Model Feature Register 0 (INTMMFR0) Register + * Memory Model Feature Register 0 (INTMMFR0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTMMFR0_Struct + *! \brief Memory Model Feature Register 0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTMMFR0_t__ +typedef struct _ADI_NVIC_INTMMFR0_t { + union { + struct { + unsigned int VALUE : 32; /**< Memory Model Feature Register 0 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTMMFR0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTMMFR0_t__ */ + +/*@}*/ + +/** @defgroup INTMMFR1 Memory Model Feature Register 1 (INTMMFR1) Register + * Memory Model Feature Register 1 (INTMMFR1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTMMFR1_Struct + *! \brief Memory Model Feature Register 1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTMMFR1_t__ +typedef struct _ADI_NVIC_INTMMFR1_t { + union { + struct { + unsigned int VALUE : 32; /**< Memory Model Feature Register 1 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTMMFR1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTMMFR1_t__ */ + +/*@}*/ + +/** @defgroup INTMMFR2 Memory Model Feature Register 2 (INTMMFR2) Register + * Memory Model Feature Register 2 (INTMMFR2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTMMFR2_Struct + *! \brief Memory Model Feature Register 2 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTMMFR2_t__ +typedef struct _ADI_NVIC_INTMMFR2_t { + union { + struct { + unsigned int VALUE : 32; /**< Memory Model Feature Register 2 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTMMFR2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTMMFR2_t__ */ + +/*@}*/ + +/** @defgroup INTMMFR3 Memory Model Feature Register 3 (INTMMFR3) Register + * Memory Model Feature Register 3 (INTMMFR3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTMMFR3_Struct + *! \brief Memory Model Feature Register 3 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTMMFR3_t__ +typedef struct _ADI_NVIC_INTMMFR3_t { + union { + struct { + unsigned int VALUE : 32; /**< Memory Model Feature Register 3 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTMMFR3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTMMFR3_t__ */ + +/*@}*/ + +/** @defgroup INTISAR0 ISA Feature Register 0 (INTISAR0) Register + * ISA Feature Register 0 (INTISAR0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTISAR0_Struct + *! \brief ISA Feature Register 0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTISAR0_t__ +typedef struct _ADI_NVIC_INTISAR0_t { + union { + struct { + unsigned int VALUE : 32; /**< ISA Feature Register 0 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTISAR0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTISAR0_t__ */ + +/*@}*/ + +/** @defgroup INTISAR1 ISA Feature Register 1 (INTISAR1) Register + * ISA Feature Register 1 (INTISAR1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTISAR1_Struct + *! \brief ISA Feature Register 1 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTISAR1_t__ +typedef struct _ADI_NVIC_INTISAR1_t { + union { + struct { + unsigned int VALUE : 32; /**< ISA Feature Register 1 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTISAR1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTISAR1_t__ */ + +/*@}*/ + +/** @defgroup INTISAR2 ISA Feature Register 2 (INTISAR2) Register + * ISA Feature Register 2 (INTISAR2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTISAR2_Struct + *! \brief ISA Feature Register 2 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTISAR2_t__ +typedef struct _ADI_NVIC_INTISAR2_t { + union { + struct { + unsigned int VALUE : 32; /**< ISA Feature Register 2 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTISAR2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTISAR2_t__ */ + +/*@}*/ + +/** @defgroup INTISAR3 ISA Feature Register 3 (INTISAR3) Register + * ISA Feature Register 3 (INTISAR3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTISAR3_Struct + *! \brief ISA Feature Register 3 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTISAR3_t__ +typedef struct _ADI_NVIC_INTISAR3_t { + union { + struct { + unsigned int VALUE : 32; /**< ISA Feature Register 3 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTISAR3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTISAR3_t__ */ + +/*@}*/ + +/** @defgroup INTISAR4 ISA Feature Register 4 (INTISAR4) Register + * ISA Feature Register 4 (INTISAR4) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTISAR4_Struct + *! \brief ISA Feature Register 4 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTISAR4_t__ +typedef struct _ADI_NVIC_INTISAR4_t { + union { + struct { + unsigned int VALUE : 32; /**< ISA Feature Register 4 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTISAR4_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTISAR4_t__ */ + +/*@}*/ + +/** @defgroup INTTRGI Software Trigger Interrupt Register (INTTRGI) Register + * Software Trigger Interrupt Register (INTTRGI) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTTRGI_Struct + *! \brief Software Trigger Interrupt Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTTRGI_t__ +typedef struct _ADI_NVIC_INTTRGI_t { + union { + struct { + unsigned int VALUE : 32; /**< Software Trigger Interrupt Register */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTTRGI_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTTRGI_t__ */ + +/*@}*/ + +/** @defgroup INTPID4 Peripheral Identification Register 4 (INTPID4) Register + * Peripheral Identification Register 4 (INTPID4) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPID4_Struct + *! \brief Peripheral Identification Register 4 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPID4_t__ +typedef struct _ADI_NVIC_INTPID4_t { + union { + struct { + unsigned int VALUE : 32; /**< Peripheral Identification Register 4 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPID4_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPID4_t__ */ + +/*@}*/ + +/** @defgroup INTPID5 Peripheral Identification Register 5 (INTPID5) Register + * Peripheral Identification Register 5 (INTPID5) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPID5_Struct + *! \brief Peripheral Identification Register 5 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPID5_t__ +typedef struct _ADI_NVIC_INTPID5_t { + union { + struct { + unsigned int VALUE : 32; /**< Peripheral Identification Register 5 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPID5_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPID5_t__ */ + +/*@}*/ + +/** @defgroup INTPID6 Peripheral Identification Register 6 (INTPID6) Register + * Peripheral Identification Register 6 (INTPID6) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPID6_Struct + *! \brief Peripheral Identification Register 6 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPID6_t__ +typedef struct _ADI_NVIC_INTPID6_t { + union { + struct { + unsigned int VALUE : 32; /**< Peripheral Identification Register 6 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPID6_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPID6_t__ */ + +/*@}*/ + +/** @defgroup INTPID7 Peripheral Identification Register 7 (INTPID7) Register + * Peripheral Identification Register 7 (INTPID7) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPID7_Struct + *! \brief Peripheral Identification Register 7 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPID7_t__ +typedef struct _ADI_NVIC_INTPID7_t { + union { + struct { + unsigned int VALUE : 32; /**< Peripheral Identification Register 7 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPID7_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPID7_t__ */ + +/*@}*/ + +/** @defgroup INTPID0 Peripheral Identification Bits7:0 (INTPID0) Register + * Peripheral Identification Bits7:0 (INTPID0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPID0_Struct + *! \brief Peripheral Identification Bits7:0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPID0_t__ +typedef struct _ADI_NVIC_INTPID0_t { + union { + struct { + unsigned int VALUE : 32; /**< Peripheral Identification Bits7:0 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPID0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPID0_t__ */ + +/*@}*/ + +/** @defgroup INTPID1 Peripheral Identification Bits15:8 (INTPID1) Register + * Peripheral Identification Bits15:8 (INTPID1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPID1_Struct + *! \brief Peripheral Identification Bits15:8 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPID1_t__ +typedef struct _ADI_NVIC_INTPID1_t { + union { + struct { + unsigned int VALUE : 32; /**< Peripheral Identification Bits15:8 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPID1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPID1_t__ */ + +/*@}*/ + +/** @defgroup INTPID2 Peripheral Identification Bits16:23 (INTPID2) Register + * Peripheral Identification Bits16:23 (INTPID2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPID2_Struct + *! \brief Peripheral Identification Bits16:23 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPID2_t__ +typedef struct _ADI_NVIC_INTPID2_t { + union { + struct { + unsigned int VALUE : 32; /**< Peripheral Identification Bits16:23 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPID2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPID2_t__ */ + +/*@}*/ + +/** @defgroup INTPID3 Peripheral Identification Bits24:31 (INTPID3) Register + * Peripheral Identification Bits24:31 (INTPID3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTPID3_Struct + *! \brief Peripheral Identification Bits24:31 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTPID3_t__ +typedef struct _ADI_NVIC_INTPID3_t { + union { + struct { + unsigned int VALUE : 32; /**< Peripheral Identification Bits24:31 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTPID3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTPID3_t__ */ + +/*@}*/ + +/** @defgroup INTCID0 Component Identification Bits7:0 (INTCID0) Register + * Component Identification Bits7:0 (INTCID0) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTCID0_Struct + *! \brief Component Identification Bits7:0 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTCID0_t__ +typedef struct _ADI_NVIC_INTCID0_t { + union { + struct { + unsigned int VALUE : 32; /**< Component Identification Bits7:0 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTCID0_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTCID0_t__ */ + +/*@}*/ + +/** @defgroup INTCID1 Component Identification Bits15:8 (INTCID1) Register + * Component Identification Bits15:8 (INTCID1) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTCID1_Struct + *! \brief Component Identification Bits15:8 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTCID1_t__ +typedef struct _ADI_NVIC_INTCID1_t { + union { + struct { + unsigned int VALUE : 32; /**< Component Identification Bits15:8 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTCID1_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTCID1_t__ */ + +/*@}*/ + +/** @defgroup INTCID2 Component Identification Bits16:23 (INTCID2) Register + * Component Identification Bits16:23 (INTCID2) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTCID2_Struct + *! \brief Component Identification Bits16:23 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTCID2_t__ +typedef struct _ADI_NVIC_INTCID2_t { + union { + struct { + unsigned int VALUE : 32; /**< Component Identification Bits16:23 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTCID2_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTCID2_t__ */ + +/*@}*/ + +/** @defgroup INTCID3 Component Identification Bits24:31 (INTCID3) Register + * Component Identification Bits24:31 (INTCID3) Register. + * @{ + */ + +/* ========================================================================== + *! \struct ADI_NVIC_INTCID3_Struct + *! \brief Component Identification Bits24:31 Register bit field structure + * ========================================================================== */ +#ifndef __ADI_NO_DECL_STRUCT_ADI_NVIC_INTCID3_t__ +typedef struct _ADI_NVIC_INTCID3_t { + union { + struct { + unsigned int VALUE : 32; /**< Component Identification Bits24:31 */ + }; + uint32_t VALUE32; + }; +} ADI_NVIC_INTCID3_t; +#endif /* !__ADI_NO_DECL_STRUCT_ADI_NVIC_INTCID3_t__ */ + +/*@}*/ + + +#if defined (_MISRA_RULES) +#pragma diag(pop) +#endif /* _MISRA_RULES */ + + +#if defined (__CC_ARM) +#pragma pop +#endif + +#endif diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_cio_macros.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_cio_macros.h new file mode 100755 index 0000000000..45f235b44b --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/adi_cio_macros.h @@ -0,0 +1,50 @@ +/* +** adi_cio_macros.h +** +** Copyright (C) 2016 Analog Devices, Inc. All Rights Reserved. +** +*/ + +#ifndef _ADI_CIO_MACROS_H +#define _ADI_CIO_MACROS_H + +/* + * Macro definitions in adi_ADuCM4*50_cdef.h and the struct definitions + * in adi_ADuCM4*50_device.h use macros "__I __C", "__O" and "__IO" to + * represent read-only, write-only and read/write register attributes. + * + * The core_cm4.h include file will define macros __I, __O and __IO as below + * but it does not define __C. + * + * The __C macro is defined to nothing here. The __C macro is intended for + * the proprietary compilers in CCES to avoid MISRA Rule 19.4 errors regarding + * permitted macro expansions. The iccarm.exe MISRA checking does not fault + * the combined "volatile const" __I macro so __C is not required. + * + * Each of the macro defines is guarded by a #ifndef check to allow them + * to be redefined if required. + * + * Workaround for 01-00-0757 / 01-00-0759 + */ + +#ifndef __I + #ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ + #else + #define __I volatile const /*!< Defines 'read only' permissions */ + #endif +#endif + +#ifndef __O + #define __O volatile /*!< Defines 'write only' permissions */ +#endif + +#ifndef __IO + #define __IO volatile /*!< Defines 'read / write' permissions */ +#endif + +#ifndef __C + #define __C /*nothing*/ +#endif + +#endif /* _ADI_CIO_MACROS_H */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/platform.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/platform.h new file mode 100755 index 0000000000..c21be7b293 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/sys/platform.h @@ -0,0 +1,56 @@ +/*! + ***************************************************************************** + * @file: platform.h + * @brief: Include appropriate architecture definitions. + *----------------------------------------------------------------------------- + * +Copyright (c) 2010-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ +#ifndef __ADI_SYS_PLATFORM_H__ +#define __ADI_SYS_PLATFORM_H__ + +/* Include the ADI cdef header for the selected target. */ + +#if defined(__ADUCM4050__) +#include +#else +#error not configured for this target. +#endif + +#endif /* __ADI_SYS_PLATFORM_H__ */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/system_ADuCM4050.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/system_ADuCM4050.h new file mode 100755 index 0000000000..5bde78d691 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/system_ADuCM4050.h @@ -0,0 +1,159 @@ +/*! + ***************************************************************************** + * @file: system_ADuCM4050.h + * @brief: CMSIS Cortex-M4 Device Peripheral Access Layer Header File + * for ADuCM4050 + * @version V3.10 + * @date 23. November 2012 + * + * @note Modified September 21 2016 Analog Devices +******************************************************************************/ +/* Copyright (c) 2012 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#ifndef SYSTEM_ADUCM4050_H +#define SYSTEM_ADUCM4050_H + +#include /* for 'NULL' */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +extern uint32_t SystemCoreClock; /* System Clock Frequency (Core Clock) */ + +#if defined (__ICCARM__) +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm011 (rule 6.3): Types which specify sign and size should be used +* We use bool which is accepted by MISRA but the toolchain does not accept it +* +*/ +#pragma diag_suppress=Pm011 + +#endif + +/*! \addtogroup SYS_Driver System Interfaces + * @{ + * System global interfaces and CMSIS required variables + */ + +/*! System API function return codes */ +typedef enum +{ + ADI_SYS_SUCCESS = 0, /*!< No error detected. */ + ADI_SYS_FAILURE, /*!< The API call failed. */ +} ADI_SYS_RESULT; + + +/*! \cond PRIVATE */ +/* System clock constant */ +#define __HFOSC 26000000u + +/* System clock constant (may also be 16000000) */ +#define __HFXTAL 26000000u + + /*System clock constant (same whether internal osc or external xtal) */ +#define __LFCLK 32768u + + /*Selecting HFOSC as input for generating root clock*/ +#define HFMUX_INTERNAL_OSC_VAL (0u << BITP_CLKG_CLK_CTL0_CLKMUX) + + /*Selecting HFXTAL as input for generating root clock*/ +#define HFMUX_EXTERNAL_XTAL_VAL (1u << BITP_CLKG_CLK_CTL0_CLKMUX) + + /*Selecting SPLL as input for generating root clock*/ +#define HFMUX_SYSTEM_SPLL_VAL (2u << BITP_CLKG_CLK_CTL0_CLKMUX) + + /*Selecting GPIO as input for generating root clock*/ +#define HFMUX_GPIO_VAL (3u << BITP_CLKG_CLK_CTL0_CLKMUX) + +/*! Cache controller key */ +#define CACHE_CONTROLLER_KEY 0xF123F456u +/*! Power key */ +#define PWRKEY_VALUE_KEY 0x4859u + +/** + * Security options + */ +typedef struct { + const uint32_t ReadProtectKeyHash[4]; + const uint32_t CrcOfReadProtectKeyHash; + const uint32_t LastCRCPage; + const uint32_t InCircuitWriteProtectCode; + const uint32_t FlashBlockWriteProtect; + +} ADI_ADUCM4X50_SECURITY_OPTIONS; + +/*! \endcond*/ + +/** + * SRAM banks + */ +typedef uint32_t ADI_SRAM_BANK; + +/*! SRAM_BANK_0 */ +#define ADI_SRAM_BANK_0 (1u << 0) +/*! SRAM_BANK_1 */ +#define ADI_SRAM_BANK_1 (1u << 1) +/*! SRAM_BANK_2 */ +#define ADI_SRAM_BANK_2 (1u << 2) +/*! SRAM_BANK_3 */ +#define ADI_SRAM_BANK_3 (1u << 3) +/*! SRAM_BANK_4 */ +#define ADI_SRAM_BANK_4 (1u << 4) +/*! SRAM_BANK_5 */ +#define ADI_SRAM_BANK_5 (1u << 5) +/*! SRAM_BANK_6 */ +#define ADI_SRAM_BANK_6 (1u << 6) +/*! SRAM_BANK_7 */ +#define ADI_SRAM_BANK_7 (1u << 7) + +extern void SystemInit(void); +extern void SystemCoreClockUpdate(void); +void adi_system_EnableCache(bool bEnable); +ADI_SYS_RESULT adi_system_EnableRetention(ADI_SRAM_BANK eBank, bool bEnable); +void adi_system_EnableISRAM(bool bEnable); + +#if defined (__ICCARM__) +#pragma diag_default=Pm011 +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* SYSTEM_ADUCM4050_H */ + +/*@}*/ +/* +** EOF +*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/tmr/adi_tmr.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/tmr/adi_tmr.c new file mode 100755 index 0000000000..b7153b79a8 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/tmr/adi_tmr.c @@ -0,0 +1,611 @@ +/*! ***************************************************************************** + * @file adi_tmr.c + * @brief GP and RGB timer device driver implementation + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm011 (rule 6.3): the basic types of char, int, short, long, float, and double should not be used +* Necessary for stdbool. +* +* Pm073 (rule 14.7): a function should have a single point of exit +* Pm143 (rule 14.7): a function should have a single point of exit at the end of the function +* Multiple returns are used for error handling. +* +* Pm123 (rule 8.5): there shall be no definition of objects or functions in a header file +* Static configuration data file is included. +* +* Pm140 (Rule 11.4): a cast should not be performed between a pointer type and an integral type +* This violation appears when deferencing the pointer to the register typedef. No way around this. +* +* Pm141 (Rule 11.4): a cast should not be performed between a pointer to object type and a different pointer to object type +* The pointer casting is necessary to allow the GP and RGB timers to abstracted into one driver. This has been approved by the PO. +*/ +#pragma diag_suppress=Pm011,Pm073,Pm123,Pm140,Pm141,Pm143 +#endif /* __ICCARM__ */ + + +/** @addtogroup TMR_Driver Timer Driver + * @{ + * @brief General Purpose and RGB Timer Driver + * @details The timer driver controls the timer period, event capture, and + * pulse width modulation (PWM) features of the General Purpose (GP) Timers and + * the RGB Timer. + * @note The application must include drivers/tmr/adi_tmr.h to use this driver + */ + +#include +#include +#include +#include + +/* Static configuration data */ +#if ADI_TIMER_ENABLE_STATIC_CONFIG_SUPPORT == 1u +#include "adi_tmr_data.c" +#endif + + +/* In adi_tmr_ConfigPwm, the bit positions for just PWM0 are used for PWM1 and PWM2 to simplify the code. Check here to make sure this is safe. */ +#if BITP_TMR_RGB_PWM0CTL_IDLESTATE != BITP_TMR_RGB_PWM1CTL_IDLESTATE +#error "Bit positions for PWM0 and PWM1 do not match. Fix adi_tmr_ConfigPwm." +#endif +#if BITP_TMR_RGB_PWM0CTL_IDLESTATE != BITP_TMR_RGB_PWM2CTL_IDLESTATE +#error "Bit positions for PWM0 and PWM2 do not match. Fix adi_tmr_ConfigPwm." +#endif +#if BITP_TMR_RGB_PWM0CTL_MATCH != BITP_TMR_RGB_PWM1CTL_MATCH +#error "Bit positions for PWM0 and PWM1 do not match. Fix adi_tmr_ConfigPwm." +#endif +#if BITP_TMR_RGB_PWM0CTL_MATCH != BITP_TMR_RGB_PWM2CTL_MATCH +#error "Bit positions for PWM0 and PWM2 do not match. Fix adi_tmr_ConfigPwm." +#endif + +/*! Number of events that can be captured */ +#define ADI_TMR_NUM_EVENTS (40u) + +/*! \cond PRIVATE */ + +/* Since the RGB typedef is a superset of the GP typedef, treat the GP timers as RGB timers and restrict top register access */ +static ADI_TMR_RGB_TypeDef * adi_tmr_registers[ADI_TMR_DEVICE_NUM] = {(ADI_TMR_RGB_TypeDef *) pADI_TMR0, (ADI_TMR_RGB_TypeDef *) pADI_TMR1, (ADI_TMR_RGB_TypeDef *) pADI_TMR2, pADI_TMR_RGB}; + +/* Interrupt enums */ +static const IRQn_Type adi_tmr_interrupt[ADI_TMR_DEVICE_NUM] = {TMR0_EVT_IRQn, TMR1_EVT_IRQn, TMR2_EVT_IRQn, TMR_RGB_EVT_IRQn}; + +/* Private data that the driver needs to retain between function calls */ +static ADI_CALLBACK adi_tmr_callbacks[ADI_TMR_DEVICE_NUM]; +static void * adi_tmr_parameters[ADI_TMR_DEVICE_NUM]; + +static ADI_TMR_RESULT WaitForStatusBit (ADI_TMR_DEVICE const eDevice, uint16_t nBusyBit); +static void CommonIntHandler (ADI_TMR_DEVICE const eDevice); + void GP_Tmr0_Int_Handler(void); + void GP_Tmr1_Int_Handler(void); + void GP_Tmr2_Int_Handler(void); + void RGB_Tmr_Int_Handler(void); + +/*! \endcond */ + + +/********************************************************************************* + API IMPLEMENTATIONS +*********************************************************************************/ + + +/*! + * @brief Initialize GP or RGB Timer + * + * @details Setup callback function, device interrupt, and perform static configuration (if applicable). + * + * @note This function can only be called when the timer is disabled. This function should be called + * before any other functions are called. + * + * @param [in] eDevice : Device number + * + * @param [in] pfCallback : Callback function + * + * @param [in] pCBParam : Callback function parameter + * + * @param [in] bEnableInt : True to enable the device interrupt, false to disable it + * + * @return ADI_TMR_RESULT + * - #ADI_TMR_BAD_DEVICE_NUM [D] Invalid eDevice parameter supplied + * - #ADI_TMR_OPERATION_NOT_ALLOWED [D] Timer is currently running + * - #ADI_TMR_SUCCESS Function call completed successfully + * + */ +ADI_TMR_RESULT adi_tmr_Init(ADI_TMR_DEVICE const eDevice, ADI_CALLBACK const pfCallback, void * const pCBParam, bool bEnableInt) { +#ifdef ADI_DEBUG + /* IF(Bad device input parameter) */ + if (eDevice >= ADI_TMR_DEVICE_NUM) { + return ADI_TMR_BAD_DEVICE_NUM; + } /* ENDIF */ + /* IF(The timer is already running) */ + if ((adi_tmr_registers[eDevice]->CTL & BITM_TMR_RGB_CTL_EN) == BITM_TMR_RGB_CTL_EN) { + return ADI_TMR_OPERATION_NOT_ALLOWED; + } /* ENDIF */ +#endif + /* Setup the callback function */ + adi_tmr_callbacks [eDevice] = pfCallback; + adi_tmr_parameters[eDevice] = pCBParam; + + /* IF(Enable interrupt) */ + if (bEnableInt == true) { + NVIC_EnableIRQ(adi_tmr_interrupt[eDevice]); + /* ELSE(Disable interrupt) */ + } else { + NVIC_DisableIRQ(adi_tmr_interrupt[eDevice]); + } /* ENDIF */ + + /* Static configuration */ +#if ADI_TIMER_ENABLE_STATIC_CONFIG_SUPPORT == 1u + adi_tmr_registers[eDevice]->CTL = aTimerCtlConfig [eDevice]; + adi_tmr_registers[eDevice]->LOAD = aTimerLoadConfig [eDevice]; + adi_tmr_registers[eDevice]->ALOAD = aTimerALoadConfig [eDevice]; + adi_tmr_registers[eDevice]->EVENTSELECT = aTimerEventConfig [eDevice]; + adi_tmr_registers[eDevice]->PWM0CTL = aTimerPwmCtlConfig [eDevice]; + adi_tmr_registers[eDevice]->PWM0MATCH = aTimerPwmMatchConfig[eDevice]; + + /* IF(Initializing the RGB timer, there are 2 other PWM outputs to configure) */ + if (eDevice == ADI_TMR_DEVICE_RGB) { + /* The array is bumped by 1 to get to the 5th entry in the static config array, which contains RGB PWM1 */ + adi_tmr_registers[eDevice]->PWM1CTL = aTimerPwmCtlConfig [eDevice+1u]; + adi_tmr_registers[eDevice]->PWM1MATCH = aTimerPwmMatchConfig[eDevice+1u]; + /* The array is bumped by 2 to get to the 6th entry in the static config array, which contains RGB PWM2 */ + adi_tmr_registers[eDevice]->PWM2CTL = aTimerPwmCtlConfig [eDevice+2u]; + adi_tmr_registers[eDevice]->PWM2MATCH = aTimerPwmMatchConfig[eDevice+2u]; + } /* ENDIF */ +#endif + + return ADI_TMR_SUCCESS; +} + + +/*! + * @brief Configure GP or RGB Timer + * + * @details Configure the basic hardware timer parameters. + * + * @note This function can only be called when the timer is disabled. + * + * @param [in] eDevice : Device number + * + * @param [in] timerConfig : Timer configuration structure, filled by user prior to function call + * + * @return ADI_TMR_RESULT + * - #ADI_TMR_BAD_DEVICE_NUM [D] Invalid eDevice parameter supplied + * - #ADI_TMR_BAD_RELOAD_CONFIGURATION [D] bPeriodic is false and bReloading is true + * - #ADI_TMR_OPERATION_NOT_ALLOWED [D] Timer is currently running + * - #ADI_TMR_DEVICE_BUSY Timer is busy processing a previous control register write + * - #ADI_TMR_SUCCESS Function call completed successfully + * + */ +ADI_TMR_RESULT adi_tmr_ConfigTimer(ADI_TMR_DEVICE const eDevice, ADI_TMR_CONFIG timerConfig) { + uint16_t nTemp; +#ifdef ADI_DEBUG + /* IF(Bad device input parameter) */ + if (eDevice >= ADI_TMR_DEVICE_NUM) { + return ADI_TMR_BAD_DEVICE_NUM; + } /* ENDIF */ + /* IF(Bad configuration, cannot enable reloading while in free running mode) */ + if ((timerConfig.bPeriodic == false) && (timerConfig.bReloading == true)) { + return ADI_TMR_BAD_RELOAD_CONFIGURATION; + } /* ENDIF */ + /* IF(The timer is already running) */ + if ((adi_tmr_registers[eDevice]->CTL & BITM_TMR_RGB_CTL_EN) == BITM_TMR_RGB_CTL_EN) { + return ADI_TMR_OPERATION_NOT_ALLOWED; + } /* ENDIF */ +#endif + /* Set the load registers */ + adi_tmr_registers[eDevice]->LOAD = timerConfig.nLoad; + adi_tmr_registers[eDevice]->ALOAD = timerConfig.nAsyncLoad; + + /* IF(Busy bit does not clear after waiting) */ + if (ADI_TMR_SUCCESS != WaitForStatusBit(eDevice, (uint16_t) BITM_TMR_RGB_STAT_BUSY)) { + return ADI_TMR_DEVICE_BUSY; + } /* ENDIF */ + + /* Read the control register and clear everything aside to the event capture bits, which are the only fields not set in this function */ + nTemp = adi_tmr_registers[eDevice]->CTL; + nTemp &= (uint16_t) (BITM_TMR_RGB_CTL_EVTEN | BITM_TMR_RGB_CTL_RSTEN); + + /* Setup the prescaler and the clock source */ + nTemp |= (uint16_t)(((uint16_t) timerConfig.ePrescaler ) << BITP_TMR_RGB_CTL_PRE); + nTemp |= (uint16_t)(((uint16_t) timerConfig.eClockSource) << BITP_TMR_RGB_CTL_CLK); + + /* IF(Periodic mode) */ + if (timerConfig.bPeriodic == true) { + nTemp |= (1u << BITP_TMR_RGB_CTL_MODE); + } /* ENDIF */ + + /* IF(Counting up) */ + if (timerConfig.bCountingUp == true) { + nTemp |= (1u << BITP_TMR_RGB_CTL_UP); + } /* ENDIF */ + + /* IF(Reloading is enabled) */ + if (timerConfig.bReloading == true) { + nTemp |= (1u << BITP_TMR_RGB_CTL_RLD); + } /* ENDIF */ + + /* IF(Sync bypass is enabled) */ + if (timerConfig.bSyncBypass == true) { + nTemp |= (1u << BITP_TMR_RGB_CTL_SYNCBYP); + } /* ENDIF */ + + /* Update the control register with the new configuration */ + adi_tmr_registers[eDevice]->CTL = nTemp; + + return ADI_TMR_SUCCESS; +} + + +/*! + * @brief Setup GP or RGB Timer Event Capture + * + * @details The timer can be configured to capture the timer value when a specific event occurs. The + * list of events can be found in the hardware reference manual. The callback function specified + * in #adi_tmr_Init will be supplied #ADI_TMR_EVENT_CAPTURE to indicate the event occured. The + * user can then read the captured value by calling #adi_tmr_GetCaptureCount. + * + * @note This function can only be called when the timer is disabled. + * + * @param [in] eDevice : Device number + * + * @param [in] eventConfig : Event configuration structure, filled by user prior to function call + * + * @return ADI_TMR_RESULT + * - #ADI_TMR_BAD_DEVICE_NUM [D] Invalid eDevice parameter supplied + * - #ADI_TMR_BAD_EVENT_ID [D] Event ID was not out of the valid range [0,#ADI_TMR_NUM_EVENTS] + * - #ADI_TMR_OPERATION_NOT_ALLOWED [D] Timer is currently running + * - #ADI_TMR_DEVICE_BUSY Timer is busy processing a previous control register write + * - #ADI_TMR_SUCCESS Function call completed successfully + * + */ +ADI_TMR_RESULT adi_tmr_ConfigEvent(ADI_TMR_DEVICE const eDevice, ADI_TMR_EVENT_CONFIG eventConfig) { +#ifdef ADI_DEBUG + /* IF(Bad device input parameter) */ + if (eDevice >= ADI_TMR_DEVICE_NUM) { + return ADI_TMR_BAD_DEVICE_NUM; + } /* ENDIF */ + /* IF(Bad event input parameter) */ + if (eventConfig.nEventID >= ADI_TMR_NUM_EVENTS) { + return ADI_TMR_BAD_EVENT_ID; + } /* ENDIF */ + /* IF(The timer is already running) */ + if ((adi_tmr_registers[eDevice]->CTL & BITM_TMR_RGB_CTL_EN) == BITM_TMR_RGB_CTL_EN) { + return ADI_TMR_OPERATION_NOT_ALLOWED; + } /* ENDIF */ +#endif + /* Set the event number */ + adi_tmr_registers[eDevice]->EVENTSELECT = (uint16_t) eventConfig.nEventID; + + /* IF(Busy bit does not clear after waiting) */ + if (ADI_TMR_SUCCESS != WaitForStatusBit(eDevice, (uint16_t) BITM_TMR_RGB_STAT_BUSY)) { + return ADI_TMR_DEVICE_BUSY; + } /* ENDIF */ + + /* Clear the event enable bit and keep the other bits */ + adi_tmr_registers[eDevice]->CTL &= (uint16_t) ~(BITM_TMR_RGB_CTL_EVTEN | BITM_TMR_RGB_CTL_RSTEN); + + /* IF(Turning event capture on) */ + if (eventConfig.bEnable == true) { + adi_tmr_registers[eDevice]->CTL |= (uint16_t) BITM_TMR_RGB_CTL_EVTEN; + } /* ENDIF */ + + /* IF(Enabling reset on event capture) */ + if (eventConfig.bPrescaleReset == true) { + adi_tmr_registers[eDevice]->CTL |= (uint16_t) BITM_TMR_RGB_CTL_RSTEN; + } /* ENDIF */ + + return ADI_TMR_SUCCESS; +} + + +/*! + * @brief Setup GP or RGB Timer Pulse Width Modulation + * + * @details The timer can be configured to generate a pulse width modulation output signal. + * The period of this signal is simply determined by the period of timer. The duty + * cycle will be 50% in toggle mode, or can be configured by the user for a different + * value using the match value. The pulse will toggle when the timer count matches + * the match value. The user can also specify the polarity of the signal by choosing + * if the signal idles low or high. GPIO muxing will be required to use the PWM output. + * + * @note This function can only be called when the timer is disabled. + * + * @param [in] eDevice : Device number + * + * @param [in] pwmConfig : PWM configuration structure, filled by user prior to function call + * + * @return ADI_TMR_RESULT + * - #ADI_TMR_BAD_DEVICE_NUM [D] Invalid eDevice parameter supplied + * - #ADI_TMR_OPERATION_NOT_ALLOWED [D] Timer is currently running + * - #ADI_TMR_BAD_PWM_NUM [D] Invalid eOutput parameter supplied + * - #ADI_TMR_SUCCESS Function call completed successfully + * + */ +ADI_TMR_RESULT adi_tmr_ConfigPwm(ADI_TMR_DEVICE const eDevice, ADI_TMR_PWM_CONFIG pwmConfig) { + uint16_t nControl = 0u; +#ifdef ADI_DEBUG + /* IF(Bad device input parameter) */ + if (eDevice >= ADI_TMR_DEVICE_NUM) { + return ADI_TMR_BAD_DEVICE_NUM; + } /* ENDIF */ + /* IF(The timer is already running) */ + if ((adi_tmr_registers[eDevice]->CTL & BITM_TMR_RGB_CTL_EN) == BITM_TMR_RGB_CTL_EN) { + return ADI_TMR_OPERATION_NOT_ALLOWED; + } /* ENDIF */ + /* IF(Bad PWM output and device combo OR bad PWM output) */ + if (((eDevice != ADI_TMR_DEVICE_RGB) && (pwmConfig.eOutput != ADI_TMR_PWM_OUTPUT_0)) || (pwmConfig.eOutput >= ADI_TMR_PWM_OUTPUT_NUM)) { + return ADI_TMR_BAD_PWM_NUM; + } /* ENDIF */ +#endif + /* IF(Idle high is set) */ + if (pwmConfig.bIdleHigh == true) { + nControl = (1u << ((uint16_t) BITP_TMR_RGB_PWM0CTL_IDLESTATE)); + } /* ENDIF */ + + /* IF(Match mode is enabled) */ + if (pwmConfig.bMatch == true) { + nControl |= (1u << ((uint16_t) BITP_TMR_RGB_PWM0CTL_MATCH)); + } /* ENDIF */ + + /* IF(PWM output 0) */ + if (pwmConfig.eOutput == ADI_TMR_PWM_OUTPUT_0) { + adi_tmr_registers[eDevice]->PWM0CTL = nControl; + adi_tmr_registers[eDevice]->PWM0MATCH = pwmConfig.nMatchValue; + /* IF(PWM output 1) */ + } else if (pwmConfig.eOutput == ADI_TMR_PWM_OUTPUT_1) { + adi_tmr_registers[eDevice]->PWM1CTL = nControl; + adi_tmr_registers[eDevice]->PWM1MATCH = pwmConfig.nMatchValue; + /* ELSE(PWM output 2) */ + } else { + adi_tmr_registers[eDevice]->PWM2CTL = nControl; + adi_tmr_registers[eDevice]->PWM2MATCH = pwmConfig.nMatchValue; + } /* ENDIF */ + + return ADI_TMR_SUCCESS; +} + + +/*! + * @brief Enable or Disable the GP or RGB Timer + * + * @details Start or stop the timer. + * + * @param [in] eDevice : Device number + * + * @param [in] bEnable : True to enable, false to disable + * + * @return ADI_TMR_RESULT + * - #ADI_TMR_BAD_DEVICE_NUM [D] Invalid eDevice parameter supplied + * - #ADI_TMR_DEVICE_BUSY Timer is busy processing a previous control register write + * - #ADI_TMR_SUCCESS Function call completed successfully + * + */ +ADI_TMR_RESULT adi_tmr_Enable(ADI_TMR_DEVICE const eDevice, bool bEnable) { +#ifdef ADI_DEBUG + /* IF(Bad device input parameter) */ + if (eDevice >= ADI_TMR_DEVICE_NUM) { + return ADI_TMR_BAD_DEVICE_NUM; + } /* ENDIF */ +#endif + /* IF(Busy bit does not clear after waiting) */ + if (ADI_TMR_SUCCESS != WaitForStatusBit(eDevice, (uint16_t) BITM_TMR_RGB_STAT_BUSY)) { + return ADI_TMR_DEVICE_BUSY; + } /* ENDIF */ + + /* Clear the enable bit and keep the other bits */ + adi_tmr_registers[eDevice]->CTL &= (uint16_t) ~BITM_TMR_RGB_CTL_EN; + + /* IF(Turning the timer on) */ + if (bEnable == true) { + adi_tmr_registers[eDevice]->CTL |= (uint16_t) BITM_TMR_RGB_CTL_EN; + } /* ENDIF */ + + return ADI_TMR_SUCCESS; +} + + +/*! + * @brief Get GP or RGB Timer Current Count + * + * @details Read the timer. + * + * @param [in] eDevice : Device number + * + * @param [out] pCount : Pointer to the result. + * + * @return ADI_TMR_RESULT + * - #ADI_TMR_BAD_DEVICE_NUM [D] Invalid eDevice parameter supplied + * - #ADI_TMR_NULL_POINTER [D] Invalid pCount parameter supplied + * - #ADI_TMR_SUCCESS Function call completed successfully + * + */ +ADI_TMR_RESULT adi_tmr_GetCurrentCount(ADI_TMR_DEVICE const eDevice, uint16_t *pCount) { +#ifdef ADI_DEBUG + /* IF(Bad device input parameter) */ + if (eDevice >= ADI_TMR_DEVICE_NUM) { + return ADI_TMR_BAD_DEVICE_NUM; + } /* ENDIF */ + /* IF(Null pointer) */ + if (pCount == NULL) { + return ADI_TMR_NULL_POINTER; + } /* ENDIF */ +#endif + *pCount = adi_tmr_registers[eDevice]->CURCNT; + return ADI_TMR_SUCCESS; +} + + +/*! + * @brief Get GP or RGB Timer Captured Count + * + * @details Read the captured timer value. This should be called after the callback function + * is called with #ADI_TMR_EVENT_CAPTURE in the Event field. + * + * @param [in] eDevice : Device number + * + * @param [out] pCount : Pointer to the result. + * + * @return ADI_TMR_RESULT + * - #ADI_TMR_BAD_DEVICE_NUM [D] Invalid eDevice parameter supplied + * - #ADI_TMR_NULL_POINTER [D] Invalid pCount parameter supplied + * - #ADI_TMR_SUCCESS Function call completed successfully + * + */ +ADI_TMR_RESULT adi_tmr_GetCaptureCount(ADI_TMR_DEVICE const eDevice, uint16_t *pCount) { +#ifdef ADI_DEBUG + /* IF(Bad device input parameter) */ + if (eDevice >= ADI_TMR_DEVICE_NUM) { + return ADI_TMR_BAD_DEVICE_NUM; + } /* ENDIF */ + /* IF(Null pointer) */ + if (pCount == NULL) { + return ADI_TMR_NULL_POINTER; + } /* ENDIF */ +#endif + *pCount = adi_tmr_registers[eDevice]->CAPTURE; + return ADI_TMR_SUCCESS; +} + + +/*! + * @brief Reload GP or RGB Timer + * + * @details Only relevent in peridic mode and when bReloading was set to + * true when configuring the timer. Calling this function will + * reload (i.e. reset) the timer to the LOAD value. + * + * @param [in] eDevice : Device number + * + * @return ADI_TMR_RESULT + * - #ADI_TMR_BAD_DEVICE_NUM [D] Invalid eDevice parameter supplied + * - #ADI_TMR_RELOAD_DISABLED [D] Reloading not enabled for this timer + * - #ADI_TMR_DEVICE_BUSY Reload did not take effect in time + * - #ADI_TMR_SUCCESS Function call completed successfully + * + */ +ADI_TMR_RESULT adi_tmr_Reload(ADI_TMR_DEVICE const eDevice) { +#ifdef ADI_DEBUG + /* IF(Bad device input parameter) */ + if (eDevice >= ADI_TMR_DEVICE_NUM) { + return ADI_TMR_BAD_DEVICE_NUM; + } /* ENDIF */ + /* IF(Reloading has not been enabled) */ + if ((adi_tmr_registers[eDevice]->CTL & BITM_TMR_RGB_CTL_RLD) != BITM_TMR_RGB_CTL_RLD) { + return ADI_TMR_RELOAD_DISABLED; + } /* ENDIF */ +#endif + /* Clear the timeout bit to cause a reload to happen */ + adi_tmr_registers[eDevice]->CLRINT = BITM_TMR_RGB_CLRINT_TIMEOUT; + /* IF(The clear interrupt does not take effect in a reasonable amount of time) */ + if (ADI_TMR_SUCCESS != WaitForStatusBit(eDevice, (uint16_t) BITM_TMR_RGB_STAT_PDOK)) { + return ADI_TMR_DEVICE_BUSY; + } /* ENDIF */ + return ADI_TMR_SUCCESS; +} + + +/********************************************************************************* + PRIVATE FUNCTIONS +*********************************************************************************/ + + /*! \cond PRIVATE */ + +static ADI_TMR_RESULT WaitForStatusBit(ADI_TMR_DEVICE const eDevice, uint16_t nBusyBit) { + /* FOR(Number of arbitrary iterations) */ + for (uint16_t i = 0u; i < 1000u; i++) { + /* IF(Busy bit is low) */ + if ((adi_tmr_registers[(eDevice)]->STAT & nBusyBit) == ((uint16_t) 0u)) { + return ADI_TMR_SUCCESS; + } /* ENDIF */ + } /* ENDFOR */ + return ADI_TMR_DEVICE_BUSY; +} + +static void CommonIntHandler(ADI_TMR_DEVICE const eDevice) { + /* Read status register */ + uint16_t IntStatus = adi_tmr_registers[eDevice]->STAT; + /* IF(Callback function has been set) */ + if(adi_tmr_callbacks[eDevice] != NULL) { + /* IF(Timeout interrupt occurred) */ + if((IntStatus & ((uint16_t) BITM_TMR_RGB_STAT_TIMEOUT)) != ((uint16_t) 0u)) { + adi_tmr_callbacks[eDevice](adi_tmr_parameters[eDevice], ADI_TMR_EVENT_TIMEOUT, NULL); + } /* ENDIF */ + /* IF(Event capture interrupt occurred) */ + if((IntStatus & ((uint16_t) BITM_TMR_RGB_STAT_CAPTURE)) != ((uint16_t) 0u)) { + adi_tmr_callbacks[eDevice](adi_tmr_parameters[eDevice], ADI_TMR_EVENT_CAPTURE, NULL); + } /* ENDIF */ + } /* ENDIF */ + /* Clear pending interrupt */ + adi_tmr_registers[eDevice]->CLRINT = (BITM_TMR_RGB_CLRINT_EVTCAPT | BITM_TMR_RGB_CLRINT_TIMEOUT); +} + +void GP_Tmr0_Int_Handler(void) { + ISR_PROLOG() + CommonIntHandler(ADI_TMR_DEVICE_GP0); + ISR_EPILOG() +} + +void GP_Tmr1_Int_Handler(void) { + ISR_PROLOG() + CommonIntHandler(ADI_TMR_DEVICE_GP1); + ISR_EPILOG() +} + +void GP_Tmr2_Int_Handler(void) { + ISR_PROLOG() + CommonIntHandler(ADI_TMR_DEVICE_GP2); + ISR_EPILOG() +} + +void RGB_Tmr_Int_Handler(void) { + ISR_PROLOG() + CommonIntHandler(ADI_TMR_DEVICE_RGB); + ISR_EPILOG() +} + +/*! \endcond */ + +/*! @} */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/tmr/adi_tmr_data.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/tmr/adi_tmr_data.c new file mode 100755 index 0000000000..7cf4a8295e --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/tmr/adi_tmr_data.c @@ -0,0 +1,155 @@ +/*! ***************************************************************************** + * @file adi_tmr_data.c + * @brief GP and RGB timer static configuration data + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + + +#ifndef ADI_TMR_DATA +#define ADI_TMR_DATA + + +#include +#include +#include + + +/* CTL register static configuration */ +static uint16_t aTimerCtlConfig[] = +{ + (TMR0_CFG_COUNT_UP << BITP_TMR_RGB_CTL_UP) | + (TMR0_CFG_MODE << BITP_TMR_RGB_CTL_MODE) | + (TMR0_CFG_PRESCALE_FACTOR << BITP_TMR_RGB_CTL_PRE) | + (TMR0_CFG_CLOCK_SOURCE << BITP_TMR_RGB_CTL_CLK) | + (TMR0_CFG_ENABLE_RELOADING << BITP_TMR_RGB_CTL_RLD) | + (TMR0_CFG_ENABLE_SYNC_BYPASS << BITP_TMR_RGB_CTL_SYNCBYP) | + (TMR0_CFG_ENABLE_PRESCALE_RESET << BITP_TMR_RGB_CTL_RSTEN) | + (TMR0_CFG_ENABLE_EVENT_CAPTURE << BITP_TMR_RGB_CTL_EVTEN), + + (TMR1_CFG_COUNT_UP << BITP_TMR_RGB_CTL_UP) | + (TMR1_CFG_MODE << BITP_TMR_RGB_CTL_MODE) | + (TMR1_CFG_PRESCALE_FACTOR << BITP_TMR_RGB_CTL_PRE) | + (TMR1_CFG_CLOCK_SOURCE << BITP_TMR_RGB_CTL_CLK) | + (TMR1_CFG_ENABLE_RELOADING << BITP_TMR_RGB_CTL_RLD) | + (TMR1_CFG_ENABLE_SYNC_BYPASS << BITP_TMR_RGB_CTL_SYNCBYP) | + (TMR1_CFG_ENABLE_PRESCALE_RESET << BITP_TMR_RGB_CTL_RSTEN) | + (TMR1_CFG_ENABLE_EVENT_CAPTURE << BITP_TMR_RGB_CTL_EVTEN), + + (TMR2_CFG_COUNT_UP << BITP_TMR_RGB_CTL_UP) | + (TMR2_CFG_MODE << BITP_TMR_RGB_CTL_MODE) | + (TMR2_CFG_PRESCALE_FACTOR << BITP_TMR_RGB_CTL_PRE) | + (TMR2_CFG_CLOCK_SOURCE << BITP_TMR_RGB_CTL_CLK) | + (TMR2_CFG_ENABLE_RELOADING << BITP_TMR_RGB_CTL_RLD) | + (TMR2_CFG_ENABLE_SYNC_BYPASS << BITP_TMR_RGB_CTL_SYNCBYP) | + (TMR2_CFG_ENABLE_PRESCALE_RESET << BITP_TMR_RGB_CTL_RSTEN) | + (TMR2_CFG_ENABLE_EVENT_CAPTURE << BITP_TMR_RGB_CTL_EVTEN), + + (TMR3_CFG_COUNT_UP << BITP_TMR_RGB_CTL_UP) | + (TMR3_CFG_MODE << BITP_TMR_RGB_CTL_MODE) | + (TMR3_CFG_PRESCALE_FACTOR << BITP_TMR_RGB_CTL_PRE) | + (TMR3_CFG_CLOCK_SOURCE << BITP_TMR_RGB_CTL_CLK) | + (TMR3_CFG_ENABLE_RELOADING << BITP_TMR_RGB_CTL_RLD) | + (TMR3_CFG_ENABLE_SYNC_BYPASS << BITP_TMR_RGB_CTL_SYNCBYP) | + (TMR3_CFG_ENABLE_PRESCALE_RESET << BITP_TMR_RGB_CTL_RSTEN) | + (TMR3_CFG_ENABLE_EVENT_CAPTURE << BITP_TMR_RGB_CTL_EVTEN), +}; + +/* LOAD register static configuration */ +static uint16_t aTimerLoadConfig[] = +{ + TMR0_CFG_LOAD_VALUE, + TMR1_CFG_LOAD_VALUE, + TMR2_CFG_LOAD_VALUE, + TMR3_CFG_LOAD_VALUE, +}; + +/* Asynchronous LOAD static configuraton */ +static uint16_t aTimerALoadConfig[] = +{ + TMR0_CFG_ASYNC_LOAD_VALUE, + TMR1_CFG_ASYNC_LOAD_VALUE, + TMR2_CFG_ASYNC_LOAD_VALUE, + TMR3_CFG_ASYNC_LOAD_VALUE, +}; + +/* EVENTSELECT static configuration */ +static uint16_t aTimerEventConfig[] = +{ + TMR0_CFG_EVENT_CAPTURE, + TMR1_CFG_EVENT_CAPTURE, + TMR2_CFG_EVENT_CAPTURE, + TMR3_CFG_EVENT_CAPTURE, +}; + +/* PWM CTL static configuration */ +static uint16_t aTimerPwmCtlConfig[] = +{ + (TMR0_CFG_PWM0_IDLE_STATE << BITP_TMR_RGB_PWM0CTL_IDLESTATE) | + (TMR0_CFG_PWM0_MATCH_VALUE << BITP_TMR_RGB_PWM0CTL_MATCH), + + (TMR1_CFG_PWM0_IDLE_STATE << BITP_TMR_RGB_PWM0CTL_IDLESTATE) | + (TMR1_CFG_PWM0_MATCH_VALUE << BITP_TMR_RGB_PWM0CTL_MATCH), + + (TMR2_CFG_PWM0_IDLE_STATE << BITP_TMR_RGB_PWM0CTL_IDLESTATE) | + (TMR2_CFG_PWM0_MATCH_VALUE << BITP_TMR_RGB_PWM0CTL_MATCH), + + (TMR3_CFG_PWM0_IDLE_STATE << BITP_TMR_RGB_PWM0CTL_IDLESTATE) | + (TMR3_CFG_PWM0_MATCH_VALUE << BITP_TMR_RGB_PWM0CTL_MATCH), + + (TMR3_CFG_PWM1_IDLE_STATE << BITP_TMR_RGB_PWM1CTL_IDLESTATE) | + (TMR3_CFG_PWM1_MATCH_VALUE << BITP_TMR_RGB_PWM1CTL_MATCH), + + (TMR3_CFG_PWM2_IDLE_STATE << BITP_TMR_RGB_PWM2CTL_IDLESTATE) | + (TMR3_CFG_PWM2_MATCH_VALUE << BITP_TMR_RGB_PWM2CTL_MATCH), +}; + +/* PWM MATCH static configuration */ +static uint16_t aTimerPwmMatchConfig[] = { + TMR0_CFG_PWM0_MATCH_VALUE, + TMR1_CFG_PWM0_MATCH_VALUE, + TMR2_CFG_PWM0_MATCH_VALUE, + TMR3_CFG_PWM0_MATCH_VALUE, + TMR3_CFG_PWM1_MATCH_VALUE, + TMR3_CFG_PWM2_MATCH_VALUE +}; + + +#endif /* ADI_TMR_DATA */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/uart/adi_uart.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/uart/adi_uart.c new file mode 100755 index 0000000000..d1f72d6048 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/uart/adi_uart.c @@ -0,0 +1,2779 @@ +/*! ***************************************************************************** + * @file: adi_uart.c + * @brief: uart device driver implementation + * @details: This file contains the UART device driver functions + ----------------------------------------------------------------------------- +Copyright (c) 2010-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +/** @addtogroup UART_Driver + * @{ + * @brief UART Driver + * @note The application must include drivers/uart/adi_uart.h to use this + * driver + * @note This driver requires the DMA driver.The application must + * include the DMA driver sources to avoid link errors. + */ + +/*! \cond PRIVATE */ +#include +#include +#include "adi_uart_def.h" +#include + + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm50: (MISRA C 2004 rule 14.3): a null statement shall only occur on a line by itself, +* and shall not have any other text on the same line +* Some Macros, such as ISR_PROLOGUE, may not have any expansion +* resulting in just the terminating ';'. +* +* Pm073 (rule 14.7): A function should have a single point of exit. +* Pm143 (rule 14.7): A function should have a single point of exit at the end of the function. +* Multiple returns are used for error handling. +* +* Pm088 (rule 17.4): Pointer arithmetic should not be used. +* Relying on pointer arithmetic for buffer handling. +* +* Pm123 (rule 18.5): There shall be no definition of objects in a header file. +* +* Pm140 (rule 11.3): A cast should not be performed between a pointer type and an integral type. +* MMR addresses are defined as simple constants. Accessing the MMR requires casting to a pointer type. +* +* Pm152 (rule 17.4): Array indexing shall only be applied to objects defined as an array type. +* Relying on pointer arithmetic for buffer handling and +* Accessing the DMA descriptors, which are defined in the system as a pointer to an array of descriptors. +* +* Pm008: Code should not be commented out. + This code was commented out to show what the autobaud equations would look like if there were floating point precision. + Ideally this would be the case but for the sake of footprint size we will leave it at single point precision. +*/ +#pragma diag_suppress=Pm050,Pm073,Pm088,Pm123,Pm140,Pm143,Pm152,Pm008 +#endif /* __ICCARM__ */ + + + + +/********************************************************** + * UART Data + **********************************************************/ +static ADI_UART_DEVICE_INFO uart_device_info[ ] = +{ + { + UART0_TX_CHANn, /*!< DMA channel number for UART0 Tx. */ + UART0_RX_CHANn, /*!< DMA channel number for UART0 Rx. */ + DMA0_CH8_DONE_IRQn, /*!< DMA channel IRQ for UART0 Tx. */ + DMA0_CH9_DONE_IRQn, /*!< DMA channel IRQ for UART0 Rx. */ + (IRQn_Type)INTR_UART0_EVT, /*!< UART0 interrupt ID. */ + pADI_UART0, /*!< Start address of UART0. */ + NULL /*!< Device Handle for UART0. */ + }, + { + UART1_TX_CHANn, /*!< DMA channel number for UART1 Tx. */ + UART1_RX_CHANn, /*!< DMA channel number for UART1 Rx. */ + DMA0_CH25_DONE_IRQn, /*!< DMA channel IRQ for UART1 Tx. */ + DMA0_CH26_DONE_IRQn, /*!< DMA channel IRQ for UART1 Rx. */ + (IRQn_Type)INTR_UART1_EVT, /*!< UART1 interrupt ID. */ + pADI_UART1, /*!< Start address of UART1. */ + NULL /*!< Device Handle for UART1. */ + }, +}; + +static const ADI_UART_CONFIG gUARTCfg[ ] = +{ + { + /* Line control register. */ + ((ADI_UART0_CFG_WORD_LENGTH << BITP_UART_LCR_WLS) | + (ADI_UART0_CFG_STOP_BIT << BITP_UART_LCR_STOP) | + (ADI_UART0_CFG_ENABLE_PARITY << BITP_UART_LCR_PEN) | + (ADI_UART0_CFG_PARITY_SELECTION << BITP_UART_LCR_EPS) | + (ADI_UART0_CFG_ENABLE_STICKY_PARITY << BITP_UART_LCR_SP)), + + /* Div-C in baudrate divider register. */ + ADI_UART0_CFG_DIVC, + + /* Div-M and Div-N in fractional baudrate Register. */ + (((uint32_t)ADI_UART0_CFG_DIVN << BITP_UART_FBR_DIVN) | + ((uint32_t)ADI_UART0_CFG_DIVM << BITP_UART_FBR_DIVM) | + ((uint32_t)BITM_UART_FBR_FBEN)), + + /* Over sample rate in second line control register. */ + ADI_UART0_CFG_OSR, + + /* FIFO control register. */ + ((ADI_UART0_CFG_ENABLE_FIFO << BITP_UART_FCR_FIFOEN)| + (ADI_UART0_CFG_TRIG_LEVEL << BITP_UART_FCR_RFTRIG)), + + /* Half duplex control register. */ + ((ADI_UART0_CFG_SOUT_POLARITY << BITP_UART_RSC_OENP) | + (ADI_UART0_CFG_DEASSERTION << BITP_UART_RSC_OENSP) | + (ADI_UART0_CFG_DISABLE_RX << BITP_UART_RSC_DISRX) | + (ADI_UART0_CFG_HOLD_TX << BITP_UART_RSC_DISTX)), + + /* Interrupt enable register. */ + ((ADI_UART0_CFG_ENABLE_MODEM_STATUS_INTERRUPT << BITP_UART_IEN_EDSSI) | + (ADI_UART0_CFG_ENABLE_RX_STATUS_INTERRUPT << BITP_UART_IEN_ELSI)) + + }, + + { + /* Line control register. */ + ((ADI_UART1_CFG_WORD_LENGTH << BITP_UART_LCR_WLS) | + (ADI_UART1_CFG_STOP_BIT << BITP_UART_LCR_STOP) | + (ADI_UART1_CFG_ENABLE_PARITY << BITP_UART_LCR_PEN) | + (ADI_UART1_CFG_PARITY_SELECTION << BITP_UART_LCR_EPS) | + (ADI_UART1_CFG_ENABLE_STICKY_PARITY << BITP_UART_LCR_SP)), + + /* Div-C in Baudrate divider register. */ + ADI_UART1_CFG_DIVC, + + /* Div-M and Div-N in fractional baudrate Register. */ + (((uint32_t)ADI_UART1_CFG_DIVN << BITP_UART_FBR_DIVN) | + ((uint32_t)ADI_UART1_CFG_DIVM << BITP_UART_FBR_DIVM) | + ((uint32_t)BITM_UART_FBR_FBEN)), + + /* Over sample rate in second line control register. */ + ADI_UART1_CFG_OSR, + + /* FIFO control register. */ + ((ADI_UART1_CFG_ENABLE_FIFO << BITP_UART_FCR_FIFOEN)| + (ADI_UART1_CFG_TRIG_LEVEL << BITP_UART_FCR_RFTRIG)), + + /* Half duplex control register. */ + ((ADI_UART1_CFG_SOUT_POLARITY << BITP_UART_RSC_OENP) | + (ADI_UART1_CFG_DEASSERTION << BITP_UART_RSC_OENSP) | + (ADI_UART1_CFG_DISABLE_RX << BITP_UART_RSC_DISRX) | + (ADI_UART1_CFG_HOLD_TX << BITP_UART_RSC_DISTX)), + + /* Interrupt enable register. */ + ((ADI_UART1_CFG_ENABLE_MODEM_STATUS_INTERRUPT << BITP_UART_IEN_EDSSI) | + (ADI_UART1_CFG_ENABLE_RX_STATUS_INTERRUPT << BITP_UART_IEN_ELSI)) + } +}; + +/*! \endcond */ + +/*! Number of UART devices available on the chip. */ +#define ADI_UART_NUM_DEVICES (sizeof(uart_device_info)/sizeof(ADI_UART_DEVICE_INFO)) + +/* Override "weak" default binding in startup.c */ +/*! \cond PRIVATE */ +extern void UART0_Int_Handler(void); +extern void UART1_Int_Handler(void); +extern void DMA_UART0_TX_Int_Handler(void); +extern void DMA_UART0_RX_Int_Handler(void); +extern void DMA_UART1_TX_Int_Handler(void); +extern void DMA_UART1_RX_Int_Handler(void); + +/* Internal DMA Callback for receiving DMA faults from common DMA error handler. */ +static void RxDmaErrorCallback(void *pCBParam, uint32_t Event, void *pArg); +static void RxDmaErrorCallback(void *pCBParam, uint32_t Event, void *pArg) { + + /* Recover the device handle. */ + ADI_UART_HANDLE hDevice = (ADI_UART_HANDLE)pCBParam; + ADI_UART_BUFF_INFO * pNextBuff = hDevice->pChannelRx->pFillBuffer->pNextBuffer; + uint32_t nEvent = 0u; + + /* Save the DMA error. */ + switch (Event) { + case ADI_DMA_EVENT_ERR_BUS: + nEvent |= (uint32_t)ADI_UART_HW_ERR_RX_CHAN_DMA_BUS_FAULT; + break; + case ADI_DMA_EVENT_ERR_INVALID_DESCRIPTOR: + nEvent |= (uint32_t)ADI_UART_HW_ERR_RX_CHAN_DMA_INVALID_DESCR; + break; + default: + nEvent |= (uint32_t)ADI_UART_HW_ERR_RX_CHAN_DMA_UNKNOWN_ERROR; + break; + } + + if((pNextBuff->pStartAddress != NULL) && (pNextBuff->bDMA == true)) + { + hDevice->nHwError |= nEvent; + pNextBuff->bInUse = false; + uart_ManageProcessedBuffer(hDevice,hDevice->pChannelRx,ADI_UART_EVENT_RX_BUFFER_PROCESSED); + + } + hDevice->nHwError |= nEvent; + uart_ManageProcessedBuffer(hDevice,hDevice->pChannelRx,ADI_UART_EVENT_RX_BUFFER_PROCESSED); +} + +static void TxDmaErrorCallback(void *pCBParam, uint32_t Event, void *pArg); +static void TxDmaErrorCallback(void *pCBParam, uint32_t Event, void *pArg) { + + /* Recover the device handle. */ + ADI_UART_HANDLE hDevice = (ADI_UART_HANDLE)pCBParam; + ADI_UART_BUFF_INFO * pNextBuff = hDevice->pChannelTx->pFillBuffer->pNextBuffer; + uint32_t nEvent = 0u; + + /* Save the DMA error. */ + switch (Event) { + case ADI_DMA_EVENT_ERR_BUS: + nEvent |= (uint32_t)ADI_UART_HW_ERR_TX_CHAN_DMA_BUS_FAULT; + break; + case ADI_DMA_EVENT_ERR_INVALID_DESCRIPTOR: + nEvent |= (uint32_t)ADI_UART_HW_ERR_TX_CHAN_DMA_INVALID_DESCR; + break; + default: + nEvent |= (uint32_t)ADI_UART_HW_ERR_TX_CHAN_DMA_UNKNOWN_ERROR; + break; + } + if((pNextBuff->pStartAddress != NULL) && (pNextBuff->bDMA == true)) + { + hDevice->nHwError |= nEvent; + pNextBuff->bInUse = false; + uart_ManageProcessedBuffer(hDevice,hDevice->pChannelTx,ADI_UART_EVENT_TX_BUFFER_PROCESSED); + + } + + hDevice->nHwError |= nEvent; + uart_ManageProcessedBuffer(hDevice,hDevice->pChannelTx,ADI_UART_EVENT_TX_BUFFER_PROCESSED); +} +/*! \endcond */ + +/********************************************************** + * General UART APIs + **********************************************************/ + +/*! + * @brief Initialization function for the UART device. + * @details Opens the specified UART device. This function must be called before operating any UART device. + * + * + * @param [in] nDeviceNum UART device instance to be opened. + * @param [in] eDirection Direction of the UART operation. (i.e Rx or Tx) + * @param [in] pMemory Pointer to a 32 bit aligned buffer the size of #ADI_UART_UNIDIR_MEMORY_SIZE + * or #ADI_UART_BIDIR_MEMORY_SIZE. + * @param [in] nMemSize Size of the buffer to which "pMemory" points. This will vary based on + * direction of operation for this device instance. (i.e Rx and Tx, Rx, Tx) + * + * @param [out] phDevice The caller's device handle pointer for storing the initialized device instance data pointer. + * + * @return Status + * - #ADI_UART_SUCCESS Successfully initialized UART device. + * - #ADI_UART_SEMAPHORE_FAILED Failed to create semaphore. + * - #ADI_UART_INVALID_DEVICE_NUM [D] Device instance is invalid. + * - #ADI_UART_INSUFFICIENT_MEMORY [D] Supplied memory is insufficient for the operation of specified UART device. + * - #ADI_UART_DEVICE_IN_USE [D] Device is already open. + * + * @sa adi_uart_Close() + * + * @note: Memory supplied by the API will be used by the driver for managing the UART device. This memory can be reused once + * device is closed. + * + */ +ADI_UART_RESULT adi_uart_Open( + uint32_t const nDeviceNum, + ADI_UART_DIRECTION const eDirection, + void *pMemory, + uint32_t const nMemSize, + ADI_UART_HANDLE *const phDevice + ) +{ +#ifdef ADI_DEBUG + /* Check if the given device number is within the range of UART + * devices present in the processor. There are two devices present here + * so this can be a 0 or 1. + */ + if(nDeviceNum >= ADI_UART_NUM_DEVICES) + { + return(ADI_UART_INVALID_DEVICE_NUM); + } + + /* Verify the device is not already open. */ + if(uart_device_info[nDeviceNum].hDevice != NULL) + { + return(ADI_UART_DEVICE_IN_USE); + } + + /* Make sure there is enough memory for the device instance to operate in a single direction. */ + if(eDirection != ADI_UART_DIR_BIDIRECTION) + { + if(nMemSize < (uint32_t)ADI_UART_UNIDIR_MEMORY_SIZE) + { + return(ADI_UART_INSUFFICIENT_MEMORY); + } + assert(nMemSize == (sizeof(ADI_UART_DEVICE) + sizeof(ADI_UART_DATA_CHANNEL))); + } + + /* Make sure there is enough memory for the device instance to operate in both directions. */ + else + { + if(nMemSize < (uint32_t)ADI_UART_BIDIR_MEMORY_SIZE) + { + return(ADI_UART_INSUFFICIENT_MEMORY); + } + assert(nMemSize == (sizeof(ADI_UART_DEVICE) + (sizeof(ADI_UART_DATA_CHANNEL)*2u))); + } +#endif /* ADI_DEBUG */ + + /* Initialize the device handle to NULL in case of a failure. */ + *phDevice = NULL; + + /* Link the ADI_UART_HANDLE to the ADI_UART_DEVICE structure. */ + ADI_UART_HANDLE hDevice = pMemory; + + /* Zero the device handle memory so we do not have to explicitely initialize + the structure members to 0. + */ + memset(pMemory, 0, nMemSize); + + + /* Set the device information. */ + hDevice->pUartInfo = &uart_device_info[nDeviceNum]; + + /* Set the base of the UART register address. We do this to minimize + the cycle count when accessing the UART registers. + */ + hDevice->pUARTRegs = uart_device_info[nDeviceNum].pUartRegs; + + /* Store the direction that this device will operate in. */ + hDevice->eDirection = eDirection; + + /* Increment the device handle with the size of the UART device structure + so we can set the channel data next without overwriting + the #ADI_UART_DEVICE data. + */ + pMemory = ((uint8_t *)pMemory +(sizeof(ADI_UART_DEVICE))); + + /* Set up the DMA Controller. */ + adi_dma_Init(); + + /* Initialize the TX-channel. */ + if(ADI_UART_DIR_RECEIVE != eDirection) + { + hDevice->pChannelTx = (ADI_UART_DATA_CHANNEL *)pMemory; + + /* Initialize the data transfer mode. */ + hDevice->pChannelTx->eDataTranferMode = ADI_UART_DATA_TRANSFER_MODE_NONE; + + /* Initialize Tx buffer pointers. */ + hDevice->pChannelTx->pFreeBuffer = &hDevice->pChannelTx->PingPong[0]; + hDevice->pChannelTx->pActiveBuffer = &hDevice->pChannelTx->PingPong[0]; + hDevice->pChannelTx->pFillBuffer = &hDevice->pChannelTx->PingPong[0]; + + + /* Create a "semaphore" (varies per OS) used for blocking buffer resource management. */ + SEM_CREATE(hDevice->pChannelTx, "UART_TX_SEM", ADI_UART_SEMAPHORE_FAILED); + + /* Set submit buffer function pointer. */ + hDevice->pChannelTx->pfSubmitBuffer = &uart_submittxbuffer; + + hDevice->pChannelTx->PingPong[0].pNextBuffer = &hDevice->pChannelTx->PingPong[1]; + hDevice->pChannelTx->PingPong[1].pNextBuffer = &hDevice->pChannelTx->PingPong[0]; + + /*Register DMA Callback. */ + if (ADI_DMA_SUCCESS != adi_dma_RegisterCallback(hDevice->pUartInfo->dmaTxChannelNum, TxDmaErrorCallback, (void*)hDevice)) + { + adi_uart_Close(hDevice); + return ADI_UART_ERR_DMA_REGISTER; + } + + /* Increment the device handle the size of #ADI_UART_DATA_CHANNEL + structure in case there is another channel to configure. + */ + pMemory = ((uint8_t *)pMemory + sizeof(ADI_UART_DATA_CHANNEL)); + } + /* Initialize the RX-channel. */ + if(ADI_UART_DIR_TRANSMIT != eDirection) + { + hDevice->pChannelRx = (ADI_UART_DATA_CHANNEL *)pMemory; + + /* Initialize the data transfer mode. */ + hDevice->pChannelRx->eDataTranferMode = ADI_UART_DATA_TRANSFER_MODE_NONE; + + /* Initialize Rx buffer pointers. */ + hDevice->pChannelRx->pFreeBuffer = &hDevice->pChannelRx->PingPong[0]; + hDevice->pChannelRx->pActiveBuffer = &hDevice->pChannelRx->PingPong[0]; + hDevice->pChannelRx->pFillBuffer = &hDevice->pChannelRx->PingPong[0]; + + /* Create a "semaphore" (varies per OS) used for blocking buffer resource management. */ + SEM_CREATE(hDevice->pChannelRx, "UART_RX_SEM", ADI_UART_SEMAPHORE_FAILED); + + /* Set submit buffer function pointer. */ + hDevice->pChannelRx->pfSubmitBuffer = &uart_submitrxbuffer; + + hDevice->pChannelRx->PingPong[0].pNextBuffer = &hDevice->pChannelRx->PingPong[1]; + hDevice->pChannelRx->PingPong[1].pNextBuffer = &hDevice->pChannelRx->PingPong[0]; + + /*Register DMA Callback. */ + if (ADI_DMA_SUCCESS != adi_dma_RegisterCallback(hDevice->pUartInfo->dmaRxChannelNum, RxDmaErrorCallback, (void*)hDevice)) + { + adi_uart_Close(hDevice); + return ADI_UART_ERR_DMA_REGISTER; + } + } + + /* Initialize the device with the static config values.*/ + uart_init(hDevice, nDeviceNum); + + /* Write the device data pointer to the application's handle. */ + *phDevice = hDevice; + + /* Store the device handle. */ + uart_device_info[nDeviceNum].hDevice = hDevice; + + + /* Enable UART Interrupt. */ + NVIC_ClearPendingIRQ(hDevice->pUartInfo->eIRQn); + NVIC_EnableIRQ(hDevice->pUartInfo->eIRQn); + + /* Enable the interrupt for the DMA. */ + NVIC_EnableIRQ(hDevice->pUartInfo->eDMATx); + NVIC_EnableIRQ(hDevice->pUartInfo->eDMARx); + + /* Return SUCCESS */ + return(ADI_UART_SUCCESS); +} + +/*! + * @brief Uninitialize the memory for the specified UART instance. + * + * @param [in] hDevice UART device handle whose operation is to be closed. This handle was obtained when the UART + * device instance was opened successfully. + * + * @return Status + * - #ADI_UART_SUCCESS Successfully closed the UART device instance. + * - #ADI_UART_SEMAPHORE_FAILED Failed to delete the semaphore. + * - #ADI_UART_INVALID_HANDLE [D] Invalid UART device handle. + * - #ADI_UART_DEVICE_IN_USE [D] Specified UART device is in the process of a transaction or autobaud has not completed. + * + * @details Closes the operation of specified UART device. Device needs to be opened again for any further use. + * + * @sa adi_uart_Open() + * + * @note: It is the user's responsibility to free/reuse the memory supplied during the opening of the device. + */ +ADI_UART_RESULT adi_uart_Close( + ADI_UART_HANDLE const hDevice + ) +{ +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } + + /* Make sure there are no active buffers on any active channel, autobaud is not in progress and the + Tx shift register is completely empty. This can be an issue if you submitted a nonblocking transmit + because you will receive interrupt before the hardware has fully finished the transaction. The start + address of the active buffer will remain in use until the buffer has been completely processed. + Therefore if the start address is NULL it means it has not been submitted for a transaction. + */ + if(((hDevice->pUARTRegs->LSR & BITM_UART_LSR_TEMT) != BITM_UART_LSR_TEMT) || + ((hDevice->eDirection != ADI_UART_DIR_TRANSMIT) && (hDevice->pChannelRx->pFillBuffer->pStartAddress != NULL)) || + ((hDevice->eDirection != ADI_UART_DIR_RECEIVE ) && (hDevice->pChannelTx->pFillBuffer->pStartAddress != NULL)) || + (hDevice->bAutobaudInProgress == true)) + { + return(ADI_UART_DEVICE_IN_USE); + } +#endif /* ADI_DEBUG */ + + /* Disable UART status interrupts. */ + hDevice->pUARTRegs->IEN = 0x00U; + + /* Disable DMA UART interrupts. */ + NVIC_DisableIRQ(hDevice->pUartInfo->eDMARx); + NVIC_DisableIRQ(hDevice->pUartInfo->eDMATx); + + /* Disable UART event interrupt. */ + NVIC_DisableIRQ(hDevice->pUartInfo->eIRQn); + + /* Delete Tx-Channel semaphore. */ + if(hDevice->eDirection != ADI_UART_DIR_RECEIVE) + { + SEM_DELETE(hDevice->pChannelTx, ADI_UART_SEMAPHORE_FAILED); + } + + /* Delete Rx-Channel semaphore. */ + if(hDevice->eDirection != ADI_UART_DIR_TRANSMIT) + { + SEM_DELETE(hDevice->pChannelRx, ADI_UART_SEMAPHORE_FAILED); + } + + /* Free up the device memory. */ + hDevice->pUartInfo->hDevice = NULL; + + return(ADI_UART_SUCCESS); +} + +/*! + * @brief Submit a "filled" buffer for transmitting data in #ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING. + * This function sets up the apropriate interrupts associated with the transaction and marks + * the buffer as submitted. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] pBuffer Pointer to data supplied by the API that is to be transmitted. + * @param [in] nBufSize Size of the buffer to be transmitted(in bytes). Must be smaller than 1024 bytes for DMA transfers. + * @param [in] bDMA Submit the buffer using the DMA flag. + + * + * @return Status + * - #ADI_UART_SUCCESS Successfully submitted the buffer for transmission. + * - #ADI_UART_FAILED [D] Generic failure. In this case the size of the data buffer we are trying + * to submit is NULL. + * - #ADI_UART_INVALID_DATA_TRANSFER_MODE [D] Device is operating in #ADI_UART_DATA_TRANSFER_MODE_BLOCKING. This + * operation is only allowed in #ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING. + * - #ADI_UART_INVALID_HANDLE [D] Invalid UART device handle. + * - #ADI_UART_OPERATION_NOT_ALLOWED [D] Device direction is set up as #ADI_UART_DIR_RECEIVE, so we can not complete + * a transmit operation. The required directions are #ADI_UART_DIR_TRANSMIT or + * #ADI_UART_DIR_BIDIRECTION. + * - #ADI_UART_INVALID_POINTER [D] Pointer to the buffer being submitted is NULL. + * - #ADI_UART_DEVICE_IN_USE [D] Autobaud in progress. + * - #ADI_UART_INVALID_DATA_SIZE [D] DMA transfers must be smaller than 1025 bytes. + * + * @sa adi_uart_IsTxBufferAvailable() + * @sa adi_uart_GetTxBuffer() + * @sa adi_uart_SubmitRxBuffer() + * + * @note: Only one transfer mode (DMA vs. PIO) can be used at once. For example, if you submit a buffer in PIO mode + * and then right away another using the DMA, this transaction will be denied. + * + */ +ADI_UART_RESULT adi_uart_SubmitTxBuffer( + ADI_UART_HANDLE const hDevice, + void *const pBuffer, + uint32_t const nBufSize, + bool const bDMA + ) +{ + +#ifdef ADI_DEBUG + /* Validate the device handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } + + /* Validate the pointer to the buffer memory. */ + if(pBuffer == NULL) + { + return(ADI_UART_INVALID_POINTER); + } + + /* Validate the buffer size. */ + if(nBufSize == 0U) + { + return(ADI_UART_FAILED); + } + + /* Autobaud in progress. */ + if(hDevice->bAutobaudInProgress == true) + { + return(ADI_UART_DEVICE_IN_USE); + } + + /* Make sure we are transmitting. */ + if(ADI_UART_DIR_RECEIVE == hDevice->eDirection) + { + return(ADI_UART_OPERATION_NOT_ALLOWED); + } + + /* Check the data transfer mode (only allowed in nonblocking mode). */ + if(hDevice->pChannelTx->eDataTranferMode == ADI_UART_DATA_TRANSFER_MODE_BLOCKING) + { + return(ADI_UART_INVALID_DATA_TRANSFER_MODE); + } + + /* Check that there is a free buffer to use for this transmit operation. pFreeBuffer + is the next buffer available, so if it is in use we can make the assumption that + there are no buffers available. The start address is set to NULL once the buffer + has finished being processed in "adi_uart_GetBuffer()" or "adi_uart_PendForBuffer()". + */ + if(hDevice->pChannelTx->pFreeBuffer->pStartAddress != NULL) + { + return(ADI_UART_OPERATION_NOT_ALLOWED); + } + + /* Make sure the DMA transfer size is not too large. */ + if((bDMA == true) && (nBufSize > DMA_TRANSFER_LIMIT)) + { + return(ADI_UART_INVALID_DATA_SIZE); + } + +#endif /* ADI_DEBUG */ + + /* Set the start address of the data buffer we are going to submit. */ + hDevice->pChannelTx->pFreeBuffer->pStartAddress = pBuffer; + + /* Set the buffer size to the size of the data buffer passed down from the API. */ + hDevice->pChannelTx->pFreeBuffer->nCount = nBufSize; + + /* Initialize the buffer index to zero because we will start shifting out + the Tx data from the first position of the buffer. + */ + hDevice->pChannelTx->pFreeBuffer->nIndex = 0U; + + /* Mark the buffer as in use so no other transactions can use it until this one is complete. */ + hDevice->pChannelTx->pFreeBuffer->bInUse = true; + + /* Mark the DMA as in use. */ + hDevice->pChannelTx->pFreeBuffer->bDMA = bDMA; + + /* Now that this "pFreeBuffer" is no longer free for use, update the + "pFreeBuffer" to the other PingPong buffer. Because there are only two + buffers in the PingPong structure, this will be the opposite of the one + we just submitted. "pFreeBuffer" will only be updated during the process of + submitting a buffer or a read/write operation. + */ + hDevice->pChannelTx->pFreeBuffer = hDevice->pChannelTx->pFreeBuffer->pNextBuffer; + + /* Set the data transfer mode in case it was #ADI_UART_DATA_TRANSFER_MODE_NONE. + This will be set back to #ADI_UART_DATA_TRANSFER_MODE_NONE once this + transaction is complete. Then, if a buffer is not currently active, set up the + interrupts for this transaction. Otherwise if a buffer is currently active, + this will be taken care of in the ISR. + */ + if (hDevice->pChannelTx->eDataTranferMode == ADI_UART_DATA_TRANSFER_MODE_NONE) + { + hDevice->pChannelTx->eDataTranferMode = ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING; + hDevice->pChannelTx->pfSubmitBuffer(hDevice, hDevice->pChannelTx->pFillBuffer); + } + + return(ADI_UART_SUCCESS); + } + +/*! \cond PRIVATE */ + +/* + * @brief This is an internal helper function for adi_uart_SubmitTxBuffer(). It sets up the Tx channel DMA + or device interrupts for the Tx channel to transmit data. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] pBuffer Pointer to buffer from where data will be transmitted. + * @param [in] nBufSize Size of the buffer containing the data to be transmitted(in bytes). + * @param [in] bDMA Submit the buffer using the DMA. +*/ +static void uart_submittxbuffer( + ADI_UART_CONST_HANDLE const hDevice, + ADI_UART_BUFF_INFO *const pBuffer + ) +{ + /* If this transmission is using DMA... */ + if (pBuffer->bDMA) + { + /* Enable clear source address decrement for TX channel DMA. */ + pADI_DMA0->SRCADDR_CLR = 1u << (uint32_t)hDevice->pUartInfo->dmaTxChannelNum; + + /* Enable Tx channel DMA. */ + pADI_DMA0->EN_SET = 1u << hDevice->pUartInfo->dmaTxChannelNum; + + /* Enable UART peripheral to generate DMA requests. */ + pADI_DMA0->RMSK_CLR = 1u << hDevice->pUartInfo->dmaTxChannelNum; + + /* Set the primary control data structure as the current DMA descriptor. */ + pADI_DMA0->ALT_CLR = 1u << hDevice->pUartInfo->dmaTxChannelNum; + + /* Fill in the DMA RAM descriptors */ + pPrimaryCCD[hDevice->pUartInfo->dmaTxChannelNum].DMASRCEND = ((uint32_t)pBuffer->pStartAddress + (uint32_t)(pBuffer->nCount - 1u)); + + pPrimaryCCD[hDevice->pUartInfo->dmaTxChannelNum].DMADSTEND = (uint32_t)&hDevice->pUARTRegs->TX; + + pPrimaryCCD[hDevice->pUartInfo->dmaTxChannelNum].DMACDC = ((uint32_t)ADI_DMA_INCR_NONE << DMA_BITP_CTL_DST_INC) | + ((uint32_t)ADI_DMA_INCR_1_BYTE << DMA_BITP_CTL_SRC_INC) | + (ADI_DMA_WIDTH_1_BYTE << DMA_BITP_CTL_SRC_SIZE) | + (0u << DMA_BITP_CTL_R_POWER) | + ((pBuffer->nCount - 1u) << DMA_BITP_CTL_N_MINUS_1) | + (DMA_ENUM_CTL_CYCLE_CTL_BASIC << DMA_BITP_CTL_CYCLE_CTL); + /* Enable UART DMA request interrupt for the Tx channel. */ + hDevice->pUARTRegs->IEN |= (BITM_UART_IEN_EDMAT); + } + else + /* If this transmission is using UART interrupts.. */ + { + /* Enable buffer empty interrupts. */ + hDevice->pUARTRegs->IEN |= (BITM_UART_IEN_ETBEI); + } +} + +/*! \endcond */ + +/*! + * @brief Submit an empty buffer for receiving the data in #ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING. + * This will set up the Rx channel for notification on incoming data using either the DMA + * or UART interrupts, as well as mark the buffer as submitted. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] pBuffer Pointer to buffer from that will be filled by the driver when data has been received. + * @param [in] nBufSize Size of the buffer(in bytes). Must be smaller than 1024 bytes for DMA transfers. + * @param [in] bDMA Submit the buffer using DMA flag. + + * + * @return Status + * - #ADI_UART_SUCCESS Successfully submitted the buffer for receiving data. + * - #ADI_UART_FAILED [D] Generic failure. In this case the size of the data buffer we are trying + * to submit is NULL. + * - #ADI_UART_INVALID_DATA_TRANSFER_MODE [D] Device is operating in #ADI_UART_DATA_TRANSFER_MODE_BLOCKING. This + * operation is only allowed in #ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING. + * - #ADI_UART_INVALID_HANDLE [D] Invalid UART device handle. + * - #ADI_UART_OPERATION_NOT_ALLOWED [D] Device direction is set up as #ADI_UART_DIR_TRANSMIT, so we can not complete + * a receive operation. The required directions are #ADI_UART_DIR_RECEIVE or + * #ADI_UART_DIR_BIDIRECTION. + * - #ADI_UART_INVALID_POINTER [D] Pointer to the buffer being submitted is NULL. + * - #ADI_UART_DEVICE_IN_USE [D] Autobaud in progress. + * - #ADI_UART_INVALID_DATA_SIZE [D] DMA transfers must be smaller than 1025 bytes. + * + * @sa adi_uart_IsRxBufferAvailable() + * @sa adi_uart_GetRxBuffer() + * @sa adi_uart_SubmitTxBuffer() + * + * @note: Only one transfer mode (DMA vs. PIO) can be used at once. For example, if you submit a buffer in PIO mode + * and then right away another using the DMA, this transaction will be denied. +*/ +ADI_UART_RESULT adi_uart_SubmitRxBuffer( + ADI_UART_HANDLE const hDevice, + void *const pBuffer, + uint32_t const nBufSize, + bool const bDMA + ) +{ + +#ifdef ADI_DEBUG + /* Validate the device handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } + + /* Validate the pointer to the buffer memory. */ + if(pBuffer == NULL) + { + return(ADI_UART_INVALID_POINTER); + } + + /* Validate the buffer size. */ + if(nBufSize == 0U ) + { + return(ADI_UART_FAILED); + } + + /* Autobaud in progress. */ + if(hDevice->bAutobaudInProgress == true) + { + return(ADI_UART_DEVICE_IN_USE); + } + + /* Make sure the UART device is configured to operate in the receive direction. */ + if(ADI_UART_DIR_TRANSMIT == hDevice->eDirection) + { + return(ADI_UART_OPERATION_NOT_ALLOWED); + } + + /* Check for the data transfer mode(only allowed in nonblocking mode). */ + if(hDevice->pChannelRx->eDataTranferMode == ADI_UART_DATA_TRANSFER_MODE_BLOCKING) + { + return(ADI_UART_INVALID_DATA_TRANSFER_MODE); + } + + /* Check that there is a free buffer to use for this operation. pFreeBuffer + is the next buffer available, so if it is in use we can make the assumption that + there are no buffers available. If the start address is not set to NULL, then we + can conclude the buffer has not finished being processed because this gets set in + adi_uart_pend_for_buffer() and adi_uart_get_buffer(). + */ + if(hDevice->pChannelRx->pFreeBuffer->pStartAddress != NULL) + { + return(ADI_UART_OPERATION_NOT_ALLOWED); + } + + /* Make sure the DMA transfer size is not too large. */ + if((bDMA == true) && (nBufSize > DMA_TRANSFER_LIMIT)) + { + return(ADI_UART_INVALID_DATA_SIZE); + } + +#endif /* ADI_DEBUG */ + + /* Set the start address of the buffer you are going to submit. */ + hDevice->pChannelRx->pFreeBuffer->pStartAddress = pBuffer; + + /* Set the size of the buffer. */ + hDevice->pChannelRx->pFreeBuffer->nCount = nBufSize; + + /* Initialize the buffer index to 0, because as we receive data it will be put into + the buffer starting at the first position. + */ + hDevice->pChannelRx->pFreeBuffer->nIndex = 0U; + + /* Mark the buffer as in use. */ + hDevice->pChannelRx->pFreeBuffer->bInUse = true; + + /* Mark the DMA as in use. */ + hDevice->pChannelRx->pFreeBuffer->bDMA = bDMA; + + /* Now that this "pFreeBuffer" is no longer free for use, update the + "pFreeBuffer" to the other PingPong buffer. Because there are only two + buffers in the PingPong structure, this will be the opposite of the one + we just submitted. "pFreeBuffer" will only be updated during the process of + submitting a buffer or a read/write operation. + */ + hDevice->pChannelRx->pFreeBuffer = hDevice->pChannelRx->pFreeBuffer->pNextBuffer; + + + /* Set the data transfer mode in case it was #ADI_UART_DATA_TRANSFER_MODE_NONE. + This will be set back to #ADI_UART_DATA_TRANSFER_MODE_NONE once this + transaction is complete. Then, if a buffer is not currently active, set up the + interrupts for this transaction. Otherwise if a buffer is currently active, + this will be taken care of in the ISR. + */ + if (hDevice->pChannelRx->eDataTranferMode == ADI_UART_DATA_TRANSFER_MODE_NONE) + { + hDevice->pChannelRx->eDataTranferMode = ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING; + hDevice->pChannelRx->pfSubmitBuffer(hDevice, hDevice->pChannelRx->pFillBuffer); + } + + return(ADI_UART_SUCCESS); +} + +/*! \cond PRIVATE */ + +/* + * @brief This is an internal helper function for adi_uart_SubmitRxBuffer(). It sets up the DMA + * or device receive interrupts for the Rx channel to receive data. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] pBuffer Pointer to the empty receive buffer. + * @param [in] nBufSize Size of the receive buffer(in bytes). + * @param [in] bDMA Submit the buffer using the DMA. +*/ +static void uart_submitrxbuffer( + ADI_UART_CONST_HANDLE const hDevice, + ADI_UART_BUFF_INFO *const pBuffer + ) +{ + + + /* If this transaction is using the DMA.. */ + if (pBuffer->bDMA) + { + /* Enable source address decrement for RX DMA channel. */ + pADI_DMA0->DSTADDR_CLR = 1u << (uint32_t)hDevice->pUartInfo->dmaRxChannelNum; + + /* Enable Rx DMA channel. */ + pADI_DMA0->EN_SET = 1u << hDevice->pUartInfo->dmaRxChannelNum; + + /* Enable UART peripheral to generate DMA requests. */ + pADI_DMA0->RMSK_CLR = 1u << hDevice->pUartInfo->dmaRxChannelNum; + + /* Set the primary data structure as the current DMA descriptor. */ + pADI_DMA0->ALT_CLR = 1u << hDevice->pUartInfo->dmaRxChannelNum; + + /* Fill in the DMA RAM descriptors. */ + pPrimaryCCD[hDevice->pUartInfo->dmaRxChannelNum].DMASRCEND = (uint32_t)&hDevice->pUARTRegs->RX; + + pPrimaryCCD[hDevice->pUartInfo->dmaRxChannelNum].DMADSTEND = ((uint32_t)pBuffer->pStartAddress + (uint32_t)(pBuffer->nCount - 1u)); + + pPrimaryCCD[hDevice->pUartInfo->dmaRxChannelNum].DMACDC = (uint32_t)(ADI_DMA_INCR_1_BYTE << DMA_BITP_CTL_DST_INC) | + (uint32_t)(ADI_DMA_INCR_NONE << DMA_BITP_CTL_SRC_INC) | + (ADI_DMA_WIDTH_1_BYTE << DMA_BITP_CTL_SRC_SIZE) | + (0u << DMA_BITP_CTL_R_POWER) | + ((pBuffer->nCount - 1u) << DMA_BITP_CTL_N_MINUS_1) | + (DMA_ENUM_CTL_CYCLE_CTL_BASIC << DMA_BITP_CTL_CYCLE_CTL); + /* Enable UART receive DMA requests. */ + hDevice->pUARTRegs->IEN |= (BITM_UART_IEN_EDMAR); + } + /* If this transaction is using UART interrupts.. */ + else + { + /* Enable buffer full interrupt. */ + hDevice->pUARTRegs->IEN |= (BITM_UART_IEN_ERBFI); + } +} + +/*! \endcond */ + +/*! + * @brief Transfer buffer ownership from the device back to the API if the data + * transmit has completed. Otherwise it will block until completion. + * This allows a nonblocking call to become blocking. + * This function is only called in #ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] ppBuffer Contains the address of the buffer passed down from the API + * for transmitting data. + * @param [out] pHwError Pointer to an integer that correlates with #ADI_UART_HW_ERRORS, containg the hardware status. + * If there is no hardware event, this will be 0. + * + * @return Status + * - #ADI_UART_SUCCESS Successfully returned buffer to the API. + * - #ADI_UART_HW_ERROR_DETECTED Hardware error(s) detected. "pHwError" can be checked for the specific error code(s). + * - #ADI_UART_OPERATION_NOT_ALLOWED [D] Call to this function is not allowed in #ADI_UART_DATA_TRANSFER_MODE_BLOCKING. + * - #ADI_UART_INVALID_HANDLE [D] Invalid UART device handle. + * - #ADI_UART_BUFFER_NOT_SUBMITTED [D] The buffer has not been submitted to the driver. + * + * @sa adi_uart_IsTxBufferAvailable() + * @sa adi_uart_SubmitTxBuffer() + * + * @note: If the transaction has already completed, this will return immediately rather than block. + */ +ADI_UART_RESULT adi_uart_GetTxBuffer( + ADI_UART_HANDLE const hDevice, + void **const ppBuffer, + uint32_t *pHwError + ) + +{ + +#ifdef ADI_DEBUG + /* Validate the device handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } + + /* Validate that this buffer has actually been submitted. */ + if(hDevice->pChannelTx->pActiveBuffer->pStartAddress == NULL) + { + return(ADI_UART_BUFFER_NOT_SUBMITTED); + } + + /* This function is allowed to be called when the channel is operating in NONBLOCKING mode. */ + if(hDevice->pChannelTx->eDataTranferMode == ADI_UART_DATA_TRANSFER_MODE_BLOCKING) + { + return(ADI_UART_OPERATION_NOT_ALLOWED); + } +#endif /* ADI_DEBUG */ + + /* Blocking call to get the submitted buffer */ + return(uart_getbuffer(hDevice, hDevice->pChannelTx, ppBuffer, pHwError)); +} + + + +/*! + * @brief Transfer buffer ownership from the device back to the API if the data + * receive has completed. Otherwise it will block until completion. + * This allows a nonblocking call to become blocking. + * This function is only called in #ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] ppBuffer Contains the address of the buffer passed down from the API + * for receiving data. + * @param [out] pHwError Pointer to an integer that correlates with #ADI_UART_HW_ERRORS, containg the hardware status. + * If there is no hardware event, this will be 0. + * + * @return Status + * - #ADI_UART_SUCCESS Successfully returned buffer to the API. + * - #ADI_UART_HW_ERROR_DETECTED Hardware error(s) detected. "pHwError" can be checked for the specific error code(s). + * - #ADI_UART_OPERATION_NOT_ALLOWED [D] Call to this function is not allowed in #ADI_UART_DATA_TRANSFER_MODE_BLOCKING. + * - #ADI_UART_INVALID_HANDLE [D] Invalid UART device handle. + * - #ADI_UART_BUFFER_NOT_SUBMITTED [D] The buffer has not been submitted to the driver. + * + * @sa adi_uart_IsRxBufferAvailable() + * @sa adi_uart_SubmitRxBuffer() + * + * @note: If the transaction has already completed, this will return immediately rather than block. +*/ +ADI_UART_RESULT adi_uart_GetRxBuffer( + ADI_UART_HANDLE const hDevice, + void **const ppBuffer, + uint32_t *pHwError + ) + +{ + +#ifdef ADI_DEBUG + /* Validate the device handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } + + /* Validate that this buffer has actually been submitted. */ + if(hDevice->pChannelRx->pActiveBuffer->pStartAddress == NULL) + { + return(ADI_UART_BUFFER_NOT_SUBMITTED); + } + + /* This function is only allowed to be called when the channel is operating in NONBLOCKING mode. */ + if(hDevice->pChannelRx->eDataTranferMode == ADI_UART_DATA_TRANSFER_MODE_BLOCKING) + { + return(ADI_UART_OPERATION_NOT_ALLOWED); + } +#endif /* ADI_DEBUG */ + + /* Blocking call to get the full Rx Buffer */ + return(uart_getbuffer(hDevice, hDevice->pChannelRx, ppBuffer, pHwError)); +} + +/*! \cond PRIVATE */ + +/* + * @brief This is an internal helper function for adi_uart_GetRxBuffer() and adi_uart_GetTxBuffer(). + * It blocks until until the completion of the data transaction. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] pChannel Pointer to UART channel data structure. + * @param [out] ppBuffer Contains the address of the buffer passed down from the API. + * @param [out] pHwError Pointer to an integer that correlates with #ADI_UART_HW_ERRORS, containg the hardware status. + * If there is no hardware event, this will be 0. + * + * @return Status + * - #ADI_UART_SUCCESS Successfully got buffer. + * - #ADI_UART_HW_ERROR_DETECTED Hardware error(s) detected. "pHwError" can be checked for the specific error code(s). + * +*/ +static ADI_UART_RESULT uart_getbuffer( + ADI_UART_HANDLE hDevice, + ADI_UART_DATA_CHANNEL *pChannel, + void **ppBuffer, + uint32_t *pHwError + ) +{ + /* Set ppBuffer to NULL in case there is an error. */ + *ppBuffer = NULL; + + /* Wait until the peripheral has finished processing the buffer. */ + SEM_PEND(pChannel,ADI_UART_FAILED); + + /* Save the address of the buffer that has just been processed, so it can be + returned back to the API. + */ + *ppBuffer = pChannel->pActiveBuffer->pStartAddress; + + /* Reinitialize the start address to NULL so this buffer can be used for a new transaction. */ + pChannel->pActiveBuffer->pStartAddress = NULL; + + /* Now that the desired data has either been transmitted or received, this buffer is no longer + in use. We can update "pActiveBuffer" to point to the next buffer that will become or is already + active. + */ + pChannel->pActiveBuffer = pChannel->pActiveBuffer->pNextBuffer; + + /* Set the data transfer mode to none so that the next transfer can be either in blocking or in nonblocking mode. + This will only be done if there are no other active buffers in flight to avoid disrupting an active transfer. + */ + if(pChannel->pActiveBuffer->pStartAddress == NULL) + { + pChannel->eDataTranferMode = ADI_UART_DATA_TRANSFER_MODE_NONE; + } + + /* If there are hardware errors and no callback, then return failure. */ + if(hDevice->nHwError != 0u) + { + /* Save the hardware error detected. This will be passed back to the API. */ + *pHwError = hDevice->nHwError; + + /* Clear any hardware errors detected. */ + hDevice->nHwError = 0u; + + return(ADI_UART_HW_ERROR_DETECTED); + } + else + { + return(ADI_UART_SUCCESS); + } +} + +/*! \endcond */ + + +/*! + * @brief Submit the buffer for transmitting the data in #ADI_UART_DATA_TRANSFER_MODE_BLOCKING. + * Call to this function will not return until the entire buffer is transmitted. + * Returns error if this function is called when device is operating in #ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING. + * i.e Function "adi_uart_SubmitTxBuffer()" is called and the transfer is not yet complete. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] pBuffer Pointer to data supplied by the API that is to be transmitted. + * @param [in] nBufSize Size of the buffer(in bytes). Must be smaller than 1024 bytes for DMA transfers. + * @param [in] bDMA Submit the buffer using the DMA flag. + * @param [out] pHwError Pointer to an integer that correlates with #ADI_UART_HW_ERRORS, containg the hardware status. + * If there is no hardware event, this will be 0. + * + * @return Status + * - #ADI_UART_SUCCESS Successfully transmitted the data from the submitted buffer. + * - #ADI_UART_HW_ERROR_DETECTED Hardware error(s) detected. "pHwError" can be checked for the specific error code(s). + * - #ADI_UART_FAILED [D] Generic failure. In this case the size of the data buffer we are trying + * to submit is NULL. + * - #ADI_UART_INVALID_DATA_TRANSFER_MODE [D] Device is operating in #ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING. This + * operation is only allowed in #ADI_UART_DATA_TRANSFER_MODE_BLOCKING. + * - #ADI_UART_OPERATION_NOT_ALLOWED [D] Device direction is set up as #ADI_UART_DIR_RECEIVE, so we can not complete + * a transmit operation. The required directions are #ADI_UART_DIR_TRANSMIT or + * #ADI_UART_DIR_BIDIRECTION. + * - #ADI_UART_INVALID_HANDLE [D] Invalid UART device handle. + * - #ADI_UART_INVALID_POINTER [D] The pointer to the buffer being submitted is a NULL. + * - #ADI_UART_DEVICE_IN_USE [D] Autobaud in progress. + * - #ADI_UART_INVALID_DATA_SIZE [D] DMA transfers must be smaller than 1025 bytes. + * + * @sa adi_uart_Read() + * @sa adi_uart_SubmitTxBuffer() + * + * @note: This function is a blocking function which means that the function returns only after the completion of + * buffer transmission. +*/ +ADI_UART_RESULT adi_uart_Write( + ADI_UART_HANDLE const hDevice, + void *const pBuffer, + uint32_t const nBufSize, + bool const bDMA, + uint32_t *pHwError + ) +{ + +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } + + /* Validate the pointer to the buffer memory. */ + if(pBuffer == NULL) + { + return(ADI_UART_INVALID_POINTER); + } + + /* Validate the buffer size. */ + if(nBufSize == 0U ) + { + return(ADI_UART_FAILED); + } + + /* Autobaud in progress. */ + if(hDevice->bAutobaudInProgress == true) + { + return(ADI_UART_DEVICE_IN_USE); + } + + /* Make sure we are transmitting. */ + if(ADI_UART_DIR_RECEIVE == hDevice->eDirection) + { + return(ADI_UART_OPERATION_NOT_ALLOWED); + } + + /* Check for the data transfer mode (only allowed in blocking mode). */ + if(hDevice->pChannelTx->eDataTranferMode == ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING) + { + return(ADI_UART_INVALID_DATA_TRANSFER_MODE); + } + + /* Check that there is a free buffer to use for this transmit operation. "pFreeBuffer" + is the next buffer available, so if it is in use we can make the assumption that + there are no buffers available. The start address is set to NULL once the buffer + has been processed. + */ + if(hDevice->pChannelTx->pFreeBuffer->pStartAddress != NULL) + { + return(ADI_UART_OPERATION_NOT_ALLOWED); + } + + /* Make sure the DMA transfer size is not too large. */ + if((bDMA == true) && (nBufSize > DMA_TRANSFER_LIMIT)) + { + return(ADI_UART_INVALID_DATA_SIZE); + } + +#endif /* ADI_DEBUG */ + + /* Set the data transfer mode in case it was #ADI_UART_DATA_TRANSFER_MODE_NONE. */ + hDevice->pChannelTx->eDataTranferMode = ADI_UART_DATA_TRANSFER_MODE_BLOCKING; + + /* Set the start address of the data buffer we are going to submit. */ + hDevice->pChannelTx->pFreeBuffer->pStartAddress = pBuffer; + + /* Set the buffer size to the size of the data buffer passed down from the API. */ + hDevice->pChannelTx->pFreeBuffer->nCount = nBufSize; + + /* Initialize the buffer index to zero because we will start shifting out + the Tx data from the first position of the buffer. + */ + hDevice->pChannelTx->pFreeBuffer->nIndex = 0U; + + /* Mark the buffer as in use so no other transactions can use it until this one is complete. */ + hDevice->pChannelTx->pFreeBuffer->bInUse = true; + + /* Mark the DMA as in use. */ + hDevice->pChannelTx->pFreeBuffer->bDMA = bDMA; + + /* Now that this "pFreeBuffer" is no longer free for use, update the + "pFreeBuffer" to the other PingPong buffer. Because there are only two + buffers in the PingPong structure, this will be the opposite of the one + we just submitted. "pFreeBuffer" will only be updated during the process of + submitting a buffer or a read/write operation. + */ + hDevice->pChannelTx->pFreeBuffer = hDevice->pChannelTx->pFreeBuffer->pNextBuffer; + + hDevice->pChannelTx->pfSubmitBuffer(hDevice, hDevice->pChannelTx->pFillBuffer); + + /* Block for the active buffer to complete. */ + return(uart_PendForBuffer(hDevice, hDevice->pChannelTx, pHwError)); +} + +/*! + * @brief Submit the buffer for reading the data in #ADI_UART_DATA_TRANSFER_MODE_BLOCKING. Call to this function will not + * return until the entire buffer is filled up. Returns error if this function is called when + * device is operating in #ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING. i.e The function "adi_uart_SubmitRxBuffer()" is called + * when the transfer is not yet complete. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] pBuffer Pointer to buffer from that will be filled by the driver when data has been received. + * @param [in] nBufSize Size of the buffer(in bytes). Must be smaller than 1024 bytes for DMA transfers. + * @param [in] bDMA Submit the buffer using DMA flag. + * @param [out] pHwError Pointer to an integer that correlates with #ADI_UART_HW_ERRORS, containg the hardware status. + * If there is no hardware event, this will be 0. + * + * @return Status + * - #ADI_UART_SUCCESS Successfully submitted the buffer for receiving data. + * - #ADI_UART_HW_ERROR_DETECTED Hardware error(s) detected. "pHwError" can be checked for the specific error code(s). + * - #ADI_UART_FAILED [D] Generic failure. In this case the size of the data buffer we are trying + * to submit is NULL. + * - #ADI_UART_INVALID_DATA_TRANSFER_MODE [D] Device is operating in #ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING. This + * operation is only allowed in #ADI_UART_DATA_TRANSFER_MODE_BLOCKING. + * - #ADI_UART_INVALID_HANDLE [D] Invalid UART device handle. + * - #ADI_UART_OPERATION_NOT_ALLOWED [D] Device direction is set up as #ADI_UART_DIR_TRANSMIT, so we can not complete + * a receive operation. The required directions are #ADI_UART_DIR_RECEIVE or + * #ADI_UART_DIR_BIDIRECTION. + * - #ADI_UART_INVALID_POINTER [D] Pointer to the buffer being submitted is NULL. + * - #ADI_UART_DEVICE_IN_USE [D] Autobaud in progress. + * - #ADI_UART_INVALID_DATA_SIZE [D] DMA transfers must be smaller than 1025 bytes. + * + * @sa adi_uart_Write() + * @sa adi_uart_SubmitTxBuffer() + * + * @note: This function is a blocking function which means that the function returns only after the completion of + * data receive. +*/ +ADI_UART_RESULT adi_uart_Read( + ADI_UART_HANDLE const hDevice, + void *const pBuffer, + uint32_t const nBufSize, + bool const bDMA, + uint32_t *pHwError + ) +{ + +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } + + /* Validate the pointer to the buffer memory. */ + if(pBuffer == NULL) + { + return(ADI_UART_INVALID_POINTER); + } + + /* Validate the buffer size. */ + if(nBufSize == 0U ) + { + return(ADI_UART_FAILED); + } + + /* Autobaud in progress. */ + if(hDevice->bAutobaudInProgress == true) + { + return(ADI_UART_DEVICE_IN_USE); + } + + /* Make sure the UART device is configured to operate in the receive direction. */ + if(ADI_UART_DIR_TRANSMIT == hDevice->eDirection) + { + return(ADI_UART_OPERATION_NOT_ALLOWED); + } + + /* Check for the data transfer mode(only allowed in blocking mode).*/ + if(hDevice->pChannelRx->eDataTranferMode == ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING) + { + return(ADI_UART_INVALID_DATA_TRANSFER_MODE); + } + + /* Check that there is a free buffer to use for this receive operation. "pFreeBuffer" + is the next buffer available, so if it is in use we can make the assumption that + there are no buffers available. The start address gets set to NULL once the buffer + processing has completed. + */ + if(hDevice->pChannelRx->pFreeBuffer->pStartAddress != NULL) + { + return(ADI_UART_OPERATION_NOT_ALLOWED); + } + + /* Make sure the DMA transfer size is not too large. */ + if((bDMA == true) && (nBufSize > DMA_TRANSFER_LIMIT)) + { + return(ADI_UART_INVALID_DATA_SIZE); + } + +#endif /* ADI_DEBUG */ + + /* Set the data transfer mode in case it was #ADI_UART_DATA_TRANSFER_MODE_NONE. + This will be set back to #ADI_UART_DATA_TRANSFER_MODE_NONE once this + transaction is complete. + */ + hDevice->pChannelRx->eDataTranferMode = ADI_UART_DATA_TRANSFER_MODE_BLOCKING; + + /* Set the start address of the buffer you are going to submit. */ + hDevice->pChannelRx->pFreeBuffer->pStartAddress = pBuffer; + + /* Set the size of the buffer. */ + hDevice->pChannelRx->pFreeBuffer->nCount = nBufSize; + + /* Initialize the buffer index to 0, because as we receive data it will be put into + the buffer starting at the first position. + */ + hDevice->pChannelRx->pFreeBuffer->nIndex = 0U; + + /* Mark the buffer as in use. */ + hDevice->pChannelRx->pFreeBuffer->bInUse = true; + + /* Mark the DMA as in use. */ + hDevice->pChannelRx->pFreeBuffer->bDMA = bDMA; + + + /* Now that this "pFreeBuffer" is no longer free for use, update the + "pFreeBuffer" to the other PingPong buffer. Because there are only two + buffers in the PingPong structure, this will be the opposite of the one + we just submitted. "pFreeBuffer" will only be updated during the process of + submitting a buffer or a read/write operation. + */ + hDevice->pChannelRx->pFreeBuffer = hDevice->pChannelRx->pFreeBuffer->pNextBuffer; + + hDevice->pChannelRx->pfSubmitBuffer(hDevice, hDevice->pChannelRx->pFillBuffer); + + /* Block for the active buffer to complete. */ + return(uart_PendForBuffer(hDevice, hDevice->pChannelRx, pHwError)); +} + +/*! \cond PRIVATE */ + +/* + * @brief Pends for data transaction to complete. Buffer gets returned to API. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] pChannel Pointer to UART channel data structure. + * @param [out] pBuffer Address of buffer on which data transfer being carried out. + * @param [out] pHwError Pointer to an integer that correlates with #ADI_UART_HW_ERRORS, containg the hardware status. + * If there is no hardware event, this will be 0. + * + * @return Status + * - #ADI_UART_SUCCESS Successfully got buffer. + * - #ADI_UART_HW_ERROR_DETECTED Hardware error(s) detected. "pHwError" can be checked for the specific error code(s). + * +*/ +static ADI_UART_RESULT uart_PendForBuffer( + ADI_UART_HANDLE const hDevice, + ADI_UART_DATA_CHANNEL *pChannel, + uint32_t *pHwError + ) +{ + + /* Wait until the peripheral has finished processing the buffer. */ + SEM_PEND(pChannel,ADI_UART_FAILED); + + /* Reinitialize the start address to NULL so this buffer can be used for a new transaction. */ + pChannel->pActiveBuffer->pStartAddress = NULL; + + /* Now that the desired data has either been transmitted or received, this buffer is no longer + in use. We can update "pActiveBuffer" to point to the next buffer that will become or is already + active. This will only be updated in places where transactions are completed, + such as uart_PendForBuffer() and uart_GetBuffer(). + */ + pChannel->pActiveBuffer = pChannel->pActiveBuffer->pNextBuffer; + + /* Set the data transfer mode to none so that the next transfer can be either in blocking or in nonblocking mode. + Only if there are no active buffers. + */ + if(pChannel->pActiveBuffer->pStartAddress == NULL) + { + pChannel->eDataTranferMode = ADI_UART_DATA_TRANSFER_MODE_NONE; + } + + /* If there are hardware errors and no callback, then return failure. */ + if(hDevice->nHwError != 0u) + { + /* Save the hardware error detected. This will be passed back to the API. */ + *pHwError = hDevice->nHwError; + + /* Clear any hardware errors detected. */ + hDevice->nHwError = 0u; + + return(ADI_UART_HW_ERROR_DETECTED); + } + else + { + return(ADI_UART_SUCCESS); + } + +} +/*! \endcond */ + + +/*! + * @brief Peek function to know if an empty buffer is avilable. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [out] pbAvailable Pointer to a boolean variable. Contains "true" if there is an empty buffer + * and a call to "adi_uart_GetTxBuffer" is ensured to be successful. Contains + * "false" if there is no empty buffer. + * @return Status + * - #ADI_UART_SUCCESS Successfully retrieved the status of availability of the buffer. + * - #ADI_UART_INVALID_HANDLE [D] Invalid UART device handle. + * - #ADI_UART_OPERATION_NOT_ALLOWED [D] Call to this function is not allowed in #ADI_UART_DATA_TRANSFER_MODE_BLOCKING. + * + * @sa adi_uart_GetTxBuffer() + * @sa adi_uart_IsRxBufferAvailable + * + */ + +ADI_UART_RESULT adi_uart_IsTxBufferAvailable( + ADI_UART_HANDLE const hDevice, + bool *const pbAvailable + ) +{ + +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } + + /* This function is only allowed to be called when the channel is operating in NONBLOCKING mode. */ + if(hDevice->pChannelTx->eDataTranferMode == ADI_UART_DATA_TRANSFER_MODE_BLOCKING) + { + return(ADI_UART_OPERATION_NOT_ALLOWED); + } +#endif /* ADI_DEBUG */ + + /* Initialize to "false" in case of an error. */ + *pbAvailable = false; + + /* Make sure the buffer has not already been processed. This would mean that there are + currently no active buffers. This is only updated in adi_uart_GetBuffer(), which is + called once a transaction has completed. + */ + if (hDevice->pChannelTx->pActiveBuffer->pStartAddress != NULL) + { + /* If the buffer has reached the interrupt handler, "bInUse" will be + updated so we know that the buffer has become available. + */ + if (hDevice->pChannelTx->pActiveBuffer->bInUse == false) + { + *pbAvailable = true; + } + } + return(ADI_UART_SUCCESS); +} + +/*! + * @brief Peek function to know if a filled buffer is available. + * + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [out] pbAvailable Pointer to a boolean variable. Contains "true" if there is an empty buffer + * and a call to "adi_uart_GetTxBuffer" is ensured to be successful. Contains + * "false" if there is no empty buffer. + * @return Status + * - #ADI_UART_SUCCESS Successfully retrieved the status of availability of the buffer. + * - #ADI_UART_INVALID_HANDLE [D] Invalid UART device handle. + * - #ADI_UART_OPERATION_NOT_ALLOWED [D] Call to this function is not allowed in #ADI_UART_DATA_TRANSFER_MODE_BLOCKING. + * + * @sa adi_uart_GetRxBuffer() + * + */ +ADI_UART_RESULT adi_uart_IsRxBufferAvailable( + ADI_UART_HANDLE const hDevice, + bool *const pbAvailable + ) +{ + +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } + + /* This function is only allowed to be called when the channel is operating in NONBLOCKING mode. */ + if(hDevice->pChannelRx->eDataTranferMode == ADI_UART_DATA_TRANSFER_MODE_BLOCKING) + { + return(ADI_UART_OPERATION_NOT_ALLOWED); + } +#endif /* ADI_DEBUG */ + + /* Initialize to "false" in case of an error. */ + *pbAvailable = false; + + /* Make sure the buffer has not already been processed. This would mean that there are + currently no active buffers. This is only updated in adi_uart_GetBuffer(), which is + called once a transaction has completed. + */ + if(hDevice->pChannelRx->pActiveBuffer->pStartAddress != NULL) + { + /* If the buffer has reached the interrupt handler, "bInUse" will be + updated so we know that the buffer has become available. + */ + if (hDevice->pChannelRx->pActiveBuffer->bInUse == false) + { + *pbAvailable = true; + } + } + return(ADI_UART_SUCCESS); +} + +/*! + * @brief Function to let the API know if all the data had been drained from the Tx shift registers. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [out] pbComplete Pointer to a boolean variable. Contains "true" if there is no data left in the + * device to transmit and device can be disabled without data loss. Contains "false" + * if the data transmission is not complete. + * @return Status + * - #ADI_UART_SUCCESS Successfully retrieved the status of data transmission. + * - #ADI_UART_INVALID_HANDLE [D] Specified handle is invalid. + * + * @note adi_uart_getTxBuffer() or the callback may indicate that a transmit transaction is complete when the + * device is using the DMA. This is because the interrupt will trigger once the transmit holding register is empty. + However, there may still be a some data in the shift register. If the transmit channel needs + * to be closed then the application must poll the transmit channel to see if all data has indeed been transmitted before + * shutting down the channel. Otherwise data will be lost. + * + */ + +ADI_UART_RESULT adi_uart_IsTxComplete( + ADI_UART_HANDLE const hDevice, + bool *const pbComplete + ) +{ +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } +#endif /* ADI_DEBUG */ + + /* Initialize to false. */ + *pbComplete = false; + + /* If the register is empty, set the return variable to "true". + This register is empty, when the value becomes a 1. + */ + if((hDevice->pUARTRegs->LSR & BITM_UART_LSR_TEMT) == BITM_UART_LSR_TEMT) + { + *pbComplete = true; + } + return(ADI_UART_SUCCESS); +} + + +/*! + * @brief Registering a callback function. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] pfCallback Function pointer to callback. Passing a NULL pointer will unregister + * the callback function. + * @param [in] pCBParam Callback function parameter. + * + * @return Status + * - #ADI_UART_SUCCESS Successfully registered callback function. + * - #ADI_UART_DEVICE_IN_USE [D] This operation is not allowed when a data transfer is in progress. + * - #ADI_UART_INVALID_HANDLE [D] Invalid UART device handle. + * + * +*/ +ADI_UART_RESULT adi_uart_RegisterCallback( + ADI_UART_HANDLE const hDevice, + const ADI_CALLBACK pfCallback, + void *const pCBParam + ) +{ + +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } + + /* Make sure there are no active buffers on any active channel and autobaud is not in progress. */ + if(((hDevice->eDirection != ADI_UART_DIR_TRANSMIT) && (hDevice->pChannelRx->pActiveBuffer->pStartAddress != NULL)) || + ((hDevice->eDirection != ADI_UART_DIR_RECEIVE ) && (hDevice->pChannelTx->pActiveBuffer->pStartAddress != NULL)) || + (hDevice->bAutobaudInProgress == true)) + { + return(ADI_UART_DEVICE_IN_USE); + } +#endif /* ADI_DEBUG */ + + /* Set the device callback. */ + hDevice->pfCallback = pfCallback; + + /* Set the callback parameter. */ + hDevice->pCBParam = pCBParam; + + return(ADI_UART_SUCCESS); +} + + +/*! + * @brief Configuration of UART data. + * + * @details Sets the configuration parameters for the specified UART device such as wordlength, whether to + * enable/disable the parity, and the number of stop bits. This function returns an error if the + * device has active data or autobaud is in progress. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] eParity Specify the type of parity check for the UART device. + * @param [in] eStopBits Specify the stop-bits for the UART device. + * @param [in] eWordLength Specify the word size of the data for the UART device. + * + * @return Status + * - #ADI_UART_SUCCESS Successfully set the data configuration. + * - #ADI_UART_DEVICE_IN_USE [D] This operation is not allowed when a data transfer or autobaud is in progress. + * - #ADI_UART_INVALID_HANDLE [D] Invalid UART device handle. + * +*/ +ADI_UART_RESULT adi_uart_SetConfiguration( + ADI_UART_HANDLE const hDevice, + ADI_UART_PARITY const eParity, + ADI_UART_STOPBITS const eStopBits, + ADI_UART_WORDLEN const eWordLength + ) +{ +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } + + /* Make sure there are no active buffers on any active channel and autobaud is not in progress. */ + if(((hDevice->eDirection != ADI_UART_DIR_TRANSMIT) && (hDevice->pChannelRx->pActiveBuffer->pStartAddress != NULL)) || + ((hDevice->eDirection != ADI_UART_DIR_RECEIVE ) && (hDevice->pChannelTx->pActiveBuffer->pStartAddress != NULL)) || + (hDevice->bAutobaudInProgress == true)) + { + return(ADI_UART_DEVICE_IN_USE); + } +#endif /* ADI_DEBUG */ + + /* Clear all the fields. */ + uint16_t nDataCfg = hDevice->pUARTRegs->LCR & (uint16_t)(~(BITM_UART_LCR_WLS |BITM_UART_LCR_STOP |BITM_UART_LCR_PEN)); + + /* Construct the configuration word. */ + nDataCfg |= (uint16_t)(((uint16_t)((uint16_t)eWordLength |(uint16_t)eStopBits) |(uint16_t)eParity)); + + /* Write to the register */ + hDevice->pUARTRegs->LCR = nDataCfg; + + /* Return Success */ + return(ADI_UART_SUCCESS); +} + +/*! + * @brief Set baudrate by configuring the fractional dividors. + * + * @details Baudrate is calculated as per below equation. + * + * Baudrate = (UARTCLK / (nDivM + nDivN/2048)*pow(2,nOSR+2)* nDivC)). + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] nDivC Specify the "nDivC" in the above equation. + * @param [in] nDivM Specify the "nDivM" in the above equation. + * @param [in] nDivN Specify the "nDivN" in the above equation. + * @param [in] nOSR Specify the "nOSR" " in the above equation. + * + * @return Status + * - #ADI_UART_SUCCESS Successfully set the baudrate for the device. + * - #ADI_UART_INVALID_HANDLE [D] Invalid UART device handle. + * - #ADI_UART_DEVICE_IN_USE [D] Device is in use + * - #ADI_UART_INVALID_PARAMETER [D] Input for baud rate values are out of range. + * + * @sa adi_uart_GetBaudRate() + * @sa adi_uart_EnableAutobaud(); + * + * @note It is expected that initialization of the power management + * driver is done before calling this function. + * + */ +ADI_UART_RESULT adi_uart_ConfigBaudRate( + ADI_UART_HANDLE const hDevice, + uint16_t const nDivC, + uint8_t const nDivM, + uint16_t const nDivN, + uint8_t const nOSR + ) +{ +#ifdef ADI_DEBUG + /* Validate the given handle */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } + + /* Make sure there are no active buffers on any active channel. */ + if(((hDevice->eDirection != ADI_UART_DIR_TRANSMIT) && (hDevice->pChannelRx->pActiveBuffer->pStartAddress != NULL)) || + ((hDevice->eDirection != ADI_UART_DIR_RECEIVE ) && (hDevice->pChannelTx->pActiveBuffer->pStartAddress != NULL))) + { + return(ADI_UART_DEVICE_IN_USE); + } + + /* Check if the given baudrate is valid */ + if( (nDivM < 1u) || (nDivM > 3u)|| (nDivN > 2047u ) || (nOSR > 3u)) + { + return ADI_UART_INVALID_PARAMETER; + } + +#endif /* ADI_DEBUG */ + + /* Write back the register contents for baudrate detection in the hardware. */ + hDevice->pUARTRegs->DIV = nDivC; + hDevice->pUARTRegs->FBR = (uint16_t)((uint16_t)nDivN | (uint16_t)((uint16_t)nDivM <pUARTRegs->LCR2 = nOSR; + + return(ADI_UART_SUCCESS); +} + + +/*! + * @brief Get the baudrate of the UART device instance. This is used in the scenario when a callback has not been initialized. + * This allows the the API to know if autobaud is complete. If this returns a baudrate other than 0, + * it indicates that the autobaud completed, otherwise autobaud is still in progress. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [out] pnBaudRate Pointer to a location where baudrate is to be written. + * @param [out] pAutobaudError Pointer to an integer that will hold the value of any baudrate error(s), that correlates with + * #ADI_UART_AUTOBAUD_ERRORS. This will be 0 if there are no errors. + * + * @return Status + * - #ADI_UART_SUCCESS Successfully retrieved the baudrate. + * - #ADI_UART_AUTOBAUD_ERROR_DETECTED There has been an autobaud error. The API can get the specific error(s) + * by checking "pAutobaudError". + * - #ADI_UART_INVALID_HANDLE [D] Invalid UART device handle. + * - #ADI_UART_INVALID_POINTER [D] The pointer to baudrate or autobaud error is NULL. + + * +*/ +ADI_UART_RESULT adi_uart_GetBaudRate( + ADI_UART_HANDLE const hDevice, + uint32_t *pnBaudRate, + uint32_t *pAutobaudError + ) +{ + +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } + + /* Validate pointers. */ + if(pnBaudRate == NULL) + { + return(ADI_UART_INVALID_POINTER); + } + +#endif /* ADI_DEBUG */ + + /* If an error occured during autobaud this value will be set to a + non-zero value. The specific error can be found by checking against + #ADI_UART_EVENT. + */ + if(hDevice->nAutobaudError != 0u) + { + /* Save the autobaud error to pass back to the API.*/ + *pAutobaudError = hDevice->nAutobaudError; + + /* Clear the autobaud errors found. */ + hDevice->nAutobaudError = 0u; + + return(ADI_UART_AUTOBAUD_ERROR_DETECTED); + } + + /* Return the baudrate. If this is 0, then autobaud has not completed. */ + *pnBaudRate = hDevice->nBaudRate; + + return(ADI_UART_SUCCESS); +} + + +/*! + * @brief Enable/Disable UART autobaud detection as well as configures the device for autobaud detection. + * + * @details The baud rate is detected using the hardware support. + * After the baud rate is detected the interrupt handler is notified of the completion. + * When a callback is not registered with UART driver, the API adi_uart_GetBaudRate() + * can be used to know if autobaud is complete. Autobaud needs to be disabled in order to + * clear the internal counter and to close the device. + * + * @param [in] hDevice Handle to UART device whose autobaud detection to be enabled/disabled. + * @param [in] bEnable Boolean flag to indicate whether to enable or disable the autobaud. + * @param [in] bAutobaudCallbackMode Use a callback to report autobaud errors or type #ADI_UART_AUTOBAUD_ERRORS. + * + * @return Status + * - #ADI_UART_SUCCESS Successfully enabled/disabled Autobaud detection. + * - #ADI_UART_DEVICE_IN_USE [D] Trying to enable/disable Autobaud when + * dataflow is enabled or autobaud is in progress. + * - #ADI_UART_INVALID_HANDLE [D] Invalid UART device handle. + * + * @sa adi_uart_GetBaudRate() + * + * @note: For autobaud we assume the key character being used is a carrige return (0xD), so the start edge count is + * hardcoded to the second edge (first edge after start edge) and the last edge count is set to the fouth edge. + * This will give us a total bit count of 8 bits that we will time in order to figure out the baud rate (bits/second). + */ +ADI_UART_RESULT adi_uart_EnableAutobaud( + ADI_UART_HANDLE const hDevice, + bool const bEnable, + bool const bAutobaudCallbackMode + ) +{ + +#ifdef ADI_DEBUG + /* Validate the given handle */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } + + /* Make sure there are no active buffers on any active channel and autobaud is not in progress. */ + if(((hDevice->eDirection != ADI_UART_DIR_TRANSMIT) && (hDevice->pChannelRx->pActiveBuffer->pStartAddress != NULL)) || + ((hDevice->eDirection != ADI_UART_DIR_RECEIVE ) && (hDevice->pChannelTx->pActiveBuffer->pStartAddress != NULL))) + { + return(ADI_UART_DEVICE_IN_USE); + } + +#endif /* ADI_DEBUG */ + + if(bEnable) + { + /* Enable Autobaud, timeout interrupt and done interrupt in the autobaud control register. + Set the starting edge trigger to the second edge. Set the ending edge count to + the fourth edge, for the carrige return key character (0xD). + */ + hDevice->pUARTRegs->ACR |=(BITM_UART_ACR_ABE | BITM_UART_ACR_DNIEN | BITM_UART_ACR_TOIEN |(1u << 4u) | (3u << 8u)); + + /* Initialize device baudrate to 0. This will be set once autobaud is complete. */ + hDevice->nBaudRate = 0u; + + /* Change the state to indicate autobaud is in progress. */ + hDevice->bAutobaudInProgress = true; + + /* Set the callback mode for autobaud based on the user input. */ + hDevice->bAutobaudCallbackMode = bAutobaudCallbackMode; + } + else + { + /* Change the state to indicate autobaud is not in progress. */ + hDevice->bAutobaudInProgress = false; + + /* Disable Autobaud, timeout interrupt and done interrupt in the autobaud control register. */ + hDevice->pUARTRegs->ACR |= (uint16_t)(~(uint32_t)BITM_UART_ACR_ABE | ~(uint32_t)BITM_UART_ACR_DNIEN | ~(uint32_t)BITM_UART_ACR_TOIEN); + + /* Initialize device baudrate to 0. */ + hDevice->nBaudRate = 0u; + } + + return ADI_UART_SUCCESS; +} + +/*! + * @brief Forces the UART to send out a break signal. + * + * @details Sets the UART Tx pin to a logic-low/high (depending upon the + * Tx polarity) asynchronously. The UART keeps transmitting break + * until it is disabled to send the break. + * + * @param [in] hDevice Handle to the UART whose Tx is forced to + * send a break. + * @param [in] bEnable Flag which indicates whether to enable or + * disable transmitting the break. + * + * @return Status + * + * - #ADI_UART_SUCCESS If successfully enabled or disabled sending break. + * - #ADI_UART_INVALID_HANDLE [D] If the given UART handle is invalid. + */ +ADI_UART_RESULT adi_uart_ForceTxBreak( + ADI_UART_HANDLE const hDevice, + bool const bEnable + ) +{ + +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } +#endif /* ADI_DEBUG */ + + if(bEnable == true) + { + /* Set the force break bit. */ + hDevice->pUARTRegs->LCR |= BITM_UART_LCR_BRK; + } + else + { + /* Clear the force break bit. */ + hDevice->pUARTRegs->LCR &= (uint16_t)~(BITM_UART_LCR_BRK); + } + + return ADI_UART_SUCCESS; +} + +/*! + * @brief Enable/Disable the loopback for the specified UART device. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] bEnable Boolean flag to indicate whether to enable or disable the loopback mode. + * + * @return Status + * - #ADI_UART_SUCCESS Successfully enable/disable the loopback. + * - #ADI_UART_INVALID_HANDLE Invalid UART device handle. + * +*/ +ADI_UART_RESULT adi_uart_EnableLoopBack( + ADI_UART_HANDLE const hDevice, + bool const bEnable + ) +{ + +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } +#endif /* ADI_DEBUG */ + + if(true == bEnable) + { + /* Enable loopback. */ + hDevice->pUARTRegs->MCR |= (BITM_UART_MCR_LOOPBACK); + } + else + { + /* Disable loopback. */ + hDevice->pUARTRegs->MCR &= (uint16_t)~(BITM_UART_MCR_LOOPBACK); + } + return(ADI_UART_SUCCESS); +} + +/*! + * @brief Sets the RX FIFO trigger level. This will be the amount of data in the FIFO + * that will trigger an interrupt. + * + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] eTriglevel Trigger level to be set in terms of number of bytes. + * + * @return Status + * - #ADI_UART_SUCCESS Successfully set the trigger level. + * - #ADI_UART_INVALID_HANDLE [D] The given UART handle is invalid. + */ +ADI_UART_RESULT adi_uart_SetRxFifoTriggerLevel( + ADI_UART_CONST_HANDLE const hDevice, + ADI_UART_TRIG_LEVEL const eTriglevel + ) +{ +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } +#endif /* ADI_DEBUG */ + + /* Clear existing FIFO trigger level. */ + hDevice->pUARTRegs->FCR &= (uint16_t)~BITM_UART_FCR_RFTRIG; + + /* Set the FIFO trigger level. */ + hDevice->pUARTRegs->FCR |= (uint16_t)eTriglevel; + + return(ADI_UART_SUCCESS); +} +/*! + * @brief Enables internal FIFO as to work in 16550 mode. This helps to minimize system overhead + * and maximize system efficiency. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] bEnable Boolean flag to indicate whether to enable or disable FIFO. + * + * @return Status + * - #ADI_UART_SUCCESS If successfully enabled FIFO for UART device. + * - #ADI_UART_INVALID_HANDLE [D] The given UART handle is invalid. + */ +ADI_UART_RESULT adi_uart_EnableFifo( + ADI_UART_HANDLE const hDevice, + bool const bEnable + ) +{ + +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } +#endif /* ADI_DEBUG */ + + if(bEnable == true) + { + /* Enable TX/RX FIFO. */ + hDevice->pUARTRegs->FCR |= BITM_UART_FCR_FIFOEN; + hDevice->pUARTRegs->IEN |= (BITM_UART_IEN_ERBFI); + + hDevice->bRxFifoEn = true; + + } + else + { + /* Disable TX/RX FIFO. */ + hDevice->pUARTRegs->FCR &= (uint16_t)~(BITM_UART_FCR_FIFOEN); + + hDevice->bRxFifoEn = false; + } + + return ADI_UART_SUCCESS; +} + +/*! + * @brief To flush the TX FIFO. + * + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * + * + * @return Status + * - #ADI_UART_SUCCESS Successfully flushed TX Fifo. + * - #ADI_UART_INVALID_HANDLE [D] The given UART handle is invalid. + */ +ADI_UART_RESULT adi_uart_FlushTxFifo( + ADI_UART_CONST_HANDLE const hDevice + ) +{ + +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } +#endif /* ADI_DEBUG */ + + /* Flush the Tx FIFO. */ + hDevice->pUARTRegs->FCR |= BITM_UART_FCR_TFCLR; + + return(ADI_UART_SUCCESS); +} + +/*! + * @brief Flush the RX FIFO. + * + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * + * + * @return Status + * - #ADI_UART_SUCCESS Successfully flushed RX Fifo. + * - #ADI_UART_INVALID_HANDLE [D] The given UART handle is invalid. + */ +ADI_UART_RESULT adi_uart_FlushRxFifo( + ADI_UART_CONST_HANDLE const hDevice + ) +{ + +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } +#endif /* ADI_DEBUG */ + + /* Flush RX FIFO. */ + hDevice->pUARTRegs->FCR |= BITM_UART_FCR_RFCLR; + + return ADI_UART_SUCCESS; +} + +/*! + * @brief Flush the Rx channel and disable interrupts. This will stop any buffers in flight and + * clear out any data that was in the RX holding register as well as the Rx fifo. Once this is done, + * in order to turn back on Rx interrupts, a new transaction will need to be started (adi_uart_Read() + * or adi_uart_SubmitRxBuffer()). + * + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * + * @return Status + * - #ADI_UART_SUCCESS Successfully flushed the Rx channel. + * - #ADI_UART_INVALID_HANDLE [D] The given UART handle is invalid. + */ +ADI_UART_RESULT adi_uart_FlushRxChannel( + ADI_UART_CONST_HANDLE const hDevice + ) +{ + +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } +#endif /* ADI_DEBUG */ + + /* Disable receive interrupts in PIO mode as well as DMA mode. */ + hDevice->pUARTRegs->IEN &= (uint16_t)~(BITM_UART_IEN_ERBFI | BITM_UART_IEN_EDMAR); + + /* Clear any data in the Rx Fifo. */ + hDevice->pUARTRegs->FCR |= BITM_UART_FCR_RFCLR; + + /* Reset the buffers to 0. */ + memset(hDevice->pChannelRx->PingPong,0, sizeof (hDevice->pChannelRx->PingPong)); + + hDevice->pChannelRx->PingPong[0].pNextBuffer = &hDevice->pChannelRx->PingPong[1]; + hDevice->pChannelRx->PingPong[1].pNextBuffer = &hDevice->pChannelRx->PingPong[0]; + + /* Reset the buffer pointers. */ + hDevice->pChannelRx->pActiveBuffer = &hDevice->pChannelRx->PingPong[0]; + hDevice->pChannelRx->pFreeBuffer = &hDevice->pChannelRx->PingPong[0]; + hDevice->pChannelRx->pFillBuffer = &hDevice->pChannelRx->PingPong[0]; + + /* Dummy read to flush the RX register. */ + hDevice->pUARTRegs->RX; + + return(ADI_UART_SUCCESS); +} + +/*! + * @brief Flush the Tx channel and disable interrupts.This will stop any buffers in flight and + * clear out any data that was in the TX holding register. Any data in the TX shift register + * will still finish transmitting. + * + * + * @param [in] hDevice Device handle to UART device obtained when an UART device is opened successfully. + * + * @return Status + * - #ADI_UART_SUCCESS Successfully flushed the Tx channel. + * - #ADI_UART_INVALID_HANDLE [D] The given UART handle is invalid. + */ +ADI_UART_RESULT adi_uart_FlushTxChannel(ADI_UART_CONST_HANDLE const hDevice) +{ + +#ifdef ADI_DEBUG + /* Validate the given handle. */ + if(ValidateHandle(hDevice) != ADI_UART_SUCCESS) + { + return(ADI_UART_INVALID_HANDLE); + } +#endif /* ADI_DEBUG */ + + /* Disable transmit interrupts in PIO mode as well as DMA mode. */ + hDevice->pUARTRegs->IEN &= (uint16_t)~(BITM_UART_IEN_ETBEI | BITM_UART_IEN_EDMAT); + + /* Clear any data in the Rx Fifo. */ + hDevice->pUARTRegs->FCR |= BITM_UART_FCR_TFCLR; + + /* Reset the buffers to 0. */ + memset(hDevice->pChannelTx->PingPong,0, sizeof (hDevice->pChannelTx->PingPong)); + + hDevice->pChannelTx->PingPong[0].pNextBuffer = &hDevice->pChannelTx->PingPong[1]; + hDevice->pChannelTx->PingPong[1].pNextBuffer = &hDevice->pChannelTx->PingPong[0]; + + /* Reset the buffer pointers. */ + hDevice->pChannelTx->pActiveBuffer = &hDevice->pChannelTx->PingPong[0]; + hDevice->pChannelTx->pFreeBuffer = &hDevice->pChannelTx->PingPong[0]; + hDevice->pChannelTx->pFillBuffer = &hDevice->pChannelTx->PingPong[0]; + + return(ADI_UART_SUCCESS); +} + + +/*! \cond PRIVATE */ + +void UART0_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_UART_HANDLE hDevice = (ADI_UART_HANDLE)uart_device_info[0].hDevice; + Common_Uart_Interrupt_Handler(hDevice); +#if defined(ADI_CYCLECOUNT_UART_ISR_ENABLED) && (ADI_CYCLECOUNT_UART_ISR_ENABLED == 1u) + ADI_CYCLECOUNT_STORE(ADI_CYCLECOUNT_ISR_UART); +#endif + ISR_EPILOG(); + return; +} + +void UART1_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_UART_HANDLE hDevice = (ADI_UART_HANDLE)uart_device_info[1].hDevice; + Common_Uart_Interrupt_Handler(hDevice); +#if defined(ADI_CYCLECOUNT_UART_ISR_ENABLED) && (ADI_CYCLECOUNT_UART_ISR_ENABLED == 1u) + ADI_CYCLECOUNT_STORE(ADI_CYCLECOUNT_ISR_UART); +#endif + ISR_EPILOG(); + return; +} + +static void Common_Uart_Interrupt_Handler(ADI_UART_HANDLE hDevice) +{ + switch(hDevice->pUARTRegs->IIR & BITM_UART_IIR_STAT ) + { + /* Tx buffer empty interrupt. This means that the data has successfully left the holding register and is + now in transmit shift register or has completed its transfer. + */ + case ENUM_UART_IIR_STAT_ETBEI: + uart_TxDataHandler(hDevice); + break; + + /* Rx buffer FIFO timeout interrupt. This means that we have data in the RX FIFO + but there is not enough data to trigger an interrupt so we will process this data here. + */ + case ENUM_UART_IIR_STAT_RFTOI: + uart_RxDataHandler(hDevice); + break; + + /* Rx buffer full interrupt. This means that the RX buffer has finished receiving data. */ + case ENUM_UART_IIR_STAT_ERBFI: + uart_RxDataHandler(hDevice); + break; + + /* Line status interrupt. */ + case ENUM_UART_IIR_STAT_RLSI: + { + /* Initialze the line status event to 0. */ + uint32_t nEvent = 0u; + + /* Get the interrupts status. */ + uint16_t nStatus = hDevice->pUARTRegs->LSR; + + /* If a break signal is detected.. */ + if((BITM_UART_LSR_BI & nStatus) == BITM_UART_LSR_BI) + { + /* Dummy read to flush the RX register. We do this because + we do not actaully want to do anything with this data as it + is only a break indicator. */ + hDevice->pUARTRegs->RX; + + /* Set the event to a break interrupt. */ + nEvent = (uint32_t)ADI_UART_BREAK_INTERRUPT; + } + + /* Ignore the framing error if the break is asserted. + We do this because a break can trigger a false framing error. + */ + else if((BITM_UART_LSR_FE & nStatus) == BITM_UART_LSR_FE) + { + /* Set the event to show a framing error has been detected. */ + nEvent |= (uint32_t)ADI_UART_HW_ERR_FRAMING; + } + else + { + /* Do nothing. This is required for MISRA. */ + } + + if((BITM_UART_LSR_PE & nStatus) == BITM_UART_LSR_PE) + { + /* Set the event to show a parity error has been detected. */ + nEvent |= (uint32_t)ADI_UART_HW_ERR_PARITY; + } + if((BITM_UART_LSR_OE & nStatus) == BITM_UART_LSR_OE) + { + /* Set the event to show a hardware overrun error has been detected, meaning receive data has + been overwritten. + */ + nEvent |= (uint32_t)ADI_UART_HW_ERR_OVERRUN; + } + + /* If there was an event and autobaud is not in progress, notify the API. */ + if((nEvent != 0u) && (hDevice->bAutobaudInProgress == false)) + { + /* Set the UART device hw error bit field. This will allow us to return the + specific failure to the application once we return from this ISR. + */ + hDevice->nHwError |= nEvent; + uart_ManageProcessedBuffer(hDevice, hDevice->pChannelRx, ADI_UART_EVENT_HW_ERROR_DETECTED); + } + break; + } + + /* If there was a modem status interrupt. For our purposes, we will only check if this is related to autobaud. */ + case ENUM_UART_IIR_STAT_EDSSI: + { +#if (ADI_UART_CFG_ENABLE_AUTOBAUD == 1) + /* Initialize the autobaud event to 0. */ + uint32_t nEvent = 0u; + + /* Get the autobaud interrupt status but not the counter value. */ + uint16_t nStatus = hDevice->pUARTRegs->ASRL & 0xFu; + + /* Read the autobaud control register to see if autobaud was enabled. */ + uint16_t acr = (hDevice->pUARTRegs->ACR & BITM_UART_ACR_ABE); + + /* If there is an autobaud event and autobaud is enabled */ + if((nStatus != 0u) && (acr != 0u)) + { + uint32_t nClock; + uint32_t nCount; + + /*Get the clock frequency. */ + if(adi_pwr_GetClockFrequency(ADI_CLOCK_PCLK,&nClock) != ADI_PWR_SUCCESS) + { + nClock = 0u; + } + + /* Get the autobaud counter bits 12-19. */ + nCount = (uint32_t)hDevice->pUARTRegs->ASRH << 12u; + + /* Get the autobaud counter bits 0-11. */ + nCount |= (uint32_t)hDevice->pUARTRegs->ASRL >> 4u; + + /* if the autobaud event was that the autobaud is done.. */ + if((nStatus & BITM_UART_ASRL_DONE) == BITM_UART_ASRL_DONE) + { + /* If the fractional baud generator is enabled, calculate the fractional portional of the baudrate. + It seems that in order to get a correct baudrate reading, we need the fractional divider enabled. + */ + if ((hDevice->pUARTRegs->FBR & 0x8000u) == 0x8000u) + { + uint8_t nOSR = 0u; + uint32_t nDivN; + uint32_t nDivNSubtractor = 2048u; + + /* DIVC is always 1, unless the oversample rate is 32. */ + uint16_t nDivC = 1u; + + /* If the oversample rate is 4.. */ + if(nCount < (8u << 3u)) + { + nDivN = ((nCount << 9u) / 8u) - nDivNSubtractor; + } + + /* If the oversample rate is 8.. */ + else if(nCount < (8u << 4u)) + { + nDivN = ((nCount << 8u) / 8u) - nDivNSubtractor; + nOSR = 1u; + } + + /* If the oversample rate is 16.. */ + else if(nCount < (8u << 5u)) + { + nDivN = ((nCount << 7u) / 8u) - nDivNSubtractor; + nOSR = 2u; + } + + /* If the oversample rate is 32.. */ + else + { + nDivC = (uint16_t) (nCount / 32u / 8u); + nDivN = ((nCount << 6u) / (8u * nDivC)) - nDivNSubtractor; + nOSR = 3u; + } + + /* Write back the register contents for baudrate detection in the hardware. */ + adi_uart_ConfigBaudRate(hDevice, nDivC, 1u, (uint16_t)nDivN, nOSR); + + /* For more precise calculations we would use floating point math here. Integer precision will do for now. + This avoids bringing in extra libraries for floating point math. */ + + /* Baudrate = (UARTCLK / (nDivM + nDivN / 2048) * pow(2, nOSR + 2) * nDivC) + nOSR = (1u << (nOSR + 2u)); Seperate this out of the equation for misra compliance + hDevice->nBaudRate = ((float)nClock / (((float)1 + (float)nDivN / (float)2048) * (float)nOSR * (float)nDivC)); + */ + + /* In order to avoid bringing in the extra floating point libraries, we will use the non fractional baudrate for the API. */ + hDevice->nBaudRate = ((nClock * 8u) / nCount); + } + else + { + /* No Fractional divider: Baudrate (bits/second) = (UARTCLK (cycles/second) * counted bits (bits)) / nCount (cycles)*/ + hDevice->nBaudRate = ((nClock * 8u) / nCount); + } + + /* If there is a callback, notify the API that autobaud is complete. + If there is not a callback, the baudrate will be set to a non zero value so the user can call "Get_BaudRate" + to know that autobaud has completed. + */ + if((hDevice->pfCallback != NULL) && (hDevice->bAutobaudCallbackMode == true)) + { + hDevice->pfCallback(hDevice->pCBParam, ADI_UART_EVENT_AUTOBAUD_COMPLETE, (void*)hDevice->nBaudRate); + } + } + else + { + if((nStatus & BITM_UART_ASRL_BRKTO) == BITM_UART_ASRL_BRKTO) + { + /* Autobaud timed out due to break error. */ + nEvent |= (uint32_t)ADI_UART_AUTOBAUD_TIMEOUT_LONGBREAK; + } + if((nStatus & BITM_UART_ASRL_NSETO) == BITM_UART_ASRL_NSETO) + { + /* Autobaud timed out due to no valid start edge found. */ + nEvent |= (uint32_t)ADI_UART_AUTOBAUD_TIMEOUT_NO_START_EDGE; + } + if((nStatus & BITM_UART_ASRL_NEETO) == BITM_UART_ASRL_NEETO) + { + /* Autobaud timed out due to no valid end edge found. */ + nEvent |= (uint32_t)ADI_UART_AUTOBAUD_TIMEOUT_NO_END_EDGE; + } + /* If there is an event callback.. */ + if((hDevice->pfCallback != NULL) && (hDevice->pChannelRx->eDataTranferMode == ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING)) + { + /* Notify application of errors through callback. */ + hDevice->pfCallback(hDevice->pCBParam, ADI_UART_EVENT_AUTOBAUD_ERROR_DETECTED, (void*)nEvent); + } + else + { + /* Notify application of errors through autobaud return value. */ + hDevice->nAutobaudError = nEvent; + } + + } + + /* Dummy read to flush the RX register to clear the key character that was sent while configuring autobaud. */ + hDevice->pUARTRegs->RX; + } +#endif + /* Clear auto baud enable and interrupt registers. We disable autobaud here because it is required in order to clear the counter. */ + hDevice->pUARTRegs->ACR &=(uint16_t)~( BITM_UART_ACR_ABE | + BITM_UART_ACR_DNIEN | + BITM_UART_ACR_TOIEN ); + + hDevice->bAutobaudInProgress = false; + break; + } + default: + break; + } + return; +} + + +/* DMA interrupt handlers */ +void DMA_UART0_TX_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_UART_HANDLE const hDevice = (ADI_UART_HANDLE)uart_device_info[0].hDevice; + uart_ManageProcessedBuffer(hDevice,hDevice->pChannelTx,ADI_UART_EVENT_TX_BUFFER_PROCESSED); +#if defined(ADI_CYCLECOUNT_UART_ISR_ENABLED) && (ADI_CYCLECOUNT_UART_ISR_ENABLED == 1u) + ADI_CYCLECOUNT_STORE(ADI_CYCLECOUNT_ISR_DMA_UART_TX); +#endif + ISR_EPILOG(); +} + +void DMA_UART0_RX_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_UART_HANDLE const hDevice = (ADI_UART_HANDLE)uart_device_info[0].hDevice; + uart_ManageProcessedBuffer(hDevice,hDevice->pChannelRx,ADI_UART_EVENT_RX_BUFFER_PROCESSED); +#if defined(ADI_CYCLECOUNT_UART_ISR_ENABLED) && (ADI_CYCLECOUNT_UART_ISR_ENABLED == 1u) + ADI_CYCLECOUNT_STORE(ADI_CYCLECOUNT_ISR_DMA_UART_RX); +#endif + ISR_EPILOG(); +} + +void DMA_UART1_TX_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_UART_HANDLE const hDevice = (ADI_UART_HANDLE)uart_device_info[1].hDevice; + uart_ManageProcessedBuffer(hDevice,hDevice->pChannelTx,ADI_UART_EVENT_TX_BUFFER_PROCESSED); +#if defined(ADI_CYCLECOUNT_UART_ISR_ENABLED) && (ADI_CYCLECOUNT_UART_ISR_ENABLED == 1u) + ADI_CYCLECOUNT_STORE(ADI_CYCLECOUNT_ISR_DMA_UART_TX); +#endif + ISR_EPILOG(); +} + +void DMA_UART1_RX_Int_Handler(void) +{ + ISR_PROLOG(); + ADI_UART_HANDLE const hDevice = (ADI_UART_HANDLE)uart_device_info[1].hDevice; + uart_ManageProcessedBuffer(hDevice,hDevice->pChannelRx,ADI_UART_EVENT_RX_BUFFER_PROCESSED); +#if defined(ADI_CYCLECOUNT_UART_ISR_ENABLED) && (ADI_CYCLECOUNT_UART_ISR_ENABLED == 1u) + ADI_CYCLECOUNT_STORE(ADI_CYCLECOUNT_ISR_DMA_UART_RX); +#endif + ISR_EPILOG(); +} + + +/* + * @brief UART interrupt handler for receiving the data in interrupt mode. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * +*/ +static void uart_RxDataHandler(ADI_UART_HANDLE hDevice) +{ + volatile uint8_t *pNextData; + + /* If there is an active buffer.. */ + if((hDevice->pChannelRx->pFillBuffer->pStartAddress != NULL) && (hDevice->pChannelRx->pFillBuffer->bInUse == true)) + { + /* Get the address of the buffer we are filling. */ + pNextData = (uint8_t *)hDevice->pChannelRx->pFillBuffer->pStartAddress; + + /* Read data from the RX holding register into the buffer at the indexed location. */ + pNextData[hDevice->pChannelRx->pFillBuffer->nIndex] = (uint8_t) hDevice->pUARTRegs->RX; + + /* Increment the buffer index so we don't overwrite this data in the buffer. */ + hDevice->pChannelRx->pFillBuffer->nIndex++; + + /* If all of the data has been processed, manage the processed data buffer. Otherwise we will + leave everything as is and continue to receive interrupts for the incoming data, until this + buffer has been filled. + */ + if(hDevice->pChannelRx->pFillBuffer->nIndex == hDevice->pChannelRx->pFillBuffer->nCount) + { + uart_ManageProcessedBuffer(hDevice, hDevice->pChannelRx, ADI_UART_EVENT_RX_BUFFER_PROCESSED); + } + } + /* If we do not have a buffer submitted.. */ + else + { + /* Ask the API for a buffer so we can process this data before having an overflow. + if there is no callback, the API will not be able to submit a buffer in time. + */ + if (hDevice->pfCallback != NULL) + { + hDevice->pfCallback(hDevice->pCBParam, (uint32_t)ADI_UART_EVENT_NO_RX_BUFFER_EVENT, NULL); + } + + /* This check here is in case in the callback the application submitted a buffer. If they did + not then we need to clear the RX register in order to clear this interrupt. + */ + if((hDevice->pChannelRx->pFillBuffer->pStartAddress == NULL) && (hDevice->pChannelRx->pFillBuffer->bInUse == false)) + { + hDevice->pUARTRegs->RX; + } + } + + return; +} + +/* + * @brief UART interrupt handler transmitting the data in interrupt mode. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * +*/ +static void uart_TxDataHandler(ADI_UART_HANDLE hDevice) +{ + volatile uint8_t *pNextData; + + /* If there is an active buffer.. */ + if((hDevice->pChannelTx->pFillBuffer->pStartAddress != NULL) && (hDevice->pChannelTx->pFillBuffer->bInUse == true)) + { + /* Get the start address of the buffer we are transmitting data from. */ + pNextData = (uint8_t *)hDevice->pChannelTx->pFillBuffer->pStartAddress; + + /* Write data to the TX holding register. This will be shifted out at the baud rate by the shift register. */ + hDevice->pUARTRegs->TX = (uint16_t)pNextData[hDevice->pChannelTx->pFillBuffer->nIndex]; + + /* Increment the buffer index. */ + hDevice->pChannelTx->pFillBuffer->nIndex++; + + + /* If all of the characters have been transmitted, manage the data buffer. Otherwise we will leave everything + as is and continue to transmit this data until everything is out of the buffer. */ + if(hDevice->pChannelTx->pFillBuffer->nIndex >= hDevice->pChannelTx->pFillBuffer->nCount) + { + uart_ManageProcessedBuffer(hDevice,hDevice->pChannelTx,ADI_UART_EVENT_TX_BUFFER_PROCESSED); + } + } + return; +} + + +/* + * @brief Function for managing the processed buffer. This gets called after the receive buffer has been filled + * and when the transmit buffer has been emptied. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] pChannel Channel handler for the Tx or Rx. + * @param [in] eEvent Indicate the event ID to be passed to registered callback function, if one has been registered. + * +*/ + +static void uart_ManageProcessedBuffer(ADI_UART_HANDLE hDevice,ADI_UART_DATA_CHANNEL *pChannel, ADI_UART_EVENT eEvent) +{ + + + /* Now that this transaction has completed, this buffer is no longer in use. */ + pChannel->pFillBuffer->bInUse = false; + + pChannel->pFillBuffer = pChannel->pFillBuffer->pNextBuffer; + + if(eEvent == ADI_UART_EVENT_TX_BUFFER_PROCESSED) + { + /* Disable Tx buffer interrupts. */ + hDevice->pUARTRegs->IEN &= (uint16_t)~(BITM_UART_IEN_ETBEI | BITM_UART_IEN_EDMAT); + } + else + { + /* Disable Rx buffer interrupts for the DMA. We do not disable receive buffer full interrupts to allow + the use of the RX FIFO. + */ + hDevice->pUARTRegs->IEN &= (uint16_t)~(BITM_UART_IEN_EDMAR); + + if (hDevice->bRxFifoEn != true) + { + /* Disable Rx buffer interrupts for PIO mode if the FIFO is not enabled. + */ + hDevice->pUARTRegs->IEN &= (uint16_t)~(BITM_UART_IEN_ERBFI); + } + + } + + /* If there is a callback registered, notify the API that a buffer has been processed. Clean up the buffer. */ + if((hDevice->pfCallback != NULL) && (pChannel->eDataTranferMode == ADI_UART_DATA_TRANSFER_MODE_NONBLOCKING)) + { + uint32_t nEvent = hDevice->nHwError; + hDevice->nHwError = 0u; + + uint32_t *pBuffer = pChannel->pActiveBuffer->pStartAddress; + + /* Reinitialize the start address to NULL so this buffer can be used for a new transaction. */ + pChannel->pActiveBuffer->pStartAddress = NULL; + + /* Now that the desired data has either been transmitted or received, this buffer is no longer + in use. We can update "pActiveBuffer" to point to the next buffer that will become or is already + active. + */ + pChannel->pActiveBuffer = pChannel->pActiveBuffer->pNextBuffer; + + /* Set the data transfer mode to none so that the next transfer can be either in blocking or in nonblocking mode. + This will only be done if there are no other active buffers in flight to avoid disrupting an active transfer. + */ + if(pChannel->pActiveBuffer->pStartAddress == NULL) + { + pChannel->eDataTranferMode = ADI_UART_DATA_TRANSFER_MODE_NONE; + } + if(nEvent != 0u) + { + hDevice->pfCallback(hDevice->pCBParam, ADI_UART_EVENT_HW_ERROR_DETECTED,(void*)nEvent); + + } + else + { + hDevice->pfCallback(hDevice->pCBParam, (uint32_t)eEvent, (void*)pBuffer); + } + + } + else + { + /* Post to the blocking function. If we are in blocking mode, this will allow the buffer to be returned to the API. + If we are in nonblocking mode, this will allow adi_uart_GetBuffer() to return immediately so the API can have + control over the buffer again. + */ + SEM_POST(pChannel); + } + + /* If there is another buffer active. The buffer we want to check is "pFillBuffer" because that is the next one that would + be processed. So if it has been submitted, now would be the time to set up the interrupts based on its requirements. + */ + if(pChannel->pFillBuffer->bInUse == true) + { + pChannel->pfSubmitBuffer(hDevice, pChannel->pFillBuffer); + } +} + + +/* + * @brief Initialize the UART instance to the default values specified in "adi_uart_config.h". + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * @param [in] nDeviceNum UART device number +*/ + +static void uart_init(ADI_UART_CONST_HANDLE const hDevice, uint32_t const nDeviceNum) +{ + + ADI_UART_CONFIG const* pUARTCfg = &gUARTCfg[nDeviceNum]; + + /* Line Control Register. */ + hDevice->pUARTRegs->LCR = pUARTCfg->LCR; + + /* Div-C in Baudrate divider register. */ + hDevice->pUARTRegs->DIV = pUARTCfg->DIV; + + /* Div-M and Div-N in Fractional Baudrate register. */ + hDevice->pUARTRegs->FBR = pUARTCfg->FBR; + + /* Second line control register. */ + hDevice->pUARTRegs->LCR2 = pUARTCfg->LCR2; + + /* FIFO control register. */ + hDevice->pUARTRegs->FCR = pUARTCfg->FCR; + + /* Half Duplex Control Register. */ + hDevice->pUARTRegs->RSC = pUARTCfg->RSC; + + /* Interrupt enable register. */ + hDevice->pUARTRegs->IEN = pUARTCfg->IEN; +} + +#ifdef ADI_DEBUG +/* + * @brief Validate the device handle. + * + * @param [in] hDevice Device handle obtained from adi_uart_Open(). + * + * @return Status + * - #ADI_UART_SUCCESS Specified handle is valid. + * - #ADI_UART_INVALID_HANDLE Specified handle is invalid. + * +*/ + +static ADI_UART_RESULT ValidateHandle(ADI_UART_CONST_HANDLE hDevice) +{ + uint32_t i; + + + for(i = 0U; i < ADI_UART_NUM_DEVICES; i++) + { + + if((hDevice == uart_device_info[i].hDevice) && (hDevice != NULL)) + { + return(ADI_UART_SUCCESS); + } + } + return(ADI_UART_INVALID_HANDLE); +} +#endif /* ADI_DEBUG */ +/*! \endcond */ +/*@}*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/uart/adi_uart_def.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/uart/adi_uart_def.h new file mode 100755 index 0000000000..0762d9d13b --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/uart/adi_uart_def.h @@ -0,0 +1,214 @@ +/*! ***************************************************************************** + * @file: adi_uart_def.h + * @brief: UART Device Driver definition for processor + ----------------------------------------------------------------------------- +Copyright (c) 2010-2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ +/*! \cond PRIVATE */ +#ifndef DEF_UART_DEF_H +#define DEF_UART_DEF_H + + +/*! + ***************************************************************************** + * \struct ADI_UART_BUFF_INFO + * Structure for managing the submitted buffers. + *****************************************************************************/ + +typedef struct UART_BUFF_INFO +{ + void *pStartAddress; /*!< Address of buffer passed down to the UART driver. */ + uint32_t nCount; /*!< Size of buffer in bytes. */ + uint32_t nIndex; /*!< Buffer index. */ + bool bInUse; /*!< Buffer in use flag. */ + bool bDMA; /*!< Transaction is using the DMA flag. */ + struct UART_BUFF_INFO *pNextBuffer; /*!< Pointer to the next buffer in the list. */ + + +}ADI_UART_BUFF_INFO; + + +/*! Function pointer typedef for the function which submit the buffer */ +typedef void (*UART_BUFFER_SUBMIT) (ADI_UART_CONST_HANDLE const hDevice, + ADI_UART_BUFF_INFO *const pBuffer + ); + + +/*! + ***************************************************************************** + * \struct ADI_UART_DATA_CHANNEL + * Structure to manage the data transfer for a given channel. + * One instance of this structure will be created for managing the + * data transfer in each direction. + *****************************************************************************/ + +typedef struct _ADI_UART_DATA_CHANNEL +{ + ADI_UART_BUFF_INFO PingPong[2]; /*!< Ping Pong Buffers. */ + ADI_UART_BUFF_INFO *pFreeBuffer; /*!< Pointer to free buffer (next buffer to submit). */ + ADI_UART_BUFF_INFO *pFillBuffer; /*!< Pointer to the next buffer to be filled. This is needed for + the case where two buffers are "submitted" before a "get" is + called. */ + ADI_UART_BUFF_INFO *pActiveBuffer; /*!< Pointer to active buffer (next buffer waiting for completion).*/ + ADI_UART_TRANSFER_MODE eDataTranferMode; /*!< Data transfer mode. */ + UART_BUFFER_SUBMIT pfSubmitBuffer; /*!< Pointer to a function used for submitting a buffer. */ + SEM_VAR_DECLR + +}ADI_UART_DATA_CHANNEL; + + +/*! + ***************************************************************************** + * \struct ADI_UART_DEVICE_INFO + * Structure for storing basic device information. + *****************************************************************************/ + +typedef struct _ADI_UART_DEVICE_INFO +{ + DMA_CHANn_TypeDef dmaTxChannelNum; /*!< DMA channel ID-Tx. */ + DMA_CHANn_TypeDef dmaRxChannelNum; /*!< DMA channel ID-Rx. */ + IRQn_Type eDMATx; /*!< DMA channel IRQ-Tx. */ + IRQn_Type eDMARx; /*!< DMA channel IRQ-Rx. */ + IRQn_Type eIRQn; /*!< UART interrupt ID. */ + ADI_UART_TypeDef *pUartRegs; /*!< Base address of the UART registers. */ + ADI_UART_HANDLE hDevice; /*!< Handle for the device instance. */ + +}ADI_UART_DEVICE_INFO; + + +/*! + ***************************************************************************** + * \struct ADI_UART_DEVICE + * Structure for managing the UART device. + *****************************************************************************/ + +typedef struct _ADI_UART_DEVICE +{ + ADI_UART_DIRECTION eDirection; /*!< UART operation direction. */ + ADI_UART_DEVICE_INFO *pUartInfo; /*!< Access to device information about the uart instance. */ + volatile ADI_UART_TypeDef *pUARTRegs; /*!< Access to UART Memory Mapped Registers. */ + ADI_CALLBACK pfCallback; /*!< Callback function. */ + void *pCBParam; /*!< Parameter for callback function. */ + bool bAutobaudInProgress; /*!< Autobaud in progress flag. */ + volatile uint32_t nHwError; /*!< Line status error(s). */ + volatile uint32_t nAutobaudError; /*!< Autobaud error(s). */ + ADI_UART_DATA_CHANNEL *pChannelTx; /*!< Tx channel. */ + ADI_UART_DATA_CHANNEL *pChannelRx; /*!< Rx channel. */ + volatile uint32_t nBaudRate; /*!< Baudrate. */ + bool bAutobaudCallbackMode;/*!< Autobaud detection is using callback mode flag. */ + bool bRxFifoEn; /*!< Rx FIFO enabled. Rx buffer full interrupts will remain enabled. */ + +} ADI_UART_DEVICE; + + +/*! + ***************************************************************************** + * \struct ADI_UART_CONFIG + * Structure for initializing the static config. + *****************************************************************************/ + +typedef struct _ADI_UART_CONFIG +{ + uint16_t LCR; /*!< UART_COMLCR Register. */ + + uint16_t DIV; /*!< UART_COMDIV Register. */ + + uint16_t FBR; /*!< UART_COMFBR Register. */ + + uint16_t LCR2; /*!< UART_COMLCR2 Register.*/ + + uint16_t FCR; /*!< UART_COMFCR Register. */ + + uint16_t RSC; /*!< UART_COMRSC Register. */ + + uint16_t IEN; /*!< UART_COMIEN Register .*/ + +} ADI_UART_CONFIG; + + +/****************************************************************************** + * UART Device internal API function prototypes + *****************************************************************************/ + +/* + * UART device initialization helper function. +*/ +static void uart_init(ADI_UART_CONST_HANDLE const hDevice, uint32_t const nDeviceNum); + + +/* + * Data transfer helper functions. +*/ +static void uart_submittxbuffer(ADI_UART_CONST_HANDLE const hDevice, ADI_UART_BUFF_INFO *const pBuffer); + +static void uart_submitrxbuffer(ADI_UART_CONST_HANDLE const hDevice, ADI_UART_BUFF_INFO *const pBuffer); + + +/* + * Data management helper functions. +*/ +static ADI_UART_RESULT uart_getbuffer(ADI_UART_HANDLE hDevice, ADI_UART_DATA_CHANNEL *pChannel, void **ppBuffer, uint32_t *pHwError); + +static ADI_UART_RESULT uart_PendForBuffer(ADI_UART_HANDLE const hDevice , ADI_UART_DATA_CHANNEL *pChannel, uint32_t *pHwError); + +static void uart_ManageProcessedBuffer(ADI_UART_HANDLE hDevice, ADI_UART_DATA_CHANNEL *pChannel, ADI_UART_EVENT eEvent); + +static void uart_TxDataHandler(ADI_UART_HANDLE hDevice); + +static void uart_RxDataHandler(ADI_UART_HANDLE hDevice); + + +/* + * Interrupt Handler. +*/ +static void Common_Uart_Interrupt_Handler(ADI_UART_HANDLE hDevice); + + +/* + * Handle Validation function +*/ +#ifdef ADI_DEBUG +static ADI_UART_RESULT ValidateHandle(ADI_UART_CONST_HANDLE hDevice); +#endif /* ADI_DEBUG */ + +#endif /* end of ifndef DEF_UART_DEF_H */ +/*! \endcond */ + + diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/wdt/adi_wdt.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/wdt/adi_wdt.c new file mode 100755 index 0000000000..b2f34894a2 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/wdt/adi_wdt.c @@ -0,0 +1,225 @@ +/*! ***************************************************************************** + * @file adi_wdt.c + * @brief WDT device driver implementation + ----------------------------------------------------------------------------- +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* +* Pm011 (rule 6.3): the basic types of char, int, short, long, float, and double should not be used +* Necessary for stdbool. +* +* Pm073 (rule 14.7): a function should have a single point of exit +* Pm143 (rule 14.7): a function should have a single point of exit at the end of the function +* Multiple returns are used for error handling. +* +* Pm140 (Rule 11.4): a cast should not be performed between a pointer type and an integral type +* This violation appears when deferencing the pointer to the register typedef. No way around this. +*/ +#pragma diag_suppress=Pm011,Pm073,Pm140,Pm143 +#endif /* __ICCARM__ */ + + +/** @addtogroup WDT_Driver WDT Driver + * @{ + * @brief Watchdog Timer (WDT) Driver + * @details The watchdog timer driver allows the user to enable the timer with + * the static configuration parameters, reset the timer, and read the timer + * count. No interface is provided for setting the timer parameters are + * runtime since the WDT may only be configured once for the program lifetime. + * The timer is disabled by default by the ADuCM4x50 boot kernel. + * @note The application must include drivers/wdt/adi_wdt.h to use this driver + */ + +#include +#include +#include +#include +#include + +/*! \cond PRIVATE */ + +/*! Bus synchronization bits that must go low before writing to the CTL or RESET registers */ +#define ADI_WDT_SYNC_BITS ((0x1u << BITP_WDT_STAT_COUNTING) | (0x1u << BITP_WDT_STAT_LOADING) | (0x1u << BITP_WDT_STAT_CLRIRQ)) + +/*! Value that is written to the reset register to kick the dog */ +#define ADI_WDT_CLR_VALUE (0xCCCCu) + +/*! Store the callback locally if we are using interrupt mode */ +#if (ADI_WDT_CONTROL_TIMEOUT_MODE == 1u) +static ADI_CALLBACK gAppCallback; +#endif + +/*! \endcond */ + +/********************************************************************************* + API IMPLEMENTATIONS +*********************************************************************************/ + + +/*! + * @brief WDT Enable + * + * @details Enables/disables the WDT with the paramters supplied in adi_wdt_config.h + * + * @param [in] bEnable : True to turn WDT on, false to turn it off + * + * @param [in] pfCallback : If interrupt mode is enabled, specify application callback function, + * otherwise simply pass NULL for the argument. + * + * @return ADI_WDT_RESULT + * - #ADI_WDT_FAILURE_LOCKED WDT has already been initialized + * - #ADI_WDT_SUCCESS Function call completed successfully + */ +ADI_WDT_RESULT adi_wdt_Enable(bool const bEnable, ADI_CALLBACK const pfCallback) { + /* IF(Device is enabled, application can't modify it) */ + if ((pADI_WDT0->STAT & ((uint16_t) BITM_WDT_STAT_LOCKED)) != ((uint16_t) 0x0u)) { + return ADI_WDT_FAILURE_LOCKED; + } /* ENDIF */ + + /* Setup interrupts if we are in interrupt mode */ +#if (ADI_WDT_CONTROL_TIMEOUT_MODE == 1u) + gAppCallback = pfCallback; + /* IF(We are enabling the WDT) */ + if (bEnable == true) { + NVIC_EnableIRQ (WDT_EXP_IRQn); + /* ELSE (We are disabling the WDT, this might not be necessary, depends on startup config) */ + } else { + NVIC_DisableIRQ(WDT_EXP_IRQn); + } /* ENDIF */ +#endif + + /* WHILE(Bus sync is underway) */ + while((pADI_WDT0->STAT & ADI_WDT_SYNC_BITS) != 0u) { + ; + } /* ENDWHILE */ + + + ADI_INT_STATUS_ALLOC(); + ADI_ENTER_CRITICAL_REGION(); + + pADI_WDT0->LOAD = ADI_WDT_LOAD_VALUE; + + /* IF(Turning the WDT on) */ + if (bEnable == true) { + pADI_WDT0->CTL = (ADI_WDT_CONTROL_TIMER_MODE << BITP_WDT_CTL_MODE) | + (0x1u << BITP_WDT_CTL_EN ) | + (ADI_WDT_CONTROL_CLOCK_PRESCALER << BITP_WDT_CTL_PRE ) | + (ADI_WDT_CONTROL_TIMEOUT_MODE << BITP_WDT_CTL_IRQ ) | + (ADI_WDT_CONTROL_POWER_MODE << 0u ); + /* ELSE(Turning the WDT off) */ + } else { + pADI_WDT0->CTL = (ADI_WDT_CONTROL_TIMER_MODE << BITP_WDT_CTL_MODE) | + (0x0u << BITP_WDT_CTL_EN ) | + (ADI_WDT_CONTROL_CLOCK_PRESCALER << BITP_WDT_CTL_PRE ) | + (ADI_WDT_CONTROL_TIMEOUT_MODE << BITP_WDT_CTL_IRQ ) | + (ADI_WDT_CONTROL_POWER_MODE << 0u ); + } /* ENDIF */ + + ADI_EXIT_CRITICAL_REGION(); + + return ADI_WDT_SUCCESS; +} + +/*! + * @brief WDT Reset + * + * @details Resets the WDT + * + * @return None + */ +void adi_wdt_Kick(void) { + /* WHILE(Bus sync is underway) */ + while((pADI_WDT0->STAT & ADI_WDT_SYNC_BITS) != 0u) { + ; + } /* ENDWHILE */ + + /* Kick the dog! */ + pADI_WDT0->RESTART = ADI_WDT_CLR_VALUE; +} + +/*! + * @brief WDT Read Count + * + * @details Read the current WDT count + * + * @param [out] pCurCount : Pointer to memory to read the count into + * + * @return None + */ +void adi_wdt_GetCount(uint16_t * const pCurCount) { + /* Read the count */ + *pCurCount = pADI_WDT0->CCNT; +} + +/*! \cond PRIVATE */ + +/*! + * @brief WDT0 Interrupt Handler + * + * @details Kicks the dog and calls the user supplied callback function + * + * @return None + * + * @note Do not need to explicitly clear the interrupt status, + * kicking the dog performs this action. + */ +#if (ADI_WDT_CONTROL_TIMEOUT_MODE == 1u) +extern void WDog_Tmr_Int_Handler(void); +void WDog_Tmr_Int_Handler(void) { + ISR_PROLOG() + /* Kick the dog */ + adi_wdt_Kick(); + /* IF(Application supplied a callback) */ + if(gAppCallback != NULL) { + /* Call the callback */ + gAppCallback(NULL, 0x0u, NULL); + } /* ENDIF */ + ISR_EPILOG() +} +#endif /* (ADI_WDT_CONTROL_TIMEOUT_MODE == 1u) */ + +/*! \endcond */ + +/*! @} */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/xint/adi_xint.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/xint/adi_xint.c new file mode 100755 index 0000000000..53e763cb70 --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/xint/adi_xint.c @@ -0,0 +1,413 @@ +/****************************************************************************** + @file: adi_xint.c + @brief: External Interrupt device driver implementation. + ----------------------------------------------------------------------------- + +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, +TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF INTELLECTUAL +PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +/*****************************************************************************/ + +#include +#include +#include +#include +#include +#include "adi_xint_def.h" + +#ifdef __ICCARM__ +/* +* IAR MISRA C 2004 error suppressions. +* +* Pm073 (rule 14.7): a function should have a single point of exit +* Pm143 (rule 14.7): a function should have a single point of exit at the end of the function +* Multiple returns are used for error handling. +* Pm140 (rule 11.3): a cast should not be performed between a pointer type and an integral type +* The rule makes an exception for memory-mapped register accesses. +* Pm140 (rule 10.3): illegal explicit conversion from underlying MISRA type unsigned int to enum +* The typecast is used for efficiency of the code. +* Pm140 (rule 17.4): array indexing shall only be applied to objects defined as an array +* Array indexing is required on the pointer. The memory for gpCallbackTable is passed from application +*/ +#pragma diag_suppress=Pm073,Pm143,Pm140,Pm136,Pm152 +#endif /* __ICCARM__ */ + +static inline void XIntCommonInterruptHandler (const ADI_XINT_EVENT eEvent); +void Ext_Int0_Handler(void); +void Ext_Int1_Handler(void); +void Ext_Int2_Handler(void); +void Ext_Int3_Handler(void); + + + +/*========== D A T A ==========*/ + +static ADI_XINT_CALLBACK_INFO *gpCallbackTable; + +/*! \endcond */ + +/*! \addtogroup XINT_Driver External Interrupt Driver + * @{ + * @brief External Interrupt (XINT) Driver + * @note The application must include drivers/xint/adi_xint.h to use this driver + */ + +/*! + @brief Initializes the External Interrupt Driver. + + @details This function does the external interrupt driver initialization. This function should be called + before calling any of the XINT driver APIs. + + @param[in] pMemory Pointer to the memory to be used by the driver. + Size of the memory should be at equal to #ADI_XINT_MEMORY_SIZE bytes. + @param[in] MemorySize Size of the memory passed in pMemory parameter. + + @return Status + - ADI_XINT_SUCCESS If successfully initialized XINT driver. + - ADI_XINT_NULL_PARAMETER [D] If the given pointer to the driver memory is pointing to NULL. + - ADI_XINT_INVALID_MEMORY_SIZE [D] If the given memory size is not sufficient to operate the driver. + + @sa adi_xint_UnInit +*/ +ADI_XINT_RESULT adi_xint_Init(void* const pMemory, + uint32_t const MemorySize +) +{ + +#ifdef ADI_DEBUG + /* Verify the given memory pointer */ + if(NULL == pMemory) + { + return ADI_XINT_NULL_PARAMETER; + } + /* Check if the memory size is sufficient to operate the driver */ + if(MemorySize < ADI_XINT_MEMORY_SIZE) + { + return ADI_XINT_INVALID_MEMORY_SIZE; + } + assert(MemorySize == (sizeof(ADI_XINT_CALLBACK_INFO) * ADI_XINT_EVENT_MAX)); +#endif + + /* Only initialize on 1st init call, i.e., preserve callbacks on multiple inits */ + if (gpCallbackTable == NULL) + { + /* Clear the memory passed by the application */ + memset(pMemory, 0, MemorySize); + + gpCallbackTable = (ADI_XINT_CALLBACK_INFO *)pMemory; + } + return (ADI_XINT_SUCCESS); +} + + +/*! + @brief Un-initialize the external interrupt driver. + + @details Terminates the XINT functions, leaving everything unchanged. + + @return Status + - #ADI_XINT_SUCCESS If successfully uninitialized XINT driver. + - #ADI_XINT_NOT_INITIALIZED [D] If XINT driver not yet initialized. + + @sa adi_xint_Init +*/ +ADI_XINT_RESULT adi_xint_UnInit(void) +{ + +#ifdef ADI_DEBUG + /* IF (not initialized) */ + if (NULL == gpCallbackTable) + { + /* return error if not initialized */ + return (ADI_XINT_NOT_INITIALIZED); + } +#endif + + /* Clear the callback pointer */ + gpCallbackTable = NULL; + + return (ADI_XINT_SUCCESS); +} + + + +/*! + @brief Enable an External Interrupt + + @details Enables and sets the triggering mode for the given external interrupt. + Applications may register a callback using the #adi_xint_RegisterCallback + API to get a notification when the interrupt occurs. + + To get the external interrupt working application has to enable the input + (using the GPIO driver API \a adi_gpio_InputEnable) for the corresponding GPIO + pin. Please refer the GPIO chapter pin-muxing section of the Hardware Reference + Manual to see the GPIO pin that is mapped to the required external interrupt. + + @param[in] eEvent Event which needs to be enabled. + @param[in] eMode Interrupt trigger mode for the external interrupt. + + @return Status + - #ADI_XINT_SUCCESS If successfully enabled the external interrupt. + - #ADI_XINT_NOT_INITIALIZED [D] If external interrupt driver not yet initialized. + + @sa adi_xint_DisableIRQ + @sa adi_xint_RegisterCallback +*/ +ADI_XINT_RESULT adi_xint_EnableIRQ(const ADI_XINT_EVENT eEvent, const ADI_XINT_IRQ_MODE eMode) +{ + uint32_t Mask; /* mask to manipulate the register */ + uint32_t Pattern; /* bit pattern that will be written into the register */ + uint32_t CfgReg; /* interrupt config register value */ + IRQn_Type XintIrq; + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + /* make sure we're initialized */ + if (NULL == gpCallbackTable) + { + return (ADI_XINT_NOT_INITIALIZED); + } +#endif + + /* create the mask we'll use to clear the relevant bits in the config register */ + Mask = (BITM_XINT_CFG0_IRQ0MDE | BITM_XINT_CFG0_IRQ0EN) << (ADI_XINT_CFG_BITS * (uint32_t)eEvent); + + /* The Pattern has to be created differently for UART RX wakeup and other events as the + mode and enable bits are flipped in case of UART RX */ + + /* Based on the event figure out the interrupt it is mapped to */ + if(eEvent == ADI_XINT_EVENT_UART_RX) + { + /* create the bit pattern we're going to write into the configuration register */ + Pattern = (BITM_XINT_CFG0_UART_RX_EN | ((uint32_t)eMode << BITP_XINT_CFG0_UART_RX_MDE)); + + XintIrq = XINT_EVT3_IRQn; + } + else + { + /* create the bit pattern we're going to write into the configuration register */ + Pattern = (BITM_XINT_CFG0_IRQ0EN | eMode) << (ADI_XINT_CFG_BITS * (uint32_t)eEvent); + + XintIrq = (IRQn_Type)((uint32_t)XINT_EVT0_IRQn + (uint32_t)eEvent); + } + + + ADI_ENTER_CRITICAL_REGION(); + + /* read/modify/write the appropriate bits in the register */ + CfgReg = pADI_XINT0->CFG0; + CfgReg &= ~Mask; + CfgReg |= Pattern; + pADI_XINT0->CFG0 = CfgReg; + + ADI_EXIT_CRITICAL_REGION(); + + /* enable the interrupt */ + NVIC_EnableIRQ(XintIrq); + + return (ADI_XINT_SUCCESS); +} + + +/*! + @brief Disable an External Interrupt + + @details Disables an external interrupt + + @param[in] eEvent External Interrupt event that should be disabled. + + @return Status + - #ADI_XINT_SUCCESS If successfully disabled the external interrupt. + - #ADI_XINT_NOT_INITIALIZED [D] If external interrupt driver is not yet initialized. + + @sa adi_xint_EnableIRQ + @sa adi_xint_RegisterCallback +*/ +ADI_XINT_RESULT adi_xint_DisableIRQ(const ADI_XINT_EVENT eEvent) +{ + uint32_t Mask; /* mask to manipulate the register */ + uint32_t CfgReg; /* interrupt config register value */ + IRQn_Type XintIrq; /* External interrupt IRQ the event is mapped to */ + + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + /* make sure we're initialized */ + if (NULL == gpCallbackTable) + { + return (ADI_XINT_NOT_INITIALIZED); + } +#endif + + /* Based on the event figure out the interrupt it is mapped to */ + if(eEvent == ADI_XINT_EVENT_UART_RX) + { + XintIrq = XINT_EVT3_IRQn; + } + else + { + XintIrq = (IRQn_Type)((uint32_t)XINT_EVT0_IRQn + (uint32_t)eEvent); + } + + /* disable the interrupt */ + NVIC_DisableIRQ(XintIrq); + + /* create the mask we'll use to clear the relevant bits in the config register */ + Mask = (BITM_XINT_CFG0_IRQ0MDE | BITM_XINT_CFG0_IRQ0EN) << (ADI_XINT_CFG_BITS * (uint32_t)eEvent); + + ADI_ENTER_CRITICAL_REGION(); + /* read/modify/write the appropriate bits in the register */ + CfgReg = pADI_XINT0->CFG0; + CfgReg &= ~Mask; + pADI_XINT0->CFG0 = CfgReg; + ADI_EXIT_CRITICAL_REGION(); + + return (ADI_XINT_SUCCESS); +} + + +/*! + @brief Register or unregister an application callback function for external pin interrupts. + + @details Applications may register a callback function that will be called when an + external interrupt occurs. In addition to registering the interrupt, + the application should call the #adi_xint_EnableIRQ API to enable the + external pin interrupt. + + The driver dispatches calls to registered callback functions when the + properly configured pin(s) latches an external interrupt input on the XINT + pin(s). The callback is dispatched with the following parameters, respectively: + + - application-provided callback parameter (\a pCBParam), + - the interrupt ID (#ADI_XINT_EVENT) that initiated the interrupt, + - NULL. + + @param[in] eEvent The interrupt for which the callback is being registered. + @param[in] pfCallback Pointer to the callback function. This can be passed as NULL to + unregister the callback. + @param[in] pCBParam Callback parameter which will be passed back to the application + when the callback is called.. + + @return Status + - #ADI_XINT_SUCCESS If successfully registered the callback. + - #ADI_XINT_NOT_INITIALIZED [D] If external interrupt driver is not yet initialized. + + @sa adi_xint_EnableIRQ + @sa adi_xint_DisableIRQ +*/ +ADI_XINT_RESULT adi_xint_RegisterCallback (const ADI_XINT_EVENT eEvent, ADI_CALLBACK const pfCallback, void *const pCBParam ) +{ + ADI_INT_STATUS_ALLOC(); + +#ifdef ADI_DEBUG + /* make sure we're initialized */ + if (NULL == gpCallbackTable) + { + return (ADI_XINT_NOT_INITIALIZED); + } +#endif + + ADI_ENTER_CRITICAL_REGION(); + gpCallbackTable[eEvent].pfCallback = pfCallback; + gpCallbackTable[eEvent].pCBParam = pCBParam; + ADI_EXIT_CRITICAL_REGION(); + + /* return the status */ + return (ADI_XINT_SUCCESS); +} + +/*@}*/ + +/*! \cond PRIVATE */ +/* All of the following is excluded from the doxygen output... */ + +/* Common external interrupt handler */ +static inline void XIntCommonInterruptHandler(const ADI_XINT_EVENT eEvent) +{ + /* Clear the IRQ */ + pADI_XINT0->CLR = (1u << (uint32_t)eEvent); + + /* params list is: application-registered cbParam, Event ID, and NULL */ + if(gpCallbackTable[eEvent].pfCallback != NULL) + { + gpCallbackTable[eEvent].pfCallback (gpCallbackTable[eEvent].pCBParam, (uint32_t) eEvent, NULL); + } +} + +/* strongly-bound interrupt handlers to override the default weak bindings */ +void Ext_Int0_Handler(void) +{ + ISR_PROLOG() + XIntCommonInterruptHandler(ADI_XINT_EVENT_INT0); + ISR_EPILOG() +} + +void Ext_Int1_Handler(void) +{ + ISR_PROLOG() + XIntCommonInterruptHandler(ADI_XINT_EVENT_INT1); + ISR_EPILOG() +} + +void Ext_Int2_Handler(void) +{ + ISR_PROLOG() + XIntCommonInterruptHandler(ADI_XINT_EVENT_INT2); + ISR_EPILOG() + +} + +void Ext_Int3_Handler(void) +{ + ISR_PROLOG() + if((pADI_XINT0->EXT_STAT & BITM_XINT_EXT_STAT_STAT_UART_RXWKUP)==BITM_XINT_EXT_STAT_STAT_UART_RXWKUP) + { + XIntCommonInterruptHandler(ADI_XINT_EVENT_UART_RX); + } + else + { + XIntCommonInterruptHandler(ADI_XINT_EVENT_INT3); + } + ISR_EPILOG() +} + +/*! \endcond */ + +/* +** EOF +*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/xint/adi_xint_def.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/xint/adi_xint_def.h new file mode 100755 index 0000000000..205602215c --- /dev/null +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/xint/adi_xint_def.h @@ -0,0 +1,61 @@ +/*! + ***************************************************************************** + * @file: adi_xint_def.h + * @brief: External Interrupt Driver definition + ***************************************************************************** +Copyright (c) 2016 Analog Devices, Inc. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Modified versions of the software must be conspicuously marked as such. + - This software is licensed solely and exclusively for use with processors + manufactured by or for Analog Devices, Inc. + - This software may not be combined or merged with other code in any manner + that would cause the software to become subject to terms and conditions + which differ from those listed here. + - Neither the name of Analog Devices, Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + - The use of this software may or may not infringe the patent rights of one + or more patent holders. This license does not release you from the + requirement that you obtain separate licenses from these patent holders + to use this software. + +THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- +INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF +CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*****************************************************************************/ +#ifndef ADI_XINT_DEF_H +#define ADI_XINT_DEF_H +/*! \cond PRIVATE */ + +/* General macros */ +#define ADI_XINT_CFG_BITS (4u) /*!< number of bits for each external interrupt configuration */ + +/*! Structure to hold callback function and parameter */ +typedef struct _ADI_XINT_CALLBACK_INFO +{ + ADI_CALLBACK pfCallback; /*!< Callback function pointer */ + void *pCBParam; /*!< Callback parameter */ +} ADI_XINT_CALLBACK_INFO; + + +/*! \endcond */ +#endif /* ADI_XINT_DEF_H */ diff --git a/targets/TARGET_Analog_Devices/mbed_rtx.h b/targets/TARGET_Analog_Devices/mbed_rtx.h new file mode 100755 index 0000000000..b4e0ffd011 --- /dev/null +++ b/targets/TARGET_Analog_Devices/mbed_rtx.h @@ -0,0 +1,58 @@ +/* mbed Microcontroller Library + * Copyright (c) 2016 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MBED_MBED_RTX_H +#define MBED_MBED_RTX_H + +#if defined(TARGET_EV_COG_AD3029LZ) + +#ifndef INITIAL_SP +#define INITIAL_SP (0x20004000UL) +#endif +#ifndef OS_TASKCNT +#define OS_TASKCNT 6 +#endif +#ifndef OS_MAINSTKSIZE +#define OS_MAINSTKSIZE 112 +#endif +#ifndef OS_CLOCK +#define OS_CLOCK 26000000 +#endif +#ifndef MBED_CONF_APP_THREAD_STACK_SIZE +#define MBED_CONF_APP_THREAD_STACK_SIZE 1024 +#endif + +#elif defined(TARGET_EV_COG_AD4050LZ) + +#ifndef INITIAL_SP +#define INITIAL_SP (0x20048000UL) +#endif +#ifndef OS_TASKCNT +#define OS_TASKCNT 6 +#endif +#ifndef OS_MAINSTKSIZE +#define OS_MAINSTKSIZE 112 +#endif +#ifndef OS_CLOCK +#define OS_CLOCK 26000000 +#endif +#ifndef MBED_CONF_APP_THREAD_STACK_SIZE +#define MBED_CONF_APP_THREAD_STACK_SIZE 1024 +#endif + +#endif + +#endif // MBED_MBED_RTX_H diff --git a/targets/targets.json b/targets/targets.json index ccfcd28528..49c9993fe9 100755 --- a/targets/targets.json +++ b/targets/targets.json @@ -109,8 +109,8 @@ "extra_labels": ["NXP", "LPC11UXX"], "macros": ["CMSIS_VECTAB_VIRTUAL", "CMSIS_VECTAB_VIRTUAL_HEADER_FILE=\"cmsis_nvic.h\""], "supported_toolchains": ["ARM", "uARM", "GCC_ARM"], - "device_has": ["ANALOGIN", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "SERIAL", "SLEEP", "SPI", "SPISLAVE"], - "default_lib": "small", + "device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "SERIAL", "SLEEP", "SPI", "SPISLAVE"], + "default_lib": "small", "device_name": "LPC11U34FBD48/311" }, "MICRONFCBOARD": { @@ -620,6 +620,17 @@ "device_name": "MK64FN1M0xxx12", "bootloader_supported": true }, + "EV_COG_AD4050LZ": { + "inherits": ["Target"], + "core": "Cortex-M4", + "supported_toolchains": ["ARM", "GCC_ARM", "IAR"], + "macros": ["__ADUCM4050__", "EV_COG_AD4050LZ"], + "extra_labels": ["Analog_Devices", "ADUCM4X50", "ADUCM4050", "EV_COG_AD4050LZ", "FLASH_CMSIS_ALGO"], + "device_has": ["SERIAL", "STDIO_MESSAGES", "TRNG", "SLEEP", "INTERRUPTIN", "LOWPOWERTIMER", "RTC", "SPI", "I2C", "FLASH", "ANALOGIN"], + "device_name": "ADuCM4050", + "detect_code": ["0603"], + "release_versions": ["5"] + }, "MTS_GAMBIT": { "inherits": ["Target"], "core": "Cortex-M4F", @@ -2880,7 +2891,7 @@ } } }, - "EFR32MG12P332F1024GL125": { + "EFR32MG12P332F1024GL125": { "inherits": ["EFM32"], "extra_labels_add": ["EFR32MG12", "1024K", "SL_RAIL", "SL_CRYPTO"], "core": "Cortex-M4F", @@ -2890,7 +2901,7 @@ "public": false, "bootloader_supported": true }, - "TB_SENSE_12": { + "TB_SENSE_12": { "inherits": ["EFR32MG12P332F1024GL125"], "device_has": ["ANALOGIN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES", "TRNG", "FLASH"], "forced_reset_timeout": 5, From b1b4cfb5dc99af5f87be93e97d8991efd8b5da92 Mon Sep 17 00:00:00 2001 From: Dave Wu Date: Mon, 2 Oct 2017 14:28:25 +1100 Subject: [PATCH 30/80] Fixed issues raised in the feedback from ARM for the ADuCM4050 platform. --- .../device/startup_ADuCM4050.c | 12 --------- .../TARGET_ADUCM4050/api/analogin_api.c | 26 ++++++++----------- .../TARGET_ADUCM4050/api/us_ticker.c | 12 ++++----- targets/TARGET_Analog_Devices/mbed_rtx.h | 26 +------------------ 4 files changed, 18 insertions(+), 58 deletions(-) diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/device/startup_ADuCM4050.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/device/startup_ADuCM4050.c index b48cc0f83c..f88ee01be8 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/device/startup_ADuCM4050.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/TARGET_EV_COG_AD4050LZ/device/startup_ADuCM4050.c @@ -65,18 +65,6 @@ const uint32_t SECTION_PLACE(blank_checksum[],".checksum") = BLANKX60,BLANKX600 }; -/*---------------------------------------------------------------------------- - A relocated IVT is requested. Provision for IVT relocation - to RAM during startup. This allows for dynamic interrupt - vector patching required by RTOS. Places the relocated IVT - at the start of RAM. We need (72 + 15 + 1)*4 = 352 bytes, - which address 0x20000000. -*----------------------------------------------------------------------------*/ -#ifdef __ICCARM__ -void (*__Relocated___Vectors[NVIC_NUM_VECTORS])(void) @(NVIC_RAM_VECTOR_ADDRESS); -#else -void (*__Relocated___Vectors[NVIC_NUM_VECTORS])(void) __attribute__((at(NVIC_RAM_VECTOR_ADDRESS))); -#endif /* __ICCARM__ */ /*---------------------------------------------------------------------------- External function Declaration diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/analogin_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/analogin_api.c index d007006439..b9ef021c19 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/analogin_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/analogin_api.c @@ -47,10 +47,6 @@ #include "pinmap.h" #include "PeripheralPins.h" -/** Analogin hal structure. analogin_s is declared in the target's hal - */ -typedef struct analogin_s analogin_t; - #ifdef __cplusplus extern "C" { #endif @@ -99,21 +95,21 @@ void analogin_init(analogin_t *obj, PinName pin) obj->UserBuffer.nChannels = channel; /* Open the ADC device */ - adi_adc_Open(ADC_DEV_NUM, DeviceMemory, sizeof(DeviceMemory),&hDevice); + adi_adc_Open(ADC_DEV_NUM, DeviceMemory, sizeof(DeviceMemory), &hDevice); obj->hDevice = hDevice; /* Power up ADC */ adi_adc_PowerUp (hDevice, true); /* Set ADC reference */ - adi_adc_SetVrefSource (hDevice, ADI_ADC_VREF_SRC_INT_2_50_V); + adi_adc_SetVrefSource(hDevice, ADI_ADC_VREF_SRC_INT_2_50_V); /* Enable ADC sub system */ - adi_adc_EnableADCSubSystem (hDevice, true); + adi_adc_EnableADCSubSystem(hDevice, true); /* Wait untilthe ADC is ready for sampling */ while(bReady == false) { - adi_adc_IsReady (hDevice, &bReady); + adi_adc_IsReady(hDevice, &bReady); } /* Start calibration */ @@ -121,14 +117,14 @@ void analogin_init(analogin_t *obj, PinName pin) /* Wait until calibration is done */ while (!bCalibrationDone) { - adi_adc_IsCalibrationDone (hDevice, &bCalibrationDone); + adi_adc_IsCalibrationDone(hDevice, &bCalibrationDone); } /* Set the delay time */ - adi_adc_SetDelayTime ( hDevice, obj->DelayCycles); + adi_adc_SetDelayTime(hDevice, obj->DelayCycles); /* Set the acquisition time. (Application need to change it based on the impedence) */ - adi_adc_SetAcquisitionTime ( hDevice, obj->SampleCycles); + adi_adc_SetAcquisitionTime(hDevice, obj->SampleCycles); } @@ -155,15 +151,15 @@ uint16_t analogin_read_u16(analogin_t *obj) ADI_ADC_BUFFER *pAdcBuffer; /* Submit the buffer to the driver */ - adi_adc_SubmitBuffer (hDevice, &obj->UserBuffer); + adi_adc_SubmitBuffer(hDevice, &obj->UserBuffer); /* Enable the ADC */ - adi_adc_Enable (hDevice, true); + adi_adc_Enable(hDevice, true); - adi_adc_GetBuffer (hDevice, &pAdcBuffer); + adi_adc_GetBuffer(hDevice, &pAdcBuffer); MBED_ASSERT(pAdcBuffer == &obj->UserBuffer); - return( (uint16_t) ( ((uint16_t *)pAdcBuffer->pDataBuffer)[(pAdcBuffer->nNumConversionPasses) - 1]) ); + return( (uint16_t)( ((uint16_t *)pAdcBuffer->pDataBuffer)[(pAdcBuffer->nNumConversionPasses) - 1]) ); } /* Retrieve te active channel correspondoing to the input pin */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/us_ticker.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/us_ticker.c index f782e4745a..29c53a4716 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/us_ticker.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/us_ticker.c @@ -171,23 +171,23 @@ static void calc_event_counts(uint32_t timestamp) uint64_t aa; calc_time = get_current_time(); - offset = timestamp - calc_time; // offset in useconds + offset = timestamp - calc_time; // offset in useconds - if (offset > 0xf0000000u) // if offset is a really big number, assume that timer has already expired (i.e. negative) + if (offset > 0xf0000000u) // if offset is a really big number, assume that timer has already expired (i.e. negative) offset = 0u; - if (offset > 10u) { // it takes 10us to user timer routine after interrupt. Offset timer to account for that. + if (offset > 10u) { // it takes 10us to user timer routine after interrupt. Offset timer to account for that. offset -= 10u; } else offset = 0u; aa = (uint64_t) offset; - aa *= 26u; // convert from 1MHz to 26MHz clock. todo scale for other clock freqs + aa *= 26u; // convert from 1MHz to 26MHz clock. todo scale for other clock freqs blocks = aa >> 7; - blocks++; // round + blocks++; // round - largecnt = blocks>>1; // communicate to event_timer() routine + largecnt = blocks>>1; // communicate to event_timer() routine } static void event_timer() diff --git a/targets/TARGET_Analog_Devices/mbed_rtx.h b/targets/TARGET_Analog_Devices/mbed_rtx.h index b4e0ffd011..16ab23b8ba 100755 --- a/targets/TARGET_Analog_Devices/mbed_rtx.h +++ b/targets/TARGET_Analog_Devices/mbed_rtx.h @@ -17,35 +17,11 @@ #ifndef MBED_MBED_RTX_H #define MBED_MBED_RTX_H -#if defined(TARGET_EV_COG_AD3029LZ) - -#ifndef INITIAL_SP -#define INITIAL_SP (0x20004000UL) -#endif -#ifndef OS_TASKCNT -#define OS_TASKCNT 6 -#endif -#ifndef OS_MAINSTKSIZE -#define OS_MAINSTKSIZE 112 -#endif -#ifndef OS_CLOCK -#define OS_CLOCK 26000000 -#endif -#ifndef MBED_CONF_APP_THREAD_STACK_SIZE -#define MBED_CONF_APP_THREAD_STACK_SIZE 1024 -#endif - -#elif defined(TARGET_EV_COG_AD4050LZ) +#if defined(TARGET_EV_COG_AD4050LZ) #ifndef INITIAL_SP #define INITIAL_SP (0x20048000UL) #endif -#ifndef OS_TASKCNT -#define OS_TASKCNT 6 -#endif -#ifndef OS_MAINSTKSIZE -#define OS_MAINSTKSIZE 112 -#endif #ifndef OS_CLOCK #define OS_CLOCK 26000000 #endif From f5b6cda0ba01153324f9892e3a9a82de38c46236 Mon Sep 17 00:00:00 2001 From: Dave Wu Date: Mon, 2 Oct 2017 14:36:03 +1100 Subject: [PATCH 31/80] Fixed a merge error for LPC11U34_421. --- targets/targets.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/targets.json b/targets/targets.json index 49c9993fe9..1f4543f020 100755 --- a/targets/targets.json +++ b/targets/targets.json @@ -109,7 +109,7 @@ "extra_labels": ["NXP", "LPC11UXX"], "macros": ["CMSIS_VECTAB_VIRTUAL", "CMSIS_VECTAB_VIRTUAL_HEADER_FILE=\"cmsis_nvic.h\""], "supported_toolchains": ["ARM", "uARM", "GCC_ARM"], - "device_has": ["ANALOGIN", "ERROR_PATTERN", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "SERIAL", "SLEEP", "SPI", "SPISLAVE"], + "device_has": ["ANALOGIN", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "SERIAL", "SLEEP", "SPI", "SPISLAVE"], "default_lib": "small", "device_name": "LPC11U34FBD48/311" }, From af8b5d916fe65ca19873f40ecfaf042b1b29986d Mon Sep 17 00:00:00 2001 From: Dave Wu Date: Mon, 2 Oct 2017 15:34:19 +1100 Subject: [PATCH 32/80] - Added definiton for i2c_reset; - Removed unneeded code from i2c and serial modules. --- .../TARGET_ADUCM4050/api/i2c_api.c | 38 ++++--------------- .../TARGET_ADUCM4050/api/serial_api.c | 38 ------------------- 2 files changed, 8 insertions(+), 68 deletions(-) diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/i2c_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/i2c_api.c index 7a883ff245..afa0312f47 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/i2c_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/i2c_api.c @@ -191,7 +191,14 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) void i2c_reset(i2c_t *obj) { - return; + ADI_I2C_RESULT I2C_Return; + ADI_I2C_HANDLE I2C_Handle = *obj->pI2C_Handle; + + I2C_Return = adi_i2c_Reset(I2C_Handle); + if (I2C_Return) { + obj->error = I2C_EVENT_ERROR; + return; + } } @@ -206,33 +213,4 @@ int i2c_byte_write(i2c_t *obj, int data) return 0; } - - -#if DEVICE_I2CSLAVE -void i2c_slave_mode(i2c_t *obj, int enable_slave) -{ - -} - -int i2c_slave_receive(i2c_t *obj) -{ - -} - -int i2c_slave_read(i2c_t *obj, char *data, int length) -{ - return length; -} - -int i2c_slave_write(i2c_t *obj, const char *data, int length) -{ - return length; -} - -void i2c_slave_address(i2c_t *obj, int idx, uint32_t address, uint32_t mask) -{ - -} -#endif // #if DEVICE_I2CSLAVE - #endif // #if DEVICE_I2C diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c index 8764be8803..0a118c0cca 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c @@ -302,44 +302,6 @@ void serial_break_clear(serial_t *obj) adi_uart_ForceTxBreak(hDevice[obj->index], false); } -#if DEVICE_SERIAL_ASYNCH -uint8_t serial_tx_active(serial_t *obj) -{ - return 0; -} - -uint8_t serial_rx_active(serial_t *obj) -{ - return 0; -} - -int serial_irq_handler_asynch(serial_t *obj) -{ - return 0; -} - - - -int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx_width, uint32_t handler, uint32_t event, DMAUsage hint) -{ - return 0; -} - -void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_width, uint32_t handler, uint32_t event, uint8_t char_match, DMAUsage hint) -{ - -} - -void serial_tx_abort_asynch(serial_t *obj) -{ - -} - -void serial_rx_abort_asynch(serial_t *obj) -{ - -} -#endif void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) { From aa6872523e3ad206db25b38e08f40ccc444ec7ff Mon Sep 17 00:00:00 2001 From: Dave Wu Date: Tue, 3 Oct 2017 14:21:37 +1100 Subject: [PATCH 33/80] - Fixed an issue where the TRNG device is read even when it is not ready; - Added a configuration call in trng_init to make sure the TRNG buffering mode is disabled, so only 8-bit bytes are returned; - Moved the TRNG device handle into the trng_t structure; - Fixed some formatting errors in the adc driver. --- .../TARGET_ADUCM4050/api/analogin_api.c | 6 +-- .../TARGET_ADUCM4050/api/objects.h | 4 +- .../TARGET_ADUCM4050/api/trng_api.c | 42 ++++++++++++------- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/analogin_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/analogin_api.c index b9ef021c19..06413a81d6 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/analogin_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/analogin_api.c @@ -99,7 +99,7 @@ void analogin_init(analogin_t *obj, PinName pin) obj->hDevice = hDevice; /* Power up ADC */ - adi_adc_PowerUp (hDevice, true); + adi_adc_PowerUp(hDevice, true); /* Set ADC reference */ adi_adc_SetVrefSource(hDevice, ADI_ADC_VREF_SRC_INT_2_50_V); @@ -113,7 +113,7 @@ void analogin_init(analogin_t *obj, PinName pin) } /* Start calibration */ - adi_adc_StartCalibration (hDevice); + adi_adc_StartCalibration(hDevice); /* Wait until calibration is done */ while (!bCalibrationDone) { @@ -198,7 +198,7 @@ static uint32_t adi_pin2channel(PinName pin) break; } - return((uint32_t) activech); + return ((uint32_t)activech); } diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/objects.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/objects.h index 7b316f5c32..aeecf36d00 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/objects.h +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/objects.h @@ -44,8 +44,8 @@ #include "cmsis.h" #include "PeripheralNames.h" #include "PinNames.h" -//#include "target_config.h" #include "gpio_object.h" +#include "adi_rng.h" #include "adi_i2c.h" #include "adi_spi.h" @@ -69,7 +69,7 @@ struct serial_s { }; struct trng_s { - uint8_t dummy; + ADI_RNG_HANDLE RNGhDevice; }; #define BUILD_I2C_MI_DYNAMIC diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c index 4012775454..8106f44e59 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c @@ -52,44 +52,58 @@ #define TRNG_CNT_VAL 4095 #define TRNG_PRESCALER 2 -static ADI_RNG_HANDLE RNGhDevice; /* Memory to handle CRC Device */ -static uint32_t RngDevMem[(ADI_RNG_MEMORY_SIZE + 3)/4]; /* Data buffers for Random numbers */ +/* Data buffers for Random numbers */ +static uint32_t RngDevMem[(ADI_RNG_MEMORY_SIZE + 3)/4]; void trng_init(trng_t *obj) { - (void)obj; + ADI_RNG_HANDLE RNGhDevice; + + // Open the device adi_rng_Open(0,RngDevMem,sizeof(RngDevMem),&RNGhDevice); // Set sample length for the H/W RN accumulator adi_rng_SetSampleLen(RNGhDevice, TRNG_PRESCALER, TRNG_CNT_VAL); - // Enable the RNG + // Disable buffering - single byte generation only + adi_rng_EnableBuffering(RNGhDevice, false); + + // Enable the TRNG adi_rng_Enable(RNGhDevice, true); + + // Save device handle + obj->RNGhDevice = RNGhDevice; } void trng_free(trng_t *obj) { - (void)obj; + ADI_RNG_HANDLE RNGhDevice = obj->RNGhDevice; + adi_rng_Enable(RNGhDevice, false); adi_rng_Close(RNGhDevice); } int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_length) { - (void)obj; + ADI_RNG_HANDLE RNGhDevice = obj->RNGhDevice; bool bRNGRdy; uint32_t nRandomNum, i; - for (i = 0; i < length; ) { - // wait for the RNG ready to give a random number - adi_rng_GetRdyStatus(RNGhDevice, &bRNGRdy); - if (bRNGRdy) { - // read the random number - adi_rng_GetRngData(RNGhDevice, &nRandomNum); - output[i++] = (uint8_t) nRandomNum; - } + for (i = 0; i < length; i++) { + // Loop until the device has data to be read + do { + adi_rng_GetRdyStatus(RNGhDevice, &bRNGRdy); + } while (!bRNGRdy); + + // Read the RNG + adi_rng_GetRngData(RNGhDevice, &nRandomNum); + + // Save the output + output[i] = (uint8_t)nRandomNum; } + *output_length = length; + return 0; } From 78d8379a82457f4df76ba5dc586a84e3e9ffafe4 Mon Sep 17 00:00:00 2001 From: Dave Wu Date: Tue, 3 Oct 2017 15:00:42 +1100 Subject: [PATCH 34/80] Removed undefined spi slave related functions. --- .../TARGET_ADUCM4050/api/spi_api.c | 35 ------------------- 1 file changed, 35 deletions(-) diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/spi_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/spi_api.c index a17dea1ab6..b788e5b2ad 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/spi_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/spi_api.c @@ -287,41 +287,6 @@ int spi_master_write(spi_t *obj, int value) } -/** Check if a value is available to read - * - * @param[in] obj The SPI peripheral to check - * @return non-zero if a value is available - */ -int spi_slave_receive(spi_t *obj) -{ - return 0; -} - - -/** Get a received value out of the SPI receive buffer in slave mode - * - * Blocks until a value is available - * @param[in] obj The SPI peripheral to read - * @return The value received - */ -int spi_slave_read(spi_t *obj) -{ - return 0; -} - - -/** Write a value to the SPI peripheral in slave mode - * - * Blocks until the SPI peripheral can be written to - * @param[in] obj The SPI peripheral to write - * @param[in] value The value to write - */ -void spi_slave_write(spi_t *obj, int value) -{ - return; -} - - /** Write a block out in master mode and receive a value * * The total number of bytes sent and recieved will be the maximum of From 1a0470f86969dc1f6cf2f8d8bf5b20548539442d Mon Sep 17 00:00:00 2001 From: Dave Wu Date: Tue, 3 Oct 2017 17:32:10 +1100 Subject: [PATCH 35/80] Removed the custom app thread stack size. --- targets/TARGET_Analog_Devices/mbed_rtx.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/targets/TARGET_Analog_Devices/mbed_rtx.h b/targets/TARGET_Analog_Devices/mbed_rtx.h index 16ab23b8ba..199b04fde8 100755 --- a/targets/TARGET_Analog_Devices/mbed_rtx.h +++ b/targets/TARGET_Analog_Devices/mbed_rtx.h @@ -25,9 +25,6 @@ #ifndef OS_CLOCK #define OS_CLOCK 26000000 #endif -#ifndef MBED_CONF_APP_THREAD_STACK_SIZE -#define MBED_CONF_APP_THREAD_STACK_SIZE 1024 -#endif #endif From 477c728b612e13ba39aae28d63324b70f9b34bb0 Mon Sep 17 00:00:00 2001 From: Dave Wu Date: Mon, 9 Oct 2017 17:13:58 +1100 Subject: [PATCH 36/80] - Added error checking for trng_get_bytes function; - Added curly brackets to single line conditions in gpio_qpi.c and gpio_irq_api.c; - Changed rx and tx buffers in serial module as local variables; - Minor i2c & spi updates for github pull request; - Added function definition for spi_master_block_write. --- .../TARGET_ADUCM4050/api/gpio_api.c | 11 ++++--- .../TARGET_ADUCM4050/api/gpio_irq_api.c | 31 ++++++++++++------- .../TARGET_ADUCM4050/api/i2c_api.c | 12 ++++--- .../TARGET_ADUCM4050/api/serial_api.c | 8 ++--- .../TARGET_ADUCM4050/api/spi_api.c | 23 +++++++++++++- .../TARGET_ADUCM4050/api/trng_api.c | 16 ++++++++-- 6 files changed, 74 insertions(+), 27 deletions(-) diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_api.c index c338d84275..81d4be52cb 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_api.c @@ -71,13 +71,15 @@ void gpio_init(gpio_t *obj, PinName pin) { obj->pin = pin; - if (pin == (PinName)NC) + if (pin == (PinName)NC) { return; + } // Initialize the GPIO driver. This function // initializes the GPIO driver only once globally. - if (!gpio_initialized) + if (!gpio_initialized) { adi_gpio_Init(gpioMemory, ADI_GPIO_MEMORY_SIZE); + } pin_function(pin, MUX_FUNC_0); } @@ -134,11 +136,12 @@ int gpio_read(gpio_t *obj) uint16_t Data; // check whether the pin is configured as input or output - if ((gpio_oen[port] >> pin_num) & 1) + if ((gpio_oen[port] >> pin_num) & 1) { Data = gpio_output_val[port] & (1 << pin_num); - else + } else { // otherwise call GetData adi_gpio_GetData((ADI_GPIO_PORT)port, (1 << pin_num), &Data); + } return ((((uint32_t)Data) >> pin_num) & 1); } diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_irq_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_irq_api.c index ae5b8234c3..3cf237218b 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_irq_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/gpio_irq_api.c @@ -183,8 +183,9 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32 uint32_t pin_num = pin & 0xFF; // check for valid pin and ID - if ((pin == NC) || (id == 0)) + if ((pin == NC) || (id == 0)) { return -1; + } // make sure gpio driver has been initialized if (!gpio_initialized) { @@ -193,8 +194,9 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32 } // save the handler - if (handler) + if (handler) { irq_handler = handler; + } // disable the interrupt for the given pin disable_pin_interrupt((ADI_GPIO_PORT)port, pin_num); @@ -242,16 +244,18 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) uint32_t port = obj->pinname >> GPIO_PORT_SHIFT; uint32_t pin_num = obj->pinname & 0xFF; - if (event == IRQ_NONE) + if (event == IRQ_NONE) { return; + } // read the current polarity register adi_gpio_GetGroupInterruptPolarity((ADI_GPIO_PORT)port, 1 << pin_num, &int_polarity_reg); - if (event == IRQ_RISE) + if (event == IRQ_RISE) { int_polarity_reg |= (1 << pin_num); - else + } else { int_polarity_reg &= ~(1 << pin_num); + } // set the polarity register adi_gpio_SetGroupInterruptPolarity((ADI_GPIO_PORT)port, int_polarity_reg); @@ -259,10 +263,11 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) channel_ids[port][pin_num].event = event; // enable interrupt for this pin if enable flag is set - if (enable) + if (enable) { gpio_irq_enable(obj); - else + } else { gpio_irq_disable(obj); + } } /** Enable GPIO IRQ @@ -275,8 +280,9 @@ void gpio_irq_enable(gpio_irq_t *obj) uint32_t port = obj->pinname >> GPIO_PORT_SHIFT; uint32_t pin_num = obj->pinname & 0xFF; - if (channel_ids[port][pin_num].event == IRQ_NONE) + if (channel_ids[port][pin_num].event == IRQ_NONE) { return; + } // Group all RISE interrupts in INTA and FALL interrupts in INTB if (channel_ids[port][pin_num].event == IRQ_RISE) { @@ -302,14 +308,17 @@ void gpio_irq_disable(gpio_irq_t *obj) uint32_t port = obj->pinname >> GPIO_PORT_SHIFT; uint32_t pin_num = obj->pinname & 0xFF; - if (channel_ids[port][pin_num].event == IRQ_NONE) + if (channel_ids[port][pin_num].event == IRQ_NONE) { return; + } // Group all RISE interrupts in INTA and FALL interrupts in INTB - if (channel_ids[port][pin_num].event == IRQ_RISE) + if (channel_ids[port][pin_num].event == IRQ_RISE) { disable_pin_interrupt((ADI_GPIO_PORT)port, pin_num); - else if (channel_ids[port][pin_num].event == IRQ_FALL) + } + else if (channel_ids[port][pin_num].event == IRQ_FALL) { disable_pin_interrupt((ADI_GPIO_PORT)port, pin_num); + } channel_ids[port][pin_num].int_enable = 0; } diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/i2c_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/i2c_api.c index afa0312f47..f25d80c910 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/i2c_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/i2c_api.c @@ -110,13 +110,15 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) int i2c_start(i2c_t *obj) { - return 0; + /* The Hardware does not support this feature. */ + return -1; } int i2c_stop(i2c_t *obj) { - return 0; + /* The Hardware does not support this feature. */ + return -1; } @@ -204,13 +206,15 @@ void i2c_reset(i2c_t *obj) int i2c_byte_read(i2c_t *obj, int last) { - return 0; + /* The Hardware does not support this feature. */ + return -1; } int i2c_byte_write(i2c_t *obj, int data) { - return 0; + /* The Hardware does not support this feature. */ + return -1; } #endif // #if DEVICE_I2C diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c index 0a118c0cca..c6af733fad 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c @@ -53,16 +53,16 @@ #include "PeripheralPins.h" #include "drivers/uart/adi_uart.h" #define ADI_UART_MEMORY_SIZE (ADI_UART_BIDIR_MEMORY_SIZE) -#define ADI_UART_NUM_DEVICES 2 +#define ADI_UART_NUM_DEVICES 2 -static ADI_UART_HANDLE hDevice[ADI_UART_NUM_DEVICES]; +static ADI_UART_HANDLE hDevice[ADI_UART_NUM_DEVICES]; static uint32_t UartDeviceMem[ADI_UART_NUM_DEVICES][(ADI_UART_MEMORY_SIZE + 3)/4]; static uint32_t serial_irq_ids[ADI_UART_NUM_DEVICES] = {0}; static uart_irq_handler irq_handler = NULL; int stdio_uart_inited = 0; serial_t stdio_uart; -int rxbuffer[2]; -int txbuffer[2]; +static int rxbuffer[2]; +static int txbuffer[2]; static void uart_callback(void *pCBParam, uint32_t Event, void *pArg) { diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/spi_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/spi_api.c index b788e5b2ad..76015a4b2d 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/spi_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/spi_api.c @@ -305,7 +305,28 @@ int spi_master_write(spi_t *obj, int value) */ int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, char write_fill) { - return 0; + ADI_SPI_TRANSCEIVER transceive; + ADI_SPI_HANDLE SPI_Handle; + ADI_SPI_RESULT SPI_Return = ADI_SPI_SUCCESS; + + transceive.pReceiver = rx_buffer; + transceive.ReceiverBytes = rx_length; /* link transceive data size to the remaining count */ + transceive.nRxIncrement = 1; /* auto increment buffer */ + transceive.pTransmitter = tx_buffer; /* initialize data attributes */ + transceive.TransmitterBytes = tx_length; /* link transceive data size to the remaining count */ + transceive.nTxIncrement = 1; /* auto increment buffer */ + + transceive.bDMA = false; + transceive.bRD_CTL = false; + SPI_Handle = *obj->pSPI_Handle; + SPI_Return = adi_spi_MasterReadWrite(SPI_Handle, &transceive); + if (SPI_Return) { + obj->error = SPI_EVENT_ERROR; + return -1; + } + else { + return((int)tx_length); + } } #endif diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c index 8106f44e59..de9d710697 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c @@ -88,18 +88,28 @@ int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_l ADI_RNG_HANDLE RNGhDevice = obj->RNGhDevice; bool bRNGRdy; uint32_t nRandomNum, i; + ADI_RNG_RESULT result; for (i = 0; i < length; i++) { // Loop until the device has data to be read do { - adi_rng_GetRdyStatus(RNGhDevice, &bRNGRdy); + result = adi_rng_GetRdyStatus(RNGhDevice, &bRNGRdy); + if (result != ADI_RNG_SUCCESS) + { + return -1; + } } while (!bRNGRdy); // Read the RNG - adi_rng_GetRngData(RNGhDevice, &nRandomNum); + result = adi_rng_GetRngData(RNGhDevice, &nRandomNum); + + if (result != ADI_RNG_SUCCESS) + { + return -1; + } // Save the output - output[i] = (uint8_t)nRandomNum; + output[i] = (uint8_t)(nRandomNum & 0xFF); } *output_length = length; From 46eae9f86254441146d6aac90905ee4e74b13c1d Mon Sep 17 00:00:00 2001 From: Dave Wu Date: Mon, 9 Oct 2017 17:28:46 +1100 Subject: [PATCH 37/80] Added curly brackets for the single line if else statement. --- .../TARGET_ADUCM4X50/TARGET_ADUCM4050/api/sleep.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/sleep.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/sleep.c index c323b51ca5..b6ea83f1ed 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/sleep.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/sleep.c @@ -189,10 +189,11 @@ void set_clock_gating(peripheral_clk_t eClk, int enable) } // if enable, set the bit otherwise clear the bit - if (enable) + if (enable) { pADI_CLKG0_CLK->CTL5 |= flag; - else + } else { pADI_CLKG0_CLK->CTL5 &= (~flag); + } } From a85563bcc51d6a72165651e350af8a114c7f43e6 Mon Sep 17 00:00:00 2001 From: Dave Wu Date: Wed, 11 Oct 2017 15:06:49 +1100 Subject: [PATCH 38/80] - Cleaned up some formatting issues; - Fixed a build error in spi_master_block_write; - Some clean up in serai_api. --- .../TARGET_ADUCM4050/api/cmsis.h | 1 + .../TARGET_ADUCM4050/api/lp_ticker_api.c | 12 +-- .../TARGET_ADUCM4050/api/objects.h | 2 +- .../TARGET_ADUCM4050/api/serial_api.c | 85 +++---------------- .../TARGET_ADUCM4050/api/spi_api.c | 23 +++-- 5 files changed, 30 insertions(+), 93 deletions(-) diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/cmsis.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/cmsis.h index 2d2850cc2e..b0439b1db0 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/cmsis.h +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/cmsis.h @@ -43,4 +43,5 @@ #define __C #include "adi_processor.h" #include "cmsis_nvic.h" +#undef __C #endif diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/lp_ticker_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/lp_ticker_api.c index 5d46471c4a..addb198aa6 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/lp_ticker_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/lp_ticker_api.c @@ -120,7 +120,7 @@ static int set_rtc_alarm_interrupt(ADI_RTC_HANDLE const hDevice, uint32_t nAlarm * Local RTC 1 ISR callback function. * */ -static void rtc1_Callback (void *pCBParam, uint32_t nEvent, void *EventArg) +static void rtc1_Callback(void *pCBParam, uint32_t nEvent, void *EventArg) { /* process RTC interrupts (cleared by driver) */ if (ADI_RTC_ALARM_INT & nEvent) { @@ -129,16 +129,6 @@ static void rtc1_Callback (void *pCBParam, uint32_t nEvent, void *EventArg) } -/** Get low power ticker's data - * - * @return The low power ticker data - */ -/* -const ticker_data_t* get_lp_ticker_data() -{ -}*/ - - /* HAL lp ticker */ /** Initialize the low power ticker diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/objects.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/objects.h index aeecf36d00..495faf8c67 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/objects.h +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/objects.h @@ -85,7 +85,7 @@ struct i2c_s { #define BUILD_SPI_MI_DYNAMIC struct spi_s { - uint32_t instance; + uint32_t instance; uint32_t error; ADI_SPI_HANDLE *pSPI_Handle; #if defined(BUILD_SPI_MI_DYNAMIC) diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c index c6af733fad..fabe28d035 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c @@ -135,24 +135,26 @@ void serial_baud(serial_t *obj, int baudrate) void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) { - int convertedparity = ADI_UART_NO_PARITY; - int convertedstopbits = ADI_UART_ONE_STOPBIT; + ADI_UART_PARITY convertedparity = ADI_UART_NO_PARITY; + ADI_UART_STOPBITS convertedstopbits = ADI_UART_ONE_STOPBIT; - if (stop_bits) + if (stop_bits) { convertedstopbits = ADI_UART_ONE_AND_HALF_TWO_STOPBITS; + } - if (parity == ParityOdd) + if (parity == ParityOdd) { convertedparity = ADI_UART_ODD_PARITY; - else if (parity == ParityEven) + } else if (parity == ParityEven) { convertedparity = ADI_UART_EVEN_PARITY; - else if (parity == ParityForced1) + } else if (parity == ParityForced1) { convertedparity = ADI_UART_ODD_PARITY_STICKY; - else if (parity == ParityForced0) + } else if (parity == ParityForced0) { convertedparity = ADI_UART_EVEN_PARITY_STICKY; + } - adi_uart_SetConfiguration(hDevice[obj->index], convertedparity, convertedstopbits, (data_bits - 5)); + adi_uart_SetConfiguration(hDevice[obj->index], convertedparity, convertedstopbits, + (ADI_UART_WORDLEN)(data_bits - 5)); } -#ifndef ADI_UART_TRANSFER_MODE void serial_init(serial_t *obj, PinName tx, PinName rx) { @@ -212,71 +214,6 @@ void serial_putc(serial_t *obj, int c) return; } -#else - -void serial_init(serial_t *obj, PinName tx, PinName rx) -{ - uint32_t uart_tx = pinmap_peripheral(tx, PinMap_UART_TX); - uint32_t uart_rx = pinmap_peripheral(rx, PinMap_UART_RX); - - obj->index = pinmap_merge(uart_tx, uart_rx); - MBED_ASSERT((int)obj->index != NC); - - adi_uart_Open(obj->index, ADI_UART_DIR_BIDIRECTION, UartDeviceMem[obj->index], ADI_UART_MEMORY_SIZE, &hDevice[obj->index]); - - serial_baud(obj, 9600); - serial_format(obj, 8, ParityNone, 1); - - pinmap_pinout(tx, PinMap_UART_TX); - pinmap_pinout(rx, PinMap_UART_RX); - - if (tx != NC) { - pin_mode(tx, PullUp); - } - - if (rx != NC) { - pin_mode(rx, PullUp); - } - - if (obj->index == STDIO_UART) { - stdio_uart_inited = 1; - memcpy(&stdio_uart, obj, sizeof(serial_t)); - } - - // set maximum FIFO depth - adi_uart_SetRxFifoTriggerLevel(hDevice[obj->index], ADI_UART_RX_FIFO_TRIG_LEVEL_14BYTE); - - // enable FIFO - adi_uart_EnableFifo(hDevice[obj->index], true); -} - -int serial_getc(serial_t *obj) -{ - int c; - uint32_t hwErr; - - adi_uart_Read(hDevice[obj->index], (void *) &c, 1, false, &hwErr); - return (c); -} - -void serial_putc(serial_t *obj, int c) -{ - uint32_t hwErr; - - adi_uart_Write(hDevice[obj->index], &c, 1, false, &hwErr); - return; -} - -int serial_readable(serial_t *obj) -{ - return 0; -} - -int serial_writable(serial_t *obj) -{ - return 0; -} -#endif void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) { MBED_ASSERT(obj); diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/spi_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/spi_api.c index 76015a4b2d..a52406889b 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/spi_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/spi_api.c @@ -213,15 +213,24 @@ void spi_free(spi_t *obj) * 2 | 1 0 * 3 | 1 1 * @endcode + + bool phase; + true : trailing-edge + false : leading-edge + + bool polarity; + true : CPOL=1 (idle high) polarity + false : CPOL=0 (idle-low) polarity */ void spi_format(spi_t *obj, int bits, int mode, int slave) { ADI_SPI_HANDLE SPI_Handle; ADI_SPI_RESULT SPI_Return = ADI_SPI_SUCCESS; - bool_t master; + bool master; master = !((bool_t)slave); SPI_Handle = *obj->pSPI_Handle; + SPI_Return = adi_spi_SetMasterMode(SPI_Handle, master); if (SPI_Return) { obj->error = SPI_EVENT_ERROR; @@ -309,12 +318,12 @@ int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length, cha ADI_SPI_HANDLE SPI_Handle; ADI_SPI_RESULT SPI_Return = ADI_SPI_SUCCESS; - transceive.pReceiver = rx_buffer; - transceive.ReceiverBytes = rx_length; /* link transceive data size to the remaining count */ - transceive.nRxIncrement = 1; /* auto increment buffer */ - transceive.pTransmitter = tx_buffer; /* initialize data attributes */ - transceive.TransmitterBytes = tx_length; /* link transceive data size to the remaining count */ - transceive.nTxIncrement = 1; /* auto increment buffer */ + transceive.pReceiver = (uint8_t*)rx_buffer; + transceive.ReceiverBytes = rx_length; /* link transceive data size to the remaining count */ + transceive.nRxIncrement = 1; /* auto increment buffer */ + transceive.pTransmitter = (uint8_t*)tx_buffer; /* initialize data attributes */ + transceive.TransmitterBytes = tx_length; /* link transceive data size to the remaining count */ + transceive.nTxIncrement = 1; /* auto increment buffer */ transceive.bDMA = false; transceive.bRD_CTL = false; From c4220ece9b34a601c30c90dba9e1b26186a85cd6 Mon Sep 17 00:00:00 2001 From: Dave Wu Date: Thu, 12 Oct 2017 12:46:54 +1100 Subject: [PATCH 39/80] Added default delay and sample times for the ADC during initialization. --- .../TARGET_ADUCM4050/api/analogin_api.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/analogin_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/analogin_api.c index 06413a81d6..baa96a694e 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/analogin_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/analogin_api.c @@ -94,6 +94,22 @@ void analogin_init(analogin_t *obj, PinName pin) MBED_ASSERT(channel != 0xFFFFFFFF); obj->UserBuffer.nChannels = channel; + /* Set ACLK to CCLK/16 */ + adi_pwr_SetClockDivider(ADI_CLOCK_ACLK,16); + + /* Set default values for conversion and delay cycles. This sets up a sampling rate of + 16kHz. The sampling frequency is worked out from the following: + + if delay time > 0: + Fs = ACLK / [((14 + sampling time) * oversample factor) + (delay time + 2)] + if delay time = 0: + Fs = ACLK / ((14 + sampling time) * oversample factor) + + The sampling (or acquisition) and delay times are in number of ACLK clock cycles. + */ + obj->DelayCycles = 0; + obj->SampleCycles = 88; + /* Open the ADC device */ adi_adc_Open(ADC_DEV_NUM, DeviceMemory, sizeof(DeviceMemory), &hDevice); obj->hDevice = hDevice; From 41c6084a1ebda43d7384e572e203469e64ae0117 Mon Sep 17 00:00:00 2001 From: "dave.wu@analog.com" Date: Mon, 30 Oct 2017 02:16:55 +0100 Subject: [PATCH 40/80] - Added code to clear temporary variable on the stack before exiting the trng_get_bytes; - Removed lp ticker as it does not satisfy the requirements of the lp timer. --- .../TARGET_ADUCM4050/api/lp_ticker_api.c | 259 ------------------ .../TARGET_ADUCM4050/api/trng_api.c | 3 + targets/targets.json | 2 +- 3 files changed, 4 insertions(+), 260 deletions(-) delete mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/lp_ticker_api.c diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/lp_ticker_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/lp_ticker_api.c deleted file mode 100755 index addb198aa6..0000000000 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/lp_ticker_api.c +++ /dev/null @@ -1,259 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2010-2017 Analog Devices, Inc. - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Modified versions of the software must be conspicuously marked as such. - * - This software is licensed solely and exclusively for use with processors - * manufactured by or for Analog Devices, Inc. - * - This software may not be combined or merged with other code in any manner - * that would cause the software to become subject to terms and conditions - * which differ from those listed here. - * - Neither the name of Analog Devices, Inc. nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - The use of this software may or may not infringe the patent rights of one - * or more patent holders. This license does not release you from the - * requirement that you obtain separate licenses from these patent holders - * to use this software. - * - * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- - * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF - * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - ******************************************************************************/ - -#include -#include "lp_ticker_api.h" -#include -#include -#include "adi_rtc_def.h" - - -#ifdef DEVICE_LOWPOWERTIMER - -// define base LF clock frequncy in Hz -#define LFCLK_FREQUENCY_HZ 32768 -// RTC prescaler for the LF clock -#define RTC_PRESCALER 0 - -/* time for each tick of the LF clock in us */ -#define TIME_US_PER_TICK ((float)1000000/(float)(LFCLK_FREQUENCY_HZ>>RTC_PRESCALER)) - -// The number of RTC clock ticks it takes to set & enable the alarm -#define TICKS_TO_ENABLE_ALARM 10 - -// Mask to limit the value of the RTC value to 27 bits so the converted time in us fits -// in 32-bits -#define MAX_TICK_MASK ((1 << 27) - 1) - -static unsigned char rtc1_memory[ADI_RTC_MEMORY_SIZE]; -static ADI_RTC_HANDLE hRTC1_Device; - - -/** - * \defgroup hal_LpTicker Low Power Ticker Functions - * @{ - */ -/** - * Local stream-lined alarm setting function. - * - */ -static int set_rtc_alarm_interrupt(ADI_RTC_HANDLE const hDevice, uint32_t nAlarm) -{ - ADI_RTC_DEVICE *pDevice = hDevice; - uint16_t cr0; - ADI_INT_STATUS_ALLOC(); - - // Section to enable interrupts - // The interrupt used is ADI_RTC_ALARM_INT - // Set the Alarm interrupt enable and Alarm enable bits in cr0 - cr0 = BITM_RTC_CR0_ALMEN | (1u << BITP_RTC_CR0_ALMINTEN); - - // Set the alarm value - /* Wait till previously posted write to Alram Register to complete */ - PEND_BEFORE_WRITE(SR1,(BITM_RTC_SR1_WPNDALM0|BITM_RTC_SR1_WPNDALM1)) - - ADI_ENTER_CRITICAL_REGION(); - /* Program the alarm count registers. */ - pDevice->pRTCRegs->ALM0 = (uint16_t)nAlarm; - pDevice->pRTCRegs->ALM1 = (uint16_t)(nAlarm >> 16); - pDevice->pRTCRegs->ALM2 = 0u; - ADI_EXIT_CRITICAL_REGION(); - - /* Wait till write to Control Register to take effect */ - SYNC_AFTER_WRITE(SR0,(BITM_RTC_SR0_WSYNCALM0|BITM_RTC_SR0_WSYNCALM1)) - - // Enable alarm - /* Wait till previously posted write to Control Register to complete */ - PEND_BEFORE_WRITE(SR1,BITM_RTC_SR1_WPNDALM1|BITM_RTC_SR1_WPNDALM0) - - ADI_ENTER_CRITICAL_REGION(); - /* set RTC alarm and interrupt enable */ - pDevice->pRTCRegs->CR0 |= cr0; - ADI_EXIT_CRITICAL_REGION(); - - /* Wait till write to Control Register to take effect */ - SYNC_AFTER_WRITE(SR0,BITM_RTC_SR0_WSYNCCR0) - - return ADI_RTC_SUCCESS; -} - - - -/** - * Local RTC 1 ISR callback function. - * - */ -static void rtc1_Callback(void *pCBParam, uint32_t nEvent, void *EventArg) -{ - /* process RTC interrupts (cleared by driver) */ - if (ADI_RTC_ALARM_INT & nEvent) { - lp_ticker_irq_handler(); - } -} - - -/* HAL lp ticker */ - -/** Initialize the low power ticker - * - */ -void lp_ticker_init() -{ - // open the rtc device - adi_rtc_Open(1, rtc1_memory, ADI_RTC_MEMORY_SIZE, &hRTC1_Device); - - // set the prescaler value - adi_rtc_SetPreScale(hRTC1_Device, RTC_PRESCALER); - - // register call back for events - adi_rtc_RegisterCallback(hRTC1_Device, rtc1_Callback, hRTC1_Device); - - // reset the RTC counter - adi_rtc_SetCount(hRTC1_Device, 0); - - // set the trim value - adi_rtc_SetTrim(hRTC1_Device, ADI_RTC_TRIM_INTERVAL_14, ADI_RTC_TRIM_1, ADI_RTC_TRIM_SUB); - - adi_rtc_EnableTrim(hRTC1_Device, true); - - // enable the RTC - adi_rtc_Enable(hRTC1_Device, true); -} - -/** Read the current counter - * - * @return The current timer's counter value in microseconds - */ -uint32_t lp_ticker_read() -{ - uint32_t count; - float t; - - // get current count - adi_rtc_GetCount(hRTC1_Device, &count); - - // Throw away top 5 bits to avoid overflow and convert ticks to us - count &= MAX_TICK_MASK; - t = (float)count * TIME_US_PER_TICK; - - return (uint32_t)t; -} - -/** Set interrupt for specified timestamp - * - * @param timestamp The time in microseconds to be set - */ -void lp_ticker_set_interrupt(timestamp_t timestamp) -{ - uint32_t rtcCount, trunc_rtcCount, set_tick, tick_delta, alarm_tick; - - // compute the tick value based on the given alarm time - set_tick = (uint32_t)((float)(timestamp) / TIME_US_PER_TICK); - - // get current count - adi_rtc_GetCount(hRTC1_Device, &rtcCount); - - // compute the number of ticks required for the alarm - trunc_rtcCount = rtcCount & MAX_TICK_MASK; - - // if set_tick is less than the current RTC count, the counter has - // missed the desired time, so set tick_delta to 0 - if (set_tick >= trunc_rtcCount) { - tick_delta = set_tick - trunc_rtcCount; - } else { - tick_delta = 0; - } - - // compute the absolute RTC alarm count required - alarm_tick = rtcCount + tick_delta; - - // check if the desired alarm duration is less than TICKS_TO_ENABLE_ALARM, - // if so just wait it out rather than setting the alarm - if (tick_delta <= TICKS_TO_ENABLE_ALARM) { - // otherwise if the alarm time is less than the current RTC count + the time - // it takes to enable the alarm, just wait until the desired number of counts - // has expired rather than using the interrupt, then call the user ISR directly. - do { - adi_rtc_GetCount(hRTC1_Device, &rtcCount); - } while (rtcCount < alarm_tick); - - rtc1_Callback(NULL, ADI_RTC_ALARM_INT, NULL); - return; - } - - // set the alarm otherwise - set_rtc_alarm_interrupt(hRTC1_Device, alarm_tick); -} - -/** Disable low power ticker interrupt - * - */ -void lp_ticker_disable_interrupt() -{ - adi_rtc_EnableInterrupts(hRTC1_Device, ADI_RTC_ALARM_INT, false); -} - -/** Clear the low power ticker interrupt - * - */ -void lp_ticker_clear_interrupt() -{ - ADI_RTC_DEVICE *pDevice = hRTC1_Device; - - NVIC_ClearPendingIRQ(pDevice->eIRQn); - - return; -} - - -/** Set pending interrupt that should be fired right away. - * - * The ticker should be initialized prior calling this function. - */ -void lp_ticker_fire_interrupt(void) -{ - ADI_RTC_DEVICE *pDevice = hRTC1_Device; - - NVIC_SetPendingIRQ(pDevice->eIRQn); -} - - -#endif -/**@}*/ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c index de9d710697..64fe535f84 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c @@ -110,6 +110,9 @@ int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_l // Save the output output[i] = (uint8_t)(nRandomNum & 0xFF); + + // Clear the nRandomNum variable for security purposes + nRandomNum = 0; } *output_length = length; diff --git a/targets/targets.json b/targets/targets.json index 1f4543f020..9284911b83 100755 --- a/targets/targets.json +++ b/targets/targets.json @@ -626,7 +626,7 @@ "supported_toolchains": ["ARM", "GCC_ARM", "IAR"], "macros": ["__ADUCM4050__", "EV_COG_AD4050LZ"], "extra_labels": ["Analog_Devices", "ADUCM4X50", "ADUCM4050", "EV_COG_AD4050LZ", "FLASH_CMSIS_ALGO"], - "device_has": ["SERIAL", "STDIO_MESSAGES", "TRNG", "SLEEP", "INTERRUPTIN", "LOWPOWERTIMER", "RTC", "SPI", "I2C", "FLASH", "ANALOGIN"], + "device_has": ["SERIAL", "STDIO_MESSAGES", "TRNG", "SLEEP", "INTERRUPTIN", "RTC", "SPI", "I2C", "FLASH", "ANALOGIN"], "device_name": "ADuCM4050", "detect_code": ["0603"], "release_versions": ["5"] From f53e037f1f737c467c4d43d718292d70b95a6444 Mon Sep 17 00:00:00 2001 From: Dave Wu Date: Thu, 2 Nov 2017 15:50:55 +1100 Subject: [PATCH 41/80] Added a check for the STUCK bit before reading the RNG data register to ensure there are no hardware faults. --- .../TARGET_ADUCM4050/api/trng_api.c | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c index 64fe535f84..cfab85645d 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/trng_api.c @@ -43,6 +43,7 @@ #include #include #include +#include "adi_rng_def.h" #include "cmsis.h" #include "trng_api.h" @@ -86,37 +87,48 @@ void trng_free(trng_t *obj) int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_length) { ADI_RNG_HANDLE RNGhDevice = obj->RNGhDevice; - bool bRNGRdy; - uint32_t nRandomNum, i; + bool bRNGRdy, bStuck; + uint32_t i; + volatile uint32_t nRandomNum; ADI_RNG_RESULT result; + ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)RNGhDevice; for (i = 0; i < length; i++) { // Loop until the device has data to be read do { result = adi_rng_GetRdyStatus(RNGhDevice, &bRNGRdy); - if (result != ADI_RNG_SUCCESS) - { + if (result != ADI_RNG_SUCCESS) { return -1; } } while (!bRNGRdy); - // Read the RNG - result = adi_rng_GetRngData(RNGhDevice, &nRandomNum); + // Check the STUCK bit to make sure the oscillator output isn't stuck + result = adi_rng_GetStuckStatus(RNGhDevice, &bStuck); - if (result != ADI_RNG_SUCCESS) - { + // If the stuck bit is set, this means there may be a problem with RNG hardware, + // exit with an error + if ( (result != ADI_RNG_SUCCESS) || ((result == ADI_RNG_SUCCESS) && (bStuck)) ) { + // Clear the STUCK bit by writing a 1 to it + pDevice->pRNG->STAT |= BITM_RNG_STAT_STUCK; + return -1; + } + + // Read the RNG + result = adi_rng_GetRngData(RNGhDevice, (uint32_t*)(&nRandomNum)); + + if (result != ADI_RNG_SUCCESS) { return -1; } // Save the output output[i] = (uint8_t)(nRandomNum & 0xFF); - - // Clear the nRandomNum variable for security purposes - nRandomNum = 0; } *output_length = length; + // Clear nRandomNum on the stack before exiting + nRandomNum = 0; + return 0; } From 5408dae639543098dd1795d07102b9978e70debe Mon Sep 17 00:00:00 2001 From: Dave Wu Date: Thu, 9 Nov 2017 14:17:15 +1100 Subject: [PATCH 42/80] - Removed .mbedignore due to an issue with the eclipse exporter not picking up the ignored files; - Added #includes in BSP data C files so they can be built on their own without mbedignore; --- .../TARGET_ADUCM4050/.mbedignore | 28 ------------------- .../TARGET_ADUCM4050/bsp/adc/adi_adc_data.c | 1 + .../bsp/flash/adi_flash_data.c | 2 +- .../TARGET_ADUCM4050/bsp/i2c/adi_i2c_data.c | 2 +- .../TARGET_ADUCM4050/bsp/rtc/adi_rtc_data.c | 14 ++++++---- .../TARGET_ADUCM4050/bsp/rtc/adi_rtc_def.h | 26 +++++++++-------- .../TARGET_ADUCM4050/bsp/spi/adi_spi_data.c | 9 +++--- .../TARGET_ADUCM4050/bsp/tmr/adi_tmr_data.c | 23 ++++++++------- 8 files changed, 41 insertions(+), 64 deletions(-) delete mode 100755 targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/.mbedignore diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/.mbedignore b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/.mbedignore deleted file mode 100755 index 94a9f73e3f..0000000000 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/.mbedignore +++ /dev/null @@ -1,28 +0,0 @@ -bsp/adc/adi_adc_data.c -bsp/adc/adi_adc_data_v1.c -bsp/adc/adi_adc_v1.c -bsp/beep/adi_beep_v1.c -bsp/crc/adi_crc_data.c -bsp/crc/adi_crc_v1.c -bsp/crypto/adi_crypto_v1.c -bsp/dma/adi_dma_pl230_v2.c -bsp/flash/adi_flash_data.c -bsp/flash/adi_flash_v1.c -bsp/gpio/adi_gpio_v1.c -bsp/i2c/adi_i2c_data.c -bsp/i2c/adi_i2c_v1.c -bsp/pwr/adi_pwr_v1.c -bsp/rtc/adi_rtc_data.c -bsp/rtc/adi_rtc_data_v1.c -bsp/rtc/adi_rtc_v1.c -bsp/sport/adi_sport_data_v1.c -bsp/sport/adi_sport_v1.c -bsp/uart/adi_uart_data_v1.c -bsp/uart/adi_uart_v1.c -bsp/spi/adi_spi_data.c -bsp/spi/adi_spi_data_v1.c -bsp/spi/adi_spi_v1.c -bsp/tmr/adi_tmr_data.c -bsp/tmr/adi_tmr_data_v1.c -bsp/tmr/adi_tmr_v1.c -bsp/wdt/adi_wdt_v1.c diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adc/adi_adc_data.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adc/adi_adc_data.c index 9ebc296297..169378ea0f 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adc/adi_adc_data.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/adc/adi_adc_data.c @@ -3,6 +3,7 @@ #include #include +#include #include "adi_adc_def.h" /*! \cond PRIVATE */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/flash/adi_flash_data.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/flash/adi_flash_data.c index 88fe50cf05..d5b6027573 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/flash/adi_flash_data.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/flash/adi_flash_data.c @@ -50,10 +50,10 @@ POSSIBILITY OF SUCH DAMAGE. /*! \cond PRIVATE */ +#include #include "adi_flash_def.h" #include "adi_flash_config.h" - /* Stores the information about the specific device */ static ADI_FEE_DEVICE_INFO fee_device_info [ADI_FEE_NUM_INSTANCES] = { diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/i2c/adi_i2c_data.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/i2c/adi_i2c_data.c index c48264eb24..6d7a63801c 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/i2c/adi_i2c_data.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/i2c/adi_i2c_data.c @@ -49,10 +49,10 @@ POSSIBILITY OF SUCH DAMAGE. /*! \cond PRIVATE */ +#include #include "adi_i2c_def.h" #include "adi_i2c_config.h" - /* Stores the information about the specific device */ static ADI_I2C_DEVICE_INFO i2c_device_info [ADI_I2C_NUM_INSTANCES] = { diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc_data.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc_data.c index 1cd5f0c773..624b8d3030 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc_data.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc_data.c @@ -50,8 +50,10 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define ADI_RTC_DATA_C_ #include +#include #include "adi_rtc_def.h" + static ADI_RTC_DEVICE_INFO aRTCDeviceInfo[ADI_RTC_NUM_INSTANCE] = { { @@ -100,7 +102,7 @@ static ADI_RTC_CONFIG aRTCConfig[ADI_RTC_NUM_INSTANCE] = 0, /* CR7SSS */ 0, /* GPMUX0 */ 0 /* GPMUX1 */ - + }, /* RTC-1 */ { @@ -137,7 +139,7 @@ static ADI_RTC_CONFIG aRTCConfig[ADI_RTC_NUM_INSTANCE] = RTC1_CFG_TRIM_INTERVAL << BITP_RTC_TRM_IVL | RTC1_CFG_TRIM_OPERATION << BITP_RTC_TRM_ADD | RTC1_CFG_TRIM_VALUE << BITP_RTC_TRM_VALUE, - + /* CR2IC */ RTC1_CFG_IC0_ENABLE << BITP_RTC_CR2IC_IC0EN | RTC1_CFG_IC2_ENABLE << BITP_RTC_CR2IC_IC2EN | @@ -152,7 +154,7 @@ static ADI_RTC_CONFIG aRTCConfig[ADI_RTC_NUM_INSTANCE] = RTC1_CFG_IC3_EDGE_POLARITY << BITP_RTC_CR2IC_IC3LH | RTC1_CFG_IC4_EDGE_POLARITY << BITP_RTC_CR2IC_IC4LH | RTC1_CFG_IC_OVER_WRITE_ENABLE << BITP_RTC_CR2IC_ICOWUSEN, - + /* CR3SS */ RTC1_CFG_SS1_ENABLE << BITP_RTC_CR3SS_SS1EN | RTC1_CFG_SS2_ENABLE << BITP_RTC_CR3SS_SS2EN | @@ -172,16 +174,16 @@ static ADI_RTC_CONFIG aRTCConfig[ADI_RTC_NUM_INSTANCE] = /* SSMSK */ RTC1_CFG_SS1_MASK_VALUE, - + /* SS1 */ RTC1_CFG_SS1_AUTO_RELOAD_VALUE, - + 0, /* CR5SSS */ /* TODO: Add the following to the static configuration macros */ 0, /* CR6SSS */ 0, /* CR7SSS */ 0x4688, /* GPMUX0 */ 0x01F5, /* GPMUX1 */ - + } }; diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc_def.h b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc_def.h index 4b5afa44ef..a6fca0e37b 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc_def.h +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/rtc/adi_rtc_def.h @@ -1,7 +1,7 @@ /*! ***************************************************************************** * @file: adi_rtc_def.h - * @brief: RTC def file + * @brief: RTC def file * @version: $Revision: 33205 $ * @date: $Date: 2016-01-11 05:46:07 -0500 (Mon, 11 Jan 2016) $ *----------------------------------------------------------------------------- @@ -46,10 +46,12 @@ *****************************************************************************/ #ifndef ADI_RTC_DEF_H__ -#define ADI_RTC_DEF_H__ +#define ADI_RTC_DEF_H__ + +#include /*! \cond PRIVATE */ -#define ADI_RTC_NUM_INSTANCE 2u +#define ADI_RTC_NUM_INSTANCE 2u @@ -100,23 +102,23 @@ #else /* pause on pending writes to CR to avoid data loss */ #define PEND_BEFORE_WRITE(reg,mask) -#define SYNC_AFTER_WRITE(reg,mask) +#define SYNC_AFTER_WRITE(reg,mask) #endif -/* +/* * The following is used for static configuration */ typedef struct { - uint16_t CR0; /*!< CR0 16 bit control register-0 value */ + uint16_t CR0; /*!< CR0 16 bit control register-0 value */ uint16_t CR1; /*!< CR1 16 bit control register-1 value */ uint16_t CNT0; /*!< CNT0 16 bit count register value */ uint16_t CNT1; /*!< CNT1 16 bit count register value */ - + uint16_t ALM0; /*!< ALM0 16 bit integer part of alarm value */ uint16_t ALM1; /*!< ALM1 16 bit integer part of alarm value */ uint16_t ALM2; /*!< ALM2 16 bit integer part of alarm value */ - uint16_t TRIM; /*!< 16 bit trim register value */ + uint16_t TRIM; /*!< 16 bit trim register value */ uint16_t CR2IC; /*!< CR2IC 16 bit control (which controls the input capture ) register-2 value */ uint16_t CR3SS; /*!< CR3SS 16 bit control ( Controls enabling sensor strobe /IRQ etc )register-3 value */ uint16_t CR4SS; /*!< CR4SS 16 bit control ( controls Auto reload and mask for sensor strobe ) register-4 value */ @@ -134,7 +136,7 @@ typedef struct typedef struct _ADI_RTC_DEVICE_INFO { volatile ADI_RTC_TypeDef *pRTCRegs; /* Base address of the SPORT registers */ - const IRQn_Type eIRQn; /* IRQn */ + const IRQn_Type eIRQn; /* IRQn */ ADI_RTC_HANDLE hDevice; /* RTC handle */ }ADI_RTC_DEVICE_INFO; @@ -146,10 +148,10 @@ typedef struct _ADI_RTC_DEVICE ADI_CALLBACK pfCallback; /* Function pointer for callback function. */ void *pCBParam; /* Parameter to callback function. */ - IRQn_Type eIRQn; /* IRQn */ + IRQn_Type eIRQn; /* IRQn */ uint32_t cbWatch; ADI_RTC_DEVICE_INFO *pDeviceInfo; /* Parameter to callback function. */ - + } ADI_RTC_DEVICE; @@ -158,6 +160,6 @@ static void rtc_init(ADI_RTC_DEVICE *pDevice,ADI_RTC_CONFIG *pConfig); #ifdef ADI_DEBUG static ADI_RTC_RESULT ValidateHandle( ADI_RTC_DEVICE *pInDevice); #endif -/*! \endcond */ +/*! \endcond */ #endif /* ADI_RTC_DEF_H__ */ diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/spi/adi_spi_data.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/spi/adi_spi_data.c index 9d8f001a37..ecbcb00b62 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/spi/adi_spi_data.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/spi/adi_spi_data.c @@ -1,7 +1,7 @@ /* ***************************************************************************** * @file: adi_spi_data.c - * @brief: Data declaration for SPORT Device Driver + * @brief: Data declaration for SPORT Device Driver ***************************************************************************** Copyright (c) 2016 Analog Devices, Inc. @@ -49,6 +49,7 @@ POSSIBILITY OF SUCH DAMAGE. /*! \cond PRIVATE */ +#include #include "adi_spi_def.h" #include "adi_spi_config.h" #include @@ -109,7 +110,7 @@ static const ADI_SPI_CFG_TYPE gSPICfg[ADI_SPI_NUM_INSTANCES] = /**** SPI_DIV buad rate selection register *** */ (((((ADI_CFG_SYSTEM_CLOCK_HZ / (ADI_SPI0_CFG_BIT_RATE)) >>1u)-1u))\ - << BITP_SPI_DIV_VALUE ) + << BITP_SPI_DIV_VALUE ) }, /* Initialize SPI1 Instance configuration. */ { @@ -131,7 +132,7 @@ static const ADI_SPI_CFG_TYPE gSPICfg[ADI_SPI_NUM_INSTANCES] = /**** SPI_DIV buad rate selection register *** */ (((((ADI_CFG_SYSTEM_CLOCK_HZ / (ADI_SPI1_CFG_BIT_RATE)) >>1u)-1u))\ - << BITP_SPI_DIV_VALUE ) + << BITP_SPI_DIV_VALUE ) }, /* Initialize SPI2 Instance configuration. */ { @@ -153,7 +154,7 @@ static const ADI_SPI_CFG_TYPE gSPICfg[ADI_SPI_NUM_INSTANCES] = /**** SPI_DIV buad rate selection register *** */ (((((ADI_CFG_SYSTEM_CLOCK_HZ / (ADI_SPI2_CFG_BIT_RATE)) >>1u)-1u))\ - << BITP_SPI_DIV_VALUE ) + << BITP_SPI_DIV_VALUE ) } }; diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/tmr/adi_tmr_data.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/tmr/adi_tmr_data.c index 7cf4a8295e..31b2dbe8fc 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/tmr/adi_tmr_data.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/bsp/tmr/adi_tmr_data.c @@ -46,18 +46,17 @@ POSSIBILITY OF SUCH DAMAGE. #ifndef ADI_TMR_DATA #define ADI_TMR_DATA - +#include #include #include #include - /* CTL register static configuration */ -static uint16_t aTimerCtlConfig[] = +static uint16_t aTimerCtlConfig[] = { (TMR0_CFG_COUNT_UP << BITP_TMR_RGB_CTL_UP) | (TMR0_CFG_MODE << BITP_TMR_RGB_CTL_MODE) | - (TMR0_CFG_PRESCALE_FACTOR << BITP_TMR_RGB_CTL_PRE) | + (TMR0_CFG_PRESCALE_FACTOR << BITP_TMR_RGB_CTL_PRE) | (TMR0_CFG_CLOCK_SOURCE << BITP_TMR_RGB_CTL_CLK) | (TMR0_CFG_ENABLE_RELOADING << BITP_TMR_RGB_CTL_RLD) | (TMR0_CFG_ENABLE_SYNC_BYPASS << BITP_TMR_RGB_CTL_SYNCBYP) | @@ -66,7 +65,7 @@ static uint16_t aTimerCtlConfig[] = (TMR1_CFG_COUNT_UP << BITP_TMR_RGB_CTL_UP) | (TMR1_CFG_MODE << BITP_TMR_RGB_CTL_MODE) | - (TMR1_CFG_PRESCALE_FACTOR << BITP_TMR_RGB_CTL_PRE) | + (TMR1_CFG_PRESCALE_FACTOR << BITP_TMR_RGB_CTL_PRE) | (TMR1_CFG_CLOCK_SOURCE << BITP_TMR_RGB_CTL_CLK) | (TMR1_CFG_ENABLE_RELOADING << BITP_TMR_RGB_CTL_RLD) | (TMR1_CFG_ENABLE_SYNC_BYPASS << BITP_TMR_RGB_CTL_SYNCBYP) | @@ -75,7 +74,7 @@ static uint16_t aTimerCtlConfig[] = (TMR2_CFG_COUNT_UP << BITP_TMR_RGB_CTL_UP) | (TMR2_CFG_MODE << BITP_TMR_RGB_CTL_MODE) | - (TMR2_CFG_PRESCALE_FACTOR << BITP_TMR_RGB_CTL_PRE) | + (TMR2_CFG_PRESCALE_FACTOR << BITP_TMR_RGB_CTL_PRE) | (TMR2_CFG_CLOCK_SOURCE << BITP_TMR_RGB_CTL_CLK) | (TMR2_CFG_ENABLE_RELOADING << BITP_TMR_RGB_CTL_RLD) | (TMR2_CFG_ENABLE_SYNC_BYPASS << BITP_TMR_RGB_CTL_SYNCBYP) | @@ -84,16 +83,16 @@ static uint16_t aTimerCtlConfig[] = (TMR3_CFG_COUNT_UP << BITP_TMR_RGB_CTL_UP) | (TMR3_CFG_MODE << BITP_TMR_RGB_CTL_MODE) | - (TMR3_CFG_PRESCALE_FACTOR << BITP_TMR_RGB_CTL_PRE) | + (TMR3_CFG_PRESCALE_FACTOR << BITP_TMR_RGB_CTL_PRE) | (TMR3_CFG_CLOCK_SOURCE << BITP_TMR_RGB_CTL_CLK) | (TMR3_CFG_ENABLE_RELOADING << BITP_TMR_RGB_CTL_RLD) | (TMR3_CFG_ENABLE_SYNC_BYPASS << BITP_TMR_RGB_CTL_SYNCBYP) | (TMR3_CFG_ENABLE_PRESCALE_RESET << BITP_TMR_RGB_CTL_RSTEN) | - (TMR3_CFG_ENABLE_EVENT_CAPTURE << BITP_TMR_RGB_CTL_EVTEN), + (TMR3_CFG_ENABLE_EVENT_CAPTURE << BITP_TMR_RGB_CTL_EVTEN), }; /* LOAD register static configuration */ -static uint16_t aTimerLoadConfig[] = +static uint16_t aTimerLoadConfig[] = { TMR0_CFG_LOAD_VALUE, TMR1_CFG_LOAD_VALUE, @@ -102,7 +101,7 @@ static uint16_t aTimerLoadConfig[] = }; /* Asynchronous LOAD static configuraton */ -static uint16_t aTimerALoadConfig[] = +static uint16_t aTimerALoadConfig[] = { TMR0_CFG_ASYNC_LOAD_VALUE, TMR1_CFG_ASYNC_LOAD_VALUE, @@ -135,10 +134,10 @@ static uint16_t aTimerPwmCtlConfig[] = (TMR3_CFG_PWM0_MATCH_VALUE << BITP_TMR_RGB_PWM0CTL_MATCH), (TMR3_CFG_PWM1_IDLE_STATE << BITP_TMR_RGB_PWM1CTL_IDLESTATE) | - (TMR3_CFG_PWM1_MATCH_VALUE << BITP_TMR_RGB_PWM1CTL_MATCH), + (TMR3_CFG_PWM1_MATCH_VALUE << BITP_TMR_RGB_PWM1CTL_MATCH), (TMR3_CFG_PWM2_IDLE_STATE << BITP_TMR_RGB_PWM2CTL_IDLESTATE) | - (TMR3_CFG_PWM2_MATCH_VALUE << BITP_TMR_RGB_PWM2CTL_MATCH), + (TMR3_CFG_PWM2_MATCH_VALUE << BITP_TMR_RGB_PWM2CTL_MATCH), }; /* PWM MATCH static configuration */ From de51bcaac8ba703ec6de747f08dfa6042eb16633 Mon Sep 17 00:00:00 2001 From: johnny Date: Sun, 1 Oct 2017 17:29:01 -0400 Subject: [PATCH 43/80] Add support for RedBear's BLE Nano 2 Cribbed from https://github.com/redbear/mbed-os/commit/4bf42f2e205e81ffb50a013b16c0366607bf8146 I'm not sure if if there are any copyright issues here with what is effectively a set of config files. A few folks have been bugging me (and the redbear folks) for these changes, so I wanted them somewhere centralized. --- .../TARGET_RBLAB_BLENANO2/PinNames.h | 194 ++++++++++++++++++ .../TARGET_RBLAB_BLENANO2/device.h | 23 +++ targets/targets.json | 9 + 3 files changed, 226 insertions(+) create mode 100644 targets/TARGET_NORDIC/TARGET_NRF5/TARGET_MCU_NRF52832/TARGET_RBLAB_BLENANO2/PinNames.h create mode 100644 targets/TARGET_NORDIC/TARGET_NRF5/TARGET_MCU_NRF52832/TARGET_RBLAB_BLENANO2/device.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5/TARGET_MCU_NRF52832/TARGET_RBLAB_BLENANO2/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5/TARGET_MCU_NRF52832/TARGET_RBLAB_BLENANO2/PinNames.h new file mode 100644 index 0000000000..0798e678c1 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5/TARGET_MCU_NRF52832/TARGET_RBLAB_BLENANO2/PinNames.h @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2016 Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic Semiconductor ASA + * integrated circuit in a product or a software update for such product, must reproduce + * the above copyright notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific prior + * written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary or object form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef MBED_PINNAMES_H +#define MBED_PINNAMES_H + +#include "cmsis.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + PIN_INPUT, + PIN_OUTPUT +} PinDirection; + +#define PORT_SHIFT 3 + +typedef enum { + p0 = 0, + p1 = 1, + p2 = 2, + p3 = 3, + p4 = 4, + p5 = 5, + p6 = 6, + p7 = 7, + p8 = 8, + p9 = 9, + p10 = 10, + p11 = 11, + p12 = 12, + p13 = 13, + p14 = 14, + p15 = 15, + p16 = 16, + p17 = 17, + p18 = 18, + p19 = 19, + p20 = 20, + p21 = 21, + p22 = 22, + p23 = 23, + p24 = 24, + p25 = 25, + p26 = 26, + p27 = 27, + p28 = 28, + p29 = 29, + p30 = 30, + p31 = 31, + + P0_0 = p0, + P0_1 = p1, + P0_2 = p2, + P0_3 = p3, + P0_4 = p4, + P0_5 = p5, + P0_6 = p6, + P0_7 = p7, + + P0_8 = p8, + P0_9 = p9, + P0_10 = p10, + P0_11 = p11, + P0_12 = p12, + P0_13 = p13, + P0_14 = p14, + P0_15 = p15, + + P0_16 = p16, + P0_17 = p17, + P0_18 = p18, + P0_19 = p19, + P0_20 = p20, + P0_21 = p21, + P0_22 = p22, + P0_23 = p23, + + P0_24 = p24, + P0_25 = p25, + P0_26 = p26, + P0_27 = p27, + P0_28 = p28, + P0_29 = p29, + P0_30 = p30, + + LED1 = p11, + LED2 = p11, + LED3 = p11, + LED4 = p11, + + RX_PIN_NUMBER = p30, + TX_PIN_NUMBER = p29, + CTS_PIN_NUMBER = p28, + RTS_PIN_NUMBER = p2, + + // mBed interface Pins + USBTX = TX_PIN_NUMBER, + USBRX = RX_PIN_NUMBER, + + SPI_PSELMOSI0 = p6, + SPI_PSELMISO0 = p7, + SPI_PSELSS0 = p3, + SPI_PSELSCK0 = p8, + + SPI_PSELMOSI1 = p29, + SPI_PSELMISO1 = p30, + SPI_PSELSS1 = p28, + SPI_PSELSCK1 = p2, + + SPIS_PSELMOSI = p29, + SPIS_PSELMISO = p30, + SPIS_PSELSS = p28, + SPIS_PSELSCK = p2, + + I2C_SDA0 = p28, + I2C_SCL0 = p2, + + D0 = p30, + D1 = p29, + D2 = p28, + D3 = p2, + + D4 = p3, + D5 = p6, + D6 = p7, + D7 = p8, + D8 = p21, + + D9 = p4, + D10 = p5, + + D13 = p11, + + A0 = p28, + A1 = p29, + A2 = p30, + A3 = p2, + A4 = p4, + A5 = p5, + + // Not connected + NC = (int)0xFFFFFFFF +} PinName; + +typedef enum { + PullNone = 0, + PullDown = 1, + PullUp = 3, + PullDefault = PullUp +} PinMode; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5/TARGET_MCU_NRF52832/TARGET_RBLAB_BLENANO2/device.h b/targets/TARGET_NORDIC/TARGET_NRF5/TARGET_MCU_NRF52832/TARGET_RBLAB_BLENANO2/device.h new file mode 100644 index 0000000000..493844b801 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5/TARGET_MCU_NRF52832/TARGET_RBLAB_BLENANO2/device.h @@ -0,0 +1,23 @@ +// The 'features' section in 'target.json' is now used to create the device's hardware preprocessor switches. +// Check the 'features' section of the target description in 'targets.json' for more details. +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef MBED_DEVICE_H +#define MBED_DEVICE_H + +#include "objects.h" + +#endif diff --git a/targets/targets.json b/targets/targets.json index 9284911b83..0a8549f009 100755 --- a/targets/targets.json +++ b/targets/targets.json @@ -2083,6 +2083,15 @@ "extra_labels_add": ["RBLAB_BLENANO"], "macros_add": ["TARGET_RBLAB_BLENANO"] }, + "RBLAB_BLENANO2": { + "supported_form_factors": ["ARDUINO"], + "inherits": ["MCU_NRF52"], + "macros_add": ["BOARD_PCA10040", "NRF52_PAN_12", "NRF52_PAN_15", "NRF52_PAN_58", "NRF52_PAN_55", "NRF52_PAN_54", "NRF52_PAN_31", "NRF52_PAN_30", "NRF52_PAN_51", "NRF52_PAN_36", "NRF52_PAN_53", "S132", "CONFIG_GPIO_AS_PINRESET", "BLE_STACK_SUPPORT_REQD", "SWI_DISABLE0", "NRF52_PAN_20", "NRF52_PAN_64", "NRF52_PAN_62", "NRF52_PAN_63"], + "device_has": ["ANALOGIN", "I2C", "I2C_ASYNCH", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPI_ASYNCH", "SPISLAVE"], + "release_versions": ["2", "5"], + "overrides": {"uart_hwfc": 0}, + "device_name": "nRF52832_xxAA" + }, "NRF51822_Y5_MBUG": { "inherits": ["MCU_NRF51_16K"] }, From 44fc3313d1f41c73bb14ad697fcc82846f42139c Mon Sep 17 00:00:00 2001 From: Tony Wu Date: Thu, 26 Oct 2017 06:33:30 +0800 Subject: [PATCH 44/80] rtl8195am - fix us_ticker interrupt handling TIMER2_7_IRQ is shared among several timer sources, including us_ticker. Raising TIMER2_7_IRQ pending bit will trigger the timer interrupt, but the timer interrupt handler will not know which timer source this interrupt is for. This patch sets timer load value to one tick and force us_ticker to fire almost "immediately". TIMER2_7_IRQ is handled through a common interrupt handler, and is automatically cleared. Therefore, there is no need to clear IRQ. The underlying timer HAL treats load value as micro-seconds and does conversion internally. Therefore, simply pass micro-seconds to timer HAL without converting to tick first. Signed-off-by: Tony Wu --- .../TARGET_Realtek/TARGET_AMEBA/us_ticker.c | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/targets/TARGET_Realtek/TARGET_AMEBA/us_ticker.c b/targets/TARGET_Realtek/TARGET_AMEBA/us_ticker.c index 3c0b22faf9..f51f2f4e1c 100644 --- a/targets/TARGET_Realtek/TARGET_AMEBA/us_ticker.c +++ b/targets/TARGET_Realtek/TARGET_AMEBA/us_ticker.c @@ -19,7 +19,6 @@ #include "us_ticker_api.h" #include "PeripheralNames.h" -#define TICK_READ_FROM_CPU 0 // 1: read tick from CPU, 0: read tick from G-Timer #define SYS_TIM_ID 1 // the G-Timer ID for System #define APP_TIM_ID 2 // the G-Timer ID for Application @@ -33,8 +32,6 @@ * * Define the following macros to convert between TICK and US. */ -#define MS_TO_TICK(x) (uint64_t)(((x)*327) / 10) -#define US_TO_TICK(x) (uint64_t)(((x)*32) / 1000) #define TICK_TO_US(x) (uint64_t)(((x)/2) * 61 + ((x)%2) * TIMER_TICK_US) static int us_ticker_inited = 0; @@ -73,8 +70,6 @@ void us_ticker_init(void) TimerAdapter.TimerMode = USER_DEFINED; HalTimerOp.HalTimerInit((void *) &TimerAdapter); - - DBG_TIMER_INFO("%s: Timer_Id=%d\n", __FUNCTION__, APP_TIM_ID); } uint32_t us_ticker_read(void) @@ -95,27 +90,26 @@ uint32_t us_ticker_read(void) void us_ticker_set_interrupt(timestamp_t timestamp) { uint32_t time_cur; - uint32_t time_cnt; - HalTimerOp.HalTimerDis((u32)TimerAdapter.TimerId); time_cur = us_ticker_read(); if (timestamp > time_cur + TIMER_TICK_US) { - time_cnt = timestamp - time_cur; + TimerAdapter.TimerLoadValueUs = timestamp - time_cur; } else { - HalTimerOpExt.HalTimerReLoad((u32)TimerAdapter.TimerId, 0xffffffff); - HalTimerOp.HalTimerEn((u32)TimerAdapter.TimerId); - us_ticker_fire_interrupt(); - return; + TimerAdapter.TimerLoadValueUs = TIMER_TICK_US; } - TimerAdapter.TimerLoadValueUs = MAX(MS_TO_TICK(time_cnt/1000) + US_TO_TICK(time_cnt%1000), 1); + HalTimerOp.HalTimerDis((u32)TimerAdapter.TimerId); HalTimerOpExt.HalTimerReLoad((u32)TimerAdapter.TimerId, TimerAdapter.TimerLoadValueUs); HalTimerOp.HalTimerEn((u32)TimerAdapter.TimerId); } void us_ticker_fire_interrupt(void) { - NVIC_SetPendingIRQ(TIMER2_7_IRQ); + TimerAdapter.TimerLoadValueUs = TIMER_TICK_US; + + HalTimerOp.HalTimerDis((u32)TimerAdapter.TimerId); + HalTimerOpExt.HalTimerReLoad((u32)TimerAdapter.TimerId, TimerAdapter.TimerLoadValueUs); + HalTimerOp.HalTimerEn((u32)TimerAdapter.TimerId); } void us_ticker_disable_interrupt(void) @@ -125,5 +119,4 @@ void us_ticker_disable_interrupt(void) void us_ticker_clear_interrupt(void) { - HalTimerOp.HalTimerIrqClear((u32)TimerAdapter.TimerId); } From d56959acf5c03aafbffc96ab01ac612560943e2c Mon Sep 17 00:00:00 2001 From: Yuguo Zou Date: Tue, 7 Nov 2017 17:02:42 +0800 Subject: [PATCH 45/80] Update HAL code to resolve ticker lockup issue --- .../lib_peripheral_mbed_gcc.a | Bin 648326 -> 665930 bytes .../TOOLCHAIN_GCC_ARM/lib_wlan_mbed_gcc.a | Bin 6151596 -> 6553208 bytes .../TARGET_RTL8195A/device/rtl8195a_timer.h | 5 +++++ .../sdk/soc/realtek/8195a/fwlib/hal_timer.h | 7 ++++--- .../TARGET_Realtek/TARGET_AMEBA/us_ticker.c | 7 +++---- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/targets/TARGET_Realtek/TARGET_AMEBA/TARGET_RTL8195A/device/TOOLCHAIN_GCC_ARM/lib_peripheral_mbed_gcc.a b/targets/TARGET_Realtek/TARGET_AMEBA/TARGET_RTL8195A/device/TOOLCHAIN_GCC_ARM/lib_peripheral_mbed_gcc.a index 352cdf86f647bcbbea5d640e052051ad396c09d1..5760bf2a0735be10b96020f5e6058366fddfa6e0 100644 GIT binary patch delta 247509 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 GZ~uQoN^+(E delta 228586 zcmce<2Ygk<);2zK%04Y8Cy;~_NPrMRKxqL&M97IgrXq{kN_fb5WV*6 zRikc8ELgD@Y*)QrRO}6}s9?Eb#V%eO_W$$DUgsp-^8MfU{l4FOe!sJyS!-t2tXZ>W zc3=D1zYRL=nStl^^5>5nF|J_zxUuKwl*h&>b@c!JU+XdIfAo*B;@QXjul`*lRG zES^Zkp{|5yI8f8UUG>}F;DC*7>9uK%qsD(m0< zcZ2`${=XcptS*1wi0_rJ{E^OotSiCv)|>zR|GhQJ$Nx_Y{-6B)w+vJK$Kr|q5`Ooo z^8dg6rx}5P=PcFbzwLnc)Qt9@`t)w!*k^7zl0K*mr>& z%lOC<`6I^V+j}3hqMm{gBgeJ>o-@$(LH4#m{o7oz6#=C@ia(E@?^8-&2I_TfIEjr* zTQ7icPr%02dn~uwf2kMX@;(P}-(ev=xRMzz-wHQ4-(cgKyoel+w>RXu4{;$~*lIYw zk4X5v(_+YR`F-bu>+yJ(H?^X;Z#;{?<;Ny%2r}H)qp-VI36tluwZ3zitU;UZ?Bz@r zKxa?oc}RLa4`6F~yq>p!zJ1vEcVVLfUJr@jEQrzU~(iQrUT7_PLXiw;V@V%k8 zz_CK}QQj9i8fky%BcubNHy}S4LM0Un9fR_*q|mp>2!}M3NDi$*(MV`Nwke^hDB3NQ ziiW#~HlfMX&{^Q5g*Ksq^iV&P=@H69t!U_Y2+9bJhn$|Fy%60iG!Y}28F~!0vO?wH z^bRS==@Y7hgubCVbWaZq`(I;`wD32`^uL~u^o5aAQQ5!yV{p=R zB+86EBw`slQVt>hH>RLimX7Raxi@KxK{|3Wc>cFY9HLbUyG~(dl=`X^t}Cn+r)jCm zIE^EmaTN9TG2nPTTTnM?K6LX0QeOrqTnv*0(yoF1L3E>K(%FtHwFZR(J($+o=T2RS zL?CKNkK3L4AY=wIoLrYXwFjm2bV%(^bwP5VmqRMIa+i?Ktiv`b3l%2?dJh1EZ%2m% zeW`|u8AArLX-H4_HtNxj4wV)@l?~_6@CD(&veo|V-#F#IfJ81AxL_-4>A<*Ba6;RV z#wvh~R%w5NUixIDRX!OVXQMn^iO1_v0@Sa(VJN_o#b`+_w0_1t4+NQNxgKX%Rfl<%yL+tc46f? ztQegtUW~e;CUy&PR^}A2vODRXl}?e74og?4tYg9HrH}L`Z8=S|nipN?FXKZ<)>Ta2 ziofod3N_RBFj-Aqzs5g$XNcAMIB4>ZIUrsdp^ljq_!H~4dm`D%085~6&bjR%pA-8uCqB4$RIqpKF+-r$)4;)nPAxe3K z<>(B$<2R=q`mY~5s9+8ieVPT6Ou?ZrdY@a_$}@CbUD>yEvC_}dlKM!MT>vv%ZCtFg zE8rBt9?a->7r3Df)-2S`xebi$DM%%a=jzaZ2^%QqM1-r@E4Nq^Cq-~HP?`!sOkfdA z*8_WM(0;EXJCLph_JnMYb|;5I6G9V1%nS`u?&PeneQK`N@32&6dE;4;FtSLLrjA3C zDO#7NvP!ppkT)DHbob~^L8*4PHh-E|E^9BEInediq1zf~KIV<>fIhA~rM?pUS&+w@?&PYJ#t_=?~j!FL2d6#Pu^YrzA8zYAJeU)iBB zF@{8%Ffs*m1kDK%^7DlrD|onIiC~#vwcs&=O9WR6o+Nmt;6=a~HQ6Ez?)OPQB)DDh zdBNR+9}4al{8f-=0j!@c*iUe%;CR7lg4J%-erZ)WcBRla3Em^PUGRCq-GUzo?ic(; zFo2bl?GF_kCCD=$@+S+H2p-{JOdTnVxq>_|V}*Lb<$}$EYXoh}lZwr1R_?@7(&@O#2%mlEf zV4mOz!NUZL1bN=Z@|8pgs}*`VF-NH;p*IMgCVU`>|$>O8Xvri3{#DWb}rbrx8I96nd!8 zlY}lJLh({!vQqPeUQC3%g9T8}R*E-GzW-imz{#uGCNKaVy?%GV;f8bZ7N zaINaE={OmkgY$sIwJJZli)&R}(A<-QNXM^L&5wXn19swC)ef9(xN}&Z*Q($<9^YJ8 z9~Y~R$6(=F)n*IrC$3dpk5%9O9CGAZ)hQI{T&p@62SakLssm~}*Q&gkIEc`m<-9y) z9m3vNh1lZy#Hq;etatz%pSg(T_xL>D!FO=N=P`L>7|G4d3;8@f zxbyM&%F$#JOBR3*^OT}5F4b9&q02rG`QDjG;`$fQ_pC$UC95oj1OL_5D@eCmXF_J1 zbpTSy)e7S;(46cYK2hC z%0sTtdJz5dTgRY*fVC8(6|~-?(v}T5N!BQo3|oIeI@#j2n~3!UB&1lSkk-wLRl>C0 ztn=38U0Guw?onl}#Jqe=SvxSuPb-Tjd(SBAG>G4+tT$q4;ALgewRbD) zUNo^sS+}F&o5~uEytkBf0M>Y0S-s&m?_I*6N?!O;5gV;~SDAD1$g5D&yE;aH@JIF`J8}JMK5Bd09tX>PJxuFu z<5d8khYascFqF1hYrwJYMOTz{KDOH81t^y_9%;9A8C=w3ZA2%$Rvxxr!uft=g-wq0 z@oY3X6N~Yb1tbx z79hjdK(>yILeoCyl3GN;L_X(|TI2yXu&h7IWOUmBm3+&&Z_jddi}^4tKDnmW?LHE6 zO|2U*ZulBG6>v>0iF&fWar%HtVpk}`(3>2(C{E*&+NH?%HD82Urs#rrmR8-_|5VCd z<-z=SCZ5m3V}-ye*aRsW_Fji{+S%x+%U`Vbg0Oa@7s`4SzH+k5!qK|g?6L9yr~0j7 zfHP98F@W>3t-}FVZ&%hd;Py@0ssL_6ow1Pe`|oa*{w93ZU#TD9`FT1ItNh1+KzozW zp7z)340PV|!cxi_j#jl5hOfI+`sv{K7dvG=m~q;_R2Q@C<8T^f{cN1!d^Cfyw?LM^ z(J9NdUHhAL3(MYQ%09@IB4+i1Dk!`bQ`X;V3itRL!;tM?rx(H5qFD=XtC$~i@7Z&t=ttbMA`o~(>|tRenC2<^_w;5AnNX+pcQGM>Yf z^q=m~E|nGCKvmAr*Py*VDt!%{HReA{Z-7nGr@?amOHKdNpTG$Fw>Y-gf$pdIuh)+u zKYAl=af9Z;k%~UX9^a_fgYZN*F=wkG{L$wzYy3BvW|E?B!kGS>jSk7tRw{6dAtD*r z1*832O*xm2q-5}xi2pXBlT$LzWec|p9ZtzWdF8)D=%kd4^C<03p+hMdTS?y~bTB33 zIhyBgp#v!ySHhqC+l2O~WK?R}{~lrZQZm+Jkp1@xZKY(q2MhV{6WW`SkxRqeFSI8m z;}iD!0ioR~8Oz!6KRdKrrNFAJ@Sx_=W7_rfP5;B1$4S;TbUteXuaCQ|(J+z6n!~}i zuE!9jsN@}JIU|tDyE&15P&;5Q2dcdW=89Q;a~AQz$920+j+8 zOs7O@F}8u8W@;(-4su6;AJk%n&XFA&V2L}Fu&Ag2E1B2M2iaZ8|1Ba09LD_}C zPw;_=z{5LRx6{bYKrWGbKT^!j2#|TVfdPXFZbq`~@ zEHV^U3mi_hDlU(W^CHVI`2$l~{@BPJe)K<3#QC={auc!x#Z1>l zrch7`(~Ek322}#nn8qBf@A)20Gut?zjqg_u2w)}H#F3t)nPvorCi z`p9dndjtzFR_;bB6)XD?MSPz7P%pU=vIYg_w_qS5_cM3FS176?cd?CHtk$rbk0x2j zv_JAH$Fq*l<+V)+HsQn5{?zx@q~xKSS$W=wq^=LTtbl;6!P9zJU-^M%9w2bkWY;3PU! zl?}e7p@FjYVj^ng%|)+u=;-mxm;#ovlA!=H4uQ3GXi*h29-x7&^PLQiqz)}Vp2vUI zr!c9qMq!9i#X|_K3~q2Kbg0n+zlStc57*SILK9k3A@K64{}fnAVXmP$qOU)2@gQ3WRQF+8rrJrO=&Bdm_9?61t0NZ=?~f61tmdD{>|4 zZe!XPc^h6Fx;Mssp+9mL8+(B1VB`fBdXR;ZA`8*C&_hgzBfQ2DdYI|t$dxcj=r2r1 zB16%s&|f*gDG|t2p-1;&n-+Nj{v3LY{EWy;Oh3+aR^$ZA-@$Ztq$UQtgq|RgtK1*M zF+)$%g6^d(^yH5;j)#ooOOclmdZq@$7vYVO(6e+86-kE~L(ehoi5#Fgo@d%0Sx){7 zbh)I+d#Dt8k^GbhFVclxqSK`*_jSpb|Dm0=$oF}EM`Ow7!o~cdSI%NHb1>kcU0fAZ zgjW|ruToDBY)#X>c9E&ofNgRV4m2pVCp&_YGim!bC_qK(X{I-s_C)T)HuM(L{)o-7 zdYkE3Qsi|O`a6k~$fwMBhv~G)?d0!eIwSHR&G9bNS&_Bu*?UZ9M{cC;-)9=;8^-Q` zFc?bsJePx&T!~sqp?!;})nYR?eZo=l#3COs<5On%mHRUk4Slx4h!}xw z@)+14E%e0!iWtIff5kypky~lT{Y>kK8N;ucc13=mw0|(|j^t3$Z<+Q)x>L9BnD#mj z^ZhkQTanoD^sob_d9(Wp{m68Z*?on6Vmbw9#Z>rbH@f5VtfpEo&=R5FY;YpH&Jy~a zqE)n{wkUatHz6ou+Qaa_o_7>@g%7psfd(oP3r3 z6I~@w|IA+HuvdBdSqSxc$cec;o=?z_%kOy=if8gJKxnAu^6&lyrLxR2ILr*9%De!% zdXdZQ9C+;^>jta}y54myB=vrgnM+)B8P(@)44Hm|$pZX!2d@_OUspQ zfb=>zgHCs`k&8&50|VZJ47s^qDGd#T;)=$KNC`0I{W5`EgO*{2K*|8qL^g{BdC$k5+( z>PzEW^GTadeWlr{TS-3yTk8GB-QFi{I{CHnxC|IDHw%*QF*+ToCsCO-VCI7Pl%pta zi}E+93Y*vfjY4?-f`iSUGh9ER>{4@_@LqIyF_(Xt8ahRo?{z82k)j$JZSPXbm%F?WXr{v$yEA+6QUH$b`vReJCoc7@2b&riRMA zszKKA@p9;Fp73IE9yA^%y!JQ`<;Do_hE8$35JGW(7S;?kbegbUFsv9p zt%l7Jo>8|T?$kp*!ocb2W(`0AGwpN-FEZws$vMMJ&YwBrW=_hqHbdx4+8F<=)18SDSgo@5&Y2jKmvE z+=m43zZE=&1TUB6UX2=kAcw7-2>NEw6AWF2Sw=THA+Av_Z|RpK59<$}=vj@DDt8ii z^QHb8&{IIK=tARZ2z8Rst+38npc6eZtKN+!_ejT#Msk*sJO$e)O&&BE1WghpVy^XQ zsSNqAiR5*l7lQu8p}p?GAXF~R{$pp6q35A-&h#*bjY_mZp>K^sP7{gel#+O>fP-t! z)q-jaT`JRf*DJ2K;Qvam2gli!?&>lXUhgs$c6XTydt@r~p;vEkroyg-gp;~Vg;utmovCn?htto{ zW-1)*;S{WAzL^TgcsLDtuhp3f$9gywwv&#TxiH_ux$q7cBgUa8L(m?U3Z>8RT#EZ( zBTK>i4Vk0j83nV!>1)CH>X0aAVg(ZOkQh4-72#+QMYEDBpr}834uk$9&jzm<#YRa+ zOcmH*oktPZBEh4_f;*6SpNWU!iKmeG0i4{Kko606;*irvj|H6s!QukBi$G^}q3Je5 zI_c4kpk*4s@!@C<&9xE&bZya~Pbgx{rr`AfTwV*eGKE0D3##zr= zrUoA|L(|X0j=IC#??SGkx;PlatZ){!D`I9Sd*CR?8Op27P#W3{<<({==P}<5>NOs&s=R^R->j_HdbqNVBHbSct9q+xnzvMkaw`7XPpR=p&|K_70sX&J7@X4+ zKr<6*HT(v;;Y$hSTQHGy$By1{<#!t0*FtvAY4A7wvUvjiTDEO=MX#8?FyC3BcbUGt zMB4P_RrH1XA9TQ3lJ^)l>_^%t|CVW*kCvIkr*9lRz3z*koXQ=EjR(p=U3YM&PvvrF z8+907_d}-425j>U>qsm#DCu?oVlvLdwg?%{`p1WTob~fqDZJJx++Z^9L2h$gFrP(K zxzA#A#=&K|yH&Y=$L8{Q*%0<&DtA9N_Z(byIy3S-y#8#II+e52^P z;-Ix}+~DK9+y(B2Jsg9N_wEDj!GJpkpXlW}zzc`IIc4_V`%#Rem|-{HE0Sn9{W=kNxU z(B?X)Bku4FuDZAJ8mPmVybJb?yu<6%Je6=RhEF*h{fxZJ^*m^vt@Hsvz%LjH1(Z@V&YybR&Hz_p(29-QK z%*)4U`?cS0_p~=I@)VX#?im-_O?S7Zn1^x)IZxkSG!;h#hYZsrQk^V&s(GOJP_G(c zqzo>Q#E|xrFG;g2+x))ZP^apMRDJQ??@vkid|_4 z4+M9|+$k^;!5Qs{!9&7WQS!_K%wxe)=DA_){rS}Jh*a~`@c2Yg%ADYo8iC}*GdJ6L z1Fh5{==9{ClhBvLIxXZd4(~L}WTWF`yW32imNsRW7Q2K7q9z3wZrgBacErb*qFm}( zyWgdOG4_<7eVO;~oUJRh-Ta}p?DKLxIrjdr*JH1ktE25(Z@$^~6k3DZ&%7l?`?pY|t6J2hP{7z4sT(`J>SiNc~E-x%< zZd#(sDr-yT)s$3Jm(Hr-Bgv|zx~>tKrK?s>Yip`kmCdVK3u{5msB2o>*s!X-<=ymH zZB=nq$@JQqqbf^Oal@MG*43)2p|QDcFG@uWMb_unJnusB1)S zRYTokzH0z#`r;LJvsz5M(<@77(HOPUW>-kNuz;hKz3>E2nqBdk?rXnyzCYDo4F1dZKrZ(ZjJE4A)$LyyY%ezSGQKLw^y$B^vo++wW{WXmIhV1c2(ixx|Y@kGeot;Q>WKfmz32O zmsS@}Ei19FUhm0_wMd_*t!ik1H_T{StY*NN)va}{ZL8I+79)rpKFdC9c8yBddUkb5 zRc+DKS_P*nt*Nb^T~t(3U9D)^!p6oT*v9au6_%FGt}0QL@iC%Tn7YL!)6@dAS-7~K z7Fb@_IIXd6sdyI*%&wNKTdd4D!RD%b_44%%CCisCYgKKq-KdeZt*VkkH>0qkxU2+@ zj+rpEZHby)SXGm69=e}$fq!88qNjWGuZ9;l8Hr8hbxm!Js$v>^igO_0@9pnClxp|e z;OUuFTYG%Ns-}j*X;?LvEwnf}vnuVE zyL&V2H@?(a*@>>ts3=w~6%FfJ%Nm!9Q?lpwxhHv|_8}Mga}Mp)20|%bRacgdG>RGr zFD{un+Zjds>ytcv%bkfby`fdc4z*we+Msk~kyDShrePFKU0j3_h8wOiqdawX^--#H zwegnnx)yuuS9)AB%1mo(Y{W$8aM=64(*46&NJjWDmMj4=J;-ax#=zH5^wZLt~1qFLpYg;f~I5-h3* zRdvSEn7+87-YgXL%dk5zQ($pDhPVZzS%N|9;wPqSEo=%ZqcwZW*E)49(o@@3aRpOl zjgDC=nv0gzH7#vWSROe4xBw(3lB_-U%ea)^n|-I9%`OVn(M1ewZRIQs=5%}LKXh)5 zL(Ft`Nkv#LDzFY#%q};xpVQ2&dq$^{raJmrOVvEiBFD}Sud-UzR@EF4_i6jl&7NqV zRjq4lS1iHe$uZ>|acW>uF*AFg?H?5EtYjx&;?IngHaXTp4SGRMvEuwJYryW43(l;j z29Z+LP~Wh8O@mp_oXK2OJ*T*HKW(OUe1Bwi0C7)&3_6M#0fjl#QjfiAb=|6UnD_Qg zm-v%&us%4$PV>=qN~)@6RmDAXR#W2%cI9c_H2b$p{6o^K<`or9dNLuRb6^? zNo|e2;ZlEoOx8PRXW9ZGC}?(K?9cR;<;}G`wy4F36jjcytgd7WwZ(-sg|#IW#ifN6 zwNp!{cMfb~2hPS0^0vg-V-c;btSX(O8k?JzX4_-8T48(19e7RknQwLXTq9j}bR`ws zl8zQ~_d$zjD3-gucmV`gIgp+GiQiT$M08}7W#+^lsLftoTd0=34oIjrlgOj%oAQr`Zh zm0`)@$lmYtpjg5XHC2Tb)zh#Oo;rJ)Dy(m%Dn-q080h%)swg%~eI<-tgO!1c7xtBo zF-j}2)5bVp|DDhXM_6-9i)&_p7vEcVZ3Igxyl24gR-}ExL*ZBpCx}$;oKogE2<}(C zthp7QoseBlr!mK(HO86D=wXSXKhTe>>fo-9LCsXEu5yk-Nt84#US8LvN^8n%tJa}a zEMBVCzUOEJ|i)(4c^tg2s3w6;lb6lr*jJ6zCSqHQ(SK^0vmQI|Ezogk0WPkcho(3JC~9ng zf#VI(H%bf3Fkr=Y?|TCM?YUR_!+8mx;9?s;f~!?rvRZk#>Fi$Z?b@G~5_g~YWVKH| zpa+I!7Mhj1*1q$A9%*NP>F#bXJ=>FFXL|gB6te^AQrRB%qwd=tc_!MudQK7Eu{66f zMe|@9zi^d*^pViHc+pav4LRM7dzi6a?X(gceqiS%`%x~PI9%t!EmwFP5+3Q88EcVQ zDsVQlu6_Sg=?jde@!Ii&7{`}q)RvW%ayM1aLwzpDW`ADG9cArw9In@3O4eXPsG_Q) zDr?NiMZ&T;poa_DS6%JT=yuSQ=YG*H|4H}eA%nBr8gH#zQMAnLV&&|}7zlefXCda^ zXZ;G;rMaF5e4~sv$47B?g^VMPr?BqKs9UvoS{+W#92+|GgNOYIN2X^K^;)tNF1Lhh zb}eL9=hs#im79ZU)qe7_wA8pev9O$7*uQP@_mc^S(;V(Uxvz|`G_xwPa>@=L2f)zN z5$9-7hEvJnh9y)?;T))N5e@^){!o=P;moB7=S$0RvS*e=_AI_`DK)*QXhQa&=@qlH zYnq!I?d`W(i?;psx%b@d54fEGom|JsCD4e^f!iw$EO=O1nNkq5Yhf*SNCQ zw|oA!##Ow&eZ$`>T=%SRe;$DqI^*Y`+k2-HGiV0B$|8y#YS8gtJpCmSO!F!@e=Nth@8Un^@&79}UFCUjb;)nu zvK`N-Jy?WSZuw&tE=eVR%;T>=3Un0_X|I2++7-%af8ezo>sDN1-ydz?`&y1SbA(bC zwEJG~f9P!mxSPaFX!46oYUbssI1|`$VSCN%d9HJ&wr?O@+kPEjNYTZYd3$s}|DVcc zUDy8Y>v`UXi|`&~d*9vtT|=&KFW#MZ=+858V-VL5<3F~=|0AeRWTvJ-wkKL2!ow63seAvS`>uuX6 zym7V5{(ihW+rIKDZ;Cx;f;;69b88Z^X&tR{*i7Q*R{hmzp+eh=-k$BotJs(B9g@Mt z#W|h&Cr5gF@9nN`sIm~XToavJ(5^A<9q+&16I?&~;~J04i^SP@go!w+{hSZ_GB=l0 zEgmW%LI7_axJI|{_+WT!6y95*MDz| zJ}-N-T%}-*;5@-&1s4h~7F-65v0@_`W1P3k+3*Ka;A0{h{#@u^1nHBk=MglW2W>hJ zIp&pP(0ty8<+22`1&uk-5tyU>>kms}gJ^(hxCti6+gzjz1(7s#wIFO{=mx>#1mO;b zzftfHg6)Er2wp3AyMyibe$*|tQ+TflzAdQPXDE;)m@PO~aH?R1pfNtm^J#k4Ge!q4 z5!%=q^eUm(IT%wLg>kAN@846vd4jx8LApcm8bQWSBL8;5djua8+%EW};PZli6WnbO zcN+dK3^V!=_^HtQ1-}bgf^oNI!|ch{Gdk)J&qUy!@PM8 zES8KT1giv(5?m+%EXE z;7-Bag6|4`A!uGvrvi+`#Dy3F#|a)T$k*{$&b-V4!+lN^3w$wVTI*K3zi7Z7OWTK;}$3v zQzr`JbioS+w+P-Y_>kb!g0Bkl%@;QK4?!32H-PRgm?OyGLF7*rG_S5t!}u=}#wx+h zf)@y0BY3yq@K|VUcf|Y_i z0wc{gsfZ^Co+EgPAm8?3{{4cF3-TEU^4}EP2Q>5l8)2AN%~2qPqahZI3Nm;Y>EVJC z1*Z%01!Csc3LY=GR`3+T3k0_a-Wibj|5stWDEOw}=Yj_W`A`8HN)gNw93)sEI7P5b zaGu~|!P5k<3d;PyUKqCs-X(ay;9mqE7kozWCBat(-xPdT@MFOMj$o;HnqWV{p)pB} z7c3DxQgDHwc?%u_)(QOw!EJ(m+;}w&2=)@}Cpc7al;8xx<uMoUW@Xq$HzKq5m6Y6Qf7X^0-z9G0*aG&5eg1-xfa2U_-Mg{u|4i}s# zI9;&X!I-KQ#_@t{1y2$Dli=loeBGZ7Z4>;f;B$hn3w|K@m7u~CEUcF#m|+m!mMe^W z!AXKM1ZN8_5nLs>QSfZR4#BO0_Xutmd|q(3;0Ht=ZR{7uFM_z;?s$%1Kf#fLhYRw3 z3HE4?V7*|g;3h#nOwV$c2wo?6C(x`m4-4aI!CiuT1wR-3Q80+-6ezHVV2L z{8GU=g7tzef+wZOYIBw_E)l#=@IJxE1$PSmUGP)EUjzeq!onyf*k3STkdF>Cf2QDE zK37J@VqvTl+$eaq;3b0B3vLtStF^4ps1d|B1m6+dFZioqGM^Ddxn6<;W0Dw3#EyKD z(4~TN1s4#pQ&=JNI^tA3XDjp>LjO_dON72c=&eHECNu*Luzu_>!gyL3F9^+d_*vj> zp+6S-3!x7P{VNfQh4Fj=vA5u%MD&zTF)+Hz6rqnGLT;r)$J8;xSSSUK7n(2mP{4^o zZxZ@!q0bZga-pv#q9MknAU;OKDc{pV?hD-GBk1cv2-52{QT+(O`d}hY4LEbcx`Rg7XFWIy>vH z5j)&>so?mEZwEjVmms zBQZ%th)|%f;6%Y0#L-Gs2)#hCNpPd!If9oG(V=UIsJB)44-pT?t3^V;E*SfO2^9QP z7(WRn<5?pr)SHNk$O3gLt7g3!W`_p5$LC zc(?HH7kY=#F9^OS_>SPmf?p8P!C#3nB*K{vqqpEt!NUcs1eXb}6Fft(g9uC9NX$lP zF`*wN!ctEP{j$)n3H>fG#sVJ+<7+AKz0f+#5nvI~KsTX#2;EQUJR%yNAUIQSE)n$> z5&L6y3B7@cc2CZd`G1Zu&X)omLT?fJR-x|_`eC6T75aIhUl#f;q2DE<;V+4B@^6Lq z!s_IA=lC-tLl}dJphpOOxX{Hy&lP&U(8megBJ?RjpDFakLU#y#htT&5{RqdO4L(7H zsdf_ca8+FBPl+(qS3>_J^zT9k`#AX#BI@@Ny06fO3O!ut2|`a6IyO@nvxIT9(6vM; z(ny4YtAyr**rfj;^d&-HDfBHu-zD@8p`R7{b)nyO=$QIiGQ54A1~Z6gppVcagdQt& zvCuPxo-cI0&@Do*5&Cq&O9Zc%{96ni!wmpo>@WB+{F`o!}k>Nh2BC$ zy&HtSOX&NBevCLA@w&lea>n@bU@%0x(9H#O`M;;|2G^aT#TusEW*e%3#>?euXS-(%jLVX)A z6JpMp%Y`rxKRdt`G~hO*e*;5w1uBX^Ae#xiV|?q0{i8}525TPLP>WLG)~0!W9T@< z_IncNLhfz6$}zYS74RL3>v7uVUW?8qV*7p1GJ9FRu$5&zzO}62_r7MXe)xUopc|dB z{T|jRJ{BkX65EgGg%aB@2SOya9|Nw)cPMtUy7L_hzH)#tfBVpk^$U!N<8G8gq_yvm z@y}uY5N8WF{z7OjcmPF}y9O4JFn{0TJl?aJc?k2@58!P>?-9c9LJX-j1}9jntUtjh zt1U*ZZnd65`8Mk|=(ooD4cikfo+)gwhT$AwqxA^{#4MhqD2o@rwDmJj(X5ySJGrf6 zA;@DfDwEgZOP`kY9uGGm7Eff7t@lwkVgmW4 zSo!EhH|s%2?rwbt)1+G0K)Ez)Dx{@bpP_sY>phqwYAt4rhz#oo^sJ}FtAo8P26W4` z@Zk!C@XJM^-d2B{IP|f4piE!uY$&%~S(R`Sgz#hND1`8HLoi{5xAJ1D5!mkod zB7)zk&>a!{=AltU@cS7|MDXK#Ac)|1FKogPey75s?;z*|GWQ~&AGCiLM!5#+NC>}M z(6+bfCm1j3WGIFZe)~`*{5#yryOK9ERQO1=>RrXL@r3VzlJPHC>;Wec!H*Z4ylppw z!DZt!xp0<+G-$MhZ*iR{$Yz`^b#MofdApk7K_-zvKLV(BhnB4VlDqW z()hB)2_%kt0EO^ni|adymtGP|ukMKF@EI!;cU+uXP|=5YlPpdWf%BpU93hLTP2y!K8?whoNKCJvbzz z?qT6#)V%=!MBQ71B3Ex$)+CUOx>pQj)V(02#7x+|zo3MVVfWyllhCqHqVC-dLuy~G z-p2MABU4$Q!Jo9%&gDa;p979hqVDx!hHt56EMRL1Dq?6bh}z;CF(}KcRz8Wk#~>Tp z*Q`Tc*x%}91kZqDA%Y{O3kt8tEb~d!z3C{N?OUgRg~g*!p%vc=njd6Q(Iz&(-e~8E z@+PA1L__$aQ(zn42FQmiMdw4Z?<7N{M7zO(d>f6HY0;ZPXx|qzR7S=F)UZp`z3nX8 zCFBMbOUX1gATxCDtZiie4|bW;fb~~XR9InQJ#hS;!*de zu#tGwz05TDpD!MEk79gXqVDnDfv-!{y|HYeOVqtIDC+AHb#Es1>=Jd4@gsa)qV7#+ zpSncd`wYYGi**URH-sbDCF};`{@%F>S)Lp^<+OTU6nvps@cCvKdN`nkQXLmVXFmSeSm~ccSivBQUam7}+eE z2TVE!B9{3J`1K%8H05`q?uEy|-2Rvob}!t(dSkh+_`?hc<{!uDmK45{{PFxi){yY| zZ~(s(buU~9Bl(@Ed*MUKccSivqpa&h-3y-tU-KVMwJXDJtT6t`)T<_Z2`yO2uFVU_ z_Ap~ASDs_The1WZ6Ll{7?-U*z5Qgv3yFn8P4OcXF4s+2Mzp-na&8mOl@Kfy&yj;{16*h z!i?OKAf}fNr1EWDi?0si>qAgqTjuVj#dx-E zt3S3LYcRH6i!Xs&Ru-3ht0)G-Z%qafux2A2v@+oqh`QGUng(|M(KNx;K5#8IMhRz+ z%>1|#qqi=>5l4=C{ZVMxa= zj68{H8rYqKX7Pohx$vLB9uoLK5&bprMmdV%14T1op+NitMbDr>ARcuugdn$WYcc%o1%4 zKzDG&03mMc6ii2twFaH?S|=gbvaUoypYo=eKHvH>E1P$Ttw&JQWt|A2Zk03%wX=hN zX0+At$>?7Y!SvYw@P%k7Xrk%qFz;#xO*B1M_!TG^G|}|j;S$IQKFX2tgfCHmX@B?=7$+9o&Dot4z7E^q9%iJ3PlU|i8}!FCmAVfi z$c`@n6z~3lBHzqK(&xDYrIYHB^auYw3lQcloZvfLKUDZZnq)6EMtnX#^AddbXjAJ@ zY?D$_VgEtF4?biyi`71)1Qia_N*^)p34euca39nDFmJL3KV~{9yqRS_VLBx|fn`2r zIxW0_{Lh%q2!GCz`kd*k@bPfw;1^71htFhhzeF1E*(-NF$M7rO7DY^1Y?BzTJ1O{& zfiO@whfRLN9;omo?7+7iFHiVr^1mY=@%c8PR`7e?F!g!9r-W_jOj_{3W0bIizV;J` zUxn9lTz+O+hu2~%#e%<(aD}JS?|x<49Ue|iP2@aJw3(K6BIkLd_pobP(|fFF6WlrI zmhgDo*Wo)wR3|CQon6pt2*mn5l!{vVMWfs}YaLOGW#4bflj>pj|#Sq@8@$YV;;&)Idm?|prSSHv*RJ@gq zM)d=ne<{(~v};eznVA;l(>1|fn#RwFF2@QU%+z#{tmv&2m!)acY?aQh0|a|(-aJm< zLbLYPcVf7G9&&o{iMBz(Y|UG@(c3AqpFRV&1i{8~*m?M5Ed4UhyZ)NDe$)9xG19zT zfzY?u_80#iTywcG0i*hhEayC-ehdt56PS<@Ckjg=CSoO z(yx-Ouz z^%QATxWuUNIBBE8rACDhN#BHF(U+UiNrCX3h1ei01P5q1>2|7gg&Ac&8=JEq-lwlJ zX5`0~@-T_jvCt$J@oZvkVB~_)D2!Inhl1YFNe^VlSr~b0&@NQhTWJseIN^22b>JPs z(b6Uu?Kx=WP^0xNEO#5pN1&a)m8;)-AbBLFuEM3i*!$8BqU;Uk7?AlxoHs}f&JbP* zO;87awi=u*ygm+3&rpL032TI~rl`UB!s7jFQxnq036JMy;OXL+8azdKjq!5J)ZiJy z+Z5-aZl&-T+mCgps3G%&WyB+Y=m+pI-N(2vveY8{b;nJZ3;m2a`kFx;h`BhJesWJA zjQ@K^oQb?Q82&=0iS0)xLN7oW7QO|CR!vmA!Fj^tk+|VO<6*+fcX+y34IU#b#`cR> zJzRJU?Z*~kXoADbR?V^u-V8OkLRcH)RkPLLIl{Xj&KsnLED)X%UqCaof|JcJ#OS9n z&Po|)?pT4IIgbB~aeRK_%J_XuKW7}@FihF!jpHw20b{cljLps_Z5;n4F7Z%RLmO?EdZ=w9^G&Chd8qM~q|Iu4oQL~>M@TnQsYVkn>ut~@ zX?{#m#o3}y^>k#Q{ZYK{@iTI{M=?30lc_&Oax@>bC}biJiAE$$Ah2^Y5?(TJ3hKl? zMvdeMk+X(YI@7ZfeHv8^-r1;H5YHH03C^vQdMuyEc$ukXVC`q36^RIjZ}cW4hB3is zG5ERRyu}cl3W>RzaSJ(n^QGmyMr8FjS(OYNn8#Vj*naW+tD#Sk(Cd(Y1L$hf@IMzB ze21aFv%rdXmWhjQ0z3%BGRc1GO%V@`ahxLk2fH98y8h;qq#e2s) z-fJen1mmSDb7>kRWEg+bXCx%_G+q^R=1`__DQ6C48F$Jz6QGZW$3V^m=o!QCfBb?b;=gdyy^ot#*AKC%)>AyQpk8bV2Uw538h5kEE|Bi9`*I+*9c;H>5 zo}o=A-!mGzthm#^Z?r5RZ4OC3@NmtkCT%9chh`GsD^F?+XBOsx`RN0m)p*)r)UV*3 zkIdLuvPTD?``sW%rz62H=#K7(1TQX)%R#=0TR4)|CslyI{?(J21v%y^6C7U@#4|=8 zfl~d!89f(?8BEk8!H`j-n~^w;i4&3Fy_>-%&K_@-zX7G_Z)@Nc(;)v-q2b7R?Eg<) z=qk`bG%o%*ehz48NOC=rY9t5wI3$Yk*IsWK6=lH29cZ#3o-z7*a6aT$;h+bS#$OkT zSWbyW;I#-1{~gGRYy)XE^h*wWzIPwe{9T8??wE)B4$f$f@E!o?0E9cEIm*i=%+O{u z3%p#y4&!$ooHcB;muncGqn}_LZ;Y3YrzZSD!DGGjJe6bC+i_m5w|t`B90$;N>1dal zaW7Yaf`c5|>uvy{@{Yx3Vw`o7VV!~P5oB@x!^Q*81w-tqhF*@DtIsqlvvdajy5m+9 z?`Mwj&N8vpzJLaf?&lcYlcBHE**}_^{C@64IFRB&uNr!u3qp1z42H^(sru0W%^vLu zQ|TxQF^l?BM(BFd#$rz!i(Lwu-^o)v;#5O#NrII9385S@-7ygsaYo^5GYXGThH2v) z)5fQu)nV6T!MEDJ!8N%*n7_X%(2*h54t1EE3A zp`8K1NDg*NBYGLC4v7P@5!*Iyy5c2M*ef)vr+ND zX9e-VXQShR&&IH9m7X1q2T2c7TBE4qLDOg%Z|~4}9+J69e1Cslp5INJ@l>xXgG6F9}FfUO4YRg;6sv%(Ghj z757?(XaK{BlV+j-FoZ>C8&1ry>VFq*jdJ4g3!LBv#SAI~w#3RXVMJJ}GvrE_5N!5U zpX!|P)hDd3Szdp<1YLktosb-&0JU>EYgFqRNX_n7t5fa2|H=?hMVaU1;o@n zDDIjmT#X6`he~7kHLnT3_Mc*|`6T9=ee(5zH2d7owSQnd+6W>$n5b3d&5Il20o6=9 z5{B*Fg*tt}e<_BV{penI)K32bK_dQLOthl5RjV4BTAkP=h_=EB zgc%}1!V-bhRArao7qun!tPA`ZMeHGMSXsBK&I#eeesztq#)(qGIz~RDwMZDVPH#LoI!-*Kl0D)(J>5RHR$C2VIf0u@$ScTV zpegnNVFl_K$AmF-z%E{0FHuYqs{q4hbPX@q8K+Hx?qJX)l1g2p9$|m{mClJd5!#%P zM@~bWvMaoQT2?l3xTBg(gZLBxwXyTnLOGLk!+a<)CSt+X~?(NPK2%L zYDIL<9`UvA9pcVTCaQ_omU~dVEN2jmExJZ$v$tIA&m12QvQ}G*2uvo9BG-7h9^)v+ zmsZ(Pm>B_QWO%h&MqJCZlWc##v1WW2$IDEdk)z=YCejx9jI?DI{%QmVDqD_-E>s6O zh>OU8Y_WJiw)pPA30}rPO&k@Je5qrIcra3l?3akw z=Er<6f!Y$$*Sa4ywQY5mz&&C~jx2OE5zUJJB{mx^f;_@rbMu73&WW+JDSFSXzONk{FcztyST z&`@zhV{2XY@}*rOwT*IOjKw3#qQ$O(ww5$^F2{*OnOgg>(>!^TX{v;sFk8@Z21zqf z@es`t-Qu3ZiOFPqtF&ox!@5MsO%t`P9@7@llUUfRj5`k&F8V5hAK9~(>Wo-Clp5np)s}D`qS0x~8xaMmx&cufsRGvb z<@F6v+X<_gh!-fMYyv$UtZG?Vr37J;8-rB!JSc`{HJ179B>F+_I{7ghO%ZUVPANGTu z;WdHM?B>tieeAn`&{<*Dshm}YaJ5*i?Bpx`z3hEI=w5dJdjjb*oQ0q>SSpu1M*TH` z%}i_mKCl_GBm$k|`1YfVbejFB_NPXj;GGEpa&%J5aA(opPJ7r*G32r16`eamyWiQK z96v}Ci7|BD)cEjCjUV|Z!iE03FldZ@=6FiifTi^IqJJ0ijDgQaa8f6t zEJI&&RD*8Yv(L~Gd&*BbGwc`vVmJ})%q{*ti`cQwK(+`VXW~Bp7b2S(_f8m_rvk_o@2?^ujQrq|E9?^rXB$`1}t%K)X&iu)Y16L#hr#dgNq zH9^k0EIl~lXX_I3nYG!;#DTQwB#dXGk{WsOy?T7|CIX?MDCSz1mDY)Gd2lo|6e?>j zLL@X3jQHT#Xa{u(Zepy$rL8jroH;W#r@r=`w_2<06+OM(>|wv?r2CWC>T^7;xa+c`3SvLio7*!*2K?hkb-~_=!L0&EY9rr~WAD z6Tzf0fK{x#i%$^7~=(}2u>HQ5S%S|tYE$1arWbX z)Wc&J33;{PErRz8J}$^l(^B6z1x@HF(BBAcLQaA1hRMcqCiE20gq{M95xxmE1-ina zW9n$hFd?RpVM0s+HwvFGz)+wqc%9%~f?o*^@Hpj03i5Gr)|)IiO|V?B#vn%W7-7^4 z9xu3BaDyPfa!P?03i62>(l-j;CU}qFcEJ|}`K1K2J$}Qt)qre;4FO;hF!7 zpdUADNb_U7#DRR^nh8FIO`I%PCAdKFI6*#U%W|6q`5|V~mkHh=c(>pqg3k)RCden` zSTFXaBz_XKaO;K{-39vy^8OY1lLU_tJX&zM;2Ocx1^K`R>s=*yi{SkZ#?<4&cuCNN znnHzrLVqLpyI?=u`=h`Kf>Q*i37Qa7$gdLGgqi}qKxh+k3iNS?#`w2L#u~v5f~N@b zQCv32j|3AR7JOQ8m*8H(&jo)JvHIO2N5; z_4cR>u}e8u$O{E86TDjR2Ekhew+a4L@Cm`^1pg-Zcfn5u|3Av!1H6iA3mcx9b53$j zCIf+llh8vb3DqP(=p`fp0s&$YiZuihAQD0d2?B}-6dR&~D5GAkV(*Qsg5@fR*sm8A zvG?A4_v-(?Yt}hA=>I+c|K)jd-o4gdd+oLRo|!#s_@ybDW8q0Zv7LtzgKvZt#cPc)p_=MsiL3F9NmGQaa&x&1ec!P%VxEpbVVv%CG zVvXW5MZR}P`7;%_D*jXPCdGS*>{9!b!4H5l;VX(CD*mL%S4A1$Ua_lUj^ZfA62+qx zPf)B^Y*pLX;oTfNed`clf ztuj_9o~C%7;$@0_Ig}afR(w?PImNdWKU4glViF!zGhMo3AH_WJDTRpf%9yS=Pq9w1 zSuvuxS@AN(>lN=-+^cv<@ij%hnM^}IQv5lpFwoJ9u!&f?#px6Tvz0$wQG8Be_Mfga zzX5Iy!M;f8MM^JKdX>_rD1DaF=P4c8t_+@=pk>!9eG3s8?NbLIp;S3JfNK=80-17^n19rDqUf z$O($e6xS(kA|n08L`*u@D193d`gSS(pwJlq`;@^Kawu?+h=lJe{;ZgcV;ki6RLobL ztSCOF5HCKafE$#5vEp?^7g6=y-dTei|5&5-a01A`E$3>Ccq@T4|o{VZ4De zCsfFHn@Fc9-BsyKrNt)|G8|7D$k%j;#}WG*MveHC0;5qA@C(WoYGb3){8TbC`X>@A#FlCe|9<3<8rVwARbgSY9#q$-# z#}wplQF^!Hql*6};-J=>N`FE`fxe6=;}>Q8p>zm`J1EeO2*sV1=C`0p_g8v|(xa5- z2ke;99Hoy_dWq626xS+7#Hke$T&RLqDc++3_bdIl(gzh^QG8eNGsW)}e<4C|8V>6b z`zQ`mEcP&BR4JoYah2jGB5L45rFSTOjncanA0?tQJ*D(ZO247>hf04zM9ux7D88xk zG5*7_juBak;*1LPM5W6V=PA}IHYuK}c&_5*iq|XtOYtEh4x)+ADd>NhbOa@QLj}a? z6life1%aQ*2QAL0KnHP-khJ)q0-d3>_@V-xqjVk-84V}qVxCa`G^Hz*J{~CJzfKt^ z5s@(Jv}&{Rw<`Y%rNwy_47pS3`xGBhe4Ge9uPJ_}_?x1QlZlMa6rWNE3?l;y`59wI zOjde^(lv_WlnU{ukw%HnC1%1~rqb6Cq31@W|E2UErS~iSgwikY3@a17tc(v7zg7Gn z5%DyN8HE*l6Vd7VD_x-USf$Gpk0HX)T4HZFJW={IBJ`diKBXXVfikwKz!gegLqx*c zl)s1A7c-vH&l92OC8gh0`Xi;kRr)6)(wR8AM}v}y*@n^BRT+H6fQtCi1_cU~9;@^e z#R|m}6dM)KRoqUTZ5TV1zDMzCLAv?L+MRU0d81wb6mLdhtMfJyI}P!Rj)lFe4>Z6m@T`j|78wK=phflP1Cac{$MaAB{Nf>l+CDHR@Ah{{pWXhEU@!F^9A?x`^_HR z3KuVKHt78hdE(D+z6WE>?YL%pKEZwQezVX#(M^BA9Mt|r2(&rp`QEK~!0a1wa9dHm z?{tNc>V3zb;6DsqiSOVi_$<|i68t2R_#t;VL1**Um6X|_kAK33Yieb-_yMxC|V z+|;kK@51jX_CoxgYTpL_Y4$lt8?nE{uVL5Y4vcBP8Q}$veFN@t`0Pw5^4pUT5wIUb zIKe)E*hIS(s)P1yghO^1jge$`htal8zqiRYU9LKIcVyGf=Ix*M_ALCS*#APR4)zo@ zW=FdKB}=tOz=$+E5ByH{6_5|xr6G*DbbBlclVLvyb)9YAhUj9~gVWWfpYU!r?~ru2 zw;;nm5vYf5?E19t5cb)lV5#3e9%cvZZ=viAZ(pPFzHOCx=Im6Bjca7C#b+OP&TNqy0`;mRSE9!tlKF35k&-X6B6qecvSA#WpYu;>FDUUzJ4Y2kIp#{2=VJ9b~d zmP~sYYG~(P!yX3`UU%#gAiVC_iO7Ubcha6j{|tIgcT#!3(hSZquVfwts5iqN3+1LQ z4u*}iu4ty9=aeV)AF#)a1gp)bDf|i=(y*Tu;ZvZ+GSW^1C+K2nNq|=v0u+8aC`njYxnh|y%)AV;s|Cx+7uRG}{vZ~s=?xYW7)@@#Q!v7^5b-I&g zpfZD-OuliH#tZVG=X57+7|rmU?sVFQ;->|#GiRfE!y8x^*W-;@)S?mQd+)&;Ob3KN zypT~h3K0xvQL%d639n!w)$309aT=gbchadP*yeO6y&8;Qo70_izTzKjbGnnB!P3I% z4*H*AnaL^X?@?Qu*PZllNVj?2N%yl*ZC-cMTQRPJZBBR6pP~V6PIuC?(Jz8+PIuB5 zvK(zrchXO%fxFGf)nb4@C7rI#f^A-R((hu1ab9=Q=(j$2zu6fHQy)M*o52Uo^HG)d z0d{)(Ec77D{sCtBZ5N!N&5xbH=}rmKWrR}S1<&~cJvXFIcj$FI6j84`7a;eLdfnmI zRYK}@hrT#M>UHNOhNE70_*^g4h57sV?n9^xUrI^vlaWm47r{_AouxQ`fDy|10>6gC zPlAN{lkJBnW0E6$h7$}8nn_u9sgOG0d6?D>A)B)OfypzVV@YV(YLo%iB3d2r9Aa4g z@AOBlg+_3S2|7Djj*%RB$qsKGg+{UG4RThYFND4pj}nY$E?jlmTjIhjNwU4d%W`o^{D@y0yI}h{qKB@?i=#_?_~VS zx|l3})98RFV-V>n-e^o%m~kSDA9KKyQOqiiIpE27l1keg@MJP=)c?+@G`y?|2KuJ4 zY-Ja~vIIXF$)BL!{GpljnB!c8ZV{R#;~%ZWMCFpZETW;K8Md5OR$B$bKEqc`n<_6x zVqYJWIaJ9f4GDfSl2^c@w9xDVBkD0FKdvq zg>_ZKaI*6vvs^&=6o)t4Lkk&BbNCcIREux~&NVhMaUDN+(alL`6D^`prbCAyp~VdM z@x04XB)Z1Y93TChgjM|gBF)VK`9&t`i*1q&@-#~7P>l zyA+NmCRJt%$ISU{v@Zh&hMF%0C&B+M!d=az)UW8b(&n=>!{*0XO#6BCCCh#lzdrk2 z{QB)r@r#WPeiQ7AAd_hG?ZKeE58;rVhH#SIgfN^P9gR{Z9pqA!;OB~vn1UavF>fc} z8-`*eJ;$v%d4lOp!F_Ce&ooOE)8Y zar-aOf0AB)7qM`5bQF>$y+Q)cj*h3)tM@|+&W`9mFDdHmC`{{O&W^r&4LI^jrY&_WXBxEkG=49^B~&B zoX!L=5eYbN^p+w{7mZ-{VGLgt?rWC&zC$7-a{?;JJQ{3G)f3a8m+EMy>h=GYDq{2- zNUP`WXFB|$Yaqj8VoB#R=_D}wFlKmshS{un{&{K6Mw%RcR%IbrB0c>GX;vctJZV1h z$vN3U`)>qK#7~G9@5d>{Ty&&aU&YK?M6=jACFSxXQgQ+^mmZn2KRUiw7fYG)v1rQ3 znej<8e?YC8Er`@Atd1pXVX}{yj1~WnBT`)gv&^+^sV<47TFX>HH2>dI_2aZ>M%J@K z@z1LkF2SCi>zS0tkfemS#b?-`&!Ek(m?{VV<_dnIo=2y>xF%78(&;q1|YKSn=}==*!_3b0|9qW5C$&&_7X1o7NVce83wB1E`5CvHw=%>QS

k72`)2>!1{f(UhF%Q_Vt5lQf7MAkM-_s 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%0AIz+53d$v{|9`8LBNO+>yE`2{9<# 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

Vx=tWjhmgc-V5@e##m6lLrX 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�`b&*^n2jmy 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 z zleZntmT2kiqfys+ZUFd3>mesB@}p(sqfQrGLq*HUd#TAYCK=IV$R|>hCZCOGVdsG_ zPEDIU!-zJy58_i!RyE4Ex*dGEQ8WaW59i+4lS=Rfq1;uxrZQxklY3KN=n17`sFAyx ziduY`GWS-w?&=T%dmH;`RicZzcd#jI)A3;MBAbhT7|T&f*7J-2ud2t`IWwQ9Ig+1i z6#Y01YKJcRHhT1s`_q8w|en*Wjbh zP7G{bn+PJk=h(Og%4^#ee8Sm>%bL7)qrewCD=|6pI$R7s<$Q{@J+I>f;LD9h95o(8 zhWP>YcZ0;b4n&?i&7?l@si(EUIb#qS0NUbUQHO@#VQ=>w^RW{_)XL`goNwCbTU7P# z0kFXAjg3Q|;@2Oz7npp@&Qsgb2{$AsaK)+@#>dSNkW_rz-p#aV(G(P+SwuS;LbQ_$ zx4%A6W-788vBmrTUWO3aJb=u$uV5iwF^T1*uN;7|F7zm~nLuM6)sD{I&TI;zeUHj! ztMwud)R&>%k1E4P>&tk^5;+`?qsknuN)^j+Ko|5N@ep+{9F6hFPe^(YD|R4NVnv}5 z`vAc`mG6YUMH&u{@{^($Cc}-T_{gsaHEIYoRY!Sw?Iwrb>Q(ztAnL6Y2vn zKsU^7Wd1;1>377({6SI*Co^pHLHw77Lq=>KiaPnDLf=vdzi1cZ#!qAhLV}+Ix{dts*Lj^ zD>dizsfH>ipY5!GCaMYf9Ov4e;G2>UJJ(l(Z%)2}<6)IkE$NTAf@<8AzBnKLWHqS* zo0^VhCC0CSF495Au!cZAyAi#k=$)3()NaZXAZG#m$!=Z_sfP1!ERl8#CfmWm+iUgp z%M6Pz@7rx|M2gh_y|cT%k19nYpj6a8)Ojdme{?>yUs+! zY`ZskTrchG0?_|6h%98ha!M zj$0{cEaTZresV8FpXZb%2q13mLY5Td@z-RamHR35; zFSMqGl_FDw`$lXUiWJ+K=0v0^v7c*7$JOs{!UnY>TSbvC`Rd zC7k6O4Ti#q_B?Ad+R6VNL%$$oUub>IhQtVqtiTArH$kz*7N?Z0E~RfTlTz7ATy?oc z2Mw#X2sZYmQm4I|i8a~2%$kLqDs?wq@^b4vfNttgH-HrueXLqNLnB;a(K*Jc1U9ku zl@_PVB=rbg^eQppTr~vY#J*ZY&yNr2JIAoEvA%_#3j)U=D`Sb{NgD(52kzGoj1#%tqK{|EQAPe*%8O)-d6O@z?vs} z;S(S!RnR(`f`9V8#)3++hI4Lr@NKv<+o{=;=NJWT*}qIDipC1sap`oO*^pMyo;3&@5yHLUMoeIv^&G@wa*We2o{vbG0rauWQw&Sk{@A~Tyz_a`- zk3(?whYmwn_W1=7VWa4NXkiz8UPrx-!y;7h1^bMt^DyNVWSXf`j4$v16gaZsGn5o_ zWy6OZ!x@-6l?4q=-hWUT2qOhW=J%AK_Ot;g7GSHNF%1ezq?Bvq(&s0mf{Y^?D~GCy zg2Co}6vCTC1w+g$FfxYf&9NFPEobuJrC^xwPW;Tt=Nbhy5<*-f_7N0x3ywEGJR)F( z7SJA%wP0i*AW(f&AR+K}zPBt|gpJr$2z=p!g;omTPThh)RIo_g(@;5>1_g@+*lIS1 z?;?xWNoaWzF0#S}twMZ3IX;&fR?03#_oGdS{lKo^T3Ev@m=~Hz;TB?M!8sxN33~qv znsN&cgf3^+0y^-)kc@&VN6;+zA#^7)Y$N9ukZ?4G4{~tDyCE9;K7huj(IE;Bhq_^F z=f8}ZYWU@lWcnAR=_B2aqmOt!AjfZt<}&ge;2Ey=kH?Y{82Dj%s&Sb z;{F*uF}!|J4)$gK_T#a`^uL8ZMgAB_F81>gmy`a<@Y52%Yi}s-&&tGv_OC`yOZ_<* zphkWzS}*hGqs4N66)p%-c5pTyS-u=5Y{pOKF`50T$P-g6!!zn6T% z*+~9#^2J7MLIXBdW@cbW)k^qitg-M$eA4vsMy#264!jMwrzg!fV$Drfa@Bol6l)}{3Ldss2x^!!Ifj@3y7*-A%F!U+EZsW2e?2$fr=nz z#x4{Pi%&hytw6mVjkTk_ad0!~sFz;R<&3mB^=Q0Hp|oUG1j z3~;T0Q&cTGaGiit)u1r|D+P>G{OY0D^#aDL+K~V^2$-M_U_Qle6fjXehVhQA5->@% z9|CZb*$4KX5(M0_$d-VcXB2P5{HO`V$1__Fjp7q|Bw)yj8=u4#*LHYR7N1N$SW@Ft zqbW`Ve#2w@%xhb6B3#uC{Iu^n;Qc>mIh2XdpbPGE_-&=}v*_!Gob#%|&mv!!;zlGs zoBZ!d4qto@dBaRD#JrBrC9uupV+cL*d5qt#nLHLIkDtSwsF^%~U=^QFfE&Sw&}{tN z{k@@xnfxph;5-7{`|XQa6F;Az%1rW?58?~90rWSM*HFL(1T|*zx_$tQxEUUU`^6&x z7Bl=$F_TXqu*EOpk;F7J*&OpTzJy?=nLG}@9lw|h$Xqk|HM_8kV4j(zZ^V}qoNXpM z_5!$+;2hks#w3hiRt_-VOnzzsT+W;YW|H6T9ba(}tt~Q>1&ERH`x(!+nMqzB#vf^f znmf#7oc(!>mzRf-gAfycj^l!d3EocwJWo(=C7;BEif^TLT3E@)ID9V=R9ea9m_+fH z3EEppe)Vj88$p$od=rim{}(|wD|tB$@+v{KmF!JZz4k^=+`YAu6FAUsFeGe64(q(h z{%o_78_{-rJ0s9*R&peV@hyT{D>;RZ@;1Q^E4d#Vh4>DFomTSJ9sutUd<5MH-X+*= zCHG-PjPIm%_FBnz(c$=qyjuF)O5Q+=e$1SVP;x#s*hP>TN_L?^J|S>I$s0H%y9wM- zvKlK>{8NIgP_i|<@EJjND0vz7I&q2M;ZU+OW@!8i=0rouHLSCbATN~snM3jwL4GLt z9l_TGDwOhmOdD900 zC1k!(B7;2I77bsW%V(ok#-MrCYluX#ob2;hl$>sU7W+^NTqX3Y07UUPG+HIvb!u4Z`Thn#z^g7+8rn0^{i=ADd z_IE%|SBw2yq`Gtj=q{3%swdh2948trS8cgs3>UCME$$0&ynw4!FN|+&gn*T50|#uR zfK@@4MhRFQbau3K_72q!y^D>p9)LsEqMKXL!&vc91kKpV7NfZOa~M)i(cSu@0l=vi z!?>&3bO#tGJ@Jg#@94wo*hGs#N%4t_*kn0L#$8i5XzVoWdyKBFzQqKJoi4yt|6prp zS|_8OunHl(#HI--SA*cVvFQT3sRAEhhJX=j2VL|m(Px@!Jp^E;fVrwO!E8|g7txGH zd=^*6D%Z&W1p3vPu`4X6vR=Wfw1SUdKEQn^k*rNibsKeYJJSJeKdJ)4D zdtAVL#h-|ZtrxIJ4X5>=6ca30D-fh&8>F2T>O@4J*jrWu80Tv5!@&S=TS)@bgIgN0 z9a3(s=^a2ci+v!Sc--`+gn>R3w8iw&2;;Gjr0cJlp1APGf@)1~&_Lwv5=-nby*b>- z?v{ExO>bf!piiabUeo)DapyBZ`%G^JC&C`7_l@Zl(`ui~1KkHq_-hU(ST1++)K!KW zXJK3|TK-8xBvz64#J7ou~4^U&}*3%PB)B zN?i9Vii8{%wnF%uGp$mcuU z+b0f_R}Q!KiJ!=O4tMs6pUD?EjRt|QBOi0l!!A4V3;DRiFT_gxMjdd|6Z`eVzq#RS znBsOl@dx=-3cK~hpJW?zvz{+?NLx@ad3+SfW!KD*n0o~OS)@dN%SlPxWA_97-PdT8u0;<(@7|=x2wVdDHnmbk|XFX0EZSI zq94VH!DbH_Os**tLxm5nDHF#ZbxoNVA(dQpMgkH>ntf4)PhYUvT%OtS1qHpF}djgy;pjZN7;tW}$D^wnfohhJ& zx`{oQF3MC&>`R;_YkYfk2(d4*Kvv}{#UD;fTwpT7RV$u>CN31vU+rlDuuwpa`kCXk zNWd7?gHw93fN^R}Uw|dj&J;DCUb=LsH?&Mi`x(mx*-MOUaj9OEa%Qdg@z2)KzSWplJfRbhcoY>@rOTJ;t^W|NHm zqw3FmfXxCPQ@n^sJYzB*Jg$0j8ayjty*ic#*&@ZBP;1!j=L9?{51}WX7qCI?XUuuQ zd;?>(N$v6gwwk*DwyF*a;6+hqo2p^wwwb(ecuiH&qOV97cB;Nq^i`8#@gub%0`QuE zeX0i)eOuZ&q>R=8I|Lk7y>NY!ct^HsbzWf<;N8GOOz$;@ocBbwZF+f>w^OX(n%?`^ zQYGFO8QD0{rh`*&aXdKU?JxpW*ApR^M&V^+{lqu}(XV~tQ?n9lLEx8rv|n;>k=UzG zGY?=NnfOvh%T-U60(@n19l-A70jRSg(bhUd3EXcc+6P-2*v_39b|6nEZ^o+B*l&iCP5kLtVJrMzSWlb!KO#Ui^IdpabN_tEZ{aV( zmZ+t_2m{~B&p)0gl+8x-gmOIiHvR$3p0@sP)jXkG5BF~GcSHFO{t$$Wj{a?!!=3!! zp>vhrd<;)0<7l^w|7jDRQ2qlp>E?d`eY*R{4CM*smyq1U{|RkvG5lO~_&J;xV;r70 z{MInq3%D299#h-!*Y&}-W*L40 zAkIXLU*Q|PNH&~z&|2Y}RhZ{9(Yt z-Au1^N??-0Psz7;ey93-$X7WrjBepx^4*;CFck|wCtvM+4^tF=NxqMhhnQaY75V-S zLLJ`UAwSr8hJE>#e2w!0yu9!`@*|va?E3-gHpc1Bb`LUrtaAx=hJ|%2z>jlgVY~}} zxeNRx=UvQ)!e3toKgF2<|0w*O<)^80sJ~%;1~602Wn-p*xoSFmrZ8lhaN_yu?B)Qr zfCZ`t+sHIak+Vq6#vm6u0+y=BXqhat8*-Mbt-}E#=2(Cg>N(mYYVw85tJMuy4hxk@ z4OXg$8UT0#R;iN__X<>_GdT@ue%4!49%xn$txS9!HFKlj}0I)$dsRn3aUI?&BO@#9nwlr@A*rMk4 z0BB>r1h7>_5Mv74n%@I#Q=ejj6!tUuu-$9w8qBN0A*MpcYqzLIt!r2 zJOyB9@Hi1YPHxO#zmo!=!;aS{bO0|;192?t6VohpCKKd?SK_G4EBisN4FF2}@ZuWJgHli%LLXgcM9p>wwXmlTI z(ieiP6Y8_Vyp%`2gRC5SM37&O)cQu7FpK_iR2Cbp&+o;2x=fHCO^Lt>NDzzBOM)C) z2~Evs4jZ7C93_)U$i5b-IrN$T$dU)DkiV|JI$i0%l-W)h^sfIczh2N`7NXY$g=o9_ zE;U4I4t?;bEV;sw59z$NTL+e;gC12N`uY*0ZU>8pYp%dbTznHNXS&6=wq@BQ7V~0x zg4J-W(co`iC}o?RgJ|Ox-!c+~DlSHZE?&I=i%!L>6mdr$QVpv;`cix+#bic{?_CTU zh`W!Kw77qeca0{uAmBxd@4g2p5O)tBfC|LjKaSDsg7O$h2;%5*ASDM9-^Z4EA0TULlXHCQT zl|9}->!h5f<={7xFL&2h`5edpbLnO%>9P-B5a7sjgULHalasLvag)dLW?Zwg$4@ho)x7ktxIKk3Lrz7i(IkRM z5>1Ya^g;TCVWf}eJ-G@i1a<;bgM$?A0;Ox{Duwgg6$Gb@;uCsc%aoa%)em0a{Elgv zoKub>hV#oY;N=Zr+lj(mlIJkpb=F{ZC+D+x*txv|{JCssu=7n%@aMD4Sf`4*EFeG5 z8Px>*1uQ?wdA=0O#qYr)&&5C=FN&ze;s5Ip!S@Pohpb&0I@+Mhw z89_HwZjvQ0A*eRxCRuVhK_63Yk|i%CzJBuidKFxX7q1cymp$;gYFn2X`-$*brO zHK8PbHl6%?%Tt_f6l+1|(Tu(46lytCPPu@TsG$u1nde{r3w z$V@h-)~~Wyi_GLOT>B(nn~!!XGm``9DYbkUqFZM26ck9lP0<(NAz}I*Ep@cxP`mm$ zA)Z7rQs7U#EdrkZ1zT7tIfJCsZS|?uhIL5_*Q7J}mV(t4^S0!M_b~uvZ@|IKlKVeF zLH{s@!thO4#q=BC)ABEbppf4Roxzdtu?S16N}gPdow(eAFWE@(hVvfWrsS!MaS>uW zw>1X;H2I9w+_O$MN;Z+tbR5L`lFj5Dhda}fXW3iVxdrpCWDEH$ryl}U$#dkhohnSh zk{8Os<4NFS!Efahj5>{bf`5%=63)mP@NbYWbS^Ff|0el{4u4Olq?UY;Oj@eZrH))$WXJc_I`RqP)w}r#s znJSS-Y$}~U;p8Q99Nyj;$}(~s-ofE_>6gfHct_`SmXYJ|PR`5__^&9Z%2_)I{MXc> zn^S%qcsUNQcJ{$aC2|Db)0uC9mm~0A&Lus;e{Z9FZ|As?;N=LskAtsYGfLzLystBw z<$s{e{?40l*peSvez22IJ0Ie_sBz}|;N=K>gp=af$x-)6r+o^%9CeR!PKV=`{K2}T z72h{2$&$mmF=}xKfNVL&o1`KL3ne*nf`&WinE(wWXPU|<$Tc5G^HQ=5v#lggz+6>* zJV0>tJYTKN2k=C|xvB?dTS3ZfA-PsOf9q-1w*UrjjIK1gj3m6W!s_|pV+s-UR$#@U)uH!mTpSyWGwdSmfgU>7|DA2sRS&0pwk$ zIjk2S7sG5o379T7*uIdOkh!2s2$*^kP z2w<3;UnW!xaUfnJ!iv@K?f}Qhu=Y{%z|3%|(_fv}6gkHW7$G-}<0Iwte4LW!Jx-7V z*-1*C_c&3&G_?qGKYo(5Ggtki4Zv6d^VNBnZShm&@Oy#kkAB2Y6|hLjGa};zELC5( zLe6RC11PXuT?@a6Pm%N7)oLcDM0~1%+muhMpDExDBbPVvSwqZ)hy8hWx$!Stb{qO= zTI0S(lHXz&M$rEp>#ONcLM*rZw~!n1kHIXq{Y&938HQB@@zzWR(4u2uZO^)52AtQK z1>U-neu8i4Kw!15B5ylC!&$7W$-B;Y^4IX1EbP3Ah+$nzzJb#jBVb)eKH_|p0>6@c zuER(1tn0}~ox!Yo1Nl6|x*1yr>&C;-Ie#L2<0IReWu6J;a*xw za9y0@+7RHXT?iZ2*#feZiHT^PFP;%rGuX_9A}p%Tr7jC)ls)woa~26mslIR^Yq8X6 zq4++6b&(jnQZ2{&VqGjb?Unr8?lSSfDz&5waxRf#-IUK_%LN>(_=cHvxyi?UtJOu+ zdWGCBo1$L9Xjxa9*=TO2cL)L0x>lqW+ukHhKx?Ihrj+enftXpsz{kL~py0klR?+V=QVll8F4 z$C~=v-uE!O^{C0ApJ{u^ra+HL3rlV96{7V)V6we`)7DQ2y2kb%L2$I56m+fa@j+;7 zgGuLGX?y1l2YOmex61Z*(B7Lw&(*e<&%Di&cZcoWL-dT~-D7)CQ_5D+^M2bKfgobN zEa;!M_W<4UUxL=y-V7T0O+gQ%@9fb#g4WvJrLexWQ#5?h-O=DZx@|>ub^$VXVCJW3wq7=79avxzlf{W z+TMCP)UVR|4j?*S%%ZctV|#aC-LXooS!i}ApBv?r&bE0kq3i)fXVX7j!592(@NmP= z^q3;A2>H)otU`VZG-UhRv07yKwTQx*{*&0+IQ~@#C$67DnJoVfM3Zd)6U^Hje-%a} z>^Ft@2L4WTF5+JY&&~C}hMA-O_Xxdt{`XKJ-?v~S<*)6_n+0W9KT5ZFVgat=mr(f^2?)!pFa8p91^hf}@VI&lYn>m2u=VO^ z#1KD-U{9z&In{yy_M|!n6UN^lbvCG+#c%We&R;RH4 zkr~2xtA9d*ze^f7)HPUx{7)oe+bR>Y-Ty*z@Hk-&)&J6@oY)i4$MwH6J3>Hw>SV(| zAOSLX!reb8Rcxa{Rt~ECVD>_(Y@1(ol;5cgmz5#^Cv!PWD?2N{PIgv?`W|t{|0SrZ z_;Qf{tI4;6Top#}^nVkt2&?J=0Dnrch~g6&z9E4$S8c%D^-Td$^>0KN-x83gPC=mY zgIBQg)t87{zHLzfPi;&CG_d%>%qF##{f!8CMe(OD{iwyzyVEPBE9P08n^Dtyv;&Z` zc#D6F<>evb_@1EGEU&C1P)r_}+G%+cIW7s&;seXe!Q$Z;3i{CUWbzgX`pELmr1D95 zY;3pX&4g&&Ld4)3`z-HuY=`_NBJ*p@OK{*@NqgT|UWy%PEmG<%uY!4%f_|~Q)004L z1pR7xx6m=$ij?0i?=nu?c9Qpp<&9?)Xm9aM=TFP)#u?SY;-kK)khcM`(C;YqszcuF z3ZPC>56{9bVE?KtUhCso*fTi!I!oTtkatfQsEeSBL*6#dk#2&Pg}gP`Qu)VPbf4vT z_LgoE-0NQv@;-HddP~VGLf$BBFZ@1&uEa?bJ$4mFPCOZ3fM|hteHGdQs){f?z8AU= zRx=d8ro%4??LdYd9KMqc^NSn9`T(Dmtd3ZyQi;#OX50Jm8M_VR*}n8}y$HMtUd>Z#TMx0z}TE~8Wfn6LD9vjQNcuFC|tLqNG2 z05PR^n!S)yp+;l#P988b#|c@ZqT9cUA;nYvKL%&3#efZHKR> zL<`tgexVSRjWvb+i%YLIBaotEnAWA&mGcAl^6+En4FWuQ0I2jv0STk|?GTFZWJ5D@*M&U|(}GAWtWRVo!+gr4KBrZE&iMM` zVc{qY75V*!*>-;xT7VD!udm6k56!lxBc*5*oOr(b`gJG5G9P2*cI9BiNKKhI)o|b9 zhRSsKlAZfDciVVl*#iF#(_1)v*57@Xd`pKrQ};dct(?Y^p zdg;o6Nf(DdcI(RXgI%3&a3fa^M!Grs+JcwEknT}*Yw7Nv&48NzOodC(jMe zJqD=<;81QmdG%+o%0$$2+Y1=0YB1VvwbYrWb}*->fa&UDTDiA?8R|OB7`Ly0v($y` zOIpB8m5niV`wN(*zJW)&0|d-gE6@>lpny55nqxUgz+BZHG0Pn+Pi@UJ8h5cV*zRfa zWgPx)%pbh#2aB5ipD|2pL%!+w1^9`C3Ow!iVHY@rTW0ZVUDZSIBe$7^6+A6T&|HA2 zKE&K}TL?h#M_hDU3g83$6xX78U+k728-W%(Eybg&1P4B8%L9DQuHVF@?>Rrg;@5jczP}Jo016Z@Ug?HiS%z||(-mNdUOBI;@p+ktNlo7YOF(S8`l+guuy zjE=2ubm>tgmjxwTt%M)jx5#r>p;jo_al#zDQGJU=9_sx8_iQr;zGxO@o0BPNJUk8{ zngY*PN5L}+cbsz`S&0Fi-Wdr4Ewe(Gvw~P|ne~_DmWf%7s_SV1{6UCeu6`C}JKw95 zx~v6bc7>lAe_Y4|{hH8^CiZ>Z`?B>D#T>{(FHtk=WIPBYMn928hmnjPVz#kj(XNyq zT}Ua%nUxS_%|$}hXx$XN95Tuwqk1A6tucCDg9Xog2v8O6hggM>y<-1hTxxBm#-q4ueM{zLt^ixj+?j^=8Nz zCNho@8F0+1dD>@#R`#Pr=ZlcU?~50a^x`8T`?o>JH9Ja!6kCG-=IV~)>aEdHtnoPN z4v^T3z%}cz8#k*YSm)9PRg5vZ)atyeLS@h_;d zdK{{}j-)ZH@;(@;LKi$zW#})o0Z$Hb%7Fjo>TghMz&ljt0a5N;R36Srf7e1V>=2n= zEKG(z>86gz>tBPJZ;m@MHVCqixn_L50mg{|)|ZU=D}GG+XCTOoL!*Fqb{D&Or{R+3InIu}E@)S#d1V7*B5g&(d9SZD4GW zUetunejGDp=*K;v@OKE%IE%-BbM-M3psVQeox=e92y_YT^PR(4!Mpo4jJM_ihw;{d zK?7a?bP!gIG(Y}@HWUQa+o>02Q_Ua&TkoM)a2}1uW}Y__*znCq8Xld)hFd^z(C}z^ zjsGOzpy3m8*zmQ$X%5uqXl%JOcAVJ;4P-J_ZgP!Yl>4_vJKa4Ju780Q+JfT2qH)1d zi^c`PqA|3hE%ccos$u3qwJRsq+hm5Q_TmxMW{7HZs*w_6XXfa*7HB$4G;NnrZ=y?b z7_mpOtBgSWGw0{@hxpEqA#FMecK!#L#bAQiY%Ma33CRC@EG$QMA#xV{XHHkj|68Aj zUW*WBt~kojp-J_7`zC-95F9eC1ZHVgB% zMc{HB!$(}M66UxR1?wH4Hg5b+ugkW1w51hw{a}C3SiMJP^uZKF>AGmn5L&VLo+`nDVmB_ZnV#ns1mb zP_G<$HJdqq-Zbxo2AzmyzSWw%A4gd=vXpF>*fEg#6FG)&nMGK`W&n>~(FXWWa|FMJ z(Hvm?K+PBoVFTWN#C47Jc2K)MuQ)Q2Y@EtU^&8jspRs{sALyMXCgnX4WyMLBIy2MWOwPOg!NQpw>XTwPILP zTAN{=#=>mvZe$Ox&ydz$MoQO4DEhb7WT!A_5grvlO$>TQh+>U&3Lhsg!nPntw$4Rb zAEeDd+PymMY}ZI{LK;KrvyygHNImImy6D8l#|}i=hXKbVr6lu0S-``wVM5K@QKJ+%SXFG1)C0I?G5p=k2r+W=V5_E_UYi*zn~LB; zES~0sxaWL@SR%VC*CXEopF9DA8LI3l5Iz-G7}8WO{I2WSNWN|nJ38EQD;S{8;XqhS zmk>ur0%)gDb5xfQSB9Dr;yQyd#&Em;Fc?M(b6{vVi(QB`evy3V*Y~Q*8<3T`7{<8|3>PMtC6rz5L+Q{w ztVxJHJZs3d`5i(1y%c&qM}F}D#SI((&DA5O)(`s}o9iII+1}{?NGs&MdZg&@@Dy|P zjnnIkzA8m;M$rNLF%eLbd2av*9`T0M{06vYe0Su(X;Z;CR)w10O@V7|UW^@2EOBeQ zO^=yHEFSWfO%J)3SUluy`~PC^&Ew=csx#2)>Cs3U$+9KyMiwJkvSnKuX-11>TawkY zX-1l*)!n1THoofV?wM(8rn}YMv&a}5yn%@!7#u=CAhRzq#OwqN*kFuVLx>ZI@#7I< z9)u7F0*@u|!u!5cr*7ZAGcx4mz4yoaz5APV_omrL*u82-dwlz*!6 z&8TlRhB5x!Ai{s&_;!TT3}1I1!vE0tUWDJu@Tn^i{&wSEA^cAazZ>0-Jl)7wa;-iC zVXpI$?=*fC>HLmF{AFh&{7mDg5WXE@EBL>=fUhcj5jKtHBz~_thKzjYKqR_=^XjuK zSR~16;ot#G?Kj= zUScBPvlQywgUr8_%yDEhJ)9{wAnq)*g_FS+CGXvV6r$cCDHe6Sp$@5FxDWYmLB4*; zXR*Ffv5tnZCOCk9hTPYF3^yOd4cj}tfecsu$U4pv)NKya?C=C`n(&JZF8B!WT)hKv zKLUxa?!ry;GG?Pn@)T}_2a^lF!)#PZHXv2zYmC`sT7Mfiz4%2AEohj~Y_z;ewwnbT z?E$}Y*vbo9m~A!UZfEL?jz%C1adSPQhq?P<)Smc2A)qMUqA94lYDW|#q@j?ag<)SYupqzz~4t4#S?20 zCX7}gnjmxNIndnrg?&<04z_0?)yll_)oORUp`a%p}HriU6Yg+8)F?VpusnZHe)} zwxFXM$$U$jTu0-`969;sqU-3=CU*2aXlUP_t&)>c>IsDHy1J~19e^csiDRGBv96OGxglmsWRIuZ% zNMXnCRs`%gN&1tcmJ8}S{_7TWe2QwsCcop)A#>#9`;NPgZ<3CmL__;T=ibyrsrpHV z`O-Em`E7(PA=-oxzhU?$ppUdS5!c4$ju2af5EBfGPQSH@I{j-HmgQu76PJ@8GAzr- zRZUzz7Ow!|DtMASvZIMQ|3-#o+kCaOd_TgLkkzKop$8)CUWyx$bw`>WEJ5s0*1ZcE zMbN95u`hMV_b#aU$k+N-kLJ;PZAZRH+VrZ|3WkGFg<$^MXp?S+>%^u1fqFR zR5Ilm zCxq?bf2ipsS}Z%%u{*$3Wjg|vYE=JMA(`{*9gg0hHQ(NZusq>oA`c3%{hp0A72%TFz0g-VLJrd7E(~X ziecF>Y!_3{2N`~268W!MNZd~&tn*K5rrWC>0z7+(7WiuV8OZD=7S43Hg9Xcc`NQbRRVMh-t0(O+EaD7K->`KP>arXW*7P`p8en)RZ z=E%wSPP>jiEFFEp`3T>~IcswcF)VY|hVMl<{%fozkq-$WKF{z73Gv~D#PutNg%BSR zLR@))BgDs~=3@w3LOi?h7PO$p4gSR_%)xK7rcBbI%|^*qZaealA@)g}wc?40MAbrv zn=~^;@pYPHRqz>zSjfU6O|$jL9F z#MLoGy&jFadH^>c=gkq^d>c0%%=Ha_7)Y`{SmPpt&5mTm1|8{yBiW#wPyPmF;|oET zNW7UO+V}!Tq65t&(Lsh~$|RaeqE{kpNt6=IUq;xHsMvfxYLI1&BszeK9EnyUfpJ+I zM-r_^6sOE>5)~xTHAo?eUaJU5BFepaNYs1X9yI)Yeiuo}$jMjT;=1@g>EZ>b-g3c1 z(#7oz3m3d!y67=1UHpJ_k**N7i+?4U>9=mX_(U@s;)}Pwh`jb-`GoXpfS)jmyjV_?w>`8EnQm>SlDSQc z&@XAG5jrh);KWUr7Ifq+{A?<74*>sf;T4n(#o z+Qe6ph4aZ=y9fU^BeSN!q`Cnye+4m~xCS>A$US%AhVrdwD->J}i()46S|o5PnBD|> z7x|h$J}JaSPTu$uH$Go$rh&b`#j*3>2s_`*u(0ztWPD!7u(0#r3Oj!hVav|n6wLpM zux00esb}XXDhjjnc{VP{&YLA_K6dU>1kc0H@@UTl@`B1ZefY+wU-6si#DU#!n0%t`Jx^X1efW#FANlOhmwfMuz4yQS?+;|Y+%$Ii<>%bp z{PD|ntbRf3?r}%Z%(I!l~HSG%@0Cg699TdvlwFF-1R~MR*){cdC*$wiYtTQu^+m9lX&~&#M z`#IR?+`h(dBFdgBEPoicXVR7Mhk(&vwIJ`&i_6jFx|_6Dk!QUB@rN@)V6m zE_^8x*)`jf@y~8UbYo<5ee|*Q==S-q6bJVGOrq$uZkOYyFkz!Zkry%gA6Y^E=TMHK zzbr6GtNSeMowS zdfn%lEZrFAr{Ee6H$2T4s(|u_29tjwloxrlD8on+!3W@Tkd-^HwQcRLuec4v;YLFTPYi3>9g$~K95p1FA(|JS{Qh-fIb zO(R{F-he1`Y&GgxIV>e<8V-~kUwRpm5)m4TYr|-ZjsGPU&y~pt&8~qo8RuhrIzWl1 z8dxQbm^NLSUF!wAVvb#eUN!ukS%;3q~^}HA@|u0TodQyUbh$HzBa!zf%g$aBUG{=y!{;xLoCQhKaGr@SyJpF?OZv_x zezRoBZlpuI)myZ50kSM|S(?s{ELp-p1o;=9;TPTk8MtVhA(q8w0t+Zj!0?iDBbQys z>`NC&`Waf~0wyjy*IafXq+le{cQ*5!wHkRgq4@GkCG(22Bhh6`7NEujOvaa}q`4@| z8qWy?!K3FQ$d)n{!SkdnTPtPH52T{(1?Lm9pL$^p6*gD3tZ?}C(MYFP`Yn>+#aa$s zWu2=U1N3>}dbD=s8SueYe9VNZS1S>vS!+lh+xbfxU6Ta$+Vd?g$+k`igBmXNGfDhq zemA7d`dV}F*i)cdl)R!A#2e2@c#gn^R#eInWw1q%Y+T@vEA&ZCUrCvlTZhLHKL$y(5B2(1vdBeB~W@|HTFO)0<G0-oq!0($Uq@_|}5X!t?&b;yST$kE`q zwjan@*8vh5+BI5kESZxvw9Jsw4lZB^hXaLy>mXZ}hzy_4ma)%=TxRTSf~{uS5!OVE z*DpZ{9FbaLG3iEIyAu3Gwu4N#NolW*^=h5$JA0>a%uzJMq?e#=BSgzWc=#6;AwFB{ z$;v3SK5aZk?z#(iLWGUhdSfHTf)T_pUaRmj6e0G!9|g{{Q8x#pT*Hp}kuu&k=R~W~ znTJR=VKNxOqQ(@$1<^rX752)GxEm|;H&H)l!I0Ro$PFqo?72%y@bY>Hqleo-?u zdx|$$ZW&Lo)x`tKUSPJZDD**=#G$y#*#u8kC-`pOou^9+R_J}z|0DX(d2*@dj#ee^@%y59f zmPysh9H^D?2bl#~I|)I!89!hr*eUca)A8 zes@P47aGiQfwn9B?_ba%*c1W?l6mOENr4e2P}U`YU}P}@SFC>Ai4c=_=_!Y~iGtt~ zt6?HduE3BjM?|A3Jw9`acVxJ^LuIG<0RmQv5hi$n+{Ou9vHGU47HJA^w4QI&>Y1-$ zwk8oKcC2OMueUW3*b%H7;IkxEL=4NY`3Fw%?n;|Lz+yH5H~v-EKwIB10V|S*yBedW zS|cEbfw>w?n?I9WTuA!OrSns@{{KHp=kL|(nUBtk(0;HH0r>@RCe~}l7 z9;m-@{wY^cfa4bmUm^{e{EHP~(ws%ehBcTfhu6OX1nt3^4ssLF*|xsXKSqh?@I!sB z?Dui=FA|k>QAjom1&trYiY?|t4zq3Oug~%u$~U{{je6 zL@s*j{vpDyL7vNOr>+3lZEqb0Lh_OF?W1z*OJ9W0Xr>+@cvNnEQX{0PiCXGm#=7g( zxS?Pt{3Lz>Re>Bxfrp9-m?Mx%*~di;sRXTZdyt^r#u8j_V+lO`Fc^ynSy9wX&-z@_ zgb4N#tObVS-J=qM&*+>yBB5Ls=u0&THG(qJ__03#axu*6@GcOuXijWh@ej8BoKth=5CXHfhS{>X9( z!7nx1Wg{f7lMaOc8`9DLTcf9V#}Z6&C2b1J@cKS}Kf(_^BVd7mGV%zbzH3tnZ0axp z+ki3zwp(=^N*dU)b<}7yaJoC?2x8M5O>7#9_!mpbxVz%AGP%-{;tJQTSwx_9e|6C* zR~Yyaa-~r>Law+?^DC~E|MdmI@(2aWBNQl)(0t|B)sMzJ zsU3bs7gty5?|`mJnl-)h6mPiSMh^&Va}h6<;~)KYVNBp8aZ&WtWxl`!V-kfSauM{) ztuF((0#hm@m0+LTrU-0CA2Y}OB1w%Ctd-kg0@57C32bqHo;D(ib=tY;YHu`f7xFv7 zJT3T92oVw^WeH)g+_#+~3^fNa!CtYM*ex*DU9jgM>HvXF^_Q@vh*}}3vR@pO+Z2J# z==b?NL~&6Q79TwW+dfGnIN?!XJmT5OV>3=qthJ@ zSOSY_xK`XJRTEMd;b+-{ceYtU_F$f^_>nw>*Wich2nOZ$FhRn`64>ev6R=8_t5tm% zF><-8{gt0JLw~5P{4NI@cY){+u5mS4+>An}CplBsRL}Uh>`21_|G0ni(Q7g=DQpXW{2N@-lLFzaU+Qe2<*roAqY(J2PH!t4=t0Z zzy|g(%izosm<|v;D7QYL5t0pS#3WojmhWoC60TT1L)JohL4RGpC1hGUA?3UX&fi3PcEn?gb98#>-GB}A!%Sb-U(7bz4 zLQKPre|6xFj7dliKtl;`l-q*@N98t7VCz3f@F0FH2O!rX{QvI`2+M58kL*OaQ|>pP zBBcCeJmHNRPxuCnCwve;v={&VizpFAkd<4O_piVNVJZi?-nbDEOSZT#sGE?VSZe~p zVh9R|vygrserN!}QMpYKSY&=nIUFtcAtS*Cxg92;TtO_sQMvU8n++ffktl@B%>f{^ z1Zq1)7^(^}!Nti+C%;#e3v4y2Bwz!v2_jH2hC8{=!T*)`AtM1B0QMx9Y;LyH8;k#PHQ_&-W=UOZBuVY4V$(<;+r!{6u>5xX+)QK(IShns z9^(mZV^RbKjV82|PT{WZLJt_`*#u}yU`HoKU@0CaV2|fg{C`v|!O{+IZ9EVu7AUlg zhA5JT6~}#kWCl(Ow3onItI7hIxxw5&4d7n^adQ(QL#i%I0}%mJ>$|uNF+_=`5Rkf< zdIT1ekPabP4_g3{ksu%}EIY;BAO*G*9M5`bWg8G4b28X`0_C8_6NZ|D7!$=0%^~0f zo=ZZT;Xp7$y`Z%j62T1hqeSwc3Ia9)lqEQ9V+kxP`jTt~qAswh1h$Nj(`NL^xe}?A zG(b)eAm?@)OJIxpk_<7jxY;S>+GHgev$8!l&9$sv%CY=<{77oTpzKa*JfW?YFU*=} z*7-d^YEY!JV1V&LBHaqk6oJj?qd5mrBnAjUKvqzZ-fm+FY;m6ub45Cl)_3;#L^>-c z5eP%gL5$k=2MzK&{<4NOwn62e#wZwp)}u+wKDd zwuQq4x8Vl?LSS1sOz;L9OJLjL56@CW{lC{1HsI^h7QX>*xM1xk8^{%iTNI81@72hY za;c=tA3KmIk$3)avQ4W)N>RpTjqqmt7MN>i@fjlC79_ZnLEe&UG?lj;j0HwgU4@#; zx>-|$x%L!*Tzl|8fggHDz`~fIENI*03$2}qVn-o6aAd+eRt6&-LcAlx+BCN zs4%OL9L9@6f)|w@UguaK%QtUbdvDZuH!+?Hg&Abo^YCL^UB7WFX7_IZeiJ`ej`7p@ z&Ej_pes|&Lu5aV!Y5bgh(Z$m=_$YplJMF_#|6Z`|r#y|I0B+qUCdHqPV=TiS1|OTJMN z+&G!ejOPnE^FKyZIZ^o|=}{?Wd{QczM=GU1vhW`omtqCv`S0OMm-3rR6Y1(`u{`-l zmJD`bN88og(wjzSCh{X%8f;OnVyu+MI)@Ue?!$8XjTS3Ob6RS<{y?NzGTe4&Z}X6{J3lF#_5Smd+iX+MZc zX7c6SM6SZ3aGc9d=%^F?O8w>wQ^!>4@Yf%uePt8{P!rCOxuujp->GV$>mDr;$$uFacQjh9z zA$GJtckSU!IbAB{NG7P?6m%HoEeK)TU#?CFzk5o#Wr!+Hdih)~w_|gATbr%I@fx~U z9VJnLhlEI%Y&uj=G#tC`)sgkljjat0kk2maX%lIQp3$-^9RG$$q#+W>_x?!a+|><@ zftasEA}#CM$8R`*ul3dN{WD@O8@qASj`c%z@xNny{PO71mO8YrYluW&e_KoRr;++* zootAlTi4EaHiX&}&hRl{x*&4pB?fO$Zra(jDZ2RZC3RKZ6^)!xh#63<+986 z07;P8-#RZ6UD6VrYQg_iM?;Cvofo+@dP~ctYZ@D(uPBVd`~N?ex8VMsLW|t*+_OGb zhwVN*5pY^;@4O(=vNpQx@Y*Zt$~+#8v| zy9c9-TjJMkz9jnA+jd5O5ZSqI(`RHx?1`zpbpt`Dl z7=FGe5^ayvb^j}iBhhnPqsLmK=e9(TwM3V-Zj%nT;FWf*M>buv`N3WLU$|@6kzIEl z0T_>7e#b6U@mII74L?}0Q||ZS{@DdP_qX+LYix`@CTWi?098j{zkB9`8?IcpVe_85 z+BUAcBD%PBS4_|!ZrZx>US$6Li7E=ev#AC5-#O8W``0wJpedU+zi{>HHPK((c1Nv- zrk!>C_k$&vr^{M)Z2^^5U-GG2>sb4~rAS=d5}o1yP3^mx<#)kEP9G2N29-7xbwR0*KB@ZceMBxL@a1pw4$y(za_S% zJJ&>S*$H0S6-0N}Ds*Po_~tdy#dp+E|HI2rMw{8XNqW-0ant6{-dmUJJIl1E``L{( zn;)+4>%(V8qDv#uYD){M*TDm>J!>x6wWi5^T^-bqQ&aSKB>*qwI zhnOlYYjvT~BtS}*DN^nT2rmgtZ1 z_4nwnZfn`pwmUYxdrx$EYqZ#MN%Vop;R8Z|)~4Oj*v{zZOl$N9x3%sX%g;t%7pZ5T zuZ3zmA+=2u3u7(v4=V>etz%v?74!NAdxi|x6pxFiSAtG%X41GDok)*W%t$VsDHgg0 zV)??D=}k}cOcgR_@8EDtXUo>st6R6UPz~O^t^Mkj^;8(rmE7emH^dSHn{rg0v$?G3 z$|L1;Av4}mhH_KM7Yi-z?N?oW)m1NQ**KXgP3^)eSk29DoZNzNb$n`a#8?Na>ns{%l-`gAS8}edZv3ROGVR}oG)h0Ug%*S$Ia_5nCdt-T3L_!oPk!>(Zj}zret~#c?V+&Zy?s$ z*X13G?eB)Odp~z_;E`1KUUZd85*lYqbL$3jny%bL`b2*`*`KadQ~AkUvYMVOna-(7 zwK$n8_jQ^6Ql&3Dk?Sl@p~2{8cOgA8k=x$`o-@*z@~k(SA1#_h%IoZn4GwnqdtE~V zvA#hs(H-kgb?^7Ox_kNtyNy%6WF#;yAku`8dy)+7>#R^kvFpo29re{s?Djg2q`H%)fYHlL6f3!`p|0C+K;v|FhshN(hiWe#|L#ydWhp1@$5+;pzsPn|qjqFl^?CpmjOYH7K`@u}PtmAj$6)6=Bf}GLtO(0)8*cD0ZdRfBZ=8WGTGOa zuV7nvLPk%dPi|U;4;k6h_S=!H^^sibh!szHslI{kgqQ42rTPZ*=z;Gd(gV0G=bJ^r%u~;3?Wjj0f8z}nNBbDFgFVEyLytHFv zJ0@G3qfXPQrRPphQ(fq8( zs?DLko<6TLmFTx*C3ooT1P_5yNtyS82NN8%?9ZKGrR7QqlXhZ);==45E?W~8Gv*4LLNFiuHF6rd+osi{%sXViDW^IWbjJ0(+9Z*zyb}Q~s8mp%9qC=sN+> z2f3V_>Ca^=(!86|5LhnA*fp+}7m)FzT z**?z_=qGM@zQnCUjii+kcD~J7Onpq-O{s`!txJ{Mq~Yv8p|-x z)M^x6l%>f~<5{mfRVZ)`wd-pocbqCyJQ=sxt2Q2tRQ$5 z5;C9BiBv5@)(SfSEx7^`u#Wk?lIV}r$YN9hA}S(mktXj$;v^<9GcIstOKq8j6%Ze^u#_u7R8xp@45?$- zCRHeo>qMPZh@|P9{37Wfy^3g!>c2KeHWyHtpp&O3lGU=6r5Gep^CqXTf#59nM3z&h zva8dGe{&4H28F{m8dF%7V8}#hEmVOkGJ$nD=VDFDS!D{E-8AM!U->wcXao6|vt-3Y zPIh8d5v8b9*t$bz1W}VyGvi)ybd>XCtXzZ)&g4tj1;{qRE<5Br3MH(-%2=849EM+L zYoNDfaucc$nCy6_#KyRVtBeVNxtN*e6iEtA4yXo7j?ob?Fjbb#>6c5V&W{}P%Cn;r z)yZ_J-BhMVxDRA2%t+5nCs1J3>np^Q6p^MQCP~GqDi?6D+DIpMCpJ^h#8d_69b?c5 zNx^ZbO(r*sxhYycjzUVF+ca=RDnVgFd9PyS5BNTFEL$v=kv%i*Sy_M;7z#Vb95k|n zZi$ZxRK%c759r6162KSqh84>kC z(sL2OI)}+46>;EX1gVA_s)$*T`w&%4Y*BK@DLlNuQc>Hc3w3JqYO-Vrf`P%%mqmR+ zd77jR%-E1ErhaW587r5l7*a@A#?!}gwQU`wkAa#2L5dv?u+f07VglmGP;_A@#$94x ztfL?MF?0u1ofT0B#+SXvh^{Az++?wuJA?|br>)-NO(G2CNv9Y!=5g7A7N#a9Hd_gV zk*9uzDUEGyHpi)L&_AJNWdcU}<1%Adqln51UUCRU76%!b@ncSDn<#?qtg_=lah(MB zn!%yLZnuZZlx8NqYH`ePb4}v=;zp-leHi+*NM*_?5NE6i-WbQ&Sdk;r$5)tVy@_;r zELX3lQMnQ+i%Bbc1`x{jc{H7eLOoS*vwUwKIvj(9g=$sKLRh$6Tw->hZ(zvIb6@sB zUa~FNLUDUiM*FbEwCmL5SOKe)M?G=}RyPoXBWVgC6xG_&czebhouSaRy>R+ckCkPp z7S!kIlCC`@fX^j%A+ow?pB|U5p zz^q|0GBRd23|Q65-1m(1aoYt^1AVZVoT^ZYnx6DTB^R5RgoN-gHT=mdj7V9_RZf;J ze*;VFK%LA7xnYFDuAIAM8Hre?N`s6wiHI%^(U5@VB+@20@2w%k9N@Cv9?xT8^Exr$ z)m%+^2S1yk9?+Hxga^gCV!O$H>QCBgVD}nVMMX8UHrzRd`;Qezj2o5gUFqEYyies3|#~|cjR)9EioYol|@D3&V zFznT-@<@?O7nDA1BC!jmNdyYUXnt%SF6>Sv``Wz0;r@Qz!^k>hmk-O!BbkDi1~-UQ zQi9+hj~)$Tcfrgt;8^Zn#MXA2N~B9TbcOy=PK$)*)P%JO#XOmC)Iekupny^RnuYZ7 z%{U{20stRU*gMrAQ7!srPyQD+Qn?=25aK(~iw zK$ahDg4s3hwp6#U3du3dPh=APy*R=n@PKXzgB(^aSz?DWRjmI0ZbgP_Aa>ZJ zQMK$!=y)dC-RX7q>~+Cd=YUveOpHxRS39OgW26Jm+95iz_E1BV0n)W8jSUDnaSq|_ z&P!P9c~ein|6|!LhQ_576|?87V%zhkZhzj?tDZM?$MdFMZQ!Ls=?sIL7#EE*=E8yr zYbG2w@aOy;{wJ7|=S*B%~MIHN=$#y1#p@#&B4H6=&@SnjaQin52c z+V$F+BV={q%4lW!=u`#v74Z(R+-;>?2PfztR5Y0xK{bySCM-4BNKb(|PgpysZ;;bX zfNVcJ2w5n>h6@NMFKld1V(8pp1-g`_5`BANfww0Qo3Ys?tB;(34FWRH>G4?ht5$7x zYjjr<+BpT?WMvFCc9{C`5wHUujO<-d-}=GU6P_FobmhzQ4DR0kp$_VNLot};TvKp9 zfO*uF;3!wB_}rk?Ik4t))2Eg*H+x4ilbDiLla#%WZhFRNWQT96)3DGJFAS@nSie<>`zHd5TZ-N=@PGJ)6r_P^im=3R!KMiuv9RrnO*uDNqUu_$ z2$fNNcPu{CKTsLt5|qWxwSv7OjxKW8L6+c)gjHTO+P3Xb3}8pHrgJ3)b+zO{$D%k9 zfQ~7)9%sf(^lUb@`?kP+I~3?KuaqswDp8X4Lv=-WsssL=5L3>a!;GF{875eoJ8Cvp zXT1>98T*W#D5wl-iTaO_XZMFSI~n3e;Nm4#45nwsX`&Qmol5-nt>`i!Mu%HG!vhpA zHl3T_h8a)phYDS`CVs0RTe}o3?s-w5k7H{A7AqBCm#}+x9t4QCA2_(sY3nP_X&8rb z0tM}I%-W%daHKK=^Oe})$ZKMRDdc8k9XF|D=VtzEgaUc({=y$;CteO>8_GtqH+1OaF3|<9$>CR&s8-E!`igliZ zLDXi;IAjQjWH6?osKmG&H`7I&WN>KmI1`#R&;f=9yJCqWzN#Rzh?B%pQi4!vW!uid z&9skG=#lGr?jZ(wH5}4-2~CDnhAvzzdDZf4aLD2m3H}~L&R#sQ5k$5e{)(J&Cl#53 ziNXKWo&#G`1r%g^ATmR9#SRfs-atQuK=(nYAnv4!ivInxCV4v6t z&#pMK!B28e+am&yuy$}0?K+YJ|hZ7c{T%2Vr3O)iLIhPa>g}6qbbM2qd~!* z@zv?-m9$8DZnLb2#tgujzcoK%Q^TzaO{Q4YQ8^VjlFRPtxbw%6Exi{UEvM}I%+p0D zaJk*;9*D#I)jgO>98oi+n!11tlUodmTs5Uf@u5RJxs}6XFENN0rpn>~`-jf6c}{0y z@jla?E)^&C=T2au;7K-(vUYt6wgg@SU4k!U9U^~y> z_UGI=EkDZEL##gjejgOH^n>uSCVh`QO3O>!*=S@Ea<+4=fyo|Uu&v552>-XqeY^bM zBLBC_|84SryZpb((BxOe@hz;iZem%@3*Mv|$VwhW<-y9bxk{JI`COTnIE*#jG*YuV z%WMY&r`hAyeBmAL8%TK_!#$qa3j%lHAdF0nqS)z(`8%8otEI5H1{=F$Q|fWUJ_(aT9sKO*T^ww-J@7WV0)*9ZaSnQ`=cU84Qi0Z z@|YFFc0!(0w;gtDWz8&hAXL?}URLO!3Vlu! z7}wd#%s7qOSje&0oGXL^d&)MUFIGG`cyP0rCpy*=AdLbmPQz5L?J_*+gjEOjdYsi` zk)o4QoVvv{ypXY82>)P`6mS+r<`u!J1Kb%uG(bgyVro*(d?mGJz+Lkvm zZuiz|h;t)9oJe#JraV3NfYB{U4-W2UskO<8<0LFn)y#Mn7Itd~#yTN_$u;i~mG?xC z2Zs&OT)dGHjn*>BKwjYFjJMYTWDP{Vh7o5ahg%hU#y9Jhm4n$8e5tMtN>LQ5I|j(>ji} zAWm@j2uU`RNB3jkt3p9fMAbw`!w9y0Vl9H!dAd0bM}TdX_(LN%(+f~NEi_aWbyd!? z&>vmFvM^@H6MX|g&6TW;?PIw(o1f%Spy!_Huwv2;X?w4;2T-QsG*mj|dao9H?5K37 zim7QPk6UAi-NjdeI<2}=fV+#95OP}Hl^RIM$+MMxAR81g90<+li4{N8)ggzm&{4<; zqCM6W!ck~C6eJ>@t$d?#gXU={;F)7oFEFy=n}oLVJWS0cu{gJsSsXC>;sg#G^VvNx z0%`-672W!2(ku&IA5z13;*tXOB|*P4C6#F2I0EcW4kr$FA2G0pviV8zfdgL$eBkW7 zpgA`$q6cdfwm!NLkL1*4P27$^D$XCOF4$(-<%nbHxDZ+zs*yv`G#qo0Hz7xer(-VB zT{q*I8*X4mPs@Xn?fK1-ZCebE`fzpvA32`&QLOW1PR#MX>qXb_K%DB7cVM`Cn4YBY zHqK1sA#DcwIxSD&KMv+QX|#rv6f2`|Dc%*I+RI@VJc8bu+2m+1trK=oIp{Y?cxM9 z)!hl@!fnVQ|Ezuh(JXFZqDl}Skfmmaj^XUwI^t5yitz&`6g(~lZI0)Evef}!a+72A zD6oS_mN{-WbPW!9fz)}!iSdz+-DOdp3uig~$$UH|gRbt{?{HsiZ6|{zegk z0Bu5t>{*Ky3UN64VxQ5EVPIb>r9Ae4n8}=?ri8{hEk-o$iZ$O9GDX?aL$0GByt3gX zm>f*Z!+NRi{_aj5e#?0>YX~@pxzUqp1`j~&(+4pQ$WC)fVFF5>Z%?6EPE+1Pg@B_3 zTEl&rGn0agJeYN%bXs>5u!9h)1dU#n)igYp`EZ=+&6e3$9;1s;oVzK(%568E_LztZ zpjFCw7=&i{yx=@{4Sb@wiFI2AP^C{S4>jC<1t7yg3!L$w#jpm^RLGVdJ(&iQ>Xjfz za%?HQ0j;u=Iy@8yi_s2)F*)vNHq_JOB{~yc48EB>{SphwTnWKR-)_&o<|bO12*Ehd zz`3;f1cpo7@;v3X&a;B(x*b0_1cQ2QMikK5l5k)BCali8WNz!_=*x7|oNpB=S){Q_ zSXnZj$D<0^6N*0rw`p@Rz`QyLuT*=gF5a0Okl_kspqv!fcKBohDi&6O#SVjBGB`9; zQ;xNL$Yu%%g2!N1pO%G9#DwHb&35Hxsk_xV@|?z=jm?xDeY#!vhae)+ye>T8*)4~S zvcVEsc!%I<&@F*Vu+Ku_nU79fJ2~i%`8s0BzD|1t zubV#6Nac}Lw~CEIn27v2?UAXl5&m7J?%2T{I@C${s^-QzpjE)vWM-0%y5ficsfsO( zIM)&X6!bhfGfv5oF%3!R1$8$$CBbYnRrs4gKv?lgAk|O1COi^sKoY z4lcUY5#eTpTg2U}CPlcvpnY)&#sXb&d+G3VEFO3w0SpKSZ3vvAZ7}qq0?Y{IQP}A0 zfQSgS+MW)Un2K-!F6wOsE*EkJVFje@%0-4+s#E*KXZT?CL!@}CSnoz0k4*B3aISgc ze5XsZh_}FF2wozNb(T+HP>9zU5gQJB0A9&d;rGXCrPdM5Z#p}I@TMQk+6BM$44l{K z`~p^(!PD#c(RT4JsarT>!>L~EYx+9HkKB`!17E*jBY5;eH3qV1%o3)4?Qp6^cMR(i zmJ>V}bTHOmJ4E5^nsekXdr#WX?Mh5GEa6DcS4wcMBxi_rKO&p7pbdq4G;qD0zA5Xm z*>NJl9U}Qk>};~BB1L>_VP9&%qdjkQ6pKHI2Fp9tON=`Y)(K@_ZI_d{wHe?uFj!Hj z(PYNqZh?aX?EmoC1y<{n+d`_Ze~p!d$;IRfRf6pyhnIp54|cC6t~dJ7m7EY-A%U$b zO_Vr8?(W?0_4XZb6?MyDtZrtLbTFSQtM?DV1ZdHV{l)czrZAiqsM9EXHcEW3A#2ai zx?*@5PE1B~5hkJM<9sSX1(pxV40Ipv>l`x2DJjHckg|_e=}t{UvIy&QbxH)Q;Kkju zW7wAWbseM)s#~5cu%{NDI{zwDL4F?g`i4@N#n4BgOaS;ix)6gg;s?r2o<|8b&i{UxRxZLmC4eRa8@A9B)D!m3(#D$TN@YL2f97%HZX4F zr+LO()m`!0v1c1Jl)4E_FQqOz0Cx6*X$Mspa;s#Yoe8S%wzRN1Y<{%k_^#*90jhQ= zo2gdXApl3IpTS{K2psgJ8nXVsb^99-fv)!4smK|W98w`5djYAUItx(;i<~t@Sx+b! zxB|}T+~IjNxeGOW(-R_H=915O)Xk@|xwLjs4m!&xFcuS?(1!#kPi9U)fpyPAm7&W! zCkB{wu{Kd0TV|%JAP<{hw*}`-rMjKB^1zKcP(m@W+9w5pJ>Z;YC~+*mADd?nrwerT z5${uO=Y>rnf4vx<=NR;LdAcrV%CwepPFO2tkb&!-5Au3?)t(5+EB)?m&-4R@^toed zl*)dvH21A^b?8ne-Hz0GA;aRMCym)6-dK^TVkd_Ui@2ZjRL;wcVrhfgzK~F-yR%IN{M3llk0apW{$$<*a?$Z)~DC0_~FehZ#xLoyy4br!ZVov#6c!jPzAv zg%hy#c67&i9O{Y1t!;ZcIE)MvrJX95fIhz}tB2ICsQ3U70c8S7Lj<@5; zgODh#&R#rNmJNshgoZVobMh0H2p#L+5Hl8bDC|_&r4Z`3_(Ak2+^euxVV}Z%3ilgW z0pR{J1urf7oz0yh0SU8hZ(tYF2hKIeMJaP$v#^rYKl$s~XHM7;Ylo_e=15HedJK5V zB>S$1M+WB#_Q3NkRJQv4)RtwXrqZSsdRiiq{)w+_cG6jRh~g{}O4XQ{a>Hdjl!u#y zjPaIsjvx-5h4zlSVET>0PsHo+AL9gzYt()`>}tL0`?0BqjMC>6aK6OHh@JeiidS%& z(7iUv$Lhc-bN4ez%%6fa4O@?H=jkB_cr!)W2w(#Mr$Ve)LDR1PtU8a{oFC9zN&)#-@$fhm?J;5s5lv1Waid(R>C7UBWLK0uVb8PVX;78oGx+XJ!ynNUTNVPmHFQue1qcpqmm9mlB7 z$X*7jSFYUY+)PHS{l>bpnJIX$&0y(uN3Pn$xq^hQS-w$6EQr;#v#R;)i)`a9elGre z$S0e}!o{PitW$%epGo(8j5Ge%BCLyzs)(Y_fzu#c`IM|PX9jd%_-Vyejjv515L;*{ zDjm(|R)7_XeBN33YoIe}eOpEHKz>@kAc!6NlqfgZP|pKiA9ylYbzxcmoGL5DF< zvr01r7vM=4ICTe!Qw6w6^AT11SbcDXQzNx~kf^WTDn@yFXaGL%at0}3<$xTe8&}BFVVr?IV6$bkydC1W@pT&B*HyeFTg=6@5d))E}Pul4)Xj77Lq(b}40eY4q!q-6Iw553>6$(Fh9VG4 z4dJu~nGf5C}U!gCLza{zh3fKzOm&K#o% zX8XVu=%U}tZVwvm0f9p)2{cXF=1{6b|(_Q0wEyEoh` zowL$hc19(7++YPMJbT?U{-TCiX8@UfwWn#V0bV>}=VHXJ)>toEC;|{~*v^m1VG<-1 z&--bm>g+rmJd1XRKGp;xqa-8j23L0JVt1evP_@qlT@3w~`ium<Qf&$j1&qxUqb(V8KQE_KmUvzq%&DMHd@h0mmq7wCQ+b^i(${Lx$+K= zo>*sU2nT$ywh1ra!gp5`@t^?qy7DF^%tj%!x{`8ePJUjD7CNm<;6X}$k zdWzh@ai*{sPw?DRpjvw`%mc|`_fDF*+yQ=bPd`y(;v*DR@1X*f#ikf9)(|_rldOD) zErk~(JXTqN(oA+ly$P_K@dXe(I*qv}`R!wmVq_cO&LaF)qS7!`LO6IjDz-G?3G~GsesON zhepg%V!xBIz~;OcBEkyVe|S!F3c z!HHvWzQ~o*f=+#P62-mZ1V<@FB9*rBAG`v&+R`)6M`q1;sl)IG<(OeS+|!r(=(U$G@rv^{ky;e9VS0Jr;kA-VdAa%Td8jpw7KpW$u2k;U6S2j$gCQG4tV&hN=F8cw1h z2&}a;k&5g4r#K?&jE321b=;r?>Bj47_^vGX@&?@yaC$(NLwfTCVem>4ztsanFjo5~ z5!OHrgAJY!vwqHa3SVE-Mo0gBL)ggDoIzb)T$AP4g_M$RlNgx2bR`gl%DS20{eFBX zA0rMI=o0qOkXr_?P{U>cW5?MJwU-^S4w-6pkT*F5rn=?A5gc=4qnM@T2>wLe$zW0` zIYxK}M^(OS3a^CIhI8JL9yTXj6Z(hXt_`uSXSU=Y_|#a338AKXU$B83`nl2rf*rm{ zn7DAYvE(%VQL5HD7&{1O$apv2*9Rv{KBXZ$IBPH9#su$c##vHrKm}O}OF)Q-c%ZN_o$$L;GJ)WB#)?Hm5yR+= zMYNlbV{!LpNVXQa74QQM+NPzRnqWe00cV#vEfU7& zK3|ywg!Cw9V=0J~gq|b8{1xC^+9AZmR`(3PeIi@-bk-I(0GpGNTApJ+gkhYAwXB6! zRwkStV_t~!l)Oua>m+vae5(bPCY*5x(Iw#G3WQ<_5??a-_R=NaZAa@o2>I002v|~I zn@7)5PH3#^&UH=apfgj9=5rHROtD^s-daSZpYG!UzeQ_%hXqS4C5c)3SH|!r16j+| zNRJn(@Rb2p8^Tdz9IrEX-4Tns-8hOL4jy@{o*3x8rLTaePI7p$Cw#`iCf1Zj2OH|x z`cw?3l-FPP4oNX1tA=WNuDS8xfOz`IoAx&rD;u}9Zfo7nm+N2E*0#BABe=~a-H4;J zF+56lWBoJ4E-0TDpnnb(j9GY?WjkPC)6M!^nE{QXov)kNYWga^vtYg`VpF$e90MIw zyky)W$@nZ-YKmMK5Z4D3Xmw zXCMz~E`{f_%4>0Nw$=xn`o>}V!{L~biHY}AmR%8#<{S}2uGO&g_YJ}k0dKvF;f)5| zsPd5`5D6=~tZ{Lx0AMw?ZfLdFCHSYCb|-0u|v7SMPh!FMek-|Mg4@TLjZE;9kIA8($yYt1EgDFD&N z@xb#;oXT0E-^YVN@oW!^n=J0|(&!>P9)|Jp4-;uI{K?xY=pra4eBm!cifV_0R0>?7XIBJzpi9g7B=gz#pguFAi?$))xo2 z=u%!RS1$j*;a$UcBR*b~Z+?#p@4UWs+0rxQyETZCi{FKbEn9SF!>c28@%&B<;_qTS z%e#xO*bjzTex*wU+<;$f*#&ns-W|OMWmC(}s(tH+*|utW^lqdcUbd9q&~X>k#V^V==KaJX&Zbbg~Jm_MA(Fu&#Ft}AfUVQCQm`s2&$`pNGYp`Uj)-L>HE#(SbK zC!K<2d9QuxW7%LD>7{A=!)g2u66q)OIk;@;A6qV5AL;BaenY8a+4?)1?^=BKqI(v; zyy+DS?rnT!^iR;{hPQtGD_{Q7lV5z|3y*&upIxXQ%SRFJKwFybUT{z2%cHMgAH(!p z&q8|fn@koDUoBf3>`On&#Fm}q_@s`uaY?JEZHv}H@Em>}%UbSQboau0 znqI!(6^-{sU&*$$Fj21u0g>mKB^j_u(@@iJ{)b}r#o*kYQR7Y;0LSkZV+sX%HZogL*;_6{t6|{d4#%_K34;nCoR+mmN{J){IpsRgj$Sels>vwU&;JUXOTb9 za-UYT_SfT_pHjq0ozAU-?o^_7-cyf79X{D||3s)h$NY}j^?3qMO`Hx58U?)qS|6!| z9n$3YDa)9VmIaw@e4JfL-Q#kk!(It_ki~$EYn$zxM)_~W65JXo{4j@?v$>HezCZ*j zZL7Uc(`G$w@!1$27YHWJfNka&4zU7Jb7P=Q<6CdG09t5T`BFCMyung1HsEl+6?$f? z^`O9`z7@9y{4wwa$b{uxzNpLmTlp_=$)}ePUX35~@sq{8!ugoS>oWZCRjogmkNQx! zUh0GHa`kRN1V3i&u53Ia_(u^zy^cTDH-KLd-)@Ad>$=O~>qA5k-$Vc(KMm^e5q}UL zbr**NxBk8Tif)a5)Gg-g$L)v@)>{qK%XnAsgSZdYOFe)zaF=VtNkjzk-3olv!`NN+&qu%i2;qAqfNyyK-wGfL;^X%>S(m$9`<5Y7uzimQ@STm!u69)4hM0%`<_s~?;&lzdOJe(el<|!uL!7A7zTe_izYbGs4_|xy$wAp%A`jfzR>t#mMaNeIwfUgCa$j>jt&*A$)2;VCa4(?|hzJChgTX`U2&Qg4<1NfGs0J8e> z^lb>NMA%&p-x;_G^52F4zDtnVwQoxZAHN+-+37BaZ&L{0PT+I&TZhaJ-=Pq`=T6hU zWC&j>&_2p|hwqjUzGj5yqu+E0Up9d6@&LZKh48IK*nKOQeP+G9-V(xB1-@Ctb9}GF z&$aJUA$+%D0eckb?n1I$9}nUC3Gh+o6W>Ps9KNSQ_;w<}wTXxvzMqEj?Lj8@ZR23R zpM>h&nTVJNk%9GcoL#-mXm^mWb~YKqy|%kty-mm$n?|HbqHT$vWAcAh{G2P;rll5{nR1Td<^ai;oAUwFGW1tw;ex+??oYePvT>m4!Cz2&0P-PW<&<@Jr!tQ4>CJ^i4eXGz;~lV2I%k&hVVTTXkTvt z-&hFWD}XOG557zYU*m9%U-kv?-4nw14DdZQ557A>_%;CFVdUfZQhp#=#^;?Od=Ep3 zoUeUv4dJ^h(7wR{zE3JX${b#eOO2u4=Pr&te_zvlj-KZr->;dV7n0@rQmEdCQ145T z!hRgUkNL=F-^UG$JA6xF{hSZqcSHC#9IVkf8Nl~@#fK=l8qYGO^G+ACbuskY5WW=f zl`vpz-!Ohimi8^dw~7PZGkafW%)%xl>gCcd4&@vC3uD%-cDZUeE=0Z{KR^Cp#OzsX z>*YARdN+jdl|EU&uDW{HhwwFiA!2%w$bMWOz;|5;-;>yA{L~>qK6iU<2wy)wcz+Z! zg7`R}T>B1$@O|Rb#(bO`8ND37fe^ljzJ&g2`zSvgz85Jz%5Gl8FB$V{5=1ZJ<8M5a z@BdgGF~?md&BJ_Cq4t$v_e`-ez1;2bQ2T!JW$-DOk^LRP&$aIkuKeSdM$8r$ z0A!uKxVJ$*|N0g3y%uHND-~!t|)d`_4RYd zRlA~QbtrvxEfIH7b4e)ul2H1(Q2M%1`emVX?pSJ9)Lb4)zr2=+yC`-L_3gjX@DQ!v zp9EKi@^1{~=Z>LvMa`yA`lebU?xN5z>+5q;%Vvv0bFWW#tEx-i8cN?9!oNL~zFqoL z(-&;|kNi^9#A{a+8fJa{J8Frzi$XK5Pp76_yP{@iD4m*b?TSKktuIeawsu9$o>2Op zS|aYErX!Tz5lZh0rFVtWdqU|wq4eHRIyJl66*c=p>D1I}R}`97egFD}{0fAqIEkr(&K>OujQbIRJ)=k8A_+dQ@f&~u>`}1Y609uMT4wGMMX0R zhJ%_i^9MD1hL1}9T#xKEBH`LB5BHxdXYGobbS;3pD0Xs`u$-PygJJh=G&Ne~Q23@$I3EgEL*aW7W_@qSm^P>tSa1F^l>d{V@ZW~Q-wTC*6$(p5sE-%>yMz_%#qbM5;Vq$XUnqPSVYZ)= zUaBhH0}|f%WMhHGG?d zcblJR_#z4KG292bi};oYbZ~|*35BmhnC-XowZp_i=_8s>$+*IFnOP09niY^v_l5Gm zS<@+5SD0S&9u21?yw7}E!%s=L-+VJv{)eIPZ$jbV9+dq#7b-W~Z}AVBwFvX#UV1sC z<;J>j((KkS^RWEhP&gF|XF}oQq3~Uy@M}WhH-*CQ3xz)s3cH68@r|9eRkIe(#yrfe zci!}4^tpXM>^pD-9vq$L>4aJo&aACV3sKa+R#Gwry(^dnr@FyULoiC-fmZioP38-} zFKh1CM5V!@50cb>^IB@3;}s(1@c5~?m{>nbR3^mnyUslIUMqe~U2hpsFBN78`lc{E zZ{2l%D9nY2H}D2d-i0Yu_jNF&KfgChz_Wpl07N*SONzw9t%cs^Wyuxv->CVL*aiiM zitj9w*x)VdHu|bOeHMe!!W^|H>ky-_reGp&`PF*fvNL#YiQilm@=9d= z7dn_NKq|kOez^NIZ*5{J4ljL><;4x|-A>jiS-*AfzZX651QtvB?|slp>f-cW5W%?G zM}I=k@i9}7Su9EGTzr_tj<|E|VNBSa$G(uD_EC1`sdMU)n(99f3eIr#!6nOg;F-s5 zXRd3u`f7vG+`BJXLHJ3Rn)eQRAm3sQd=QJ7IRy5_pe$a??p_x)pNkK3)*eiP`?f~7 z?#%J;Vfq}e9!8S8>ORTENH&WJwPw{GfY*1H+6RuM-hexh@AE?}oOKyIt-*Ju89px~ zPa2RCq(*Mjo(cOJhb&Rz~BwH0n=~;^dQ0)8Pfx}3P`2i*W30t1Fj{0RN7AX z=i2`_SQ~dUZ1*6AX~rfIT{g{k8iOX9<~JGhHbO-1A$*HHgKa)#&%&A?v}b^fmvV14 z22~lxOF8`e5W{cR{vq+Z30glO7;^xt4pCG0!mH-L^js zN41?fdmhvPcrNn;UPzd+{+SI~%g2o0qUk#nb}Q^xctGJz3V}lKl@wxWkT6IrkoGR( zCEW=jx&*#g;Rh7{wL*|e(*H)`(+Yo}@TUr|Wj}#$P~lO9#}v*gd_dtTg|t7h9F8Xi zeqUijgALQais>&VmkJxB zwmmBpwkT{>xKrUig@+Z6Dx`gf{kcQoYZSgk;X?{($6>xF75;<5XBGa3LN5Hww@l$m zg*z1XDC8L@^NlDhDZEYLeG1>G@I4AYrtoov-&FWLh0iJcokE_Av!0a-FH_jAaF@bf zg-L}+6;3L=Md2G1zEk0c6n<9WR~0_3koFPQ{|ki?2r`DxRJcpweuak><`k9{-mdUf z3g4*kT?#*>@G}a(tneQceqZ5#Dr{P4+p$97Duq`l+^(=g;h@6n6^<$_EBsT1Cl!8F z;bRKFrto_T|5f2H6*erg?OCSqB88VK+@dh0@TkHGg(no=rSN`*Z&vtTg&$S;n8L3q zd|KfT75+kD`(oR!8x*D$jwzf}SW$RF;q40VR`@3h?^pQe3g4{o9SXmo@EZ#M7lr?# z@PAhr!GcRZIz!<_3NKT*RbfnFQQ_+pzER;@6~0U1rxkul;omF#Cx!o}@HYw<-~fv4 zSg!D5g_kSbrZA>(K;aREIfcg+zC_`@3ja*uLkd5k@NtFTQuv(0|5Vtt)V6Dd!c_{d zP`F)Thr&UH*DIV<_y&b6mC?wL*bCZ8x)Qy ztSG!);h!jci^9KF_zi{6DEyJaUnt~;hvP)QCBh37u2Z;K;ZB9U3R4P?Dx6R_tMG1x zuTl7Jg&$VQD*T$lrxpHC;cpc#Jj=GHMd3z;*C^bpFr{!r;f%t&6yC4!Eeiiq;U^USjlyRX z{#+psAZ4B_Y*V;f;eLgO73LI{6~0>Gn-qRTVe<-$ceTP+h1V+VRXD8h?-YJd;lC;T zPle0R)^SsKrNSKwyA>uBdI~2L-mCES3g52qVTGSo_+^FPQuwUGB~Y|UrwbLXQ@B~- zwF-L_9#D9r!f}OFg)de3Dur)Q_zr~+D||%ZlM0_w_&tSZL7`^5E>?KC!fgsW6b>jn ztT3anpzys4KdSICh5sje_W>VO)js-u@0m#^nUqO@fzT5=(h{0<2oNCDkOV;ihmZsa zq>(~VR8Z^%5mZzZQBXutuplZ5hy@D>DhgJt*hN7F6*-#_Nz2|@K{oKzz z^MU#9XP33sUVH5_Gkfjq#)J3;{)ElyI{A0Rp_qd~oP~4oGF*ap;Qja*Zo^M7s-BZy z0GnYa?1Pzj4sJ|xmfMQ2;C_4`Kf%NJBmRle^1(&xyDm1zRP2knn1`i!AzptMC%M7MJ3!cqiVA>v2DRf`{>Y zJc=jq6h_D`Xj=XlY=)h%4`$*ySb*ht5nhA0;u?GupTpPi0Dgf#<0*`lFL<8F%6-jFDULH2?b83cKI{JP)U16<&sGa3gNTxA71jM^Cbo zZ#`^|ov=3!!(5z##W)Wy$EA2H-ii0(1NaC&fzRL$d>MD+TX+x;;dgifBU7C9s*New z5qsk>oQ9RS5bwvwaR=_f@9+dhHX~n5!QPmO=U@TO#*1+sK7r5R4tyDR<6C$TKgKWc zTl@)s!;|Q4?vy(k{TRT8n1Zdb19ril*dH@+1dhe=I2rS?2+Obuq@HSk9 zYwgkFBs54#ix|!&1Buufm)09()A1;w$(LeumMloO0B~ z=9r3QxB#!lTku}oh_B+i_&NTBe_>2(C*LG&iJh@OPR5xy2QS4N@OHcpAI0bJRs0lx z#6K~*4fTM{F%|pba2$^XI2$jj?3_F+<;Hx%lI~af_5gTJAtlT(gFY=Z5u2WDV42C)P$#H;aET#Jw44txVY z#BcEgc1(53)eDDW4$8Aq&GBIt&c(%eBd)}C_&9FI-FOhcz@P9WMyIj8Fa>*J29Cwa zScKKM2(QQ6a4l}aXYm!>kDp+p&Q5vSVs{*bSvVPI;#^#ccj1G$1>eEX@Cg2eF@cKdkHLnK*2Kt+6Yn<7k|SGq4&j#U;2BAHdDH z6ZhhW_znJso^DS060r%k!ycG{*%-uPoR3%Fa=ZsO;*apNEk40F9)p#K;!YlE5T!y#dDqM>X;wF3& zpT(W{3ci8+@qPRR599ZE6i?tOjOgL4cMK+CJ#384u`PDOZrB^saVU<$96T3;SctQ5 zHqOP1@G`s_m*CBK2d>8ZaRWYvPvJIv5nsc7_%42gU*LCm6n{s%r&Etn=*PO)7+YXF z?2J8e01m}5cpetwY`h4s#+z|9ZosGTMcjuU;@9{K+P$3hiNpHX64S6RX5u)^!xEg2 zm*Y~r6Cc1Qa0l+e_wg(I1zo+Ja{93mw#Du^2(xf9&cwO67?`uUu`_EzY`Z?1zwET;4OF$K8(-cE4Uv&#UJo@^bT`d9Tj4mIfmOH=ufr9%1~=kXd<75TcX%A# zgPr_4VILfZxi|%jaUL$l8*wGB!^d$4?!ou*EBpmr8BTfp*a+KVcN~OSI2mW+TwIJx z@h*H2x8RHTCVq_H;R%c!;*_s8CSwQeg{yEqK7l*%W!#N#;Xyov-{Eoe40ZBvgl(`Z z4#1H(0SmAk7vNR69Ph@5a0|YGd+`JO3Xh@Q7^?eQEGA(KOvOGp40CY`7UMizj5p#+ zT!)Y2c6=QV;1~Eap2FBnr@ZyC6?VY^I110h=~#s~;a#{MH{S8nOh`n$KX5;yIAzpa?1#hg9Gr?}cmZC8H{(6{2yVq!@E!aN zkKjr4jiMg01*Ty?9Dx(C5G!#JF2OtTL3|2d#{Kvi{)DG6ZnRUbhS(O*#tf9d32(M< z9+u%ncrD(B_u~_|6ZhfA_&xrC(POA5Y>8bk9mn8goQI3?8oUv2!IgLquEU4%aeNxL z<4gEDzKI9$Bm5k{!6W!9{)w(EXFa1Z9_wHOOvYB&9y?iX3@pVe zyZ{&Cm3RZ*j4Sb8T#uV@3vR=ga5uh<@8hTVH6Fp=@Gp!Q>(pN?*1;6)h`n(bj>CK` z$BXb9ycO5rqqrS+<9m1*kD;CIlrJ6|VjE1yi8uqR@lsrZEAau`j5~2Jeu&@TZ|KQ! z%9DsqupRcm49vzL7UO)p0+-?4_y&G}U*oUn$#u$+fNk+?%*63nfV1&pycSpBT6`3@ z;p=!1zr>@cj~3DEmw0T1XJHQ9e3khN zJ;5p0)p#>*z^Cv<+=n0H*Z2$C=Q`=dVSQ|gY1kJtaUAAh3C_pMaVg%358!6piF@%w z{04tR&v{Nc6R`=l!ycG{*%-uPoR3%Fa$Jq~;|6>I_u)tQEgr|%iB9<%VH@m;88`t8 za1LIEx8QyFEbhVg@Gu@n&m`&xyWv0_jnl9aFToqt2+O)x&9khBiMKQTRn==*2Z=vZ zWxivKkDn}Yv}Lta+J-AMl`8VLp z_z50YC4blX^4~A_)vFRWR3+VH;vU3(Rhe%*&caLZ7FCwNTTQgAM~I(NCB0p^o9Q1h z{cE+h^z$Tk2c7xrt1`YVaYy35I98SXCaD2=Mj-JVRr0%%@wYMlZnd72i}-o9zGdxK zW&ZbwzhnAuYD4M2Hbs=V6E^!KRE8;Zb-fCm%4@NwJxKwRwS&JBdE%BYIq`yW@ zv8>04pHn5jos54S_v81fEO%UOF3;eUc{Q%3%Kv)A&4@eW*^D1ZJd}8}D(U242`<7r zaDyuOJg&Bs@)7S*<^Nm69}#~>`~&e(;@?$S{uI`k>cp*7Nxy^ITKZEG4^?H}k;LPP zClOC4E>>l^tMLw|ufxZ22kuhaTGqS7pQ@72Vd9^OezKX|52&4_K8b%;C4XI4)vL3l$$vTVYU2Bdx8h#L?;vxJRf5t!1Ki$c{iz;RA zr*@XVJ3>4`m2yueop`N4$Y}3-PnWyNGwIlK*GKUlB*oaK^`} zQlE`gDOW2@W%^*^QJBN{>3AXDj1S}U_zC`r5k*eEXQ@&@-PEp@HJEseD&-hQJVos; z&*de)fa#YIUqgI5u44Rp;zx*|Cf-K;D)Ae{?-74Y{0;Gs#J>}tBKFO6%IQ~SJsJ=< zB|eL|6LBx%{=~zH#}J=K93-Bm%6iYjd5phImHN4gcp32u;`?#4D$9R{zhUAmXM9f_ zh10PdZ^HXj$?p+-it)RN-@!wS|6G;!bd2#Q(Oc}~+fbGCQiwaMQhz-e-;eP@%vUA7 zN~X_e{PlPbZpC--2qu&``KICoEXIZSyej3`t@e<9^~8r&Derg0zY+gQ>@9Vs$Evb? zJ>u5bp7C8&Nw)`%#30Vc>+wNV(%Y=|lK$(&dsQjVe&R#KUl1Q5{)N~obLNjwCA|dV zWNgX!_NwHQh8Z{kEAR?jqe^;@sC_K!IpSATDc>IAgTx;Ze@*-Y@d@I;h@;D$<>OUJ zzdo@(V@Bh)#2txy689s{Bt935u$1Z5s+9L)you>|;A+M{fxGZi{0059opjn@ADoC6 z;4<8#O8K{{11#$`;&)W3ulI?+B>tB8SK>d2BP*QwV^m46E^$NRR>bXyyA$^&9zuK$ zPQzJDuTZ6Yb8#uI#Vzm}lSs+9j7;!lW=;4h5# z&UKb+h@CK9m2`)x!{u``@l;jPolaaqJXe+ZZf5-5>PR_`5kIZUa@&YsC4PhWJ>rjv zzajpS_;+G`c9y2&SEYP)RmrCzcEW);3Cr<1b+l|(Rnl39n{YGJcd3&8TWXg4T?^vx zRax$5;*-R#`Of@ts!Xp%+?conc4mA}RnqN;*;t5|;4*wrmGW#>v*o-+yjPX{_7fi> z{(|@j@h`;I1?N;^<3yI z?^h+RL)?_OjVjCaA--3zAbja z3>=N)u^cZ@rCu&qC&=eB;#I1w=NjTih#x23M*ITt8^j;u=ZybWm2{7w=OQPrhiRCB z7hf#Xr94;T?YI_q;2!mP%leA=7j=hxzd@XMiIYwn?1fo44KKo*@LqfhU&Alaz0gUw z0jA+dJRi$&FHm2hwyby1}M{y4x$HtdB>5Re|cnL1Wd+`a} zho9joOuWoVFAXhu>G!i9j6px9s9wuziS02J`>V3hAe2M0iRF-I9FG%GnuZxKAHR%p zI5Xe7O7k*Gv5Z&ZEqFVw#=o>FY!1016{V0ek2CeM7f^D zWNd+5@NCrQ3+ns>QU1)F`JPt(oRM)7PQeN_Am3Z#MYsr;srBW02Jgaq@Nu=F)CX?E zowytK;Q=(yACu*NApRLo;7Rnmob+pBLu`s?tBozIH=5^eNj!vjg4$HRhsJ!Ij`P(N z%en{`<5jo>m*MTGe;-hnGtcR2F5kCmEIxzV@Fjc|_u+p09L@8*WceS7kK*t67e=_9 ze4;T48(|AP3IT%%7I2>eO|m;2a~Y9+FG6~if3bQ%)m^Xh(Vl& zGjTRn;{sfWH{mU~3h%`YsLzwva=oawwX9cgFTRcM2y2}@A_Zj~;-2rtLwYCFp^&r=gu5#Ng&a1-vtmvIlii3jmR z{2af+-|;Wh=hAEbF{sa_*SJ3FbLjPZ^fc^&`u8z){166@8B0|XW4#u1kH2lWV}1tneN4Stc5Aq z65C@c_Qydu0>|L_I2DV~Jnv5OUqHMNuSD~lJDGkH@hxbcb0_0h6R*RE@NwLNui$Qc z7vIP4@hAKp|3bgdsh`@|9L@9bq#Qko`{HQK#sZvy^VP0$y?~2R|K6sKH_y}SE`L8* zV{t7$fE)2~dL@IC%R*te7#r?8)9>8jcI6}&nM;WOKhIgCvgt( zcsw7cqIq7Q%vVjk02ktwcrD(9x8PcQ03X9AaRLScwtRD|kLEdul1@5t2A+fG;Y=*WOYkzh4$X5BCB0jT@4$y}Bbw(V z%6vPC-&A|Z_ni14eu78v82*8$Fw*ZV@5B1o7+YW)?1Wvg7xu$ZI2I>j5NBgGUWAMA zYP=qA#@le6+Do2OjpjLx5f$$G7nS9>#C+7#_#yT26h%VLfb!9WV`hU>_WTV{kl9#C)8NWmt(9;w5+`UW+&3 zEqEWU$H(wV+=Z{>+js!KQU}QK6_4U?_!sKEfjVC_#$h8&#@1+_6Dsp}Chm@XF&(oo z7bl{5j;JhOL|lSZI1jJE8}Mel4bAgLC7t_;AI3-V1>A*i;9K|}euUrSPk0>vM0Xvh zp1c^3wJ-(Eb4;aNort?&UrfglI0o~u5KC}2&cg+G8D5Du;7xcN-iaG<6K+BCJX9&~ zPU4qw559??;1~Ek{)8v+Bu2=0l`cs)8WS;q=J~2JJ%u<`9VmY%1AAkC9F5s{E>6ZW zti%iOV!R%g;vKjOH=%i6tCV9a@pgO}U&HtCBQ(!(mF2!BK7z;a4?KnOb)EICg$=L? zw!*WpGj_)eb+Fvuj9HkA`8XX*u>$AgMR*NJP*&u8CZ;!I2W(R>v1`* zzKC%%k(@J&33AL8fu75;{QpexC#k4TKeL`=d)*bX~kPwb0BaRiRTb8!}y z;at2BFT*Qw2`Ds`mvhrsptFg}Yra2LLgAK|C? zHGYrB@Hl!KIQhk3Ev$=;F$LRTd+d$smf>8y5HG_k@fLNod{2X`aV)KgBQc2mBdN;7N>VZ_qr4TH=$$9{Fukr$?b5Yhwd!f-SKvreas@js0;54#%-L4kzIhoQ|`w0_UK4 z-nEo>5%E=c9WF!j9Bi5IKH~Mb37^2NxE)_c^PFs1{!QX{@I(9rzryeEDE@|jp{t2g z&(Ro%bubB=Vsq?_-LWs4=Wk2-h7pg%92}45<5Vod60E{`cnMyH*We9!Gv0=G;~IPn zpTw8(HGCgG#xL<3Jb@?CBfqtq_KAM1jSa8~w#2rWie0fc_Q%nfjpljcQm^L|7hws` z!v%OHUW>Qj?YI^nz^Cw8d;xdi8~7G}ieKUpJcfUvE7_^1SWLhM*aX{Pd+d(AaHKjx z{+=F=$B8%-OR*Z~<3e1F%kWmb3-7@Pa05P$TkvIk4fo?g{1$)2-|!D~%RLpkK3?== zZIquWEmzR85>)vOH%XP>^ki|ucw^8K9JR_?b{+sS<)Y6tEU z>SS5lHSX;E9YOt_Xs^cI`8$$Q$U_?UlKa!tK63w?I>7n+n)>s%FXht8$(ipvrzSOx2Z^mzLLqQ7AtbnDI%flv_?a#$;@P zsj94xtcp=q!6-#HO3}>vNs)|F6r&WuI0XxE1{UKyRc2m*3vn^th|6&WuEce!w2y~y zqblv>aonQHZ-iTMyDIJG1>B`d`*|Jrs?v_$#sjLfrw{OuD&OgRj$f(rnfyCEqRMBi zV|ZMZ_Vy>5?JMohquWO`+gaLQtj40*-qH^1Xe^rTo+8^vW6^AXX_w}{FwwLFX`k(N zx@g*iw9~E{i>6)3_V1&yXxfLg+rb)(rkzOp9jURHrAm9q#R;lxe{(;XI7Q>GmQ{c= zRB7MESg!W4tSX$RN_$^`3)McBwHU8b2gu*S#2Z!F50>K!b+G(hOuSo_{bCKSQ-{g+ z$BnA&Cy(P6btHd3Q{1kx>^CpqE;Wn4rz!5$SoWj0@qn7k-_aBgX*@x;Ki(s4Put%U zsW~yxO{;F)}a#gnP^{Q;wHL7gav?x)wssHEH;g+>em3ls^NUlBoRjSnY z-Nb8DsrN0!TUDw5y~J;;vKs=RN|skzx3tvM?mc?;?4F#Qsv~&U zvE5}{T59*y9%lR$-z6C%huF4MG%wp~W1WsVH+8A+mS~=-W5?o7kVSN&ijPc&4 zTR{IDsNKI%$9N*zYa7_5W76lEG2Wpvk2@;jQ;A$RNT&A08+AgI_jbYKi71lpO>U3( z7hQ0I)}Vgev|QIj$y*(1O_s~tU)*4r4xXzSHa$-VPibkAi*>M{zO}ks-Xp4eSnfd^ z%}|%lmV4+vozy{+b&tAB1|vOQk6&_%Y9MdXUU{>8UXKP+1ic?GM#uG#|FJ3Z)>P}` zJQ?lvWJnmN6I}00#-1rA;VWc)Jf+bxHolh3mEbAAQ-=NTNV1;UT5QW-t#ellmtl{; zo4!~6B%`DJi)8&gRXQANxqj84dWuYrH#bX14AXm?{h!O|h|I$>kLA~!i6e&VuxqbVdV;H^8!2kFOpDfqq=s*iVb}RmqR73E%AnV?Mc$)y z=QkV5nay>*&ah9HOZZr-yuBUyR<^9QKT3kgx3&5${}9O~a=$K_;NL3mk?-g%b^N;J zBj0T!@5>XL>ih>9%5WV!Q4X3`ZsTb51ilE0*_CH?Rs8RPZ5CG&bc+P2(Lp7RxtXS2_|GNf zVcwZ~CvNSc0?Ru~Ysd08mN~t}I&AyL$?V<|9d`M@(eb4^?Dkh_(q;W+jK|+g=PB1z zqWo`3y58A39P9V#_zE3P@XyiVN*%7_|4<88rNc@7QBquQ^*%|nk^gN?bIw{BPWE@! zdFJYHioa0vou~OW^XpyP-uXJ*++V4~7wEDr{CXFp_d*?R4ryh}2RKO(s_ z@^03oO@%$F1);*W=r9%blnzs2PwOxh_KZ_un`L?L)*B_SD1Sh6e^!TM{d()V_c={H z!Ji=2C+& z=wQ75G3*5II;{>Pf1=!;h zAX;;K;~AMJ)?X>_-n}{;Z@F&P((lvU%Ux<^?snk3H~A-|Dg`ov0QqE?fppabB@k}~RW7%ef0uv=+uWf5(w+OV>4dOCEn}A*(dfm3>+&<7t z>%e1zR2dj0BkP{j86xZnGF&fF8h)%d#y(HlV3HnTV{KE=fH}m*nZOR1V{E($Tme&5 zzX{v{Q`Q9A6gFUv8i}?ktyQn1aCw8ImyCFwh?*Q+FlyldKj|<`q$^Z zO~~VUU7@Dr(OlOd*{q!>VD{P+`vYxcR{bb%OZ!tzH%%94WwN#cW-o7T0*_Tc*4xq6 zTag2UG@VY&W70__(LAk@G!saosooa$JXs*AqPo=bwlM{_0!MVyw>1-@0<$%#vrJNT z0y&y@I};=YY~7jLo1jrZ{{p(Vg9(xYC0ZYyO>tXTwY0*eTDsa#YtdqKscvSNa&|XM zd6G(ITi&zn?J`r8v+g}?Js<0lqNO%z&rz-4SZ^;oK|aPMmE_H{yuEGRf32i^xrFrg zF@Y_Pm^IQU=C4(Z2b%2 zo`9w6JJ?<>K~&&pEkuU>paijjhje|1*jpt?u%dL)Xl)EqN=-6qu8z<*8F7m#e6fzc zK}YMGjMl@N*K?VU*4vb$^-V_TVZrOUT}Nx;(b~9W#3mV*N*rcOeOQ46t;9@QcM~g6 zphX#O0#85+YVOBoN1fIatn$%bmL^(B)ZGzaq zkJ=1!OpxGIORfp(IMp)F1W8V{oMVDUQfl3S>u>bRC6$~i1Dmxt_01k+1@t4Cw*js4 zK25!uJxx|CDxh1`+uVLhNOHDK7t^X6ImPQ~>)r7q1K(*`2iPx3FexximlsIOfH`4LFquAN)m^V!_gs6P)QQ`6`6OzvK;G=Abz@}4 zh8?x$8@?$;vm1US@2-a0&B5L9R~hZG8eJ^d(NpX)o%d^58>^vq3$q*ECcC#>80&{0 zy+7HU&H7u7M_6(5?Q7*jm}Rf%bj`q}gU_D*#vj|CSo{7HUr&7goSr`={&en|OZ(rn z|NKS|u2}CqU{AcP)^nGqwb*%4?6|7Q&sF@j>7#}BM}BZe)lYZq*im%H=T{7U?#Gwz z+~I$Hb!>~W_Fs2czqo4n2M=tV^xjn`=46lUx1!{wv~{~$yEndk$+_E(#vFQS=+gW5 zkIjEIa(dggbuRZk*}6wc!;XKJv>#PFu18L8rLXWA-^@83UwMAf?R}U4r~3y){R{si*3|% z`1%8*$Gp07;?c5>Gk&;qNmW_?+Ie;6?OGh=dilEFPd#_zx5Zg&e!KU?b3f0U{ZgFP zS(7DF6%p0?*`VnFsdisyul`y0TDskv?322W>8aP!O*cvGooHH6a(CI4V(b5;3u=W+ zRVLak<7>yb;~T~&$oD3$x|Tb>S4{7iO!<<<-NK5A=_k`SmItEn_KowreL6j9uV#se%-TAwE^8;DoX={qj?k== zNQPPKlZ=_xz;i|^pzL9K!Mm6KjY>m4*C6Oewzh@H(smuQL`$#P`WrR$3MkI&N zp||!p->aDoBl|$u>zHh0m-U0b+keEzS@Qjb>`?MK*0QJdnp85iuwc^k{QM4i6(t=? z%SsD76y{AW>d-aVvqR_9v~IJzbeLOI+NJZPGbT?eD$OshE-0K-l9xZDsI<`fUrwlU zex=p1V<-8So1Q&1BR7~`m{(j?I4cyUkIERB-l?)+R;S9c{7w~2%r7e`DJ$(XRX)W0 zUthRKTF-8IouUS!F2CL1VIWGbYHWdENfQ_v~dJ0s|w`HAqk}AOwFq-%CDI!4Rl6caj>XjcBxF3)~1ncmtc8iP_{==RawR9 z@zcwTXEbgorW9@JH`vdSu|(u1=2V6BfzQ+V0y zg3~GrXFDlrB4%Pq<@8{2US*Y4HA54%at3E-l$t`BYDw!Z6;M!CJ+-({(~+W1tH>)U zw2BI3M6kSUZefKq9;uw5vr0LIC3)pDbc0s@eMFTttFWT9u-F11;{?sL!9^7{>y|wvEo`{6l~+|&VU<)@70$EHsL=6wvkEij6qZ(*4eo4X zvqn;W6OEFMmN&hoT%oYanp#{Yt0k?z(5ad;l9hVu(pi$IlJ=sPxX#Q{kA+sL)&G}(zNgJtDaGOp69D4Qx*{&Vw+s)A;Mm7ZUvn{!ZEwX~`sy(XPA zDo6GpIb+EArbAg}hi)Cab?mOEn6uN;Qqwx*6&HslO{$V_Y6`0=Cxs4t&cQwunlk|{ zGdQzMa&`8!EIC@Ih7G4V+eKOtd!(}}X2+?nEG!6`&Gw%hfc32NUme*)$5A;`%#|al z{<4s7l^2#4WaeaBnb~85L&lBf&|!`!qtYjEbkH(8EwQGVR)#iB*qBfgt1P;p&>ECA zF1v90RN3w1!FAznx>9$SS+c$|M^;XjRTl zEe+=CQPrscJ#dHW%^bxgAw5!?-BgO?>_u`+mW?qiee~dw89^&UcE*aD6M$B&IZO{N zE}NQHJXp74MrocN;-;Cyr#W16&@=Vs96-uVu{o}daw1uY3xe`FsH|c>$A;n}sSVNwY|I^W@H* z&+d8l*^`qyl;oFJ_m%Up9J@M{bdk7fMs>;5e?NYD=j0A!Dw8|N^+Vt3rPV!qCU=-t zTGqkYgJihGIp}sME-am1HKT8;jG87#3O$Z=kW;uhp2#>o^M%J{B}G*o%!#H$x$O0_ z@nk0F?Aak~gXmd6DwJmA9E(ij4VpdQIS6oGV^@TblA=;QN1B#Sodjp=;oF>8G^?^a zIa!z!tjR1`ZZ^4|DMMEhdWg*|m}eDLR)Q?NCZ1-t)voU~-%@>6N2#QadPPz+RoY@@*axxy$zVg7t{=?g>esxS-;fCexePb26nWSAoDbph z^{+F!=3S@htF`=>3+4ameEL(!-_r~K1Q{A0#(aW#$*ls`e*H>?S18}X63Z2N&Fe^t z+-oNn@p5a1Uis@M0aGsdY2M^3m{*+4uq2d-j0p`+3meuMS0>0OZXMtins2Ja;rY&J z>*S;PYCVMVt(M`?GBRjAF6kW)Rc_d{MGU9vO!9h2KI!)h%Rtl6|JPw?zHb^?)@&IU zdWGh@Sw_e{i$AKJDW-yrj?)d60i`P8stTOTAl_pZq5$d4+{ z`s%P2IXu1BQ{?wU85eqm(hJ2Q!^eB9pH79wtL~c8I%C~ultib8=cuvAk}o~NUZGYM zT3%bm>6cqS^@Y9MW(%Gk;kM+P$FP^%lCNmOUT*!SHtgk=+_f(Br8y_+d-&yAivsIk zj}6Yg=#s{xsp&n0x@}bb8D7=fgIrP+z3oHec9@ENaWH1$IXDq#Up zzleR(khL6ju^Dzk{h3dvXX2H(4qrk25l!d&1i!}$?#?rCmo$$A6sD;9Dt*6 zB9`Mtcn#i)Yj6|p!u|Lip1?>sHfuS~!n1KOj>YqF7G8D9v)n1=n(Jex@7n?P)yNhI;5#O9ep60anF05{`K+>0Ng zM^4I`e=ST#^UNR_pGJH(_QgS%iCH)q^U*vrNYYs<7bKd`O5A{3@CDqf%75AI%)P*R ziY_WFEbNimIW0}@*Q~i$^X$-Fn$8`YHTP=v==mSttNFTf@l|uLW@D>?Rry535Ub6E zy&Xn0n9*d&HJhv!oo9Hy9qithw0BbGyi>pZbt>+-$FjRdw*Prwn;}I*nhkLsnlYs9 zkjQ2_?at#?>Zx{h_T72h7Q2ZqF->%f9Yl}VR*Vo^?(-jN_>9i$mUma`w@>MOZ^^qS z^%;4ONWJ%|L(Q%~ZYPhFcUSV2&8+6vA9p8fzL7Gg1pS8A0wOOf8 z>^;6b`O1yfPirEq=AI$02igpY?d4wPSr)NO=bW<1b=%lY5f56+Txst0o(FZD-6pWt zN^W%MZCSF7ED_sF$69TU?RDK|wf$-DnR6dL?78EG<9By)%lpbM5%RvKi`+)^Z21$` zPb(s?*r>Ut4%u+rm#Vp%(lxV(#Qo&6bof~ve5GrA?-D8XIZb}mloO)7JoZa+1z``A!^&r7#OXKJC3@^@s8@V)x2pcMC%-?-TjPOd zOq3o1sS^6brj8|`5kh^!y>1KtV zizcqn2~l3XDf;x?yU)u=*ROKUbk}aFgL*5KyUy7lzVzTLl5e#`mk2dsQYA4@9FIz zmvK>gcW!h`d6Rn&blv67-hL9voxS>Gxfq?IT}omznQ$8IZ8!Ep0!3s``^&4+UcO>e@@<=VUH|&i7urVFy1MqXd`7QZ)s~88-KB6 zoZu}#DZ~CovYy`AdVy*=cQjV4mtl{8pKJzirQVww<)5#^RXQxUa@Ce|tG9Z)1YXbY zTAWvP>qQOgB6a8QDJe%~>S)V9NsBpLhvnX2eL7myhS}V20jvpOpBjlq9O?0~wZkgAeIUGqsFz zZ*Z!#y{K6l$i2aHqya<~H;_Q@4c21n;-C6j(@DIX!N^UJre6K(Eq%UOT2q$) zPAP-0Sch$YA6YeDi4ME`J*7&0r8?~Pw~)+yWkr&-$FEljzH&_^%Kw`V&(`5szdk|F zSE0iRe(ee4tJL8-e(f3LtJ2{lb7P~gS{r&JzxK%S&DkKs$^PS#vTv>qr}*^=z`l8! zZ!`bXn&x~RZtmA7bowsPWn1{q(KIjA;WmD~4aB!#pDfkhuUACAi?j+-{g>*p7wbIc zK4IS_I@rVit`=>f4)^i@uB*OChX?qBI{s2!RPPhk`*!0O$%IC}&6>2SuqU-3RM-|B zrox`mVJhrt9j3ybaVl)7=CW0*B+9QJ5q;0KMJ;5KT9sgi0$#zXA z$)BmiJ9KB(`-IbFx@&`ux=agLC(5_fC5h;L!oHid=+1q@zGXTr_X*F?O}PA1St?$i z>zVAkb*av-8-InS&$`^E!>r5gI_&Zv(hYlu4zn&RopsTJm+wwZCCVJse0S+^tbc-5 z_A0H(1pjlApYLuRuH%o>!midr>V3j-qHBk4qkD8PzJm-V_||E4m_j`eR;cx1g?i8_ zlwP0t9ttbehOi2L*s0)XY3aU4G;_WC&wN7buNiK34jWt&TGW~Y+-grAf)mEha8 zBvgP`bOvhWRUM{QUejTh-xT0=9i~=xhZSItQ-GP6jWu_g`##X& z1b>FClkYQ>)$o2WztY$eLw0)E0ficu&jOx%j#z*E3?xdb+R&T>6k9*aoW-^ zI;{5z7mBWXv`S~L3S7o@~ zINdtz%lTIp$CTrelCeZtY zeJ$*7WC3%Zu&<3NxE0V_%zbUmgs4CrIam75GD+15%+c)HnII{k4@LI1H$kJoNjyNuVXbhfmacYtDODg*_rPvum~wVEOPTwGeP`R9Wu_=+-Fui@O7%#g z->pc)(}ZGuz3fY69&?|tueYuHuXCTUua61LeZs!JX4tt;*w@blk%3j(c>3FVJEz_! z>`S+IYmrQC4YUu)uoWfj+9D^3g`u*FT-vuL2N)e16sZzc1H>1 zK4D!nS{s9uQj?6*2Mb5*n~aE(@m|kII$Cy5`T9cMWP~2pyq;flv^L#neUlM-SnzuE zNkb&U$>7e&72_8yrb$=Nnt zOsj6>6tAcKqcpscffZWT0k+;iIVm7_Xj;CZreQeu3HwIbU1eRJ`-FYtO|@MYFemH@ zCR4dj_^_7eT>BfD&!s(~WA4=J{g{E0@p?(moQ5KtSTA)N*mQpr|J>;q@dq$wG zRB`MlF8xel1$*f#DFns%v_DfTS4CT9h{lw4!mnF)44KWfCbcWc^_P5~#%0;Yg+VbM_b z#ki)o%S6{2smr+J5-rd|9otM7iPxX4+QhY8Ez9^n&^g+f%W%K`v=rA~M|-Roz0}IsPhH|Ae@H9!b()M{^k9B&B~jA}(ErJ^uZg#Xud7 z^8YFM#|_e9IaBFZMRCJkmL%i5$g;_CV{JuDt-2TJ3Qc#FN&@oHUC!xoMJ|2pZ(zFCO9`p1mML+iF8!SA3B+pB zWhRIU$j)!Ym75?oFjH%)(lm#JK$%XdGA*E%oU)`1#Z|kuNJ*@#!U%%%$@N~?*x+APyGuu*C~?i$xLS*Ax| zi>}?ZuB{UE3H+?7UFXu;9}q~@s=eNoFTs>RnNGREHCtvY2>hVMUScY-Dll4u8%@&l zk}@+Yt+=JG@1&dyoTj6Lra{W5C9P?FRB*!#DZwe1RkuvDSng^e;~Houo`>9VPq-Gz zFJR{M5VzU2L^gyK(8sjLJxK)~&<(JK3j9Pff6Ap_Wh5l!$=N*aX)~oxz^&``j0utg zjWmI+F3r19qkDC8JZm=E3i(k_3$;|TWH*>Wtp!{z>YgQ;6Ct-_b^47Di4rxbdeVS&=rx|EvXWQLd z*<)Q7S*`3W{lkt{>x*S$*-hP=n!YZO|MtpJ^4oIqAT3f;w+)Pz_avrf*WK?K#I}I&XLNHwU7*2$x67E7F%Zxml>Xw89JF6!WL~gRi=C( zQ~qf&InhK*-8TJJ8jU?n_66rb4ED<1bwaB?%&hvGG9@KHuiUbSyUov|OQ*Jt&^jC8 z*4A)D{F|B#hht_s_`jynUTcrkQ2Xxkme5nbN$N0HT8nR@xpL~T zUk^iP+4>!4$NRKJwzIXtYD0kb%g zzEJ&BiV$rM7O73;K$bXDho98R+CJcv=Pa&!lr!|BRLTr5lXGF&{^X+3+vs2B;nAXy*N)t{EAC+0#8JYI?k*1N#ZlF!o%2K+T z!Es7=XRPv^Ggi@S4Ucuy&eDCvyiPBc`}a{1R+ZJINzI%(S&l-QmvVs_tXU{o!Y*c1 zRv%%YGpMKKJZDhe&8v~T&yoKwD|MCXq?2W)@g}DP%|+R325WNB(sq{ry0F^A45zJ9 zHCr7&Ky((&x(TvO}7E+z=(r8BRT|2ng(2M{x}4yU|zS# z`=jz-in~>C@~v4JO=_C_*QC@-<-g1+@8;EB-d$!$E**I37Sfkii@r3)@YjDe-TVx)ue_*Jd2wEq+`nA%A9k7x z?_&7Bp_icaFqE!vo&Uqa{8v@-|4yGmDZlhmk`2)*l)t%^^7MTg@=59+`V`9Uce+oZ z9K+A-Qz*OT+#>CsP)QHL0=;S7>B<+@*-$Q8{;{(mMZ7WeJz_VsbO!j{<;X}e>R-PIjanyPc;5owEO^httBTu!BY%i#3(FkK#;jy7}&3G19$RH-)<&9kOglvS4p z^NY%7NEfG!(Sx$j%?f5^kI5Y~Xw1mq_^k9ZyAzuJAfaAx^tJl$@7Z=n$12lj%XIyz z>2PY+>EHC?Gp(*rI_%63uiDO9w|`%|FnUrN6>T0^qLHHD-7${N@vbcFGZ&xVOYOAXQP-dg>=C=qZh99rK*r_rxn%t zRn--Rqsj`Tdu?f9)!ecQ>9SH?ULGvTm+o=$O-4=MF1q$Pz0;i5rVT5YF+uv`<_AsB zp0Hjw^iCU=Yt|+xM;p^+qkKk{vwDMb29=dgE1FK<8>dU@|NnYYg?EqqH+_{&f6;&F zf|ecXx*NW)kIu*)KPG#G9tE<~b8@rC4ayyto#FJ84Qi*Un)c}HZ%^Wj2IAoa9g)pq|U8pnP z8NKn&=+!)}XkKB#zwA+Ryy&dmJ?WV^tgJjsx&cY|<}*4;k2JmBtnlg?l|Cq#K3Mu# z=j5Duj69>LR%QmvI^8+X=$$XJ!8D$c!xMDJK1Y z&C%$Lew*f&OzGpVUzlnq@nB_sUa9nux3Xr;*Upfk{=t9i;Z~kkR57=xQabfJM_cER zuN&2L-U~14nXBz=XVbfye&|joNT+L`b8s=;?c}Ial2BOH` zJhnQo*mRyYT`^5x+=2O}rqI&ZCC7NPM(iot`IHh5jrO?fBxyq3e)y=ftriwptCE}(e%IXv!v;qUXzP- zP!H>?A1bl*zSYfO*80DEXu}zu`-^0!ujHWy+LHg)V|J?3JgY3zz1%c-0{G3>y>b46FTComOPJ#fGjntQ@&S&_1ID*>d?Jk0fBXbq+Yr34T;we!8?G z`H*4ub#n-qRX9J`SvN%IQt7$w>=gghp}lr0^K{32y2aOYS+CUkG!7_a>T?v#hS#&r>4$6#8OBvxp7aVY zEzOfl#A2r(xl`48)ft?j4>F-X&1I<6bd_9R@|cD*ocU%ZyRui%JX1=AQYe7@qrL4gh21AsQvsB|*ynPY(zgSePe=`>aCg zQZB0@kB2$^kQ9zp;SY(C6Ne?x16I-&BHxv z9us3uJMst*|l|9Ize`H*g%l9zlf zy&yg|&iw6*&{uu>HD7vs(qhl$?kik3*sjU(31>{#uLslPV;8$Gm#Kr|+suoPwUR>% zi~6-;dVE4?d6~nNFG>7w@6fIt*R_{>N3Hwt)1&FMUNc3nT*425|2nm1n}zjuH{0;v z_Jx;=l7H+Pf4VPysI&a(G5@~9{ONg|=Lr4Z?m;gm*8#yejD%MTpP zCtpLES62+7Y3Qr9{Fg6~npaCmwv!_teCX`%FH$Z&Xi6%vGh-5sizg1@D= zRnpTh{Iz^qu26cH$*`sudJU8WX3B3ip;u_yB{Cwse8(ica`_TX)06MTYSLRG!=Ytl z(0Zu8{GEzWp~9xE4jb0_#x#=OT*4L%4c;l!!t*T{YMH;6p!w>TZ=vl4YExC%53#q_QANj0jI}xulmQ<1{__k*g-XPh?n^39aL$&E?)d z{qcvFPSgM2VQ9WP(*F6G1}B(LFt1qorKl)0ftf%vbYzOy;W_nkZvKgKAhavT~&{50DYkY|I^Ens0*q*RqAD zx4f70_nKt1d4H6HM{c%;O-ydFDiNqtQbLoc1bEEI?uFZ^44 zPrnIGRnDb!pPghu?s$Jx*%J~xI!`3Nb8 zDa$7ZAlZ$~-_PBQ+eKFcXaDobPME6W8$0JQpDc8~#!Y2kR#Ti?@bvHRj@I~pu=XDC zQB_;}@HuBDbB1IfWe+nGlF3XU^cH%NlF&KZk7!E!X1T9w`mUy*Y5JX}Jd>O0a1^!BxTdX| zuGN$eMl#(Mn%=JIgPK02>C2kR`5Z|9nZ|t9oB99HG~IG=j;1{|9jfVgP5C@E^DWd= zzA*&cr12U}H)wjPrq^kDx2AG#2lDyhlv&;|O^Y<0rRgF~FbT+0p%32c_TS<`Kr-k~X92V(rQ zn#%bc!0&5(K+{8-@*pLq4{9psa{$Zv9H0|)_##c^YYzxtuJI|Fo}(!rm}Pm_YI>)p zk7)XLP4{Z*!a!sCPMY$Jc;Z2tj@5L!rt>u|*R)>K)tau?RNiq$IeZM5pcY zsp*TFexm8On*OS(2MZpSpQUM@rhPRXsp(`*=W1H5X|ty1X?lgGH)?vHrcY}6vZnlq z0_#1f>F=6$z-EBq0ZsYZ67gtFSbb_XHG+m+TI!!lexz4YcxGa)5|oyUekLueO%KQG<{ps{hEHS=^vV= zVXZ+qvo-Cm=@3neG@YgCv6?Q`v_;d?HN8O7t2Mnv(+4ztTGKx?O~nR)^@lX=uIXS+ z$7{Ms(`roelczEa~`G<`_Zr*-`E8o#dbK}`?o@IN(n`51py_B$=WE)e>4lm;q3H*jdaw~=dAXX-&=kv3=`Sox zgu*Qfh4~9bcA;4E3(eQGyQcj#E!1>^rc*SXujwL9>qyZ*O`5LM^khxX)${^QFV*x) zO}A-!gQnXxeMnPYmtpzOX!<%S`u#0Uxt}BcSkvz`J*4UHnsSrKbY4w;n#wmr5gyW* z@24q9(WGGMyXHC?Z%>Ec-E}E7N$PE{9u9+|sH}{QEaN|A%v-h7TJ&WO$T+|L1Rb-taIg z!Q*+90q+_aJ&bM!PB!}K@_CoEO^q7e*R~b(zNBqh)aXh_q6Rk>Zp62vz5##8Jctdyvs@T)7T}F`=@?FopdOxh@lRGbcs(ErrvAh zzgB8SGaes_S{aKLHyhoqFU#xtEOh4nNyXhiT|L)`8u@3mRTo}T^>o|X!oPoMnC_pw z!$|XM*R^dJnt#Y!o?m`O+p0pg?Af-R!}hdYk;C%L=twEs&@J&kVssz5@7cBu(~@m6 zdi}K9k;&-w-C^$Q!`$b)*{*z%&gk{gZZ}$$M0*dXdSmyqZG|OHIqiQ_rZ}kAl#!1c z#t5{s`%L4fM@!E?5Hbp;&pGsPMYNkw`XYa3$`tocJ0!+k7(v|H=4dx*Loe5B%kqw& zaD1_`&*+{#)BV%Kk}4!=dUeZ{{GDf-z1%-NA~DAIej^L9M)RESdbvVR8r_|8+^@M& zH+hznl+1;5x}0;u#Jur?saXEHYB~bcv5QAa{ZbocaO!1=P75eKPBW7}PTCbmWplg| zAMz+qEUUvq5)4>{bG!c%fN>jdZf8;9Nb@3B5& zNbViawDmrRrEXa61K_)L}6bZDpcUp_-Jc$@K1A;-$3m!chme z^%7IADga1zZ@_QbCHV0%(&%`@FvR`CoB%%6&EHO`?i&$fQ|~Uvo`&gX5JYNs$i6AHfQx^*e-Q6~fEz4tf??-$HAu6k7CDS)CALsDb$P z#06ODp<;k)ixRrkkGNv!sj==wYOk6Gkvz55iBlo4e-AG3c}}!morTNyZvUycLg-m$ zog2kQ(d%E2syubp4xo)*|2ODoPlI(9GHmhsKPUofv^pVhm)Bp@6{yJ?RA?AGQ~kfg zggncwlF5)X%|EX{P_yNM39j<_^C74wVZD4bj*!msFDL+NvF?SeP0H`-2-Iqg84W4@ z{+qER@?2w`hz5iL{-?1p@@$pnBH?@V-ypp2mZ9IV|uw@FHW&_4yn?YUi0 z=b*m|*SG?0dDyxLP00=VClNg= zXei&61$tUgNzi{Ab-hbaRnUJ2d+$vvGy>b>pnn2&_LiWvLI1^AIC#FaBBeOcEZDgM zU%2pmC9jEZ2>O?IN8H!eSBTpf^uLWO2c8Ztw*8i%-yR2)Cg|3nzc+@RCtc8OLH}{g zmm%o(p#K%t-r2P-ikpl<{}4(RbbW(1+!OStLL^VNq`W`qzmyv6BItpjKdUoPj-UsF z{xf<4V{tiIq4 zH5UWH{#Xiet4Ao;CjwH`c@qIXmCyHijKK4-c(47He8*N@n~$h(Eb$@g8fe!3FG=Ti zGJTuO^eV*l+P_!>u+|LX+kwA1l?LO6{kz3aD!POCh~U4ZLXVU84*|9j7=wX|;|E<$ z$g6nG%l5dOc6W>dcmLEJqY}}PWViSV87?^SF-8v3*V)=C4mpoI^pA)=0k^X zg+H)Aa^b~GBfFT|+2@4kGVdo&y(8gA?N6O>Y2AJowUj*>ne5M9! z{?bXG24`Y_<&;xNOZi%Or`wy+TJ4Mjm~HU+<3p}15T@RQx3Pa04H&^z!~RoLn_=W^ z!yM`L_IVtM>;UZ3+n20iD|$EK-LPSnk?Zar>x97>?ll$(!Z$=Pi-#BD-i|lSQ*k?l zkH>Fnm?vANh1bGjeBslR89{HBKs;CC{@#fZ%e^Jt{3@W~h%Dtr}w{b8PJ z+c|tC!UN%Z@EZ)zfEGgGw_wrP;RE>X5`GaLFDLu~esjb5@UP)84@ArhhZH8M@LA~g zXgC92BR|{|zg@%Q@Y^jsAHN0R1p2;v_#E&(!rSoMGdvZB)+@Xh_4W=Qz;B=M)!ngc z3txcd_Y33Wf=2&vK7I#;d1CIsaJOz)vV<>$MGgvIkKe)JhwwWjoC;+R4etg&EW97T z!^8a$G9tVkllRE*cTn&Z| zJ>mIM;|wWKwNwAPAL z!2hH!BUooeWSzLQ?Z5y_+r1HNs+;Gxq+Q1p^kPmj>lKKc_8Rl$-7yTkZ>GJ$Gqdb_ktA&o zI|ZNqMh~UE$($K>F(#a}x0u9lU(N#G-j0-;BNw4jX?ywcRlgaT+y~$tf{+Xrk5F+gVNL9C+KY&>0G=rm9#bDw6!FOalWOBBJ~GycA1+8SbLc< z)y=lxK+BnfLEP>hus@)@zA&tD=)Gya6K{b9MDZe(&pF=G?uEYaImcVtbof5!cuRW; z()pa@E$u5&m#^^!6z#SbVtL_fVkutx3aH4poV?H8jmgi~Og_V23j^{c$ouWz;3#}8 zQN{ z(!LbK%C}}524+9|9dxhn6sn-mZtV@;Io>jgFG%{F<1Oul6m2aB-5C4Y{@_n1Uu1uQ z;pIDnStmh@{6=vO4?)QFJ;4SdEggk9$6GoIdz5zPaul}1QP^=9#J@3U_U;r9uao?)MgY0LK{dB1%QdFOab`vD9;-&0g)Hl(@>YO=n9{rJwL zfF7^!qDBgb<1Kv`Q*a-#OmWX^V5b zrPG$HD8FU@hIBsXcuS`(Tb#CVLh${KrFdnc@LfaRXXjuT_?+V{?Ir!eZ=+WI_E&80 zwG=W0`A-713fM2#k zj<<9Kc)6VbuQ&p1V~;t=m# zUYg|`Z|OA4Io{G~)_$k6MX#Tc*M|FfyJmgiG%FKxmG1y0#w>F-%J+S_lvS<7Oyu(& z?2)0X`i{lmd*>Xi&heH`RnGC2&Y*XWx0J<&?+|mk9b5W|ycc%zI!d{)MR#vTRq3yrsG_3Xoxnuu8l}rYX`I9e2UO`?5@4`^eAm<(Pj%6;84GcuVyiR{y@R z$y=wUO6dcjkGE7l4mf?hrD~%y(#KmW8MVpdE%Uv;?&ec0_n)v)Uk|C;P+SiBdJ1qG z`99wO^9QCGi)r3BP^Xb{^zoMJcPz?$$>S~a3o)-AgOFe|UI+2@62T4CAG4FMw?uf= z10jGuQj}i}!LrHMS3pP&LruPZ0&>+>3>sg50a2B~0tSn?1%{Ujhgyc3yfLIMWWr&> zYdMEYE_bkgx#1gOZbc%m)Ao@jCuJWx(~UO6@Tgy(Z?t(3X@Ypy$?)mpErXSK=fbCt zw+!O5lsOnIC~sPe&0m-K1~9!kikNA;7KNSYrBS3h=6j z==Vzm_>BChZ?<_fmH|%gIl}A4mkMyJ7M6Ro0I#EoxdMFZAXZ+!c>*#VwUi0)J8GFP zAmpfJfq+~{%>kT$k1u3?$9jE~En7yAq2AzPLmzLc3Mpt;b22Q&t0F@H^zoKX-wY9} z&UM5aWiCedm#D@8NLFOt2(Va1@#~u^hEWsbJ4(J;=C#n&nqYlXt>HUH)V5K{gq=Lz zvg0=#ZHvrfAe(gtembtFLaoR9f;~&vl~8TRvxOZ6$J23xlK?A^j^_3OF@ z{m!;7Jwo1XbF`%A?=MAO`!bZ7-j#Qad{TaTH}V;FufYf}An%XjNp! zdr;!sDBqn*?|Bo7kJ=N8k$%8d@C8QB8ctpvFV9Bz+HNdJI$ptjq#?_kj#q{u8-$*e zhlni{)Vdaxb^IICSiO<8<2KRA(Nx)WWYf_QgLgJ%5>Ih(Jc+STW_)WB<9g(~*yD9N zWi3Kd-Dlx9jn}k%yhn5R_->^IQeozA59HSAx;gI_lg!C3HO&C}^Tn}XW! zLHC_DlK0v4xScNK?jpnf7Cx-gCh~sN!uV7-uPLRvSy@hx;mDlPHH<0EPA^1;ZcJ*3 z(lQFjyN#SFAiXkr^Fp8fI^@deGa99$=deP^=z9Wqx1EK>Uq=5k!F%mjv1iN}a2Ww{c0_&)#H+jj=5?*B=n>R2&)W;=*IZNGRZPTd(4skMD?7la6P?3o22h#p>e11+ zFq#EXzwM$~YqE&vlWC~;c4=5?GR@b?H0+OdY1)gDjwosJg1@GzgBqQ7GXhO&gN>!S zha{7;E87)$I62Z(AS&k&etKoZwu0EbV9*&$Xqf2de?k9UGWS`(Ax0gAKFid{>Z&vt zaHc+1S3M0Q%>2~im~*MuFcjjmj)d)^J#>hNM zcvB5z>0_J|Fpa=E%t~3AQ(Yy@^8@xQnbVy-vOdh5p)c%;H~jOwkmMPTK$Wbxx;A&WE+m&=-9ovJIXBj<#C zNUD0*Q&IyHv+7%bQVn}@2Kasqb~~58PD$p+>B)QH=hUES2(kW!#7a(2&bb{8%~0cZ zv#5VTQL4x(iqG_@V)AZ#BD|=YK;CQTK>=zad2EErS>LovkT<74d}LJ3DL}iNa*lS& znGJc>T&J9?&?{=5Q%*6OuF9kw+mCghnokjMdU7hI24UHJ#>mZvMK7h&33LnbHPz}$*bm|Vji4{{yxFcdc;XmPp zY@^^zw8>Q4e_-ZCxGZCY>yXU|Ul3stXY}CjqlGM}dz8QP;51y}GPK4O9$UmhyA`m| zUy51iQzKDm_#D`o*OA-8xDvS|M&LCxHCK5|PWVdn?KMSFDjOB34g%b&8?>oX1$fnd zRI1Xa-^(#v|2%ze9Y1>Bw=rg6&Lo7g_DXnJO0QyX6^$mQX(q~Gm z@igk>nbI9kW>>aa*P!UEU!k%!E_JH)1SJ+FthF2^w6TQKEe=7qngeyJvm{lj64Tyb z(V%_mR@%rpl4qzYhZ5AeR#(J~R8^GpJZl5M7ldfF-Jx$u6)s zysDIYEWm}L#1?fl+=|*HMXw6-OlftI^$O%%L_U&}T{qd8V||XG*J6 zXb}2LY4rufR*zY%JJ)|S8m1nXPQ#hf*2k#9f7anKb1G^Vc~da^aZ#M==Dq5i26%LT z=c9HY+P((zbRNqEs$pLZL+)I{micTCEVA>gbu0msCVWFi=VRNLA!j@ymd20>H;XWk zI@fTHb=x08{LZ!Hz4kB^*I6!c`;2t^xPY+qwa) z7LcmCbHJY@Vq@zGhZ#6oK!%#hm^D(gUoC^h1WpmqSxscyP8ARc)~+xDr-{tLU~MJ9 zT5(Xl6|ZXtPM1`pR4SGx9+GX)%_+Pnbk1dIt*C0dNYdb1&F7-NHp=1L=Q zmVk-D7WBy3!cPx2gWn+h9Cb6xI!Ch4SKp)ooGV~~dLE03zS2`+2s!-0@G z3VhuQ@Ur*YDKN}n15NON9b|YTZT*m3y9_QT-xj403O1AfJ;Lq_CdlI)_g~S=!4?9y z8R19@wzBuUX5<_fz)Hqsn2{%;|KKVD+y?TX!NJwfVEVvqph3L>P9ngapX)GX22Um! zX-0NoQVy=+oylotdeSP z7@xs237X7E19~&Ko(`?Wj4ZYQ&LU_vBead+27(o4d5f2rzi(sS``85jg0>Kz7 zau30a1VvV45k`LSrJKg!4vrORqTXJiOL*3b@U~X)RkmlB6}dSD;I*yD^O6-<*5_nvZ518yD0^1b{a^RbLWhxgu)`z9LYr$cf_tz9#VFE0O54 z;5P)FU6D)SFoNF_1YD6G)SEnk5_0)Jq6D~9jqZ-R{5#l>AsMelF8?nPpe}-nUH+}` zbHN-z6I}kq7_PxQbIfEs-RJV(PH7_&H`V3mXAgo=iJRu~KS4qA1(o29Wj60%7$z(+b$4dR}P1-5GPR+^YfVnP;J_~*RYGgPa;8XkXOwD{}d2a zA9Awz#VmmU1u75S8t7%s1?Z&~qKg8(Wl^>eTH?jPRCf=wG@Z?@KpOFs*aZ%NJ?;q% zw1%L5rxk?Iz zCXJPn*Qp;-Z{TQ=XoH#r&ls31V59npGsZjto7BtLMFq+PY*xHv5|}UG3a3d61Z;5{ zdyF)8n<|C91QuF+MsYWqxrH@#hH65A<1Km&brDVV1l_D^))2Gk#=UAD22)^(w8U=& zu7wqB2~=8iN{V+?197>WWT;(m5`k*#AX@BJ4Op!NmJ0By4`?~dtWn6~Q=2hR19bul z)J#kxfqDUB)SoP%K|q;$4#NcBQ=zfcsV@ctGzn-?<5_gG2!Qo7y%C>5l)g&G2*n1f z%?zAxeadyZ2za3u@F7G6E|ylg)#JkfE)kHS3Ms~B0lDgRf=dPTQYWA@1D6RHs&0ih z4O}ffSELS7+ARVmsf|?F-{jLr)6~_RgYh&XL@!YZ4BNnM()A0KAC5ZUJU6&FxS}#) z1f0hPk5{Q&;5bhWo}fM)4REi;r#Y9X_gTPw0&3JJ9Ln1TG^t0~_4f-{rTBHfzyku- zsvn8~9ugI7P-8hdAC^tmMpc^&@VfOSs@vpWNuzkf`h~#se}VxJ*dyugG5xu;xOb%y z_nZEmw2t=#?KJ(zviSF<=`WdnG2ssc?Kb@@;fewuiYE4${xFraPx9?G{lBu5k0s@P z)1Ng2=o3K)O#co_`Kjdl2Kgw?kB~X886TP}&b2A*eh`ed@UAfT3yp&+se6Kci$*)M_vblQ>ZDtx= zif%)xWuZ^6#h9^Qg62c}X}gAPAt3Y_6Iu3Sm{dbD3AyacS?Cv%+2%4kB=b>Qkwld)<2s(?FMv1=n(lVn``^fPvn)&rG4mU@_w5u z`_MnhceY=^m7m~!18#g^y&n2kLll=wqg<|s{vaQXVznOn zlWY$z)> z@9Zf<^V;nxLuGnT$**>W=9~G*!aK06HvLrSjt^!_{VpRb3!R-|hL)ID!L5pm3{{x2 z^jF2465_H8b*n4czG}TC-Q5vjseoK@grO52CTZQUHm_qS=p+=eG zhpGcK;WaWVk5t{Mpi@kGxFXe&#&N2EX=)h!Sm-nXr7Ft)S}S0oa>1X5P8YC5okc@F zQ|hTvw^M?30_s%Q3$R{5lQJ>MhRzbuqBgDx?SE;VW0CxyjqxOvixKkRpR!xGs zLU)Ov8`X9L;6c&UCN+#B;~`lb-J$qt*U-bV{Jv8mAJT-qDvNnuH0c)KSNt|@=p_LMRE*-hA@v+m zD``1<1pK7tqJq$yvQ%sHzgPh9mSZ8N|6f=-gx;32-KKva2gF{{g4gt)Og+9MWu)R- z77d(oi{Zf#w?df|T@QqGI!SIDlLKQ3{PEDx$EFW6gJYMUYP;mxBDCK;hzxGEh5G$M zddsV}W91k6(&RjV)ye4?(;GvBt=%kv*T+Iboh6MdF+;;Gjs>rJo7OWzfX}hgu`)wv zsO?3F884F{)|*sTv8;STic7uFM2qu)v&0Ndme~rgE%ZRl6q(3cR1Ml3nkrzGGHHv` z1gueCvWKP%SgZa?gPAFhdasjxdT5Ttjrazm+s4om>kr7EE%KL({9S6QnvGC}Ma^{K zjq(syVBn4PoAA>KCL%hF7@;kYd1L4Vs|Uimv>Kr*(S>2X(*-3y^bS&67s4R2pCOyG zC<8{3{c;-?L-uOIV|*&R$jM%V^*BaAG&lQ|S%qk1YIAj6yi zuu1WBmuzKHg3anlIF)R_fGgByHY?ApLb5Gt23F+R5dquOc~ow`c_w0RP<0`IuIBXs zx2V96fPUrzfXCF&Y)^l) z6=0`2DFQIayawP|b$k$Du=zZ|F7*-BhR>X0V85htX%Dl^uMx9b@l=TH*=A=<_IuQS zbq6RlhXd?&?kCgYeCr?!<~ka28XKMr=m=hJE3+??fqCH5CNe;NxC=vG?)GrAmvQW1 zN$jgcxp*{963k%~``d}qp(iqwJ%1$hNUmhowM;}SXqQM=%V$ZuvMic{6U}k!JJG3h zCv(ykoTx#`C?B_Rke8Pd(r6J*d;vm}mHx>n+DE%6R+^0Of~Yi_j1#X_I2r+>FGu`L`&!qmKA&#QG#Y5Tlu}YFi_?ilAYLA6pz*d#sG}D%dMg@Fb8Z(c z<+QKtWF}-NP2EW-0{ypyH!vYDFw*jUe7R3r<~)?34d!J;rExGg@lsDgQU^|QmJ5x4 z&(g>bWNP-WkDP(;fu3kFK@L#f2Kd`fR+r`50PNdgUtJQC-%i7j?y{l**-U$ED)`kD z+G{t%S9CdzX;SSL6xZdzOCflMh_QeL~riZ{gJ5W37AZCxAccI>e+>9wta~r4C~k~;ICydo{ZcZ7acC{ zCT7yb-AvwV^vHtq&&a)g4UkjZ4ZKh86nD!=rnk0YPRPBL#dxB*cisZ(NOu=A>EiAt zpJDWPZ#-tc+}mFSa*Dfy4_rCL-E%h6TTjDB=ibX=@Ok&W;NnA5Q1 z=-Awcshz030Q$;(gnWU0Hq$&xzL&iVb4u@TU&Cozv1kJ+!lI&yb1%})D8s4w>^in%K~wQQ!5`}BiIf1uaYS>T^xc#YX> z>TDzTS(d*6{468)@8ma{ks^%8+~){3VJ*nQnOW8;r#bkgBzEc5i**K!Dffl9sDM$h z#*i!b=Yr*tK{8wci2rE9{p_=`F35eGjT>rz&kos3zAReGM!!S8C0a^l zyi3tG+tX;F?=kNlyOoN6pZxnaAJEVJfc$=YB4zuK{5ST?n9_3h>=(#S zC-1gjB|n3FioJ*YO!6N49r7jQZKKD_gV8(Tal8@JdqsJj5ia7kujfuEBRp#aLX93v zV3!%;C7%QITmkij%XvShXDduPT)|Lh6a6zdX&Ra;6^++8YUCY6qP3pz@<=f%-I#}r zi2{^i*x#gpmsh#mc4iUyl??aV%X7i6Vsf9&*8;<uE*K&K2QDsl)db6~iC6BHb{? z!Vfap26rS%sUKpc8{LsAYUg2s^WBk`F#N)gFxe(|AWU_vEcNl&x{1QGmWfXcM*J1>PcUJ?9@kG|KrEjq4Q}8Sq?T(siZ#a}LIVQxC zSd1k2(@0+ep8o|~m?=4eB-M&!Xpvz>gYZ!ed?>ZxD`?5gyWl3ohG(Gl7#`4$87_kh zx5D>AIe3KPDU9yC%ick3PVaP_GMV?#yh*T5UZBow2!F%U9uie?-_W&=q=K9#x7}9y4(2V=pgUQQ-6@@k|)yR{J zphN9JXkDIM1RZAo16`gc7eR;HU!uqJW+GN;-6bba2B zOkZMWvHU|E5vBH97({t;;j_%HXSiJ8oNxcp6TDpDTwo7{CFK3VyvL|di@|r0OEe1= zk73J8m5Vo3>ULO4UYcAtsZlSv0Xj-do%*paK)QJovNoyHF&OeP1+=I}w!*pKxJq@v z0Lt@A0jt$$_H$$2c)PAG@{2cPVY+hmv9!k`YdI1h0I7hBpg;XgF zFjy*u<*M5#+tJdklaxFrF<0_TQ(G}!gYyKG$*scRe7R=2M9E$LMRFOgO37XRV+GWy zQRvCwaZ*o<;v4tD#R68Tk1$UKPmoKVYgCm7ASPg~k|zU}2w11yfqsM4=E-R226a*t zphm9ZZBZjI%!0K7u2Ijz^9Gj**oH|M{lOffE<6p&D^}+n!38|K&a{?1hM@4t(6ABy z2|3L0ztDCod?kE~E8MRb))MBafGI}7hZtJeki5qXr$G%y_&CY%7Tg(L$Nd0(Xf;vP zoF6gR{MPxgsW6Mb7a{lpnvr3D#UvM!ciUgWEUZoBz4qx4+`5RHHJ?2hVpG_-69y_DxK4DftZh;BfGlktrz;pE?u1$2wIC%TViCz-eLxezk}V zSt}r_PRa&2UGnr(BVd!(8PXqx>QgueYrVt_RoRsDEHTiLY5~@y*4dJ5jQS1+YHbiO zPL1jTaGuGB=Zch^xwld7q132B`G~o|{2HFV$$vjO!@5{X%XRx_Q@G9IxuS0W-Q9qk zr;qx%{Wr2I=kcTdZvS2Ejw>Z)q1%5a6?v7EGREyM!w9ynHM!R;a{Jf8BU?9#RFmBP z9_-RP1Wj@K`KXI^m&s>crn&um+rzrgWY;&j{Vt3>YrE92&h2l2=d>Ph{Fd9_lZt;( z&_!;)hZ=cE(8X^56O{U4lcu)W?cd)OXoslo3b#LsHK+BM$hpPse})QwT;jI5{Rc4c zttTYz2DkrLn1J=H$a#y~e-A?s5C6 zeQU2scAwkdkA3={#NF@q$EmZAr1poQ-JU@E1U=^VpU)2eSkO)&n(U_{*|VsR+TAZ` zm)rj_MxynZpqJeKqp(=9ei2jM?eXcSb*(OMKp%kXbb0$3bG=_QZpMs63AxJ7-0(HC*X#%+qvU`6hfm^;)k zYVI!S$-C4S80L|?1>CKc!BQgk2)IX0hY>~Y6>zV58qJQ}C*VHSkF~xToBF@dS#}&_>jXWXAo=~sAxFXL8cv5AuyPp-XQ*ENu&zXEt z<0;jbJ^Z}MS3`EG*_3*h$v0EpRV^5gk$;$cCFNJY$xe9DoQ%HC(2rRQ&&RBBIf5oS zpK-*v_u3uPhcEKJc`j{ZMJn=sD3u%PGz;J(@gr`vjs5(&#Nf%NhnemRljQ`?>jdW? z`PO_KAc*7rBj3rebsolzd@ottM#rt}&L7NwAXTdSGW=#$!$EIyMSeEZOHnl+lZv#- za==jkg=I|S7bmOY^U{%DO+GN~RXEi+ssVN{s zT|{REKu`Kl%oLt0hQ2@XCg9Eao#V4&FQ-8pzMLG%ihZ=-&6v?pY5BB=+ z_5fsB9Ge-Ye;rmN5oPgi@LE&rc1)R0K=uH`SJ4QC5_ z&+^OQ%@Opz<-e41VR^!39}c>NONvA-3>xEraJLL=vFsKJ-6_=2qS4z2&l(MajSyKO!LpWgW<$i>qOC~SbYLUQvrne$MJ@}Z3U zi_FuI01uw{0WKEcR+kZ6BEYMbz`pV~3-HNf2l+|k(fj>=B8wFpKvS;8F_$Is{4En^#|Lt@#~RiX@|=G*dzP(VX`mx z>|@^HvM=|1On!u1Z}5CVex#i>2zh0XKFXd4H{g*y`e=Iqyp2a5R65FDhyM4-UVM!G zDwO7t{r6aV4!o&H_TS^|i?hME6`;%_`$Xu>^Bc>bB(KVO{ve)2ssh{cUT!Ib~Geg~tG464;+B4PtuoTY_dB>nc-Gb5R87g40 z>cY~BBu|~{%0?9ns8^3;i|Cmsph1~O0ZbOqs1%%|XNrI(HIPM56R=#}-2-5{fM(@p zvKayr>R0M+rhpc;qYprdJRZ_&^m!fw!1PqhtH0sS(2WsB)3M%K1zqA@Mc%CPmg#|x z$BLeY|8RS{Sv)sS@l*lfJ3VAGkq~UompzNfKPSv#7Qh=;SW;XJd1MJOpG8CLl0+^r+gVr0{=_~?nyVsLTCx}gOQXQ zgT}Ze2uwJwcm2pV4*X#NMBSLw{|dyLTaG&>+2D}R%Acfezxutj!{H6@7TvIbPph~AsNX2fh`y>An*()P?SkS z-iNTu+J%il*v|;Ntz8(q%y)ue{9VG1Mqa6ly@?Rq6-63)AIWhp z!givLg^~l_X6FE7$Yun-iNK_urXG!1%={6i5$%TI@O^rPtLA?lsn^Kf9pMq-`()bin&LRyQ2QNLAUJc>AL6n(-uAXW7@vwre1XOn@3l^;91(cw|{-= zLp?|4=M4D0zTYg>apb(RL~49T>WM1`{Nw4<*Y|6__}T+cUN^J4%Pmdk&3yX$qwAi} zK5+4C1)eM4T0gAQp{8voW(1zPA=_IwBCllSw4M(}CA z&9`SzCaxXQn3*E+BD{KjAZd}7nrb)`4_^ZH+&_+i!Z=Q7zX)BlzS7ty*T6)vs} zUEX!D-5=WVz5)$R{}Jw^+bEuUIOF$h49VlmCNp6aV~IDmh3=eaHCv~;cTEo?|~4(4KiLhB}k}GF4@eSnU8JC3~LvI z`GcZ)1of;DSjBYS_z{EogWz+c2;K(M>U`nP4CW7lcOZBsKXz#yXK`|nm4GqxAmj_= zyJTkIQo$&hgOH$eVRSgt@dx>N*?-nI!*Js&G>gIfK`t7Z?zFzGCp zu<1;lHkI50j~w11>Y_W1}*GHprOCJHFXt zEV>6>&p6DAohF)e15%>-J>l>}bj?F$&6jrH6l48SoxEN`4uDhKE!o8q@+>Yq*!*WWZ zh%OBZpd?XU9wDmE*Gd$zx>7w(^X>@JEySv?NRE#W}te-`WbHJq&vMJB_ zGzgaEVMNgpp;=Hd>zWHWP?sojf>Z%*PdqHQsPZq8PdcJe3Oret2?Y~QN!9w!#BiP3 zzL>uhGEKJ{xp)s^`Vqm#XOF=knsKC5Ctzm#qQ*!Em9!6Gz^2cDe(bU#`Yche`XaPEs!ujqg((KA?p9bjP)3}T# z-{B-KgByW%f61Cchm)|T&|lJU+Xh)lI7OO98A;3uC0T<1ZUg(lt>jL`f26^${Bh&O zg}h}HZY3=ee$ZCZNx~04Tw7F!iI__OSk`}&ncEo1L$X5H!*yYfm8~^mhl3p@vDls; z`NN#Yyd=6U$v8I{28+Iu@qej1nF3n>uE*A766gykSqf=8`8EKy(*_NOG01Wh9T`zoTI=hySABSQIJM>@}Kw#4X`M@I#a5AG?=->_+~v zOZZ2<@Q=;rA4^UCMZwI*|0VdJ%nw#}zoS9fP&TCf-~Ua0Z+j^JS@2bs`5Qj^XyOlL zLuFlSRoti^y|}(2UbT2>Wo7^J=KB5(jScbs@$!n={zGG< z`VTG~G;H~h{wr%6h74Z(m*~a1fW`IYl{K{u|34IzSe^J^wky$Cc~~V{T@{I@|7GU? zlYSc$Rq_9iWtBJ84s5C`Z>er4~799Z2PkFzyL+E!Vgs7=EEx8abC zD=VRjiU;CM(%QL#~noi{GlMud9y_sG;XTJF3fD>+p@L)lKmP!dwVTv{d2a zRRC@rsZgG%tvnoyfm+p!?_TM|C}3r6bG$B|U{;Lfs=C?)Gs1t@l-I>-o0m5L!Lbpc z7h_F{7{+UDOJnnq@TE<)*da3&dLh=xqOg%*kHix3W;OyL@Y$lEc0pMCB$idQR#zh$ zb<4N%Sdd6nUF&cRt)WN^g?ETmBw(`4f&fM~x8p18tByqQgI*3ww3Op3eAT*a$%LfbYq-HrKYSJ`&QjvbnOQx$Z~+dny)Rr3G;` zzz+f<1)99FxxA?n)lHbY01`M)cp{G0#t4ZwlvmWnjp+^5 z&E-hZTG`Ut9G}&Q`6p4nB3>0+*;F2DDo-SuY7iecYFd&x;?=DQn2Q)-tg0L@;WxC_ zV>p+`8X9AXn#SgqSfZ{GgT1z%^_N%0%B#wo@R>R>Z=-otthu&fsSJyy@s?OcWql=c z)AmKeX4G!5IGzSIaa!^0*^^6R$4sA8HqA)da!i^td(!lIv5|#?V}l08W=}3VX3pH1 zv9d*_lZ`~}(gwPMmgacF(w3T7RRyYBRnua~*Yc{%E92r^j0QNJnyNY@R@)eBY)Tl3 z#_E<>d6O}9W_# z=2ezAl)+7-yDBPUl~7&jyx4>ZbK^@Vlvggp2gm5f=n-P^6)jGuF{Bb!(Skm}hYgKs zW%NAEn=q!%ZfwA0GAUkHzPhAzUJ2~73`T@*sBePYb6ZvsHpdc1Y2(UxGrK2l&`xPB zVn3J*&_6L~W|`3xt88pq?R-NKJpp4x=QOm|)fF1hQLLi2r5*x1pH0-gGj&;fHCBOD zs|}o=pX}(0NwV&no|xK*ZY^t^-%!_BUS%9pQan30VdCuA^x0G97`5?u9HuyERjh)Q z!-AdodGn@EicMbFzPm)07(44f88AwlTRg99?)-^m^XE=BaMoQ6A9yrsWlpP#qdCi+ zL4|QtU5g=8wYs6a9)?_5vrL9uvoUWXB%3&AR%yxPvdIQ)xkQG65o=%H#5uF4OrJV` zZgJW4IkPc3npRd-7*+L9V{HpOfHSZ;$J8b&wMD>O=|yNPgNDOePJ})nPXgY=8NSje z*m`p<1LfnDM;Z%x>+rdhcoQrG!@jb)lI=>gR`8RSl`X62lQ>3}ub5bk6f+Ixb!}Z;tY$DYQ(tB1&g5{988UPy z#jBwjo(NUm1P_I`=x0~eCLDLdVNF+fOlfiHyqQjV_U^)|5CX#uEm)0VV*4K6e=*k!0rEuB6mHhu2Vu_^Os%OJ+8h00lqF0{scl#`9o(c=_>$U{ znA*?}&=%%KSYLCUfhCIck)5WiJ#o#BnPAmLKLyQH*2K{^s4XEYRt&n8#pRd|^P(*wLM=cyrsVFzMD$?w04 z17s6uAgeK0#1*W9Db?0-#8$%%)U7r+r?MW*TB~9S%pP@r9dT9ku3~l~HDEmHi|02~ z#j(JHj8*gM8yj0{;#G5|Oq#{s85~>M+}Mh7SlfioFlH4mJZy30mG$VTmYT+@c5@57 zXdS$4y#3Ub3>*9((hV_|x8e=JBlBD`ar+4?88+O&30YX;W37TV*4I{HKK*MW8{#c1 z8=K(}IXT7Vmc^3m2yxcMlO|0lrYCKUqjM8051V?4 zw_+Zw!yE*YhQH$*lNe+xF`eOeko*po-y!llRDOra?{N7YfzmKop|h&y#wKH8YoetQ z^Xc?S#^mDCIVH0aOF6PoC#H27)^NV?n9X#OY(3^rS-MTEDQ{?q*UiQ_t!r#p8fBq# zCYIq63MQ`Uv!`NuZf+@#!I&q}aXAj80#h;8JoFvQjeqYEvF$k(C&nwGS)&dUKPyA^ z2`r=FMbKRwu-KQu*Cdw`dRmj!W$g;AmSR=)b#!>8E1SzI>gL7k4zEnHdd1>&Y4zcG z)R{?Qj#q+TW0mc!ucQ$QJz|W2?Tr?22v<#mhW|B9ds{`Ce~X3oS7ImZI8{tFTz)&A zgI1NCdMjEg8(}5Q)r}2exH6f`suo*37^;D-B}XVV!Ns@uY>u>MXH3VMxHQt91|v7Y zS+YXb4KY|3yK)7#ZE*R`n5L01-hjEPrLhGv(4yeNW##G2VdX6?m{&QGR+le3?9&sR z{*Gv8LcFeVrL$5UVl=^a`Js~k7(J9)8~LB(h8gklrg>O9Pk^UAlAGSYeOC|S*dGVHMD>15^eM_^!#Sy0=_LDQ2 zV5zslh*h>GU}1VUAq&K#xdk0uS_>as>a1Hhx$-+tG+2DeDONA*#CBU$5lyB&>CTFY z*b%fgV;|QtrLHxBtC~w8pur$65hRVa`1+*{G2`DS*~5-fU-NLL=0qGTe{59aMpbQj zT_e`?%P=hFu9`J{)*NSDF;8zD4Lau*MkkDg(`S{%Cd{8=$izcm-&9`Pys{RXVLdBi zjo_>#At-i|iIXs{Br7&i;t4AoV-+j07pQVJi2uHWoK?PxKJ`DYL$NiA8x<34CdIjI zoRoAQQ;y+KcP!#RGc^m_B&j&M3wu>dH6`!nvy8Oi=tR{eNi8yc(=7tBi^T<#ni6q%$hC z*D7DZoij}nx-?oFIQzw`qLs*kX#~qqS&r4TNXI8yn=l<>uEL5kZv2PEOX)F_CODG` z#l&{QxhAo){QqI?y~C@jvbg_qOL9VPfRJ-AucMCT{eIW}-kTeo_xb()c=J5)+3S>j zc3pezwf8v}hMGl$*4EN&-NCczIlKUF!atFdIM&4kHzh@bL(N&mS06kJ17-{T8Z8*h zmU@R&Rk^_lmefi#RB8d}*`+YkYZk!(PItHtjt*Fx8rkWbFz1RhW7)f8-ShcW;BNfH zL<>oE8r9w z5@4YCmGwPR`sSAnkotz6~W5zHftz1_V>i>bBMoN^PV za+2%x0#IRtvx7WNajJ!$ii5ijl1erZcQuHjml!=gge#!RmsemJf91gZZvF zQ+6ZZ;zhV+a@7Q8yFGnYaCU(i%P8^MqhJ(z%P<+jq?8TKHFf%CJQ&1t%vrX09oi4o zYdwY&XX4j2(TK39Cfc*A7sCXscV46kljgE%BYMt}ok8B(YEGZ3In}k!$%iorvDeTh z@How$j0t63n~6|t7IQ`k!h`FMz>Kx$o9#<020hwb0`um;3Q79~YHO(E=~7MpKTtyfH?zeVdB7xxuzl0k*N??J6DBWfm5sC?QE&1 z^J6aOjaJ1qhcva+I}Zwn@I$CMoQkNDqn)aYvpb1!n8@92Dx$JAlNeSp>&=x2W`b~< znm3KESNOxs(YK~4lR`KrM!Ra5JAdZ988bYyA!?eZPnc0N4a-?I6WoK?{mrk5dSO@o zf3s4^m7XE4-rAP54z5$5b1fXLyr#Ln(T0k~cJDu2>}^fxKsD%Ca4XpmqjiR+wT&=g z%~EWj`#U|ybIsPOv~68;qc@|uwG!tinV-oyY36crLcLN4X9n9`4ZO3B><_;lV_-sg z)w3(BvRz`6oH}$pfR5A^i?PDN*4OGyo`a^cq+#i=h9B6mt(f1L1jISfyuLYV;d*6P(-A3_~kC#s#gR!^^Nte#WlJQj6Wo?q-)4&h449^qHfkYU${ z0<=~FyJ|5k6k2ZP?`JPT#oM`zKgiR3yc#QyP!Sl+N4qIJl4d%qbp>Wft6+?nM6GBM zEUKfiQ`5Y<7FJYE%eq!f%qyp$ps{A+&ETF0__pUxnFg;S6g$Uu)Ic-#A*{e$8~(yZ zH0Tv8;1Xqdz;%Kdq&3UQ4KUW~sNkASVPRqbLy@)%RNma08I>~+teFhg^rX2pbKwAP zZmwAgcMkJt%>ce=EIXi$Po6Th=HLmlD<@2ZBDLJkU1nOg&6`v`4>J23FVBI=pr9iY1quh98x}43(S(wsF^(?FQ**}cI z+3RM(g(>yybWSt1EG(34Da$}`>tFJ9u*Jf5z$oDy*7V%FrJub=qGs6DVN2J+uZ~(x z`=;O;F&_z3jJbZShMeo%Yg&OtA9VQ%Rn?Q{nF*Y|%wdx_=BlRSO39R|(D1O?OuHf` znlxyJTKqvnv!M`83%!$u7Cp~$=V5k1?+IFO6ZW}dIm%L#cGRK!Ic=#aEWGqK{Gv;l zi;|Ap<*;Ai7J_b)TFQ8;(v~Auz09|VIZ)N2y2{BmOPOLOlAEKTXV*a)aEX<_*@USH zePP(5u%w{|CQ+SNyBq_Fo5H%4KuzLd@-3mk4P)AEc=1+1uhgS4(Eg_jzPWaFeLW@( zQtO%JRA|jbE8#72eT2&+UM-j2&=_ReXOyj`Ah;EAF2(cEt1u|iazSA>K|9C*VOMs| zFYRNHyMGlsZoB;q``?^quqxadM_RE%Az?cd4Jf1pleAw=UubotM=1PosTqCQ_7yu_ z#zFV1yn6F&Y@R)#3iXz*oY`%&R=1fyp{WG}ka@Z=@5eZwE;ICbi!Y zb8_(_&Un3+=CxQ>nA+5Wk)9Lr%w!s+h*D{V3lUp~j*^1LuwmA(PNo}j$^@`%DS<|ox zqa0f%o3PEh%==PPe{^~k)k>q<7G>8qU@gP5+NL^9Z{2a$C_6M4!K`DO9|9c${S*lP>j##cLgtT8^s5qIgFAwjY5Rw9Z;5 zCg8{#>&f<1V4yUm;Tla9x;(u6FvL+NG{U{~!h|hKnFX|Ltyv&$U~-zKy*ekLG-*>{ znbOp^+0rX9Az|UQPp~r83e^NdV98qRxpX>m&4pumdlRKs)LXQ4sj4Aezib{h)VY3T zcEp4^*q34b1p{n)o!TsSH}|RW=3!@5X2U~^x6<-xJ4DJet{oJQ*Mym*wdAy`hrZp$ z#YiVCb2E^j@iRW`^gP)N5-Jo7WSoX!%UJ8$bcbNh($m6fxwL0%O$wgA*_a^7$>~k6 zZ=rEnTeA#NEvn~K8Owikr(ilc=YKdC(u*Z@R(n{Iv9aGa)3EE!nq1XxwP^7qUGJHd z5Ezb#-0T6fp{F@*2VKLl5G~#<4LS{nj$d2ZI-wD}K^iAcspg`{99TFw%58HtX}7Ld zQ?(TKpDo0|{hBu2+M7#z?;nmQsQ0r=V^l)3p1qF#vI#4&2H-Y`S%ufZSmw?hG-C7T zp^#)fLFL!2Xn+Qp-dNwdY`KOan&pjakvSMgZOhPGWvZL^4xL>q$mv-tn}nOSp^9y< zflbD+8lqMV!^0MZ|8e%?Bl>UdF|pAE9SyYM3Vy3HhJ*O|L3;j zWR$wb&6!P;nigTFA$Fl)tIKTm`G!^w2DCV<=Tuunt?1n}hTK|s2PFZ$Zyxk{b9U)d zBRob{GhvOJ>08mlf^`$i1EL@)*Os?+Koy>S`l0IHm-%1Ic`FoW(esL3H^tq{rrQw$Y1`x9G(btkt9 z&}uUh+ofa4wo8}{E;?mR!P=WwX6W0sE!rsUmg=n8v){_-g&Bp>vBk{`k%e}D15Hm1 zKyJGZ#!h%N7s2qZYj8e+c2CF>tgD(S2?x7vII|`2ChXZ>f(0tCtuC{TBx8nfh1N1f zC$3Dw|J7kS_`%$wfm;^vnz_Sd$y!F_yc1Z7XDwo1P1PX{jrDjib!J+DnGY9}#LOfg z{%_X@=xl;Y#xMkT;mX$f)i9=8+A!$VP)%@z#8!)CX3cQIN<#(?xwIRucKRWv1Ms{? zH&Y*t{2--`Sq(93&B+!vY_kfctaCeT>Z+}3b~~PE+qO*RxP%1MHz1jq!C?SaRoH5G z_ND;lQ`2AhspmNFdDa$=+3V7K$KY&Q$=%tsFl-e0U$&YxGOxzmeWSg_P1sUCcirU0 z>rD5jH3kgsmbw<(OE>3WE)}z7a&^gh*4)gIjTIJ#b2Pvx%q;6?t?8LUudZyL%dgB- zlbrRoNx@7OH!X4-=4!LOrZwsZi=oI5;rdJMQkx-Tkf)x6M_AkJYL~NIIp5M=0!&?< z!-GEDTI+>vEpCQkZ9s+bt0^@7u$6OWdsAjt*HljNrcRej!)a&kX>+3s7cFcrk5gRS z$7Q=rrobsU34SdsrL6F<Q^elJ#(eZ&&=IR0U`r>uX*oe&uSu=Ybl#rX}IEOcX zh$L;mtZKJDT>r8W5Zg=Ed9+4s_Y?c5(*@iHHGCPAUPH${YS5aAw=nepp(>1g2-Y6kvb znsGMz(372+gqh|t$A-nzu7BA6T>)#Y#^Z(uXakz%ylj`9x=1A)+tsp8TxvVmMXlTx zXGQ{xx}nLbUkrk4Tik$V=N8pMyW5T!b2!3Yti_tJZESKXdiI=|Zk(xSe#~BQ#%Z=s zrPZ5I*T$VGHtoq$>!^hE-L>r_KayhG1hTZtY?xuTcX#fbshBmxr|sI|YCMq>d|Sk` z@}?Q!ikphqtk%U#TyM3y>9G94M!@~VZX8FCaqHk5CEaQr&cdq2oSSw8wLEu1qU*y3 z!5moEuv5$9pPA~g3_0h9$HDDFWN~Ho7+Yc6PS0#Bhueb9LE+NR{ie=JoiGWbd*#$Q zGi^ly3$AW7Xgivl*wCXow(JhOFS(S;p2j(?H7=;#dgm!Hf3aMD(6>l2Ed!@}I?k-H z5n}1m#avkB-Y5*LZS1kX8hUJO!tmN|cVPhvMy@x9g~$aj+8>s8r*+{2tufPu>+TJ$ zEvh&skE?c6A{qCQ^#>V`uG`y=pE}I9p){6y6KBnuk=0_uy$=Ynx!<;nDGi%BRU zb9cc`woauIgSvBj6 zTCM2KM!RfVe26Vka{1r75!V4xB5pqr%}SonEQWUInAkczWe)c?vlBSm3EAUBAv2i3 zYJiKuc08%Q)Gvb-#(vsvWub#3wVIAtXF^$7`_F3YS*n#za@UMm+}d|NjQ%c|5p?=m zAId29_SM)-GwxurPnb7%`jnY-D<{EXn>DkhYSv_|cfqoD20PYfmq8_9`v-J{^sCvH zXvgh~KDN=N-49?dV7Oy#|7%~uq)7+5+vlV=qNML_KVV}I3d*fM+k8L^15QO|nbP%j z*sN8zoU>L;lN%bbtHm~#;llK+&Gv|5_{Yw6`peL4=%QST85IiF4Nw{<(?*r+Y#Cow zy=^`DvZVu;+ncirQ6YF*v7mB6Xby~VFG7rMe#uix2Y!HiU%xIC}-Q0+u zCBmo+a|ZSA>Jxc@mym0)a+10OaLv*Lgk9p*bX=)0%Y>5^b{Lp6%kBLz4=xf;%-m*u z*KcKYP2Fd~!Bw_`Xm4E(YHA&{*WkSd@68u2M-3Y`bl4!Y$@HlOa0X%u*19159-Mm% zG%eaIqi&VbWt^qxW@C7}rnadH&KjsHv?qAp)8<#E3^Qw^a6LFf(7ET$NQ0jo1<~%P znbOkI)Pl``^iJ}1GusTvZVc0f>sgt}Vqo5^6_mfls9Ju1#}JJs4frpz5@ zAlQLI_oUth$V?<V)550zEbon5F^8_fTYJlnw$iVh zTUEo?ocPv)XO6;^d@aFMvl*)#VC^-}v?tkiLEC>F>~|!bOR4P>(5coVG7EHR_p3IG z)gP_3vg+x-af-_34{Xj}6<(jU#y`nzz;EApV$Ge+8ePat^0b?CBv)-KsWssKKoq~e zVw8uUZkoLqUD`Glp|Lb`L6i-Dsp-~?YU*IrHLRscmL4dmGu#-PwgJpb!8hgEb23YG z>uTmT*0r`_s5jpO93iaNb~B*eeKexo9LS8~^ms`b)nelfmvxxz_F)I5#KkS=r8ZM$ zl|5i>lhqW|0{km;=g+E!Vx}gf!(?qsH9R!7Tg45FoTPD06y_54*{9#9LLt$Xgr^fV zfR~CfazcaGb3y{IgKKrB4!90D!M&D;qBkD}lhr;$w8F4=h_J-1l|yTDn#p$b(ZNf! z3g$z0wYyHi6%?AVj2t@zuy3T@LM!597%#JV`wXJTBfvrp27L#s+?1LkrzN`m2 z{|Db~ffn~VyhmcYmTEG?l6!r#0UJnc0)W}7+a8jhjytz`y5P9{ieb+DUK9EJ_HC}V z%OHQ2sZJ{|)DVBlzD){rH4twnw5ivmFy%0sR)uVFh0)NN=99&SQNbB{imI;p}_5-ZJswS5c zxs-^(sNUXfThaix3Zuy~gQQhlq1aYHC?A_z+dS31IE^m^IFGy;KFq2q66h&7OF1)y z5pPpByy1|3RSIp+E;1K6EWGq`jg@bDi%-UYH|HVU<8#p8-A-#YQES+>QxAdGhjHKD z1G5I_?AIBx4rjm7l682*|Bhtj|5Vk((ypQZ`QYsL9kQM<3ZCtb8|PUIs5A6t=R(3( z9A%F_eVAzN!vr-kZ4ET8mt;-4EfAlLTh zFxK50lGcnnxrE8PmR9-mmVs zyWZaMN4D+t61;|+(Vc8Q+FoB{-ue2YOvAeQNV@%bZjl<@PyQKvrNF%c=kn#2nrV64 z#B$ng9;iejHLdJJ# z(0;jv1&Y;7y!3mcZhF$*A=>M1M7r+W{%Kn!gkKA<&!HEvd)3-zlG>w|t!;mq!o3Jg z9dAWFu@1Y6piJwQEyX$`ELE(~)h%mWfn~ak4w^P|UiqZ*k%Pw!9#PJ(5e?mI_?Ytk z{6Y%`;XTR^n=rd-$YOrM2-A4`WKk`eTivp9yd~5?o3MQN@KIw%jXJ!1(8{{z)%#+j zDSYjNR*rz&wrusv+W-6UrNhey&1x+lgm1^}yR>ojm@(ypmNYgEa@(m8*0(PPIm3J3 zp*WOY6dZ&Rm{U32y@VdJY#9sBZG)_N4bpxMT;yIo8H53@#ao5yvGv(>SGH2I?HHL- zaSO`LP(@Jnzh0ZBzRH+qa@0fl6xBm{wOht%YH8i$|3TI9Q!w5y_`~N5*LNxC zY+tSBM_u^GZ*@)RQg~wYq{zwPGeh`AxAs4N?`u+*yc2PJdHyqxcJU_0ym$pfdsF|P*YTT&yFNGly*r%ZH>B)uApW=SCrMua zn2WyxGCrbZ|M)z9E-^d4KSIv_&R#k`d{ntZd?zBl(KyEVSO$!f@ipULc6{!8cg4>*t=-$2B-5XTrF^+Gy*46s-*Kl2Sd_N+-{y4_?3h^(Uz8?@~d{kBZI~4IvbV2){ z=lHKP{v*?Wm*Tp-nzYn@t`jcGes0AU=txA)=i-~FndkD`(b@4`UF&(XnJE3G&+WO( zb>A+*k7J}WiEGo>?T$e9bH_1bNF$$HjDP9;?z2mLI~zQ&8t2o0>G<~EHNKxbZ#*ty zeAM~r_^Nh^ZzMVg>n;74j<0f;_|_x7TW}HM>w$mi`1nIx>3bN*)rjvkb|C$w&mFc) zd;@=O?{6Hl((x@7haYWcHD!uy>mB&0G0vy|aN7R5;eTA0`HS4?c~_=S z;%GWZW;GA*ya!Ouc-U?@UXFi!ZXy0LZQ1cnegq#b%{q{d50`cL%RV0UzW62kWF(Uc zcND+JoP8S4%X$FLM35SM_%7>@scZj>Ky!9HpVbg>Sp=G}<9TYv_CNgA&MxPv>DvDy z&{Q4or{-$^i$L>qJm1C2?$XR9)J*Mv5uELKJxjX%FX9!o3kXF_BeWlic!_qw&a>yX z|3x}jTfCn=r~NO|!8+vmo|fMBRFt=0j8Mc{MEju#e!?#MFXHvF6td1ah8Cf|24r2p zcqiZ=&!d~-e6DvenEvDW`m_L2UW0$Uo-9KBaa>CO@%%+;0i=AxF7o}m$Xj=j-`Pd} zb{9FH57!^#PwgTP+eMzXi~O5i`yNmpXUF17< zksseh-nNVU$u9Dbkoo+*?fHdXw=5OH{Po^NwpDca8tg60iZ-vp?MV3_E)-50oF}!z zb}1hI)l`88J8o*RJ2M-rc|LmrVd0Lx-pnPLh0n~9%-2IQN7|QSc!>LyJGf*r*I|}n zvjcNFx4Wp#`_O(2S2>?+`=Rz#&rDn$mZdUBGwbL)!c4nta@CGUI?RoDfIbfARiTtU zKg!4*3c#-DPylwM!(;78dy%w@nEPdA%#PC$w(GI>%>EDOd?s1HDq)N7SEZtg=SeGp zUr+QHWA;}WDRV0^$_85$DKQRrpYzPBDB)Yvu0}gxS;;=o?!nHwjis3-{%XIuJss{O z?l-2Nv;Fz)pWj43T8Mx7z1hdXzRo5i2TL9&9w5#ZsrPzTxH(CFKc}v7UDXk0UcH$bIqEU2;GCz!+KXc^k?7 zmHr8CUXTyY=W+08k>ghWMEr&hHXyH4_rBocFrwZyieHFus@e4g7)N*?e_)L4Cyo%ui!;Rq;*sJy@nrEl@sHvy;sfGS z;;Z8O;N(MX_`rBpxBI7f%(> z7q1d;5g!nr6t{`*h+m1l(ec=BhKS?DO7UQ^PFy7(E1o8vFaA-yS-eMlOnhDZQ2bU5 z`z{?_#2#Wlak#jjcz}4Y*eY%mFA}d2Zxx>s|0Qk{Ul(_ZABvxg--rTb|fO zjEgqG>@f`6&@pAEM z@p|zV@ec7m@nLa`_>B01_^P-=d{_Kf{8Ic*{8@~4a{28l_7M4t>MVz0;=W>~I8Uq< zPY{16ULsy6{!M&Hd`jFV?i4>4e-t}mKw~mgLsp8xA+h7Iq~1(2jVwksKBM8v)EnSO&lijH$a)* zN^zdJNL(qND4r!=D*i=$O#GMly7-~^tr&(wg3rTGwHWcUWX68taB+&*EdEwJN4#9T zUc5tmSbRo&ReV?cQq1Y%o?9sHE{+iQ7Y`H<5$nV?;@RSL;%(wX;#1-_ai{pX_>-8| z)ukscmWu<$(c)yWT0C4_CT$_?Gy+mcAhq#+KR2(a=5zi4X7q1uZ5FZww z5nmO*7jy8NczkY8ae%nDI8mG_9x5&oTf}3<)5P<|yTmudkHzoB+!ED;SS}6{Pr)3G z={r}vQoKpLM|@m-L3~sERLsE~kMR_Vy~Kgy7;&n2xY!_`EM6hrDBdkTChio!5cBa& zKDR{NO&l)nFCH!)DXtYy6wel~5N{Cg6dw_v72gxT5`Ph6WlE3OSKLpm6z7SH#AC%% z#q-1~#T&)D#7D*F#O>ny;@6^=a_K1$OT^v8q2giUQgNl&Djp?n5Kj_M7taDjJH(I0A4I?0JwGn? z7RQRy#d%`Ac)ECjc$N4U@jh{j_=31Y{8;SX+dUt@`D*1bOx#zj6z7SH#FgSv;>qH< z;yvQy;tS&Y;x}Trk9%&h*jF4X@@L6eKL?11i1p$s@mTS6@j~$$@vq{8;ydD(;xA%B zU-!HN#rfi5u|?b6WfZWlig zzZE0>T)GOylsG^fB~BI(5|0p@5x! z$BNU%d19^DB(4`v70(y15^oV75T6oX72g-X6{G!Kx{Acz#gXC!ai+LHY!KIoCx~Z@ zmxET= zB=H>a3h_qqG4XkEhxm#3gXj-*>4}TI#lhlOu~IxlTr9SV$BDlaFB5MN?-m~yUlh64 zL%m-t_7#VSW5sFW9C4wzLR=@FD4r!=D*jo#UHrTFwD^knj`)T6lb9In(%D-aB#sfM zhzE&>iw)vx@i_4e@gngW@mBGE@jEeRhunE~ zI8R(8t`v_FPZG}-FBAVP-Y))Kd|G@(d`J93{7LMzmrGwl>@5xw$B0wJgT%wd2644` zoOp(Kk$A26H}N6yY4KI@J@IQXw6{xN7qL|AFYYBy6laMG#0GJVc!GGAc$s*;c>N z_?-B<_>nk#AD6Cu#RJ5H#agjZJX$MeY8|Ts&7t6(g;%ITQSS>CPFA|>? zw~6nFUx+`6o%VIlONhP2LE;#3ig=KCxOkj+hIo;9jd-hgzxagsvbauUX zm@~npuSi@g9xt9Lo+n-`UMc=b{HyqY_=Nb9_^J4Vm^)F=6?=*U#J$Cd;!N>Saf#R> z9xI+Eo-h7Uyji?Qd`$e8_`3L^_^lY8r1}$ki2cOj;(p=*;=y9A*eD(?o-CdtUM^lQ z-YGsRJ}15|ek6V;=1f+3ioL{v;uvwNST8n<>%~ptdE%AgjpE(nqvBR^yZFBNwa5)c zwCfAR60t%YDprYyic7^d@i_5J@e=Vm@pkcH@mX=Z_<{JX7@6wQRVb#!0pcievUreq zgt%F}P`q5cTD)GoMZ812U;L-|toWk1U3^dcO8iBPO>^l^ihac);#hH-I7eJ4E*Fmy zPZrM=uM}?*?-3stUl89EKNbHg=1q6$ONf2MA>uf(Qao6!7hA-Q;+f*5;`QQP;$z|q z;#=b9;?H71rAt>2vA?*tI9Z%6E)*NZ_2Oybh2pj1ZQ{e?R`GT5WAO(u?*NycVzELT zE{+#xiVfl#alLrFxJf)yJWsqtyiUAbd{}%|+%A47{zr@+=+fCu>?!UkjuEGcbHzns zqxf5KllXh_kK$j%E#h0^XX1}yrx_|Yv9CB(+*dq6JVdM)SBb}pr;8Vg*NA@=9~7Sw zUlHFGzY@JFm#)rY4{>)9zY=YFuug0ij}cE7FA#4L9}u^SuZtgv--$UhUHnC2FL9ta zMw}|*8=97$h2l!_Xz>*B_u^IJt>S~?)8cF52jYLkoLTNUf!JFdBJL|5DE>xVDy|k! z5YHB`5N{Ii75^!|EWRUtC5Eb9ddkIN;(p?R;(T$j*dlHaH;WgE*NV4^4~b8S+r*E= z@5G#gRBvK0aiBOxoGLyezAAnx{w(ItcJUR9eZ;}yKH^kyws?eiq_{>rUOZF0SiDyJ ztN4KUg!q#9miVdoUomfvOJ_ptBMuSAiIw8PVx8D59wVM6ULamA-YPyIJ}JH;zAJt# zekpdEt8x_kibKVH#e>9Ju~9ruJX5?_{F8Vqnd5m6Nq&OF9)Z^+za#lW$zMzUUUFof zyFQPEeN`kmNh02TbbLJNd)_R`zajCQBS`EOXp+2+#C4}jzC`jp;v?cy;!EO3B46<0 z{Rwe*66qR7cJjROk`Ey9{8>7_K*yKp_;MZJAf6>&BiJ+F_rw|Jnq zfJC~MkTK6&EqMc(^t=-#pCw+b<5x)jv*f>$xc?3k<@mhh_rzaFJSTrX*ctoFNyrss z()0F^JW}!)$>T{}k59fD4;7ol6T}O|8^p)NH^pznPQP*Sq{Lz3L=x$#BD>8C!Qw$ zLA*nJQhZbVkJ$ML7k__oqBvh{6gP_Jh<_Jf65khp5Iy`+A4EkoS(8zf#-3syaiBO< z#5CBh!}P<5Vao_LWLzR1DYlAh#ZBU7@qF=O@kSDQ;}-Ew@m}#^@iFmf@j3A|@eT1) z@k{Xs@nln)dS6^{@Xiw)vB5{1t9KS{nP zPM#v3FY^6Q9=}TblX#bSpJ?y1;JPOyZzrKIc8KqZABjJRKa06xcRk++HN8ZlF{H!_ zvA;M(wD)0f-4w}{;z8m(u})knt`?6HPZ3WSFA^^kuNJQp?ik!a`!iEuVF)n?mc?Um{H~BL+z0JpGWuJyS#j_ zy@!ng@V793!;~3QLm@P1{e@7A?Gm1SrJcxO+F8SW@c#PN@2(#0_1U4`;-Rpbx)cfBr9KUhd!f8Bm+pmtm>yUNLsM`}$b1(MJ+4|jm(|b(axNOg< zS56C+M{XH<|7e`q`rSiWM@Qd}Hi$T{oIdW>P@nX3!j-{PJnMe%!Oy+j3PY8@{O9Kf zUAPMNOw`gJ4Ph$og+4-Vw(V_4GXI62!blk|WnD!=xd#k}a2U!yoSJAy^4>(NjD&MW z^uw_;1N^t=VLTD`JNJNaet-P8|4JT-=Co2cq#XZE*kDKen^B~ZJTwIy8#e_19d;p4 zC>Xt-2P$+-S6(3fjM>Hx5}4J(v#(uj<7kQ*bhzUyk7F)d+TqhTlS(qw6Xl z0LWF$C#F)AtN$Z+2SJ@5T!{N_C%Ee~@u z<+{9h9rBp7B76s=&3W+|sH>dDaQ70tteO}98Wok(6z+r@w&caRt2d`PJPpd^!~e|_>~bzZQ)b)#}`b3_;NmPb$Aq_ z&Wp!yMKj5{JbWZlTT&dKffCBO!m?9V9A}~CTp1pPgXP8Xvzf9#hWSaHAB*G1K>Ore zWs;YS|C1@Z+N5YQ&Rxbi*MwQTdCB+$-uEYqvmhD&5AVCqq{3wUq`r`@w=3hx_+Kd9 zU{WF(e+lD6&W$D&C*v>d4(TS7lF9gN7W>U6mEatjSkA2`bx+1e41#o5cmQrMOU8d> zj_xsOWHNp=iZ$n9lV&92XLp0N#iaUVyce2(&Wqt-FPI0(_z+Y_&Pyh3OveA(719Uc z)+(shWTJL;vzPN>m@RixGR{3uIUj}hn~C~M#$RMTbc!(V*CpepLl@`7O!{*&UcqM6 z)uii_@rPI|g(lsQjNgSGkdugPz+-Pr#{ZQEDH+*-Jlv9uKg$~HZdcxxjHj6Q9wyzM zj6cEWm6~)%GS2sba(dc*cOg#Zy_ZS%CF7l#zjBivO2$|4T%X9Xa8x{+jQ2w;&)MH% z*^>0a`$7G=pmLJ6crk>)|boq_!NF?g;N~kz7#(;Z2Jq8a%Tbgttt{35uA8x5Eismg^OFK{LwB z{V@C!V_1&7<$fGCbrMvfKjeO5*G1h;pQdk`fs)J1{XRSfC7)dB<^I<_G`ZNz{V{B6 zDB0lU{$vl#b@%>kg6|c_P|MNWXymuJH#i@~oSPeQ`98J~LY@hsfE&?rJDCs;X0dqk zO~A)wcJyY+JsnwzaliY&5nb+97ydJo|3ZX?(R~H8_hN*F)%{B}rQDYy%wqQqP&~P> zy5oQAg79lDybbLvce{mq;MW3q9^3O5!sXR903a}cZWOPh4H`T zo_k9lgx_|@Eq6O3ET!)Iv2xyxOt5>=&2ry!;pbV|AGqr;Mt8{l(8a?IN4Xza*j4*6 z$gT8p@qu_?dG6Pdt8gqBfy&7J(MrHeuJ&?&v7#;XN^e3r<@p1);39u6F7o$e(DVO; zqIKaY+A!k?KL_oew~!-McmPtH*U0a&l};IfN9Hy6M&I)%b;99QuUG`!G@sY<48l>L z8(#8SsqXXq7g0@lZ44K9;SZ6?yw!Z)Hb2VFZ-dK3L}i%>d!^^|!JVcrW$Z^oJ$I_) zWuE^oRA;9H7{-Ssn-OKF19@B7EOh0~;ZAj*^M>W9x=!`(hIf#hPK$XsNm#5_tFPsZS*Qu!mcjeuMJ7Z&Uu7Ee8IEEq|UIQJL zzjX$J`O(?qsHfIxg1CSn~WKymuAD1%6!#!YvFJ`j4WRW33Fw{dX}C#@ZMz z@%ds&Y&BbanLidSE4Jn)gvpkC}~-do|1 zhX#)Qmf`;X;f#O%&xn7Z&lh!K$FK;7`u{a!=e(}Cq?B8W%VQTjz{^?r z7cze3dp^)GyQ0UpRU94^6AVz)etU{~H-ji;rx;TmM8Ft+8sbOQd#3sfpkFsxE} zlHss#33!TOmCDmu33$dOU?swjbdOIsyJF~L&PFA+w&C1q$E?db#i2Z%07^4iocMrF)ch`mfxhtSx=bJEN{GeZz1bs_h&wd^jKSErX?h!ox?# zzTb=-T7G`WddPpX9`d7mh*i^1?jfeRe$L9zFP5Lc^5capL%|WF@TgFTgjB zFb}EFo}JKWgHK?w$9n1+7h#Bs_0lumr}`_m+(iTHwY@_-*~q+Jd9mF>$1&b-5l5__ zJ=zOs!^CzsA?o!ihz$<$ZSdgBavUC_Yb>6jigX-x_AnC=>Cjk3D2YN$;^(NnSbs~n z7u>xYuGzy*87RPo>!jIgmiO(+TS7}Y=%%7Q1lLl|U2d5}wCxFxs3%VU9~ zSVo3^gC_;sr~>w~u+q7=-4#u)T;;_^g=%n7p3D2_5C>&yibv6v(C`>hL2RGUUzlY4 z*c42N5c{u}Ail{Y=OWXiUcT5B15n5{<_ugnnR>th6SE zaxipyfvKoTp)v^3;0jzBn;aSeAulLmey4=^dU`>?moH*dLx({qL=)pNHU^}UQO5X= zdjbE$fxU1%KN^D&8^pu>4+p5$@}qrtcrp+3KOCT1$d8WUVMboS#*G8j2%`|Ehd7A| zuIP=^l_BaDFSrroPV4{^qQODz1qYgt7u3)B@OqWUW`??8g&x8_JEC-uVhE%fy_qruk61s)YeGNH| zb+;bm1-ru%jrCBgJcI4NPbde-3z~}|^bI|Oyp_1R8DXuu%q4G3s0<}MBY2aQIX<)) z!h+xyw$f?VFqS3p%c5SaDzpeCwLZDBxxtGaV#T&OumO9%J@iJeb9Z*z--MD#TlhzG z(1Md#py8V^0V_D!f={5`6`W$hfoRhOn=E+OU<6P93b&P>gbq>Ad2I!{p}zr#JFmMB zhdrMyt@BYE5RCfoA|0KN=IkNQ3$LUWI%5c~FI|oCr+=5S+juYgahIM)VO;lYF4CnJ z!%?5TrAzP8GjXqh70|B@x(3_499!omy5hEyD?nS6Tfrjb?L_x zm-Xb27j@bFT0~#&&%+qlW$+aUS9ql(P~-reqmjKhBg7jp9BnVC~?(Z3Nj5?zZs z3NB?r!~8fz!DTi&v<&N*=jm&)^Ig5togiK_y9pCxH&+wqA|6g3w`Siz`0{^=%2ybS%z^5wh{JRQVU+Bl6sXCv< za2&0TA9N`7(dP5I_PL%>9{^R^wJ%S5Rsvls7>;_SKV$OHzv~`D(9-Q0V^+Pw6_09~g-HANNCe zI6o>-;(v(vyN(T zjtM=DMi&p}BjGs_^MI8F%_!ZR91~K(<0!M7+%Rjq90_5uSn601mO7h$wf~1}p5`@t zVm>mKbqz(FrUNiP`UNkdL)1#n^2!P*&_%^86CPk;{yL7mc$yKhe6vpTsp%-@rmtbS zXI;aGrmtC-zJ~RYbxn3sF6A|>kheQt!*5r)eDegdbP{SjKl)Jma#m$ll$pzM&1bkK zKT6kd>6!Sif7hDfxY*x;A*Jg=Hc!;{7!-Vu!X4o=aV8i&3ibD9_%NOc#*KvVR+t?p z9DI*^3f~U1M@529p%@Bx+GRoT6Y^R3PM94#5q#7e!n<})cc}ZqSma&C`xs2M!p;#F z?^<-)!Y&aP?~el@bd9)pi_lpL3+=LaFrW{FZV|>?5_|>4R#;^BlzF|&3p+*fpbWd8 zf{s&|j4m9mb);@9bKWQa9ZRI-m?ImzOYgcrpZ@$fNq+*H-rQ2D!4oN(9d|9YXuRn zm^b@{2Sb{T;cx6=q2O><-k~N$g4-}w7anFp4%!9!YX5HCuSWzv z-!kr2$~NiwbD;IRl`$OkXX1`-ec0yn{1#MEx4sN_>e;%q!RuDRaK8U7QqpaAhGYIB z)M>Xp7%uRigWm48C&Qin-=aZv8^k7v*$!X5F6#9I75e%L1j|?Av8JWBA}y9d-wW@7 znP%KIO-2$q9!t&=YI@US2T%X%x#Jp&-8w{ zxAZG?s`8>){JMyX=O7o)%eb;=wu@&AT5i!C7thN~&0LGe?*%=Ir#8M|JsOZo} z2;sBK5nRG#nrrUgynwasJNc8etn)vmoUiqeX{@&tPniKnWGqn65_DXahwHO$Y_U zSvHGI2nSE@1)xVQdBH+C?iB+j_>hMK~x~M-|#`;LnvEjQhBDq4? z7b#__py3UwyW|3YeJjCY&ZqM2q=M~Q|+FS!S68^7M&Kp9ruh5?qE|n zJzR>*#s!1qO-&QL^{{Ix@FMn8qU2aDuiE6>BGAJCG2&+mNjr*ID}(G+tEgDj1=7-=J!u* zI#YB;b=)ESC1U;cC zi|z~a*=6zD+5PUfO1lu>-{)t%f|E0CllGydHwU8(?aBNomnlo{f-Z>1$8x36e-zp< zzAtS%&mZF>JcBta@E^g@6tChk5?ta3!A2;IANmzW&j48P5A+%I5wC&MLv5yS5=T;>%oL1QjY^bKvt z(}EIYCDG5qUb24WA}=u@v=$kQV(!1rOY9lqO?knW&;*HrCKLoTfD?m4EU?00J(Dun zdMc+f%vJI8Xt;Ta;i3F;JmFRJgT!7IhQN46hps@RTtQ$I#TP;quShh9_`#HbKD$JV z8EIZ{4cbPc)r3%R2A|qyLO6I3c}T1_ArhpRgf$@=GtuBYsD#8?6LJH7%OSDOguH+s zP)!_VLVmDcE`*~k*#*G{G=Ri!O(+b$M(a$hx2WSmfF_nW#)L!=hvAnv)`a3Deuy)% z!P1;eHq=4bXbNhNfZn0Rady?1;4X}yiQ`S!C%BN=Il+XnK_147#EB-1OV;C;BNHcu z8j$&YldUavUgBgECMDZYBd1unGTDOgCJWCBmh{H$r`qlFf-TJRX(k*TR1JY}x(SB_ zPe64hHk&X%;24=W!-U@i93&HGns8{6qh#WDCL9+01yz_h%Y+5NO-%FICLA8Tf=-h- z$Alw-uUQ}Gnotw;9s}V#6BY*d@}A$DuqgQZCsxr*y(g?l#fE3T(n!6Xnpw0JSYuIm;z zu@kWk= z^FygQDA?lTIBYBnrG7%C7az}Az=}}nMifo)2^5+`sljO5#V1jrwS`ijF$*VCSRG2S zZ4_^!uqKqs*%QL46xN1PTalCE(<&gW3#HCOe<(hkXVxPNP#49UFPi9i8$+oXP;|xD zy^p7D38iSV760XXl=2Iq)OhCSZ?yQn4y9^&&)-=uSTyUwEIdr1BAhyr34N5MGccSQ z3e&LoF$zP&sjpcdk5d>KPR*jQg~I4?YCco_1chM(6Y$(rDcp;p633|Qw1q$23 zsTg!v@rx9;hg07okHs%h*bz?6WMyq*>Ff-r=COERqxtg=b}F$%|IITwkRVRH2Na4TsZS_;NFj)%7V|kDQHV!UjTAnnkcgxXhmI@$ltOVN^(qU* zb{v#M;w|hUT|#G~y2~T+;m~EpCDvcZN8%eXR2TO!X+k7^0~=$hNfRUSg`*+$3>8hn zuk}UZ{2*j;FFQ9a68{?utlZ8`kHmX3C%sLYfgi7lveOrDN39kl{t-I3A5y*_%+ADP zrklMWiZhAFO~6RQfn|%0C3#-)G&H$_#OtBcdDGvKi^LncX(q;(#17rGFHR@kGyy-Q zvt=Ztx9ma1L(xnZBzA@-pxDh`NxU0kJB4A%@#XyxwMkwQzoY6UKC-Le-o!nL&q5sW z3xi2~=ojXBhzBJ|PU0&YY)Z^qp7`2?9>Iyc>>Eo#S&|N?#D7dE4<;k?iSI+xkbsI{ z5gJLNf4B-l|6m?!Ke2}yW%E%=6-ZWov^TQSmDxQU*O;cnY>QuQdm%9-JQ$7ChMB*O!C3UK#J(2uiNPs| zCUKCZXj5=B9-5eK!sg&04)JqLI4hvhlbCD5c|ku`*gO+1bXhvsgiBp!53$T%8QhC* zn3x~t_Oz|Y<^{-M@kaEYlEmR*YVqLn5xC$8W$QzZV>Mx_@x0(-(0xn1<7Mt_N3x=bCCYFRhL+wTbe&8^%)P%fX5(oU{VSY@iAQ;Bxw!(yp;1V?4 z#7Yy!1!FjRH<~avc#loA$H98} zI3xTzTBu9l@07qRIclC`xrzqmY)j{wP#EwtqlxoOC<}6-_7lH1p?~le%k6vV8z0=udoDF$a`03xgv-nqGCg>X9pI04&y3(imfrPN_49)>Q0xh}Wo$umOGuQ(47zcn+eUq`%t=x+e}y&G)5rY zZo+mt9=G8r*Z&ZPNYX|lzvrr^RxfFTQJ!s~NZMG`$@kG5lb9i}~EI z87}f^+b6$aIPhuOC%KhCX5O0 zMWrNt6ZQ%Cd9!4m31fr((3g_=CX5Rfqe&+VOxQPghWB(fVLvnDlU+>MKiI(v?P|jK zAO{tiEDW(iCkI5Vk0WLEIA`ojE-V+%H&K7yE$cYPS%_O3qy2rn2Jo+hRpO2%9y{!HVcgg3vpj^iKe83(eaW?O(-)(m^{*k z=>9=xUbftXfkBEnSZRqFYPv7kWMlluU^{eQa=nepqk|NC-Z3F+xbZZL;ObpW&a&WjsL14rCaeg~U{^WGgy!H6Y_lhu z&=yqe4&eq%=(?bd&F4lF)(2OzJKkiO+ZY_f_Ia}ZVRF)`Q(Ep+#W1ofjnfF-4XDE zy2-zraHnmyOg?PFUBOU{TFFO3*PyQM3l3un9u09f;-dk#StS2q$=MQ&X6CkpIB|F? zXrco9r)6PVz;AsfpA1ngZV#T!hwzjM?+1TmLZ7$id>tG_b?|}--vm9_r(ZNv?YsD! zEUK4W3kk)4VAp@y;*N&mdoaFjRtkBc`2F1=y<&0X!F>nDhIntRlW@0Ay4zn-h1(&gWMww9HTIs$vLKg-zsr>f0K`?GMTylc^V>I=W zlfoPaoQav7Vxv`aa1zU4stsgq0l(OvoMythU@gmPx(VxppODjJr3o8@=Q(;DXj^+v zw0U}RR+tmdCDVgz%t=^a2zyA;x%PjL22k=$ z7>dyIe}l}HJj-y@pNbML*~)O9PouTuU)+LT;EzJ)N?zdcLjPDak&+h~j{6T$o4>?s zO8gR}qGVftgv)#=Rj=d~9xwNM!b&T7jmIneGtqZSw)1#@{~UD0lGi6AJkT%7MR*5~ z5A~a%2uj{$c%*+2lm9luqx}=m!b)~BJkCD@)ll*d!{dGao>Iws3{Uolp+A>=!0>dR zzxz<~5yLb5Uzo>F7_RouK(i?Ml;OGlH+=5rOxt|_Og{Gu9$(<|8~r8U)gZjkA3Fx& z@A-ANdY|8dF8SeNgqQgvk;#%DdHsqY%y_)e?GT!S+xf7N32ni?Om!sm0?w=pdZ6c* zL`_&9Jj7?@hQ7v`jRAjrsl+$o#NalTOs7y+SRk8%2XMZmOK1p$%|Tz5M`36RgtLM$ zx^zhpVhYX+Zbc(2fh7mw!r(l#`I4TY8eDd1a00YaNiP$w3>wgoN_vNm#hI&v*~~$o z(B%-W3nnwRzM+R9+!(xvA*7@t^d5v;f_0I zTXeUQnV~}T{}+M=mS}Zo7=&$Z^_DHJfYU0Bb!@~j<~4mF4`ExxWnHEZc1Jk29}n1n zY|yxuv%UQ2V4h9>VFxI2vP{+2xe2U*r6V>D$?q{x8>D z%{bV){@3|*L|b?fTb;XzWtYy#4uX4-7MKLzetSc=hZYW6??r@y9 z4FqhwSr;mfLwK448k=+0X^SWOVcaufbcT5{Asvit`32uc@t<8&!9=OS zY{97*JA*rK&$07%W#&JW_{WTm2ly_Xdn`kE%`D6x{m73NLn>>A?&uQkzUmSP{u{*@ zbXs|j=PyknyoOeH$mdJE-H&3T^ZYgrOdEJjzQ1obgijc-Ka!N1h{2${O{HSt)K$>3 z-A}R9;KhQyp*NyEy5Gh}(8Jrqtu%Y3InaE0rRTrG6Ib9w=>^<8gvk*OlwQcP#ZKj( zsMXSocyn%E>18?4yZ)u!ap>|5IPdvK^4cpHj(UCX!?k&(m-NR)6|?YP>7@_#KyYtH zapg{2>4giBm(o8ln%u(DYvzJ3x@&opqWcrWd0yXcP?CkESFMHQqPv>w(Js2{M)3OZ zv*?nge`Ykf<)t@W1-j^N=1q$3FANuYeP4qrD=)p_F-R`D8}l>K-Eusy4}XFumfp%} z%C3bLJTFvw8(pvd!6?Gg+j*zwzs(%q#nLJFXO|#+H^UWvXXxtEdl>HTk457ty_eyE z{&JLZ>3s|j_2;28m)_3;AL%DBw3R-<=*RhE80Ui%am{`H6bwP75Am9Z{EJW@rGIBK zxAdHbZ#9)Zd@HVhf46B>2tUH(%R;+No9UH4%J?@ST;-MigW=7g)bT~Q`7sJ-!4_oX zyxHuO4NiVMEk|U%gl|QID}CZQ7QjM|ev#6rbH^dm+$UT54CC_rwmt|y%P?M~WWu*H zoac9CA(;=lz~7(G=EwSAoAg6$rO&fYgP7@pg+nwfru;kKUDER0u~wDbJsEU?#j?+gAx7~)E|GrZlu0e!3V z-wf~ck3)AVeVyTt{Zo;#(jCRP_v_SqeC}J^&i8dV)gMMw>D!jcNb1hs5O!KFBdI?z zYwuV#BdK>7@4FP>wZ4e8`yMk?7;%Nlh^;vHck=F#-C{D{-|2$8O5f+#Q*-mmCUXVE zzaHA4Y>Mmke_?nk!y%tr?#iYy9QN;Kcsj!o{{e<88IJmoFnj>RIsO)g4`evkf12SL z4EtW+MX*Bh%J$LLZ}#mA}L$M^_Ys= z!wA;$sGCIdtEQGUWR;QgWm1#Ny|Twq@*8u@R`u8)59Q~J%j_*EID8nkx1gf_3s8z> zYb$VTp5F(3t!y1HFYu3m(NlI5A2h?i7Y20MZ+XoEpYIEmt!H?le|`^ykKy(8{y&-a zV;R2Mp9ZtOYy-nPQzxKtlx<|OV*M!xgB0iVGxVr%{*@N)>m7a3(b`7O)D?*2{i(1z;zqV0!?fzx3dLyaNF+!C6bu7}hDUy1z z7lb=_*`{dfHJ-VX58WJ1?ZcwIi^3Vv)JT@?-Ms9qXsQZ&vg~o{hV!DSVsz57Cpgaa z&rN;GR6ohf2Ii)2W}Q8CAf7WcH}xZ1%GN~?#^t8?agDO)8TB#Pv&DADlFDv4OkKK9 zSW99wcEK-R*TWFzKa;~4DcOVUs#WQu2f(j^&qa$9Jx^s_- zXoPf*r|#xGo__+`Lh7CrW++iV51CEf%WzK5wx*?C>c0QO-J8HiS)G5p?>m{~4P;o~ zF##bPpr8;4J17cSA&`)m1kj3(lbJ~}l4Qcngaow}EiSD~-P&4r>%JDPYh7`x^=}na ztcq2t)}?Nswngi5f6sG%lT5I^xA$}Z_w%`*J0HmRJnwSevp(lJ&pGpsgtMGq_;CCo z2|G>zdME!8$wIdC0yE!Q_ z@FeF!=-+(vZ8Ya5q%hxn8O=EfgGj!vx*hEN=s<+uk`_A6nS?f(uX`p+ofUGg`Zwn| z9deEOH|IJ}jzL)coAaC>#$2O4I+ z`ZUX&2Go7N`ZUX()smM_y|})@X+vkvSD$93vs}`wKFume-cgeOnZ&uw8Ht9K|G8XW z>l`KJ{Dn032B!xdIbVI6&CY14JM~?za{fn-tM78PGePR>Te)|QE5CP{KSaGRN4me9 z0AZ;5Wx}rf5?_9fx(sDbkCFW*iVHM++Ruo=BjX_dlW{6{5%y-a=$EsFvgZ<2v>vD;~YJ6o;BiRlB2Dz`!&Gwyc?F3YWwWlQIHjJ~IH+brP)j;x#Hu9EN)(_tsz zsmy5ZT0HRD++}uIC0s)bVQ1tnSMQ(YZbPHVU13Ywz3#6IA=K)bYu2OgCajq`l zAEh3)u&WFBKTx5=ZI{@N*5@SMKGbCHS{3@-|3PodJyyM$C%HLj3b_FlHo3a!f1C=N z-3rM`!l=4}pJ_2Vr5F_p&XaJqb2~=bg7anGSgoiuzP^SeKNqB_Qj=u#zm+(mES90$!Bs>b=TAT&pmmPTSX!&8N z*S!Vn?YEZFS6GmsukZsDSwWJ%!qsSg1!hlEwz~&fpkRacgdy(Mi4acIiuSn=$YXw_ zk&SdMNz2JvX@0j8-LGJi3PtW3w1Nt zK`n6qf<|0$hF-SFoh6r@slwszMNka|XW6okZHarGTz0lDXSBOVz^W@a*Op&P>-L|B zo>*{!#x~yTzfv-Ek!qSEum8+3kjzG)Xtqv1S;|Ruam_7O0O*S`qxNdU!t)r z^7>bzM;Bae%d~Ha*I$M{RB*kfsuFR|gLJD()n32sIw`o_mTf1?y#7@v_JTWYsrqiO z|1zY!;J5mO&0haMMY`MQ8Lxk&@9(ls=Rl3>hPe`+T zMx|T5{$?rY=T*Ah>wiIVv_qvWUjJ{Q77AX`l-=p|e~!Lauv5?7<@FDfw7jWLzt8J$ zgqAAUrP70Vf;6AMsPw4U{}bsQZ)?h)@cN&UM*faUPka52l>A>+de-Z2msEeLO?8{s zf1cFQSNimqy#5ktc)99)-r@D%BV}Fec^?h@71`G(J#?s7e7(6PsEq}Mi|xafq4CSy zsIW}6kL7wWfESjl;B~`DabblD*{&3NVWkQ_cL?gLu*#N=mm{s*e?YGk75>mZTcVRq zV}&Q{rZG#mgA{Jkw0qqaXq>`RRLFLZMVl!+RRy2!d@cO3tsA(p3l#;t#V)+U{>k!G z@~+YgE%zFXFojn$zBf_4g}-KeJ!o}>*DyZWk5qWA3L{V$_&wXwS%)Y|=Rk+_h z6|JQ3cPjkO{f89J11db=o*;r*g?iAH&G?0873v}P07=fndfCJ7^-}JStMG_hEtz{l zg-6{fXsU%z+44<;t?mz}LioKc-)(r>eN^sw+Lo_YyyiwEr+={JI~8B~e=jxiKlZOs z*CV-qS;Mk_8S{K;qBqGok+GP$*#5T$!eRHJke;P`m(DleN-=iM?VwiS?ewCi}_$Nt2 z&(%#6uXy~=OY~zj6|Z^xL!qDw$Evi`C$ay>$z_|{sW~<=6Gao|DDI*1r=X7*CX5guscqERwVY{ zceS*;1s<96VL#kM!yqlxbDJ~#cV$C5M5WU*{6*5^7O8Z4hJT}^>~N1XpEEQ3w@YQ4 z^}e%lUnZmqz4Dw4f7eh*l`5SJkAt*WdBKvl=N?{M-1Odl|}cPVptS zvl8t~zOr3>sVy(XvD`gSG{u+cF1C^G%g9vm<+gkS#_w)J?H6BR--=ttyNi+e;w$Z~ z5Q^NFF`yM+rNSila3rkwYFl2LJ;m+8@KXG1+p5P*%e?@FQhbd)4nnCl?wG0QUBg}Z z(x&-dr+?rbGs88E4fW^;!}q%$>5^~MOJZ}+M(K?&KF_`Zf;$VHviN-aWL#jmFQMNT zU!a25oeCXYe4z^2t_P~C_#zd2x}IPBa~1F<4YbkXU#Q^MCH&%FsxZcyd?n%>>XpZ+ z?_6@~lM=+iJ5vWGlRjCeO`Z9D>daTE%Y7P>$Z(^)iD#(yFLKd-Co6fnJ;+J*=h9M`x#*I$NHr zv*OHMa_>By6=(iM!t-^upZS)A7dT;bsZ5UX^|zmss4>xEj)v{biM zyWvR?Y!#Ne-=L#qW~#8vojL}B*-lgAMqznm4$(8q-6|-$Of%74;rh|3GiU4O{aUvJ z?IClH3Ts`z#I{85>2P<*nKBhR-D9MbD^%!m-$9SbtWqK7Zk4=LtI+MnC4yxttamG= z)N53TyFWxmGMB56a5tgTXRc5o>3#|wnpvy+E_%$1_ZFcYXh+6=oFV8>-pq*}dDoa5 zkUBkBJH6$;ExDblg6*DxzLhym1&@1^WW7WM*<7sn zK)b+2Wb!%a*ij-%breH9ST3AuH`=9B?ISWiwCcW-Di2p98H=(xd5_JyX3bYpF?t%W8 zN+hPI`eQ1QC%y-9ns|Ke5--GT{6ARkn`$?uXI9>D09%4dG!groQkk785#y~#OyW$5 zcsc%?h-XR}t;7F+7xCXE;<XSF;@DKSrvG!i7Bi3ynM`Jt6@zJ*>lr4nO}U71RV++$zX-Haz|!>f{n zoQSwhLaODu%lZ?tRK$n+6S7PavJ>KT7^DB`(a?9t;xZe06-pQX?aOZOe_Xvh&OwR} z2DPqdO6$g-BQkyR-cls^Uy{kARe$3eXgS32wZ!l^@@*e2YoD_bLuovMqB=&43i-68 z3-m`b)ows(G{9kSvc$29{duu9YXyAy_L$WY>%}vET7G`z{PoZO>(RTf+j;i~M?bcD z;hs@@j=J{L#TV>2cKj_D-|W0%AN}Le51%%3(&In$tx6vAaQxdl-q>_Q*6Wuh_guPl zYxL50PG9=)r%zqJb;Pq*`zFPveNb}q=H&9%Z`!ivVGEj?6GI~p3_X6s^gldy z%4yT$7hL`RBfnnJy8n&cXRUbbnj<=XKlc3#wol6X)yt>N9sWi4RmYFa-FofV?2h>b zwY|$G-~Hg0IluLdU%33{S60?PbJ@|K$ELS`a_Y~LvCwsW{=TO-XM28s_E+CMeBOs0 z4cGqjnlB&ztZ)5Oqoh=4kDCeKagV$XZH_Y$p6^-C9F$J>b10$NPh#|(xKLgnHs`!K zSjjzF-YVH_Db*5qNT~jNymm9GX*u;Vom5m6LNg&O>!Fh!&BF zOR`g!WVv=ujtH`q*csM;^MV{ad#)w13>kq~pq2z8=j>-s9xIpoGWGm0J~C5I4&Tq3 z4COq+wrjA#1=U@QYi8i~Q3vY9qg^{=cuppsm?@`SJ`wlI6a8r-hSL2YN=oG{#9X~s zQmgmorJcpSWAY^C{9ru@%<@MF`xG#tMW{I;WAZNlE6Y1mnNV{ z3c_TwIL{QL9-p9j#?2G^lcZ5k8i?Am4oHg_mtu2r>N%D*Sqf1~bINpk@mN!za$uA_ zI%~<8UzTg>AC%c&S@LrIgMV_WjrQ>Ka+LnmpJJ1aXUzHK=-ktA8EacED@nTxXQ!LH zE|e>0q(5xXqe|!W#{qrV|Dc&jA!f~~DjE-EFdHJ9-{P^0kd!$*fGRWx(45h-@ZYu? z1TxxrE$E1pqJfMyhyS*9gdlan5rZ!H|3VC+e31)*42a*)1xyIZg&=jo;9Qss8q+Um z9F)!f-#tPG;O`d{8j=*0Aa%juf|7y7w&aDqW(c=1k_>#LaBZteU}9=akEv-;iRw6J zH3_JSWMM6dR zkCuhM{U7KEIV6y@4^DR&M_>-#>5!oX7sx@L?9-1P_A;`L*on(`Vpcb6Mlks^&mrB-oLRtV@YybyekM zGZNu-GeWV>&RExsa6Gyp5>L$N?Fe?wi1T86O#$cQ5v%o(wVf@I@Y=Res3aKgEa{4M zMM@&UmT1YGz`~MQr8DQQpIy=$?V3Gn?V!_Zqg|nno^WJsXE4+r?fPGcD6uhN{dXBl z#6tZUVJ2JfI?Vs>=Kr%&VV?dMVv_QWCBl*ao2d$RM`v_*1e2|?c;|naiuA%*FmvJD z;EdMZj%W+-Mw!Huu|%qIRMa;%R~?B%_#)JQS6sLkSI_$IuZ|@G$o7o?7m9L5YdjK> z+zjL`)R~B;#Q(GIkUG~~D@9Z`18@0?h9dpH&JdDbg=Dt|dpeSVt7=CZeJKv#|8T@eTbVx@m7T9_ffAEsijW*_mn6wiD1$&t0xeW-;mLSfIMf*)IMLS`<$Z}{Fc9r(l|-g) zii9>8Nwe9NOp7EE>5j)b2d>2zy#|Et#JT|?5efCgqsff}N4k6Cp=7*c;6P_br{tcG z6)6zuW3o(npr%*=z42gocSH&n-*06d47!i{BK1 znx#B(A9>0?a*18MqQv7#yJP0}j?Deuk;Cnx;?q1CX?Hzs*+moD2SxO}WluV6*1?|a zw99r{_I}u#Z`&QQuC^lmBR@{DrlBm*)La&*Sy^3gNgoMFeFeIq_pRO_LaiOawuIFZ z35H@_m33v&t~P5~u%o)CD`YKQxvHq5XwLM7(`OfnvM-%GYhlq8X~)4tnfTxYyQId^N%Si=?r!E9EPG!M*2!RXG2c5_jI=W z=i_a&ic0DeMJ4EAhqZO}EL>Pr(%Ka(G3puNPV}T;TciZviEc}_A6AM(tw?ba4=q7! z5#sLFa4;E6mt)9!NozdV87b+Gp>!f~T$G5mbs_zs_F&wShNDH(u&k^$u(YA3K2TO! z*3ewlXf10Fgo52xFM4KoJMwR}EQ_|aN8;r@iH(hY&GBGsYcym9!@=%kbORb|Al%tu zRWz(>jI^}`L+kL{1xr`PxuK_7;MA%JrAv@o-UJ!BB`-xygLw&B;X_H3P%&c zo@Be|9IISws38)M#=_Q8sDgmhQJ|{JO14W}0Z}Oy6hnEnBvd=1RV!8i>b|*ZDY78_ zEt&|KD`nV6FWC#GVF~ue;_J+Dy>x*U=?cX+b|+Cg z!9aH~k?3xZOBF?X1M7Q&9jFZ}vLVvd-`Jy4iSbwntw`E?Qz+QgEM?pU9TZ3;x-=2J zP&tu6HyW*l5()PNBARh4AP-5YI;#W47C@=vyZ#9)frwD>XjkGNj0C%z@b*Zla9jWd zj65eo7Il}FPg5j`&Q@Ppw>lVK7VJVX$E}vezQ(4en#yPbgFOm`O4ZW(?LynNpqJyp zw!nI8RaZEIUKLD6!cCpASh775uBcdHb@g;=0=r^?L_5+SNOZ)INK~$cx@y^&j3lhq zXkS2X#L$3}Z_=h|EnU@(E+b7qdeDjpjINgMU^LzvO+*5?4tYazIyz7bC_&L2Rx+4a z7tmD2TLZ`%&Lh%rEID&#vah?#LOa!*ND3_uR;D-kBRWy0S0<=I_ z3J;|wiV}lqW3sQ#sGC4yu!tVoiBdY%XDq(4Ar^y$kV;4Y5q)B4T_6!X zA!13Z>P0E0T2u}CTT^dsB%Cn%DH1oGr>60UK=rDXMhAssJ$SH%b}YrfjvGJ|?6O+w zx+`^_U`5eFEi~vFjPh!$v>{WbakmEIi49@&zP3mJ4bZ~NgaZh#NKE%^>j;*i-a4|jL=F`1C}c7fcTjE8+A9dL?@CAO9x6*I$gY{I~l+uwHtM# z!=br{drS52O!OLbK8-LAt7ITT9S`MVST)J^Z~!lE?h>tFG)5w_UbJ{aQ-iV8P?T0s zEHv$oEwzzoq9-0{NLWzX&|D$an}I0Qmet;i4zGF%^$A7Ni*ncQ5wMambR#V$Tq&is zbe}2B9y zZ-uh&&pz~G1Zr1hG0kM8#FgkL0ksO^5u^CR;g%qDY%;!4^+#MaBMKZT1*OBudacd2r`L(~sdXFhRO7dRt8xl7k&h$++oN zC`cVLI(uM0NDB?bQPDao8fDTFp;l>GhiZn_>>mtO#bM}%F({*ALYpP^qZMdu4%F7H zToI_OYObni4m4XBD>k6n)x_6haJA68BBo?;VN(UPMe|V&RaSS`oCR7AX!vnyDWUd2 zthH5|VOu=b(;Wy!yI~lpsbK6XX%Et?pdZ-+LhTXMpq7$_K_e9D2$*5q3b%*4Wi+vR zR2QRE)??sCi6P=JRb$E=XjvDC_qBE;JA>V`tVB!!m$`KfP4l_*OadYi&Z2OA~pn57w8f(RAfh_Ef|88 zbpkq5;CNVbNP2g7pfiLK95vCP-L0;z%L;}%1DzP9sPG$>9c7GRGk{b;rRcD&%?Vmx zhOvRJYPIyLl1eW{QD2xHp_S{6QZHITGQ^8*1N$u;kp^qERIh17DPRzfte0Lc4X$EY z*~*nwwI&UnxKw%`iWQX^Pf9<*wKBJ{#1=uDX=#gh%g`%&Ezura2Nj(%C~OUav9?4%Kau#SF3bgiOAYszQY&Gr#YG=t@e+3#<9k!|(8&K1twyi{P17d^ah{{N|!_seA zwnm$BIM&;RQ9poIXG#{0gGKwjUeeNLR5G-2Tx_tG8W|nYlgglGn|czWGpy=hMT545Q4UP46jnzxhWLLwuYl$XRQLl_u#DegWgfJlxyBd`(-NUq6OuE`R z>UQ?4y%y~@;;gWc#m;CK%m(xz*pxCQK_g9RaGAGZTODd}0gb0_F=9}askWmkJsOEb zWF(sjXNb=CFu--h+R$>>p)bNRN58j{J@J;9s6!0-FhXGqi`|dGt2NptBQZ3)>M)~v zSdXEuKoCW(-G=#s^Ff@j7*HZfd9^&MSWGjW&S4t39>IV%7%2oTAdIw zs&a~9ri;|0IYJ{P&8!=0d4pK(s+AHaSnJU4L{5mwq&l-cl!SWjH{P^7TFh{0G@Vr@ zHwTmDJ*{PuIBfx%dup2?j4zZrT*4@3jE*Qx(Yz_ex~8VGd6}u>Dw*_Ei-RL&GN&C$ zT2Ko{>q9T9eGcoXwFgrjR%M$w?qe&%H zdo4<=BcN`9$|%NBOgoY-AvHm0d$jkep^E~6{+06%C>9 zRTvva3|i?o(lP+i3#t>0-L)Y~yK6(tDywU#T!nJP%Z%`y+QtaREQ{F<#zKt%}Z;~k)7>zbaxqFay>4N<^ zfZITgTFES01sgWry4tVTM33kg7sDgaaiP9pEyR=Xk;T`ircB0H1I1(}ywIeQADKGJ z12tcWrK+rdds|?J5aIB@5BasYT^X4EGAo4B7 zh9z!>K-mWPNm}D(4sUF8Gdq!4HykM1#kBmpyI|THQ%`34I-;RTq-?Yx{0wlEbchXu zhZrA7OQIKZT%9^eji~Y773o#|U^O>Yl**r(@@JO(nJs_j$e+3LXP*3-Z(#-v!wfcG zH+mnUw*uvu1yfx@lWeds2Wo4J#8H!IIvh&zBD#KUt7Z>6WjGEmLIQprOxiZUsDce> zNmmo2%i0iwcLLRn)Q2(8&}JkJK5eRmaYl8GxGHo4&j}t>csB+i_$UI&cwhhMs~!;A z@hzb)s|*Wh#sg?fP7FWBf1#akfz_>D)bx8%X&AUu!*z?9f!8FK!qjbRj;-oaD@)o` zO;e+IR#GzoO}8YpTM9{PO2-iO`vi>d4NYf*>Brguq{cQxp|5(vVaa{6RdtrRBF)X2 za&k(cXi8NTB;i)k6%0#kff~FDx~VSE&;%EvP92(zLuf;+<#?IGrV5M(RKF1e3s`iA zcKY^S)v|-8l}S8M-8U^VSCqU5#MU!TD0C?}Kj8rsuXZA+U0nuzGwh&};SM!3Fbu{r z#EP@8tg;dhl>tQZW2_6Y&ftF&pKdC%rut~><4Uwdog9fe(_}W(uc>MjAA56^wO$6M zs$h4l17iymgZTesHfhvKdS6k;nfjY`ZmKCq;!M)e&dr=ZAhjX(X2XDG+9p%^R`Dr{ zZ$tjh)W5Uz?`-`$NB_>%zw`9(d`q-p5*|BD_fk#8Omwgo62h<`jvINAce}Cr0!P-= zH3!O9RR^r4$V?@cex)kKv(7oTDuw<^>I-S_Y_Cyv=mrH0xtlX=nQhu$!RktYoM=)V@yUp)wWY^e5gI!kROl z5QFZv#H9x7wk-zLvF}7lI+!u9Qq9LScn&#cU1UJXN~OzBU*XxIcA0ZRXTqVT?rQo0 zQY}inCB_mfGk#S}i{aXYIV4L44WfECV5JH6Wjr25bHo4!PmatQv>8C@N>}JivuM@X z)UDIP)I*?^U;@Y_7Md(<1>4%F_)=zv%(yJ|{}v5eUqIYR7_~a~Sx^(A1C8fL(+n#b z%RBICnP!ezs3uDNHT`pE)$aq|dE=iH?+olLZM$3o3F*{cT5Eqhp^wO_Yii)S$iMMo z%iIC31&nwc?$*>VYpO$TwPmKK=~YCb9>t!U@c*Ubb6mYa@->I$}^ z32{Zw>{D;BbY5}Epnby73U7p~9P7l=ZjI_6w3q;w8qUDEg{3)}lw&-K_rWew!xw^< zbA8M4u(eYLEv2LmTM|OlMOmo3P?wzf$^plnp;|}c1+Vp#GaMe z9=zhAb)r#GV!A|tXNyCGilnSTjH@u5ME$K9?&WxTbCc=Ptacmnz8+*skyOc zz#M z1|{v7ADZE&-_l)xvV}UAxujS%HJx!x5R!O;v}!rjjmI0u)PO~Su}CHzYwGG!W|9o| zXq||`s7UlET>z0rptcUKZ|75le>lreP z8UOs?l>nVQ$rAO_+WK<1t8|sR-!w4Y7)F7%YZz1Fm$P*6Zs?7h&X4wrq#(&=zHZuX z16DL)A=IMWP>V6O8PQ=OW3?EoO-(Bs#U-bnceFBex~>k4DE*eRdbMuk)4VasXQLQGrT9jr|fz`fdj8;~|>Uzvg2P&rvcXz{E z4K6G2*2IKqE#VvY%;nARNs|KcaX&I=@pxWG5 z8R-+%Yo*VYS5`Hzsc&2%1=m=H-npuxc~xVTB|gahskxi1GH3( z3kPGL>PEVLrKS?rzMfn3e6^NjW+_X0;=`+{N>g`YZfWn(RjYu`wZt=y1i;ATP^*i& z##3&z!!mL5u4@=ro0cUs7-sQS*zuBfS=2_OG#VKWrASwo7|k8V{bJgkno>FjhJUr zpuO0?hF{Rrwcj?Aw88zNe^M>=_r0|b)d(`jG`$)lU#wduWT^!JxCnHLW`;>rt7!|( zecD>fH#SOHNFl2cuEVkb(_9x2OTM)gIs^H}91>O;N>lt%LN$O)UuwX-0gDM{ z{)ISk9xgw)9CY;3ZVWvm50k03K1&^|+(e>omO*n3t4cRF(eh}LMcDxZDD^bieSiro z7q{RG?1qO3>IDuM@tBy=zS(T_X9rknCA5BQNn$;2#lpVY#QW;ESBU2hil1`XCtG7CgSp-|O% zpxy-t>b}uOB>P~^!`?TBvGFv+tQc4hHm$|XjIaYldx-eSW%4BI0doOUqZ~l75Fkoc z6u$A)OG7l}UseGpPEB>w%6{jeEa-*eGE3d5}qO5BpCROEC4YJ{;-)otk;M5qSi?uSD zlC56i7}Ck3dKl779o0C}=hGcoM(IE&Vz0AqAHv;qcZ=ssv)sQ6z>Ig&VkIu^2dP2a zxNLjiy%taTda1NPs(ZtAJ9vv(z-%m#h>T_2)bB2mW(h@yRqtq*X!ACm(3srA&kJi7>F%+*D0L`)kLz+6L`|3tSVx=wW zpG2TkHaXFm7~W|72fF8pT~jvC2C$eGvZ|_AHC15?hZ-)JUr2RHh5zS$Nz&_Nzl`*B zEgwl%`jU7s(T$#tgEHTOcN}d|L_V4`3RN#+>cy)y-P+1=rRhUsnv|y0+J0(w zI&i?aemVZ=K!U177m|%!{X_o17zu}a0|(`S_JsUvHgzzOX`|^TT`^d9GSk^$)m1c^ zU2WQ7(Cs1|MWu{ViP8dtx!&C_&Q4e}^;pR2#1w|+6jmUx4%e-ULZ;{GS_+%p(5hRF z$yU>ap$59JCxjKjNS*ADkcpLX-l(4_wJ#(!3x|uBsv%)j^+l8YmD0b>6ecL#D44@x z7YKa;Smx;pG>gm9%xck#Qad^;dm|kkk{>LqK)JTUjE3E!JDs>imi1W%M;MYDLv>mW z?U-30+s5gP7OtCkR>6_f@2QMiO|r5tOJ_35VI~{L%)Qq-BG$yV6~x0jqa7Quf3yaz zo!iThdf5L#wCPY3-d8l?5SE!_)i*W$tEu8F4E}I)SZ%<8N=~!3jQb9YD5gZs2&k10 zbI_Q9vIR=}PxYEW6S{|HOq}1MYGvY%E^L-0v1K7DxvpMjl(OV2WxPidabsC=@nx`! zfU`;M2D&4`ED0K~5KLy>{38=7O>oDyu&ZKxs16`HMV^fh*&ZhXOb3qK<43;7O$HhQ#YaaIQ4%V?15F*_jo zXJ}k#FgC3?gxBk&RSOd9H!0tgjEIqNk-Aw@ehS?a4QU?~R8t^=`$aXPg-NoFUe z_{|=TvL`TI8PRh$|dJUG~QoTmijPc=V8yVQYWhS}0PG^H1=`T zH_gp6NEi2Sp4E~5`+L^Ivb>N^t3F(e2_1S>>i69BZxz=Esud`62+U-PMN{`H(^atk&7i7mRYW-%%FZFB+!i=&X`*p<5Tm_H7GMVFN3}+>u8H7+p$w` zU~ffWP`A;gMD-uQk6=7N*r;QyM4b_uDVI!6FmEyg7rkU0m%hZwE0>)u!%Qr;;|$5jK}|I`id7}~hiDas3bEis3V2g5Qu z5I42>b7ZWn?7^2k(Bo+48fT=Ynm$aqTZ*uy2`vmhVB?vx`rTQ}utp;*;cA~iTZ)~E zZUZfo`gVm5bn-0S$&>1ns_PrkgQ}|0(XC2x5%t@5YWAkq9|x2P3k#z)L(~7)zUn$d zEHr$*E@Z_}n1dWTq9`qC8Mz%Q+`4dR_H~;5 z0E5;=pvY1S1+CFYhuO9*i=1ktnl(H#*Twummn0keWPzs)`vq00a8isdpJFu_m0VNb z+<>oQs^1ygR+1a*mYq=3g*E#Kz8!{@Pn4XQm5A#Zlcoyp6A&j^pmxv~mUOUJKKNQOzH?R*OO(u=K6m;&`5yB8nKMggmOwkFPOXKD2Fq@VwW%+6ny)se zMExGL?9GAx#ZutP#&9{NHM9_G68$SF(U__>S}@Y{WZI!7sH{$>O^VbwMJh#O%JyVf zE2*gww{FOSqb$i_^iB0w8Lera!U@-a*%7wOS!`FvMTRs&iKgoUC_u9?Ft81=--%^x zD5F8pM^_r3sWha)?$cUbH-J^HGje)1>hS&6^u1rmt}K_ReUN4tXxB$t+p+1aw?P)O z(^?BkDCJ}raE-~xA+w|ASX*2F9#@%JrH%S4&9}Nljns5uE@Hu;mmx|<8cWCLav0W} zJ79yEbV%5}NH4x4tJ_tyrm%Y(2DfaJ>t7`l=MS7V#^onY%JuN~rFN$b^6Tj)s?>N3 z53zoaL`EXjPS(UfSgZ#{+%puMo4|+?E+=Pvp0LrwX2_dVz|CP;s5D5c~e2z z@G+Y+PD89KhRe^$_kZNA2xY@Z{@82I;{DkJpCUb{X<0f{5>uHoC@+$)vRU{Ol$Q-y z_7ns&E1*m8_0hW7R@P9bZir{J*KhA<=Vgqs$J+bj1!WU#YkFd1XEKPdw_|8DY)^%B zQaxP;XKOmTvo&1~Odpt+50;@81|L8l95`Sm&ifu1bdO##=q9xmbrF7_h@eH#hXxM9 z48oLQ;M+CR@rB!gv$B`qduPLumLA!3hpsZ+go9$2Zm{%Ta|G_=bP?Jd>q;mGiQQcB z{UgxokyMN*NNc)mSVpf)zY7Ke+z->y5vCjO4z__LP+$M;2d^cRFWAdB)AcilOu@XR z!_t?^$#wXyy?*w+PR_{(FQt<&(*IvxHx1Y9``px*S3k|L(d|_PK7uf4J_#eXctba_UVZ2=+hshJCL4 zHRRMAPSUS?aG&e$gIpvR@Pk(%=;t;3O)r;MAgAlC)O9c8xV*h6^*QqW2(_X zPMyo$=eoZgW#Pw2#u{*45iXPZOFj31ed0U(7`*+#M5TXI@fGhA z-Ii5&q}me=0tC8)51m9Jani zeB)A`6msfZH3I4R-GmC4_wW?q{}}vF#kU&Q$vvg`FQ2htq;H`K%U?Ms|AYHnxBha= zS}zyyle(^p*QJiXgX_Ld37|YzKJue;>FL{s^j(GHMffjcQYw8X;yP4QHxB7%*A;j< zS4seJT0ipYskCahT)Zsltkg-IO9h2#&B)q)ow>0XI1vBkxg+sk(v}|I?i=x2D>#<= zq~c4-DW)IyT6?}r9T(#D5$Pi2^pwc?^e2jpH?a@8BUO6lUs_$2L<0gXNQe0JJdxqrw$=hJIc&JW$^{NUI!tekz$~uCoi-Zv zdnnHvIonz~NFHJ}QI>c|<0(PPlGD+sAL)1!Uy;f_eSfRSQu3oEcl|T;Nl9xGTrGT0 zg!w8i-GHfsu)HKlL#;mu6RkhYO9src{xilP6LDWtOpfhqfJx6Pm}2Y~4~kvV>nWBW z_Atatja42iEHrkEr^x64xlVM9Z~<9G){;k%VmHWjAyUdqk?jK7YNX{mg zkSocxQ9{CZ8o=Bi|?gL3*JY<^IuR5jmY)L@pwt{+bxOfDd+$!4;J>?VIio=sjt-bmg`XxQNWHE`?X6o_zWI0(+t|g=78RSLe)#UBu1LPmbm&v!u-Q>6AGz>YCu0zPB zWHT8gyU3HspO8N%uO@FJ?bvBl0Zr zT5=2dAo)D`8u?dp5BUu_1cQ>KYd>-VSwYs5N0aSjg4{%&OzCZOukJP zW5||tl#?N{i#(A$gS?QulDvhyk9?ARfqau3h5<~TGnJf0E+h{pSCK)oliWzk&!0;? z=aZL{@;h;I{BCk9`A70q@~@=)I+I-g4LJm+hsgVp#bgNySBRc(AlH&H@^tb7@(S{1 z@*eUr@;UM~@?G*XG7|%qq^FcTlx!sBM>XX9@#F^bRPtQ%67qWTPVz}|8~GmjIr$x# zgCSm?gO?O5CzA8XBgl3#Np2$L#~$SVi^*%rEu{REhMa$ze2Lseenjpiy?FPVTtAY` zC#R5$$ra=pGDOD66G{0cIf?H=@@DcL@-gx`@-yGYw~{bDe^^f7x^){4hF2m*GHa4UO?VN-a|f4 zZX^Fp{*C-6>2*!K#pHDIP;wc$ifkccQOsNWMn?mE28Eg@G*TnNL=b_2kiH8<`+aCodpxA@3z0 zC!Z&GlJAk9li!g!m|{sfg zi`+^+NA4uwC;vfu@=dx%lKJGpl*453-BgN1jGrKwe4iB;OEs3E739t2z2xKM^W;wQJ<^Z4xx`yUP9qnPm1G0CmTV`J zlV6bz z%0kMcnrtGEBRk0x$TP^R$=k^X$fwC2Q1$hm*g?xy7hWr!x z4!MW?mdu%C(l>@YfSg4xCTmIgMP`+?kT;Nbkz2{<$erZ-X) zNcq)cdG0~vJhFmpAdeyCSC!@ZUUD;eK6wRs3wb~JdvXW)Ho1rVjvRKNiGKn)gIq+` zkZZ^=xt^5Y1()=lOKRKD4Lmo@6Bm2k;Ncp`!x&K!3 ze)1{uMRFJUG5HngOfmQS$zpOYSx(lIYsuruUUD;eK6wRs3wa;;B>4jQCixLL^dOU- zG2{W{EOIefOCCkGk_mDXc@B9Ac>}qXe2&~nzEA$0^c-x`GlCpX9z@O~E6GOkII@d8 ziTo*fF?l_C7x@?|Ki@6&nmN^Q6j?wXOwJ?A$(7{MWE+_vPbSYIe@R|TZXq8epC(@- zcaa~Fd&!a0OghJtQ^+~w60(*&k_?mGHSvrf z$CC$<^T-Oafjov>M{Xp~AfF;%BzKV?lV6e9GtKk&BWI9{$Qp7r86tm3{*?SBc`bPd z`7pVI96HN9Zvt6DE+8w(268RgPA17ssP9#go!^q|2 z8Zu0-Cx1kqMP5u^N8U+3LOx5rO1?{$EHLR=Kvt1QkjIcw67QYVayo@Pm%NO;k-VGS zO8$|2jr^GWlFV9Y;vG%qlLwKD$YtazGDvoiedJl>FUf1kE#w2_@5vX)H^~plf07x8 znDmVx$B~oC+2mq!1-XX2hDe3Sf${F0oq$fWB~aw*wF2FP_}FZpBgXXIt%Z^=i<{~=!{J%_Q}$#LXl zayGe`TtTiOLu8CRkvxOEh`gG-oqT|Nn%qIYMSeypw!{e3pEbe3$&3v=*Cm4I|^^56Lshi^!|UTgfNLZRG3Z`{Wm-wZuHf zM~)#Uk)`A!av9l79!GYNedK2HJn}N~M)EH5QSw>x74jW&H~BT0U1rkjCyU5wuK?bk&DS%@+h*EOpu$%bI41`8_2uJt>km$PVxitpJZk&%Y`f^XOM@HE6AhB zHnNBOF?l|DC3ze90Qm>GdqvQti$K-kB<>bxez2p<* zcJdAKLvk;fc?8o(7LtdN%gHrlm|RbuM*d8gX<1iLzEPNOS+`NXm-2%`T=zVWzbbSr z>wU_f331;)Dcg-k&JyCfvBF}kZwrTDJ(%($A?_=qyn=Fr5Z8rxyi=HCStn6GU5NY6 zqWp8p*OE60as7il|CDf;W$mE+rV#hPL-`ZR-;karbNzloq`Oc!0zbq}d4Ul3A4Yj8 z<<;cTLR{a&^Ct^OS=PCfFBand%PHSL`5y8~@)@3gMTq;qrJUUi*~L1y5a}xxBEADD zmr`C#t|Xg;xNp4>_w@>~7vXfu=Lr$d&w2beJbu4$4E8ZmenE)q-s16s)sPY2LF6H1 z6=~rk?Z-=^YE(uMDRHav0CE~xO2UlQb_DZ73ALm|b5n-MHnNM1lbeNTPiK-pBQGSc zBX1(Nkav+!36bb$$nE3~@;&lH@-y-uWVUVY_mM7{M;;_Z`z#^l`!XWS_iKd9N!u3g(&Rv$X}9|lDCm}koS=flFyMZkgt+|CO;LTeSS`UMSe?; z^qBL0avWJm&LroOi^wHpJ=sM5fIOCrkWunPA=>%Lr0&y({8P%8kynv7khhQzkz2{9 zN!`bdcy>~LlYE!_8@Y%4JLzN~J?LjSr0(;EoJ(2vdqbW?dA1P!Z9aK8Sx#n2yBcS{ z%Om{?muf#K5~7_?5u&|n|B-eiGU|Vc5cLG}RLcj$iKgpFp+q7~>!;ZwLx20okwV1p zC-u2_&Ulf*A|akPiPUu9x!RvWO%I+wN6v$qE|e$SN1C1`LX-ohV@gdY9s;vS)7OQx zN&0>yM7quuB0X0K@%$}9JpVBvp7)Xv&v{pf=X@zd{KHUyl3&foM3x`UX}Te6x)Hyo z6SAfg&(U;2)^y={$4R;%hlP0VNt8DU@%)P^UnWF4?xK935b4=Q`6VIJwVU!6LZnZ= z`=PHmly8MhkIk4lcV=nnyafvvE+{H0Es~G=pSmwBtLJ##Yco2)&)>?zgX{qx)JV!Q2(C-z=c zIx+gz@fEu_W!MK!489d??eXrJX32S{`rh&>)%Hyzwu>||IuX}Q3|_SN%sDxC;Aez) z6;*rp)Y^wskJ}~ZmuQ^!l)GZ}{5OvwC&KDDpu{!ril+<#5q1NXn(cgy_~H(q*wXyaM; zZ{GFY)ZyDhecw&Z*?tZFW^aERe>1mF-1yy8&-M`h_H3)IKeYYCJ60^KUAblHuD;^F zmcDEHtn-RC+UFg&(R1F?W!v@^*;|%o?(t=LZz|Q)PmPYv9P!frSx3F(?k*cKbX(@0 z%dFz+tO=45drHIhsnPwN6+5okIC1K0xt&W)q?+EcSGkeGhHw{t=0j?7ClKYOox|GuNf%dyN$ ztqJ4$rdIxV?|YLo_taWhH%-wvi>ovDBrTJIsZo2<*v!-RE~uQaqob#^+Iy4SS-fj} zb>Xf#)%m;ZNngBYYIbULr{jAGbyqA`OpP9yb?uIcyO(5C>@Lcf8oYv6eL{MxUwN;n zdeoNP4{4K0`?F|8;_h+n-s<7ihu(3>vP0``Tzcq=nfa2d8<&=SwqN4ywX=Wg-Qz>6 zGS8ie@*9Hk+wY}}-9s{lOdY#zVpK}9X!}g5Z_DJ#nz(uIf;n>Sk{veMiakkMnWXeE z`!J3&bSJ+dAY@di4+4hpO#FK0}W=;7MT9ht$dA zYp33k5p}=Fj%94KC+&w4b$6YIK5I|?a+}mus;rC9&koTtuy68KoBAuN&Oj^3zB{Kn zW9p-OUthfW5zoX&_x3Ha{?S(^rBzXIWciV0*$?f#yS6>EdeZJCmELK?s}Fenr|p>s zXKWjGaK`q`iJo0H@?uTQ{72tX=R@zvC-;4;^OVO*d**;;$`g*nVO*?AL0evr|pfb9NEFfH+Qu zpA0+eUJN&$Gog+%^2_x|_RIqzcrxeC!ijVCM|kSda>C;r0Ojs^b}qt;JLQNs^E3#a z_Ja{FJ6Vr7JE2uGvNLg;<@x7f2p=tKKO@@-!Q1ZjX3D!jGQ5uZX!79b_qqqjrLuR) z>z^;dr{w7V4H8^}p~YL+BEcybfV@RX368^9?>+Dw2^MBxd&Z$xBAA(2U}cuyCLyfz zWmd?bk|{5j$*g)@PvhH$nbptfQ3)=6RfF^9SeZ5NAn2KjBxlxLk6@NJGyDT&!zsl` zZG!mXyFA1rTVOK7RXFL{E5V)~1c!J%&m+y5eUl&z^`42pITzxOPfl9Hewu}If3T%+ zhkE7j@S)!8a0aFDI5Ip!u6i8*N8XA*g;FJNl*y&rAdZp~BjgM6f5m^jVua=S4!33X z?8cGN4`YpQTVB>`&nI5Xa<^CDMA$PNXDnB?yJbaG@VF;tLumC#3cc>_1rXXjWAl(L zcQp=WMLpBdNPK=-LdiPb6M%{FzSmzO&spa=uMm4mv;76gV^)V}E2Oit{dr3vb$LF) zxO`c*|IQjnF^?ZD;puFDF)A~w+cSTLWj#97FJHULTJI^TL`rk~?|2}^Jw8O%=krfT zWLXK%F{tgmqy1BmhpeRMf+bkXcKrv+^Ljkx$YHkMf8k6>S9p#`YRBaIBV~}T)a;DU z^{+*Cv##=#qpcU^`p=P+{n|4YSAL!A|05c6)-@_wdHye@Os-YQo9ACA>AcP(#haby z_sM-XXq>)0f8}IIH>xx;&p#Sj$+}su^ym2(iFAuf`{nts!qhM8R+Vz|{F`AxWZkAx zUY>ul6#MNejmh)BiYAtIhe~7f{821RX5Huc5|+;RJpX=Z8CkzmX-=O1;$ldTsZ^Wi z{}2_G^|VUiJpUv#|EwLJf_bp8^8A-eI$u_4Q=b1!M3(h|=Qr>qZO+@T1@GX``kUuU z6wjG?{^e4eA9_xxNB!mbXJkMck|BA&G0%U?a7Z~S-IV7)Lz>YDm2O5UNv(`j>6SeI zPtokN_RIJwD(==i|2sn={tX_Fnp8qWe(*7#lja19?#;J5qp8s*^ zo2&x8@4h_$_A*F?Dm|FzA1?VTQt8n=|7mh=LdNeJE$fLq{~k%pVvXhLJj-*vR7B60 zI5^ZR-NCcik8b;+bTZF-Xwc5bM@#VWB?x|kCTe-!K_xq%UN6C4BW7o}6i)6CG?J0d z4$nGRy>2tI=Dh6r4zXHp*C7!8q=N0fE;qlTS9z=v(lt-S4caS*S-G!HKr?dQ@H`}u zB+wI_U7o23TW;}K2!GK?yzVwMWaljvGTo_?hPORKaaop?dk`9Mw(~d7XA;Aor{mN| z9@Qak0E*E0Sg-S%n?6b1)Pds4cE0pX&w>Y}({lc09-0@ioUc9mAtrBL)N;Pj2WFXj zzg5Apa*su&cpYy>H|}*$!?jLUhROGds8J_d1>1dO0fZqcc-&87 z^%R6(*YN)Mtv}28vpGJ0GLFAt!mn2%{ANax#3NsDa(0>HzmR+1GS7XW1mU;Man0R3 z8B$7Pr%C0!n=w!B?L*&k-ZSB^q_RKYvn2k%F&;_hhZ;839!GAejB|J4fkn<285iT2 zy8xBpe61y5<@H$3cUrU~t#J!bPTAQ9KZJ{%q}13{30lsRC|VQ7`yad#hvzjYydlTE zinE^YAP?y}6%B1%2O9OrA>FyzxM>w8TSL}ArxBbr8R7Wj2z#AIq68i7io}rL%YEagK*3M5b6)%l1g8{5lJk;OisdXp8gq8YogQ|B_%w@$wC|U^+<~!@6@AZ z`8J3hSL9$uZTWg7Tz1iiDRqvd7AI zs@z(MQj~8pk2?#^cf9W&iCPQnUP%ZG>^=#z!0wkY3+#6iW`R9m3hYqSvG2i2Xqws1 zdGhp!Bq4JCH9fd@+yQMk+9#vD>y9QqY}>;N4}xt+d3E5k436NIPWlb-pX5Bu6@(QmR);*zf#Z z8p73*$T3L&4AAp8iQ?B199IODJkocg6o)42CV3zeb+d$-s9PlLaWYXKzFQ^CMBSEF zz_*(Mj$)wm{YD;+*UWgolmeTDr}(x!fd`I|d#ms?_MvfyE|3H~eMc$*e~=59fM+Dk z1pJSLnSf^{%mn-~EdkG&1ZxRbJbhdjN^6YoPorRq zIcue~UXcV_&T|-ke6LE_t1o%+y(Zyo$BWAL?UYLOIj>4dzb@gC&dqY~pC#;v>W4+- zd*eZg|70}%Nxr|Fg!r{w-;yLVTW?F4*?LF9%+_Be%xt}zmaX?pw(6vpy)P-oD09Aa ztq;aS821u}S)cFIovBCdPJ7gzv`2kr9;KcBbMq)|OJB&HUelKTE@8Z#$a@Cpd0S%s zhXluoqjZk%%Tu6{G(TUZJ>*|$5Bb_WMBB+X<{_%NzD>)|cbXqp^JCeXA$R^#Jj%AE zuqU~)Db(jtVTyam7zi1*Jb9Wc?~?L)RVYO&|AM3q^NV)Nv_C>PccEw>Uyl6=uFjKA z=CdUcma8gume04*fxK{}Z=BtT znm5so=QHXh5BYWxMgrTt7c&)K0iSX4{tycJ43Bh%BF&xG)m~d{zk@VpTZP%a1MCeF zZ#KG$??8RD<%$jCo2-J@D)jlL+c(HHi>Ko73|^!0lrqvsMU~A|0g;wsT=hZI=f!)v zEZ-DOxaD3djrbrvk?qdJ;N&}4qw>3>&|`g5RT$$QFHucXVZ8g6==>5Did;v8S(@BQ zR<;y4ie-+y5>Ik}EQ8ft4Ktnd^e%5+=X%RG-)_c5*(UD`Y#EeAQ{0a{qv1(JKHnks zwUT7~o}lGB)Rz8h<;jbgeT!7^4pI_2fad4Lea)ZhW|rwu#necU$g0@3}$d&kOr z_ai8q;eGNp0?Uz>HhkmB2zs6Nu?U|avxjWU^IJS~*g2DM{kSKgu%?U{f0NuR{dh#d z=0dsmNvOCHg%b8U(pyFpC+l&q^Dk7vhzVCB9-qcPVxojcI*&qwjF=>0e}TO6f5ZV2 z9#epym#{`0C@CIaATMklG5LB#U*x<5vv9=pD-oV#jT<5*KkS#!Ng~RSh+!AYn%KaLDPTf#m^ z28sWJwKsu}syhFN@4YkRh7cfdCNMK$k_m%~%9a2E5+ExikdTmsMMZ~6GFc?cFf$=R zQE;~wty-;CZE>qwwbr^+t=78Lty-;1YpwgzYOA$c+iKgNzTfY2=1wM|_W%38@5_hW zInO!I*`D)k=Q(HYO!@{lM0qy9tTX9+rah3O$55W*=4#})-$9LnL-EL-I`a&6!}sD$ z4G~q7dFm{t-A2LG#hBsLLvyfX_I;q=)Wfbu(y&XRyQUugDAI1b9E&)0E+bpn_Fq>a zJue4qnQK2$j`aLPkPj>BWyA9kjm- zZ)EBb?;$DG4h*_qTSsNBJYslEOt$-6rFDQxsn)l68{#G`w+-It~NRa!GJ+hPn#NlQm9&fcg%W zDJ#n&6@wTE$s(g8A!Ky2$sBnA=LX`i$9G5L5JWL!n>p^Mh{Ra0P)_E`1;|YyeavEJ zkeC_$q>A%MGB!l|W)!nmr-}Iv4(XnO!%iKX76*sxk%5yrlp*49LGB-oQ%vnCh%CUA zwt=s5+?PA(T*{0l)9Ao?5=8|kfzfAA4ckz3_7yN|Q@4>ZvCfx(P5tT(s~siE1@=~N zTF0^|nR1aw&eTR=p!=O05A~sdp_Zu6%VJ^ojbt)bYWbsR^!o z*)F3%YNAWG`##2_Cb@LGPc8*8*`?c^1u;>1g62_QvZ*O9w(C{=!iJhEb!HgFK{ej> zD%$nMAu?*Zi(~ig0Hu{z^0f~55V<1rK4V%n^ah+BR~8g8qD?9w+4WKT6Y`M-oRYkYN=}v8~LOJk0W&>)2lWc zYPqCM_2Qu@D3jS)#mQ!tVWx*_{Sy&sjCDq8sn3pC~X9m-5I|qu{Gt-T9wtYI5$P;3Ed|{%i$MDQzI>(-bL3<8idV+m0 z*3@$-)46uj5~L4jdZPUr7|Ju3EQsCQ>QeAa5v_$)4MmzC>_fMryT6CA$OLV}T7lu^ z&m?ygOa#--&Oh`;j`SZ{$Ub})T18Y8CM16jv)!rlAE$oEuug(x=a<}y94iO2%U}Lm zR4K^8pz`upE`>I-FRMd#xo+xyuz!99({7tz3C*u$I@|u+GNh}R#@@}#f!F>EO%@!B zVFdFV_ods}pxbdnB=VbeJBz`&`7OGg5^#QgtF&WpT#occ4j~U$K(IjhM^^!uc^`1h z{No-%I&>$7Y=l0kMo#EuxE5CEYVeRNR0eI2=){AEp;jknBvHy&*%nX6Yz=?tz^M3J z>}v9FO`~R`0YNP?rX3H>G9y3BT#Gy<)W|kv8tU8VEPuQJZnYoe&(9GcTYXjmV1oIg zP-G%q$oyQBjZS+JdcvK5taT|{dl9Zzepqz7q5cfc$=@b`sSHvyB7mjlg2(gQ1i;H` z`@u>1UDhVH7QzTT`M8}$Zhj03A-^xx+IeiPUk+^C>X%&Q0Rghr>*R-+0J-XBtaN@t zG*zCu3Kl6pDar{iX+3i;ph4?e^fUDqEaYxi{>j!O>_~{P*V05-$>vV6C?IZiEjjf} z!OBs>cxPMhq9j)x2i1}PHL0^mT@Krse~xtyN|vf*9e}S}e*sXYt|t@jv&b>!YAK0u zuEnL^rY^)X@G4XD$z(rOr@}?dNg?6(m|4yr?2$Q7Sn*U?#w^09v;`=i5?@AGnXE6D9 zrwDlVY5@0Gdw`WUoj-Au{}U35j++J9jBU8ZLk(}uy!L2t-pCN5T>!vbWhpJoBrB|wf+oc9Sb>|7NA19(pqAP+_oz;0>U zquLJ!aFPJ|>KqQ|WC5m4$FHS$_sE#1PsfiX8s5F4pbk}xnR!nUtYzv~)U909zC-tM^<1j#4zO-tz=FdOB^Z_ZtEnqfUVu z^qw!kRyChvzCeIu)yEJT?}Y*!r+&Z*d{cn1;#YaR7YVRUtzeyt1&F98VCB5u5}-}> z9t7YL0ov7sSpY5-phL~zK)-Dse29Tp{flN<33d>9nPSX10rJu0@>&k z!@drx6}SCQ*Z1J9d-!@9bzquZd5m;me77=)yz)~x)qXNK_1j?+y-`UzP2$Wj^zBa`76u*RC zZ3UuS=wDJLJYofSPUd@t^Lg9~+y?i~_pAM=^OO~s!exApz_V81r(~4p3A|thmcmW& zy+Gh4bP5~edy&8^R$wcEUlVx43h*7zzL!XycdWoQ@TPpf`wW8dt`*2z2H;hejB^Fn za|Evu$Z`elfbQ|VPQb?9E-uL%1hQR$OUROM5*Y6alyVAh5y)``UV~Zli3ZO_9q_X6 z_bkbC1)gV}_XtdJ1+pR4zV``Cbp^iU`uvfAas_VZ*#1Po;|jb%-~$5ruD}lt2JmMB z(_Dd1Nf5b*;dOcLhJ^Yincv282VI_}<$$~*ujMY!iq(Mp0#&#?x04xR#?VNm%X4!r zph7cHZ5UN9&wQ|fuSm+)xIBR@KtU<1b$Px|PAe9u9zRv!rqEBj1l*qM{ka)|w5uE7 zta=|6-HaF^*4z7-0B&^#*1`L@*ph5x+VWyndd>V6E8UM-cwbLdQebWG8>vdG;7@zs z6d>D}7{v&^Z%Iefa>1rsz3-Uy7?Sua-rt+#Qvg9=y=PLJWKZYMTYCQ_Sh$tUvMr#J55vlF&%sP5bGqHY5lx9b+B&et3*PzGGJNV;l%%|_ z$>0X>LaP7+OU+`j#knTc!!Xz0CE{BR>&Y&&IN9B5Iz-C5+~WN9s!jqcq~+7qT@ZBd z1{u-WYB@UdHVd#%odp5(wg_;(`Z_xBwhC~O+Q$XkD8Qw9N}B|@LQi(HO!i7eh2q^} z@uuFhnC8`(;k0j8AkTZOMJ=vcz>nVJQq%f3?O52N8qZeCAdTK_+GRARod~sjg}2?J zQc{dxdZQBTF;s0WfKKZptgagu+5mJ3kgdK+V7tXvY2~W#lHGa*n5D*nalL&4l&Mc3 zsf~COPu6O(G4(i%?=#bTuJt~QxgOv* zQUknU4JuwJv%&z20en+{JoU2xfQtl}p&o>!crO-UwsM06-fs!8NPU+)d%3J!x#9~a zy;lfOt**jidcPwPlv>qK0k~S~)T{kaINlp&>9?q>DJc5(+}7#%WkSQNFV7vTwys8r zzB_lE3Xx}jWX;Fawkf^{*?XG+-Re1#=ym~O>V7C)?;QdRtJ_=v?i66J`aaZ`_bws9 z*-FBQcgv=0pNd2Kc%QRA0&&jwyiyL}dFx98rl%1L=Y2u&ZZ$o8FRS-unZzBY=R4%{ z-wE`9>3NV7d_|`Il<5%`epR4nP0u;2Q1+To;sw+5jroAyka{nfp5Gk_=uN?V$Mjr4 zMtDo0_e{@sDF|;%y$?*!d7RC=a-9=b-E!O?g7TBUjt9poON|}!ehhdrc9bc&;2&7h zpudZ60<+(Nlj`p#lVV?TBr4|mPmi*I?)0?FO>8Yox) z*-U2}1^D&AN#kdo@U>RCG>yJ^mO|Ktc?F(90N{L;II4thYp{=knXzw3#NmG z@YelbGI=nab-y9b`W(fx2EQplscZ@SE-{Bo)vLuQ$r50h@<9~*wg5+}XO;oLcQMf4 za`g`^mp?~WGF*ecwR9JdgilRl+U4b7EPuKAI`Y(e&>a2>*#siMLZC_j#3aweLeKEm zo5koy_LTnhlGb}le@n)m(%+ieQ%-0H3V4FH_Ie^oopKir>xBE{QpjR!k0h}Q~O#P$+z?lLh)heiB|4lN`VRhsr05=P; zTm7RFzz<|{d)1TV&s$`m`xL*o=Krx!>U{MSMf)ysj&4>PS#r1dAGfOG$T9cH>ffeX zVHN#972tNoO@#k`lltHel>^HAeNpbQ0YUq*%H^~l6yPqog6e-rfVW=m zo3~=E?o%Zk!6W7a03K22u%DmHa2{7JoZRCk?fg^f1uC#7WC|~-HV*U`Ce`9A>MWR5 z|5F0Ir^c~?=cS)d)l^t#{|f^AO?6lRUKCgDGtajt1NgP(5YzK-ivDk;ZMW$;HW$!K zLWOM8GaW9l|F_ac4q{nkaE@CT4~)1UMBva2jBLAD_R8U6q<=ZK~ zq;KJW$NUHt-0D&?&mUy9veilCiuX<00T043nBG2rsr75N!1$Pdk#=ds#q=LxQ5Le5 zMUGn{K(6M}6=I?D)Q_nAR*4bxh!5wlNX5tK>iMfI+5zoi`fJ2m#neHh>1r`#NyYO^ z{~7^?)lsBXtpK}~i;G_;z+Uw(t;agK@O--L)BTMWH{xd-#rymSv0^oSGX98+-{0L4 zH~eiDDdXqKyB{7HaE!^<;o(6_Xjp_$3RKTN|8dqF zh=PZiEZDpTOi}Rk7a*d&2@Fv1%ZczOap@M;u;3Y{-S!p~7Cg&zw%q_C6gVehX5DQ*wM0$?>8whg28_Zu|4?__Yyvg(;+sEO*&Gb_H6{vxNcbG1->#z(3 z?=oF(+ptLme_*=WJ{j^{@IKSE_QeY6KQUcz2RWAynQpTG1=1J%ndw&hS5RREf8p4+ z*mttukD0&K{+A!=&yGiWo6WbX6nwrH=??p@*+~EMdq{WNC(J_n-^A}#w{ZN1`2c{J zdV&Ns1xTs{N9{6SN6D}{9wxKEEx>N|bM}#Ceu%3QqEwe`F#L4s2yxAWIhexW_30EVjL}f0^n9va2SBY%!%N(J5+5o zfWyrt0Pa?wpzDG;=2igrsVJ0J!Cdo101v2ImXw&+0(eAy!UjssrvW^!%DL=oOy1sj zO5Fk;FK947M#;14OIYlJ^=1J+UQjE!GEHU~fS2@XFF7uk+bY;PGVugX+{sW#%b_pV z(#f2K^n^NQ$b-8u)a7n3$GwbYTwp=YWsn_r-2`DHi@4spD3u#yE?0gecchk6^-Lm> z3o?*W-QI-UAlo7<=wixk?(w?QM_H4+po^9`MY-I@VZ86MoE)LcXCc?=bR2RgkUuht z*r`(cyvYmwf+M{p0?1#OdEcsXD3dGN%wD7fNcD7}NPWD{3@geDAY z6XsHQ6`RS*EBszK-Q0DolxpsJrn8NMo`S;5E4=1ZK)ShWd5W!@yJ02qt@kR>-1pf` zR_(8p{NUg%7HAh3(;EP{cOI>ZX^|d1|@9VXTRt}`T^oRVE+p1QTQN-`FP=))^$eV zL-zsyy+hVCApJ1&yUjz^tTzfDVf$wz-Cz{{oaudL;8QOuKT6>I)D1LN7C&W=z9ztT zmiVegp>oM)JJ+eIAsvrK2(yGbO8 zLFd}%vhU|Op*;H?66|@dsmERdHZ6RC=^6I5WTO{3(OI@lg8iE5Id&AjN#SoexkdH~ zi;#Ya>DIy~PWrb@CkvZMjF&mIi|ph5!1*2PzF@a6M*0<|U$GOAt-@ECe#Z_5k$#Qo z5A45VVuf!Mqwc4H4OvLP#Y>K#;!8kqU<%)sNg^B#KeO;1nWZb>0dnEHGEGU<_U;B8QP$zMoYbi z>D5e|wvXvGOj~v#)3r>y>=4s+OuOybOs{2noIRK6bxdd3rA*f|Z5szA;Duxtt&~$4 zUP>$~=eF9ah)NDQ9K|iI+H+|DF-A)XAvkj<$$EV}Klf$0#^q9S zUI1lTfngvNJ5g~@>~ zBX}RvS@tP;$p0zRwtd1vq<_XKWZO$1Ou+}39&h(T`vf0kI>%lQxe7i!3+Y@t2E7w} zgmRTyn$!IMF`Gl5IKVB?^~ zHy7Fc#F6;sV*8$Aq$R$2guR?N65m{64`MBY@3Wnyc2hahf8-d-?4oLG4z3v3>b_*$7>YV+L0w~^^`EwFqILu#VaZUjqS>#H^EF#&b`A;4T~ zidU_^3#Rd{GdXs*YCjYJVy@6Q*~-Ln`x+$Dl&h|V()Tq=K+3Cb=J1=Ou^DPPyae9{ zS=MSLHz1m&POS=&qAdcn$|<04ql7~dzyt^Tj*5>FOm|d0(fw6%##M{eU#=mH^!qDh!eE z^$74?wE#Tp+b+PB#$=w#vWAcg*Dx83>K%b+c4CgEwe35|3Vj{xWrQA@g`7~uOlZK+ zWhixpK8F@^hu#FY;OhdNXx@s6RxCr(W1U;P8tZ;P+O^Ijtqr@g7U^#Y-R&b_MlHFD zpKbTRu3Hyyqm^qv1&v`{$n-?}QLKRVO{OQ=-LO;EMNCh&88@&lW;)MqW!-NvJ;kv2 z1`_KMzIu7;Pa$BhxUC&#As9@8i&i2PT$G=*Nv48}_kd{;mUE+lZ1n@EI%}r@dzd(*#fLo7r=yDUpIO2tz4Z&w0&~^(XFmJ7{GZZ zuMEdL@3{b6D6P$Kd&(dK)XjCJY>SsSBK`hJp-J^w*_;7+w*r4 z`!Z>z%tOWmGHWSskCoL9I#=d$dlQg)@=GXWK>`=#t!x91DC@`#M{2Dj&KH=xG^x)E)X zEuR$VX18Yp3H^*fx41ozaz-x-bgSF5n5+1bjO;eI=Wk$q>vvLi2hNH)me-~CyWO5$ z}tw0M=di_FijVis43 zx-!(Eu=vH50=QK%%y4m)0NIK}FRm6KSMggu#Wf~xYUUZ!0;m)$KFNHX&GD95@gBKl zhWBc)g}pL%x9Wz9Dn3PkY{mCh6rUaXCD;;T~ay$kXdU!7{N6f9MIO{%>e9K*E&cT1hS)lzsJ#rFtskGdROQv4GEexfFU z6N>K@;9hkhDW#9C?o+(;U#yRJhyMqY z?M&krY_g00Y&M{Q={-@S_%9-a`dV!9$5O?OuNsa=l}}8*-#f>BFrHJ_1+gD-760Ab zzaCwm2B`QmvEGJa*rfP#T~+bsa`8V+UR};s@55U!{+Dn?uBwHVDE?B=CaDWKCfFpP zO;+!(0ALD`r*@IaEdiz|zVD-0f3<3=dXEz1wm1Nf>ViXFJkgqjf!wFQ&-qRg;0g6I zJI%8W1L@5#9oUUa>rPbMOJVYx0KWnG7{k9JHY9jQ1?h9DEiZB5nTB@|;7V zpC|o&V0nH|s?C>HKC?WRv21}rpIe>}!5hUT0{zqSM9G+?(#pRr4}bfxc%hVifgVVc zMHYhrUs|5KpzwvTcN*AY?=*Xhoo*@tg0V%T2yd2w#E%r9xN8 zwYNMq50eUg$K)4nJnH^K0eshd4^?KUvoU#mKlOhA1XXz!fGY)MtNl=o)h~fCV_Ufz0MkR{ZX({(7uuo6|9n1F+w z#;;$`2%T@f4M5dHC_@*Rdw^i5mm&9|3k7hii(!95-xMHQHF6pk36Lun074fFkSF(@ zLf;a=BWM1hO9b#5hwew4Ic|0%!FJ9xmlQ5It8?Yz!6o zRkj>=fJhtg;Gfeb-xr4W)*+{0Ay{xY>uG*1(w+pJmnBIHTfESB{OBkZMi z2rHK*w^|p;b~a14*NbHvo%IIm9wFQ4tT&lnBH@9ox0qgP*X5zEY^j&ojhJPYY^jg5 z0|BJv%FuE<0yfH$t#g^Z5h^K5w#zH*9QG^Q<&}2vVx;j3PdIz_U68D-f3f{)`AS*V zmrU2FQxMa2O0{hK=V9=wCB@lvu@`Jw2t^v-yl z@|OcxD7XFV)ev-6)*=D6s>85J$SRjQy~>yephAE?#aA&srw{u8JHCpk6L&4C=>-o?`u`T|dPXgbI_F0=&_mlc`=%GjY@V7Tni`FM^Gt$}gR3H=o5 z384?ifs;eWKp#&G?ZR_XXaN{&a_DBH^FmMJIVJQSo>N0vU;-5iz$kb^i}B14HQ+fd z6vcCT=p;P7p-;dZz7T&m)E}BM2NDr_6U3Vl+B6?$IH993pTf}7@IZ<}<DJi zLz&~_510z5|DF-L2_Nqpp{MZiM=-0)F#cqOjz0uv8K@UDj1P^_MD+J(BlHaj#z$Dm zlI38*o4C_<-3bPt!<#G`Hs)?XuGJ$qgI%wqaNb(*G%_U3tx2j7LNW&wJv<-96K|Ea z%uQ&EUzD17E58M0%)ep{&`+{lhoC^Wb5ce-CrKy9{9h95Ov}}f#yT?t>r9QcU>=y# zl=BX<;nnyvuXtiJSnjkS3*>|xnWcFck6Fj}16UVyEPNS@V6Nrp7KRo&$wi!!SSW~2L*CDH zHCIlD552gOH)k6wIpuXIGgdwCMia|K_X5PZC%`M(kAe9S;x7}gTjF}W^$ARd=Z*nZ zg{;PMlgr_{;O;$@+<%&7($b$$UMVZF%H&ckwSa#Q7Q`$!*|zI~`}S1)aw^~o38`2Y zlvl}GTxYIC)v8k=*5*$0MhvLx6QW&XEawV$6oQ(frO9Q1wyd9gp^xKZnFV zBsAJN4%%k(5eJQ@>4NrL8tpuwK{gHZ81qjK+NTcMG{~E7?OF#dVop6O)#*}{N^1>7 ztKryYVvt_8c7?gjL5nzOr=?q~2by$xyt&OmyWT;&FO9YpXfo3Q^DGDLSqJT1K_gRc zbI@YuEkq+%{*!3r%E@e?n#|n+G~vn}=8Hrlch5rUax%D}30rOlSNsj-E6ipqdp4PK zC(=z=A!GG%Xba$kqgmWEjw3LPHN!f$>~wsRspm=Y2J!?e?gT4diJ~*n@Omj~HjiMt zNjBmdyuvif9zyx|P~M*^UnJ$(EC;6;tDi-=HDsJVy5m=LZrLAGwXf90)&BVnO8e#A2?`}Y^PHcX+f*8o^a3>pj5_o zY#Qxq2km9^FAmx%4%)ZUX!kj2mNos@)J$)5(0-Oi10!jI*w#u1?Rf|7Jwc<`lBcl_ zhM8?eiAJ&gAEHrgr;=16wl5$dbQ^E&BO1k)Z-o)D6|~h*kcgWbSECrrlM>6-Gj#5q zk_#zz8)a~aL_(iQ_Ooisk$2_Wc)%YfyDy$ zsmLRLmuBQqAyXLE=@zsw5c#_(pmONc1sEwtf7#pfADaphG910CP>!a%-9ID0AJu*IgI z04$=yWg@4W!`7ZKR+cJ6BfCgz=UbHy+FK6V z-_vNMyP#cU^*Ctbb5gAZkTA;pc+jexhVl`{+ldmA$&X=QA|;vw%8*B{xG5u#1R&!* zB6%A|xMB+m$Q3VTAfJr9!_nvmBYCxFB9FX3s(WzCLlCi59|lqQbedC|h@xuGM~$-pYtDHl#W@|CbDkB>`5ubv;?aa*{z^J}3$WJD z|F#NIUD$zI08C<-Z(4VPn}ln;h$IR-G$Wy%OVaWgl*?q&Zf7})=?{J+CC#w4EZ3GF zi&VRo4Lc-oY8k7JUxRFyi$;n6X5!DhVqbdlE_r?XPV`-VEcx8!;#*ZN0bJQo33!}~ zxIYK1XP4z7G2YiO9Cce-9-oT=kPXVPE*MtUU(Ke_XI?4^q$skyjI?SleffjZW7#HS zIjY@Rh=XJ-^U>DYp=gYlENcf`aU_NPP#1PjhS{n|qM>~#)gwJjM!Fv`$}zITrJvUU z>vcHRwUq-r5)b+hOVG3s5U*)$8lN;4%^JeaJlCjg1;S>TMhp3{S)8B^LT>R4Fd5$E zk*fj&XhgyutBiH)a7W5K5ld&7m(D+@@`CCmJD&O119yJ!cXz&j%tM=&eLUskqpm%5 z)rBt}H{+&DZ?s=Bk2!7X{b!WSdibQ=jmcy0kALx_*Y;kY^~&YRk1v1l!Jf?alyQQ_swZg6PLEMCUTktag;%}z zv#Zy2`frGReceOXZ0LQ=_uhrSnw9nKU!Spf(xuZ0(INt#5qtievsdFt7X1r+yjIQdC% z>HR=jZ`3b?o;bMpb^!IpVkBqILRn+oEW~YGCbwU?t<&&08V{psiVxXdlPDB{T-pCN zzJYz_B)7>;S0?fh24fv3`&#b3a=H648h?#WLJyiX%#jBh!&>ubpy}I75cs)C7>drf zzA#KJkxOYXHr$Q!NgvQc>NkZmSKrBQ{{3te{fQamI$bOmsipl5XS-4SN9x0|MNR7= zP}6UdPN^HEQ={=mM_}|%TU3gA7&3y!1juat(xN5Sh)uCWk&`3hN)@b;Y1E7je=LTB zQbrxBaW@O~Q-O zCKXKDIDLwlHy!xX4A-P1CoG>(2Wq-z;oYPwQ4YhBNTUyWM<#efUq$ya& z5mdwv)6K}FXQW3YU?5cwQ)QopshR}QNl}ViG5}nFI>e`^Sv*~nQSxWHosme3q1mA7 z3@GGTLJKr{PaPUZ%V2+FqfjWBxM3j=mC6y0zXRO-c^UxiakY%{yh4MM$(hG?g zW~zMLNcp@}xh&cIk#b#o!8~)7Z=}g7=G3fm?|tv$=8lmI+761VH){#iKub>Ays==_854p*SeZr35XN zeeF~el29W2w&EOI!m+#;RHDjC6c{XkK}=6cs4!|uuqaWe~N7kpb$A_0Ty+W9Ed*Wa*kRv+9)2+>p)$`{=CZ%q$15C7me*WXJN4j+SZg z-NnYGl5FM2ccE$Koe*ci&^>}R4>faIM0Ou%xmH-4}i zmw|kzKdIsLC?&v1|GNSy%P85;Pu(S*Q~6hoXEXj>M)uzQn~>P%0Qi)D4u)xLamtZ& zO7|k6M}zufGc)j51Wn8d@Z)qakZEk>2jh%x{Bmhix;k;;PXS>AKMoe$R(>3r!ric+ zsWM%_55@}F$cFt)mFoh2RHh49bo~VN|dfN5rd4R%BcTOf(&dJ*f#9pVn12ePB z)0o@RnEx>|qn`{+ISF@~&6I?0WP&~T5yu~9o7~R?_FBy6$4>ld31R93UBHh&<4-Cu z;l{8Ilp~y{pqUN)_*9ac_~GD==5daJByq-q?wye^+ZhV7opCUm1JO;lA|?N_@tlOe zG>@}IXr#!~0GLQs_(-3d5PGgD2hL;q>S>V*fVwvu}3kHV`IC_vtnU z|6-(RtIJ0ByL-RWuP${u)-^}>y*tehrK#S=PS9y<>>PkD|5%Si&hmr#Z>||!DfTw`?3jSnN(i|Qm znHkdlY#Q@FW`fb3>KT}$Re%Q=Foyi#pdnOF6@E^WEZ%@km2&f#{x=mVku4^!z@KSs z;s+ZVHF&^yAp=>AV&U|qnVV(KzZA}AW+o0Gr+fhtseZ<0WfHIqg=gar!@2Ol8cr!( zjq?3Yxd2X^_5ZcLQ_3El>Y2TB&&l3h#`rJOBX=?}B&V0-k?0k??2#pLGBfaEz)9jS zlb4*l3^bygENCMp!pX}(0|sAX!ZqhdwIo~lp=A?lpNS^?9jL`i1$zTOh%lyE?HKa+ z&QhhDkxKt#Z^A52x56P#$Iz)xw_|lGTL|KhH0I|_{DDpR!P?9oX{8l8@^31hh4_;$ ziTi)-U#j8Z)P&IQ&EC(d9GQk39DdUK1{L{1qywpyAv{FFNM0$*#2&GF#MI4ga1dO-8pnU`0bsWySnN$M*T{1ATo1{qsBGJv*cE#QdS&NdNqJ3K{RuLU}xD{C{t% zr@y^-up?@89=WxzE!wfQtG#`0B;Gf-f1p1)HyUZ{nY$>wY;Ng-lEpg~&K>IMUs$?z zRPokS16%td?cF{7|35U8*p>KS&MPs{o+e3(Ty6Lry#Mb+A$Hi*k zAQ8s2=Q~{Se>MHDWK|*M{LXkZ%Gr#}t-UYN^vG5Q|r>Ff!&5A-LJk^Uqb zkeyEU|qANJQHQ<2}h;BRR35czZJ5JCeaA z4M&Gl1JR_yB098*M`E!kX`YMYHt5B0d*4Dp2oA@Sy&_iO)G}ZLhf#%vO|Y(!t`w&* zBNEdcB9@Q&!5BXVUG2&Vp6#|=*Sql^1lQ{)u0{GPcM$1UPYlkS**#|_GOlyaL&h5? zu61>mxn`oumib4|NB%kPB=Yaty>^3ZN~h(54RBh%$1*EjCj@67ITOE(y)V79TD?++|r6Iy>uc=;tzv{d{^-66t-`sYvfXnP{k%wW3Qm zFfZ$Z;-VD`Rt#?M0@ib8C$N5aauDfXnVgQ3=1guoIe3Wc`aN4*JJ!19%md14RvEHS zJ-H0&FHF2fV4iD;h##D^*0p%8YvLAbLdN8N=rUb7rfX*qw38=iVrB)iPTzp~H<%pk z=AUpFv)Sx1Wv&lSp69yU47xr!d5de(ycH|9vBEk&HUsM-lYRZ|uI*H& z`k9(uRyCv4ZPn>HPEWe>%3RG`wz=kP8MTH_kHd(^&jY6G{5`DqFJo31JYq^ZmI~kv{r=c z)~{|fsD8r~=5P!yg)tOCs9_erI4#uII6Fmd{!P3$t%a$xT zHaNGhJvO)kQkjen&+S_XIN3ee*Y?%4ZcDhTwqpJIn)-05k?e*K*%788GhmJ?S94;b)s1>Oq~Mj-nl+d*m3L2~U1QP% z1zE>74c=;Q4Oi8#Zw*&$Y^}vas-wM;UG+^Z^^rufwWlxIl8p4ljHV^~?ZtUa)_ zX$y~6&kRP5-tEy{MncHe8EKD-DL49~$#8q`KqA^<&}P>gpl76GsS)jOkMD{lv8<7B zERsmXy5n5io}uuL!ALKb(TMJh_NS$!hpQhSXb1aIP+Hm}{jFSyept3}BGGSPsvU#j zsLaR+vsK4p8oi)L81%-Q&=X^+xVpIp(pyutX>~Kae-JT-0S^ttw;Ks`fwcjv^2IvQ zNUQ}vO-L?5OYjUZ_eA^H)~XvfuMfA>G*qx5ZAOKJ|Cs?>TEbP0HCyUhT7ljYO+xw` zs~a{&;j3?#dw9aUB9jQ+tsAxZy0IMEG-5KiaY4Z2;iU^o!zCs3PVg%d z;DxqbN!&^5>=_QTH7+G7qt~@Xq{djYF$P&Dt5NjVMX`Noi$!|kLp_OT82kVVV%WXC zSpFUSiPK~xu{|u~9Yd3*&CTJKicK})hQ?~HL%cH#3ZgDL?ifgxlq82^{RSjW2udCq zOZ=LOrpEg4x|*Y8J*&~im@dX5l>VO(7LG-zZU|S`twGB>dqC*HNG#EjX1PSPFJd%r zsoB(EBnCQ@aA+uEO+)e4w%!(qPh@9Tn4AP@givakYJxKe$xDE^`i90_SaO}6t3J@S6>}& zSOaC`2+|;AXJKhLNw$?W14AYHzzQ)aWh#Yudo&&wS`9_uH988Rt*W~^N=*y4r+Vs0 z8GwXVl&PWi4a9df4Gh5ZcSf7eksjN(hZ8*~L`AHIunvw$jbVxAnu=;|yz8LPT88SQ z9SLnpqH)dVja98Rt(b?Sn(LZ3gja7|uWd!gz#v9wK(UajDMcBEu=X2m4Y6v89vD54 zWdn+%4&J+LR=O~ItwcJ*@x;y!=)bOL81iZ07lFfUg+O97Gi&fXyH4WAuNzr$JY>h8>ZByWj+Sw+lL`@&t`~tc0iLu$HfO@$uN2ry%U3egZy_4 zEs$pkbPIHyv>V5!W29a2Xox(9tlGj>w6ruta8)8$F?CuETN1FSozO`ykM0e0m zH?=hB9UWG{h;Sz-`mL=#+LOS}swpA*sRstQ9rFvr4#Q#Uhp%D4He=_|E(R{#1A}99 z4?!=BVWGW=4Gdu!MTdlq{yE!HOMi5m?M*e3z)|xK;yD)FoTi#ADF65KZdvxF%W*ngj$Esiu+Ay(FkDMk@jc z*Z|sfDA@v6EYjPOjB5!88O6T$4Z?3Edxzs-4{?38(rb&Rv|rnHFb9lN+Nlvs0hbN? zMS3?0;pvp^G2k|b>+9C93s={))>O5ITMd}{o#5HJ_zrkb24oluOi}=`r3#v>^{A#A z*yKe^g$W=vaq>@lcX*()lRVrN9~g{<+k0Yg2*pLz{xrFPA_)_cTL1R$D3(k}Wx%qx zM|;EC9Wy$*+hg<%j6pGFpvn$7VBm8ywkFJmluN=@PLbHawmEKO^2}&;Jw_s`H#RiM zR^ULhG*VQWcKq75hvUPYy~(~v>;Nk@g1>02+>I11HWGtv+;511|H{EE`RW#y8f~kG zsxV1-VRijYEe-VgDl4Qx{3bbV85p>&3eK}eTHQOCKoGJEjwzjoZn$}4JqxgNn3r>- z!w_}xI1#ptg&hxWka+TaGWx@L8FQ$=%KMP+@BL3bBxH7r))EA|N$P2twMhMLBW z9O*iYxh-XNo1=XL$>?Sb02|HZ31PfI9fYdFC8<5(tX-4cf5D?0)1nd6v7mt)cUy86RLI7|<7DFh7k;S!6W zA)t^ldSfP%iqq6krefWt?cvTLI3+2%d?oHe*}v+Lcgnt#sA*o)#=gU-X>M{h0*S~@ zi~;*autKsM@qxD5&7yHS28R0KtcGE+^@@UzQ%ib)GHdJ7h8{LP&V5f?9i22Nyb9Ru zmcay#kg+<_n}}BQ_CZgD!S88BBdkPIMfXfx@90h^@PvKwD3i&s2KLVwQ$>4{K@1%n z;Eo*LCSny3wN%_mLi=Hv{suZPrARWQ2-HhYk>Y>Q4EleQ7tKO%xRO%m!Aducx0rs_X?BNr8kr9u4DHJ&?rk z;L_BVCB_{A_}7uDu~g!gxV5>WYF*v>|6mD5m6mEBIU0@9H7p5ti}Uqg8$5uRqZ(ZN zU+W%VGe*^2Vs!LGdI!3oq_%^75X1n388{_r8=w;bryUz!BPOO54rpgj7u{!gXJXy8 zQBH|Ydw&=wE?Q5f)&ge?Je!q34FuDGRB^8+p*6(ob|9&llnW<|itqucG92mcO2>k9 zXd^yMcd}jLVPjoI?3)lRg43ZDmWZ$u!Gj-zy?RQ~NCXQ$gd;O!DTg4V?1T`O;8utN zsjXXT_n2~yxn|g>b#;n`8$d78-$Z(?= zjr1l@%uAd0e6_hWDp)y^tQ_pD;2g$C3FN668dBWIQbRajD3~%)aA&9wa7K)!f|raH zp*Q20?#*@8t+krBYZ$v*%>cKvLC?rZ;+tr@v`>YgoJ0e#ZR#9E#7Li8Y4T`MtE9qN z4<|xsp6P2brZIK`qs06G9_EohB5dL6$~BIAm5x=Vwh-K5M8Z%9@I(#jPX?@dxnb7~ zmI~a+fQ0UCyRe4`dpq6-Y*SKusg7-^Zh?*(<|SG2S?Z>(zF*j$s^*XnL=$QZQ5D;pABR6-rtZzix&LP$D_?Nba#<4~_DC#d8ISP{AeEt_BoyTY-K zei8kcD20@B;e^%U5BEy!VfzW0)xCoGVO9^&^JD&{eP0vWE2zhPT=}4e} z4%rclFcy4**!0{D2C%~wI}zFMjO)O!j!Ecn3vGvn<4 zF&jJSeuM?|#*~3%ao(c;8F|sjW-@}XI8G9Jx#7ShbnL$^F@)fx#Hh%C5)bK*4v8K% zT3f0X@KM4?DIW{@Sj5L-K91mHiGk23c97Vd#-Pa1yb-QM_%da^ps{z39a~GydW38x zrhUL9Gs+I|p)$%A8i-AGbw%S~c}QI9a0I`NnKr2K+2FUp$%!K53Mb0|7il0CPR56g^1$ndX^>#{;}f~x9PBJ zU1AM3{#~sD8~bGwMe(R>X=dc!iQuG19^*=oOT@XAV~?;t-~#{e)H-wwo585#m?CxX z_SI#jdQ(Dn+SvoUGT6~UGA0j*m}+ibC?-dDm~qPKoN6nmE+FR#ljRuOUOLLy~lyJ1h^J9myV;XMW5*FiEl8On! zobfae%|eDHqDI>%q-bi~T!WLVR_s-c9rTWBBC&y9I5<$;JTYWwQ(Ku#EhFb(a_B9A z(*HyqgeSsHxN{b6*<9CJRg2?e5JHmyDg=k!JT4+HaSPn!?4o0$m9PiFBJj9fq>?rP z;pa}CT{5W8CpYsQczGqC&=YtrlILQ19wE;qV@W5WE%D35lp3_f$w-%haHS(uIzWaC zLG5r@c&^a{#_ZPH(D0VJhE|*vtqvP&K%r{fawM1X&Oj=PEQ&tOUBlsx{q2b)P<4zu z}9OJAx7neXKga_z44aB>&?#pnxOBeKYpMYHjOq-Ex zkF|GiXKWLWji@c|>EuM0W!)_6ENuuEn-}8__?`10V z;Vi!#O$Q7`jU4`ZPp_ z>F>8y!8uBKMw=UJTN*$GAvvRxvOOd-Yetl@r=vXjQi3>R4UzT=Y`k#PDoY3%!9ujd zsKJl#4Yzgc?Ncf+&^+A2!(#49=rPDSQ6J8SlI`6ci2vzGlNe^mm{`VeTN{{7PoX;6 z3CW>KlF$ryDdGhkIKdX22V*T;7zRQ(i2OKgIMFqpR)YEACv@z>!98wlQbM#j9(BzE zfqazUpa|ES7!8Hf5FdumFPldIvRaL8$73_=YzkA5K8ln;Jfl%MvfqIi7}p!yf%w31 zPah9l!p@aYEt8aQ95ab@>rDm2`+Ym~{!#Cn5|msRO8&6te^~LR&DE81LZ)zDtgb{Z&7{;bNGXgDPn}pHc+XMD&sHY>hF> zV+~>nO)CX+b3=pU+tRfHw?b$#456dCsgQx+I^4J&2U_~_mR@Qs6kRm!(1N67cm`wi zMHwfag0Pm{NTAWxC+4F!)Dn>3wZAp>jg>fLkfV&WH>H&T{3zjbIJ`VbGQ_QE8j81w z>Hs%mD6ri+ey2Hm3>oy51w?5U8cn$F1$V0+bjIor$hHC^4;Xjza2KUzeKU_>z2kQ_%+K5j|1 z!Uh{nn;H>s8exup)Q;gKI^+DZhA}K{35I&0q@foy^LO{)rY8JHIcTCcF@~l*6R)Wj zFLEO;g~B-y8kPNId@PR5ufv7wL)ly#fxT91PB*g9Mt9j56S zb!Pn)F(4jir2}?`Oe?$@#{o6M#MKC_ZstC0>@@1u*R_VLn>WE_1zX5XcSjL*!UY!= zPsP!iTEdl;&C#w(=w=+84fXXoBFqzs)LkIf7=+!CXmYCrlSROV=sI!?hd~TO>MWLQ zl`zI0CqnIs8_IwY?;P>8rmiMK*VB&`;g{PoVToDr7#jn?{^7q;_JFaqEY680F>Nbe#)R$fm`O@#i<9TGw11^1tx@M$Ft6aD#12Kj;ocjcbRZ7r9`!v)yyq_@2D-%sg=|w=x zxi{N7ETUeytC?OOSx7d7;&E~^>3wlsD?(M+ZgzG;;e+^y1i?|qDl&S{Pw|PhB5J}u z8Fv?SfP)6By&LB!jE!PgdNFY#(jm7Ruob|!DN-@b%xH}0RoD`aiE+Cz%aD0HOU~bA z$a2n@x|}WH=TSTHv2Bn)^sT}Yqei}Ll5%TXcvrbDd%FlirS28s2q%W1I!p!P z*9<0)Z5~m9^g%?4_8eRF<>}OYzZ4|uI(4%?HDPVUo1EL@aJcKLH*r5#BLQ@{AiU3% zy0(Rz$^B8-!(NF}*AC#4?^lqkx+WFuadut2M!?7k+!B3_pra2m1_RP2TkW=8-9sr; z73oWK3>vAU4H3S~V+<-AI7V12u!r1P%m~g#H70~0FA z*`7gIa1F-Unt}Xe4JbYuQ*PX~DxzPg@A0PC3@#)u(qq?&T`jju>6?4bspv?YzCD>J z1!FpwT7(3d$E%I{qSh$)v4w#YtUhQdQAPbf@erP#UZEuKCpg`+!ixlePa zjsxK0v|UIe8Nl!@I?Q3YFF-CWbs;&{}~wI&H#h#!JW z6!L95$w_S+<%Dwd*HIcOwipcXLZ8ZJq_d~DH_Yn}JX?@!@m;+GZP;px1J>3$DheiF zu|Qx0Mkpix)>fCO=--8iLS;=8!^L6QX_g!@Y7UMgq3`R7nPWVG-}PYVSz;_4RHk1p z8kjmR#qiYZsf{Hp3%>m-Ujsnx)L|&Y_(F?_b4gTtK4fyXC8FhcgZj*E5XYB1N6l~v zp|$>(-^fgTtMx0tS;;TE%@_AH<7<#%N2B3@Z}b;g!uoP6N2_;|W288xmi2czM1y7o zA-KnwIR{@7KOGtnM-mPsBFIkkE&VMk-fS5Od6JpN%tBLjLt{&L{l@zG>I!@# ztAx`LW|8=*xY*jfI_#H(rH>Eu?1Q!Gb+T07PPFk|v4D)5Y3d8e7`Bz1}^ z=SY|wgS=s(&M3W=Ng~b>gWIMAkJpQUQj|?Aj4R3;7 zvcQ0YmAL9lI)NrrP>wRMHEUJvF?ia2JYtL{7tFS?Xn$M zdwAh4lYJC;z~yUkSq00+jlJcpcDKW4y2H0O%C)|jhu2h(R3Mi@c1r5>^qP&4|IlPL zSK4VcPZeVMh<#)1KjH8yAuSv+GQp6(lfe#b{tkb1293(&hJ72}o}I#Zp(xOC`9&G0AT%!nL} z3-4PE=*vwa+-$Y2)%xgC>#4Pbuy1l;B(bZ?o+hbQg{6?a1d<0KR6h@nnJ^OLo60uk zW@_~zYeRKk2eVA90c3j;n#VrNgfp5U#j1! z(+6t($z5+R`23V@2PGq0NCgwsQyi0IGAWBSIs67SR6Z3QW=`1z=~eP9sJ*mN zC)F{v!_65?b>-yU4{J*ac$? z241wGscL@}eM@e{Vm_iu-d^n~qblWa0juSXT7*eI2yX(^zSm##MDxVjH>lNVNjbV? zKW(G*cb)PIuLA!={e>^!JdNB`lkEp}cSju?Dx6uM_AQY1OOs@1F`S#2K1)t4tJ7^5 z^U+Jyv|bhoH4oXSjRH(S)skU$_>TRAQZ@IL=c4m?ryBFu5es-)t=9JYWn);)gN>IS zq_4SmBI}4kIm=+rq~zA6y?-ZViD{p`&w)(_byFREUKKqLE7`lIxWRxK5T7&Vy*W+x ztHVd`p*6y%5oNTMMTR|Q%HUgw1rHusRQrceQc&j5Ri*O_C-Qy|^keZ9wL^v7{BW*$ z7F_LpOjMf?HDg}Q@d}v~VsqGjzDpfoRa#gyAtnKG?+FQ1clGKHfT%Ki>t$G(nwr^@ z11SudS!r_ae16$*IkY3YY4%lBEE6V_BR48nSQp6h9+R13>^jY1%)I5!>W)f;KAWLg( z0Vqu;b8);LMw+46mEvv(E~^0LpKO_-`sAkcY@CWHN4AQ27@AL1aJK;)@iXc?@lc8! zqMzHnTIt6!xeuc5$kkE}gK(q+ny(C-(XzpO`D1LDY;vrU1xcZ7DyjVg^+JRRrFcpd z`&{;lLgk$Y6;NP&{ff#--4%wW^s;?Wbi!p_O`VSU&l|bJpx9Is3ZFeiBeHiW{>!89 z_R6T%stCv4Fc@Jo!XD^(uYuE?OE*TPf!R}Wd(Q|D&f|=1e@uAgnf34}D_glLKf~?n z;b8~0pqe2o7I_fdzBMB?7uLwUb*v81mtw~gCtbCfqGa(%7`Cs<3JPVhDR(YqpLhV8 zL!Y_0M}_XprHp-dNacWcnZ&nL#>A0mtGMxJ@3?CVyHVvL4)GC zZ2J`Ve^akD7qQB|>^%i)vLLBchpEG=LXC|h(6Rdlp?|bKvT0p2T~~{u@IjeNI*vt- zNfAvYQrERlOo{r{pt;rjvoD`4k!Rl2ETZPHK|jN?Wa2rJeIG@|5DqGZ69R+hXz<6CWqybgK4^c$IA&=(5{=9j~%G zS2N*2mpwtdjM{PHrsfd5A+7cqew3WtyjSz3S`(!@jq=iizU}L_yi1qxl#U#}Mt+O%n8Ezv zasW(ikJ_)vK^4^r6~`Xs%))Qrn# z+0UnhtIgI^vXfA2wl>s$^N48Z0kg1x*09c$d4x;{G&Qg4g#{j$w0KxSv>=-b4&aEE zQ;ieP?_yOak78Uluf)ExeLDjql{OpqGQvk_FS}=<8drEygqwD1w3F$AQr}v?-o3l{ zGvvihqoAeA{kTW!$7`DWefgRuKgXStvho)HKfKvVy-ELX{P1On#qqImnqOX;#^0l0 zuXz9Rh?`w2oGTrxjN5f%NWAYdH}YD|ym-%Y*Uioqj+JoH3$N~aJ>HWN4g{1}efEm? zEqC7RSRrA|k9TXeuS-0=Yh52w=eoQaG!N;hiDOE<$5Si(ChB_RGK76uxcSQ7w=Ck4 zPc2X0l3O6}#ME?oov5of)F)nQHKe^35p52MG7_8~y@Bp^`1B;bq29=ecZ{|vUpRA4 z0p90`d4|oRuu1Lxw2`@y)&@FDYlDXz+lXZw(K_KLRxh^|?Lu7yFBska=jH$VDq3x= zQPfss|1&5RlYMVpl>PsX^S`Ob{~2llAH;7{rsmO7K-q1w?Z69VYv1l#ZESOatUu<} zzKUCAwM85o#nAYtovHR!#HY29`zz?BwF5%IV2`a0I!+t=4lNFMmZP@+ zzx|To3{6&jTTgt*>ve1Y)QbgS5x}3g!wV_ZudX|}CcozR!>c3zU){;Okn6@PeIxt} z$1Csa#p@?)e*M43mvbSd<4<0=D}NGS5P!A9I}ADe8eAA_Ue4PK=Gx&cMR==VC*k3( zl{MkvZJn2eHv)~HGJiH(9vhb>^@UbX3lJJD^rphsm z;fYF<-w9j@w?&a9F8S+7cVZ{MQ*gI%ifxwv;zoY$V5pssvsFl6Cp%tzqNgU_UUkCD zpRQ>)NTT=)hc~K@yRS<$?Jp_dI_`$oiFde9*WB_^D7ce%a7)nAZYI?U@5{xP*Kau9 z33bBDZ>noO;a|e@;V&HCygK2v{)eV5!1eGi9G-lIw|2Q~M0k7QNWzo%dxyhYRVTd1 z5#BgSIDg^rme&a{AMdXY_g@(o!{JF^6+c;F|0_@)^49aP49fLK>bUb(Xxi+sBf1fH z&(K}?(ki$+8x}x`SAI{yUG4mCK>A8yFZuQ3FPy%eaEJCLm(*{;0et2vEP%MIe)4&d z+U;@++`SvVh-+b^Fx&^kV<9@=UU+N@a{zx5uN!}ow%XyPe~Gl!@)!;e&My1aws&gP zf7ia~s7Zxw>$of>5?}2YMRsbEuS>sh>De|8XwJ*8N2qTtNZs2%(X5w#4z%#g-A5|- z=WCqQYDlni;B~{7yBAG(>F0nZyZm~sjt6HBXr{}ri>A8tbD*Rzzb++z>E}={sncWO>tl_$Tgf4hx{j>*~l)K$hy3ew={zu&d7Xx9i9U>d0Tz zk$d4#a zemMLlp#2@7+(gOo+W9)}b@W-W%2(Ijnh$dLC-JLIz}oKyPoJZu+YgF|XVx;y#@w&Y z!!Kg1wifv)xpMVi&tj@$t^emqNbxH(cG>UYw&dl91Huk2o6?IVPYKW{N8rOoylYd8 za%9ZDJ)j=g{vXFH#3eT0WxwLGx7PjV0h&I=1yiw2DvyQ!x0{3#P_4CxT3o2WYoCg* z^rj_0`niA>!#T zY^7;e30rI0EMXgbl}i|~KV@gM#e5pF0hPE~n5AiJh1vLIg@ljzM=+ilLWC>x5D9mQ z5aF#5BK-S>Nau4x47RTb;qGl-|4In=D*cFG#t(@wdBL(Gvuq} ze)2Q&1bL2>NuiWy3fYp(C4=NBQr2+dzLZ=-t|sp%pCVr(_mQ8FRpc2`bJ^j>kcnh~ z#Ajz!yq(BCrk##>vLV@wY)4)}4kWK4%gLqWedOchHgX^NG5I-pk~~NL zMMh&%j#@*T30G_X97eEP}eWE-+QIgq@HoJh_h7m+K-yU2&h&E!ku8{|ji=j2K99QhX+ z9b>06k!(VCCi{|Cl7-~;r$ayz-3e3v{( zenb95{zkgu?erv&sbmh>lN?NrB@4+?@*m_XQohb9`Q1XkOuk8eOdcbDBAxYYe{M2` z%ph~fp5zen8geQ*hg?OjC!Zx>CEp<{$#2Lrq|012NHf7nMHOd2a;pRLUJ~_fqa78PVOf6lb@1bk>8USNZn(nBaUoHHYKyk z?&JV+G+98-Bp)I-lP{5PkROwuli!kO$v?;lOq8X3x{^V11X)5ZB3F=ikq?ub$(P7C z$dAe2$p}p3CB6i*5!sULNcJKN$eH8{@-FgWax?i7`3CtB`8j!#JV*XT`mu(PboC=g zkp<)|@_KR=c{h2+XZ!zyjKso2!fQY_A={GjHFvo_fV_&FNiHH+lIzKTlFyNEkq5}1 zNfT=x3Ex8o$Ts9)@@le-TuQDX?W%Dl#gWNm z2HAn^MGhm!k;UXZav8ane2Cmko+Qta8n#=d-r~rHWOFi)97?EWMsgOKZR^Tb|ia~ z!^!dFG;%(d$0DvN@SU=8;3mYsn&VE_oAq2l*iRH2D&_kNkwJB7Y|TBxTQ0 z(&r;vlU>Mu<>1j%~BYTj=|i)xwT9fox2+B72fU$ZN={Ifk4>mXOzzE6H`_BjgtHW%5n(FEXZ$oem$_lx#=#AP19I zljY=6at(Pu`3m_K`3YG?{zQ7(+VSU-L2@LSPtGJ4kt@mdw9EV4T}kQ_r6lC#MrzTuH7YA0eM1cam?DpORJNPvq~U*}+byhYXNy$gX66ax^)SEFl+@w~+Uc zo5-!?Zt^|y5P5>ECUZO6>FP}mC&!URe3INj?j=7U50l@LA=25!j=w&c zN@kEbWIu8wnNQ9j=ab9Gd&o!0=gD2<+vF$Ym*fxRMbhYMr!SstNH!zekynrd$*ahT zkN)&5o}gnM^h(+mk)WLF5>661kFGM?OMsAzvonBrC`-$sfpHNoRLE zUG2#rIfA^7oJP(gZz69e?`4$>wBV@=9_%Sxn9)ZzR`{_mhv4+sNJIyW~Og8}cXeH`3L| zPG5bp4cV3KPmU%hk|pF~@)q(Qaud0g+)chm9wJYW)#P7fOkX=)KC&sb=Kb9lejLac>k;BRB$Qk4!aus4+zj$qcds*^3-Tjw6f7dE_#3E%^|+nS7Z%N&Z4=gY9(0k;!CpvL`u|%qM4& z*ORNryU9n%=gHT|cgfGlU_D1M;4LSldH(P$w$fO$=Aqt$E4dmnGc5)B-0eOTxN&Z60fn3>Njw2hA&B+`x zkHjm|mHTVSh2#oy9l4QwmVB4|m^?@xCBGq0kw1~YkiU_Cldh3=I%3HBq?b%3)5sQN zTe1V$mCPgikwZwl{Zi%kYH|WOnVe3}Cg+p?AeWK1kav)GlMj&pB%dUoC3lcJ$vxy- z5bmC)yo2%^Aq9BR>~5)U;nI zM~|_?vB*>*+-FhlO!lDt)#OZaCApS-jND7UCxqTSC^Yd*D&;dmr2jnSzbQM%+U`AM zVU+?O&q2hkTdzUs66vo~6C> zYCD`b(knzdl7%SmOxov=SMd4>%GZ*UX}^&2P2_6YZ>0P*xr6raP_7_9qy0rP;u@r* z0nUvIkuDF}mK;WwkT(e7{$|Q+$bXVAk%!1%$%Jd|@SBl6$dTkUA=<-SVKknHp?rtX zhiBs`KSKF2$~(x{Y5ykWk0^gi`76rDDgPiuJZC6hr2GeEW1M|GhHNZEIx@(1v=34q zMqW+(nUv>|OKHEJ@`nVIl=I1H zv|mDbCAo(74+&Avn<&3TR*=GTPrNMEL8-CwYA<`4a6b$g`w5(N152us)vSqTEV|^kq}- zMmdl2V9Mjj8RTps!dWLo`*>JrY1*@tUlAhQ{p5$VKS}vC<%^UfCfV*|ga|J|i155* zE_q|2eSJ0g5cw3jhkTDbNd8C~lWqS=WLt7Di5C^A_*arokpChNkw25#6x)3=*^2B= zjwLnxWE^*rF(j%|*(Z_>$pG1u%pr5hJhCr|X`KpZEQxAYGLoq{i!37-lK&uAkhhZS z$a~4B$Y;nG$XCdB$oI)g@-X>5`4f4b43Va8r!$63A^l`qA;!t}WEb)ZvM)J+yq1)A zO^ClKQ9VCQ_bGmXPzvMda<|UF3u0MshRx9Qg|Q8u>Q)9{Cyh zIeCKojyy+RB%>qja)~FsWHQ-=Y(};v+mpS>AUT{IMNT27k>%ukauvCnyqmm_+)S$H zP*JWgQ{F{>Kvs~4$uGzs$+P5dJDEqS=U3rxDCO~F z0Xdy4A#WsaChsBdCpVMNk$cED$xq2cCXTCgmkTl71)YA$??H zGL39Ub|ia{y~$CedOjE7PM|!AEFB8{d6K+H z{!T`rtx104$W$^wW(hGF%ptpyJ;)%bp8tirk(9@f#pFzK4!M9_N!~`P=YkQ=J(M3O zpC-4H>N#P!+e7(H@;y>LH;n7YD68j&A^%KSJwFWjH_HDeU6=q%expbqnL;)tTafL@ zj${wAH#vg5ip(d~^T&v1p2%3QEFy0tZzk_0A0QtkpCF$ncaU$9?~)Z{CHX!16M3Et zkx{XBdg4eQnL@S|V*S&e>_T2a_9X|9!^u(PByuV_i!37-lK&uAlWWOG$W7$4tKvqQ7JbQGdBY)L%~_%0+&)*Hcg{ zN=ERC;qb7Oyc90NPp7QHhun&?3Lj%@H~Q~M`#xlUA<{LN#BDN_KDF*bI>(BPbdDqQ zg-CB9StLZdXOMej9LHahjAuxPdJhA_UktKS{hmDWuhI=! zr5k=!{E+j-9l~2o_e+Hc_d&`Vg$VyO%6o-~N3Gl7|FFo2Pu}GtpI2#9($+7(><-yk zSsimbckb->XDJ)|zu0!{DA%*HvvTA@e)J7}2M2W>3mE=%)aoS(@3AXYk}F4D&(QAB zR%^L0I)hqKTrgu>RMFqR{`I$(mYJWHpS!yg?DNhopBq1@;A*_c>s+gzX~Ecm;v#mC z^IW%{*buooEf}qAq6RrH+?6jjkpt6$;>NKxYqz#1oDOLt@{_f;{M-`fh2{C;(s^Np z&2!6p?*7i*6Lx!AfB#EAXR#~jIjcL@hE7gxc)&ZTVNv7Y_HBBbuS4TD`VPDp%Ghvs zsAYfG#mGq4xl?m9f<1~V`h6JE)*3;5eO9nVuy^p4e$j)pCJjrCt-HTFyVB7n;(+U7 zW@OJ`ML*Zj8-vGB{WG{R*ev+ zxC)%relttuF<1R}R=3h5A6Y^D=`bH(sd835SZfi?Xd>pkb1#-3A2(^|u=CSPMRo

DjdK1ulxT#<=A?5x0H|_Mv4mES)HMUOUEv~d-I*=_T?!z7uLc2plv?) zT2JSN`wDFP4Y2#*B7cGlmfPR%FVNdhE_l44 z{R*wB75v!Y`Gb<{UlFr67#qyn@qUq>*|b7ZHoeF?n_thfM{nk7_VPAYbxMT(v|awL zYL97$?q?Zh-i})6nz_Ob(^ZvLytko*v9;H+PbBsaDte~Z?-f}=v;sXs)vTVOSELvHa>^f+5^4SY zuf5T>t8-kd@IMx1(+cU$P%)jDmK6*rQ_r21XsH3@zL$~*2dhtIup}JPT9@UW`*YHp zW4rFuF1#`#p{V6ftynvYcTV=x{H6VT!P0)=_F<%@mDW$2RJt;4Q)yMHBU+11o1H(~ zy*oOqw4aIES)m(E;;JK58`>R;&>UOGhn#G*1@)(#Djo^Tj?D#Gq+>;=i|+5GS7`pEDt~H= z)NqMiJm9Q$Yp!ayeoW~cJ>#bXNS%K-%6eo^>#U<*EW+3PqD4wyj0if5w5H**(=*~L zj-&pfD!OlLS)5kpe65?$Dg2cZcSddMfS-&B<~#ahzTic~59=)+>LU3pq}&GwFOZ)o0a z_lD+Q|6Rp1)3;AIPA@lH>398c{(RLb(QRf>OW!E1Bq|R7TSee=paOEsLz`zuTjwq-j-p zTBOQN7v;J?+d4IKap{XkO(%L=!a=QigUjwM`P-y?n*{YV3E3ZXURXQ3GUN`}Qa1Ee zX-}9jR{Yxgwh~uxar+$?CfpDk9B^3rU2d>g#gtimO+;j+19`G_LS}JtL`G$+DrdDb z(pCMSmWO^WA!-@b70&9#QLYQOmJSF;HgQ$wM2LOZp9@+(Plc#u9In`qC2ne8562f> zm9{u}XIlBB@=fK(%QM*D&p@Y3uP*IZ+Rssp7LaG1_0^LcYt;{$%@3p%TW3q_C_GW$>^3tO+*>oIqvbWZDFZJXgeZ* z7Sggag2_g2q^nP$N$}ZFglf&At#e;=6gz`QBecrg-Qf~*1^Z)s43Bm#(9UvIJIjSm z`6W;0E#33uRLJga6$o3a+ESEk7|%8hIlKFVeF81jHK|c|M9u-UTeL<=M=rxmD^50@ zl{HdT?HbSnwuDv?X`6bo9XqQZ)GxIM-?oqP?a?-T{j*bc&A0yk?|$~!fs|(E9>Dl9 zGP!8eE;WbYxQWm?ZemsunHzMdc}vfrq4@1I#1l27Z+t~Y@L)*WC~417LX9UyE zYm?Fnw6wIjwjE|IN>9l6A-<*6y)icLT!V7=i*Jr|24i;EWu#}ORM;h?XL>90&OKG$ zZri`c=`A7-d^%3gbR2N+eiMwYuX!H z<&mmAvPLmK9(Mlsg0R-o-TEVtiaz)Gdv0{CwRgRu%RHV%qxzke>fpNfDUBo$xmhsDhqo=k{ zyT8}r0};?F&gwq8?XRMu^|om<%P~g0vZq7v-BTTc@0|K@+oYnSrdip7Gdfq$UDY8N zUuCzr@PAE}@T8*NXO}uA<$s6vV5d9-Gda<9<#p<*GW3|U=QgcbW#}o-zR**J692x? zV}#i>tFLLmQICcFI5WHVH~6`i=Ml5`J32M9lEznx4_*fD>zxyo-hPMfL~n zbcE+vc4^z?FW04)%W6f;Y0yvMcJlTqBf~@-{$QF4U#=g9Hf$iRjrvep?(teJH{p|b zwA}l5Hu^u?tph#Ur9we`D(q)Y$(m4p(tb-Z>+<{KRc@TY@3uMpD#o4upkI}!r>cFC zqtr^%(7v=Q!)A->QC;<~(iI&q$5Ub~SNUh0Sql42+~)nC-S_#A#bfJ!w0Z{({s;AmuOS zw=XDHsgFeJW#kU^Mqc)4ewdb>ebM!BY`W%uuvhC(BFBH3p`XTks1Mw{Aa2)N3x>CD zbilRnTcY}1 z4K)kwP+m1Y9&Td&q1~9Nr)><4$k`Ygp0hVJHm9^7W~5jdBnEQ^-m%qPq*upAy4J2; zb=Sg87$4Sz8v3;+&xU;3zR;-jp25}u$L6lV#D^qiEn{GX;{h$RUqxkTaL&k`8AYxw z+TB@wz6_Ww?R~H}pV9&in?PT$6+e0BCOYB*&dq*|cJ|z@GPJmr^8sf|)TU!is8N=4 zPw%rS%G4VEOoSM5I!Y72dK%J@(=*sL*d3`58wW;2$Nh;dBMxK~bq`3~MtiZZ42^Qu zQ+-|9b_IOdBjl$$)`p(zxC{TE?YL=2MQE(kdEwrXzV^90*M<6OdWPeG#4$F(AuoA!LUBOTS?19 z^Sa)R8MoLj56y>pZB}8|<)JxU#osR_$=hVaicB-A{FrZJEG(!yXTB04hUd@D>OWO{ zX~jPCx`WOO-LdkpQ|=08?Yv~xGA32*D1IySXO_K#;n-%Ry@gqiAMXQR^Ub0DccKUO$lRtQc6YXh_Ori7c$St{oMbkrlu<##lT-}a3EiF1Zkx;_ z993@kI-TGBRJgXAaMt_nsnQqk42{W(4IVLFLG57aZme>1CS^7|;xAbr%FEB%>B3yk zSv^LT)M3o_&SztuaG)X-0<8mULt4Vx(BFaR-tF=}F=Hxs^o;4fG^Dl54$6FKj1eB| zOLsfe{5}FRTTiT!Q3=f_t7nH=(eK|Tqt%;Z*MWad+%R_OPKR3aPurPyZdKWavHfA+ zplri9jcaaM{mU*uzVf$sY|m|uVtr@YwxnJ%W0ortwl@5nq3M@>7g4@)G+|B&-`ife z5Z_cS#)nvo!XGjo(YN=op+o!j9yMUtP=7FQz~Ip%`fAZ}_$KGz-0aRB@~-WJ&v;EP z8{frWK7HbZxw8u96%@~quiSTUTIesH<(Kc~`P=#NWxJADh2_!O&=P;1yv*ItkBs^A zrr@>o{*g$AUwzA1)22UcpU=U6eGznszGH}{eK8uF(Kv(<{u%qyuq&IK1=*oT9P5W| z(!&X`N$sU!ZkB-vJp1s?B=j}um@~<%oH1^Yas+9y&Y`wZcsL6 z2pgh~NLMl>!y14K*KUvtk>;9#NR-nhpT~7L%?@&iv^}mzT2002@)j_9I*IXfv28e9 zj7M>VH?r|WF@9#k=$|9T!KpAdTO-E#IC~J)^${3d<+)l^uV=+H7pC5?C=)&m7}fVp zbs3+@iwb_EY{l5`h%$D}(V_;NfYCUEBu5Q-0>%huRN*zqhS?0;y0#G!N+iaiwqm1B z>TJq}ajqP`iE;oc=@6ow@*eh>b@&%67d2yhS6o{x0UMqxV7x)D#f?UOqTbb| z$fKR|KR(*I3l~r}@<44p@hc~5+;8AtW4QSmM0H&`Og#Jup}yGEbK;+Tq&*d#Q^Ot``ueU%Z7U3RMj9^Z&AG~(f2vno)N(UX;6SdT?Pm|{rkoz~0%gd*c_ z+}Mb;X22@C*tj?dneqI93XGm++=g(zb9(yaL7Hv^{CJUkq-O~7A3ehu0cmxlrwAv( zqh}eFK5W)UdYYiBqf3l^n5*rN^vunGRBD_;>Ftg7e2r3wo^2e4_lg*goPdcgGgkLT zn6aKlO(2yUw;-@kg69Dzq&Y_SASQg4N1pYIo@;DJc}99X9Z|y34;ykY%9rSwG!)V! zDmy8Oo-$-NdZV#DSJV87o}VRUj~YpE`Ddc%NhB$Hlae&AXNaWiF(o;@p7SC-ZbfQli&03dxOr zR!Ls3r;8N(b4v1gJ;%_|qPHn2$?Lfi*^GY0_!`G(Q@ox#q|RSeQjXWt2^}W-4J8fs zdfF#J+OMQSuV*y6M)X1Bb`;2BujgAy=VwYy&X}LB72}tKVf-11(~M$ho0v1Iqc%XSF=wT45^sYxbjKVtR;o^fHW~Ao zkqonDW%Pw`NC~<%P&^-2t_-c7bj^F=NcGA%E%DW6Xhtz#8Al|L-q4pZRYpG*NTXy3 z->5*G)-u#v%rPantcQm{IBqn9vj{Cw-U<;J^MfI$Wvmluaxp&|O21gYOUyqhcTU^W z&tXqbi>8eE%@_zz-kDm=A9keP$y&^xMm7R=dW*G~f2#;1Y`=dg!PFApMWr}noQ~BJ zVKM&2L^$kx7keQ@DnYlB(OF}nlwep-O7TQ10bk#F66(_(^Pyu2I(d?uUW%!(&0SD6 zF_jJ}jHGS27<14eg_U#~?I-3lhh#D7d1#xM&u#l2QgcUb^QJa1f1%6`%jT48F<;vD zBhl7lzOv2#8VU2)j&2g>lKL=L+4dL2?=d^xQ5|7EZriKeop4AgCB;bPoOH;cswDYj zM9eAM{77Gzzqj4XlXfvb*x|UK8)Hr@vt8}CBSTciiBsA_>%^RQyZ}4vCR9eupQ;2j z?_4eBZ&kEzEm>Zm6B*m`2ppN);3zgzjG7rh(b{Gw+OULS42MdO%ReHm^&NDfxLG%$ zp(US0Yjww!wu6niA`aHGe^3EDiZY2S6CLX`-$RY%uYKST;1`a31AkO&yOC*jF0Ss3I#F=JJ%Yb>HnDKqj&r$#JgT!0P z2MJImM*JibTF!jT1N%bT!&X#6{A97#&3p-Hir6}4dY_3CkJ%b6vfiP05#9RK zP#(;OsXQ+J`d>V2LBA1Qij8w0{oC$41ZsqrYldS8gpLf7hDhw#Of z%5h^m$1TFLp~;6#wR&I5S)FL-t#BJD9;2P2QXG-aY;|VvaR;q{Cb$X1Dp)0Q@f(v&Sq$iMr>A*=Nd|CV zUO5W?_lVhJcEj-L-Yenw%n9P=U-IJqB&6y#6r!;_7goz8ff14JI|obRrXYKFsj;LH zKDVv8*NNGw8BgTF>H1c1lAI4!m-12HoJAJ$61M|J`pkuv}IO}L3Q zWyb8T5Ocg{+$3=wkl2&uMOi-gq0aG$OJ1_?J}e2=%oc-SJ|bqP`8e9U`*SfznzK;v z?xRwvv8KEv%l(Cz-DZMxp)bYk(Tw*o#=5^cA>rqv>8HEDc?{vJay?cnTgPi<>qM<= zeOoJACu?Qvl%1^((#yV+6l26GldkoB9|+0oFzm#-&p4odRa9qdMO9rZs&jT!s?+~s zN2S`*dGYDA+tLLwN21!EN65yb2-$s6jLE4`Avx~fo(@Oyd#yzmeA4}y&(^ZD7N3TLux-NyCZe5gmGL(>EJ&^>#p-arIteZr;;9LiUETl3D zjLSyS+%DY%b7E{uDT^3A5%X=Ybh21oCDc+XHckn;nxwhom0(yZsr8iLuvA*zx=O62 zv_^ehrB;h;h@jmG`YuG%*zHc%7a-x5oP+G-4dfurP5qW*h^2 z5d124PD}OLfPO+6nbtVc-Bf>A!o3k??rx@{)-0LNxSK1%sWpyux6wZqH!xKO7K}X ziB@c-gcR!o>HV#h;J3Ckh0snVH(iUA0!Ojr=<^VhRbK|H4$91Qc2vHc-kGyCcPD)@ z97WoB&(&p67ESRD)B_rxly9uNi~fNmd1k=^&D~X({)=b8u3iQc7QIrMYDFGeBA?;;I#HjQyip(NNci; zXM>dxt2Oq!hw5!GdfC2*DKj%aTnSFgDHV665+d!A7@>q%tC7qZMk>K=7t1Imcs ztpuN4ELSNZ1*w(}+<2?or++B%u9KlNN%bJjdPT= zdyFc!)s`Bt$Erx5(c#uv zV)iteJgZPkXewr3qr%Daw1j4JVNPi@WAZF)SUrK@{pP`*aNp(;nA0)Xq2yzo_g<7l z$d?S98)PA*scDY$zTc4EV9I3JXR8n`{CIUiDsrN@BOUJD<{YG^{#r46&azqa_4^NA;;wT;M(9?1i>PjlQ z#M9<1%(3S2!7#V2C!>k^T4R{A+r#WJW3XuQv>OAn&s>V#GEe*KVNNmsjn3%luo-5* zc`qu?)A1vi)3qj#AV%4%jFo>#z6-%8K8A*v9z8>s^mvP>WMebZRz(onVfT@$$c=JhB^7VwUSRa6iN_|VdmlORDeGgi($4WxNqaA9SF2!m+9D+*; zsn&WVAUeX3QuHGsQYh~tKIF^Ba=8we+qGt26SW)<3BNCLK6fMmk5#@Lj;U>LaAJ$%nq&;aPN;<-)?CtLVDQuN`NYWCw zN{fmx9Y4Yj`$iF|DqYC_3@F0Hhzy5((8v0!BZ6qDV$rPY+e64y7j#P{vz1C_gdKV| zJgCr}TH;`|VP{0HW3mLY9}}yHE_NW^-ea_guF9-ihq7>?o64P`C03#*Cq(pf$QOaE z#(i;V03((OX~aN!N*N7dkaC4B8HsdrIAVOO`x`hlBd&7D=Yp(XQ8y7|8OWXhgsW9# zx>bo0I^r57IILY5eeSZ%hb#)=*|Wy zVs@G>;k$wAZ;@sNs;fbo^n$2HEKNHa^6@D+$qDmRsKO4z&G?A8)JPi#n!_nd$ zN$E?dK}TjfLe0R4*|{nm0q?IeLp3tFWKDLg@b!f=u=y8GgsGB{kt(X@?U) z_i&7`!?_2o*fG)$=OIbWC>4$=H)I^6B?)fKOi)>lYdSzkUxI4Y9oM}8b3ooatOex# zSb9LV+Ks?nXitv7=*E&+qpTf-DUu_#>-e#RB}1cW%U_3Ogu1_jg!*_&D#GiI{;CCT z&6ZFPV;DCA9}ksKi*eBz@MFT|3S4M{CK5Q?wkEJvxTpeetR=34lN3jUJ_~l1D!)iw zW!$<&k{6`}r}Y;q%n_}GNULlZgc!YAm0?^qT9hMJmp~KWf|hYQ#v89mXphC>!UQ!k zXx3CIm3$@W)-os!M}ZOyOJ42en5YDY7WXRJo@1)9NJ86>BzqjiMmlzIta#+wF_WQv zj+X0~rEc6ftwgDb5+y`h*Gmg3RYI)wN*;uArRUt%qdg(aQK~ILi;IM+aLhIKBc23# zXmqi|vBdaJB2tC0)UXTTsSG%~(U2~MiFX$WE0n8fOEuM1hBVMv>)#UEEy_=hbp#`? z<5puauH;(#q)Fap9D~r!daXNz)rPdOp4KN)2x|;!9QoG!s0PRFhIE%g>x4AXJ5(Xg zu?nDC9BWn33%mpRmTQhXjS$kg*lrkNRCS5%PA4iP3eBmhG@QQ;EpDaMz zy236c_^fr9`8ZxPB<>WCTgrL2sFpr) zZgW-y>^q9RN6pT?xsp@aKhx2jlOKTE^?19EkSG^+h12dbwT3ww=D`vT&I?IWhDcIy zcVa3oyS>-kAs$wVqp1_%NHgWNc-|t3(`nw+1Lk5oUH74fc-0ntEVi>zqK`;8QY|Qq zDc#`Q+d{8|oh7$vye-v~OY=_1UZ8n1m7rVOFu-_Q>Cz@K+{lY5kYqhA08b0iX1v{O zPgWBsA8&VhN~ zDAee{9eEf*0>?U|I0LspEyV>|qom>ks}NVcz*#BNz=?*KUIvm7LPB5==9N~!f_qQk zIdq5yfosr!69ea9;|=8WLJbB^Ax}vGc^zKEfV^BWIS_@AQv%a-@Y0Mxb|*~G1HI9I z8V9zc4fq2qQOJS75@fYW;A6y|7U+fQNDovZ_ND)gO5gxNW;1G=?KKt8J2H4u-M*)8xkTy_u4gZYZU zM@WB;gZ&cKTZq z!_8TLQD);&%h{Oj`=`(z#`d4Tmmh7ne%2a#StaKEruUrYbRUe(i zH%AGEH838+TqQWH>ky}Jp03o0wHiZ}Z@v;DEP189Z-Ejbt;HAud<&HjZN;MP`4*{U z$67in*mu1W+}3sngvBaokCoU8!atPIzdq62@7rB+qv$VZ3#;8HBr(aGkYIGO$hw6Re3> zLs+kbd`muT>APDA1y)Pw8{a)jm}m`a3E^HPOtL0qK-i#!LhBAGsQdKK(BX>gQSN6n z2c^2|YblW~O&jh=Dv--+M&4n@jJ~M@jq#@m~G9TR4kg^V_t(smNY$G zYSNT%MI_BwnuCoA(}~0+&5|bgow*tVPEv`q_4DdZU(#$bhZ@Ovm{ca_KU1aplFG%b z>8S(IuaoA8;M7y!hw4e1E43G?rzWGwljh46x1O4T-jTFG1l-@;gBe89!U4UJ5Iwa$ zT4T~85pYZMF#2cG^&;fzskspl7Rzd;zn=OAv|Z9aL>R88cIgjcsm#g7>Zv7HLAX)I zzal-=IS|54vi_Z+r@o4zBWalkrF!bU=!;1=%Xl|OPrU;*le9vFxq7O!jigl~%+pib zB8H?}M3}FqK7dY`bZa_<1$wHyh9~JZxw2SKT?(a{w0ant*it?9kO)t?P=Nb!zZQ)v z>G>B>%9VQRTFK9j5DM(Po+{rlPx_bC3vO)7OWTv)5Fy=2EtG`rlhSErq#lv#ds~Do zBXt5gQPMji$hayjUPlRqpYC9>A_eJPwq{d58eUOreTa!lWBB|() zL?!GqQssVa(#MjY{YL83i4YEm2KvBAO_XZ^%iL;pNddvr1lsEp;CmyMrv74 z2nR*@!blx2!e=5>8L8i+WhNb#(m7$I%GxsNs7%_wHB#3}iGC?pT#nQhlIpKSh;XF- z6b0dH5llyFzEnw-2$7D|*QH5*BSMrTwVPz&m6h3=LVulGT9`yHMS2SM_w{@T;wnKBwuLnY-oJf1O-l9klU;mI5esgb@P z{(3t+`6!R1#_C!>hv%^fNPcy#zrzzLISD9fumb~vbo#{2sMT2CTY7zzhV`Oo`nQ#C z)~p9*_;^PNPHP3~!M9(HC6QX3!cQArc>i z$Lzv)OhuGfie@^_cS8SD0+8)q-$`BCsb_;7WOQ%CspH{A7tv2xEJEN-! zsnr~9$ycrR+&oq`lH>bD4K_Y?FUxmc2@S0hadttaAjK=&!Mz?I*00~MNX z$y-r;8Ac?84C`0PPYbm`7>iPpUG8Y-7pR?jl3gF%C{2moh6pI{N?%*!d)V2z$mR-Q zVGLZhH{M5Pn2QdE1qspaYfp}PusxmAQY zj_*p9qE%KEYSA}B39Bvntb}i*64qLWphW^!@5-lvQj0?vDS-FrV@a)oYF=JU)5DTEx|(i zLb`8_aUV*_PT(C(V3Z{AE|n{%B_CGxty6;Anv9C^tye;dRf(SByITnv)@@R5_b4I9 z`b^sF1FGhFS|=Mrcu)y_tk0!kJ*4&m`&&`c0UlL;23s#k>1|e3Kh`Rjj$)ta9Os=k zsa*5f2Rg@Fn?~b`eV+3=YlgJhZHBz_FW>3{MeWo9mddc^S+5lK>{gDCT6XOvS&RS2pl;o$z^CIY;$*4GArE<4b z_uMV>jn7pkUeG-=Vj&$>(q7&3gk=ZKTK7AgI852eajh3OxaDyOWiiTid`vbxH$ZQ5oshPxnKMuhu5ZPWVeT6Wvl@gP z=DcPwpHiMpnP$7xc;qs3#9j?Y5#}3RVOFD&*=Tl2x#m)XQKUNH==wZJ8 z|FHMw@ljM+`*>A#cPb=J2viFsq?0ZZ0U?AC0v#k+W8wGSh@?=X8@X2&I(7Ft9 z5Qr0GkaZLTdcYK9ur+WLka$6cSUeyIBnVPqU5Stm1O*vt{lYwL1sNvG_&|~%!>t2s z&~}1EttZi-fn=QxI?C#c*(6{Ir^J$&>7p~>#;dpI=0Hf|R@XYNC_!KaqWa~aStSX` zH$pannpHt$q#!t5ABu)f3zXy@bK&ilLPZ^jHv!@JHN~U2KY}UNB2`p?<4Z4v^W-mNbM3KQKp-G#Lm3 z^JR+eVO`N1oHGTUyxd>s0hdfQqEkfFQas=Aa&N?*i|kRq`~TaDv))8 zG+JXZ6bJ4QLzi2#89qA&S!pdV19GQSZngC@tbb}Sa5lY|z@zh4^adzzoWpT9A zx`v$Hvi{g*_3a5{ueAO>)+-i}M+CXo;wB=nPv>}WpLG+v!J~rQZ;hfu_KVm9md$D( z5adC5EjsX+AiJ%?YH%LcYtdGFEk7+ds5byPXk}q~4m=^|9JbD2ZpUlZMaJ+w6m*irF9ydJs$3+lk@q9Xz4stj=2ErEwXY=#qPy3-Nb(J9TL+*8S5~E z%1SMeua-2j#0(5D*cak0n-O=iAVC$SLuH0ew%#iTXShs)Az8x(MmT4+Tj*UN7kk!@{`t1~X34g8Z(*vg( z+=#E&GB*Tjjr(AK3fIelX<~os+?k8Cz;uJ2N#z?L0j$6vqqW?&m?^%{vf4*5QKj~M2h*(m5ZXnv*I|y;?I?V1*iWJ1eD+rraId|eQDMK3 z#}mp?2ussmgU@*TYy@H(djpz3!R`hxB-+39!YE_!MCWO1uR-1<`}16wWOp0@d+c@S zqV4S;u*~gX|AGW^JJ5$x>^S5~wKsO<31tOZ zJ4ntRl{XRSyvF{tk6Ury?+12Lb?M(ZlI4tt*C(z??LW$aSvoC>U zcY8Eu*dF$_Zaksn5Bc@9%g6JC@)gu5+qU8M-u8`X_#At7B~K{NsNo6aZGijQ1!%%N z`?(Q3p_~dY<=cP85~{x)M5h>FZ$%$I*?t8!53~zU;|b+Om<$Ac*(2Q~XyjC@aM_9>7*q}eN~ zH0?>v=8qyC*6b=c{EwP_KWg}tX5R(#pVsX5sL>J4z8D?%8O?q!ThpG^?Dq$1+H;zH z3)=X3xMtRgjDZ_@x@gaZpk{vypXl}x1chOj6*C6zL4^73KfsEB{V@uPv#U^d)4she zV_-7$wy_7IjtTY+{TKsTsf>ZA5Fu^tuVGP=Z6LbZ*%zX{lI?PMslA?Nmc-5>8TIhM%&VJY1@N{G2I3kw!MPHXRn^Xg_O}_5OO`v zTwNYR3%;594BzQ9+ap)%v*!ZT%xmGP)aMBM%@T|dsm~LRHy=y{{NiPRgXUJWZ0gIT zCz}n)fL|dTG85pL)K@9f+1v)NrXIZoaGHsr)>2<5Jz_o<0sJS@v&`CFfZrs&hdCd1 zroQzk;B2!Qk)Qew>A5EV&0*@hg!9coH2<%J2b!NDa#G(TTwrEk7)gDfaMYX%U#0$y z@F;UKe3kkU;bJp<0^pAcmzbBZF8?50X4YW%OZ}8^rP&TcOX}yet;Q^8xnGbz+4N&l zNd5K=z_sSe(*S?>IpCS*Q206Zd!E+MHGK%C)E_BdXI)PFH9Z%M1}nKA0C^=ulDIK3X6)z%9Lhg4ILwbllDrj33HIP0wdx>jnEemjs2)<4nY zsmc0&ARDb^9e`LmE!b=ouqGivwpg7pW~Zj>Z$PZcT00gnB2AboXy5A&e)U>=Y>eJGH_*2C!BsblmtIw#*%up@Q6J`J4b zt;1p-aeOe8jL=sLS6-K0`+F z9T)BbK|IDNQ5<>+MI9oC1u#ltbdm)2JD?^qW{zRWn@8aP;$~+k{TrDKuo4+vzs7eJ zjieBxP6^R>Zk6Ve#TblX$?i-(r1Fm6E}$d>G)7W1@f}6ixp#suuYNIjV+0)?FOuDi z$}^l}*rF%4urDY`Dnnffib2N-@?SuU^BMU;er;H4re5B10%jywiR=uDFXd#pK2YM+ z3y;sCHo~`3n(Z4Tr1^AXPC5lP0ZUtiu{6o(a#lx-@n!-S4T~ke`2yjk+%@VZe`CMP z3K|`6o`$ia%PPtwm~VFme8K$~A``=RU^3_;M*)dOxDQ6zE*DV<-~H^ue}U>xOXTV+(uXTSL1733YmM?)Rb=&w3ky5wgF3KCzF>r-{Pc?Co@SW*VSKVFAK_}QtEc{JyfM`*H5C3zlI&Yn`+Y7H#h6y`}pX<{1h$>-_M+wrdhGw z%>X0j%~^mSBAjKe!B`!Bm~ao1zXl)PLpa;K1oKOHFX3F1|IIJ_2pyhp9)&sKeNkwYS3hY?sTMv+ z{p$gb*TPQ_-k^t{O-1HIL^fhCL*>jY>+DquFLZIAv-&nxVjd1ZRT6~*_@4?o`@+wh zkDT)OEBq{VX{L^aMEE(vev|*6Ec`s-c=I+oNuHqu&9N-|MV6Ut&Y{CzVw;A{eF)R= z%Y@U+dWO*}tZ0_`93A#5;cRnT2H@9NxqOrVc0GKQaAkTKEB!j*#`H2e;|-d&+00IZ z%%7O|Wpg4v!*3FP)4U&jEBt4|@0r0&z;6-$#H>ff!tZQC-mk;>Nlh*Mm*fy&Bm6QJ zFyX&8!)VPHuFMDW9uYsDlOPhq?-RlEm`c{+10s0p@^`lG-&mn!pK>Y{i#vxa{AS?l z#Tt@X5I%))oLNq|gs`b~f0QfX^kICk*mLQ$IxRiQV~ieGM<6qv7HQp& zU}Q;7udRbfk2OKir}6n>5B_tF^y#FkL!p&`q^hVomGid?1dnKGIZ-U3;?mFJcd^V@ z&`r}9XF&u%iGgNMm+#;D&3c4S`ZChv&ClWE^yL%}no;;EeFY0DG1)EB&!Nm@lfSB+ zzLIdQY4iYmF6C#Mf3g9eM|hjLY#iWKgx?FFlL2@&-HPX_23k4&d?LBJJn&1ua61gb z!&N@;OJ7H%K$i!8=@$`+>hi!ZeLay;x;*epznBP~!JZLCo=b?7;2|!8GW{}+#CRYZ zMC_+u&iE+vh2KGMPQStriz|KMwf%uyNuw)4%tI$wA` zwgBn(9D;4@ec>l^fjmI5_5N@HIS;bX4gT;GEOa-KOa0+3-GMwrv5o%l{qR`&lN>8H z`@?%q1o9N;y&iGlf70rwDV7}-oa(u z(NnR3L+ji=B9TNjBJhjW?gPNQ1vfBrvPX&3k1jQe_fI3(SufJy{#~D|@jt0m| z#q^|S?BIKv_9Yl6H2Z3N>h{g}H0-Syf_?U>s0@y`t1wJ$$#{^Hj=W8f@etLc!=P<5 z9v%$O`^^*KmyA7x1L=+RbF_@TgyYO-un)|5gs^E|j`c>yqpWSbS&e>|v7c}ov#cZF z1B4UIDs;h&$Fl$j&6&diA7mFyHsesUj3bokY&MnyewJ{G`Ee%T=Ln~ocfs_G=LvT) zZ=?JRS%A~b9;jo+%Y-9lGAfbr3gIks&IrKjYtrTrdPaRq+8mDBWyk~Pp5_M3&>4SW zFlU>C5xyDnx=^n9bQG{0?dO}71%TyfzrR^?B49b%A7Bo{upH-OD~T?jA;)9NSl$ zg>0{%nRlY~9owRf96Z)oLol~xB*>BEOzSzeSfZQ;&b9P7AZ>+HXIVtr>1GkPmMbw+ zWV9Eg(OO1Ns$=x!);dIEMo1K_u(p%{IYE%Kt)6sXM?uc9Mqr}K=p@KWD+?VtqqEL1 zTy5RNcFY&fMy=f{`1LbToSxIABMOeB6!1yBnbQk#GL#KsqFvw0!qO9@BJnbdzO;T|Rr&Qr<>=bC&nm{Li2pvgyu zDOH4{s&5}fsZK>Z)*&Rfr4;MmjKc}cXT2dgP7b~`>um&0$|*W+_ge!oxTTZ`C*JZS z3{u9+A#2cD+!e^Fau(a!+C}rrL|K~kJ$h?Oxisr2OJ4q|kUYiKzfJ;Yf*_Uh06e8i zo&?ld^6tuMa=1Lxl6O}o2~uZmp|;bdoJQ+3?66ZN3$on0W;Bo~a*)5$+JUZ-GF6b( zmb~v$E67@lr?V-ubrS;Xtu*>@uAEIbSx=!$q|6iKM(bq6Y|5E}Y}MNFg#_jhci|mR zp2K!(!LtSo!;ojx7K3DWLVIcU6iDdy`v^kAo)50i{vM-{-|mlS320g0N{0D!nBfV; zgJxI4^Sa#$-ORuu25h5&<7=0ZFeGGL`Y|NUIIJCw%h(jy${-Ys%cWV&TI4n4>sImR zAJD4CCT`(^<_j25j4KGYHP1%_8CMccGQ&3D&4k;TkKog|ig2=d9rIpIxIKn@tSF3Y z7NOh@-=Q14={L^OKP*Lf@R7c;*g1AL(3y-z=h*!d)C33Cekh2yZoo)rEES}UHE$r0 zb0lzr)?OBKo+wMU8X`beNf3mrzhi}OtQI6Xo8 z@gX4VBtQpRJl`-b60rj7En2W%kYUzlEC!6<>3m~2YW)>~V{DKogLAEhY#^8EC!n~7 z&@?PvjVnZ3nm@D!{nOYiBUi*9N?>cMcj~hJp(QE6)Jt`}{h_;P?6o49>kl2Ev#%2^ z1^&=InA41#bnZZ-{?Ih^Nn^WMHOe2_Pz7wKU`75AU*IzC()k8gF);L4;~t$&-{225 zA)<_XrG&NqP>-I#?pNcMKeU%MeL%2H{t#wV&3I6-EBv8ev}L!>P}}Se9hv}akGO6N zcnqAqVrP>-R7~C@!rST(eNJqj@V5CwzwZm|pxC*?AG!)-jPaykxBElG7?w{7w$mRP zNJl>>*j@h6GWzTl!FKsW6WEGJ#j<;#lTrRB;oavCg=ov$Qu=Ox=qpCwJA&=?hdwzO z*t>%5_lN$5E@AvtEIa5Az0V+jPq4%OPyuWEzF8_lK@!8+|XOzw8fv z#K7xlFj!ylhbCcKGHl~h1o%*_@bZ6a9T`;Nh$;1YK)w&GIZR802ycx*Kb7*`QE%e zLdHwY`gt^lhC)I7R@W$yk%GiqY*u@eAVKREm}QUFFNYP$TF1wbDPo_ie@%6K!_!_R zZ+L3*?v}k;yyLerFcf&}F&6ZQox+@;$$>R+H<%Dk;2 zs98&TA=gcgzAE^`zS+@tdKHjc9DRIw(B39UvUNAq*|!Q3vMxeTwzmt?*_wckXx}DC znml{AcL);UTfg@21*KOpxCa<8=qez5No> zx?Xj}`>hS=3AXBo4_N)tfo#X)9I==w;edrao$kV!Bfwsq?2D^vA{DuV%H5j7p z$s>+85U#`qC1}5?7lCFKL4*C46pnWv2LX9o#vQ+v%^H6o9K8Rxlji?Tr=E@zVNbmM zslEb8r+Kq9`*Z2$>Xmf+3(4Zw+P;#2EMMvuLJIGu;j_astk^gD?0@M`W6>qc2m4!D zK4{jhST)+;sjL>iRAPUx^IIkH)*IX!+I% z86AM-3ih25`WLoDc3;81H$rI)%skQZqY>)MZre|IKO3O~jI4Zv2N%B>p(gf${ze*x z(1EvAYuQH% z1Y73|okq)s84REGzR;jVVCv!g245&C9@t2cywn$ZKMB|kHE;xCVAyF*&2dMW!|83h!0tJ zVS$`^qaLcpO5YlZ%4as~Cjp6A@5KSxDoB=f0n}vPq>lurhjj)fu*{ov{;FlRwE<4a zyhXnNNUql933xHs!Q$^9sGmp(wfuBj2Z8-2AE$IUVLR;NkJHfDj=kW$w9JiqJ7}@^ zGntv2^i>eRx0um7nO6wnx86Z5Gp`gR-de_LY!)OaFW+QdB}lToYnXYpAR&3*Ci5CW zI%~Z+eK6l1EE#XBOwM@>62`_QQ=QneGfL|d!+vKbD z39l0FZE_k-c#Uw5xgKGi@CM;NCf~M9kUf2_X(PlE-sIDPJo9!mV}iU^x`cQKP%a#55F!O}rfWOUx&ZxNqV@tvh)IUnTjGXWb;nCJ-7>W}#8QY4i z5)8!&x*%h$UZ(*G2vTgFf(2)SdiQOt^-&Z^8{v$zEDUrBYHNOqwF&{1&`-W;Q)1oL zA4t9+ldV5sUQ38do;vHY0YF9wvcUS(05VdLh1M?gn1s=S)LW0TE=7VgSVPf*3B`h( zWd-T=v4SkJUPMI_#tE|6`lLIMQv_+W4)g+2A}>iT(YjTj3H5|p{XS^2@5n?D*}E|$ z>GmX)V`$y@4|(;3+44gS_HYcpm`LC?-M$xdKfXE6M`G_GuM7lu`R?5z2$+OSgTMP} z<#a<)J!R0)tn~=GgkFN^)@SIO3E6@e@{PiT-h%LbdaBD#DT1CmxMlJcLsf6StfO!( zX9mWWxR+%0=9>j(pPAE$%hREpn~>X>CvQgkE(bIBYMbpXauz7&AxYe(u^8ZZxcgNGO`esV3apv6K#*gi=~Iz zNc-ZMH}AR-;78-HBYYCVN8ca66)>~q3Q*SEL`c}{Z zZ^!9F^RniPo+O;&p)OKtJSjb;# zNbqyNo^w7%>%h4_9t8SE)7Dk!Js?Pl%Tb}gDq(7UC$o9>Ch1ctC0^N^#2RUXUcjgE zh~e8rj`aFRBxL*WDH0f;K}dR^@u%8+0u`hVCcB-v1B?`&v?|v?j@)gl1IWYXa8G`-c^WhfuJNm~&`Rny#(NDFxoK>N`}D>tBd^~GWswdhT8GhD+Ki(!wsRi{s$mIB0UVl0FA z?HC%3EJoG8b_`+TjAS@)SY%b;4|Ie#Qc%)buOo0tsW)wB!CZQQ!^MLiL;es6^|cb} zU4d80%4wafoQzF%DzdNCv!FnRCC2Fz=#hx5LxF5xaUCP!a);ygR;`d3y$E*YwUYBY z!iqgoDg-o`4ExTV={jbQI40`Z^N3^5Ow}{@NyaH)m&)SqQK`;K;zdxU@0XMN1HhI2 zuj_>a0y`}oz+|YL z)D<6?RJ1FpnR@nsEt;PtAY}pIenaGHSVRrg*HHBYs>Se9L(QVK6oOG|WV?=s))v2T zOkrr#2h)V3{1OF?ZGDa-t$ID8ppeR1I|Vv0Lx=D|uNBk)*aSeU?mY>gxVquin+j&b z_`x83%~})z=ztaU#0mhp08X0%APbTeN%-iDTV&>gCAroE@K`m><>inzXALq@gcGfN zSw?EWx-JPhRM1M6bMe_ zM}?q*{{o&0*}vZ}_6m})3^8AMezW=b`#Vpg^0lEt4su~Zy1TO70lTp1Ab?3T zp|bTWAy?Xu%ZIBCuA>(LFQ7&SyjIPPB`-g2z3C2QE?N!}&uF!h@gqUpA%~5WNfnu{ z^DyLazX;CF5WN+mr*mDw1D6?}Yu3jg>;y<5hYL>Lf}?FK?;Hhvhoupe z5sCAmTH^1p#NQ048cCLuO-+K;JK!c>D$_7zDtZW{wUDlP0)S-Uq==H7EZkqWWLe29 zCxCP-vJ}|>4grvC9KhgPWGnY_S6<6iPSDq);2;#7!C!d=wMzuwU_^G+2ZKJYvEvgR zbsS_oJ=HHld5aSBOcefCkWPYh(Pse00jT)_fSAJ3^H@_#M(4tm3}3TSq;X);n`)tH zh-~LF#GEssXR0g!GSu-xIU1-@({0JO0o>9jxoz$0W6nE(V=KuQ{7OcfAdmLc&lL6f zSR|goZ@q%U(0vgZ&fqs<9sG0PRX<`5)yMd_smJ=Fssh2{p$ns2G&6SJLU|nJ7{9(o zCwS|$XvE?F9Lrzg@E2-P4j~*N!!X4gC71XaN{xQ4u-IWktFZ(>E)6PrOUa=@Fk+!P z5`hGj=uLM+g&Ox4%27)aLQ#$F4L*+Z*}&C+sqoUNsmQiiw2Y(dSHpof3O*0G^h*wW zEZiIPw92-FA$GY04VWnSj|*J4T`q3C5}B1-6@E8x)v-28D?UfO*hbckJ|1d>uz4?i z>?GiueNd(K2VS*c6!2>#==4dYeHb0r2{wV!krBYJ7yK;Zo3nv8N$$&m*K(+ggQ|fv zaF=hz0t6!Wfp>!G>;ubq3Wi>*#*;t#uA$6Tp#2CL)o`=XX!n3j2gs!6Ted~l3KxQ} z#w&NO!!)5)E@Nca?7LbA1dHA@puvq^+utRE?Fh!PA$v|1DTZ5b;A%q4lppcMgr?dn z%g^>Y7i`sD3eP(+3t3O}bJSKFyl#GOgYSl1sjQN_`?*SfiMVu<9{%nq<}2dTwkHW* z+0I>NUgKw<7Dr&5RgReK-@4Fo#KjQQ$~Y+941n&`7y92Nm!s1C;8wVdi5#Au0;O;V z#GD~Y=6S7_e%=Xc4HYc$|Kh6WkFsf#j^YE2rxn)2N(qV$eg?%4;1;|IhAdxcC*vDk zM0RcN{(3pK7v9u887kORn`Ek80ZupMX9O>GIBI2bHaPjPHAY@pD zv+*gb*TNub-g*szifMx$;I8N=pFS5E)PdJe(zkM@;eV2Ts1D+OkyBKy@(3DGzfr;y z?nQXcIm->t8znqblYvY28~qGVevPn}G0cmJzSCcdJVmDhA+u;C0Ol%2s!co{pX-51 z=VP9Y%!31U(53T{>2y9>IMV;gQ0R3pS#BZ7rK$T1XM*0BZO-8*rn41tU-KjU1u9OU z498iRUsyGcM`W~`>P`s4m>;D2J84(bgNxnj{~*N|C*#?W#ni3oxq+Lg zj+1a5)p1(B1VDu=F_F{qK~M@CAn#1gvXaH>Hyb3`Z7~A(KoMI(buSDU(J5dv`2QrF z3Vk5iDl+nI{3vC$`H3JfQ)8CPEs;pHsIkwl!rb;wvaa?xe+_RDgoO&P*(oU9eqnjnr zDoeo2a!(XlvL(w?Qc5Z+qgF)Ok|h`Q9`Y?dAjP%QOn@pNa^h4#%vAGypE$bQTn zGL29m4RkdCO=7bL0Ex{xaYNxsiOt;;c??`wR%lNMbG7Na$U zeA2PxTn2K{wczwarW}VOfr{wU3O9h`^$%BGo5b+V!~KzGLXDX46HV9*Mk%x{6>T!D zM9~$rTF@?uq3r;T_H1)XRmZxtXBRlMXP?9I?1}CMhxQyjHc#O`aF!yEJ2uOaB-Q&6 z!Y$Qp%-0IJGH6{XP_;onRimSvYxttbpdQ_vE4!y$d0>04+CW#%&Op%ohMJV?SchNKe)!Ofy5n;iM6{7qw?WlF?Y0IL zOoT=24Bv~8Q5LO>v1pxR(FPc!-yLJo@a3*WcZ)^qJd5rXi*BPuG@BP93QtJldLz&D zCqO%2FM0?GWt2%b#F|viCyKmS8NF#Kausz1=?KJ&x&rtI0NHij6`QTHIv3)%vi36d z;8_oCl;P`Ed9az(5x5Lsx5je-8w|XZzoV@GUjDJ}>A<7x#!o=+^T_P9vm64y3EF!t zv>6qp$VH<7=so-JkhnWJ=a5vcXHkE#;J?V0dvU6Ih^LHj%|G0HcOQ*08u57FEMy za8++tsoG35opCmF-3!w1kfrER0KaG6rvX&ZpVThoC&{Pa`v5%F1PU6P7EYopdM6&R z;hgiRBFfV>y2u8R4qbvSPvie_J#lv(6hG48X@%$~$1+E`OzcVi#miGn3PN|$ znWgdy!Gmo$m6k(Vxnj4tqMo?ynICGyxpWP2am`+F&CSFQcZa%1+R&1N!1H7-eN^Np z!2|M;EpsKz;GvWLOdEBqFtd<#bQ_s_k#Zwm+7b0vVNL;tjQ&!aG00y|pZXeu&5lo{ zD-?k*UE%#U3n3$Z{~T7xOc+R`DlQJeQlrdwZ62i<7l$d}$^={tpu&}q33v%8h3k>W zJ-2CWlCwEHn}b5mnVfy3+#lQg3t45(yb`%&&b*u1H$%dmGclN{=UNPb_HYzyEBh}M z2*be7Xu?`oSZcar%{X@qj}@1NT_rf2J5D=}GZ~z|(6b;$&veknfOdWiZ9ZsRiCw2O zaKoVrrSCb?-xVXg5;PieSP45TObm5}(CSTMYTXGcj-U9F`=Hm@4-?|_3FkQz2M~5A z_1;fVmTGx7GZYEY5>P4Z3MO_$ng#B}t^fuR$N^9apk^?Dnj(Be2SX(t*arG!6(E~+csW|= za57y^4I2VZj8=owcpcuN5so^QuLX@e=5j|`Jz2nb8C?VpBjU_s^%S1%a9Wj%9IPg7 zy1~s+$�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

  • =MC;SiT*FX!U;$^EgC)Ws9#K1-ViczE)o~7OeGBSgDtl!=tv~t0-6( z>$NUftN$hilntVXuOmr0TKy7cw+&xcY`{M0(FVqx5Y1$lBAEZvus7(j^uvhh1zVlMKsM0|O~Lop_v0F;)J z3$&x;rL~f`Qw$e*J9naHkDJn>3N6$kir+@^)JUb%Jc|SkJNZymmYMG4B#J`t!@4a+ zMEo(nvwOhwG&FWsx<^$$vr~+8mfy8c$~jRSgA%%Vbg5N$uNorOqs1HqbBr;_*|P=J zv|e;PTOd0J<*-GGMnp;PfY+{g4CL?wEqqLUuAgyC;Rs7}_RZ0Ur>G|Bo}!fH<$G;} zlQZlOSs1Lzj}>)G?hj$71#yg;h|oRR6N7rF5>nofw1kw;d#ff0!tKLctyTCXF zURl_g*eMFb64|SSG*qi*;qEe;#LO^B;;URtLZvDaQP&Pw zJ50!@k)Tw@7TK!6s+bZWSe@f2^%`TM=s@8$1n>e^0uq)#NtME?ogQN~luVAb4Ew&8 z7-S{z^?EmOXxh}6#s*p&<7lbXG`f|AOczHZ9B06hhzF;kW_ndaQx!=3%z_?mHtobN zqs25f(%cvnE8BTa?U8kON&!Z<`3?aNSA;WTC1`J5OL^Uqg_bSwNN7++TIi9avnpb} zN0f$F#D*NLr5~~e*b5&khwAV`i)y-7#)LK0wMu+?R}he{l`~OX%%d$A<{IW@QYc_0 zlgYUK8g`4E@4bscJ`IlyTxp+%HyB;{ILc?Lm6MwVa}TvM!Guf8m}KDgYYjgxZ6*{E z?AWrfYGzI*c>-23DaP&BmR#G=Oo-J~RuY0Q)`;y-ND>}rQf zU@--pf3{bEDb)hoEkk8>i&0tKk`&J?2>^=_pSflEv?amVqHb-ei|awRB+2I%B>CKO zgyR;&^9pL$wQA;^u0V>`DUiu(+{pDoJEU^Cx&9v;mx{u=;x@G0W~MaM(E5t&*@lkM zHI4{VS{{f0gQP{ZX1Bu34zgTSsnq1gsHtJy8MhQ=%B;Fp^V>C?Mh!C^4NR4Wvfr+u zk{VV!8jyGwYmV4tvPM7($~70CjksegI34(zxRHYi**e}hb}r`l_go6GdrGqsP~}yV z?q25sU>h)1>{k7Q&k;~G6K6PKf`vVm)-)4fFFt;JhzAuJndA#t$>e0*e(kLLmNpX_ zDA=*RJ*LR65WqOWm~_Lf3MAA+7?t?+t|UMxn+bMY06l+Egu#w6kcr~9@`vJ< zF)0&4kDCQFDkK>e6}MHn*sjnmp=JUUhwW}IpSCpA90jdV(V0+%(2;r z3_vx^C9E8iS^-;CPI1dyxUCFS+zOXVCsue}DFkg@MPnHaV@8yNPr29`*^^>Oq(^WY z+NfrxYz=f_W>J!!>--?GP;ri1ItHI$5No&6EwT zxT@0P62hFWL!xg&xZ(HgW&+fS$ib&~akzqUOlY9$ z?}XSiU@&2I6~nDK7_=thF#yQLBB={SswE3mxpS;Y;DbV>b3AluOk+l*2+)|C!~=B< z0_0r=Aeh30F@{2ywo=IT7x+v#2V+G1{=8;F)TL?!z`H2NHImls=J07}E%h>}YOHKk z!toX?Z^e(P5^EeYM6yaT!K=8f;s$GCTF->FJKo;^D*^rzu~$S(ynzUp{w5p#pK6Fx zHZWnwINlEoZN?H))q~0ac^5OHS--8~ma+NxcyNcUNGbK2X(0WG_kaxLkraf^ZgtCz+MXiir=R^gVT&D!_>0KFs zFtjjHT+c*`C~gH4Wy3@!D{<4^70ra!zIo+IK%pC0jro?C}260 zn{m^h<;?<#hAJLGQkh~vLN1QGrMO`LlQIEonA9oiQ6$XzD;CPAOjD^=stMS;7=YeX zp=!Zq@h+CkKxGvEx&;;Bpjal#M>R}XC5+`vb_iJ0Vqy&l-sKj+vHcK)uufU;6}G$LVnDwv(qDa{frXd;^uI})F+Of0LZ%-=+MVx zuz)gK4^>nq!*H`rTW|Ea3PFr8QQ4}QsBGo2*;)_KEXJE`nM2M8+^oWJGaow*L)h7D zNZhivG4m6-sX{7eqPU*t$z@ba0R*<=M$|K*sO+4P%Ek6{_zp!DLL~XL_^3BTj02$o zH-pR->;@nQx3jBUr@&*mC@x#}t@FVVgh0IrmoZ^Jp(B-xdVAnTOR>nM3S@FFZk{Qe z=h?vW2Z+GLjYzgD5TA0nTvTOsv&$F6m0-%wg|e79vkMbi2`ZDP1Z?GCm8ZNVPc`$* z7Qu2RDo-^a@5%#2|50+k10(S+Dw9TYwMx9Wwg|_yMmSzZ0L%inpc#$N+OoM}A;2`GL8a-5g@nWuQKVyOo7467dbqEfPRn9c*vM z>L$H;KQJnR4Zr}%MH#jzRAM zl&b)rj;f$%MXRc`NT7G@hqx*%rmI9j9EH18HkW8<13jxKbi7p{%0+Go?pA7!=?`=z zdY{PSqY1Yf(aV_Z#~s53CQEHpm+S0g+{X`fk4B$$xP4q0AoZ>YAe6==3%4qQP&eFQ zFku`k2BDsc!6e&b5Mlrz2NOoguUpIUgvKP{HnjX^rX2$h@*U) zWWVpgJKjL>)i+wz0oyj9$JCGGJJz&J(gmzyLc!KmLZsQV_ZbH$1?E8d|S4D83dq49jjNprp%OX`zEG7pu4tH@v{)N&&rT;j;hA z-3*CV9sn-A9||J?ssEVfV>^fk39J!*H4}=qQpMPC_<-bcNv+P^V~7!N1Sp1lEpF^R zn9LV&5)-AeRi873E6+)o4+b+Cuc%B)ajQN@hyeo`CS1TM1^~JI`24@r7lFP)+{bv4 z;Rhcx$vvJM50dzpfa15R@PA#Ks1nPVR4DaKr~`#EVgFDSCqy?KV<5AN39b%lTUU#4 zTs`i9;c99X1yCdP=ahD$Jffx!ggh`;o8r0Z)Kmkut4|425igEFqjBp}Gg7oDZbd3% zLba%ktNpkdgDn?3D~0}h&6K=4f1p){*0Mh(FD76H07c3i>DCNywF4!k+^!aUlOAf{u0VWxmn-QKIso`j+6RO0XmqojN~70~E*Ex1nq9sikd=$!G6grHWGj*#3cL@= z0}8~aTntcuPgEErffqNs%@3UCB~dBv5ZS_$F`VDi}BSJ5ZQ_w{|Q-> zAJ7A=epFy9(inXt#|cSZ$f1$oGC2h|I_CQNWfs4aq z(}i+2*EhTB+zH*)CZdim3A~;_7#2)fABGE4X7~@`G9T>LQy>V=b8`9TSR9WiP|-|? z;xV&4FlVNlFaV${J0V7P0%hEb0*1Cp1gVN}>_xBA@KH#|;l>7%Nh$8O2#837*7Ync zZ7KeJEXM?fAtabkF&dL`qf8{Fsf`BA62~gm;1tb~l3Y}$1LJ_VBTb|U?*QvPi ztbqwViYGd8%`8|c1OnK*ly_wD^d^XC5GL>7K0ZEkM4+4r-Fh*1{i-R%6;K^ic*48aV4x`(ZFywIsm8z+y6se&t zk$|IboVGY9;Au>rawM1@5waK4oPfqD61(>y1u}V7zzIxV!0po(w>%w*fIxGkDP6nV zaRqd_BKRZ^jd>*AtDhRoKoA*xL~uJ|_)!d3nG)l#WW-!)fKfXp>jiApX;j_InXJK$ z5NT{CK+)rSPz9*yK}?i1UKfp(Zryw=Qi9km`?w$`13?UnT@lp#SL|n?pBO6x3|YO) z(St+E7(Ku|0RWB+j`d<>Vh;H_L+01&=jtH;*Sr1xPn6RAVn~{n+%v0r;$WGYJ zNEl@AVzs3a2`IB`JSG6wt)0cKs=U~7h_bQeT>|{rGFWH4L6p|)Rvw2TY4UuF7P5D}xJ+o2D<7W)xUmXjDaTaJ<;n`(<+oa{vl~rP`SB^2 zOKK%I9juwSf0Y=s1Y8LjwxzC}<~FG^IpVbqSXoY^x-2OdAI!ZPH@aAMGl2_nBNUm? z144H*3j&5*Y>?}4LzqdSm{8@q5LA)E2L)AV)wqgc%y+pw=5yJxM}Ai$_iEAopTgJ8 z**a#K_jnUQl#5)Ni{9pDkLh?WSH>QfFNl*}e)WR+G4$X$sw<)}SLQzvS28UUb{P}?{sfj|Oy(*o6P4dv@eK4x><)5K;@{WE<^H=G zQAH|l#2%CB0#-4ZrKn7}h+@^s#>*Sx)Q+AJ z?-c__-QD6SHRQy5t`bqv;(XB6cy;tO&C`ZX1kAM>D+kx?aUl3j9>n7a|@GdnBQdrl3O882mDi-oRzuH1i1>0@3qRU#Weg4a2C2Miy)*aLa(REbxv zTmDlHoo&F&P2KY8U0!azT)(hC@Y<#lS?m(5ad5UGFISICclEri*mCMe(Dmznhd$p) z>zvfJ*R}5*hrZrPx%S{SS0xgc1YLXGdXPq&;&8{~W~5VR2i)$(Hlm#z##ZBYFEMVooK zbk{x?|8MF4KW-@hF-Ca(PsWYuIMgz@(Q!C&QwiZP=rr&i3G zR@XS|Ocxz7estl8K8t6b*=I)mf(7*p`^;Q4Z|ST>i~B6Ao3^meB1ahi=M?-!v+!;H z|E;Qd3un|VnfY5a)i3U|sBw9oHhb{o1=DBEoIGd7jNa20E$F?le&MX%v!+d-*E@ge zpx$}8efyu)ulKTf3;X3wZpEJL6gPRnv>9{fEu8hgSG0J=;@{|n#q~2h2RhE3zPRBx zX8v!jQNMWRtpA~|X$|xGG}KLNoL#?Y!Edx8wh9CL4(dOx&+KJ&^QJqw5e$nO(LzpS zjXbrYa&!&btN(9QkG%DZr=lW#{%29~o1D{U_M%y{XkUx9GZrkK=c50qJGi{c5>|Rd zAN*6}c{8xIUDUX2>VmojvvTlXe`Bz@9QfE@rs7{&&zv6XDtMV7buCLMW;3_o{FA6ud#kn3w=(* zJp6VSrC|5edaA+R;1K_-vpR2L+AYg&V2QT>9c^JdMOH83}?Z(l{i zujjxvYc#fNBLd?WWqe0h<^bLy^dDD7%EtG}_9f&T8R}b7klQD_tFJL9Bg06HQGY&6@g+yn zx_0fGJ;*+>_t2rpf4gs7NpD-Jn^#iOuUoFK!#H12f$xBp)5?seS&=@c^y%G-`WC2} zbLPzP1;?SlR;;hc%C(2}Daq_*_+so>>(e7A_MKZ&-io@%r}ywJujw)DlHsS`2bf$P!wcQ|M&gW zUEOcLNj&Ge{$F32{JOfTpSRvxo_gx3s<*3R)7Qqz%FkcceDMB@V?!&NWBU|e|8o;c z$`4ssy=;BygwVzBn^1D_{;{3PV`CKupSU!(Q`Mr_?$;JwVe5pF3J8vEs+e=+=F?Xn z*;*9)$%!TV1b70}q!klN!O}^wo)sv)16S0RmV_>I)kKum!UYQ!%tGZC70V41OZF`K z;MR#HGnSlEIx+O^dzdCH?*8bPz7P4c7c6KglJwNXlD&#P_+#{g^Cv}8Ts|q1o2w_4 z>`^4+Ym-X$b~kMQFXsQK?V{{GJ_#*r&x*b?7B64DFpCtiO8&R*lp;xgLaN0m`VGrW zQu(CVPPZ2&xN>p{oAfWwWb?kclubSVe&K9{UObbX;PKM(*v@OuTQ`5ff&&*cE{N@1 zJ|PzS{h3vWy1KM{{elIt{;Isa(F&yB65FMBfSH&TOI;b8 zSzdeE#Srn!Ggy!zPOJ(k9!8fdi9H?T1;2%^ zh`hwg4_>zL@Y%DPk);;9ueFnsb5Cn2YBbmG#4h~I=_UBay%Ts}&z#P0`}dUkwOILJ zU+k+Txy6SS70QSBZY*}+=}hxOe3$R}-8Uwb$4;$?m6sn1aZhdO#YfLfM5Bz|yM?#$ z;KUU-^vz!od*k#Ku`fFE5#l5m?q_N(# zdrA4B%T73PUQx39cc+NEvlQ{>E>&Mye?)AgV%h50E>%SZ@jAXdd(pa+7aX`0O{+-4 z9n&e{dl?q|W4p2p-1`@Ity&qIQ_&oICa8$rdv-;UynFY6BAHqq%kcjNvz8s&jPHGU z<66jgcj}7R$>p(wD_B?;Z)6evXt%1^{b#RTx~zHr(%21|6|t?m_AZEhDpMYNch{=e zLwFQ4MLkHfLT@Ke>A^Xia45M&hWt-0pRJCu`5=2!HR+^kUSgPyW zE{IL-U0Jzo<^0l}LS6ay`=DHRDL-xIgbA_l4zNm|+Pfk)2BlEGX;$oCXH~^6LW1|t zDnF(D=o^>Dc0V`vT2K|+y%(2!X^_c(wntU$2WR)j=2zGd_@hCV{}X$xZ7Uino-IQb zFrv1ca3J(JzI^c(w$Do@RSh8U*Uc+pdouqwO{$u;KK9+x-q<;3t!Q5s+iPv?k7u!G zT)SmO3*xVxRE5ARoB7=vC$TtR+RRMcIH{^`nt9edk<${?9%{hE_WnFB%Vo6ck{O*1lugYU(RSQmBit!f8s5~}WK5NmO83#i@ z=B_$zbna+ur;5s1b7EU64w^N4Q4M%xQIoiO|B~`K2h3UIstW&?R^Y!_7565O}no zh4#ok73a5_yoyN+zcwp2SXFdO-#egKB|ULKNo=>0WtBx4e(!*iw*3!26neTAe~b5D zTp7!up_g;$DVbC;Y1s)ER3BGa8QZ^t+1$Tk;SmSTZ29=5%lZ_5!s(@xL#^t^GfQIA zN?>wSz(#TnwrWyMtnAvBlh(ziUfZ-F_Bi_ZZfG^VMcH_4H|pmp6C)b9Y(MOtb65EY-j_cVXLjC(HKtCB(!oKD#RR7DScCetZ@a z+*!f~^W(E9@X4L4VlSRmHMXE>!TLG#7Ojs>tw8Tu5Zko^gY3y+3<)cyN z<;|U|nwKt(oy2-CnS_D*V^u2;E$SSfDKD8YDfVbLGxq%%6`}X#`S(xEsA!v6IlKR0 zld@t`%lrkE3s<(zD=NNsAqc(61YJ3US$MlU2cch@QQWRBnpLvb9M@#n5KAYm@oXfWqr=-LoAZ^I;N}x!#xAt$y_SYGmypnXE@cJ3kFAq`^xP< znEb(-_Uc5uvpUh#+R$c(e}YDTA`S0KFqXu--oa#FHfXGFPPEmvBs$hw%0%6&miC}4 zm4wi`mg<4wzMwHV*f2WW9V~BMRbE?uWW})+i_7Wns61-XvE_3)?@MM=hn1gP-O;ij zMIT8|s>hrnU76%?cYk>XbJy&^$Z+|hMMocd^wA$LpFh-{9$ktFOfEG(e`qnnx&G0i zt{s2gx2Sx6Tef^YW~58|hDVP*wtRl?@W^~O3CH^(%si8QsriGc;l5n|(n@^PiyY^0 z(fOE!k@$9RPcoMbheuEz^LsPNq162J2#PF~L89zH-!Ssu-Ji?^oQ_#}vCwLuzv(4X;qp z)i}`CpUTvXW;b_?cV?2ky#w7rvL~6&4Q#?hG0`(L7}U0}>PYob`e+(uJ~G^$su}Hd zl{-4@vRBRu9>}CInTPlQZ6TW+&GmEk9@JRfwWl%zBR#=#OsW&Cy+r+Rkn4vxttY|B zd4MT)O#^dkb6qzJ92~^d9MfOUeyv^9)i)$owbs>lz_C)@Szi}#X>03jtgmZdQ&$r- zu1Tz}?nty$*EZE9)>N;o$DX=odic>vR{SOAqxB)TIWKo15F?&B<)8 zb6_YH&n1V_LG5TZH!_sUG}Q&o>1+ zdqXxQ2S-!EAgV9OT8Z~2yHn=&@ONL|uquu#uj{Oj2g9jcqI+;8o9YSZ@@NiFJIS77 zg4A$#W^+1+CXqxd$Y#_18McdovBbvFucn3!? zh$={+A*46tvOyZz9~;SR2(sO9BUx|2?FXr3I-VNtVGBe`I9^aV*=~Q;mioFT(=wf_ z;tK}uwe@Jw$!|@Qcm4-Em_BfRiiapKF1y@H9PvxLtpn_H>GmXh%RDCAs>KN~c z$D8T~vTzq}=GWO2QFT;iPDK^&g3VbM=xFauxT1;IcXl?lF1O;#rU!=6v^U_c2GCj1 z-vju&GReNg#^QLoM}k$uJt^oW=+>V2(8x%xKh;xPyE2GFFC+)sN5+sny0Ci^uI_7F z>Jq{5=#Ulb@JJ%t551Pi4vwH`(Yyn+)~?ODR5s`x7*9|t+X)NWwWGLo@L>6>H0qU| zfy!!S3NGHRbaEgwHjqsvs6Gbh;u;)8+d}hTO9^tx?1qHhOr|%1qDMT0v$H^g0UrYGuxS7# zHJVIkd-4q_n;J^m#kMyPb*!yl-4bL+dUJ3s1&QUUTzmiKgq0LJbo*GQvuiMpKFQ1` zdwLSS=_NPyCD`bo3(~$yt6SRZRwY`RS`+bhZG-=c?qJ~W` zQNNbDoVqZ9@)?4kF6i&cV2FWFFw?{8Mm=*#g^#i$H{RmLphUJfi1s!%&=bV713k?) zIt6`D6GfLvpoB-!;TA7S<}tEjd6f_CDWbCWUNTXl5qTaozhj?Uzeil zM^~Ym?9uo`0|6>Bu>#{-O*ZSwp2dwK%VkEp(Lz(*&?Z59yr!n39x9`)v%0yqwbSQ* zXe6__ePjgg+HF3uOrkes2ezcF_l}`bea~$|7mJTIr+Tt(TuWtKJ8!G)tnb7f`mv#@ z<0MmG33UHzv{jeGY$}=Q?oSLQ$MJ{!^|)cLXJi!j=37KZeY`ypZ)%7KP+Y7JsrUqR z#c?)sn8Wr6sjnDEhAMp~8qafPNA{(KWH;==Wt!Ii=T| z$YeM5KzsM0&5RBO%pkAIK(@H)t*LJhtb5yV!rP1IlIYOx2Gb+xZ_@5Td^DY=5!BOx zo(ly*EzbsJCP|_j4KA-w(ilpHPzI>BoMk^Xym2%&N)K>PVEUnlh6b_={gBGBMVP^n zhQ`FS>OUeAq!?Snv|iQTz^j@GdeuXamkHY z+0;fFEbZ}jdCJ)xpmkU+NqYLt*yw6b4P-|%sdku~&T42}RGZ*vu%@G>tqy}hf^Dtxqt;%!$k*{jVrtUF=#3qN;$%&sfpPO5p61_b1jpiuyfF91Kn!#xe=&Mt22mY z)j=6Gh8t`mZ6+M;q-q*sP$k*1LjSUH1FIjYAeqZ$u<(Q{+Eud{*V*IH(eRzjC9nPQD~D$fKTIn2pMY@2(uQQNpb7Op0v)ou#KMiQbvZY_@SDW3_x5x-V9A z5~DUcVKyF8OdGennSTgbSI!HQ%$;Vm=kidj?| z%22Hp+7)$ejgmvZyOk_8XpsgB(B4Lnc|Q?xV`V&-aT*U5XJ*yVC=7mf+C(Oerb=Tq z(X$yt7?zg0`%_RUE^9Vq^`IiyC~ZKyk`OW4ki5MfPdDX+2u{@R7&Z*PvK3>_<>{BfY)ov-stokNHW!Ie=Ot^VK(9_?Y zrtKG~+%o9P&@9v!%E0=pjVgk3YAYiqHnHS_|0j{8lg6GPBJtXJ1hTl%08yN58YWjDyq zXm4C+2CeLvS}1&Hx>?UygQde%qN9PMvzbmXH)!b<^qyCy)tGO!wqjn>w7R|{-qg9y zT6fSjWk0v9$~nne{yPy$qT-37Ma-|)X4dH9p<7<)iura$gn&k zV;G~|h+;aC^B0@xbZOk}NDYnTQfqKAD45)q#1O)n&0$-<-{#4~ql1H$PBo*ZpaFP8 zR*CaMw#}RQbAZBSByp-yGeGB!bj=;McpVRm_WL3KMQPdvrgm- z4VSwgG-6XmzG1oHyC(c_F$mbrd(Z( zYph%MjEoJ#K&GY2617oZ#i4w=8b>4796}uTZv0Hp-^9I zPTg>1XVp{5)7rBEF11OnLf%%-=+MwMmIYl2MMIX&=xyMw?#|KYBo|KSnnb+5c2x%z z(;CeG+uG|}(crULn91-);mS5mL4G=57MQ9#i8j-s_5oT5wP-N8R84*ogDw-aHK0m3 zbR{s;s2Lm>-XImpwq^b_SU8rI`ug^cww8{D<-kjebrc`;HHdhgh{vl$n(S#{ zM+fI3HbnVaMVCp`HZ1qS>e`k>ZD&VwFqA@5Fnu=a3|2Q-_(qSRteS&mGFLO&Tg~y^ z8nM-ghAT|0t-EiABZ)R&k2$Q74Gutl9ADE^2QT74mKx2g5N}^g3H#bN_eVW9GBt2T z!FvospTJi=Y}X9w)8^{s0mcxU1>o9lbi$;ncN88kx5vuWpX+NiRDG>5HmnhZZ5ldj zQ19}U$$X}DolKy!!}bfP)aWgPm&-R|)iwp1f}>SzZY1Tfv!iJ_T-eUFU#SZ2+6*@U z`kgm%F>YzD?#Gh4I1E>IwxMhvoYe5i1$1=4HmZYV(u`^uOqff)ZXjRLaG;}g)OEOy z<>&Rja8WebTvvC#`4xFAoHDVJ?H{v=Iw}G7iJy7E8;TjWIb2u813H$mRz&C&W=^JovS+P zHAUMrVtK}Jg!zr@rBH};?*z`J2a_imEbm;|k>Y$(6$2}L5VipNV_Vu3nGFZ>1+k{E z`IQv~MF?rGSezpyHI#;N0VgY*1DI}DyBabDkiY_gTNH5}o6_NfEQlW&?85Xd7oipenj)TjwstZqE;%S*UNDq0)&SpghN-7I+k6AM48a>y{d5+xxM z2D5@p4*u-S#zr}4-BJ$*DCg!4&(+?iLcc+Ij;dk>~y6{b{ zJA;Hn4KidlOx`+7;xmjDuy^{L+lkld%8tQbVeU6prukQfQ)4zl2c7ZSO8&Qy|1IKw zi}~M?{O>6Kw}k&49l+O&=_O{lY3Nso4-z$S{zCs}N70|$_>Vztll%hSwbO*PlJNk3 zvA(`k1_|Mmfy%IHJ{qH}>P?sjTLYk)=TZ}tb58~y{wyZA@>-!82UMr%bsK|CBUo-g zILg@`H3V9C|h6mhPSPvB+xc-4MsS%qAG?x6;$JJfLpb7^LdzeHn=3l zIHy0x^jo5(xurf)zZz3#t{}Nv!pQ1w$@--n6TB-^ec^_NFd3+>wa~e&7_b3j$teVVn4d?k;o}qOj8fqSqoMtu@Y^*sklwO zdp3=9okoAKZ#;I}oJ+XdX0@o^VHD)tR)e6Uc*awWSx@yMDyRB7`an4F+33 zLB~{)uUj|ggh=QcQxqKBtsL6h*1+O&tHUf`liCXb<|haS@SG7oHr!KHkj)pq+e}S74A9ny}>feJKy}yeAi}i(_x=k z1C3b}ohvw~P`8dySWKoni^#}liD;bnx7NJpy2s$XMu2Rf0{rmiK!D2M8Y?n=a=TjOpK z#8hh6223M*F%ZJHPp8?Y$Q&SFr8daYIv&aNxseJMyYt=Wy^5jfm1xS<7zP>^rV&Usf3K==4_) z_GMslab0`iTHh|6Ps3G+EL695q+lhngiyN7B@AvD%dlCnB+G7vQP>t9eE;T(lbeg% zRna6j!OyJ=2V6RZj|47wEasy%aRXC3?W9dOass_&4F%e47%OCS#F-lQI-z|{OF%zU z!X_01W2X9GKO&)}E4WH*nJ{f0VV^Jbd`zFv{&0W^riHH&Eb_-!wR49;0)B7$yn|#P z_GP)nIL-LzS9OZU>5qs;h6p;O>fMwptXr*wXe4t~>K{X`;MQTOmly54f(FlV<$(=3 z!0pj`aZ7qukZ=HDOB^k7Q*dx`+uhodS>ETLMr*;~NYgWwDeNn9dkJW~VjgXZL_5Q} zZP9|tAm3B8q!+Zr+qGS6J9}5?Dsx{6x2KlmIOo1ywXm~gWUpy!jJKe?tv%2+Z@w3H zV%K|I&6@w3E_-vBs-hd3uq&q)J19C@6W9f2-LWOvT@CjG)CZSsOu@7DLDOJ>>4tvA z>~k>D)$hDu@`3q=v#O(`9+j(w4fwm_+!4Y_J#AB4MjgWPX|B7!2hMZnwl#wh3e4we z4OY0Ze3HNh5Hq_HU0tkBE4{i@FZ7GK9_dBotln(zZ3`-n%^qldacUUs8ZnQS?be|B zmXQvVHf`?I@Yv#XlrmG-oal(JuCsk=?rNAy*(@8a0D}QG9AF_9nuIHeiTKz6?yMRm zH9V}9*fCqB;C`iXOjOO0gMc-bwyx7?gKD3KLOHXaZLNuWUEH!3_AdtQ9ZfCRBbPU& z+59l4&5Vo>U|WORlEtEc#j}m!hM7vjAM|s2(%09bM(^XG2&}oNUrHf(}x-v-+2h%1V12LjH+xUZTG$J!gBHxoq=d z-o9|v#MK)ZL~IbI4GPw2FAOYdA=BbcP13i+t#g=KbZ=n8=H!@rqi|bX+mg4ax}DSM z9(eTfx&vEAGT}~5pXs808ahG3HpsyG>F~SO!kc_;#O&cF7L}<@9F3|5~mnV$BK5DzzwK=Ssq+wa&Hq!)>aQq^ifz?>2`*i*#dBVTP;CNGw}681kETSEvzhTdSPC zix~HtfJ57vFMf&LrVH8wh(=^ZnZ)*Ip0ExYdonBpu8W%z-FE7OvD;kQZl++Pp|j+% zlEEI#%U~AeSU=1sOU!ygf;+xi;@Zk!JCAw4*g55lq|UW%?P$T~z(P*x>7**&=xegA z0sDVzJJ3z?mY``V>J9Ycm7UgXa8KNphcy|iQaEmS)AS&BAIh1|6r)`Ui02Vi>!<2e1%M@0D9ixBaBlLaVaS#$3xwKQ~e2*Lz%j*Wm#H_2XDM(#Lmn}d#Hie$EZjw=k%Im30A3JkmMl5!6QFe zhvA1^t*O2mcZgzaXvnK5=t9g@Y!e|`Sq@8RZeg|4)>TdI+U6lN0xaX85!?8uoiyw| z@Lpm8J&T7}q|oK_GiS`Odb)=4?F&2AF01z0u(>x4STbh>R6g?S0LHTOv2w&0}EJjAA2fmNz)ncB9=w!tT$k+zXrZ#J|S zjvlb>VB z`JfKl=ex0;4Q4zW*chIRGSIuoHj4P0M|ETS`bs?h2AYhPaM9>my$Z)_T05I+ZNqxP z_QWc$aOCn-0}IczR?z24-fh72!-uy?>Z>u-LG$Az((3Bw!Xgv9+crB0ZR*J-1UFn` z0y2`u5@+6;!8)34DRpBohX`)5E1JBalezxf>9(WRZ0=wcvT^38d>DTUTl{VM#j?x$ zH=8=)or6oUw-;s|iWe&pa7Z{UZdUjXZyfMN6wP;a8qGF=I%SA?H2t+fy*+${Y8eyjI5*()ZY--2@30lL zxs80G(UaE`_|3T3;*sXD59gxIuXPk=8dx5-p1ct@jGJk8y46t4G!@D@ofIx8XKJ?l zEf4wKfUF>vIG4rY9%!mtO}AOSEm^y@p@epjsX1dvz>$=;PADjt(6HDBZ9zAVdg`Q$ zx^V=Dlbn44YsBd&@7`kB(h`E9@Ad`uV11e^cC zF*?B$)++ta`P?eoXl{+lpQ3|J>erg`oBz#zLrE7F#Jh9ZMd(z1zo?aTc<)u4+v8j` ziNpQy^usnqpYSD*E7+o-tr{X=vl^XRbIW+nUFNn>!3P&QA7DlSJ^xl>jmbe%f#%)L zU=KlZuomW%#jyu@n9(`6G$;Pp=gL(h^KQD9t*KIemQmYSU%S$s8q#J=7_!d& zNS%?u0WNM6vI8^p6Dc-S_R`gq(=k^MGj+ZkepW6ubloYbAeG~S&dp~H44-~ui_ zFyBV+z~Eql`z|@lDlAPE24~-Ox7m{%uW#lQ%#I-T4UTld`$vN+=;|z5PfBwo%udh3 zeGXeAv{2R6l&v1#42N`0eLL5Y-E!)}B}Mn?EmT|1!d7~26o=y(tDQK%l}niOo_7~; zoCO=Lt$3|#D-hv>#R+$whH{-7iWUJ38Ps>cMP8g@K$T#c%rmSUDqwutrU)wt8x1&3 zkzbz3&r=bBgCAki`~{{sxW^_fo>TX6Zvu1%BaXq zh!)sh-GMGyQ}0z#;UhPGI*WszuIQ>UH<=gi2hG$rj+1@yx{i7t&DWGUMFy02Rj*2pntOWFWNh-whJm*2fyIf!1^n zo8j4!Ya7kkj#)ng=4xJEiCg}-#>K{pmbuZ*Fca;4?U*m5a&9h$ZIp}9=Zp8!+1|>? zXSg{|o;tbPg_=goP_{(`rD6BY|FQ|3FY^{k-jo>`#l#6t$ox7&&t|tYW^34Tq1dC{ zFl%+2ysRH05sQ_A16zVzp32$85*|;sVeaM3Zj{5L$iUu4ccQOYk?=-fNNBkaRyvPS zV|G$FE0WBnq0EsC+oiD+&!(UVDwkR+&JQ$lYudO(??I-)%EELH6o^xKED=m#sD-31 zxgER-nOI)kgaH8&7>iB!(w;Cs8qB0rrdI1FI2`Pbfh0H4;XH~%jAI!4B2K8htHxZB zxukc+<;Mt{-aAPgXL&xz&B37jdb}B7w-WbUN|yk1BtN4L3#s-(&G}okYQ(sm#u;X7dTrP>JOoFoCaPG} z!1ic#cvL4R!qofP7~~I2+Ftq4m?tl}JIB;i>@}kXrH3MkGaRgfXFI>QBNN1V_=Y=<>AJ@fLk3GVW5G!yaaT#%B(gO$Ft`~{oM?h> z(4k}$2kh-6dVlu-_QIfRcVka14-24s*(uJZdMGq{nCT!ZOpyy3KQz^WYo!+r7v;b{ zzzvhG*4&XCYq^*qn;Q>@S=lx*py1qV9QuPd>$`t#?pLCtM1$cMps~Qsl z=Z))(H^2h`S2Q+!`mIS$)nLQ1e^7u~u4t2(;Ja^PVBkt(a?Kw8S$lpdYbWbHgwX zoY^S^SUgZ5Ho@U^$(!L&GHil0B*U|)jTr9iL*6RwUNnQm2znQHfty{8HB_7*<;r5m zxXuQI78nceBs+Pgy@`b%INaGnjg?BA|!T58W`|JBtjB90lghY0Hz>fqbMnl?ZeyMk*kUCq-!!07e8pIU<1R zRqdZH;0_s@Gp@@#VEN%bdPp!oJ6hdjb9AioxTgbng;_|@M*p>&mM|l*#Go0lEaEo3 zXiG^A>^nS-1S6G|6pIecN+IW3Y|EHIZ53g*6BU;=GBe^>f#@U7;R=mx$H`3<@I>TT zrX4!KoZ$rlHuO7nVIr*T%n##yyl#t!a+JuT+^zgI!?a$Rw;tGt%>~G#Y}orb0AH}G zA-trQ3mq`?vmsR9cK2xc?{iH6>qecc;1;u4svY9S6?ixfrlRw8gk9O(^8s5OBSDT+ zINHpC+lOZbXJ&%kY{mcYN7nnN-!EWOWNF~}-?se)jv_kTUFjh!C_2BdI={r9e-@Eh zsG(Nd)@}<86jaoMY+6hg6!!ZS4c=V;?_Al`Zf;RZYpH3f!yz?yc^l_Am(?YB@DfY! z))Ksb&AJgE9!}*&`9%uOKduGKRwJxtD?R>4pFg@Qw*uzHJFi>kS}Z5Q#g;{T@rNdL z5*vCJJz)roql1yd&zxZKF*9~X#Kzf-E&4kRX~u471j5MEf-=rv#~+<4#ZQjFFf8kd zZUJ*#&~m_0K1@avX*{t?lJ0~32c~m$Ho#xdfY7on0Khy zyUoWtu`|oTldy$7>IApj#LB|?742zXW{*I9ID0kJC_3u#U>-iF%kPkvU2h#RuLGP% z%z2C9(ZS)mM(7qkx{ECo#mk3Q`G#Pdl~%N2W?OI=`qc_2$UEy>+nVC_SpLFn82fp= zX_B9nC)TvB30Z$3TL%+Qj(99x=qGMKV0-aKg?7)`dE7Lz2MrwHXf>w}$Ss@{)>pHz zMSDhZ3_PTqT+8mVhkGP@=yc-VCa(F>e6JhD;2$Wv;D0b};c*b+%To#&*p1 zdXyx#dGZj9>R#VSo%=<<-z6#N)W=jDhFRKXuLwY2KpWa~!gbC7sXDa~m?8Mz#Ue z>G=+fJoOD2fCD^Jr>Ca61KQC>9A&%E0CC)#3N zC_ML^1m9G#*09Ej&O2<1!ZF!vZ?64;LcXt=xt<>^kQ8f=(SODBk+$_Th1( zT`!I~VvzyE6DH5$Cqc25!N?77rF1@cc)-kS(lO3mp4E8tfepxV*1P@hHfNE9{3b9g zg$`pfkLL(D6A+7z?fC5u(+_kIp?&C%Z0EU~sM;1E99GP2ZfV@oG>pSIc)|j@E!Rt& z&yJgTIP1`vBCgjanv0&1X})SLJO>TOowB;cHWArx&CDOk&OfT+sEQ^0d6}aZF05QQ zAC|F?I>k*zv#0pq3UR-bv!9K>O37-5^jeJ5({pDbxH2*bqW^71|H9u z@!wBi+qm|pxc!`T;Wo8m*93NkRX5}5orzJ{6gD!qI}-$kK$AQ0n19Yfe%aGah}|Fv zMcwLlMPO|+vO%KRZE~M9NvbAt*$>7!pUrSCUx+R4CoUPUEujOdeGz_;MU1Bs|IT8dmC8~knsM+1Gce&UZ z5;c_S_J$U0?B|Xc9wDddh8{v;(S=NfYi$=#OM;__?yjQQsbsh_OsnE}bS!tqxTS3R z=Qd&;+aCigTCcX|=jRh{ff&oRaMRdG7A&u=J+6E%pOV}O4VW#*&ZBZX6S=%z&qOZQ zI6jie9`^s>G0OJaZvVooBq%*&>Mpw${nj3T_pEyAwDTsMAG@IRijtx@{#IM{)O}q{ zV(KpbH`4HNP;PNk&c}CJo_%a;{&(6KcMkq)rp`To$_0}zoOIE|izi$XyASLi^}mD z#MPi}McQF72cP>Ff8TREZMF1*spUno`1_wVQ>Xdsoc!z)kE2lqMY3+UG?98M?U>5C z50_80tQijH>1l*(k?%IFA)3E3Y@=WzRnT*rV3VireyyNXI$|-Aiff)P0L&U2JJ8qxDpJ zBI+QVr?qxX(*@nur)zgEYNM4FuXeI}>Mr5?V_8IHH8{QEWTAA+k;cDR9%%2rzSnQB zzF$O|ZTe|xuhnPUFdqqlQl4_bKaMKJ%l$X&-11f zYlqTxWzYWSQ%~YMs)X>po`&yKPu;ViV-XI=4_f@b=S>Qw2$x;7y`m`;<$Wu{HB)C4 z=csP#S{6k);{1#CTvyx{&O%ct8awzqk~LE+&)?~SDHl$@Xwt@xI#@v^CN zP#WPf>xaBhnWe*J7S2EKH5_K!4u`E@@P}lR{F%m}WG>!LtmSsS@%b%_gGptRTXrg) zK4H(2y-N0p?OXD(lKo0%PB^F}sK{;}$|bwNT*k5Azq6Ip3Y+g%z%mXh@aqQ^{IDWF zB{yHCcT*O}n_DpC4lRz29C-;v=9jxTYsuK+P9b)C2U7~M%+_`vB3GPb2VT}fqJrZl z?~4uHyv0VJTon1T`SkNAt0IwheZPzG-^BSxA4HRc-Lla*K2^Ec+f=AA_i)+5H&|TT zeNbNEE1V4$whQEUJ4I!L69vWJW-Y?n4L_K*IDucv8OAgwyrZi48im$m#%^(BafODe zig&o9s>rutUtD_7#CAmc6wZAYNl;W9`QA}<-l*^m|M9l9?G8+gkBmw#Qk#&Fcc7wc>9IBi zL8e`{>$NGQVQu{{l2{3_|8a@b&)^DD>`MPb8eZw&?(z?b`(LKBre=p-{_TN;g5W~i z+}=*fNIK{%PSzuh-n-}vtrhLBXm3=pn0zdJN%V#lzDI?qBURW_U`MN*R>aPP!UMAl z>3wU1L@dc||0;#2nH9&YKg)w%9Ovamw{RDy+KxxJkhP*cDTR-V&OKryr*7UkI$Wf8 zcT{9-;VPhYP=R9K-exeRp?R^eVxddA!*f)Y`<_(SD4+NR??{DvpX9pkCRcjy6Rwzt z62lFOqgt|1T#9W!!Tq8pT`Y1FRPecx9vDfs)J($Th#UKb{5{^hTG1U|tp4(DHU zZzwVOpTZ}cTkwz9qa7cX*NpHf`13EO9==|5 zzt4r_v3+@Yk45C23we#(k@rwU-d4yfM>^(@^GPr7)rh>OA&=?&%jfUiNV-4lAl+Y( zE?jTHO$9wP3qt*M_kv&~&9~DsL@>_3{B@6uq??LFEMNcf>6YM4__|X<*PVmJlsyH1 z@rb;+i10Ef)4$I}(#=CU%J46r?%GJY3M68C@-Lt68oUYTZyNIF+Y8$@Wix*dMC3K> z;JV+A$SV)sFZ-vL_w$In6+4jkVnp8DkUWkpUfy3L@>+Kw@9l`Z%8)$z=DfVU(T>9H zpkoK}rXyXr{Ei99V?Xxtj*iG%y#slRBl1oR$)l^q%WI9uTaO6pAOFH_+G`+^E{$|O zJ`w2Cr6SjD#C6LN&whCn{`_^%i^zKs5%eYdmzQ^TL|%XBK8{9WFYg->d1VuWfc|Iy z^73wq$V)?>Z>Ps1v6uHqMBa^%M_;vnd3g^;0x zeh2BgBk68Lx~C~fFE1~Fbm4Y?D)Q&cuNG+$ZF=Lvh`eDa6V{u5d3onXn*sYaNX9> zb!#H>D)A-iNB{EIT^5nIZ%AG{68rn;i^%%~`jPoxq@6Qo=<&ZZ8iI~6j`1A5U2E7w* zSNlR<_4Ugkm``!D5je&*%XMdYO+kLB!NKCdT62j@=nE{m-p3(yvs3p;`)+*`TTt;BJUx{yAp{guM2-(-s2H@ zH}1Oq`NG2ydF|gQw3nWcyq6;K{t9^yA>P0I{r)^6ZyfSYL?Y&|7k@r~e~QSv7n8fw z5bs}J-Y(GZ;dU@{w;&kwi9nxj3ett!!Tq?dZ>IxD=dXK6MBb&4=Vef=f4@4C?sBAK zyYereE)z-j6{Oqh6M?)gU&BZj&fjyPav4Ir&);Vw^3K3TFE$D8KY!gTBJ!qvv(WBG zLh|m2$eXZx5O6Kdzx>;8M&y-4-g8LAdfSLUpT8F)@+$WTO#emYJr|Mpb|`=J9(j3x zj>x+j^0wy}m;xmcZU^@w9s8w!`TLk1N%u#j+ur!LRO$Tp$}rhRR`M_3_3Duh|MLE( z-I316F|mK2lswwNd@G+q9$h!;ad>dgx|DNNrm(9r|dmtjO{P@yf8q!hTCqwd{kH|a!ZL|YlXd!veM&wm4 zg*;R+<((Ij_j*L$_x=h!g+Ah6K7U&y@=mNP4W=l67lh=!EqRp^aL}ZZ;7jYgG%ay^Xu`)>rTTTzZ#ae z_3DyfIcyI9^74GxGyM64;Lrc^pOdkol3}%vaOgEDI2fV2{3oFfgwJBo6vgRL$)Q&)D2v3GnY?^uAU^zxA$765;!rFo-s=+} z9Dc=6^2Og^O%z_SV0t8;9?Zfkh8`45aNc@~g{2`I}Ln85q zM&b{R#Ltby&yB>-i^R{1#2*ofKOz!e5s9ye#8*b*DHP^;S~!`h{V&gQFz6I z>PUQbArkLmK}{sSCK6v8iLZ^s*GJ;(Bk{{4@yjFeO_BJfNc_r3{K`mtOC-J}65kq$ zZ;iyaN8;Nf@g0$P&Y%mg7-qo5_19U5#Jd<~w8inOO`jI7!WnPj6~hd&I6Vxd&?|-+ zXmLDeq=i=uGs@z4&M*tF7-opY@t?5#ROOR!23dH;f>R^uPc1~^T?{k2VtHLAZk2^U~v`S4`(`sS1iaz;5u3xY^F0pW5K1sBFU6POCn^@7zm*LBb)?_J{BM!R*d*XE1YYm`(F@6>P z7|)(Q9r|KeVcMnB(cdptxY5F&2yRxm+`>}=On>q(%6k%jly?sPro&$QZ_vLO|7-j) z{#^Xgx_TeW_DJ~Sk?=?)d_KbbXa@eK!#@0KB>qmtA7k;; z0|GnaAX-tQG_)mq~ExdQIdnw-N#rvBT2``LIK3!-UT{TG_=w=^Md6Cz{-SVY z@S~#eqF}4Sw7jRo-ukn`Jr+JH@as8CEPQlu05Zn%zQ)4G21h8&HK^&ZmzFEM%;J{@ zYY_G?-tUm&Z^!%Tu#YZM*xi41@b#i_P4FFspSJY1!Se|F7v;Sg3BMBwPnqabyLsdR zk?>-Kc|Vjj9V;=7k@!=K;+F^Gk@(Lko|l~-GzH&`#6PBZ&Mc+}D}z@e@&Am3_n74J zSP}Nc^`W;h#mqf6@0Zw(rB9 znv6Gk@%sBk!iy1Rc~;_YI<#i9!cKpl5)4JspC1W-F%rH#68<*Al>eg1KQ(wc5??w6 z5qepjM#A2|N8k8#*hkfo_zr|Aza4+mv67sK#BYd%PgnYfEPZcqk;120xIg%^!n8!D z2Lr*K3cL2cA^3&DmRESD-%xm~r5_4P==ji!X?BT(_lblLN0|A)7=P1YzbsXlKHKTA zSJp++rz7FBBjL|P!Z$_2_aV&d_1pEb!84KgUn$;=AEUva6n5=-QxGe2-*^3EEZ7HO zzSy634^9s%73MW|4`8ow>#81LGRHkdrm$7rpPHECo{wzj7VHa!t?qULqVQQExZTaa zJKoRx@3-*U9^c|$An_mRirYDokuNIP<&U&&?pZ~GV# zOBVTQ=t2hlVFev$a1r4{3cM(PPykQ!*!ElD>e=?UtgXy@xha_MwtIHOMT8H86{B~O4cIs=}>aawSGNZhr&kLne^mu=}E}j<6Cyv_> z%S4ZN_>6Dw!RL{q989`{100OPQ#tYnIzmZ9&-vh|+dsm=nC%|kV8nKhZCC`45=9Sd zFoF#f6=WN<^9i^403}_Nir*^wId^{5Ds4NTM$UjR>GpoK#)(kk(20;}`bbp%j7i~$ zNc0=UF~yth^M^L5+4C%ic;HSxp3g_qQz`tzXc)KM(aG)rZNLpF`6?L0WA#Vz+h6$2 z8vK5o8z;7VCWYVswpI~Ad-#qZ}EEA2^=xW=4u;a&o^Xo;=opV{!85aip;{*BL4?uajxII3Y zigEc9Eum)t=Reaa7p7y8{LklGn9|>tJJ}MxM&Ue*m#9a7@EDHXvU&4bcwD$Wl#wZm z&%1=L5k2LitKs|pVJ~KOtg_#8$Uo$Xshq+OYbW2a{No_K()CZ|;J3DOZpMU#AC1Hh zijL6mgKZAaZ13324v)X=;0TTR&C0HKdrHeNIhqUmk~~hV14}>W_V|?EKXlzY+f zT46XFEWh{TL%e2sKA`Z!;$z|?ZY7l8XFZbi6EYulqRGegE&fHf_lW7D`Kx4l#IGii zzKcY8ol7D;=V>gj8%g8`Rc4=mSD!ymq8xs%Feh7OKSg^ZalckRkYCPtd`>?=*)Lo> zp7}GCBg$(YKS%l+68Ev5#Puydh#zG5k-$8_{M_<~^q1;;Unh}?IV95Cb&$T1VU%Ad ziS(zDF9*T6(w#%TqWeVrl?-nUf-jK&SN9Ehs3J>;TQxa$|F61wocX%=8${wY^LOt2 zLfIcw&u_T0;lnFdsGN|mc82eA z{k-fQ^~1lqy=Y~>Qa}84;eO9&dX&qRB+BJ#eZQQ9ym=(jFHv}z*g>M*pF*M#hDls^ zlX#Xmf&81=Z29l%=dI(xL!HaLyp}a%8jp?f7kte;P#x({80VmBc+Ga z`4FTl1FJyFJ(2u}YyS*0|1)v@sUYv`AQJ7H>C675`#?L(F$`WqqVe8JmXri{kSK?5 zktoNfNaWM{mCyI}DkogW%IBYIuLxT^!~JCRJ!@~M|8p4zuOMT(&TBz%Kf@@O2T8Oe zG@YOfav;(^=b9MrYZ{62+*9ExjGtKI`WZNbVdTr&$vv+9&%_=bD+k2yr}S2SNLR@) z^taXD)5;fU<$&+={`23*=f^NTc#3!=xoe5*UsK&)VanUW&vEGNMiQS>4%0oW@JnFn zmC`%-yjSrvNtCbU3v6H*&f8WJ}cWaUZvf_lu8-&xwB`_bv%OB2k|_SI2xELZV*h^7@e9 z1ze1l8!r)%w$H;5kdC}4@yLQg_#foS7Gh8n=izkUJAI5i!X>n9M zSG+{LLd2!)doT%%cZlB+9}|Bh{!&C2vGi|?$D`_?XCb4t{T|_$Torap#FHeuj9cxJXpjCLScVh-<|W@pSPb@pIzW z#M{Jgi;s#w5?>YH6esNJu0KtjAU#jC}e#Jj{N#TUd^#5ctE#IoI#FYyTR7_m-l z7f%uU#ZmEG@zWyDeXt$eC4Nu*iTJAcmiUpl(=_+JeZ(WgW5otBE}kk5iRX)-5pNam z6CV+OBfcZjuws69755Vl6>G(IaX|cm_*3yU@on)RV%c;j|6=j;;`QR4;uGQv;#ToZ z@dI)49!}n#;w*8QxKdmzro@bRws^VtCGjEgS@DY;)K0jKBtK@#JS>fF)j{@#Tg7|Dhs0;ZpNp@H zllF1>m@ghDE*Cq+q&O^|F8*X+_x=AX{z?2$oPr4o>tiqRAaQ|MCC0^5#UXKvc#(LO zc$@fb@kQ}X@dI)4e(w5vii^Y(#I<6tm=(_vKPBEK-Y-5bJ}N2;)DZSzRSdE;@;wX@i=k0*eNE(5%F~KV)66h z_2Ql4_r?Dde=5EvzAgSkESu@_xsQ0TxKKPnY!=svy<%28NBop{jd+WAulTU|tXOuS zyZ+wd9C4wzOk63Z#Ef{hc!hYU_<;DN_=@<37%O+z-Az15tPqbA8^pMn5I2Zp;(6lN z#s3hW6n`SVD!wItBxqYx!5Ac#dTsrOo%?2c z{}AsHza#!Yd|dpY_+#;B;;+Ql#NUf=iGLG66iW_r1JXuVNed3Uq6*r4#ix-HOiJuX_D1KGELHvezr+AF7D#dTt@m=(_vKP6rx-XcCO zz94QD-xNO(C(n2J*;AY)R*1)ojp8b?OFTooMErtygLs$teer4WXX5MPpT&QPyH>b- z?JpiC9xc|3aWN^5h-ZqIi4Td-h`$hjE&f^jhq%)Mcm2J^gTxB)II%(O5EJ4CaZEf< z{IvLG@fPtO@rUBi#Mi{P#1F;El`emKhzE*?i${yKVw-rf*e7PiJH!XXr^KI#uZnMp zABj6HborPqR*Fl-6=J_QDxND|DSlOaO#Gert{7Y7t}{(MK%6HYE!K%AiJuTRh~we~ z;%CLLiMNa25uXrW5VwkNiXVuR7rXrJDb5lr#N)+Aah2F5j)-T7mxx~wZxHVizb`&5 z{!Dyb{ImE^apxml{`M6Q5swsW#7~M>h+h_O74H)t6`vFTAigI~ILcjbcX6h8j94#r zhzW5}+$>%xJ}&-B{Jr>=_&4!Gv1Ez6{$z1iaS!oh;(_A9;^88G#LVo&qs66St=J^C ziL1nu#iZCL4vATDvv{_6fq0qt8S#taSH&B|Z-{q__lXaP4~tKV|0TX4{z803{I&Ro z_-FAw@gHLBXjd*fiMxq=iTjJQ#6!jT;$rbw@dUA6Tq&L;t`R>jc8ddIS{xJ45-$)h z7e6OnBVH%oD&8r6OZ>k0nD|5SdGQzG{}ta9-x1#z|0Pa5#+BR7;_l);;sN4p@i1|L zc$9d&SS>CWTg14yPE3d?af6r<&lE2aKP`S<{IYnRc&m7i_yh5W;?Km_#J9u`#mUFI za@a#WP&`~bTC5e@#FNE7F)N-eUM7A~yg|HEd_a6sd_jCgd_#Osj2-9lxtlmcJWO07 z){5=o$HmjcG4XuyGvc-4ZQ}jnx;`8Fm;vd9!#nM`L z{i))9;-TU)afP^AOp2cpuMuw+?-m~vpB8^AzAFAn{6L&kr*|jmD>jI6@l9&iCe@A#m|b@ir*B!B|aiPEB;dajrbSwpJLf^m5+Fk zSRo!KHi#YKC&bglP2#!Y72-AG&EnnSgW}WTPsLZoKZzfRlN!~|#F^qeafw(fwu>JZ zPZP()^Tp4I*NV4^_lu8<&x>!1ABj_%T)y@c%f%zaW5jx~T|7nX7jxn{;^pGi;*H{6 z;`hW~h`$lv5xD``{IKGF;-TV^Vzt;Ro-Fo@qvE;Zr^T;`-w?kgJ}N#Z{!09VxbI4r zuQ}p8u~J+jR*5xYlekJeSxk!kVpcp`yiEL}c!PMS_<;DN_=5O~_($m3X~)m-wLgjQC6O zZ(>QC%g3(b$HYU#MdC7Xg}6rS5jTowiI<62i#Ln+h!2VXCH_+Ut@t-F*6#8*O*}xH zCmt=Rmy6ekw}|(O4~x%=|1JJb{F_)B zclp>&oFN`2E)i?Rlf;BLB%Ur_B7RZ4NxVmVSp1RrEAb8SeQ|Q9%hz7wY;mD@g4iOS zEDnfc;sxU8#OuU6#qWzRiEoM@h?7^jeC#RC5-Y^x#YS(e<%J;EM4vLb*cCT@ec93;uGTY;>+S6#COHgHBR1CaX;}8agn%8Tp_L&yToB} zi+G{F6&%=KPJu>mx@hduQ(>2Cw@V^S-e~Pf%rr5XX0z(TjGb} zV%aG!Kl_NY#Y%Ch*d(qJlVVQ%r1&NAPVq_c1@RT} z4e>oO_Hmbw8RC5LSg}Eji>Hc1;sxSo#V?T)aUM+Jd&sMCUQOXg6@H3Dy65%z&&er4 z@LPrdOyYa*D$Iji3{NDHZU%W1o;OB*4(FZp`3mypAUIi{C-r%byd?-O(C3$vUkQTG zk~;^%bqe1`;yQQf^T)+sif@tl-rvYwan3N|!c$3nZx4kJQ1~E)k5G7_!pAGTLX4A; zw}!k1=P~tpM&U6M*ZrhEzfj>T75==!UsL!-h3`=K9uo2&72g*BNkZ;Ur-IXP&Xh!W zHi`RLC@#_G)e1K#e3HVe6;3L=QQV}@&mFL!ZB`@P`WH5n?81XA<9=rtm%_N#yfM@j3Aqiho&rL!bXud|#jM-0S2_6X%FaNz_XtS&sg%a2JW|^(mZDcue8* z#4Ggq=M=tH;TsgbTl@|Q`45V}65m&R(1-Yg(C$g(XFn3xKTzR$3NKK2nYcn+rTFy< zrxZR-;c@XieSR^C>s>E?Pkc#yheSU9NzTE!jD8p1mqfl6kof!rg&V~-65m@*9ufp8 zh0}^3Rrnl*FCdZbbL8A0xLKdyPD0MN$$97>`uz6_|3l%}fQz3^B7FsUL=dc0cr{sp z->M*y?@@hz4q1uwcnV*m_-~4LD*jRNMH2G=n_PtR-U|PXgxnAG`LxpzJ`(zy#OL!B zt|gbCT=aQD?9u0El8}Esc?|la;&0IBcPM<1;{TI8E(l)I=f4);(&tk)IC*=JRX9(t z@O%>aTBPtwh1(TAS>Zl~Gvu-$xLluqMZ8Y&cZokBk?s}oU*gO`_xVvI?(anM#2{!> zcs+^yBosbP;Sq&T7cbQ3mnr-Og}+Qf-rf5AJ7i4|yrB5k#NR3Y9fkj{aBRq3e+r5G z?V<3#3Lhda)aOeSu2#4~;gb|zPvZKYAYn%g>+`ep`DYcrTH$-dr%7D@$7Egb|Iv0Q z;89d*-|(w?&qhKLG3=c*U`RlkB!sZ2*{Fm?35bfyXd*Hsf)Yg}2x0?a7X=e!6Gd@h zQ;EO~5t%T8irY*#i{ip#E6NtfuRA1IDh}WOuKEXX=9%}M>$|Sc%kb;Fs=DgbsdG-9 zI#u1R1Q|Dq$e$47Um436I>_>|w1bG{x-w3u{b@eu7cm~q_%_D(FrLWxA;!}g&lZuc zg>)U~zs$Iv@n0B!#MsaHBt0u4Uw+|ye5ItZ-WU=4lO$q4I&*ptT0s9mr_&X5D{Y`( z&=d4G>Zmlg=cfHdY`2h>&~dbaR*D*aONQ|h5$Sx2@mj_kMJ)HKi2eLCr|+Zha{AvG ze3Wj!8ph8tuBQh${R75F7=O+< zC}O>5=s!g4&u=2u?|jId-%&)|ji!lME>lGMuIKau#Iej8sNME44MWnMq9HuCLWBe6uq)p-oe7ESs=JK($3+*o6 zgx@A&e1nK|6fz#kcnst56yK+2EH{<$Y{v5#Kgqa;@pFt{6|udoBJz6=r+>uhUo$>U zn>gJu&D>rrO%$=7WX3%h=hIs`{cc*p>5nm9K$mm+ON?KmZ*uy6>KBpUUvhqs(|@H` zJz}P(57p?+BHnkGhC@>_`Z8^xpVPC{Hr-r*M-l5wrCBtO7KG<-#C9h# zeu(i*5zDP)ypHi}BG&&FeUBcdUx=eozZf@*SpUzAZB=F*BVxH!#@8|~6vrTaoL)*N zaQbu++n+7oir-ygyjon1-vVR2iScWUcQf8A;(Y=7Jv}Fm#rGx6FxL}HJJTMt56z)@ zBHnik<1)q%FrLbIA>&uYJCJ{j_tQ@}{R_q?=xI*>nYMY^V2zB0y>89&I_N1vi=IsbXaTNuB=_$|f_j6Y=jcg9~Z{+e;4i1g@;owLk1 zm5!jLBGOqwr*is2#>?qSPJfZ{tBeoOW1RjCJ;~`m(fG&A?f0O$^bYy}olDozH|PiS zr1-3&oTC?M)NFJ5)zm}#&_T3_j-hvor8vJao+ctc9%a0k)^hrK5zD_IqI}eG`kxs8 zo$)dH4GoESU*zMa-DnOSO()Z8`W$_eej?t3{-%g@o}oW-`bEYzpSfH-?M??!O{~H9 z)riQ?J4IZ3-^X~GDEYv6F|FnF^&*ykK}0_6V|<*RqcL;L<+_R3PMU~o)B%hOL~N&+ z@o2`kiCFG_5!Y%yPG3x)rt9bi5$V{>_;tqbiFp4PoPL6y;q>2V+qqZ{>APCQwNMYn zUJ>c*$M^=ug^X`vd^6*FMZEuh`k07(p2v6%55 zy+M2c-w(z3b`j~ni*Xg>#~3fBtLTfI|0?4*8ULB_JB;6F{5KKX`;0bnehcHDMI4ui zYBL@2v?FzknBS9e1|2M7y`$)Z^hx@ni2d41cX9d$j1SRcoZdto^Ud|TX%;P}Wwc7f zad=#;ME{)e8WG!lj`3#3uQT3DKN9i2V~kITc;9JGKTq2)Fqi8sVtzIqEFxcqh)72X zr{6AOz4tSIg!(wWTEzQmIek5SmGj@FpVJl^vCv#^2NC792jhWsBpt{3_cNX&BHc^q zQ=Gn;?&b9N=*OIXlKx7sT4Zj&C(WRRBKCizh(7&Yj4MQJ_W{N;7|&+BnDLX0*D!vL z@n**L^e>$Lu88e?NdJe1Y1CqKepi|+B7MU}^oj3aJV8YI?qfWS@uQ6AGhV`YCF8Y> zUuL|8@h--1F@Bfvhm4Oh{(|xMj9ch0oUSf0)9IicXm46X@22JSN%|t)D`LM7is-|A z#`s$i`+bUW3&l?_8Pn||-WSLCD#mWc-5GlsUr$HS(VYJW5q+D&KQn%t@%xNFX8alBuNa?V`~%~k7%NYh>9UEahslid=r~#>qVMvQi2Qg) z#JT%r#yjYKdXxr5oU{HP#=nTj?~9Bhmzi;_i1l`0+?8<}<35ZBGQNTFNO}jS-_5v+ z@nejipwH4*Ie#1DKQn%t@%xNF7LopQw8N8ToI}Ubh4giLQbZg6vxxn*JY^b1Q)yp1 zkQUGpbd-qo+{Jhzt)$a9|8;tV{wyLt9m`GQX&0JCvuObxLrdvoT1Ds6Cq%Tx>lnWx zVn4Ss{uARpj6bADIsFU9-!neTxP|dAjO{DT^+t-=pQ{*mV4N%>9clDh5#{)L5$P%B z^l^+Q&?%fgkMR@q8BX8Acn96f>3OsAn zUIdMmw?^UE1ONFU|&CmGi;-oW@(#_!PYs7|AC&Xn|BLks9_BGOk%@8k5@j2F@; zIDHM{7wM~<{#W`Xy-2&(n%ljB-c28;&(l5h?;_H3jQ$U&>ok6)xxOCs20E5LM3>PQ z>D%-Z5#{QLh;!x%#y^VK?m5Q)WNdxLT)vHn`3a1>F!nIMmT@NI>lqg?zKQY8jK_=E z{zMVwWIE?R#_4P5TO!i?u84Eh5yoGONY80bzrZ+pmAPCe5%YVBcz>3NHn@QCO`KoG zc(RDLYbN6boWGRu9;{2&^B(<-eoKF(zlfbx#k0m-zK_^RRR%IHp|j|d^kw=s{TmI^ zUuhijO45-``_rNHZaR%Fpik3H^nLm*{f)L?XRbesj-+LDI$cJeqi@jn=yCcZjYOIy z-ENvei|Ji-8eK|Xpl{Osw3)`PH`m*p4x%OWKKdm6GyRM<(S+yB^`z0k^k%ByKY6~# zMx$sf?Lt#%PuiOf7F~*xON;1mI-1@}%jsk~jn1IB>@?PgCe09s&v@Gm zPWl)64m~2qD9SPVH9bMk(jTc#FHnbSzCV(-rT8joW4)*XhHl!2X430u9vx0c(%b1D z=za77YJ9IU(m#vw0=k4gOE=KX^fme?`W8Jv57Hy_82yHRPk*FM)M_#J*Gb#Zc-o$J zrrl^N9YC+68XZP&rnk{DI)Oe&r_tGTE?r8Wq8sQ-bQ|4Hchk4&e)>NBJ3UOlrYGn* z`V+lKtyY#B+J?5H9cVJ`PW#aTG>;CUBWMX7OUKdibRwNj<@Ya5|FSMem^%)c9U*yl)m`A6-nB(OPPJZ#R~If$__98{JO- zO5dfQ&;b2L?1bMRra#aSy-2MNbGb;`hIXdOG?n(E*VBADl-@|k(Na2vPNg%c@qOV) z=K{t{=o-47zCyRqJ+y)TjUJ-k(C=xph?A~PFH)=1oNj!-IOexw+?gg*FU_LY(L6eg z8s9&T_1wbvc6uLufKH<`=py@>w{&Gw|!1y5jJ3UOlr6*|% z{h6xhYsmWTG={dNNwgD97gO*Y8qKByX&xOyZ>4w8GCF}yr!(nXx`3{vYv?ArjqalL z^q|;HQ9h=|_opNNjPW=0d-?+n(O>94sXfA6Uj*$)yV6wJi{{coI!5e)-<_ex_p~D( z&-fww2%RscD#~KIoYqqL-Bx)nZ!{jW4a3+c9|bd6X?~nr#KML7t$=6Lyhm7$NZZZ-$HMv zlSFj#r_e{}qty65ddy$Wcr|^NZl%We)ML4N#(U`@@p?u1lpd$w&=75=ztW4eO*G!0 zi{D+K?P+J)i+X8)I*1OVH_=<^9khbpPp8ot)JLnS@xA!@in2;#_#Aza*3n(`ZMu&d z-0JwwmYpXfiS^yy^#i8P6Jr5@Uk4xq;O?c;rgjE(QzM|>OOyXZai zK{}1jqCWZ*t)Xk_bM!S@N8h44)@h^eFwDo~A$0U+G2a#5IcKQxxqWYWU43+MV{KUYbP* z(HrO}dJ7##jo(MWdM7fTL?5D$&_(nKx{|J;FVa`&8*~SKUo2LXkLV%#DgBTsJ82wEq#bEj>ZMtJgT_aTs9&5VDg7ik+@drE%B(~h(&^@=xPoR$uvH&BfZqoe38^j=y{r_ibNQ97H> zr;F)o`Ye5kZlb&C+w@)f0X;-NrC-w%w3+JEl3?zygT_(g_b-qST^Og(ESf{}sYXla z7d2}INO`oOP=yv*Nx`%#9|3<&2C#dl|9@xJh8UIGrtIYj& z(P-LHEWzguXb+l32h&_Sl-@|o=mh!zeTXg)N8>pVx`M8xuhOk_C*4gy7RM-xpMFNa zr2n8{s?!U!4aR=t`PX>bo_40)Xeu2@uct%kP00 z5`CS%N$cre`ab=L9-^Pp)AR@0Om(VUZKlsgqiGyXqMc|rno7Miix$#iI*Q&xjo&*# zeoSC&{O$?jhZxVMbLmq06kSK3r<>?Dx{n^9f1`)!*YpJa2MyDIQW?{e;}%WhXlI&C z(`g@CNQ>!cdMh1IC(;M$G&+|qpv!43eSyAA-=I6_LHaTMlzu@^(MH-rf2NN1=6*-g zM4Cjq)1EYw_NOCg3B8TpNsZs18LKD{GOnVt=u+_xJnurEp=;@8`WoFychmRjNAwW= zlzvao&=75=R*aF#^W9F`hQ`zOv@`8SQ>pPgICy_H;~{h?EumxRAL)JcK{}1jqQ>v$ zV7&_&FQsegbM#fZmF}d*@9W_Ge`WkG4bY?XBt1*Rw1ql5B7g2e|C+|rcC6-|1oc1^piyqRrIa z$=v@4+Maf%*HGhkf3V#Q#@V!(j-a>D+i5AimrkQIsE=0D8oG);M_;6MbQgV3EX8w+ zG(eBi@91e7rY-aWRXUsNX-lu7-DoNuK(C`W(b4pF`UiS1EvM7Pd+T1!{c=jleeg}zRA)3@nI^zZZ-{fd51 z&(J1%o?5z^>2c7jX-C?f_N1A#Kh2{<=xBN?EvJ*|Olthz67pdI<0W(jT}hv%8|a(# zPqcyVryo;4{f?fdx;RNuE>Nr6jGeR%ji;Tcn`Y2#dL7N9#dHL{mEJ)o(@Hv>&ZJAk z2k@LaT}ju_O>`UGLH|tOqaV`4^fMZy-_djQCwh@ulg)HQ(l)d+O{RTmKYBgQr=#dC z^j=y{r-;wsJ}F}#eTvr5jr3Kzo4!r=)A#A8^b7heJxR~gUuaZ{xxcZri&%-z@6(>N zHyuoKX%QVx|3J%VC4HFAq{i<*VLMMUewwbM&(rO6C*4CE=zH`-`Z+yLPtvpWS9*~; zJm&sJ()P47y_ROsJUWElLT{(#bTXYy=h7A8RD6DuK1(;ySE=#)QCMyl<9fQEzE3}; zU(j#p_w)xEqQB68(wJ^$dfL(?+KGDTHS}7VLG$PkI)awa+vuHi5}iV4(8uUPx|BXm zpP?J+tF)f(rSH-YXn-E2-;2}m`6L>m&Gc7#kw$bkmye-W(~dNaUQ3PN&BFQzFwUig z^d>r*meC1xGOeW3=}bDGE~cyLvvebUmDba}^j-P^HGYo^={?H$dwPb3XfyqlUZf7( z)0O;;r0r>E+Kr~tJ~WdKq}S6M=_q<9y_;6h`>FA}U)X*X zX;*6ejvUg{pK%@?LXF>*!~DA#m($7A__s?!TJsyFs`0onuFj&`6uX>XcEbLb7UfZj+)(Xn(Koj@z-R63o`rgLd6 zT}?O8m*_TX{LUWsV;|!K^b;DOLHZs2kv37=wPt>}XdF$X-DoQ9OZ(C5X+FJ)j;43g zyJ*))06WvDl&<1*t8o&F8{5j6}8ycd`)ZWM3{|MTFcA>p#Uz$S) z(_%V;-b`Ioc>2CTV{Tn?_zoDn; z5A>hZ(%0PYM4Cjeq3JY(X44^bC>=#_p%Z8Yt)vgr$LJhdLs!vP=ob1W{S)0w|4I+i zkLh9h89hnQ(x2&X)Rw{afL={IQV+d`8o$H1NKpn!4D+c*Z=|E>SUQgWk={pV(8p*s zT|}RvHFQ0Ffo`R5(7(`k=%@4x`ZN8Fw#zj4qXW&OL+B`a3$38{(`j@DT|}Rt&(Rm@ zR{93rP2Z;PQR85n#TeY*60uN@7_TU~VxpoHi|ugz zB;w6uMchLx6>$%xT*Mf8rRc_WwTQ7YpNKJ$MPd&;rz>J(t3~upH;CxNY!Y$q+AezW zJ;)-;?miLwdQi;9a}r_>KTkIh-v=b|V0>OxydK{_Ddyty3t~S0QDGsjBSj7SFBW6} z#bMZgaRk1%OuPyEFP32c#nIS*aSZlfycPQ|j>Z0qcVPd;aoB(HF6_Tpiv1Vw!TyUA zu>ayj?7vun{TC-;|HTKe|6(QfU!02l7pGzWMO@b&6mdP~7azm^i;rXf#W~o25&iCv zxB&YvE|N^Z|0wq^5#=jRM7favEpibHQK=cYK6Mx07<=!_VLM3MZ)p)ky) z$a*72mK!3g4UvV$aY5D@mePAEvcfoC57R0-i~49aT~2H1YWghQKwqNUMI>q`-A&)7 z2kFPuPmj=`i1P9sJxzb0A=*q8IUd+q8+FlWnk1Ggit%|)=w{rFdPS6@ESf_H(_#_j zY6LBzV`!;}a&|8*r;}-wSc&@z)JLo7a#~AQ(`V@>5#@6m-A;GXeIm-`0eX;rOpnp8 zXpnwKL$sOd^a3@?_aZ#sBIO$zm&4-n58IR(V&R-`#XAC%u$pdXh=kR-b{6IFz!22#flj1yN$ZUTpVv2C+6dL(jM@7thiSBF;ZA(M=-S zi*0nfi1X1-x?4nh@iyHjqJ20(4~jTXeN6o#&R0k1F%jpjuV_$2`|uq-E#f@(0}Y8d zpEXlmoP*;}v#`EC*Q`>=?5{ey`5Y;ocb^|+^q`g^m8dRrm76=kWIg3n`# z-Eck^d*FN8MbyV%MbyJKNQ2bBt|IE4S44dqBBGudpA$s=nkX^qRh5YPv{*zvS}UUd z{6$2)`A*EmenmjklQOXozl$Jh_`ak_Sd8aV#9>IMi1NQqM7jS>M0xLkJdyI9EuwrE zi73~95K*41MU>;`MU>woBFe4t`KMBRjw>25%IRVe<e5>d|PiYQ+nh$vUa=SNVUy2K(zIm#4Ke&&kR_;nYQGOKoJo<+s%7d3Nvf4O5j9^?MV&BRcPZp8pTE?qIY-18%l&cYpOGK2f$&4#Sl(R*QpAg;bS7LqJBu2UW znDhN2%Aaw*#eCy@i*jh3UlAMU*HqLu3zkFd64Owh7`w$@NFQUbcrDMDSUy)`FWN!Q zA19*RmNT9#W})0No+Y9jFJkrITei74N@8NV%}oEzsKZ2y?Vxv0;a zZ=6^1aeSpc!Tcl<<$o~aToLu4l<~bH>VwhFVtJ#T9ftI9{<9(qgVBy+zR`}}gyYNk zMmt!7d}VC3d#E=?JBQ_sc5aM<490p88|@nEkb=hRf{6O>lJ*wcj~1UmdKh;S(H=bX@btUypM3v>yC+mV zeC?Dz?!Nu{dcD~Lyk4){jsNkV`L9gP&UU*qy_p%A88W>z^6?=fG*v}Ks$7mx zcbiZ+(Ilf9;J;MmFj@!eqJ(DO<$4kd)O3qqJsjt)EVALxvMAo1?@>JO zoXbs-`BuN}umww5gR)d4{*v&gx+{y~b}8MWJ>v`ZkISrElWz&6)g_i%gKAdusU$6K zuj-E5>)N$kKcBc<*Sjs(f6BV}(?2h&Zr5Jq)2_Uxr13G@dt;qiq86tq$(vGS?%3Ye z&mZrt`W3gnH?OIC=Fj7-o(1|4uNsQNmor^eY;7#CTs`iMe0#uBcyra$RhZ|-7BgMx zp@7w+^!(NzbL0L-Yy4G(DcYu)O7h2VR_DhYnmjJCGOEs*ZVg2BQa@L^p*iX{rc~`4 zo$=!-9jP(@vzEv0vT0N6@|rH(vu>=K9uZJlyp@tFTT5o;-qUfpc-e)EaT5&+HRu1SsZ(*4m z)8u_Im)_Y^^BS-Jn|J#3{a05Oq?AqiM{A#ta%_NUAW&E7@WW`gh4{%rOgS^#x zY21m@mHN+#o@pOAiyK@i)%sZX#>#5_R?NE%f4AfB4*cEe-K95Yo$#r6@4eofy}i$b z@|>D-{-Cl*YsWMO>vA+(*rgi#o?NX@jyt0Jlyc(;;#EnWmf9~>%P^L1T=K`Vju9v3 zsF|-~y{}+@_nr>TQCfD7jxSf!9Dd2|dB|< zWy7cl9DjQ_!-&l#`fI8t({hYyjZf{=o4Z*eUiaAk|HK;zfY4kl)D|VEnX4d52acq3h7S6J#YL3ma^bx(+23xpS)L3nlna8Qg z{t~T3e`!$fWNXbAdac*FC3=u7>8^9GOQ<`pM{hWN>I=Qxdq=Pb zul2gutEB%JKswxwr&`yqbbq(eo{*$l-D+A=z}09~6OdAO$-!}Isv{7a_H{$rCSQ`G zFB+_7sF|_pO@U%fSv54-wbk4gwV$i^@xc01uHhZaGwYnit{XQMxrQIstJFrzoqpMGLN$btySPi%Ty)xT)?_Lv{z|pP0LTaIuExQ+j(+|vRt;5xhO`nhN7)^?&;rIN>0wD zb$aVE7g~zc#%(=AQO?BZ@(Zh1nEscM*Si&|n!teTgd%7dwsrb^N9(4>? zf{x)gm%6nyBUg+Rv?hS6!;{J@i_CQ8>`KDEcP#H%(WxA3a9({h2eoTt^Iyx1Jq!6P zvQMpXF5=5kk`cCbdH{u?z>YQ2Ls`rK2tmL-o$jXt+9bD1MNBEqb}K5Hgw@T9UM zy57$kvRbX_-au})7q#q&9%r=3ux+sxJ)lYnPY8y-x5D#v@_!9&3b>YJ)G!hUv)>7@{A=@-mmsQeaek3mKgbKG16FU zq<2z9iDt>1WE@vX`7q^L&0>_)NfiSyM?*VvM1RR`3vaTb_B~_ld-y`+Jk4C!9Br89 zN=wBVLQTFI^T(Ry3$2bVj9#X(ylZQL9{rdj8NG;Smg%uZ{wdF-VVRh4tX0-nA9lq$ zKUbc~NZuTFS!^wHryASYoNKI2+9>RMI8|MdANhGCYWw)Q$Ptmn8;T-P+e_39MYiBp zoGE%5OGlVB{!;yFEoY*X4Tm;=yPTiQGbqkgXxaPC@oG+%g3qov{&<~hoDWa}dZGqb zqlK?V3oog2pk~@|^jqt@BmAuDz+RiJ`H83gbVX}^Vj-d|HS-nx>se-&f)c9-rC{dV znPs2iXxFvmKCU!{eV?LCI9is>G|NS0AYZd?b+jz6j2pxXhY9vjXo)OfQ^SHms^wq4jA?#@3`A*jB_b z^K5BdThpmi;mnGJLQCe%GV3}^X6M2og}bmsB9_S4A{!%&^Y)_^g@yTrkCsKCp51Qb zGt$ua(TYxm30U_tMwy)DSGvoq_4(7k`qU_s@1jgT?TkX1?B{ic6BVOOF1KWw+qP+H zzmq7JGt10UBjwT-Hp}JAim@ntGmUb29nO;$%F5f^Dv5uKjY!^x*8MtTfB3LrUdJE6SdkpZXB1W(!$uYOl5d8_KC|nNdzxF4Loo zqZ|{C!t!a!DQ3CWq@=n&Ptuf?W?6NxtV$W3S+U1Bk4AiMo{?O|t`QrIGtwB8QLi?@ zScm;Tl+WI0&gET;GeO7lHrlc&u{giH8ctH};Us18o4F~gi#!z_oJB_xLZe~}{oPUS z72j?gb-O>+SnD%CPmbGHbh$-|@XI@;RmED2I+k0XYP8udBTtpoAN}s2x-Ow!U3YU` zbkO2O4OgY6OTNfis%;RhPxjP$Y5${+9>LjOO?L*&ttmKCW-hC4i|o&w%jYw*{jC_j zjO{P#PlU9=v09DxiJpivoY@weeX2da%YCY$DA%q1LZeUBvf&Q&sg|QpwcH*~bw!3F zBGIF=qQ?}m2m6jA7G90siM2-3Y+Wb4sU#ye%<`ma#hN3Sgx-vK?nT5`(hqZ_n7x|a zdOPoxJ+Dn>oF#p$*4~#{V{_5->Zc`nr0gjxyVfbm1Iq_>wgd-g1GPcMcAc7QGtMVl zBt7=E%1T#Sjy5u+su9OsDQ2%lre-9&21agGg60%y#kbZe*O;w&+!d|)A*a)5&5c^K zvb7~Yd+Lb3soStR9IM2>b+V<0DljE0p>S&1mA$!$&m)X}k*hcY{h|nzn6X#%i(>xQ zeo<>1Y10-PZRApIg;{2eR>@=EpM{OCRRyPoVhqbHk` zV&-M$GMqWbn)$gM=Rur5t(F>`F|Fv)_Hl%BBXPF1xWX=%wMLF{u|H08g;iHnOZ9{1 zQAF)u-TKPPS6}M6DbfZeH7F^r*L&!W-j?J+TGwCZ>Lt9c_);I7VM%^X@8Hegu^OaV zk~7e=>#$t*z?h$&8+yw3rLKFQv*(7F81+jDE$}I;;*xzSQ7vtav(jVeBd?AwMOlv9 zXMfr}(kiY=%`_pcI15--%k<+|qSVMg=@nRwX-D+v9;3P((Oo?PVZ~M4sJg6aNQ19K z0Cl(f)An{prB)~SkLaCxlxU+m9nd?qJEAAG8>Ho*o%5h;OTKRFY)h84&(&-x_f5B; z-`~M9h-YK0H{0AxbE+&S`zcZDp2{-TbYpw{)?M13t>wUYb3f%hnac{AeFa7@Wv=Q; zpKkMPoj$3;hJJ#1F5b#^F4ibvvBj}BZ7+&N2^*(wN6*_l4Z?++JhZQF~Ku@%EzARjc*LxcjQMRw>I8nzdW+u))%2x1Ln$#4(yR*b}l@Rg{z; zea>K)I;D>iI_0wjRd~WTbJ!6*u~U4Nt>wCk75R=YikTPlw4^+S10mdjP?KHtQfCL+xfhg*{m>t3YrPuNf2)O{$Eif13naAMGQzHq3tWRjmzEzYS) zn%!vs?Cav{&DO7VuI+sB6-!23v81~$Nwb|FoG0sOT^cpuX{ke2?B$5TAL+d^BEqWm z<{`HRo~iF2vRGmRZ-v#^kpZb69;68+Wc){XeMB!Ymkz4wkyp%Brpnxp^xS(qL2G(u zz_!j6PEq2Lom*0jYerXnY>%En=Q<_*7r(`e+V!B1S4d5Ma~sOPZzF86euP|*K8Rv0 zElb{MFKkdeGF^4|2)60b+Cv%HJjUp2I<-Z079;n1YD!CWrCC$mI3Js14mlhLQQXd8 z+a4!Q#q{{*lydE_f&N;%Q!J^{F#d=CP-cs4+5)4!T&{IRi_#`e^3}Z7=sM?ei}`O? z7MEH~xx#Q=YT^F7Yl|z-S!Nq+wy@WP+}1dh&u@Lw)-I`(wsufKAI+@IlPY4uNfAkz zGJYVbv@Xic?x{Pjvm_5gyJ(IiNqf--ZHml4reE+{lBb-VS1{#lO~EkiUA(t-PI
    `GHsxmvbOMW4qw9>?_ZaSqD$Qi(x-Kyisj+FMpTmJ}GOh=lD&UlsfY& zSGH$fahhXQlPcP5mSbu4BTx}ByR9jzlhUKDuJ&15r+Drh(#9XTDQR4O$kzs=6Uu@is$b1K zcdE_S%tEW~?xkjz4LKdSss5;59cNw_l(3~f8FXDM+cf)ak?6NMjL{~UmXZ7lu1;NB z)nJBZPGt$69zDpRd6O~9Y4rT8S}u;iyu+JpTWj{)q;!nQQq%L%y2ka*(RwG_ICeHy z+qc8quMK-_O@}7tXpv!y>NfIZr+z5gjl9gqxL>sOB}DB|H)AZ4BkT1TuQeTg;FeW4 zCuP>?nm4^pmPflhRhG0h9WBipYL0rEslhhanswKKUTJisq-5=oL5Cv4RnC!xgJw9x zwy5Lj*9IK@bF{3XHX{Ya7`x5j>)my2JWF-en}BhrYdH}+dhu|n55dFVVc*Hxwf$3l++`yrec&z^6GL;%4=%zoESGAHECPoQ2e{S zTZYlkmD;rZKh~z`OSS3VD{52hf9&V}Yn_sIdlQ{@jqS-O;+5kHS1w_WEyxuMM%^!s70VTijKZgCYUazv2t!|^{uP9ZjWLF) zWjo5yiWDKO4bqzQKJybsL9mZbbDX}$I5KEK(C>M|=e;ymKYj_WU7~UQ7HP>GKet-H zYhSfqfxr9>)%t`DGKN12Iq->Y+b6joBNsB7Z{`B7*CKH3wgJ~}8;)ZMD{=y_y>`is z2F}@6t55KDtV>5;C^x6iFIy57inUk<3_uByk@JLto_JNOSGX-9)q+v+c*O2nJ>M(a z$Uj?P#Chy_%Xo}j*R{4!85*WW0_UT z&q&ER;}u4dk$VM3?ztrQ7Hg_`4S?J$MJe%Kx;~P&R!Ycxloqp;_;QCLZ!wlA<48vN zkm-_cNwXYtiE}Td`~NhSv{$#qwT>qxrI^=K`*5_=wE|p6SE$2=}-5VOUgPOTV$+vogy{6 zAY`%1nk>oY{Jf?`nT{5<;nGfI)yQ@TP~$ZBhR% z)-=_ByKUrATR75TM?RYOdz4ho@0o2)F9@vEw`D8oH~7cTR@2-1Ex0G`@#h5XP4%U= za0k_CwA^xkMosB%-1SKd-t&0($G@5V&bhgkQD^PR)?X~=mg^Ujt$_{&KA0FxIcv4z zRo|6DI0l^T$v zE%&rtyINmKYaBJjsU;1PaoHH$-^TUsaeKj$1P{P5B&L6qwCal?(_r4Y~eU%b0=BDq^c9RKc6!7o~bWR{dTG? zd@sh@TJNK7oT4V@;`*tz*Pe@eHmo`a(V65`Up(95q~$~ZzTS5@t23ceEb!ZZ(Ht{1uDW?uF~QIDef_NI)`rjYgZ-jYEWcW(u0p@j)lj2f$U1Sa+3Pb$oC}S1 zmvu*rL;3E6>q)tTVN<#`;9j`9S}*ff>-XSqyti#bL^x8#R7B=f8P58UaN1wtMzUbuU^2b=e(BXQ5Ywg zh2E5cmL<|?LsN0r@0kZ}I4f4>VqY6BkNdXP-kkq6ZMnFXkGomYCOMRfyZSk~vL<64 zIH#V=dvb~m*Pj8s(kDycPJmJKFV}n7%XRjfk7mjVqE#DnyX%Mrv@=gng^McC)UOqMa`d=vhANz1MpR?%j@3;Y5#a1GM#x!F7_E7h5OY{mUZV zGv6Lw6e(kcw!lmJwZ4~huWxj4^OR+$b1nApEF}X^0K^;nr=%7fN6WF@@r?7Cy?VS) zMpZld<((G)$@!%oZ*a?$5-n+S^gu~!R|n;N zUHt$44y-v2%WrpVx$+&kR`mN)zMbz`U<=w(emSLjPR#GIAPG-njBHknHmyY4JSBHe)ny^AsE(C3=91`{u2`=*gVw)39HUI<;8Yzem^W$+@nroeE>Z zJzN{GZwDJ~*f;A}=yki4Zr;eA!(kg+1IFzQLe+M+Ud6Kjz(Lw9QF48(oWvOo;;Vj>&F#Z*FBs6kHcev zd%|sE9e!ul)=3$+ugxEED09@X;MsB|?H_^WQ}ueW8~0W+Hp8>!Z88qM`9ji~{DH?x zJ3XN*Zf~I@rDx|)^yq!E-7S-FH*%kC-N)z~qNiku^*grSp{X^Sr%2h5a*2^>mdcMC ztSM?rX8SK5GD@*u?PCed!xJQG@M21bsb?qK!flj0rg{tIsGKdAwX1F=C`Tir^=K3< z!o6Jcx+Qjw+bzqOJyF-3kwr!)B6N! ze=fn(E$PSQj+-r9qW%$M$nHHyTF*NLHM*_)6YhILk6Y&9m8|1{{+(@(c1*7{QuKjd zrO5gayH`&+rdP$uGObfOOx%g{!j2Z(<89IE_`46Qn^dtj-xDyl)^udlaBMADFYT4Q zD?aF%{A=CiOiD(*5KFlXgqh(Mj2FZUe6ET(>O^@?-583 zVgy}Pd$tKQPD-b>@I>!s_OoLy1I^DWWZqA3wmJayd$bn`BLvjlfpkD9#( z+~+i(I8og>d{#%Ex--j|O)K6JZIm{7=1!hatIRd>u)%hzjBWHqdrp)p9#7f$GMndR zl&%PrE(c53r^xrym0L?4NPV*Le&l;Yms&aNbRo^X>*Y_Wyd`oo(EANobC{dxjt9UG0&8oC{^i zNlQI-IG<0L60*8Vg6T^~hPp&xi77AXFJ&h-M0gU>UwJkAjiv9Oi*fGOUeY%_5*X6+ z&{eo%v^PdLdZ)MZJC3ELcM7yVsdaVmI`q?zrzZrqcj`9OJlB=usiW4T+xp6iyV&Nm zsa2NDHHC+9mqzdB!3YAbbPA-0(GLBaL3LLZw?qG?-S7e0VSOqD!XASg7KOG>$OuZ!i4!evX{Zf8z1N(`3fd(iRQ!CmOHqnj2-q ztXq9?&#<-i+2~8WR5GGbGNeqT`?eZ+IzT&(yAx=86iJ62EnrO8p_=2P4qW4ybv&-l zuPc4kAf9r}OfNH!sVpzgKUJdlwb~oQXD?+>%zZkBHo?4ZvZP%Vz;ViV`K5m-J;$EB z4-yefXzp~k!;h)m-P#n~x0bca^$X5?d4IU#*#wLox#anTZg@VS8=g<_q2?ShYL4yF z@q9jbc_agExUokv!c^-+O1dAmw>{eWe1mMIC$3LkaSTMSZ+)r6W^eqlU}2Nhnvh%A zWUV64KJ&@9&BB*<3bzc>AgjTKoFAdNrj(Woc0HBvdM?S%JRBSbN{% zzPR%2i?Q}pqlYHFVVr}FK1i*8Kc1*6^4IF$;x7C*{nzFv9!eeFp-M@+E+FgLsejjh zWb>mB-d6U<`FcnV-#JVH3D6>?x z9C*mlvTy34Gm3injN);$9DFc7DS#+G$%1h&q_@D1+><@ZG~S`Q(d+oP>tZQ)t^eV1 zez^ybC-)+S?Y?Ok6Bh!JZ4>yH#DFZs(rP6xRcv@hfJWa-XEi2BPbK!r;=OXOKi2qOdJn+BH zXYcRw`NrSnvu5OT_u|z5kk4I_zT*EM@)<|H`}jW$Lfw!fZeCR?p7FQ*H~BAT;6->^ zRF0cXE8o%D(wb-CP~N|vg@51Hru(9vGO@YYS~H+h&f|#%ht959sAD$kJnRzpT8iyiz>2rteb@=pSbs(Ea#3 zg1=+<`wD--4BOLjT6@i%Vm-F00u9}D%rDjXm zqD0~Dnrlmhab2sX=7zH7pl5(}eQc32TiJ$d?NR;h>pJ9OJLq*DxGrK%6kZ22(u0Sc zgN`287a8l##(JOFu6X|Qnw?jyS-rI8-Nu@aV9oou=C3l8w8RD_xhJ0K%nb#7X~}1U z|K8ug^+ZP68c%aBj_$z>rKb}5!G|7?8KvchPUF0KFhfm2PiU&K1lsI4oTJ*ot6(Dj z67UzFc~l?K4I@H*N7p%PyxMV;0rMEj8CAA#Yr6g0cX%T`*KI*PlSST03M(K=s#NGXuHIEH;~O}DkRHr8|PUL z>0^2+*ypc(yY$LlHTg=DcMhgo_v>RuNWHM1FUEM7*(3DgN?!LyY__#T%#iYA-cO6G zH}z@}o9#Gn$Q)aXbB4s1m&&cfehn_h8hT~e&u2-ya4}-Dd2e5~bGuCmKkrlBwr^7L z^tRb&Z6Cb7UiL)F;-#a7w0`4DO;&nfPfAm@6iu#q)j*s_33`p%skpxl#@Qclx#tZv zx$#s1(jJd~?ZJ$M=G?n)XpVma<atpK z_2041in5oG`RPgg>p6VViKmOZ6ux^BN5&{S-(3bVkkoYgg=(esE zb!yArTiW&OUDdf>ZE5(UOS1*l-nND)4ben3%VTMnc;7{LW*P@N`Ep^n6 zCk*DHRFBP4Q5KuaP&fLfa_qoWSFQgOQ*33kE9*DdY=Y&T?z?$!6UenQKIryQb^&8N274|8kgQ;hPdJ-7DFI5`?_ z+))$N)V6*pfj@Pt#wP*Y$hY%}3C14S(RY+3l+lp8 zt4eWQ(!N9W!kdMYb+)7qVMwc!&QfFHm zUcMWz^gtRW{?8d@;=B06Rn$c5!FTZQeq2xCX>;r0GaV)#KI2yF^IZ+w^P?~#Wy`*! zQ*1iY(&KJiWhrJ!3+_MTo@l0U%%!q5(%&8T=}V(gviqy)Ljp&2{N7SeT%}y2;`&Xl z-9EwJAniD|r?woZ^q)}{t1SmBC4cdHs~n4VjggL{dWo~BG0M5eNJA3VGp0XE-7z)u zUA$_Kd=%fsR#5Ws^q=Gy#!2@{J|2fIE}^U|DD0q(E__!nxyIdZ!jL!d2{IXv{`WqD zv^jFU;>Wf4)Lm-2O`CAsnw}Hzw~j?xp2i4de8>@-?(cnLe8?8tvnsKnQx9j4y8LT3 z^-#Pc?x>m>jo#M5ez;?1j9eVFe7>8-@E1&#DTA)3E`@R_oxbNqKl|>3ZQwj zi@WH?()~PWfuz4FskV5m!6@`{a8>G&yXsC0o~`i8b``hP_$*?7jOs|7it(_^_wg>b zr_!3bhshFGwx{T!^!pN@A+T)0dW}&p7h54qvchp_{g%tEZY25uKaD|~JH~8t)A$sG z+0M3(``Ma$<;s@KsceIhPA|tvqpGaws~h&=4xH@2qJ(xSp84A?xLXqK{iw=;b5TOw z@Tz@!Qug?&?o|b6=i8%)4{270bSy8Zi!6@9)o9f4zx%*8w@4-VrB&5|CiwZW&cuPc?$WJy}R#)z3E9d`|{v0sC)9k@oG zRx(@c$UufMUf8!d11(v`@E2wr))!%nNS1hchAd-E&kl6Q`2ROX|MA+OjKrCJ7WByc z8)u;8jCx+N_A6>uivIED*19fOUrk+ST>Dq~_7!cYdSQmLJXn=dr7m~R7++;sUOL0N zJPCJJpHTM|;d9Ye1-)mNX_3|CK*I|ranWNTbt&`7~JHo5g)@KYhPk9EPIgB14cdukS zTc;!yZkpISdfDHz(f4wx+%r+SpD68KHsOlV#|3(D%)U4A>2w^O$Z~zxJLjB5Nqyv# z>g|uk49BMu<2q?=>z;mdMSk0Wpk&(ikrY1dKxbZ##D zmsNYrvU(Knz?poIlKw7Up}&N7X@Xb&o#<_gf6Kkux;wTu~Pc*O%v#!6?7PzKQ^zj=qJ<(wMOQ?JJzPf)Y)6s zPpH)&NZqOLn~45;zv$$Ydffj<`+Fg=TM)1ER-oNhTQ-!&hg4^*A1%0Z1?F89NI@Un z@*vvSZYn;(-6nt*x+)6yZ+_`klW+aP*3wd{CJ#nm{edbq*uFq!O-aU9T3b=&yCCL#lFc9tkKZW`75F=a4UIpIDqx{kJH+ zAM)E;-kM;JTFRWuuliyvx2063O$o|p$nH5R{kU56BWuyCv$+rG`|RcsK|6I7TA`5D zsH>JO7d`lt3(hK6wlL;vH5GX_&3ftlU3$BbnpA6`^mg-%j<&9QG(K-)|HGBDRc1?^h^zZt{^-uXeq$&NjjH3Tr6B8iBLtGkCXr=H7hwPg0uwa*x7` zI~HaM!g*&eu2*a-K4)`z{XYgO_x8sz`p%2H7j~aKL(Y36FX=C$_bYj9ZX0)Q*za$2 zjyP)0QBsTi((9L{ts zfBpD;IQu+P-kEvlop{7b#!W|yn{^;rP0^CJXiC9D8_dvaS@O;l{{qfg0 z-^Q~At#YvX;r$Mg!)wn0>wdd*DRYD&0e!FC&}$t`Dt` zBJ+FUPj6%I{$p8q?Ts=~oqFxW&rg@Z%0fofg}CCqk?Dm$J%Amy=Ssm`=O*Q)o|&2#dvR7?;+e9%xQpxa zDx9&-Ed^VX=X=MxxGB#(vn>xZ@x{R5@|qagNm1rPy{Hd>lG z;(;S8e|#$<9e44+HXW%xGBDQMW`e%|hMU*QWF4*kw>9wei!?r{mkrn)Np<55Bdpje zSXW!9mv4Av#PZ8W{KTIowJ>mhPbtfctkTxH+KNkBedA`GvKzB%mgj1v-M^Oc6Ug_G&fF8g4z%IQY};CA-7ur? zOCpAM!A3B91H*H zz5-uCnU>gba9^=Xz=vnI^|B7V9ce^~RfGFxw~gbFScIJA5Ko85N;R_PPl+xzbE3Zm z(chmS``$xi+D>fSvE#`bS1i{xPfR6z=cMl_Pi@yLM_cB#{r#PkQGuD^;;NGqvMihl zqxu{0rxglZxT*pRSGynv*GdJRY%>>MMfBkZ|C7CN?|LUZH1MDJFM4Ai0slSt@5TQV{14*4jsMBLsf1X_daRy_ z>u$^yI4{njdkg zvd90A*u=!Rcx3taKkI+Q{=Y;~LER>9h!fp@wnWlC^Y4Gl_%Dzg<(bjnavLa&@@~=J z|Nbe92CRtwZjJsPivFI6{+@~c#wCdEZCZ8h(xpwSp6$DK!SRjuoqBa|BTA-CnLd2x zpsAzB51%5&jh-+z3a1PoI&s2;;X|iJIT~WpN6*Ti>7sG52s0?$Ffs+amYIbo@h&4| znR#x}PFj6pke>fh-v3YktpAeZjq>u}|BC+qMz2&cM5JuXsB^y%#!W|vj?n(a@9kDk4nxZhViA^kB8+J{EGQfE})IP!fcP?Wg4P{`B5og#t?%3O@NtG3BK6}Fc+;8<~4ky(9;+#5blx& z!qaj;p=m&^jx(xRPk7qA%+a-L2~XR%IFw+!^9<|N5uWy!0nPXE`9V+TU4Su`XIMYz zOEz4LAcpv*Ld-_ciDy_FM4BD$1)MewFxE0xA)lu-1QKV_H!5_!`bP4GNmM<#OpBy;jclS0k-9o4`^sjrEnTYg4 z&8rA9oQbJs3YiZE4B)ek9{bu(u!-hYbonWdomd-el6k&~5GUg7 z&$oh2HbeM8<(YWmzZ_(+ad<+6tiJ|+vNv)-}JY`2cG@*u>)WqFe~%hH>ZGoVuc4XltLCSOTkf}~p^M$IE^7O3zr77U!5z=+alic$y3w7)Y>(fL*$kG< zY_H$0&=ahZD+^Yz&u{;MAGhE2CfabwZx2O>yHh#kF~2?iFjyM1C;WDJC|H2mlYYBd z0$4idJMOn1+Y6S#>{-7(#s!wi?1bO$u^ueTwS9~bC;c`?wQx6QDX09xv>Z?#22Vs24 zvG1F^X*}J;CH4ce34Vkc4oiytkcpuxRRTH3sZ5bXqx3iu@c>N_zQ1x|QL&$zw@Aq7 ziAZ|U9K}LbHURmYg;=U{50EdIxYcO|a>;CmWHG1)n(c}G)~pc&3H{+HW4|-WT?qAP z7m)8cofXOSLwTkrZOU}h9E(i;@gnw*NTL4WBKA+SI|N()(IWO=TwqKj?_W%$@Zps{ zVZ~am{Z!z;ER+%BinMzK`Z(6Z#8B^I;Kjx=F;y|?HI9i(q^zk)ntRi=MGBGHvOl8E zMDXh!fX})}8L2Y|0>AGfWu-n;9ryzmH8J%JrTHil9&85uaRk>Te1UP=l&K{m_LE3B z{YkgjPa}9H=84$PTmwjET?~NOi;?hqNY`IP%3W6md?^ynt-I_ZEv0s)_I%|kp}ZT$ z1AiUC4dB9Jzlo%uxCi*#h@7WOfv+--bo)WHHtLssD>LDMVz0a2N0@qKK2rY48W8?z zBKB`qZL$b_SQot%mv;+^xOdya| zgd*c7_3$9m-hBw391keuPw>U@Qv|Rjzl4d$myo;n$i$_>2jvOfa69S9r3d~Z5PN6HpFup9ow^bXC6MWT)v zpx$AT3^#WG52s*5{xkr11cg_U&5D6X686c*DST8dq)BlWRs$a05;$l&JvGRf5E7M{ z&YrCxV~H#@ol*y6Tq6*C?m3C7N!hvfu{b`2a1z11EW*2&^AusOpaLiEKrYX5v?|V` z4DlsM;U$ECQNZSkrkK9ZECh_Rmf;$Yg=b_15J_epLgIvXC|_{=Ci>EL!h4}ODB$Zp z2tP|*Bjn2%-U;th&Sd!qTw}rql*E?J+5vy~86>QB{(c1b+`GWG;e3HXkZ_(zis8J8 zdvC=i^C3)K37>RDNSw73 zY2z$f9(X8woJB6h<*^uVk;Q5rbHMB_Iy$_tnxCtgcNupU{PfYa#CdDGT;~IAbl!o zwGT=(8;wWM0;*t)C-I^2RJjpo-b$*vNFO|9q)1#v*b?Re%$kX-J0nS8*)-@m@!>xy zId%Rzk{@l$dcx7RY#?mPz0^?~2}j%VNTe;~(GoY26c2m4#La}g^3ocFZy`-4%M|MH zt%Pmq8v(qHDw%@%m*Ura7&S@UPB8HLI;2nBP3quEJx&EiE47Dkv{HKsoAPRJx=uiR*NusHRlOia(q?bj|h9@tZl#_Q>S`mvw6T52q(+2j{|=~*cN7G2u=Ld z4Vi(CdoV~6KYs<7_4>ta&AN13vo7D(tS@hC)>pSR>+49f#?wf@LN&&WGXU}vzZp(N z?WZXr@y8Gx7#H=^ZAD$Xt*DVH zNZ}X*FdrDI0{QXuXc-w{kc?;<&Bko~LoIcThf$JR z;zC?q#?gA#<6M@1{A7_>-`Ipio=Dpp7&JALr=UO90mCExdJ`KN-y@BG{NPfN*w~=) zEBr&TFOt}ViRmAWwlrmI`6o_8L^CEaiWZiM&5dGc5RJDJTNn*0mTRk}(F$0oPs)&{ zmC+BxQqz1Ot&Pbb9`y#6(ur-1r668aR0z`6SPzmc;wh__i~+SIk?}n#fG!9q;mWtC z;IR};7X*`Ai?fO;cs>Qw1p(w1;;b1IOv1fn+z5C87)mTMJ^@g}$+fgM$hQdfcs@u6 zCYI{i6{I5*kJ?cT(us*zWMn3GF}lL^BDuRVj&?yeCYHL|5gG1a;)!UYI}@+kJ{B=O zm?THk(vyiDQA;l-DG{~wW)eiLX#i&&N=z|+pmIOH12R&11PL`|3P@ViDqB-Uvy4`- z6pw0%`-H@7<1Mr;C1T07*{Xw)>NPa_q5C_j^V^WD(0CN2zxo9^6Wg(2jPj2kK3*ht zHnu=hv;5;HjTVV_vf7p_p0N9Hq5DL_-$lsO*XV`1ndzyRHWraW&3UDOiy5}B4!DHj z&l>=jGJF_a;<~S<4d3?~W?XO5j3K}>X*K4s(p!)wBw1S0%(;M;+>Opkx|{AKJi;7O z8F}v?PkFmw*%wX@{!Dpk94Dub&ZWHMd6P2;TXG3TOR_#U0(oWa_P|+hK#rH?Cub8* zmI;(MMA%LrK4F+h&LNzVK5Y1Ok(^644yKPAK0zc`-UacQ@@v>ja&^o{_|px6#rXBQ z9`;v4!PPTRw{>(QBzT$QS|32&Q0b#sKe!&Dike$%0&e1)rMpT1H&YwUGq||6Qc;0X zRM!f{qex&OgjX0$!ML?q3_OI^{FcbHD&GAW66mQt5T(CZ3$Li>LaX!2Ox?VS5cA8* z4DH9NYaxM~4>2(H=Oa1F)Z;USSX_q05_KvoD|6{Zk1;^%DXlp*(8s%ln5#P?6Fo1G z*h|DsLB-`<=#*J)Xs6$m_aHVcw6jR8^{G;4`QwM%7;iEWbeoRRe-3fbwi8&*K*6xTc6~IGOUi z2G~p$S4=^kO)C&Qn1l;C8}_J%P^K(7a4+ys3>e&kv>XmRjQS-{K7RywIN4rxS!W^e z2-0{hxp^t@Na#k?li#43YSgz#(@2=LCW4IK387r2YACe)#*eDlw45i2K#hHfQ=bl@ zdaZ)W)n}2R^tv1PBDD)csRCwr^*LoTd*G5Zhj$pJV+f}t&8KZWx!_?0FQ8?HkYg|e zk`^{VRV=w^0q}ip8jA=egdnGL`k{+ail`P+eRVS?=Y{UB|BR36GY|0SnKRZO&5&=I(Vc4$nASG%EsdirFG^)|6p1@T*0$Z|~ z1gCv@YT??EBDi+EP4S-#X&g}@DsjyJOhXjWv|S!&-9d?He}FZ|ZKV$I zMiWh^XbK=@-d0XDdJRRBAkyz`(Nt==h-2kxNbk3$p+d{koGVX5{c&5G+pF>?rJ)XK z^*_@Lgc>95rU*3YOBivSl?lShsVi?2`S0XN(-l!jiQy6Wq$-))pp^)bpJ$*iipe~M z$SH;`8OGq_h|o(g7KQ#Ny3f+D&qTlK_s}hPV3hOzAWAjr?jYh_Qz+G2_n@owii+qj zy$Hbtx``6vgwO+EzdxS{_H3vt%a7c3zz8~XF@_#0t{9yy!pbU(^Z(I3D&gmv9X*woNf zF+xuXJ-jjg(wWdrN8wqI(3j!4ZV0_82XSb@RA|jGmiryl{S!DZp@*zQh<0@(-#y`O z^4-IxQp;b2WVddGipS`*2ca)L7ESW#%5%wgC*4V&dL#6bs4Go?H_)$QxF_q9=CF3% z7OJhNB{ZnC0S(!@eJQpGb=G4TSbD`Gj3_<)DAnKh2sSnJvnVA^GiKAdW@UJ6B3(7QLFc;Rb-+NBv6 z&6gk#AAg0U&&|6aRjAjI%=p4Y3x%nE4}n}V$>qA#9@N>m%*m9hG7IEOliYPBH4O6ZXByHq9AVgxHXN=O z^n4BG<-<|g4OGp)xZD0#V1J|b{3!n6aUrfx?X@+&WYEdcpuJ8tq&Pou?ifgsAq>g6T%r=n&2HmI>04Q(?oG z3e83aZk9{<{skpn=(t+JqOeP|wn^w{cT>vf?Xmq?gJZ93*UkLc{v4Jk)=_fwSPyKR(qDTbq|j}Cwq zL|_K8hbyHPWTI;3P8daiJeQDP!SpKy30v}yMBps)j2^io7C4)5YObAc)ZLz8wJYYeGpt2 zDfI)4JzopLmW;UrxFuna?6?)U6=7^A`L=@;eV7S3Pi})r`?`+O<#O(b$a%Rll5~&A zNre^odPL-0gyZ$~WI6H@`qS5os*o(qxE&zW|v$S#W=b{(UgD zXwwL4(Ve)WMOOwP*9dA6tLSNxMNjgj2rR)kcloA&iy#>y;iVQLqOF}t*x-96-`$i1 zW=%o209gP+Zor;=_qbt=aTW>A*^LRp@a-%@h@ODKCUnsus@I@uRIhbSs9x`!t)MQ5Wn!sx3`1WW6OSq` z28lPMNxhKJ8g=q{4HD|Rj%1c^fO&+|7{X z)CI3hruVlg5M+rYtr`&$Jpv~>cW38Nl_oc#(mG4RCdrFvK!<%?lkDYxw(} zL!9o0R^p`oFtXE_LfEOusR1i9{BvS+5dGU$q}Bi2PKlB*)tUMNG~v=!kFrzZ_Xf^ol{n>rVIbG&V^b9E4qxW}*0yX`y(Gz%E13xak5Z*3MPec=JJs7K)c-;n? zPuC}=Vq+@Omm)XXw{EzkhY*?4!Jy3-^(h8PN=Jhh%0jvB1nI=YR9mZnbT+6;mI^`x zDP5SvsVpL0nIx-LO+mVG9-j(R%pDv<4_jylDEsQ;)U<)_S5ce}523a_he8c~us*eI zyG2b%Ev6Rs8BMBMTb)$(S`AXw9E=l>p3w>;LwAAWtf0H1v42DCIUk9g;ciqJ0xzv6 zvCCSM*o4j`w&7Y5`v`*te%5$8>hRY594)%_EgX- zP;r8uG>X=D8H;Frx1%}KC$gO~Ds!v5AC>l@ z@H%qvFyML=-at0RVm7rtg*TDpz)~Afc%gg?%fZx!6y92{NC9p{;YD)kBfyO*yp!xp z?QKHg-K0X_q&B7Sp0a9J;ARxwN1iSOZcgF-(`SqyE>a6AyjZTuKzIuZA0`h{JzG-v zDES_Rx1#WIawoO1HHA--xd(vTQ210?qX@Vyg_p{m)UI|EK1)^~1YAVnW%BrPU_NoM zP_CoA9VmRMY_kElBc)$1E5KkFMLgDMAF96(?!XJ?zAtbdM zg>RJ)Qh(h+;XCAcs(*J1-z|Mq=N=TkPqv}H?n&W?q(gnzi^7j#^_<#g4|J!+V`NWl zU>?{eoJSjJ=42RdYTxq+4=gg#(P=g4gp?eBCZrV*6tWDqnpTsBua!P!c!@}>MPg&* z7!2FA+EkoJj^7MiCxmcs`V>5ePOD4d$ub0omR66#ZQg@TYd}t%1}>co3{0tqh_uFZ zG*8yUQXs7i!D(s6FO=>n zR52}J{D@M7T7|)$7Gz>68h&Z%oXR7T)@H&RV1!2(LcVq|N-M33(EwqQ!tx@8`3Kc3 z6=_wO7?G0m4H^o#vuKD}ANnwsP^MQ$L4K2H4I5Dnn?^Ie9uLxtiK#AQnn-KT#N{75 ze5Ob%m-pT(zMDvkzx`(z7uAZHqDikkEqZ*M9pwfep(4W0aay>K))Dizq
    AlM_SoGH|&BbhS9>4Sli*HmD6~rl!X82Z28dvP+2CI_WSxs*cab+DTs>f^AlP0OO{< z-qQ}=RUdC4L_>YFHMU%J$p#@B>#}a}wEDMg*kaZA(FH}TsK-qv%3g*51}1_ zPyE%P{3T&JVv7NFmGDKv9(j%M=Y+lTcfwx~PL}^7e2K6vU0r}L6Hbw_ zguf&l#B!_}6_#z3pft571~Iveg@4%i!6J}n%z(Y%tlzLw5vXcVCXX6YhGh9nyo#Qz z1gaV2B$CxfSs>L7axV0YjLgbcbp`SSY8l(8gxBsvg1U@_YB~d?fw2Wb>6jXc@O?QR zZa*-|c%}fU=`cuO3J(LJcEbPzB}@#p5BdyDWnwCu$TTJ{l><*4n9eH`OU;2H1!gdb zQOzMgP|C!ko~;EklS!P?LqYE5YJ1fhjPbxdOp;aAVIX+34GpqYA9&8dY$lb|8F=}? z940>h=;2IWqGJbvd7P@D%2purnKV+1R)H*F(pYtX83YzGY2qJN zG8LYmms3ssB~ymtNfwh<{;BAZC5+qqrvNWy+*Q3ys=1f5_fjEvxxg|ez18yhAonr3 zQ}uZqWI2;QiZ%@b_cQ6MXxAX{0F!=x+BOJ0$mA|n6Gj9(Emgh{*u;-2{-8 zOa`j?BSBU%8KlP1FkQ{0SiOj;EwF~kV09itC9sys5cN?DkcXKJRcAsV>zE8vP7cU= z;|N^usEEgV9p=CuuYw4kf-mUi3J#`dewY^=N}Jb$XS3iin$0X39u5;6PB=1M1xM3# zWy`*s5I$Dar-6`#0U8`Pr8y>Kc?*L+IDt&?itL5D1SgWMUzbH7%CBC_VGhVuuBUQA?~;gD?vmlBz7IJ5y4yqCxf z!|9C*2bYCFN)6|}2SM(mm|2E102UBjP8+gihO-_+Ke#&=9dXKVXjd$Fa0Rq{7BN#n zj?xC#b;G%g&I`Us{eqL3Qz_3&L_((18AcpDN!rObo#ya?!B>eCm`;2#$UlkHF`evW zkW)k&n9dK>Q?CmIU7;a@KUt?gu$ba0r`|jjLYdog?>gvx}4w9o571jJT9j- zZXtu86Nz;>q5{YlMB-e|9g9HNgL_?00AazeC??tEyo7l*c!fv>m-83gTJRep6IM zSPGBVLYLjMJy;sE7B2hlabN*vEnW7;d0^>=-5bwWTz0|$undlC=dw?ek~2B3$YuXR zcB`3na$!QCLGSw!F2fsm#rVDsYF>)I3%ts{84DT=fWSYQSZe-ukW)ODc(BWssc; zMa%HO6@$Eq$3JN-T=i8>J1o8peajUs1itXcW{lCs(-@s2D&p@u9lJRdoWp{KE!TFpeK{n zs%I;ZUQE_Sn$(-gBaz15$&KBrc3>eF=wrSBgFJ&~R!1FuXV9#azyOoHxEfdk2?j=+ z6?;F(Ad}p-#Nq9*5lL333i2;^G zD|xCbcQv-qX|~vS8@~m9xSU5)LCX7s;b@(auOmX%Xos7fQDnM^@L@E1orSUyB3@pI z2%gY|Je&c{^SL37YQRfE=m<;ZwFF*D*dqde_QDk8JkX6Yr$C;wf_%M@w7u>;MA(oW zDDz5wnjo8W0bWHlbV=HecUDsxJeW$3!#&K6zq^aCnOH@QHngXQ)^?xHi&!PjccU ztw$Z6tm5VGg}^^j9dLwfA~62c0Pa0y`$@pp2q#Gg{qOutI9Wbc3j7P<3i2F!+qq7- zqNEkS^DAK`X~FOOM%b3L-goe25zLbE5?roxgRoDI-2i-(uwOobiO>0i>VP9^Sj9X4 zqGe!OIxXUzzX)fhV-4^8O)!_1@Q&ame7_llsa-)l9Mf10#1M7xRcsXAL_K%_#LJ|q>HvFj5|}jO#l4frq`7(n9^FY|QmB4= z3?$j04sETr?E_I9(@BxdV3|P%*E#Z1NM9skYsS{h7%0i(6dLmorW#@W;k4jeL!k+IQ`AqL+NsQcz2`*6NDwbatPK}JMxRNtmv8_6Wd?$H^;6L(mh z=#QAOO!8GbtX7=yT$uv)h|WZw`Rk~I{SY&Y=jsNk&2*622Kl{0^*gT4941972#4m( zWztQp?h8`Jq>q|L18W|WV%2dt$O0~Bl)CmH$U-LL)FWh?i zv{dC{ig5NZnWY9``g8VkqjUWfOqRZ6=?9Vw*vZhw3Z9PGr;w95QWy3)`$9Yw9 zNG)y)@+|lM5w!%~+If!2QAM{F&hy4CjPzq_Gx>}cm^`8ASekQ!lRc?^SPt?clc)GS zKj$ST$JIOA5c9Ip9ewqz8aWf>q%j2Kq%su9D_osZ>gCZOrwqECIIWhEi+GKja87N* zMBuz(kXyW<<_-cm&E$&OOWx)^F6X+M@d(ISCcmmJdqCdj1>6n$40Z4a5eqTwqSjy^ zvTVz+pIQudj7=HBwCZ)xCuW6*413*U*u*rRr8nWae2>o=!PWTC?g zPp6(qW5J_FkhuCxyb&vH%JVkX2juXY^VDeb%FbyKed0z7K&O>S^FU9pZFY?3-c z7T1=ix2eiYnrp|TRPCeDSj1$OYDNaro=KT{fLu&ReyemL-@Q9sO}af_Dsq=Q#pW(l zFqKx(&S0*8+Nfbugfqk>&7{$hW@jj;5lOp*5KkgC>o7y441$R*cLthoAuMg0aE7ri zggFRKF}=olq&5d)xTH5=I0Dw0-k#wRH(+;$??OiUAcBGFXl_dS;C?MIQBB9}mp+sP zW9q~rBz@R) zc7zxiHAlC?9%N@sR6=)OjSxL>5pAcwSw`Eb+c5?${mPxRom$eDwo`9mv`GCXyroAk zNu}-7ekN_F_M1c7soU3~be)Sakf6IGWuiU{n@!T2F|j4<@e61>H4B5hqJE$m%tZHw zGqSb4p0-n`+=nSjXH=o>)Ze{myFNdYwo^|urtQ?D9iS3zp`U{Kz8Lh5UegCn(e1TXghTy{6RLJ=r9o?C>Q?rmJtcTB_?bMUdbDq9Z zOxvj+phfxmaDcW`w>?VRsehrY8af6FE6}|U({^fZRoYJ7KbW>tdvC$8(fhHetE*Fw z(RS*9ezcu>7i2cjPe6V{-2>L!NWYLq+o?tk+D^^vN!zKfq0Y_p7pP%#y$r^6Lg+s_ z3Gt%PA3q?(OG3Z9Oo*3-eyAEe4o>LA3-OB39Xvw3D)g{yA^s_JS#>_rb`k1*P3X$# zmDhz{iK+Gt^yy;wBcXd(LcECsZaal|OX#mL0lqDCF6{6OlrnMx*}&#oWCNR)kPW0k zl%Yf8$OaruHgKy4*}zDIyY+!|vH=()Y~YOovVjkh$OewzK{jyrRM6Qy?{+}7LRfGP=dBUGI6)Oi$;6E}$J_H+RZ zNYADs^)=)*^ik-_)GK;Z-F`z^IFWJ&1!ufWxdOAGtqU1%{@xZWG6rL%+9u534g@@$H4B!hC9+rtvf5xXp!1?kktW7d5Qh0&9!v*{~;X1NYEbt}5 z4diIFG2=4fCi2}Cz+VzBl!vJPUlVREcR`;S-w-a6M_>pUR|$8LQ*wa6C)`aA+y(pt z;hwSyG@0=e)vb?oY64%Q@c!};)%nIy;9|MxPT-p}frrUD7||KGHUp26%jN?AN$JO_ ze0Y@%VLS~oNxg)w%`liuRSk)H90!cJ#gDh7kF?nTRbqBIS?SfHfD1&OST0NQxVl!E%epvvLZVW}TN7O;; zuM8$zRb#B#Gqf=uF+0?oBS5l@?I63=br^6)w(%;+J~bHALPp5A3UWwoE(6IkV%pPc zp=3QsRigmpxOxi)myvJu0(n+l#xTsNW=sV+p>Ey_Qq$N3a#9r#sb#zha!NH_2-41= zQ{|`C+tWZg8}wx9jCu_&HKU7R!|u+ibqztf8FfLytK6vXVs!O>R?XnrGqD4nh6lqg`%jxBT>=N(G*HO|DVwR z><)zTDLyiVNHjSYFMYoRg}y*J$rd6}G`2Ykee~K>`bea;8)kP9fKa@A=8by%}-WJ6-jeOz8NA>1K zqIfdU+fuS5dg-TJx%Cjwhuq0{Z%Y`JaTi5zLF37sZ;NI*w-2{DxL;IB%aF&mFpmqoa92|Kan)T)hRXgua}T;;nTAB zQi3$FV0Fw^iDu^HEg5XMs>!bODf&Kdkf zR!72KSq*ETtS*F;<@pj|KK*ISVermbJt-XDdw8KLNN=i8p!-Bf%T66ZWzoZ*?8vEH z9P0=zya$1LU^A-g1^7%H5NZpb;|Z-AI792mJTTvO+K!0zlsU!| z+H{)IF6fUSehW>=I(vY(VB$d9@CZo)H~xr3RdV+s;*qwQfE!W)x9&x#FkeC|Lfc48 zOmb*v0E?iAxLuSfD(*4D9ua6gb#OCFufL)>8!6FmJOCLtqqj2_j8lTP?{6+CpgW}i&V{1>Fs)U6rq<&k^V|vyUxHbQ}`$& zuU!`rI!W@E0(TanR|qdR95<>PdX>lu+$EB5%FK5#b0hqLa_)-W*O+oL^1Qx|6cC5D zrMNG1(HJ^I*dy!WC&bUJyz&+`^j#`5S=LZ;A4aiqS@RaNGT#&D+LCLO&Qb{nYvw4L7 z0ABeV>=YY9=8s2_{K|UhojW8Jt2<6>V07iQrYER!5UQHf#^RAUjBs1Rh8#_pkCT~l z0^uSGcgYgM?Fn15lyC>aZaJH9N5V03KH*M;r3l{~ie}_AqX)TF>7~J(LfRmzas@V+ z)0t`{!bAI_UOC0bL8>gU5I&fm=T<48Bts}PvfXwHh^vpLlW_Xt8S_jL3{Au;FeYd6 zwL4H~Tq!b^gpdR`6H|bv61L=1%YbJP_Qubz%!|!PIApb;Cm=dfB6-h zY|bpg#qxXHPv*>~^uy#RN;8M>4*A(8;JJh^JG18kmyufW{2E;?a^?{!F!%v$&Z1oi z!ozHOz?!p|NE3q}u;wfwQfTl4)|{n8S{wX;HRoO;c;-zHSaX&U>0~%`95CkrnoRHj zoX!L0JV^G@&E+(j39`~cjeEMBw}ykPBGSv{^u7;d4Uyh1=O1%G))KkX<=kouvVkVk zJ}#%E2FOMt{qYG}dpN6{Z6T0hF6SV|TF!PNqg)QX9g?$)PQH&rIk;=c zIZ_dITk3N5KL+w7C0lAa1(+dno}xmRTh88MkmE$|x11G)AWu`W6_!)F59FWZD^^=h zl{O%+)6^Y~aoX$zd4rPW$2egO^PJOJD5oICss0GanFb(DVw^u4fV@YdXXCXRvOCh$ z?S@0OD<30lNhF37{4J7d0n>lxG$qrB;#5WDp@qWSGX%H%6X^X+Gf)R`?Rj)SPWJsM zEO$43ZciVZj}UzVS3{r1)zmwaXtth@mgB*}vIlUeGWV&fyco*E_gTU*@=x@C?sJ5t+}IrW1!}EF_LvHMf^e*C3&)lFBH=iB zmE^n}0`|%nAMi;Uf|%p6WXL^DX;Ng9J-}}fPL(h11%8`wnygU^_zdBI+yx`deJ2DQ zlo#MabI%galmpPSx$hGW$u1j!Bi~h$-xUEzKC2`*!W44(0e_x+CkXrn8FRiouYvh^ zR)PExR-DTZP3p)#aP_(T(4?+BeGr%*n$(kJu<%@dXi{H(Fbwz`lG8xG04vV@mg>+% z&cS?`%MVQorMU>0AC$C^rv?G@gOZjquOje|7SgwpsTe4^{Gg<@Jcq?pE0P~oVjtl**i>q)dVD-_gP1&cU&L|95YV24ud2aJzyY{6n#7^w*r%? zYItvu$ODQ}RXiEQW&tzR#0-#1Ozu`6%meW;xktU=2JthQrD|c?%}p`L49nD7GU_@U zvqB`zMT;9FJUVg$?NFu6U=up|AbZ>i8)!-z5b`%PCD@FxCEaDf%?W$t6vFK6lVvAZ zRImkUAVvP;Az)sW28H<{25Ybt6%%k^y+y$`bV5Q-MqE8pH~9uXoQf@QZcZn7oq7A(tA4Et(v^3) zQ`8U`RInQh3#wY^@ZcTXt*sRww(8D#ij)ub8|=ZPCm%Qn_TpzO#fr}g_2q5*VT#WR z^CH%E=?1tD!RsU!Q47NwbCfc~PNWPkz*!i24wk<7+}e1IHfs|3 z*TCT(Sk+ng*Y5+fsJH;Z4^UU&<_4B;J;>c6hb{+RLD(Zl!;Gwl=q}VN^OJyA5>AkJ zp<31|!ilmv%*9$wI7xOa23|urSsq*jyq0hUVK!d_^6>MhVZ~E3u-db%$p(G+j2~!N zC9HL!+_jNvYV?7|{*54!Fy5EG=l+ZtAnu?71>6`$Yj3 zIm4K5*^OF*MGi4mv+T7nd22nVEU;_`!^zsfQkq!y{VTz?8CYD4Ld$MVowbW=)!MTE z)e3AMv$ptFF8qOYz@QUzMV9R+-5xQh>nEWu82i>yE@7c%e@HEOBI36!d-}a#PcnPR zvX5)9rB2B!_?0{we21B>rXLiW4w{HbI$2B`* z*|iJ6KIXV%mi-R3?=vp_xMe?47wjUlXD$22qhOyiJ7L+o?f|>QH9Kk9*BgReW_HT5 z+q%KNWOmxJD`kS+WK%t3*&if=-Qv>ETK1(pFdsi5d*8AT^a9gnBN+HOI+9EyKF)d) zS`K#KPv`6_=l4Tg`jCi zt6a1t5-}YP!CU!`=P2UZP(*a+PlHH$=b>_sn_XzBa~E7k<(`xQr#9xJPrQ};{P6D# zeQ(RqFOq>yq*lHwnxO^^*i*SgVcjB)L5ScR0U_gC0#D0EuqEQ@C$i}i-8iD;IX8O> zVT4D%g1s93Etbo8>VdvAbTL|M>Uo37i~S30CQE-uUQGXu0gAtq0Be&vxDCbXb(q>> z^&;49oc5*(^d4_7|wZm z2ylU(i)&5&2(GpC)40~wyO6hzPU}R^m>SHYXH0V;p}yXTYXiM9o}MusoPwPJq1(?C z^!%tl>WJq@W04Whj}9OOo*%u9!twmbsL9Wdz6ZneqxhrPMZll*#SfkzwZjj-$?$L; zA>I-CN&LKv7x*ChJ)z$RJBw#hkomsQ*TFszdUX#WJ{0BOz;wxGWG1L0Cd5vT);ND6<|6hX2_2^4sRq>J=UIE)zn29fkKc!yDl_?EH-QVyYz@Xz$|T}dt` ze4WxDZ#wX=gbi735AaRGn8hU4fZ6j=eT-WH19R3N@ z#*1)0UNs2y9UNu2zA*w3mI&>FEP|0CL_Pz)f-?E;${`7jjMe{^(D-%TTtOLRDUeT-&1Zu08~^Ju2^mT#!ej^5}SWcn6bYb;mJ~olI=?EUYNJi%E(a zN!IlklOUgC3h!o;N$*vJA7>m=bfP=Fhbt52SBb-WdD7UeMy4PpGJEb(bk;k(pJVo^ z-(o=yu&+O$I%AN84>CEZW@2E44>38U9$x@*n8{&vbUMfpCP!2^>hYsYj;d87K#nmv zrm{%Ck*W6ywG8t_I5P7-sgA)Q!;y*iDK*IgInH^GtAD`m!%s7LTHOol4L`%=8AYFG z2>*l0KU8mOLge_(vx+{}5RM$bc~0Gg7YaYm$(~m?DbLGHUQla-ASaoeP-{DbylP}; zz;&qsq}_iS^firBYBbC}e9EAYd3>Zi9+1}z`ijRbd-*VsH;m@!>tt+WS_Yn>6Q&(C zY-5s%b}i>P&DEhI3_pCqSV*=(XG+4Ka^XVthCdB|#w!g=bqj!e#W6Tx-2#I>{Ix-H ze0$;UJ>egWr$GFphl}t}Jh4Y!`Uzj-ES5+x;3dL88!sbOoV5biiie<(6|V4aM(l7D zO~FoCXVnQY!w(a@Q2~QIa#7=u^mM40w75} zR2jrzlB_n?1u>aaP-{?FIP(3ZifVC75X+ zyudlTe^-zSCXLNx!(O=>Oqp~ue8RN-MPN3w)22PSF_@3fke)N`2H9XKT#JuPdm}d8 z!l}$YHfRp;`)GwsII z=o&2LhG~CKaRtn7n)a4%U^SWDGVQ%tV6|AvpQioVY_QrK_m^ouy&kNNNn4eFoA!82 zt>L;Rz5S5svd6<%!u2>`q08=81FSyh!|MTKYk@T|X$uRl2h1%5Yshg6U3N|C+(yh6 zx$G%PU`?1UcG-7fY6v$o$$XZ&?CCU^A_tw8yX=BT!CG<3`(5_+WnitDJ%9~VvRK;p zh)#gMIQR%pc%y45!t&_|et0W?CdW!n7WwU4!_P%1MoWIl@X2s>QBF?wF^E1C;aHfU zDMt7y7yZcuy&f(>=r?xIRFek{oBCA@441C!rm1GtIGWy?U^vI<_hAcCpTsEi=zV!K zy?G!uPXFSf>FswoH?RH(!yrLFzl5f@2_0y93pGO%w3S0kr+s^9>9hvvl|}%TPIHdZ z@t@v3Fwk^=i~zr0J_g$bdYVMzh1nR6xk^e3>KSLHf!*9txQ5{;1Q5* z#yyA$t4rHJwi{bP^3^pImiMUf4-opSE&aKGz>I7(H(8xSROHK%_AQBOM7|u!*pl>? zVREHi2&QlLK8B>e^_bFwc`J-|kfkPI$(HvJe>qU7nplA5tz=@Ub(tWmn0Qo`g&?b$ zc=-rt-Wn#!e2zVDEfbqhZRS19Bt=w%Hc%!N!_Rf8yYn z^5kAdBn%npyZ>?4JWBKgF7&@V=cf=IXYE2rMoQi;BXtzIl0JT!_n5(@`b)+R5qZ0# zABO9S)OnBdQp2M<-2<|RiC6W9&E)OnKOd8f&&v)KdHc8*D~JU0NO}8>7g0vwo+WsA z<$kjOwjy7}IC1k{D2}=f9WC7N(wu+?y;yU&-&>mrGv;p#y5Fbpd`Yi{xj!IWP14<_ z`$NLj<$F7UKO$U1(%S-V-XkrL&%=D&7wCa8zEQXfnBR!1!~2tN-Y>1o`=aiPl(!!5 zi@HB2T%Y%Q-Cq!HAdBEm+`LEHP-m+YV(_-om2oL++BxBe^rXX?Jndz;}kv~ zEZi-aj8_$hg0x~XL48ANZo_1vs*noOmdPYldpk%GlgX+Ke#zaQ$rQB*BgNf;Nr{Rj zU36qJRdv94aChS4ywgPX>~`pEcQJouP?w-@@qIL04eiH7hp!CLDTrd&3A<4o15aN8 zgK%e?^w(8XI0K^c*yRfK4m_K?DicH9hivYACMLU2cQq#Tz88th#GfUdhxM-hVJsCH z3qNV-jgOH3Jcg@Fzlp1*zrxk6UtdoC^SM0opFQA{JbDbSv3ee^ae5uD@wye}39oKY zf&6E0Tod(FT$A)lT$A-7Tr23eaIL7n!&T`e+sJ>8Eg=8709T*hh^t>8#Wh904ELI< zzrZz38yMjMeE}vE)cesbjvl{^j!!PbHA6Q|Lu0g>k4ETfxMu0MpxS<_cWxbweQ{8JT-MoH{o18rT^CCJv8A8f@oeU$YrmNvvUDqB)$0rYUq+8q1 zvgp>-*H_AitgB#_8 z6ZuB@G=6ZS{84SbQLZQj7cLkjVk(9goJ8(Z^XFG8*QRe-C?Z_aIYxWJKNSMcH6TVLOsxYvpKt!~Mi~ZAwY2mJ7$y7n!;FHowJYSm z&{5TJd>;c$m@_m;_Dy6C?1Zw5s;BrSAx*EnFu1fx`qArw1Dsx#L5I~@jw!!IO{%jT zmwYM=oI&H)l2sFcGYPxp064emSv1{we+<7ateB_dd^;?NtO?61kNRF%N=ci z!<08g&Y?6_2&c*`&_?w2d+-ok)QPhu0c3mt_%Se z5YCW;S_0R44LDQQM*mc=O<2q4+5y)goF&r^0@tPV*|KsBa6Q5y*%W3}y*}X_nUxRR zkZ`W7*A}=D;mUF$mDQMVSk8oPRBuAKid>IQsNR%to;>*waC5>{Wq0`Q>V<^!YXT@{@w`5GY>il>Qx1m3%rz!KC01Z7WIBR^jZyWg^*3g0k@#khAeIf z-12_PDQ`Ut%r&&+$47y=hHiNs7E+@PrH{db;?W@ODnn-AWB`I|bhtwD6BZ!26QvQd z_h8`85&2I+t2Me1Hsw}mrbbu7F8O^5aCgF%yceUOMh|MWTi!?j?n@YD&4!uQ7_@}S zTCx=OP>@zS8S+z#j?w)dN%Rk|7B581HYyiAzLFHelKA+zK`>EM$H`Qk+E;V~oorOG& z38Q8o3dTdF&r!_tfIP28uK3R4^gJXPumIt~KSp5UwQ3If8BR(*3WKdVlsXgL)gO2m z<+tP(!ovxBj93T_FhxB%y_#ge;+i5Eil!2#|!{Ly;y@lMs3k5JVIse5e=!QHn@cKM@-$ z3M!ukMJbAairBC>ME$?-nR_>j==1yMd3H1JoHJ);&YU@OW^P%gYn$g5AU%aVb<7ti z=Vqp(%(_fZWfP*!i&&3RrZZjFTo02;nL(a7(+}^PGLz|gW^Ny(XE9yhTmlnFDPlU_ zd=G}1Qf!oP^2NhSQc9TL)cigV>Df%<#nzyvlrr7iT(J)6IZU@O69yqYm+6+~o$x0q z^VsHA=2K-zFJKx0C;PaNJjrGm`?!d@N;9{uMS2PI+nK+>8Kf+&g<9I14a$*TmWXr* z^X`14Z)LipdGIczmouGVe#-W*Ab%&b$7-Z+V}7RjgBR(QOm{XfQU2{rXPNynkY2_1 zbTK0_P$_rN!T8KSZ$bJ_rn{QPLrC9cfWMnL$Afe^+m>sty$$KRQ<0w+SG_ONYnb1| zh^spvU@Z&h7;&Q(IiRNz_i7Hne|#v?%ZU3G&Lm|W!6YND=MaF61j~)MB!W!@Ta36< zRNsFIUNYidB6yPEyb<@yc7W%^z+7=O{*>nlaIcp62*4o%+^cm5rcufZ1h`l0D}omZ z@J52EEb|fpUNvwOvn1s(L6j@*O@fyRVqI}RbMTK)N%5|@V{j@dM+p*Kao_I+c$Fa0 z6*puUz-t5zTyd|q0(hOEp(}2^0dS1kY2=EV90Ksa0(2qC6<3NFB;}1U0JvpmL3@BV zX9ASE;)av$ErJSH+*0=E?OOm2x#I3eY?5+(1HiYgxKW&+C!U4q8t%BA`vBe}h;qlh zULD|lb|Ky!H>Wqi>4PZK&>eTYAHW$lC(Ru<>~Vk(2)ypNE42YWVyoM_}f7M3CkKt+Y!3pS`Nlz$fPGa7$Gr@DK!Yw3;7%zsptg`j?=2M1*}WtS67(26pVuw z(r2h&uEbAep^1S5yy(yM55-PX4w%unsGX*QhV z^kwK&M|Mp!bD+i445oGSM<_A16VrxysTR_iOuNi}Sd&s^Rd$;lU<9eMDuq?vER^xCvIfwH))auF4@Y56F4 z>Rv$GGScc)l!E8#9#~uyRjrwG;r!B~nRc6pFg?;@m<}@^>xgt+rmLDAQ7A2z=^Ez2 z5lF`|?J*C)k*C#TI?BA4a_Tc3YtF`ZT0GP7W*B@>S_0Dz%|nBcPGmaCe61JK4VZ3W zeu_mPts&FN=BJ~PmbEj@^wdOJqP=#SaqL!rCTG}}j}hfGOlvwEF2sDYF|wOeKbrYF z^pMtqY2Eyy8qzJ9HcVfCq$S#OnKxk}N^4Esy3L>4BAv{~HSs1qIM=ikcs2BK6Xr`= zD%;~RJ7ZkZ+Atku{*Zul8fC_sFT#G(yiCWLw_uFYB=W0gZic%^lgJMb+>A!L9qWq6 zuRg%A(%SQh^14sefwZ)a53~J=)QLoX_@M!|QzAdz9Q+{CnRFpxW^L-cGuwc72fw@? zAZriGhP(M}Y~8~N5aWHKHVo1HwFBJ8e_5kueuI{HpJZA$SItBE0Mmx~A;JOgQ%t)| zL;#xiAk%KM42!e(X{JNWnQ%tlXP8E`lux10KEb*UEYh?g-WRsAt}o#6yf2YQGhbee z^kJrTGkPh~FO$VEr=e}$SD0U5eg@0*9$~tl`F1|iN15(#9)wYQUuAlLSu+`Faoq#W zpGG1ro_mm)cN@~;xCbkr#9uv@x!zYZ_KpJay#(acy>AyBxc8T#Fgo*j%n3D~DrRv9r2k|(+|*%7-oKcRusT&Bt?2|+ zt+iM)yt;r$D-t&8H3U?%3Sp~Wmw@Wl-LQ0TsDK*Qm2Lp0F1BTr!Ct*#0-~&nLVzl| zSeLbhqQeEmS-TnnM2LWTR_jE7ssid;|7{OYO+Sz3#9J>AR2R_Dx{?A=LqL)h!XDQY z(86j6L-$%bEi2i2+6CYd(9T+w18{?YEbCr^+5&o5jp7072*|Ti2%-cGw!X;)h?eFQ zTBjNS#0VH|Jxp_|D`1Qk**F#`M}Gl>RQvaAOkZzp<3)^;JnQX^mb7MN4x|8s+HqUw z;eEYz1%z3{Xh^XFs#=FJiM)*rjzSIVCn~XtaU8-tYW-nSYy;~HRdb;dM=mG_cT;0L zvTEP39p>O|VN_Yb^WfDWv=W(cwT}%4N;WQot-*}FXpQ%(@iN#Feh5XGgfZ=4+zDJe z+zD0&j3?n>U(}g!ISB)i;9G|90DF3$hId{iBqrmZkx&j%W$uKl)9^1WVNeYI)kx?A zr&$)C@OyRqLy1eX@E=9K2;+YvA%$cVn(F6&Fw|+y1URa|QzH?Uum}?ai5dyb&=@4* zwc1ya8tm=p?plU!jiBLoa#K~BH7ye$)2-CIn;PvbAk5lV10YM-s#-J9J8u^Ok=F0D z1D}9uR1C^t2l60+=qKm-V6!P$VGN`mz9^ zSU_*(|*!*c*`cb|u_s#e{d0ILKfSqC{1cL?ZaUF{5Tr<5tQ7PC34 zMXTeiXQ-6B+}}aKM5_m;l($^KG%KIrZUH4$stK@0q?K9EYz9~>pu*ZR72rPt4p`}f z0M-e3*P7TD;2x>;Tg$o|;9fUf`*)U`v+F)-!H?FHw!yW2~wKr&U|5 z-UMeuDO`Wj7yF#Lo||2KYf_yRH8r9`gR- zjzpO-t4bumpQ4?r)|Ms!T8M;1R=q9&x&V)Lu^WIPAj%rQ8^9H!*3@I80o)<%a-4M^ z2g?*nJ?k`Lb#ItZ>RY{Fsop9A;;kER1gI|{!5YL4C5Y&TR$@9p1EC~YPi6x&5=sl} zW4gj7LP@qhodVEQK#Ik;LwK7DNVQtQse4-pXk&#ScK5atkY+W#0id-2uT_gZO%~AB zdVU;0ihy*he-(gK0qv~I+W^`KXm7Q;2f!1$-gW{qtO^QfFQAjv zk`tq&fJ`f*B|wIN&Q>>4I*F>XtjipQOaWc2)^tQ!0(@3leSj{agKpMtiuQ?s9#$IN zXEy;kRv2Ajwt$}2=Ty931oW~R+yu}^D7n^jjJdZUghr8PHQx#_AcRMg{jCoD00xE7 zbOu{L>;f1fV7PUBHo!1pE422&guNpKjI;JP2N)$_qV*uhXS9GRmPz%F6)@de>jAh? zK#|pQ0>F4_Td6e#tG9Pj$P!dK-|99EU~;br0zzQpg_BK_( zDrt0sF1a+ST5kd)@=y@D@4GP*2|oYw+ZEd zbwd`wN&!zNSUXtZwT%b@QhW#xxG4s(dr@VOE&Z_0Y|N02+9S# zWu2jR?iO&;TCxvdjR-hrO=tqJR={~{FPH282)JOaCfhn`!N*qfXn=c!@`-i#PJnv_ zd}=M@+`do1MeD?E0PDrbFIkz0?7a7jfUm62NU0FYw^k9|`U67wQ3c!^q;0=?B;ejC z0G_-VhkKJ0g701y2K1nms;Yb1leSrCxEE*xX%7j_qk9sY0X-~jx9*cp#3*n`f zVjCtu(AtH19&QeFC4}4J z(oj#EyMTU|KAa2n4BQ6vm!R{Zo)pFwp`pAGcp=m?w+4_I%4PPGP){mR-B3EgOQD`4 zxj?akz6$l6p`FDE`Zm<_-2kALpTOi9YeXY&x-KeLT{8Iw4w;l zd(=xODOVifX|xt7Q)nfiqZEl3; z0Bxz8pm`CV>G?p}g62nfk`sXZf)?PF3O4|C59RDw7~z?~+Ixu1MG>AN){rBpEW&ey zz3nMzaRg3t=;ZLK4sz6}<8U{3u94ZCWTl}KpwI@5dLy1| zyH@9RETR1}4c|R2WF`F1&mHSWSWaCDFQszd`aX0Pl5hxfIW*xRjER|W75QNa{UN7H z!fmi#ysIBJ6_HRU0s(eH*bvl}a1R7mOLz;^>Ir$!GY+HEG9?<}Sh z3DXVa3Rn7UrW?u?uJlr-8_89z^f^p7HrLKU*?D}2MH6$=Sfm&5A--g@D*BsV z#v2&ZwAc+;x6VbTuYc?=^!ShaL8%zp1x+&BV^GpJa!8`&4H)U0ctcaHxgH~szM1KI z<{(Ut^es%so8Hw(Z)G~sjAG5(m~Ln`FG6}d(~ZrFP^2Gih;))^QH#6yj+qvw7rTq} zJzILRbxUR;y^lReGn=ya`e3Dnk8%V)A*4T}I{oI8oshnK0_mYXRix~DHKGhS|P zD#h*z^`<8XnxlJa4gpFOG#Bd}JV1IwLGyHvRt%IO2Xymw&&4f3odhk=J*Qbirl5u3 z5P9Gv@ zD^?*d&@gppJ63Mm+6X-h2DVf8oZkyHQhx$|LNh!(;7p$+TUlB0Ul8gL z(bF(F*G76qVoIbR6|^bR^AKxzTitb!`fda|tCvRM0fI=+W*kkWpBF71jr9CTYrP=% zxgCr2q{IMyEc*N)(zBJL`Ki?RAuc#wK{sg%;uEj`w$xqfG=v}yyBsY-a_vh@LFq`v ztx9vWf=b(E@R$r7Aji((bUKXc-b!d2>?L zpYWx%nt}Mt^(Y^mbX9=Vny*7tSWA8aUc@~~UOMf11;msoFkNIw`b!kIiIC6d9FqsZ zD~05__|%r`3-aHUEg5`44_@Vix$fF4HHF@dn&h|7_wwgAwA3aO(bR9E=uY)E`>?tg zO%44vaHa4@dH{x>DKEeiAT9YPAR1{t-jenfyp+-0ptDTtho!-2A@6_mDv&IoEpMSV zQjD#r!kaGjrSkazcp>;Ns)$eGv>!GW#qV!KF8%XB{r5ML`gdcE0Fl~D*$5*-8r5rQ zcZ@;$fkxy{>w>7#*wBbKtEGL8d0}j9^b^vM|0=lfnyx~A^AWuciY1*pChQrphFu}Cwz z2~o+Zm>+v%F|a0(47?P+)y zV~gs*nnI+vrmzXrCZ81Pc%~nDu-uYwH{o3{j6oEFc!~|-A9#G3GtVNm^BM+|_ z26`s;9V_#p0kE$YSO?Y9wXS-e>jym#vg)wrvEm^?(>N}A#XajBSz|?3Pn6Bzvw1e> zYGUcpSn1JT)-?~pjT=SMXT(Vu6&u%rYsx%=FJrvWbBOtTpD{u3TwwNkqM)Nd-NsIZ z)his9`81X{<7S=B`VmAQX0TQ&-6$}^ws+O@^ zgIyAJToHAc7}QKr*H!5v?r+fiSUa>ekb4QtR8i5P5UqP-I};h9&{>0Hm~dGGvmk$Q z9mhgyOC6gLo2VgJT!$9I7w}|=g)FW^3poVbO{VjbIvh^u00wR>t;1<@o(+1o5O|s3 z5YFpi_XFQr#|`GRPFS+-bdS$ap|Pb7hf~J%QKbyMt<%Wc(Ce(yLEw5M&`4AOMVtvV z@)2od3hGg2{D?G?W_*Ips21hxjuQCe^nw}Ri{5N)Dio#*P%v{g!cwD#a84)YEAWk) zQT%;~JAwV^nD!bP*B%8pL?y`cAnzRV3M9`SI}m*FAp9;p$;VjQ>=@Bahy}8~0MSSe zvdY83MmVYA6M;6SN=ZG`X=58{V|`$MI7G3H9|pCtHuBiU zUsM~7Vy8L2L{P48WcIB$qtd}qAZn0_rWK%RUBti!i@VVCy70$}z{Anh^K--)hepwt zyQg2OvQf(}Ujlle$QUj%9%uJNMxn^)0nr)Te8NTAcy>qRj1f7jfqgYlG%z`){B3e< zYXwzK-46+i1F9S-b-lXYscW&+^%(1#wnI2+pKk;Al%;ra6t@81ux>GjC8GKon4_vK zOQkKHiN!pYNljykrR}#yvF(eAKN<`9%cEE~=eU{=E23E68^C@VI1P3V7+?>s*+*+? z{&-|kyK5v9rV>U|nGN=2P}udILV<6XDBah5Ss>JgukWfCzyy(Ll*)h>BR|}&HHOEy z1S2y}iSlERt5?*++*8UwB?>u@24zTxPDzI%(a7%PPZ7cSaH#ogqw=fI!OD$o5*L9* z!#WI+hXW$FiOBX4p>(`W`aB3&>3EyyxRmr`^brc*2ds3yQ*?fiSemp;nsgRerrbfO z=P^`7u8c=z*?_Cuycb)64-7UY$4wpq&l6PKo?f43hoDN-yK}32`z6x z7+8LEVP?My;5G>i2s1%X+t(t1bHrn%CBR0(`^v%`@mdZ(vQV|wn?Tnx9A%Y7v`wHz z%q13&n4Z93U^TH=NV^1Dh=GZkDUn%+1h%swu~=Zo1Wx{;#0+$ej08qJ+lgg%bV}eX zJ54N6o_ZvqI+ox}#p$%90TMIkobnT}ZT@rpmeXjCz3p4dZ z(0vJvaZ13StD&K^(%c77`2DFMmLzb3li7#oUbS4Yj(%cr1$qi?FRTX#V2;++SfJ5v zHAL&0HWP6h7r`Y7s7w1Vg!f@6?t=_^Zew}EV${+13i3{XsP(4peTS@0GAmal(BZkt zk1gzs(Cdx_&Y>^BmwEms6uwhh{0FeV57>&)sN*Qg*31=in1`Asf^wIdC6psgZAp`! z`!FcEd+`M|X`R{7$(pfS8d@KrXXl$7lnUhgfZVFv)S<}9`CFI$nP7SxOhX|J95gJl zU`F~jfb_bQ56)KJ-~#f?rAUFEg>tg;vlh+Y18t+T*eYbK-gFj2kx6H9NL6E$h_it4 z`^SSqXK`9dQ_cdzr1|HA@)zp4tOSW`S%Exy5EFv~FCr_gQQSiF!|;UAq>_;DD!MI6 zI+LpTAwz_96uR=k{$QNJf#8q7y z;vA2r9kI#Y#hS90t)^vvfSGDspgn3}f*ZL5EXs{s5J#5}vrvxif;hUFz{=5G5J$I> z^bOE4q_B!(z&U#{EsRg1_!Os6KG9bXlG{T!UG;t(^a4yC+D&+kRTyDjHRs<%eDsQ& zAH+n7N7mPn)3+TG{OO;5EszMk!tag!yW!g?FC37E|Jfi8Wb5g*2Jrs+naCM1iHu0} z=CTq4k%PGVB_A{dhiLdnpf=DBJ7D30;?KetBeD)CV-Ih>t5}%?EN^g6(DQ`mXqZ;d zWjH8~%a{Hs7UC6ru z#J*1<(F_UA-vVFkNPEx&-M421S82aZ9~?xtI}5Up3lr^!L#)Cs<_w|k`G*lj_p=w( zM;m?;lba$rD<6Ua_*5!#Vc1$G+R~X%wi>_4bIBWkb0n7fRZLRvpCjG>EsAS}tElS6 z%r1RV`brf2=(FIK{<1ph@71VK)X!$LXp(PV!so0M@q zDFdWgC^hJMQXjk2%YjC7TaT92wE^0l8qHqwj}r8X=?`OyO~Ow(gTl3-4dTL# zb<>5DJeSq)=jqzV6Bz&Vq+@_VDnZ?$Iz0cF|-V$yn9Zx3;&nJC_~8gZ?y|2fR!Uyp38}z$^mRE zQ4L%3xKjfex|2agKg}EtEL5nDOZE_vV=vjs$Yf-|A46sT$|YPXMbA5c!o~a!n^GKD z%yU7ZweSa&={TIoUsic4>t#jYx($hW)KCdlZ+4vIPlL$L>Rp1>dm-oy1+EAk4ZIg~ zex+T=+9s8$SfB*UcOrUxHzsHkA>?6X;02J!8oJobP*R?&8N%!?jKb{ai)cb@qe-LLihxXZ%ya_Z)=o2ok!~E_+Fp6@w}8w40;N(Xx6q zOsop;P}VF7k6c?EK!zE{JQbW$BF%y|SHpC}Si6coLCtC`^)}8>`f0M{YU^+7) z7lJQYKKvW7S#1@vcP z=%L>M&bbVN@oWst4fC$Q@-K&C=wHkzu#10rA%^~?J+b(g7h~vOrV@*Pc`1he#}Vvfc@Wtk;YjIg*mt! zhkTj}45kS5T2LtIjfF0GJ{mdm$j?1@e#l&yU7}q?%cWhXLhc-tp@(W*mwv84s`K3m zl6WW)FBUW#{x7#42D%}bzD5z{r-sy3eyX4HQ$y=2Kh@u#3Ra4ERayi$)SspsJ zPnOLjj;tRW%EKpEt#VXgsXT}<9%a`#fw8w>Bj}D|B@>fT+!5ytT^QYwS13X5h<=Ld z=&uOM9ohB_cQo847X^`BC3fTpcQo0iuf2v|fe8t1!vP%v{TtmtN1HedZZaxugD~>)Il>dT4-&J#`=tH;<+uY41Pt*+V*T8)a z6b?gwq4aZ=DCZ?-Fs`Cw%GW^8e)<4`ZX zD|p+WD`*0T*m-R6OwBlM&=m{^R$lBKxujN3x||xkE5aWJ9xh(-guFXL>+$Ij)ZEN< zFWM?$a3T_Je2hPh$lZ3>|0GID7#yZ}8iO869=9va;rReOvNiY)3B^X4!q&ny%wY?y zYqQlwLK_^9ui2n+E{0`sF3z4v6EBX^{0t*`ap-oT%Yi|DH{`*}{e}3?!1935uzg0U zYXeINmV)FI$Yc1)NfEg8kbM=o z##Z(~JA_ffHJN?RAaAY9#i%uC88;zv1{Z0=hzG0_Ob@mkSgl6e>vA>PPAsd@BXzkN zy+SOj(T=*b10E}?)#%Z>T#d#6tJPo#`RJ%+j%t;*uFr!E(tViuJR(B8US zU0x!V)n#8@t}Z_T=QP8-Hy#s@>?(g|k&0FyudAZftP#ght|wYC5g+4d-T1v2#1E0z zEDjmDyps!k)_NnGp8Xe*lLeY@BuJcY&MejZNnm6kI0nr0uX1+N0h#o#^Cc5|<-kDs zL7{(LCluSiGUWA_g2I4phY}=?X({sPbYE8760f<-A72!zLOHUZ3Sx&Mh5gq`cEl+# zLySFq^usne0!rohx7GY$loHLHESjte%ZpRBVOK$Bcl}}LcdZ2YLB&U%l2Zk^^mXWx za4r%C`0pO9p&gi1SO%|RJGNoTHtVpNNU(Q#>yUuY+a_fL&S`_n^)Y03oD+}0WqHQo z_quo->-f;Z4^U1HbgF9E$J#+uGnfFB52uE!Mo&1F+$@%s+z-Q;!8byJYkwME=tq3Z zX2HWy>QP{2$t_}O$;XJrl3T{olD{ApOKufQOKw;XSmLVIv9#oE#1dDf#8Tcx;2hbX zr^apt#!8-Zv@`y<5wcNUkomubfN8M|AFi;p7`r!?#-3RpA2If}u{8FD#A58}u{8F* z#Nt2O#nOL%3Y=4XBjmM@rD}}w{5~{xkdzl38ykuJkr;bSJTm2)7VS3?*#Y~dQPX}i zBs1Tr+^#@lV!s1~5)>b70)c~BtOybxxaO@uEUoq{J8b%Yg6Q`8UY-See%z)%@elNF zpuYz?4;W7i-9BJcmqZvAsV&PTo9VZIV$%FS+vF%z#+XSCDIFP_AJWB!`K$@|3-b=U z>4n3}XvJA7jDyBf!N!@_U)b_o<+!*dhr;asRLNAQtgiB0P4}3Fg(oH(;PiKV>6jB{>qM)7mz8Stha2Y#{a~m zLLVwT`=7~f%r3fyDT?eW+En!)l$F;GY|!v6!WEd>3|x`x=hH~7;8q?MGVBbkRT24c zP_jWeEEFt-`DnWl*2bp$#)0lQg+M7SYXH_~qoLY@7g4~&}JGAlZWS3h*6df~~_hlG;-Sh{c3E)P& zqfl$0%vZ3?7Il>j-**o8IV6;;R#Y`?=ZdNr}My>C^hV9|Ar| zEc1VWoAW;c2WV>k4|H?>4<{DyG|0`}&n{pUFAbKy90DF0fesi$Lwc8K=*W{OP!)$P z#w0giFBsYoIPF2;$?iu`VKnflTfry`2FE~Yy9C1hXs`q%BOwGN1|(Wue`I28izF{F z;?q^G|0Mp8#<;FiMQmwvAnc+|*?S%3M^NUY%xizA&ac5EefZOauMBf{#`_M!-})I!i*iE=2cLebe6=Wut!f&Aw0I)%H(M8ON( z4rb$>pe23Yv(9{eN0#&!uu-*yzawkvU}Bk6@5mB=Kk>u|Mao9haRgW`@$bnJ{{yis z;qS{5UK7!QTJlfIlHZ1SN+HUhk|qCUVwq$Lp9Jp2pS3bh+iUtzwT6EnYxr}GSsZ@H z_)ymHKZ#`ypOrN{xe2hW;UCEwej~A5Ej|~^JHIl)nzjC`&j8*U9Ul5@TRTtB$;O?zaaR&FZ3c>GPH=;~F^-*HN-UB7rZ`6W zPZ5ikcrcEU{+Gn!B{s)#rH^Y4EMDTFIIi>s#Ns6$j-!`YPAuErEpc>mj{@gxTZ#G< zc46Bnw+S-XulBr}`g37!Ex^oJKS}a}XHq**IFo!rarUY(AAe6!I28uka^@g!Ao6G< z(-gPtRpm;>c$=`gk`TDhfb(jKE$pEnVWoDNXDZ96X$Aeuw0c`HyNWoi9=Ex_w7D7L zx=IeAQO9gbRRB%{P;h6)Zfst`fKl*&0S4N?R~W9nI^ilgtahzvjsIsbatAz6NuoL- zD`*GII6oT8*<@i*`;h|V@s_)#lIO%u)cRylSnpn;^rP_vO;b2Td&7*Xhn3m9e(sa$ zrB6F;*eh)alY<@2IMZv<$dCy+(q>~b2Ul4uJ#@P$CI8eeHU`RtRl7&IV z;^&aZko$L61EbNuWqxL(FxHiz$D zIrf8t&7CA1f#wFgO=|l+n{Bl%NFtr2G{>pg0? zyU|3%NH4ubziH$jHPOxELrjz_eF>c5!|B*`dVZXK$%b zKf8oj{OpqY^s}!Ki)US0pPuy#VmaoxwLU%TAH?F$me;2{%WerQ?rTMTy010F;=XRH zPxtj6vAD05_36H%TR~q@5JdO1`z3Ktu3}!RK;y+f9hFSyEUg&q9YCRfx*(Kb|1=*I z`lp|jAPIX`AdhOU4$W|?VK88xLH9wmt|V06^aB61!4}q4=qiTVVGA2xSq8$|Y27b^ zphn5QpE5fKImY`kG#OB&UJ?C@Gc@nZ(DXvr4qUk#bizba@Aui^Jfz?Qzl9Bq9 zSVro!j8t@MU>T`1QofK_M(P6@sWM_2sk1UtYk)h?z;(Wl>hndrXGoTTJ0}D81F;O; zc^SCA$-pvj7i8cz5zD}RECcr)u)j9?$bp;ivKlzK$drUkE-Z^B)4AKV1ndJr;lSN5 z6ldV*7T*JfgLF_)BuG@JL~?>j?UH;ti0oWt!g;0tE6_RamxZowS^L#4V?ynLaWBSD zwS{u89jgB>#ZaZiqk#4!K6=I3BhFBz#d8+5O0kD3EuNENC}4&>m6I0V5cpPLHB@cm zIjQy$%TT4qb5gxYEJM{!%2!DRmZ54N&qWm-7~IK)1=TQ4-6tZ zx-Ww6$AeDYPZl~NdWf89mswI-My83Z*bIap5kfzs*u%ESW{s66Iys=!kIEwY#0L$IJ zQ{sIn)r(lpXr{!|wcQDEc zJ3U$R4+eo&w^I>>}AK_n!_7X{N@MgNVo z%lmBlhG06ZhGg`J=fP~_v)7VG+T=ozd4P6O$o59rRrFRJ+|X;6{4KbotLQ0KEG^q? zGeluV1a-f^EqXV|2J+iml}}WmKjxeA)k*G&Dm=+u z1)RAatD5nC6*>MS7VAD)h1PwD_}N0xPgmj8|AJU<{6AC0hZ_DO7FVEfdRwfOvKD_( zg|1*4usXg~_-SHs&>vQzgZ`aZ7R$3$IJ5euV^+!x{YcuQ_g9Cz=c;gS@kwF1{=$%U z7kX$fPgp8(;Q@C{<5?&_B+7Un6}o-ft*e;hJq{#JolAC6Jb#U%F;euYNX^H&!4-@{ z9oC4#ERSS7~#qNNTFUxaQzo3~)$(Q9ht0*iX+(ds{XCwIA z11S}LSBEMb0-W>04UqeN9ZCv?XT;seO6xz=q1O54J>|E4ln2IE0{g0gi=G;NxaN5j zJV!hVPK6Jw@-G}8z2X7{_svAsMizy`)OgbziB{k%|9BYUNQSE$9TSJ zK;t=tvZ`O-G@$Vq?SbX4r*9f?b?pw!etsu!=${9qo>%z30oQt-`s3W;hX%B>eIRDa zRlOe@a81bV0KEMsa49?rSlPi(!mkg>9Fz*`&mw9Lxfk97{7VD++3mz)Rlhc%RsBXR zR`pv0T2;@EsDW<6jlO-1MKTjV$b@ArKHtSj?p*N?c-=Um z=Nof)1dUTa&0mJ%+#zPDlGu*~3YLPr9%S0wK)YbE>;j8w;KmwISY?qaSow^DF%RVq z+hW&TBUbL%quBRsvD<{K?&0~uE^;Ke2=B;4OIgN%2H2Eys*G8Lw-qEd7^iM#WEcJl zE{Hq+>~h?clUyJ6z^FrdXoQKMqg98rKND(kk%LD~7!7800v4*n2OAPL2C`d9eEnVj1@d@^E*{ z3}6ZWCdvce(}De*Hx;P=yj?%$wJf&WW$37YZ9vy?;$q)yg}ACG%AnhIgdA|l(^ak? zRv=diI@zUpl^|d_-B*ITAN5gWcne;}lxIsHuZ|wxw;FO+Ne^M&=;6nK9kE!NijZinN@!0=}od+#m3!wwp2&^vj&5)9ZfYp>&nBkbjg$gDhrpe45go+eS1Ex!u8A2!5 zozw=XbpDpEMfJfH89r##? zzZUwFgUSBhaq)T>OHBeYE+pSdo_z%x$Jd&Fq^+oM^q*rXkxmgtOr96wRA?;}JnA)u z6GGk3p2hi6Qcv^Wh2orN-Gm7t)~2eOe-ko!DQTQ!7GUj%Wch}*qcuD2I?Gg@wyC&S zYaT3EWmMx(k z<-E@}rt|Ja^~rJSg~mKiodldSbrU3g+_)AdqO1Jgc{x90fQ?TYQ4Vb zrU!SGub7vUnID8#&dcO$t&Ptcb6L3^@^aa{75H>L0pU?B{IfLEResmJoR3=t;kEN} z(I~A2K4;Ov9K8XEzc=PW;wnEmFLOv!;H!-}@Q*;UoH@LTS@s;5In%&HePC+(9*2xe zG68XFxE9%X%<8Ur&IzA3ke;?3KB|t;CV@Jd_eC9M6V~wz>wv@1YBtcdM6~{IbzB4~ z86;jn_*)%t=IFVBhO?olM8%zN zoQlH@g-2vzm^wj^M%^Y<>k8tuuE4QPI1G;g^ENE)Cp0p1)fx~Q3gHA9pG^$lOTfd1 zqr?z2d)PQ9vC>Yc>msu6MT@Dka1AS$6HYtyahG5(*d=sXQO20Qv%dRrC0*B z@`Ll#PGl-7zg6ha+e(g&tS$)UuJR1lje{r|s1m6EVN^$X4+=lF=ru6HuJZfPlD!~R zi25a{#)VLtY}TjE(cQ^>Tu=VE^5_*gr<{o}xd|u2?@)xA2$P%0!CDt6DnAJ&r%1_k z;{7J@&7$$C#4=H)HsM5B51hl_lQ*Wxi0K0}`JxqLx){Klho&Pfo(rd9~^ax#leDO>?OtQ3r5Q@1#Y9d<(N zeH5uR5Tfp|I43piL7~oaAN@IL@&AB*^lkLbFo+<#F>#j!A{HISK*vDqd;-#ftWz$Q zbMoUx1#r+hPYMUj>s>YV#X?=h2vFo94qDVzCFGxKlG~_hr7dALV(7=kO668~$4WVf zVy2kuzA`kALOEH)MD12r!+O69Z8EYjx-dC|#yIB##~8DcXpH=kX|=*;C2@ttZ-{D{ zx{t0&^h;}qZ{7ghEs1{X2=U`|57|kS{UI?mYWR~D0sl@ci)!~I zE~?Slz%%LRdL%6ay%Vt*cTN(Gdo(aZ`rIT=qBTIh&mr;hX|OFDf?~&$=!KpKL0R=X zN%TTEm{Mzj14sHlKsNO_9!0soD#!jD(|oBe)4Y7Rx(|aKYl1k`J-0z@R5MROVxT_W z3$aU>apfbP?jCN!*U+ZWLx(R#6fgJjs$)Oil5t8(SjdmDk z*is0^oy3d?o=09CmFFt@wu-vFm>a8f$#j-<^|}EJf!v_VHs%XGsEva$VA@2Li<1bc zg*QAugX|NiWxlG#2wSBMd(F-pb`A;J)!?eoz@G;S8y*gepcx00J8Y;;@y|qp6SR%6s7dN7`cZYIsy3MMe@|6B zsE32sA$#<7**@O7{{=c;xxf_tT7&nqWDVmte{wh6orL+3^;9gZtG)bcF7%q7PWVA7S-`PR-fUb)psS9&~c!=2&)v>zUfOO-wQlA2BJeCm}^p4 zp5}vGjcW(ns9sruI2$jM;AC?n8c{A%uV{YOX^gum8*_k_$rKK4$|+pCJFrY)vni)= zA+b#1u%?{CYl)AgLTZ(!l(n5$rf_&uPT^;XWeP_$WoOz zjT*6`(06t{)Ngo2DbvBFSIqm!QHocTvI~vuIg^j9dYjU-@ZGUWN$H}bVZ@@OcA}&$ z#G<73qNG#A38PR;ho+SMHL)nEqbSMf2`oy=5GCC}EK150B`qVa&w#UYQ@&v0dtiT6 zG=xg~-R^l9v{Bp6tAgea|v)e<=yx!$UT7K@!;t(1{$CL!g9jxw%Wnz9Was<#O>b8mE8V#&iY3$|z9AT}OEiloC)D{+*I{0TirkYlYw(KIBnp$lYeM&ql8`9a9hXdqncEEgdD! zJ8%myZ~jaX+jedjD}s>hv89kSwJDOaL(wZ%f9x36RGF;5VdygCy?Rrda;ILWH?UmA zo7$A7;{{fece+g8Da0~)XUODTNi36hrcB=Fh~I5he~GaRiAmhmjcb7Qa5gS1!Uptr|YfSd8449PZzlprC4q3I{rTe=F}R zKv~C>s{ASHL5@0H{ep+o;UGU_mN*t9GAMdnS2R2r{hfY zWSPs29woqw3A;$T zz2lcNDvlRNH&!U>P#Fuk46ax5oWaHM_81U0qPD)an9Aq+pbqUIDAQFD`zTD^2wiju zfi)bG#)}V2?Rq#J*CLPeWTP#vI9%+DmvtTn={?AM{(56|D)%Y{Mk|h)ORJkCI8bpP@5)i94l7&g^ z+SwWeS@$XM8?M0Bx``;ESMXLObw=lst95_C9F%ptE-UtUXMwuB`@E?^lhGt7#+nS{Dxeuk3s6D&L~<@>-X}V3cP!Pa&b@9>y2FL#s>I znpt(=cAAfx`xi6oh|sN=>yGxww~FfU@Dx zLng{bqikm3O=xA~DsJTU0MXC$CO(w#Aetdg6t5AHJ)b;?#D@}|5Q@66ngnh>lkjR# z9;a4I49q3TQ|J7!0ejs1jH~#>f`Qtvsle9*lw286=bl82vzGS(zF@wsg+H(~Us1U} zTMBgH3q^TaFQrymu3Duyqoyed%3snm&|j{QOnXXUfzRXoGfK4$*H$-Ftz~*3n|DXNkpF$BMDm=;s*g_-l=o^Us)3pm+QH*u5 z80)Jb28^{2h}YOsz*xr!b|MJqCp_U2G?sXPbIU$>mbjqS<<6CHY(vSEp>nnn2y?qnN15w)ud5KLW_{fOy?ZxsZ80m9dd>LB(d)Z%ZE+|1 zq1?y2a&0kYkTW6Q58>*8>rD$Yw>5yIlOa4}>`(gSNZ?Z;Lz|GkX`y;B@N@_xzar3i zaq)~?Tzpp$FRLg#ZZNbc*N_yR4a~jr2O%88mq@j0L$<>26GuJ}zzv3=Zh4^b!w?1n zuJWY|bKd9z`q_|{QN(vG%>1nm@JAwV5ct(z`&GX~g0x zFNAPiznQpyJJ3H4VVL+evDm~Xa%r>#MO9S$sazWU3s}7r;GjGA+gf~gx4pRq^os*sTv#`vij z_M-lCAU*&IM?s{f1BaEqaP;+YkzF7vzlN%IynJ28RaH=)P8I*k$feHrN}9auKyIhX zy9+H4rL-2Bvnb@Rck<;x#|AEhU?} zkD>%z8dS`vXp?G)tC(+=fd%2br5Q-PD*wtq36NW6C?Eq|9O*N{g)4`5;bmL7c2VO8 zcCX(xb=$Yju5g_Ub_wZyP*V>SO=o6<=r_Je?w&Bn2JOTlmjI>=W=C2ueC zc=f8-E+h|#*h6C5ng25Eo1LlkO=gn&!tG*?AB4HDz&kRN3MfL1jB1>`ZFjt;>QJv@*s~7`7W~AiyxOetXOj_NUUZ3^^(#+;*C2`3CUiR?ALK%$2%G1 zJx@WzAtY!#p9Jw;duBHUv!*8Y<$tP5Drb$q2$UwEL}A6cX2$sM1%+X7s!a*Z&|&*Q zVZ~Zj`XtQGGfi93W#VrsKKOxwpRw36Dh7o|x1BI=GxzlY{!lna5^uz+W}IufAzITG z5cB3?1B>sf>g5c+f<^6~s3;vMUvjg-`n(~4 zsrQDoYsLk6Gq76JIyB>=c8FLOv5w7nz2&zk## zvfHMp%?-SxuM`y9qsweiXK}8gTVMm(<73fmPjj%?%?|z5X||_1o87F?X;$s#Y}Pnp zX;z))Y}PhldGU5JDsS|Qnjb~T^FSm|U%N`4dRAQT$QeayJ)3%?qB^!`zk-4s?9lCy zIVVVFD)Q)&@0L9K%`jxn1%bcruvZB7@i$I;RAv1^-3(EOgG3b~?*Q^n2IXs4-w3)I+Z<71 zz0r;mdx{cA0_XG_1bMxL*T5@i#oTk7)7&?JoSOt0)JZIAQ9H8{&7ETec@6o<=6o&r zYZNW7DOdPIVmVwcY)-TLomgU@(ajnA#G&neBt#k>Bv6mNb7OHGEn-Sxi?G`^GVve2A&8(w>ThxBUbDs@5=2tEbf zVV7_9&vfUwv73;cplH}}lroy&nb4C=6l;ZwEbHMX$l`I$Vq2m*f>do5?*SJe=QZn8 zA=$(hc0eZ2Yo3(M$}^kL1$m)i6$nkr!0^tCxI(NL0>kQG3qm!tx3q z`o)uI*~dL-?eG?8pmq))y(0M!#{h=Q4y4-2Q0!@uceGVZW!^f`3el1E@iHMs=ldYzt-4(|Y{e01U6Upzd-T;%hKI zFJ6VD9@{{;MfeIK$%n2eFHB>e#(@iK1H0LPY;KU>LmBohEFLcgvh%)h@^D+pdaGx9{6y!x|J~qd>KqHRAW#6{&92{46Uw90odn$M|H$HmBLaJ_6 z7s)Ng5X?e@)vBG7%B6?6J6So&Xs&W^e!=gs4E`;|N3V$d6YFr;8r&xU?g1Vo!X_XQ z&m1Ir^Q7_zR3tp{6S06XXABv~kZITyh~b^V-RC3mFSi40H)ev!3p~D_NbtVZfJMw( ziVpM%>ec|XNOh}ED!Y}5N>#V=q+7(QTj)rjTiNI7{tH_|ycUm-Ua=B#x+u@xlAaqs z{1lc1p0O=S83if03FOK8h^fw^J;tn-G!FhL?Y_!pNc=IYCAC?M0$rvQ3MVf}^Ve>c zGy*IQ6!fF8UNQJDr(mfRT!(@gQn0io3qA>)^C&!uF;_|&<+GIm&uhs5;Uvh)kIiq% z0O2pA z(->i-YSjI$cn!7ySheDTR&2#AV)3RMTCo+|iN$+vY(?++A#l!OblBJ=HDPiDqL?qy zN_%+aeg_8B5t=Lrf4>vnA8&W0sZE#VED+_Oq0-G>iuw;x4ko%pIirL_g)4}ArPM-I zO3hoofJ2cv*BPbUBV_x1T$tywHDz?P*CxnLkA#IN!RY8MAvjO1Ri5+1f+ZIEMChuP zRmfw=^P9?3Hvz1*Gpk`VXt_l@aY1)IG8@8sCaO&Fo|}-@0eNZYO}l&PjfiF9Zz8lXB6u&g-7mbY9JG#;lJAqkYxKRU%K5$c25acOjbh9VJMKC#6ItN~rkffJht;EU)?~ zfy(X#Gi|E`d8M}0Mh}>pO=3j{bQlsv+FX*RN#FFN4JF zWXO>}^bX^^C&U@&>}1Z8GAc$QjPA*dFg6fxn~Rb?lF567SR#y^WJVa~RA4dOp2?g! z&5324dnI$`^d**Y%}wUG&H`3lkDIwl@I^klhFHe;s~_ZSdiRcIQ%s6tXaSdlUdidz&$2`(Rez! z8(JW5f4u{?QwSn-=PFrMQybp_lS1we(k9pD#2XSj4zX?nP?J!?ddqU)zzGh(9sfP)4tFye=-P9Aa9+@ z!(DFjVgjDu?UgKSV&x7FdWari<|g(vo1#vD(O`cbC_KbFtHjXf$}>&e*#3H*9IlhB zp%&E4K~Xip8szS{BTaOzg-ua4u%Y*&4Bz0xH{i02qOi;+P*_jlb<(JB)-(4S3VPz( zZ73RQi*uTtNayq|u-g2TCbG?Zgifvm z%}L~;SuUoQ>csp+{v7OPV(G*J5%()_&M)aGw96#o)%Uj;93)sZK26ENzT zn-CD%xC^b|G}_KxuN$m?Um8I7ePYx9fu{Ao3w2zLz)@oyoS^V8_kU@54019{vzhoet0y}-_SSRb3&&l};% z(b(ZoZ>VDB*^-4ge=Lh;a0a6j{^=;e8`XyhS>=@>kG~Xnb5P!`cHZKkyj6DIe}eM3 ziKqYDEqVFsaa~rl0R)D{M{GhMEap{*AJO}ZLQq#@?9&aNn;y2yvDHo)^)MrUaJCNY z9%Jt+x?08Q5q&U6rL~ZpLr87dA>@0K@Ko7lB)G%Wvfhrs_?`^xal|w$y5pakN+)HH zQw6P1i_ytej8K~ZtGRMo_Bj2BB|tmVibo5xiNmpi86Sw`hk(@{=RF7u`C)9hqit*lFYz5wpupKRIr=>8c zF)c)=X&K!m&pAQlz)Z9$qyJ7BhCYZ54lA=0{qXLLu&_Xp+eMqYF1dXMC( z792%hC*-{ply?$&?CQso2jiR~U2WrxN2p`AyeY^;MAR zcNuZpvV4Hf!GgMkhM%yhjx8&H4V!=K@X;&!RL5K&jx0PMrA?Sf+L$7Ik1699pE4VB zFTWnfSMTi**~ux;2nEJ5XADaXV4<$a8o+`Rm|)>$Oi;ihOi;-GkPwG65LHPqaAV5% zXtp?Qxl7rdUkP0lCFiKPIimd(gy@;qLJj;FN0Oag2F!d_{v*iud)zwkq<-G zrb3jHlbzQJ7Fz`;5m@i>(JMZv;mm_7^3Zn*nvm0Y9JnGHac8CvP*z>F5&bH*$7)hU z$`j#z!K@aLYVt(*EMkdntIIR*_Ylu`5ant%;tFyASPXwD+Vp8q_u^60dgT3P=h0#t zBkxvB;7GL4QA0BFc7m^o1cBO|B?Q}Czp_OU)n0uksJsjMsmc=m1IS|leoXS<$2A}3k7Thn zbS3K|YBD|v90}1;=oR1Aaz^A6ITAVzr76$!i5v-qB9_XTIu<1_+DAeY)Uy+xwdAuC zy+Bs4uDsNe@240^EIX3V<;Z9au`K#u$dS=eVi~h9TXIM82QXdLH+%p=OJML6k7n~+ z=AoJ#iR<1_AkRbc^3Ib&S2|2X86IgIQ+Y~F8OY>-d@7kirzspM4u~6l4=nPP7qGa0 zI0fZL30YN8hCKSmc6Jf@@kv=x)K2wYo8DjOct@N(?4n*l`5I`vB3q)$@>T4?ZzjZ5 z{V%}rC2G7~)rge`diWWcY~`b>n7U6l=qg$$6h``Mif)uo;6Mjn$%E-GD*4EfiAO!; z_tEH$Y}?Zc_Q8nx_X@c6ivM`vBc4N676zj4Ye*U3VuDh;F+s^gkq|G|5H--Z z80%9GShg3N4x)ImWk_hbZSge|jp&O;45*L7_aVD~QzYR32YB)SMP$gkO?aolUl1cM zUabwHH25&N`GIrMf*8jO%!gQ(NtHZ%Jy9_Tiul&s##YMny@&#gO?aIQ z!H0eMG;kqGZPXk$3U91sw|@}bxVagUS{e#toa#7}_GY;NU3VTP?fGiL#eMt;V0GX! zO)f}pB$jQR!bgc^mQI%o(ie$kmd=n1(&_N<>Q}dBHsdT^K`dLlS8iO;zk@Gg{=SdWb7nz5NhzUi|#r3YbiKDlLtFvH0i}CXPx~NS!X% zUjBehs)Z{(^>uKjEP&09L3fPyspK6&EH>XUmD|yU!1A;54EZtELE%0QVt&NAQufRD zp>%(axHeqsd?8S0f2s4ifXsm+^9x{kk@AD+-wZJGJ}Vvz1S|>B^!DmJ0}gRTQLe0J zhJb5=6>Xr8Jyb;$rPux2^oksH`4WpXkAN@t169j9xbXD{58?pb@hV3 zB%QnPw1ROc&|2qfsnbrv%8X=5Ygtb}25?;GMCBjvDbp(!#5h_%E@JEB0z@}?*79B9 z)Rl@)NIktkR9pJ@bOvN)z$2)`P{=z3dB(?jCkX8O2J-fUIF6YEP6M3<8gLN_YZ2`J zdnE8W<^F%l|G~0b;csRiMknb(;lJ&jYx!XHGWH`-(pjM@f_jV{)*!3+pF!o+iLI+> zA2vDLZF)U4%8_f74~8MSiXM*8e1C$@JJ3Kg7utd#dZ&e_8b}z3)GJ@Sbm8zv)lz|H!4! z`;MJk{rTI0Cwf76ZSoYF0NACXMH`@ol zTrhI=)oX5B`e#?|FWMMaDl!OyBd~AAaF|&BGf$ zH2IF^r~bHo?2GGvc+dYRE%X}t^ycIt=hNEHFLkx7K)p+Y#{5JV_>?c4{p?cMWKv(b`vu|p)ORZ$ZAHmhm{bQEv zugG;8T>oKkeFsNE{!bL*u*H@2&zh?UG-(otTB9ex_4i>=>|1Sn)hZxKyBf6r&55FF zp1kZfyx@A7uNIWC+c3`yr(<|Xc5-A_L2Z8|kNVHpU->(p%A{{b8Yy3_uG5#%E zK~b8n;1BXeH3O9X`a8g|x8Gw}bqMJAhhQsz<7}2nMaEy=3~Ceq(u@)|epej`Z4YMI z#18QmP&*&XQl;_;qPV~3%ULRUS8&PrE@JCi#LLSo;a(5#iFc1dJ|D(MqTDoWzK3A-Vz-A!gDL(7u2k9xl zT=!;>Quo3vWjFX4I|><%3+Wo_11^no`B$;gTk-O{Sw77+*lZzhiLBK78==8p`aZxi zexSYWYb@(j*|n(h&t&|vS54|lwe%_IyV16JGXE0G`C^il{&+X2ulfIKpE|l0s%j_w zVhBZxY=lOMk*bK*t;xIIjHZ5Ej)<$YGnxrP@r{S17Jv2J?Hy~KI)oP2-$1+ZgkBl& zrzj|Vm>*(KK3K8RXEE?A*88Y8H`;}K(jXt!sev)b=qE2v%?%j?m{5h3W~JVNCrB%7 z9}nCMzm7pH{0=^>)YEVzH~`lPgFN+JSb+NTyJ&{3p9jfGmthZGHY#^uJq7wgRh?u}iZ-AdJ`rkt3pB7crQ%~FnMfn$| zE&d#kOFV$^vOY!ac~q)Qm_Guag`$f-;io{wF9#mCfD^}{!tMSXptNq*_7V_x6a1lD^D&AI(4cwhRK3wA8Z7SsLgj>`NXV~;M zDdH>BM$xJ5yD^qOrS!q; zj0C5yM4wiCkHgGY*jxiW)Pjd;w{mb7;iHg`(+l~`-AYZ|1=>D8zagkbM!eem9w85_ z_FJir4`JZ%^w)cguNF~>hC4w%<7c<{0~qe;vM9A0E?#!Ke zjMk~Qb5%IS#`)c!td?qR6{RGinqL^=cYI*)`*EvM+V11`da{jSf%Jpi>f^U>vSe97 ztyA4}-(&oi<1cetlPre_%PGH9m-2rcz3ue#ixEmG7z#_@4d>B`z5G%{R<<>HX%DDx z;_LbbHMJK(x$GT&zN>GL(?4DT^83a5DX)kanvQIN!xUgLmfa`}JX(;tR%*{jL4A*( zZ?`LHV!!mqSA%@BF!L1DWqxY{)CoV2J6+00Fd@pW^Ye{tqk8H???dR>J=XV^*uJJeDg+8 zQyXuGgkeA5p;67T6UI=>)JpM5a@mNVZ%bsktkjbjk`-Yek5<%7PKRd@%ik$W1YZ$w z8yUhTb496-PwCaLr`N*d8!we;&4-{$sO)7@zrO=*_4s)Lr>akW8*6dZc0R_-Hm+Pi zES?HtPhQsV=d&kQ5ZxyA_j^I^_Vd_A2}*tL!=Uu~`7}i_(ipP%S*Ny_p^*c0I3De( z3hDQ~8z4U?x0;GR^yq z6FZ)0VItm+MZN4kKhLrhBRguPe*Q6#AN2E>%BY_@a~a6@_<5@2HhsmrKsoQ{nUYI+ z>5oCV!_RXem-6Z-Kv`<@v_lDFP=nPGDtA2L}JQVm$XRlaS@FJERa-?+T<%2mFVS7LQpYuU>WEPL~^Mhv-KYAst< zjdHFK3PsSm1T2d+OTp#7Wy_fHf&bFWyvqCW40!Qgi&B=XKvm3i0_K-p;k#-**$Xd` z^2^*NFJa;GE3B*5Lvx?6@pAI4ECNpm)mLp7=GB+`?B&ZYL5r8L_;R;J)Mblnj4TG| z3S_A%OOahGb*Zh?z0xQ}-E~(|vRAr3D+;S*mKC$g6C<78pmZizIz{YoWEYF#BpL+fQ;pM>e^ ztZr~2Lo={mlg;9nc-;&Pw`|#E%Lwdph9I`U2r5|&lD%++X4OC~9V(CGn6xl;&LwRy*47m_g`}VUw zOucfLvhL2aIM-WucP+^ES%I5ilm=5^j+%#cea?U*D)XM&^^|vXscSeq@Z(=R(N?DZ zP0+$MA@y(0njuGeWEpf@T|n6_%Y2c-uLn@&tzK6AebP577U8+$$2HuP!-4ed~p~O>mZ_q6fd3ZKPX*AR^ z)hN4vJlkWITt~HI=z~`KdTk!;OO<5&lAc1ufNZBfYxl;>E5$Dcs3yKDX<7kCwX}|9 zB~Vu2A>qaLHi$lCa|ZC6Xg1RCK)HoIvl&cU*MIJmwNv2ZL~t_b5Mff6Q) z81b`uUxj+?%A`laR8^!?CQ0`%?Ga_lD$XfIP62X{%_SWXihS znzZiq=N0NkP&m1uP&azfnpzDM-n^hDn)9vzFsMyXj3nJ5Qi=pR!FENTnJ0pc4(SBg zYLS1`>t+B1)-~!GtUysFSJobB(;ic;)dgU&XF~*wB>ln{&0(N@z@W{v z$RdNb3km`#r?#p9h<8z*-wMwYs{X{iG9asvP@iBe(!%;IS!7NAaLK&pxs;8UfPfP3 z;?P45K|s)M0$N;&B(@L9XLS?Y>lFa;F4_vuBnUJ^drm8Bgds+N8O;U>Mg@%%=xQ;q z8mZ@np`8Gme2nuc-~63G$c^^!>0M-}x&D*Y0&X>SbB~J?Qp}~+DeEXEiKh~1VkEYc zU*Ryy{MPPy!d4`o)j`nZk_q3b$oQ0t&CsNjM#!3OE&8Z!O?eN-;GeoW1$oz6V6Y{D z>mmf(kTCL(-8fHdyX5G0#LAFR1D|sF@rlhR+a;hNKVkqOVh`|))MqWy&1*3-kVL?$ zXz)zWJTcet{;k_{yoJuWNGi7zuq`s=It)uN+^?WWNxXzCC3DDm7mF}PuUG{o>tvd+ zAxhajRT_5-tu;W5Xk3acUJoJQ_@WLz zy=w_DkO&S4>NP?ZRoYH~HHTsd$e3#%I)j>VQ355&Q;7C7q7DZgk_h$*nxha!K_P66>p2qa`h}rt<=g(G+`)c!E#w;?SWf0#(}M6#-GD zFz4`kWF7MJ2WKb@)-KktZE3N1WF^X$7|hEEIW(& z`+@EfoLMYO@KzAe69Ssrwm=7zs~(>uVn7r@xl82pp~LGwXC6!7Dj1L~5B_+c$CEeP z)KIq5bno%9~G)gj{=DyK@x#q zBysrVn!qPXwl$L-QxYFRvaRW|c_KeRg8M&V%@g}4BuFFpp;tic7pmY@0K6?n9s;~c z2eg-fkNQC+P!2iF!du-C+6fN3Q3J_A4t0M)gOsqD_A zN)#=!I6lOVAVDJn8dnu)GppT&F_Kyurb(g9Gjd`&6wd1^1(?Ut5_NC_nexs??$mUf z!PL}s7Hnd4GjOU`mU-RY>Ft&P?;=L74AZyO4&8H4YvKY!+=7T^EAi+)qcv7e6^*~&!0`sm~U<^=%WI;6odLYS!N;5AO zR)9pQ&>Np}k+dIai8T!m-85qr^G|fTTsh__1Q|^b{7}MSoZweTi>$f#&&(4;!{CV% zY(mPNn+ys&ln{af;q~Hq7^Hnj*cB|6ySrni&vmu7ZbF4}5L)26|8)B|QynLzW5UNc3#6@>KlrPatdzVBdL)@cT|55?V^|1Uv zXQ+)Wkd_7wkkjI9Yp&2#j<+$cxQp(UC`Ij+40+fZX?bw}2mGc$Zkuuh=Ix_gf!OO1 zyHUh*k3{S(NU$pb<*Ut;(bD6yW=q^I<+Nn%pS}SRY9i2ohI@NK@O>l%MS^-!l}8f9dXP{+aIaTD>@%u>Kugaq#}H%QwrYmlu*nz# zRSA@;UPm^7L^9k+-Bt!9GrM@6NC^_69>IC^%eFuVF4rD>-iHLoDw`+r3=#~FU_y+F zBc>5>n$nxCd14=yf+)d9yaHlRs2susvA;xu$^=h)1;oCqa?e`x#QqKmYy>~>3b^Ox z;G=**-PQCFtUv;FEkL?C_5og{+V%#6y2#dU_gWb?vCE`8k& zgsaM(fOjDkaJ7zR&vq&Q1|&q$2YmCyl1MN)0Zpz7knt{e8X%w$Gge!UETi$NdF_V_ zg2tCn;~$Y=0)l#|jN3AT!-7T$)X4Rr+`HJ47icIQVYJX|CO?|6nyaN7O#T6LG8Pe$B};NOSH?NZuFK-&}` z*xY1o@>G2pEXs5}RDc(2(W2ZNoyMA}t;?#+lZV#;#3}oFD>%uVg%}fp&kGtS;Akxj zC2NI2Zjcmjm&uzA3^#ypNO+?efH{TU0&qs51n)q?z~161$c-7*kkQuqz^x1Cbu0O! zt!t=Qud86bW1Msy<%q_>8I>?HMkVBOD;Wc~9D1?P*ix?aNM1xMc1f?R^mZ_P8cCP{ z<;oHlXCJQIkD>*fn&`L6JfGR0@ZLAFuB6`Bv}GHk$sZE!4eT;xA-u$#I()^_&$_Bi-bP`MDQPi zMhU1W_D+lEiTI_XQGzXk@=Jo&PDKp^T&K|M0Zu6twd7(8Y!)rJ6igs*M!OMi9VlEq zR>@JLvP6`C9aRO|$P40~mgdDSa>|(ND*4{5Yrvb`*yT2ZoUXHAyQBL7ZSE-Z9AZD( z;(X6Lfi`^PgoK_r!OchuedKa<6N>?X;yq^a=K6@@jS*;JSsz&gY5)m7LZF0sA&46Q zlEp`elu8D76hxHC#ZiZ#WzHSNew3dPW^A5`du-IFR<>e zFF2G9=BOa|R9vNr>+35(NF$`6rHG*JlWY+@0~*T-DZ2pWc*>n4gF~IY6Ho&b)q|;A zSC8ic*QFk;@3}5H#dUR+eAm@AvaU-`Gy~Vwbr!g;Q3>Ih4Z4+(%dKQY?}xxfo8t*k~8R7m=VV!OJe0@F$8)@Jm6D5fq4uQ37g=Ux^{up{N8( z@nhPqVCaG>!=g@{hh+M8f5H2DR^U4s2oFNc7Lm+aw z0zuFMxrJh(v6PZT$#}f|GeIcWZ{2;Akkd#Ch_E6Hv~(Q09|c*i3_dR)8IE=%vUlZ@ zkTW+wL!wEXK(9r)vz*TmF_{UJPu|@{_&p@Ql@`d#P^wD{fl{8UgUx+%8Ka0t#SeQ3 zbaUCIFU#9O-VY&RMJCX^*{1;OKrI%AD1qvRw@e-Y=_w>{rP+=Kks0+yA%Id=l!cVY zcFABNC2}5%A#y4k=Dn`-2G(D<66SVpC1bLq2YI)> z!=Ru;xLG2m&Jdymt~3z6ISL!dw!a>V`u33elJrJ*2K8VD%$t~J0= zgP;u0Zm`}HM38c~xEsL09VU1Q6t6ekirrF~Oi~VlOqwzvJpRXIA}EI7oXJ!P;zLL> zQHeZ?grgB0O%eN3Bs59zm{&mT8I^lVonZY9a$qBP)+-?PeU*FKnkV)nB(M>1(L^&S zAog=rK%nMFH$f5!>;xwS?Iz$v2lbr*YQjVbz66)UEFk!%pizQvDJsGLQdG1c*L|q- zfRaS;u%I0TJZ-~^UboCY4dly0j}q|DF&Pi$X}FcbiXF2nRMvhHxpAllKh15_S%;zu zB;z?SYw8+=VJYq+IDmv<@y!!qca3$0v-tC(&@tUMA>D{8`8GL0r<1@pk<&h<<`f9J z(qbUbi0D27w+3z?b8CQL)?hQT*(O3xne4hs{$ytxu40(px(XCSPS;s5*^Nq=%|<2U zaw{2=eWj}o-qy(FF{Utis?k*$BEUn^`!0gGOD4>-H!4XV;CR&K`$*W&68wXpQG$O& zQnQvAkHU>TFLLfWEK9kP&_|%FwaZbMs@6w#UU|!`s@9clxLvWS*Nlsi$y-lxNU`X{K@3K;;B)BeMrjF zh*e5K&T@W*NN6We5_$-9wf6aJwH~l|m#P*cpinlE-5st4HGqUUK%nHt36y5-S)oys z%e4ic0VMHCB3zshEfyS?P>j&Eyd19_MXl}NfEfuC^Xcpf0?SE6IWX^<0Y(oayah>l zC9yL|EFt6r2bTCetC(K-5K6y>RDi?jQ^xT$NctsPI3-6+8851BuAVRG?kI27W9NCR zHko3kOnp%zD#0CzQ4DyHGXx@+D-Z-jAaYt5p(_y1X$VBl5Qto^KoAUp$Z3H~fv_TO z4~+V7dD|k?dnKFJO)A|?^mO5;wh%MMou>f?r zSoc{ZOoQx>f+aMP@*iS`n^A4$Il7OYW1+;m-1_hbVs0hmaw{3`!qH_Rf_yGdUYuGj zJo1JbH@Von5@e7T4&qkfm3MFzZ;#2FJBW%mM(_j@2CEj(1FWUi%-TUJU%X)C-P||yethjA@*4$G)eF|uYed$g95tG zzbW(;fVI+tD8VK{V+8m$4DuEO)F`wTphKa&qdu-s0<{h5Cis0ty&r&9goK9yKB7>9 zVlhHDK~PX{6=1KvizK}Ql#u6=Q zVF}pf((SIcGMl9C{?g1wL5jTE7c0~C2{~A5txq9*Gtt{4NrL2Ehw1nXo`2jkm&|0qI^OScKpqK|2XPBxsc2 zX+b*)zNV-I&k5R2@J%Eb`j&a!8pQn=v{!{i{&xJY1#K4q6@;6S_o(O-jRA12K}9gi zbpcr}RR(DX3TlxSV-G5?2zws57Ss($koz+kwql(j!n;14_WTS$U78(}6^8(Flgki@$!iEi&Jc)P0Q_1* zJQskj^bA+S?7ZjAJQp>r#knVMoCUBk!R>;^3Eqwb>pVL-PmFP3p`Wu#Hr%n6I?OQY z5b^ZQc_L7Zro7A50$VcO1!#esA>s$8@hu2=vhq0TbkkxQGc{{W-@G6$oAyZSpl;WOg@F~~L_&kGzKAi{PvJRBsor1O#{2r2o5kT+y956;eLbhYBA&Ze;ij*BM zT1kzUw%39YGAhC7tnOAqF1L~~CalClV`s%hO_6$ld6(+AyoCNaiFG-f_kG~Q4w*oe zdU2ZqSQoRoaGnUuv8~L0Vd*f4XOM93@*03&qO{+JK6* zD52UsM|t$XgV{ya-Ot}NPfXnccMu#<1uxzt$FtH! zHxaog@6C~`hPs`&0 z)nptb@A?%mRwHCF9iH%Z!Lx^otU$fQVYGsHAuH=Jo3b2F3oDgg0}i>kxST-3)`Z|zBz(zanJ%X2#X<|u6Rtx7D*U6y zp5>?n%3c#jkYIFzE+plY#OUm}ZzVXc3gDE)#-yNU65vLK65NG^7uNmrL_RF^c7l%y z{qARPBJxSe%q^NH!l5$Gf2lefqhf@rnK+wKoZi5ZlZue@KEV5tjEJa9@#ha0i-FX-ZMts(@8zZUG!*k=$fb<*^UcLA(fO0Rd^eMMgo|)qBwfSUwN2knE zw2QiweVfEj>5N$(WV~xNFbo!fyMHC9L|VALxI%d4xJ&W&n7r9VYc2SSm0SXK&rJuA zi@v@S39S-@1??o*qo@R`jyE4UMM=VG=y}`QYz%?gC7#>OBLP*%i`TVYX=k?7leiM4 z?6g{Yh$;De_JfRE2G1)i=M5g@G!G$5WEvBpNe~|j=e2F}pE|JyH`(+XLiT{ZqLn0_ zJiH!2*$Xc3OMnFs&hpiOrGl4xyyP!Lf?WxMf_4(npbJNHxiH94gyM~xyxGw#03QV^ zOKH*SK3dmUuu79{jWi&SrFcL9qr3v3E;deUVKF6e%YUW{-A^`*&Jd_b-9=D}q&h?F zdL%Aq0R2)hc}HrV*ns4?*CIwwF%~ZF8aTL+PN1aA?OchXW<|%fXlR<16a|}H?BfO` zNFq>@)F0!Rd|mkjrfk1fxCVbbBy@9uUl(4u~6>VoV^PGtBa+9h<5D-*;g=2@J5-3SI@r$BN zCyKjlIZjl$u&yzvh<4i4YTyH4r#(Es&<0nDVr_1ONCuGWMtnYlWXzPs$g(#o$PiR9ucSMe5UBgat@$EV)NeZx6y!^(!^)1gg}V+1b(< zONWv0m}Z#pq~NCnvKHw8a&akHhlC~xlu*t|xj3_nkx)voL(oowprR7orKtFni-Cb8 zzg6#f+zj$}AVCg3<+>T4w;*AJ&jP$lq4<=G8qh2f6^QWo0JRAyJSSQla*2j<%oH8mQms<%0GV6=1vOm>zWPhrwTx@?zM(Bno3c3n(Lr&LGx)~1~mZQQm zNU%Ro0#tXs;p5C;RpXY5r1v9n=S%oB62^d)`J~?P?lmY;m3wlVH_i-oo6s`vjc>*j z2qTD!+&IA~(!#MdB7$bf4rm!9@a5UOQKVq8t!_bVtJ}DkZONF8tmIVVuInrqceczM z1(6I~E=}|sKUYxzrj?>%lwgmbodo-kaA5v}o8+yB{i=X~a#evA{2UNP<$!DIQt(j_ zZ$7j@j5Xy_49QxYF$Gzh-E{|mM#YpTID_=M1E3lHa|1xpVkX_j?;ZehssYe-E;;}= zXvx|l8~_ske;EJ@Rx?gF_kTVBi`4)SlnUBKumedA0I@MuK#-CG?x=}PN{%~fVi}}7 z|2O80lHOxVZvo)??P4&Ry4y_OOy0?ID-j9tcKz z$m#abyWGZ5W;BKz`r}<{d6j! zZm7&2Q!ieXNVQ1v9oN@3$WJE?BEQ(0&3kkYV$Q+#8RTIcf)|kR$Y^w4>n0fxy^B*y z_CrKCsSwf%y+@}~qNlNx=(!*zdMZnap3G9Br?Zsk34O7}oy{V|VHcka!t%NGmTBtIuhAPu~s34lR@pKizEt8=La)u(v8HylhD1w}!2y%uZ$QgQ|t*gUn*d7O=$p$Kw@BFGtvAZI9ooS_JExr%_`X#vDl1lxAQBFGsQ zLC#PFIYSZT3`LML6hY2V1i4&AK)8q^*xnk7AZI9ooS_JEh9bxriXdkwf}EiUa=D6t zpcUZ}0Sk?LB9f?)yfdR!!_xB0w@@=KMp8nAHKjz$x2?DQ(p!Nxp>zupV-X=E>RRh2 z|LQ}{rNxT_Yu6C&D)ZrwaCrK>fMCZ+m$$!Lj>fQF5S&L^xQ3numF*Cc1I+l8i~EH& zNZ9ieu#~^d94%piT$+Od%0LMtA;hUdwbfxw7FPfs`0d4;P*nZfi+7?(3HO#Qvu%{h zWzyL2Q6xMU<%)l^Lh&hAA3l#G;R{*WC$=QsfTUj92jX2zfWa~ZX9V@OiO88h=B!HN zr1DyX#7Ytbb!`cPEajy+5TG#eH4CP=5e5t%%t?bMZ-!n9dC-zzM$kCHX(UL;n@7aX zNRD>|K;)uyR#6)0%IcoVsE^lfbbW8vsRXD_xFVpEAp$u=1YWzz6_KZZ5#&LCf>J?c zv(NbgD#3uF;?ujxtTflvl;#w`DymFZR%KpgAZ~qVV$?^@sE?dc-_UuvTOU7{zF6}U zC--h7ypl_gl&cb->V(U?zadF^XlIjG>N!>!NaWz;IqY)6EpP^aj9lbkQ|KZB6EQZB zd*2CyYfJfh=YC}KPVK0;G7>Q|EHskK!m8z9aVD%{GLD{u1rjILnd;$GM`;+%0zLlOe0WGwks2(W5`4#O_?apm3fh| zMc?6NhD_vgWj?mnl!@Y8nIK%G?^xRnnaF9G1@xLdS*L+HQJO0kE`-Nq`X}NZl`Dlf<=X%K)GrwLlSF5LQR5*pm72|b^(=OPEiSNLPGbkFcG8vN)EAGkWd4k-o?hi z4()Zb-a4dPR>it;7!%C8eO0DaP-TV|Sl+Z2o>;Ajs_H2M#MK4UBv%(sBotEvR6@?s z1vx_(CS0 zlO;-j&9gvbaOl^9pi(ZIp(ELXNNA3L8(YK*f+3`ZrY#o+`3_pGpm757<6Qsdd9z~H z#Tz$yvz-E)93yi7b|>&>rC#^f0A4^MnebOgh4=+)oHA9EF0=4c;ID!5YnKB+ zF3zI!NVwa4CxDXGNm=AH?m>}r|1byxrS6cjo7VH9b|b5@n^6g7%B^JBZ8a*qQCpDL zZ2+!pG=N-g1BR!s$yUPFft9u*VVDSL5cJB}Qv_Tp7=Xz&htKa$ZKuEgB+OUGI%(&plLbTCB@+3=wx|}p&?H(5)Ug0 zw+oK9$N|$XoiNV~tj2Ia-zPkb1lwtYkqnA=l>$RC!BIiG2qH)e;|?v1lLrFD+iCJ< zXJsK6I1-mY&qLefSHG@87H`z}0pub}00{>NlE(*0Mhj(9+DWhz33m;PjDvZzw|Yf~(x`LZVA5dZe-D^aTYEAK)o;a-?NgwjtU8JiAHib^DoCU0v$ zl3TprE#?V_Pu@3I^?N|~uEoI68-fi;xx-EBa>YQf21!nm@oQJa87S1r@*^Rja#1Jp z!mOALy4ErtW}#LA|4yE+D#VgULPAuv)kAQ%KIYBB`XDZ>Z^TN&d5x6EH_^hH5 zJT7RQ;0uaM@C{jy;=sI%K1b^k29e#m;SES26L1caoA5>?kO}T{$pGHQagxpaigJ1JD&AQJKRF~I+QAn@!_7*(u<$$ z1GQ5&b<1)^+~cCd(DtL_T+MTpu53i^n?~KLxPbAoT?B(5Qq(G`Etm@iZ#Ij7BBoaw{2D zroXTduAa+d82Wzj&=7o&p70eU!*!7}_cqUnG|#cKrLr}um%3d99}+uomqhH-N(ll= z$c-n|@{QDd>Y_DCHT0!0#b`eNS?f}bh^I+8KBbAd4sB2k;~G@MoTY9{Ibt=@j9xup zjEnBkn*lB;^bY`NFw8!b%e4=m14s;ygeQ>jqBFsmOC~InS{-}~h6ljls0L_K=tBS$ zi`kU>Rr`%1O#YP59zpTP(D8TR6_p?;0^$UGt0s3NiE?-8Zs&TdBy?pZv}YxBnG$m6 zlv<{v1b>5sIZB{j==VI04$>v1@^{2&2xHWdlfO!&rW89xCDbTtbyS(wNR?@&E_y>x zF`U@T<_&?!83K_r1R|F!5Cq8ZE>|GD#Sn;`ArLu3Aac0^LD13|AX$hlW-gC$M^D}r zNbn|tb%MqTHYh5=CPl@kcP$2nVIUy0ny$nYueYP&hVY`ipnDfvR<_qVDBEi_RGHQ! zcji$DgTK2N)e0&HV#k3lbVl+jdBn)BXQec8=_&TaoL7goCbd))FN7f!nHkjrmbRDfIa|==cDU77A z&j5J|>4!+#KY+^j)#!J9NW&z!R~qmF(plJ+e@;MOT%~`G6a(#ggU)rGI&*Em7fD}_ z0eKGTyGXy%L_qogzbw5PDQL(kMcHp7rBbv{8|^@>q6Rum!_k;a_M<+z|FI5UfQp^RQCVHC)W;>F8qJ- zNg3k*BtG>QalNfxj8ETxEWgb1;es?IUoaTL|9DO8NJHF-CHluQiIX~8)6!5|6Pg-2 z85&HDkEbR=L+Rv9B0UwF9qXS6rCsLa#NgQUP{R7Zmo$|gL`&&6Dk?PocTJ=w61x)p1Ib-`oNISggv) ziNycCpsCYSZ_o@=sX@ikM@s++B)MMvAX|qfw0+_nD@Ufh3)ob;ifW6Ha0-6CC93o^#WgN~FmN9&C3tkE$`0o^dj#ClgaDi=iIwpB~G2 zG%T3TRAwkSkpTlBLxKiuLif#?V-Dikt{?7!4CY8?8M<$agm4miUilVSb5En62UxvS?esW-Xco@ZKX(Ew9{}oOHID@H) zsZ9Sw#_fsFrZVa2!OV18caMFSwp?3{Qdi&%rOv<S)2VUA%+krx z)7cDW0||q}BU#y}#CUE)lT#2xyV)~6jNXVZh3^jMZ9F_Vx{cB^}SB)Y26 zfE&2xpH25qP9`{r*s?)MN8Ad2&_6;ygAC|4H12r{zT&P34MT(d@#*wHs%|tfNCmx; z`o<$>HrC&$?3QIXJ<&g&9IUO4re+iAj{ceC1pDrl3pt+dA3W(5L`P58w>ULJ{gavG zjOxC}-kM5IC0aaZ1U=T);>6t9_@KvL*t*E%Dc$*Y2@@s~-g?(%Ne$>d4Zu9$! zAeZM!Y6;{Wvf>?HwvHYlF~yD-=%a)JfryX_^F_H3oS zBzV z)OZQi%KM78mTcV`3WbYzZ!8Lz7l&|#tNn{|6)yKFBjGa`>#gn!Z7pisR9aM2U6LpB zJLSI1X`o(y>^hWJ`oVHv;Hr>a6s)nY3)-c@yg_;t-M3dX9TyAt6dZFx;cG(SiM~-g z5wrur$ld4a?9+kKb1-S3YTMPvs(VlDIJEs}xVG1R)~ehYwm)-g(<0mc=;v=eivfG_ zNek*;I49Bq1@`aX8npk}syx=$T+>oLv1w0rF^3xi8?Y~{6fBvsOPhqfvS23SUzTHo z@0a_wm0w*{F_YJ)4=wT)ZzWg7qLpzd~jD~QSZUt&~ZCiS=4v1FHfOQR`>$D-?Xhlx*aG8 z+bf6dOiy`nQFGWn8L$JDdH(o(h0k79X{Q4AD$JNlI}^mbnK;>7J-Vm(Xe4y*q0!sI zgZ59YKyv5FD*MfqcD?Fbb--TQG*iAq3_U$;Zw^+xyL3~Yc=G>&8~K5U}({;d~Yi-rnQ((hFDbZV7J*w;c$VOS?U6uBRY!$G1n`TaU0B!wlRfB>|Q+ z6&wt2>D$s5DW65H>yNs%I7ld~o-M8phr{(*^=8_dcZI?&c?0p~#V}V;nXAN}4B9IL z`zy-WihcSlK_jfWB@7Q{rl6_7o?Xo5eFcGnYC!*8_Of8e-Warp1NH`GnLvRI9yprq zJ(c#`Zf&yv-3sn*W;Of9N_%OhS*-~@1@CEYA30x()EDWE#I)S%=4Sh{o;}UY2Y26A zLgF=b=bIz;nx>XxRW0@-h)>_K0xiwqs$^fpK6gvd4h6Az?6jZv1sCUxz}K(!+3T9@ z(I7s@kHPrU=iYm+w^yxZH5*Gqr8^E?TM|x=hPF0u4ONFR?AxpE-BBuv1PiK<&%0Q- zxvEVC$Y25Rb|J&c;qXUYj`O`$_VT94?UIFW9JH@8d}GG0?O_O5S!q`V{3~*ly!XvM z*wCI12J97q5R!e07+iMG*5-5P?l~s|6s)qZ4A{xQLBz`25fG~S5D)%%Mh}Nds${g2-7n6yOm=O7ubcFhmZBy^S%sA3&iJSKCCtRJlo>GBB!IjsmAKK zJWw09mt?l~;&T`~1t?LuJF+dj``E$agLj|1XCCv_&IGEk=hRf_2zq%;j#nayyfY! zCvZ-K#wr*WF(a1rY&~`~9Nx=VeGgaCU{%THW7Sp1jTzOPxAeUX8I@J`h5*)K0H`*) z``F02_PoXTt-gF^v-TDc3S4#rhDc8Rzuk1ZfW8Z=0EEvoy_~{o>KpzfZT#8}A-Fu2l%18HZ ztl1IXv*TdVaSqIEuxKAbScq=7_l|H)@1d5t>2OW6Jp+RWro-3SD|!(Y7+&0;TfsMOA-jc+wuOwU*K6E17a+{5XqboR4 zv@2AF7#6ly%b;N)n6^K4Yo+~7E0EXFi~rs7T~~5#c_dU661NIekFxXCReg`|l5mL1 zRfk4J*FZt&+;!C+e!e$Sj;K2_Qq)0rOgCZO35V>fo2u;oo=DA`iYkh#j@v6TFndvB zQMeehHE(PECSVEhsWP`fXUe+W-7^thR*%Cew4kJ1o{EL=~>QF88!W>J6i}DQl z#Mj^xmo-JJqRrt$k&4hJjC(M&y(rYWqja>H_X=uh^;Z@&PtR^;K0( z+sg!naAcaD=H6|}UKa|gZ?X$7?2HsgTV(FYzTi*P1_iO1^@a3VdkuO!+}vxg?#bKA zeYU`7Zw=V}0rzuLptz{$SOjZCo(0c82S>qdsM=E%wl{KCABu#^LnYjp7KK`_DJea) zBhMK>B~>JLVJd`Ju_$0WITf+NgU@fVOlg8FY=h3SX660lbXxZZ#K*umEFP^gsQ za4vXFx%l?LPMVlB<@&Rb@FVro_ys;vq)m+0P< z?JO!P-(1o=+gnr}E7g!;f_6a7?@qlhZmRIPvY-* zU!JpooLh}uW7FmmYyiKP{v5VW4__7l{@paUQD41GO~+ut;_|*~6&HsKs#~fcyzRK% zsFo^}mW)(jClsl&Z_Hq9Bla~-{*^h+yqIm~tTgl15 zh`l42*V0G6t`;2$@Hs%DLt6K27Y6i&%PqaJC7^4)3vV;+QsnqO3d!u-P^KC zOzur{*H1^ehPA1QQd#ivNL_7+vwD@#o`T7ceJSb=R-ErbZ}9*m&h5<(pd$?b~A?s4U;y zT%@XUjV>-3vG+7-A;%+8L>@}~XlSHuq}ncT;+=^fd&m*2SUu5l+~96Ov<^k8!#m4& zHAg~QLy;EyM^?{n`xiG4moPR*gLb&7#(vQssNRKn_x77)&uahLAGH6@sfJs;aR6_btQr=WhvCT({f)mj6QD-R0k6XzfDW!34H%*|v4_Rbnliyo5{p zB0Pri+fy|DHth6n*cI9e|N8c$xAOMnv9DT{RaN%mw+`DCLAy0*KZkXNXFu5+i_d%m z6LL?*@txJ--f$g;r=mGhRZ&$vk{5#S{TBF25A_~Po~)9sn?07XHw;&oY%Z^^*pV0P zo&oa)#F(;8n@USdN2B}Bg>T02kLJzwGv7wP*7)qPAOq}JB|eM8;e!+TLE}%zcbU)K zP08(8Q8;O@c*I`f-{xyUwdvmDC-nB^qsi)CY-|t)p2K0p$FQ0%!49hMk%w-)KGb$c zBphD+Pm$KD(37$)u@hLM@~6@Z&!fG7&%OaCAOZUZ+>t}C_iqht)lG!Z>!Za-OAei@ zYCmLe3fe;fEQ{A44DDtl{BwJ0PoDL@_yY?^LAhsWU;hqT+34dri%e8}mQ+ohcP-!AZQ>zK1(B*eJ$`}G{2H%- zw!JzUZf*`2S73*+JFm_kevcu$dIGn#EzND1Iprrp;nUTTNY%kSKYi{+%Xek?P`*Z> zZrix+AeW$`gOM%jel1vV&uw{IoL_+vXB6&1!(b(j8@9Q780k;=IOdbwLm<|lzp?l@ z_WcM~++*Vtp(|Ld?zXU1+j|eQSk16wUHu?-G2(|Owc z99!va6+Aj!>fTPnT#E{@L=f6N3Y7H}_1&{8w5_V|P)n;lQE9K$_ukF#!xq%u6xbqG z4irR=+iN9~Bc`%&$WQa<(hTZf_VKRjtwhC=q!RRAfKo%irif55I!#)oE6Fq-Im7ylA=>GwTN4V>P!>sU>Ht zdHaqXTvgT9k^|Kknn+6otybHyfF171+c7-_3vrWGTl@Hls;X+J{r30CInZn0!<1S& zY#(p3w+8#loAY*YZ^yPD)po#$JjgnBu(`SXctqVj;?}Zcb5VF_b@{#Txu(T6QMhWP zui4&`-=!b?E#$25$;~8hz4svW6o-$YPvO=UbOHx$=x;!+T=*<+#%PzE)ON4lQVb=l z;Ao@V*KMzCwYN8oG`B>m?ROy@{40WY?uqxg|0(?qUSEr@KKI^RGZ>*id(moga0U@R zcW`SFHsqKbk(Th-k%Mru@C{g%?B)KwzM^Jqhl>#Di<+yTRW1@jy@|nH8q`Z@IcL(m>wJB10KtLR^$wi^^aJ?$vG$8pGjCwtl@|g zjWyJ?)J7VdmbUr^3(o>GqeD)5dSU`kqO74*ro8+}dNMsXIbjWC22%-C9ZpSH>BM9z z4Yj7zGl|oVJb$zLr}&t3;4~jcCZTF(6t8#;Iio{kj&%eNN}a>g6N65}gw;Pb2FAm) zv8kD%;dK9a!c`fM3Za3aJPWMtt_WA`ITD|X&ZZlO=Fn5o7rBlM*p=mCHSvbVdZ)3z z$EiKi>QsbVoQjSPr?%A^OgV$2PDT51|wou-;-4SGI4)`&jR$|RbC!N#XEi8-sgG1h?L>~PAKiq&-YCo`D0b*brz3>?KB_?DVF_<46tb3ThVhm{;xyWd*Tg%V&Q`j)11G5mpq6l&Zl^m^)9Tb=SdO&CdL4!# z%j}gnSO56r(6kzUciwh49&U8%4mY&cTLbm#SvckS|h??pPzH zU@S41KwzuG>j6ou3Uo<217e92?~OLVS(;nhx?8P=hA7@dh#fux4ZAR+M!U6`n(*RS zf1CrZhLw>H!-Cf*bd&M=NC(=ii&=P|Ce0-X)BEu3(b@Q1I|GKr?r`eY!W1oN1yj-K zm>#!ap#Gu#`H>fH%Sab#jXO1+7`k%HiSSiLZ)Itz>EV)!mDCz&9GSpN4^#%r$%*Ny zOyiNp2$r@nD~b1nCM+5VQ;x1GuT9`Zo>?`5lSli<>bcJH1&G8P0^T6rSbU29yXJ>GWVs4BPM zfbfkT=P1UMD}1gc+FJEs{+5CYt|MG`EJo{^NNWujO1$4P%FT#1P&++!8ZX-n4<})S zIcIzXP01QORZ)w#S1@2Qx6;FS(Ma{6VJ;J`!L}^BD^N>-tOkf$7=LuCt3RzR5J_?H zW!F=m#EK2SzzPPBKul+Q7W`LMFcqt6q7FJdgn8&V)0lz#v7V}pfzzMKr14gyyWu*K z;?#!?@lF(0epwMjI;T8iUoxSGzori6jmIKZe9oy&^yAeYcSUwb82h5O;i2)`{;7o3 zlAP$A7)s!!9|oH!*1W^1bbX7}IyBiIO{9~lp`0xm-ZVw~7?=gS2<%>4aI>N|j+v85 z>>Tml6C?FSdAr+Uk$QOZ#pFmCoOz!cH=}VbRvjHytwiz0BM2~9C^7G+(6vF7>7Lge zZFY_}s%lO{OElgKvrd)ovs$MH>r=B62uoOw8W6hUm>sS44i*%IXzYYq8?46hG{Rg4 z?spNj4%gL{JFWP5owD85NP3bz#?(o;8)R;)=z0yq(^Cofi@QzjNZzQtjqCaZqSz$n zsJMmGjR2BxuyS*cE=#_-vYp~M50C0KmeFaTJ{s-MjMla_W0yRIZ4~y>@D$->;Khzh z7JHF}$&u!63{ylo+`c{VIQaSy6j8hRyh$rdlv@2|2kA8QAbMpt&}QZcrW^bNFRjT& z1Ge8?VPOhkB4Q3rW+Nfq_0(gAl>l4lI;SmaAr>I$M@R66;S>Yn=q%%tgAqxewm2QE z`s9cMc}|q~ATZfT0x!B%3_8QJG_=~+c`*&I8X}CS{j~~mi00!{RuWOlG@!fkH@3O) zw?o2xJEA>0g4sAZJ2YTTGLSNwi9Il+iE7I1C+mb14Exp@w-bJ`RZs|?s)F}P;NTXg5YwByF@y0GFfS6sMn8V#c z+G?B5G)%Tm;~NTT?umFyAI7}qT$miFmoHRwWKwve6?fb{jV*Dfw(~Hz>fUC-y}xU$ z7J`uMd(k!An2q3;0Jd>5xW5xC#Cv#48bK>Z zB68#10qu3Gxb@=lrtifawb8Q%4$r#bu5lvTAr9VsxZY{&Y{YDu!pfUY4dU%vTC*ZN zK6;}#c`_xTgZGrR-A<&V?jk+nT2q54l)F3d?wK1~k6^#|dZm~VuTvLO;&n^^*P(Yw2#9fIksqM$MFshZFqO=;PmDs z_5)5M_y39UNrcCRw}$O)9k~05av6%@NJkIs*g9&crvYfgQi{X+HXy& zc%L^GdZ{@asX5|Yi`h89<%JG@5hrVicQjTwt(|zAMW3{BD&w?`mUZeoTcWImn9v!i z!ELEJM&o_|l+3s6u?|P2qYih^To0tIACu6SaN_-9$!r{o);QhKnhK|-u?MjzuOr+D zb98Xz!BeHYQrX$aVU4rE(T%d*_!Cfx^f+GV=XT0D8s$b6-jJT0#ePH^mD2V3 zK6S$xj)bQqZh?4Y$GFNre^S;n@rV?340 zj3$QaaHfEWBTFdmjpYDym@oWWlc+L|KVUj|5=*}9y~RmoieLkeHqzV*A;u(!Pdo9s znj>|N+9mRBbwo{d5A7bYq{lKR9r^wQ_R&LAqc}uyhVb1leFugehn!6yl;e!S-HOSX z>r`d{D@gyOHH76OHG=qf63tF#6gxIs*poD4ZpmH?-^@t&k2t5)u_yP}jIin^ko!MI z<)Is$fn;VJ5@%DQ(J<~8X5_fjT_V%N*aRde^>(Qx($e5GwKcYSUdiLa8r<2|wsp4F z*Tj0Qh8RvB8{B<6Zt}5};thKp&Tuh_X+#{jO(oDMmZ5}vkwkWW@LP4G3&n84i&KIz z+z-Ml5FKW4PhW#wbA3a+0cW&0JY_t>U=61o9J1waJpVt|-aXE;Y2?U3r(e_U>BsTuo`;3)qdxt%`f=u*Zq1D17=a~Q7^4_t6A?@> z!6t?XFpm&H4CsO(j&Y1}AlD?2kI4nDE-`$7>znJ`0J-1aT2*`3uI{n(NA_oW_NiU9 z*RJQP^)4qGo99QSr$z&jU5Gs{R*?i3{q>DiKJb`G*K-pR8uAU~fTE%b{BL|qhnh~N z-3k+==lCh1->joF^40#Nb(^mU7CsF3zJ=nC_pK3syl)rq$ES-cTj0sQ_~^D4o^?ct z1tUW-K0VUV#O#=}Gc9K7ctk)!uq_L_} zh~QlSOuuL&T`pyyxJF&s={@2DEGFPeZ=tgZt`B6Gv)52Z>MZNHP`hnhyTo8M7kmAc z^V^SXi_N1WI~&W(E8A>2#lrmP3H^6c{|)OuFyH*>Y5jMP{<~NI-4|<)!(odl-d>oW zKw+}7xhw{!HE$x68aGeNT;N!&?7$a~FS0=~t~32L3Ckn6$>C8%$+luygRSO*3()7| z@@x0=2e6-Y5&{{4#uGO|NV{`PJfFUkoEYF~zPp zIz8TK&9;#?&n|EDUEnRjorpiSv*!G{qBFg*ErL3$_(W?Qnb-K}g$X1|<5XXp$Ijla zrmRgY#MeO(+L3qxzTZUMTg*6)h76sL)qIO`qB&aiO5W_mnN`%it$lEqH0JgXtX!-Gy z0Wt|pF*gDJ@C|mVcUj9l2zE-DwU~ysi9u~mCET)6#Pb&$OiFN$6C4s-lt|B*V`N2- zA~v_R9%|^~@sZaqptX`B$yT;@oyhF7mu+rJI9@0E=9|U3t)I3CQU@93<1SFrE>==` z%>J?}?TZ(S4Z0h;PW&<|sbY++$HpQXa+{|{Or1h94+jKCa@`{P2H;? zo+;)xA&e)a7}dHK3A3~66aoazVsB|(>&8UU5viGy1359{&;gt6Z0|YgG74KL0KHsntvV%bl8OIyj_>&T*1Tw^M9B@GEjo;g1Q*f6&_q)~d3ylO z3uC42lZ~?CBLWv0vJlJVYUlPvG$M%NjpQ>b2`y^pN-Ap`8E=e=W}RS&+hdcXO>HWu zHXzQ{5HOc=x1fQVXiQC?Z;b~Px72|~Ih%48g^{#mC{;549$J`B%uFwg&QtlR<|Ln* zom)U}JB<#^r71ma9-YaH>@H2M#a-}SAYg@PQZcP|dF^M7S@9sI!6*s4#YflLB8Z%? zvej9UnU*YR1cQMFe5c#5smmlmo0ljJl@uCE2up0P{>N?iyFVkIM)g1~kRFV)As5xNe|Ag0jEbUhcVo z0a?HjI3w);nrsl{aF%cf!;(mLh5nf9Cc+eJ3Q_7xuSa)80GnQLajU<)ClyO@Y=z+2 zK+LZF;D8AS1K2=;5vSW&>w=*Q%p6)PTic>^*t<+)Aw7Spij;zNw0XV>76Z?|rgsgw zqPDobzL0Ry#J^Q^fh)R;u^j|95V&kfo!!ZP3yfDz31eU+eCasW6QR*+Aht6qB(O+L z9I+v0T)Ek9_BOT_dvE}w4a0+*D=^%S2j{`1(<|F+P(dQ~mR4lzF$(G5MV1%{ph9Xf zQ2f-qEtT;J6yg$5151*|UUyeIXjZlf21I2U{kcyXa0bf(k(k}N?G;IfRUM=G=#@EG zTAOI5@rGh;2SWX9V;*pPk0ma48dYXz(M3){48$J1gDx5>A#BfK=Ru)vGhMwmxv{ox z6yADqSt}?*=?WL3*&=4z81a*V+fmszBnO)Xs_ea;y*~O2-wG=cpU7cF3XrJJw)w>l zqO`czCYzSghzJZcQ7Y9)lV}p{`HNEvqm$^orB+>S8!8Ths!`jvCTuxwFQJ(NjY2oh zq4+IKljW3=VXs9^WcE1Q3e}*EHD6*=<6)G+x+rbbQ$=SK!ah*-7w0DDXN(<+W;8a> zjEo(bn}dX!EmllQ&mNl$&lsw13AtF_^B9L~I)4#;>=>nxYCjT~SWXOR#P4bj_B+ z7Y!nK|UXX3m z^oACK*}br2_Guxp$628_ktg~J+P|MmS?3zN>*rCkeN!jCcdF<#*lG=}7NzErjUm!Z z$PONHBE4AJ++bbJOpUrR7XQZR;d)qeM$(aI6Awp$9 z{EBR7!7BvIoC+T;ulU}%K^&qUxO|WKvK%Ljl)R9r%-v972B>ujiI*?fMldZH5AsOR zG03(w1AA0yHi?GoptMVqKZp zo-=WXd#4x1&$aKrcSN!y;bC^oAjgs|p!%q>xz^iV-;yEI$xE(_vjy2UA{r!73E%Xj zt&OLlZMx|2HN*gPP!ZTtp0=A~zPw~hv>f(NsndMhCF+ThO@a7k$h2J);z-2CsS;Ng zH?b3`>2HvmE}WZc8a*S~CAi=0D8&Mo>i&tw^v;#AM}hf}La^y*ThsKAc)@7dpp4Tt z*gNTx7#kmvKSG`$jbLo!qfr`NN*Wd@20ounfz&2&{52p4IM>V2G){xGPe83%cP6qp z8T2h`L2@ZY&0a z7>WGQ@PdRvWUjd_O_AvNULl%h3X?B3J$CKLbQ^;#eLb=e>O32DB9eLu4PiVATD}fV z14Y;oHQnw@{@OvO5JU#4LK}o!ZW~Z{er0KNJ(%epOt8TsO8Q$c ziLJYtM0}ME&L@`%f2ERhoyy4GDl`M=jv32RahjrQOH)JPyR&FYo3tn+Arq03g-tra z(nbwxg2s7)q>b&hGXj~-jDRhzyYGyH$5j6nq!LGa*6*eFVi`O{v;o|?*FSZLe<)P~7NAwuC&-9Qw< zOi&%jyxNSNeHl5ft*jBQY$2+1%4r{;aB3K~&&63xajbz6X(_@F7-^r)=fpx``av^E zmMAG;!@i9pn^Fgyf~vQ-v&O8$&O%luMl3;i)lIhpb&9#9HmFd6*7!VnG%Qc0kAIDA z6xuJ5C{DlDwQDsKwMJ1(j%a$C@T*dB%8Y{XiK`sru;mr2RsRaVmU`D9{rH-!=p#!q z4LLi_e%0U9dPyt?8Ad%$5U&Zg)o(9Q+J*UWD zW66vywq1~MBQNfmLBoyi$21Gx+9}wi#kHl}Y;WH>G%`D%j}tQP-mfKOVd?ok6-ao# zPX!*H-&1nyXh}^cH9z%`uaYfwLD4}NolFp6J0gD3Z@JBanOpJS8E8jDaS5e9esx#; zM6q|$EcUwEYuRKwQ`?hEyJl9Sg(y=QmVvQmk|3akGCVe3>@Hzs^N7SZkP&BHxMO^p z77zy8C|*Ps6($04bmxO2Y|v`7y4d76tx&WR_GbzKgp8wYxb=0{w!pwGEj==^IJ0PD zh!V<#7|e>D4t7Gu9w8%@Oh?A+`Z>Z5ys;x2DxrNnHkeDp>j6thqTOBIwyAE6Xs07F zT1|vK4Mi1X{aRp7Mq>x(OT+q|W_H(mvH?ucjseXki4!btj{v?kP4?*AOmiAlU=bCs zXM?z>>)V^C5vse(PIb=o*zP2NX90TveQUO~YU1Q@coDrP0|xOW^1~2|#7pmmjaCg743Zx>x)BZaANX$(ZG0Uv#S6laI=1LmOHPeDLgR5Nz;ebbTwOCtuTUSyZzUPigX4PiMn~Qq}021KgI>AYM6`r zH^_?(PJZ3LD!oTcLVV&2XCEX%PToFHo{;=E*O7j1CiuiXOO~sz;4HAk&bSm5?U>6Q&Nq$xf>L0Ua%dYGW76L zW!OwL;nKWBfZ|_DG8)zA?xIQNO~lkT!DKM~bUQN>;si6Vss35G%e94_^V`xm*p>!y zu!3%-{c7hsg_rCV+iL1Nw9NqH*_v35En-6>V@X?M#yiP0g#|s+n8D~xHmakSoKX+5 zgR7E;M3zu%(Vv_6%@9U{2Q{tmbusIdpok0NAeq&o*OfNHjDX}*;WW}d?7z^Mx`+&{ zbyfDr;a zb_eanaXlpRX-SEZ!K1;aD&tqt_#;DiezWcjgX=;eF2Sa!)3ojeV!BTC*x23{HY5CJ zOsFq;>p!u&XgOtvJ+pY#u)VRV5|EWtLoizrKWf-c%uAq3Fr_zB<1AcJ%@9`& z6r0k3<3r9bDee63B3@1_+n7&FXUaN4Te?Rpq~OF+P#W5O19NtIZiN0Cn`_KKgh)ux z9wQhldvb5lCq z9bju^Yl*Jxt)9}d3>?@-zb8b@%BYE!XkrhJ2UX_UI=n3Qxe`Me!LGrwSe11LAsGto z5U3j8G}uY;_}a=P|CgY+hu0!#3FjNIyf?28*Aw<`{TwMq&w~cQ;p48d+TVq2HX;@G zp%0%sDBHDPH*noBiKodPhVB1T_W$Vug(4kOxfexNY3UIY42q0lnTuD11r6JZOT63T zG9&sjb98zN8+p9$+9wxIwkr8+5RhT-hBS};L((i-gfWuy z5W(63Le-o~JEOQLj$8~|CewB~5oW5Is^zLQuo;3z7*V5;_sdWzK|i)9$EKAhUL^{I zXJyQfWvlHVrH!HCsL=_GkKV(uQfJqFSTZH~OG^_DeT|j<^9yNn*9qg7Csxo<$}R8+ixN1x-YAphRz+6$Syv$O%eSPuB3AJno49;9QZ+a=1hEzSB44jnXNCg6cS6Ir@< z#@Ll*$&!8Rbt{!nQg3d+*_UoYkzt3!H~CY0YypwA`(B$~WcR93g@((;&6q=Ax6>T% zif&GrtU!SyMqt87lHH;)^4ZdM?41=Ri%E#$N@ksu9^%DCf>qBf?Tv0Nk8JGDps_q~ zm?SM4og2S|?vgcG<3}17&U(;cXTPoO=G6|lLCaEdBkUl-Y*Eg+iUb)8j7?3z=wfFO2Rp3f*~SG- zn3~XVnzTmZBoakrD8}b%Q>|G8GYYU+rh}td=J7+IY{?t6r#3qMolWUUMeCJ%>j{i{ zXc2r*>5e}?DRCzfyPz&CqfZyxa)fC>h&=)bV5k1 z$(H6>g-6u%dy4*PTMJsV+DJE636Wj8aG88pO6Vxx)ws{r)%YR__wTGwfY24gZeu*Q zf?F&6r7)2ekV!w-=cGo=XYUvetVo=Qp>VPgiLT*-9>PbQT|sQQ2^^v!0@Db4lKE+7 zpw>z%J97PmyPas2(MP*jO@L{xZUjeFkzPJ>#z$khKC1c1((hm4=!Hys1XE0Ca4AxI z{Vw*hE+`c?l}&k6`ZVR4jY&YD@+2jiZ(P6t_)#M!BqTsWu z7SlTd0I*fa8x5pYig7^ol^CZR91>Mm=tc?8v~ljigxG4T`;GgiWf*&O!b}dr;%dyJ zaX{K!2yKG%usH8pB=%rb$n2rp8-T`eYGZZSCWqLPngg+)Bfu8l?_)Q*jKdT}D?34y z%`8ZyERni8yi)cE&z8*jJ^`oZ9urHnM8n)vQXFPm2gu#*V4&JDpM;nk6$dX#ZzSZq zE~qh+beM1+SGtmv&WeuHtbjJgAiLLQCLe>p*m}V&MXy`S1OTqQj&jC=_0r+VQcI0xw0-%kFtAUh1_&*VFq0*bk*kIfu z0k{MKOor9~!RQsn-bsIxkIx4uMex;Rf3CE44ud@hg2ksBPnF2cA%=0O+X#9MR4VN3 zJKC|@Bl4VDJ9F;|QJW^pU_u&A0N$qZ(hwW+QtO!=R)o2nR$49@ji&2#qJCLi%3OCw zx_zTpDr_X7h@MkxZ1^#N@D;#T;uEz_dr69$qzqWVvVWR**Q3}h3HSJ?M^5W)^7vX ze%pP5iqXC~KZDv>qU8BK?EA4*0n0ce&&+HLpY~~Q9vGs*Y&uog6;vGqGcY~D3#Mco z+v~Ons^Lt|M4MAkF46rM$f=R^d0X1Rt4i&Ljq5;9$5gK2V5k2L25i7>eeKdo*A zJVBBJOv5rrO0+>o{$L?7v#fr*H!7;EFdmGX#k6V561|u_5vIIJ^^CMLyAoJ&wq+J+ zqunfQc48ye4>-iTND_W#C5=?bnf(qnrmd#`)^>&$rIj#Fu(CvAuhv#>6b^_(e1}Vo zB)TxZEa?5HIwnitq(=!PHHwZt;UqFt5$qG(d=%5vla(B*noa?|OI&Sk_G}dkcpiz# zf}n)@&hau&toMaL}BLpFhQ3*YTfN03W*PX}~%!lmk!nxK8wV-?C zR|mlgHrrqON=iOl6AMU&3ul8N95=I{OQ+;gTHV~nPGZ;O5N2v$>@4j- zW00ms`n0D#%$W_VEAupY6aZ?+;u{2$D7U*Y`H!hLGNH2_rrF zhU?)bSC&~UV>>XIm^hyRcdOp|}LcgGF1EnlN(TP^vDz+{={*xwzy-dU+6zCN6BwLipLX4J( zOr1ID%WVpOiF2jc6xm{H{=%5?K;q@x6I1$Mla-@mUqal|#UG(}Z(`4HOP;6DMuNs12iN z5_PbRCxn-iy%O2QH3YlR0_SVX8lS~b)948|T?tzbWQk5?lNp*x$_m{1Bi2v(s&?zD zRH?<}j(N;<(U7B>oS<;F+!m-F4i zWEIMZ{sT2ZjD_U@71G*WpMtiatm=~RnZ!O!)F9x9lLxiR*!bv_f_>RWAiX_Dm0=YF zZ6nUqj42MXwKFpqNPPBV>{?x><<0J0rKYQjgMzL{!ffF&DGi+E!$2pBS)j#4sxqw! zB00Lsa0c^5BOOgA?g2>L+Xh1-OkeB}K3=iqj9}1$=m1G}vd|fi$mEfkmM;iwQ@kxVf{GZE&D~Ugra3An=H>z_2j5ZAs>r)U)(#R(v(P=J(Ub(81o=?w zmHDVIWVyEODmsBX-2@pbf*}He2!#bxTK3f7IjiVi@{cfSX(_l;l(H!cDv@x&b4}zQ zv_v+R0SWEjd80|nNp$PvPEXCAW7y>ljh+RUkX|Ci?y$2MgVUAt4;BLLEYc z+OVFFGe``97PlgJ;NTKm|7;J|S)W+EWznZh{LMO{z8(Uf0u*f@ZcCCrEfpbgmsw~{h;S#o#1_>|p zD~Tq{qZDYCF?q5Xe;rRe45k95W0kf}ueypEflBwI9d6I>?BRq{dhX1uXbNuhw-CsNBN#(} zN!L~Sq{;KNi^L^i@8OY%3*ZhS3UzkP7f$IlV7#7`U?C)BM;=5LH%-U%`Q~I3rKY!+ zR3A?_I3MI#+I>x7ECeQnm3B14bD3;Z)HjBKhTkQ%h|#i;E<*H~JXZZ+B<3EW4zIwZ zMFY7YIo7Py&Q_yA@=d4mvD~*GRawJEJ4tAur3*rVL2*|r4=7azHdzjuXTz4p3q&gz ziRWwE1>U)+MDSQ`>|F(ewUNRVyN^jRyn}iRK_{EcLBS}(GT%;zs7Q-)&prBH!4cHVvstO;c!rRil z(u5o~s_ynjUAGuz+uM9+h++&xZGnkwh6p-wW>{epVAg_lqAe)G9J&nm>%Q_W$i8ks zG5r*+pS5VHkurzFlhvy2%i>{;&9a@@s2&ADl^oQV31m@bgKaUzyv`+weyu3+W4c#} z#-Ev&)$wbJ$@>D+7Puv;GgAxp1KI0Fdlm^9ez&X%-?wuHT--N{$Tp9$?jufYI7%Hs z7%i(lhU!WW3lRvEB@16B-$xk&tZou})@2_iPdsoHNZ_tm!huuPbnou$V2bAI24COU zt|>S(TLAH#kPj}h%_96^J0DhL6yzYumSYnA8I&w>gTSoF#QJ83T+9cbREZ|d49&(P z*{r1tm*?R8WSp0QPDABoVM&Q}g^2-smx+RnKQgtsiOnH`Z8^}RpbV#{XLm+-7CAE) z+Z%TC#`ZO;Ff!g${NklWVlHBJ&*m5aQKDK*`x^K;$#K#E)8FEp{PV-S`> z=%)ZW@^OqCo>rJbsk-3NP5$I-h3gN@R$~E@$}FATFq5;hh0ZPqHzQa1O6Xp6X5mo8 z1ZhHHV2hE|f=q*m$1o4`AeocIfB|RJg7m`wTC``>gMGX;FN#1@?4e!F*0}!&T^nbS z$<1v-H&Non4T{}knu*>Z1gTjXEubQu8igSpo^Ee;3gH+GR7_>0wriJ*q-J0jXdwX? zBo>zFzZ6@9NZ6($VX2MZf7%ALZk`1B=ue}C1mfSxDLg3Vn~<#&Q^XfCEQhs>E%Qp8 z;_F;+N8uppC$>E%?sh3e7K@#Vx@~xwUXtPoz(GUw$I$FhcOOKF} z10hJ^Yj)-xmAmJl@E!5-(S-`($$fmf+n0dBHwweX9?N9@{D@J2sWC$Em6Zu@YK06_ z*4_%buy5Q)9Vk}s>)d)Kwa4gtS z=$)NmD;M0+;G6Bje&3s!;z$wZO!|rms%=@417Nh(XWmM@pn>qnjM~&h&~CDAFGI7s z2aj*HI)L4eH z%ucn*sU>E{b#6j#BSm>4qOH=rAf^7GL5X*y+8W7ts%IRqv zM)@ej7_f&%+d}FXtC4-go&TagZ^DzeM_O}@F~lI)5D_2(KZ)Ry+*v8W&JwT`-R;w7 z;?qY0uX%nJ!T_b*z5pg>xe~RdSuLW;ha2adEVg97YjTsG_871wY7LZ=Y^tl5MrFUX z3j^HTK%5dH`^G>LkVed0pCZPR%2%X(!n}aH1avURx0$p6Yj+l1kIf0iop#-3M^S(v z1xn4D2OFHh|5$RJm390)trwN+z4CU;5rwm$ zM7e9Za0s$}1GT$?Tfv7jYZUa{n7u%p60Bo)bq4{l8V5pLW0e->QZ1g2y;81nFo=v1 zVXlw|NJ&fxBVzu<2p`%8@zTwnfN++3+Uq(*+>}}n(iyCYq(D=bBM>-2KnHr5u*IgC zDlKfhAN$BW8gmwrr!>fO$6*Yu9`&>xS)SuH3(t;+Lk(9E_S^*-NRd zE@6<(;1EI}J>Ot*>MUFXDqy#xOvtlsa6QcP-V(b$7KB%W4#cB6M@@*!8r>x+kW~{% zizEgP@tpgn6=Y7qI~W5n(H;$Fdq^o;317_D!B|@gqcIi(UBLdgjkt&E2{wO)IW=2% z)eKuE=2|!pL;j6SA<|D=TxS|BocyMZheFSE%(0(BL z;Gn(SHu zD4>m(Ymu{OAVP&<+SrH-G%DWpEuFZcp+dD5L|B=KO44)`{WhE1I8+igU^Sk~5j-ZM zV1rF*p)UTxl2j8{aZ1@W?1+w_juJD0$)haz0R4 z_`yhJ#LAjizMtlL1G#)&hYB z1YM)oTO@=v@4^<@(ulEfEmA0ki@_1f<9rx};NG6?T^#?YVmJ)LgIzE;vASh<^i6B! zY8M?2edC5yLcT6f!?YcYUQ&PA4qDM!!=jg`Y=*II0u(Rc;8(rZF}lG9a@o~eVTM~L zO9sL*MiQDspQ6vgn_c897#ma{WdYfTO?WgrHZJkeb+f9dYq{QSeV=cOE6m#S#BP)} zv?Q=3R1j%}y>aYsbZ1zjx@=~lC21-uByH!=BAU5o-l3z$%2i)X-V%_SZ89f6XloiccZI2a3|oC?l#O^2xn2w^ip!h{tH8e(SnTXt?&Kx zDRcITku%-(2jOy;^QHQ9_}nT6)`Xa&4$g%zJ#EUiEm%|t(P9+&1TVBF`qwaN48hjS z`-&~p2q&Y`_Ag9R1)2NOxM+p?85%K|vB{ft*n(u+|L*Tv>=pJZ-eLw^Vr#7(dqj%ovO`rp@8KQxr?Pk zH;yso&emMd?BUV8%bGdx7={OfU=)987ezE1Fl`_K--)B{J_=@ya<5PI%Eb2U&=Iw72_T{Zn9i~vX zl`ua7cX-^tgwsq{hPd5G=^d^ygNJA~*btG;mOOL|^%CYWa<(Hl0f&dpWo9Er zL0fRayc)97wtt-L*{Q&UHgAa{uyqBlD=xbT%zX1l&&k7TVggxO&DzPWaPJ?+0Ukb9 z*fTJ^!E0Fu^R@6#HbLQnI~h5S5wg^PE3Wf4%0yV+`e9^dc0ZqtX&Zpvkjj)Yude~@F!-H&ILHZ$LlU0fb)OvK|fR*9+P;0}CFb-yFVxiL! z(hkVqxDlI6l?vOZQp`i_Nh#R9Vl3r65!@C#-qsyX3H z9Z8T6q3P3!{fZqb;}^vRg!COjQ(`*9B?+*x^15Kw5@wka;&fx7;(p573uXJmTj0c@AK3ip9u|?nQVIw51j} z)6BNQ1al`1L=y3UTO-=wa)oc8v$IHh2jE(djS$VBP4ylXP+^gupN+IaYaS6hj6J7@ zy1h5#r3v#q+*IV=u^3a&FCvAOSxYeXizfjKFBs{qmMM6IQOH_>aGqrh8E5fF%YQC`5mkQgmH+)gmM&tXH-yIVAENXl9kAAuVfu6zQm>^F?7I- zo107}iQD$mY=NFITD^7Ed~{eS&N27Rkr--4f=cNDX#8c-2P5~MaUGy>fl)G{RVRN9 z-&wQ+$q-bWMforx%8Z5#bB>MQ9K$sY4g6?9ROHAfq8N;nhnV_+D}rxcz8r*U{NNW0 z9mqk77Z(|b1PhuaS=6ZGH9Zp<8#rV`6u|_{ju+AjtxUjNHsS1RFa^S7_BEsJGxrUj zA}rDFRUcos2w*`!M3jS?U@Zz0=I16BVD>vMye0O|0SX)ExLH>m&FR+v=diy`B6jCe zvvz}s*$Pt)<#wg#ber6+EeNXh*Xfq_Cj_vV()Puf>S;)Tdq2%*^M^gen4e0vb62zgyN68v^dU@Bc-oOoFen`en?0;HiMe1qJ0wY zwk~9&R(nl^C`FYqr1K-xX_46T?o~K4V%99O&_|~PVKFixgJBnS?4RzHcfhG)9xl@N zlSHQsk9>Az*HGnzxH5S29%LvYEtqf&*PIg!Oo`r$acnst+>QmZofrO9v_R=$EQx2J zWCAJaF6z#v+ltq6*}aO85N%AKg^C46ltRG#(0Vw&DMT$HkYAv|7p|INf{6F&M>mUY zsB}Uzu0IAXytRTRt)x7HwV1+~?DlpxBOON#+2=j}^jL70Rc!al&o0NI1Ve}boctt$e{MYs&_NP6CerOH# zFo;A|T@vSJ^AY5lU>9ikgoYZUR(|58$wBQLr2>M70FbbqcF0(?s&${M0}!+zmcgEk z-xO(%)Y(Jag~M}PhvHa53Ljw!qwJWta^|YhzOEzFqTk)&Op_v6Lqx7_bM~23EkPQwi;SMcG~>KHE)9Vded=`N?UN^ch+x9IHiC zNCPF#IbmRv&hN}^6H6QBZEhQ51g$EBm1_rCEK2Wa#NI|}+p3k;_Mp~gvW)?s2^-}G z75QIBWEH79F=?@Yb^fm8kRq3wfLXCX4!$mdUzu(zLFYApm6DP*R_X*SH# zX{|^{6GBnAkU8vm@-S7fh2YWd2E!W)W!Bq0SssQ=>tr>etyNvGd5K&V%nj3CKjAQL zyF`xOE~4>-ZL+puq88lJF$dBYScKO8&g!m&AHXwD^w`B*3uH-;(ewq!ONzX}H=xzrEDoMMCd(K;kQ1 zOjU~$XGaYNC9)1(Wm}87xG+EGr$Hf-sDeQ*Z&QunZf%rsA_{h@H3)8{OAB0&4zFs| zCxH`{X7Ip0J&2Z0n$ZVG2$gx59OorJ#9lSI@e;tr?>`cN)yC_=$ino}O) z)uNSa|BnZ92p#Q8Qg4$rSjoEqrOPK|L{G>_rme4fh=$NCbgU4~e##!}COR40xUhZ< z_aia59(7>>5viPu3Oww3q%nCfFD}f5NgnpRC>y1ph({KJaKDzRup2(U?1;a~V|k5Xa^ z2-7c!-aX&PaLwG?eWOTrDfbhDCqU>{!of48j_wfMn#fdQeFacbxQVN)n>xgB7({oV zp=;2OUJhp}OG!9pCKe2^23k|w#TRV3&@<5E*sYk9YZHS2_kXCFqEL>6vWZ^x-vNs{<_%X7PMw?~XeC@*8wIY5 zQupJ7`09NYh@j?`iUCtl(q>h-UlU6z4aq#pb5z?SvX^IT^Z;0#Fqdj~*hioec4d1Z z<-SuS#IfrwJ3TDI=OWw-yV8X@x@e)FnB_9& z3#bKYKQ@!SjjJqc7L94SYw|lGgz;IdxE&!GVzH$ZOoNl4%*Jks4JgAj+mn&dkmj0` zW8MU3A5Exuz-XN#K6azrN{kXA3JbE3GT_}-X_LT2GIsRrKh zLGdV5h@;jmhPj!-%IZM|CD>v`mQ+$~Nf?7IeTiTt(~$7NHEqtI7>T*%?v}`<0&)Z8 zItl5mV!`E@IkhS^i3|1%9)i@H8$3ZFg!Qs|C=0%|+u_{QY6H74K07woDohDlQRq<^ zjRp+23bgO3pg0n{nWeBWm2jjp1LbML#s|jsu~CNLI}lW@tHDJw(VU5>!!Zn^#))Lp zxvCYawwxzDhyn^>#!7x|;xo!~L28!RHYKw8qwyCFL|}xy-Kd64wt`qsxX#9TOr7-Q zC>Dd(f_oQ*)j|^?gW=@FgEldQ&JT?aoj!j5@l!*?Cr;jT;-2CAhwhTl6^YQ-4Sh3? z7T>tS(dirlx_tNP_WgHvh|aRKK12iz^Kcv*9=`AX`|f-F(A`9O+xGa+c7n&69UkgJ zIuZ3U1G|QYwoVcpaV455zFiI-Ph$;(#l|^3Jx&0WKyGsCq2`K@3FoC4+hBBrwS>9h zw!O9hCtmrw3o~YG{W?wlyLb9`-*fz)w}i zf#{kSCPh$$Y7rh1!Gog*6hqPB3*T!CzhS54Orm*|ti&V_n9ew*RA=L8rs*)kiG3NO zujTHOQPgrzrCdzcf45c9T2 zW<5rbk^DyYE-$z}DOz$+zlRf&+GAgP6u!h}@aec5(nAnV7SO~8ozE3FiTU%R3Pm|_ z9u_y4kBaE(!DT}8;1JSb&24OtPM$nnnAiZJt1Ul;H8=4XhhdpyPref#n5h&=25Zt< z(0jucCgV&_yGsZq?>qU)a|UXv#0hLnB;G^?QjUa`&bwq z{g&ufXj@EcDf?EO327@cL^tlIvoTwOa26Dot{^;<34;+-h%;Rm1Q#|QSelMs-POr} zyNUpaG0-wGMItS{tRJGS?@`G}GGuA>Te3+|6%#xN%5tXbz+NX0~3zi@RLs!C|P zj5ZG43RM&FDv~T*Jdz`jT;hEKIjW1kEz+x48y{Fx9PG*xR%D%VMj2{_EuCqOori{I z@8G?#bp-nx5l%La>USnhDfW&OeYEhJpq{?fawhfG&d%=o1e^n|A1yW-%)v}85C_uY z%ZPh+=mq6d@$4)siQ>W)0!u zZ=)UztL5SHX5$xSy)s5TH4Io}ogB_CL}P~Wn5dD?R)~o=x_~lDPx#a7W4DHAvYkxE zO|H=DG#3#r;<-bs7njE;NSM0Jn3RBoaBh`bfv8-<#zwE~$&=CS8A`xRm!w9~p)#D^ zWidshA1JY3@Bx6XKzxADRmuWFQimYf)FKLdO^3aH#Y9J;vr(YPDG&3|@z@(iq{)C~ zUlC6GU5>nH8DVj;-{p85`oxsB))&z^N`k;q7wq5>wH=5sxfewNce)^3*xSsO+=TU( zi$WJJapZ{~lqI^{wx8lUQAKRHoY7|gkS|F#(>cr!3!w(&A(NfjniLGxI)fD2EAy)M zJn<%7gFDxGBm7jHWFdudN$+xK#4>IHyDPY*TuT%?($X1|Zc|=F@3N#5LY_v7iij%@ zFb?t#VYKBf>%orn>bAn=*jC2{z(5$mAyElJKt3M~YJ4}Xr~5_VUm&tU$)*%>qG2Cr zwJpn+rB_CW++113ut35BWmh=v@c@NCi>7)P1iGkp+s#X%y+SVXpiQ(9&uL3JyXbCNfQ zNLHzXUS3*un_(d{)6k zZO94Tb&zPysDgH&=@t@e4H4YcW^Q3-3`JL>JAIbGz}Z$NohET<4tm;Dz*%P>WAHR= zmZU4jsdUk!sl^8;^9P&+Q!jC{Wfjz=+|28^uX%oca^(EN03pSmviHU=GuAv#-=L=_=O zMLh`kzNI;j@QNLlLpF6_A;&>+TF2;|hy=y)?}*~*wRZbrNi05pTu`!GFgjD*kZ4Vb zwPdEz@E}~oSk4CY^av;ig;WLSnQ1)yi&;OJbpd7k)Hb3^Xb#^$+R=h`av_mqyY-=MaA`Ql zJ~n+T*B|p@+)rMDOi0zw9!VF`Fgc5)?BcC$H?LyMepcLwA6HE!~NbrGg4Q{;1q zB8U}IMEi2L^^#;<>zWN0zC=^N-Q=Oyf>IzXrmk^K1ZrGjsC3|oqE9)e3vt9;-mncr zraEk@rl$`bwU3vz(Es~!jK_#Jo0&j*T1-22md76!6;xz2v{O|?4C64VM|-;pCeSlK zJ(QPBi;fl7aag90H0%@1vMcsp$hM9c5pY24Au=>BL+-VZ7N*_|d$?I9lvXC@(W&Lk zfpo6k#PvsuMCi*S6W5>&R(9p3AOqnPZ*Jan_iOMmWmY4;Tsou7xO&GvQE)4Fu}a z4Yb&DW9@4O@J7qT<}rIKZD4LuGT?!gzd6;<^^Ii zX>zO-2c8-{QVRB1u|ZFV@yg0NiY)Ufb;8t^A6@`$Q6q%v64^?irmKqRfdjEK+n`X$ z@>;LPBTqWkYH`1#Cr%f_3`S#H`b4k%s1YJ<#b~~b+!8x+oE_>hOddC`!vg9Y@sQOV;k*AwnQ}^3CWIP|PL6X50jCF?pYT!T+W~b6t5ph#k~;-J(+tI9Qc)r3@(C8Nboh0I!6T_yTJA=}SRO|^ALDBj zRd;&ioSV8N@jVnbO*O>8-EOB3nh;oxm1vzl5t=?=VIrxUCB_)O4dT$DisP@7vSia# zG1jz-*{0Yc;1-z!$^KwNhm?VCk-bXPlgwj_qN?iM=e6YEfr^r6fh1@RJwV+)UJDV=60wGRMip4 zrX+4;7A)YRnuxe_8F4Q|ZZckuA(7M)w+Itk23tm!CITX`aljxUx@^#2IG)&ndazCl z3r|!f)D0Doc-T->JznB`L%Tf3S;*-ukU$}D72_9X+QMG1vop>aItE(eZ>VrhLEjYU z+u`Y4XShD5^3gXl$Vnp!R zb_+g~li2;s3a<3htxY+U|L4JO9t_QOB(eeXz0cDl`szYw6L;=;hz@Lc*oG9KiR#$N zI#jNk$=`ICh@5@s9Z`{iu{L4szNp(ZL5$+knIJ~u%rfHQY#aX)bF!=z205E4RiM`r z7P>8ao$5GL^CeT*s&Z;2Vk(i*ibn-0W`=H}cj0H+Aac3h$OPT&AR%~{iL?sUQ}J&x zUQ6NO6dLX~J}(-VHDECVlM#i3Ht*IDbE_xSR~=joV>)5jEN3b;U~goY^EtK;xUi5 zjQlBu_feC(tBt&Mi5krtrA5?Ox$-Lk(hLC@B6c#KsTsn!BONkPi?J7wLdDVGS95wFFf{mIAQuh(7sx&H1#|BYEJSnWoI4L)z?8ee zk$MuD`eGQj79KK|O zQWMnJdRIIy78=Kyu=}8?HASa;FcvctftD^fp6ZoDcgdP=0eZ1Ngn)Ml+qt3fU^_R& zWS632r`P|w{{`lDMN!2=}e z^}03r&Kdj8%}*SDa`3JCMw<7^EH8!gBJ$F*uk*5RIsC-nlX+b)kT-Jl)+b){ z`s<^2QZR+1bmQo)PY=u;J)HLKx;-DNdUosREouH!dH!QZZ%ON`-)Y-7t^CagwtY5- zwQ}?pja|HMyIz|{k4_%?%cFOu?SJp}%8nd8Gx$vd*8ZUgnEOZh8#y|Z_WPl4K6-1B ze*gJ_>-6d9(MyMZqyGIjUH|)&gWu@iPwV?LU#R?qmrv{B@Q0qb@yQpz^+j*H;i<#l zKKOPU-7|x)7&tmqq_C$4uUqej2fx!{pGf-Rk3(N%un+AV`NYTm%}4+Bul=eop+f5+ zUJqE`oY+6#4!!5d(K|;z@$1Q(4SHYmEnc7F$H>vUo_O(-FM8_@Z#(?d;J4F~L)%9+ z&(d4h4n27E=8;cWZxzK5dGQ+N2lb0cn z3`OAF-(~O5p{0A7taX&K~g0p~068YQWQWJz?LurNZ^3)BMLtXX8@q zGtaku`!Q{^>AM}?9RXHxaH8}NAFC( z`x%3KYn*$B-gxxp+J1VN{B#bz*~(iR9tyMqv(ypZP2|N(@1^OXEUkRasd!EBgZcFI zz{BukNbtW#5wF$VVxBz4<*& z9`h|-f3-gPdCSl7^=l0$q;(gqGQ?lJev5iF(m8PG1zUINcpbGe)p$M0c%}2?djNL5 zdVk9DVqdOVUk=5ObH5YVwK;g`JNAA5*Rt>bKHpDaoVNUA9v^y-!AQqi?TIv5TKCu4 z^H9I`(VJ4Z+CLjdYvX$6&@)GGX=t-pTv_aF6a&J|H;lSZ%gm|bMMqvd^CgFl9lmAY z%LiUIc$?tKK6(2_iR~*-agjN|s0zFKuy$NQo;h))g)YkZWv_G)LK+{96vl*R)murf3kQN1c~#;-R=moVVYM;o z;hSY=={=N+&cP>*2+`Zj$4IU_qdO~CvF~;F!laxHjmw}y6zS@tS!~ba*f1;}A5LD* zVt-a|3aaKukZ$dR?6tmre(10D4Scq6QJ2`a0`5)g__1dBV z2gFMskRi4?Da}l&Kd1-CtG*SVBjT0=e4ZiUoUfyD0R0U`DZOrHaIDXPxw{_`+mg?e zQ`+M2RBy!RNl}|M`+AWmDbn`KyVFD$=?f_5kX4xrRJ}J4Qj|GTP$w^W&xNo%Rei1_ zJ*^6u9vlmR5F#*v7+>|U)-Knt-iw2cqhR&0_DZ6V*;hi&aA+Gqapm~X05wUThtm<6`fi;n9qB#l-O3USIQZk3s61BxB?RanKF1q3@U|90#`4}Q_K~z`tnec zxPvpK+%kk`r%qQN^$jnaQBXauira^+Dk0kN-tsb`y~1f_LG)L>sDSbNms}D?9yw@M zZyFudT{`zU!3A1PNe5j&$Clj}g{)FSOIpAQ*f?2Z_H`$#IyecUP&K+Pxs{DyFM(gr zHM#Ebp1BlI$nMAY+aSlBixXpJk0QG1coL!a`0(kIr|vHSM6;FnTJE1@uXls42@4Tv z!vS&sy(dc$F@mGcU$ElR3-3Gk%X0SZ`B7J9U84QzxXmjqe|dk$T0sw%qUzYI0h_qP~3iM;G*Yfd|SP!z|a1&_pBhw^`Z7K>u%}NB8HZ<6bL#5?Z-=p!#*_o|Lpa*CsOX8*JBC^S{a=*0U=wr#xMMhd)^9 zFIw&ul*zw4#ItzC@7~XYwA=z|$@1eB%Zb-b%ZaBJKOC=E?jjG;a^FV!j#!9$Ecawq z?){`+dO*2v<=K}c&zqxz*8bn*nfgI>(EWY38!NuUOaj@*stG33%e?1W)q9 z2=8Ck_d&`Cp2T_)-XI%!+TOcB-f!aFctv>sBZD_IIaqv}LV_n6 zAi}#fgZF+Gx%7+iituisT)I9!pTN5}f%kP8yh|YEgX;IS8N5$URpYC980*)_;QiK@ z7lm|`@rw0(RR-_5R}U82Th(6eBN5(18N8vdD2hLhz_`bzU&!Fy$VVs17rY1fi}3mx zydxl6$!Fsg;q7Gbn!tOILW1}A_>1t~nZcWc(EA+u@rvzzM+Wbmz+0z~;62D+g!j)f zcn^TQr5lY`g!e-kyw3ygc?t>M2!9dY|CYh~5Xk%EdnH@cwoN@8e$$zKXy?IVHb>a_M?|c($4^)1jQ&e_sY~ z{SL<$f}tzc?^FiweZY(OS@@i6>(5pO@4dkLtN?{e<#f$v@SX$S!#r1eoBTz18yUQ( zzNRRoi;h>U-%1AW*12jvw-R`7&)|)GZBd9ujaP*C)(qa`z|**@ehd7OZS8%32Je$E zXZ=PXp&Ym3eHpxu0`G%77d+8-5#BFn@NW9LI&Y?Ox_&W(*KJnx)g|&Hy#GCe_aN|= z4TAp{tNQOUc#i{5`;hAQ5PuQgf6L&#A9!5{W&cNb|4#<*L%3Fc}Y()Actgm(J%GfcF&71@8^~MR<2*@D{$ob?_9iE7tGM3|{v&)%ZS4$q4Uk z2Jer6cMv^3n!$SxctgNZ{W=M}j)%@J^p(zPuE9&W&-awGI+c96~z-3xDx;UNmlOj zlzaSua{pKM-O2M6p4>^k`(o;>ZjDvHN@G)aYOk(A3Z(P?Vc=cjx#rbn{#5Qp{!V1@ zJ`X(2yLiQZ7CoQBdk%PaQAqG4KZ@|CGk6ankkNR=E5e)1;C%*oH&aOP_V|nNu4VAv z4LsRe#4EOUFN61Iz4fj2}U!TSgNMR6 z!S(z74BiV#{k|oE_un&kE#M82AFo)ym%O+>PkYz-?wwh=M=3WEfpL%UhA5ZLzduXr z_ZG^<_CAoo`!MjHP2k0`Ig`QrJn*hkPW|^}0`D~$ymg3XSfBEW^;^rzU8US|S*q&u zrR=-ii`6=Mit@1?Z_42PF7RYC6R+5gs~Nm!fY+pu+VOV&BE0ux@ILoVMe%3^#yz&< zyE1q$058t_cO>wBGK07IApB7RFV^qJGI&Fms&)Q!0`H?4yyt-T^9j6IzmH__P5^J6 za%%58`HSuS-3(r@aj^VqfJLZoWm?}C|>cqf0cdr8NT}*h4kI;<}ZHtWf{DO zN0~1N!22@FrSrM@+QH)S0Pj5sywe%H?XjZx9`fTA>vtl9_etOlQAqXsNBqV5y*`6? zc)Tb+MSi>@yw_&%{tS5Q6cW7ey*-2XN#MnK`uz#KpUL2TWD>eKffwudp$y)Q-(1m6Kajxty$s&xrw*25 z{!Rw(IpFcg`tJu5c>gtncMD9L=-hb4`u#-)?|I-&Qb^s^$-CnfyYil_+%Hj1;~TG7ZZ0c#A4ntCNo8ZX zHs#b`g8{(brCiKQ%RQRGQ@MlSy)`TMP1h;+PqOchUgx_%m%&px(J%3eb^W&)yoKz$ zv9AB;|75u@IpX~g`$h1&@uS=$yc;M7$nt73zAC5r@{|0joci~+08g?$T^|A7gZ9h+ zQ#y-P4S-IP;(~kFN#whoE^4-{fzfZZe|2|6pMLhY7l#l)QmjPY`aTwvuXTL7izG}zkGkC@8!IS^o z$3x$b@NWFl>K(!SvnvC|`D7wQ$X}V28-MdaF)4yGT(R6sDVMh6LpL5SUU^s#V7cxN(rm)=Ps zCaU25YyM*WW;1wyg@SP9t0T0key`5qJ#)B_E9J zW6B6ugcsBCo<2WZ{Q3Wg&vhRxYwJ%3Yc)}R`bDJ=*Y*U}PJ5@mF~r{?t1UmmHCWt` zmA}Dst}6fa{2d}cy#~RoNt4J*78t3);>B4$L~L>ilh)r)F|gi0lI0&MzMA*nQNjQj zB-bDs#5%m2l3c+%n&qdQl=5%R^6StBnI-innl;rmNblD3Q%XhfzdXxFsgqoTSTNMz ze`%7d_ixSeQ%tY?ugvmM$|Tny8t*#%+mc+pe|wgHyXkB-{?ct9B47P~W4Qos&)y%( z-XF^H@5u7+Fdd8Fuk&{ZjkDlC%%5L(#2Bk@%)p~t~t^BhZ0J|a;=BYt6ruFitt^8(LpVQ&JSpMFu{JmEG znX>%7S@|5tI(olEDOA@W8qIorUTNj;D$(96tHS&mL}OVmk1#8_2GKy)^AU0+ zmo!iH{0HrOe^8cru>7STgUsf7`H`$WBU$;eto&G(Kau56Wcia>{$!T_>MZ}&S^jjE zKW+7`@auF|el{x)k(OMN{M6guG-qnn%H-Ez@hw??!Wdcpw`Td@n!W#RS^l?W`ESYc-;(7&ndLue z?fqa`>dEq#ehe0G%gVnk%YQ1%f6CxhSmmj#{M)ngZ@2O{mh0o~S^0Nl=Z7S@)isDDww^D^ zY;_G5-_16ft81|M{;a$tsns=D{6Lof0|xIz3GWB0!u%R6elRQlgIWF$ zW%)m3@Ty(-hqCe?$jX1f%AYB}|ADOhKg-e|EM6O)h-MwYlH#km|BbR#HM8|-u=tTO z$J0MrJQAMhlLN(%+WS?ZAFY1!Yq0p|S^C*5{bQ!9(?f^%V;Q_3%gX0 zAIkDSWV#9!I?UgISq4#cvcJ ze20Iucw?5o7xKM+Hy7U)(&9Xh!SBnyJYK5Lk7Vgz%F>?-?~4;ThCJX8LRuutG5G(_ zhqNfgW8(MO>jgrT>M{8HuO%HXeeXob7bkxV{{EY?{F#t{o8{kDd~=rH$#n))!g-iLvA^)TNK87XRtFrvpWa;Hl{&|2N zgTL=*`HzQu*&-iH9yHrGFty|3;Sn{Ve_GS^7nZ$WZWKmZiTYOW&QP z@5$29uFczXrZ}JFM>{plcxmq|3)zpwOW%JYOTQ~izn`?m=a2b2hWy~CLs~k_W5^4B zEu=qZ`41NVE~I5!d<_2o{~#SNeeeGb`NE9Him~Db5P{$yv%iVrXhrKd;Zyds+JFEd3){ zT6*$$3En5O^ncFMpCzsOKEdCy0{H<8)9P<&--)!lBP%PK-zopm>=^@Mi*5Zj;{3FGrAIs8z7|I_d?->04pNF)s-=~Vd%*wwALO|`2?bwz|GeeDvv_@$-^jyBuHq*{S~g$D;EsMFEC1_R`ZHPj zPs97tJsvCGQw&thr17d>mZk3?t^W8PtN%YL8d?5@EWI4cf6B^#Z?T)@Kb57wKTAKG zrGK5YzAqcCW5@?So#p>=mj3Udylk+JAs=`d1F!dGLv;*!z`dFX;nH}vvUDd)_pF*ybJ{HnW-~UkYpR)3QlBEa!roZp>#RrO8NXJX<`Kl~^ zGNiR0UsC);F%i-#`;y|vi&icF*`gED+J;{O|GHC4|BK>HwemkwJW)$OSG=Q^{^!NJ zYw2Go-djumT=BtL`e%xN5z_ws4;Q}_(%L3of(6aTL%M6}pDcbSq)FQR{fjJplNuT> z{rvhYJ)Wf>&eDE{0P#R{RPXVn;?7+=I)lhw3gFaVEbdfL_5R*UJH{KzgGpT{OjH)7 zfoSvl<6j&c(&D=DDKd~2M7;{-kc1sG2n5ltB83qZnFE40w#$e6k16)}ARb#R9HC{g zKN2Y3S)3O@?B)Xkj_I?Cm*XKs%Agk^=$LXjhI@%4lB+Btj~x(iOhx^%;&gk6i25@H zRA<1fLROQipud=gC`-bR5hmJ$lO@k;A<6WaeKEmf)w|bdiQ@3Otp7HAGX>Jqf3*EWFlfMr)U2m?jL zYmczzp{BB!XN;s`VfihDxf0m@(a*|;)}pQHX*k|OKd;b$6^^>-ZSFqOR+tixN^(Fv zG+&b;epmcrh!I2+?X(U~&7z&5XH_F2niCXoQ%4NsS&CSvfl=6Yhh2tJi_rbp3EEo5 zQ%hqCtzIEs3~}D@?MBuiq*bK#eBT`sAjo|)!M>xc!%nVWC%8zN`u#m|YC_<0zKC;oZ zx~SP2FmJYxM;RZ^leLg>{wM^B^F&0~ekw@>xV*AzhxL^h$O6U16cPMcX<<_B3k9co z*JqK=c_|~m#UbQS+@%r;>K#ohM~P{1i)|Jov+<7Nu5l!oouU!H6pkQ`$#9H;lC^UU zlKkN~-OB>@gcB<{z6+dhr)_Y8DTi7m-_*$x3gMPVor~2=W6kMfwl8QBS@@&s%nwd; zTsYsFwINJSL|@qsrwnf`bA-~P^SixKHUVLsZQl)iK{0V^A50?Eh36J1OY!MciF&{* zn&3x#2^YnPb=lcpiiJeKEN+#jf%z#1{WNU{7R1xS@-s?8J?eq)IJaVj^K^AAScrf| z9Y#DpqhkmQWY=yqi-5><$c35^@W)a>bLsGKT+yzOw4Lu&p+i-yzfP1i4+9q9m3WU+ zq=>hcoQPANyhuPjkFm!}i!0ra)AQps{J@QV+ac0`GX7p@b3N)_>}1fHO^B71m2gU> zPdq7K$DjlALEv+gaLH(>xwv_)=N=!svYbf)0STQ+(_!9~}xC4p~*<1L6XHfn!U; zR}`17I-`m5Q-mgMJDy(M-0QCko6`Y|yB&l#Pan<9x5~5VY;KAIv8KemAs#>)qY-|A zh=cp%45}Lqsij9YU9Tk@j88b%D~UO{KMG+MVbCg;ypYElETas9DZ{}}irZJMCkwf! zn%d00&Z+8UzG%bxF`2+E!w~X2#uzkeL*1=Y!8KuG#?mG9(jqM*K_2{2F#BA(0_No z(L?{qKjD6ZD)%Opr}B^Me#+Z>2*IOdS9)JE+#~l5m~VvclDQu_LwmyW zhr)fC`ymV!)^+DS>tEV=m-5vQy3>ER>P~;#IMFZnDowvnhH{-yt{3i)>CQO3HKd;p z_fP6h=iVIpPq71!AYi16?K}7C{wl^dq~D-B{VdyvBY$tebTvv#N2mKg4fhX)yJWF? z{t4X~r@z!ajt~825!~OHRQ~$$i-#F_dw38vT=MRPZ zw(h)d<4pUWC9V0d@m4#3Mt9ozobI&q!@ASXn+2bG-l;p|$kMTTzE^kP{cyN{DBM4# zJNV!a!X1#7z72TR@4C|-rmnp|5$?_K-0BP5_bUw?)kpV_hr5j{X&gxm-k9!ZnNPY; zvi^0aeVg3XuCDG>Lb`jk>#FXw%i6(s{g&!CHBkKLaQ`#iU(Nc|_gJ4S_2S4m@Q3cx z0gsV+A>?;LepmMy;OkEQ3%WBete(sVn{PDs)qMZREci7Un~_45hc>EHhl?wQ4Tf!u?&k)9xP*X~RFHKc@7>fx_l1-}}7M zmsm$?FKO9+2+kXHr+?lU?r#ov;U7K!aos8Rsc=`!MZJGJwlC^8`NbUiW8y~Yj-lNN z-Tx5XneKQNp3$BDd_Z^R(Sy3vI6`*Xd?M7L&7)h?-elewUZOv*>N)-SgzkLz-QoU^ z!}A{w>Hp0AcItCX=>%WcH~{BUNjbrJL22NAE<7Kme-3*8wDNg>I+Qbf%ln=1{&sk7 z;~3{H^$`A1d-WZ)_p`dQezd-|Zf@hQdLGxE`SVKM`Obpwz+VpcP2H*IVDx8F+}UdEZupG!>y!q+ygNMqC*l61y1$(BK-_ihAy@kaI|OMY-GTe8?%Nf8ct-GeZ&!ETdvmzk`Xc=?rD>=2KkrZKed_h50PmRc=bW$5 z{j}1TL%;L_eXQ23fxZe&u?OV44 z|NrOhPTXxO8wc)hWQZaeLdXJ9 z5RnujDwOxW&-y&q?|R=q;C-&E=W~7Uwf0)~8umW>Y|fD-j)(RBcf6%zhxPA^hV`3A zd;0z=Jg!6N__+V?{gQUR!+rT`TtA$|iP3O=)6REq*ZJjiX@46$>nq{?Z(JTu`X%wW zUv!?bhHc00le}MuU%$%7Qxfj0o1@{rx-}Z^tMC*_yRR>c+X?f}#}d&n&$QQ}a2)kw zhvP`QpTqTdGIsFUXn39vjfUe1yH0yu${h{!PCK5yzRrjFm5<|HjFf>wkE% zJ`qs;lcbIA_>yYF=jMp;^ zrPBWt{%%z?oQJS#+Ie_A8qUMWXu0I|FnxHjc*F9v^AhG+AnrHJv!(q{kB0rHz3ztn zr#&z*q;B~78pp#;8+Mh-8g?4bdwf4uD>^J)+V9zm^Li+Bygu=H z8t2nI8s^i|_!H5vk^jHu73UGpXLu^5owrWr5iVic{K6$qo8Jq@!!7%N^9%P=-gusZ z|GSSG#Qxv&A>2PDL&xV)r)bz%+Ilse=WrgsitCT^zCFBtrrq!1I)qD-_I2XcXxL78 z3Z!*BPqD*OI?XWkRMyd6*TU=I-q_(FDu?HN*6?~6|1NJl?|q`-ybg$l^Z#lzod2}< zHDSNu2MW?&M@vS-_P0dC_1zf_*Z0S0y|8{XT-URfU$Fd&OTu{l@cfE~<>jN{>rT69 zqwxHWjtSr2M8okt8UF5W*0JI1YIIzoU ze(~oN)1OIxD?-+{y}nKKyb8<1Zc(QyCn4W>U5 z{xAHm@cZ8P*YSE8-Y47^$HVL33(+v&_`kw)yblTc`QLT9GK|OjqhR!Z*CkjncDO$G z8Gk4mu0zXcc;57khU?WQ8m?2?*O72tM#c`Ny{}s6e14d`|A^NwZF?Ul?=$0hdN`~f zp9jsO;XJjBhVzs*pKx8$UjLW4pF*cSPs8JPhV`ewEHKV*R%fmP2^`hZCr|mbK=Mu4(C0~!zr);OH*TqkLj`f-M z8`t|f6Yj&b?bP#rEZmQM;&#IFwDYvW_YvV{ni$8!@^>x&K))Wn((8UW&!5Kr+;NBd zbARmMuhDRQvxei0*CSsvT&L@z;W~y>kjlC``Fb3mhv6Y<_w9Yr&`or^Xjs2fG`z^B z-QVHK(JyxJRgR3V^!Zb`59Y>R6W%vRL#N$OVLNH}PdKl&;{3vX;`NQsmnYc4_)AQ? zZ^H67ET0`+n|xlBb)EY@Y;Jod+P9Z+ss0rO!*le&W}QxSyA!;rtGYZgQW8{mqKqKYV@^4foRu7L11H z)pgPE{3suN!uyf1-I}q(cJGO9NnYRL>*?6o!FAE_`g}OL)%W9J{q*rTgK5`0Z10NL z>(iyZKZ)P(rrqaX`93auJ!u)2hk1ufntZ>*@RUp&54U34^~)Fc6SiB7Y0r!B{I3x^ z+~-ZA-+KSF!|QUmE?wgIPV*0sPrJW^qvLoupJ~@~SGv^X*xxx{|9c+q{=e(`TU;I< zcQ*Qc@_de6IL>d6ufyBIc?=z2M=p!&h37}!=#S2GFuv}^j`v-B9f;>Q{p{rV82f?P z;iiqRXR#lS?sLCh8@^74&U(PS!*zH!cJN#@d|gjF-#>WY^^^BoVIH@}d4fCU(3ZVwZ^CncQ#bdnB(L>9Z&IYcy@%;eM(Y*9)CC&*91QCw?yfL>zxD zxi8Z{p4{*0Tkwzn9k<7y_V_8Kt zRMBXbKh0`8VU|cyYWqE3i82 z@?o}R{Jb+hF75qbaJZhx+5Cj-_$`0pN&d&n!u!Cu-2zPed@OWjo%Xp`=&1U-AljTA_yPxU zET?k;C}+{a`5iy6XaNpZVZ zvlMUQ9jwcyjK6C+KCUx+aWKbl0YBqT{>0-{NWEZ>+=z|Wmop*5RT_NT)@w`l|S$-GhC6(=L!~L{27}#&s$la zkFq_VV_y#E41UP3xswN(IlRG&`^n9sEX%6AhflC8hjKsv;w4um+s(_F!)glRKCv-xtwdcnLD_j$9Rz$ z!#7TG{@Iw5SFsRpbOtjfFDh>x=)d$2!ea3go~Fi$gnU>x^3R{yRjDsa~Q|)O-|tq&f!8X;b&aKueq5!xQ7RLgunAN|KUYuER>wTY|P1gEWy$& z&&sUEn!JY%_z)juOSb28?91VNo3r>aH*z-*^EBfhOr+hfEWz@u&vxv_J{-n5{DfP% zkH7IBX1XTXZwXdlb=Kv>Y{zbVk*{zdUuXQc5#w>q;2bXGC;Wn2xR<{$RV3NYWz5GC ztiWn)%GP{_Jvo8X`2iPk8CP)~zu|X0#FMyRxFukJ{D#PmS%ZYW;NF2BW%ZR?89Mvn=`qHpK}xU@F>qPeeq_&5LKC8gX4yn=aIki~c%%kpMca1NJn4L5TSkMJ}vGTZgZJg;JLmSa`k%|?8j z9od8Z`35I5{@bnb>+Kva=4x)@VV+|Av)cH$yu6;3cqi-gQMTi=e3?Tzf$wr5S8^kF z^Dr+dlguY4%diUTun}AGX}-#FoX*`m!ZS>NgX3p$Ue9u@#HzfLce6el@ew}Gw(Q8R z?7`mb&mkPaaeSN8IFs}E5tni$*Kz~5auyD>R$nRz*LF+Z>2wJgI5 zyoI;(F5b)g*_h4PitYI{yYWT7!hw8^qd0++_zvfA3DXPCZnvfmuMo|SnQAK+u`z#bgHQJl;<{Dd31n}>Ot z>27g-cr~wMCD!EqY|f|Ho&7nD^Z6;i=1v~uN&d^Mw#yZ*ZC&j z<40V@Z@7m?`4=-*N#>J_MOluwvo0TDdw$3j+`wHt$P+xzEVm{5&CMdbfw!_28}cze z#pl_V!}um=@H2kR9X!C_`42NzP3D)Ag?K$H@lMv~BW%m5oX2JSlHc+GkMlh9R7>Vj zjOAF3kFq_VV?U1IVt&tGc!ue3Pxh081$jLy^DaKX$Jl{AIDn%#nRECF*K!;8@i+d% zOx2V5!X)B=gJ1lDwJS*oVXT7H9Hf zuI64IMsDMG{E>(FD^Kz)FED-02(; z)me-8@c}krbGGJ_e1^}lC;M;^U*~AP!O47=v$=qa`6*ZPD{kVq{GR)Hn7{E9|6%H` zY75swhxrIBq zmp}0r9_ODt&rG#EADNGZS%Rfmfz@~qA7V>(;tL$Wk(|g`T*Ot}$nSWFCwYNcYA5s0 z%_6*kx3U%=U~@jn=h%m@^9|16hg`{x+|9#0&G-Z9X@4HZ0xZRwc_$mN8K30y?8gzD z$oILJYq*6!@K;v2FPT?0-pj^p#i#iq2XZvu<3fJMHT;^Jxr2N76OZ#8Gu3rpvM@`t zGVfvoKFZE~o-grLj^#8i;wpZ_-8{sT%up|xUk(=Jb-ao3-++(T|3S83NA_Sp4(FSE zj~{Xc*K;R-;&Gm1ruxn!3$qzV@GZ{dM_kDb+{J@D!Sl@AAlY9oUcOd|1s+W$vpD17|ZfD*5QL} z!H#@^138*gIG0Pgj@!APzw;b3H%#W2n?+fcRe28^vo$;OB@W?uzQYCljO)3Jhj{OU z$$TE-HL7}xQ##ZSDt11M#(&~vj9u7BCGR0HeqW%!=4<((VWcL zT+G$n#P4~Sr}!VUKIA@QF_z_RtiuP{f*shM{WyXX`92qO4Y%+I{>s02N#kUGIa!$1 zcn=?9OLpQ59KcbW$XQ&(Rouw$c!(!?fmxa)^ShQ6c?aw95w>GD_TezT#hF~h&$)?v z_zTZ4ebZzjOodsE%x3Uf&VrzEc%Y2=0aTXWz3vT0n9_IySZI;X{A4~F1He-7}$37g! zH#vg~xq|DtlRxnU&oguLWIm-?nbla6_pkvU;-hTIcI?Dw`2t_&01o9yj^{*9=PZ7} zMO?;JT*r;v#_#we5Aj!?;gY{n<~Jo|A3C-Qx+=3XAtuepS(Fd(F?L`N4&*4#<|kaw@AxxM@ggs4lk7h~OY$bx zV0}Ky_I!?gIf9cohfDb-ckm$p;6+~kL^7|dc|C7oZ8l;nc4lwB#y2^WA9D@2avy)^ zc@}7!%%=&TU|05FZ}#U9j^H@H&1sy;dHje=xsq$Sfm^wYKky)r@&wQDJkzyHjw>^> z^BUg3Dy+jsY{{qDlY=>yv$%+>xRLw#8~##l_Vl#%{2A}qQRQQLE((J+>e3=9J zI>+!WPU9@j=VE@wFSvo*xSRWVgvWV?7ntGcWWHIMllgcJOY%nE%&M%(d-(vHvIX0+ z6T7h|`*Aqm;#{uadhX;;JkE2>^h|PmSMnN`W@Xl713t=je3mbBD93X;Kj1R1<2L@t zUwM}4J16tZ&H^mSimcB2*o3Y54101AM{_b~b1_$Q6TjzSp5lMZ+9jE9AzsIuS%dZX zFrQ!-_U5Y`%c-2pPxuA5a4(PYPo}yi^Sg}sSc2tQjrZ^&wqz&1$N?P5iCoF`+{J@D z!Sl@gY%;%GyoP0X3-99nY{vHN##i_nC-5E4=W>3@?cB#>{EHd7CG*U|t67RS@ebBy zQ?_Ae_TpfU;S|o{60YGE{=i@P7cY4(nP*NGW*Oef+I*0YvlCzBAdcZw&f_wE$!~dp z$9bMvo=@hNhs9Wq)p#$PunoJgH-~Zp-{nHC;0AujpLw8rGN0f0H!tatj9z5IoLGX5gP__^g}%*PTe&uYAf53waX@dXaxNKWD` zF5)U~V|Sc3@Y&z&?DHBl!lWaW+5Vr(DPF+|S>6j+tLhjx#rlvMj6e9yVrc zcIFU{=Q~`$&$ynuc!+=SKW2L+nO8nu%Zj{%_4o+eu^anv7~kSdF5>6h#6A3lXPCZE zGOrvg$m>~|53wbmVK2VQah%Ti{FGmFClB%@|7F&`$-J&&307cr*5$)&%V+rtU+0^g z$&a~)>H8)7&CUWW#hZC28?ZT_WOw%GNKWExF5ws4${%@*e=}qMWPVrj8s5MvtiwiZ z$*0+qgE^Md_yL#mEAHS=Ji!aRbU-q{ye!W0yq)*4DW70hzRcJ7250a?uH;7U=3$;@ zYG5+2%UOV>cr)*012*H6e4hO{f)n{Z7jq4_@CW|Nzj(=@WPUkWm}Ph?Yx6-q&Q5%h zgE)p$IgiWuCBNkX9_M*x8Jx^74~wxJtMOhoVH$-J)S^}L0(*@&&!nTxra zo4JE~cz{RvJ5Tc;US!7ClX+!hPF}@AEY9m$j+J>Q>+=z|Wmop*5RT(C&f`+9Lr%1;|Ak9^nk|(&tJ95( z`whR>G#Wm4$-^Si%TuXx`nG6T?+#s`PZ;l|2SszFQseYg%V+2X`r~L=?@Qy`qB&Ek z1NygU*xw)ef=)L+jK|N1qG5SXT~HU*H|Pqwn!Z!l(~q)~@gDl6XqeAr<1?bUQ>jII zWi;&n3%yx?8x89n<$so6Iw6eb4gYRwG|azvG(7$~eUq-OAJC0;OWjs?Wp56MhV2jG zJH|hV=1ZkM(_clye!tOsc_dmO+!s3C8_9Z^qG7%{bzWUmmyCwT-Nr`j5)F^*6)l)b z4b|hKVgGOG8G5$uDk4B56QcvmUqG3KS z>H&I)9;@GshQ}>8zAjoUmD-{AN5gi0)+crRhi2k<#%MSnSLi&th`v^r*Ohb)U0Xk( z8|#+3Z8XfMC&zLgw?xDKcSTF2Qit^)(J;TWI^EkzXNrdPu8D@nm5!E7rK;#!(eSu? z^+WmzK4ttl{h}VAhv>2T&1l&EBCfT3WAwUIYL7k~4f{Q&&ok4+WIS6m%=apm;w`Kh z4UfNDKd77P*1ElZR`<~T^k6+&Pteo#O#Pu=qF3uL^)|gr|Hbr^l6hv1hU3p24aZeN z*Nx*-vg3h=%do_z0hiR!XH_iH7+OiryN& zzU!&cFy96I*!UW5=Z}^jiH65#ekZXQZ|B48#@C`@zvH7-!@naP4g34p_$s|tZ_zvS ze*LrllNXI&@@}%-oYAnKg3+-3qWT71AsY5yl`Yvd8XosT^!8M0upS)^+nJ!J>zVpP zy+p6pU+Qgom;Ol~(WmrZI@63~9yz07zj<|0T~b%jmGzyvj&986(QrJiqT#;oVEp-L z*nUsT$8rXjTfRzfD-G`5cFHCfD&W&olSTWINZfCY!J`CvXmr zGRLgs@wc!cTSdd`PkY^&gQDShhDB?He?ME#jE3{Gn9Gf?(;M_oy+1LI*l%84N>|jk=$iU&{h)5D+p(+h?z*oYq(|xTdYXPuFVu^p;XJG{zRCD@{i8mp zkL%OX@VH#F6HD=KJ{Aqcrk5|r3 zws!*?^C`~cH$20P^TOl8eUvR4kC&yR;W#Qq?+X83w!S|aj{70~xPC&vr2FdE^(Z}2 z&*ehnpX!a=YWzq391Zh0&h#H7^SCk^#!KpQtYW;rZo=lqU*PK;%ccC5NBJ*v%@6wv z=cPcjPAYZ1zBwAsOBG#9->Va_kZ8jd5whspBn(a^bcVO?C8)i>$t`Yzo-H_|P18~u##ru%UeCt5yD z&(#a{r}}ffQE%0I^#T27G#qc1kCNlc9t~Zbx3dYmb37Mw56?0GqGUTY*qEI;g70z# z4>HTg$>U404xeW4=&4kyzkZD~xR!gP;kq7))(hYF>vW4lhwGRr8kXnOdG)m{Z@dO; z8*iaIv8(ZybYK0t9;GMhX?m_+s6W-8>y3J=-m4Gj-}D8hTap~lrP1&_yiym6hT|=! zZ`2i|;k?|($Jsd=&hPWOHz#l*H*ilhtbahC=H;Ix+b_mj*pMCBhZDJ&`*@D|mnPf0 ziTChHzRCsBa9x)~?@y)H>8;Ul9(L*j`mp{(pVjG>CF^I3#`{F))kSqlT|rmYcj`L2 zp>C_Y=;w7GJy4I-(ugOJU4Gtp(SG@Pd#D-*BhU2MuO9Lab28MpB_UcM^XUS&3AM-Jpd zF5@0vV4=^G?NnexcIDvcuc_2ny_{R4|Afyi^y%o&snkWCXLaa{sZ`NuIR0CrVfkIU z14r^rz8?+u-F&@--$uiA-xF<|O8u(OM8kb|PG?+`bk=BCKaVb;uhpe>C4HN&t?$!~ z^`pA2?x3I7J@r66RFBhdMZ>)3^J^aDU%cXrWWDmN#mCq=8jh=bv}r0eP>+m;^Du?; zxybUB`U|~Tf2;TDL;8gNQ(x5C*CzYP6%F$!tc&Zi`X*gn-=!PqM$s_;C)tk^xtx1= zf?3ujk1G%j`!5=OB$XX`<9Wy!4a=|4d2|td ztuC)C=~}$s_(Qr4pJiW;ZAI&KF3U7C&zIm3q`|ri|Mkw zjdh~od^F?p9L{^-|UxO{#hf}zMyLpcJHzbe0m5;G2`$og{9IQw1y=b^z z3!{&R>#a9L!|`s>d-Q&NOrO-}b!ua>y=>9&_$&0)x`-~LtFngiy7~d#Ot;h>br=0I zhZr9o4ae~TzvfY9`zD!R-e{}v=WV)tG|ab>uAv*Sk?|I~jqVaX5ndm4U&{ySQF?qd z>~CqbO)9m~_*Q)|8m`0fXxmikU!7%B=rFI#qhWbIT}WT2E3*+Fw!DpgQg_oY=s_H1 ze7v5f-_r~AV*R;Z7Y*~>Zv02%hm2pcIaywqx3ejq=UC3-S3JPfmSj6ccrzQYHD8E^ z^YluzeJV9vzZnhZak742f1sD@75ZzvDH^u(6Vq=^`pRf{KIPLzSe=hX!#r9=JET%w zbgyWbM<4x~9;x5fQ={Q=i})1}MZv_BJdvtyMux`hW z#=GlYdXRoikJoSO_w*dSSTEOWqG7(f_y@CXPsYo$HruiNEPB&iZY#odPV)+gLjqws&7N?5C;m_UvJNfF8>!(eSu;Enmrf z{3ROZ|2H%2NY>914f`q1T5K2%>$l=d(Xjp3Im-A%Jx$Nm3!~xt!ez$S8egw>=xBL>8s>daAJ?b#e>%giGyRXr@~c=e8s=Xm+AEd1M>mRw`M2Sd#=GekbbtM-9;4sT z@90_jBmIe9qrcMI^>_N9{v{gbcY!(fC0(4iupZm9Uo;%wuxRh_=d*fdG#uYty+p6& z4t{U>&-x6{8PB*s*-qAI*iRl^Kwqm%>q`1IU0dI$A7RUAm~UG?YkYuygCBAo_wx*M z97wivZS-6!RYBKfTfV{((eVCYoSwz6xGx%x^Ki6J_`X%AehMAVXU1q)eud7Xi|A{0 zd0k1@(6#jgy0LDl+v+a*dEG}3)FbscJyp-p3-rg)a2#KAFV8aT!DRV0tj@>y0^f@E zOQq&T!+BWDmE3OmA^khg^1S7_4kg>EUF%g;<#nuqy|0Dpzq!G~D+)^^d&B+((k_UmFeURnQMb!}WMPIyjYj zM!y&h$Mv!vqKE4@^<@3N{y;C)EA*!5;8bc`G<^O3DH^tajDJK2hwo#e@%i^l(&bn! z8pi9gNi;mZnQo^$M#FYqFy7zztH!5uG1v1bGaOAGUx1~f;e3_Xcd;3}a0uUwhV`fD z54nv;_-8b%m+seKIIhd0LsO}%b;)QrzB0P9uBz+ky1I#OrrYU`x>s~)`1^0saQ;U` z!}j0cN4GJZeXum{I;0l(z8 z(Xjo)I^%E2_VYx;`MX+|WgRx-a~u#2>krkF_!+lxUo@=uTQuzVbaYtw@AsrHkB0Mh zr7on4=^J%LeY>uy>+1*gW4g6|T0g6M>wbEe9<3+o>Cs`S)M9?kANU6|9Z%M~mNlZ` zIO|47q*9OSw$X5$9rW|Mryk02#^2Jj`LXde+|KVTKdArUS>x$WB>T-24fD#W^XihU z%sVZwqZ{fbx|MFHyXx+`uO6gF>G67+eorsdpL3n@t$L?EpbzUm^jZCHbVT^?WOAIB zMnh-k)yB)Ps`01T-S{AmH~vL5Jios&{#`U&#~&=u@kg?sg3)k(Z_o|c%=puKG^ZG! z9Sz%?Z~SZi!he}BJcr`(l#Yh~%In+Ml7l#nUve)qoKCh=h}HQZyK@p(a2HQ8)1S$9 z3a~O8vMu}YZ7$;)?v9>GrGC~InLmuhb3TqhY_>qi=-ITlMeJu-{YqU!DH1Wc|ydVfmHO@VJt!#m3Qp zQ>k{kC&zFh*K#*cG4tQaezHg3PNfRz>!M-5x9FPsZvCKcs@t)v@$S*Ez5d2WbCTuL z^*sHd{!Fjd-{@`8u)W`y=^yiDH8zii^V}vnDV2Iw_l}0+>8FS3(Rz}et`~AuG;C)d z&l`{5v!$PsO682k`zac>Uq)BfRdpR*S2xkkbUWQqch|l2ApKf2>~{)3;%1&;j`PWS z<#IOd}cK4f3ER0+{I(e7@jln@%ed6G|azxbVe#wUq2iT z+j~qush^I9_4-F=rc&dLPvI=ii-xaT%k)aUDHbyj1f#BZPD;L zQA6LuXQSb9y`xK0sn_*{XgJP^dZwPMm*`LRmwKb#rT6M1`ZxWTzMwN_NcMMGG|VG^ zG|a1n@$2=?x=J*x_h2+UZ<|@(&hn1ByY3YY>yO}UE{lfqvPyr&Q%rwJvOG&PJpKxn z;G@wn&$iJ|!|R`ZB^u7(06jvF)l>AldcIzySL!eHX8o<+r%&)t;}`WMVc&6H*`i@y zSFi-Dun{|R0N>!^XxPr@(G{uG7QH7L{@bsQ>67}rPGw3SpDh~3uFzNOBD#z&udC`B z`tE4he?7M1K+8u)KM!AT_3UWa-+aAHuZf2BcImzPcb<)gL$^!pAN>m=mDI-h1|e>{D--+B-^=>ce53HaZEJKcXD)1_#9P#5)JeJOmE;$ z<9qaBeN3O#7j%ZO?euHI`-f=wuTV5>x0t?BSJZd1p7Dmdxo)L9>8`pDUo$>Zzpbb0 zIeLL!5e?^Ti}4-C_v@ddVg4DjCKii^^~*%VvdYnLJXLiaT~{~Jk4M9Hy6KnL&-i%G z=6e3fQ_Pkv*-mbjVjVupXV{P9IiFwg2>)fi%aZMvXBFNR4aeIc`epcg&ict{IR2;g z3%a*{RS(l|=t+8(o~J+Mx5jrz!~XtZfyW%zi~OejTf^F`whB9L4vzjNkBwXgIE4 zqTi%af9do&LxWy0X4g*U=4i6WvO;(_Qr|91sorf0v)|8y;rHE0gu| zvkDutV>G+k5Z;poX+PVQ78E>hd;VbKCO*I?IFRF`;d)JqZVSI3M=yzn0ZbuJHY-E*A~ky;S#EQ&D_Hy zJk5)|EPt~8RnhOm=VrP>G|cZV-9R_eEp+>6cwEP5cs=iBypJBDM{{O0tiP7~c#+o> zNS0UUgKWq7SBK@{_&$w>?;UsQpQ1m8zh9xV6bv0cdnpzT>sMyYX!x^`yLBVBU}yH^ zAdZe63*V3FSv4tc^e<)a~#9>xsu=V zZ{{kRY_A;aur+)04bI~Ve#;ZQq*$`O0<6TkY|p`*#E-b1M|oxOWP26(C_8f!=W`Wz z@)$FgNVZduWm%go*@MG5mCLz{fAR8blkJveeYWB2oXn58mFIb7$z(g%u{s;GJ74EJ zT*?jni5W^I+snagS(OdhgTpzMi}@7~@(lA_mu&wAR_CMa%z=EH^Y{h7=WqOvd9F{k zUy9Y)nCWpQ+DBV9L7%gs3}5=v#={@?q#524rkNpKV)%A0t;5^?G{eh9n&I|Ovoy=H607hY z)?*vC=d00h(q88nPT>2|%ft8kT*Obfn(O!txAGv5Fuc^KZSOSGrw<)2RwiD~oGi{# ztiVdVFPbxae#*vtgf005pW(B7k-a&BWB3*)a{(7|IahKW*K;d(@Cc9b6wmS^Gh|4P z>q_QjVHV@{ypff88}DU(Hs&L2#kTCpmpO<-Ihx}+nbY|`=ka4MC3g6>wF6T;a;x-Z>G3$i3j zvr4pNDs?++@g6p1Gqz?szQC8*pM&`(C-Gg*;xew_SKP=S`4f-wcmB!0d65||O^)lz z=yj=7UKV0eUdJ0)oi%wc>$5pqvOPPpCtv0Wj^RX3u9^x-N z!P88iH8~%dn1i`kg4eM;Z)P>t;N7gtN7;f;vJ<haV|gRQm*DYe$OBI z3xDHTo@0*iUNGJtxmburS%&3Ui}$c08?yylvpaio0AJ+@j^QLu<6lvpmOi*^}*M+>N# z%*WY=9rz5N=Zoya0ep=kIGNKqn;-Bqe$GwY#@+mZNBKMdF+TUnho*^rIdoGsaz-Pn^ab0o*|ZBF4V&gDm3!d3i&+qsMTc#yyHIM4DNFAd*= z$K$=61zCjUcoS3om# zxR9&(1;61|e$O9ygva$54Fu`QosH}>G` z9LcvhnX@>TA8`pk=UQ&&cK*NvJj-*uG*5E;m$P8BMk-Z=rC5d)S(*2+9viVKTd*}d zu?u^!7YA|(M{+FR<7_VE$NZ8TxQ#pcGmr8V&+;NOgwKBBdC1D_yoSYj1IzO^R%dPA z%SLR<7HrKp4+ID>P!fXldoYxy;|@LTTTJ|5<;{DWtB$yLdD%fg(@ z!@?}aGAzd$ti^hKfKTvAKFjXx&AuGN37p0moXZ7V#uePoUHp+h@hE@ipZuGd!)Ju? zKFY@2%*UdcjvoQzrvH**-6w9(AtMGQ#;yt{djo6y)_&i@^e-7p-j^jj5WkFRkA-{3?p z;3BTzYHs8f{>-C1&A*tgNOHUxS%8IEK3Xr8x|vmZ2kY=YHe_QqXG=cI?(EIJe2pVG zo^Nq37jOxea|1VXFZc6z{=rN|ljFV6yq-7mX5Pv> zco*+u12*O(e2P!A2YYcKhj0uha2jWD8CUQtZsbmW&qMr$r+AjxiYMnO2lKNKOR)?q zu?p|v-E7X5?7(OE0$<`F4&_+B!FgQBRs4eAa4UE72Oj3HJjJuj6#h&$-X~d^pM`is z^#1UB6?hA)vL@^BVK!$Qwr6K{V=unK!F-Kxa|++%Y%b)-{E{2EjXU`R5AZbq;(ttk zZF1Z>nTLg0j5qNX)?h8xXG1>B=6sr6`2t^Je-7qwj^>-3#CJK1^Z5~%aRt}%YktSQ z{Fz62l7I3%FEUg3Gy8bIWMxj~VL=vQDVAYHR%T7sVSP5_V{FAI*@-XkCHCiF4(DjT z$w{2U`CP%(+{i85#XbC)NBJMqmrBl4Hs)YH7G!ze%<8PkdVGLw`4qdc2m5j$-{NG> z;#@A~GJejr+|2F#g}?DE&+(G*XWH@p$if`V#X>B~%FzeI&o%Q-)@D6Ez}9TXr`eT# zIDo@Aif?f;XYhS4;|hMs4cx)q+|NTi&QrX=)b+`6W@a|#VSW~8DVAkLR$~p`&ANP$ zP52mF@kw@KH}>Gm?8hM-#<6^ZQ}_-)#OSqh?xsIE-jR&HQ!{0OGZ#>Drc%Jd^fW-AP z@e1ZR0m-2F6#j9DIrC5QLSey5<5u36FTeB0puqR*U7*60c&ft80#LxISck+84;x9bK zvrLsu&ch|l&q6H0>sXPMSvT4=mAaoz_$XVkEjzIbd-7!t<0!ttiF}7MxsV_83x37T z+|HkQlqdNo&+{TPl}nBEWpCNjyJFhZ|D7N#K+i*9od;LvNwlvIH&Sme!vg; zDOYhlH*pX5@eiKi1*R&v515@-^BR_oK9WjRWEI}dTD*skvIX1nDR$v=9K@j<#c`a( zXfjw&0WO#BS`tz8uK6 zIGM9Jmy5ZKo4K9;4|{h4A61b)dcV5UNjFJ42_zwb1V{+`8XyP=XxPHOBcg&Kgg^q> zNW!XUL{vmn6h=^7P-J8gC5j4)g5rn^I-r7p;KUWg4P1kuyw6kT*C9Ioo%!GQ-uJ%u zb0;6@Z`J8@>QvRKQ|EN&N%vv=0KZem%is0mujuaNEU$%rY=kM;3fp04?1qDJIF7~3 zaS~3!LM*{~cn#i$cjDc6AFjpqSb`f z8g|8jI26a?Z1-oM(?2p57G+u$3ScIi`Enbgz<9+xX?!fo( zeLREbuvQnRU4D$i1Z;tA@B+LLhvR6RfLS;li|}eJ$HjOXuE9sJ0-wSixC{5cS#+*To&DDGe#$zI;U~}w-J+U7S#LI93&cKP)$CSW6MhOMvzcELQGxA6d0;wN|-e?f0|r$53l7VBXOHpdRw83*Ao z9Eam^3Qof^oP!JSMqGst;AVBId~X^)hdb~Ud>!A#gLneJ#wt9EAw8V(Loo*9u`PDM z?szc{#G!a8UV+6}hS%T%T!KsS9=so)RHw<`P2vmq6269S;(Pc$euby-44%VUJ)QFX z7>5a%ifMQe_QoMN0x!oau~f~M&ws*eZ~@+ox8ei11~=eixD#K-eYhV#!Q=P?o<`qA zPJO~L8Jl7ncE$cU7)Rk)oPb%Fi}^Soufv=1R=f`%#EtkkZo}vCZ9IUL_z8ZE-=gF*071OXM_QF9p3@2a~=3xQO#JRW#m*8?-iL3Epd=j6* zo%k~D$3u7=zr-`@4EdgI4C&?ML$Mw0Q26AQ5f=ixPYBQC~! z@P2#*H{y2OiLc?CcmNOM$9N2@@GJ)PcKXAMahQN9*c{toN9>ImI2=dgWX#24EW@kt zTD%!=#pSpXAHu)lCal1%xE=q7ui;*N7mwnHcmlu1U(nUZ>8D!g#~6&q=GYoLVHeE6 zL3jmb;#8cDr8paJ!dviOT#b+8llUyYfN$bH{0DxFr|<_1>dW}R25PA>$=CwhU?=Q? z192#h!Eu<0**FvDVmU6vWw-+G$A@q|Zo)0N6?fwscoaXx!E+eW&uM=s*24za z99v^g?1h7IIA&oE7Georh1cRTT!9bZ8r+DF;||<~Z{XkYJ$xU(P-hwQ4gQEfqbtLC zJ{aRL0UKj8Y>OSR5BA5AcnM}=HqODT@p`-oSK__61|Pw#>Re;C<1XBdZ{gc`1S|0v zet|#WX$?1J5~H)h~a9ElTgGET=LoQ3o7I=lgw<4RnIkK*(A zBJRa^@dNw_zr>UH3%Uk4{St)Oyu>fb_Rd_Alh>LLruEI^~ zRmN1{R@{!ea5wJ5{dfc`@dSR2Rd^P|20HtT#JX4?ld&nb$4+=5UW5a12ws7iI0dKS z44jEqV>#Z0x8R+47p}$ixEZ(LbGQRv!PoH+9>uTl6uJjF{S$(*SPxUMId;I#*c&r& z1dhQgaS|3`Dc*oL<1$=<58_&U0-wg6_%gnMf5#(OiQnRnXa+m&_h1Cp!G_ov+h8hQ zh!^1?9EKCs`NmAf=~#rba2_tfrMLoD;U=uWZTLLy!M%70kK!kI9Dl+y7&OGGuNNb* z4mQSS*crQFAMB4K@e-Vdg*XSV#v5@lK7ea*6IS4JxC7t8_wX}3fv44SV}3!;P$%!h zI84CC*bF;kH%!OAI0Q%FI2@1pSd6prDqM`W;a~7>T#XOoMtmG!z?blCJb<6#=Xeso z$Dm*{744%V?;m-c+V6wVUzNZq~U@CUO?l=@j;y4_S**F#F;(T0)i*N<5!nL>_pTuWy z5AMao_yHcrFVQu^X!`rM%W3vU@z>4!*Mj`Vm_AQY`hT{LMH+jtDWz+cpxm*IW*Aa2CR z@nw7!58+Y#3Qu7bp2eV1PP@HW8)GpMldvORfCF#{j=^!5iP<17q zCAP&h?27$yFpk2pI03UT7xVEdycTcAWq2>H#z$}?ZpWSYcYFtr;)nPJeuHPxjAcAw z1jb_`w#2r0G4{csI1;bGOw7k(oQK!o4R|x&h4h1Eq4fqT`hcDqP_$KbdgLni# z#$)(3ev7B^7xY}}?B9p=u^~3ame>iq;6>OQ$KW{3#B40XIe0BzkBjj({0rWVtMOsn zh>zpb_$xs36KQ5b_M*c{to zN9=|@u`dq5OYsVvhJ`o_=iwq;g7@J4xE9yrX550?aVNftd+;565C4H5;|cs4f5e|L z^m3=aBCtL-#5C-R>DU(s<8T~@yh0`B?jKc(MiY>7dcEMiQ4~OGuoPb$43+LfNT!eSxUAP(_#>emp+>Sf( zb$kmC;t~7|PvAKW8c#o9ZA`#M*b>`f7wnGxa3GGxOEC*`un0?W5iY^I@E&{^*WnZR zH15Qg@hyBCk66=3pL{;%vMQZ@_!- ze%yo=_$o*Wn^u zf)C&t+=!3k3-}Vgj&I>n{189Kukb9IOs5?_495g)gzd2tcE^h`0|(({H~|Z>1Q)7z z8M6p)$7T2s{uMW21@6R`@lD)^AK_QHiKb}xm8S^#%fTz)9InR4A3?s22HpVuXiWlNV zH~@#>l{g9Wu^8v!HMj_u;QjazZotRzX?zx6$G7k(eu&5MOFV<;&^yWLk1%Y2$=Dj( zV=whSWBTC`9D$jbjRiOZug9D44*Ux~qCOzsH;zx>)A&5Th;QNBcnFW;H~1a?jK88U z+u2_@*2VhR1Y2N7ya3a&FAl>|I36eBRGf}wI0tXSTktPg?K&Qgm>Uy@Bv(dn{f-ifG^>D_&$D$ zpW}D<69(lt?e$`9jKx;!Loy#?XY7XQ*cS)ma2$)5V?Gw+Y`h8=<8AmCyc<{J!?+P2 z#~1J=+=F}ZFn)l?@k{&>f5yluPWz*=0VZQ>Y>(ZrC-%p|I1wjfsk&C;UGW-RfXmfK zj9G~f;2PY76}T0*<1XBdZ{gc`2#?}1`~rW#)99P()F&M4Vts6mt+6w9!#>y_N8%-z ziP>0yGw>Q*fXi_uK7@b8C-E745&wpN$9M23eu!V-H+ULzTg?N|xxH0$OgSZx-!RPQLd<75U5&R5K;5iJ+bN1uM z+Sp93Fs2oDz|PnM({U7z#R-^&r8pa}!yE8+T!!oLQG6Po#h39_Jc=LU7x)dH#$T|` zG-=-!`Cb@ofXUbiyI?QuhnM4(n2Y&%o%*yfH{cRniYssxZo&%OiraA)?#8|NE`Ek5 z@HGB{-sw(#!Y~%=VLR-IJun>y;V{frw;3}P3$X;};(WXvm*G8lKd!~~_#E!Q-S`H+ zjR)`p{0P6tD)i+$^$o{pjKhZ57&~BRycql7P#lRn;lBJ7O=aVU<*i8u`lv0UA5%tE{cZ^!%bAzY7} za0_n5-S`H+jR){3eu&5MOZ*OhLT{l{zc7r&de|Dj%H!*MiDz$`4q*?1k^fGcnn zuE9s}aeNY=!yWh*zKw_R1N;;}$J6Qy5>JDkA}8;|NQ}m&*b-AQ4ZGvTI1(?xi8vX{ za1P#tx8R+47v6^t;s$&SpTceUI=+Sb@erQG@9|f37d!nBj#1cDebJbfn2KrG2m9kN z9EFoH7mKhI7vPO}E8c;t@nL)tpTQlt3*W{ASc#wDcj_+ryaD_b^>09Qc?`y5BTT{e z*a`dNV7vq`!)aKEH{mV#7rYxc;A6O3{hKjw;M;frkK%`T9KXcx@F)Bg-6c-BwJ{bO zU^2GAHkgK8@nYH#mjLT7UC?Nhu7f^xExpFL-<$Rj9c&pdcX(!|_U-g!x#E^Y9v6hAZ$vT#Jw6llUs`!2@_0Kf&Yp3%cey?e<|fCSy}< ziybgs-D^x=9E`*9N}PmwSb$|X2N&Rtcq`t4Yw!_#44=U5xD$8d8+a5y#FO|vhRk!? z6N>e)0k*@A*cS)j<#;6)V;SCnH{;!SA3luh@Ns++U&2@LEqogf;Zgh)KgW~!J)XgH z7;+Wu#{~6lV;W&IY=s@LGxorA?2m(S0%l<@=3^<&#%pi^-i){61Gok^;A8j{Zo^k` z559x%;b(XPzsD+cU+wfq2u5KHHpIr*1-oNE9EhXwQp~~}EW%P;giG))yayk~b@&86 zjXUvWJcLK_6FiQ;sQV>ed%mL&!!a7;upu_a4%iucU^))MVK@P^Fc`V!Tqa5l zHYQ&6$@kx>VaBvj{qlMFYNRn;)!N3St1-q5Q0p2qLY0ljsr8MSs3saCZ+{ziLt~27 zBxB~Njg2W+n@Ajk+RT`xs_bl~+QyjGYCB`rsU0OgRqbrdR<)}!JJs&SysGvzX0MuV z%t5t}F_mhDF~`+`#++1#7*nMVmj{_khQ#@}A&CRo?r^Rpm8tu_~`|=BRQ{SFXx6ZjmZ;*-}-;@Jh8@ z+OIB<_Nxn}{pwB9es!_5U%ge@uih^0SC>os)w`tq>Pl(9x=Pxw-Y4x>AJ9&ae-BCf z)wR-o^$}^my55*1b)&Rj-6ZW-AD8y471Dlni?m;TTH3E}llH6IrTyv)(thf$7*6N2oI1#^5-Vp<vh6Y@y0{Y=fzohF!4-4p3#>4Z#sO1}CaAt|ntH=Hnby#?#eUjtg-qF2|L4FRoK% z{5^`BaSQHLWt_c?ui_rui|=Bk8Z7;b$5o#(U*bts=GE`9N|pKbEE*lxk<#DjQ)Rvl z$0#*M`XA#}nST>8NsTwA3ARvWK5m1lYNCvH?5fKA+ym3qBzgUS1JuTHd~k%?M8-dk zQ=1tx9w(|T~m0*j1JJq6em{GC%ai0jgZDhTsTQu3KYpoGRC^@i)2$>RmPk8OxK)+w<96Js z%60N(d{vd}+1JdrONg7Eb4_!ud^QX zsdBvy$0$`M{}_x{<@%e5Nvh13O|XS37l$^Os>*da4ZEr@%JIi^b(b7}9H7elIs`|k zyXE-fI92A)@i-c2MRpok~kHxB7l*(|9D%ba`v0Rnw{6bu$%JqH;E>&edUXFuh zZq@lVSC#)at1`ddtIE9kq8e$;epTkt4z)y?KZmI@Z%$TazMQAZJbAw=^W#gZ%!~Wg zB>DUgv?x*Lp9azvop*9nnQxv|WuEy} zmHB0H9Z}|$msFWg?DwN*%kQN$FY`xPv?%k&T6LPNr{)_IA$_Cs!xD9dyw4gd%6za^ zm3iPTRnC8x^qrpfy;M2hSE=RFU#gtnKdK9jxiU_a^Z9S;Vq@A%U+ejsr`|68Abqaq z>lF1aV{TJd8e_koRnE(gG%x34Xo4u`;XGB&zdfp)clP^A<$P-_$4t+&3)GD=KGjV! zF4V{6K2xnQ<_UF++&8OF8*@sP^Ci21xZRjrR5?FhROP&=En`5>hnA|G2bHRf|4xm> z*W`P7)i;cJQhifiXC{dmhl*ujb`EvG;9~pR9RlTrumHsdC;dBELkHMsFp* zU2Vhb8QI?6SIPP0+&8(L`=*Y(UXkZx+_HXW6-5@{iRBNqS}+! z9g?^A73sXLki5MQkn_-9&n0iK=W;&!f}HKcRXH!alJB9)`I$>TUmec%Nw#09`B7X? zByX=Lmq`DzzMc2w{I&D3Ja6Y?IgjmpDtSAf%E7ktq2%p+m?^K1JW{UYA6B!Z{^Yl- z+0uXH-&N&&KTF=oSkv>qi7MN-Q04p|Kz@iS^FTiNVzo%-Q}U}-nHTnu->b^}P(}W% zI!ne&h$!X9t1@5oB|kvDO6Gg=g{s9C%;pbljR8cN>%2ev*e9W@+;+au`2sZR9DIIC*MQ8 zPxeQCoce&go+ZCreMnxvlHa1PHD)LIm(@q)bvpSkRhh@C$e&eZKJ(QQW&h!-%xm%F z6V=D%^*Q-8Rpz-7=-b;S9D)Z=0@-M40NmY{nM3s5f z6DI2MS7m-pB%h?pJlmCg4^`&dlCs&E1;y=(+9x?b9XfYNO}(I7YHDgylKhh&=TVnl za6wX1w{B@&oi!(hUfXX-hRY=r6F+j+nDaTA+hl%}pWrl03wbZiZ)VDMTTVIo@wleT zm~~Z2ZkU|(`s2P$9$X16$A zdtIQ#U7Vv!Ji!xmd|WTJarK&Qmv}>EogiPZov`(8({;sCeZuFxQt)_!^9svkL$951 zTgvn9Xt~r$AL)RPX|KuVQk=W~08Mt0nz$QXuE{A<5qFYI4aRLZXm*1ngXMGDgZgZ? zsZJeDQ2%}U{I6Ptq4!HN#N+iuN^!pW@=(hw4<^*>(Tr4KrIZ+^%eu<{@ML*tr2X-P zEcSZ(N!G7VxWAStvm%$7J~ucX0MtF|wB~pX_Ylk!OQ*bg?UPux>m>m&ZniNQHu@YPxQu&g#Lr zQ{>tB+R>WMnELNvyK;B!uQW4VGYj3dKhmP|&q_vK3WsSmb#vQWwM>|< zq(#_#xs$&!kdK!$&nsIO9h9x==t1&5D9_c>jiiU~lC*oa)FNc>6O#0L^tG^0U+~%k z<*eo|mOcsDr`tshk%8C774ps~X?3JtNJHM$?l+N-$X-JB>y}ZGx9ai(x=KuBksPCt z_w*KFdF{oTKA0fs7+38m*(&6aX5wA79~MFmPm(PXUA1r1%=_9~EnKyev~ou@)6!+a z9+8rDEk=rMdr2Vgmb(n8UdYk;vc&6oN7nUvbZiCrJgJJu6Dlo{+-%83?3ITB-f6GN z4x;lW8}D@O9TRy_9=!RQc13z*b#H;D-H}hq>fS<42SsLR(M1=_5>MnRX}GsoOYudf z%kI51G#wr}TbGw;Ix6xJ9nPhij)`2Yl`GS9eB=~)^v>KTWhO?h)iP(Tm2^^MkghXZ z)5($Tb@?3KZ{x^UbopFOr$k<$>3O1%YIv}lQp^IogTu93IvrsbOM5&4c*^EyqZM~>6oF3?T;N-y3oJByegt0sD%)}n2P zJ);$&!?tRg4%?<_I_z0Z(_zm!9j3P>-t9}Jt9+3Qbnnk=Iy|zjHs}Q{Ju0$`cJ>ZU z$3!mDitp5N;v*$#ye~c|>(`T7{as3Of1s;guN92(dGA=Nm75~XyHl%fqO(e-8t*bq zdyHG(fblNZ+nETx$4T<8Xe1@swyf0hY0KT3rY-kq+8rr(W5&Bm)3oJYr!75n`F&c7 zFY*aZ->>QL$i`Z!2ec=nB5P~AR%<#Y@ywrb{=)O!BJ*3Hqzeszcyz8_( zY^B!MsMLlUmD=c3YL)Kf(HfQ7RHK6*b2@m1cHZN<^KjW=j_&Xg?f=cGvXd~~wn8hc z6R+Du==2%oeYJrc6x4%R zlSl7fO-IPJL~FlK_a5<#R4d;5-hA0@(d&| z`m9E?jycVGLn`7ut~HiRiANgY{d|$`O5fuR_kPn~T5WsqWQ|>&sMUYAQdyGiU&?QFNrw1}OrJsjlHJ-3NHqkZ79nN&#( zm4$WR(iMVTdJ7!)usk2`4Rc*C_lxm5!-l(TMPuz0>$e$Ktes;cY{ngHs~TxDL9w>3 zQ7&8ASUYRfcG=pRx^=b3>$uLzZt6vO6I?IIE}UW$*~gc)QeH_sS zHDVthXd9Aj>pZdctW9D`cJf>c_x1B3mZbxJN zdUV>ejx8sZLKC$|I@pX9n(A%hnj;&;m&`0Q-WImvCRT2)jkl$J!WY|Hi)v+yiiy?t z%)G5_CO&qGG}qh4W)fqM=|O61GfA!o_q_!w_5*A-Hd(_6h=QzUI-?G)9=HD5BG z*yh^azOLnx@x^9pCHlEGN+vw^M{RG0YrABkj88YMrGr6gsYUu`>jHg{1$WuX=j-Cz zbg@3jVx88!p6hk-T3xIUvOuQ=ujd|JtcBOo!7U3aBrTmdKwfW2B^PMd4|M6=Vq$mb z7K3cY6Dtdhcd*U)V(-_3J;Y|hO}!-VFjq^rSeNfZ_?`2vuBWrP1ar2XHUDF?mmxAFc7XOly6Y9mjF0W5+w`{sBR9Sv zr@(lJx?YklyE?w0IL~-5wcWNP*7oH%yVFNa-IsN*m$~Lhp9Hzw9V8c~uUOKguJ#gi zv8g}UgwA!P%PS}2TG@Va?>qW-neq2CJD*zn{!^b{@zU6Cr)rctoHR(*0~{};Y_<-Qjq_dFQh zq^Qm3Z8t0|8+2s-=JAIYot`ynPALPpQAI_?E#h ztr?lWyWa6T_caN*`@jvIBfc+QJuRy4ix1cH<#%Z~WcGmOPi^0v_GEZsw?P{Y4jcaZ zy;po!)Gqhy1-F+KWv`tRGw0QXKKJe=Kc9PH=@~=@-78GvgJ16X}76=yuo9X{_txsBH^7NACGWk$9(LoZ?P?kk9TpUk5D^t8myWt7 zDB{Af?qLI?rQe&Fu&|5dIXT-%N+H3riZ8HANTjSHr760JFV@w(o=Xz7f{o@wV@>mV za_C&Hfzi4+JXsdEmo5Cw?DG-PuAqppFfC4>j`UaWUSE+%*=K_T&&oIrRIaOBrt5UJ zMMTR|>Z9AlM7z$H7t0pG1Ecl1y0lKRa?PpUb+GO_o?=+F9>v(_>ZduokmnMm0}~`m zCtX~xhcr*V<y62roHHeBW`0>_ z+1%os(ssFeL^DgvCd<1gl97WxDXTOuyZTufM7de{nRz8M3gu}TBAS!V%q%X=lupbm zD=Im^d}?u?%mBKUv_7*)OPA4~T~v~jnO)FHa&iePDa*HAn90gAwd-40r8(I%OY+L* z%1S!B7R<<;oK==(inAt5&8C`ubMngi$n$yGS@~wB)b)b2%raA&H?=Tla#D6~R*A{X z)Wuz8X>m!;EK^)mT9#Q{Qk0z|e;6Xy_{_4R={bd^Mq6$2iwdVE*@u~hlp))iqS8@i za|RYpDKfI3>9)^Lq6dx{nmKAt@0nAkK0%>qc41CQrmafe zWXWe17tNLhcCVREg-7QUWEJP?Au0X+f-+|pl;w12r;bv3e>tw1(w6MZeudJw(wvf6 zIg`zhA~_hD_PM@!B_^w^ti=4LKPTlENjH|}&6A30*N(C62<(>}-9A)~Q`Xe#N(Hi1 z={Loe(5^L=KPlt|w?OR|d!rN_(k*bK-j z)GjKOz9>uj%?|VkOvx*eLr_$jDYy6|WQ|^#)ti*ah}H>223lT`j@dvr7fh88HL@+G z`XguN%=~?moMmNZbbd}wu|42U-$g=q%vdk$mh)PYb>@q!IeTrtvSjo6>{MezR0-ve&DI`W%BkyPFd;rz+B|ant`mHQjIetGp7~FUhQ#^@i1cerTs=_ zjvmu%Og|Z&(i~%}l37$-CN(WJGfQ(OXWErZO>s`)iXfl>V|i(YB8s%kZ@aSN2$#IYwuufA4zqXA^yCNp^dkapeMJe=(5F zxu*vtP~$N+Q)Z_R+h5fqysu8Wwg(3E8rFA6zf99lPMDJFsaH>CJB3cMbDGn2c0k&m zb_Rd3&Y^*Q4RvzT1@kiHj=HF1E-lZ`E8wu(8I1ErR~R9OvU+p7iCw}>!Hg^OF6w|1S9^xh@4bH{E; zElP6obL6~hnRG?3QA6A3=xH-q&K$kLnN*Thn4Oy>SD8FL1(P~_3b&eaAvn|No}VT7PWPbuA~c`Ik9bi zPT|zD+@7hjXo{TEdN#F{>!m%bWSL%~YUYay^2*xUxv*`qoS$;|WF_Y^*S5w{(o2u@ zGCk$Y8qV>w*AHi|ah?sVBp2h7K-#W!iChY5%!_)W+38-cdG^9-=i`qALb89Hw|vxhtuW!dXy;8J3*na=u|#rDwZ)hRG#=%hDr@*KnE zKCiTd()6r$##}ngyBd1r9h-Kga|_C{=@WNqRq3{O{)F*{d)SG{xp~WdRO_c)=QOj0^3N^ z#!k=GSMB@+o@*m{d5@v`XS>A6#LJDWuBxx1^uO*;-~0@0BT2JKR*?4)s(%8>VX`EU z)+aqtQeO31=bsxS%WCfT-Db{ybicCu>itfTbj|V-rMznbomS(yJkr{3{kf-(eE+mo zoF6Si|CeE4y`FM_X0VPDSZ}_hrH_jPPdz5RWfJyx6z#R?=lQ-x~E8>hnFZFAl`9cm?KS0nWqg@J3vQ58_|30=MICd>fDAFW5v5 ziq@|?4#u&Vg#|blZ@@e7eq4`F;fwed9>UM?Tl^I@>OkvL7aODg22+>!z=5dmPU`Y? z_!`={YFYjv`LFOa2Fq~L?erIGYC~*|HZDt+_ak45OK=(9gAd@-_!7Q_hw(G~7JtQ1 z8O~ady4V=o;f0uiqwq?chO=-1Y8Zo-yA~_(d9?9e^87LK-{Cn7lXnz!`#4O&_ShZ! z<7l)|9#s>ropUVoU6dy>KXAhB-I`ufdyfH9m@4@nzhLHqK1y@j3bLF-)!} z_IP0mw#V)`3@<|s&(Q6zM*W4k=55@WxSITJ-r!9(~Neup-WTgr)(3yhZ61UukGI2gxa4lcmk@m^eyPvb7!i$~ETzb4TA z*1;sqkeeM{J`yKk0m^A%K!Oow@t#l0aNs9a%@> z;tpu3CuE1!adEfFlJjwKJ9Wbpo!yiY|G@26^XTyx0xHt{yATI7AE&EU6 z;`EPw{*Ab}7o@~Lh>JTUi)+TkX^1XyaUV&2iHln!O9OFnuWQSQi_;51ATBOm+8Bt7 z(+Q|LE-p{be&XUT(|#Z>?owGCh>PnhZK#fm)8Aba7pE8U>bSUpQlCIv+yq^RxVYiE zF>!HiWe0({xPx+F195RpG#!YGTcw#mT-=+wMIbItZ{YsNIzO=+?6uSs^jAB*5$;-ZIitO;^Op%ClD9+t<*gb7q?m055&dE4Y{d~i~FlIw>mCv zsb&Ikar(zE|9)KD<+_JIii_(dWlCIJCpo$j7x$*D7NNhE{e!qTy~z*6#l0$x3dF_f z-C`gv?qX?RATDl`u0vehDCwO*T%2Al195SB1q{T+t&{N*h>QD1st|~adqB&awN`p1 zDe@Oh6Bj4Hn6HkDYo*%~7k81SiHo~h%O@@_Seh7!i@QzJ#KmdA=O4tyJ*b-!7x%Mt zOCT<8yjJ12adAbm>L0|#*$yKv&UP4aakj&Vi?ba@T%6v91>)kC>)wfri_!)W7q?5( z#Kq~KIR)b4WXAt}T-^KGKmT4_TpQimiHn;hmH30WINKKD;%r-pi@Qd*BreXjg}69b zTpbs;Pt(N3b<#=^7Z;{&AuevWw*9wpao6i2Cob*>S@RF#;%udei?fv?E=~hd195S- zQpCmC4kj*crFPzL9k^ZmN{{2XS$>0>s7H3J@1(D?nVFtpIUxwgSY(ZP(Tl z7gwr16o`wPqqTS9;y#cr2*kyuYIhJ9r!PzbadGvu*2Kkmb!-wBXJgWci%Zkxfw;IY zwIC-huAZEhe-IaEn?+olZ5DBHwpql**=7+JXPZS_+zD+;ATF-8p7u^$+~?A&KZuL7 zyCN>m?uxj$2eih-#Yu_AOI(~COTUeatJ3~*;^MZ*R(}u|XLmweoZSg=akf3g#o6`{ z7iZf;T%2uBATI7LJu3roaT>u}9TzuS>l=uRYoImyU0j?7MhD{J^zVxPFfPtkG!PeO zYZ{1)vsDem#o4+B;^J&&tK;HM=x%-=7iWtN#KmbCdv#o#zOt>3i_@2X)p2nl+J-<} zoIPv*IWF!U?SVjCoINuC92eJ2%L&BA*>VDLac#7!{~|8#6Fu~SxVSM|R3I+y2iZ=0IGWjdKpf#pzoC|5aSvHM&(GF3#5TkK*ENo&TrD#ck7u{c~KLtwkU%&Q4K* zxVVS3y@9y68G2p?;^G=5#a*v^55&d2r{_l?E>1?%`M9{1da(aFF3xTph>Nq0 z55&c_)p7%IakeJ{adFS;FbKrO*=`BM#o2BN#KqZe`LE*QuG8uS;^Go?j0EE1Zr0KR zadGlDRp;a4Z1n;J^X{j0dR z>!qWKi~C4A>^E_7edUM{7q?cA$A9AD{u3AXUj*3wCoXPG=K0vaKMR-mKP)cJ1~mLW zIPQEX(Qm@!{yDDbUj)uo2b}$B@LY}fod0edUCjs~2^)~#)jMHx=gZOG$~)0>fv~yX zhNj4`;%mmw*$s6Y8%n)mhm^mO3^l`=MUoKY(QL%0J%Smjr-pf5obG~I-as-?tdgA z?zgdL|9^;&BP69pjOM=?5of!iMwA(Wn>CgMf+212&2IwbYL2RZCjePvrT=Wc{7rb7 zzQ3Lwh{YrJ_4grp)v>eHWAx8s@_rLy``--Ev%z4$iQ>`7-+wP0@1LW|&PU}ro%p8_ zbk$K%|BdK5J9`mrTO%;*e_8n4`S7?JvAzF^l+&o;|F0wEoN&88iI=MpS@}<)b2TF1 z{xpCt5QO`?0J=Ykn)}0Wx${wSfe`lp1jb2_-2aBaI0=)|x4o((i+&&PCT{@PpJaK| z_2fMO`}6zt^f~=$F8}34<-c4{V}=6TNb>*6xVVS4qxjLj(Eq=Wi@Qh;(2T%JtfTAA zm;Z7ss^j7wm-RaRZavM`cGjzY<|A3}*6Q5(W1wXQj!Iu&4@iW{u37`-wP=RQR5{36Bp<7!++x9oPN+>t?0P;Ph6bS5C4gabNb;wadA#R z{9h3lS0aBSRGMu+H11!<#dS*S=tRm*{Fk2>ck;Boo2dT0xE`jPaWAU#efhO9JKQNI z<)!b^8%OtXw+`7G)Y`Mx)jDQJRBC8yaet5eZ#by!=O_D^W@#CnGVaQVo&Q6{UlzT$ z$aO*R7vAtC{pubuUj&DnrqB0|Jp4{>bX9P9VpVYJq7y;2mf2jr6TV2#K38W~%2&t2 zDncqviYqO+jr&x*`_R5&74ePTXFQ)Y&U3X2*?0X(mwEp9$?IK7`WT;~k6LTld#~UO z^Fxm*i!xF(O!B#(em%FpYU|+OAGdbtnvtBL`4QVZr+lVYMo44L`6||4<*sa!`_(bi zbbD{#j&n@|+qKYAuWS2x)$r>xVlpB!Ov{0LZ!K!xpoJ}EK}PFET{BY3zgXO|K|-yM z7ffFi(m1=^b1KxQrFu?9)k@C@J{9V6_7c)~faIcF`rNpTk+y`@v+t_PPxYLNHy_V# z^-ulllD>7f_U#?KZD59}>?L)n8g9$l(JiCum`M(4tV^W49bt>keely${)}6zyiuNv zxQwM$TN3&`X_6po>zef{U#w7*GR`kc%2;0YV@&Ieg|df*vWHf7+g{(c@067B;dos; zX!FVEi=Xo75y@%6@z5Hy-ln}uJwAiYHNaSYg&A{Ptwz!dZ%Wj z*`xW@F*(M=!!vFzl9-<#Urq^L)_PG$#^ER2C(pW~WsC;hvFp3^6d9?>CONFn!m7rp ztryif8SdWoU3sU4Rc$3V{KPwwYLgnY*VoFN9DiN&kAhZ}w|4Ix(K`KP`gM0nElg{3 zvio(*<>*L%G>%#qd@4RHWZ9;w#!;K9n#liVQT{t3?s&JVc(vAZoNcwcu`9!Wsw(5p*&r$h}NH z40h@8lcrX!jjm-IPQ|<4tTIc-Wek#9H4AcT)nxUvr%Ytj-t>&f^%pwF`N_yt(N8`v ztN$gJQ>@h|f~;Ax+@ z*L}p@K51|LN?&{T-l+DWdt+@`YqrTgQcdgd9j@j<&7>A5F%|j|{HTP7yn!785 zo14mz=6A`6I9ipu)U=+tSI(T!X9tepjMaXczAxm59@+63-ep?f165m}3;A(t*Yu3b zY^y4_g~=H{lJ%EX+*cKqdP`MA@hw%6srOa+B%QkSmZ}b^VW*-@)cQfr@vD5l%4~lB z*sgxv_T6_nzP!=Ti@uX`ZwXm8E~A%Sqs6wZr#nVHe>y(tj^0gZG!L95bb$=l_r%wl^ggI2v?YoYXN>qSA|mzUi6glXlBdL94u`nXyK z?RCE+J?C>(2A`5oveIW88=1LXt%LRkzvI?Nc_zy1k;hQ4t`+Zf<~E%hugmb9y1FsFMHC})z>28;6IL=lm1|DEpM$_{xIW838{3acq%<9 zGSX6vTw@kiwU;v6r@Fcax2_{=OYaBQ4h;(Tq=Z-c>uW9~|s`T=R0XjnD=%&73p+_xhgXWtRwaDo3gr-_l=yQ^jXIAzP zvTG+*njJM?%Qv-4AFr{!*3{j)&c2U}9xPgO%I99(yTy)_qK~Gw+TrW|@zj*5!IeoF z!FOx)s;Kg|)6z3q+M317 zncq@swY7h+Q!7eL&8W9ou8FswuVd9y-i(F=A~J$6<+x$F#`Fu4BJrd8X$3AynD z67mvrbuXUwNz$|4lR*&?(egKu$)Ooe&1w%aDbW*a4~m``RT(ijDWl=U(@*#+{WcYp z93=G*9qdVNIMKPXcx-JHRKt{8t3pzvq<8Arehc)B z-aUlc`ub0WxRWwE+3}FX{@fc}Defv)&!miSyWG9m>ANmZ)vZxdQ1Z)FRk2P_pG$FX za96oyi$F;_mXb1xP8RpFy?@R$)iqob0%a!2xNVhT>nryjsrK0XB;|YM*mR_q8{`Jd zU6FHF!M$Osb7xq*Ewf_z=?JsDDm7}$>5fUuPe-PjrE)K4w)St5d*YbhB?ajjkgolq z_cnU$13&M`=Y>hMkNkLCgXGcGr-d;|1LTjKbQwSH74oN?o&<^mXFp>kz`C4 zP2MPv!Sx1e@)7yVk>L7QX!0Xj5ZtIhlP4wAFF5I1O+GGvryAUBr6z-dg-l{4280L^ZyX>+K7nqQ~Z`p;K?03j6l@DhQ$@s)B)nxx~Z1RFM6Eg5;NxFAP z`$L9SNHW9|GWjZLoYy0v;Z9QC{?`4u2ei~BQ{+i^9qEgZnRiLDmdCwWsvj~(Ke0K~ zqkl*mwnZMo^-1IIAiW!MwHEBYUfy62xmKU^&y}Wyyyntl66(>%h)~ZFc|txFx|eiI zq;C7O{Ezxr9vaCy`bMrC&x5jVsK+mv+PWlCKS^5u)YPsQY25Q=WADtivZRi$n|um> zoOi6dwH&1A$bRy~WOsX6-$b`+ESVgeaYx&an4RL*+Iyl8C(1Lq?yIFYe9=8*kvGqM z#~^7;Or;!F`TXsdN62Tjdtx?TAi3%81IhA@X1q$?UiDe_+pmJi1Ze^N7k25 zHTT8TkpbW>a$hc;`KmAGE!}gmdwvHapKup4KfpsPKs?AM~i`lBB?04tN=2yqXbZ#!W12$J47xPxMtjEkKl zACBWa;nq>TC@$tzJ(^#*{~^yUiHm6_Cz!WZkhXnYT+HAI$%Wb6`nZ@CeI*xZa~tAf z3iYT&+1$psmr$?-wU2{uZ%ptGj>f78? zaWOvKUxLj&9T&4jCM$14yWQ5fm^bujHnO?xaWM~R`;u&KXIxCaKG!&C&85b?92cX1 zkL11Bmhx(xd?kW>lDl{21+p;Iqo;#=e;qlLU&toLT_T6m_tg|lmiLn6*E$ipZH!;O-%56Ma<9FW-AMQ zWQSX2C3{x-P2EeROMJc$-1@gP(O1jN;j47#+CmOW_xL`vg?OSrlY#8}$Yz40Pif6Q zcI*4FA*Swg@_Qhk?}WR(oH5Z$Wsv#4bldqQTCW7Yuk3mrXQQtJ8+|I><@23(>*w#s z6&T+cXQy#F#&^~|N(%PGHf=YE;`EW(!JLaUv z$|>dh+*v=fpQKMX<($!aeqqzjVSij&%VbV}do)3khi^HynO=*+sZ zQmFk}0((W#zbUYdaGQj8Ysuci2HY)+yldp@5H?UJ2IJk;Ski+uE#D9Dqa69L!Ma)E zZF2rDaff9$mhHUX)t2Rxoeku@2NRZ~i(TI5w4f=vJl5M&ZY{#5YPzmBR}0PUDC@*G zST0M#@_I`;(cNIG5H?NgT<&i0mK>z8>6%&SZm?DQBrN|5$t;pHPphe$+uGMMk-Cx= zVe{oqepDbY-w&`(V$s8j^q022UDB#h`?U*UrLso2ZYm3MCGGAj(^vT3g^~>Q=wEb) z-J@&h3FxfmUMTlj;rn#E#4MTS+qlBtX%Z?OkRp8@{;nPx<6SQ`4d1U@MtN7t1vdPE zt`g&&EMqbJy%SQ{@&<#tNc!MWNyoSvoRJX_en>O%t_Hj0K!qPplPwZm4L;O8zps7P z!qp&HIxzf*W?H&T&`!2yUTc=lq-inU(+tH&RG5eO}o8O za^Cq1H67&DbKhU2f1l;?){}Poi?tM=w~cN)L(}2j$#PZmmuNc5d#7}^zf{vPUj1ww zf0?G^y|>Fb?w_fnKhZl+Mwx%sR!Jv$ua^_ZKU>qu-oG|3Psowjf&Hih2owSDX`Jeu4HQCiW zQaZ+8uIV1$K9Q2XPSfe$+Hz?93v|=I(xF#L=O%QMp`7S{T8p+F_Ka494%@0}I&7P! z>9A)tO@}?_blBHYrhj{Z3{#)?fHv-VO^16|%iWd#1uZ?w`=m^G{vDc*@qVfuvs257 z_uiuGym*bQUr%afzkzL1ds%e7RxrfpzoS4aCtn!gzf-Gj8tNAY_?Kx~?l-IS@GKuH zt0ZK~Kuq$lIIFAc!C$H6)0Vq6Od%1+yrwJAE3a#sUU@^)Zm+Gt9!=9LZ`P>5TTTV!4Kd^Y`yp8;+&e^v`(91U z7Y4j1`||J8y(c^@y%q0&?{d8_yI*_jpjKG!ywW9oNYftgc)48p4{O@z)lZJ_zpn>1 z+}luIjQEdeI?DT_ZhKVI@`VA1U%DagAnuQlnX) z)@aseHJWwIY1R>~&T*}=TybvEQ|t2_-PKca$qn~^(?n`wcXhJHu1?k1)wj;B>`DKf zvnxB6zSk{1&RF_E(>^(Dd!=Oe%TlucM@=SF$SI!YKmB@OCqLKN$(b5EIqU4i9;RQM zo!FV{*Bb3PXWJ8P+hbg|LDAa=$gW(jZ=|!EM0e5g>9&~`(T~-YOpr_W+$OrYOs0O1 z&7?{#TggKI-*ol~c6F9?-DH`4!u?^cE^-3L=}8vuvK5WCQ>@=+T=pi-A7L}@Xj|1t zn+b}xb&Yb_%0}B+qqfV|*7)1$_3M0V3C%Aep`CA)BnO=KVYv<(eh6Xbf}iasl^ zTKo;!M?^izG-4lldNL&0)_J1sS)1(oSqGVE!hyJu(d31&pNi8R0{3aU!Lh;Gg4@(zlrM-xrK<+FAVUvuoXAa`*gZ!X`k># zUnG}Se=A#5OmwkaC;Y8#CO-NTofX^IOk(tvdiJ-qnWX5poe@=d``6OE1kjQ|K2G%D~h94fkK@`bw*;Ul`!; z?$Yzu#OW6X_82CL~&KEd3X|CdvsbjgRs7a&?u{(&??< zu0E1B(RPaJcM49WPSjdoo>*CNS;M^Ei0nGDz6l8G{5x@ou$2C1bM z88${2=z}aMwUr;Ji>K>ieUQaEt%Z6f>f!~uSRZ78P79%)*}7N@57)sh3vQFNbm9Ql zQAtF9rN?)mOXn67y;ZjG53(6g^kX^{2iuGso& zGoI+@^e$nf&G?+27-ciz(R<{r0RL#4iE_GSjLpP2-ExV|#5>(G)@Bl=)_MXr+U$>a zeXaZLD~HWr&z?ahdVt)n`0Fz&kLYE;v8#`a6kqh+a_{O-aeX3fi+7GqCp)SWo$7US zT`uJeiGEEFX1Z&QWX4Bt(NWsp4vgG5{e(#WP}c*}Q&-377Y6t*wcWNP+Fr27*_}RW z{K+Y@(Pgenq;Bpl1LZPsgLbG}KVd53Mw@g=g(7aU$rVYGTx64HracQ#BX(5 zJ&&UrzMibx>dYI}NYfs#o-I+yhepe`-UD*Aj%s{B$_cmSN2O>w$~#84ZKCOzhVqfN zCaS5X;~UCnmYb+%cS$<2p?q|yiE3UU#V2`3$u%&l-3CcFF$ptd@8J#8(V~CiEN=k zG|^~wlbA$}lVlPzX5aUH-zRahPhut}F`4YkWM5_`$z&$)_glBSX*2UYpZR@$?;kIE z`&ON*Q>RXyI(3$NZg(oEP}+|iL-tWo`C{xKg1TjInvK<){W3;?U$8#<4*7;%M1h(5u($O$DDeqa#Qt+0 zBx-~GU?29L9^&{|AA*ebU|3YMi^^H%&r;@4aGUmMe7fMBC~nx7k|&`Ioa2y3<|YF) z!Ka6DtO7`15XKXi6ndn3nd!;a5;T>1g_@^Z&%zYyU_Rgs&B#ds^6EKYib+jg zp&%*s5oC^aXMV!M9)NM&BW0Z_J;0si_+RQj3(@u5W82X)tyuJN_qYM@eSF!-G{ED> z0(MyoP#bqn72sHFaS7mD?jgoor=iB~yq$m(tvfN2y9;gw?6%IFgwKfw0ViAcLcV*_ z4}jCK9SV5z7?{*&6~lGiM=b=LrH#BEC2}7)o*z*EB;1m=p{=s4Hl6y6Xl*LMMz6$g zA``K*D+utgZSNFtl5xL2=8J zEzmS|ANqqeKoGC`1~JQuF=#~}6rou}I~qc?lSO#{2Y3d7G?FFGKaz(i$kRc=!k0{3 z{fgzJu55t#5EBEJv<{6KRZfT;B$olVMeFkB%n%9z^~$5{|d9SDgP5Yc-VKZ~_p=nXsYTf+tLL0xaDft%R}63F#7vM1Uv9EFy$3*jsI z_W1~Xk81YyaJiQ>dkuo#cHQQ$gzwVrW5IE$ZttE3BkJ~w9B}Hk1#fssx8srFO5NU< zjo+%*?I)qnle#?}*$?XWCkVP9==Lt`I(@I(cg&+szXxNoeIepXw!H=lO|`FraSmwq z$T^yJNV8W%zfUy#?kRYlpxMWR$>YIDlIKxGN1qj6P0E!7eqL z4d*yW(3Pk;LDY(HnpT6SS@{-xdds- zgCL==2nmTrioQ|`)72O734N6yrg{`{UtcZA04?<_M5FBCo@c;r8F0AasS=H?*WuX1 z(A~h!ZFm;b<`wG_c7sE_R864+~MHtnRe4EhFGD?3PuArqE*-$Sjlirbf{}^bRG}edC zVI7J=@_0wnn@0kkz+{*6G%z2a7-*zsq#|ch!9O6;I1k}JX~tJ5C3OdsN=zy~nW8>k zfaDTKR52zoNu^Gu59I+aBOGhZLh~feCXCg4I~AWl7kN|pbEv+g#ji!=EOF!<1ZPr> zBWKV|z_pH?tEf$#$gw_{4tOb5NYsoI&_GG6&H-ZFFb-f7)s&6sf0BWZKrII!oDsr9 zbZ;2X(31Ml-P4j{bU)IR)GJmOh1AV(y`+JHxYS+fy-9I`#Ht_B4U-1x{A$E_ZSZik zbW*%dp-B&*$Geh_Hg2LcemQ26Uq&NM`Kj$XL3DKzI&f0GAcpFg3uL_@Cf4tnz?zK> zlr{|-xRY9q;XX(UqH8C$hopT$(H-(2&ZQ>MLY;!dsyo=SU4q1`Bsf)4P-0G^nu-QY z>X9%rOdFhpu$k0r+=p_8oroscVkVtnyv~Be2-^+E2s*``XwcPN>QegLX~Gq!#D#Vk zbewpVfgq4{hU6(!FU|sTrorbrQ`KX1m9vZ)U@KB{&{>jp8f^O#bw7=8w(%a2b?PxR zL((}0-MCSmLDxA~jM$@+*yg)L^rjINbAnpZZsSwvxy5N)g3{L5#Ac8A3HWHX{V#?# z80V_Aq`iiXv|+L1@qp1xy307hMkTofNxIv}#N?~|oEC9rE}5i)12Ft@i52JKqx;knq`Q-6 z@aegAxB&5fCYL*!RW%TBr4vX_f^Cx*@zE-t7`+HZ5|dYzGXuA5lAE{d%#aHel3O?@ za9Nw7dvYt`Sj#sXusl48*Am#wb;v22gt}2<7?0OdQ(#Y@=dC|d_#NQ&ynP#FYu0^) z|4i6rJwo^$!m-xx3BOA?-g=hsdxR6MKN5bQu-l@Wcs?MUY`sPJL&9lV(rai|pJ$|= z1LssZsETK_z}kq$_Ik}TPQMTp!&6H9QiEr_&P=f?xd?0%1c_H%6MAxV8Z1#66rC$w zo2z@)D(Mw?daP%nzM3U`jE>`(EU>1&p8;g5em#Wp0UJdmeS&V*=IPRVMuD5#*q&~g zw`%GeIFlzRh^|IsTIA^w#8BKO_Vfy3s^j7Io{c)^cP>?jc;e|3Bt~6>2JvhXBv$Je7w6hVqcG~)M+Jg4gS+nP3W z1YYCUJf{gVdjx*+#dEsA6(hOa8*$ zI|W&xIH-Eg7G$O3sOmXKkX0i%ta{EBWVJefEGWAKS)+cW&btLUTD3zz&mKY6svB5= z^91p$nuS323bIaFw9{_{saF*hK+YFry{gLsa)BTX>Rz~t=R!dm)q6D5Z*?vsTbxjI z3QRBkWvG_675$^yOsOYXwjoj)xG>RVFC?XramZ!uLU>3C5RSLlbyHf|b=}tELjiBN z9|lXd@)1H)+LG{jr{#e%DIIjdPptD20C&>Yzn8~rDaR82A)P@hrJL~2UN&D!kT525 zccS=|9wIK?>xKiS^s@D0b?@acc}gECiMsb?MD~)z8SU@MVo-FpvuVaj$6oGZYF;F@wG$C(!0%cXkC zNz;L}>E1c$pD8C3>C(M(3xJ%;fYzgXYtb?(rxEGZz4VQg9Yi+j-lZ5$QqCaKr+Ys` zCrmk$qBnsJ#ig7@$`;*Q9S3CRbQHZ^_g+Kf+R?DY0o}_vUdk<;j33m!rL4~#oFaa& zd;10gd5rCXXUZk4!sA4;4DUx&=Sf;;g5mvy&G!_Me8W2)ohapLB87%`BOB)ck*S8a zf?7XAq{#5zLTS$uDKWhHG}Uu|!|+*dc>j*6SIP?v2~QecJ|s-sF7gL&Lj=7JZA90j8H{qEg-_5@UMbN9;-YGZD-5#?uDx5Q#OtSJEZlB{IA`v{^^sYcRNco7AMAQ2Y^L#>NsOfD+uTJ@t$S~8pmdIa-DARiy zb^DBn+w`7Ge?zAYT$mGQF$OGAVK(C)spgiTIr|M9)KW`%L%!CBTxUzm}Np z8?Z`9NfE5nbWf@PmMU18=^ncPSh{`(^368gPtYARgf`D~|CI*w32naVek2>1Em$Rf zWy8fzpELy#EZ*~b{TftLy}(HSl*DG7q2n<0v>+~(#)0L4j3u#{9>ePKp11YG%v6S2 zc>Wy9bj}nY?}Re##Z=n!t{|~^#yAJqds0x+oPpRh_I#l483zHJ;CMdL>8F}vF!6k% zGn&MX=-Pl#{h4sZt3k-)`AX-ApQ!f0mptFdW{g{TppNG|8Elf}0g~r?K~mH!Wc#aV zkT!yQu%5pQ;!{tf^LT#LFN6YFYBpqgvW?#X$yS5W`kt{ei(3IJaceow)s31au(~&c zM$*Jr#gO%N) z4k2QBW*DsBb~Oh5%QI6XpQ0{9PR|n2Xop&YLOnHt>{Lk{;%f!jrN*FrJ#~WYRU_G8 zO9i>msnRk*_BoYZE|tAh1rZ25D~xC0kT0Q{JfW1d9sMWSbF{%It{Te0ur^dJKB@Nj z4TkYpRa*#ToioS8yg3brAw3NSgOcJidQU+1vo!UW3Ls6!02JX;GvITcWE70w5Pl%ay1HsqH>N%GFDBtV?9`WWKtO9pG}wQ>kXsde=+SuTVd;qd3PX z*NoWM5Y#-*DaxbO$LRSU=Md#u^)P+*HlrF47G>h5pp=Wh!3sP2wO8222Osz0Z@#f9Gz>?Pg(n^~Z}EtWW_ySws$ zy(9S!>Fz1hfxRo7AL#A{bcFW=`$TuwvLn1N`99a(FR?Zs%DG;=z8L441ho@5lc%oI z)L2Jf4~3WZNU|l^+wpD&V2t11O{s{dYkzHeOI%7Lf}9h%jLONO**`874FTK^^cI4fA#LpPcZeq;tA% z{)@0L9kX@w7lNZXS;x;*5uTvSBPyGIS1OA@O^qQkTM%qVzK43GnU#7o z`M9Pus|0q|lxA(zn$oP3OtGq)YAn^;k%iCmS!@EA>pZ6(8qS7oMEQxjxlaEGlOYL_ z=6YSG{;CiC+ziMn)TNHcjMZ!kElHa&;G4~Yq)8w&kC7odTg8xVgCG+Wk1U$)qD;QT zKC@HC_(F9Y3NyFJs618u%LQbs&Inhc4j`zRCkQfM9m2%P+$Ko1dYtXGU62(jgW|dm22pgADx~||D99FdC6Sw? za@*Cj^v|0`(VgnAY~#DdQoEFoUHcxH9Nnna!nEeSGXJ<$&85dYD6N0H>KqE>Awlj? zTtt`;>x>6?s;%q>j|g&?dX|0nQDM7V{f5ohV zp44M7s645zVmZGTbq=TxS-Ar`7Y@&4 zNIBoD?6E)&3i4Mq!vONCOx1pHe?jZ~$?*`~y@YDNCbC_+`#wg&Lt=$k-F+6OROag< zBMzHiqu_MZTO1FL$be1NLmeT3M&YtC+%aO%T7~Aj`U<2ue))dLFFCg`KhT}I#hrAX zkEOL@RSUi1Q=Q|0TT5Dt>g_Zq8fi$CnVMPXOlf3_X&z;;FT|=vw9gbl;vFxYDI;{E zdb=EySuzN^We#VShBnkV)iY-s90!~!ra4DOt1g9~ve(SHGLZGCN7zF11lgp{g#pa@ zf^1P6+4vQLY*))@w}o=@{S;ZJn~M!D#CK?;cAD#q1<>Ea`LbCr`lqzuhe*x!1}&4q zV;3f7VBpabZo|haKw`rToG(P^*=epdx{;RBtC@{r3oYw8L_0mTU?aM*eGTS5nmrog zb$dK)ZrGzZF4$Kf2)b;Z`WRsUZ5-Olz87w3*?+@ltbH{caiBd2%^zoffU#qceF36< zygeQ!8*Eo0?-2V7R3X96%7H$14#u^i_D|@J!|b=9m9i6uqmk@2m~0KVe-GbFvTsGo z2s;TSCfmESP-puZbnF!SVXSgf?M}3MnwO3-b`vM?HrhGlHCmVF0{GDH`)Fgjee9p9Ns;} zUJ3bA?THIDZJMo6?sWU3Oii0%pADN7**0{TX`cZ*7u#P#@+|vbDC<$p4x+-3Y4%wz zO?zCk|2{#}p3v;eaeGp;PlXwNui5qBe@e3-f+|mIb|Q4gbHI0JYuX<)dmi#VquK93 zoo6-sPSBpyY>%O7&ujK_wAc%peLteti<(`7vR^_o4^Mzq@A*mtI26@NeS%=>>#)M% z)aU1;MC;hGNO)m6Ks*nJ#MBoFyR6yprqq`R$6BYy0e+dU=EPfz3jiNvdZJZ~Fp>Hy zVYl@VdUooc$dhdS9kxzAv=wlg1t&y-O!rxn;RmU2GCj-s45mmu%=B#QZ>V1C+rI@o z!QzjvrM|=TeCuNj2C457F0?YK{`-WdT4%%hsUHw7vhvU>sUH$9!D~Q(KPFsm9gUct z`YGZ0mTwr~&j?pqt5}yW2v=Lzjsg57;X3QbSioOXw-r_lK2yJ8`Wow8%nVb1xD)U? zs}1d)`r|Wz8?Aq!KcxQj72p=D77dd6Gx^)pwbWnJK5ceRh|MQUB44-`_vMQOsN@yT&i-|NVfh8C|9aeSc6RcJ0RDp zlPPVaJ_57#8&w(RiK$t75s+Ke0Hp=sk-3nspIt%f!wRQuqaKPpkEE-LG?A9 zH#JB9J&;G$pXo>i`jZ@I z)k3yRwSF3qL(ZWFdR#o0)|l_i2Rw)s4<{TAc;s}*WLt(4JIHk&6Xb&{apdKSKhAYB zX>4F&j^{Iyc+OQp+D{VO+aZNg?`JAozCX1;S2*iSWTF>DF@=i#D@gJnmagEC8KmRS zatcjE>LB`pLpm``isw=uO68GGk8tQ*w1f*?OcMPgio`<0^kYb;%Q*Cq3C~1=Sd3oc zP-rC-btx$OM(7!Q$PsZtBr02);eOIZOb2296FkX-bu`@VyDJRnG4m;(dMM}XW z#cm@v+c%yNmQBV*DP-6HEUgr=bcm65?AJi70xwd6lHdA*@J6n-bgK!$G;K4LjTPmuX8*> zOFaXTFE;)BToS$nA^id#&(q{_e)@&9Elx3JAcCa-mYHK>(=S;?-YgqQawZZ>`UQaZ zpDDa!T=OaL;;mrH-i`>JzV97WBYPG_TsjS@ICY1*q+docF^TC{T^A8|H8X|8T|+ol z8$){~reEucmU9>8b%Z4{F>8BuVro_;5{->oe$VftOniK8N{*uAul&#KJ; zd>`Q~s~oX9{eHsP)_gcm`U8X~SYAvA(jO$8Z+(hDo&FFFUTAHFI_VEne3A7{1>i?e z7wtjoIxOAOA0^MD)@5jq^v9^?f%JKG3$^seV@mLJXY9O1fS+J`i#~Qj4U9W|^yQbMUkJaS*0}Cp9oK|_N4-Tjg>33&cqBe{Se{0^lDc6b;3RA)ilN%RBf;IJPr0H z^B%OSFvO)FCVbdB7kw-JEy5pIDjo3Kgg>_uT!7!%fV|&(OJV@O$5YPV8{TIyfk}T~ zDrtI?Fc(b!Kx%1v|H7($DAhE*T-T?6L?LijJ0;5cV}!Od%U#^lb(#tEU3~Ngyl-c@#I-!9gG9Kh44D-Wc0O+ zt>kaCQV~`%P9S`xRSsv(*hcsR?_#)4#&((&&md183gkp0`MNwL%Q*Em)C3PC`H(E* zG$KX1JS59Fok)o;56Loi5GmK?Az8*5MDW~_56LplBvPq+UqFD(IERrJ4>42V>lx?L zAF567t#HPSJv2_8>3t49lyM%BrKZ<_jWd2DW;4BS!VxmgC$il1X0VnQO$V|9PrukK z7ZX`ydY{IuHRBQ@>ww^vaT$%#XnJRj2XZ-)7SsDN%ek6ImfB43i={wr-v!-vnBE7+ z0=b)PJ6zs)TKOIpy3^(T4GX=O$k{IMUu+=vk!_dDdkGuh>9i8`EtmI1ACPA_&Sl4V zf1=jUl5Ika_j^iv?oyPKALCtT0(t3fAVo3WwP472g`)A>v!e z<5RbD@M+kqrg5d+VsT*e>AqX}MG*GZT(V_MCtER=yM}!mrtPMdItOvbrL$J z?@_`7t=mzU?=ix0)=lViz9(qecxyF0&G#hxXri?OQ%>J=BP=_MxC|KSn`{gCpiEwhC?2(sRrx}1{kG#w}pLO|)^_p!xj+uo| z_Q=bvH_$vj*(0B0Rg?c)%A9ZUN2`6ZM_y@tOPhQ@9qH9pDT0De_Q>n3T|)uOUieb$ z4W`Rp_%bUu0r0V}$^&UE}FG-N&)i{hWz7c|K zQKQh)eaSlAaJ#Y*G<}6a*`+0%3A?_5^ibDIeV?o;MSQ$%9ms-j%%lZ0>me85V!|$~ zI}`9M!m-xF&@DwqgGB4?1%OLwfn+NY9-dN0tES;)7}P0cHj7E!hE|)OGKY`Bt&<9n zJfB{wS)&m2QYr}JB-d=f3moq~i!v7xPPPikUq#qwok01E31?f}jZRrYIN##qwv;-; zQ!PG+OIb>|#OeI}ewR>1leWSouS}V*^J{+8tTEtRAiK$$@*#MoEOd5A)d`4xDV0Kr zRci;C`0*TFART4cj_pL!SeNNE-1cj{ckkCY99T&gATDL-?Fxp1PF zo0|sOB7_^i2e;kDfSGzRK(~GNX`oumU`YEMHoIoUBEgndQe2i7Bdjg2q{LcVFw?Pj za}5@6&BYYi-a~k>bqfq?pGSCzwF#lw-b*+E?{WbC4dFzqnR(AAjISLU06(!W7>r_u zwW6sHyX<52lNW{dp6#GmNmIk&(RPnM0D17uCh$btIU^UV&O_v~H%d@RG}2AyU=Cr z)5M{ss%(Tj`*dL|QU|HQ4nd05`v?v8Svt=}mZ*o|>-J80Jl3L2%njS>kdpLLaiP7Ol!%?w8PQ?HdJ~>vHoHlYO(k1li}i+=pOx`*xj8-{o?@ zFcR1uQo<=N_e}V@eU}qwT<+Uh)4K)R?Q$2!0J}%9Judez@GbjZo$j^Q<(`3vVm~0J zyU^wSl=gm5^xTK?Slfq$cB#u~fFy0ee-jTcHcWf_+FdyWQn}41LdjQ)qX(+;38sKTGNNy4)Aj``!`k zL6`edOabh71$)%x{s(%G{k~}SB-)5h{()czT<(>${D*=)=W?G!t$!3(eaYqSVjKM= zr5|*;%jtMY@-X97m;3S@V776_BJ7;;oG5!J-Wyj>ATD(iG|rqYNUWmKGs^{uS3jfuGw0|$$eXAoZRV(-xmC}pg1GleLE0vV5H&eo zl(}7Wcd5~&oG3`F;`iHRo+L=T9KFswS(i5mv|$Dee5;=MJAGVrSiMVyQBx_Skn6IL zywVaNmxtt?39rk%A|#LJ+cK{dBvAz*F7qlu-0BkeOy<>sB&(k&?HWPS`Q* z+@ijRFJ;~;$gOG|+${4pL2gq&A)sX5F39cbNd%$HI|R8yJzfsvPC@QeuhH~QH@Qn4 zrU0jx+^rs=Xs46hqb@@%&b(Lh+^ZH~+Lw8sAor;o;3b*&3v$1@2%eDnfFKX3FKH>~ zspf-OQ_Dn!uGKG9I-j`2|*rF>sYxb1$k7R23O5|O6RLCkE!P|EM`8f z^W~ZYDu!)!KTF-(?95Zsplv6%WRQn_33Eq#LxkHfq8%)dj@pT1*8$jL-HO3 z%J|H~`ZlDgH3(RlZ%g5tI^P8HXNd|fwTdb|uySSf`w%4s_Vq%rEuZfsAMk zXqjJ2Cv;9tXMQ7D@Q&)`1Cixh{b6v$xz57pur-LYyUfhL>8@H7>%TKgeLLsmd8Z zesr=b9&FG2N#72AW7WqgK>i_K5wBJw9%TL^Y(vzs)Jc=hnxOX01fmO)sOqzT7=jE{ zt+7CymkWoft4e{m3@YGOz9Jxl4IYVqQ2mqj9U{md)FBp{Xq?NQ?>?2%h8pafiMspF z9AL`eW8+5+cYq??f<0%r6Y1zlatP;;;r^6$N)|2NFx$47D6^0Lvu zj*@&hZP_pq*c8c!^OZN!@1`1DKjM7l01UaA(}Z@4=^n+}P8aM{)6MS+%q$Y@G}HYi zhV9H^gYL7#bbrpqcAg*aG~L-2u-U?Sw(0&?Jg{=X&cW^lJ(gc$C!Rc5lV`gllQWPK z=Ng62q{q=3g;^Kr*8-7m#mKr?=Xa24itl@8?UPfHiRuFg6a{V$O6V#J1O4b$ngFy1N)SJ*} z;}aF%i+5g~ck_8}=+$|F@isI(KXLeNNamN8P}!t|i6}m6mp&g-)YBMevUbbc-I_WI zt&_D!5SJ>P2jo0KV%2A?#$G|<<$OriZv;t{<8WE$3*wd|Az2p)lB|ut9;M=`4~mg} zc-AzY7DQrgIFXf%=X3usr6o+cILsa|5QQNlzxWI<36tq=eDDhA!^1)A`GV!Jc=kAa$ZA_lZ)s@Nte3e?(k+g>)+?Oz zxvXamz^^iWg2fZ&)}ILHSRAUY*9hlYIX2)o2cYmaNDp%gWn&hk1{ZmACaS;VH7CV7*6ps&y8+ttG4QY1Rl>(vns9bSob-6H895 z&9Kf_fMvB^WECRpS+c^OX}!mCWrbaA#baJ#{lJAliFFs^m-P?IFP9e@tzQVwQ6IzQ zEluL*Ts1i#h%U%HmAVkf072%f3F!Qma|EnHH5~U;N+eI4dJGZMDix$%okuIr7NkQpqgUbw-KkrrGSS2EgYHDSR4rnQ zHD8cp)goHGLXd8CD(LvJb+QFj5ACv0kRH{9sD>X~#~7&fY7;s!gzDBhc@f<{3$2Z> z!$*hF?LWX~e4`X>_3#r3COBiZ4t?5XjWqb3lIj)sku^>NkEV)#-oZd72x6$K zX__2Ccx;^FQuo4kg+_eR3Xpgn#Te{-Z3R!?8AJGNDAwX@fJOqVFhpF?NF2+3e07J4zA^GK=YbU$mtog z8pQlRBRV31(^)O=Xg3hs*MvBA?pxbfj`$|@#JFM?*0)Zu5fW)af z+TKV(ch>YJ(=LNCj5KEY3$AIeLA2o|>v&w#TQwt{v|=L1gpd{>(~>Zx8X2UW4pckp zpLxK~;P-j(uLhUCFLf0j8*&co)7ZGiP8;ZY zqAz1?HqNH`dx2M^~_$C>&PJ%6TNZEOS~3xv@ieB=;}9+0bz zK2YF;S}7<4P{K^TMn4Mqj7>tuH!K!cg1ipoXld{}9#zD*55vl{CZc_ePr;^LjZ5EG zyEBULwlg`jB^lYj8Dnf3bdrFr&}{VqXDKZF9GFqg0Fy5N)H1p zm+{%9P_b+_k|;zgO2!BM=uXkR+UP|ZdWY5rbzh0DO|L6l*|{O|w?~lUNZy3pY$N6# z3e6(6=uISfGswuK(R;=Vd5LkHSm}7oMfQX;7Kbxx<(DIAj~LFesgAx8=i=9w%<+yv zB`fsP!JI3;P(efG+U#=jz-F%az(V?fHtQd#r_lvS+lNcvrym`*Zx^%uOoP(@j4tW9 z=#Dc)lAzmwIv&+cY4;H=gAPWJVtxcVZza^ADfwq?TD1l??n2TuxM5iUKqY|rBvu>` z>=AiF@H&9g zLxP#M9%-KexJJ@yjNQ%j(Aa7gjN}E!fNrtvp@lHM^q(1vc7mP^#;=853x7cy%clq` zz7TY36%vfr;@3|vJQGGX(CXMC#-;CjIb#2nwEsCUh-2Z^wD2oHD>K0ekJt8tb&+)7 zb?m_UvboZI>)Cz9VC<4TU_y~%up&C>H0Zd)Nu*_qtB|$;X;SUNkiE5{L?p8j?iJRM z5y8gw{Siiw`A)AM`6wDa@1A^ArCiQR>h86O&*FXMa;!4{)odZMlUALT19+~%*H{;K z2YNJPo@CPUzCyppgq?9(-%AO6bpi>rM1Fjcz#>6BILV+%s)m#xeS~DHIvQ#l$p-T- zmVWP%;i8JKzZxkru2u2vSHoGUR99^o1!S7Rj>8Vbqn&x1VJ723nWyQW`os0OP!@KM z78mNG1;-2HB3Uag<{L-G#geH?Lhe2%y-PDL5vYn&Gr;UdRWknl&Vl2mAbr2=EL8Qd zH-=zN>x@fv4xUvqb~>9Ji?Kj8E_Xz}R|XbmhhuR=J&L+gmX%c#FuyRaa^Q&+8G>b) z#-x=h@GQS^jRW(=edAi$$f@Fc`(czZ+c0pt6C^E|Mn{+`aE z-#m&M$@IfXSPY^12STfQ-3Pu8#j~`$^HPBPby~=6vPns7(J1WtzeM7AwuG z|C5=dW5zmlm%%eu>h9FndCXMxd>S$ha%^%N;drUL(|HHWd*@E?8KSfII5tUe?7%gU zkti?oId&K-=}z5qbgi~+CInVHy&kQz6Jbr?w`v3CV4_;J^!Th8;1V~gWsY}0a7V=& z$yvu(i8L8sj2h$btr%0jLK+#%-UmPl^Wpzm#Xo?31Z=5=&``(d#Ed1l5PaTZ#sZ`% z3&1DD~1bj<+c^J0QYWNkt4vh+bX637!rqEcH_ z{+j^aq5K|@uSNEC|C9VP!SM8dmVX@N*DL2*6$f6mboKze41L0Olh>t5}537lBo*0PrD!1^`*{P+o&ua8{fi z5aYJsC4;fFPg@z)LgL>1 z&!zFlFId{o|5Ir%fMEb8A4xDe=N*yKir)q$dP?V19BS->aX8^!ELm!dSRXRV3dG!f z?>4RIe9%)NvO(z8FpXApInt=dRws`>krSca7lHdhPzu0(g-~k6JK=wq!X8WXNg)?4 zIuzpi!;xIq3YRQ?X!`F%rM&Hw?5Lx`vsl0Y^n7@DxPU8})rg%L?gUf8wiImA34RA+ zjng#7aV=y)`x;wa=I(v{{X$#DffT2_v^~gc6d1!>;dwiewg{e8wjIDa0L#N16&E6f zUrJPQC4kEb+zNoNe^)#R;C%oq4gk18`%wTKNNjWgImrb+m?Z zr|F+DrVT?HB}j23RHP$i7V=b#1yBP3IXSu=70x+bABDJAHVOvY@b%mrIxuiTwE7}qw_eGN#eJ~9#f=`6V7etfA|ID5P zkbZZFetnp(6+IqGdZ<6?gHY02;UqSzECd}X--hV_Jc7=ZpxN^{f?u-BS?e(y`=Tsz z5cK$7(^Q!30yOH1(-7$CO+^nQbqwYsl}MF1$$q;ew91C}6deG=6EIVgFf75mK4h#_ ze*)#?BeO+_#fM20@2hsA4@AX4^SwyBEhNfW%CnH0!F>yW140SsDE{`}g=odu18}%s zBrkF8-nlJCtWRH9%}LAm$g%^7vD7Hr0i2Jp%eDac7QlQ`D)s^!IRwC^A$rA)09G>P zUI51fSn(tP+GpuY04fgS;}Rq<{RF_8@A1(MC6;lcCSPM4NEMbV4{Wv85M+0=a^$MZ5u;kR%?wbqN8!&ib;~kg2Z%TXEem6-8Bf;j_ z?`A2X47ltuje`9$!AxVoe*MNMXFMgfpMrucy32i1P`(s&JM#Lu2DwjmD%U}-({2w) zxi>}1eNf7Mj^(m5%!A~ML*=p&Lg54!FK5${9Bv;IOMIB)zBm+pAY$2FQv6qFvPn-v zRZz}{W%)wsBw4y0kfk?Y?3;8Il|EpQw+#5?_vxX}h@=kSj=s-{zPFGre)hcR`vP%U zlf59z{dbAW9@C2kH<|uUT-JOq;bbMw0AW=%`Q_P=|3`x>KfdZ!lnGTin>rN=L`;kd z7UhG$3DubXQoO+hn&s5RvEn*wx3t>$BsLYlO-2jolmT zpO}t&atQ4c=V?Hlo`>q8xGo#Oy-52^(th2mX=U!Q4MO4YDafS1#mYPj$+B0q8@aQD z-roacgO3>{Qy*KdC_Iv^y<;M@%9X0Eld9Dn8?IV`RPCoo)h3Fm_@$bYKZUy(lT7kX z0Pa+^FjTh=r>c`fXs1+_iaiukETZwaP>tRS*Qn#j8s&q2Ei!&1bZ4}{_LW8(DU==V z(gWgu`Q?{{uoWvqQYShb#_rDODi>q;(C&u-Ocog_oXy4XPy#E#$@oZr?SKr_u`0?k z?ru2M>BA*;3g9YQ!dYmGWlkk7eQb$1(bdGIPt}<0Q_m2WK2>Y7PrU`a2wMWur(PFj zLyd-UO15v=r@nUxPFyj2v0=LkK~i%;0jY4JR?Zqlx(Wt-ev>&BjQnnp0r(c+NX4&rYDaXF}k4Nvi>dm`8UH$m7Y2OU} zX62P9&D!(o+O!)kyxuybuReL$!>1NxJ+U=@Y0uFQcmM0Qx3^ytbNJ$(Z!Ui9vDS+} zIBnj;Up;lnV+qe)7N6BQ;nSS!Pw823__|xyys_iQjWtV(FKmCR;MxOY%v+z{w(^nh z2EFstyxrHlx}@QmnC7u#-KWOgGiIutn)`G6ghgub)Y`gWT;PGYV>agg;qensozT7K zvQHkld|^|{wOwZ|eEf@4EDu#H7cr^u)GJNw4giKjy9n zZ!NqdK5g29>km~eerDh5?>ci^zC7vNp3a7=Hn}$)I3?D2dgo8SJiP0(w(2YYe#MUu zf4k|}r-sgiT^g<^L3iuruR}F{mxEzsqSXuQ#C`w^HN+zbjh*QGU_Is^LoZ0sbjIi?flXJsko*^}B!8WwDRT-)pYth$L!xL$ zSkv56kiO*hy;FGeE$~R+R@qYH6NUaa|FqWM%mZna&bTG7=V`6C*;tznGx!)G>V-aT zeQHg|AVQDvFj|WYt#uEQGuIj1rgx;4Q4RTM0;DzFhru-ATW;Aqx-`84T@v2rW=lL} zIx4rk0P|!AI7i|xi!)hT4}XYfwX~M_Ss))nn7b%WMyW6d>G;Tp*21os-9$OuP5C!D z&m*j5Z(vSt68tZ64x+$>!&Hzf|Bzjq#vt(5-k z`(cB`DRF&Bc*e#DA#EttZE8W$3Ey+NC$gPZYRy2z%zWA?Wiofo;|1ctj7Z26AFVe| z0>`5U2V{qXEhV8-Ypogw+H!+~j?lE$vrCY&(%_ipaC1*R#GQbMo_VyvVauUOF|A*x zAbEwsfyWVY%&r)Gi^AxB9>=)CjR))cs3B^QIV5$+(h)=T#1XJUl4cH>K4`|E3iNO@ zOB*z(7<3E-A&?#cme?>$jM4`UBBF!e8XU5hImOi)bV$PH2P;$THJIIZ<;e zm=Q9UDByEN+0M>JzO=z;zEG;LjHIm`OJupi`bjyXMmU*;ZM0Yk#f^znLYT7qm4O#T zsRC9!+URe_@iaT_KOs_z2+qkxp=@4K@fr&_atA~zh=pf}KA@kTAEHZh7675I2r@C6 zd8j@trX=}-GVz2-{do*HVPRn;7tzT;sRV=&Jt|tKBg9Mzl?G#z5%v!^g^`SHsgRfu zb$Y0f5IQ4@8F`D&I7vtMC=e%{dFDwvM#bG_kWw5bV3FUi$PsFk^h?I7#0w!LuNbsa z>{m8GD-iW&JCc4==5b0XkHT>>pkKIS_qqM*W5GwMHTu#KVX5;60l~&fVMzD_2-B!P zo?7SXvpnHeJVMdRL8#)e7`E!7e(AJTRS1=KTO6v7Ak~8qgq94_nW-i&)G%0YMhX#E zIHH)kC}qW~mQqV>_e7aS(w95>V7ExB0X2L~uGu$3&7u9!3`a`Eco4HE)>p;gmJD0QM6ajSB?c zvT>PO*OvXb%byRQ6#)?W!$^eXMgD%?oyygg16&}< z1^aog!i9&H)wpeUKzzy{YwKiM6H1X=w9NHL(X~1%Nqqnc3qHb`SvrL{#Viezd5;#v z5_D}@zo2Em=7a&5;V5BT%G*?2F0JoC%YH(|4uQ9t2mwIkFA$M5)lT#kyq0%ua5F|<3iVJ*-s#>Y)zE#Itsrm%tauqc}-MFHAt5~ z%;B_jT(AUhj^?ZSb;TmT|Icw~>Eew@g~#&NDquBl`6SaCksr6nAJ#4?w}v;C&8Di^->*eYSPO>`$p(PRJ5EZ-$=m}c4QF;} z{rO4z5BWbCC|xp?A6Qg=U{U#jh4W{HO4POG(MkVq&tFsjlfq#h-s5ng>3B;Mu#Pty z7jw4kCzL4|!!#lKY*eTLCPJKo!g5?1Yab3RunCqb^D1?Q>iMH9iW8donIek)nM_ z3N`;J(anEKr1@LG!IKG5J&H+Dt?W>jAyNMNGein!%q`L>V-;@~;WD+ptcVt*Q;Mne zCPoq;MB+=h(9I6v_N4>z_O*aZc>4|)?1JGHG83hUY9z@Yr9Ov?BP8!m3A=Yhsz!!1 z>YVS%UZ=ba~T*yOxZ zbX4f1;9GG~Gv0@Q9IxRZ%wD5JCXYuH&;@FowtLsMz54vD`J*E=o(dp@$p-ZT2G8#mEyQm!m&NbsZ)}jS>zuqHdVlAB@Owr1Iq95es?_@BHR- zx(V;(W_q}yVFe^u{5mmeve<&WZMfhlyg6D$8kYw)CP+1^dE12x^D})vf!{glVc9&; z;^dB4D+@`Zam8rIYFzISuEz!E`1f3qh*1rW8sS>L47U{yxCXaNrNoFQ6eFnwR}3N& z#S?bK*M`OO$OU6Hnt>6Trw5{1q@TJh9KS}uYeVj@i& zE=HOnti}=T($9gBxSs<^xMY^FN=k^>iN`xwH$$5mY4vbgR3#}P1{WHbw-W?h&f6|r z&T0Ta`M zRo>bKtmbW#lZwyCpOd$mH|BG+CX|Z{HRG)?LI5CttZytXYQVcQpNwb_kEC(9qLczA zi*@!YS|C}-)lBAJSO^7D*brP%xjCU?O;IJ@MhO_n3`|RMl6b?e2N;*|=G2a_FKc)( zz*OF{aXA$wlrMycFqTgJsR{3iLXK38^9D!i(tfFt%pgWDi_Vn1t9aXm>)&01(x4P? z4)2O+-XmSY7Ty}(9Nv}Dy#3w*x;7UVEzSEzTIvbbBd7FHsZnd1iO9N1vPb&c=>DYR06M}WRHTS|Ktp=T1YG}aNEcFJ zNZ!H>{nm>^s?(&$%H46UNTg(aM@s%kJBE{-F#|ODV?I)77~W}|C?{nrR!UMGKIQM% zZcQzsa!}wJNs8oPHYT(6!ep5Bhe46vPY#+E_TY^%h@Gj+z zv7WVSiO3BzIQuM7JXpkmS^j9-`M9Fmp6NbZRG9Y=c>zGDxVo@1pGXI6eIfE>5q$#q~E_d|{Fk9?sRm zf6=lz_(lKyzhtko2eLh%g@%Uyk0FCK9e>ajm!6xOhyQh@HS^}w`D+68Z9RbvVYGD7 zoU+oqVB?0ohR*i(&W^ms?$(Wg?qFVDTYX1fcZj*QqoJ+0F`)hbmxSK{K}p>Kt!et2 z_Vt0rHO&nTIrZJ`IUSuHft*17`qrF6|FoQm`2~}Yos`qp+A(S3nj^?-Lb|NM8}==& z9sd^u1vdx(%Zdd%8zLqNnQMKp>%YwWzuA{o=?pdo{y)m9?`qBKYOC*Q>g;a+FSUrS z!qkFklk4-E`r2C8hjOERyL&o=Vdt2=xTbE-3M6fs{9lSkUT{zR@3}jJepEZ}|E`0H zDf61T0|C~izitif!PYSPzjcQ&t*(+LD$T>8+17>tP6xI&wdS_4Pj&b7`MbJ1+gpPT zxebh?Oy~|YY;?$|Q&W9!TaUkIb5|gUG)&+9!Jfv}jvgS0LhI{;tql<>I&EY3#s~`e zeXZSrwm^_s5y%?bT7%4p!woI^H$3KBz$`n!UD^xf8;&hGy7=B`$pEg~0M z#NSC#2oY=@e=yL^3LyniRE!msga^=g*{ipy31pPr5$Hkn9hmj^H*|Icd+IxSC{Q#- zTCk_Px1p!ETk0AzkCYyQTc|ym5mfx^gYa}p4-vbg;D+|be!`~q)=)ka=x^<4VttTF zY|zmYl`RlpWAx|5uO{^)UBM0gNHEaQ+uho;xj&_=ue+hAyRAQ=y{(<5328^nAJ`O9 z#4#3{F=U;-?)t8-0IiOR1>>5(p?wlCJfiRJX_F4-4>bhl6474c6wul3Zw&+jQ}ZVl z6!e!_-{rvA*OHOQ+>IY)*`paQS4^&a7W1=!ANHthLr1W88DZWOy(BZWaAJ5=9jW;DzVMW$!P$XPSZ;})3l3k=s0InU7b+|lN7xuZAq_1b1nk?HmoFEa4k zOi|K51&_-#-!gM&LEJT4e5sWqy>@1Lo}H1Ilb_SvvT_yGin%dnR)IOtXZGdJDkvCl z9+PVrN67hF)3eg>Z3vEn=5n7oHaE{)mRme?VP1imwP4{a(l*+8t@HEpX14q)_v@PO z8`)wGDYA3S-lCcLm(4T=93lQCoKTowWKQ*&y*{(9$eiLcD|~kTgv^sij$gQHm3i8> z8^?};a+6c@7Ma0ZGch-BPa%vlx_PGAoNJ~QU6H?dQFC##S(|I-7adx)YUZ9|Tu^Oz z?&HOItMT8wcw4UdhL&4sUbod}zKesa`?uzrU+B5!g(u{mdU{`9PF{XaUfxyaTS&U< zgq~H$tXx$vK0hyGe13j$UPj&)^D$$=LkrhJ)4R4UxOsy)GVW~e8JBBr^qFx!`OM86=`GmY z(wCE&k+-lUzc_!Uxw^@m;HxrXju89v09}W7`$p%_D$cO;e^u!27${U+GILdH<-)38 zDSLB_o?Tozvv^_U%$9|fEx)3^5aWoQ2sJhyW51O*BTqQmIy;(u@_}%nEw3*1*VdK# zE2`!$);Kcx8Qn03;7jQG>H#&i)i(#V^?`cC*YZWBtsTwU{Q9=Jy&VnOysD+X*}lTu zX}ObpoEYU#o;b~y%>kl57#QnYU0Sm!FTlxEW1vxHPwTtuI~rPi-59olt(_gdi4&(x zn=<8SUru{NSMN-Osh+^5oc2k;ds=$i*ZRSSQd8 zreJGx2lQ`fsqfYpbj38)^GhrJ^QtQr`%BA9tLx^}X!Gm*4fS1GABMcH7Svx0bkwhJ z3p8r$=eIVu1iH(5gPUtM)pgf5HMKTq^^NsiJ*^uN@coVLZQAVWr8R-(_4N%Kdb?oO z&W?sa8NS#>TB*0g(ZI*%YVGdAa2~`r8FVzZ2J3r!S~!y9`z_c!)q(ET&PHt>23S8E z$Umn;>uJGUxzW#oTEcvDpvT|WRX-8oUBmEOHkVq<7^cl%?q60~<6l%d8?W##FI_li zX|-0#$vK>(Zq7W^F*LJqq;WP5J8I>Dw))ML)wPxN!JfL-_CRe>| zH8?z=-rrRp40g42(+yht{Kxjzx1puAz{WsFq(h-HoT)XyQ`x6#8|pji*pwWLow<#4 zLRhP@wV@s}sIZnbE6@%7rSs6&tE;G*=QL;lQDL*zf!?TLUe;aT>_1jp+R+$5oT%>!G}g9vcJ{Oc8fVX5 zsCD$hLm;}N(;sX>81V<&I#FSGqllu@!*S^IaI5v3dji3TFSiDRy#cnwdiZk}-fP_C zr+BB;XV=wK`lZF$EEEF~wbDPec}wwq3_WyrhLeQ>tk%|d)wg!{wFU!zco|F#mD(5r z(9{g0T2Fm&gI_At-QD`*Ys=T7s zk6EI>puj(San;<4c}r_b>navkX--`>w03o4KxtsFD_gv{a!zTL=3ib}TIDaJSNP|w z(0av;erJTy@Y8ereiH=SMz$!LlH(B;12sLH7CBMfA3PF8EbPONyw}2Hm5#;GfBHJR zH#nWU7p^{OqQ8f}=h$(RKiH0j=|Z?=FYj&$bmM6TY|~ediE_9*ubdoO z0zoObrs9zAYRwap3hDrV@jag zsdYuo693$#Rn8F7*x8GrDBQR;b84&owH0$~HG~5iI~>*tsz)cVAUfF9(D>Ra5VY5gBu$W`MdxHIw7H4#6z<3e~1L#`y z?Wj734~zx~dELETJ$@)9!Kn-3E^L+ZMHuG%7{?GI8vF9)vjBkyu~4Q(?4_tHO}!lYeIN%J=eoB46m;Yv<9&ztqz9EoDnQ(Ro*t+oM#`X0WVSBnaOCU$E z371Zng9d@dhz=5LxL92=ue%GO7~z1yzuPf*7vdEfM)V>^TRSw&7#ad?erGbNHMTT#aVilG-Q93^8N}Ej98)d%Kdik8cvMC9 z_kVlILI@%3yM{DMScDE?6J*KONythPHbt9kBrz*VfPgRt0fA8*6i@^g6c=zCa2rt( z9Kdx@qM+bL6dgfyCQ)&E#O41zRo~m)Y5cwK?|q(sKTq=Ms(WwUy0x4-=TzNlsyt{I zZWg}*2S=UpKMxqbE}!Vi$(Bx!Mpsf-ZKOfL$eNMqZG43l?z+bLl?_z|wWEysg@t0T zsG+{lwKx&?fRdF~os*X-8el@aI#jc;LB=>VyTU{$*ZL$^<-&S+YD=NKh+0qvWe%xiI||CE5D*Ds=N5Y*m88` zp|{nb<||7|3yPrsFGYuSUk`f&4^vy~t}22$hpNj_T{^QAid|8ay9%lUN6wtoIoe#) zBXJ@Go>J*l`@?`Kx`j_1n6e`tI($}EygLbFMlObqIjW@@l(+uXBElKIF!UjntW>J1 zT~Q9DRlo!(E|Kilwe^Xt^82>B%qJ25prD=RreXT26? zkh`F+4l1F$Tq(lhvZT&Z>?bUI{k00W6;XjIMXRc7kRFZuijT|?6&M3qVQF2hXkH@U z>&pr%M7L7DP`5}jbS6L)V_Yv@J3Y>dXfs3%CMCPX07{Eb$Ve7lSSibe9Bpz-s%jca zW+6>jXbnr<_*qXwb}%7VJmlJ+{0H`DVA%3)7F}(;jCc8}Y*qnQap z3xL*?=+4eDybX3%S`y5x!qi!+M;6yCu7={~M)%Maf|kb`VH#;!X_(H+&vQc)PQF+I z6qah;7$a4ksQQIzqL)BQ#AD3KTUamR(r^`2)|bRrR-tn%ZOrV6s*Q+H6$M0Tvn7j6 zZw(B-cH+KPycN>UjrgJl@ds#Qd%6t2qjJi{)~sDzWn{bX&?3!cSjFxRO5mBgq`DmH zMs9Xyt}6w-W+p6!!tw?+jF~-J6_9(BQ<=WyD2-~B7UZA!)KO4bHHkF^m^Q#%g|b8; zZKW&g9tLMg85N@{?^sc&y0~0!pm3_ntD)*?eOsIY=r!g*DE=1MWN13$sZQ65YKk^w zHeTHkO=q^dOpUuL61@l_st8RI7IvjkjM1*9)ZI{1fd_!uimaQ>A~8PGJu5d2)hUBf zM)FL^u~7yl77A-*n1Q|qn+Rr}Sk~x=^UI}SQ}l=|_jmUcslfu{vuI8jZIx1~WxQ^R z?TdA^(*qAxXK zfcJU_v|(J=C^|%ua?Av322ieHePD>wJzI4M)5RpZg@_?)$+eJnZphh6)QwiSlw$;= zm{~BUxq*oCMOwDgP@z5~bp=(vbiR`BHE@{Wfzj!ZK!bMTVGLa)Cae_m5xvW7 z36TB`+O{%9by6PmH0efF^`+4D;VCi1qJ;{Pguyuj#b4=Ge$J%wI%N(gXC>y&$q~ZN*X^PqFY_0?Sw_;v=bI-M<+x- zluzAXAnpq4ipmV_i>XDoHSmk5xg}z@u)Jk#bmIx(*@Dg_7LmVJ0PC~dJ-OX#}#YE>xGWK|zjdXDyp(m5vL zPxTThCZEn$jsliuhMOpbOLYqrfyjKNJK9c7KqBn4g4Sc|D@2yIT`43Q~fA7HqGXA@091gK1k zh@>?Z)xb}R=7a|>h6%5luJlb^jw%S^|xW+ zC{%WU>EA4>*3EW$cAneMvt_nPt*BwOk)HZdss!vpZHv1XLrEzaZ`3L&q(!9+DQ+#N zl*y7Onxv^e7HW50T73%a%F_Ir8P&>~kk+1-mn&{!(<;wH`^!X>_nB*@5~Q6d9a?$I z-O3rD<)xBds?SP$SyYbUU}15w6l81HM zA@!72+-T%wVsZh!wvp~9TK9R%ZLTb0*c0fKFeTJ1!J?YN>&1a()|8lFXbWn=i)mAM zwRPB$B2<;=D_g9_zjkh<2INfntqa8&B*o_zGe~>#Aq(J%$Fz^klhzj~At%F!);w@e z%&F-SmM(fFC!ybok|xtU7*&t~(GF-dCTAs~z{I;OrJ|K$F=8-*B2$NEk#S%Wg)})c z2UdJ?R(|drdSYm?BLVa;_`dx_h??6_^P|3j(QMlE7U1div!mNQW7Md8Q zN_{SGv3bn-PZ_ovARFLcGCPO%qhKLT5k`LTYnP){mTAMwJv%Kk-<>eS{#B>EP{^9Bt2rUv3S0jGVM+H`?y%4fOg zRtK$0n_GnyQ2pjZD8qNCH1Yr~&0IQ!5{Gdp>Pt;ssTQiLRb-~X^(fPvetP&QXI0r! zagP-)HX4d*i^?j*p(Z{e`cmo|i?Hw!_p8BxE&kIo7_Ox?YH5{Nf{~mzKU4+$A@YB}Sm80WA$$=|eoDiyInO!kw zR;G-%B223MtX1XfuT}0TGZPqHWEvh5Xc(r%YflrA9i*VNl%t%fV#^b%$B_Y7G=;Lo z;xtinoKfu-2H@@uuwRun1%JO90<}|JJvD4-EXu&7gBA<$m#Ifk?r)zzQN(2toaSOw zX^o?#&NoZ0=itQU4Le1qp!{@hEF&4^j>o*Y>c&dh%FN5*f`&hsv=yg=da(BHLb`l$ z@4`fAO;nj?WvAxhY&8|2%2U~$(%E$L*0qtZ{OP8ez{+u@xw74fn0CyCU67+DLX6CU zqIlSCm`vofL;DiaMj4$5W*yJS&4r+K(}@c2K%UH&ia8|ui<-u$!t@0?ZZX=U_AV*) z0`kJl$}CJSxpQ4^%nhpH++A2Gm8sfeQptP>29e9k6(iP>Qqzn)@t?p$s*H8R^pAiqHI3y};^%jp>qNCwF-vh&s%gQA z2*M1A53YK&0NN#J@J7`FZNO>+42u_(&jjArKUxZqGb<@Uc~CL@N?9tMMp=2P ziPTj#RJherPjz2T^omnqK8APY>KC!4#e^81;;h2Na8ZQ}p=gw9ULCm--!o0w_#Ck~ zisAY9c1KK%VH*P90w3|cj4H#k`V3xme|L6bJ{G>`!9>RFElVLYLzbDq)08(OcV_Y& z1D+9i5@>0#EznB*mR9IiCJvl{&Nw40Ju7=w7OVqV;Q}F!hF*e-#RF@ZEHz|$Y@uo3 z4r(T%086^iXz9|&%pVrp8gPKaQHeDT;sF<_OzYnoe!E+CuqfWc6N3Ms@;bFH}j>Z*Jxq+O6uWuuWt_ z$WWSR&f>Z}B|5$SH}pj02@eD-%exvZ2aCF(^Jbt5e1(FCh3NTTuA=|Hy;va2l1EB8 zF?}ppSLz2`=Z3f(#EP#js!7oRoRMDBm+f-7a}#sj@mK>SK5Fg5z#6H1 zSt6A)GaJ4>UrVe;^0k;m_M7ue7LTGHb{Ch6dJ3gk*%f)>_iATamz86^CkzA(T>3tG zT1PFxfyyXzu<&QoDppFLQWjNbQNjGiq>@G%q1#OsXC>#)%Fa!fvd@i&%$$*!KO;BU zkQq6zyVOwGbkD+^RI*x6m;{g4EHRzUf=GzZOH0%fGio3(rQrOjat7!uzCsfJlX#i+kYCPmLtJM5Ox>I&e za+Yq;m}W^xmf5_(=~75#WqOD|O%^N3Oja6Xpsd$bLPcyBB~Zi%iRo5x5XrnYvIrYe z8i{YTLzAV(W2i#c6W>Zkr^>u(MUHP-qAc=&*;6+k{s4JgSN`LiV%j8L=n zLRX_yKUVv`&6D*?E;KnT@SPct6$#YW_1GcKBw3h*B9cW>N_HhB$IrlIq1Trw4e+A% z6-uIum#)@VfqFF1VjAAMnp*KO+a-?rBF(# zcs&?t`7qz%MwmYzg8&L2{x?`d$hSY2rBM#Ka{`NrNiF+i)XjR!w-+RVHxs)f^#6Yv;_YGuV_vC5OoWnxHx^&%7f?$|$y9Q8+$aekwY zGLOwQ4#iq!&euz=xvY;NC5O4Fo`s{UI>%f%E_$$87cfoIl4gosovdaWw2#wG_ZM3w zL>Lx+X6Hk%g3kd1S*3F9r`BL0uP*ki@nwpV!S)Vy;?VA%RYN#Itxo0kjQRU@7PoAyUU$xV9^TaQQR*1?_ z-f88&MnKITs9Q8N!n*+fgEqDGOg5Bv-$FlndQ|fkgFwWKOxQ1hZwP{3d=t8PQG3MN zW6CV$t%02I7b`5K#MI=(biE*#>qMYIXhlJdCRoiZ)2eC~O{^f*3hKeT{O2Fdskh`j@c`>pJm~)mrGiZ_p4b1# zb$Q~-QmRdHjk~<2r~&gJh=C;_)BG|wCzA)J{f6FK>6UdRC^S<&xOkCNUUG(Lj!M5O zt*j|TvsFr7VSYQeteHct?Ze(yYnotnAc@_4_uQtQ zqa;kg;`DOp%JN={Oou3koIH$w6IPu=gtoV2Fu9{g4WHPSt2vpj#w;vTRm<%#Go%X7 zyHZsz8IW!$>8koP)lxk>yAZS9Vm>cW&BR=+0~^2nyD@IP_*D|pwsl_G)yY`gnCG4C zknV%Q3yUbrt3^#H6-n=}6Jah>msZ>;oqe5EQz9n9&4Cv*+zH9vn)F7c8%s;-V5F%& zgJz-D-eth3M^EHrI2^q4;*8nLwSwW_7-c0-o-9_+OUg}_)#(skdI_940jd1vi))lp z31t#Z-*kw2U$v5zI?DB_j7O;@RD>#32Q_q+cW~DZ?S>NlCCsq)$wUrYIZ?c(io#l>JrW6LxtMLgZDzbLkqF~WHIEnIhDY? zcUjdr}3yNefk-;qKoxpUAeGG!^JIo(umBxBaZTVLKc_h6~PrwwlrRyETx zinS)y?tGc2(@r|{P4gYNq{StbmC}qv3B_z6>`x3x>OBGTjgNR&veV!zh^%*v^2#Q{ z8ox3;Mh&Xn$SH$qkK#~OtIP&H%ZqLWld{^F0mqSdCaw;@WD3PgO!ksw%Hsg4goW(9!t92p+K>!Ux@{2#dg__Y`5piY(7HeM@P{=tpqbDdr+CBU`_sM$bJo5cP7RxUoflm*#KEio98A zcp=A~EYm8pYQ(No#zf#`NoLyYV}VWKK$XdI}2F%M?X2LZbu1pG}#r7M%NeLE&q|atkb+P+LH#t}Kd! ztel7cI7b?jUhwPn)^Ig~wrXV7bb<1Lsk+8u5_3L6RFRV6C}#KfOwVH3 zlq74&ql;o@z(~rRg%u#^N3`YO1T!j;i(;JVRXg=uw|>z;ybgNyMz3Fvhk~fR7WsKD zSZ;7{VQq;ye=NF;TG+0IE<6SlD3JZ8K=GUZQLZB2`v=-_rWXGM8q@Im%50ln$&IlK zV>O<+R5?GzL1S}AQ?*s2C=}Bx!*EERXD2*3+S!p^vwV|i#(;O<<=~Vrh zRi|tjWq(OuG)-Cm=~$fw>$*tz3btTU$vo(tDeaIGo|e&u!!iK0j~1Doaz# zfG*l@;Pk%Ws5HHc-`Q3dOW}%+Vie0F6|J|)d@`2kiMFR4K~jbo?fk``Ui^n;A^F+4 zvi*q+lFDAxh5#C~TBa<|u~gn^tigguEt6EWabcNuw!#*K`N-FjF;f722Xo~m4I^mXbuWv)XnafY{di?^eqDy|Efy=X^T+}?R_CjUXDLqyR9;Nh%3sp5f z)y1XyL@_nwb%DioIkLP=T#`r#T9>L5x4Rz2rHT#4477AqWo3C0EO@_#*JghcaaXs{ z_wJ_nMB$sxp8=PKdRX<&5H6SX;b^}yL#gH%keW<}K!e2OrtILLGOI>zl?zdieR=Y} zFzJ17T4`f`m6)BQUQJY%k68C`QmBDI8ZS?y9FZ-9q)W;vwV1xa+3Jq+4@)k@gDdMF zyq9V3L;h^6q`~TedX$N|VE}X{nGm4I1k(zY0q>{OqIe)KwG>nXOr4s_(JQZ%wD1$O zm`cgS2vUb-5*U#KUbKU$LG3`yv|@3r$&gu~7QDJ^@%}7kU9@GUij7NZv?LI%&Rj~O zMT&Z}m}836ALMbM2v5$5b&fXF0H~KWyW2@Dq|D6;NI8mG3nlnY5aS;UWkrJESn z(Ymz~=2vT&OHePC=9#bRQBzeS$-59yxf--T3`R88OQ&)LE>lu-($lhG`uGnQ+JCC- zRE!w<-FB^LXuq& zutt*7&`qOCnXk+aUde`lPnPAJd6@oTta?S>FqfJ6#t05xP-ywB2BobUkG`)=&_EVQ ztCTz@^YtWou~6xC-U)Vp*AWLFtTplNhk(8gTlo9xy+bT?Xm>6; zT6{i)PcFT=;xM2tlwFM(A1J#>4sMC|uPpJDfK2F@Ta@ar-5QxN@L5Rt;^Li!!Z$G6 z1HZ1C@K!Gpt6tIWr3-iLSTW4x%{>TROhoyok&DGSNTuDP3^7Ngabq+v7ZS|J3r_m& zVp)Qw{9$?@7wtQP!LQbVrpgA-XFl(%4Cu` zRb}16$)AJ0;&gkI*={q#vf+bU8yaff7OTt~mSmOA)e`KogOzKjZSAFysayD8 z67>pjHGkr6zpsmOd{HwpTodNb%*=zfUZOTayrQQ5iZLU`j2J6>AC8NSb;e!+J;OXS z7cOmh`RnJJThr-{8OSar4H{`__1=XVhTz+~QmYQMmLi)S;An;D6WnmH#n_k4@ z?NF2nMmnWO=IDVD!;_xr_q|r;on+94ix$g}Wm$UuPkLATslW_1^A7_+ITPvR&BXd= z|5s8_ykh7pRo73)6$$G%=k3-q6Az0u7Z)w|)6bYuvp7dqN&58yU)5m&nyj{gePot_ z>ZNhQ6|Pj$`GyL*VhPOFBK#DHT#)EQAa45cC_ zz#7lcPs!qs&v9j9;hoI+%3Cxd8e#9ERAgfv5q+xt;mv8tC3)@0yO;}QX=Yz<4>TiB z7Sv%nT+ao`B*y|w1YyG?_2zlI2_G&vQS+?c1t+4XsFA=(Nlcs&6(hT7sw+_H%9PAV+%@{wI*qvQ)eO<-a~ z|5YKYgKrL6V_$1qXT1%Z531d7d5R%B@g_v{UKPAL=w|yG+gdpz$vg-?qK?O`3|rM< zb?D6@Yl7DXt+W5xb_>q4CWXE8_FHeh@%n3r4;_p!5<9xug%dhP`K2Q}{KiK_tqNLg zzuC4%uFi;%9d-x#og=&U#z#c1vahz?j59LB-a*QeFyhUfedTo79XKIk(8W1Qj96>2 zy=aXe-f}N zeJ7c>!Evuo=i;O7->SIyIJ|7_W^6A$L-Js11XAxK%o}?r;h}CA?T#p8Vnm%XEl2oG z?zKC~yj(wbaY^AqdAkiG#0dSpK&<*j{zt`mqVmTRphlI#N$3}KaST*A>^`k8Ktnc0 z$f8G#EdEz%17ZXu`v^TBgC+F!=r8}_NFJl9N?ec2n1wYGCyW|@;eCr=@lcr z@raZ3Bwn6F^0yg({^=b<;2y-8A2U7qK|TNU?m>DYk0m`Blg#v<#&`epWT$sI&-|F_ zJ%tGW^u9%UQXi5Y_Vx9q_YZvcPwxN{Fn7eqA$6Yc4gC41*B!q^x&;?XdiaTGZ+d6( z-9Nny6oQOJ=EtnxuMpv%-VXgDdi`;pfBt^)ORtAtdXodvi@`2=5E z+kf=D4+NxFjPxRz-T=S!4hEz*73t;RxcM=kcYi>74SxB%6epYcI~|bT2BbI7OpNDA z@Kiv04$bknZHYMo}_Ea-5hjo z^BEEC{eI>D^1O8B4^SUT&y@WVA$gaN{2G@3eP{m<_ibc)`YQYw2+sR(u^IBE*MRf< zpZ6C$Z|GG0yhCuh`Mj$F(i^$bFb;_T=f}+7odM_luok~w1ijJxnCIOQa9?}A#W;ZT zq@1N4n)iJ;Aidyw4P(2R7-**VKtOtj$}FmXNO~jiXQuZ;KzffLJ*Sz7UwY35q?ccg zlMpBANq;iadn+Kl5AMUStNInFne=Oc=~Y+^6pczxRBAK5515|ZLq4TD@ndr7`n&v> z^yKgJfb&{^F!1AFzK?m{zXI}C{G(xHAkO^AedY5F;{390e1iO8s8RVFi{obgF5o=0 z`C4@m{_XzBFyhPrDEF0*$bPeLNcc3)>*yC@o+tFnj*(-t7%gbv6A`a}lt%x^j^xen za>E%88_3K&j+yDSbhhVT00*P#$$gGST-`Vb=)@p8TBMpmWq;0r%C z)L{GbI~d70Cg+RpV{KQ%l77d4^E;}a^^@~Ox3MaX1z-5FLE~tjzGxu6j}1rLAMdQ5 z@6X<1)W>i03rpV|?X5?Be6n9yju-lcCH*qLupDpk3(N6u{lap5mA6>i=gx*!+CHX> z%CFh?q!r6?Y5)48k2je?)ylmAlxMeq^tuJ4CmM|JV>5aLoZmy8?-Q4zq4+*FXc+DD z+e@7ODm?2;awM3ZxrguD6;X>$I6fbg(@ z@VJ2Rw1BYuD69FA^cEm2x7>igu8@a+3OFvm_-cOS{B1mcG`@F*yxhaE*lt}R4-Yde zGO8=&-6sLppW|_-I^M^??|XPZl71J2efjBU3};xUH$eT4sT|M2UsuQ@`Q=mdBiGB% zw3;6YFAfOb$n@snSXaoWy8@0s5fFZ{-T4mV9Uhl1*ag2P|1ra&>vw^d=AZ43UuIlr z7l!;$OAYjlDc+qOq<3)iIZNBSNC){|1@ZTdn%*|AN7Rh)^Mm?r)+)DzdrRJ@FxNfn zsEhY4lX$*Lt4?XRV~KeX8~pRDxJcz|z@i$&)cSt?;g6?D5*F26(?>TO7FuCH<>tFnB%boe~Ha!?Af=;Bx5%tM%eH@}*{Jiv=&Hj76w zRjgMonh}yHj;mkikjuR%cw@{}UUF3B*Z=);zs+LhxNoB#37H$#%Xja4huSwOZ!Ji> z@$J#_hfB@8W!A2)ls7hDYX!6XrQm%Y?mzNtn`Z`ivjc*EbQWCN{%0ZR&7Txwd%w1s zfWJ4}jBD@1mdST>J(}JtEMSdV9uk)gv&_o_UEEmlaPfX)eBD_uPV`>B;6lwoj=igpkN(Ng-g%D8; zuN4;I7r%u#KU`?0hkUAhlo-Y|iO0p4fR`ZsTP2M9-ytm1`H_6TAmMWS1UT6$MEoxd zkA`3myB^OitU$hml`vL?_`&0wh1ED;i1LwNe3$%OB1C?M3lX0yM7rV|k@&U38p9CZ zhQz-}itQg(YZxC1k#8A`!eE5UkB>`vR|;`{BY7YBH2DhILjH^Fj=@3d<1rx$^F<+4 zvqQo#!#E+V*LIK9Wf)%~Y)vwZGr|P?iYSl&EW~w#pqqp>pj`+T8pc%NB9yxj>0c*A zy46CYyGV%h#cq;x*9ueF&KmXnt6X=LlzVr>K#?n=DAe^$pj@{~xCGY=alO>5!8@mdK_*o?1#IW5+0GHp;B_h=h*$jq@#=giw&QU;4AJ#=6W*N{jz-*n4#K-Zt++V`U#0RWsXIzTTb3W-c3GAK1UuTo5@q;ccl2jB)tykx58fJ zWn>%~PiB+Xk`?3*kQ9K zc{_PO`6T%g`6l@x`4#yCX$jKz=}ZnFhm(`YR5Fhgc_jHOCmYBWU@Ngy+{W+lAK7Ukon|7as|1b+)6%7K25$t zzD0gOenI|=yg-I_V11E!oC zBPj!vluJ0-n;b+s$wac6TtaRj?;&@R&yokoe~>50FUeNY26waM13xIPco`W>P9oFD z8Ds(3K>me%gnXKOg?x+rfc%2|7kPmUhK?rr=}KNg4kgEu31k*|4LP4&POc+2lMj$j zl6%S5$Y$~k`6DS#P*q=KZ*mwpmdqsQkR{{-ayhwaJ zKn^9xlbPhzWGUG|t{`tCA10qB-y}aEPm>`~tfV};lLN^SB#X#uaw&N;c?WqP`55^;`A_l(@^`W$6l1B!-lT&ZL0(BF zkvZgCvYcE--bAh?ZzDI6TgmO@Bjgk0)8vcfJLEC)W3rX}iTs7M!myC%2_-v|d8C`H zAQzLX$iI-=$VbU%$o=Hoer2(TVIsUPi`}lgKo323bI^Bp)OHMjj%Y$!{jz2pvZ7x`E6Ir3%lAo&*AOr9W5k^dyWBYz|>kk)=W-yO(EvKKjkbdW>H zk>pr%5}8D%lX>JkvWi?vt|2#(50EdAhspQIQ{=bgf62)H`Z@ZOSCYA;o2(?4kav*} zk^9KE$rI#Ph!*)8s4U+vEpi8~F#L=8*O)=bMjy01u`^B=cgwbO*+X*?Sxhb<|3uzGZXq8gpCI8vV>ef zE+^NKo5=^rC&|6!Ve&ol6dCN$_wPnVk)z3YGK(xEYsh8fI`U3(2f3TvN4`aVNPbDS zk-w202kCspl9S1FayEGv`4G8>e1&|QJVAa>{!WHprti~-yqt_9r;?fE)nqBTn!JO& zk9>@Lp8Pxc4*3!JPx5;*>~fu-UgRJ$mYhtcle5VZvW~owyp_D0e1v?4JU|{HKO(;- zeaQQ{+qJ8{~2F3-aIOFJ#ydoxk4X<>Y8Gfy^PVBkRc~ay_|~ z+(|x1{+)c6{FFRP{zTe_>ii5KhmzySByu`gK{k@B$-j~>lW&rz$yV}LGHjT>Z!dBX z8B0zk)5+On30X(pOl~B%lTVT_k#CU4$uG!%lfRH1hU}qI+(_O}K0&@f9wLvDpO9zB^Q2{@&POM*4|y3GOHLxw$O5v8 zTtcoUZzu01cahJLuaZZ|ljK)q8~H2Q!Kw3^L{2BKBP+;8ay5Aec|WQKRpe4~4Y`SYfP9L4nS6^p zLG~K0^D&5wB`1^V_PS;2aLF4uFbs-0kL&z~?Jef((A@Q4k%I;r4E+^NKo5=^r zC&|6!VX~S0lsrrRMB1*@_lYD2kVDCFWD+@@ypF6O8_Ct=9pwGw6XagOpYew$t-d? zxq-Zg+(|x59w7fgo*=&@+sM!aosaHh6giBXMPeTu)vs&GW#n3N6S?tS zA&ObSkz7sQLEcY3LGC4ABi|=m$nVIX$&e(L7dem| zK~5x7$r)rJ`8xR?`6+pp{5N@?yg*u#SuSKxvOgJ34k5>o@nj}hLM|Yelk3RMPllPLl$mhsc$s^=R z@+-29{FUsGqVL;-97v8JCz7e;46=}{A(xTs$UDg$W@^9oJvY9+ZeoOwB49;SH$S86Ic@>GhCRO>&B#X#eayj{D@-Ffrav%92`6by# z{zi7p*7xa6UPg{0r;r)s9CAKcPd1V3$*tt0lkbx)ChRmi(Cv&DHtpNe&`MkyAiqR09pp%IBAG(wlLcfo zc>}qY+)O@5{*`>0e3SfuJWaNezmj3Im_Kq5If|S@CX?x8Az4E%BiE64l8=$klYb}Q zAwMGjNq$fMM#{SfB2RjegUL8DiJVRrl1s_e!XUiA!|?q=j4@A<&oKTKh7U3Pjxf|P zzGnQljQ=lbo1@bS6(WCK8NQSpPR8>1M26!TP8Wt7#?=fL^LRPK^$a&Md=tZK7`~n1 zI~m^2@WTxMmEmWFxX%&tYclw19Umh^{znKq8^$DtQ-mm|42EYid=0}T3@>E(Muyi4 zk%d9@Jvnolkumyv79+k{;W<6edz6(ZkHF#J5jFEMB&*4#)(MMjfXkmJcjGK-u;7L&E)3UWPpH@S!WocxabFKI2% z`RPUuCC8Deq?@cHmy_$r2goPMz2sr?EP0;%jqFf}`}e}SRw3%iAw)ZkVK|QAR3XmG z5TgIgWqb*FJ>%;cULnN!s~NwU@%NEC82<#r&ylZ?uaif~ljIjdr27-YzmxVN9p6QW z{P!gt1LVu(t3urOV}@H8wiN65f#gIX?mv~`0&+FEPKffmTZr=> zBp)ZACHIl9k?)cx$WMhx=bsG!oAi*s3X$J#B_MnxmkJRcLuQlMO;W}Gh1^B%BR?U3 zC40@+=R3(9vY7l6`4IUQd5R1!)z?oZbA>2}Ysh(wuVQ!+c_X=&yr0}jJ}<=cy~Xgm z41dD#S7a;W?PdDD9fY{9C&QPLmot6>IfrZ{w~&vMuaKXSzmYx5b^61}OtO?*Mcyt< zGK?(@KTRHF{F@Aa!0=}b|3b=(u+kpFg(%M+WM9TR7#>cJAt#eF$RZ)iqmpc5{5tY4 zjNeTjB2SQKg?NsCGu)vBO zhW{!YY8Y=a{$0j@AiM(l3FFT*-l)>)1_^Q8L5>$9A5(-*?4>8nz+NF_6^}PEyj+O$ z?jfJy@mGX#&?gx_Aw)W#GJJ;N?-=$l{42wu)%yJ2;UWojs3a`TcVnXD*l<{>8 zFJ|~AhSxBBC;6}t*S|u3Mt)CrU!af2k=F=wa6jP`?485#G9m82g5g^kzMbKF7=D1^ zCm7zt@XHLpDnz;;k>|;vIvtOnkW=@+p1gs)nY@F%Pq^MNo?-YE@-5-5*mINNZ^)m7 zw-{>kCwac`2892N_t}LA4<-{x{8EyN$ImY+ZX}-~_mdxy-;$vV_4$3s31m81KsJ%P z$T!F~GI)_rr$0H0oJp=CHLXO;Z$-K2{TN^qd6!d`-*o7Lt%H450a0NyUAzCm&pC(o8%Gl z7+u-eA};o}USBwNTY$)CudNsCpdFMHU^ zeY%sq$!PL&(n*dcCzA=J?Efk0Z^jC_iGo|Ju4 z|6y_$Df`1n{PW}i@(}qx z`62lk`30%=gTVFQG5m`V{uKiPMi@eNB)gJ5$pNI=Hv;E78J2xI<@$-_6f%WOC-cZz zq?;@vE65u1MpErNf%N~(@NMK4@*Z*r`6#)U+(*7nzD*t{Pm-s}ugU+Czmg$A`Z+t2 zJ;*+!gB(m=Nvi!UkpB#ZbI4ibHRScA?6)K3*+?!U)&3Seu>X;S!Mn+O$%n|DkLltnVK|b|nW1dqM9cN0M>m1adN&Os0`JWIkC$mXg(E z9l3&BP2NgwAnzx4kS~(2kcY`P$)n^k@}J~4WE**&{Ef7R=;!W6_98DKqsbxU6{On7 z1Lc*-@H8@uoI%bZ=aI!^1*!J?KstY7_$G24xt_d-+)h49K2E+!zCs=+Pm-s}ugNy@ zJo!6mgU%rBpcC1Jyo8J+J6N3 zeT`wY{|Le-8UB=PC4VG;B`qEF^L8bBl9!P~NGCa(Oe9mtndH@E0a-#WBGvvT$lomt z|AoAh+)6$`K1@DA?k4w=`^bNgN68c9C**fz8~I;S?URE1M1-*%$Ufu%as)YwoJdX~ zbI5#hE;)}ZBP+=UvXNXv-a@MVSCFr}7~VrZM;;-Y$rkcUQtiKj>;J=WXDHy(uDg+g z$QW`QsrF&PdC3f?k+OHcT%S)~M;4OhWEFWMxsu#OZXq8fA17ZX50LMY?~`AVXUSIb zNAd#sI~fd}O!6B>b|HI^YM&Pzk70Nu8AnbaCzF}vbaEb9OjeLJ`h)uI>_Oqlbk{(lDXtevXGolE+m(b zYsp*5jpSYAedL4W9`ZTzRq`--j66Y}B2SawlRuHal9mWv4xwZ?=^zJ_Bgr^&A~}V0 zk<-XI)UkpCpVBil$D zbY(d|gp44&l6}Yli95 zgY%~|JWuF^Uze;PYsf|9Qc~^v&XFpA+pq}mS&@go_YEF6pd zU&%BwlXR0s&QjqYH}U9f!stsLOw=5OTIw9 zMZQCRN~-;!kgu~0e@FgEddS~NTX+2&FpmuDG{ZpmQ2xZ;^y@_lF~-ISAzPe6l;LC_|gxn|-;^JCi9PDKw>aj_PdRi+){cI2-|MHRhz?@eM zC6N^sR{6ty`%4&%A_tK%iG~} z#_(G5R#H7Dj&EXkyAU?}L*!0jDAw_iyM^I~@htg*5cTmgc|eHrIz+x9ME(4OJSxQf zj*%yXsIO1R79r~GOY)2m?#G09-ZMfxXNM3F&o>$8%5&8T z@jS||#B=PDF!Fy`i2R-wBES8`EKPyCjk1?#uANl@;VO4&}|8RMJ+|Mb*b7U}_BgFH}Wq6(t&!zm| zIKNiHc)nYCe1j0r`7FaP2=Tlp82&_v=RU*mw?aI>-3lVTP@&Wd!-Iq<57~siw!UIS z&B!SAi5(N`bdJ5!=^PamCm8x<8B7dv*mikcU8V{(SeA`=Dt$gd#!LWrEL zLP4X|@fai9$S`i&edBY%F8dQn9{UyR&)AI6T`SIn8<%7bblIbKrgYdQbPlj>+?f)l zz6ZC38WQTbEx0Y*kfRc^Y>OP$?`SyBh*W2EVyL?cMKIJ`g*xNv{@$zYyZ4=`ood}( zn_}#jta+ZZl?S^{1b1?cJ>Km3#cBKgmTtl4R@&b8G-epXryO-G3p#&K?O{*%SbN*E zmdNP-*)OCxmRW~&ZH_BH860-p-gd|mbpF=b(C8OZg3fQMwYUAlGO(pzNRMNN<7Us1 zDNffAmnHi5|NQp5(rNLe2l7GRvs0&DOGxnU+z(%?SwEnvH>>sAX$QZ&eOaE*&1fFUqy=%=oFup{kEsqyG73;e6=XKx9ksz0xC*Pvb zYJ@hl*4CAhZ~0ttwl)6GyRA>GLcQ8uJzVb5m$;0!h)`o-lq)hiGTnCnmK4hsq0Ppo zsjf%cA}pg^kq$|vbBpzgPR&72`eKdE=3OGAZRuN5!sI?H^j)wH19kc2`Hsu2kFUg? zf|d_-^>T&nyt=GY+nV6sI9p1#SGv=+C1syyydfzCwT1-Qot7(BJRREHsSTp&&I!D? z(-nrhcfs9N{AM#g#$|7Fqdx^Bz1=@IwNC9|pfz^FU0YQ>nR&r8r>t;ob;YDVc|LV{ z@3PxmbIN+UtdH6Le$w-$^XUCs8c%wTMH;OkcFS=4laA(7o~EYcol{~XqYtD^cTI4m z?L3fj^Uma5A#IUX$?45Ihq#g-%l@&cUP4GCN@Coj;#7GzZyDkmP~j^w#Kp>X+~MAe7>?<+{FN((F%!mZg<# zaM=zGUw)~}u5ujR9Mm?&5}lQ@Q`%}g@|(VMcgotGDc=09-5Il=s1entWwWO?aQhPCHo13?U z?uvHV)iZQL9#!qD{^ytf6yyBbIVU}v;ybj3cQAfxbagnF)FZ@oW=!xodt|Y52-@5! zPjSy91UuVv^?YtMIA`!OJ`79Z^*L)DHg{X&p)QT?m3Y$ z9_1U2p5K~+-0kld(#Gq02V56v`QmHIQ~dYO)l1KPeXgzC7#HM%92$HgIKq|SmD)jG zsXg^!(N#A%Jqm5s-Zt7+RA_I@x1GlSA8m&`pE#q_vsV*XSJkJw&dwe%O}C5w=`jN>7eZnaTz%6Q7TDVwj4dg{%Dc5jT6-L| zI2`i^wDb+>r=$rLX&i#P82;{XOoG$L=`f z33U_|r0(BQz+SG(A8JIq588h=%0BJm-NCNT=<|EqjLt@D?n+~b(VD%|9I*^OyQ2(0 zS=O4kGGeDl*Ha$*gGW=2c|K_hKEF0Ew5_Xg$n&ic9=8$o6|uoSEC{2UeHbLU!{RVn ztd5Y4%l91fv^opQA1v>@@tCJ2M_P`(t-I>u*{zliN4{{Bb@+Z$vSpaz z-`a?+A$MS@3&C-wr!=yw%xHTVv7~e8s&&|*cQkW%CpUJg+|+<9lVh;TeTKFR{YBq z)D{~4@|n)YQ~0|FGVnH$xNUn1U#yNc<)D;YiG4U|j77L^P!d!_|PyK%Oy z1u;&E5m`GyrxZP5S0;|B^6aoJByE4hR=490oO6fg+Q_8+wsRJTJFfG_&i8g5^W*2z zhz7Q6Nxr~#Rb$&xW1H@HBjtY7*cQ~7O1EQRJ)QED-LbK;Q`_t?T~o&(btCTH)@W-D zvEI_yE%BCGUrZ=s9H=>om0I-GU1ICSb(i?Rt-IZSTz6)>^wmUF`W)0mjw^KI7Sx5* z#B|piDG!#t?dsZU4G-OBw8pL|nb!63$g=5W-J)#=Beq>#8?wzh?2=})-Xk4S^PM&x z@i?~!)_Hb)# z(u4MTj13VO;itLW&J$=M+28a*&%17e^tHP@sj(f}+}8D;sra52+xd?5o_Ktl78|*1 zy(alXb^IWCkcX}cX8Ck-Pc76PaC$*{D=8b4GAzSTjn{3i9vVSyc zrwx>ED_mRl40Xl3jPe&!hPd{Qn+*JE@&KdDx9V>$O4(JKGq(~CHkC2rom z!e!jv(b?drDOKYgb7tyii6 zeM6&zVh^O8y?$tgz3o!tKuRp+Sm@3dQbIAF*xRP47>rbi5iQQ%md%)8#B?~nc2=;8 zorT!DJjr;@1;#2*P1MrL@Nug=wNXndUaUBfvcDpv%^kX6+`BDi$%O7e=@k9Hlun3W z>7W!^Ehq(DZf)ubtthwu(-Z!`JeR#~mLbn|AO+7d56?00uqUzzmUvM`%W+S5To>1D zRl~-x>yN7Xbw)4mhnnzMqZjUwTsft_wQT6C>(?puD={)gq1% zwLf~g@S^Ni)X?B(T++TvT3$$bylh)Y2K2Mv96K72-#o3m*@tyJI!tM9*%;U4+@KbU zPeWo(FGC**O>FIKTjl9~;B><(PmiWmo}Nv!UB^9<-Hv;@JC1nl2c(AvoljEsYdoLj zl&AY1^Lb9d9%A7xqkW!5S(*kaDF<`(i|H&GFbGol0_v zG#R!x$WMOt@RMH_*VJdGmfK+ASdaA$>2s_$B|!JS>foODJ%+^1dNc+wN>~lv##Zp^;BJ`j?h8Xm@dYQd865sY-)xx83pr zY=AEfyYej9cS>0nmfN>&O<2>L|%f(53cDPSxJ znd-3KW!t!7K;iYLub1=fZO3dATryTjD8yyN#2q!Ft*~tjSVdz0NPKe3AeARa>LBE4 z5c2epH&4er{hJ2sw6<+Y4sH(GcA>93!5wdme6|_Z^A$)HrEfv$NA|_I5o)!z{vK=$HCo56_;}gJA#;x%L%Zp=_n5~Xcg-HL?TqN6 zf*l38cb;kGeNS)kjpnoBBkE`=LVsG4ur_}bw zaLX32y&*L-?|-ftn|0$N=K2gwL8(~2Nqu!^sUa_KM%OBlo z;EI33zuCU_;4E(Ku_APvJXKLahiy9wIyPE|&23(j-l;7nG|yx2=#CBE(7P;TLl=+b zsxBVu@F*92o6(UD1G>4r>5ivG)6>slw6->F@fc3$u-VO9JQk-lF7%wu-rHkCjM4f< z)2GAW8yPgPWqbdSU3O^ek$a08t#SR6w)YQKVI$_>&D)n0HloI68m%_tHQ2A=V}mCI zpPL$KZws}YalZF-VY+3|mXy&&TRb7~bXbnshdG*Ye(p`4H=Kt($FAz%^4qXJ&1mh> zv(v+%-N|#!z&Cg7@6lUQ?)Aj+s-SjPVFIFMG}^6MQ}RtcljC)G3-Ggstt*>!t6kbM zHC;+0)P))=(lv5%SywcpoI|(x^%5hd;HW%T_}Dw4x1-FgrrvJAzW>s>t?}Rw7Wlix z9JOGKgPS*cu8rCVYcm*Dfz(CV&NH#6Amb0<`C^=( z4(koi-%vx!SbT(Q_ulInVchE(5~a&@twon;_^$V!KI4QZsO2@!+Ag8nVqCiZEoh73 zadAcR{Qe~poF*~p(q~sjnu8oE^Ecz+FAmBu-~o+^7Jrs_PNS4hb9_5LqV^yCkaB2l zgv%J+p%MP0LA_kjsXHt~_V!PTN{Ww;!qwwj97%_J55f3w%CihlhX31J_MnwFIpGyt z0spLw`%S2`9+^8+21OYc?Axz&?M&&G8WU~3V7E&?B9PABwke%MKkd>oXdpbg7wiul zfY0eibfv-9m#AvnD$lki;L+LzA(v8uT=2%B9`D#aK4UHXvEtEs ztIp}#j#-DzdA-ZxzkkSK4E$zxr?&90?J1!H!=A`dsYhYNp02(H?R2=HcSra2SR*Z? z-c0OM7wNGK2p!s|q2?Ql#nxuAom|-39R64&v;$*9lq*W<`_V4L(FbE>*Z+^PFM*D# zSl;ixb2B|86Oz!w%!JHjfnnbvBC>=)SQ3^HHUR+z1qB5}2+As;$U`3}QB+hER7Biy zM@2>DDJm)|ASfyb?z`fKKK*}R-5JR9z27;1&S6qtS9N!Fb#?W2@64|{^U&}^QQa}S zWuW?}H;Z5+Zz!+S z*Rrb!g<$rg7Zu8!k&(j^T4=wolQ{AZL%)C6@_qZD$dN}{Q8SVO}Z9Z}S3?1e>^Z$Q! zsC!(8y2o|E0~yD4sQaHf%&(=xtp8hw zjj%eb!s@W9s_%=~wZ8c4!NvL-_NTw0?puhx+KKgGt)1&ly5ViJd=1wx`Dm7RgXFBn z4u7$8PvIq}$qK~(Uwc)5-^CC1k~QBJtX%)sny*=3TH>#E$(3Gm)NM@udq1qQ?&TdP zK2_BZdT5`r!IhPL%7#}At}N`^vtr16UXR47^J=@}chr-Dd zrcazTdBS;<3MZbA7s}rcp%nMDtG%Znc(=Z{5*O{)fVrcIe%jf`gR0Puf?VyHC))c1!t1%*B)eHHOY^0|Km1UN%DEzqNjCT2QqC|XO-6LK2ozmm2DBK zeJ7RH=LKPR?4Z*6zAmXG`|TI9Q?W{`kmndIDo-1<5vhJRZQ^O@74sOX_ek7vvl8du zxRpk?245iylBqJ6_5kl?P2;A!{H&Yq-T_V) zX}&s^%?}@~GPW6#nd|LTasl%2wJ~(moMINh-^9&fN*14<_#OWxdzNw@#&qSM?RW6~ zI=LlE?TYwMbzIoeMqyk3M5iufmCeJaf06*lHh_!x&vvM{YgaY`nC$S!#{zaxF2EE= zqZ@;vzv2MrI>m$V2!I><3Qtk`&vWk0$AdY6&_$@qKh=33Xhk4&33}f@-6@UY;l)6x z8$8H=zS9nFvm+2%hsOD5IK$c~wJkk#6s`AP;B@Q*O*2B*oCGw}`4olC35JTGsDGBz zVF<3z>xG`glMDW8XH8E$xL`wk=FvafIlVKq426cEKm4~i=b{18aHx9&pmoxmSU9vF zmhi84PVb;pVL0?Bl=t7}PJEiU7&jfg(D$;1FZi(L6J!4C78f} zzo2L&l-C&OK|#5Z5Pu)qzr`7V!eWt7KWg@*pyEgfW>Nm<1r3aZ8qn4|1Wk;DTCn%_ zI9*`K1(DE3+H9|&#gWiewAts*(!uzN?nwPJXU|anFC6;w@<`}kEy4TJ8I19^A`)7J zKmIyCwtZ71^jrl{hM>D5A--#ps3+|1CdeCMOAAd$~ zGxY2Ulq-^tL_+70*Feytkx*MWia$@#W0BCV)F>ply-R zQ*_UUzBh&`wLKF011{_DA*Jky;E9x0fU~pU`spr*gL6IFZ@xqqC}%X(HeZh+ITK!O zzCja}^Be+^`Ickf=~4*tI~pha1qM{M+2inMi0vWhX7)OKHB8wv(*fQQpe^6NGW$fz zQCS?CHAszhZ2^Z3@;`jzku_7nU_&i=69a`X-gB1zap(esg*wQ)HSlzk8KNCMolW z(-H-{ktxdjTPpN>dH)n(RCo>ss%u;yfBx9=T?ga$dF>7~0SE}twp%$s9RZF#it%XD z1^85SG~71Zyyjz!%zcTOc6sz~rJ#5FXpG#i;iG1ckH*SNlr)>HGp&QJso~6wDUiul7`M{$WzyZyNzD_K2I<0fiOCQI)A9?lufN^6Ed+E}; zBR*Ow*9T?ICqBN+m%D_%@u^3zh=Kmxlm8f#pZUTor?e3CmqL5pz8nQ4gK>Bnysgk2 z_1%v&ThbSje~1NCWVSMYiD|P{UNwpf1X{e!n#WdxZb?#^fqhc63m;|~&bG#wXvXgc z*WuUP)|q|@94+rdbX9hp8GPZ&w1iXEx!{NtP#-ncnaTINT=QHW=vj>M0n-s}uTxDr zsGR*6Qgvp33!!wEBVJ~dK`2TZ;i$Z$a7rh=oR7zu4wz}vD=4N6f44lnKWVL;C*hvy z1DGww-%(xRq@Ts#aW>DlC~CjZH=U` zqnyv+0~zl(L`u3l2eJWXOm`VZd;#|o%y>T6JrzC+bP^`aJRCEr^5D6%P)q)li7I#= zO{B~M^hIzgX>Ay#g40Ml=2S%3;B?YH!|@(G{~(HXO)t1=a0W{Wm^m;}@B-37^9-I| z49+B-ZTQrEa2Dy1d9(s_HR-4+9RPavev}zARdA-@h4+CjG_SxbgBOu5GJUYZ2+m=> z4b4jy^jy-7%;haX&tu+%;akzc`J|hfDHw3U1$E%dt;}`s*5E>#pq&}g4)n#8DbAlY zLj@O+>}+17YKuvCGlwu81(%R6HB}g1!AqF6H>_9=v*tBMnX%wwELsfqI2B16Yzyh6 z!JZ(UG}x1*lLmXrGuX@MoZ!|jaE^c(OJ$!X9W-}P!Dm={wn^^{`dQK;Q=jxUmJ>C6 zj6V3>0LbS;tGO_ua|iqtCigJAVz!PqyU-(#f{mNZK(IXr-G-C)={tYYU@T@Me~RwjjC%Zy_BtV=)YZ z>uAYrvz}I6Pda2?WP5L=l2Pd22Y;QH+9K&Tl6m}b-R$5dnnRSjtCmuC*HY>pPpPda zGI(z-rS7X`;QKuT8;sN71FSrV3bR<@s~7{p&F_NDV%{;REfo!4#k`aq-0@OMftM+e zw8|@_lU8|^v|~hpourdid99WLuX_pQa2}B3)NG2T)h=P1c_Gb|LH$ ze24F1nU!sjypIYiGm=APKWW#T#v$=8>42Gp=_>dhJ2hy|FU98p(%B|Z1p0l_A>|w@ z1o+@Bmj6Oi43glXt5Jm5^`lzNI$Wz+M`|_e<66!7q*k*&^_sO63#Z^`)EKkO9+V&a zyaPbqAVi^H@LRryB~^V_tE%s7RrP~cl??hHy{g2Qjxr~9NtGz(C(;3Qo4hPGmL>m8 zGVdIit~mG`*L+gRv09b z#s?h%&1@EX#HU$vD?16g1YH5`pye-sne*AJX_}9EhsQHA1~asa!4u&i3u;l+N{G!A zpk-ketSi8=qH2}^pA}uRwJ2*PYUF6qR%L#MZVlGcccGes>|marj4HfhW63&h^+O`A zJ0aL;`$Ic`{A3*uv;`TuI$8akZCTA zfE`ckw~(Sj_FC%KQb5!`#PHurK+H~|f43G;X#25%4x(-XGaod9S&B7RD|R9UPZBz* zXD7+!My6e$f+y>9Ar$c1-dS@}W~6un;Q@|E`v!wu^pjM1+JreO*j01oS5P(#f);JZli2!ffNYh)tU)>hv}BPPMNHra5=xPt?uMD%naTV>0>fIm z+nULPnamF)Ff63Iy_w9ygLG~ri~$WJmg~Dg*zY*wS7^o-W%qH)=`X;wMNxnO0s^*s zBY=Sdf~ue}SgB*s+si#z=w#!o1i1D-mODg1z_Y|q0YQ5qR$jqj0Ogc%rZhi z)HBPe0%Fjb1Gr#wFsh$oz0Ijxu8bgM`*N|-AnBDi&_x^SYm&j1)}@4{9+*iRf|a%9@1X(~8KPlcrxM5fJ{qJksEY%8ox z*rTM z*=AN-e70W)I%J;3?kT&&3!tN>FDvf&Dd?DKkp}vtFh)nAd5xy&)CF`x6|#?bIvC^! z)V~0K!e^nS3I9}0eIirNZja+XFAxB9zwW)baZ2+>Y9 zXeT~sYs#?3lmAnO5Nw_crn~t7g*+z}%Sl_=0l}nD8QDyrF>BS6WS>bk3!;5%u~}=X zh$Sf*+P#(xD^1DVk&^NHli#Z-`!;mgcLQGawsa;DEKcWx0t zU7uHO&kg`tKCj#%=>D8+5ewOJxO7gAkL5<~E6o7vNglkCRhU!9*B0gG_C_qsiTJ2{ z?sPg@RMNfS-vbg79&%N9H5yi!V|=5KhLf6{xafuE--cii&S~abNi}EmMiDKf7G=xX z{FcJdR@7`IYWls>Z%&o&s_>QVFivwi``%X_8{Fw19U#QQiNLIWREzaqm%=9$kR?YyC!chn-4I_gz%csKkW}rKBPW6pq zAunJk=8Q@f!mobF87-A*`xs4mngE|oF9jGQAWh}9M$TsSa^J)sGZ>oJ%cD0c^8}W5 z^}8-H3FZ{8{+k-FgYq>1HK5s9saj8RlICuX@c%2hCp&=$522 z%>>xGUTeA_c0$|WP_`f&{^T4U0J3lzs+F+)OR9keUq*QfSPkhNdH15Po7v_~5kkyd z7|*s$pj2h<=Srm&lU?tm>tv8(phn7>3Rk!79i%v)L)doRkIy{*UTC&0xq?N-VJKVb z6?H15dy;m|icX+=kq(%dFn}#1jeXBS)>qCgPu>}bsD*a$2gl19;+69f{a~n9&S&Tq zJIpI*N*wfXDaVAd%(Ek?LN>l*6a8;byB5G%=Yl+&YRa*li%CWrV>}#6;Uqti!UZb) z8H$WqzdjpjR@xQNqLA%QGu9E{+7ZwiZ|I3iwjQi%GxV3zw#*g9Ktaty!~8Kk*N$@@ zVQKmO@NtGjX=RrZj2EEo26V8UAi%LMrX+i&0H4bI6ux55ab~i#`-&L(r#La1pld^X zOiPv)qttY{ws7rU%z^fN0RejhrV~3uK+uLU5bP|8IoUQ=2v99yrk=_?g(jQrY(qWu zMkCJxpS{>Q$cn@WiyhAh4Ozkxhpz702UzwpkxIAXLdzXGPS6Ii(zBOKo??4LPk<|& z1IW|a9>Su){?q9Nv2ONEnrel^zAv>fm9i_H&jH5UA1HRELpPpi_aVO7tHg-ab`OHE zT_r`&iB$BNrEHD!9rRq_^({&1YaIN!=nxI@hFsrZ5M?f4BUd}kAXD!lXmzj8KI&Y? z0w>ZKk2&9BOrTyw1p9c>fV_#YTapIMVXr;mEP_;aWCC`k_DSJ{?5}i)rvyZ8NA}HD zhjqt74Nq`2*mM2Hy zB_ef-EyB6}uOt81GKduvSroD@9biIJHY)u`2H3BBun=o9$H|SnX6uy~2BFkxT2N^FpDmDoo zSLKULAY1lhk+Zn|RG|p88cg zeBXdkaLmYby5MJ~lIiDfM3G13o*{Ap>0k31gCa9Y{}E^RMP`v!I?kUXk5m)5I$nXY zBeU6i0Udu4J{P%&oNOI`5cZGEA;9elZ*wAZHy{bOE4yK&$UFjEs01;oN9GfB*6|sb zBO(iy0F>+ar5G@gg#=YPz7K;nvY7MWC>?(doe^2WX=5_fL1#oR;rf57j(-blMJ^?n zq2mJz0WM=etJd+i9e`y7vvr)l5m`=fAs&^3Z$~aCxJbv3!k;2nBmm~vf^&6K^N=z3mpMA{fLg(q2uYL01xnip4~cr3VJj0Fjss>b$kK@BG0j3aG_R? zfg5?AAmPLxV-vR1I<1`eE+4>)1nr#o1`O%QO9aJEd_OyI2SH~i-i(UALeR~Lf6xTr zRf19{{vVAz`}{=WS8s4Yp^86Q61T-du+~J0Zp{d5d6|6aTpl zz}p17o%oh?fZYW9oOlB3smLCJ15Ug%qD5pc!9gefX+MB{w9XM+5YjsDaryJH6VJ#8 zc%Pg!UwmB;fDZ`#zW7CmFp&=lj4%EW!9jw6FFqL~G;)ZbjxS!_6W}9)bYFZX0#QUF zc+eNmY6b8KIoZBAe~>rw89@$;hG$1UC#dI(k0tnm!206XVa|$tNf7eI7qPUj2YV?S!^!nC5e>SZT-71yf@s|8G(@GwW57; z)peNlc63fgGn1`2$zfZoEx+P5e6p;q=6H=g#bIL?SbiyHxU0kVEw*#nr0!DkQhOa^ z{1DM-xt)bkA08@Th3!u;Ou#BT0f8+%T)=93H5b_<1g!CzbgF>0USmf}W7pdaoTf%O ze2Q%sn)wV`7;c4mG#Vb~FpAqlbk)<7&H9>NaE8M$9E|)XsIb%>y(Efu8PZf}`K18ALGy&c08!TYD zfZ_Jfo&e{IK2xm^EBNpX0oC?bip>-SuzqGV;`3(C^0R`^|M#3MR%kpuLeplv$z^Z=j( z()67=Brg2Epj|q&IRM@VVu{^4WN4&=l5d|5tz;>OMDmCZ{f=N4{z%YgI+Vfja#-?x zr9(W`3V$pQHGZezuXQlMvbd6`uF}=m7IU^}c>?FHEI~+(p3@siCLe<^I+;$2Jl~?G zV07scGK$gWs7&3;d+{+@J}*);(452Ulr z0ygGH(mAG2G3cYD>lv=?qd$?hhD-bC&!j_!5j6S>>H20p##HoI(qZ#FMp5)P(h*aJ z$PoRVI^aG5>-Ffrx!`M%&*ggbPtt|?Sgl9@BH4tC^{A4?dMi5}gCwd2bdW7U)F;zn zXWI)CNYpRj6g%4wU<7orD`ER+KtNY}H$rbTT|hS*#abd76wuvk8;$ z+t40a0!r|sG#ze`_w3Hw5E8%DDm)ST1)`<;ccj^~ zX{DaB3B+X?L74!YE*^wq#G(UrcXYDsDWjD_dwa_0uv&Y{=?JkfcvCzi!E13(fdWw6_zn3`j}X1l^xv^;Bi?T-D|&s z6{A~Z{ju5h#Y`F9D!u=Zb?81%3wYRa6A^tzGafu*uS)}XR=}h7S31cy5qr$;r`U4> z9+w9(qt6T2VsESq&I@`c`f96vi(=dL0f6nc34_SLM4cV>azy#)4$Y0jPFqbQzAR1H zXHRA9cvUkj9cX=kM0vI1axQx)>qN}Qbsz?vgqK{TO1FLNMlm<v!l#D)bbIsqNLB6_-0ja{@f>&-#p8nOiR8>C$`7q-vcMH**h z7y-F&@tO3X*$P+7-OcoDvl1rA-9tKLhF~=2?xjrB^kUw9ykCf!o1lB{ex?_iW;vkW zV|v0oL-_+tZ)QHgpvwK=JkYJoXnf`#WO_R@3iC?tA=1T$KcbO)m~>~;5519lgmgEP z&$>P)U26Uq0QytXy$wTO?&qY-%}O*b_e;_PO*Zxansk*J)D84Eq=%au;Dx#0QMXa% zMcU+hrjIq7(X+X~E(1N@?8BUz``cR36V3CLppQKVda}twhv)u5`Kk7;Y|u&{0GMGP ztOC#is_nY^06zUYICJb8_J%89f&Gm(^6NYd^Tl>48)O75waXF!b#y0imfJ>HcjwmC zrvj|7QQAIRPX$R6?P83r+>n4Zwvx@t*UKQb*8YKjms=oUy?vd=Ez);@ zv%wz2Or6_M{|jJ~O@o)_HqxI1+-vJoETQYd44W;#nL4+HZVvE>{f?GwsfPhQxFi2;jjl1k1 znyONt46xgFVoR&^D1d$5y)8X1$ZZwox(1*#*ziGHSi@4RAh&VgYp^ot5gtE*)KsNKWYIrru~=z}&jY9ox{Sw9ns6)< z#A5Ukk3%b=s+r`l0(wcUGMNN6FU>OOGk;^r%{BPsGQ;?~2bx%+f`Y*v3DaZpxdVY{EdP&Qq<-w%Gd<&Tj4hD}e^(0a@@Wfdz zEN&qr)efOF`!`4m@0~e^unkLhy933RV(C@aX>h^w0On={{RXonzgdcr-{3;7y0zic zaSi5D>43Q>3VIP`(oHprYjA0HPpA~%QVLqOQW;MC2uf@44+;hG(!mxK;^yVP$0~Tj zo9Ep$;~m}D%rc(pIsQ|SdKeSCN_-QB228v-kBJWS)ro9;I!s*J zj)`T6MLIDD@{)M@5GGE*;#?)#V_fUR*p94VRwi1{T&t#1;9pQrB_75Es1sKpghSKY z`=E)j>uSI@D`9}x^?cIFyDE;YVQ1s9>QN{rb_0v>2VyrrP1yuY5R)gBl;M?iY~3P} zZQL5?7J=AJ2O-qtO-w_vwVy)uCfBg+^=px;oIhZl*sUzapB=j+*dIL#qnE!V|TF_e_`ytF~^I$pP7=yJwQ5JHEw~%6~^wl z7|1K`-ooR>ZSF#OX8|US*n=!4Hl+@x6diknXTjz@7(4bTb1GBO8}t@hr_iiKk+CO8 zC(NCcd6IN9^A{$$*i)oinM`zaY%A$@W-k0W_B0J%Y(Bz#8GDAscQdWAkc>Tx54F{d z^MT$*nQbNqy&8LtYVOGIH++DKJwFBVpEd0_2=og~pRAkqt5mV=EPpxZK`Qny(kpa) zEDL>+0N;-+PaH6_ESwg3cu@-blFKP4kcT|4TuuWt#PEpvVy``ewSwGd#9n7vxVan% z?i-|C^C4UcF*PZ?Qqy=35%lSJ4>nQnl5F54*?SW8U57UK;)Y z=>z5?jFZ^=q>q?SSpEm3zcTz)irB%|k@sl)ecI?FK6`l7iNj-6?65S_7vBr#iye_x z`r>z-1n{vm(-$wmq9yhT0gllpQQ1$~plqLKR2D4e?BU@LfxX*pylgZWBP90O6|j3= zBRJT^*cbDWVlpuxV_(r+%J6yC*w;+fW+T=6hP2OIj&fq(azLdS7b~6EcQi$&`36%& z?0b%k)@B}?{{v;Zo83jAe);YGbZurXcRHVn#>db%~{z`BmbfzKm5np}K?E6YsqQEVCY(#QS(b z`wr55N#jV0bU)ILd4O~|X`gw7bOmYGJVClY=``~U=>equ<^|FNNgLJpbF?=QFX25} z^9v_TRq;~p+M6_oGVwvwPBs1tqc}T0{w07WSHPL#6L_800*0i~aEnR8Lge3{8y73vS8;v1p0Q3vRBd#Hv1iQ36@y@2$1GXQ3eFQoiLQ)ob6OnQUamjQYa=_B#I7?|H){Z@QAL2oVhTk*>YaOKGRt@srL z19ki`+jk`=PTW6kY6fr>M^BY69xnj6+SM4|zIaP4(&N_Wk0A(2qY<)DzLu7hg~C7{!*m@t>&mCusf`>|mk8cq39HQ>mrOxd~w)e>$J-b)xXz{Ok6k z16mBjwp8bD;+yG-Hn56Hbit=i426i37>1Vl5~WZar@8#8mNog0cY({u<$3-SEMA!~ z0($Uw!^LDt{|!zc~g&bT$s#_yu+7 zW(?dRUrw@14SxbAUrw)knt5!CoL=`bQ>ojxF67J12IiI1>)vJ?^^w!-K4v1iD*p$T zS#F-8K0i`^pxGD(eU#&(%3R+Lw47cKH))6$`Ep7SG z&~@aTZItE90r}~20yok6(VzKv{|91|?HE5mrf{a(%R2&O=`(xsBwz@JM1GEdYCD0g z@J@~A*qN*{Bn8a1PqUxv3z%mgrZa>E%(vClAR=Ia&1Vy%nr^t*_HG1FESyy;YZ2_) zAL+@FleYuCP#EdPi)XVOo)hU#3n=q20#Kxcv}@L*4UrzC1LiA~7Lj0|ZRVl{k)CW? z)V$jtbgu;Hm~uK`oJY!7P2O8r)s{#4@Y>nrRv@{YUaHLQT+kJy17;C)i1hcow;kFZ z8ALj2n!&pwm81(zc1zHMNjEb*Cyopu-OlhLEHa!l&V3LgA|ptbdSjbkJCST?_;ifc z4Uuv^6hgKR`YzI6&UuyH&;^v0k_zG2wai#1guwCynkm7F&7@4<+0<;6WF=45W#K+<6+*57#tyI z<~E~P zI(aI54cryysV)i#*q@NoxllkI+Z9R9eCg<*El2=dEQMv;NeH;kBI&e{?Zwg-3n;WV zB8)goBu^{*0>l3$V!w8F7>0s#nQ)5j>U@A@;!vF}zIsnN{}8cm_6QuxSuUW&UeXHS zpPElBmfCLc6laB8Turt!n*v;^Gf~crP&qkQOKCAT^dnYM&T5G?g>L8*#COMgmZ} zLW?{u=xR6g6Sdx=>0YZ*1JP4rx;1WyZ%sN|MbEWv=o=dRY2mGRL%T3goo9r%!3}Y6 zJKIIiO>Ss2;(+s#pu64BRQBg9g6?%grFDVc5OlvA`VgTOU!2L4i_LE6f+C=OqS-@k z=nnSjd%}Cf4Gp8sK9t(G!19Pj&Ot$2-OxcSzMVsYwz(lgmpv?+ZFfUcXx$@%cDSL_ zFtVJF1?@yBwBT>zs=M6K^Bg|Mr1srz=-MVgVYz157LiYZtuy1SOY-(0XnK)~{AHwrEh5R_+}3oh02sJ^QA zG!_nQ!vpN+?Fiw5pr%%md7X03N{GHwx7T%1$PJt z+1}`qf{g;A_C^HZf;$DoK`y2*s!2<#wu&==W1)BwIwrk)L1rG{%(0+hs7d#~3 zA)CdvJuKj1dk@A!!6O15u>)c30&kc+YMW!^6?miMG24aec!T6|`yl$FV2kA0Vt-(t zJR#r-dohjkq<|+aU$iKAO2AY0WCHKLajWHP7X{vZST$S0A-T8xV11UU*j*RsVw8Bor zSMam09*nB_q*=kQG8rqIVAuWTWwm_dyx^GTGv@(&E;+x8R|IVp?faLA)wLgEu~eXB zux8m-G^rMlZFkaP9RWFZBsrjD^ZPNlE)8WJFTkT~lg7U`8s4iWcuW zp)ZJX1-<8lWboz*I^cvx)4${LkkCOVw3B^O==4%JL32XSA#fKol`_9@LW}7IZKS@h zoX}d@rmd9ns}ov9UOPd*IiVl1STATV=$I3_q6(;kl=6oYYTgH^qwxN8LPLm(9UcSx z<%9~^EhjmAuoKTgzDh6XB>C_hjD<3pzX89^%QzvtX-&Q-rtF7kUx1 zenA&Om-#|{ITE@FTILINWjH8t=swGRq47Z=?`C&}FLXYAxlANi`a&n?0QDAhB@QR( zu}jf&;>nrH84OhmqgNp%-Mto{;TO>6;-VXM6s?sP_ls`Q{Awg+|3u_0S}V^hX4@a& z5k)u4(N4%N#pGUei+&neVm5>jU9?WW1yE?8L2HZF3rN^7W|X2^^;h6DvrQ3{i*D07 zL$K4bv(o`?*R25Bsl1*rLomzo)m`uH-q49}8p;ydHGGXAtNupl#qU+1vf=LN?O4$& zy#>JTE=P$qdJzOL8&JQi1-SN~*a;O~BOqXJLm(_#Eg&dQZWLWBAX^?(E4ofVNFLTG zx?Vt3wOofX(_L00weMq;`fK}y~qnAzv}U+X>$mbo9z^~+9JJ?5I98-m`$ z^j3z~V*b6PTN_TJ{&z^XF-@{Sze~EU;iGzf*&(+xFEZ}|E-*Tn%kb%!$B~O=cj}kj z@=3BQ_8(;4PO>ZZA0mCS?DqX1k?w4cVZGy*9r7t=1;T(|cF0{!Mj>c<)~l=8i~je^ zPPm)-Hv*4ecE8=tGi;0OeoM?lSVj4NO`yzDb1rP=|DEOcmbd!+f06EESE1E@C9$oq zom&c^1@yB=5fJ=o0?O?nHqCo*s>1$BP)9iZ?Ks%l?`?Dk*oWXL{*LmR#z5N}(}llS zz*zeyODmN;Q*AFcs;7Wy_E+qp{AB{B+r@nW`Up7R@&~E?eFe<0Z^I+~8uV4yrPjnDLi3&k=LeAPIZXonp^W}*_GbrVzZnU%N#pV^5`_{>SXh|hY7PY`5m;$DR4 zP+~hi>n9H2Gn_bz&qyK&gGCcfUPm7_PuvN~ z7Kws(c;Yj0B^;|&qCd)Soj3=dZ4zZLTHC~oY(&OHaDY>k@+e6(#b=L1 zAAD|8iL>zMIh9y~KhLYgI{bM-C7#Bg?JCg&o%1i1*k7vDiz<aXnhFLnX!_ zhPO1-KQ`S`O_B?e;PyrvQ#AQrx^5>>8JZ{Q_-SOH%|-VlG@REf75 zEA^I2+=m9gtrC1&WVcG(35VRH64UxCwO1wP!C>#GL<87rpGw>UqwH6StKsnPs>Cq3 z$9pO<6)GK2iGv}f-iPE#N`0UbSHVR;REgKh@b-mDOh&^Gsl+Q#;v<##0)GxePqgTW zN`#@{$12eQe?C!(O8og$C5|Dif2I<72n(O9L^u5TLM3i*jh|muiL+7WS1R!j{P|iX z&V)+esKk0Sz;7pDe{oG&p#3!$#=VvAT+-=C&|RH;rEud?OzYB--nl08t+%D zc4sG1yICN{U~sgXnk3rKoP@M~6jdFTN0DK$J}a4JFjL!2oq{wbp>W<-wY|R%q)z8d zqi>+(RGd!g)5&5zr!!OgsZ%;AJ)UW*?IJ%Ur;7Z`$K|J{v_Yk(X#>6}sE&jBT=9pjluo#g0~k=%w`H~=2uwBZg8 zw9J(qa@zvjqX#AP-a`T{<;`!~voJ#R)@ex5{9xIFz~_x_$E#Sw1&)3P%r;y-18hWB zd$nEQ)%Gg}Ez((AF}qFAl5RVx_zd)$zRF?d;!p|bRSv%vqxfiN&^2DTL`~e&cUVJ} zf6-@+#-NmneqlYGq*cGLQSHu~be__`@QKLbJCSiXR`bM>?tN;mP+`}9P5Q_Tz4 z;@OmMCUq6_)fU}c&quw*mL_i@?JNGg0CY>)@)X}d8IOi7u0x1TcX|2QaZe*KhG>15 zTJt&?fLgSvhj0s;ruSL^`gjYx^x`iNnDj7Dix8$DJ-n6{BSZ_;Wj3eW*J!rY_^;RI zk3|&TgovSEV?|EQsIKRt&-82bPN!y0w;9zlm41Vj@n82g2v~a8B9Kna#1c3V&H>e6 zbZQShR2TQqL!4@mRnCP7<>)PPr~MDEt4iRak1PX3XnD!~d>xRFy9ExPRxwaL+Z6Jgvta2u79s z(+!<1P`l69NE-=e-`_xFtA3Q}1_?|bN}uF>n3B01GJPm>549FC08i``#}D^B zUmq8nml8`jty5x|7_L%ULlCN@7$43>Y7p48Rw?@4SN(`a=lf=Faa0K$h5TtrerMrt z_xNiZRemn`ZLh=yXHuX&oo9B+dCF&iJs9lu!WM_BxEg6s|3`T{kC)f~7BHy@{AxfM z=NkM&WI{h3L6(7|kfevG0i1964^ul>xu>H|cOj`0+BE2C5KhhHN(@iM&ZR~*@TLKr zboh_{uGjWPrhy+INe>zLDgO)|^d0{AW~8lC132gKUqk%YYiCl_AUx};!R*B_{`VnX zNE@mFoLKm;9RKxNbq2U)NLmGM6-x-<|1;E)srUs8RoV!JfZ(;eRV;#WW-a-wsW+0P?lVbHo5dgor{soFiE?(@B)IJ;v3Lk?bRYT?d;B*6r^4=hZJo<47O^APNtzO&oOjzzp zBprgjeQpHN(ty|qVkC&6&w#iT#IRRD4BCqir)GHHhwwMMB7qVf_w$UyPLJRgGX(O9*1Vm;4`uqXn6cED#C}wB~AESs0K@4hz4`0n^^M`f@aUrF9gV+gT zP?fND&mTG##CK#(W(wBJeZNDA*%gJT^aW9Vs9UphzMlq{DVGJR3eLIjd+b_Px)9H} zFyO64%gY&#au*+0g ztN^Ml_^;Ovn1snuCcCMclU*w`=~P*aK~lpyz`bNa=HZ{o?cjOZh$X}qTi?3$a+>y6(bv`SJch4U= zqZqha@4>l&uV&xEGFe8=mSxmZlvlz5h=I}twn?@bHrqX4@x+*n(>w;o9J^(nXVW9| zRXN@6K^SvEN+25o%qmvjw@{TMNUOIXafe6@^Q9|HZ9_egF6@% zM8I3%%u$~tt73FMUV!UY<;zgO52z^wE1>^H*`cCra;W=$)I-D#(7zQ76YWIOn?Yzt zjw$v%!v&P|R6ylq_-asxw|L$*mHs#q^4uQo)g@dbOLm`IKfTHPT!Yw zf}4~0K+*|rNjky7g=G^l3ZV^G^xcCfUv>w#ioRz7dkdip)rhl?I|a<$Lrif1t|2~i zp_=WnlddtxbB(Xy8s)GAUE}(cfae+qJl8mg9_REy*LY4OPPhg|;6zEYQxaV+l3ykz zYw*hsaH84Y(+6rxmP~~t`YjV3AZ|v%6B2Y2c0Aprt%#(842xncMTDrh5fTHu0%R@1 zAw|~!um2|S=o$=7DEHtA*BG^W0PH!yfq-HidhMf=(TlQ<9w6)Jb+odqg9phv_z}bBO(6;40Z8ZvmFYZYLD)vWgMTkI++A0*AnqS)N}U8fRS>s)mgws*-X~=**-L*JjRa zbY)d~N@#;t6)0I6Z{TD-q)p{i|y>^M%Ir8zp zjys{G&T;f1l;oWwFFJ%zDW(7}(pg z+$N^4A(pPWUApE);xUa;)CSqY{7U>FOsu`%fN7JJT$F`ST{~8}$(cVT*%dv(ti6Td zJnpB=6V7cZnOTsL?z$F)*IlbqV!NG}Q(}*%#NIhBwjN^AtM@wJrNn+oi3PJ++EXyr zy&$+6)K5Ac&P83jkyZ$9pB*4Nf~b53+-|Gb30?k`@$b4iVZ!naK!2jLp9A;A7ZNi)%f6uWat@^agho%CEc*4Zyieb1K1net$i%MCk`%7!!Xfpd_0f%jd19&vJ`$DT~#(6 zPL|}~j#H-722~vAZ-$?hotk@`e*@ZHCI=~AdDn+AA@F(pWPV@GriCN#f{k@s@9QyZ zb}Ss(0FDUktr|8j9LfE$ZkNQ{7LM!(w*ux9?TD!tj|}t^%(p3k7mlo^e(k+)f~>h^ zVcBC)N_X(}VslY{nV&~v9i{m#uplY>q6cuXkEWX-nEIUL zsuuquZz*Ugqe{Cr+ghuI%RUHv=1KLk1^?2q+f_k`a_>H9b+UD zY5B-7IK>#6i{3&@J4-zJ-c7dayznJ`iamW3ombmQQ{&I)%AWK`BfSUW8Gi-o@3qVaLaM1pwCe-FCftgDN9MT1i=Rw`xJuM zO`<-CzexNAVSal=pU**z0Wp?k4($p4bf7^4LHKI6EgUuyL?wSW=LJta270Xfwkw46>GFfPC4Le&@{;Iaux<62X;$gOH##YP`IZjF8;$6rs}^L zsV559yb#_01Cr9A+hq{;y5H||;4g&{`v2j{d$TFW4l3g?L9Msf(nTU3hpHNW3AjA8 zDZc^)Pdm0Hm8!>~ zuR!FZT3pXM`%)RxW}fKg6B%iUk06p)i|d&uieTE&OZCmZbrGr)cP;6Rbgbz|Br`CG zVgWa#(Q*bC%(Xbl_9SqOj$Ze|tOOmhvCOUn``XSiTGd55FD| z?l52VYVHc%niY6mqkI*Z!5Z9f3Ui1P=+D-tW0g^{7OaC_jWW1~P?hoxNNtJ?$C4Sm zgPOTmWo!l~9n%7p2Cm!+%o8iNGyOBHI=DoDVenH2m<;51+D?JE+_NXHjms6p^%(8mGGL9%Wx%(@vJ6-w(csiLhLJ4sZ*;i~*bXeqfSX({ z1Nx%~ZyDg>E3ts^mH{4qs}NYGc@Kvh0?Rb-;WvmoAPi{_XC^Rh$+W-L^``Mni@a%n zt?NzuYZiIa{>@3ee$mJ)dm{hME^nWFHCq;W)AlVcr|lO}UYXp#taCYSA0d`$d%eqP z`!`~lwr_PgZATgdZ->(QHkZ?O3u0L&+%7+Ixs3SolfmC0=6M>pWC5%TS9_*f94Q&X zl8aG{`eZ4(*((S^b`iF$UXG@< z*knk7J#g6JpctsQN#@6E1ZgoW)Fz3`_)@pJ^XYj7A#jD-kim_lm(1oO&T%-U87gLh9YUTv$CUkxUwmuE%5n~%BD;Y_pJOY_Y}fULL; ziQjvrB#n_gdx0@ZHiL=jCI`V0j_}|1*aCiQkLlSXnU{m)c`xt4TI|{;c?ImrNuHP_ znUy1Cx0iK!E%tv{X`GwN`K{TUhlUFC zKjxw3U`_TaLcC#^fd=JVPjVi*B$+`DpV9TI;udhOPSycjxf%Fx^U!S0Lp=kShV%z; zJ8VMnU$6ZU>w;dFHj`97O7j>ElvUdkeqak#Vq8VWPBti8J7{uKKHPk zbUZ>VA^V7&Z18z`IaCUuI%uWzcTPF#lzn{DrXaYFKNW;0hBGVgFyp9meoE}zl-P>n zVqH?DHSk@R662TfOKGnk7aN!oi}{{TiG7n2^P$yhbZ30<)@&E}?AIP@bZ;baFMl|h z)LspNj*2rkCECMwo!g)#^ZZD~8~h;Gu2`6wx#!8=KZ3%&nR}j}GxumC-#=K+@y zZ!bjFg>oja7kK2_V&IGY2VrifX1q5uF7k6`Y}y>+v-^O(*w2~$bYd~{C4SC~w*rq@ zR0;kj|1v1mFNgt+g-G%!$Nvgux;|}?_6P*~GzRf92woJ6#ITc*f_>Z+{5b|=xedZ$VeF%?b;-Hm4(5({Rops`_mmE3MsY0rB^4tE_%*!*Kp4dIhna-IYR0)C) z=g=~+F?3SP-?P0`xxVHV@)^R$P1$%=4u_WbG|S5(X;i!?hQe|$O;%ZQ4L1^rYbB9! zNtHhX!I?;ViD}#h2DtMJa8!BQS8pG96vJyLM0wNpUNZYdNIQZwy23FpjXSE;#U7@{ zk{`fEQQ7GHT8*Ivky_pi)}WHDJ+`N0XC$(gUXnPJOH){QCP1nxg_P7jSZKS7orzD$82oqm`8v;$82i2 zgygG@o?|vMTw~n;>^Ww0L&xO$-Sf;AhMw8573BA`s+NWu)CY*y^#^Wc=&AoE7Ef(s z=&7Zxlis-=!s07unaLN!Md+Q?V2XEM4q|XhBI%uH%t4OPi=fVV7R6s{*fgAxFC6(w z1@Lu-dqy0lFC1Ca1NizR-o3Ew%`D(Gh9@sKqu}DZBEUBYE^bBH8_gJ$UG*mfFb>rp z(5LLAMqoTQws z0l89<@t*g=4V9b|R6DBwG4L2z_#6=RmjY0FRd0N>LoIhA-M)? zGpv-QfB2hae-ul$LT=AUN5x3JfUAbWF$z&w#p0AjBY|GP{87o$8DPpBjaGjK4a*-w z)g1k&Lt1Qsla1leBax4ylyiN?k+VR!$&phRW$?o6I!W{{rsY_tq?=dz-NNu}P{H%L zm%QvrYfCTqYCgg(&0@W_0F;HE=v=f0!wyuAVRPRETTCMW(dr|4Q zR>QvnTP(&e31tAfU*x>KXgT*gH1Z3QnB0%c)&)mEk|qib=YB&<;TaC?e$-=n5o;+r zgDTid*uJ5EQ=y!G#)#Eg*m$5IWtqxbz^NUv!8G`MGR0Bw-5sMl@+ z)4TF64sZyshwoHmgMF104sEdrJ8`_vFcsZ^a!}%j{zQYS1$M?0ym<>GqC}sg7I2u*Dv&??je1Z85z7 z(As=9^&NR)v^W>*4ZTnE%%J!*bhX|u62;4qKSjS*c!K^3+4Z|#UIuafo=11>3i_bj zVXIO7p{gDy-H+)W-Tw%R^G;jFN%#MSo;h^}-r|E473$Ou{Dz42z?>h31AA-TGXk6{ zXA{e<-uM8Y2Y(cJq^#*C1UPl-Q+uBeF-(BolaJ>GdZEUF%aP{);SE?`4O{?PpE`CE z=s~MN`)cl8G-y2tr>1o1z4-eB%Ir-)WhvY6U#B? z@9FqE770Vo1+jpf3qk19CR~C)g%hsCXZD~Q@#(ACu&BHn%Gg(f(07^inRf^>50R=b z7>rcMgps^WmGe}3M&$yq`LGM`_)6(PHRW^y-V|V0B$FT93I8f@NfvZsU><+q6;l(R z#H2(v{_AOhv)Mp-{tSvIuR6VlW~q~{- z1h^~<9i*2^LFP7#64KH>>Fs-NCRZ)ZeP6 zLj6jHMd~~+Qs)f}i&OM(MAhP#Av)fHjFE3wv#b6dVRy#-E3ehbr29H5qjz#%(@pe` zl5P(}a*EJR^a~s3&CpHsdPJ_c$Ida%dR=en95dSCi*PW|2&XrRRns2%(gGvygv*i z2i-(Fe}wd2aPO}K!EW>Y%;s5+zQru1V~DcPY%}0a)MH~QzRY1%jbu8EdL>;QMi*)1 zh>cuu-|KIE5GP^jc#b7-{8^%7-i+*L$Zi@nH+qpClBA#)Y1>XDp#mS26g|Pfnu$G0 zN7A2b9xE3iMR(nZEUZ7Cv1t(j*PH`0!TcDAqMu!FMtbobv&hdm@R5g_?rFcT^V(y7 z@r$QF`upGd==X2<^xn-sUHa1lkKBI!{a?Rv<@+9bY~gc}8}3;4i91`?eCFnwJ;hgi zBLB+|e*3ofR6YN;;!of9sZV9z_QG8|KJhQl{NAU|`Qkfj)@0Xyzu~bH#a++8_sK)w zy!$_AhIVgzX!4nsM?Zh1_vGhpJ@CnYTl{y=?6~heU*DblLe<#SSD$z1qCdQH)2fRb zUz%Lof9~0vV#9?+>5nZsGSm2HpMLe7YxDQN<9nZcXYc4mkLF(2`{{S>p7`8_-@E@W z*Hpdb8+UG~{aNnRktG*=>X8epC$7D;Z+7REAN}}~>pxtxa`Udoo*Nka!rO27w`}A1 zk8gitF`NATx%1{ef14J+a<9qIbeCNKQ zjQo{m^!JE%?tl6DlHXa5h>O|ovE``d`A>L!rUS};_?7Fed>qz{y$2n){Ppt9kF-lS zV=rEY_cPy7@ops2vuSftORJ%3X2yR81!>i%B5!A!{9)t4!~8fw=B0L+Fj-n^lFwu= zL@!@?D^Gn}LSH5F_(!nd*Lo2i`L204bkCZ{@y8tLT8Zd?Aw3@auHi?1Oy=5a5c#h> z^=%`L+z8yOHnUYc>TSu=!BQhS#`uXmqQ_KUJmJX=Ay@b(gE=kmsclw4$Srl_2!y?VRNLVWBsea z3{MI(@CcVh@|nRRjeiA8)~e4$cxFq+){H*`9$NKughx~CXtPUdwsXwniL=6FJmhP* zk_SYznnWt^p&E9r$uwi+*Iq+$e7f{-ToR2iN6v*|cufPlmh#tj?O0+vDt32-3pFKd z4f$36m?LA$FdJK0JZ*COQ2{2KvFJ8rvOlIkh1Iq(^SUN*%n#@jux*lt$tY$10L^cx zr|~wgVP|UMk)Jms&&6ymO^k`+Qkb{;sPe0t0f{YOFSiT^52PaRishv2r(Reh zg^i~YDo$efWTesfDxB6xf_OjIbs)>URCA)`tl(wZT~dKMc7$!_s^zvDCB9zTjLfSm z1D(6(DiB_YF}&Qbs1$fbsX)w&Kye^&l@buLSC`Tt+$vpbg~&DRcJ}{TKVI@QGy;ts z#?(4NZCqd*D8tpH>5EJ0%}Dpzqh);{&{{&aq}G+F+lci*m*QBJ4T~|~Hfm|YIoE2k z1U4yYsmEq5R07wP%2^s&R<(V_o7;uoUS6VAu>uEZOLeON=Wi_$XX>`s-X6jHc%Xd+ z`Rw|8ZpYidEADGY%62~m(x%jcvZC6xDAb3vJCwEtJ1>c}oI4cRvwZ*J1Jcc13rve3 zcJpB+7-a`hNYbI~w57Jltmv@;)@+x3#O!a>9DaLof)7+tV_0eSVZafAdaxL+TUG@> zvV9<}-8T7m+b?WEXh?FQ_Ax%doIt8sib7xqH{t_PCB`Ug`rgt|u<82(O-EJs2XmI? zI}j+Gl{u)xqkVS6B4v%G;EF?w(Rn!0W^05of?s<+;Wyb~j}w^`4_kC>1+hWwW&D`4 z6A&xmbW3Vo!C%*3xCLS;RjRy=NUws}91Wtef5(Dl_nf;$xNSTbX`?cJ6y}SKIueX> zS&wc6uibqJ2bnaY!VxLV?)1TS;(e1JVpr0SD= zxE43)5NvYse87rHq?(g_=)w&of<70|hrKqi;HE~AhGQiW+gNoYw#2~KG=fPb+@l_vM% zij%Hxm1YJZM|>fxhc_+C=tDym`h=GLFacZ6VhK;-j+kNm^)D9SnOu!ul8mS;s7ea5 z3L3Li;{KoI*n%8~aSK`Y(B9Y+eoS1t$7HV16+bbHkRP9Jo*h~ZRZn3q<>K~f(!v?GWd~T z&c+ga#KsbQ9Cvx65TSj$dnFz%g}nqEWz0|lOJQ%2Lit>@@^Fa2QaC{HYN0ShU@063 zQW*023F(H_mwDsbfw8I)(ZnW5iffCcI7;CeRq-Q$Elx)zu9$?%CxhSxc5(X^IF1aUMp1vWt)y zcp1|r*W!WY>Qv<;`Mt{Ax06$s&xdg@l<>X>Dj68ZU2Sd#!p(i9*^0cg*5*(Jty#x+7<~P7qAtGN`u$2Px7f3H?k8P^b`1$va;kG&WWUF*D z@*^M@sosVgI6r^oNj@nKLI}u3oK3g`Ro#N1Eq*tvZwuUAs`YL}`qvUXAuqvW@_2yY zDctkL&v}Bdn*dH6WV?}ogo(Rb`1wwoK;Vd!OQ02kAmd>R+#4*goZ}V=Zj8X<9t`4^ zI1cH8P=Qx(97ct?nbH2mc%)Yb(kuN$Jj_UXvnW$+QiW-e2EAS52~TM};XCEISyU6Y zG%x^HAh-#)XO1m9$p?1RLUa6Uk*d|pgy^eWDj#kSrs7#HE~OXX))~Ub4@nR!@B@{6 zd>S`7{&<+CGnzSvd|OAxUv! z6Iw=SIZ605?!dsUM3AICGrjDjD?|F21BV2;99Au{D6fuJwXej3%dm`t!VD0%F3sg7 ztiz2$3699)K7vVkj1sWMcJ}e#iz6FKDK zOtw|n>oQ|ib6I_5+vSBJr5O!#*5SrN_WJshd?JBLGmDTTWz)*3A=y#0$jBvEsVc)R zKX};T2H0RD&{+*>h)XYPmBZkY?ht~@JIlKOH^zYA@8xk1!Hc-(i#=-w?j|^e8@)jA zxIFGAuoU(NDU{1R7GupCS74=?h85#-_&p6g|01dkrON}ZtnstBarM#h@G{)wa>7%% z(Q5>c;bt`9^SA?@$zHd$_xX!a|Ffbg;ZEU}`msM)hy(!Tau^&1hY%c*2Z418w`6(- z5A!HE4CZnOK?=-G%4Nm6$e^V|BoYYlaw*DR&p$CA%SEv#kt&y~Nm;2bGFU3H*$H4d z0)F}j6(Ha%*z;NLI>FsduwHQY5nL;{$6mboB%fT)a#q_SIfn>tk;gp*lp$82^XW}C zfxroKGLH2?UQsm}B}!Gbi~pT)`00_;eU|#2g^#gtWG3 zeBukf2t7W1l20F6;4<-vZwy#WKC!1PLDy&VrVLy27|LE`@RBA(?{?e_zYq69>XnRO z;K>jY!ygqS=$1rc;2u;qNQvP;_DJcVMPh*OganZoelCc_02>oTV)!C7$EU;q-}??C zp)GQ;QT$vy(w=0aHsNOYPo%zR6eAe;bO?#z&j}J5MI;7J*sA!H7=8lxLZe6wJQYG> z_>+R9#WC>N5E8?GCP+$&0d16DoVH2W@5{EnPrF7j{1;MREro%vg^(EjYeCXd7+7Mf z;!|Sy0;x*Oww!^BaGzxgbJ~Rr!jsHy_46^@i+iCNviTVJMhJ=FzY-*^CIiohkQn}s zAZaxj(9ZCS3wB18Wwz&TLG{Rh3@_yE*p`9X5E8>n1qr1v7Xx3k9O+YH_)Ef(s4tNi zcs7K@Fj;q@L5~s1@iDr`r$knM2(vU8$FS|P8*N4gw4r{+U_)0Todh`Q&A1tk;$CQ= z)iQzsPLLW#95;)8^{a~z%b0)19n8w`FK|mAF)ITvg^(EjCGNAdOb}%d#&Q`ghR?$t zKx6O%+*Oj82=B)Y@r_uyIKC_#284?`s8ODoE1CE>p=I7Gcu@kI#i!DUyf$jsQDGDpN2@mS zi3pJT&>0;L&(M>nVG)DD9Cu??b$o3T$kAWH4Qqvf{2Va{9a~!*GW3sZ0>O*8J#*9C zNj`iUjExKgpOwcU0(3uOqXgtgAh>G%F;e*w^^LHymcHh;+ish?sAZ-9=sz?!;H{hs z&OPhJResd3LGy7m8$NW)GFYhs{13O7m3~pdQ1H1_U@*32WiS+cR{YaMp>Wq5{|kjz zoMiuh4fk0lhqkXQnEI11BKT5y6oVX|m;M*}C)jEKZ4ZM5{zv#h+f zO|rAVXH+t`<=wrGcU_cKuTB#in0{5t`a#Xx#lf-WGBauoZcMa?Z$8N<%5}&PC*EyB z5S=Rl=jF{O`DCl;YvZKHrKQRa>q$Nn0l9G0E#!NOXR7e3cVA}9H@ z5jO+{0khC=RLV-EU{+f*zw=zB$dZJb{7X$oOOOO)7XW{lKF;EjiVwfkrd`b-bV+e`ie-b3s@fi3) z2#MjJ3X*Dz4Dd5g!8$Sghq(PZF+f8nh{W)x1W73|P>FF2BBAT#Vjs5K?sqT0~gsw`IH#GSQ@327`QZq#PH>Ug!;0423`yyG5nu`q?8zV zDTKtZ=UPrm4169pTJG10;Xe~3rNjUgl^_zsUlk;+69d|ZJ|*o!*@76h-E+$IA;Wv5 zd$be=4uy~yP70Ei!oXVFD4!C;4Y*~@*(e6qhmaV)R*;ku1B+~` z_SN0a$TapIEsyd5ppWIj@&R5N$=G4vTj{4$>+@bN0#B?N~4wS>UOm&yW)i3wITRFdg{J%2&hn5|J2&PDoQE10QWuY=%-(B)QZS1gqoP z6iRR{&Qe0;YAg&rT-H$J-S zs6{rv)R0}Z9bHvzU?ua?Wp<|oz$QCjmP0}(ogF{Z!(+xdIl=9u+@1z(|((PzjBqRix=0@i)(a5MJg;us9Y`)-H!ZPq;$}dc|2)cA{irZjL}11!6EK%Oyg%4yVmjLM)wxLS8Y~ z!6OIp_>Z`uofG_69-{;8GqY&&D+`R;xEW|B$#IqPXXs$rGv!SQD zGHseG)~30V=jo!LCDlhJ%(4JMgaQN+3J^r7oFF1dh}T89x8wFqq4p#nUV$6(lUvla zLh`4<2t3R62K;>!?pjlP0hnhynaa4g;jX5;OoSyvtl2`N5qOsCJp4T@oj0s8vcW)H z&me0!vchcj<0_G_3b*>f_{h%;h#w5gIG-;qCG)W^kj&@nO36F%m@frgxlu#~2A3G+ zgG&U)QZTtpghz0Ly$HB{1x6xx!NwB&%*GNdLw?{AoPq!aF2N)67$tbblURbMaL;GO zIw7{3z~b%;;+C@_t7O^DRnD@TtDjACRkUfYmNv~*)TX(*+B8>Po91e9S{BxdfDZ!| zK`2lWgaQ>oC{PiE0u@0hP!WUz6=6ub&Q=5w=mfcz;O|D(}!u=@j@bqNd`*D}1Cqr!Nyy>|Jkk!k38-kwT<+ztxafe@*Xg?h|c1MtN$NwmcmJC1~>A#dN`y&BbdZK#_T6pDUW*yuEITkp05xD`DL4r zpB91aj3Nn6$)lW3aJc1ypk5G$2v{0ib_5%2EWs&x+(+Ojl-x4sA@)*17$&$J_hqJq z2eLofBs~*&Y;L@YuI`hhKWg*L0NiCC@mH>H{N0Hgok2hhc)E!6R{My*at+{b6gLnF zEaLtW;(o!>KkQ5(5`0J=_YgdT8&1EUy+Y0pa8^U=;;(;QfG2b$flVzV$^{d{NFWkn z-swmdX9c1w*b2lz+1MRtEo^@30tomQbBXTbvdf`@KN%TGednZ9av}j zl#SdeCvRSf06L98k$3uSei)H#-EZ1VpqkaVQFDS<$>Sb^6S(J39E-b~z#)_-17{Ue z(Bai5`S3CcOjpa<7nz%VuQbr)s>9zWaR*(E41W-}@84tKBOxS)KPE^hnNC0k zv}E5O87SG01DafQ`1@(xDB1VDG5i_ae#s0_{soa3{*oYR$qZ=8KBYj(ejL!`qO^P- zx4Pc=Nc58HEs*)%TVadPUne>7hne4idx3%V@IWOWNdO9l^;S7*LHCoRS8Hy*_f~t# zQ`}O>Cs!T*-h;c$ufvGf;VyZJ7`iu%#)vlynlqyqVu@wcToo3Zn@esjAjnkdiO}!zYpfmF!+*H*FZ80}6nipx>sDtGs9x9317l2biWR&Hu2le4m zg^dbZ6;h|+#ai;>QpxME{Iv=ZA1QNrz1{*j=FZ2bHOxWe^`ZrG#Ey^L=i;^B0&yGg zk@g+0t1J-3i;q9k@QDzlm~vMY9;$Ium8@}*fQ)C{65PvhyX!nWT!5R)2~`>YS^%9F zH}^yNyB6;HIUZJ^JZDO~_`4AIZQRu2x7&`Eq%HVMd43n}w@QrtvlgHkH~X5h&|Sg! z+gzl=|38k`muktEl^C9i$S-QoHW6HCF78NUV-x-lw+-#+8jcU86BEVsQ5S6M?`m&r zDx{7!C9{*0*{P;fJ~NZf7n)`#5>riiMK0u%NYAIu|2wJ7RB~cEl{TZ-9hw|Trw)xJ zlMRXdWW!W;D&3GyjARi`{>>Ir>Hi_EL@v{mn@AK#v-!#2uol54Y--uOA<;BCJCPaD z+-OO@m@PQw=olOt?%I#2xedP|dE^Cl>u-*oEyU66CdU=O#jb1`&8O3BO{s0k$wI~j zf8BI&X~TW&qPC_~dM1-hLjf<&#&dRW;6NpM7qGNn8T@wOo15}Vo^v;#54J0QwTvG zGlVfjHR719nPN6yiXY2m@O39*VGQC~k~&MCTjPavo=rduWVdiyAZjs=eH|T{9vww8 z%4Wlakko24gIGKi|F!lSU?;PH$>% zZE3ND96O>1ilZDG7KKht-`eP%ziX^wae(ZXP2_^hR$W)W zYV#EqR8#~~e`q3GuJ7GepKQLeEdF;Qk@K6Hnwy#~S-q+(;cbz~xm(wDx2|ff@B(z+ z7m1*yrlK-Z)mXJv;I68z16vQ(udS#I;C(!R2ds)M_~UJHIf60ByR9tiPb(v6=kYC- zkqrvHb9UX(JGQl{>AoXdy~X=`8=CsI&h+(HEDRL*Y(-?tjowXl^{wO0Z)&>#U|Hg+ zipVZ+$(A+VM4fkDUCT8sH+VC-vd0bEB7R^y(UW zFKZf~JFuoK!=G11T2rmwO^sLFk47%%5Fc%vKGeFkd20hA&T2$NwsE?QaZW9WT=25i zP2_@Zrf($c>>?LkU*|2ly#=9<+)7Gc#cyX`fBm30Q`f)Y!Bjos-+n9E<_BgAp5JsU zy4L$N{G>m)WtaDLb8lru4aJ^QTGd=p8|a1iRYjT_>b!F}e37bMRon0GA6xgb zrj|`>B%)FNdZ{|^lKsu~O%0bdH}y7owRPT&bzXgAMpCy_ojB;7Q|BFP+}hmi)o$_f zjb808{M~wBtoHz~RS)zY*tWHL)xiS?dJpv8c<{iDeZ2?02XC$Oeq?Ptr?x{6+o#Dls@);N9n%a-UDL?XZtT%-Mn>c_1F#f^$zrUlUuwMjblv>-V2qZ z_w|C;o3F2~Z)kcsXjXa;zVczh>T~(GnSa*u&q4lq|EgYq2>*CZ-h($)-`=;jdF@r+ z_ZR%J_vB5D-d7fUzUjbhLsQe*`lj{Zy{2^+H?^*8>fPGZI(=aJ;2o$o9^GbvbAY^>l268_4bX8l@0SlXGx!*ZToyn)%Fh5xW1{0 zRjJxi!yaWZCkxXjhmZ* zRnzDdfi>IIJJWoJVDugsZ0cy)(Nf=Z8K$#EI57Qz?Q2%va0j~3{)@h>2`o}~8GdbQOwYR*8sIT2ZhJ6x08+njC`|lF` zP^7U;QvAFoa-ny;af5e!)T^mO8-*R}@V9N?Kzpy_zu5!Zq|&>pc6+A^yS#s>X}n?W z!L@h&{;JEGR`ps=M!&wJP`tzYPEFB!XJL!?LQP%Y{RdX9_TD_Z%lqf*#y+92zp81g z_h+Vj?*D#mhf!vny)~(0;AaJ^)-6y zcdgm#eg9bXGViUmjfYqzqb%)ThzoDFZq+&ntf%`9yu$nCEsfrtk;Vhtj$BrsUp;eaJQuml*B1N*U-FkwTGYHMd@S# z?{faRn18qqc;riu9UKVWFi=7J$gOxEUJ|LRAFHSdME%K<$hi$DsQ%K1>sKGBf9C-_ zZ#{4VWFipF0v6rA6~zWu&c9g_xqkEI7q2_$y_7F{C&2tKBtG(I% z-m*Hc=HaG>>sDWK1sLaV4F%%8HMdW%TIC(vf~ncOYVEc%E`0UU2xv53dCleM#MX87 z2ZdXvSchKk_|PxohGbrupc=~R3+mx$*Qg+gu|>1i`wbUD(a(*>xBqIkwr ziDJU!V(E0M7334Ccp{a^71Mc9VNHH6p3h8;i3&G{Dvl&4lTi2*)NiFWd6Zc@USZq&Mye$?R>=^3W4Fc22wu!N4J7U9a!>C4AZ`Xl=t{sEJ zJ#E8113T~?o_G#p#!iGGkxz`pkD0#o6g#}dJ+zwiOnRyqADu{y6$}gzmfe#-wlgu6 z!Uz`%=-W^$hq`veJNNWQ=Qq$#X+2|}bw;Zcr_})nn3%{W6Gbo&6KF{w(G2E_ znaOEr;uw&rsf39`{hBIniWkjvB3DQ`w(9AO)4T$&fJx2H#6RMN!Tv)KtVGBnpd zT{u3RPmGRck|vf+Obx??1m}z-<4JTqnbjFiW=DEzAUg$HG#ZPyw-2Sq+7rp6(>c@A z-PX|+kHTJWF`en;j^SQl00Dh5JUHCe*D)|`b`G=Jq**XKES1jmMB;c~G}eb{GMt&@ z@J{An9}X4g7|h2DCYqg1=Q-@@aHrWZAK25^*V#5qrh%1;nHon&9W}XlGMhUd=Om6} zY$wwk?y2dCiDpyG#?nRblR@9bM>54pG}2CR9p)U`#2J-M9gpKDg2DP`$IpZ?M+NLC8F$`SSeiImcX$t9?)6H5GIMfy!9@^6}yl1G(WYG3>J|FJ47`$+p z5||C~ot=I2*)){i3UN^sku^4v9f3T+oH7})|5Isn@G&c#Adf~f5Iw2mQ;A8;|K#}5 zI663;H>pfwB8%=h3f@DvV~Vjy=HZ@{W zFmK^~2&3*B>XDhg1DJ(`m7t-1FQKe6am%(M>^N~+He%)+!C<0U1qgC0O{Kdb1o9a~ zW(s*XB}=>|80dhBM1Cx-+>^{F+4qI%5zg0SaSrU6Bi*zt5fmsUHIp4VVudhr=Z-?M zf^Wx<=5s~UuWLr2&?>aV}m>5dK+jhJoJ5Bj(M#$)p@s!3Bppu=-Oq!%7(%QG& zFESoDkk3Uknwgl0kGEoYCR0ZFn4&svQrTilOJ{l%BgCJ@mRyM()*O7YR)_`UPCSWq zPBPHHuzv^Yi&RwRINFPK=eUl1sO$UNIv|C8=~(JN(juj~#Kf41?j7vuM3I=Y@gh1Y zG0i!RmDWz|-;Rfl4itC_ojWZxiDeQkMGwte^tcL3TceomiR5vtEBWI1q=|KbYdhP9 z4#e9!+oHo*_M}15aYOsN_Vycy$1c$XhUY|zwI3g%7_;r*f@9K&Ty`SPeuHqNu!Usm zYKso`#W6eayYrAvd1m1s4DF70?-`Jl04^Sm z%@}0qq>13ncO8G;0ki6S9=V7sz-G*e=kplp#sNBS~TN1;4r zJEyT4WH3kxa09v*$`)o)enONUL_$}>>eLEPmp@%jGfz~ulZB`?QFx-q z3?wgDJ`U9@Rq91I%V)6&arMExOec@BV+-O0g#?;S6qDnr>=+dStf2QhFl9EFJyWSP*ceqy z#U``a;&?hW*xlLBQEH8k<+IZeC7B#XLm0vFXd*copG+6Wv-9;9a0?c!`Rl=uCd}7b zG+|v>47(ib4W*WuNzz#i?KdP3tYF_g7>frMakP6flY(+p-teh(aW1V^$7YS`v*NN$Zsnca8tEytO&!Mwws%F3qWedJ zJWLfx7e8T82v21XQC0eKj!BNHuM)L&cQu<#TILX0 zk(xePuq1pEU<0T^6VNN@uZ8y<{fNmr3-twmTjX!6{9Px1*UR4x@^_>By%y9U1<;?V zd^U%lxhxd3SdJlEWxn|yFbdYfa%DOuGFb2gua}As@n~dB9;e$K zI`43{6Wa%nR?%!8>)FvF7Lhz#K$!|nOH31Jf$?5w`m(-GWT(dJSRpYMpnwcf2WR%S zIOb0$#VoaTtE@+ddwT|YhC2rbx?l_BkM(JZotUiIsi}0b2t1X7BT(~DDXfF3^c*Mf zF_UxF5PI15SG7F~6k7i{p z&vJVrjy<5X!2nWdusP&ASzo}=vTnt5)V5XNL6Q`xR*Z<22O(=&G<{6?wn%-hU}muS zfR!r`ZvH(FR#G*@!avE0lEQZ9{j!Mf}J44;g{xl!zZZQzG=opb&yR$L7 zsESRGwo;VI)R!>`bxL>7{y6ku+R10ul$}k3bp-1PY}vvr_Hd(v`?_Fh)9Q7GjVvyh zt~+PJqtJ`xT$|X9c45io*~7`{0+&>4Oo~pds*lxII2s($>@)-dG-BxC0ZntH z17dGF50^o)dt$nPE%Gr=RYn<@4neCiZj|39$EM;2TV~35cBS>jp6;dDi3c%?Rd_Nz z2@ZkbHqJuza*TZ}#`}569d0bX$!` z=bc+^(LHvU(RMg53OAY9^a!d&yIZ7OG8-S6g;AFh*8?VNJU3l5BOT+NY3jNVadw(_ z?_+;hTF8?ek7q|mMG8$N*}Zg4ulhR9*%!?FY=G<`ZfC%Uh*-AZa!5@wdH zxMns1P85RRNf=vVA&Tb)z9j25YUd&_0M)h4Dr;a%42D%sVBU9iLuM%Bi@hX%w>;LA zF|)6~-!25$CZ7a%qazEDh+{Ab;?ORf* zAgXBvE9PEuhP}k0ROt`3#p;EF$sz>dXeK=YFC?w&>?D{*GiI@5K~5)OF>)R0ghr1= z0bBEXq5Q=iv&P8+R9|G46~Yrlt?Uk3;Bl;ZEoL0s@SNK$3r} zOJ(7!OBN@fUd=`mPzFT*bc>Oj6k>OdCXV_R2TV)!YMOO1UE=R-gZ+gT#At#bwm4mI zi!oLw%pw&zrfW*vOFJOUFrm_;dlPvl&_<3z{*TUr4`;B>C8y{Yv$dSX`p2@Zk3yFG zE;{zQ>DPnm#);;fffS>hh$5dcoLHBAopCO{XDV3`?~zoWMzJ+jX>rY>fl#}TImJX& zCDE^ZVYV}yi(;)x=ch~*t}pnDFw|vpkzOCJYFOVyww5V{Ri}kl#BnN< z$&AAF1pQ+&*Q)E;6b#wZRIRgz4kCW8ouk`86tD53fRS_p zUEA5;#(wh?DW53gMb8G8^H|9lWKm~VoAvpP!ybfv&e>#VGd*)AI;(Es^c*Y}E-@)= z5Qrs{OJ=!{NHyA}8qst<1Ctj8(tlvJ`$7SuUoic#=m;hgoY>f<8Od^+1_y5FD97AK z_rW`W1BoqVp;ki|MJI$}vPcbzg55S6MA;iWO~fj2`4=C`o)}az=SUfebBTlL6HgR! zlO~&7*Xo>lmJ_T}TTpe@lJ1$zL$!jRzX-KyHqV6&y8J9WLShI6_LD+`C7Ti4d+F)i zkJ0KG=;))Lk~4b@vSB9UOFoKBbqoo4BpowQ;Nv^`2HV^EtV4TeBA=o!YMAP)a9n&J z4hC6I7sqxVWv#z@*alfUSzVe1>lSeyPAJy8u_Y3>r{K4fQkgPJx)y!HJqhD>IN)Fv z@AgdAuRrmv-pZn_v(gqxm@IFkE-Ctm>{GmQ7!u5px(SfVeNyleyw?x27rMi&1LrGLdY> zx!jcL%N2Uy01=ijBS$d?IdOmu)3BnjO~Nlkp7mu`XvBxQ<2}23=Zjs9pC@lMeqDH) zYyA2%#Bab4(f9NRJ)mw#A=S#n6}%5(5yWI4hnoizY3zhrZ(3&zd_9^OgWgqW+31YM zR&WJe&%_1G!-m4Nf<}NjX?=7sV@0RjL223su>zlsOm%RB%=MA(SuM3^DjMUo#`I6( z&~Dne$tH{54!X+9bh2YqJ1McSdI;;mlaq!%N!>ft)3L4rY|)6vcHVwwAZ=cc2h!GY zb(Ugel887FcIy~Vz|%1i#bHMSUQMJnSzirwM3MTmi0KnEg$bxV$Do8tG#4Ksmq=3Q zg>f+gWjdapE5I?*)1{has2!!5?9szJ&9?p!et_cG=Arx0(ZbsMnHz{l%aF=zdC zHCZgQ7Sa==Mi+W`_EOVeYa_-=N#T&7=!+08R@KXmt2HUQ8iw9jb4BGeoI%*k>%fMi zIN4y?49yL~cdqMQZpX-kFjQ_B2D^&g9AlvKTA6G^=sUW%Y3HfA;&%PjTSaXbNm#7y z1`k)xJ+ga2?R*1pi67G+7?tx6AmP3^w!wqy9VY};OvJ=>GhG1fpI)4gz-OdB1zE$PtA*+& zYvVv?7gxtKCbjCGH70{t3t(Z$qk;%2S_|BaaTC(+(qI;5@jJKJV-G8>uw}45mAsuj z)Wt;Gpvu6XLgyrb5K zCz3s#Vx)J8%5P0{NXsMyERGgKi=8vD%qetm9DFnrhq|BSc0N>qR!CS`P^HV=AqDG4 zgK;y;DGlRqtawy}kbOJBOh9_4z{oO?Nyz*>(AZFJKVlMb%PTiBox(=D>Hr3dYXM#z z>Qm{&B>bIL5^$%~jPP^4^Y8+q%c;4eF7Rd8!G(D=?luOYm^xJ>GukR9NrLJ z^!0QN41?rl3*;-aMX3=T)}Dn>X5Mgb?EAvpJ-u@VTT4{Nws3BWu*wDD4aU)+Ny0)dIxupRj%OxE`pI|Sg zaLB#oVc&6bL3ts{syI%%S!NZxLYNNS9-qm;Qk03q*=IfMB9~G(ISUg0TP#Due_Ws3 z3m(>lqR4^|(eAE`GZ8ZrLJ8D(d}wxZ(hZg@+Tsj=2{FsBGi2+5|uiYrn7i}kb#yZ!bptW#MqdQhZ|iohp2gW z5{uM5&6aRSN3Us%;pCr8PUt-DP>>j-)(sFhd+>e^HsPFrnWX6oZy)4Eo$s?n_n0gM zzrhMfpHk43%N>}hG#qbOm_?Pw(&uj*IY*c1kUGuSLaT-y#WsTOQkb2oJk1++ejcY1 zM&hug@`)6^S2(>!XDAl$*l8SpZby@wLdI!Vat4zc;~>0IzQ(Bglx~2n9~N7Pc3)GJ zFVVhtSnY=L5}E^8-){R`X$$cp{$nZwF{qVO_Vp^6C2rNH*PuY9BjgL!;~F8(3JR1K zd+06RKL*8Lwo9=IDb1 z5nb^IvK`q3-de+fM4V$B;>^z!ct(n*Kr|MmM1+<`86@i=G2(5|m_oge>D%7bhVwks z0Ntsb-frr=WNnHdnpHw0iJj~;+zb;kNxBmgg>>7*WCuLWV1IG^K)Tb_j46%9s4&BQ zOlVhF<4x4L7%&mXVbK{o98kNlY+|;REuQK{7AG<~5C*7rWT^7P{zl;$5?XchdbPg4ap%fj_ z*cyV-7*AlYIhnDZFIi`$4x>0bAu2ld#pIN;oPa@f^P>~lSyN2<2jjR8quOq$z1>4y zJm%Z67pEZmxp8Vw9zrwc(Zd{%y^YR-$<+$O@f+43XAb-K;p_lP32u1H#tb?{&W=DO zO|-zj;Cq^|%Vp;Q&wk^C6683%{*#5&v?)I|0W+qE^)gPu!o?Lwv&KckqQ`^E6+G21|dxM5Y+2JAfi8@wvqY4g0*^UYbrI_7K3mpF%nsX49|6@=VT>u(gzN*d@?WR zrek|~T7y~!_ol7qTC7|O6{@#lh*8D$&;10>0LbD|I)^(H8<3S~3X3@83v7Z6-qB3a zlfjM(_4`m)TW1_X99%N#bIFL^$sVɾ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

    XUX)Me(I1(B@&-gd64- zgIyAp?T@IYGI&Z;8IYjJ%iznJ%3upfTjR_5=Wd$-QQnG6kmSQIu z5EbaK=OuEpJiuxp9@_W`#N@J7$nPUKwZKS8(;3`~TNMjqS{+H{T~{Io-M~Ph$1UhmMA(Xmp>0mY(AVG@uR(#> zCar+lMg{1vn4QDmz=UROyFAf{%UCOJNG}7Tgi!+k5xIyJi-??B5{b+yTwm~G7s*Eq zM{%P%21Jj^7EPLw7DYeXA)DV@d#9+A;|%VWXqbU~E3I-%SBW{qfU_P(j=@8?bqpAL zs{$BY@BoZGh8raquxc%V2k&CFG8ndgbbFml_N>>E+_oV=+lmF+b_DnsO0gvi#G_pG z_+5uv$A__l@`O)!i;*0{69~$HB*A7J0F03;TFBBzVaO;KEAGRM$x0J+d-hY3#PN}9 z4}KrO&B0;F4uLKV-er;*@`yH)qX^hGqDYjB74+g}1q{b<178MjkepuYA4k&Ha5E=E zRt9f}t&_<}^)3~VFoV$`a~}6Vh;UROm<$x^HN&dEF3>P?I6-M8%oE@`D}@gu+Cc~! zWSGPajJwfDFK#~`%TN!S@ECz@RfyMCK#3wo0{dka*~%?b<~b@gw=OVbD`=1b-wOB3 z0;hkjhT!&KcU783Pctfoym2Fw9L8OTvv5UcgSg>dhiA})!5eW8IW28%_n)pSIsCd> z;7UYaCa2%LM?DOO&rJOcpPAaA$t^aKMOthD&9T60BOuo?R^4JN_Hs!PTmILslod|m z9$=+Ks0~G=i0`HGSf73Rch}20FZ^dC%L?@%x*Ap9h8kK^V+O7cD9K z{(1~;co@0ldIlB$7&okZ93Qa4s82Qz!z*w@S{d+*7Eq@Q`lO_Pk?{s(_=4mesRvM% zji)9vUU5%^sTSIB*TcJs<0aU>J&Gsl&~gf&sKo0ukEbA6_AqYf2^M1Qh~ihS2K*|n z9^Gt`EQ(DwL6^8fotIG-t9^&0h8bu@UPq`BNeh?+>lQ3gL?v3XaE1%x^nq=KO*7-K zL&OgvAM2?=lNGTNRKS4dA^ZU!IV*=8Nr3GzH}x~a`*4HE4rDbi@8`otUXQ8<+Ubxa}_~rB$pVV?7a_F zLOJ`GdG7TRjWSSF!VKQ6sqaDXUX9|{yL`ppfJ87a17=o>$5)J{iNM9C5L+Zcs#<;< zl2IXP!Lt5&b3LA$1RUOr;6{z&SFY9gC1QF8g0ZV{qn8YbAA}HRAQ&TlYB6;zFwTY) zYSFb&0KAJNE!(?Vd6e8GKGt@#|e$|B$V}Yuj@ictK_l&4qZ23Oi)D8^UJVk&ZrJU&ui3`&iQdF4EP%#Kw{FuyU zl)_=eoF$#A6ga050NEtvj|Gd)q>w|3V4LU zv$*Rp@3SQ1KM>H+r6{G8@$|tNKqdqlX7FK&o?MNLSKIGuT%H)9& z7N{exFf}+ypcHC~gcn12zkM z8LTrEFeC!VVe#e>hYKXzjxUp(m=3&S@QUQJ* z1CW?w1K1|nj!+J58tLidfgnn~2oF?`GfR`dp^6~~jIjqWSny<-UHxB3U}j#cacf6M zEAxD+G7o#to|DL*5qw$}7(Ry^BxImOzR38T zE_Lodj?-M4Xc^v@4_V}56{m!XQ3j+SWTC6Be*Ze5y7nhp?$2!sGsPw7#xL+@KtWL@ zz!;?%00w;?01@w6j~IlOflhopJImN!1u*Est@8zAtQI90*ec6Pgj$Ar4yupAVcf1$ z2rMwd!a*m$q+ChFqR3>6W3AY|tVk|Kw&Gq6&56TsI-}0IK?4SqQ6EltGHZHUYl}+8^5ow3MDXME_szKpKqvk1Rvr@=s9tY5HIp|g1M)%C?wUe`6J ztxR(gAA2oF1mt0`RiYJ4Lt%&VWWXFj*ey0E=EMw=yo=n-X_Vm_+^Cd+R_f8b0ZFU@ zXkm_HjEsft2Rt#h0XG_Cz>*3;#Jd(FhN>CRqJ#J`Na9A{K7Q7lT9JTRPAX%d9XZZ` z2%-iCR0n8{c(QS%`f#xHL~0dJ9F)BLrxfsBN-_L;7oj8s!w%di&w#nX6Sfd@urM+A zu}TddeP}DxZ%gr)f01M{Hkqkk^+TPnK$6ubK*?H3&lDa_N$2l)({A zWpEUCdB$dA=plpGNz`i{Pom5~;Ce*0vXOFSL;lK!#0#c1cpS)aQCf?DX${9Gk$O9B zw8}usRFH_xiJr3U$^>Uy7Km-z?#moCHC0T7q#wxva>L8d80!GJ@nmaLn5|ANJb+mr zDWPCX9W9Dvxoq_!?zVOjcU!qYY~AW$Yw)TTpsl$=OI(TSS;fCy*CcY?V{;;ui^YjQ zkFD4Y{v#}nfbGW(;e-p-=Flf3%XJ#RW4JL$3{nyu!moGv`0O$yf=d`&j$4_FF@2wO zhymA8m4;3YQZB^}6~I6%ku|0k3o~fc3=F6PD|LjeK?TTGqQYgH*C$(*=Crl>=6=*I z&Mk^H=|^Ok(j(J2KL$3{|g0+f0WS~^KA1SHqZB%Fl$1d4(7Gp zg!k&B?4dGBPd~3d1Amu3ii?j?@+Gg&X&`ku~Lw$~Cwmf>#1y%D#)>JcG~`R(`-Mq0Bj z3n#;_#%(XwWy@?qoPF41fe7D?`#redkNX3-KZyIoxb4-52>F6zPK(`M{x&z;M1+&L z&*IMFz8AOu;xPHkHTZ#u6F*+IzQ^RL+~0Sa=UpcJ|M^u3Vfm!n(B=PxUvC2A1Vs@A z13zDOi4(wu>Tm~|nws$!ZI2uYMPrdvJX1=Yvybilp^ow6(PEKEHFvY&yHM?Q{kBw88xJR6H@6&Zhq36&2@;za|-qxr9eR zL)@_G8D2l7*RAX+EDS z+Cp<}v0|#g3X$T%6`o9u$EPzTFBhhoSh18$XG_RX3sWv$OeZ`j6#HztkjkWrtZ@+* zF`0CcIqNYg#51vU;d~ZPSa9$OoDs_xW6&7sQm#-=pU9{2VO-_{AH;I33bURJhz~n_ zqosImY@q2v%oCOBoYSr&6iCEp4r>Wl&-&S$>$CN}Fo% zkHll?>^Sj49nzO<$yZ}4l`rI`$|cVW+NQaD@mv{FOeLlZ>C${TB|lq8lnR-00*5M= znlnvn$3bz^)7e5ipHGoqm^;&Xg!n)k^0&IGH;jcZSaRNX-0#;0 z)@^sJp*0xEP%-H~eHE(72(s|Jbo(?&2nQ zwyCQ9?*P2jZ5TbUVdF9P{J48XH9g)C3^Z<@?CTG@71jQJFyJl;xHC;H>)j=d?o1

    tv%o2%*g88@&6MBH-ybsNI#Hn&$*_-7=-=7Wb09(0!o5o#+i z`8L{Xojh<+C;!O}xElghbv;tU%m@1ht0?kbq+dJfHjKM7ydNV0Df?LlL6Ga|1&^s@ub`Pnl>Rs zsct93SM%pY3$p!FIFTy&p% z>wb6XXkSgO`z1l)L$!Fm3$1=)mi+L?^~!Dg>)h4*eJG!B*EP9o_xGK`*q+?c0t_b7 zH=RUERqGcn381;p&5}CruWyt%5kb5e4}UIzKdx`Q_cc)01MZ4(cc9l@wf}&-YW$WB zyHR;neJ@-RXj>=44OP>4%R8oens>AcNqg&VslWHYro-(6-t&XEw7W~2pePTWKD=>z z%dv@LLwyG`?yZgC-LL7~z3wc_-3&>nV#eo}2X9OUE_Mrw`uZUV4|?uwPg&=ssPz50(AVCB4YwLU#@z4Awo$CyqzW zD1K^XWJc@GHoM=uz1LmQIJR(h+%;JHf!gyoyILPoz-U}ygDlEw}F1M3c-78KlB zYJq?-=82XQJNLA1@4J8Vw#|FnI6|L4Pd0epG7jD6&&x1M{B!47(dP>p?%(C+8XIyu69hzfyj$=nZeEQaazd47&7+rq<@2CpR`9>$riFAg36po5LFq z^}CCE!PEHLJm{_<2?KRab%)Z&x~fQXVR>NVddzrkx)Hx8H_V>g;O=QWT-DgyR|cAe z9bhe7(&%n)?AY}3P4BsC=P|dX(G52pJc-NQ#u2H(Xr^~=XmPjo9yqYs{mnbxjUm|& zKCPo>L>yk18{?NceoYG7y+c`;Xt?{<@QYD~$bHOiO_j$Bw-Y(Hd&PG91-E{20Y4^i-l-$2?nt}}#O!AgBfoorW&E}1611G)~_f)UD zeSb&4J2CEVYT8gW3H;p}sM9+4i<4x>k6h7o^F8k6O$Ucssn6PH|>)ryB8lZJ60f>%b0h z?15`GfG4De-ns#I$@q0uo%;GZ%mLf?yHRpt^EEm@H`cXL&Z#@g_6#cu0~?# zr&H4@r;wV!a5)MizVZwxRafp!U{GX%jROm$y}inD`s-QCq2dX z7OgLUzY9^H}#l|!7iJ}vmEU}rM!ug}| zY!bXsEP~Kg-HL>c#JWcM!x#6+gS5S5nVpV7AjV}sM_jowAJ1fRiFgTYMgSM)06K$t z@C>8gd@*SmuuuXUJ4fT0?&)m8$xoJq31S_&T*k@A=QBA- z!B}LjW4bsWEyTyi(+Oud5zj{9l>s}AC1MHCoa{}G5N-<($2vM9sfmtw;@mXe;wZ$k zMY!ZrpkE;Yf?;(ZE9Jl76Kl;-$Yh!vGHyV|4ePB=H4DsaqG)nwEG9~kNDV@3=Bd_9oz7)W={ z$;T48{JeM>3`1kMv(uSO3q?kH1!Bg=(xoZ%7XMFvx{!rDC(flxj%o_S1xL=M=HY!# z&O3$atW_doUE*)VlY3bl_w+f{YIC;~u$d|@s>n;dhJQ{d!usXFV4NKX_x3jEp%wXWK_sL>%+fcT_tAzuRJZBwevL{VqxS({5w z!CN;?z3tHdCRk}La<5JB9d0fy$UhqQg#MY9_`;%VhHP z4&6l)Y?W=!#WNG=6lSa#)Q}U0x{uKVtXd#Bh1n64D2C;t`HVBOOc7zoay&6_W(j9F z1P<(KkDQFPceRJ3n9&3cAwXm_biChzCJc#n5SxRWt5K<^bOXt#MMqmp? zXRI%sJ=cS1*EDo}8Xn&`1`VWz@dXwyWSn%7HcIQ9LrH=?;pt%xCuV4&Tn=K9IMKPFT$ub@76g!J)hO-L9Cxz~Tv_)~ULsQJgONq&3 zZh})k=1>Zf;N#~?V^!*`#eR{+<{_q{1n0nvFj=5d#-RW+^N#dTbr$C;PFkWLh(eLr z7pI{4E9GBzZS3aD|H%fZw*f>KJGrL12M8p}%f~q-kXmWTemn%)Cl7rn{{p5hQ z*hC>W4c(H?W59*!tTe~hXe$1~1M zLZ=vKYJPH7R1lSGGG1LwRsYc7uu#~T1)%O!Itc@=lDyeeX*O5D#6-IXc52L;&@y?q zcXf5NgJv+uzJex+^+57zR^9RXJ8bG4W%*muUdp3+qjm zMP_#CoQ!9)smuV>Qzn<4Xe1hW6((7az=DbN3><;=SSYo}Aje%)_uLJHu23x4Z;GX% zsH)^Kn2fNM%*v?q80Jk~6p8v5;jZQs8K%Lpv#A8ubWR2~Es@3CT!gGa5rd7W>#&bl za#AxTop<}x@R5~YdIo!QvE)=nTkY(QwWDE7GU3@mbSyKR%6KbCtTM5PoEZ0PE=Nqu zm}+!P8f@OlO{Zgp@kDFOuD0?tK)w{38~Rd!vX}wL+eW#{cqAi7L|U}_;? zEKh6RC|)pbk><&mSdKBUDhHeDowE)(Jb_W>L(!Rmd|^s0z|#3&fPm%e2o=i@4CLH8fI3flwzz&w;LYX49C0F!Sc} zvI^rIj@or~7>eg}8JK0Bco}O#6vJe^s0NS{p#Mlz%~Q^}Fif#jgcD&F18rc$dl zBHbOj$h;-Vvma>J^kg`etvm<6nWnm#0 zR^!E4oDc~Qo(RER5N(f!>}pK3{&1>vbQY4K3-W@))jcQQ4h%x~ji-X6Hn|3$t;W?Y@TU%RNcVLFKpwnPXNI>y)<@9PF<$RHuDq*Z+WE0q2PGg>sCAZl5 zVKo~aa#e1+6a$xXi6P2Og?y|N%iZY$94Mvk%ybbac_z>$XI7+@0Gd`R7nLjQm@tvl zrbBMzW@;iEbFg<`VYzs^+idD<+t{xc*G5^_nt?8+ARh2SVL3h5-_t*+#@n!Q^Hfi$ zUH!2Lm)2EMqRAIc=bC)cWUk4(oY9{CXslzT+esFUhan$N7iQCNml-=lW>uY2hr%3f;#)@I=csv8|lVIkI88sT80ZYlG zLae8=oZC~$MySmKmKa!Ji0NE4cHKRr7*i~JvE-f3WB!Nl2kU^;iEvs1ntb z?dl;CBPtCBrW1_H(#+XT`1l~K3-Ovlx27hX6aD=p+1Am>CWXVn{55oy)X792+FWyuf*3;$j zV4_411!j&A-HF{?xsRt)8O*CWSO=J{5^zF0F)I%-5`xSqa$T$zHsjCeq(3AEYob+G zjUo6q*lyL*k?Mio81xN()I=%c^yOy5@dD-@j13O132o7}+%(qbT(6|m;IEcNTAUm& zC^49znAoB3)I$;y-*!9J)#%1B7n8uhG+l&s4i+^Q5T<-et}4gsE^(Ia5T{nFa|Aja zf}I*a9xqtEK6Vb%;`l6Beg?)xB1@O2_G%VJ2Pb58Fp2Hu5g7waOzh0&a5kab>wHBu zAq&jdNH$R{VFE2L3e_;;@_H7d1_nNFmgq2S(4`_oq--M}&E>t`?* z%rr=f3^C?U&!F?x{xQfoEJL+*mC6qE3=ywV4^Y;!((5_i6FvE&n%@V0u^GSz-f5Qx zdDxT{Yavh{bWM-LKZw(<^hs%V#L>;gxS4##LcJKnt{!^qs>SV>sW) zwHdR+x;Ktwb;Qr)FsR1%gV4~dRhbzqh>hoPJ!Vc(iY^-)qb{Qd2HQAYFt4d)*uNZB zIapVaAd%7GfrtZp7u!}<6zLi0iN?Aj$791MK$i2&Et8Ab7FhFSUR?IY*X*bludBbE zl;V^mr9_Is!aQ-Ou1qpeOyGeX(eM5^HUET_`vzvRs!rV?A7AVn+$uHa9$7 zqxKL6AlrVlQglGyqYI^+{MP8fn^hj<{vDJ(`nE-VpAo>;~NL?UX8DlVs zv5`|nb@7>UQ>~|K6jTR|t9S5b(w-)y3N`LQsS=>`&WUh)>`32W2bOl?@;DkVBTht5Z~RPtoga zK0A)ZzG!bM0-?Y7M!i|C2VZo=2y=rnEGiGvLPpSWP4a8j_PI=kUWh?E z9F2G!+V>4hl9;W?635(E?s#{HyB3Y+YdzM|7L42c*|qffD7 z>mG0r_=H(7^?|OECBuce%p#OoT4_h9t=lonz|5-lu&KfW$B5P#>z*~O_hiGvvcYfJ zLP!p08-<@b+;174r^Rdxc;QyQ+W~WzE)Wj$i#eINN`yxPgITC1&~Rt~8+>${T|5Xr z*hK^3gYA4tv#`BA5_Vuk2%aLJqV|X;J@uZoAUh6lp%^n%c--tB8-H6EN87<$SihApfxyroSqQ47^e)X$x_}S zl^y*)z6|6YG=Tj=8x+i+$161%IHR!Pl7#}uWUvuMmVmDoy88$Y_s6=@SP~^tdoHU-Z#$6VwUn~m5h!(1S9 zn4Ln)lTuzt#N8_yg{YiJ0Ro-j5jZu>MCD&Sa)S(>=tyXI*qPFW5|yA%%BTlZp>KD| zy77$Vfq9GujQkX1E!-;dEo&i7JKHb=dnZ^DrD9t#l^J)8B8P7nE;6vaSdQg6QXa)3 zhQ?E4Ha|HptvF)DQU1ne$vtMy!A1eLlsmCEF6$&LvLbVX*bK7sHu$iZhv_zrU38}!R zPHERE%D8&=?85kPJ5HQ7)#`CH)*tQ~fymMbq~1+KxRn=l>(t3*aG(OSL%U?8+7|Ud zvj+RT=@M4Bnb_E*ZWhmRlg+osFVieL601B}5bA~rf_0Nj(rAdhij`Wm^oVsZ&=sP6 zP=$FJ)Mid)K$@JX3D{ZbVxIe7&{0LvwOm1QtJ3V3&=Z0^OvtjCN~-O8=^w|FgQ@FF z^pab0vdzlHCUvK5yFnzenZymdb1)9!=*HY>rcKXtZ`Xu4)*>6!aJ2Nt6Fptx5DCfp zN8KU5!zgL&l+bz1D*5ga_$!rg;2-7z1#G=r=a_oes0d{uG6zH8Q5&ZY#F|-OuW~Y& zZ<643>05bGWhPiU6S&=*ADd1l;dU?#c>oP973IhrxLBv2zo_X=bO)NU<@WmVY^bZDQU8$7xu6DF*3-G`T*5_MIW zh8G3vMwpFndbv4giboTXx2BKg&pLwLm-Ygw-494MK zfM2s%(kamykwXP=GXZTo=8@9ibV69*acZqE2>w!}F1({7AUOc=hg>`4NOxk{to_<&#JyhJBr6Q8bcXdC5(>g`hN zeH0_uNH{yB{;hNo3tu>%BXbeBV$3d@b2M3irR|KxuxKyDlXNYPW8R02PJa`|7$=8e zktC=c2H`$D-fs4YA&np&yzpip-|~lg*Rj>^^RCKb zRgQ-dInuJv)yrf{sv_`|HE7jFHM0f<=g{bSGA$o>FVogQT(k z2?&lH5x^#%J+f?Eh4i>UMH~955rAV2kvVRIv}drCPX(?uBL2)?AOOsGGX4MYWE=Ro0*)NUpB8Ou^Y_lWdhwKrKB zYiEpSQDurlbKcyd2oK~sb69*Aacmf8mLpViFif*GhP zd#iQKh~~oX6wf@{NZR*j)r> zew`|teQ<}{)q$GH-b8@u0=$WhA#N;Vl~yRBtr$%nS|8(>#CR50TvaqT;qdm{+_GdI zJ9;8a(-qCal|)zSUUU=)XJuh3zCWCkj8+`Xuj;RE1*-iaXU50+^LiAW%bh|OZDb&n zRN063!dURKNspXV z4j&7#iVMfKqjO!UIhmoX!s02N1T+ZxK75>~qsW+ajp^2gdPc~ru;)ZAaW3-C&iM|% z408)1+~Ya=N>~Nptq%NNWJO0p?OicU2d&Q7RC#y{CBEE4MWqe|@dSuHsjGcCr~%H` zO`S0;A-El7yenf9;$sqrUU3q;hBn(djz9vc(!6j~;OjZ?!mS+To=TGN^S;RuG@Q2WZ5z)i#c zqz6up-U#EsHB(-caLm-#WVN7~-2Kj8vMuM@YW(yK6pR?w@py4CO4I74Xo)Nw2i;y9 zj`er84@bqA(X%(G06uwW$s=;&xGOa_ZC+)lu2G4CGa9kZ!O&>WFdaJb!U^VbF4x4u zbjDzY_hdWZI)n?%G(m-I_Q^$0QLxAWssSX)kOC0E3c<}7%vOKdcnahvoC)ujb~`HO65@TdJzv~QKiwZB<2q$(Il~j+nJI8 zzZllw+(AMb?Ljj!m@f`#860(;m`D{Mq&%h$6iQT$7g-j%PXepkGvRTN1nVnjm}4S` zgkEY?cX9}YDmu-=V8=USFm8FAFkLJd-V*f?Pv+_Or8aU;_J?-dTtsFX$t%&3#ELSYT9au222zuEb#bjPJO!TEk zBbXs@;G8RpN(WvA^rHQ{3h2&XS@xn$)rzvae`VP{PACMcu|Lv%1Z)h&WnLCa8qbwk z?D)1GEWeA4$_vk!v1P8N{i;)fHTLxcFQ^Y`ODS1F<{p{dm0{uOi`n;r;Zu|I5_GAR zQamMxS4ufVJ}0GWd~uZFY!hnM!`@s}iE_0TaK))B9%>xsTar`_x`Z$eyUuQIuXf^P zy<<*@t8~xa;Sn+8IY*CqhOKJ&HeeH^spX6?8IUvOLe6dB4pY+yhJ+f2g|UFCA%E3uSHdwSq_vf zYj&L>Y4~~Ssmh9yIWaoi*`j-e@K^A|jq`TA)F#F15esRp14r#}5T3_>@jj%n3}lIE zJ)81zu^~CXYc~e@kvK zOEXKS@_I^42kj7hrEVL%8$Oonmp7c{)%q$bnKy*Fx{PtS8Wfyt8*`i^9IBMk@aWd7q(H%`ZnxU1|OV9&$Is!{Tdfo*cM z(Busc^KP;|U^^N%JH6$jab)de4li#~gE|8|05F3209KXn9KblH09h#H<@f~Nhy8fc z31hbg%sLDmo)POP)II>y6P%CpnK&lk6Q-EsZS#6x^`H$1p3cKc$+w zFezI+Rs7`Nx@&{GiN`R6m&`1UgQL26%XjRdi|w2XSBkI}y*1DcLd2@7!);-_fYH;} z73)6&{b#*qR08DhXl`Nx3t7$uo+()6OIC-8pdh9(Ulb$VWm1Xhp|+|<%hOq#dDjOo z`k8(iXPPWp4DXYrvG_Ai1nH4_N8mUz3-k(WW>7x}pkHMHZ_8L$p@5gHDQ1Hse9M#P z+@L*R$mupaM@#2Kc$N!ku-&}F7oEf4KP>3@cJTPDa;AOT0G#7R^hEIn4P1JB@7j@_7~Pf;7NEF^6)K+$wYz-sLZkdttg>NX^MsUmO!4ZMc)!Zd zvTh;(kD1Sv#f>fVCPea9bA%*(^rY%R{c-_cA#ZWYaePCgSj3Akbbs?>8G>9tzQ!uD z+Nm!Cmk%$CycT(oyoZ_%zFsWzjzo_|Qr1{Bf+VMS)3aPISe;8nrRIV))x?3yuQ-b= z%eQ#A*439?;l3}8Q*<2?70$t`3|IjrPc(x$?9VjJ zNV4F|>p4_Cy2ch~b22zkPFNpQu@!c@u*iosF?^yY+R4vN{2Lh{0Pq6O7Q*m8%lYH# z0`&8Ry5!Bb5iGrhSMz>vo#=PLw5lm;4ZI7YU%hx~7?xxFx_WF+pW8?*cRiLYQO@Vl&iZ_{&>bkD<9)vu=_9^19nSC zN&LR@H3=N3Gfjy&8P{Fq&Iw%h=kfNEpGRZZPv(IlS+7$pWC_C~1za$)F`U=L+2K52 za8!4RD0}s+$r4?>jap8%g_ugLLhWQw5pVY-K^=bR7JL2Bf;cF~7d8tqXSnASUY9ak zjrMKi^JFM7s_Dq1&jY(F`of9$*aq~K^e7Hs_hhkY?3kreD#^8HQGE(H-HhD@)l2Gw z=64D(r|KCp&#V{Om7{_&&uB33g5sRAtm3(CCFlEzlh`}v$er$1nH>ThcsmNR!H;*7 zX*_fg72lh3dYVaT=zDvsSj`sV`V)tioNM!x5`>UnPtm1;&NO1z*wsDsE9X#kD0r_d zVgZoH`!Hg-z<|Ol?GUY`?$c1NWxvKKB3asF8Du|#qIzGqHRLU}g6zzx&0${ZE~?A3 z{GPcIM6nn$CkWtrf&~nfD~bjC6=tny$-o)e!MdlFKW+Tk$)Eqt+I`1YO}>x+PfrJ> zK!H;BDo~`XQuf}fY-CRSPWC(&X1VljiUDusg zdQKz0Ki@xoc|73REBBo%cjifQa*`7IUrGJ1l>S%R{M5l*bTVgex^Hu~1#@$0r^H`r z=_eg`yUN5mzeX@qX0{_aruOa&?Y+8vw9iLcl7{J7h5ZGVv;XbaUrvn8kC%KlOI-)# zyG=RaaIWdvR}6eFkZF_6=bHUBvs~bc?bs*jb$Bim%6ihVi(JYQWM{*7-exbvmlS3? z?9T|z>T}PgY-0AOq1^c|Cqc6InxiRan)Hf|T;OqjVC8J`&Ihx}q$|>3z4=(SL%DJx zcX)Q|DHp1BIGqcZY9-RedH!Yt+@-3Vm zk;);t*$c^)H|GHwveueP?q{f(OJdF)+lgm@i8qfA(4UOR$5B(+iP^swW%V{&Pp4Wf zo0zl2#C3&V*E(Ns=)AILtG)WWJ}r`5SCY#N@=2_Znv*+-WuWfnh7q}ij1y4(qFTmkj{`S$1IZM*pwK~c3g5=p8`m`fGH?R*VNAN}3 zTRqK!_5BfpuF$eUn;GmqDNDR@Ssz|vuGX>b$=wva^+;03R9!CYa+_bvMzKvB*w>M& z%fp7``YBCy%?Ew&gzM~HR;&)%W^)}vzb3JNre--?joDTk+owPEoJ(M`rup2AVLn^z zeVc21@(FG}zU8hs`HYgg69*4(5IdqyKRMItDopNsNMiY{fngd-m*&3y0EW{o#{ zXS4cAb#sTWeuZlP9#KxolRmJ_HHq@OPw#WZdYXp_%CySCoY{PJO3WP8gO92_w6A5= z#&zUDV)n|R_m3p5kn;O*nMV<_c{q`DyXI$+`Qu?n$lq99a|7YfZ zU*7W_@4v6``Ii3sBA;*RzpwN8mX`USttxA^&~>kxoY0$F+x0834mIsV5czIIw_2WL zr&9-%K#6_N4vtxjfK%Qfy57CSva)oM$SruQgxy`#u=Ns$IQ$xriuT3!2Hj41*%% zHkJrk<`Fen<`IqUgVp{62j&0&VKuQ|&i7I}Kg%;JG-WFDvOawQg?9ReDc`qF>6@nX z?O0BiAb(U14Ib-x-_O(F$ZmakmU(Zbs-3=hi}LzftiwBBy}YB*nn~V<2ASMbQdsXnVhnwp=rEt;nH!Gk$=@> z+&=kR9oe^c&kwHlN0~g{arn+3eM_3pv^5Di^26?3p;irfnM;zkM4NhvZE3D;@m*#C z{}1(j=czrvnQyI<&bJqmOP86?ba_U)=G%PJ9`7_oNbGd_2D@rW=lf6@Jjol_?CCM< zlz9uSGi(+4!)JapXMR*mQ8V$cB=yH9tv@`mR*l5JlFY|`rhfR?z;OZN{U_)WcP&%t zA=Ca|$k^oLg2yMD5HvAxQov;YDO%Hax#?T?{;QtvIy6!8yVemaLi#z~9Fr&MI=WY8 zmhZUqO@6vOg2yErA2cCwV!$N-$gtYZ1-}#g+0;md|^^ zNoyu)m%j1tRdsyVp$byxzqXwtX80uAMv~<=%1l$_zvptz&?^3g{X%uRe8*Maj4LI3 zfTU&rs~w-naI($&uFFaC<~Dh~`xf72SBqiUH+0Z#&bLji>|ve#Ly|Ikn`irK5}ML? zxGt{Ye3#*5DXZq)AH{_nF}ss$?)`zi-!R)xY>4hKrH1b~nwfE!@~&E3Rd=Et_2q7s zpSCTqx_!vdptuzjlB_{;Pgp>>UwXfc{+awT`(^RV5s=%@iXJq)@8FJ|#K8k?dpLiY zdo!cWHJoVuswi4}M0-Ee&6l>X>S_O6Qfl_0R8EfdFhTECmBV|VZ`QqaytiTKl`(TH zZVvEYRpV8qdiwjypV_+-*az{66JdFaHN*cdO}u7fA2xaiHI4uGaizC{=KjCRlV;}% za?%v0%76SI%3IU4CNZ0R-N0MwZi?>-t#@&m!L`UaVYg4y|7RN4ymUX&%4gWblYbth z>n-B8H#rse_DlRVvv*ySV@dni+@}^-{^Yt);twePUFvfmx1G&g=kfmF+&hGWYHb~1a-cUR6uF>?jdJ4WvoVLx^yvF$z!-)!s7@cN~)oCETJ9d9Cc zCE0)2mm_?t$QJm2JrKcLTfQOE=VRIXA>XmPTc)Q?vV}Q6=JRGSO|nb9zb}17v2Q}t z#Khkh`c!rboX4F+4>Zr8kztL|Nxx6=KF8TSb>Y>O%$F`sk?(c0=wd~Sl`iogsr3mc z&Oo{&dF2mtoC@+eQZ%|~Vtwy@u}%fe;JU5ODf*9xQYR@+`~t~4!8PQ;)lMDXN06F% z*+p+PwJ#w=+kbb|2dca!L&ztU-A68x`i649yj*RTk3MgWfA^8=#qw5Gdw7{I98P;4u5`WJ1V8_RQ>2FXYC|8tjBYRaLXd5f?Pq{sHYog8YJE|>hT_2e~{rgPWR zGVSuozhL?If7R1-C-->ue9Y;b@m7@{zV+Hj?0d}P)a&4?H(KHZ`R8;_y|&Ur-i4Xi zt^L@~w0F4l36g&S@=x3Up8WG2Zw?9cT-E8Ed}E}CZ@!I^PmiTEpXPD$eJ+3d=BpsV za_Q%ET2H&rq+GW=Ouqv`=2hoS3hQD_70DUUG-w5(yPW>MC$pj2NQk9 zn@f^9<9*$g?+qz<)ppsym2bIEzC1qp`n&SYl6)_mi4djObiG~q_W9(?D>a<oHE}3q>`=&`Q@LJZgJ_KI``GjQ1B;zEF7!@_2G6PQHt-d{un% zX*->K&s_OtOTK=u$QLf_x$k-!5G>od_Mp>z+NF_tzSGf4#yddz>-;M!|D5p_b>*ud z1L^f9r*rZZcIDeA`G!d)%~xFhIr$p6^7W7pp@~j1(U~uGT=}Ye=KY*0>65RgE8jiI zr`NHZ&dJx+m2ZIL>mil2eWm4})4r*$eBeKmapj9x?EM_9ER~&nf%1n=o@_p*o0`_L^qQE{Ir;pgp6~iMK=L`; zQB|qz2$o>RdeM_kbL)~zs|p! z@=xo@re(Ep?OROYy#=F3kZ=vM-#2KmR zjCZap-*U+pBjq|Bb>*LvZ@VjBIXQU9E#*$<SA5s2MUtC&%16}#XOTNjk$k)%6 zFHZ95bm;tR;gfH?D_O*y*y@ZmX-_0;%T=qvcM$tFC$<|3|$Su6mzJy>yz0&dHZq zc4+#yGp?`xBVTb>z4cPh*%xX`Ctow_Ip;*1rCucCbn0o{&aQkHrJn4H6FVp05Ldk` z|1sVfu6n=zN4_<#dcR3MXWDh-&Uk-x)w}Z_`EFCsY4}~K*K3XwdGq}$^?bMAeX_p9 zHMQ609#Y*|U;c9CYrRJ1v-ER1r+vv~C361OvJM+8t7SE(mbWZW>iLd0>TlW3Yue-O zE!CazW^(2G<}b^d;WGl~&u~}1GL<}5ycFto+1DpuL07(7e_PgCpBe4s%je3sv9iZX zkVa{~{yzCCy7E1KCey4Zs&r1ivaWosYIv++wC_!+>r8JQ@;Up8=AnMp-_4zD_WaYF z&0O^wcJZ?`kJD)#{nydezU@-acLUM!YS-S?zGF2#);*aoI=w^WpVPj6Qct#r0XmF! z+k5$$<4rsAE?+rpNV47hDfLFnuui9K(@yo7{nnS`{H(R9Eo+4IpDzD&ylLd0t}DLV zVY?6gtfs-zlg`QK#E!oG1FZWmo&KtSk~LLh-#3t&^sjEU$?k(^}1J zcm7tOtA3!l2BmF^lz$#6_wD>;!N}pSPv^6NNnd|C0!mu$GXqR{h^surTmwo-%qR!z zKApeRPMR-i zhrgA&Ru2)37oxfbsNIJalH^Msp9IkTTD~ehk;VO^t zCYQhbtz541T(0swuJSyt^1QC{ysq+muJU|lepgGZWtYeL#EE~(AO3PCpLF{3`xZ-i zL05S}S9u{`HH*h7dQ2z66@=k zvbXcMO1kQo^cKor{&MD;bo_cI>+Srlvaa&7W_;fyRrna+P?B;{CW-4?)1#o+xg3xY0~<7rt0ndt;())J@fQ-{#I32 zc~x(r{N-;|ca>LnmDhBY*EH?zlQ?~HK;YB)TeV&FYx|Vy_+nk<-Zfn-`pX$u(&^PR zGH>TEXOcw633FMl~hN?NXGOy164u2d&2Z|p6Uzx=HxuJR_X@@B4b-y?h-zJ;q? z&p5oDznq~Z9e*otq5S1&dx-p)VC5t!y5WXA9PR2*Vr?^i$PyUKmf4Rm@EsISLoVKRm5UG??*4X4xk zm#A+~ZuBiDOKh&ARTY|IihO`W)iw^k+pC|2&vmz|L&g-q8 z%NkB>FTXt2G~ySgeqQSniJeZzx7ro&aK&dCe!kQVlW(W5y2}4_#R1wdI?W$0v9|9m z`4=X~H`!g~dcD)>w0;rl+tXjrsz6*t%EDwRHg?t5?}waDhkuj$c?2Si1j;!Fge~i<*I+h6+foFen$`{XJWyD_Vi9P`AS+@Bz8J&Up~t9nthlY z&s1@hw{XQhUGY$c*K71)a=fG8Kk59{YwTfi{IQ65rSuDv$TW0 zIexezvD0b$?oob3{tlDlhX6SR()@bOI83ethe_;oT0g=Sm!y7uDGQV1g;-*He6dz1 z;!jL@UF&Vv@Y5;JZOZFg%ZY25xS@53SU*|A`ypUL$X{EI~S{stYU95e? zx>=>Qx?3lc#GS2+N#d^7BVygHq_y6#f`jD`>Fl_h6`3S%Z&gha$61NLkc{qZMaoYc z6K?@DcabIy?fXX~<%xqnzvtt=B)w}E)rD!c`%YG^W~Pbt4W=gzw2|CY{H!VnfpSN${q)p%+TCHwg?xMed zlY@G*7@MJ|z`LA_F2QiJ{1@x32c%Y4@v z^Q%+sX~z5S+jC!$%Z$o>E3S8Q;|5$E(D(Ht8oM6DuDxFMoEq;PyIRBd&5s(Jw_s4k zG{yG;{)spCYE9WFJIlj*<@rnU<1@2=NW96{xf|2>)?V}cTD?`={CL@Uf`P)pXM1Ao%@;xsOyi*@Lxf!Wh7ZQsSe}`&bOXzxXj?dl1|GtOVyHfB&J#P=6`-PJ> z(C02;*Nc0S*0c8rNpBGT_XB*)PSxjb+gCj%z`Hka-!tqU+UHJToq0)Ldgrd}+#77> z=>K(}u(N8pld#&l?g=)v+;;*e_GE;Kcl|oMkXKZ2?*7%O;m7u7?`%?dABiZhsV`Hs zY)O7Z;X9D?R%G7<`ff{&UwJ357PxNE^}Vasdq?ko+^(DSzGQRDanfE%@7(>bGIJYq z(n7rv*;**aA30{&_X~u~vg9mL?!A-~UA@|yW43+Yq{iVs{X?X`9`mVsZl>xvS;!pA zs-n)dzuyg+XUS2H#2;B!H&sqd#;XhDTvPOnw5%nne0iaV>LDL9KGBR%%trr6)MLRM z(%;no)IP5aNnp4|dK@Tu63;Eo#DrtWyuc1o)#;UZ-v`6a6Bv_uMmL*L# z?b7+;Sw=gT)6SvHrv%0;!<+dfc{51;kQH)_tx7)A|4aM6#E@0?{h%RB>~r-TtEGvpk*lZ)Sc;V`UYwLcX)Co$40*K9Z2FEaz>O6{r2T+xLCxbmrDr zhOeN?KsD4|mbr?gRxaE!5Z(kta$Z+J>NnO+xKaxvg%rDH+&aY zsz)qKQk!!5)3oD(D(!fIDdj{%<4hQddVSm@BX7g-{m{v8=7Ws)6Z*@dG~?T-%1Do? zlJ_#+!6z8Nc;u@}Q%|q)=x}gZgn^7udIK%p6K!} zgH13F6I2;aHdV8p$tq)o$oZCOkMzGrxoMBAhaSdb#xL~>_>AB4w(Q3w_KcAARvm6x zv8r5R4AnddY;Q6XA~pVkcFFv1rm^IELzQ;-P-XlHs?^J(%5pW!S7ur(jb;1mM0qb& zwo_RZEZt7xi6^QuG4s_;mLdn%F263mElTw#7oj%RmRs)mGSivJ@JxP9WC=s9c5X=)G;hCSuO>%y$SYx z{yKldHNI+DrRZ;#m&9*rEaMrg{%l#ZR2iRH?x)#bOL-3Mzliz%3wdPcP)YkQrv5dS zvkX^X`^#`C)e8(Sd4n|mp7zM{GkJF~oNVW&eK*+eNqw`te`UY>8SBkW_6IBN{cH}2 zGicsh_WnJ`ZN~FE!~enhdYAq3J^S-eKaaJYIquu_J@47=^~lPXR{E>yF|#_}l5c6n z3HE%@^1_st!^)_6wY(|ndarR;)b(Ct`G_^jA~a4ynYAYV5M|bzcr|Xq-6*>nQ!bl; z@jA++nz+2IS316i7>9bzT>I<#sm?~ZCEUa-@dx|`J-WV0{ZyD0qfoDHYk4(ngzc~w zn)O!d={@OY{J049{u}MT6%XM#yorx7z~8PPh7lNz6;Q8LYu;Aa4F}`9I0NVcaM7mC@i4C+0wTHXvh;Q$apjx@rIyEGUmSt+@N@hMx8Wf?hri-O^phQe=1+|ku^zUvPC`)oA~b6^21h1IYjw!v;V5T~PFQ`NkBEmhrthw(Dr#>eOhw(Eyt z7JLnhV>67yJ~$l5;!OM)SKtQRfrs%N{)!K=SaQ2vO>r=e!KpY8m*865g8T6lUd4Nu zBg7t01+0#Bu@QE|fjAl`;~ZRst8p{#!4r59f5XSG?!+$V^9AIhv2rP`{ zur@ZsjyMd*;X+)2-{3j?6(6FX9AN2qLoq9s#v0fjzs3W28n5Afe1W6F?EI5(4lc&c zxED|275oFAVQ@M-UwSNtm9ajy#%?$W<8d0U$DMct&*C+_i%&674&-&drN!)+A4_3X zY=Et?E53v+>)PArI}u{t)ww%8pf;adD258!FMhWGIWw#sC;qYJ)?Z{vG738&*+T#PGl4Q{~i za3}7^V|W_%w+K2vuA|=jukoMw6#e8xM*9b2YRrJyF%Ra)B3KeDV0EmEuVZWMhJ!F3 zr{R2DhFkF&_VyW&6`gCFBc+=a*SBHqR)m?5h@zC0L%6|pY1 z!Y()fN8ve%( z7Y@a-I1@j?FK{FNfPOjc@u$M97=#(LNayW(&hj~`$HuENc@7f<39`~#n1 zaBjOD=`lCPVsq?-{c$yZhx_m+`~~k~@;vr9&h3!^t@)bD>Y`r{8$RBV`FTOy>KXw#hLgCet{eD2Rwn7 z@DBcsLHX?VrNdlU1S?`aY>nM<2u{YixCGbXHavu9@diFby)du)-Bg$bOJG%Oh;6Y4 zzKhdwA@0E+@iIQeWcls!hGQ;_#_|}8&9M{q$5A*5KgN~#E$+q>cnR;|-xySY<%1De z7|UU8Y=#3d9;e}aT!!m$2Oh!mcoQF?r=Z=Q)R-SjVRdYb?XedQ#j!XOKfy0?Gw#Dv zcnu$*e$iz;J?ViT0tKA82Y4-Uui_yH#1D%^~F z@g!csKkyj_7iD>1ZY+WounxAs&Nu+y#>qGrm*6_wiU;uwUdIRc5>pnl+m{(%!xC5x z8{>3bh%4|L+=a*SBHqTp;`aE$FeetmvRE6NVLu#+6Y)b_gj;Ywp2Dkm5C6gN5_Ws) zU`OnOL-9SFjtg)ZevRAkAfCpnco&~xvXb`r(_v05h^0~9reoIEM%Wg+;~*S^Q*bUW z#x?jI?!_PRGX9QFF{3Vsq?-{c#jd!a2AY*W&kh08isJypJz1MQOWz znJ_Q*DQEW|ieqsGF2v=y9=GFRyn?^uQw%C^=MTf2SPUy+J#2}cuphpI({Mg6#dY{S z9>WWG3m>80Xr!N;DKR5PVhmQmSZs!I*awHO}h0b{Wl#$g{EhGTICF2v=y9=GEmJcHNp z9{z(NHSG3g#7HcPm9QSR!mc^VH11< zd*NI70Vd!o+>CqiBwoQk@EHczvfGs&b7K*#fOW71cE$ntHcrO5xCBq&MZAW;;XQne z&(XiO-M&!Fg0EpQtb}#31$M%II07f&EKI;vxEc52NxXu8;4=)4WjJNP#S)uTNafzen2>tGA)j05m(oQ!jE z34V{K@fzO87nq{H-JVRC7mHzKtdFg+8xF#FoQCsp8Lr12cm&VmO?-r&26nqrV>YaZ zt*|Q&#CV*FpX1l~1OAAY@ppWR$r{?@564^>jpZ>G<$dtxbE^~f$5A*L=iyRZk2~=g zUc@{26oVVt-LSPZLRLu`k=a2Srq*|-ST;#NF_=kO*z#`KNt_PmD0u?jZ8HrO2p z<2(31F2EJI0e9eGyo|r&Q%v?c%MEj3G?vF*cocudKk+4|XkzEfhPx(64t|3*cAuj7@Ue9;Zpn>x8o5!k5}+l z`~#n%Uo*R%$uI{N#4=bDn_xG52N&Ykco0wHRlJJ<&F%4qU>eMT*)TUoVKkP&a##gx zVSQ|Zt?&)(g1vA6zJ;UkU7U#T<7}Ld3Ahx$#IJB8ZpGbr0FU7*ynw&pP5c8N;#1TI zd+K?35T?X1%!D~G5({7qmcj~H4P&t(Hp4a;huyFb4#Z(N8pq-koP{4@0xrYVxB<7| zE2Z$s}si(HzjUG+?lus@gU-1#FJDR|Ht%SM7)N0Gw~7P(|CpckBFZV zCu?iBKU9^x`Bj;&B5Er69Sw1;D%073{(UeW=c_W@5;e7DeNFtmD#Pt0K16&LFVg=e z@n86y{+@PrzGRpcW3UFc!ag`27vLJ)k5}=rI$gdOZZD3M-~XsG9a+>cnIFW(Rhf=5 z^skQ{aR^SrkMS#2@@-MWE$blhPpafQM|_R=7V$%TiOJuv>xZh6FB5TgRq__aYLqun zGgwwT;_j-9uMhD^98do#s?`4+H{mf=#&=%LWLduvKT;*%Q{uo5b{wKg{md9i|NO)y zh|3aJSBJ{)`c%pPI`+mf_z|v9WjU=O-mS{;2Z$f5GJd}}F{}K}N|iXPD(#IRE=U|h zTnQVgGF)dILH}`TcKIC=@u#ZfTSB~scpL7f|BtE+_d6!*XvaBJX;)q~r~IytxUwpF zYY;agZbsaJxC?QA;=#o6s^puEt8pJ*P-VQos<|xdF|l7Kd%S5egDUlM5x=HN{c_j{ z<5a2FP0b_E-6bBQ%5;n+exLXQRq8Fn@9-#I#Yd{-wK|J=<##x$#936yo0GTzaS`H5 zs?=|VeQ-Q3Q}fC18&%1(N0q$C)%@~%VdC4A-y?oTtPgD0`l(f^pC2n?OYEmgz2Ry> z`F$nv2kKb)Jt*-q{EGhH67RyJstkV%|G~6f?fy}!jHkF-Sbo<=+&~>`$=luS^7h2N zaU{l5K81J&@u#?w{%eRg6K^9vKzx+=9PuUM--z!LKP7%i9Ma8hXKGcZBMWg(;sV4) zh|3XICaz1|h`5C+^PvL{qWo>*nZ$F6R}p_pe31A!@$VSa-Oig2>#EY;=4ui7T`h5c zRp$F(;xWWyiKi3KCjOLo3Go`@ZMa*N{O5_U6aP*8k~nh@yIyf@fL+yz^1EEMxMhtY zo~%kcrxVX7{*-tn@n+mc|HF8O{y!7nB>tWF3GqL~!9DHqrBWx#@3yfZmZH3}D(!4a z+?u!_PQV$sUX^^?)ROYv58|_`Oy5P~Tf~15r|xABmqnF&uMrnkOUv^Th-*_`pSUG) zJL2xdLva-SC*lY6pGUlyc)2R$*@NftcU7k6p;}g+m)YBnLse;KI^rC}d5EKlixXEO zu1?&LxT!i`jtl7Do&J4P8Q(iN1sAK*o|S5O%i2V|Tb1_gCq7Ah4Ik3~C2>F>J5Op= zh6^XoNgPRBgt&|<ED(9L+C$=_ygi)#OsKEAU=X; z=zoX!5x%5P9aF2wvrLJ9Q)NEgC4Nf$k~n05U7iJVs*YFu`fA%i#xA+Hsuz4=|O?8?B!YYhfG?Riz#8sx>WZ zCh? zuS)wmsZxIw&c!eA2fT!TW4gEO;R<7IY>eG;3@%iqovUy+9>-tsZw!)iF|D5wqp>{J zQftd`6LFj>)63@p&0`W7E=u#FbQ;S9OWwR9WZy5KqC`xE%N54ZMq? zGA?ar6xL8>zBb3cI81F~Srdq7sWSiO5-%cNM*J1=x5T^fD4xd~s^qy%{5J-Sw)-bn zbvwh{^v_3JR+V-&pnnT&NB;ph8JFNzJb^dxE(VRU$D3AdCf8Gl3#!uI7~=B8Rfrp6 zJM2z*AL60JqlhQthxDIM{5kPT;tj-`iTB`f`kzu|y}CsI-{^l=mG)clw%ITS>tYui zjq~s;JcL(OSss6=EiCIF;^22AmidxOmGVr)*@>fw3#-!3QuMD%|5~c#YlQ=Gk}COT ztF2^vB3`Y^_`W9IO1z8s2=R}^7m2SD|3UmG@e5-AckS_os**nkMq_cx%c;_y%2=QN zEmaw=J^hE_J2*v^>6xRpk?WAeYgHL;1Mzm^WB3#OFB4xUzDN9s*m}>-6R65~(h#R7 zjv&rU979}^xC(Ji;>N_yiM!w+98LLq#P1V-K>P{uV&c`r+ldbnA0s}k%6z$u*Hl?w z9;z~b{y~5FTkB=Sf>;-O;Ut`eD^*!%zac)N$~J$F_?{~J#^=Og<0O`CD2FQJD}(j1 zEB3>8@iW|k2k;jDgK1^jG;cwyjID7Hj#XuOPFLH@^8krgsM6Ne#G8n>67MHILVT9^ zI`KWVgJr!W4w+!*ORdWIvJmGaEvU#$i{=2NI9Oc>2GOi|{*D#ymqrW~3Uxy3D%&OGSp-P@I*b)ce1XYHcrFNI|3gRzS8Gaq{7UCVmhlr08 zUm(6he24hHDtS{(vCWAUR2gq=wWmC%j<};LgE zR_$$BH;MmLWjs%a{ioV-I?SX>`|=P+5f>*eLtLFWmbj5B<7tNd@LimP8}KOps>=8t zsB%rjZ<-yaRHdD1iL((G!lLxAKwOo$KJn|s?T9-P_fY%FyESl#D*KXgs*LYL`mZ4V z3b)Yz81X6MtE#mB5BmQ}|77pm}@upxF+WwHzSkihr#_U= zAL0e-pK|;{yiR=}*J+5);GY;cOUkufSQKkvOYDmia20ODpYR6$gW(_8`3qu2Y=ymW zBu>RexDkKEe=yx_J8uE3iE%g*XW%m2ia+6fO!J|g?=`H3?Qt}If*bG{{)R6x^Bkrd ztKjR{2`%aLzK{S+fvGW<8Z6(_Vj+ydYFG;!;Op2H<)hr>>4v>f4ynw27x5?`-zJvb zrcoB7QJQP~7(c`1_$6+|op=b3;W@mBH}MWWM%iS{_)`1Xro$|l1M^~jG|%&tnOK>) z7S_dX*bBeJwYU+t;6Xf!r|~?R=YGogZV>;0`VK6;pT*B(8;EH!Jr=?klvn1O;i_YM z?1%&LEu4r`@dKQTD{vKli{Ie^HI;mCg+Jk0yo}fIcf61O{xZC*tjRDG!!R>u$0Ar9 z%V8y~iFL3ocEJ8P2uI*(oQP9#0e*_h@C*D3zrpWu2kyticoNUxuWFcFC&35!82>>( z*}%143QUc;)Nt9pu@J^!Wvq^Mu_3m{jyM1Z<9IcLJii-f;)l2p6L1}Fz%95PkE)q0 z>qk6?7x6mY!e{srgJfT)!-rsI%#MXH2Fqb3tci8dJcm{CwIuF>Jy74hrT5c}#CLH# zeuy7o0xrR?)$H;;3vR`ocpQJi3wRmLb6sWl+r-aNANZ_!lVJ+XqUMz2dd!RYF$POu zMXZWVu_eBN`VKG6+Y|eud0wpae~)+;&cToIGhD0YvaI#^9d5%TcmmJiMf@G_;}d+2 zDUwP4JaT^vX22|%3-e+TERN!bbRst@= zFYtRcKhLuj_1$0^AHwr^32)$U__tb6uBTvteD-Us?+8;--+5tt7PVg;;%wXq(y zQ47m+>ai>K#9=rJ-@^$w2j}A=T#Bo39d5?0_yg|8Gk5{7;Z3}Yf1-bKyZy;96vHqx zX2(JpgJrM+*1%Y7jLonucEE1f3rFB+oQ5;eJpWhb_d?>uxD3C+&A0~-pm{E^41bRJ z4}5^ZA@=-8iFq+U#$X9F&kvS-wTT;I6Ksv`u?zOV{x}H7;Ut`e=6S<1o@K;e;0D}; z2k|JL#`E|K-oQWb0sf8uU@AEV)Ac(oX2qOX6iZ@dtd7mGHFn1CI2_-`2{;8m#ETdx#IZOL7h(dg#MQVRcjG}kispICGX3X>f5990JKjetl|4TKFeRqJjF=U3<7-$7 z%V7h29a~{L?2m(RD$c<9_zAAW)wo?PZdtqWARfhw_zT{`-|-rK=T}EY3E4dF*qJ4<3dcpW%vbd#;y1R?#J_Z34cZN{Ad~f1LDVMo+mB+ z^_)cKV_Hm)IWRXC#3EQ7Yhy!ff~~PV_E$?<)*u{#qj3h##s&B(uEPzu4-erLypHDi z)G|K5H1>FNsio!o0SjRamd5f}4QpXzY=&*I19rn+I2g@yu4TLvh^OEzoP(d@V%&h6 za1S29(|8{Lzz3Krtv$VIF%xFPJeUtlVL3F<&z5$_5;wx8*d9A#Z|skwFdir4`#295 z;tE`a+i({i#G`l$&*2rkj(6}L{)NvlM9wkwKFUx`kC`z7Be5VB!LnEpYhWxk!4}vR zd*T2bj3aRjPQqz88|UF7T#6fT6Yj)4cocucOL!IU;5~efRyun=rA71na+z;AiSu9q zjK(rp0c&AhY>92LEB3^db*UFaTmma$HGCbLV>^t)Uf2(Z;BcIR({U~?z(u$e*W!BIg4^*Z z{)p%C65hh!@gY9J;Pm$VNr~w(Gv>woSPm;;EY`=S*b+NpR~(3M;Y6H@AEJ3qyeyBE z8dsF>opA$h!tJ;l58_cgh3D`JUdKCl5C1~*{COF#UTf0v2Vp8qivk9@qy5;ZS@B$Kh0*f%EYb{2W){*Z3`N#hthx594V(kH6pz{2k5n z^JTi85x>NsjQ0Et!L*nj^I<_OhNZ9~R>fGXk4>>9_Qbw87>D6II1b;(S@;otj7xAi zuEDQyGj7GhcpT5-&v*@Q;yrwb&+sKClWT*zKBmAh%z&?90W6NCu?p6}#@GzoV@K?T z{ctFb#0fYBXX89vg3ECon)e>abZjNwiAV4Rp2tgg6U}=MWcVk<&oMBwJ%5s87@GGU zNc{rD(O3q}dk&<$7O{EHfyB*-TVW?O?>mt40mOrGG`@>daR!?AAjoi^5HH6s@f+NX zyKx_$z*Be|@8T1Dj)7U29~g$_eG1Z!oWyys5XN9xtcbO+E;hxM7>8Z3FTRN*a5PT9 zDflTa#xHOUeuJBFC+@)`cmmJj&v+egp?Tkf%!lX1fmxYf7>4G35IVnz^I#z~?}w1` zvc%>+5faxSZh$SY4R*s`I0%R0J2(!f;|I79&HE)}d@G1o;U@eZ_uv8i5l`c7yo*op zIR<89{$Lnpz?_%|3tta)EiE-Ek`=WWTg-q`V;?Xz(r{Jf!7+2vs{0_I_ zemsn)@jPBf^BxQt|DVKvpYeT;{=?7 zvvD4NhM(hV{0hIrZFme%;sv~nH}MWW#3!gP0@cs201U@Wm<#h_G#111SQ%rnJ~qeJ zXx{H3#jRq6alhMCnWmX#eN z(Y#MY`WGQCj^(ft*2Fs47@J{R?0`M7FOI?Ya5BD+^Kc<9#$~t~zrroJ9rxlvJb|b1 zCf>n6@h^OVo(OwBg<~eniFvR9Mq_C#k2NqBTVh-6f<16B4#RhF9KMgUZ~=ab%kfLx zfSd3z9>=rzGv2{__!mCIH1b`hr;7X@6tiP4H1B1R@@Qi7ein(#6W734d>xzP8`uf^ z-~b$p6LBVfh@aph`~uhDM%;ow;C?)Tr|>df!zcJ019RK+BRPg)2F!;Au>_XEI@kbP zU>od=-Eja8#_>2AXW<-NiYswFZp59q2an-Nyolz#G_oA;5Z}Y6_yU9FyJU~lONqHK zFGgcAtc2CD9yY>O*bcj5PaKGE;TU`m=c?5$YXL68rMLk%;db1O2k|JL!3%g5e?{}2 zoa&bKh&Uk99)B>V#&nn)U&A6;94lZItb+}(1-8L%*b7JE7&PzOk@ig^o{I}`5iZ4z zxCMW}{df*9;tl)_@8cu<2mR!p0$nc2F%@Q4Ys&qe7=?wfIF`mrSPfst=GYG7usim~ zAvhf4aV)-%v+yJQ7}wy}xCOW4emsn4@n^h&zu{wiivF+J^CKB%#hhr~A5>G`A5L5v z%VRaHh336NQokAT8`ud4<1n0nQ*b_hf=h8FuEP!ZJ?_ALcnHtqCHxg{;{$w*f%)wD zksQ-vdd!9q7^Bvf=k;KDtc(q@3AV=e*arvTP#lTx;&_~fGw~z*7?TBU^L8)~=EG804y$5KtdEVc zCAP&**bUA5n`C^$iQ{oBPQmH;5q^wIa5-+qt+)pd;Bov3FW_Y~?}w81JS2XGFEO-; zJ%7S58%AJ0EQlqsEY`$2*c4l0Z|sl5@ogN76LCJ8_fJW?KPO&+YjHj9!o7G3&*6Qw zg&aTPbF^aY{;4q?WSbz z7R-U>yeLxB%Z7l_QFAE z-oGZxBc6CH&cNCDF@A=ta2@W%J$M+8<5~O}@8CUrg3r;vq&{02AU4*UTR<8eHL7w`_=!>9NHgG<@-Cne^> zyjTchuqM{Q*U`L3PL_Xr;*Qt@``{oPievCSoP~4nb6kO&aV!3WXYn##!~6IMpQBaU zp6>K&dwH%DMqngHV=*j?6|oUE#Wwf`_P{iWY@COm;$r*?zrk&|3lHHjyn@&94&K9;=wIHRjt~sR>}prJK8jIT2+Lz-jK%uc zUhQsK9kB=Y!9h3_-@$P>6=&e5xENRBYTSUEa69hCAMrF^!mIcj{(}xXY7k_Vmyw;_i+|3!~|TY_Lb*tp?S}!#M_DY;z2xtr|>df z!`pZlU!bS5J)Y#43d1oI=EOW$7>i;Rtbz5g5w^fK*b%$pU>t_;;5d9AXW;_;6u-bV zXx@V=^J_Qp5j=qx@G|~}f8aBGiOJ==PhB3VFem20LKuT(u_D&Oy4V8SU}x-(!*CRi z!$~*`=ink-ir?aQxC{50_dIHtWmQqb<##=52Fq%! z%D}DEtdu>sPaAWJ+-FXkE_;}|NO*8^1BPQ ziA=xROr~FLA=9t6lId65$n>l2W%|_)GW}{tnSND{7aOZxW%||bGX1K2j`mP{%k-t)>PvT`& zme)1BiFfdcD$DOVS~}k)4nVWqWx0fFESlvnW+RTkNHps~pd9~cESmKpSl%C?u~q%;v{~C*CeUa^{oyKCE8ZO6+Xx1OuzWQh^n)N7?yl+Bd(X3Ch zy^YdXj8|p58;cWF+5V>D3^kWLM-=C&vOO-u1U0W5Z{l(_pDZt2tIBq|9yhA8y>7wn zYGL_2#C>WJS$=p-mF@T>o>66czJQli*{-kQO;xs!J9tl(?ffA=QDu90j+RH_Dzbbr zSe5lTC8kkp%JRlcs;s}+FhZ5}GZLdz**_FQ^V}d=A4_N~mQiK>tAJJ1Rt`WV*3asytd||sT$c5=s_UUD>)(1cpS*8EmG$k4D(jh*T$J@|oGR>;A8N3~R0f8JDOz4=s?_2q;r>&Y-_yRILPRaq};r4(g-Fu#khE#)#zy8QoEWx3Z6 z6=gYppvrRIq{{M5A=9kOHAfmzmS;Uxmg7KGmfv<&mfK}jmRDd}vAaC?LG5W-=J&0= zrF|OrmETRvywl}ieh(`1UuL1@nJW7uRp!6h-%A{&vCNASl$TLuTBM1lzBJ7&mjT3s zRcY%yVzVEXajhrbsD|_TDfv%oEX(Z<<@eM~d_GEfxNc{<994;9R9T+&i5si3Tn7^m zQ*+7ZJMnB)mb2M!$na*rATGvO3Q>q2oJ|&LQSk{MF z%FT9GgzZPlduV@IKPFOcwgXvD%z7^6W<8hnLT*#Q3^=tY0$%;kiCtHa(lD4cd z1%V|DQBs=M`fJ1SC-DRRT9;ys|Gj7aeg!ihKlUWPe#6Pu?SS-CdImloTeI$%nNMlvT9Wk=y?MFaLV+(tqu}?+0v{`J_n9__cPPOvh(F zX%#o~Nv_7$?V#|0$75^Ed=e9pqQ7-}yzF$3J=vYIZC1Y-fy+HJCiY*DC4Vi=60~-} z_hYm@F@d#G)=II-iYRzF#TZY)r^kc)M{EjwR57k)QLQ)oNz0h?$+G6o@z7G$wLe7!`PyiqZJA9`jl$f`s7MR+b-j}{L3 z_16Fym(yZTK^>ppF)JefWxxB?f-D(RQPZN}uV+7rHRJm5$)U5B20 zE-UK3t{&d~HU|TKlB(o%$C$fP2U0Jqf%ReB{PXf>CT=I9-F{V$l6|&L!2g?R6 z1%JvY{M*jcg5YG?is=q6uxG!)GGMa9<)l1aQR$T~uU6fYP5um*eX!-xyB7koG}b@Q z$WAyQXD9u0xugt;7_5Je43|G&o2GxBkUe!^`A_A~z(HlKz-p`XFZsGAu=+;xSJ6^d zV9i~oxOg!uu+|aNSO2Vi*8EwjgcVrln*8ZmE>jxVV5$5W6cE^@jZ8+e=eebq`BV1E zIug$}5!$Dw6nZ+!R0j?jB7Y_i@O&n14jdLKK}f(v`9H-6@?T0VlpU#jk_C>^#Ga<| zAr?4B%TnpSG;qJ4&hn4|{XaA$;5#Wut$&}8Kho%b{yMMb%12#l&2`J^ol_T_ej6PU z@L2k#)q>Ok@?Q!M1E#h-KgwW1Lo!I8u(E~a!!2V_3y<#E)3qxl1zkL$Qr}9~QkH2@ zR}*;B=>z0~x_NXu0@5|kC_xX;1UV20PFF#C1@-hattpcg-dYxAP%qE;da?@-2(O^y z>FwDkYt69W@GLSXg8F#$r$bYN!=K8k7u3(wPFA>u!Qq=_p$GN%)R(!iFF3rgEb^cM zp8nBtpcE3mPFfc9re|DrX=#dZJ#q~i=&2zevcpn_Z_}0x@{E;_$R}apYvt22Xs|~w zq76tFo?FK^#4|!h6dWF2K<0JOCmwy!Xr>I|S!E6deQG8rTZV9*u|Wx*5z_dG4B?e! z)e2hV$t*RWX9)jJnj5s(L{`Rd{rzCj5)%bv4DYDX=N_HC!5PEv>J%+AIa6i~FOXBB z2dZ8lMfjNx-LOSIEO^)rS)PAkzq6LrZL zK322*#=@8-y2+q@h;B&#-NYy$MO^jc2m$-N--)H?B<~F6|PE&VBZV+il+ec zyB-ExZwdN7N37}zx*o?IZVUR(<%&&~nzsjijhy=dg544HJ071Hjm zpzo`kd!=Ca1$}&Xg(o7|gF)ZnESu^w5i~s#^wq-zdX`Hsj|cIKFkFcKN(fk?o9bW< z6hpcHKzXoUz;fCj(7su`Eo1+wk>H6C4*Nq<*{$f={)o&8{2d`~iT#{)0eVtTLMH9s zSqB0()O*k``*}f3#nVyy1*v5j#Z=8}QAyN!f)Tj=0Em(OiuEQtxf^VO;eUbszEuX!soz56>_1v!Y1H32@&{7StsDI* z-{^;6SAqSR)rLmFUc>%}9yFMMm9q{<$L?U#u>VU2^ys$#6vQ?HWmsCb?RN3?lR6B=(93gR-#7EdGRe&yO@9TiNyvJ#LUJd{aM{+3k0cOOwAz8s2toV_UvC$bLt|ybWu=r|X{w z9kAcm{qVM#{Re^dvR{VT%CZ+5f%7q7#Qwzf0G_GKuo(6i!T}@LZ`fZ7YfFrBH~3Ug zaPXU`WZ%sdJA|NNp9$7#*bNzGAJ!&_-1zM;qSV?9YRC7T20<&I3Ux0TpXLiF?H%Ls zc;_e50l#56KJy-6w|ysQ9-pO+FR*XLGL6p>_8Qg(2;lhsFHxz`O^p|iaxA)%Nmxet z!yLG9^=a&#@4hH(WHrN{3JY1dhOlW^jp(v)Et`e*LVwS(3gbnf#J+1Ho_FX5W#C3( zf{#tRjvaOKx!>jm{=zQ80sBojro!%W)F}&}gC~W_LjZ@YFy9thczhKe?Y6>2Q-SOt za)uRt0z4_~ISdGPdc`D@&4v2$Mlma~3&D45{O~+ph7BvMTVd)OXjO0*W>vHqWnMM{ zJJtfWX2Wn5J>3Pc(A|sAqLWyIs;8@2Zy=N^`VHHK<{!lEanUn&A*RmvQxrYRMKSDq zL1WQ#Y*}KTijbq|cdX*GKf=-%J^vy)yEuFeY;e&F+!g!G@GLfXkw}>tJ{n6@^imKl zLT30?JS%$HjnA28_!10Qw2#O^rct~N{j-+LwNlS@Mjp2eixEuG@2l|y@e1k|uwkK_ zb8!{8Z-836-0qiQ?|>Z#@hY!95Zhhv@u!1F70C|6yMrt;?0Qh@?ICR1v{K$)!j^p` zbj{mG*kx1Sy{V7TwcDPK8GF<0rNF-bV8A;Gdu_hi!kZynVt)l}_GStD?Bl^vZ;o)8 z{Ry0jx1SOpviCr;yaV3{9I^Q=J?|jlDfSDn58fe;JJt3t0lbUwG#f)1-V@li%3c5q z?EMPinfB|@W$%fTLG3L2YE0LA5?L_Mo`yMlPiCEk71^}mJ%!*Bdp8*4-A#Czy^~Ws zmGBC?7Hi}^jZN#p#jRj#Ip3KO^8SQf3&ZXtAr8atBJ42iZo&@3?jh_j>|V_?yz}`#jOJL-@KPBw5-)HHA?5E6bW}SzQ!IR0L>T6)4)r@8I zo=yTi1>OtRkho4v??RGpRKzk}hW8@EZn(okQ1#-2QKkIKS>Utx(id5si+>sWcjj_A zVP`JiB5c_zf|gehcIL8I&xKaZdnJ1*5bNf>im=ySG6SDilanR(V|;QAVW0gF1>sr} zSqAzy;jeY`EIhi7U^!nBSK_^q>=2@E8b#F2qlo&RCh9e=`Yoe~`u->e->MlrjgtBU z4(`Q(l^pOSjN-lReSpPmy91-;t)UyVlz1P1K2N|eSi#}S6NDYE{F1O`3jt3OcDVAZ zQ3O1t3CNJ=zy2BOc>^=-n{Y#`~MRDuFCuRb?9IC z`o^efy*X-H`$tXdtx?l@d(^bv(bKwuA& zLFR!<8xJQe2Wj4MW+~u6kmcSY(+4FFQpvog5URw)P7uVDz|1>Q5K9TE#e%q$&{|>& zu}ZAQBvYt0CLGAFOU=76Ol66;+~jK{b+;jBj4I9{Y_5bSFx4g4sdy`#F+Qfju5`v| zqB2Bec5WqFJH^~jAu}oqya$?l*>44Gi+8#VjrbNZjCY10Zllucon!urbsFKcy>p#9 z($74n)Awo0<_m&O=fSU5W6WTtzt8Z_6v7QvO(8x=3JTO7O4Gs8l~2t8{oX?aDN{dT zSF;2Osr#w@vjvH$&n5$@7ILewX#_=J%R)1UkraPIz`ICbht5N#l{?tG)9@}fPe7#t zJ@+LhoiZ)Ot58D-9{KC_9%ep4l6zxAhWBuj`fCK^NP2je31S74n9C6YyMw8I6dWmt zM=_Z6E;o+=2Qhh{x5ng)BsI5c%?MyaiHWK+7XxvtyU6Q$b3Kp(^&sclU?zZg)z@d^ zbEP=|q{JvM6;z$5T9ntCPB(HTQ&<40@YOD z%G4YA(j| zuTyVwF;|#;W$8Axk5aly1fx6Hi=X}WHkl`aQzr&{(@Dd-Mc8(Z5{JE22EE0YunAGM z_b9U(v{^SpK_{F^hFULT12*9-0gJIl6TT`SUy(IokATO57Zbid5vo_t7r}cc4ld_@ z!-dBahn`1ohD}MExa$;vZhJYNOgw?RhXTX831d$9#u~Qe%VTC1hxqPBv9QGze2t9W zixgK9cH7jJ;we|GM_c=``GBY1L6wmHi>DDTu_Nf9xQei^BGK1j6dy>qtfC_^U=&a9 z2OO&CN%R@TGj2fl5&O-9QGX6M+*L;TIpq9=OZh@b`&xWVxQv@0L&BU1mwyV~$A)T%%HTZN- zVRz$n0*-Hp6hH6a@jQ-Lx)yyf9V6w%MmfLDP&V;2W;g6_VStIJ(+C^(?lQn<6ymYl z<~JH9e*F#7Yj4EB6VD;+wP|=Kp2tl_iG9X&z~>Y8K{h`?dHHr!Ehw4#7j~V2aVwd| zVng^$sr2?yY0^*&Ly*t0$gC}}|vWd6N?eRls$z}2q;F0)TS|0N4tm`%tYWIv0l0Y~gV&H;Sr zX24a(RIV2@gtgPomvk786N%1Y!o|DWHh$u`w2=}-oNfuH~;I3z!AYnx<^>{2UW(0(g zEkYd`A=JrcZR7)W0w|iw5&2@qQFVx-m^s2i_hGEWoT+e5=E?=|I+da<<^wYG-}^Y3 z#q5au9aYRx^Ih=ujZ%kvA618g=IcC^ufz2iRcACQZ?O&+WY*X^{22;8Zx&!mPeHB< z-Q$5sbuQ(oE{Ch5&Jq-r-vi;ESrY9BZ1a`>CEF>OSmz5NrUzKBS-(MvdV2}<>UE1L zHA5YID3CWSs*I&dp=H*a7In#`7DRyTmugCViWypOSu_BC)iMpp+tOw-+=5l)ItX@O z{TU&hHNmC(eHzMbO?2sg&qmN?6}xo5he1uO5~=1>7qF{IF7{idZid=hrP3y3Op93K zU2DALoPvU7GCRu%6hH||tyQk6F#hT_XpzL@SEte7C zO9*Xivn$6==+3RJPA8{fUe-}En5pD0#nFPel>89FF@lUU%0tl7nUf}ez>Z#l;h0oT zX*BGO@D7tggxxl;Tuc%jE3m(XC7Lvil0Uv8+m$pXRS_<<`MSeNGYA*ie8s_}g9v-= zDB(j0Pq32^s7bRag4h-P3T!H^q-D4MdLY0^FNPKStg!o*3EGBrH|$sGR7yuVU*t8j z^q@MF+E+rJN)M?*ugFcorj*X&W4F$FwdUJTGpxtqQ%dJo;E8oIW>4wjT``M`b z;ptCli|(fvl3UuU`&kCbFKv^4>~F&Ymu?~nCAd!kjVwL-hd``%rvU6EnUcbbV0I2O z1m|lG1$W9<)zSLu$hG$CVRbUE1s)C)47sRc$MSv6vQlM^K2&BmThs;w+mvb2cf{FF+nV~YcY^^L0ra!M$D(Q z%Q~06eHVlJN|V+S1d%EW)h_LIdb=JHRoZ9K=DF32T(6WM1?qk@EKLi7s2FQjniZQ< zqJ9CXEzOCUDK#d%!S4F4eXQPwB{|Vmdb0He2NEXiwlov?2FTJ=EsDBZEt(GGEU8tf zM1=NO6dbSmRuxLVCT$j~Hh96(vn{^FbBQ{UqVjd?I8Xgr~Ry7hCn1R_OwmrdwR4cUae=hHQIEe`0-!5X(>>SSY{KVIWT>O7C(QxC@q~ z^lttHv{4d_VV7EZkCgaS2SxN=LCREo0+9PGjveyVk@|wHYAexlv{r1+<6fiuLRhkh z|Mx#*=MQ02|0_43Z^M3!@T-JzqD}ZU!Ugs-gkLA@wO=Is2H_I>Rl;u)_StU{-cPv9 z{sZB+2#1Woxe(@vf0|ht0jKIQ75{XBjbKM_%C>NxhZ#Jn1v@}z-X1g1kU zd;Dp$6B45on)ovko*C+&kPUxU5K~z&u>PDNmU;(s@b?SiQt!c!_ydt~OoD$< z5RY1d1@R9FQlR2cJO3_03f1u*ASVdfUiB&H^?yZ>5@lj7{3lA+KD7~x?>|WpzltH` z^Pen8AebC5{HF-b!C*2DWVaZogA}t!{!^vaQuS4MQ2%Ly9Hu_zbWRuKaCIK1bA}+x zf*skM;Xl*71*07i%x2<-|13f3f;p_nR|ReiW&rOIc!Rnh%<_Ltnr~8;7s%OyY*z01 zK)x=>7IitK(0`5~TNQnz{~LlFrRXI6=L&LkkY3V%o*>64&lHrLFUU6K;hZlJ@ZO?D#JhWV`aQ%{K*!sTBN`{}Msk)zPpF{!0aks~{|q|1v>3 z)NjeC%T2!Nt6N)^0nAYJWs(v40Bh3h3dC3}d$T~C@wXux#6Snlirb!#*dmZ1tW`IV zr0V+Y3!u4y9k(j!0ANNX860)ft*Q$mNUbv!L-0xMEcDzWh1bM$bcEX z2uc|E8j(RW?1}(6y9&sV8NS5=@^zM+Xojc2wgt}lqSnA2@GyTyE^wm@qdjhh8L|a_ zunhct)(lVPe16P`?-OtbCMNI@*9C`bd<9M5VIoylcpu4mgxr~Bg}=t-dz8pLE4&m+ z6nKotLX>cE9w)NI3eOgl`%psU zcSK&Z!Y6RCULbe&Tj5(NAuluhdCLkvO^*JaCF5LSzJVg}3K5Sh%%4LHyh_A&g(s5- zuMsJ5h0ml&zD{JkD|`*7@CK1WSNJ`+wSZV~uPgjQ1jySgDRG4#Vw-n~Omc-Qpw)r* zh?Kg*ej@J^QLgX6^YZDSyrmFCJ}S1^P<)}0|1m+_>iabAkBcuU zK$j3Xum2VEDK?spS@>Ud8ttP4dd+F{=nNpQ3sPWAcmmPB{|y-^unnuS&A;C~12rUG z@xN_SP7TF4!2hmEYf=zQ?|`ZPgVgdW{y?SwLz5oAL@_<>|5$PkKJ_u%{6(BinPk=d zp9pe*`aP@tRVWArnV9nbU66?S-ZYeaW}XcKs?;|;KxSI!1DUDr;d~B~plmC+v>ap= zx;rq_VovuO)DcUG-PY@1=(GO07GHIzXEEQ2x()!5{smSmDmb%PWO1%J#n&wQ7fWn4 zq$j)7;$%-$txzfd;TGq&Tk)-%{v)L4Gt?_nfNT_s_NbqtPk)Ob=P153%ik)<`D!&w z+61{+-OdHuB*7#n*ZG zk8`F~O8JOdG~>wG!u


    yXh16u~U-^~Wt5CG|etazfHJ*vmp({hii_1|tRwQ}uTV zQlL&Hvcnq0I9_!J#jQt>D)kry*WWA1GR0q9@%IVRrVRSkl+e?o_>LNXT9BN2o=8Rr zK>SQ=#Jg#-R>el?pO8BG)bxMDngR*c1fJ&*xSj-FD6?{_&nQb52~wi?8z%mX1;Mcc zG{yf-L1wDM$+t@cS*TK6(<@}9ZkDCr zssiAEU*9L&795CY4ZprlcC2cG=KJ++vg6csl-VCzb1}8;sttzP|06-V)iq?%j|EAq z8VddGf()r1cys?9g6vk8!hHGf6c+4J%vt;Il15u7UIBYaCULvzy9>hVe_5~xP2Y5wasNJ<`je(lMELiDJ#G5xs!{fe zaN=3hcN|=`|21j%g6UgADSlmQ?l*lmQV`w{>|N9MV=BU%((aF@kC*iQZ^;Emf4%8ypO(Dg;B!{*32G6*X1s{z^fw*qN z{v6U56whtiPuqaMS_PK7?e9YFgL?=U80B}u<%|oS`!*XFVU>dC)2bUbH^adT2%9#4 z!!URux9pak#;OD_`W#hUHh0g#i&=*$U+|(W_$J>AXx|NH2lrEU4Z8z;2)@NimOT$D z85Aevvd@C2556OfZHC!F@kitAt$Z%-$YW<=Yl7m9?24VKtPvDvR3KL^g5rzD+xt1z z2kfWNX5<+Zw^U^JL;!zC8oV}Nk{0}kbtc+;aZm7L!o~KnoYV*@KeG8`{!^+!OsW>?TfH7!GDkjoGl<; z5B?Vez5^;4t_S}~I8uRVJ@_TT=?vC`h6L-g)Okf{Y6?;$;*mc}l zX$s?)n8EGl3$S!zB7^Owg#KzZ1vVkOP`A1W`WEbTwxoRRX|PL>kQl(z`-%D-YZQD)kUQm4X7FJ_ z?ozMN=KRcj7i)E&x*hH)_=x!_kVh1MSv2@_A?I=R5GVJz$&JI4YCk@MzmO@spcD!H zrAf26Pwl7GdQy;g)raKUGcwL6>JplRX9fAI@>@WjlThtbUpYKb@ON55OyB7w`+4cx zZTfib9ehE!P+4Zmz*I zEthXPa>>{txZnH`4crRG6oye&t3Z85sd&$%AMjy20dmd>R$CLnXo=K<3w1~%A!hJU zi@H#tN-1%R1@USrJwiNmiCPBV9b7I>&?hlmu*S)cG1LpzS@Z)s#0)lww@Rza$%B>R z$a3lnuFxt$hSW!7{c1r@R8Mm88wJ^|{y{^sR;~b_A^Y^;28$c= zi&%E&i>Phg4Vfd;OoA!UmXhhxBnQyY_$+(ntN5H{AL#-78lTUz{{ll$_B!E(_7f!kO~OlT8@{t_ zKjCHe4OoV|>x*WuIOLc)RU89Pnp%0q(GKsUMl}$7=K+aKn$&V6q50LZKDyVdsGD*S3>O}}ynNN_*)ObIT3iCQt+p7+P z9FZYcdZ)$e=OgeqVzx1d53*ay8gTJd`CqnFQU}xO5|OBO7mDm85~t4(XD*Ql=p;sZ&Lw9D(5mq=?F(%ViuXmzu*L;P_lrl3{yUo9pW(gzunPTm4+Jqkx6pgYB4T zP2R~M!~R|nPAAJw40}Zx-~mS6rp-4WOx{JJ3+y`Bipi(2PN99>B*3TlE(b~Bd*KWw z%T}t$3V#GEJNc_Z4ZeVI4{WsifXRFhqRkBN0s5rbD6d2B1?887;DhW>QBZyHWtvXRr>4+xhS2S#DaBIVy34~lhnxA4M}?(Vjq zv%Yl;%yRh;*-dCJtl-6F`Rz=-+I&ZN`5kO&*f(*;cab|0`;f_i?4H-$Qt& z-GvCL{9eMd?3=*l^7{zSvt8uG{bcw;`*M&|{s6mQX1{|c*u+;?{GpTF3nVSEbLsa@#BH(!(@EV2a0Kwzv~CzJq4k9o`Beu zm{6!eYkd{rm4r>3zsnq2McA_E5ME8#WiKGyNZ4&JA-sn0IQs~~YYBVoTEgoH+s1)k zLljaFI#Nz$24X!%Xa%=@(;ozzLrwi4!8q_dSdx;^_NpWBya`JYit#*V`mdm@p>{si zo9Kmrw7lrktol42F+!UVTkXJ`H>d4OXG=0{cbq zG&IEOUi(`iz`HomI=c}8bm%Lrv&}vm9y4?z;q7+EWWXn}euw={Sjy1Jgs-BxbP16yI7i_uzeUfp)fL{%sa-*2n=5<=qSnxrM7F!aKgXZY zwN?1+aD|Vb3gkK>-L5cyDl2pYZ=dwI!as$F2>s|}(6+}Fo;3x?Pgre_JA5-s?&P57 zxWk#T6QG69({x7%% zPe~1uTDRw)t}qV#HoA9*r#*{DGvnPx_`rwpU}n+?Prn)~VOadx>xw>J7_~Z~*A`UjkFdvn8MCjr zpRjGeI}`9vImH5d6_l;wLBiwh4 zDw{vHQ=z}rW%a{z6%OhA^Fck?Kta5{&TTC7i(Sd9{X8hPliZUyiXdI*@K4ymi*@mo8RKBkep|Y zeGIHfh2%VI?fsG1u za)LUW3=9bJ74=(0dKE!IPE^g%-ik7lVz^rk!4Os~l#=s};#0uay?E}ZOZgvBH4<3H z<4XIcF!HxYkOTP6FsKV0N!V?F0QC(lCtP4(3)%u=;Y;kxA?<-0a-ht94rB&u$<>fy zwPL9PbsVPrK7gwO4LsJg-<*!et0|?1%^UQAM#2U5QIOKW8ZEtZ*k=>rGW(mXzn*Z! zu7usxL*SW2&~l^FZEdj$T}%0P_IMv0!@;M!q*vKIRhIcVO6G*B)?fY3#oc&Utpsw zYrT>i5-rkZwKB=kRzce2lrXSK(xuy#9Pl3{8MqE52mD71(xdPO6(ewrjFVHpo&sc> zAVX>cv@LL)WIIn(FTpPbqJr#Jaw%ZDAZMsOoIi8>l4ukx!>ZJFA}YI_7ZQhfl^Q2BL}_uN*f3RXKu zjyt;5d5HQd&ovLipR{k63&@4iTgdIZm=n5KEKS7i`wC1zrM@UM%kA?)#4Ghpq1kTV zdQRhVsX5Q>n@47UOL|%6_SIm_%4<6lFJ;%beOp-b0V%uQ?dxJMj|iPN zx_uEhu*U?u+3mZ5V)=w%x43=ZC!>EY*sX5g&pDiQ`c^Kunm5Xye!_MLtZu$QIm zcDL_I((-PPQSio{a+Mjd#!W?0WwH5-7cY_tWsiB2#=7Iwe zEZ>sIa`PGrKle_N8nHgO#0e7-sTIVnYCv(MPLKjcrbp@p@u~)_T%^I|#mo}isA8kY zN#=*_j+e?Jr^ux;L#~TNb_?xp#b3mUoGM6xx(qTCIZY6++>DK!Zt`YqiBWnp7<`)< zxyteNJT@v4jGAD>-2XkrV_c%>2DgOF7j=sKi*f0TrWt8`V!qmz9WcFt$=%o z+#pDq;!kf!zAH#bj{71v3KHQ(!^lknS1Dd`irg&3%#{1Fk?+X@->44ZytSm?ta$k; z@_i|}MHRE>TV-8tRa?oq9|-aT^-suBdcMEd2S^#;9 z+#|?6ir4ca_X={a>LsF2sqRy}tRK;*RQIbBNzMaO?E%GKW{Uhwke{k6Ik`s!c~E`A zt{*k|O@xP35fTWI$4q|r;c;~y+dOU_1LP(3BhK^}Ccks>xsSi65c#F~1=hO6x!)`> z?>8e4KoRw>MHz7%dOioc;En7vYw%2sFGbr|WN&!kH=s>HRYgpkEMy*nDA{xh><^=yHTsqjh($wdL}I3`L4*{ z%txCrH18)xJ{4zdsLv?~pXsKG7nLKQo4l!9pzeglkNiWV!mH|G4Gj`z<>`BY_b(RI>QpF3FkH3ExDHAGQ zvV7GrP?5=ky=?hJdCLXcXZda?@nN}I@|xvaNzO;CT6pw#E#Di|#2M1(`<8D%m41$l z_eaY&i6hLFUOu&apRjD6V4qpOCJ-2zFWBdnZv_Ptr*>fJ7nZMw%C$hs{%QICO37Mi zaqs`7@1h>H!%2-BQ1*09+&SWF19`oJjdmG4Q?t@CpEv}@|}iFL!@4? zbCG1;|xq@dm`r>I2w`saKm-K(NN3Wh(3@kScXNk!#H(fy`9= zW!S0LnQIko<-C9DHw7t? z>rGQH5yU4){8KL#q|7+zYV=v?<}i|5=j6QPARhYj4>?IM&vEl52j@$U%~$sd#Lm!= zd%;3?Ju402ga7AS@`YK2?j)X+9|#c~^8D(&jo{26nC_9Cuu;(+Pa2-z(&d^qy`twC z#$#^#0t@hSd_K$OZC=ms2+y|ZMm^6Ho?~BzK0PlHo@?`hmq&KU^X%_K#60^b?bY^M zZoqPhb)oD|J+fO~B)ekIYixU{?20|F6J9L4ea{<&m)KW9r984jUTXgu65x>?@?rJ_ z#0eg`A#}LCzZkIWgqPV-m?V$vevh!9(ny{8a)dI*`^*|3S@<}=~4U*bWe>Sy^1e{_0$Q{r@Emro(4fu>I2SY zr66e)AvvoB*{S{viS#rIl2IpNBAzvZWK|Zc=vgaBPR)iidDh9jjDF+b`=FYpr&GS$ zI%N&at1;!*;EFlL3(3cq@pww~Q^<)ZI_~pa2z_&VrdfQEnZipb4bQ=16b$t{a^ny| zOy!>qWR@V7T6_qQ*@EzjF1tHq3G9RQj6`6rD)cq0BSu^fMP?_!F%$A<7;vP9x%UiI zm_sLJhUD-L59d4zxiUjcmQ4XVmv0_1D_F4>=)9Hqcwnnx%r`e$1NdylP0RV#NqE&7 z3JTq=5s2@VXlu>|Zm_nwx1cpY%3O}pg@$)s{4D@TAX5-M9bhIy!sCXh2& zJ7Cc(Fw){OJX(W##u64xIm$5Z#A7hdm3y9?bM-$RH0B+LvRahMJaYWw7G5rlaWF|U zqlPns8{6`n93&^dg5EVJ2T9ZqNTZOvizL5ER2X{#8Cwj2)QtTK8M_v!p3sSGI{;Mk z`6P$WW2f}hJ`62Wx&}3kB~$UiDSZu(hh;&}Xgi8_>KS?U$`nvkFfnrleHX|w?-;u> z-`td+*BzYKPcVdDnL9|^BxvT`G#B)4qI~DErd-fdiOQ_+;jFJFDnffNm+^k0u0?2j z9|xHZ1BZ3X8s`17ZVP&o5UmGFpcB>w-7@8wARnU`=Cd(0kSSk+RwJu;5+46|t9TRV z422k=Lb%bLcnm}w3u~vLyD#!n?qKJ8FWa1-@)w-)6Bt4-EOS0;_@mN^!FlVfn9gmFX^DNMEOcpHP08?uI7|Y;v zy7!l;x#GY4@|0H4Y_1U#bhn#~Fq@6qM@P9^Sn4<4GSMb^U3}FMRH}(DyF8*?z%1=Je7B&YWNMvy;4=a>qW9`R5N`+5KJ5 zzAJJcU-8gG$t(7swd#QnAHDLS;wP{5R;6aWH~Z!@a%=Y8blbL<_Ix(bvhm2vdLNyC z@^sQ9u1l(QA*cy5PIdZHzzR={o2j-|p34^lO)+P)6lDWEN1^)Yx^wUlq9 zTYcuC2%?UWSFkiDArIkMH0yFpL2hb{`k)dBYOMJqdJNBZLvYF=ZU5)mURHriph;W% zELJdZwy4Z9wv-Qcj0()*HeL?P6h54$>;KZLG+M*o-V4`|5NiH^&_q+SW=aI@j-zl> zUH-M*@Jyw^SaT{IWjM~-l-&PY?VG{Ui7&AaimK+=y895}O?-KzDdcpLdEi7<BRXoZpDk5T{zCB^M@sc8} z^df`3j4wtn;4c3VFY=o+CbPPCoRlNNlp)8laH8LsF&WBbnvIHeN~WOBTr{6FT`HI2 z>z@;g#$m*9ELP5lXv-0OqfnSmKTuN2QlJ58OKPQUa8xPUmIc}KaOvccuE52Ss*tzg zZe-G-VTuF|JMA!4j#=TfB#J>Q9d-!;5x3@@AX8?73n4^VQ^_7Z`DwvX6{>_2=<>i} zLS?||BLf=7j8Vg(>dX-oSAob{^7vr)n3*0j2Pm1s(unjqYuqs75Xj9jmrvG0F=O&1 zv(&Sq?9y6Uz&WVq2#XbjgIzcVo%glVOi0*#j5z;nT*tG@E~teiu0}0KeAsBgC={g& zM-SGh#tgS;q-qGfJT#2HSz&9@Q9||NamIYbK9}T2rid&ZMHL1(%t0X&tcv#r=S75l zE*nAldl$HotXVS&ig)Cw@np%C57P?PjiGdf!x#>NZfZu23AA=}yMLKu-KdrzuYMFg zKpQYIL$h?{NJ$8e3tySG0$Y>bsPu!z;Zcibpaxm9X7r;*r5~;xekcN= zAFdmID2-t(`EMEiH;rcg;YPx3{KagRjWQ7V2M2%(8~G<+VdKA5a2Y!buFhBSppT8y z3dU4ASbAyZpOyIk--n??$1wbpuP}BPmSC9B)%hxVn9!JEYEj8D=8t&>lgSzKPYM3l zLleR>vVeaU3b=`X+VQ`xL#R_1@DFz$|4z5=ePh0N(`aMY5&VzY@K3XVZTzFV&i&w& zs|j`M0{+Q&J$A?$P ze&pX0e74|!)7Zp6$Krp>I7xV-iAPAP|FIu7a~s$YU7aTcLwkm&s*9ZZ@}~r!;6MK` zBEu;B!;lqE`G;)5Q+y8p(``16v}t3T3j7at^N()RmTxc>0H=W-IYGUg&HTd|xQ+DV zCyfynb}Uks9|3a+U7a68O7f#f391kO+YX4r$G;rR8IuEzmdO>s*Xv^biQ@mUTy4e^ z`A4p5GINg`W5}dLp!>XFfJvlxltAk_Z{i=4G9u8$;5mC&zVJp7%CQ>NHf&kEVFfAU1=>4k>LkizX~ zLPGL|0Eho^nwsnR32V0IE6{$hb8r#5LufPp*FCKs9!8g|yv{0U!{@KM?_k zOSb{F@IOh*|D)LOA1BU#J^IhT{Uv+(kKOVg2j;(se2#qlZ}wM+eWPXY2N*2#9}_1S z_{ArLW|*8|&Y3e8|FzY$tZHbBwj^Rbxx|hTP3+w>ceb>y5>`lYRdS9c6cA|HFA@Q}JPzIP7Z2JJA3C zGll$3Wjhl8FZ+t6lXKHOv0P^=)B7J%F?tG1<}Y0oo7*|qlWccdV}vl*FNyf>T7qyHy$$d|RPBa3S0 z;)Sfqc;a7vg$;R8ymBVlnVi#2LxE{@#`=45(cG?dB8z9(dqlIj4*aSU5ZI9RST-3S zE`^?UWCn&&bTF9ABzh8AHua#eCz)kKXmxk2Cz{Oc>;ndaLJW%-O=qJ}*JLi08F}87 zP9g`zT3Cc=id`Yc#09~R$7MJNJSoKYlqqVX9$|l%-O=9P*@uBrh21eekN~twDe#mp3C%%H0Yl z<4?nZ2@JGTGS@utpaVA^bXI6v$W=VH=vRh0-F3p8g;VA&pYOI@pITdyr1<(tYmT2= z6u?#cnn&dVa-9SQ%_#wQk~OQx!Ue=h3B|%h(DV2FGkv-b;LD3 zGIi=vX#0f85$`*BO>NKea8uaTnRAuRaRtUUz7w}~OK@Xj6f2${&-q5C&ogjt=b7V~ zKX18f*Vb9Cl1Ts2)3$}Grmmj4Yl>x#YVpN*GlG{sz$gTJb_ zrMV{B+Ex>7T)%RIL9-C0a7NQ`b;e)}P-jo9D{HhTVpzKRrkZ45m$5q5v$DT0Zme3r zDN+|%IA`gc1rd6sd5fx-MrKk~W7)((kz;CFn&u|x$vP4p;=0;1vA%eBBmn-G2lmD3=(T-MavIuDidt{eOPmRUMhVAsd+uBXUGnU;omjk=dPn zsoC1`0Pcmch;=1q<4rtWx$Yz8;ZY|j&SB8mP!0Y?>&}i?E;brZVd}FxGqK*p>~sp; zNn}tdo9yZX{qgQt#-Kh3YnoTrtc$K{Zrl*9sjq2nYiKc6w?*Tzv@r+HmNQLH1D&Ls!%Qs_v!H?T&!d!9mQ!3PB{BIlG#{)uA3IssFlTOPGpj)4r3JzU6jicZRj&{ z-3U`UqBNKW%wFwE(kKSUSjU(L%ih+o3e?lCB(rf{lcpk;$VL-=@yxDt&S203jv4id zp4hH+&8_QV*<4$)H_@7l^`?!w{%kJQo5(cQ8|%{9#*UsuU8*0%Vqy(_vG$(C+LaJ1 zLkP(XMLUz7DI;&5gqPrKUtglf$n8j`qf6#h&!0a$a^CR6o+B6GJ>XOn zjK}+>vPKpy!Fxy*zlD^DrCaf4b1pY3z{6l>*|<0rQA4muYoTMJg;jZJi?$ur++egO za!|z$^-Y^&nbomAa6V(Sw+ywkwl>x$vxt7c8pppFA_9GoYy&PT6YGlZG&c2hB%pJ# zT%x13HfBN)O_-gss_R$2u`uMn6PlL3K38HI!+C``KP_EDdu(3D3k6nT*VI zFb3b77wh)A?)n6617v_A+2NR`tk!#nh~89YS92$3^Ces@l*n;-wAIpJbjqW1Wd8u zj9KYbQIpnOB8W_a%K&ldXpg}J=Q6v*nq;&-(co`gl}W=wK>j)JK?LB=WDS~~jOI@o zDhghTD$!i(QO7DC#6E=~5UTXS%Nwn5-Lan5Tt;gYm?$o!w;yo^r8AnrB8v;vhNL~= zSd{i1SYp`EVb3YX4lW+CFkNU?MAEU8Mzp0Zx~_5k+Gu@4TSHx2w9SAU8Gy(&W_H38 z8_=wT<_apd*1=MU`A+vOTp|;O&}S$m@$P7y4$Wjck8AV@7ci?JEcC&;|TwV_$P?6Ww-gjTGTmYiNBTDeZL# zbabVaJ^fjvD!LGY(z|rSK^uu7=!Jv}$YP|U`RIezJq?G1_R*|XZHR4rM@K4^LG}1R zRO=z%RKu8wn?YygHS;0=DXd&iqAM0h_;ms_Cwe@>JkXy`M|LVmL73RT-YwG&A}^_}7u32pjDyx3qv)aPWzp)Om_v-Rhe4>l@Z-B70GldI;uY zc{4d`4(f8VXE1Pq6t#C{(sabMa@p?K4jAlw6bO?58HQzGID_`wqH2FY8)49%)Hke* zZmwx*tf^hszz9Y{oOZ|Nwj_E}xx^OqiMTd*LKJTdg1;FZT69Z5+SlLHGf&$Da1oZl z0Nui-Y!5cOJ4M=Q{o84!vZ5^my|grNG!PXXbVsq{=!L`?@$_JClwVmLHUW-mjKvX& zh|!aNqS_jWVaNv%(Iy1P0a z?Hq)sai+kqSEpkf^UX;Puc@}>9Y#Y-b3S0o#s<(E0#U3_t{Z!Y_SIWN{5w*EeFzJp z5KPTs$cw|`f77h?E^WtQ!ZQrg+8gOUp?x*5#jX8W8Wv+^tS6hO>FI@zL?Kth;x6k; z^FzleK~7>IzxhNQJ;n^y#B(km0<^=Y|m90>Nr7aU!iWBOWYkUYxG0^Y7O*+sVvS0FY}n=WTf<9$&iT(nj>^Fp$Q z32h?{k>M{YVYwN{$z~Co%$)$EB0OY*FbhFAsT+#*bPaE6^j07LCDQuxZJwy`*E2p>f zFzW*h@x^FmPcU{s28m}GUx|s`5YNH94@Y`pWtwWX=C@QvyY{8pC>k~FD3+`3@2nxA zA`QX`$1ueZwP6L2AP39gTESTw?Ys@%(pcZNTCaBlHx7+<3s+IJ+w+ZeUmui$dJtHw`Kn_g6g(vh_kc zJ0R&$*wnrYaW}*)?*?Foa@wcnjYoYeTsMWSH`|4sJa%XX1AjQ4dU%0#;8;&o5)k!C z_+;!?a_w=6U!1_Ddr%@|Fa)Na8*8MB29P$SoNVe##^Gz~bkM`-mwH3Vz#rNOu@5>> z8%R2V+Ca*vX=<+D1m5A@oOne{O9C#5G3I*_`$fuV74M!Gl2X{XGU-SbzrZz zHQcTvF(WD_Ymx3lT&!b9rU=B-!3SX5!0jWt)SfaQ|HbeO`I#PuKNwV}UfQ#R*euH) zj9iqRKwn}|Y=_a-S~rg$^Z8NDj|Kc#$d5(*IFuiY4Q#~`;~}0*LmSb(5v|2`+A*cD zGDx3dAEQlrert~HRaaLc0~vszISC`Yg?ZREOAH0I?Z_ZOkxgRP+MgLfgvJ}#R7OT{ z#y|>*4+se6(}8VFYXg!L^))R=4I45MNh-{!eHr|e*e7~W8c(P(_CQ!MrSfZuViN|Rc5ftP@fp)$9 zZ_KVj=-t(p+SDhJ9EG&8wS{S&{8mKfLBi8yELU56lBA%bIvEJ@8_;$^l#8o8kc7?a z@8}?Za-CxLbd6E@*nBpYOcH}6rX`&jlyp`Oxg9xGGRUn){9;OLQ?$7iW^u@g=bRl* ztIkgiq}q??jylgm3Zv|P^ADW(Z8(NPOiptpcBXq!jJYJa@>}5?Xp;0&JNL6>Pn032 zPLe@$kTD}XyM^OTZ6Ha&afetPW8Z_!ALQ+$?dN;aU=V& z7{VTIsqzO)dTBtZrW3lP6BJRd9%J9;ktn%~d52D>OPPq_=Y09Bmd^$9xlleA$>*W+ zx!8aJMsr9nV$YfvExj+p*;O2_h*>87E>5?OK%-k5o7$qan^s1RRhUdY4&S-ZP@1fh z6wrnU30hf$;iVgjZt9C?b7=E#nGK!CaH0{oS-t6N-vJ-r3A=-20k(#B#`TvR=;xBCP{bg;ZeE}o8e@8C9@drD{DmKloUJ^)5Y!NVBL3?c^aO2Kgb z>kf~qssq2gllt(dBJ1SN5_aYIz5bC zKQgok)ObqLOh+()GehK7GMOZ#7OoWuDei5A$8Z7EnBGybw&cvxvY*Wl0(*ymgvnf3 z%?=~h)#Vu3d=SL_p&?1_$e42#^qoVvEgsr{!J)m?2`r%*@jXtokebs9fbFvoC8?+3 ztbllzkuwOLW@VxYQJ+Y)bLtb9qy^=8&i~roleuJh{!C>~+-PcTcFvUkn;bv4N=U)L zkvm>|%ZAmhO<5%U8Qr&H#&RLW$B_ksGDLn7*?SiA8x%(AOs!w!6gJ@3lehwpvlb6)Ek<5xq9g^%g z?Std>5kGe9!qEY)5l{iNH=<>O62O$ex*?N<5+wX^tjV+loM>hUp`XO_KxDx-v>%V{ zL_SV;u$*{X$pm3|X9L`UeQ$G1W7BBIOA$bnm`M#Kdzna!jy=AjIwO53)aY1~`KI2T zI>gtZF;0nO8^>2H|2J#byrsTYQjf6mWRbYY5hvIQUm>Y8>bO=n2I}0>!qdlh&}@Te za%h6FnG|wtQcW{M$PQ%Eh7|(|_snR?<({y*8{{XA=!UvB+?Q%?YiV4+%D|S5w6w}; z6qaw)X_Q`TZW@!K8ZcWtO9s0U5@{<$KIQWza7^e*(sMB!FGEJ0Bo`9YxPoCIy@V_S z4v?5%qKY#$Bs=7+5${RDmNzxlwMe=dpUB_Vaa)Rnj3jgOUPz9QMx>CmV-u`>8X{_B zkDLgsu{R@e5+YkCC`)5ZouSkFA{tD1x%JqSZE0%Chja`)Ab8LLZDOHFat_3mmnaPN z+lDsmK!#MG+3FPp{~5sOs12MF+5NX83M2;PSceW$A5)Ay5Rt7QPxV)=+fa)r@BF1*f&~Z`-<|8M|?A8)Q==@voDyOv$OZ(Y$#BcH<)p*oW3>B=<+%$iPu+fs#YLlFnXo+w|C$QjO#b`Qta;{Vso7S;u zZI}d!)wsvz=_j+9jSZvhAcH;8AUWWR%I=bf3m^dTuH(+-G+ZAxXtS}J8Sov=Bd7d4 zZA4g@>BO!>&sM}#n`+7)l_VeEBfXaB>tj6Mqmxlu4kdgO=c$=M&wy`0VlRV-lKR!h zZn(bD%WH~MemPr$vC+A;Y&M?u-N5zyx1%GmBHU$bO8_UCN^`@RKTbiyM7E&Xqhgu0Y_tuD^w#cbVU$3o%a%Yq zIEfwJ!ZfxuMY*r&?1Y`cys>LWBna*@JIB8gbZOmc#+C+0GkW(((;Dwa0u;McadV>9 zutXe;$p#rqQqIm@9Z58e*#?c;g6G$&L9Wm_VM{AdxQFBSt@-hJ(*s*{$G{+0nnu

    XEs+CwUSe< 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±=??GwM_wpFxGU_YGBEn&)#Sn&i9VLOc>wMobQj{7${LU! zLIQ?HFYGBKWS&LO74}j$LD4X_BcP^4;rVJj#c^X{;RUj>5N|2ef-D!^9kUzeFI*uc zVEB2M!j(covRl9KLM1PqU>7{9-JuF^RO5!!tG87$TIMdSAq#J=ljooV3va2DR}%rb zwN4)QtQFoSBy4V-339s-*L;T2RCtGwn7IS)TX?6CTzR-#c$bg_H=7pTEjVc|Vfk&M zOtI|QFT6)O_%8Dke67&)^lgS4;0o`Rl7{uK4Fd^tQ30BB%d_9 zN?d(T|& zfV`ym9@ww$Pn|$sQ8Uoj;ktJ&1as#$uJh@l`~}^*c_p$Evsoj@ znNtuB3O|;p;F#+(K|YlfY&+Wlg$h4YloQEE01OoVTO9_8&X{5qek+5}+X-FxofL7b zjI$BN3cpuhBUiff82)Az<>K(IMNt zfuSK`cZXd*x7`6F!J3QAFKxGUJXo33_Z4!o(J7Jgi|tl1tz6g%+fAjwS_}Ktc0We= zFKi=Hez)DC{$On-?N8f%>J+dFo7eV#+3x3b)OI$vgklHf?QoXD_EHWzD0ksxVFxLP zJ(I056%|(6yynB6$usDm9VKm*&mF@4>?G_WpF2AMRwe9Wr^cD!N7O2Prjssz7d4{{kt;3*gWx)X?x1bMGy5_dj36YAD#z zd;y_h^?Xp0w6cR9h!6Az_ z2?@#Wj-soCgk_6c(bYm++0aq6SxC$(*#?>E4y#EJvZWzf5GPmGpJXFL+`&?xvbjFx z<@)R)L6m@k{BBsfvy+)V!5{vwFUimHr8{rqZ%$wI-eUi&e8*akK*;jTm9W)xI-W=S z|H)CTG-pNsn_Q1Mn!m2?e~af!HFtFT-zILQIgR??AuiM7uz>TwN1W2! zo$CL9&neny{(7BXHZoVp)u~^umfOiyvHuXuwwJ47|6$?|a<%V2LR_iuryRLL?x-Ig z2P{{}ope702EXhF>#Y00N&RvqT&2^PU#@<;=v^3`e!2SXs;41@_@cV`IH4!$)+g#Pp+=qF<-#}9On`TtX zyU-nAc4IjD+sX?b1I?P|AQeK!n|G2R)lz1bc^gs2UnAr!Q_EiIA>?fH7R}sC$ZRv9 zAxLi_b4;UJkiJ6BF})E4{QZQ?HN1)A?=NJYc^19sA0TADiQ+24KTvkzEbzV!8X8?U zkg+@K7Id%UFSPkNM3dJDSzF4Wx6F^23j8HPl=&9k<}Vduo6Jcdt%PtJHpOMkh~pX1 z67Tz@V=4Rceuk}@ohO%T8RKA(W=qwrJioRU_{9hTL?;hnVziQ(DV$24388kfvLzq< zjBbbKSw)W{SvA|FvM_@rvtf8EIma+>Dh+uNcMxw>v+GqQ(+8u^t>izenLZa5v6F+~ zTRyAkez=cncB`7qTo0gn)QBagN}eBKuJ16-_>xPokU@=OS-jbHwVrv;!zjfo444g7 za%6kvy$gSR$x~4+wn|2spMc_U#nM+cx*ae~;d?`RHO zz^D??4G|=Z3yDMed*&}%hCE^Y=c&NWh+X|$F>o=<#`K@e(}K8({uyJWxFvD6KC1(8 zDRGV-(H6KBajwpX(TmH7<9b;e;1qFF%|(83IdPtLs85@#ffIUT0dQO5e67%}#TCQ_ zdQ=5)JLWIcrL3zxaZ=w42Pp19T%_k_19v2DrrTihDegqvT>rv0b|x;?rLc2x6>$rF zVGVE>;+FaZ;$?9+;u5_8!?3uTxK#VtmKxfjT)&P^E$+ed75Xr7PvUmEeL8S2_CJqs{}^rPcZ+_SZn3=O^MQ&)$r|SUhUa7?|>K1N2dg zP6nN=*TYIJq!pGv(hazVxs}e(2ku_Wl6n(lwh#>+J#r?nXz16g;UO)0F@Kt6$GU>_ zc?wx`eu6c0i~jrtY~2s@T#JFsW9iE}0uS=!e+H|z7))&IXJMHZLx_F4f_ONwqr27u zk6^3)dM-Sz#W-Tr#oy9yaYj@8%{ep#{?Ia;zgDe3!SHFB%d(cXalU1oSm{gq0E@@k z`fCi`mg2EK>E)KTad=7>{dvp;*i2 zYpG9DM4x2IDE|7jZitJ#lF`)J(h*EFC1ZIScZc{}^rHY}E#&>hhXz)~kmWRfd^-2# zDm*iAO3t|C3>5tpPFFICooVUv_P~=_-q90?rx0WRGE7@Cl^A=II{{B44(m1jfoHH; zu3m(ul+2_$jrIHRhLSUhBRa)AvzRBU_fgJS#4$aW_-v}sL=Wf;Jcl?(Khzxf9OjAZ zC;~~zT;ir$mjTZs&eN~K1xn@Br zav{%G>dDl3)!opcqh5qTS#r^%z@7Bx)Zt>{&bk%PuO_b24QQV=%-=)jxr_m(yDo?Omt0QVLvN@BUVkm}_tXo6z#FLB zKz+eb;EgZg{LpwV-Q-H1?`y}q^aI(%!u{;{F}6}jf4rgwS1Y;dT@)E$$73W{lgzN= z&*X#LM6%kB-$k;OvOf1w-m(sCX@`LCD8rvKNoi~c@q*;fb9 z_RnjfbIwEzl!m39I!r)NoIV(#qBEOj=@_h7T1Bk%cQ9gU7h+os?9+2GC`)Bl zcJzJl<5HQG{o2VWi5VSTgoCh zT|)a{eb61alvwHI=;X3i#I_E#0hZOCPrua(I7Qn!`bZvdIXBD)^zmBY*4rQ^tk?>82V+h^2^g>*_KMym9XrA zaICV9U7>T%28`}lS?A7^pmPo7%gPTQFQT5Z@>BW>^k!LChLC`MxIJ(;>VWU;d_&__ z{|PzvDy&z^s)s>Ly2BGW{34-FJ-nNO+ZSMNdxVu+dNq_v?IKqCc|@($Zem;Kw*-Ea z*r$t-G4&WR-pA?*{5Y{+KR*-r31Tdq{>TS;at!3>bVf8EmwKk}WXNxZ!IXNAc`SV` z7DB1#iIx5a110qjX0i2G7zC*ocz(Fv2q#UwNIXI}EC=38JW{Vlv`@W6JW8K{v!o=7 zkJjBQfhCBK(L)gpQxe0+df|z)j|}@E_<;~+eET`-_Z3zF(^EhH4v~5wRu-uflxyja zS^@t`th58iOZ~>ci2E{VPwID`$5&`E5K?~-H_)1P{F4|v9X0S@#6dHEJg}umLgxMn zAWBGvnTxef$`;blL=byZJ|UTACY(N%CM0a87K3OdZf3@G2MGv?nJV~As(}(mGkYjH zT}a&IHwFocfTreF^mZyFB+txc&ooqQOTwH_k|`u<_(`5rSV*z?mZXu8Qgcr&h*5O1 zax>ZnafMWx6(t~zg;bl%NFqY|8i(B&6*AO>Nn%3AngSZOiKtU+9&kajg-kF}jFnW5 zkcn1CK^Ux`nuKnP`~@2%QxSVII!j)>Ni`8{nI0IGscf6pam+^;kf|IY0dtU*<_Za! zrxBV`MK*gOY*y2V&F%RR=6X{Rq4)-GAR^DI|L}~*v0O{Fumd<1xe*?tQl<7iAg1L= zB$SCvMBN4L!OHFR%r>PrHtD1~JMG}VCPt^~A{R%Nc`XUj)$!Dgvtzmm37Gv2K&mAh zZeb@tYJ_B%8)?_>LK>QH3qg7a$uvzd8Kim&37dO3xOxd`WYVckZy{Oc4lLYKeS{dZ z3oFr7U#ZkJ{PE~iKOwQ`@R8%JRDV%A*IdMo86YXe=A}%Kfex?IO3lY~=s_Z_%*;pc zqy|e$x!FwD7$PZc%pG*wp+ef4%Mp}QBZO3#p_m#{rwM6iYN^iYLfV^MEOUmC4rW6O zkXj*?rY%KJ5Yo}`YpyQKQ%|l z0MkT)%oj4yq_+lHAY_nvmd?FU$Y67rqjiyxA*LbXe`>Lip=LA#%n~8POpKj%u8`qo zIp);Vc|t~*11z&t$Vhzd5Z%-ZZ5M~eGnO|vmX|rZpjpVWpRyofhT$|D9NV!1lRh z(nwt{Wope0RObq@>SXgXqxyR1C2>j zkP{f3AX_Bc@9scWdV>&4xjX4vHwweMb{n95>Ly`$*RDSev{hKBZlz57NN?aXtsMGn zu5fI8V@UepKRm<7v383y3^f#WhhwPJt4@tt&<0Ojf~n7( zOXfq|jV+P#Z-;LeSY{4~zz-tZF|&{_^@peyFrU&j{}j80jHU{fpA8M0Fr7jPam{d! zZ(B&rOq&Mc^Lw+`JDkcKKaCMLC)kZzQkt4|IF$-WN}hS6A4mfs3A2;)XP%IJQ_BYB zi|C~Jk;Ai4Qi{#nth7i{O3e`l$>x$$Zst^jv=GwT@TIs^iI6s?CCytZq^%j=3#3d) zh4~=}k`mI+tc!q@3u$kXRHwC&4kir-OSKVFX%=DDNVOHx(Y%Wrys36VI+>b@Ank>8 zHmevQDuq;;b`;Q2NEdT14c}QvSJOEMq)JFPGlzqzi269I zfz*f%dYV2I-CYFqHNzN3dJ5@hJ{knlOGtlnJq_Pm1Pm~JInxZ5l!4|?F5QOv=@diF z7B*p&pZ5btnp4<>F@CzvSksyvJWj}X(;I;&b*f~mHJ=RtIZeo9^KBE5GlWbx2iZRp zgv>H?Y2Haf=9mpM{1hSc&F@%Ar>2T-i_IiD#SH%ysC21$hw)&h|0<~eronUb=~ z{77}q60*izKz}=1$U3u&^Y9!Iz25L4bZV}UO=cwPnJ3w*Ydr zm~K>Og&2OPxszS8Qpf|wqOC8KY!8}=wCE}!51BobcCnC$O`-y1wU9^5Z=5;Th=5(D z2M5L_lCs-8Qv|YB$fIUYHprzy9y259u$M`h$IYoEmkW8qw54BP;pe(=k6BGc*9+Ne zt|ZwYWWSkD>ueNq&ZL6KRg-1Z5uhoruwa`Wh^ z4@+8+a>sN5dqmQjDYpyLc1c=u`_T;pM=ib1y zulx@pga!QWi}c;E{k+pZ)bAdmxBT1BOXXR9_boc?H-279&hxun7ze-e^ZCX;zZ+&4 z`oZ5DIS=^VrM!gu(a-xR2mS7O3`9Tqc_+e6b1!ZQ_KT!drnyHL|9ph?5i~Q zBl=lf*tcnJCTG`HX`E`0r@8wquv8kKq5PQU4rSMCgqgYFP|RyRpo6m(x@|5XcH9CUlLz8aCaBR<-C0QHe?UTmh#?&eQponvxsx`Q5*Oi%1`J!F^J0N66fn}tXEzoEs#e>Gksbgls%8Ho;KHacLF}Y6V8|GxA}KDwI_w*99 zc;I-XY~iO9EM19_QhpOVASN%amT%>TkX&s#;QTGbO?98{z_$}8v>pk32XTS+vF1C8 zlX^ZPQTbiO&GeT(;CpDfV%>vQyqB+rm+Gq$!1wdT)^dHER@uoGROmfy{R719^mG^a zLE`rMI(Sg|Zpy@irOv>Q@_Z+KE4;Y;apKPU2>QAF3F0cvwQ2cN#9j1*h+^eW6L;04 z+1_V}yJ;?F%bz2z)*Ug5%H&G_~6)JRNg@4os0MNFkj_^dEeAqq}*xr%!F(XS*+Z5(Ou>F!j>raN(`Oy0%7MWmv=nd!Sat~wPDeoaWP?szBO}4L>>I_|0DK|=) zz10A)t;+qP8Q4gv;Wp(qcEH98yIr}zVCa{R6LyDkZyg49s<(Glxe?m_G&K+owjFvh z=jrO1`Dlyn@>XK`3@NuJ!(D;#Up`aVB^ho`HQ1TL)@Hbw^qj@QF3oU@8-Ohlwl2f{ zif!;VxL=;(K21H>NZR@g_i^-9`K7`(WVqe1h%bLp@h9{)Ww^5tC(8E<+nV7HU=440 z`)V`XTj*^cse$OI9U1P|?BBy;rM($$kN#lzxS)+$FT-t+33gQM`9X&JHhc3EsSn>z zlJCgS6(lD9*T2Sl{ezBhQjWTE^awdy_gv>BoZ;p6O0&04DqU9wcR{ddVc*r~<#0Up zKRn%GAk1jg2nzqG1Xp9i0cNJsCAA2L%Ou{bM{%OnR~WDA0*B7u>f18lqa?il@5b5 zsOJOBu11`P@-LqP^p60qxmvx0QKVjw#8%yy@kI~cfbLRz0}M8vzAwr7)ZOr8wNJ2B zes%`P;efjNZ>dK-sn-`H;b?$%@@hDCQVpL7ZoN4VdA^q4hPL>-Ep5jmoG5v}GZB~6V1c(|FsLEib=__m#*-RO3GIHb0UW^$m?bB` zbnU4r|6vBS)RvJ;@qBY<-Koka0MxJ!FXE7oi!#W(^1MjdI;8%dow=iL-Ra#k%<9a_0p^DB&pGZ${kQ1o~ zF@)77!B*8e3{Q0v^6~TPfLlI8_AcTuTNT@ujiK7*bUL87r@u3K^bBxsTmLa~X_L3J zep9qsjThv1)|y%fY>NjP|idUjV17V|?s|cfo4T z;kX{-JJJX7dqZu_L|Cpa+1_wQjo4_ck9yl1CU?gaWwGo2ScYvGsAEGQt%n-!+u-0Z z%(ub9VW{s1HMEC)egMUBa8L{f%C>s0L~-Qsi$(BEokog7v_v$YRkeX(V1=Y&qJ+I} zLSirJ_myHVHPma(Mba8S!d17G3=tPgd#r9V*_gix2WB1V%CB43k!C2?8%C&0>OJ#s z$n7i0w*DjyW-W(BMS~5ZL4OqXdTgUucpA(tN8B>XjU>9MPX|4J@BcD3+k zsL<=N&BBL+du_Z<+PI8dJnwoRJ#Q;`A1r~buh9+cf*;ffcEJy7IJ@8nHLR`+FnX6D z*6?2#|6$AJ7?f*qY9B;YUJamz^}U5zI&R0`uW{Dux0+dRmGBQ_Z6V$A*b3+f$ z6hauQT_j}R?oA)$GMMiWKA2oW_ni(y_iXT9GDX}a>GlSzm&`49JA2>(_6Da$#@cr0 zENV5nM%sI?!}dB0mpeDHx9;MEiCej%4ZZr2YvDt8Ef7rZ|kja3@HNr>~iom-&0 zG&b$~VSrX8Euh8?sLyhe1#B!f5$dw>=Y}h3++p?-x+@(TrumLhc9Ney%YPK0wzPpu zd#0HzcMl_w;hAQN#Ig?Hy~H$Ay}&ozYw8TYGO3^H>!X}L&y;G$Qla*Y zy8P$jzuGbu6?O=r?-wJnV+`P0=IVE}5~;uZt=&Y)oOxlrb|*x;-N@=W@2{fGF>>k1 z--P>NG|zc|7tWtn^|b#(I6BT#-%4XNQDeHw+@@r*?}N0u zW!W0o)Y)Kdf+4G3=478ICLJg$?^#u^azY~gdKB#XNiK2~N~FDy{AlUl{55bd5_{>^ zAkJABWb#k7RQJIKG8gd$zrmcHtihbBtihbQtihbdtV+&mY9s;%jLP{cg3S1$CS{>6 zD}n#2O#NCftHu8H&(AUIV0 zoPfqjw!x~xf3;=OMfDw4l*TD-2wLm;STpJQIppGF&4qIdi05O)!XE(le5{3V1_znB zTZ&ix9UNNKxtup)l}TPTbRaG9|M=8Hlc3j~KB^diXQ?fZLve4A-X$^oO;qW{*n1?# z{zWc6wO!_sd|XFxmh>230`UCYb+!M`IwF@J6h=;`({yGRK~k#yPf{T;|xbCH-{pUT@LKW~cG8j>GDOaiDYRMw!!f8rw53jqA<} zkeePqKW!UozZGl{ukmt0Ft1o@aatVubm)XeeTKviWdOet6aZvkebFHTP)U#uFaTf( z3wG=cb~+gMAz8a*RvjU;>M(nem}8-YDjSvI<}|MhnQoLonBHe5ZeU9xP;M&5)yl7%;<(adNhOGaLLna!G|)!ov_ zw&2p+%(OMVsJmy8Sq#`_HDI%vU?U(75FjLPz{$&wf!KWP5Fi8y@B#q>ZwL^RnAZe< z&vWY3?R#4?`1^hN{`l^1?mV|{)va60sZ-~iI(0j;*F}t_agXE$lEk3KvF{El2>i21U^t&ivE2xR_*NO)pxE$dZtk}xi2W*{QC?VRuudCpfnIpGLJ|AZobbE)?aMfAJ zcJ~K`mf+)xK;+)nBmXNui(8i=a?dw#5jn8;2LQS>j{HK>j`DK^kq`PM>y}w#=POFioD3o#mND}+hDCS#$cpnofWKk*&EtswsEo*~Ag~RJX7Di`a%S-N&qVac zHMq>m#GlaMD%&}ql6j8%DX$UL=F?K~;|xo)*zlh){Pi*9X2Tz6_@##t{yRy38nmKo zgcxjigyBanL;OQh%~v9PJzEN$Y9*50E5CFnnu;y-RYXdg{TLVfT?%Qn|ARYw*=meJ zsM08JZmGU=3Pkf>(^rU1Y#+vTxC@iXe=otHe)|P zJjuCDOqMwyPPN1Yo)j%{wb}Q^gLu`KS0c&`NKbwF)vl+$vXUame!SB*=GRt|4=*zO z7#rv7Ql_^feCIm4>w8OCjLehPL4h!aFWwG5$dw z-*E+G>c}_c`kK#OgzJA?NtNMNKKIdGewe>NbB(C0-;%UXMf;7@E;NB^&EkwawzBpr z^aBk)qlmnchM;Hif~Fz4ps9!#X&R3v`A~+|A+Zb{!+mryb7cRJZ$$oU<=?p+?{Ycb z?{bt2=Ew`lald=8o$LQ>=lX1y>*FggK>JHM|H0)d7c8e-FjrpKT-}51Tz@XP9(XTu z1Vx+ske#Kcb*tF5N>A&=V7CSuzD(_;mm*?GGmE!U^c_%g%07ZjgmY!UvlzdG|M)#} z#4nG6V{pn@MW#mc#Hwq>Jh6z|*>{}sL8}FJK4~z~C~!dIpUlYt7IG%uu4>Vl_*g%STa(%0^+WNIl_h(89M4hw7*_A=R)scsNzCDM9A!W z-vxMIMPB`UdG+mgyH{7`)#ssXSI;w5OgqX)-t!W?4-eaVF4=k>vZL&{#C`>_mVepsFBum8Wy6=FlsnGH7>V4n zio?fRmF@LG@~!JoLm}!nuM(a$f(L|W9l^zZ7b`rgjyuA$7=>f^Z}B`2PTP@te~4BR zspT$aK{@7s@Pd-fS9w8M=ihlj>E~=r(<2mWt{LXjD$!UYj2a4dQ;Ok1sUvdlHLt;= zlvXaoqaweI@`4i0&AgzD^9o!Xx(gRiL*jlj%qOil6SnBcN39s9y?FRz|Mt**51#({x2@Y+ z+x9Qp-+g=Q`tSVtUmf|@OMknNK5)%Fm52J?^_feffA#RKH+=lx*M9$@;k)1Y^#g^^ zu9&&}^0V()^S77o*?d9I?<(8I&pK^SCfi(7`tX{Y7kd7$PrmSuZH?Ew?WZ4q`~Ks46tAY2g z+qC!kcYkwY^0W8e^zXHv*ffp$_2E}svn_+4&R5#w|{TX8pJ&d0>;{#B45Rn zefT#Zy`ChuB;5G^{a65aoJ->DSo_UjipS>0Gj76U^D0hg?3ci|iFvF2#cOj@U_F5| zUcWhV`T&126shFjyOG;Eexd|jc4p*h>(5#nU4Oy)gXf$XIRn(*wb4Y^U$yobYe!MC z=vK3K?KOx8Dd{B!_i`jz<&vy8E3$Si0}-Uh_Br?P9!x^3b{Xb^<*c;`tsyYH_9>A| z&tvj+%O(CaedTgSu78TT6ujj0NM!UZra5CX((J(FXI>(SH=GrTu3x(xZ(Ppkv-FL4 zmTx>e5X3b66a-mP#v-^;o@Hs}*>eK1c=p_Ln6n>yUOOvT``bye>hEVGmEPo+NPN5Z7wN5HygrM6W_0Ezj}+*84q8)%oRzp-g+6DchhMYr2c)$=Mvms z#rv1~Rgmnqwp?8{=Kv-P+2M6Nwgx^OvfbW1kdm)l;I{^=R;n-n|| z0TPSE^ah``PxiHMF*6V&=h>b9-L>tP4CqUQLUw7s64>1n={xJp$c7cyo%_bP(9M<0 zP2X8vAXYRmE|BNm0ljloFmGFkXGk0p?epVMxlo4qflF5pW_wM$S`6Y>pk3@H)Zsb= zm8cjSYsa!A@t3_Qf??Gs#G82ei?Db9+`Hq5NZJU@XMvaDK7J0o>E@gKo1iay>xjKYvKf$^$i=Lo-K5sxlG58U19SNaMz{l$n~9h-;WC^| zkUqhyD{KT|w;#c)JvM>>DP5o76<>g?@ZUd}QJ1+}vSu`|-N7qIf-IqX;8`C|+N0qX;aDdkU9wxZ-rdKgYeF*Y1V9cD3ZS zdycpPC(24-)+e{}R!NX1^lF0i310Qv2*Ndf1h1~ciN++jEYqQPZb1y2lgJdorbSTh zs-m!lC)7Wx#@}*y6MUoy6FlUy6H+Ay6K7>y6MUty6FlZx*4oN z9szO};)`*vHg$~Q6@8mF`9qJayLkrd6zjR^AMllefMOSf$=kN=ySqb^|@uPaCmN6 z;JGIpRQlYiz;mkt&#iK=pBG3=EN7_jF>FpcAQbTHu}|Efg9^2K0`Pc z=Q7iL=dC9tU}i4G3ezynxlMi=JY;B6M28YK;v>^t_c4HqB`D*r|D+2Ea4^7KW#4hc!K-y3rYT8wSw5tMX z{eENqET}L^mp}rHaR*bhIhIS-zT?snnKc@ka0bqkhtzu9?ZS{JGDSzP&<=%LgnMzG z{5-3KAxUrv!sF29zz@>;37&B9F^7nm!hbnfH4-q%jCdnX6ozoK-X>a7PLYh?fD-Gh^jV(-}hYXHcaunp(QEn!G9Tn{h_W!IuL5+FtUZN9-m3 z%MpBt-K>;xFD~DT6P@>cz>n-D{`&`4j}S{B@u7xX)QXSlm;0`BJ0$8YeT#f6Q{xL7{k?kkp=F>JGb;4^TpfPk^;@$-FV z6imakTO>`(%$rRoc+Iw6VV)ylUb6}-jE%>o9Gmc;aS`FE9k=}AG8J>|!qY?!pDyG~ z+>SG#xVJO(xp(`P-+a8qYDLYeYyA3Q_P{MUT$T9}ckrGqs-Lq<*4Z-cr2ZS3i*0e~ z&g&5bX%P5QbTWadahFiU8Kx545Elj%vj>;Gn&5z_;=2(-1i?KSrUed3G!wxk2oK#2 zk|0C41g9kjUU9@>OcUHYGxE+oHiF=?3=`0pBuL}Ge^_oV(>ODWm_vkJa+xBq1}E3s zww#cVxIMJXL3Eem^GEK9gVK$z<9V@&W&)P7uwcho*$i}lrw%Qw^qVRbRL?U0+ zWp;+*m*F0YN?`xmqVkGN3=sql)|2Z%X&`D=KYoH2mPABE;}dehpqiVe3mQ{+%+x3bPpEjZCx;r{uzmDo*r2VF4#I zd=c=)_BPAG#Ym(eoa&W)QgY)(3uiD3iC`vtQUbV^g9Uj3PPxeoz7;&iydjAYQ1M7eA83DZ+oa`@G=OpbG*!N7Cb34py6Qh5kZHlcRmF-M;SLN~C*Tq_3^W zy$g?g5+^H8{GwdbUg?PRJED*7EAz2(Y+B8+`+TC5)QmZAI7R#k73=*;2;C1X?wGY_^YYei(A21Rd9KZhm0-yg#5du_7gy+e}DY6^TN(3?~VrX{-1 z&!&B^oel3jThjHOAQo{3vf(Y8P5TkvV=~r&$oRk`e}mwsHJV5gX9bDhk?Z~wMB51A znSrApWKXyrXPDMG3K_%q0_0#gj+6I@e5%W|TaNMTG#((wdi=i-C!Zl+A=iB;h*#-- zqRp$_e9VW>@;Tz!I8oTk05*$W$)eZZ#()3Vh%2NdJRfJcT1<5=P7n{lB?!+lEDNZP z;1Yyq5RwA8F~KEh&mg!dVmw&Gx(%9QBd+l&atO$)uHASxpkpFuy7O_ew!|z>6cPXB zU^IsVqltX+DhLV4sQ+?NU7w3Pt0|=0TL{U~`5==8sOLHac`L|u+xOZX&wE2SWj^4A z%_oH`|2Q32Xm$ce;K|Ky6C4O82sgV;kPapYH@i)c2_^_PJBb!`!T$%*5}ABd2l4~AhGjsy6Sz*{OyfKpxX(-1o({RZ z!{Z(cetZ7^sa=1JM(r~1h6$i6^4R**u+1sLTH%cJ^z6W2HkKY9%zEikZmv~2>VmQH z!FX&(vv_nzp;oEXsym8}@UNurms3u$(M>pW(tMvxkhDs zwN@={FXi&(?E~K4?ft!dyN>PLzF4mA>^~BUK2ok0=H`o~Bb8iXwp=a!zt5<7yopc8 zKACzoYX!d^TE~2|{v;p%Lye+!`ftdI&0A|0OaBi`m8+L`)aP=o=~|=mBuf!&j6HpO zcjb0WFV2p4%}ITEgu|Ufm`ryY97tcPfsHn?{2gfJ;_K)HC@JCT=DKKi^RL& zh+e*lZ1{*qHuSn&DwX#1_V@L*qY9N`JFrwKYc|bR&MQ}^S!S0h%))1rrg9Rjl~^4Ch08W3X7rW#=3DT4J_TU{U;- zg?g?KzwTP!s)xrK6dCisNh&Ngy|qkcqc_IPsKixqSAR(Ziz z)X#3BR&JKYeNw{x^yIjg)?wtOMs7%sBm4DQa{DGWcrn+?Aq3hl)EXtPP}zwPBuzI? zJS9hnK1_}-K|C68Bqu{WhC(GUdS=C#Zsl7Q ziT~tkJFi~Fe_Qx(+tYUa(In9`dakkA9N{C9!@C1H^!Dy}P4bWDvaaWkrs;|XD)O}z zk*l}w=)d*Cr#n;QIq;h3On3BxeWCPk>xx{8l3yBq!>!%XpP3%u z;pi{$D;#e@_y-8T=GIp9*9hN-@DCAw6~Y_3qkj_V2^Ho&>muEF@8)e=dUxVg_|!m~ z>i&FX!zVhzw=w*; z(Oo@VD*}1HVO6C2;vJi}hYItnb&;MUn~*+o9UqGR(=xVWGI>iyrFcYBIn#0 zU3*v8vOpPMe_ABEIVS~Yg{Z1lyqz9srC z^P%Yb&{s1((f6Z|g0%6~)A6>eFWOv+Zu-Wi{^;6P^yl@S=<84K26ji^h}!(P-n}>a zr>F0`aYz4Cubuz!)i>_H=<17hTr`gtbwzLd2H{rz8{xmFgI=b))&wg0% zMPK^dp6KtQ`=a@M(XBnvW)J8ndJdYW=k}{Z?fuy^Bi*~BYrCWKVH*AMnUQm)`D4{q zvb^B+4|}_Y&EZyVZgP6MS!$WNT(jjh3%P2wR5Z%lz3I8!jF~Pkd5v7FWH2SSW{X~9 zzFNgJVaA6iy#9f4lW!GjB_x@yRZXr*K_h>hGkv*eyw)s~prSWh#P8h?L)7qw=Bov7 zuxcjrSZnq5HJ0jCGn^Wo z^bTeQ)81(MfH!n-!lbgX0;al>frx?1LiQ?2vHHD%VY$~djU}&swAD0YWymAhTz;-( z8jwD`I(6v6{ z4uZ|-f&CD)(ygUzxl(EjQO@yNCI`ta*T_{&emqw|trCzjCab1egKXu^OhYJZnbC>S zWGox=(y{EIiDgH}r^?l0ZPBEM5;^{l_#!F{1qh2N(!y88-3T76^O2wv$$K(}~ zRUP@E;FbASX~|HeG?`Xzri82wnyTt$A*>puBFU|iLpo4TdTH_~tIwBB%vX#zksQr< z5bM0YK5uF;Wt6(SWAml?l9{hV8Yp?KrDCaBFzMJ-uG|7yC2I5478exI~@Hu9&2tn8qD*CMMl}p}S zscO*pUOevQAq36WO)Qy=x$AMr=;Z=xn6PA*7@G95Bi`X`Y|I;*oH8T8LxU5^$+S0U z@)!rx)A{4Giw5etmn#+Q%A(jK_ReoY#gmRqQek! zbs1!DNW`(Ri5Q1;Wd_xgaoy~XqjO9FgBAqen1)DinZe*vD-{F3Y;zJj0AwtHjiFYP z$?-$EhI`K#`fbh=j+ZPq3>s2~pQXB3%3A=ds5Ok|&7=4BV31qZ;^kVc1`G<&ExrU!?;)UcNx9K+Z?H0T|QjU5~`+92R^lhehDu+Q;w^&ogDq-&B*YAP8Ysx^}1 zW};ZnrAm!*t;oC^Mi^o1Xt~}1-4!?}QdthROvc1z0E`ZUJ}^pCQ{LEk){Dm`lAJJ5 zS}^Ap3f}D7Z6=z9WNi^cr_unGwZMJN;Pia6gceb5oGIT@0@DFk@-l;oEC)bv^c}zu-+TVwzL#C!=l} zthZz`Ldgd}$aoQYtG-yw%eYPtdD$CMgBbaXCc+DRiA&=?_cfo zuLk_9UFPOmxrzpD`nRt1ulD#?drf|^!a@{DG9d4me-$_R>{5Kbc^n$z^mMskN((Ko z&6~)U+(VNlGheTxNn`o4v=nBpRvANqydUBK=QV@DaTG!ZX0Jkyor~7O=<(2!32@S^ zD^kB-*M7gQ_==;}zu&KGzhBq>U4HCt|H`jyzhBw@y)vpYu!NL!l87ItFk!Mw$aL8jS%>K<; zlZqu{sVrofsqt}{^W%fAa6A1f?)0k&>aBtXlH^6NmdcjcO zB}QTs6N6(mVTnA$v&I=aO*C^0nDoGwWNL&c15pI5r_`9v6)?mof#fJ?Qatf6M;((yAs4akT>T6nUyQk^<4Q zN{#wr#ncnZ=qcgOG-~s8C*GD9J(yvSne^eoL*u5A#WgA(BNWHs1*2{OjclajcL@7U4zns*SG3J|b0&k~Y!#@CBNngOc>`P^mc=ZS8b6pt z+0rp+qm%+szPVBzLxtK~qrjmCj*0PSBwn)4uL$U5Xgl)~%6<_lI{Zpx^WE!8x3h@;X zuIS4(h!K!^m_xl-mHzjncPWO+WCR(~Ob%hrwR~u_af}KZ$I0GtlbMqCAvqtUyg51H z`6Mf{69m+S0@o5iShLct9@)RW;V1R*dj(~bAAA>sqyYWbBr~dvWahx_hiF_t%ZmmA z?E!s~&&{`Lb2V5DrZEDY`C$%Mxud?Sn98DIA+DiaK;BI-$eE^)LmuxYV{?XVkyC^( z!w7({{)j1}0gg5UrNNh2slAErOfk-y3yjrJv1#$0i#Tr7#DLPo!;+cH_E4^z)!?x1D=I&MI*su}~B#{CP8BRqdU7VCsm+zG=qK_*ItE!?SeH)9DXdxY$}+ ztAE&79VaoN!qjB7L@kN0#vqv$(Z|5Lkk47ERAoaj8x_(htJLOO9hNpXHq`3J<`^l@ z%nEm(HOD9g1k4UrX9jXBIg%MS zZszl5&I4?!j8$b#U&&w>3|!876QB+RAKd8Qy*;(6`GKIN@^!U>qFo>1R-``*i*zzhDmG6D>tDT!WLos zki3g+>49B{;2lR4hAoJw4wgoP2;?fVP_bYII!2UIF$mc>JGnRJK|N%TwYr$mAcW23 zjzcb9g2jUdQDFz3kRj;*B&!7ka~+T{WsOfJVa5hy7L~inWNrfNvM3f40oFbM4WlFL(w$^ ztu+v%&{JAA&`tU<#A-`9F*RQes?-nb0EU)t174`*Z|-ClF)9O%(t^w%mT4XYMYU~y zVOxtR4)9ELYRuGVGCQKi?-qI(B}>Y@fRc-$K|0Wr84sk^7P5KA z=cZ_FnB)mMw6VZ0(*WmM$^(=OmvVD6Fw#OdfmDl?@shRUQ=ajyT0^n1+M*6{i~<;c zF$+_VW8>igK1~xa2pUtp5Co}yi(Zi&-3`|4W?C8WWd!VpDUPDO)BM<|SrVgtl zx5HLdZilT+pdGfBfp*y12ijq4C1{7Ot)LyY7K3)!+6~&_z1EpQWnpX9rV6r9&S6Lv zi^n+{r=iBMW5paUY!5~#L_mPBrgh(b3qxPSP24)|NczcXj9JPvmL56&#P*iw9B!4U zJd{-x9nhnp#gZAy>E*DhG@(k;{87qP zxQLzgUttHy3eLXdK5JSm(gQ#DTBLqFPo~5&=|LsZ~j6@~Ua>qs{D6 zZl=(=v~Uuc$RwRlWs-q5kcCO;xCKaq6l3sOnTO~5WHBK>S{*60#1KqPV>IE+#jQe} zydByC*!i$kA4Jq)H;LG7DcP2Oq(1>Odb$qX)G}{VC>$NijpwZCG$v9aIv>V!Sbjv{ zfXYSro(q1wjDx+FYqXP77UFFyfaUX4h(e0w7^WgSCBw*XTV863<%{}kgUhr58nkMl zH6XEL(Whct!~D;6AHEM}9nKPVwN$tX6#+X#%D7ZP0m&dxx8-e)D;kfvT;|OIuc*Polt( zW;2lTTi{9%9Jr($G8oB%p~++?Q(g*o%*lgTs7}i|sg-+WC0E$Ca6h4Q*p$RdJlY(F zU2Y~@J6NTXD`YGN2Plar8;U$}O601$9fs*83U*cwmqu@uDs^k611FJJiW0-+Nm$w- zb}n%Nh@y>h7uaL02^CUut(B!QQ_S24xFAa-&RnfJ)9p`8pk*_f$dVznH90C&9%NP+ zkJ3wnOIVtNrZ}Urv0d)Wvv=9A$@vPbc;)JNZb|4(WD*L!qWOw)VKr^#s1y|CbyQ2h z(y`=RsumzG!8j70B;b<((Mo8Wi`in)gRvbHHocQNw9a?sW`ksdrVh8STKhu+E8f?@ ztOAS1%q&!C&kDC(&*7}<)fz=qIkZSjyJ!vW-r}n^!*$yws{l2c3+OX0nseHaQZ`}I z*TKlk_{lUSoDrJEn8^IrBS3Uu5o*B{;Ik3)CY~rFWndKX>{7H{X?D|8;V5QX>kI(} zR>o)67Ao5~&ZhO%43(Gj2{fJp_VEJ9z69ZBPD1rXwTwgbhM%QX@3~3{ZqYbq z4V+jWqROFlhOtxy)`1RzRl~l(s$pMX)vzzHYS4sJ*P1!)ci^376A@Rxk|p@QK(0{6B};=a^)zZr<%)su+g!wE5C|P` zXr}qaO7I{f0~M9>Cshl}acFT6#~Kk(gmuB^Lc~1ggV~4jWD^ZPk2#vkn2ZBEz1X?E z1_>0@r}Dk1&m1CUS>daDbPX>E(Lj}k??O6;++e*fPxniOWRyCYE=yg5$`mKSw$>h` zTH&1uiaO+-&d5i_28%4M#v^p zD8h*@O`Am-1J8On74tK8t%=!+eHaT~$1SZxH&I#=rU$DB{dr`?0X2i1W1S)Vs(wwU6eL5<6bHQJ*}FVhu;(|jo8#;#WHk4tbZUt z{BFACQn5(SvM`&RucxyaJJrvz|43sEr|Qu@=#B4(en5tXRs7`Gpa(&A0cx?`M#m*c{jC!%rq0EHH zX5_f4Q|DC~L{AQlSn1K^J(^po_%l(l1{W;xw-iEvNpZv*>mR|;Et_HMJ(jU{1rUGJ z%#~(xh2vPXHuB=p$!rRHq-gqrZ=A@txTN0>Xl@Q-F_^h%9kAt+H@W#X>o2&(V8e6^ zF>xdPNzDwzi`RlCypxx*#rA_5HJcDVn^uk{KNiWwT68`i1>G+!8?(d8nE)W;g0ZRCDy&UB=foYy`W9rxwO}~AKV8DR!sb_46c3YuH^gy6 zCnBa2O9KVSWEpl6=dt7KVyS8!)fe6)%aR64IK7<4sG-$hza;N$IulNao;*tg+Ow%rb9%2UCz7@Sv30Uz#&%-=qx9%Qr@*jDXD2#5Q0`Cenb#z z8q;G?ozvj6oFr3a-=3VuiXq2rOogyOxJ5Aa|LKt0 z@rZQ?aTZk?RjjL}En0FsMtTm)s6&ZF(6Av@qKapoo~XA3)L<(lLspb6e6(}h`4!8& zZma~SZ7;nx(1=euIr`umxcG2I)>LesE)> z6Z_R$3C24tJ~sk7W**$72q`AiQ1MVGtn5N35urL)gq;v3Gt4^T5zZw6X~eo+p2*oX zSCeQQC$r`h+8q0?jK%QA68$yAi3O4qBzO*!W?O3k zo%samd*RaUO$rdt?(Frz;khbLrz$RF(|wO(c!&3U%j)oT6?SA;*Ja`P^pOm)2>9Oi>g^+*lS|RTliL9Uos_uuh#pYYbPgOn#zN zDsm>K00esnZ2e-P9h#!zFS-hrG%9s2<5xhqLsOikj~jZF)uGN&k+tS;w=n5p1Pi!qK6L^+PucFWQKH3brta-vAMtE`&Pu(iJKb zYJ$pY?}ufP4vSe1hrKaRwD@?R*oqMoY!w$3=h( zI!AFyUOWq|qPS4T{EJm+Z>RdDScK#LXcgneN@^6$MN)&1Og{)LUqH&oENQBX6#uQN z3PvFe&ZEu>4OUzU0$Z-I;s+VcG9EjgRIU}<1U)TO{3%016Z4C#dHK8sp2ySJa6SiL z`OX(oYduiQsE8*{8ys}-4TrgfqYgd>W~|<%>}Q==f)=%j!R*vzdOry%9fJmbFo6wp zgOGut`_e&Qj3Qx)Lu!0XMn88?Ta?H7%>ZUOG%LGj(ke5Lr$Q0Y4WCsz9m^4OYWDC9wL28b= zOwC<%w7<}5Wp^Zrv#pp5AvK<)Tthm^Hp(+I5KhP{nph#ACNC3JW2u0z#b8?`m;R=( z)e$bL7@6?_3khc`6m@a3(845uwN{z`D1E^u-b6>tf$bGx08mdN*$zn7KCoxp@QVjB zX6dYr9Zhzp4PPSOF8hbzI!^C$wt-!-6W;B&YJ1fBx2W{H#ul{=JXxke>;98Re$|0J z>I{@W%GDv-=O~3A7Ad9$sUTH`WTsn$ockP@C>q9AuRTorvIZ}NU<0=nD_GbR6jg>H zq2=kn8c^Nylm*+{V07{xho=vvLu|TGS#`F6O>6To42jk&>pxgrni07lKDi_SyDx(K zL+reOUN3`z)9V;A3fhc2--OHRgal7S`>7iGWmC+dwFfS>@IQ0ziQ}Ua^v>zH(`QDC z4UXG9c3IE^83Kx%p20zAz29p*A>VW?u^%=quRWJ?7`Sx~Yy_rShLVb`oabsJJS(w; zU&q|#lZ-f4gclKm8zx6aheznb-QEyJTaR^cvnqgHkXE;VAxM{GxVnR@Y0!$&u1zNg zyA7^1x3tARSzi^&1)TtU4~iwLH6pILjZa5DsU zbFeb7`CvB#BvN>RgVtm-ooF>8Hb_@lFBF+~Wp%Q1$yJH<&u|^|z+*tPxj}jS1k8WqOet_s7 z_)UOpEH^1F)uEE3D7v4o$RX5b@tAh3YCt<4D{93>ZaETuDRnREmx63BOL-})<9k9> z%eaPHt3!U^M01J-Y-??R!w9PdQx=wz64*c~gxi2wP$k=Jnra7>bMilft4ZmL|LT_SgEz$1}|&( zZVQK9$*1CvjqpuWb#fZUkCYR;Fv<1935oOF5a-dM=5ef5_?v5JG%$nQ{|SeLQ*4|P zC5oF(MHP}=QMwt|`m(D@Ky)N{Aven4;TafHv2o2ZFESD`d{7%`mriANoe!(&SVlHj z5<~K091InsGL@ux4g1X9_G%Q{49e$;CL6LMXzH?dMS~dTC?R{_D@*vW+x2R>S3P7# zr;$w_iBI*zf7#hSE%jjDosp%2`h1@ieMe`?V|l+F=?E$tRGoa2hKLO%hR+!gwX`I> zsVa-PM#=SU(AaAieD?Mi?CL7`CihiU`OzS_aoFws@EyUPwmHsoty^;4;sH#{~O zr;`*_V~jU`Q2-pu+7Rmik$8mQ0*p*ua4ky%(LNv=r6sI-X# z9Yp5?`(;KDQ-+8)pcqsN(v3{h>``pj7jhiuClNr6T>GDx9EEB%J_+aj$uxSg0EG{f z1HWBae6?hh~SHW2Z^-c{#r__RR zj30ooPKxrP21*zONm zn}!W6N`*|ta6h5T5tauy(9mooQq9;Aix{BADuV?bdS7C!z#)p_6OBJeO{suCm4_q+XZ4WFrS#zA|7 zE9oW!Yd?qM`JBi7;Fxj^1SdFBa>j+jSx^Lk=$e%M4HWmIlQh$zqCDrduQo zG)Oy>rD=GvepfoxL*jr)22Wo)SL~GCkIG>}#v--dnbhPI_K{G#AJi=)EEIPJwT+;5 z^I*Usl6xt!)wKYolg$jlr^a7jyz@WSA(9`8;#Va!g@JGCevei#D3UArKIUMtpa|V3U-a zvr|~?Q|?4rMG1`bEt}ENEoNe5daY`g!#S>=OYdK&PN*dosTr^ zJ0EG-cRtdv?|h_T-}y+xzVnfWeQ$XU?*;pVW}}r>ZxpQU97uS3uI%55j|(WLwJI?f zxN86o9r33ib1>E^TX+Gwds?^M&O&$sFN+tdqw*CJ_{0=)Q1shNxvnQNT>cCRYF;0F z66(%3JUFgpHJ4PHiDQz_HL!ccx~j#+w#|h^sM_F!@gb@QR?f@7Z$Q{UJ&*Me8B{~? zt(t@p2D@NkftKCg!k(>~>l6){cHk+y0NHF50-$=5>x`9M@~yUG3v;FlW{!P?v$tT5 zfooENj*+cKZO$=wJ5ym~!pTJZIvuAQ58i7D(ez<=b;#E5*=^*yc$$NK7~R2nP=q#p zlgX=r7^)H)AO673*e=W<4`G`2W(;bu_xI7 zvH{oP@-s3TMN??b!W8Sanb`Gpd1{xp3wtWX3;>Q=!>@?L_#1C`6XpovgBaNGI)iY` z#qtU^S;LjTSetPJIGvFNGPEruVEOh2m$0y%rWIK3z#b!yeSvR=P=kj;4JrhOl##v1 zP=BYbBR^TiUNX%1lT{eN*z1t}XHI3fr-_4Bbdlg;se@1n3p7mFWXvhiS?IJTe&fwC zHk<2ZsgqPl29N#hiWCb3imDmebS2c7PnW0+tIwTPbL`exyK-Y~eI4JiC|JqC!-g(Y zh%+C|6csMJP*0SNCC%D&ixME%tu?~rW@c0tcJl@LUSbx zvk?pJo_76t>rLjq#bNa}ln?zi431AWeH>P*hG)IZQsRk)$tLiLG|F#6b22^4Cxj@Z zW`jbiKj$ua2djl<3(B2*jY7>oRAw=GI0FGKX??Jy!NsSFS5d^VwNRHNnGb0cPyxX1 ztW+^Jj*{@!PfNTjx!$M+% ze1h$vV_Y$C90&~FZr9*yHT_LBBFl~57>U@xAOn%CHPI;Su~U?94YW+k8k#+~2q`{V zLB9}u?V`xlCoj%bGy9z<(c5A1qRq#077rWBiV&=pBYUH~1g4o$+e%>Xjm(`Lkb#(r?tJvTddE7$K5Zoo0R-fCcA<) zR1D3{<0~Q683^09Le|4oxVSUJaZ8GRVqr9kZ-2B`-SXC*+|Fs_@|1ZwHIm?zFAjNq zSe``Fq|+JfPytDC7$^nvTR_-Z36_&yQU`;edJK0h`3e@+4_i(v4-5)?whcHxue8y=fhGjAIrxV4XcIOZn(OMk3x5U|CM{Myz-gd+bf0o{MGpU z88r3nm7NH;X7LTDC%!+^-@SdZ*}WZ~-M)IJI=^>s_x9;(ZM$9J!L>S3Z^y(Ahk&bl zaf_1_m89*kz=*Phdz@&3VYt+{wu=t6T{T=JVsD`Qm|J1vjFHjc+gR8)3idCy9xT)0 zV{A}H^^0gRd=U+{F>5O1vOYu-p-F3EhZGFgW_)W0pJkzKMXh+T0yjQki^-rJG;k^@ zic^X#QRG2IaPBZp2U1E&!=6AfBQY|HUDWn_W}r@NeNsKo+OkB6q7Fp^KE?p6@6}mu=6&nj6Jh5 z$x*e&fe}4&BISfpQL-y-??vqSnS!`!w z7o#N`e9oQvE3IR!AH-_dft)9mtQTZ!?FU5$V!C8}SWILv*yDR2=p+n$Z1R^c^Z0Y7 zl@hQw1~R62PL0vlHWZ_&4aJx5v|8aiA4iER_*6)hUuA1En<`eLu-!~NgRvAW>p+&F za*u9SKgcIrl1E?xp)4qJ7mSa>{_$Q)ZCT911^SlJwH9s%!&Gr%;Jh$Ii_;=Zf!2Zw z12w%(odRr~Z8fkH7hjLGLr{0O#ocDZQjwEa z(|r{|IxMhzhO?jVVN8!$jsi^C{g?nT=vAqpY(HMNyC*{*j*-t5h@c{szybx>3qK_h z^u!S>c8ebLFpqXx55=-zTCoPj%snxD_g;sjSR4HmgaM9F$xj0}0gJ+TT%g8Q` zfsyASRs?npb9V`Suv%Pdsf#|@((mtE9*;4KXe)8U>rr(rx8TjD6(Y}w>Xfy-W(XV^ zo*vd5hk@zLabgn~y`{ALIZ!uUkwB4!_ve&}yS5ml68yBQgl z40LB*?D)_|zy=^P!3V(R=(4-05dwB{eC|I@ppYMX(5Gomi2d$c3o`JBXoEgB{O<_7_3$9X2v` zY*sA*W-J&Hr6(uzH$(Dpy{IAkkvhlq+Zs2G6e3+p`;q_qU;9xRls1cEMQW9&4XeE- z3=L78pDmvXhnrBg#peTB09cM_%<6{Tv0FT!wQK9Dz^IAB|E{xB^H30vrgkpVl^XsA zg*rDh&}~pmyzV0!;8%5gD;cRtaO@bV0hX$1E|86|vVT!%3l?%`a1u)vq%OD(%yA_g z+LNhss)CP!D6k-0n3pTl_*ozdXE5(Uvz1i>vD2j}Cbhp8Mt>|AI;D#(;@hJ5>5Tl0 zj0WExzz_JfzqRYHO2VUr+FufTRI%p}i%!g4J{#h(DnuXR<$DE7L*TOLmgbdd&EPmA7ek{y!Fmb4Aik5(9V*<1c4#!XA zSzDWob+O*|TW_YIaoT=$>L5gLeoh%*1(-+|Xsx^|bE}SA&&OzL!b&W$5tLRCY5z%$DdK9td1J4upb(+ws+(}jBJdF=a zz*NI8{QBz)>J~a-C1=X6qg7~2@Z7Mh!T+TLyYwJ@D7dr1ehT7=yC&de2(BYvPHu}W zY(S1a(Yg-ed!d7}Yaic{R`(-ndQF3`GJw}BsfL7AO`LH{!q0herS+vI(pAo zMT!Pc`gy>t0b(&|fQ(Gguz%{VTPuNJdqM$Jh?N6zb3ijdEDLPXlto!9XTh`xG2C_} z+^_Kos0I9p54dGRJR=~ZqapLK@UXw(8|yRZ@Cpp1QmcyC868$TFi){3iC+q-4j)jm zrXxyB^r`?w>nBzyRIsM9D+NpM6?}cy?hT>9f7fisH0tT6?_l1jGqvIR3HsatsO;@HF(+RZTCf57h~)9 zMe2&drBLjWur`%pPNP#m+x1b3DH;>f(2RxgrVFSXIw*BOIkaldXf>I~ybA+AcH%DR z9(pcbwkTD0O0=>_#>KKMcDS%*;kD$zS&NN^2iEn$4ojh{nyuIzXzv<1uJSaG|*Li%%oOG1G~!7+4eGMnOxmo%|s zw9fbf--dFXjcQvEIV<-AmrlvYD#THd3JprKXIFwEB@83rBpyVFMy|-Osli=O#}T(! zq+kMV4<-K&wox-1UrOOmVg$SsG5N|Xu$IU-?H)K)JJAwvzod_qCddqQ^4E=5SmLE< zhUv^*;d9#drw%ZcbD11z!$;7T~P?ngzJhmIIqK`AZ&HxwM}f zgPg+kF>A7-^_oA}g8H+e!H0qyT4MNO3_Md|Pm&F57BEr6c@T`PN z2=+?l5sC&CND6^LOOQ1%$dt(57S<%Bf}J2RHDmb$UoazE1lJIujei~6_-FD9HMpL_Z!^SW!DB}u@6dG4H~G*$^MoYgU=Me4;RA&U6MeTbbgzb zvJ}4(Yds$V8v#Mdthcze$ZUac@_~9VNU$@VdkU&{J%iTZ4)-5Wy!H9ky$@F3;ohNo zhhWbwz1(uHf|X3ACv6%F$*%rqheLNU(nOx4@xRuXu|`5n*D!wYLsM|XgHMp#1`Bql zDxh_AqoWWeEYV;wyv2dvZtH}rB(%OZLv%w2x}yGyg!L^HSv)A^TZTe1rSi;qBwL%A zf&VOoG!HAlx@!+Ak?4M~P0CC1N+kX_8~KTJ_uC)jmcITe!V(>Z$a&I%FHm9%fmt;p zTvarL!J)RaC@XE&qXu7ES8FY1S8zvgO0oj(htqG&QK>9@NEx?v&lc zR%1IF5+vdhYslr};m2%-=rd4%r~^klS%*+`jCN z=!+Q}jN=a|$JV#ww((9P@`5nt%9DNC%8d>wjhadX8Pp>!ewZZ53Bh%eD-N7Hfj<4^&ZPo27?^yBT%}kD*S|PQ~@>g3s==aks5#mpoK2{@8Y6 z{ibl~lIySQT3Ww}b#@1Tj61e|)$J(z&=*nbVA~`S7hm6d`|3MZy?EtIR=jli%a*-7 z`U<3c*7~i%vJ@qcZr5k!^=Pba+;azi*gM(ox9k_CeZy_j*;e>X%urdnQJ-XIeFoR} zcHOal(`D{OK>kR0a{bnm%bZxB>U#P5t--qUhr|;BItkubB5kPm_m2V!~(9J6+X# zu&~%p3R&tDt4i&7&eWk-nLqZt*5V|EH~d_O(edO8=u4f!O10IKGGRSM5BtN_Y`@O7 zXP_3+o+q_}El{|rIvTwrk0-C9gewthU1SpY7;HFUyVIq@!L^A^ykWK*OS%X-c9*y|j3aV-R6VM_=Gp(WzmeHihiF#F8O zcjowO_Zo{5m>yVtMKTFIC32PN!K~k7H*CO5zX{ItglI^WBA(H-u+`*9+D&5T;={}Dz|lE?G78z+7U+&@}V5z~!O94CHYT+*?g58w>u_dDbloKM_)zuuAVY&6iR z(tQQ#g71AD-plv!z4#e&|GmG)b@090kRRtRcewYShD5=1`;hKlmk8+6twy5Yd+!ar z7r$@qzxU}K`F#`lu`k`>@=JH5TZV?Eoa7GI&J!K)y+80?)`#g>|L1n(cP=9GE;FEe z?@~v8?+xTfnaJh$=8pVsLBy%(>Wv-weE|8f-{Lq~AD7=JI`Vr65tQZJ;mY@sj{H6! zDBngTcKLm;Bfn+%6>!Ra?qE6|-|oooYsfE!`z#;J>GC@V1>oauoUg+L+ru5Md}rYz zNC#UFM})4J-}yLQe%E#6cOmjiy3BwszkMC~4FvL|T;}pCcjQ+@e#Jn3Ovj_tkzW$| zb>n^<=Y=?3ey{7u?=#4c@~S%!EyrCQ`4y3$>)&pqaQS_pBfsAxzf;lumpjs30cJs& z*B$P?<*^mu@UKl`P~_4 zze^DB@=JE)cPAdATc9na5q z5W-#&tRz>F$%--mctk6(1;mpx(3rveS* z>cI#6Ydn9>{l>gEpeVVx-*voq*J!HN6!GqG`K?8|U_EaC zY{YyMiQ+gpJ`pYby`>|+_dI9}s_Y-`^1_b%j(iUM51q*T_TY5+4Rque{gg33Tjyuz zw?%J9e((K4#C#danBP@_{I1jddNqrG{gN?XxLE@LmXGKDj&vWoDq@bcllkcmca(42 zGw?Lp-W`aRBa4e*`#txI5%X3gW%;hb$#fhqC0yX~Ixgkdc1^_WbO9jC#^X$!f!7!h z>E_+b5a-en(X9T_8b`Z;2PSZ5948;)cxKsx`6aUv(;K+q@l0rrEBLHHOo8VF}VhgC}zp<^QdUxh(ZDk$FDR`LHwP58cK-m zBZ^iDrw{fZ%e$r{9?T+eL}7&pKOZ1mq>GxGC7<>Y#S9#N{#+@~GM`8|L${A8B$IG@N-FIm z3hP`rKEUXZEDFgX9Dkv_@35Z*C5!eEHQgQQyW5etikdAQ@mo6LFYbuHxFddRNBq`~ z_)9wCFOl+I=C==L^7aummvyAStR0D~sJXl&{_>9aD>~w@=!oCe5zm>meMC)9JAkXG z+0ha16`6}SZ^sFa(GkxXu6;y9oQ(N#CTbtikfg_W&IIivDx5qR-q%6zGkek7i0H-KM!U&HrG_%!n<&>c*(7MU?W_S6RO2htA19H|@d#t{wY zCA`5rQ^U4?XPYGr@00kA=9L;{aFRhVK}9zMIlTwyk8c$tJz3g<%%V`5=?rl(-Gw#-&+xb+Q1 zPiWMALUXP@@x+E)COEbE)@|xdmUA;$q{QN>c-Wt8%RO}#Cp#;JOK;7Objajd-)MMm zW;khw`Bo#J&}bWeSWUHmz(C9NZQETSeb}OCBTnrv!YuxP2{!x&TXWf;Zk_DI1(s;_ zpFPEcPaIM3P1$kRb)AN9u<>hdG#IIf z2a;nG`P>@B_iGqg$bE|DYmQjml;WG_5 z0K(6wruF%t}X&{2R)k5>sIiJ;UYZ)BcW17!Iw1l|u^GXwpO2xcem2a+GNUA7U? zF1^IGU0b{G*+`7zLcEufX;;GD?;5f4JdyG!@jT*?wcmCP8*n;%pSl3!_b3i3lK=5O znp{xofpA&FRmJBhzCiJniqd~b|0WH;L-7NOA5{FbBIhl>?^}xhtoTdC#}rqv{z!L3 zv8MP!#XA+>r1*g1gNol#{C7ppH_Y!s#chgv6^9fviqBT8C_YE=Wr}Z9{4>S(D?X_B zCB=VI{JG+96<1~i6&DrnP<*Z8+Z6v&k@gF|=W~kxsQ44b z-zY|x*>qC(P6rZ6ute8>s6ptz{D&D5} zR>i+id`R)Dir-cImE!LdSFW<(#iuJ?shCtODIQaNp5n_DU$6Lf#rG+GNbw=X zuPT05@#l(p2+u}rFfCz(-p5&Oejt& zPAfJPpRahg;=2?-p!f;J&ntdY@kffkRQ#Rds&%$pXDeQ+m{xqIVoUJ_igzmBqj@iU5FQ~ZhIuN7CrM8bA?isEL)?TUL92Ne%1HWgp4_y)zdE51+hLy8Y6epT^% zia%5Q55+DhE-cS_#q$*}QS4W|R`GhpoMJ`sxZ)j(cPrkf_-@4q6hE){O~oH6{!;OG zil?7$%XhwFpW@YuqlyO=bBYzkTNGcS_&UY6DL$b1pyIa_f1>z^V&n{MC&f*QeTvs8 z?pHjlSW;{#zD)5AihrT_A;pIkf3Enb;&K>F*-sl3FH+p5IHGt^v8woK#cwPARPi^8 zT^nq^rz^fv@lO=rsrUiK&nbRW@t+lct@ya&y0dJ)=P6#Im{3e9K2z~##YM&274KGj zi{jrY{=MS&6o01p8$}uv*j{TDH!5yX>`}Z*aab{}_$|E2f~#dYV~_noJB ziQ-Ph>l7yxZ&aLCY$!fo@ePV^SA3u1hZG-H{Ho%=Dn6>X>;hY!GZeQg?omuAPAcA{ zIHTB9e1YOC6yK=$r;2~6_+iC|6~CtVJ;n1k+45YfIG`9)oKQTXIIB3X_#(wuE8eU4 zZpFV*{FLIC75_=`XNv!+xD0EFG7c3lRNSVxS8+%&qxfvaisCJbFHwA*;@cG8r}$yT z|5S`#Xy1RP;)RM&SKOnRR`e9-6rZE`62(_4zE<%~iYFBRO!2*n4=a96@mq@DSNyT! z|5p69;-iYcS6p_Ht;ZV0GZoKOyh!m9#qEj%iqBAtD~>9r6sHuQrC3s&Q*0{UqWD6^ zmnyzm@ePXiDc-O69>u>_{Gj3|6dzXnqT<&TzoYm=#h)quO7T&}#}!v}+jcrl@odEl z6t^f|uGp)1rQ$V;gNkE{8O0kFbBeQyHN^$R=PBN<_zK0>D85PYt%~nde4pY2iXTz@ zl;UR6@RC=YKtx3*^1qY+ZC@;%qdnCpQHF{#d{V1T=AodpH=(^#UCmD zO7ZuKYcICtI9Ks$iv5b$Dvl}Mpg65~r{bFw-=X+^#a}BvuDEWiecySCmniO399O(i zaYnJF_(H{3DZW|pU5XDVep2!KivOzkTgBy1v*kEb@u`ZJEACQ^DUK_a6dQ`SD&DF1 zCdGFszF+YZieFItmf}woA5n~4V#~E&@dCxm6n81c6(<#sD3%o$6mL_!OYuI%cPsv_ z;-?kAqWE3KpDRA9xcpLEz72{ODQ;8Tt2m^XQGB*yMe!EJmngnY@okFlQ~a>vXB5A# z_yfg%Q~aIc>dS2THY#4M*sFN8;`NGCiY3LS;tLgDt$3f}dlWyY_(jEUEB;jRH;U2A zZF$a6e5&FVihC53iU$;*rMRSchvI7#Pbj`u@gc>(SNy)>nk(%4&r#f}c#YzI#lwmv z#fIXoigzl$N%0+u?^pbU;ujSEm*OuJA5&cQbnPF-ixqnnuU5QXaZ0hMcuev6imy<- zNAYhIKdtx`#qTQqT=7xG<=bp|HYi@CxJ_}d;*erSv7&g3;!6}?r}#F-_bGl@@iU5F zSNwtEFBN~UxNf^G*ZGQ#pf%&T=5NxZ&!Su;)fK!s`y>SpDF%_V%H8^zV(XdD_)}5uXv5( z^@@iS^NLl)TNEEq{G{TS6u+bRFN*)6812<|QoKSDTZ2XZPbwZztSLTM@nwo{RJ>pD zbBh0__+N@^`fR@EC~j5kQ@loTzv5xVl43*gR>eCN-=z2s#rG?ILh%cV-%|XE;ve;&&B)uK0h`bsz9i6o3D~ zclR#0M{*$-=D53%TnKPL=%IH=D4`3|ks`g9&=e_xNK;Vhs8j_J6e&^_5EK+dl#U>v zRK1BGI-lH)Uo$dK)GA&BW)7rEN zZAW|196E+hp|j{>x|(jLAJZ@CX?lhJM*pF?DmmrNOAF9av?{GnAE%vZKRS{=M_;0^ z(YNRZx|4oRPtXhW8ofvD%1${0v;ZwltJ8+G4ed^c(6RIdI-f45>*-E(a)w z6YWm>(!q2D9Ze_DDRc&%LzmEZ=z6+^?x3I0{qzt$Lod)D=rwwa-laxOr(JwBOrtb| z)}Re(Yub$tq@(C$I*Tr*@6es}b9$0qq}S+O>Z`?mLkrWgv<7WRJJLRM1f4*q(*^WR zx{hwA`{*(H9sQa9NnN#_@+Ht@T9o#ruhQjoJ>5a~)8q6!{e|A4?o4NUewsqlX;a#s z_M|y9gz4S0W zORv(~)Tr-l*GI!NN;7B;+K}RFo^`u)r32|GI*HDti|8u4iSDKc=_z`d-k^U|Z??1D z08OJMX%$+JwxFG9fBH0?L}$?@^j*4*eoBwh@8~Zywt-WwAT3Bs(`q!Ewxmze{`4t2 zk-kh{rz`3E^dowJo}{;^{1KM!=QJNJN-NMT`WWp<`_hqgB7KD}qO0i^x`!U7=jc!L zPwH;ul&>7ENgL5Nv>P2npP`fKEV`Jkrd#O8^bkEuf24mItwOVDYucUW&}Zok`Z`@jx6r-xC_PVq zrGL}drcSxSv(Cao3mr&D(`j@*T|sxzgY-20p5CJJ$5ztMbJJv+PVs9%dVU?+ zoOY%I=qNgw&ZbN08u|hKj2@%EP|st|_7qK{rD!$UfVQUH=wLdAPNVban{*xBK|iM_ z=_PuD{zK&%V`;AtjncBT7HvXD)2VbWeS@x}+v#z7k=~|O3un6tG=&zUm1tesf_A3; z>Ccj*UoA3Z@Y(ckC;8vnRczGPaAR;Kl7E82|?q2uUu`Wk(kZl-(a5&9jy zM*pI@T5>=1r+j&6ep-@N zrP;I2|uGo}d@$bsFE+DOWyPlvbcwv<>Y>2hs6#I$c1Q({*$^ z-A9kpZ|HgYJ^h8=qVmAJj58kUql%`{BD5qeN2}6o+LX4W?P(Xis=(BVZeUZ+h zi|J~*g?>!Gq^Ic>`WyX+=4$WMH!m$fOVO$nzr(59<#F1X_M;=|bMz(p8hwjypgZa3 z^aQ;?uhF|Srh~KnL>i&RXhoVuo6!!m7adB+(HH1E`Uc%ZchN8C*Ypy-PXD6z6HYk; zG(RmtE7Q8PIqgXM(BX6folY0f<#Zk0PWRDc^gH@9{gb*nI_31!WLlJ#r)_CBI+%{8 zQ|N5EguX+!&`;=B^c(s;y-Dv=`5PZO4uiBHElsP@Y}%4`q5bJobRvD3zD`%t_vuIU z06j@B(qHL4>gnv1GY^%&DUxy*r`}0a}_?rwwTv+MVKO zd3Ae_rK7q!@$>W*x{$t2H_~173;H#^M6c7osNK!UU(x)u1g%2r(&n@y?MsK#@pL*} zK$p{XbUWQgkJ0bw&-72~>h6>?fhN49*)975fjIN;{(7p69Jxj0B+f@F5S&nNT4O9GS zu%4blYtRm~C(WT_=`=c*E~9JcHoBJ{q2JP<=^Yx=%PB`5nxB@WRcSVDMZ3~LbTpkx z=h8RmTDqO?rzhw|dY%45bM$~2CYdO({^++okf?>HFO*Olpdwu(O>9Y>gnT@ zL(w!^idLfyXlsgJP}KW*44p>j(KqQjx`TdBPtr^D2K|S|_I2_P(I_oTYtbgOJ?%w@ z(eZQ!eT}Z98|iNPCH;o}KyOpCpHr^fG?}K;Y}%4`rGw~bI+f0)Z_u@LJKaxD(2Mjs z{hQ|M@02S@3(*W(lQyR9XiqwnK1-+5*XY}HGrdiX0nT>gsiOI45n7&R(q{At+Lw-? z6X`2-5nWBU&^`1pJx70{e^U2Ar<{p2m6o7YXnop}K1uPV-nzd(L#NO=bQyh*en|Jx zH(t@-Mtw9^nwzLPuPgdyijiWEp1#|`7KtG~i&{OmZy-6QX-(V;I zBwB=)rTj{6t7`;HR z(|>5(2&Y_0v?#4e>(a+5eltk-pFwmC{e*r+&(mx47QIU!(3p`KqqQz(# zT9H<#b!ao%f%c+9={WiVok!oG@6iwFr}PLtM}MThQ}ZdOKJhe(7N%usP1=~Yqdn*l zI)+ZAbLdj~F5OD^&_nbL{ej-14`|%ePI*JL5G_Ni(+0E^eUc8KPt)h=D|8`!n{K4L z=oj>BdWrr$r=I)sj+)9GvUZMvE6p-1R<^cww(=6Z(hMhnyO zG>bN;o#_Dj44q2n(dBdl?LOMs&R{y4PNxg#d-Oy41^t>{qW5Ur7?z(FqGf1x+JLsE z-RL0t44q78(KqS)bSK?UkI`@GkMuT;9gFhC7)C^_hwr(fHEA|&PTPnL@sk5|Abpxn zq%YA|>2kVJv<>4k5!*XSzo*yf-y*gXKh80U7NMoYT=-67#tlT|*OYNP#+?}VVLXuW z(~QS5p2~Oz;{}WtF@Brz8pc~0?_j)-@j=EH8UM=ocQFp%+w-hbp9B%*4KU8nILf#T z;|h#xGp@(DIpfxhpJd#V@esx%7>{TC5}nQIZ_xF0mxyxSr}lWnweh_)BKAjNF*m-; zmvJ51OhkQJGJcW{q|eYvB9>dm_-)Z|7+V;B%=w=&KEn7U;|q+xXZ#!EKNy=6ocui^ z%A3eI$hZLGB81`Xo`Pv~KKhV#!ezDDnG`adGJ?|-%V!4Ww92?La`a1nsM0@TR^Bcz3j4z7y4C4pJ zHyQuQ*qZFjw?(XxwAX5c(S3L$A@$RA;#?I)KijJ4Ce49x-YdM;V_J zQO}EvuQ9$UVmZ$=$FPX?^NU3cqcr2HBG#|PxDn&W7gT|gBg#bGw1@&e~Yda zvAy@jY{U43)4!m{={fp6{aM8Fw;A6Rkx#)F9E*sUUrt2%tJ8Y48Eq+IxppGf&k-9M z#?xZDVN78>OGG~N8Nb1JCF2c@w=n*g@n?*WFg__F-%Ff+i?Q*dvt7T4`ALk^8CPSR zC6+LZ7K}TJC|6g;0~qHp9>aJ7ToWGm#7mN=xKEwDtI&5;Pl{2PJZ=7%x@x=H;gA3_YzUB{)|U59?f_%;};n(pl@>e2D*jQKW6+H<0Fhu zGQLQErFS|1KI2?3JLSnOqP$6r3yLUr5fR5-B~GtR8`8&VM-j{QV?08{`qLQCqOa5C z^gR*F?P7d@@wbeBpf~7U>UzalFRzI9OkrG1L_M-NJ)6^e(TQSh!&t(22jdGO*1IZJ zGK@bNTQdRVchfIKEPqw3VHkgLx_dTa)FYk-X%P|2b)5rIj{$Tnol57>C3G9TKyOh4|KxqC zo5s-uic`IwUznDp85Bj=^J~%iv=MDZ+tDtxI~_=KDBfP^{BW73#jvPFH`Fer%jr9G zE&Y&wL_ejU(-ZVGJx?#w8}v5)i$0+8{n^r92{cIa(bBXW#m_$I*xn`C*4c;Q~ADb+5Wfmd-@Z-NAFXQe?Jwi{=%k(O}PH)kFsOfUrMZQm5+Q&!bcX=e1-|-O((89C~El;b_TC^c;N?Xx( zv>WY32htomkxrp6(OGmMT}oHdcjzX%jqaj*=$G^eJw?yb@99tUF8znbU|^DV$wiZB zgchd7XjNL1)~EV=YmrX}#+_+z+Mhl}N7E_vMLM6pPFK=*=ob1R{fr)RDT~YmV1lwYPz0o zqMy+N^awpc&(ibsCjEo{LrsjaQZ6s`(NtQH%I}EDa;0e{T8-AB*|aTvf_A69>0mmH zj;7Djm+5T!I$c6n(s$_lbPN5A9-yb`IeLZuNN>>FG{%ei=Em_({WL&}(BiZltwbA( zeta)GZ9_ZI9<&dAijJnw(aH1`I)}bVSJLRY^fWz3f1vt%i&5@-jPFwq zj%le+EX_lMv#W=`9-LbMnhY{WL&}(BiZ# ztwG(Rmwi__9Hlh&h6 zXmi?ycBlQQ{=RQ)cRb_g>2&%ET~6Po>*z+hi|(O^=rQ^O{h8jQ_h~%Nl~VsinnWYC zFfB%_&>FM}ZBDz;?sNbhLZ77*>1;ZmzC~Blo%CaRSWGvJEBd- z&{6Wy-%k#Mj3cxFEkVoBO0*hnN?Xu&v?Covhtg4WES*AMq_gNex|A-b@6fe$H`U*p zj(QxExCF)r`YpXkf27ywZF+~s;@U&j&rS2vBwB)&p_OPg+LX4S-Dod5PAp{@&(Udg z23GXB6Ebc4Qx9DoRk#40Q(NE}cdW!1rmq&h=80+tsM|_vDfombz zo}23Ln@60$IEhARl%`Yt{qtD97UTM~5$#Byq`j&BUV5ze4C8Th3Vo64@2AIdOBlaR z-=(|g9(s@-ruzHrvHlsx`g`pW|G@ZHdXwIz|IqlnPWvR%d^D97p~Y!=TA4PaO=%md zzb_x<=*qY!9YlxHQFJVQiO!<0(X1O<2UI_x{hw7pU}_fSM(@7 zP0!I^=}mf%-ls7kr#`u89vY-YX$e}MR;HP>9&JV2(I;sS+Mf=lyMq)X{q z`ab=LenL;vbMy-Rk=~%U=|9xOdmP!XUh1O}T7VX#rD#Q3l{TWyXlL4u4y7aMIQksb zzq^2P%w@cSuA+`)OVe_+j#$Ys zvS~B=IPF3E(5LAb`aGRV7tn?DUAm5LrQ7Kqx{n^B$LJ;c1HDdf(R=hh_2hHv6HAlC zDtK;_Mrk^&Mr+afv=Qw{pQQTtCXio$#$)LOI+aeRi|HG5HGPjBp(p4$dV$`cx9Q*1 zzneL#w=}~%; zo}(A&E&30%9BFVXU}GHpbg(blv*?N0|&{d*ZTa9zN7I@Q0Mf$8%Z zzfN&G*pTN4aT%{a2Mmk27n&yG9vCix_5I%r5%2M^OZ5G~OcB?F4Mm*mTZkCb+l$Dg ztBAVy74g15N5uR5Q6k{Suh%gaPuU#=2yUASJvd2^eHab>rN z<9@$b1^4$v?AKEw>M8$ZyKd^GxNV`Q`zea9<1~sQ=@>=PmZaE(E~jKI<;|q^Xbak! zwx^wFUlHXVNOR~2Izhx|6qD#Q5&K~Vohf2}%%!i2xF@xUE)%hTR?t-UL5&Lg1-7kg>;~+gOVt*c|r$n^xS$bZ?{=H1EirCM;&>LbD&!5pdBHHn9 zYM6-AvA?KSL_hFRzbNlFXjnwQNTF#W`bU(ei)inXG($vxsX(iURd7FwW{T)P^=Lz} z2A(sgTjlcs?4NH%{J$q+f9&x>><4}S9PMw*ePgtHJ`wF*UPL?V``2jScO^!VH;5y=(d)>f2vL zJ@<;J-&qm$LXixsvGcp$Qm+ig6-3mnDdQF*%Gj6jKoQ%R$#|}adM{(VLPY)dGd?Jy z9ZoUU{RJD>`yJcY`yK6~_cLO>pV2;gzarNA744+=6Joue&|d9jzaZ`;%DBRKtXKf$ zVZ1^_JMLh-TSR+aW_(pdySn9ba^&X~OJLk%Tv9|kS7BU3M0+=6+*Cxn=P({2qWu>! zUM6Bc=+E_$zy4ew`{NYnpB1rRZZp0kV*kj`ddtsemmX3kP5zawST-Z0Qq_!%s%dE% zdW!QZQ!7y|tK_~;4*yxM=l@zR>t@OSV_N(FV_K(wr`zQgx)DzPE!=9=Mq+8ZUpyTaL7 zH*+4@#{V^c#J}@pyBUvcH|u7F|B9;oyJXhQ9goa0e&512cgkMlzvjLF$o{DJ$egU3 z4gbwAHrveZyCJimtKS)qeLU;tD$G$Ej@&U4bx-*7{;r$`(h6(-M=NCAY^s;^W+!IL zl36#`|C?vl%}tM_w>^^H%e0hMa^3$wa+PTZ|7%)Wwtr^^rXK!xs?*D}ZjO2+FXQ)3 zkJNS2zgv_wr(w;-cYH0P8(g~IKU`n>z4Y!G|MoI3mi`6nstxE}Y2KaTZ0}Bcv%Ap%0G{h#ym7jjL=X)vRgb8RDM%xT#eM%&{!>gXw6xk>7>VrJFHjF|~Ym*^-nEPH}1 znu%e`ReO+3amTEe^GYk3k~LmWv3(c?UEY}SnV4}JBeJXGt1`oD=g08ncE@1!!ix6R zdYE6c5GE;PYFInNNXoag8`d#5lKJ!*=DZil{M}`0M~t@av=Ne=T@J}2FG=!AY(J*@ zQY2%BS21GhyeFxVNY&k@Q)Md|G4=Q8+2zX_G1*_~sgi7PS|=-2Fk%{AM$%f1Tw|K8 zMAGAq>G=dkMtf}xCg~*30J0IQE}AB$XMN1H>frPhGg2Oa%jLG@xsI4oa+MM5o`%=B zIe78OOe4M?#_^cXO=;X%x4h<#b-#r)kCd!Ni zH(svbzg{B2u-X(rAxGZ8lst3M_J>2Bww64xqYSj7r>B)0a||WtKu<3nSn4nAOiyo1 zO6XQM@+0VLmB$Izt5)FE)6Y8800j>0%7>u8Wj%&RKiz@EctiuN5ve$ldIPtxDbGMl zell)`H&7D$*)!OZ8xxDXfkKk~5bF+3nftwg%Gjlz94omrE@)x{r_qHxLoE~C@o-!q z56+67VU~Q6_b6YW01E0EZW%2N<4&GHr=o~PSiR9mIVzBa>j%$BD_9++3cO+b zk_QmO!GPSy@hsKVNeKqzX*|y|t2p|4S}<@$%JQa_geCtD2L7mpXt|DzP$0D)q7^!F zhXM)cZ=Sa-XO!&9aRVg z&@6`M6CE`T1hvD3B~|_M_DjN6(~C-tHrF z49`!N^xSEoz&h+4&(BumaqPcPKt8GW}`!@(+q`rALtL1tAzvF&Rza#?bB#QwFBBxBGW?CWxrTT4=qydjMfRM-`M z`-C+h2FFbol+8YA$xpo-N*-*nzt(}N7GaWoN-t#@336zT!3z4Qj5mT;(Q01%TWhCe zG62Q4&s!ysHdK9dO#6b)#H~)?Qro_$gBbNj0|b|>SS;o-g3D2Qul*neB{oSr+>&#?c|8}vBq z-q(R`1oIWfY}@V1!Mf@TsjA22)Vo_j1YRAOs!bMxTspASL0rb#u{v-W;bZ7He)~&T zcT_&F_OM4iu4JWG*(iARR5$)s+hF5BGTVD(|@!Zfn^gU* zPUjmoVz^88@ndWzU_Jy z)0F&vf&I5`0R!KyU_a1J>o<~%AUm(O_)aWjm&-=Fgd`373i_jycB2nV9+v!OV6Lum zda|Nu_*{c0qN62$imCowIYBR0+K-o9L%-4)OvM&+4cmjX+x{L$T(03V#(QlS>Yi(a zqv!XN4o!Qfx1oY})dpxUs!udS3fl5v2P_I%p?LK7D`3 zGT}&7G;M6Z7<9c9E3zsbLH{TgnqWoV!9f!{K!QnDM1GGbcAz}9J`G2n6jN5$rO#y~ z$U>5Zjwd*A-iLA6u>O&a50PiK(K2y|vyhB+H^6ILJ6S>w zJ!dgXJ|~DfBI~8J#p%4H8F%ag0{avei90Sk#jpnyM*4)T>9_M@l#Dwmiv;Y?Fw(|- zy%9^!jr@X2#hqG-bij=KRsg|i3BqP%MKXeKC{ zWA8Qe_3w;QruOS;_y$N58TMo8sQf@lo3@NnzCn_U!vGROY zN&7|YUf(!rf(*M=Nu-~ZWh$f&&oO-CC0WJJkfKeHbPc;JPDj4yB%Nu0g2T%_bVj!L~aMmLHwQwN$-|?!nXW8yzk?RSUw4*>Vf%I2^>hi=cRxiuWwcq zEtlFG)tfCvH&VL|>tp!lNZM^!EwT4~bKO`Z`6!O>G~a@avbgO0S0#VesW})7Dq=DBu4SWza z_pOtS`>?^g(qOx*B3Lgsz!GHL`q&zeq2yvXO8mb48y*(mb6J1|I3Q^j;0sB!00$+_ z0(|*M0lsnyFj@B4p*>i}XJH!$K+E|V8h;A z2kFz2cH2u(Uf(y8_S$kT^PQ2M>a%m>6zDrEX}|q0^6{OMbilA)lHl7Nl7Bs%R-?WP zW0AjZ*Ncx->(V3Dy8KABt~^q$?;okw4^FkZ6hQ7*rNlVPTtnyc{g{FvxmOrT-}N&O zH+4g@VGI5yX|~`^Nn6fAe@oIXeMa=%mNnf@U;16rUhKB1&>9g&&VNWU`BPM_g75Bg zICOP=?nwsR$X}A?M*fyGchf(T=5D(GNPQmY`Y2r=!_*a0^3c4`G^Mel%7gLQXXzka z$(>Kr!dOVEK!=~32i>cT2LY9yMvv_`xfLB2fZ9ORte?@KmYqGvhTrf?gt z;Tp#mG1G7+FjXEYNh-H-Ob)pG+=hwyzBFAsx6(�rN5n;WhGmeTB`ZB;VuMim!;? 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 z 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�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ʯ@;vr&_c%*o&I3%7XUMOBGZWgzQzYt#&-xog@ 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 z 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%0DW`xelmOM#^14vsLdn(He$WNv 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

    b0N4RN1G`ev&9USz<4j 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

    gyoLtE5 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

    e!*>xM1z5dU^PgW2Lkj0P| z+!W#5+*HY$L|831271cFVuQyv@2JFqNeE#Yoc)=pA~M3`czDX?LRr>s>Fo5=(atfk zqI@*DD{hoO&ZI1BMynq|3JWaRH!=c}Q7r7Xq7LOaxC;2yN|e2sCtiw|X}=FumQescUP)dgjxh{8}2$@r8%mQ%s2`Q%T8z zL)~Q)6AeIdn)0oot82^FEn8mQ&^DRKPwj-bg^AHNxe;(_Vrnw}&ySCHHMETu8`_ZR z+c}<{+Pbx&Z7iE>QwdMB?Raz>78>!>ogFwd2D^n`avK7(64t~q%F{|1#(Swv?6)>y zqf`N%Xm4QtiHTSNY&9Gl9#!5^#E#C&q71-3fzC}?eia|15GXMi10isnv8f#j4o5Bj z{(gve*v8Z?u!a&yDITv4N#vR@1jUZHavVlUst_&}c^l>B#nOctq?a74cb?A!Fl7}5 zX`mlaS@8nMS(%N)D+z>FW)R~_N(eXJpF^Nzzqq7yyJiahIo`*PN5=yby(v2Gy^hKg zt=o+VM}@5bqtt@0pVRu_s?80jv;RzoLUg0hA+PxpS&=UGTq)gX@ZnLN7*B#>J?JEh zauBR2oHzk}!Lao|jcr-|gIWf0*6{48nDp_|U{O57IMic5eVZ7}F{XtfZy24W3{dF? zWk^c2GY)qUUV}WM7PqymI3{e9*d58|EIM^rxG$oBfl6D%z|5!SeNoudGD)Kpa-moi#jx2}qEUm9E zga@oJ%Rysl`oZ{y(~7#HWM4lVcx{5&Es9h@UowZ3Nurd|z>840CFOeNkK;q|M$eXR zI^tt0{>y~Munz|KA;#zF=pnc&G>f8|otY!< zU{}M#aEc4abrUlZXaJ52bHYl9v@=cuogUar!a^Db5p~`a+yOU)8Y3R0i;Rc_44+(N zs>mg=op`mz8l)hfmR2qz#mcsGOlMzo(CQ5yfNm&fawJ;j*MxF=Qwh=NmhzPrhUREf zInFh6APXYWSa2*QMLMfWsF3Ai(WSu*g9r#1j-e)l5t2g|!u(Gr?%yPOf;7U7mPb*Z>w-S?+ zN7WQj`{`0-W+;^`YDk!r zGAWibiNaXmSV31I(##AUyo&gYHOT-BM??J0&cdmr=5$V@=1}fC-GoZ>RSApHg5XKQ zD0W$u3jgC6Nih-Q$p}aF4)x*u*r5QU;Q!Q%2_d33pU;_Z`z0DqA;Z9<64^q~ z;X{#;um-OWF=(-foWzz(5t@;y-BZN5UtL&_zWi5vd+n3QPbo^fH|;D=lg}JM=AM z!t@bafq#l{E-@Q8XtqJ3utL8Np&Eq2InYrpG~VEQb>UkH1iKQxnULlg^Xkpu&9y-!#0SBBpk;$;&QNGl$vtF0$d>}=CKBm z>n|@2L$k>5l7&g0MO0UmpRT8~OESbP*g)o1GUd~`@$ zA20ApP6$}#5o(%z#dA;tjONjb5Q)+k?L+XnSJh)s3jQ;Hhg3&e@9FB)!ef{sV?{79 zM06e(5BDKCBUTaxm=hv`l8S%>Swog!OE_ zz^EX+A<#2q7yXw?eXI=-OFq~ua9^fMeR*+>7@k(T22?6SIo>~Gvo&N(M53PHGcY@e zgi3c#bMm$-Wyxt(`cX&eEHdAVgs+Hy?jwK?2*!m`iku)c3hqF+4~~)Wf`)_@d{0PI z5WZX^JR79FL0JjS1i6G5Gw)+NX+mlNrODuHWHp&wk0!=49$tcESP36onF!5oKE5sH zi&QR0k=v0@MU|2WAHs7|{K5C2?IZI59n-nXPsQN~Bdl9QIw9C+`-IA;79$4|Nl7Tk z1>5%0pppmrKs(XC0q`5FQ@T8|yi!?Gx%jZIu+KuuPvYq;1Vbi+bQsq&05@eA`8mlE z520i%qr?Ns*pLvUg34P=rX(aqL*%Fwpy)h0o=AQS1xFB77h;Cc;)pnbPzQ3P&`Q=M zhUel4!=aD{CiFqOs$7;|ahYS*D9goy6$14Dt9=ljJ;E?jcZlqolLTM_o&}F$WTK$U zI^YWjeSTPDvb0=w)GK1Hq5W7STWMEDM5rKqy}jW+qz@JfPOt<^IUG4bfnP}TQDa#Y z&QIf6GR%Mki?(z0^1`iGJmDvEZG>n?K)|laOq7aU7;Q|mjaST6`F&B9*;hd(u@@jG zH6-(rQ*>}7h!ToM3${xmr#%0w_O| z>@+mS;0zviFs2MdNHE5tAP|&{P#QH){wyn01tGb@z%1jkVxQR&7pD?bm=JMq#$iKVq(#M-2$VH{>njV%{#Z?>u;qe8MjTH~}Xc<&3shY{n-5@R^kGzKLlNj=n zFH7WSCdCb*6~P{2iul4qhb<;I6&t{1fTYxN8PrZ9aU{tx2{3^?%9WcE^CteSg_V1i z28T#lAgR(b(ERXA6sA>mC1e9avwgF9&}|g99xVfWVDqYyKdY2NT?+K2E$>tj5^8nq z47^=DEcRb6fhv>ZT~uT}q(BQr!UkjkPE|6XiS8}Hc+8!-aO zF@~Z=FuU6QpyVSn;1Ksxnjn=Xc5Vz=CzdX&66nC7bIbq1&_MO&5%~AeM~Xb{YeiLo z{^Br&U`5zR%V}VTLQxTGKcE&LNudG?MH4UsF?*~eZH6g?qaewkg0qVhImDer&9HU|t~o&kQQRZN zL@&%9gk!n0PmPVNZ`sBi(x8g5{Pvm*!|KgI*(D(mG%SN1RC8(+VZuXYz=2}X3gU_) zeYJ8`I4C7Hi9DUsxkw=+Y-fcA6v;7~2d1z^Zk%<(;zdY|5!x2M2T(b0ve^Mu$)F;6 zEn~tT%RtT{q@IJ?wH;$kMI~)y=U}Yz$yvRGi0wvhRITfm;}T)%K&tX2|waXdNL+rpf_@(WTg@2R}eD z0YjWMO^Hkz6u{VDu8>p&Ml+S6ZrdFS*|FC=1vDb%inEw|a|-t02#adO<>|353G`%- zuhMtcL)m@yT3YsER^~!g1|#ev(j3xOShcBbSPBc{2o$gkUdt6=c1!wqa-43XLkWmD z$b*EU5fV7I*c6gXk%`%;jHt43Bnb|WqTYHmjJ!YUtjVX+^<$Dm$@sj*dZ&bB5oQKZjMjG&ab zZH+qeS#q{77foBc5@nOa(U|t=j;MgXvx5(|rX&4hS*7F}(~UC9Sf*iH0WXA$+Hn~( z)I~sXg2{?tWkhwdQp&2K@FRo`j+K#9#o@@N3A#6O|AR_Kik&V}1qwt-lyU^6Gujyz zJ2p$RaypH8neaJfiz=NE4UxRSae5^fc!aZKP=$J! z6=Q)bD$(uHl)8-jLVFq3amYlJE>Klu74!o05W)^>19PL-J2N@yARd|(nClh@o*jOLGU*NIGBA@yL7Q_SXf+(1+cKsy1Kn1U}} z%w-TWm2jqD1!WgB6Ho>mVLh*+Em%nKtD-7!-LLYnYJ(B@O=&h%RizMV$RrtJAQ7nu zFRW`+I@yJ-Qt&%5gM2Eo#3B-qi6e>}y@>Au-B72*K{}DJX;hV%_6(PxtR>YZ#7*n8 zOxvvNVCkV07qPYnhN7xr6mLoNt2kWq2@NEHVN9}`0|9LjT)qf)DT(BO@$c+JfZ+=5 zwtvV6`K1gviN2}OFG|s2G*x<tn3hAjL3vK7 zEf9;{wk^3mB`^|2Ifm4oK!XYUJ2_P*BT$MUHluj22+@@*n4BDq_=QNxRmO(sKV<}E zDs~*6l?<>-erbcr0)rHBYl5+sB(p6@oK=WATf1Y4eU7GQ1`=*C%Ee@d8g2aJlVpV= z>HwXpKo$;_T^cEdhGq|Rbc;vFr!RYSB6&nDD+R9t@OCvI9#~3>mF1QM0V8sr^h*#i*Y5 zW#^DK_VV0s?g^OSJ*KGNJ-U zLNS=c*1$HD0VW3w8z!jYF?iO|4cj3E>WQD-uXz?v3}uM8xSVt5i!sIpL4 z*FJGu_V&{?B?D6tOeE5X;UiEYlV*HK46OcGrkL_&CTY1cpb`&{h0^MJloE#aR+??f zdliC3V4YSc#3RfIFdbY=xFMh`2}eWZiM&JT74>6?9UVs|q%B1WC_IA^1!=Xwl(KnB z_z8Cr%EtmB24^o6qeV`XPImgqlZzRvN?UC=>v(1m^HTK?7R7qnl^Nw+l0#?nX&ZP4 zFtuZouvgP6{ULD+xusLogn9_6*JR+rDT@QK=BBYpG?SZ=;z5d>aR19U4YBIg@j!Z~ z^5JMiMdDZzVm}9qB~%bsq!d#@R0>kSsy3dfVkd-Fu$^gahNa_*Zj0FefYnFfW%wWr z4os!r$7qxt!p~zTZ4t_PbgUPtCp&Q~F`oQ!j+GM_vxzs1&^PUHM;%De)hNfHo`v>Bp}}M^ImJ*n@o7=2{_njS!+!Nl zI|5N){_=}0#Ij&v6hsaq+4LQdwRdv$@xg;4XMsc%-Z0VKgY^OW5pP7SC>#;a0{b!E z00~`L+aLCU@8HLv07{HfXDhGb?}Nxc4=1JqlSx#siRX+(A%B5+p)`i`YWF2Yb`M^z zm}jBZL6)IH4qyU69-^kOMeP)lY$T}Mj=_bpgXDJbSr$g(6k0?TDOGGl3eTc`LH6Jx z+c`OgH^I=17rW(^{42GHmcq#YluSmIW-5o5+eBx3Q?p_-I3gJ#ib4XVlR#(W0HRAW zWDaQ}J3&3a1=lWj2OAx7>WPsQR;d=ae&y{J6-B*b2ZYF(DtX}S^+bFFdMuEe%)`87 zUi$ceh|0U#(QsATb$swqi=#SKMOB2y9mhh#0hNw1mLG+pMPs}!o0cVD>saXxG7CeLW5DQ%5H1MrbK?R3| ziPU02G>yl&=ac3Go@^E+Ezk$>aS-0g|YTwksqd zN&91nH1hofC}xD6qSP8aTAB^YWFWg>b0xRD%8snQ*>ouYzJ)89VJSTv9avu6c}|i5 zEjo25so6Y&J={x}x19hM3J%9aDJu()4wd779G$P2Qb9#=TqL$Y{{f6&SwFInE1#zVOtGScUGBipe2Af<`Fy+Qay8;Kf1BQLT6T4 zL6mSe!cnz9C7DAuD5VVtB1*MZ*Z^fZP}*bO$wy`!l_HU-pM~PuBsVvf%O5D@SyxmT z8^RnIBJpD$A=%2}lz=)BB;~Y242rEbx>uX(p@Z+#fze!(La+r-2DdlD9g46sg+5fO z{rC(hyi54@tmuEmIvJl8lKo-Fy*UF!80zJG`4RzNNbz#O-q>k-RZ1U+>~e2~#0B0J z0y|N}my6urEDiwHT|@dbO@S`;E>XJ_Hk}i@fo0%!M$1Xh!bXzhZMdJPQNzUIFpXq; zn>eU&ZsRfA;gz_7?9PKsI)nh1H8gs#5{+~}<>d}y3|hpj7Jzbt%MnB*Ov0K{onhM; z@J*E6r;PS;gjM3Buw!82D0@|2>;v85t1MKeDIzMrGCNk(e2EhGs|h|)Nxc^`J&yuM zv0Cl=jQG5>V80N-!Lw~Jq3Ub^DH&B=r$rcZ@um^--i~d{K$A`XP>0`~mL~84jSP|7Asa zKJm2ssl@w>b0~V@J()EI`sF4xzf~PE#ziU@0s4_-K4xd9sP;AZZG5=^6d+t9gv;&j z+!lb*oV{h`7z@a_9AcrWv+LW+0XoV@hTBn{s zxoc`o}_2%neQI{Hl z?;otBULat9w%7pK&{g#ta~|6AC70U@EKlN_2Jz($qgXI^^uO#51vG*edVCbPjYK z-(w?o7-O%T9flyOU|Sfo5)y{BORs2@M=MGU{)zid$3%j$bd6wp$QsPQbU9kfHw_=q8e+_#8Z>vHQ2pUkKl`9{uR+;M5XQYQ~v;n9n;Yi;!)dGY68?XN;=TP|GGCEd_S&Jd3DI*;<0+#b;qPU&R0hUpEcTmc_VQ{ML z*yUIZikPY2p?m0Rz@yENN%oItdT(sM-Z?53~{W)Xc+ zq6Cu{`7$p{Y!A=}A%GoLj9W<=wZylj9;&n32f|FwY*dGQ5i*Co-sxpELrRc-2VIkl7^x| z#ZUl|p_&9zT?o-xeCOIxC#)~kgDRQ-ikoZ6wxHrlw*Ucj(dH3n! z5y^~TrwEgd31uV*x>!lOKRQbDQ#@IE7%DoV3aAt|omwk#Kq@WeWI{-Skzt0XLNSQb zIT-%fKZGDOW`}X@QaiOR3L}6%)aD^S_8g5O38%~hd7%Ql0~CKT(I}}J@G68J^p8qt z*;cXRl1dN+TlQYDIC(z3mXvK-*m{BY;1<9mL#!%dh^0hxgR7(>Evn`Rv16uOoEI!A zj)r`&?N7X4hlwGz6IKfi?~g(Vhkb|utG!6TEnk4C<_p>q4Mc-wfjm|50g}ErQnq>L z#N^-;s@e?jgvwNkO37!tvDp&+H|X?R~Z4+_!2LB`%;cFwj76qJ?rOAV^9J; zdsL@t*24NR+nPfm5G-Z!tDKjHv1~(L^{E{U`KTyWs7n=D+Foz}wsQ{*M_?eN0l zxnkQU?AGe)cd`pl4jbgcnVhY?3QCOOMeLhsxN%$Ln8fLubtyU8Gs8UbZEB%0zxnL-ArJL=4A4DuO6dwShwMcIp88Sk#U{z7Y)y z&apNSz7xV{&=4tcSqiEhNNaW9gKm{HS z`?2APOQ-=DmBh7r?;u})Vi&ieCV7E9MbR^Y=7XIm2cR+$ zCe)-Ll0_Q<^-dtJxr)v~J8-LN#bzkEg6UC|VojzP4TLHMCV~{F3yNKR3qe0vH^D56 z)Se7P_l8rnfho2?o7hB$ASX1sdOe|dOPZ3Q;sdxdTK>hRF7G;$;*7vMA1t>@slPXeKAGsfGkZ4h43C6K{$hg6u|BDa7~zOf*-J z^|H(N?Kc}jaPXy;utQW*mx+#lI=fk!b1#J>{d06c}D7|tp+C^`xm ztD_X9f_Pit*p$rbHC5uaApSNO92mq)yXc3pAn6r$nn-#aFYZv`BdQT(R`5DBk`EK7 z)9NME&`F~4mG%Yy!+1=fBy>DI6t{1n1QeXN0_KO=z?pcLu;XlxP9>=piYf_+T|mffsaL3} zJO*EyM)9)XwP0ecTPQO`;Sx8LhNSFW*#r>S*j@>LLdeVxMSwX`0psi@=K9IRz@ai@ z@v7(Fm4xABV?dPISiH?mz2C0PN+|W@i!PPxRD@?~zb=+d$Po%Is6M>t@Xf(SIX zQ%YPA)Pam70*+$sVK<2E%z(zT9TL1D%62XAatCJzKO`Wi9{i1+$It-a`Ki1Un-Li* zY!5n_7o+s*AVDgmw2GD~FGhYWRi-s&<1zpE}ur! z?*B*IeE>#L{QcwKy|$O!k-OwBjRd$9ItihNqL74y(0fNhNq_($A%&u#pfm*$6bsl; zL9q*p1qDOt#|p%olTm58W6-?Vh4V1{NTXo9*;kswF1w9Pt>rRq3GU3->QOPw{!A&$EAR$$%| z^v|a;;CdrwXOh_mNi)mBx%4m!IdGR-0p#jffw@x4ZviyyJF%Y0wKd!uqk3OFG%EO< zL42*La#1&e;1n%*SCm@#!QX1tTs5e<31l!XIGIl+;gPoLI40x`moK;YlYcz&p|A9E z`Qzm`CV0+vVF|9onBU&uCP(v^12ro)AB?De)ieONa4yKqOxkl<4-rOjuc z>%<|WdV&~!;c7lGq=GjC27mf17e#Q{M*2MS>msbDILVQnEgu0cccjW~Gjf!IBRM?p zNN%DI-kv49H)%*bVFM|~7h-Q-^Oa_moGfz1#8OrllI1zIXe+r*R{AU)S4-&wy7Qar zS;d;%sEnugUOJ1e`2o_Ui+b3*sV|+;&8pUr%XNIH7rtkiHXb{B6fhwN-v#ha?BV_M z2jjPp_<6YcnoV7I#HI9L)oU+Xb=aO?fTzCUwo>^L2bYHn<=IkN@GwsGNZ4CQr`J1p zZL|!(yTAnv^BIR|{{rlFE9dsjzq;oPoY3Mz5|)^JZ-ddUvZH~``a7PdS2P7>3o-xU4xVdZj)Eys=c;=%lx z6!x>(?Q`(7Hnm}@Z%@_sj3VVOQXJtG$v1q`z~&<{Dzp-HO2Xe0$t`U1y{-9F2DB-j zyPa#${{BiEIB^y!~1r`+=JG}URTjzRrYS-zqy$i?B1d7n+q_t~=5s1rW*l+Y5n zjvxoHaxjp~Te`7Us9)BbzuCk0h3d!+N8lB53?^qe>LgWdl;+%E|6(5YW2YsLoHdV) z)ec^+XX5lgJ;M=gpVnjTOc&)^Prb*6wLumU`Zj;9OQ zV1rNLlWw4`+_H{Uw`Mo3?t#Q_aHKODRrv%9X)}D49C9HE#~0k7)y)&3KmOD3pubLmCi1Yf zA-LP4A~316JbxK){oNiil+YyPg9fk;%FD~!K-KIMY!vzxV!~MKJu0~ z86W)Aj?3#}LdVNn;6mdvzDaOmC~t+!j!0b;w%EDESn612ztMJ+b-87w-aVq5Wl}_H z=(PWqSLk@jH~7{$DI#Cx?JU4MaQ;z;(CMU3iTD@%$eZ(WBjOf07TcHDmRgsgHkVER zZ}o@^P7Jg0FDt^m$hugj{Abyrb$kNjb0eIKBxRPo-Eh3T@J-WYUhFyO!SO)5zHKx| zxY0Mv5@qx2(R!>kPLJ2?>h*2Ox|Uusw*=p0!OC*eDZ!9B9Z6UHSvt;2v~(GeUh9T? zIV#~8^Em#WcMkmPbm{~JH^iAE&99*@JMH_=Q{jh(>3GK9e@-CJZ~d=R{QJD9I^nG) zAvvS-6 zWp4jHVd#AQdkQ`)!mPfzIMr_2Je&N-T;Z@hx?R$dLtgDr7R7f5O z*5vnct#o4$m;O8W3Fh|#2H*vDHJ?AdI^LP8X=(T;!{r^QGGCwLU+Da1BJywbJA`zh z`MD!?HNE7Aci`3JS6wT=KFBXvCyc5IM`L(sx&07nA_@2jP9yaRO*aRT{9qy|^C6$M z7#>Ut81lu{Xe98uvWS^5SM*d@Dt4MJ`4}7Un1%k zTpoC{dQJV_tCe3OGWfUU@pi5JT7=ARbVz=uYvq@L{DO6oItIhh2q0WW2bs<|B2I&rGH>W17|+>Ead! zV`kkYR)Tb)?c5ga@+vkuSx@EoBDmhqua#fUB260?tQ67(%e|#mx`&o&+T+2_Dos`=kq}=;z<=5{PP1}U=!B4QCS__hha7#uVtnct@P z7i_1-hbg6TwLS@W@l>)IIX=hQ3OCM{ksjQdPM9K>-QQ|gLmrFSWThAO~ z)$Fy#Tcn<>{%{-tXgEP^s?4m`dGE7 zTI1zy>z6)OPasRvZ|giG@f!P zqS8xGbm?Qo(W12Ir8aJ=;&KdWe(DATN~`KAE)B9?c7!7JX|Ba!v}}{I=0;(AlDD^C zirdvbRN~SnL}7aw$?>vJkHYpbopE!#Q@eq2Ii`z3FL5^vex%+H1|v}7+wf2FH}i98 zA2Dv`S4TU+xGa+>tnbocNcwyg_h_+*T&iEB*6y-+ls1@gIi`t1Yn4l4ex&>xIo>Qk zTHAQp^s$;8r^qDP_!ous@8D(QY`lK*;S!$Bl)+<{xvV09jmmp&Q;Y+ z{im~GHNn51aN<1pzZe^wpMRfLW=n2GmTyXew`lV+@qdx$e^nk&fB$jf8hmClI}1)PS4QJ*j{A3oG*#v=rk(FLNa^}eVV>SPf*$JBpog=D&6QXBpy#2(KfUj z?MKJZsZ@^dW%?y_4SkS4LwC^ksT}vobl=insT^C$@F*If>9h;&MMuy{w31#=SJC_E z6LcHhO+TT>=s79}Zc?8_+Kgt>JUWCEom3plMbU3=}dYpy@}pIAEZyw zZS*br1^tfxN-a3VlzK$ay0j5(O|PWA=rCGA7tpnIBi&5jpdZo0^aMRe|EA$ivtF?@ zlXj;A=v8zIt)dI*&2%l@NH^0R^gViz#^BId+NA>>K_}8OI*%@+Yv_9VB;7{eru(TS z+$<+R8`E^!hW4Vv=ma{0UQL(KTj_oDG5S1xoqk9U(-ZU@{hNm4R6*J!h9=XFG?xyf zh4dP_l-@?~r;pPY=q~yZ{fwTZzte_pvpyNL2OUfc=rlT;-av1mchg7cHu@$#LcgUy zQ=BTP_P|$7$~fAb=FzKYF|DEt>CJR4-AK34?erabfPO_!(+kv&9ltE6C|ZxUrQK*B zI)WC`GCH3wqxaLt=?ioh{fK@|Pg5IC`J_Hxnn;__wzM1VOGnYkw305PYv_}78-1JZ zr(e;Zs0|0hIzpQ10* z-ShzcnvTOMvE)-iuck}see`kqB7KwYqhHb==mi>s6F|v7g=WwzXfHaP7SfsYF8VOt zLbuc1^ke!3Jw<<^y5Fov9a@(*q^;-`v?m=($I}veFMW(YPhY1W(ZlpO4dB37+M@-{ zq}}NNI)+Z6*U+VOJ$-_{NZ+7)=n?uY{h7*%wA8~*<7g*3p3b1x&}H;?`XGIphT#&2 z!V3DjdrBDbRaFJRdgY}nXaQ7>8tcT`YHW}%B3Euhl|G0WSUMp z(L6esj-^xSEP6d%N!QUw=oWgK{!R^Cw37PxX%cNoJJWnRlun?fbUwY2-a#Lt&(Q7k zUHU0KPS4Vd)LqZ4Up#F@+t6;bFC9fE(@MIKuB7kMPv|jvmi|p$xb!CN(~!2NU1>jB zMHkYW>00_Q-9mTJcj+h8+Q2N&LlbCY+J<(ez3Ff|k(SZ=7pVDLWEd86h8k+TsqYY_m+LiX9Bk3esK^M@Q={mZJK2P7E`{+^nBmI*`HZto~ zpEjqNG>;CZ<7f%JhAyRR=mYd+x|<%LU(=sxSYxvuF*JqtrK9L%x{$7meP6jMtTQ*hHj_t(og9zdY1l8UCqpT#nFbe4b7tc=~Z+ZolBR}+v!7eGu=tU zn{&OODYPZ+OncD5bR3;d=g>uT6}^W(O1IM2=m+!=JxGhtdhOj9yDu(D&#;dYqo47ipbVX8Cn#Tbf1t z(b04Yy`J7e@1c*<=jkqbn0i{9`{_~o z1FfdEHe6q5B5gw3(r&a59YG6e8J$O$(KU2EeS*G7-=KTw5&A9tnQAx}kn;gIjiaeF zgI+;<(c!d^&ZO7U<@7GPk#3HG8$JweY?t({rFIT6gsg@s& zrwwTa?Lzz0(R2!}q}S2q^gj9+eSz+xAJW70I6X)Irs18JUWPurBmr6 z^fP*bo~IY7tBYA)EKQ*;X=mDl4yFZk8oh*b+|v?*;*bLaqi6`e|F(?xVOy^lUlU!-r+ee_HE1HC{U-OT#=Xn-!J ztLWYI5&A6MNk66E(4XiZ)W~8vv;l2SJJ1~3pN^)JX$8HGE~j_Whv?JvW%@S#n0`sW zr@v8aHkTJopp9u8+LiXE!|6m?O0S_y>1}j9eUfgYZ`1wsEBYh-gF17}dPdV^+LHFA zBWV$xN$1lW>FxAE`XqgczDf7e&*>@p3)Q=u^{PYTX?vPO@yl7&uU|!{(%EzoT}|(! zkJA_Fn{*%jlKwz1P)Dv=o{t7-8tp`T&?>rsuAq0(4fGlM3f)cj)1&kUdV$*V%=$#p z2DAn3Nb~4mI*yjmtLaj@hCV=_qA%0k^Z@;u{zU(xt{!In;%Q@wpGB(WmO}^90$M_^ zp*PYy=|=i2eT{xZKd0Z*3)ILr%Z;Wfv=!}2`_j?0n9in)>234@`ZV26-=l}3*AZIr-$eXdY)?i&3e?K z3A8b7L%Y&Jw17^hbLkR#8(mMIr0oWn<>BU5)vt}DMRX>ePj95R(+B92^dmeP6jMtTQ*h(1HN(|75o^cX!$|E8`%WUfzotLYKWW%#vwkr&g*F&t4sS-=(`?$0j-r!jIlY$N zMDL&v(x>P)`WD?szog&MU#aCPvtAxrmo}oU>6Nq>9Y!b68T4wpgx*T;qmR+&>Fe}E z`WZbz&(XhW_*k|tO{VFz6V0Q8=vX?H&Z5`TmGo}jmTsh5=uY}RJw#8?^E7FK zS+6wOiRRNGbUd9*OK1h1ORuAg=?Z!qT}L0Fo9NT@dAftXML(pU&@bt?^ep|I+9sOw z6-i@hJ(@zBQu$4`d_T~RcA+`67ad4P&;mM%;zczopV@Q~y@{@(chGz2gLD&pif*N^ z)7|t#x}P4VN9hUr1O1umg=YN>T8H{*JPpt^+KKj{L+E&l*Tky%zJ@NNx6=pd)ASYk z4*iCnp?}fvA~WAuno3*ID`{^!g5s^6sy=v*qVhVrg07_x(`V_c^aFaBo}@oheUh1P z1Wlk#Xgius`_nPBn9ia%&{gy)x{dCp2k6)IC;BH1n{3uAhNjRAdIjx8htonjlU_@g z)4S+Kx`pnf@6$u{1U*mnDQ3Mqv>qKpr%*gtTP?4JbS1r;ZlcfA*XbVmIsK0QMs3Ar zzLB&(ZB8?3E*(S*=yW=lE}^&4_4G-)jlNCy)34}{^bhKsYSu5BCexO*3++jV(TTK- z&ZjrgJLv|xneL$P(S!6jJx4E6_cXJ9@w5?bL%Y$wbQGOTE9pYIlHN@>(XI4#`Vl=s zPtjkgb-GzEFRe$L(GIjb9Z1L0X><-Fez*3VCqXgcjo z^XX7JftJ#F^hSCIeTY6ox6}9NA$pSjLaj5*dPUL(G>vwqJ?U_YCwHptvw|+9x6pg( z^KY=!-9cV5cOvlqwI-f45Yw06&E8Ru+(l6<0`UedwGwTye z8`3s3i}t5i(P?xpT}p4K57EtZC;fnaMo-b-sC}kcA0JJkE$J1sHyueQ(<*ucT}|(& zPtup^JJeflmYYb^X-Aq%2hyu(F|DEt>CJR4-AFgn?erabfPO_!(+kvIVb(8_)}u{n zdzwT0)6o>K95>f%dL3O(@1zgWr|HY|ZTd0&l73Hrqt;5Z91l&PjcFU&mG-8?=|oye zuc1rnZS;QnIDLWcq94)E>G$*kHLA>dM$;79igu-a>1bL^XVb;>Hu?a4nr^4>(L?kk z{e@a*arx2)G>vwqJ?U_YhXR_*l`f>W(0ghAY%|>uI+I>YZ=&nz6Z9qeHr-FZqCe6< zsB;e6l_rRGO>4$@2ilzurK3ed)21>$n=Yoy#V}1<$M`1twCK{b9gM$E57Qs$d9e=u z&BedA_&p`9Pn*&9G@Fj56GRW5S;hD~F+n+Pcr@k zRWY1#(HpQYQx zXia;E@lWY-`Wv;(L%LWjcMbKAKLYRUCfAhkqo^i)`GZE9bWV{pOT^a97N7G3hKZ{<&;mhc4 z9DWz$4>7)p@mJ_Bv5}_jWBe=ngV;pV{$Sj3omoGZi2BDcp1^oh+JRyqxj13(WjC(5>`U`ab=Z+83JXHGE`yuu*hfDvm+Q`V@;m#hcM|+KzUl`Lqum zLPt=Xo~nFsI-#tj=nhqUDP2x)qj%E#=!5i8`XqgYzDoDd{q!^XCH;w>r+-mhH|rBa z>(Zt)jmmRCrTsE#PuiE_v5ac`XgZTt(d+09bghVf=3csiZlYW0^Yl#-{m46X58Y4I z^LH@*JI2q_U#MX*r*}~wjiu_jJea;24q{sl1`wL=xh-y z*){Zfs-EkE;WsnBny#lC=o3^u?+5ASIgygzF1n9?LXXo^^bawB=Mqte)r^NzKaHb} zMf5+-X=~b^=F>iOFda_E(;_;ZmQnTmAmqP%y$*z%jqrj4!Vv4&4QhiS417-L>$Ls6IaLU z$VwfbHJ7Dzl< z)0T;;SWaRiO+7Vd3Px&TF1Dz55_`N1KCnlDvv%vTqQ!)_wZ zN4nE|5j%6WABJjvaK54T$571|${Qo;;5ZTUUr48jXou-k%`e(R?XRJlZ?wxi84nkT zXrD!NnTVNLK~;O8z1Bz^-X#V!?H;;bMEh-^o5WP}8P4J}5=VPJM_&}1Xxb~Z586PM z_ZSiXri*Bgc_QY2m5BLXFJgXEoe=YzDPlhJMagz%oQolYT>NiGgVm=?!(t+zA>V+hl#4$?MuPx)5BBtric)p1G4q<$Rh=C_*hKSj)UoE$G8 zzeF*B`Cz<-h;~rNKN#Od;;E=V$Bz)vE`^Lw5zz>I@Z^a60qLbJ1A#!RcC9ip+IP%o zoe>D&e|*fpGPHgBK%isC_U3@VxbW+8`{e05GU7)^t6qv>-9-KIu}d3Ei+k~~sj3L` z7#Dwa=}YvFG3p7cN}*Y7#uN*lueuUZJ)tH3T6700tyytqsp<8y)DWlIr&#P?+c4rR zmZ{!+l#H+#yJg~Tl51DBz1ZxNofz^JDy3)DlQd4dJjm4A50mPn)v|LMV==;Jv&&0? zP=Of9V<{?R@uB%N>oHkT{p}^V7?WD+_Lt!8$iUKIyadZo152Pnf~tr{ixIR}Wop(O zS@?E&(WSM=UKu|I*;@PFhoHk|*gVM2DaW&62L5Q_hD{yZ+KdO0qf3U#!gMF$PXlR) zS1{PHVBz!KS8a+)TQMV82JQp9xGES6a`msC?GSFIJMxg?Qfq2de7 zxE#u=c${Y4YhdcqgP1Bx7LxM;j0=;A(86~hY(0QlIQDEo(6GITzfM`V)PgdTS+7Q$ zIQGhP-eFkdTIi0C2cb$HdC;X}zcjz*k%tC44#<>V&-XI?6G`It%*8Ttd@7snnn*c- za2!lP*ssgOyfnuliNxuV7MbGk1Wb{rNB)3ej?bjEn&^@8P)WxTiQqKI^$5~QDy}JN z-phk=i)Kwn^&Fqi#}LEzG13|~S+^`s+e*P^^J7jBJAhb3I>zT4Q{^bkS6rwW)1-AY zPkW3rrb}4&L?F3QB4LXsQnH&NVXH^Z1dP(INNMxPQxlCc$;IjEh2o8w5_WqQ%J6at zdp(;m<3@#q{hq(2a+MN}^Spt-M%7;Andq^~@L3xX4tV5<-Iy)mB#)ep7;~iDWKXK3 zpDW=Mj~tyFSIe}io=Pd}8VNV?G?Y5eD?o`YJa=yrl{9UA6=j-nodh#I z^6*DvfrPtwK9_1PlyEoC^HS{fGHG|TqC8SGVlt8@8qZ7Cs=;26im<_6lrS6YB?+^^ zwn>-`_OjVv=~BuotI$+V&k8AhyM*1IN|~V@lDpS)yDWsA683v!w`ja7`NVk;)Qs02 zK>B#p>LWCVwTo2r2C1OmX{?rGRo^7c-mOw~%{RV$vS!>SVVh>{B_*tpPAp;={sfFW z8z3h&FLz1)oR_r{=De(vu*EYHe~r5(%z3%ToR=;#{9eh$>DeOT`y}l4ERg!&FD>cy zluD`VCG7V+j$(}mq>^!{zZ^(gC(57)B^YrY^W!x(Npq-5JsMJ}$3iOgxLK(SQpgh_ zm3lIyfuAxP_yK9Wr=@T=3M`TW<#fV$CIf}IWZKPAVd;1+TEw%!YwWIvrJ^eEjwE2K zyenb0%6k&FcvJ=6moQu9gOCb*XjY)NRN$kRk;d)mhrh-i2}fvFd5eg#S4xkN6N5P8 z)A=aY6DzelC>7Q`tz~sTBw?E;MHcg62|GPmlIAm6sBX_m2_KQL*CQwL#^)0DYu1ls z#1~DFXT+ZfrW#*;8=S4LLuTunkl8vGGF!((X6r=AY@IY`>pfJ&_*QC+T}cFH!Z@`| zijr#)ZsVsOm}}L7XF`fP8&cFcvnaLEpErwA>(b9MrOjNIevz;fi|ssew#wBE<5vkr z$c2Hn#)Z?tLVgb^TL-zYQIRlfn%!_51QEPXU`GFvNK zpM-SstyIHQZD61loOZ`K`+3^XH8e+3b*=9EdpWMx1tB}?aQ z86bZ!Ku*vN+jJScQU=Q(43KWku-zboH_Bl7g8|Yl7`AmXSTYZjl^X*#BaBAOSMTJD zULmFT)TM9HqTi7zdZ~yF=Q)Vlmht~#ZMqmAPG}*kklComWz%^*h_=;%NmLpW5PiQg8vgwV~=U|jY zx7>m{xa2&dE$XUvL0z@Fy|wVUdN-UoY5H9)Z^~ZXy~E6p{&;ok#?Q8%8vXjPj%Op! zj@)p4*IN&aO?>>W$Bcve=o_MTEN+#$YrcDESPWcQW0MCa`@C)>F>P0aB++BTOas# z=Yzc`)!kIKy!Y!54V?aV{I|F6O?9mOWO2KQpUc)y^~SumA>KK?L;XIp^BZq{<(an6 zx)VG0dhB4o{_oy1`h02nlpn9ZrLuJ5#yS2uyB9evZ?E|M;*M3{Pam-1w}&q5I5%hJ zTXj;=E(s&iO7SELj6v%}$-+v=K=X!mlmpZ4VZu^ zTc&G#7tCHF2Vh!r01hhTAW1%0Bq1N^;VqhaOPKygL>&#+38b6AKYdcCG4k@%F_R}w zOdDTbl7{zX7p2LYH`Ce{bWCfV(W>3dHfghqXS8WO=CaXaif2rmUR78$rer)`*^W0B z{$FQQF&8gJOmB(*hhz=vkvpUSujrm$Su`ye&FY(*oz=3Ua9T^eUAiS+bFD_o%MnXw zw48twhX4N)XSV9tZhXs0v!@s1y`idT{4K96tq7Kx(|^#A+z}Wwr`@Fl6H6+J|0h)q z&c={FQchOO!lGHl6Y*-t|Is{hz6$Yf>!R|Cmb0gipHVZnKLjNtBAzVm<44O1!%wnEQfK$sKF|#8SLwr^X2cNZ5=o>5d7m^fv8Io?h#gXQ()c+2!G zt*o@75^t6+omf!OpfckUUE4WK5235|H_d9DSXPTO4 z&3vPE@XhBvhv5A&bF%TG`l518CGS6BYSF~Xf(lK&!#QWb&;f%7;9bS?qIkR>9`Bac zO3L`c&;RRXSW!N)C7Qow|Di($56Wp7a^-KLCNF%}%(sDKqrmIAi)Lyic*Ex$ZTR?U zMY(t#b!8sj&8(GFOfHx{9%=E8arJsr&3wtdcBxI!jH&@tJGW|&7A-8TnlQacE1f-~ zsJuYUXtBKYzM!mhHU_9t3(V#iT!eR?PLTy(QF}n8Sp@Sk7gw9s$o;anaLdc;%V!l8 zYJEzvs0-A%?zk6EURkPLwzMY5>#Ykaimyh+WWkwlgb$X>Sfx3xFV+IQh&nhj7-f|% z%QpCSX)}AYW05o~N;2P{IzVRGY`7Wn26Vo*-5i29RIB#}W69@_pCL_TzOMYT0%QqH zDlW$&!29HJ0xR*VVubY`C%jH(Wst7O5{Qk1He1J;KD{fFlcDi}N@Ye+8EPRx!rN!~SH zP+C@rnpS946-9*wDly(OUo@kz=iotF&p`tV@`m_d$5=`?R9+ z8F(8xwp_e)UEUjCRVM4+G!$78T$#0kY`i;MT0^a{HH%YqJhD6|s)j%hR<89OJb<|r z7EK>NS5tor)aKb^K+paK!8%=fkv$fDKfKOeEvT9ewIaB#h774x9U13QC6~?$TadX4 zn}x`{4<2SVo4IgN;*0|I4)#myLNNCs(vrwQ`c5@(HEUz{@s;B>Roncme%<@z7HGLx zxyx%hVcGChXF5q%E6%1`c~q;YqWYGp3bHF;4As550LRv)<#Sof>BS{nM5?zjCshds zpxJ{}?R#kmw`%si=*#l6`V^?v&FY>tU`XyDWEY$vwvDP;LG5$}@@_Cx1U(s+ue>Ba z=YQcH@PV|FiDgw+V84gnAg!bg;+0dXN+$g0;geej()w2f(y$-CV)BftjvWJOlV+5r znLPo*C1(GXHoa)Zjol zX{LoNCD~1&mDy5iv*PkpeZAQ)m}7&9uv;z;UzF=x17ru1>yeYwDbPe#pCMR}Dgu*A%L91Nb|6>!!$KUP3@{HwO3N#n{x7Uw|Igobf9X}@YTN#g zuPU#3H@W#<^8fr6^8dq^jwhHW9CFyGKIZq3i~#ez1>YwiEGH*8SXH0e>13RI8sncF zUH*6JGLR-X4T9=kfw^+_&QEY$3&e4)q2{x@0nW~FKr2b*Y)bw~d2$gnI1Pf@lSqJT z2{oT!upfp5!!pw5MSeA@E{*GjVWH(7ZDf`s<)ZkSa<4)-G`~dTcWtoILdF#{Eb}d& zby29JRGc5lL;h9LV7eYyKr@*}2&S8lFxt2*IO;{DYZHtxokSz?FSslu{yoy&ECGIk zbr(abtySZD^j9$qU*F3G88yF{HPt4e`MrqcA#D=;1oI2VgN6?O-*`7~FkeyLwHx}8 zck70Jtd}iGNslX0As?%HOZ%k(R+;0=4*l`vAVyp8N7_Q}fsl3;0DYKlrmxVq=|1{7{fnkz!ASm{ zseFGd@nLj4EunL%`ko)@Rx>W|aF^*GrCaH1^h0`xs(U?={v6|f({QYWl1~gxrY)&_ zYbWD-(xr40eTVL+U(wU_0<~i$mV6>!V`wr>r=6(W#USYh(Xmvn%gXRs^m@9IZls&(cDje2r1Djw!dp>Ohw-^=L*r(C%~~9ZRRtrF0E_ zl3H;ES@Nq(8`HKli}s`M(?j$GJx{~2W0Cw~X)0|+ucW={2wFt1r|MmY$mbr$AEnRJ zU33rqoZ9e}fs`Lb12hjicNspAPM{?en}xcUv1RMb_JNR3%{_9hf_KMVeve$MjLcRU zZDoRS|Lr|;O`2infbSa2W6ma8j@C^p>ydWqOqMOrn4&dWkY4cnlIs3vG`oL~HSN1C zj-3lqn&oLJnR!`x7k~TvVza!=yjF$y1ZK%E;{}$oj68u}1^hWgx{M&@^s-#8Lv+=JG|JLE(TKu~wDKpQPcY2HD zy&&!5y%$p!Radpz{_UBCtE+ouSeom5z0K@Lbr{x6KbrEArP-RDT0jq!_0aH7{==N~ zsFSxk&oO0nb!V@hydWOh&~`PjU$GuP>>vu%f(p1Cfp=XaJc>(TG#t)pQwZZc}<8y>?Tn#y`|b@}AyRb9>;LnT@%_)}t&gdCCiMRJ zlqE$=vHYx+`*Li1;(GVYyQ?_1_gy_Q@+7a`d0MiRor0Q}c}onTZW(z=d3H6kfw8vIV>ZusiY6+DVYBrm}aLexX@48);f85YsZxRTOObHPw+Ub&YRpTC>&F z?YmhHt*-7Cupfa4)(>g)h+Q%#ZlEYEni%hJ)CTJ}a}TAEmoTAJGTMrGd*IAjNuUi&XcUs`s z`^`0a^Q66wm$T0-uy~JdJR51XG`Ad-p^RCIJeT$=d%o12gm8j_B^-RYE(-&IvkKK$fB0J)sb;PJJU_m&Rlfv+1x~}SuwpN zT`Npst~agn7GN#OR5h1!wN*)ZP4co?miOqI>MJsuF*b;rO%Q*F)mS9d@9Ty^rQ=c-d*?S2sRqQ8{AY^Qc+ffnesY-eUp z)R<*EJLYBQI`+vnhxIl`m-gTJ*p`T95eEl5-|v1;?%5*`EVq7tt7Ua|%ICpUk_Kzs zfTEWMI2Yww_eJ#51Ku+GQSJMEmNmI=>r$FhY;yI=l6AJu;$)``{C+WI-Y-u?bvt7FRIXDr`iKiDuMPuB2eszugRx64SV zwwGC&8{gsfpS^WnGR~YaN_y@M>2H?hdG{3emT3~EHbd`Wy-nK1dbgg}EH5ta%j#9H zbl17Jsuc{P>%l;b>U@ zs80>`sG;tZ^Cw*@Zm75|<@=LX6}PCkmh#O>se$(lzPaA3UvYYiBP|1UkGIHkvB+9>DU|0 zbLd{Jar99$AFWBhz2Rqdq&7Uq_ntecw{|xBbx+`T%h`8~kGK4Wyx%r1Zjq9;Ru9%_;Wmx}o}R{l1rtGY!J+ zXRP*%7+?6n4b^K0-cY>`|0-tcXDzPQdHGno6RL5qNqcD_Tlz11BQD!J8GBs4wcGES zDz)yM7l!%hmNz0v|HHOW|7FWeYfZgX=$6p6Hgl^jZ`Ec;Q!i@RJLk=~#nm&D7FXXN zxvDxLsr6<%rj`;ltOE(HGPg&cxhNMqqOlU-V>e@VGv+m8vV!3Ai~6gX5p{(G1LGYw z3+_nPb=;t0wc=iRyT#@(45!m6U+ZI-&F(OqLBsL!`@_R6_=vj2Vk>Ojx^$e z8R1RRQtBtgyTV^sW?p*1U)_&eGW4e=YufTbxGz^K!Vm7qUs#C4Fq`phcU;{_nTT-0 zl^BT|;>TrTNGf_@OFea|L3g&mFDNV)yFARwnihkwJmyG#8Q_aYzN*x7BPtk0EG%6S>;@q8j)ifvs>94k3*JI4LoMxR@t}SdZhn zjjd2_nX;ZnyV$C#5Dc?fr{j>Q@Q!ApLNg{MA{O7pNr+6cNDXbimr*186iXW{O{cHT6hw+G zBhmJ5|E*0BnQB?l8^4;d`S*=RY?@^kuIGsRAw^vwh z>W^RLMET`KIrd7+nXb5;=JQ|WN36<%rKvgn{l{UfpL z?T@HD-Ld`?Qo<$`^Tzt+RkQZTR7!uW|0=AU_QzE$I@Vv;j@T0_78C2Ah}Fpcq>9DH z`iEgw>`$p!T&#bKEVs=n79Z4~Ew_?k&hgoIbH^ur}OX)5ZdowiV2^Qze6vHr;! zh(%ksV=Z_Bb&(Y=)>?^qcqZ0AdpKh8D&=#r{#pP4f|JpklAY`hSy@0Tp{S*8g@gV#!tmeb^hZ{-Y??-c{wYI~G3~!exAW)dj5j z;WpVEtQnYp$M>?4S%;(Aj?={wJkuD#A5l5YdP`dbe?rYP>x<11JR^-0^B5L|*Kxoy z4U5v3g}OODvB(uI&G#01AjhXFqWcoiGdT{bR2I!6o8~o`Ky8(Ew3tz7HK*eXi~J1L zw>t?*k6M}|tod%i;&6PWGO_srQHXr4B6i=s*!UdZSi+Iap~bw5+B+TJSd7i!{fdmT2T;i!Ih1f2jf; z=CpsSh@r&{#fEBg*sNuk))$9$&f&0{^X->*a;k{#`=kJoFcq=*&i6qiTt%!}+;dpn zy^ar5ryYO0Oti-gUy0^+?6*o|#P7g5>NsGP#)@x%vK>!>;WA#4_oug!9oj6(PubGVwj zW9o-H@#~xze!|*brfn*V*II&_@hG|=Gi<{;EO}U8 zMW^T-C%Y%Bj+Ngz<9e)U314GTd7Wi3sJd}2R!Zm04^;-4DA8HI3t^kFqanf-(#Jau zdFhO^Qo{J*z$mPZ&ZoG`2v3sX(Z)+15uPmJ z7$XT?YuJ=ukS4BPXEbeCu^kIG(Nga{tPf#RQ;}$arQZG6Xu_sRWRazwhSe-=dM8Bi z%QTNvQzlon57Ru7NU~7z1!g=t7{@Qu{*uB=<#&tD7cp0^42*NjL}-qN2wR`PRl4v! zSqO&Pdf=~XxTKIx&rD{$6;%%3E7K*e9xA^~3;*~lM2ybpH^cYKLP0ZN356e!DZR!} z^wHs;ND{ws%!}}+@{^Y}_0D0Y!Vf--uwSotRW>4rBoe3BD{O|y;j>bLUhmK(L_V`& zOcTA{K5UoaMUg``sR+Q6Jw9o6TOw8k_->d)OWL$(P>=adP$AXsfPT3!gY;= zn;4&CgLBQ3%cU)hchMTI`O*X##))nSUn^=&tK!((Y)**2pL!2HQuX>v_pqHP{PM5jNP15@v(FBw;q#HVL!AUN#%-mqO(H zirjkbG_IA(ZkMpzD8T}B?U3BP#(GTU!u{gXV1M;S_*Ka#&bSzd@N4amJ|4B2i1F66 z<`{H?RM6pct(MEd_3`sG*R4`@t-ky`&2^iE@$qN+Goit}_RBPn^t<)HM znGEFbI+ch>LIUJyOQE$H za(4YH!G!NHpKVwMN9!|eJG2*+$i&**l! z^dFHrRyH!Xt}5zNU2Gi{(ba*OD?&vqK2=qZidcQBu3lYL)~9-nNL|%dtJ6u=hA90u zV`-Ima!F^fh(Zq&gN5FZIXTr z^X=3cI9(0(S(5Kc>5UtyqVapz$%r&o5u4V)?Ml}lku+~+VsJ~QQTb#r(uRndalY%M`){EliM~i# zztdDC;FC8Txmv60rfN=Ua5PI>y&p>Q>5{OW3bUT=)l{}v{5;LoK_7xdPIKNfb=fIP zPw^7k1uLFp8&D8U)>Bu`lyIo zYY=et(;YZ$FsJUX!kqa5Dq{0pBS#VgRm5qw#2^)M``%B%n87OIHJfFKiulcD8LA?2 zX0r@akwny5HsA)&xZ?DUQtm@iw|KP$X+DeWck6PklvjwmlJ(y)uTJ0OL5QU2A7b9( z%w^L?t<{NU^*ZX2XyHD-kv);Dn?4GWF}`C7i1bh^#*|pO3(?hAABL8i7b`zca}8I` zw!)`&*dtV-PiS@IOIFuN-Hp0g>oh=HFO~+izT6$bB`UZNdvo_v72JzW*S$;yo1>cU z<=?B)p3h%_@YQnm;MA<8*!{Y1PDT2J zI2=kfiAa1@rj_kDqW%l@Wm@TZBN|8;PcuLk5lIj9!?Z?oT>OYgz90FxRsInv680MM zzOaZ?3H$5g7H2J@p@ie=;}R(WZd`(AZ|B=;P+*Gv8$)Iht4(Q40a zH{%{0qy&$SWxQNqQE`u!Fs>CUSm%1VUSW88p?PkQZWTY%or3V9W5~&7JS$DO{1vHz zQ4m0Qg@oOPbftA}k<$jRAwK}Evr58#tZi>&e8L|?F@Y!fe#ttkFY1;eqczn6o>U3j za2g1jc$%i7D>eQak3`L0K@h)K#_rzJ{3yaUqY!%URV&f1&kL?bCIsPi*m|R=BulZsv%z#??G-<~y-Y*=Orpu{4}M{LVwO&(Up| zDX%ZH10wVE#%QHTUlKM8`+WTs;P*x6BVtvTy%K%TqiN(?H>RoQ8-?X-cUWX;2T&1d z7F9cG2vs|E`gQ3K(!4HdWa^8Tr;#W|%T>Q{+X+b|S3ymtvl99A;$Y?1wm_^TE8fo{CG*W0VO-V3~ERT>hp;cKeX=H&MygW@3n$etZ8G%{4 z8tYZKZEG;OEXt59Ymy_)F{DYbV(Sf#y@R>?Qc_dy3l zqSQ2rT2jCpX8jHM#?NYp!Le4Ud%WDSR_uif?_#Ecg+lv!* z7>r17l?oR+q|h&d1zT~m-$X1lowE){$wl3gSE`AA7W@20uwxzOoR( zz%?jV_1`;D7q#3B9Nl-vsAO3?5~{JRn?yDJNorbCQ0Zfizw>KLCD1@MMFh(GqXyO)L9a?85fWyDqF%% zV=@{bDo4UNt9cCVAC(`CX%iknj~a;T|8Pw{1I>KCNJf%DWZ*;OzVJd>l#i(^uxQaM^J<+OBF8zR-w>tOaA?DU4)0huNq8XyD zvdoj*QpaLMf$F6--`5fury{z~j|ChxUPUavJF!cOnxG<9tZ>tYwY5*0QNyun`tm%tmM)SsZk((?VFecOYx-81&mTZC4BJE~{p>qAtEA zvTmk4dIe4(>)-kaDv5`BOb%0IaPiBK?>h<}Rg8f}KWYtCOR zVW+Vz8DVvq*{ykGCCI{*swUjX1_tA9WR5*tAo}wilKIQ1P4pKHk+){NCgCq7Y%{{K zPmMk*VW;7h@K+Lc8;2y#*An&`UrP8J3Hy!X5AD3{V7W0Dl|D*2Boed!BQ{{-kf6r%u(WQ>RXys=M?J z8|!Iy3&Zd;(Jg4m5I-DBK9iqK@IBo`6ll3otca@L>2`1bB2R{KCIlfTf4B&Ki@uBCp;CQ~K8mh|^opRsT8x z@p{Tofb{|r^iep9|5Q;sN&DcJ{?h~`>z&Zezd=OXx?2x`(*^kT`*1P;83F>qhBbHz ziRc^*Hq-)alz7)$^D>kFEGacqk3#hHpDkdR{(K0)IRb|32%UmQ+#nZS|0M!W(%)eb^=}g}Pj{lumkOA#U#7I}0#4R(R(-^R|r_B`94Dbl>%xtuPFO>3RtAC#^C#ZXU@sSn+DvO zy9zlnU%D9Sx54Aetw0Uga`G0a<#rzLbwcC`EMk=Ms;B5ob)?;?8))FvwbdfHaA4`p zIh+Vb=73&iAp+g6hK>ilf-d-x`i1!`>FeLhO^LuN(%*GwNDDNP{wc)a3pA59%up^X zw-9*E&<}$ER&(^?&CpaIz*=&W%}`Y(z&Zllim}n*!1|wxpokfoRRVA-0q(wB2L}wC zMli$-Z5joz;VpnNGqevACU81IxfyyI>q}rGm(?mW^b#Ui;4H2}^=9a%2>@sFbYhtq z;=im7oI}uPhMvc01~xOGwV0vdSXTq*609~u^o_t4f;DDnBz!w?KEYZ@gFgi>Z~)es zq0JcQz=h;&Fhg?@$OBtF@am0bXxUhRTmFK9IADgj0}R|X7?Jm&87f7*3*5&Im2ul z;`0FB;cn^!Pv}}WT;MO{_^c5B`*Yy01aVeq4PsB=T>@o=UMDz85O0O%V}=Hf5p=LZ zkHF~z?-3+eA#V==iQq|As0Z93@F6+LR%jDl_alNXRw#KCz{dn#tSnf z;8OzI3U%oL@EL*M3XQ<@E?s<>W1~ne@s9;F3ezD{qIRbftd&;^ZdunGkZY*g;<`@-akpR9LKpReQ+hOLjoX8vzvu}P83?*4BDbkmbD5dMFN z2I)awx$^%@KvD z5-D-=b_-_XL4TfS8NAQ!ML~2EcLUoU;F%h3?ZrS3``V(%Vo3ahWvjN%?d(twJG((2 zNdjlMhyB~Ax3NpbB6*YU0N?Ugh(=rVi$egW3)reJAebRwo6dz8f2DvO+CgjnnF4mY zU796em)qId(%I|uJ@6NQm4^?vy@GBYLJtE~aHSOgd=I0zp5j4)lcU`_hiiAWhhaQk ze+qZS;nd zNt#XjmkDt6_n2q?pip0fIpn`uMy^C(No{utDAo7VVAsf{l`=hn1H4D-OxDjsAOEc~^i}$yG6461 zvw6Wawatd#eco)ouBDs0kDHyW|5Ofek0%dZTcGC=+$*47PvbD&C!kSpq9yMauuhk8 z&-s9Wjk>4~;2|-=7X1j_Wv`sWZPnNH19;7o3FB}FM?h%?E(aU|6j!t2Tl8WL~{R8sdw14 zf2NdUQu4TI&*h-LC+H*7<}1zp?@PVUO#87g&gqb0<$-WvFqMeUo7r zquX%W$8e@_aLGx?QZuol1?%agI4}7EVKphZX(t(}=yOn(ZbN;u0JN;!rn(&QD0rR& zlY7;*nD4sqU**HXA`%jN;{4jG(MV9n=l=DD!v9Nl@H*24z`FRK@J& z7t|q1J&jQde#tVO)ME$>!LLYnRxKFm;Mb&+)vN5xH>A6$LE}JwOS-GtiB1InL0T(r z?Sua$Z7c5Vga0D!SLbJe{*H7&Jyiqxd(uJGeIAZKQU~08zDy_gQF0P!=z9sq2*Ab4eUq@e3r;pGS&rwF z!Kp&K=aj)2?anEKmCQZ97nIF*=IJ`0=#};@qw8HAK%2n@CbvlvB7+M} z+4}2;X}UT&3-#((*}uinQ__FHdxJ{^q)Q+So+3+hj{buJXQ_aQ{tyu^xLlOUm)I9v zDQkS8{sUcjgRII!^mjb~PB$6hO7v?z0nQLmrvKR);7kGK`uSpjjRLB49^zB*ECCDj zn+Q+AbEKVm{V+AyBw(5T8PPYmSwN%aizb5S3TV;$VT|ByqUbuk86h%wyMPV)N<@y} z9n!gtdQu_4oucSg{Ry4>L9x^}y#t%a;6t)Gx?Qj2l-Vo$kGpjQQ$P5ajQ+iP8Qte` z0rzR1L(b7*x+m>+P{2QQMg_nj*{XeK_r#(Te8cq+)6S%(Z;EXEQsF)Zk;7tzc+(zE zJH90{5^!mZ4o9yVc_r zLBWL{TBaLsRtK>ILm8tp0;@3|l-MxCNXf(iZw;R8sYYJ6)d&@03&Z-Q4`S>?Z=tl6 zH5BBtB-8e!!YNYzT!6Tvb}{><5|D=a1x}apGHI_0F97`tX*`>X8IbZCA7D>X=XV2r zkon2#7+f*s5NTVzxe)XlEQ3n}SpQQFF9w~i{)Bj&@)q;MsvhSYDeo}fQG640$`R)0 zs2WVFl)s)0I-;&aEJ``b{CssV4Eh-9LiHUcQOf(Iho}*7&6MM$i_~7W^#SP;bti@~ zfd@ZdGc#7xY)mpQoA- zj8eY42J`}T2mA8OnNT60k|9VLVehm{Y*nqBAE0bTXF%Y}I{e z`(*PRfNh$uZcouBHQ1q3M*-LZcIqoIxl+2D*Pz%g{qkaf3<1~aVLbqPn2&*Tqt1a7 zrevB&0B+IWaEN=Fe5c9n`l~Jgj+q5;w_c9rAf=C40&u^6pT+u`rvU8L@23Mq%u4_s z)BV_=e&(G3Pw5;EVu8ufy-yFE0MOqw(E9_LzhO@qZ}NeM7xhZ|!xYm2=N0`U;!Da@ zb1J|=y_7vIH&+52c5egI zcNuvcU@4r$YxYUpr+~GEERMI!istf>^+b+*TW(veSk;GFh+fdHP_)^G z&MidS#k$m&Ec#$Omh5ijAf1oeZ5&I|LEDuSNvkO?TBs3xc@lxn+pb`geL2}Tq4RX- zc5IQ;zOnmRkhyeqx1cEWZw3Ftg1o>;&rjm7!lY;JvjkCxi32N|Mi$hikl>T;4?D##YtKI@oh1dh9HcNeVE7qsfHQaTZsyrF= zdMX{Sdh`H&Cd(wK+aNCWocfVaDfII!&~hr3=n1`#@RWKU3nk$f3Xk{3D$*_WYc|0v zyxrUz*GAgzd61ZPMG)(bx)1H8UCF1A+#9`VJ84@y^86+mPx~D!$Hk{zGlpf)nvJY$ zBj6iqDxyu=Zqi;OYs7R4ym~PTWd~r*v|V>0GG!m2?CUa-YgkEG2Gg#mn7HJ$-*0af zcM~f`#obIg-pEqJu(YM!@Bol2?nd6;cE#PYish~8SQFCzKrwOQv^$O=b+x;bm7?PA zBAskx@xS1N({A%Zsw?hxKL6y3yZb4YxBgxOaraP6dUhfrxS4i8FTJYf9OOU1nuhwv zT+n-Iov`{9BGVow?Wn#i^9bo2wHgxA9wi-7#}GBr9wVKvIxGSGI1OH?;sT(bp!g!S zuL|^&SObm6)XVUWw5M3+DOHXQT-wuA^Fa6Um6MFLXTCuBk9v)t0{U6z*PFe@Pc_o^ zQT`UtQ;f7flHO{DvgV-ja|GM47o>1jmVL^ZF7{#d7Hma#FV+nX>b%ey<zdxXyH%Ld+=c%CIWakQ1I`#r-he=m_E*xMse#NtT8X;fh8pL9evi)ue(MRLjFI-f zbkYh9LfN$A(n~A!8KzCz2hvR|)De4+v=619R_GpxN&6c+lx(?1rC>4VNEg=uyZ5H~ zLmzmhH^Z7FXx=n15~ssrhX zqh~1 zB2#XVq@PDnV#*DY^eqIXrraP&=am!Qv*Hbs^a}_kn<4H5(l2J@#SJV6@iqMt`a`)D zDnoor-%iU{TA`=mUFnw*%(Oy%<^x<#Fv|+f?Fw)O!E7tEpITo<16ElfKRH(u%(Fs! zI1#TQSYU;A*8yDb04%aX##Dek1oc+v6@?0~E!DI_ zV>->CJJ!$(7plJ<3P zS-HdrJw`fC-NqIlC#_UI%pQ7@y^UAL;ESQBNOw@PLZF`}ouI~2*=HTlNvgwK(EB(A zlT`r26MB(lQq=2MVnZ*HPE`Xi2SP8C?xu#r=%H6gr>Xk}fPU2hovwCaT89pj4yz8N z50OSFWn1nq;M8jBO1DkWzL!E+YzAUGUqI{ati2QSa-Ibgf%$SK`zu(=||u%p#-^v zvq;auSx_iZuAbEEfqeiv3TK(_!+v%)AAy53>QAcyx(H~|JE^&Q*>Rozl}*|rV7*?$ zarO&1RZpNZ1O%L>ucQV+0UPxB>|%;ZH{7Vl<^vQ8XPeQPyQ)3NkItO5Y4Eympon)a z)z4jUDYuvwFw}$CY6V7+_NrkWL60OIuV!IH0ut<#Rp+swN6`W)>Z)4MqiNN2yeI-! zUjk#;OxjOruybH6?{KQ38f2HzOAXbrC+G>Jew*Q(@5v2?|Oi)Af2yxCnZoxdWhmJmcUHXCGOnjOAewP4V*ajeH`sc{SxJ6p-_0JWsOgr_cbCR^vqNjBL zm?vPJJ`K?&aI#$Z+@SgEl|Z$Cjar@$SRi1N{t@;KEH)oON4My+3IXcnTHY?b#|zLP z;95Nyfh(|7z;#Av-oRxIF&7@?P{B9M9ipeK#<7TMmk=7f!LpMDNnJIR0Q6hv7K~Bb&>`8GSZ#Y-_Ve>rAN4y!U%t`PaxvZGc9KEdg9Gh;5URJyn&Y$5v z{uHm@pAWD`W=jM-;=Xlq@{c9`!P-#J0#MCz4pAJK<+a`5wG0=^EbnN zXsDmp9>C%Fos`V?+VA09F5@bZQslKA%=(P$O`ai^cx`R3t5UBWSp;;upmAQC z52$3^Y4Qn`GOzvlD4=^y4t=B7##_mZjQga8P52+1Nk9*{amH(R&I5W-(4}6xiWYfD z&~~rAlv?jK>0Ud$_IfCh@u-+?C;Fg)9uqxxdF``k@W+LBo!8DrSjl)ocsF|OPV<2F ziJrH3?Z@GP8T$p@>a|To(2N%Z-R`xw(=IOyx)YXI0CY&u-LNNC?!=q<` zZU~-3!XwR_z>^;shDS;CF?2OJ;n4!Tx(?^m;V}Z@HH{uF6_BLQLPQUbH48E@$BaN< zRtleP{)6K9d|CKRdA`h$Cr82?MR%``j|b;00rC2N%062_l00)8KF8!Ux5;>BxB?dw z&G5D6*9f_;de=!oL!SiOhp&&y8-$q=-V>F#ikusw^7!ad_(lQA`V@?M`1b;AU5X(I z-y|SK_e%x1SwOnn`3v77Ak1eD!+#Lk(R|t|e5)vvBTwFjZ<7JOML&&+9(FzbR?X+2 z!gmPgc6}OrD}1Mn%bofyOxo~W0`Ag3i~+b?z}@=uVt{)D+@oJWx5M`exL5y-i4wj~ zz0r%^n0|4A<@_;@WGcWAUk_Yt|xJKBWBoAraD>cGl!T1w5?J z9t7}+fJZbR{0~1W;8A^y9QTIRW12q$2)j3|9@m#*riP!8Vo&I11cval0-n?taJcsg zcuGIb5qZw!ZycW17jT64oBUP90sSf5E_}dL0B`H<1pv>RVSpd(8!)-Te=i$(4H}okMz`GI^y!r+9>qFt->7zbu z<8LPA1hN8HQ^KE{rvd~U>WuK0G6@ZNAU6D!RPo|RcO1^I&2v#I!8-%TuKh7s+pO?E z%@?uw%VHeP=JmeKJEONez7Y+Cjrmv zY{aB+vS&6-ci6rp0icVAb2HhrKaU5}9^Mgr%42^r7swX$qQ{;(3Me4YR~+`(Rfy5y z6w%^skIggIaH^npJhn{UG(kr^_AL5$NS-n|>ai=Z;Dy5;Sj70qV?T$$9quJEKk?Wb z>ASho-e(@Wl(xweDc^bQZRF((`W`Lx04fml12k&@>Mv4$^4MNZt^vaP#bcjLROsPl zfL}d!222wk=;4!rVaraY3l5TcC6;|X-FvXq!=rQOK*8`34^I#A=-j~?prOLsWZ6ID z0}T_j*|J|p;0_lFI@hxEu~80>@X&p>SoYbSf!tezTP>UJ9UdbkFS6{l@U(ELApE1v z&h%Km$w@pJ|6y(;#I zV>SRp^fy>_GjA|A0puHL=fez1oiu+a>i(A0ZhNmyC!xKH&!KnnXF)Iiil52`4pyQ0 z%xxy0me+4CfW%9ApAz6y>bG5hSN{dBnt7Rkc>NjzVdf42NpkBy^Kt>n@}yJd6#{Iz z+n;%*fE1(mO^})3WixV_ojpyW1(BH+%VZ~$cuP0N$&YbrW5tt%qA*nC+kXey~ep}Dz1vY*SR0_s@-{@ z4>3QY_+YQ^4buG-mr>uFq;u7Un1#N#N#`j(>*bR(WSsG`?h#&F@2?iXiG1=rYoVN- z`s8eRpjr&weMeb$ken6!j*%WLXZybQNDoovP~0bH$U_z1fbEkrZaZ2IKvw^-#On)>AIcZ3?91Nu7$GE3CdYS2GYeyRM*%=atlv6_!@`wWR~ zWBkmI zH;n!WKaq)!M|*A_0f+GQ^zfx;IvL*K>mxzI(BG#3^c7%gE{DE|0FS<%L)T9LpVpgJO{XL7E_D?IjRWc4JSq<-lPI%_b>B&!+dQC2o-TYZM1$jV{e z6tw|6qO9JeQ&lIn+lO>FbvY(;R)ln#+FlR3AL(>;8Js&Smvl%?MtsW3Bi&t{0rO|& zlg?1@P66G28tAY(un6=3(mmAXTF`~0Gu8Z2pa-&iPn8Tu${Ix4Q6~E`m~@u<0-J%X zp`^3b2zt&q&gJmFf<A@<4`joNm5cT5#&=W`(smtN*S(7-V zCF<|+maNIl=j)Rw&ssYZSu^hfnRWzQrugh(9^|M)m{{4;3qze+0D2Tln<@x7*`rfI zdsGFaWs8Phb$2dk(a@(f{5g9p%f}g3y$vw_4pd9q*9(HPC$6CUxv)(3WR}4*Dp{bX zxbk;n3Cx~K+N1ix1GA@*w$!ueWA=2?UUe&GUG@z2+NXy02R(;0+S)r1pt>XEr*%QI z>AkxB!nXLb{9fs-Yp8QEn!Q4#O?3*C>LniQQK^_Uy~JZJ8RcH$v0hbLhkS?SC?lhi?$k9sd&<`kuEwGOk=&Bu$*zJyVF^;%DT8f)M`IWu!Hk<=N`EoT;WHq;mJ zz?>>(iNKy&7IKz{lO6nbE?;2-=}<#n^Vid#G|K(Jvob5 z->dHG0=kZLyt)SwI%hHIB-JAy^b*p^Y6+Yrr-9wF)yY`tb55Z;esx_Y=%u6s>ZU}{ z%UC9;o}37JIq4L&tP|)JR3TOQk(1L%I!$$lgXgSbnUET*K{t`^t{OXnZYG_fww8cy zAstq;F`;u-Z$aH2>MORjhWWkK0oGkhx{t~sy^eHWb)0=!Pa5|>!=O(k-A|o80rY9q zIah5S2>Nu=d8!QSNzNH8ldmqN4rkIrxT>U0&Ldr6S@SeNX~A8^E{zB1lJM#-V^GCS()=7 z!Ly#w*I1Tv9wIpA37tycd_o+|3eovw zZl;U|c$NUaq{$iyu#X_c3N0Y`BSE?q;y>@m*-s;dtx%x@aDbqP721ahl=D16rWIPn z@qdA!C+?&oCguEzz_CIfP@NZPoh&Q#9wJE2pAVx8IacVdVMt#32mp7qp2rH6^YV89 z>+tg(&W2YAc3Gi*SPyevjmO#9Q}~?`?e>}j@TC>Hmfb!y2BMR_p+y4#-XKWvhOR^O z%XyPs2zx_#bG(uBb_wb@-q4$c0Pj$pLT`w7ZgY+h4D^PM(5>F3)`PsEF|@%^at3=t z@udLA2!?n=Ez=2tB)K#F75JYxpq9WJ&#>)&vR=mZp}5UDQGR{qiN7N?J7S`Zh8;Po`;}V zhT-ZxoLw{21qgDzi%6Sl{}j;0q&@0eOtRi1NL%U>xL$8rmA$G9b`QN}RraZWVg>Cz zie=)|QtT3Xk0!0u0PF^OkKt&>s|T=O?OjT`gZc`M_m&kpLG8g>)q5Pxov0SWK)uJ4 zPExmG@OziBJkBIvN&}d%3O!2Of6=X+lJ^yM&Njf5BUiJXMG9>cn`0-#?3 z%A`d=7WEBgqIvZI*0#PWG`*pI%mAHA+N-KMgYG6nqGn@_@0&(CNmUI3olZJg{fXs6 zr11tD%%HyANvEjW5s><3kWN=A<3Wc>hgBH%?AwF1qmG0?XOhlQPhTAl0kTzA4 z7j!?;9(5k}5PfC0XQ{d#pz~;3uPUI<`Fut>UQMV0UBDe@vKoa++P6RTvDGDrQ+)@J zPEjvVw?fKHR|~K(_8mw%q`tv`^p%|-c94i2eP!pDp+15S^c}*s!iH6fFwl2sKj@tH z)+k8pJG>9Np>7zCY}xr4uAZ{$cQ}1#tqe!4*DU|c(Nk_^j^{)^&SL79wu$6*GfS@LfWhP zA%aF8CGArNR@TU4q_J_jjY1zE2l;6_Y#4JQPY;IgsUKkA$g?bCsH%ye_mRc~LV%0> zkwrXe2{uBJ=a@fT-N^F$NzYIZ!~Bs0q$^d$0?^Nso~gprQ=<4RbuWw>ksv->^@LMI zB!*YH;b}a?%e0?nSPx^gB5&MF{g$AO`pCaNg-BIaiR|ww*HBks5F-OW7@vjGy*>Yeg9PTq!5tzI&sEgp8CpD7 zWFqPYI5PR3GrbKfM~3b|uN>iZ)%_jjbY!G}c-5B zlJuQj0Y(YvsDt#A(E>W@E8tI&F#FuITp`IwSd9;QPx=? zV2Dob08k@fsJ4Ot3k3|*S75gosTD9>-!=zek$@t-h0^K-6l=2&z+zE!gyv6oBTIx+ zqCX_47cfe{P0%1vN=0z$E=m zEkKKa$vTb#RtuP-7t*|I1WeT>{Q%Yqn5H-T0M-d8*Do=^tQSzB_tGg&6);^79|>@p zfEju_9eRU+N~1G}sSutg4vjk(`{Tep!+R4vv*X8{Z)bQXgPkBbU0=rtCYzB>-hCKX zy%nAtIag>yccuF0iP$*(0yYehEdrE&hv0kx@%l4@3j}n~>p1H!^d5w;Bt3_7Vyl20 z{TgG%MFL872dvVOi>1y2eFgRhkxRtRi*!AWzRi0a0_ydC298Swtkka%Y!|Rb&z}i! znMm8Hld#rBb_m#|Z{ToTE?}>oNzqpbIH-qmX}MAw{ZfBW1+df0;Q5vQ-DrT{i3Z>5 zr>VhJQtUgufv$hGfbaE1Y-g7g`^mno8^ARJ4Abs43g}uv_`%cXML@d+;RjDi)b%<+ zNw}lMAVmAf_~50636W6U~k<%E6J`<8(y(|0WDMBemH zU5tUNVe~#M-NCC|Id$H0mC-v1-gb4-uM)iDs$z8P*9+)~Hwgl|@(l-D5+i@}Hm-!Y zdpWN^_wxC2LpN|W`9@@W_1RoAe)bxu6R$sJH2OuXlccX@rwt#wgPRf@1yg{n`*S9G z1f*#G>&uAcb62gSg#cb3yByN@V$&8;!s)KZE(C}dPKMruMIh2aKv>_-T}p<49(n|& z^$^jHE^YwmDV!YrFix!_S;C3vQJj3egp;qUX@uSa3iLl|gT4a#>n`wyNJPK@{lGYY zTmgl;f@7E`V4yy~GeEw8L3#|26zL@_HdH{d{s+BxxPTFQJq9RJBw(ceGuOakF;$6vvID>f0i$$jIY5bk z(RwP~Wt7;UR5#J%M~i?m{Ue>cRKNt?m8;TN0TcCS9Qtu0V3J5I(k!C5jQ}eD#q(wNp^fdbD8Ufeo zQjXkODR!eiN=I7n%YrN4qL*@)bebr7yB_QT*dX8zy^u@P=>qQ5H**xu5O9}1PTe*N zxLcbzZ-|^FhQCK&#Lk^9;9h-*raDK8-KS?z(M}`YMj;c>*5PuTz~Z zBH$tYAwA@L;q29O=&%43UHx-NA!&rz(rE$QGFZ1#R4AF7;MCAANPY#>BlHw zn}7p4hyHe{fLHWkPR;EC4(oe*16(Eoj%o+nlgJJM$MjpAS(giVPfz6lUm+U2ue0go zR|@C2#%TrOwSW(FBi-_M0zTAnbjz#6$v@I>!Z{;Xi-6Dc85sb(g!84Q+eWSt&bRKC z_FB>HJ6pE2y9FSU|Hx@_om4{XK9_U&da0FU+6f%IJ;KAi^WEg#AUxZ&zu@rQC_4E~ z`v}qR1qDp|e1^uG1O-hyp3CCRf>KO-9i`kNDAlwVu`_=V)XlUHCj#9jEu@(?|Jifo zP9N9zbki;;x=T=Z(|$b@=x!e`B!o@-ni8OU1obfO&N$tR+$$*4v{Ukc?h~0kO?wDu z`~A|MW7>~%N$#kwV?eHLfUpL}OyMweoJ z<-B`Idb_~1FX6iLvTr+hi%dJO2I!DTdC{_iZ2fH?xA3o6b{ePXUwwN}@>|R9J{ss# zA6M7!EPKE}pwE1J5W?bp_BV{8fA{eUf4R?I!BP3#$5Z5GKKo?yzVPuBve{?zpZG?; z^6|dLi#|Ic8R#3|K$JY_v)7CP`iGC#PY(O+Gr21N)5j|icAUMI*8NU+L*nfH++F?P z`xGHyU7WpT5YUg(hof=!DIBq11s#jC@5%v+i{o9l_u}mBbAeQx>>A?iXV_j^9E0FT zarUS5f^@1!a6n4 zzL0aJRM2UO_95D3te_2v_6rO#;{=_aXdg@f8Xw2maYmy3%`l)ck$GmKoj4q5f}o9w zc0TJ(6m(W1_Q(u!39|J`klj${W@OOsV!Ji&wCP<@oZ#iTVaKa!v~_X!gOT8!3$ymQ z7QxxFhk$9|{>guSS?ObC<7TlV>4Z z7|x!BY_dw49E^3^ax{j*>!d(wpK}Mw#5sl8Y_c>Aa!ChDt3b?!x>0{&iz<7 zJa2&V+8NmkQ^%Q&qu*JHW578N$Dp$t#}uarB1WoHf@3$Q z8pkx}$9M!srwN`Ia*kp->+WE-kUo#Q-)iQC(G5+(aMcb4EPn&X*)fpyNttn26O#xd792WxAd)9lB^ z5oaq#qQF^Hjt4cIfP>d?J6$nOg-$;l2Rdaq4svR79PFHd;}GX}I1Y90$8nhRGLFNY zLkLYp&Nny~J6#szR*;j2<49);j!zj*XN0Av4QDmbGlp{+l4lL)9whq==j?uX%)oHE z<8d2BaE`$_o;RE?;9oBo&Rv*Be=?i{NL~aF)9=rQ^L}r`c*$@U z_zdG^!?^~t=@r9y7|E-K^V$Hzc+GJBf)2lKIFn$ZgNCyVojruhGVr)J4ChcBe&uR7 zfpG|YhLa3KzhyYtaHzKpr>v7Qk6!x@a^@2F=Q#^;7}9lG)b#_*(JaOHE%h0Pervm>B4-Ga$#^8UCF&<7)os*|;QWu$ndBMlrMsp*^8iO-1nO(RXa7cq;%I(gp$&(@5&Jp_*a41h| z&C9qCG-nS3ZNMLmy=Vfn0(pCG!m%E($l$ZPM&1^~xB_ql{(Z@6W3>_gD_)f`pmz?Q z;L#(@3eP%l$~|i_JK>ndG?X4;&M@;)+_U;j7FZK2V2s=ml@}|)Vp7*Ad0-CO_PHa6 zQVzc6u0CsUhgUitC-&?NJCBy`C>d|FVzi8Dywo$NkICzgYVH-^2`Fm}pkwpnT6rPl z72?%TuyWyPOezY`V=}$)GA1($cO&s!ihA_>wt82w-d+|dFWkqZqVN?a(+iIRVuIm za2(%^YmOIO0X#-*P$u{^;(PpPd4k|;iOVpu=0w2?e!%OIZ3o!0C17g_C0uCxHR*XYf&u-OFq|F^=g@T`ZhtAOc?8cg^P^4OL*5Zk&X%I+U! zx16ZTgJ4s~3Smz-2huZH#?|zNXzj-T$ewrv?5j|lev95!Sl^fxcn;x?DwyI5*KQ~Q z-@}0ShqA8EUMT~<5k_+de5VZf^~C#OGxK*+^GV=w7>`|ojslIjtsdNK1pfj&NrvEB z83J?GBhTmH*(s#5#M5zIc3=cvZHQ+smYau9|k9L*UD23W2%Yh`8ArD z+7X1t(mgE|gb$CFfPUy4zdB}muR?LR;QOy&K<559!B@S1CNnVvPxF0MD%)+ z#0D3eGpESRZxXIKYtr;Ah;4RJl{?W}NNOZGx6gb8#sDto{J3WCi5i9TY0~n-1|}6o>4k6)^LDXb5ek~S4zybD4zb?N(B8G)onpN| z0=w3`M=bI_u~_I{!4YhQ-Qaki;4#E9Gw*k823*_~O|j3nqcIv|pt~xz`BZCfu%a5J z>jpqGuPC`wl$?G>Y>0iL-BIXclp%_D7RA2>ZXLx{r@M-a-CI}g;_PU@wnf?fIV^4L60jN1?|0cg`1A?! z9Gxwm7!~n)R0JY-dl9pu?60G23D9jV&}V4HAPf}SJ;>H0<{fMTM#nR~IQNi3?KmT$ zn<$7e`A^Cjr6(b(n$O8dT#K^it_RPIjl_N#2^Ak3i32hcS;Wu4N6hD43j@3E^P=Ew z!0rTdu{p<`ihmZaIdhD}Q5U_9vRndQ65ih_Nyg`886Uo-OeSL)6ic9TfAe`aTkmj}lzU^B@=mtol&^DqNm7s2Nd=MM+& zD)?^VLs->KE%+DW*GhnG!K2~R?)3MIE_@AFL2vH%0)pL85fu85^Vw+Rr&_$g^+rdu{m(Z1R3~8ZkZuCu>rf( z%K^It4Z8!j-OB-c4w#O7x!eo;nFw0~7u8~hjd>ZdCW@aRo|X!Hg_M4k`2GdJ?!Cz` zh)2O&qBx}su$teB#}Jp&C_AP8EZ}jKQ_8Wg5_}E$Vx+6&lGUTYGj$2dfA8&Xg5EU| zv>*Qf43{0yQQpckzBv2DeN`iHQTr34vm~P!<0Kocs{v!P!QDwNjB+0MEoVX#IIl_W z44f{t*0L_Gj59_eKX&dEW8&mVL>df@hJDV7nk4`i8MBXr#T}n9><1hWj*N-FDL6n1 zj{GHBu(e(8(2ZFsIBfV$jXJl+5Ev%9ne?0reO+aSjYc-x`TcKdT`jd{kBinaiq8Ng z>pvLckWmrE7e^Uy{)SPt4-ABjFD2hKQU#heir)Z(amo+>YmNTYDHh`qohE*QLOel; z6)>^54&WI%KOTI|U1L$d@FCeK7^NQ}kUZD$x13kL2N@|Ih`L2h|>e; z9Cfnko;7lA?w$d`dPWtU2*z(lQO0oBLt{2JCUR9=au#`R>@Z3<^@jM1e8`u5yt(T$ zRCV{K7mNKyL8DP(pG!pJYT|>lQEQvvi-28wUMBW@6j-+4+~Lz%S|D29tnm{h%a!Gk z#+*rb`;Zxb9$4niybDHOS~_^u%RfH#!0+FA;Nz2?nKksQE?>>L@$8Y?51pKT+s<3n zVe_POx<0YFz6sfU zmhDgdX#1;9-0$AlJh0QZjn|!$9C-T1)c9qCyH8$Q*6V@C?k>D9DSha~TMtj2_QI}{ zzFC=D|M}UMw5+WC{W^QyflcwA{ab(d^@(ktE-SzBUpIXJ#MkRqJ=cX6pZi<^t}d_U ze}X@0Ka88#UpcT&{7bOV+-I|JIc}(lb@8N*7_P*VJm8W zfMc*-AuXaV zTeRCjA0jj$H6<4?Aa$v&)D5=dqHao%l3Tf{ZK7}|qpc_(pN$oiPN%nOBrp`Mhpw{C z?$MfrXe1+QE>R#%L%7}S5p>Nc`I*vZRPO0Lp(Q5=olVE~E2~viX)?R5N!%uB*C0gX zv_af9p>b*DKCObK!M@&hgBZy*N2a>N*ef+G4fON1jw`}zE8iF6=SBH4g82YZqhkga zwvG>+xP8qD+Lb*Z*DSy@K3(HVQmz~=Zh&xf8hr+3~y^-f-aKAi%`NSKL2bJg$l$2M_hon+j>$i9SzRN z7{f41TI<3L6He^Gs5X00fzjduY)3Ef;*i_A--L3zvIL^9=nk%pAsDB;>*UFVl4$-u$$>Zq5JP<%CicOF<>{-Q-m(u z&6JIMjDfB40OjP~YcwAB?2h%;YqS877yG1xfH|0i@%0)wk=sow6JIcxV7ZGjK(v0y zp|-ISDBQ{efi;cwnH(0fipgjAx@~}H{a~p=*$O6Z*_lk48LNix zFb8DqCZH%~tadX%%ZE0k2Iyu?kvL<$5r1a4*2Yd0Hn`hwgdxKf#|3qgahx#$anH;3?S?g$9Cm14DvJmW2DLH*|Ye}}=`pE(Xi!-5B z{=HLffr|D8+9p~Os&o|z6*#tjH~WMCg*;(E-0BrfTy7;O`J~`TYoIQZe)xKfmM#;K(u^3zQ;;lk z$rVUWbIEg&U?a`~ILZebYKiVxE223ff|VG-&p^r=q<_oD@W$96V_c@4@P%$nxB&fz zn;=;-M_g`ezi4SjWZPI{bj93mG6FV|esX_ZVs$RKspOVSax%$g>hhZr2EdgM&CPLQ z2pP~e^#jPFgm(Q05_LT&NquoLh|aENcI$`I&>be*g`CM`C%*sFkjfl$%T~58+vb@x zf?EKmiS8#GiK|_CEUT^537$bkqxQX4$P>6-C98so%WZ7|IdY2){pZZ!+K0s*ut8p=n}c=@)u!E3XU`8|6HuB&yMV&c^ug*BJXZ zuG`M=EMXe6m@F5voXHA&U8f**u`p&axm3t~3qbvVEIvo|%h=%B9V6CUl+-m>g@39`Wr~QI?vB zZyZ=$LrKrW7mErLuF_C?1(GvdlI_0ak~qqTQ=Q$ij8*BoWBs#?mUI~%c1<|3KE}aS zD|)84_EJh-j8g2Nl#KN>Rx;M6ltdxb+@CTJLl1^9L~;ukgJ+x=fzXBhv= zO8b|QzMJ`ML?gc?C+r$&V`2Huk%;zxvN4aFst^NnO?Bav? z{wKN2e+l3JC>Qzi8I9utd~N)T_=I17?bhL!?(2m}KLhV+BZoZ;$hiJHKi2DR;uTRo z$C6|^`=2S(W!?YS0y*sC|I|XP|NmPHv2p&-eSmQJ#CqBZXAV@)?QdHjlcV|cVDd9t zqd-?9)+PGB%Uc1N)cv>8V*UAdX|bOCCuy-B{8pN)xw}K4t76fOWid^6vzUB{s|uzu zhY9b!xbdA7+?xy#tsl2qMO(GX_SGtOw^ie^Cm$O}mgjoN)D5aLdEGXEFU|o|kaTm& zDkO99wTvcnH;I!4G@H8@gWx?rl#ew+iP8iPNAdjxUym_p_vcKd=uC>`T|$IOCYkuM zRv)AzBzyK`B<1*8#;N9R5>&y$f3I#8eJ(QCOH)qmARFNp@G8kFzYfVQE-5S=x&qpg zC5=Agk}<8@t;fUH%_QWL}=1`Yt?m9OY8S?3hqpNUb zn_g^HJ~V9!zCLVF24_k8R5=Pk$)|m(Y28jJ1sE$805JkzANKz^YlyWLg}*I@>jy@B zNw-05jke|dwk$=Qpq;>2DaI6bh!$eH0N-|l7gGzDWsD)+aGfTmSZfB#%csp$b7EzF z6MEdUWjUSBMU{3tZVJehtO_P9Xc?<_TO?SNp3$~RL`F3FO=mcYmi|iqv0<$AiB}I2 zP>da9$_A2*Rqb3L)?_=s*(VinK-000Cra#zrcN}C<;T*`qWS%!>GWvIEeAibaEa_IW}&;+s1Q4lQuCBEO`8~ZSP;{VvmWM_bB|B1=l z6V3epLqG4uT>y`rqPjH=wRQg&6>FWKMp=za)lt)HTIxnEs%dP&?9Q!aSb(7y*Q{RFQr)t?v939{ zo>95Fxn)tqiWUG1w~lI>8){p*UR+gZTGI-BhOxGxscuVvcM;sIy0N($@ui_O*9H}uw=<(XqSap z*SvJ$>cxw}M%zs-YpX?&XtlTjxuBR^PnDR9XjZ+j8FPwNqRggtbnWs*ZH#rx8>01^ zTWYEsRxGBHu}XEdYg{DVT+z}_NL^iH)5_&-W$~}w+dyOU(l*dsSG&5Yp=EtrPUG69 z+LoqeZbn00UEPrU{sjeX{N>A*(-=`Lh^p(>MYVLzgMo|MV{KDSV`CldjO&bz_3IZc zZymRev5c{cYHKQ2H!WN_roOJ0nzeFDCyZ|or`Jqy4bWC#{fe694Yi|3m#dJ=Zx+$%$f&A&yrc_UlPLAsGvN@$w zARaC&U2$8Ad3ZHO0XZ)Qw{RD)>ZtSK$xsYhHN9myyt!sc ztC^$a7I8$AV|Ig;>zWqVh-X4oY*%HsU~M){oVj4ljpB>3{^mM84ZI*aE*y7Ceo1=& zd<(zc0Ji#0l%zQ!?i?`C5M6&VOw6l)T(xC^>F1? z=UQ309=rp*Rm<}|W^i&r-$B;8u+^!`IiUx4;D3&`@6p4*!GH9ihgOH&Y-?4K)j4df z3R|6v280Uo=2SRVhoU7D^78X%Wfq<@-|En^Hr_us;z?-N@>P}@&gz~?En%M#NIka> zwK|49o_2-qv&@1}zSCVggJP4dj*qx>ZrlYPt6j;rEz=+BIeBE}sO2X}_@{MZCw}=2 z-tRSae%7FTXk3+fLU-|&_5OXbty7D#N2lfGXPy))u-1pO@?DLK;xetWB5UMCE3qhl zeNSuo+4)x2q7yW_$#-JQcj0yG;llci9#%qbzq~t6(DFR5InX*aY<0}FnlKQ#E9MTI z+Yn#TKfR=Q$skW$yMDglGjm5TPa6>GX|2y4*axz#buz|-`VZ(~eSJoeb&I)pjkUC> zJ|jOeqF}`86Z&*P97ZfPY%R&}91_F^Bo#d@DH7sta4`xtZviwFaef z-DAG>2T!i`=IOcCq#|o@IDhI~Yd12EA)`ZX@rcPItjEtRvYy93BYf!0Fw$^|r*k{S zFY91hi4$kAmx)DAeI&niP&4~q%F&Pa^Jq1lZFR}rQ(SBEE?9MM{&Qr z$=yd}PR=Y@y>^GywaQvi;LKvyGOOEj7ywEWLFrY8Ec5GZ4y~YEXN1 zZOiH=1l>h-c(dOBVeL)8^mNZc zW~MvcJ(&rMB5OcER6rI*K-obSWf2hlAv?$p@*)DF@IwSdR0I@wzo+VRyL);P|NrNG z-hK$5se5nNty{P1)H$b4Rj#a><)%UhNLibhr`*h(4Wm0!@^)z>cqfMM&;^Ghux-c=<7Cs2Klitui?Oz zIIlYf_Ra2rw3dX%IyxHL!ey-un*Hi(YD`KW38DcqbdTwVJNH*Izq&z2M%XYiG_<<5 zE7tBbsGy^vH4$pW4Cl`eI~tSAI=dE!$wT9f!E!x+XK!yIQw$0NeZ$gB^z@nGzG8ov zPW1)huvDD>^q`8@UkpmJ-3^yP*jb-!OfIMmTRW1C%~~rFT^u$x)W^c)lCHYWFlbBX zdXoKm5pLLO)WEeYY)>@D!-mdf9buxeJr>Rnq@IM?oGvL82JB6_FZ2h^i!<(V62jkHlwKlbe4N|~*ia}jtc*v5*C5?epsGM4Z z)pC1hLt|Li+!5B!YY%G^iLkCCknWT3?h982nN^wLV%R&_-B$>5of?;QdmH0}hJn7Y zajY1|?PcmKdyXDXf+r(%U=G6C`@NhkeT`rh3AjZcVAF$y+0I%`>hl zs_V-1)k$j^$px)VvHHd^E`vu8YP~7uQ5VD$x=yu_>`cbm>N}D_OVSE%ITnKEj_hzx zCTPeEcCT)WC)(82lIjks%As6PKax)*WA)kLVZAjSQi-#LuHu+okq-+&DwaNKq)-f~ z9j{!u%c`o{w~CG>ZEX#)q_wV&miDkmuXJANula!#@KB9h6}%$Ig+1Ba>QJp^Rj4+g z{;8%iJTf>quiQ`;`i2tp3}(8m%c|q%M@?dsmX0a3qg+3s|3 zNH*bXv$c>M>+b9E9WS0O44Byw3)XtLF367ztEiS|kV~K#2dM_DS z#gp;86T)Pt_uUXSE)Oc&r>nKlTIbp%jc(o*OC-CN)JrBb2C3FUd%V7XAQu!yQfl#G zPjM`8!f;@fbYJ&cYWr1F13}xsu!`AgwQaw#TvgnJ{55JaiyIFOTN>IX_PMI_wZVWh zveFs7>Xi~->e}tyJ=T+pBZbhqc<3dwgmLeHI(*t|@?lT^3MaSoL3*HjFstfbp}r;I z)aFEG5LP~QeP>5gYx9z>ShBUVLt$;VvPks! z#p+9!b+slXZPdLa>bm_XQ&lJBOBMu)kz7uqDwY};RJ{hF@3l_ux5s71gtg6q$&UH^ zNO*KDx0kJ`Dq&SNb(A0AlwD3I z2GmpgSLD_0BrLj`ypWLWNRLEPuhg)|TGN9WX$Ef48dNUXv4NqWCp%(oDKKY;@9%EZ zRQnEFn_Gk4fx*GBzgF^ZC>_w}Z1@W$)+9-+6Y2fAuXN`$ey7RFNxM<(n1$9;eyZ>1CV4ogVA}!Pxg6yd@qco$iw! zlER@!Qd^jy3Ya?M9x5)W)7`T=HrSUh_77QCwl~qx=3j*?jH{lm<&8_*{WzS|02JiB znH=~V>%BB&iW2kIx7E*V;I)Cmh8-13mF-F-x#|Y4LbkU!+O2mKsa;aUkD zr+tIjlsT5HK2yGT_GYC9=7OPYS_8Snke5QfZU;uC&#Gal0ZCbw2+j`%0|nC&=Z^(F z(mYaDUJX6NPAgROSF+On@M(PLg-DTXsY`+ZVLv zS4v?r2_hx8DC0ma%v>9-u1v167geZ1DbG$*v9@fzXLUhpghm)Wlf>tsiRxZ?ga%hz zt<=}Yd}q<)dJ&SV8%d{EJLix3eV@dom8@W2FQ_gCt7K?p4XN|`3NpJUAqiG53FYp& zL}ip?M~Bmip=`F;pGkK%HMC2i9nQqNi~TBwHPYI!FP|NeSRKeI-|^M2t`g{FrGxIC zA+_9Me^!;dy!@)I?bA>+Yy|ojDp@VKy43$nZcfyQIZ?Z=Z!B2XiG{(+5orUi9X4co z)dcnOgH=7|L6ya3FNXIL=}lFGq#tq*=~PoHYl-gl$^weV_HMSi9~ww&2pM1b!q4&Jr~q1`XsNz?jChsQ)-<_>fTj-zGsozrP^ne zaT}@dv8Kj((ixrjvd3s{>xc!afv{&VYaOjLN_4BmY7`z+gV5unt4XAe&XXdY9-SY^ zR4HTz!&LM~k2}85{eN%w|9#y5_f?*1NviyGKAQ`gVr|(`Ou?L9p&KitM`fMC8m66n zC%Z6cjKw?Kv}1~i%5+edk}F`iPnFWyn;xn&dtLp`dWh79LNTk+wY4Fzbc5{ogd}6h zPIfAMA|W$dEqfqkFUH+e%7^rTyfrhgtdxd@pj`@*Bwc7-AU9I$G-h*_%7kzReSLqo zESf=mO~%-8UyVJWGn}Qmc1chLW=%@B$gga$QPymts$0a=sr-nSl96KKQ_gY8E$YE! z+sdH2ExI<+nL0{?tVGhFaieAk^ovqNt(?jaenZEdF zKA9R!WClx4jsBwfHTrskre$R-QCBwZS8v_c)mlStMYC#0LZhr&swu=)WlaAIoURtS zu~t^K8khRrs5yMXydJ4f0gw|!SbUkb5h#pmZpQmx(gOw46eOZd7i-yWTC zQ_>#BdI!xit{p$Fbd9-I(OoP~&~lx{X6EI5uZ#EU#YDp*2O6#Qn%ppzYR|}O z#jheC$oTa9z+GgG6Vq(GN2{rIximFdo$~{0Dg&$ZwnpiVmMR? z%(4h&beOSSVGpKMTavN%Hkt-U3JSsK(=(db%?GkhDqUe}d-;K^%~gh)5Y7bd&bnE( zf>|0D!zQ^xLUpyqjt;fDu2^eFhv}<9kJQlN%xEabP+(GCU3`@UZoEsL%4O=z>PYe; zXXHd%Qd3{EaPEF{7t~k?$-KR5_p8~}=9+c?-DuTRCV__%hOxnenXc!yr>90|h z4HPt5*3{PSyWhV19#J!As3$japp--@5_5(YC|&Fy8A`4DcwcSJoX$ec9L<6s*f%_~ z-+nc7dWW-fd?k{Cb#!S46O>GUc!G-Q4^L1q{o#dyHvaLAen~u7 z-rAlF>y|W0rb`_+O%EOj+?&?&1e?!KM_l9V^b0h6S`7$(!BtqsfN?sonc+gHxXGbibsDHED)i_I9%XM4Q$M=KI#-yElq$9qY@n0}GrqXV)X#3IWEM#w z0b}lA>*anr#w(M~&6<)$C`-gWZ;)ctbTjKtdyy>_j12oWQ{&o9w|NNM7~5ZTBEBFY zFgPGDx9oQf|8)cB+Ri*WmeOxU;o%vf$1&nzQxFm_*uWLYE^6NG>Y2*pwOFN~PI^VHZfR?ql zdnHYMd&ouxxd_{8TdWuoHqH@$h|Pr6#s_4M$a+U3x0xI1XVMT%ZSdofym>0W*Bc}~ zdsbPMC1l;9^GP@I4!G9g+JbjjHieNAtPU(|n_01nF*rXk)GgPoGuEr~bh;2Fparh~N)8M&-5Yszcf8n2zl+nEiGHUZXT^Ix(rRm?~cku-5{ zQ;vp4KVMpM1&xJEhIzi}yQ9&s0BJk&%;OWn{*v`)guTC2$tAH6Lj-dI9mi zrRIFo(-+iH%eG`wHlLC;o*6bLZCQ?*c^9-~bMj}%=o}8>npM&yh+6bGab(ppLE|u2 zyDB&BhW>G;tW(cTf$^rl{N2Oyk9ch$EDh^HTrJ#Mc`{(`vchUo0s2RsPOOT|uXguv z+Lg2NrBBPfZnu$=D=WnYjJRc`0Sp&&s@2SBIU}U{WD_F=n;^u(_ir?il(grp>K4kR zqLZy{G^{wiwo$R-^aA(A=e(g*DU3 z&8B+QJ&gCo-E@P~_|X*I-2B8^G6htsubhno!*&x>uPhD#Ii#K!$ZZ&+@9&!ljSxlU!nO2z1}^n@V2l}P){BU>zd5Btp;tg$Z{zR6ceLu8Lc53 zXSiuVl*8L5BxNtA6mMlN9{YN}JDOwkQ@r}|49Os=S%{U+yptZzIYY3d8%9#8yzJ=e z(cbw1%~7q$f`+z6o$p;ID35R~!$&_Iq7Urh6}bVV8$yW142`~)ib*B zVVSW-SMiBKNpI^f=BD>foI=4((6uMxXae%X=+15y(`Lu?MDYe+6eslM-NwnIHm&i< z^cM3@xboQ>&|!?OXt&<;h%fclI z=U=J}x^Posrk9$QJ70=yy{34i$NDL7O)IHW+hmiCE2{=dgPDzjO#iq$s(zflVgD=0 zB2~F%^r>Lwcm%U0HQvibZ^N@!6PCqeVRKt&U98QUxZbNZsL95b?tI#&t$bB$4C~2Q zxQ*4KlTdE*Z&9F!Qg^qRBzteX28|!4=4p&}GQdU$1$sJX6GMb|0{e(e4b$V2YH^w^ zOUXkgf0v(HFL?u$ue`;rg;JHP9lQ7v_bT*y3JL(xP^vi)4VzJDi6(GOEe=*?OZ8_$ z*j_9STFb_}J1nHa`EQ*i6Xse}HO-1-_VKNCU@q0%D#?BYgW=3Y{X!u5*XvAuO?Jq}kTR*PT|Um0Ijrdvb@oiqmMhpC zw3{9bOyq}dIFqTkLYh$dKwHJ%?bSlq8jPGwIX6{TC7|88c#yOhHq!;#}}+4pM~oL8lVH6K9BI0I^>8ICputT|xUS!_9v ztU~o(=P_urmfYw<-`w=I?qo)x)LYj@s%tCJ*r6~Qo4E)l)O^Lc1*TuR+qo{@YAS?@ zRE234CMN=_!t!6LhCW};Xd9xPDibg%AzNiQaL>KSYuu_;r&dT8kI5J^ z`%t}2a>psB8jjo@d`w}%2BnpnS#sYf_?eHcLATWTzXkUBJ5>i}Foa?aJU%pEeaQ z>FlyV^DS+y9rD+^4ks(X^3 zDvX8~&EmGm(_mt*p|L4k8tZC})k#yU>d$&BiZ!VB(+~R)E$4&JG#wjXqPK{0Q0bkq zNRn7XLziL?HPO(Wwg>a!waPD^A24&QdsquyR;l=d8aFjqU~^3jSX=9fI=NyC3u+~` zN&&My#X_xe>kSytR5WiwCVlKc-D=nWt>4Gux<4^Jf%D+Rld5ztOv)O&J7blesFOX? zo!5Mrd!5d5l!*6cT>VHfGAVQYtGxp53^S7-)!Lg$kiffT&j_`f1tz^s%>Y zL{Nx|Iez_sV{*^LYP(h>4OFWoiXY4nJ0$OdVqE%$XlzMOolF-)EuPxd{nBkc|v!p0KLP$@o&}*b+m_P`LMC zI+~ufDK^urOVeycg@cU?WT{)MWv6|M_L0t+kR<67bf8cX`SbGAq7ntge-0mbX7^Gg5>{l`7B_6;<+x zyo?%CrMV>Ip&L$26v~unlYQia+)5UZ`lT&oG;f)YT=HHLs~QWFk!Eb3T^AfH7n_ei z4Ep_g3B`I0=!IMCKsKM2?vBoE4s=W--N!w0&LpqqZ2W*{b9Pabpp0VIjrH|`-dg9y zsq0Z?Nt3DSt2X+ZyX4< zJ;Ft#nTqFQu<|AmQ_^T<^x3pcX|krVtE;mM+|I!i6kKm_8s~V0>73-VM6;K;R;``+tQVDH&hqD}<_%S8dMFBeB zhikQZ?r_zBylhSmnC$UU8g7_KA02t$G{Y>l#x>xa8|*EvrLaWnUhG}=$Pp4P`t?2{ zo3gVATm|Kmg$uY<)J1%;IfnwP?1F`1ufwrw_t#*d0@?bG3NcZ&c4c&ED0%vD{OY)tw3KwLOzDV>eP3z??iUnk&HVCsXLJxt6|#f!vpA=wo3v4chi08E zggIg1$i6Y^Rm;#zdVhA4p9A)*!_#}d-c~fnURO~b6*nvBn!RbfrB-jDC>B3y zO9J$2%|yYA>1{*nYGp&G%C+y_zE;mz1Z=Gv&7Fl;o|CcnvX;OtNy#9V&@whBplxr{Fowiw{-d<|}u}FuoIaC?k3Wjrw6J>5sn8%AE9WB7g ze2|K_ab}_o2_-YpkJ&92*tUYv**Yizj8S9lc0u$CDU>@!cXf7?^OiOHp;dC%R18TD znG|)!HnSWuX~`C^8#)KEA6X^nwGbdSyjqjnb&YY0F-*w5)KS|a!O0(~EOq-VlEvlC zJyWv#G_F;>rb;P3-_JRO?R|1lxPVDT_C(fyv8S{W#KKywV_4Wx!Mo2w3vxq&l+@@N zv#>#nqC}^5P1b763_d@nS=G!nJSxu04L1#$)JR{O3&oMh*E*F_=%<@U(aTKxU_?ER z4W%|PV|5RYs$Mm1TkMy>C6ZplqQbl6i}al>nz68!?H%J%=E}FB>Qw zuan6_{JXhb&EgK)o6$9-DyB07X4E>NqWLZYYc-C^&E_>x>;Da-nZZFf@T+8|J^9cC z7ye+b6z3|no?99dx?<{^CMkl(M#V_BM@Du>wm#dfT`#oCPYVpK0;L6+LSz1jcp`2C znwm$!VqKJ>*TJ0pQdDSlbC8&q&Qqq+#jEN#(TQ5;pL7c@T_eYOw&*mBzv`ak^kKj5&UJn@2O?8kXsm_bMQyY^`6R1E zlV;sRQm_a7B+oc2I12hwbMzLKTg#BuzDY7|M>XlKMLUsU(=d|jN+y^}QM^lJquK+m z&4=C8)o3f=>X&LsVY@{o`W1Ov3}j34a<+J@cho}V{lrP3+cgu#C$=xspryMv#cbjN zk)2D)d{7(c>}}9Y8dJv3vy`hc=qdwnT_lYrA|pfA!jgOkw%IHVuNrg}>o8PEj|3fl z#eg-O)?xJ-)k)q~AB84wy^zutPiAJ=M7miRn){Dt{8KH<;%2+3+=}I~(C9^~AU*N0 zi{^K(A+s2q??AG(a``}4OkGWejl!&)s@aw3@Et&lMB8(I^{D^q!XQ_tNXumd5>)Dx z%3lv7m#5T3R<@e^Vca?qs|`HsxSmtyXmSpRAmL-2Di$?$jcLeq%ZxSUIn=BDmrUVy zs=(TeEFT*Y`Ueg&S#3X+9Basoxxv?>TWsb@MQqd<7>Peks^ohVcB$$~EVbx%(@-tS z(@#A+_mW9CTi)ipRc74fr5L%Tc@;stZe)$y$lxavqBW!Aoo4b=OmGQSi?6Q6SVO2G zO;eIXrKXZsS2TfwspA&1=tW6yaZWdrYtsLG1c9IIPf0E=N1}6Ng}tU8t*Ah?Fr_Jy z8{H#gfrcP8GcE42(3O;_&S5d{-8HV=`3ja6*4J$dJ#8$OycwG~%WrC%uPx`lmIO3U zR?-w<`M;_>;7eO6<+%6{_exq5U2g4ieZO}h>)TQPPU#*4!}Trm7Y1!w)#bfp&NtB5 z6%Sh*gQgZa8q_zCt!6QM1;wUYn!1bL)XDeS)UhAF%=oln)(^3^=+s&2)=#wX(xx=s zdalN?fnvQnm8`cxZ7pF&gIoo+G~V918kV^=OmWJL<>a`x^@ce#Y5kV+aC^5K-@M{v zhO~)JRP>VUjP(1J<*+F4(Q{guTSsP!xh>9g^LSx$`TWvfwd3ueWsPxLz`m?o1G24t#ZYPZu??hF`XwpptY&61L3@3| z4@woIXLXylaPVl&(*(1o@}x#0x2iJ=YcTO(kv^y(_Gi@?reVJ13eem^loU<8aZ>F>cz%2)L=Dk}? zD9_Py?c@-)buRP!UpQZLXbNZ$wk_ApV9fV==M)Vksx8Pv3w?y=edcokHmtyT|nHv1*x(|?qm3T2C61s+sQjuW z8C>CQW4*04U$%R&#wB4XkB0P8*LL036_r-2b3R6Twx60QzZ2WK!&~VJK@4N9O$h}^ zNcd_7kchdXZK1Wq`FQy`Zes=uOE)oZ{$VF#^zv<)w6rr94I|%%%@sdX<7^ zT#how-F8HhY_=3t1#&Sx6BI|MkZSDp8lxG@CD&v*VpdVD2^nTC@XPhJsux*mCkyPY zdja6|CE0au90-@mU+;TggKW!XraWrYHFuINWf>^sY2juc$}29NL#luVJs&k?gQS}d zOnQS|`kULX&dqT6ODwo3WebHAE_Ia#Y%{cYq|v+9a{-Iy>8FSt(MB+&e4pj8L(PN@CKCa?|Nu3`<96tKtdUI~BGlcfJk5vSyG5P8IFf zx;rzqCGI2DBTRCGuFTM|9@$DVuJ_0ku-@x6nlNqKHq9>u(pJ563ph|{kIhajQ4emh zP@YKt^&(e;s&{tCn08&)w{7dDYq?Q*e<+D(xrg%uW73h-?p(ulTAalcs^T>tP>yDl zm#($h3s7mY@?tri(q?`tRQ_a1<+sJKddqH}Sk5Fj*3kUb$^2$rzLquo$CH5t*||l# zJ`PZ0d1(PlM`+vdSd2%yUmhTnRLzX zlDTGrM~<%2G?(q|Xp+We09u{CsYxQgXmmoW2vSUsstc8=%_t9r}>272^?f~5-M_n+G9(5sk61Gnr+VHOIo?D z7i7~9J-7Ans;YJqJ}x41!uu_sn(%VVrzX7F@~H{0wR~#AJ1w75^xF8wP(HQqx=$?% zTK49xxRFhL&J9NHO*_NT7Sh*BxTHrHNDY-svOYVMlgrD(o-5T`3sUnVjJjR4;nRG@ zW4MWK&3d}Q&Vo-AAK28LiX3-tD#))M^SXAOB)2Bpm&kt_4I1e>O>Roq#)9atI=}MQ z$w+gU`D;y8*Mf_Lg3~nQyAB_<$LNcl(d3QWQPc-~Xo72e)k)CF$gFRZVoMaZ9p8jCY%IBlA@2+cb@!g6eiYq+Lzg!UL6qTDo7{R;M*_ zotoVBdZ^pKL*|brg>BAS9a>w7D4I3jD}BY!eqymj!rytUw6Juo@$Th0+q7FlsD(b- z;XJR7+-9+6<_}ZNkC}m1_8vN^BS~yMbi@KAoFB?Bx7H>;wsu|hXqy)M0?AxkWa(73)j%&xG>D|bfz3AfRlh8Ycz7IxPpUJy=n6k*&4=he8`}^Rk>s8Wz8hLB_D06XAwDWOXk3$xz+5v>(K`U z<6~*s|L~>l32BMim0gQ#=VS|W_MW@<+K zQGAqiyUP23cwd)Rp`lyBrhO+7-sq@lGF zPNK-0ue+#qCXxzW(>PS$xkTZgU26$WQP;^3p^}m)%bG>uR~p&;MbO|p9P-X+deG9& zr{y;2ic7uI1}QG2mJP*HrS%IoOr^70>RY~E5u_!rq1JJwZ9kB%F+u<;V*i}bl-gwe zqux=XQgUvarJS0mJQMbk18wl5*P*ZvC&x--sp7E$iyyVevKJDoT^Nj;9WXDSy#NI} zdvP{?rokNGt_q3$(X6Z={4MlHUSZeqqMb`@M*(MoSX{MpfZ6J(WV9sTb#2q(8)F@T z)(k0_zasQLEJsU~wl_7~$M4?emKr)iCv!5|48zU#`zGt-JY8F59!JZU{5n!wj;O&Z zQeWiJbxl|GX#&wzWL4jY*T%I_yS1$$Y;V?(5ls--$Yyn&%=Y!k%Qen*U0&&JyO9Rn zeYW7zNoPFYsd)ED!G%&r~#L#>FA%76w%AxC>f`ls{r04_Qz>S8u$$%1d^ z+wq;!*~Ri>n-ANXO{Hdt+q9(cxgoyl`D5D2t+l;TKSF_RVD3w;v$Rd?(1H~JVTi3Ddjn@Fym zH`IT$YYVMONnXuP*xqVxmlVyyn0L#yI_u?51oiZ+XzFh7_M6d1u_A8I9QVI*?lBFb ziYwJwcm@l2q1s)yq)a zgWHN$tJqqT3WA+r2~=Mozq-=}G|XFTusu6$XIZH`exBc^-A40q3v#h_W4_Y_b*?w5 zAGivxYpgDY`L7l5uAPR?k;bftwuxLYt{(kCoj(}!}7b2_)Q zHn(W^JllZV!syJ~U8^sRgY?B-BAhj`2Q;N}sFl$@k>4G(KBlG=&qt?EGwiG#g zDJj!eBfG3kvwdycJ3T%P+Nwxeo=x=O)RakgRB7zB$aD zSd=>A9?tn_%Da#$JGcHNsVcB76{{PZ^H@6Hw+s9)i2;Q<+jg_waxCZ#vz4^{DLH4- zRl0+A<6|QPbjrZAC?_ZrF6^qbFHFkq32GH+fmB*cl4~tA^%P7ZHTpPtNuBPr{G`zm zO9|hc_HZ=M##l@sd8++rZvg7>6`nX z^dRfXPTg#okGbzle+cn-$wd9UK>wR>|I@ZviTVZhzlHX{z3qSd*#Gu*d!CdX1rowu zLv_lj78*(KG!MEDYAU-EH6~+%X=gU9s9~7)qG@OuxzRMPcY0MWu(SvD z%R6cHPIvGjPF=bsD{AGzY|*y%<0eO$#gL>RE?-5o=vVKkmEmd5=x(hyk{I^K#>F(c z#vaYkVm$g$)ykBz=BBFB>e!VfzYUb>D+9jQ(fz2w)l6w4TInEm_Kc3Vi+n-OX#Ql?>TC!L6(ng^olEuy%H3vMK=_%e~ zMYmKC>DDQ&PEwqx^KvcgY)NQQvo>IG^Vv>kk?PJPw(P^roq%l#wN<0EN6q@$E;VV} z=`D!lhqJ&n#+dXhxw3Owt|Zrw-;UI@1C8#*)$J`uw+_n%Ab*-9u1$(+TsDbkJ1z&Q z&S4D%n%nCf)`q+lj&*B;)|ve}7mafD^A?sjl``R7IrV3%kXh#S^A>6URv%#E8f@CH zwju7Q&yOY(t5DH4k{^8*H{#S4>v=Z6uUToDvvaa(6t{W)(vm{mv2LGw{koUyj?Vk) zda-UJ7nYMqHfwJ6=XanfI614yABzTI&7DPMT6jd2N+{1~c`JRtk%{V5``2oO-7#UOO&6+fYf(ItvnV55Zy^!ba(gJ{m6yk#Um2 zttW7M4G)>0$P5D0b{biep_c7->(Hp>cee2EINJ$P`l>~^xFB_BQFs+k!>U(pG%nkY z*WT7}+vAvPT6Ub<7gh~y(cbkz&b8$U)4~#7Y7#-pE%HgN?jLn~7Y8GLdrkcwqW&B2 z@{E$s<@x{hhcx%naPAhJo2*7Jwx8*<`CuvP3iWahR5xL04tm!mr2W~xY^Jj|OAYMl z?^A5AB(96n8rE*a`uRIIK;*rmsD&@iER@C@YIjX+!f%TfnVisoy#IuZFkeEHdcMXgoa*y!Ge;drQqse`{_YvK1;gi-AsYCV{`$@ zLceXfc}3Wn$6mgbbDUoj>FQ$3D!1PZwAJbUHM`orlSzfg6>1c~S))yLY8u&PvL^0h z<+Az0ZvQ`QOliN$7ksMEq+s%~GdB9HOWRM$*~flO&VJK3`dp?z>Ska;aePn&YO@|=9sV-G*{ z-~;#HcdvdT&weL5`q*#y#%64M($tfuoMQK`iB5?2yS~cn#0^eb|K#;fnRe>bHB(Nr zYbw8Qzxi9I@9TKi4E@k!b=m$~+I|t}2=ASoss1Sc z;WPA0el<~sqW!jTb)JpNbJvP%?01LjX6#yBXSwM!YU=b;l!4tN`q*y`ucc1%(;xHI z`|BA&{b%A8Ddn&z`m#|kux`eVCvAB02B)ll>UwLYoi_FKDc@A>wa!>H`Ss~DcC35s zk zH`D5+ifCWe_65Ou)7Nj`aPrKln@!q$(w0-UnzZ$#Z6?i{I(t$ux3GFhZXB_g_w0}U za@P1<=N6r7lQnbgz+CfMnX0|kH7j$q1?<``}qvJ2Ib!QVCsO3u%HhEs+_8=lJeuy}%s zZ+SgjHPJrTn@3t)T98oqzx;e&*G69CLjS2m$ylx+*FS8STqVIGnt=}syeLgtIk9{#6(J#^l`psll zu70sHzvq>FAtY8~uH0)peg#oU6R<(W>h#^SA5*K2|>aJg9$_ z&$02BCIv_8SWN%)>&vC*ctd|zmhUYkY*>gsQTc2PtjsT`{OtW$el}i3^|GP9Uzy)5 zWnel*^ojDDri&``8>`4q>PjiUJ*)D|DFf3#qED3Hu2uORUy+~GgHnEVRry`045Bbmc*^l3rT9x1J%I{zuxBRxzzbL;Cs`9JR3DeD@PgK5tRORvGK$1T4a{fqKz zsm@P7u3nK{>F=?s>#ovuru#)7%g;W=s{1~u`|hgacHbTJFS@U_^GQla@_D&Bujzx) zCo02vRr$TE{GxuolP-?(yIt4WalL-`IYkM}Kl(&}|LXtpx+is=eWxO= zT{rc6LGW%x0i)|itL}TF1lT-X7gK%<^e?*a=~emt<61vPRp0lNs{CHLRL`M{EWf=g z^7}zmes^6L1aCx{iBb73sLJpB%O(Yv=%nShZ$*ALROR>M>x1A{GX(iW`CVI;-=ZH+ za{bcs+fVu(bs&~>HHzPj$+ ziUU?Y`xq;V6I`-zQgFOvR-KN=_0R6RvHn>bt@wISbHJqF*@`bl`RTH8pUUG?gTH-R zd2))od-=$eaV4?)Ro>CkQ^(oGzI2t}pH_9gqJ!wNDZ%=PP@zlaITmgdVU<5q^k&9?-`-UD zGbNZ=b$({~r2d)`Y+7}G)2j2ERh_R8B<}m0SDiOar~H``Y*}@F%koM6HAQE~mw$X} ziZqV#N49bGc}^)8(@4snDe~5hzuq*A@@I-Pgz@KRx%{3fT~et5TKQ_KuCH;|pIy4% zpTDpoZSVWtQlqaaov}Zr1hcF1n_YE&hpO{CxcmLMbkz=}zwD1G!A@1z+elyjOp!Ha zQlq#0_Ncmk&#LsCs&u6$W8dGa>ioQ_bftx3 z*V{-{{!DQrO=a3fit=ZQlk}D8FS_R`_nHG;`hwCWHKo7ok10+Pmk&)Dr;*$FFF765 zUcZUPnUYsu6fJ$3OHT{FEJh!@@6sqCS~{bDcKwd}H&gP;#*}h?8wB4Om)A$t=uCBMvmi#~RKAI^8_@0pTc zousX$%v1?N(!PFX2CK%UHx0~=(toZVXG*g=pS0OrGi6C#Iqv!`gL_GvZDi8!Y0~Gr z^ftloNSkdkQ}V(3rv7ub#Z290nhIiRdtoz!nqU*szI?NTeM#TwzQ04zN!nWOO!dD$ zyHKCw^=}hdxLMMc=O*f3$Baww5`2xc>9m`uznn(eBq4QBthEKpH4Jq3X^P4A*0WNt#TRV1C_j+> zwN`&{wHJ6D{@-zj%THF}^Yz6jd3vK8>WdZ|J^nXM#-EHLtlX1WA;)=f-L=)e+e(k^ zI()BHw_L|n>)en#auWGx`2ynb(@Lv^j**UFziEB);}s};Uowe6ktZ@PraLSrHb z&L(Xd!1U#TldHyIOCK5p=W*V~PW#@?Tz5Zd)5#_u90acf;#a&pn0&amMJ68+1kdaE zti!wyWqRo4v2nJJPhaNypWV;onlWwsYT$eac76uOU3n|6ci-3bCa39ej=;a{}@%T=7*Z4 zhdt8r)qU*!*mYMKb)C#Xcin~JtQFLExAy@|ZuCCO$zL{Er|U%1IE`ByTfCooa%loTUteM)T?$>6*vw;8-MLOs~6*m(AuA+&xM!4pTM8Pd*S2o1^60# z7k<&|NBMQYBjE}-2G4;v!26-qt9}1(@KdGURZ=Dz_a1S@H%)0d=Ned{{-KI zX5d=+w}rdIMX(7bVG8Ep*WelOLU%;3sgpTm<&swuFmd1B}BX zU_Tsz-+*Vr3*hDOCU`eAKd0UAdAP-fKD{qo4trn@9t+pNbKoWLdUywX06qgJPxtq! zfxE!DZ~^=>TnbZg7#GJ(q{cHhe!~I|*JOrlU zG4NFQUHC(IExZl>8a@tx2mcp-1b5oVmuDVqh6xzL6>t=u2)_j{f>**j;C=8#_y+t3 z3_k1cuh1q}FI&MqU=ut74!{xk4R|KJ0A3DnhQELh!Drzg;M?#+I86$Yy{DOQJGc-Y z4BOyxn1(rc99#o`2(N{=LB;yG`#la{g>S>DpY!K8hTFnj;X-&YY=?)zK3Ifn;5qPm zcn5p{J_G*%{|cvW?8~zWoCWuQi(n%>91g(a;hFG4csG0mJ`Z1m@4-*u=cQ=bd)gJo z;P>E9;GOV6_$+)C9w`OZ@)?3h!&BkK@LG5~ybnGFUxshN58)P@`uul*^WcH-%WxS? z!*KkSCX@EEuT zo(nI7H^2?I^7(EKXT!bV0k9P=g*`9_Ple~eOW{x8o$x{UGW-kNK!%6a^Y(Bq{32|D zy|4h!fEU6m;m_dzz?b1$@I$!XHvYbw!tLQ4xF2kUhrj_i0>1&zgcrig;jiE$@VD@f z&>W`r{GWkaz}avv+#fc<1pF#I3a)}Dz_Z|m@Je_yd>eiQ*WcEcXEV4x+zWmYw!kGY z1+(xtcp5wp{s`U(e*qtczlE>Czrj!8M%(%FZ4GyZ3*f=99UcbzU=e-;o&_I<&%r;z zzrj!7XJ+~P?*wb%mtY4x6lUNGxDt-SU?!<=F(zf_uP4un~5_5DvoC@D%u6cnQ27-T@zg z&%i&xci_L_20QxlZ4PI{z2E_`6)uH6Fb9u=r^D~TAH$pA-S83kJbVql2S0@y?c~e1 zHQX64fCs~Nco^)1MfeSP7Q6^v1#f}(z{lZ>@XzpHaN5qaGq^q63mym;!z1AkJQ|(~ z&xM!48{l2=VfY;UBYYQ5-^G__OSmJP4-bONVFu>m_uR`>+`J$w`X3r^kD-**!@ z3+@3I!A95xLs)>v!!zN9@G5u_{P6X4nKVt5_A13n0!gMWhWL7VzE zJ!l53hn?_n*bj^Fcz6c90A3Dng1>+d!Dr#C@E!OOTyIZbo|$kK+#T)%JK$lk7v|yD z;OX!@cp3Z&yaV13pMo#JH{ttm{v2PvgWzJg9A;o1ejT0xuYf;=zkD_jbDU=AJ!Plw-w zKZZBKyWu17dH5Q94}J6HQX64fCs~Nco^)1MfeSP7Q6^v4R3?@!Kw58eK&!# z;2v-hY=Q|m1doQN!gJuI@J{$3d=|b6{|f&DH?8&MX@N(=6>t?i0iFdfgjc|u;ob0I z_#Au{z5_pk>n-s2p9yEd-Qhm44tBu9U@y$WuffyddGIp$6L<%_A3gw zIX8tha1PubHp3+BhQsg}xCWjJFM~J0yWm6cIrvBTF8mly-`kgOOSmIc^n#PqtKf<7 zTks-yCHyJ;C43aV0AGiHho8dF?C0;Z72E^v3mae@eg*cyqv0v=yYPqb8h9&w2tEs6 zh3~)*;k5mIxi*H|!QJ5AFb3PK-=8Gal70A3Amf&T-417CoDgCD~U z5A@~O3?2;I;h``CSHk1qY4BWlDZC#39Nq_?f-l3j;D>O%gM4{5g*9*v+#fc>BroI1Q){_;hpe)_!N8|z6AdS--LgI zAHxj~_V?c$&Vl>EMtBH30uI0t_zid_yZ~MfZ-T#o55Z^QAK=^YLpUww%eM*K4(>A!^X1$aZU=XV`@#lz2>dEs0mtCU z@JH|lcqe=SJ`G=ne}NysDfPZwpM#%=yTAqTOK>q<276!@o&hg_SHPdbU%}tN7vTTG zf51r%zFafl=i#n!Z&(LA;o)!qu7W4Rv*8cmBk(!+Dtrfi1lMcy<(Ua*!QJ6Lunu;@ z!(cxgfhWLk!SBPX;jQr3@Co>P_$K@poZ95ew+WmD_kfFFBTT?v2?6`l)!1aE@Bguj8mgMWtqg40@jc{YXH z!@b~va5>DtJp4L516}~Hgg=A-10RFGgKxn1;nY^%8=M9AfQw)w?1CX2geSuv!t3DA z;r;Mw_zHX*egxN-O>cJnW^j8r7k&}8z$GvRv+!7W8axmF2;K;P0Uw6Hg@1yZF81ZA zfpg&gumvXJ5IhE+2`_?I!CT-x@NxJe{4;zXPHFSy*cfgHcZd7J2G|9Ugv0Pycse{E zUIBjw?}1Oim*89QBe+4kFV_}uM_3CFh8^&5coZCir@(XIW$;FLH~c+(2mTvw(BaFm zIh+mmf(O7>xD@ulmGC%t8ax+X1#f}(z{lZ>@XzplIHl8<>znX<@CJA%d;mTTUxt5y z|AJHEKEKbw&%<5d0{A7k7%qc7Fbj`?r^4^TAHr+l?eISM6nq)J1wVxA9pcNmDXf8W z;Qp`~CSf-mhR47)@I3e?8^dkku5ckd7`DOXFb#9?ShxnB122Ks!Q0`z@Co=L zd;|Ui21#Gejo?;rM>r2209#-Z9tj8G7(5A{4SxiG0`GwL!>8a&@J;wWoU+81a|YZ7 z?hI?;LGa6PDNMmEJQ|(?zXLCZ*T7rhJ@7I30(>352S0_=m-_N<0cXQT7>7r|0XPD` z0ndaNz{}xH@E7nQ_$>Sbd>eiUr!Dj4+5~O~cY}Mw7;J}!!VFvqkAtVdbK#}%diZmA zAAA!29{w5r6HZ$0%lTQjHQWi#hX=w|xD@ul96S!54!;L~3~z#W!$;ur@HO}z{1k3< zs4wT%aA&vx9t_*zVXzMt;Wyw}@FI8>yanC^ABQi(Kg0Lol*4?vHip~5-Qm8l0UiRs z3Rl3sulRiO@N4jNcpkhA{si6u?}typm*AW5eQ0YL+pIeK}{sS#S@y4{U}B7{V2B6rKpb1uueE!Jook!bjk5;UD2&;lJVf zp)cpA@C$Gc*a8zUge%}EJQ02iUIed%KZU=7zkx5n|Aqg6la8ca!q3B9;oh(gcEZEq z09*x6glEGaz-!=b@Lu>NdjKNO$6*vG_!4u)x@CWc3cpJPIJ_%ofe}NysX??zYGvOEDo^U_d1QYN` zI0TP|r^0jKrSK>4PWT{v7QPDq3jYH)?Dyr{0`36k!2{u!;WC(pE8*ARH{tp4a(FZR zC43bAKk#+u017C&j!cX8vgT7qbz+K@!umN_#BjGSS7M>2zhgZO#!F%8n@Fn;b z{0MF^#g7?4&;bZU__yT+dz7F4l@4*k?CvfUY>JM%Vw}9Ki*>G1l7cPYR!-HWH zY=d2JIs7V2!=qphu7bzH6W|(n7CZ-D2rq$G!0X`6@OF4Nyca$UpMcN77vZb$4fqcH z2mA<5%KQ4<0DcZ`0k?xY!aZOu+z%cMn_&lB0uP5h@F=(vj=`_PQ{b8K9C#7D3|Ma1@>dzYQ;j*TUQ3L&j;^FM{;z z#`S~XpQJxEHfg7}5z1#&dQ;Ndk=`Bd#qs?}A4GbwQTZ+>JwW<<@aOOu&cAHjFbLiu z{h?9!{e<*JtCaq-_B4e%8FhXy<7a}P&-mFOxQO$Y89x^UH<7-}sO$fS^rNJoB>f`k zKahTl^uOU}M*a6UHmV$-CtX8&57P5Uf06WJ80YvAP(P31$}>cIjP!A&zhzYUuY&&r zUxWXIn~nMF7QimJ60R|-yx%p>)V@}vuQ#ebZYKQ;()W=54e8&(S2+F`((jV~#Hf7N zU+wR+wNdE>qz^J~76k32mm788BS`m?9wI$P`Z&^SNM8o8}NZG+$!M&E}ql3|}{@zTY;^ z(mpDr*FVO8ZzH45Z%KMv(z}q}lXMGQ3cERflu`M9jr6JTOpadxe+gfP>m94_)oA}1 zqwc?ladr^wPrA{l=lU|~C8Q4{ogsY`=@HULlRlaB>7>skeW6kJxgI{m`6rA!YJW4* zZyI&~zmool^rxh!ALq}1-l+2L0vEu8IA2e?gLJ~E`{d!b;VtkP_;61vGM*1Am7m)rj>8nZK2JeGUaQ-FuM~=Tk`d>!f|1)3r_uUL` zZPf9dN$&;s;dm>|!gJtlMm^Wv#@&M8H>968>bZVT`VG==lm3A8$D}tn-e3P&qw?E| z^me3og9|ynAL$0tt)!Er4<(%@JwUohdNt{jNS{XfTzCn`FDHEye30Y6A^rcr*WkOH z|0n6-8~(Yb8TDKnliu8@`q~w?!hWN!%NqAo|0I2yQT2Hi=?h3-32%XSaQ;5h50ieD z^b4e4BmE}nf0F))^t2QF{iYjLp3O<`1b657-lX>@9W$!jO{CjNcfpY3E8z(o|317G zJ`LYBwgkb4MwR0;C;I$1hqH}3zL4}{qpnYKyqDw0!P7bZebQIJU&80%-{2M}`TOl< zoUi9H>VECU1wn8)={}?0&mieh(#MiMmGl{;zeoB?cpb-YBYhX?2S`6k`nRNCB>lgn z{|P_h__ULKd8Qlf{gK|rsB-VZ@kOMUz#=?_^Jg0O34-sFzS5}YypHs3r0*jA0O?0b z|CaQNM&&c(R8i&G8txAFhB3Gdj=__R(p4@XeYsIO)itDVHA=_3lk@{d>7b92e%>gZ z`S+y%Y?SW*p;5NdCmf%?MrqliUofhidl+Tg&m$d&-SBvL5xgD-`k3B26-u>qX{ln4 zv*2vFJDdymhWo)fsH%70?}Q0>82l<6f_gM}z0@m54TFvs!5_ja;kEFm@HY5M_-ptG zd>sB3{to^H{uO=*KZc*1q;hO1djM_&XF=Ov)Xv-QNf;NvePJtXhfCn0u-~Z49)txr z3cm(VfNp;^U4K65AHpBOYv51dE%4{?5%@TK4!!{Y1mA#vg@1=1!%35Uxi^NJ!Oz1l z!1-`*cp!|yL*Npag1zt<_;q*+JRM#P-F|PXmm5g`6g~*uzHd7JH0j^Mm*A`L&+u*d z0sIe~GQ~gl`fxkAJ)8#@!WL-1k74gQ1>JseN)M4<36D3*o;V496MhR`3NMFlKRI20 zBk5nlU&DvtWAGLDC-@imSNI8>EP-IfyH4z|K}csM)~_Q4hK zIQR{?2A%;ghL^!>;7{N!@aOPB_$Yh^J`Z1pe}wNDWk07 zANZN|{P#Zxw}9Kg*>Gn#2hN9!pxdWU<)|m!4BdWxI(``G0XPIl;A(gpJQJP+&xcnU zX9vNx@Md@`ybnGEpMcN6Kf?colQdRZe$(Kda2~9O&Cu=dr|SuXW0k45>e?ool7SeaYU%>~U+qY2Hy+HaU z_%{3-{1AQ&r)tc%`q}_~4sHr(!=2$=SPSc56YPLpFa>+z5L^k5H}0nK0)7*I3!Vor zgqOn0;SKPo(Cx3do9txL_rZtY)9|<(v*@z|G;-a0lr2Z`@74 zAw#+r?gtNq&2Ta7f^L6DeZQadAS}R9cozH)bo)H&dzX>E8eR{725*PIgujMQ!RO%1 z@Q?5<_%8eqehfF10&ef~v(W7msq{9acYwRV1#n;30^48$E`wi%DL4R!U=fZ%x8J1h z|4q{0f#<;=z)Rtc@MrL8_*?i1oV<~L&TU~0tb`w~TwrKMya27sJcp)$phAHh4dL7(NM~g)hQa;G6Ir_%WQcu`kDl@Uw6;xE1^Y z+yU+m=fZvA7hwZzft@e`dte{T!U8-Rehr=sPlMlv=fdy9OW@V;dg%7kRDIt=`bqdK zd=b6^{|f&OKZ2jYX`4`Qa4Wbi+!4C{ICbB>NH2i(uo*6ehrtXSfH_!%$H1?{)8Se0 z2k=sO6}%4K34aOihY!Oi;j{2X_zL`A_!sydd>?)cC&_lQcD@1J2yP0ugtOpmxEq`U z4=~CPb}(#)i(waB3Xg!@a0Sf5Rq$wd20R;n4_*W>hgUIszp)Xv!8izhA5O1`!>icK#cBAV3F8C|soY>fjdhRofHF|ENp7(a6p6^wop05Ty{34^CXOZcvdJd;otNh=$w92hp29w)q z|0=h#aOqu*Dt`m%7Nhb`l3s399%<73Mm<-N^q5i4_hZsm8TFjMB7Lt>H~$mqH;j62 z`;jOs&s3wHe`C^{8C4H8q<1u`KIV~LXjHu-$)eSdQS})Ae|dZNI4h_2fBZh}y>_$r%3Xgv8_jT_ceLlbM_up@? zS9`tR>v*keUF%xwUiaF2vU~(X=yP0_Phd#BX8B5n&~Lkr?Q7CU{cGQ;eN9d0t~DLn zr_)}7_sQ7Kozv;M+77i|%($HS{f6{6O$d_x$G=?rH$&vFlHjYApu%Wjq>cSgEjd^- ze96Jmac%rd4p!{!x6j{i$-z$JmK>~|4%{hk|9*eo{(Oh={q{Mn{%rQfFGi%_zJu>Ee%8Z?r{R6dY|Lx4*^8SXs`!6y0I>v~n zrw{ml*Y2-#4i5+2;f=BIE?=t{*EJ>62Qmd!-tIy9sXwu@+0~%4AV2QY%wPrU)!Ok zA{!+^_(*(hZOzf~eD-5KH5IK|%?-&E|J@7CLtbbd^g{bLFLZwOLf^l=(0{-S)h}Kc z_?H(p``HU~_IqLQCoc^B=!LmIcwyf6UYP%#7l!wFVZpavSh&{<^*3JVe(i;kue>n2 z#|vX$dSQIG7Z&aE!sa`@F!8b%7Qf_$$&FrEa-SEbR(WCiUN0=Y#|z8u_QDn`y)bi` z7q-0A3tL^{h2;ypu%e$Aw(jeNm3_Rhs<#(bH+o^41}|)@ys(|$3u}B{*xvEN4z?F| zw7js^^ukVt7k18uU9w?aHtd=WyJf@f*|0tv_Q-}kvtch|IL5!McI0G+X@mxCZ?v<( zL1+U8$p6IOpF)VG%LpTEuZ^&aFx(?##Sva^r>$ay{Fi2E8fFHeV|6tuvhmf~kmtJm z$8%l&mwp@f z5n;p+C$BNmBP4!Nw=oDW*#6q!u?Ww<<2#3guxY>+!$BBYaCkw0gL0X@ID|02aDLk` z!i%3bZgvq?Y;g)3eQ4_ z?S?Uz{3_@Nq2GT}*#d-*&t6c9*h}%B{~GwQkooYJA@Oe|KRliyT*Hq=k{)svBb+;` zwr~mgPwzam6ya5ggt1K01IBU*jb1Cg(5S|qM*hJ*8g-r;RX?;Hg;e30(%p=a95#URW^?k-5oZQ|t#v;7YX=#i@$bS!6Js}*J9!6 z^b&-nk!HqH;n;^GOvek2{MBXTvSoaBDW)j<7uQ#DpCPJ4~Kq>_k{rR%Yz+(!+ZZT74#T`5s|tD}K!td({TK z{B{tUj@1xAIDZM!$SpG+M%c0A=__4?$FJ|$k$=x;+DX@6P>pc*ZMVK%gOLAf87>&N zpw8pV>Jc74v#_Bdo8C7YHf6&h*>E_*9JkAa5m`P4;iVRyqYzF=+co15PWs~b{u2<^ zUwy1I38BeZfVH#@{&5Xv$Thu9`4XFJFFDs*hCF9wSey+j5b|FQ!qg5UT+48=5tegU z)3taG`?3?A)WCf646`r8Cc|uEXc&L+?*qMG0e^vzgz}FeBF4_adLa>xdAEjcf5r_U{{Zj7-^+=PIjVU*vd2dP zC%PcoGX2YH5F^()k^?0s(1iJFS-vTwks#+uRi`n*Qj?hVB2;Sin#CB$R|2u@yBX8i zk}&}ve*ni$lmnl%Ok&grgCUyZ!(UaU0OLj>eQg_j=xU_f6Vmu_dlK&R;iEZPHSFWz zzUqF!3S=&y-f|p1g9UHGM~I0=?w8P~^QK9y=J5B)jJzD@KBPbk>)T;9VXjy3Kg@@< z6vyJx9?ZH0w15fu4nDrZf60+=*kh{L%l(Kc{0>Ur67!9+e#EfrhvDmd6RbR>7@BvM zd=rIOdKdKRJHw)cjt&h1nPhcD4+46{7?8D$Or=c$HwOmdn{FlAVzJM0^-!>L zt@=KYH0Z9y82e^e`%!#u$ffc5W?J2c;ZJ=Qx@TaY?we)Z-3yLfyQ%Mn*5z7^7);;6d}9>%xQYK7wIsJn?>y~ip-&Of8>DX7|auP`I#UILT% ztrF(M+|STw-+dO<8;H5}X|R7touQcf2U}PzEF5zeqno}5C8ry64-E%^jj73hHJ>Br_vuL@C zV(!Oyj`w|MjlrNUj=4Wz#qc$=+4t2k_jI-%6!t*O<=bvwzOV;l?n^8e7WPogUC!1c z_Ef0n;h394$zt{_^kGfR9RRcO6-myuF}Fn;thunKV(zyIu!OLuQ744=l}NdDG1tU^ z`%=QzqkqLXFdPyytVupP|E$Hk+7=Rpy)4~20{r7*z zNoJ3Q*!~~rvh0DdYX6TIG{fEl&G>)fEVuc$DE#}Woamg9m|XsC7O(f{4-fB}BMeo5z{o8CR zt7vu}@JBYgSoArE=uU2i z3b3OdOasrPj}NE4aq@vq8kBVc(Jh8O&nE9W|VY)$H`ISfG6m#82=FJPV1NO=PsG!kBi=&R~2* z{m>rxOya0&4d2mh(!Y@>p8PWdJlTh-Q*0%-z#f{Nl|iNjR??64qS@Ib3$5fHc!*|G zx`8ah%%hkrF48wM@|lTM2w&iFY~np0$G!sg*K8W^G6mM5SHT*jg;)scXbEh;hNPS= zjet4M0DJ~VGY6-hm(9KxBImr%a>d`lS5%uhAMOHC{GGR)tsE3X9gh*p*~XG#byo%O zN6g|X?n!e#eiD@}O^!#Wa<<A($osomNq^~KjuO{pvJCgPvY2^N#&#^hqX~-8~!5oKuu>#K3{kZRNdO|#~ zZy`XU1xBwac-G07{Uwtp7{RltB16r=SOljKn~Gj4cn-0p9t#6cCAJmkdvMxYsM=9M zIOyPX))G)34+K7!IHYcX-w)0p4y(HhfoBrCYBV$#oJAa0o1oI*Y+8J=Ive5y=R5+O zR{y}<44y|^s{X_dBRH4smZ>$^xCGB9ZlNxtoENZcM!f-R4PHoGp~egVp7#stuU21T ze1aEI1vTn{I^c_$r?zC~bbNt{uuh#%(H0Qbt2`K6@Dkz%H3uURyp%=zLW{iSlsFgT zQ5<}lRg1!&p&(g>ts~AV>{;Th!k#0}D(rbrVHaU=g6lK6RM;VSf#3$>kQ!VH`~qu- z8KG40MPgUg!|w(+vYxnVhycIT3Hgg4)#*sLe}w%6FQb6|K=6hPWGp!Y-Mf*Z8ztjs zoQXXtv18adLy&c;gDi<2&{#Tn>yymR!C%JuvwgXZINO)oi7my~<-t3Mvwd0a^@Uz6 zcqeNKh<6L#MI2Hku(RL_YBH=|>IuA(*i{d6aPFp%ame2epw0=&r#SpnW6&I<50aaMrM#90B}IZA+cJprmXV(-0zJR!9jOIL6U zaUPzm&{pt$ww~Z0p^67TE`YyK3LD4Zb_#5$L&pPuLhPs_PKi&61F8r7dGIq1YDnD! z-yGaQ99A!)p5W)iu3;}C`C>ime-%q(Cb)~wrqZq5M|JDVqq?={sBV3ARJXo9s$1W9 z-5Oto+V@gotTG>={@}O8Ac;c|ClvhYvm;IIKdPypk80{)UQ;sZfAN|UTROm!j%Q2% zCJtcOu0&`D(rDyY!o<9COyc07OP~_z&+kVy^2bq){OL6!cJd#u5%FAq9o3)1(jP7T zF-+-@&ZFBfO)5L1hm%-BD)cEF5!+D9RDC8N*Q5R68AHLK z$vaLlPO^|Gf@*QGxk60Ym<98MSXxBQ7h-FXHEfEoTD(SqDbgCbSEK%5p~>4?sc_Ra=~GgMUapm^9OHHm0856{IBFMt&VgD%-|o@EgIj^v=;TYfH^NG%_O<2(~om zu->Fbo>tPdp}B_%mJ4x=R4CZi{0H+Ks6lkQY#ynnCR^!Saip{tf=X+G88d|4ZfwTv zsYb9u1jiFAR;OTVNeJjsr6843m8;LeCO23mB(CqE`>z&Ktlz=jEZ9a!T6bXu9YoxW z5un1MmRj=|w4^sMV<*8`IXg=!Cw9)cMzD)H0+|9{-|I{+%JdY^!acz7SWzh0&0Iy1 z&lx}02zEC)e~sAbIL-*x3$bF8(U%^Ao!GS5Na!iVueq5F_A+D8GCJ=D8_l06l4z^9 z`8%+o#YOco3*cfMeJgd{*Q@{u=v*w*!G2~hkdQ`#5$tac2MHTN77fuDASJ5|2APQ; zh^Rz-j>FUBU>T$Nfe5;_9EUfYf?XNS4@A%{9#-!Le z6VEY%Lrq@xnio4~`ef`QMQw|G6=5k+L)yaQ%zYfuhN7kAo{!S-o;Q^OU%;n_ zfMK72@QR3o~DHEp}dFA(``m`E@y;NS?6~GxI zQNeD7ZheKeGS+=Y8klcU@w;A_@X z0<|2Lle?HWr07a>ujgY!Sbc@fSnd*H7uLqxXo(?%P$0i-1*?7t$@wjqY={Q(GsKRO zcnCp7e(MZ8m})x$nJU)6ZsUVt1=P>Of!k()L+WSdZ`TJntiJ66 z-2O~pSN)3ZYJP`nfaB_U2$A3MG2mj=)(70_3*fZEJ`s-&ym^u_(i{Pv{e}1e@w+03 zjz;e?z9}Zr+L|FKD`qjwazooI2O|BR--}YnhrV@)~~e#nP-+` zoh;DhXw`R-xgP3s_0KRppDo8;#X8vs#3v-FFUR=${1!($4MC_Dk&cQG>E!Y2?+@g8 znR(da;s2S36v;gG%W=MDCZ2+d=A^G2fKWD5kUC)mm3dS<+2l$lvm)yEsART!q>6z@ z@=)(bR+%D@hrs(#to$zjpQ^wNs zGaz4DoJ+QziMbcvBiXe655_e7m32R|Mf4w|LB5tUMR4@tpuLUt&Vv1ib8WBQW6DAD zY_HybV=W8k+g`mUhCdvZY_5Kx3rK;@dgHnj`-pI%lqoh!)8S_JZ>YDZH9TE7W>fZ} zVrVEFmw0d9E7-Wq^CBa99Xgf{D?5!ioWq2ZA{V-Uur)ry74}FZ=mgwbxKdg%^f?eP zTqOyn7BQTO{R9tdpEC+DJqyi>|9%m&$haxPKEFGX%4i*lM=;hEg{^<0q!X#Ustjty z@f0k(u$s}1caC-VNck3qy%WkRZ2uNw>~_dq*!>d}NyOnH!-YMMgXO9hp{T+Jud270 zyOG#YpCeCUZ{mQO0tFQIA;we9>ky`}DT1fH8CLN3Y!UW^a+rYq-RssXO`??3W6!kX$)hOlXls z!wKmf*sT>_C1q;$D(plGueMeprA}WBS6O(Cl>_b6>y=d1VvA$npr>NE3a_;u2N|bd z7zT2kMKhkDuj>wSy(n>(eu<{KM5>+}8`y8AQFw#34sy=(#+FdV8pnDL2INifGLHRW z%gDWrom^_|XD45SR1e#QPgz5uJ9&^PeA@a1Q_0X@1d;wsR)KuaP`ECuz-Kuc&svyv zaGB%r+*$aXq`3Mp4dQtralM6Ov)*Fc#qOoF^$jv;%WS;uge>}s|Jo*Zh9a*Is|X#&I$|mA(DlRMAH~d(#Yr2 z5T&BISfsw-l47W0;(ro5>UoT8WG8Vzy+OQ-IHY*(A+nn|thy0@N$e_Kdx-2Ij;sE} zUlA7@(Z4{_krw9LXieXTZbe!NHewUb8E-@?P5w{>UcgM4YecF{77FNyAK9vfgfzFl zkv1k37S`9ok|J$ort%?%y^2PmpFpI8$rBZQ2AoTzlVC&lz!Dv)GgqKezB^zQ(Z~t7 z#}k=u7M3A5PwOHxWP4`l5q&{s3NdvNDvQh#V(Ck$fZ0N9{dob%9FyA^N6&yNBj*Y6 z>-X62xk3W^5-b;y^M&N-NF~SxB6dh`fV+=eC?u?Jfozd^Qnjlmz?35w35n?2+k#vy zBpSoTmdJdOITo9II>-WXP^~r3g(886tu;4&fI_5GLxk%dC)V-sf1 z!q3#0V_+gZVl!u)ZbYsS(kC_xBXXtSfw39Div$nTi&)oHQhcN?!{QXVTF5BffORKw zjgZm$+a{33LdIyWk&$bKoS?Z#My?ZbVvMU~9v@CktIUL>eFgKZV+;^ZjMP4 zxlza|`i5R0HwigaAB!=JEEO_N|BSUYaWu zP2K2ZPF+_GNF)C2F%_H$BZdM`S&L4sRsDMcPo)X&Rr44>?S52wK;9xm&m}%sLLU^J zLHuWu!xx=NY?#UJEIf7^j^t_Eo`lZ!E7q8E`2HJd(myt|2lb2&OqnFd6%`%fWS|C@D%r=v>jp!nhIcD;MHXv7# zoQE>7r|8ugkhx}ZGR8T24O8Zs$$!A}Mi)N`$GE^u-T|qit3Ss;Y%-JFvPB=;3oUOo zljGnNqfc_jcfd@JB6*49g4bmo8$n(s$ymwOm>tnqshw&od9MxfI!TR{JQi*s`UXj@ zm3%o3vWcY5O8$$2zC}`RB`+X(o20=?K7*Mb-Mj>K_O+6VdV7~H;Z-ZicR|tj*q=>S za*_ghpB`wlmHZ$8@&U;fD>(~x8~u=EtCi&K!{}C$?N;&-DM=e(yL+krw4^oJu7znIEft2J zv&nHd=^;O+aO5?!Un@wy8WSz@y7*>8@8Rn3h7d>Jg>i^%lC>lN4Z!V%B43z%A)z}S zgQS0E3;l*JMRsNjeFdA0>=F_%a$m)`Ms`a>(E=148`)#lz{F+068YMsof?|^fXH5x z-Xsv4el}e7cakfl@1<}*nOyP1dJ^UNSeHP3x@{24saXBZC91zl6XDH6UMS|iO zkD4OC2}$dYFp|h2voi$9=*yw|NQG4oQlYm)^^w-HDH{VV6+x^VCk%n}+1(+?BRdH^ zZ9N9F-5P0UC1HwQFWP5!UHr3Ik&f2k)PH-?$zoq;=~)UXU1V=H*XwLoi=CaPAIw2Y zcZ>a7pgXclJ*4J^`d9k+V@0Ax`VTG=#|c@iUnV(T$P&E`jx91m$Wr}vDac46%e*d) z60+Ru>}cuiO8qqKB{Ih1ZL}@u<`w8+bSK)5M^3ir#WiouL{7*(djgPbWOpr51VoNcv0k&req zQ6p1?Wb_SCT;v=f_1a>YsX|8RDh|~&k!Om&xj)EsA+z)dW}6`bVE;^S#M@>vR{2KZ zSnP}rnvrX*ci;m&0k6*rczb6Qyit1P=wIPlBR2^N>n4h^R7kO&l?J(4NQJ%;(>-#F zkXro@%%R8~GI9-iAG^C;NMC&{6?Uhbg*0iN?nmyCGDGxOOxwtVGW28g9lb!j8)9Q) zb55UWM7#@PC+iz&rr!OqQ*@7hAdg#oa2=<=Vg*kKnWRT>7@rg}U7uD8vR24ky(|yp zDIp7VKKBRDhzb_zdpJAS$wSv--2uiK`M~-R%30!`-U#xc^(Bevw&6H$m3(VV_dP7X zkx!))YfZPO1@@V+ji%c$3T%gTeY5F`34bnZi|L*iK-w3giLIs^qLOw>x$UOQFO@}h zNzOf{yN!doTi9OH{mBpZrIh>LbPvGYN4}CPi!jU_=Y0%NK6mnzRfZam#VcTGzx>S; za`JIk?qOY~esAeA$2mS-K6?6_yl}mD^N*!jxlIW}tGM zdxU`(5eJM!08_;myY5C79@_y4OX$@N#fRb84aBCp2@@rDBOlo<#b1<(-Sj)M*osfj zv8Bv|Bi}=)bwupTYap2l)goaJZP!pIHv)gfOqMzwi)u_3AzPJ2fWMK#ireg%tVcf8 zu@qRABfokMCLNR2NR^yBZKe^E#V8<`Ct|V|HB;?b=MStWM{(yFlVvHWZXN;r6J-b~ z{+v#1Kl9|N3Ou>SekRUW$77^p{~`{n)7ar(hzrz+9>52P3)L;?MC{+hT5)S1`<2*L z+}X!|BaWykY2bszQFQ>bD0YZArV8<(6Z?ZQ;B5i+>#_fE!`Hlo+x6IA#OV_3)?u8^LxjgRFC>7~DCwtOKC`W0ALENpT>`)dARKuk-@5KWtjB}^LJ zQ152W9mphhYZ}p;AzvWYV7`JleJZuoC=Y>#o=DP12u>Gmm}GHmi0MPDJX6Mw5$ruv z#*RPgnKCv)3I+5#w7!vM5JmXflFjDxah+FirG48d`~pi;*o=)c7s49EMaE7uW$Ulw z9Q%p#6zXU{Jaz1h>?7%I1t4b%DHcZfO0o4a`cLTNX+9f-JgKKQ zfV^PRAFS1n`9NM2@|0dhBiSg~p4N9_or%39d3)a z77d(oi{Zf#>98q!b|U19QvT-A>)?-TW4p{>5$DEe_(_b$2wTg!PsP{7OVBPG_u8vb+$Mc0-8d^x(Eq*R@y^W=&)W-hu2FM zL09&0vBvEA7`J+{J{H#jZ;Ki0C#%(Ty^>C>zbs_4bd2lB03mZVznv9p5;9NQ9HD_i z7U;1wn89+XccDC|$A(#a5MN}JE{=_}_Co$5zIu&~7x|k{nlQtNon}!p&G~jYh8-C4 z82R_(;~YC4ns}Nn_^g06{`^+cEZJ&tj@mB~FFJO(?5r1bl zEJco2GwMFf-uMp2SEvgxsp4OB1g=(B!%fC_GQLKI zu&%^+5!b4xF^S?|64$9gFwOWL;(FDBZGA=DpsvL*#=jx%tKR7h{4H^l`Ustie@8q- zxs?A0;^C@4>^=S?@d(wO^6#f?V-$b3GyXH<$Eue2j2}D(pX1aO@I~=M6M!eE7smkq zeiiT}RgVFW|H=GQ^yTcMVXgw1uGe4@j+;Ve=?~%{w)qND=IUyy-4QZR-%TC)%`cI% zKwrfUDIp7WHS8|l%=`-}i*zH5ES_hUpl6HqFznRgVY3!wiRSNn#7egEMMXaE`xd`M{eHaTx zyo32T$R>Rj)i%K74Ta5mJ?&wrxeX~>^x81UG3H^At$H}EY`B?5x3+ulZE0~KK2~9^ zqY($$@gotxAwpi?ax9NT27rTY7$F~g3PV{w?d3R0rg4BJbBKrRA?{O<)RjpbZ!aku zJA$zs`M+cTE_I~nS4gs0UD8(Pc%L z$hcUDg`r3urGi#+EZkGkmCO{vR|;0)Y{qF`bT6CW32$@nO|y}hk99MUxMdR)o<)0! zTX}8Bdo!C@M&06$a(NySZewA8AaUmb<~(BVjR?K!9%Z3yb&nB;jTRT8bLqrGPl0*TJ^I1=lLYt(n6fj3a$wd&?V;1^hZy&8pmTjIrm$g^JMV#!NvWS))cPPoOy zOB8cc$$$}qjl|084UL#&?CZA!YuahjnUXYcu zu}3@2t&LQ`fdO##cH*6X#OA0*yoU4~jY3VGfmc2r##;4Q=f zH3}jp^puz}wi-jJk*Qd_-KWav1+HJ6EfQ zazM5dk0=?=PJco?t7JHp@hL@HsxHO!NPNb!TU7%Uzk_&(;!o!#J}2Iz`r|Y41@ZUl zM=WWHoxXaU<0lVLN4t5E?|_x;3vm-)N+<2)Iv8JKkMt5J(3m!fucVuH@>xiq_?iT# z*0+Ix-|%VJ{uaM z_!s7jFJzvvst0x~#q)^AslCj95%W(_4(q&_c$KOR0naDilPo7*K(*ri)ALlqB_uVb zydWvQ{C@NVFQfQ^r1%PwdQ)DI6kkcwV9E=U;zcBVO?g35d=&}aS@8u)@zo?l%;dQ+ z`cY(?#?Be~W|zK7{o{4BFAagw7c z&KvX%OP%DT<3QfxI#=OO9*;_k-)6RIe{ur+RPp9+h^p}?Ut*ap!$Io($#>Y(4_Wm^ zxU)sOqo$5F97=a&PKYJ38p&|j$R7mE|H3V-l$=45Yuu682E+EJ3?n&}7eehf8USzk z1OrfB25u%--;InF(MH5nykCHriXOmL1%K4RuGnvJu}buKDep zM4Y3zlTE&o0S>7vVHC+%IR(S21BNHLnR()hzxI`Um$*nx#T-b!N8DT$l>%=ePN+Mo zf#1&n7puJfz*~va>Owp|CASf0)CRWYePvC3gdIiF`^K6YgrzbmFX$@OC`|0+ZW?p7 z>V`+Dq+GA4Q4!F?s;(C7B~fI1@B~OFJ2q)00X1FlKc!S5l_vkKo^v`R3VB!*o3gQzBU) zWR`AZFT7*Nx%zuH=}HCX>kS;|h>#2P*EEKxkPG$slprQ#o_@muiJLUT1^R;4AhnXR z#K`Ba>UhLwXHKH10b?Dl=bKAa2W>=qPy>d#6bo0hC$XafLEv7*0d+k_Br486tQs+g zqK(u*T%7?g9PLf578`aM3-@6&iC<#SbF?4daH`qIBf5!JYN!Y-Dmsujpf*4S(LtW| zTIhRpC~;iX!MdWy5U16@;I*Q|h$|Ei8l%S&*C@V8iH;zyQ+&k|9ZB5a&29cFLAImO z10CVmqfO>XD4;KaXwgBYY{2y@{ znWC3qB%>!uJG1n~Sd^k;h0N8P;5nkF$ie44Js<#bs*nX*?gxw$vQQs_exqlYXQQKw zbo(|SljJOKxn6IBOcrvN=C5~0&la-M$ma`OmJoH}?j_HyF8rI@Cxe$v{{&Sh2EcIL zl4}nmRc#%G=lJ9Xuq9%4I3?$re-6kVE0)a69xE2WUzW_u z9xMJ6#$V!He+uaHu{$Z5BQv3yUW^(_E|h@|>91hbB^OI&Vf_j#m@k9o>NGpDKuB7j zRR(g2l&RMLq-d9l{%Uj`rb5Z(l2WVBY5{VE7*w6UHy7ke$yTqMVb52xNJvlpB(`}a z*OS<1T@JFY)dS zRXgqpc&sY%E)BJD+@CN@N^X;!HIDoBAh6q|mU_qi5i_pjZj(=l4UXHg6zqPHs;}b) zIiwE@>+iU{pi=Uv$r~z7j(a+tFJ?OZF@ckuk347RacT+F#347FWE8vAnwh3F~xcxDwO16t+ zPdM&sj_GHTw$^bkrq2E;t*>+3MR3F=JB6)x+*`VX?Gm=paWALIekqc@>bU=)cJ~O| zgcjfdOTH4e*>R6gfgKW4-GUZIgZ(b8Z*|-suo9O<<(zt(_QFH6mr`(=jQ97!z@*&TfvTx04IApy-_Wk_8rBqWz)Q@F;jP$_dK zqaM%=3vlon@oNS<5T^1CCHm5FO>Z5{({MsdfR*wf`qeI zodrK^;>XF1e46MhOe4qp&+lM)q0|oZAmX%U*)ODVLqCP(AoWl23Xc8+$*Hd;1-Fkb zV7_lm))QS@h&3hkqge&$uwT=-QCd=`EMce}(+ z{c2t`6iwgL8|epSF~+wuVX>)0UQx|E%ckOJKedxMns^{7I9*D)ZDMFCv>3nyf*#oNy7^`?A~JRxuD z-5j8>6@cotyQ>2r1s3OK*mU`)j#Ap<8^Mj1dl(g^Tw$9n*XartmHQRjE%!>SNU69; z@u}s$fX=6igneeYGIa?50=fC3!Q)s(w zrM>Sh_i5^;oz!yBa_2FvM%W?CJwQ`zFYI^Az3K$84pPgXmisfc&{5L>kSxH@+U9Db_K;^QH%&iOcKT_tUy?G{&p zbrW{E?QVqQPSp#$!gdSk4tiQNpGCI&c?isVHMrPzo9IybNX~0*m)~kl^%Zs<4ku`_ z{OKjJprNb z^iGpsmT`3sTxRKA=Iba@tS`h$Sh~Xe3?!{zYzwkdNJjTTFH7$>|BaLiT@(ko$7~M8 zRqK~>K<+g=fz;qA4{KW}PxG6d-j_e!4HQ6rh$c_4qj(QJFLFPk`L%lr8$DwPnlD{q zz67F^sH5}-vn4VZx;y2&QHY~EU{p$P5)#lo;Rs8Y3JJ-p|I(XW*lCtYaiVMjlG9-wVp&);*C&&4Nnc5)( z{~syIU&G3A(uhfRrGzx{g|V8%gDEl z@zrWFwD0?fxQ*g6>id|ut(uIzitkh6c8YhseDZ``qaI_~9Xwm_pnih8^2vSHT6sG4 z$tLh9l;FBlhZt5c#yH73)byp)O zvpfmctLNJQ%hPWUb-4vBPrp6Y9c91=GpMscZGr-Pf3W_(^0hGEVd8#zL>lpi__qG~ z9hj)k6f!`+4Ts?K32D+FvTNSWn}K>iNi#_qq(@>H;_?-(VrL^o(vGL*$CaY@>3U4}OZURw*4IV|Z|kzU z+$$X%P@OM76_|TcDewj6X=pt6*IdE7kq5u(!8H^5hyU2H;gM(&5`L)my9c9Xk@Zmbgr5tgV?&%-=%YhOy0bCeEmb zq3ui;;+CpU4RBZDR?5X#WV#WTtJP3mraN(k>IJ`+sV8o&t}g@bL0qY}P@Z1IRqD|q z;0EGq^$><4(?~tks51+J`!K#%{meXli94yi1;G6{7M;~W;{L>4)Whw7n^?9^yFQY3WLp>kl6(5I$iWLx%Qe!pQC7Jv+xjye-bXh5|b)Eec@)wA%6*VoO~I3v4-z*j9I=k1dZQcGPz+@bT=mPc^{Xv^;?r zZJpf~#Z>Cp;hyj*cSiLT&rT1HPk_jW~(Hzsoq9kT8YJ4Y9_SQN-WlvQEnv` z>!=@?Kg0Y1)e9?eE3w#+D#Z-)a9EAN{PnP_&Vx=ojNdBj3Xj>UydE+n9>C1Xl#l$G z@{|?8PDW8?L%j9E?h>RmK za^PO4XcrE^(DAqWtF*SF0jy zzRE8kZli`Y0AEO%+p0QPK>0<)?Npmu;ES23Mx9C-=2KU->UvD>^2-=sr|yCIlrKC9 zGIUif8GrfNz}?i1)aMn%-PKe)GnHRST(ACQJ&TyXhdR4G@KucOsjjCyR}=SAmDqrk zUqjrWoDRT?DNmzn!e{xlbTGZu`)v0*;y&tSIOg&tgOR_l+67ZBzk#w1QBO7k-*_S7 zhbNm@&rOVPvXaO223g9&1Mzhl>;gP82w(M~7&l*oB7^bmo&u0tNG4m!m#~VIuOPY7 zO0FhZNpc^4sIL^{X_8m0K z1TQo9Fy&Rjd3}lDM55O7a>>v7Kxz1bKr>O54dQxcu@>B&BvT zm*)E>NtvB|j^r(p7I=9DpH%)fNybjT%0@R+J1y;GL3@yQ?m!nR?BoN~+q(~e;2qZ= zSfR?_dmd!2oqV6xw1s53og9nVT>k#sARF!Ec?BRJd;_xIPS#i;+x*aV*h!9oTP^>H zB<>`q4+i;|T}V60o*ctZ?UNvmlf02b@)^acb&_3ag*!+(Imv@GtAA4J&Q7w1I@rmS zE_h?cA=yPz=Ohc@bjo*=baj$f(Y*H*q3U`k*_u85ijDSllKy;I#@%g{;bsx~&_qtja#s3TsC)%5cef+rdGoNRLBaQqrQYgt>{m62h}4(fd>%dbu|XR zqKWzOZ24LYWMD01P7G|s1Z&;8Xe=7wPqntL;xHNN3|K+y>Jr3QhMh)#TemsD{C8m| zQC}JRiuucdE8|qXp@t`bi-;Y?-|wqzP8?9B8Q=tQNF9W;tSlxDt2FZ`iCwjz2DpSc zt}cMXt4t9WtCl^1)5K}Dqa|=DaYl_~on^!o>gf@{Er_etOvY!3Yg8J#t(3JBH!?7H zD`mG=XV|0RT`S8okUtS)ZI!L>I~np{4BM`(qJ9kZ9P6njHq{^-xDBzTmSGQ3DZ4#e zJys0dj=IGH2q#)u!&}P%bt%@}%JwTzO<0|ZNm|)~^0=z|XyA^-arG=^t7VW6l~ zorsfa=P|&t^D9w&1zjmSzm!@F8>p;fTWQ0tfE%dnx}Wl24tE!??EVAgUya9`O4<1t zo}9AtGu5TkXHUA2fV!vya4*V$pON52!ODh%D4XM~!6)uOp_;0vPCW%d6xLPsG+Trv z!x2|KLu{&(A#K$Q893YCSP_ODD3@4S%t% zNf`YTs$TkuZRJB7Rj)7)b}Eg)uM$IYc(tn6n8i|S{lKp?{y6m%Mxp8r;^WniaH>_C zh)1YZ=wsEJ#3R*Ju(T?1-J{eylubPMXw?svP$iCgjOUXMqk5U^!wh>OhN$YJvk;S* zi#8@z{dVs-$n-!Hq7SiNL%l&+ecgu zjv5yRK1>|crKqgRFiApsGCN@k$<<9gKrA77`eRCD3(409Sg&75So3>vRmv3G(q-^F zRRJM!J%-IRGsU{}{g}8_IYN?pJ@!jgL8+ibkEQe>At`;G1CnR5FKK-@hbdo3MmMmw zu#gHp5B6DAAf#FkqFS{{%c{{|MnGI4b^60%kcf~5{ZEppkS6_$4xnx&iu+lRgqvr zf11k*ENaKmHwRdOkbqv)0i;++NKa!sEiH~hSQpc@%dG?|bG`M4P;3M13sqC~H_!c= z1K!$t3O6u)%HX}4|yUo zbQP_#r{jrx7bbF5FChW_8$3%@gJcWor#P7!h2-j9EkJq;$7&D*WGANeT9T| z6^E>!kOB>CRP`59s6U{g4G^MrabJ)oY1GvNSiwLc@z`-APB5wliO|LR+A5?BmXr!T z7jw93h{H#-Y8{}Z4wc&4>W2$Kj**lay_V`9CMg~CFWo_g3+bp2Q&q7l=%63-Apd+IAoLC%zv2ECeOl8{EdoMf_)-g*};;VjWXUwsRuK1WiT z^dy?#R3QWPGc>_zLI&w~uqane7cyAC2yb3BOUMxYGM2Tf*+Pcu$yDzgA;;*427;U? zWSHK{sXJH5aQ!$P!TCat)i2U0E)a5@uIK`Cp^)Qs2O9J|AtQ`@4%7FrJTYjzz_^=J z@nYwc@pyGH4yp^ARSTW7Cc-p7q`IyUjBn>r*ej(Hzh2q^vPg*1_mNyBB%q%rxmrjw zJ%e-X8s`F37Si|76E7B0q4Oy0wL<#p7DL8HoMXM9^^HlK?=W0|iNtaQP zHwc-gt4MAXGDkl{4c#QQEzoNUK$Z$wuJ`9nZwSaT zhpzHxU5^b|)omid0j-V)xm~gy)X&n;?+|iGCu!TuCEK6w8&Qxug&3y$c^%kY!tgDp z4{O0z2*bCW#!}Xm!a{hBMVCYU$Y|iF2RZfGUE#QZ#`N3&=D81G(XYD4IfwzQ{1I-? zta``Ui1do@hha`vjDZ6&jog=7BiH-RCy0uk3`ZHR`q;@k14BBPUVOWB6yAnY=o3#& z-HGH=Pf9(3v?gIl#o*WI%_MHsxx}-2_P*br9vw%J}o7sTK}gd zNV%lcXg`(ET1b06jGe0z(n06LPO7Sfbkx7neYO=+tGlx5c0xMoJ*>J$NN4>R2CJ&Q zkS_WKno9>Eb^2j8+EGYXy_(rN3F)RYoF$!wbl0C!qjf^+^@q&XRY(t=X%Es}NKZW$ z15{Nnq?c|>N7O@9)u4Z*lk6#^QNP2^H3;dgFQd6MiVphfPMiz9rGh5iNb~P2WT39) z>eNrjAbmcEzQ0s3SU-;El&WJSWr+TmE81~B8pUv(rn!&w@epu?Ud_2Z+DFqFqepT~ zPY^Oz-;x12NwSU89r}ZuEM$V7+ZE(gA(M0$)LAuN$P_(-KJIiO_&YCLLM95CrTO>Z ztIiPF=ISfC@J;r0Mx*oelQ|$~`RYLy=uML8eR9 zOLRAiGegKy{TF@WOv$!P^Ce2vEJ<0e`wRn_BV?uC$&ouxvaQlxX-Mb$K7uK)*7tL_ zbfF0Pu>O=*HBZPRdO3&jA|a3J-{}S~7V?-LP3q|&+#(WusjnOWa;v25(SNer%Y=NTH_$9^6Y{mz zG|St?$oJ~MY>+#og75VqO0Zl~_Ui~MxKmONcw5`MM7D#jY;9KvfsenI(`2O-f>-a& zIefR23YqS5rrjfHc$Iz<)9#ft*K|+g@U0S=BBncx>^@;p)16A!c)zfi>8fh5e+Y}4 zZY^tBEv(3Nk6~vX5Z2supKk{CkhG96-E-NuM}1u9i%s`Jvd4s#nC@p>YS;L9ijX$l zOX|QL7glPzkr>z$!pcl{d<1r@_lNu3 zN{-5pK0Yc>@wwO1!~W#sqvTAVJA$L~vyU$|Hv8O(+==|+<0JZ3pZgd082|S1@MOEs z?RNs$uRb0>xPEs6wR=#~>iq6a^fABt?j47-L%&1l`%3D}9As7`gl z*>Q2ubvlAINuBe9ZZX+FVGDxp?+svsgk2KExe1+Ij%8um+J^cbo%y?3nlPscM{&sN~YlORDg{|J_ul-OShO9Yzm#b!!i8&qnh3EP|t z&6+J}IBmXy%FWiay*A(d4KIYi+1Nk+jyQ> z#JH%-pdA&(f4lMDTz=-cIE45s8&%T`VwEDk#sz?MMolHa`2g)x0RG?kxuQcSeBOu1 z4h;ZTLeCur1MCCnI11oMw(-DGc$*GW0D1#-JP)AcJR@+pd0l1>gN97$#SEJ=rL!59 zuBg2fd5qd?`Pm8ojSjZ~J`JagllWN}JM$&Nx%h7`A3g&o@}m8hsr?l`_`=DC`5HUg z^(73Y`8w76HsZUURst%oE)J09TkHz1|2Xy6k$(t3_uRN!$RCUQT~!KYI8F0;RA;WP6nH4LB{K9}@<$UlI3 z@aV0eeMJ!-|Cn4f;c*l5?7yn$3#tEas&ME0Z&fs1G90~bCg)Dz}u>>e(!C|&P)Qt#34{{2pNFH zjvZ$rKqAj39u!F#fWV0++aj{0NOEj56evTWEfgrw77Af36exw3xrH*Ml+u=|1zO;x zDWzp9EmJA6X&Nh?X%Aw)?RDvwU6xM9Z*{Ict`Gz zgwWaXV0g|tJ#Vw5BG0)&HB_ZuvWVymQpGUs`$LGso?F(>HG%``eOZPT%wXGiwig_~c1zbI0DF`S`Y%PQ8B2 ziqu)uRMPD zX%Akz_qfE;{W=EQ=HBt+TkC%~Y2W2X-uTxX1k*B=urZLNOPr=AjvS;bj`7?YH*j7_3Eq0PLxJlAm3;!A4a|hyhlhpR79$&K) zd8t|cX~znw=r`PWkCNGwr%v=t-e>aK$~{VUhZ<9QAbxe^2<*c6HqCe@A3AZx#P+G^ zAKZ@~SdRVU-2G#wmQ0)|8znetEM~HJ#WEOccuRv^I(`b0#2_e;?TLGp%-vf~pH!~L zcjJA^<>2JK%v==fl#-J6sdCQlGjUE0F5hF0p1kMO63^s`<+x+H9G=QM;##?5MbRdt z+Fsa{oXSybPSa~8w|Z@5(NSDGy;4%nAKkl<6yl8vr(!N5pNu~AzWE&K<`;M!9#!tS zAFq^6++=?imu8?!3c^0-%t~8~y8i%uW?VcgpCwHizYOCRFXp+662_@>3Y*5vEps15 zubVdy*U1Z$50b)_Qa(6;g5L0uYMd{XC`YUGn)&5L_d*;+;l|YyF;vu4m()((qh!x9 ztEPXWK`V1%xv8C6iWXF>Um)=6>bYl;e!-r4`LZvHVe!P0wK#Q2b;-)T-8+v+ZE4~5 zlIAjGAm8LLpYG;HjvZRql%!V_Hsx0p4l7(KCm(*!mrBs;Yqf11@nyWLq;&cP4LEP5 zdjK&T)uxcE_QF#lf+L^b^0|AD$ZrGli40{2{h(Yd1G+;am(=LXyp_r;em{uY@*vvhXdfrDn%jQZI# z2hFk>&=METsXY+i$E}i$C36KHhA>@0m>5 zWoB%5>tKS^0r$OxQ+DDHbtsTZDY^n%`jK0F-pY}4KX2t6jdN|*gM#z%H{Rsj{K}@( z?d5KqYevuYOw|v>A+-Milomo_bQf~h*&n9xHpNsJS)%Ytl3%3iO#UE;4 zAccK9o^N5kec;O?JnF)O<{?OWs=HOKTNBK#nV{tAs|43@3rgppVF#JJew*X!CYvFpoTpzZ3djPpD&c*-vk42)y-#7>o)zJ@-6lI*j!9wQN6cQgX z2DvGU7?Wf$#uTm(6s`{xuFsD(I2}$MTMNSD@K<8iZ31lG<+<{o;xjj5Z;4sI39x6b z&!2`ba_0YEiztNuuhil~tSnprT+nAvgog)TN_C^m-KFA8HbiR3$2~H7TME$qT!b$-iz0upn>Ax^m^7*SV_`l>oC+}uT@IeyzE2*xo!M~u_-`X5> z{IO6X7u)P^dOMpNyfxYA=9);Vzdx0%iDu$kW0`EtU?P;P$?#;nJGrJWl&I-m8w~gx zYcjdSvfAZ~L#F4@js4+RbYpKMvLKY{Uyw{CV+&%TaC||%vwT6_!rH}K7A+WzCl}Ri z9C3JKJQ+z0L}MHKLy^9CGWOq3C_9`rpYJ)dsYw30_{?GaSoi0<_}>*0pXvWVN>bdZ zY&7=2n5$4aUXxCQay_X`|L4p_abakc*7OV};$dEmGRfppS+}h;cKd_P8?b9=@#jn) z*W&ED&wq9*>)^3#{x1||O;08klc)KdnfZ4$J+eC#3M-L4qykTUny;73j4 zk(e>)Vts@0{$8yKCmgPhNdHBN^n?ZyIVU%qj%BO+L>xKUTr{4{VFP+ZIFyY?@<$KO zl(SHuPD+x3uTtvP$;L90d+dRSQd@1&F8Bhno5KS=JvfYeXL5s%CZxIQiDNIm$=*K6 zlI(@pal%&nQ*GHFBXxkx^KAk9{oS38pUu|s zwH?*eiR95nHRtwD?%?2{*s%x25=muZPNaVkwkAt$+rh(Oo0{T2w?Ed~m`e7;x?fe?gQ1yPR7t|h7x7hQAYEPuPwx*`WQ(4`2cIV2v zqh=oN2~>His}J|A+2Et3Ah8duAV2ilxc(mGFOz9 zRC%UU*O<~Wk7vSRilKY4r?d<=%b+#qLfOrU800`7#^tE#N0$!u#+)q!v4NNg2Q%^B z-dM()%*B$)P+%~gi}aaHtQWmKGn~e#j*TpSO1TlgD&7|F?Tck|{!lJv{DDBb6Z8kx z8+80wG89h44BAyDgzE+(xq%E?Ks08up{=o~GnfuJ=}2R&p;L(Ks%Td4dIs-k^}t^S0N{va$nO^seBxYpm$?U;^eIub<1WDO*olS*feKbwt9 zLF?W=)4Dn~+ywn7kPGGFsbtn<>l=nq{^9lQE$vPdWOO8F8k(IoYn#_L8%WtSDoct2 zqA(Ncb+(w;)>ty<^dv&PS(ENYuSHTK0Zdc8*J&QgIX)>}?CeDiu30VLGP$6XGm~;e zUP2nP$)rPxL@I(d5Y+=BwQvygM5r6oS;)2|<2VB-k!4QK4206zsM|&|IkYCz7D}`X zBqPRYNTm`c>>p|v$PPoo^z_6dCJ+fFZ8hb>5hsGFa$mq{Xh27AfCw5$oAwrOW3%If zUQuh?q1U1TC*r*3RwvjU^ma6M1x;H}@+XO8O>0*w8Ht&uSRyps;R|%2smf#GdHd6* zaUc^2dLc=YC{XM|5vQ{L+>o4+ak3`tjUGRc%^4Pgm6Up#H0~_N5!2Py=|oW63-jM< z4aQ1zJ_m)i*`%FFDn0B-zjRPPC}dPwav+gdXd;PNNSZTRQDy+W1I6itM72Xs zSe_ZZaiCV)tjdfm+K87|K!!9q%^OTnlhQ(Qq(OaJXGHpbZy@Mj+lc+L)mXZ=R`l~3`L}|=LWKl^asbv z6^N3aIC@9a4vJ2sZ?j6BjETlWi4@9UGa4{@Wry~E;}qw!vAe6Ky>+eM8*K0HGIA3b zPEjw!rw&n0r_WZ6TUYiJua+CaS~ElG!D!f^QsdC1AUv%o3=E{x=%e0nJb|IsIJW(( zVCwW?ba(1njdZr!CFpJb4N}$+*C^%VQE7Ny^m{Z=5tLf65C@sK>Y$eg^F^kY zgwhxe@VgY6l1M8GCFzPLn#$GIN_*VUiu~ayo@Cf$*(9MoEL{j;WrxG;07j2t*0*Ng zftnmMcpeOyelMCxzT*am+SfEX%a+z*@g?q|Ek2a!MJCX#9b8~S1Jdm=lG?s6tzko( z&k5>aiC<&YOry#^F{H@&r`h(Q_k|+E-b8OE*VixYU5dA~rh0ONAyk7qP-EzZ zhL6ZHNkOZvP}DLoNHKSMH?U!fU^WA3jN&MUp=c}{LBqyrJ#Y}n-Ma?**JOsFLCRAM zWE&e-8ySKjrlpA*zju8Ik}3(c&bE(MUwgOH?qB1ytnD(YN@O?dBS3KW%Sa#D?8q;X zK;ek@3_HOgZ)>BoE|d`UMpc$f@#x}54F+@!R~c^0Ik!1pXd0@n^d?eav2!FxVcSW1 zQcVLGDWn=Pert)v2cg%XzR@nAEuL{7sOss0kEqP_wlFE>Fl5+N{-0IU|%fLA4=#0I^K1y$YV4%WYDOceyDmTu-+SR zx>Ay76>k{FVYS4w5eGj<=s?Yi7Ansj(g!ib$zX;~4C6uSGplAEB++098etT#{B6%{ z!I&*w7)nhJ${y97cD=o}MXH*19+S=i#)=f!0u?E zKb6Y$#iHFUO`Xt(k}+Q>*N1FK%c^sFGpPZHvUnPWJhG&r8X43})Py4aXl}W_RMZ4F z6lzr(EV36yYlQGM_;aucZ6iE@mfW9)4kx9$WdLK5_U)!v4@MFBiAenZ9&Bf5%PP98 zTA;-XMbqb9+$zuBACE$Yj(qrJEH{|SV0aRp*6{}&SKHNLSRRn&!2zVb(W+I0`HtOT z$7jutO2>54X3mwD8CPD0i~Ept!r~4B3C)(II#cIBE{57NqT;pVccv*%3nNnl8dnz0 zu@|z<2}MkQNR%Me_qE^}Gm&LzBxo$!-3yk3tKWHBnioRPPyry%)Y{SIH7E`zl1NDd z&r8%0nh(^w1ZoFmK~(@kX>cJFujpW{fx4QFC7iJPC8GQ5_5a2C{}TOwDbhr>q9&r5 zRNAz7J5qyG(bF(*RlY(jq|``oqNZDjt@0t2e+%ixDs*ZDy1ZHJupWAx#`c5K(-2qq9(4|*Boaufqk3M(f*MPB&UH#L~-Alz!!c#X!hG6X;#i009@ zlma}Qi=@!_Gd-yLus7H!(rp0dgE&QWz{8-_n@NkbMny!keWA@FpyMfV7g=RP#6K>B zw&4qk5sii*7O@V^FbZIf=#b*1#alzUZJK0q^`KZ>nvx(z&qQkv4%!jS7)ZZHdT;{Sk^ zBlU_d3bh)#iPz~e&7pKE0b!l*$5e=o1VU`RS~0G(4jY~fz*_Bt49`_CJ={+3#UF$jgN!av*@gLQ%iEY>TG&ym}; zMo;o)GNEB@N{+TAsnGaVJf(xi?|7TMzF_;h_TW(v1h8KM!S=?07Ee2D5tu$u-J%eM z)>^gF8T}Fn- z_?E;#7E?#Pctnv}83X0F*tg&qcB}s0q+|5HxD}kY>}OU#%8w*Y3#?HGy`j0Q3k}Qf zZSU%W40TKdT2wMN=)n9oA|lb}wnAF@{LN0odibBv1>n?*!6&h{sKL!TvnD2!WzkqvXU8xYBqM!QD6n`IqN=K{Zt3!+OOLHu&>u+; z91a}^L+^tAMcB^u4fKaUdw*|T)q?J9)dEZj9NwE8SiZb!K~FNZz)oP`JN<+UAS~eK zI(#8^^~`M3c7Gj&E`pGc9Hms54egylrvXtEz92L}QQpw_BA90|sxx_g7@pwU3u8czW&F9UA3d9T zLp(DGSG23n6?$SLbToEEv<9@9>poouZwqm{A#~db1(8(xyYHf2doP&Ty_RtHwhZ!$FJaPa&ujGRtGUm}HH_q{~@nt<{Fq z(G-R$0liiq#e_Mk=p=xS#L&#mK+;xWl~!R$tU(=v`f@5%v*?kDI20L}a2VejAXjv7 z%+E>K0bgoB*r>YAP7!8)6|CZ0*Uqtaa|RIIa$d zo&$r7-tnRVEfen#!FUuK1QXlV3hIW@j^c>N5>fN%k~y7%3WbqXn~dXj5=UB3Tr4jT zx|O(}npnLcs;iy+fdil*Rij^q*sy~YQBuXLC?6w}BagGRn=X}y?yJ?eZ^|8S=l zdg2E0GzOeNb1*16qqG9+s}e7u^+nU@@VQgV&Fb9uLR&&34~Qc`vIyO%xn*sjxiyw+ zmN@`eMbZ*bR<4o=<3hTpmGTDXNf(XvtP5q_0VTW{1ANaQTJcu2zDQDh(DpG0p;d_< zVO@HvgEoshyhXg>uu!C{xejv(Z!z{^H#Xbp47G~Xly}x9BiS4jfP&?0y*yBj%pg=1 z*o<3Tofy&{btYqN!QCewiJ%w$>Aqo>!@3X?F2 zt-N&dL!s%1)v9`g4|b-wI)gMyY!C2>SCCU0$ePX-Iq_@?`m#G|D1EDM(E97(5*apd zZNp(H_eax*5-pNE+%9GtEMce(slY&1s*4t-t$zcdCS@V|9vpmDAu4iwtD~gBr~=*; zi|DZFSTBGYn^L^0&WIY~8hBzUn0QKJTH48GlTw2XE#l*Ys6)eUf(;qZ1qM4}(dLN%- zQlf9^m|Gad3_Dy5RwP9H=qVdt5>`=88)hH@K`BjK9F^Ai&Y~0Ji8=#5j)kzFac7+o z5nn#??`yJIQTYnLAdPc0Ps}@nJHH7bhfElYcESX5B&(!*6sZnsQt(S zyx|a9I{T*XchNDB(Lrcy+MgTNJ8J`tP{JBl7fpn~JC5!s&U2B|TjTj*LdF+5w>3=^ zhmN=MUlx`RvI*k?w=PU1ip>K19llISXp8Z6ugBwxmDNl~L;}+xZJ|t5yzaIjF&0E( zGVLs7B)(~?!LUw~+uI@hZOi^9%gViv;?Djq|QJI#x^A)R;In#z}zh(t+}jxtHc zTFWvO>ds(i5qvgmROxooZQc&26;VSrv;_SGQb?yqt;iAQdpB&oKxzQRQ?NN>(!Ju@ z{v!R#r%B1wf$C3~fVa}qN+L)jCml_yE|e@p8ekefmx8<6frvy4(28YngAG9Qa-3}K68IyvamrLGQbD7!vQhjqP_@yf(EUXtE_N=NR(X0a#?P$i@xG=8 zt8-gvi>9JdE8H^3yrB;UI>i}|){P-gX1HYp8HRh#P6yd35|NF?difTyJY*UP^GMoE zC8!i;1-gqgnr4l;&^a62N9+lx+uAG*y!0?&o?XX6=y+b}&0-jstjOFg@N(;sto6+LH{j`{7NGvhaIN=+Q7a}w zdLRs23ZAko+^Fr%s8`tE#+qe1Or!T(X#jsSl>>vJsI?hYZbMC=5s98HI)#c2=m3bW z)yd;qyw{hrkj{bjWy_cEpVgpA0NXd44;!p_2<@ zvB1yU(cT5$qc%I}fRZ8(=;VjUZ%6b*sRivDnBj(|ww|GdTFv5gvqW`qrWzII0z!(4F2!wD=}}GaRe= zAsubRmx;?0g^~!8+=?tGAp9W(*@ZqCMe(Tz8sN9eE~-O+&4)Wha@jhh)?=txAy?MI z2--=(hGFeu(zU!k+`m5^9T3%6Eo@&fn4#aepfKtYDd<3h6F}4meD7L;YED3aSq;8% zAm`c{2(+_GpeozaMMt|?q>~zJLUVY7Dk0Jqwg*%V^dHn|TL)$~dU{l0sgtS?G$Qar z0})`1ix&dD*LG+-0HviH!Okk)f&ngmGI5iM@F|!cHlRvnA>57PC$nC95iKIQIuXqp zA3e4rs3pc(d(mUU?Y&9()!>jEA%tX}R7X9$zCZ>)ytcr)7njtdrL@&`IEk={qzC&| z>y_bETdSR-GpPjPkT5iO5pA(neF?=8D?0NjMe2+UgR#$S$6R$Vpd6&4-ImUHB=l7^ zL(watXWB>^Cl|v+Gcrm+VdwoE2VXR@ zyca)*P>2!J#SNwF>FLI z1W8l|OeI6@8ZpZ~aR(-1L?(%v8|n?F95C}NK^tx`n+^0R9-$oAKag%P{?yTdihw`F zwG_2$c4Z??82{lSlf@1;?M72jmO2ckq983;z@1Rp5|F)7^h1L(r6IK4Z1yvU%SkPVQ@r3hD)-T?eI7>+Om2YrqTY7sb4Ks%r;7iFt?gSRmV z(cG~X$}F;1q(h_oNCdhV*fvPOTEbF15-9*RQk-ELnFXhZ4ZDG1q(P>b$&I6e#dnj+ zM4<>$9TV>&m21~unijDK|FZ1`GP~f$%lHN}+S_n>yr)hr^&(}@hLyU-ZPseUir*`R z;5Nwc+H6chG)*c4eNkRKB6hA~j11d5|YZ1-PY7m>o2)ZC6*ur(?Ar5U35HTn-(4T{Gm z-;_A~jNHzeQ7(VXkYXf3ThF3L!5B|Es#~^q2Ypy^Q5Y2s8{MC0+ZEUFJaAjnJkcKFa%06H4Xm4G^%g4*z-opEGvS)`^^7;1O(o#daztx&128ZVB{6dW34gOK4E33lj;wP`Eq02@#;>E7*u zi74zMJ6hz#?O|8H)sl7OBC;M%PRt`=>I)C$bYl8KO2!?sz>Jt#V(-XwY`(EeaDt}p z&%xx?$q8-wqQd1HzRWpGNRh;aqS8dq=KPsj2Bxi^fq{QK%@b%Fhy^5=;sMt~CZQ6{^}PC$~{I+Ph;> zJDVhaTTGRz8K&|RewTc#g6r&7a|Ux2QaY|T!3N^X(_4?8e@N%Pa(10VTQnmkaoFh_ zM1P5jE4rsg+?QT=^pwdK7-)$9&~*%fPnlV0X7rAP7339jwIanPkxrGjNmNYeFlQ|V zZES|oI&K3BX&@!SW?(6cZHR%(ii=h|`aodIpo^{zRkk755l3CeqUiiq4N@PP9flw@ z5e@214r2nWp&8D02w0dj*elDrR6t-5Z&9Z z7s-e5N=TM8Q3s?_`iCSWMuLH;AzC9Ab}dW+R1+>j=v#-*dqZLt zhkUBv7xfagu{6k(3@BokQL(Xuf1AX|Z00a8@+LWmLc@Get`FjFAeoeXIvEMcX-C_< zqgI-w^>9LWDTIZJBgB!2KkvwJ(fs}fsNIZ~6em?@EBgs+6*RFFKPdn9a>T1d+McT34zu6~fXxELOnM z2q{bG0_r7$P3sHzWRyaEXJxt^30e(A~I|;mKj~tLK4k4?7v`uAQ?M3e78t zrlOfKx|OT$X2Z$)b&V1ph?XxJyoRW_?*4+G9BMKKuuwmg!MOEDt0}DoEv?U*6^Iv5 zZC=AwQ(LhfD3Kb(TowjDSI=%5Nc)2U>z9$KY1bB#HFBzv*<}WZww84UX$gSu8I%A^ z>*_}ItW+WbbUN2#Tt@0GUU9QhDE{}?Bad9ATH~&}lZD))SDB{a{Li9sboXFb^>J=X zeG}|@Y~^Hh z(I;F-CfuK|cg9(0L^O&YYJ$dN+Ns7cA{jSO_Hxf=Denk^bveR|TH*?V(7=$v@PYP% zV0@Xc4$Bzjc_^N1L|1^7lEBJO(U@Vz%91;& zIP^&I8^|ac8%o0`D@#1m)GrMb)y|NPKKV)CErs|8D{NJ-(fEJSNOjFiVRl~@ztr_% ztcj0Q?bkQ^WOdy75C&5l&H+WLD4avBE*yZ%PbVuRR76?_Vld;8Vbc&?w9vsZ36j7F zAJZ(l&A>7-1l?#2Q6n^5quAdpUe16lb3^opR<;NPs|mtoDe*+3=X`ANsYITR zn(%QC_;jhjsFl4a3d9lky*`n8h2=9`iET$5A0v%zfsIhu;Ry)B>6eu?bgG!5N{u?+ z8c=&+8$QWC`LFc+k6tQ1&O3eV{sdkKGn96GN~a250YwOQY2O-6-z_Q zeRO1uSBN9~HHLv-(pYHeUH$m&RpAyCWVU*zd| za~skwZ*9wv!Pt|$>qaD)xIy6nx63!B9po2hYa7$mrp4AkllV?t<%<@fN6MoSi#8>sQe>kz{8T$couFZeBTc8kIbDcB9{WU% zwu9D4=TC9Xj7S|b`MTU55=9pMAagpG{|WU-bv%qz1uG^mu?m4_2nmDDYBZ=rI|!=G zc1%?UV4T187i+TA45@uP+@q)*kIT8%2=YaB*CI3 zY!EL+eqISAh^Yx7q0Tywf{_G4OoPzmtZg0~>VU9p=U@)@Jp$$jS|5 zhbum#dEc?xm_;kQ-TtEeU0(|U?ExA-=ReRdW45gzm#U4))QJrxb=-F+ggKRh(nV~} zdX2n+;>IP~YDt<~iw&Xn^(s=aD?5 zlsFy)u`@{oyQB@~q+*%8h9&DExMo(GDJJ)$eQ>FWtn9LD^+YPSCt>!Rw#9rn6<27} zDrE{1MV6=48H_~mJjr*w?zKp5kZ=bpBv8HXg8N#TWfmWS$iZ@>@b-*R?>+ zr2(B0lUi%x#Sx#R$bo1BrXHa57QW$?05I?E8KUkWxHNz`2*_$}L~g~o7k0azT7AEW zo$<_l+Da->uh9aFwQ%@E)dmT;3nN@FZ(#>!r<>sF!*pN(;nFe(1TU)ShoYvTgtM>@ z-E}H9aLpS~QNf@PRsV{EPooj_Hi=hIJRrUh1miH2Y(&k&0f`(TT}JiTXm+H4%C;f% z4T!Yw#(at$xOH8tXb{6jriUQcWzw-1LJL)9CoQO(x*|ZWWUL)e5HrSH6eAcl;SXbBbk>0~_?VGUuD8LL&;7Ex%J z9xHYw8F?LuNW8r33VLLNtR_RHy8wOAJ+#rPdD)Hb z>$dF6?A%R#^PN$B!WOEOtfRs8ceV#?DQokjx-oG!-7Mqu)z@U+cpW$vo%$1 z6oQ_FxObG46fK53_=k;p2_%w1v;czv5GswtW?^8k!+Fq-$m%8L0xpEP>GE}{AWhHp zWNEw9Zo+tVH5PQr40UC#AUIRnB005q(Ym_)(FTLnU69iKGSzSW&N}^xpj1^f;1j}K z&=>>3Zl8noIgQ*hC_beot7A<#4+_^ zhd6IzyW?$d33TZUaw=_Y33oBCtOHcVPXg=IZkLsIL3eeXc45(}n!R0OO4!w_wS}*B zg|C>5l9zVq@(7h<(AwQ~km68;pIM5<1|MnLq?Z^`+;&NdycGq*iaScfiKI;xr7H4H zi&G{ar7VM~-d-5uBOG5Q)Z0sW;(E%$zR&ovRjam@!cDcUAVkL#{n8K8vJh%8i5Z5oJr{9YRU@T^lX%FZJI^$NqjiXmAtPBT~R z>=wxt8g-HTO=b_d8b5jhCn9wWD7-@BH$fmJ94uDy(%IObDha=4X*abL_1Uq!ib$Na-Ysj5kb}paR%s08rZw|k+|WGu!&yurbe2&=1V43aJ}v#Ks+8TsKah#BLl&k?`SCMV#Q1c0L%|;k*Pkt1!X#$n*`<9Fr5)D zqqg?eHoRO!-Zv+K7b9Xs#qnZeM6qbv`awia!?W(LI{vh^8#+yy9;mgk(CxkPjxcXv zr3S2#4DyHEz#Ne!_tvTB^*LB$7DXA`307z&`eKDG(iFlF{W4#p+L@@qsycA-v~(D> z0=`qx(AbGZrDC#nZXEIRXq|Q$vVD($yqHBgd{Io6zqtbwMC+OvmZfT}gAgdhW5{YH zp9Z?xfp$$QU=;;BBaOij!y6W;NoA=BkWC2!QJb*vk_V)rVZK2;k&KS^jb8aqg3vN~ z`IIV{QunrR7UE7^&!9GvEQ~4$05ojzCE-;kT>D4u#K-3u|4#>)@I9JDSzU3%pd%X^2>S~^ji(HTk23p{P&7Q{MSRS5X* z3M>VZw`S;n7)PZW$s3wXTP@8w8|JizF&V)?<3fY~YUMwSWr0S_i3A$!<-f)9-xB$6 zsV?&=7=n;URs%wmwnj{2^q?w^cUe%GHtV{1%W!_(Cd3tL6G92g(;#@&6mXpdD)4mD z5-NH@=BeXzgaEbf9BU=$ceSjFdb|vfm^*=Wb$yQ8!TZABOvG^CNikabRdE6hTuJCLe)l_uVXrE|ORnX<1g zTh=V;7PM_?X|jq8x|*s4IxI`0Q8Os-0d#Bt#3xtQ!p()p>9Jx$3RIr6uy|P9sxm<; zP8i2FSBdyF7``weDJ~qu38+lO%Q4*77NK)!Dx=>}sSZGQ6-3_H%`aIC!0BO^kh3po z4-dDj_p9Zb4+_FE5pfqFzRHFJ=UXRVt0cvjgusHLq;D#*i>BZea2J}1IgU+{FX$K; zveclK7yudDp}Dy4C!;4`#tC_LEO5pdp(ut!cbOveHyFNbOQ;xiIm-Lq@OXuHQ*Mpx z>&t@fgrh7EM?iSNpv#Bw7hFN^1fmEzdDD_OdHA{!ERWwD!r%!dD~teX#P8^8`1Rdw z0W9yql0ltm(J&%-Uzzi^CG5?d2En^yU=v_ILKZbgkID%5K&m{^%l7)f z+xldwVp>+FM(Rsojm*p0#j_|NEOplYDbHCnx1*g`e0w6EavJbAtisw3q4uSI#>T)& zLBK4*0$RM}MI(wGtQa&+jbf^buPGxBEWV1?j_w9jnd+1(FSJkU;y0Osa+(q4A*;wc zL~F1i2=2tBb_2Cf^!;D`V!n!YCxc`&gNsnPy8P0vW08eLqNu_LlojnnCLPtVQuWY2 z2c)^xexVb}Ti~qXXxA!hybqLoyr~K0y=-x#No#d}V!8mGTl#ib!+XQSeS?O+Bk|bV zU@i5SsCQXhb6Qsz&E-80qHwfgSdaAeBE$$CU7BxS60hgNtG+`vG)D)1M6{~z40Xl9 zTXLvCI}HeDZ18q9!4Dzt;dI}!DQ`s80CgKfkDltj7zkreet3l20re060K_H24$*~s ztp(cNZb1|r}fGndfKdEGn2Iyz@mB3<+aZ$3ADrOan zJRBJ0*_m}Zy!cf)25%rbv}&HbB_@bz`)n1$L8`FoxT=}&gsJk`Is8;6d(i)Z*T~?f zAMl28vkM>ms@zGFC+%kBXJg!t{KABHa>W_tXO^Ai*;aa<{8U8oarvc*hRM^<7;|R% zS!LTiXUiFqp8Jtsy!h{&FTY&jom_QB*_ocRkoLOC_(cwH9d?G~*CR~HJbW#0gpk8K za5@*6F%!mijxXJ_tfFMEl1k6?lD$i2lFUn^KFR!9 z{|iY<1iU_b^`}qdf9COg{-xkP<6>K0Q3(pQqNv(_56Oz$t;I(n8;Um((*t!ARUuDe zuleL2Xo)f8T~kM0nrd0ABeMfVSJ|nvElyui<~R{ zPd=^q!w)g!KOgS0Kan#Nd+_FcJx}tL!(VZF=VQZ71Bdd@d&Q{pF8Yl7UW)UI@4Guv zpN@TUU%8*8E&Lh&itjrK5BO>KeP`5pyW_m#vUaa|3+ENzcOFugAM=s>;dhLvG{2$?kb4@;vwYjmXrdt?ri1 zlWYy*yyE9rhTJ}h-}IV^WAZ$bo|K>b?l}JCKR-Urm=5=5*y|qq)~NHworNFa#P4yq zANRbA@um2_<5rcJEAdMpGjSq*i8X)U8%Cw)N8z=(iGgl<*N#f>hSn0Z496wCz3}Hg z$B#y(cPY}_gyZhVP4BKz>Fq>%SK=f|4?jSfPw!Ww()%aU`#qk+{kZAs^B%u`GPt^WNck?vY9F*t&dKKPZDqL0T+8Fd^#xl;7;XiXP(c+8%K4Se&cWGL+NXwNR*mY!Moc(i8~ zZ||e`m-b{o(y|L5kGAyU?PASR?!UjO!C|Ry83Xr3efkThYwqJbF70+t)aN1G4gnF zkUWW$b}Q+eM_xvLm%N3%hulFvK|W9ZiF}(}QDW2WA~%tn$stnoJ-Pq)$w$aPlQOQ! zaTt|K(dT4)Z*mT~h+IW>ksHb5$szJA@*?tT@>cSG@|WcE$@>%i~@?BDfCdtpf_hWSC5n zCy-~67m`&bh`pOP<`@%BCjKVK;B3GoP37-1Nj#D5m`Rj=4Vgx3uHaHitHdakWn&C zo=l!iZYOUd?;;;2pCDf*-y+MPa!WbwPVP(2BkRdkWG8tv*-Pfgv&oCd?~(VCKO=ub z{(<}(Sq7z6^0NoIA9)D5jBF-1l5z4>@?7##@_zCcWC;vMdCuL)8RTrTmOPwnC)bi8vY))1ypg< zW|Gz93bKvtA+zLH$xF%W$=k^X$={QIAwMF=%&_;JO3ow~kju$tat#?L2guXNbID7| z>&OSlUy#p{el-;^T&YLGZ;}5b$HGRG z{8W%L$r^G6*+#A@LmVAYLhy0kFxSzfMY_g7ANp_I~rCm$o9B|Wgo z<$0%&`;c?VMdV6yHMyRQkZJN{@>=pX@_zDZ^7rIlNK<9=u^TyqoJ-b|Ub2fkhU_B; z$S;v!Bfm|4mwbYJk$j!}fLx3+k#cDuyUC4YoZL#DPhL*mNZv*6AfF;%BHtuGB+C!5 z_nk#9Bo8Co$RN3iOprt58RYro4dflcRb@-gx`@)hzO@?&!1!8Tvh$=T#0(o1%e z$C8`LVR9RJF?kJn8~GFRebO9a@4FkhH#wWEB@ZW$B-fE)GD)65o<)A0+)my^-bFr4 zK0&@fzDn*QC(gI|tR!cVHRKAil?;#$xtSa!Pba@dUPfL|zD)j&{1-WXfz8J>au&Ie zJe*ulM#(MY7s+pv-zD!PcaTq!ACmi4+xs3&E+w1DHRN&RW^#x;lf01JPTox3Lq0Evv(j$BE0kVlh!@*iYbt-bGl&Xb2B2Of@kzXgblQ)rfkq?tkkS~z0lJAkb$cc+= zek#dXWDU83Y$XGvLvALqI9;FXbn<-ia`Hy?cnkw~-f-SCO}nKO!F`pCR{MX7e$Z#4=}n-c@7=xq*z5Y4T+9E95uGYsp*5 zACo^PUnE~6|4x=HxA&h!PA3l`my%7Sk35F#B~KvFBEL>kgt;Ok-Nx=EA0I$$ysC#xq@sZHEzeQ z%gF1=+sOyX$H^DS*T~AlY(5Sqmyiu)7kM<{FPM%L*PTok~MeZP?cnkw~-f-SCO}nKO!F`pCMl+|3?0c46U^JOOS))>Et=&*T{>>%gC$ATgZFKN644R zH^>jj(pC1plgSz69I}o)f;^I3M~2BHc>;MBc_DcPc_Voz`4IUy`8@e&@?G*{a)Oub zj68s>CJ!ZBNW48n<>qnZ@#I$WOXPXvrR4SG?c{^x?L#LY2*NPyS&Plzo@5nSO&&%b zNp2u}$Q=14@_h0N@@Dd0@=@|x@)h!3QUbfhe>a)jmpqtUMz)YaGEAn)FOpv+FC}jv z?<9ASPm?>zzmntIY<{MZv&eueCa*#ZOynwudyotP<{3-b~`Frv&EO{zc$s5Sq$p^?^lD{QiA>StdMUM0FdC4krKDmr+B7NjW zGEQzKPbbeOFDGv#?;>}QPmwQ?Z;~I9QCw$ur0c$ScU3 z$e)nEAfF>&C;v{4_1k<+CHE%}A(xVkWH)&X*+*u{Q^>E7-yp9czfb;%{2BRc^7rJM z2$>>JB)5@YC%2O~k#~^~lTVN@kgt;Ok-Nx=L7U%7 zau!)bt{_{<0NF!sAx|dHAulGcBELu8Lq0-2Mg9l*I{A09WUbBLZsgwNY_g6#oNOo8 zk|DC6945~sFCZ@`zf0ahK1BYC{2loxa@;z$OR|cbPc9>yNFTY8>?3pJspMD5Z<5!N zw~{|5A0>Z7?j-+0en^(BxB1+i+?Sk3)|0Eq4srt-CDY_dB@=5YV z@-^~((rmE#oJ8(T&LJ0(tH@6BXtI~gk*AU8k(ZG-kav&|kx!5>lCP5=ke;Jhj^r1} zgUO|26S;;wj@(QRk!O+@lH19f$$Q90$X}B?$+yUVl4Fmy`KusjlGWtF$JpbGNiW$+ z9!18;E#%4MIpoFURpj@`d&r-XPm%vYzCr$-EZJ!Dvl}^soK4n}hm-B(S~5iTlf&eh zv zNq&#Km;4#|8}bk2U&;R@$A#^E4j^mD!^n1W9T_3hC7W1}`d7355^np{D) zk!#5?nIcaj&mk`%uOV+G?;{^0pCex(-yuIHC&q04rjxVDI&u}+MQ$W7Bd;fKC+{U6 zB!5LdPrgdNPnPu9`%fYFArB&#kd35|JeEA393;;mFCecVZzAs|e@Z@0{+|2``4Ks$ z*XD03Sw$`&4<%d4AQ>X@;#TdCCz5BA7n4_$-zR@e{+xW4{3H1``CsIOKAV0ec_3L! z9zm`qH;^$hL!Lr@mHZa@9rB0d1LUvB=gC*e_sNpD&DUgdA95bKm~0@s$&F;3#QUwZ z{7xs&Cod;&B<~`3kWY~>k#CY8lI6$SboV6pC+CyP$rds|ZX)~16Uc4kMdVfFE#!~L zN6BZ%m&w18|02h4w)vYz9!S=atH>^LBY8YIM4m-nL|#qaO5RWYl6;jpY=BI)@fQ*wTl4q0Wkr$Ddl2?-7A#WysK;BK>PwpTeBcCLnC0`_8CSN1}M(!df zq;3B9BCE(l$R(tg>>$^ZVG=(|u5x6EJe@p`yp+6ESdR7b!Y>%}OY#}=CGtJ;Uu5|f zd;Sb^7P&#VzcC?h_X%ejlN63K=45VfzUpzi0gX4Ivi9+OKFK*8eB0qFx%v zezw=+S4mCjp2nQb?XL@w@2kk~aQ_d<2ZYteJR-z(zZ2s8*T{d6V{&%?UL@XmpywSV z#C017K;*xd93oFAx05#sQEv}&`*9)4K%a&L?q8-G3-~1ldWhA>jtm^I#4up<QTq%dilgTs4v&jp|OUUcU?~*T*eCcDXXRBW64wEO7XOL%;-ykm|uOY7| zZy|p`-b3C;?jRo}pCex&|46<{{*`=}EE#Xht(@GA+=HA>?n@pb#Q0W2E+G#ky<{`F zo;-%!Os2>|@SUXFu$AKd>i*#=h$k&h;_O^BOxkUk;u6(pY*`GoYV zrT-zls1WH4us>?Q$Mrv!ZCt1MoWf(WiEC?ZSmimM^TUtE#dG?EkWN$&#w7rAzA;;SfHXCY;jT z(Na=^0iT}|)JkE?m>qxA0}|Se&pa&Eoo*Jq{$Zn;Q{HlGOMT1ImXcXrN8Yxfu4#|A zS9SaQzWAg$Xx#G;zE_g=%=_Y#rSndCYTMf-p3`@lnvVD&;sgJ*B_VB)OddcJOJ%Ig<;Hgu+ zZ#*o-wr6U^`|0k+H;m`v50@b2r8_VFa2e8D{y^E2XT0GVzc-FHKUMK|I>l{#JM^hp zZ=cdQ>-}`&fp4GEK5NxM@2A^WH`hEhYi!Mv6>pbJne>zHx6SzOw|9-dW^CI}+TTB= zJz_b2*4XYhOk?94lOm08lz1B7m^|z3H#{DkgLGyz?)^sTlu1wRwljO%yq2ebu2Ol&J~;oq8pimKvcO|2+F6HtRokJQeX9;>{^Wf(8SCV5Y5jl1<}OJVIcmQ!||US zKLV8FD?vHF3Op9{f|6bXD4!-!?%&L9d6$uVTFExD9ef-6j|3(Et3lDL6tN^T2ZO8gL9K_Z!ROT#caU za52yWZUe`Ga(p}}$0vYtd?L6F{03}HR2@ELC6`V`I^Tr?dSr_gp1L3Zm6nbD@(QH6 zA0%h#K1*d!$r$e}>^Tu-S1R#=*fY*M4Ja+opl^BZfSfEnBrFF?#~zN7^gM_}OIPMJ zx$=KN%zFMLd%Uw{&$#lVeb}>lF1{b5a(3Le)XoUu6}Cr|LxcI=mA9%{f=T&c=<)R&2-D^6WBG*6=;~ zHh^!9ck4I&I7(Ub!+Lm8ohfU1T=&Y?*5B#ZCH1DP{S|!m{1mB{b$$n5$CQ;tG zMdP<$QSx#V&p-E)Ja0Q*F!x6DlN5v3yJE zVQ8;UPONz2aBO8t-^L>jO{$Q_SDr0hfxi6Vo)wLC*vge&g_=lDt&kTCmJgK9S%zFz zR2+hmFTbMncs#)LX%+V&6Xo0WarT{7@l7<_@+(W{;PR?z6_3cHUR}C3&ivQ3if!@? z*XWk1tk{MoUw*A_l~q>E$1|5-S1QFjuCijV3R~A}nv*Ik_Lri(LAQ3VtauNPS$?CQ zSy5TB3)wBdNw@YwDk%B#n{{hiWkm#;FaMryRaRE~a0#|<(XHu~6~B~vyG^(DuB^CT z@^W|S{&=u`D=Xd#VC!Dps;{g-v6%9QbgQGX;z%j$M|CS&SrIx2ThEl1E{033vZ6-H z>{;D9wX))Q2*L8#OV90u+Eck#cpz=c-zeRV#Llj)xP1|hy;-^e1@hI(ibp14YrIFE z{f5elxZHiBZhaTeJ|0_BbnC{-iYw&0-F54x%8JM3?t6KXsDPU*D^7qDsJzmX!!z7k zS@D%4v9-6Jd3$BWaZ;W$bnA}FiWv~&<@@N?ok$azFW*nEySuVt=@Ho4U$=f-S+PmZ ztkSIqP!dwp2YBv=S7}FO#hWv*wNg`gw9WIXdwGGqQGz1(vxMAewLrEsR5gsRwm%rm8%A$q2MA9)+|Z0Rnf zYNqx>0*!f2H%g|Sh{I!kt7ny(Dbh7%kM_#l%(UewwQ*x!D!oql`n$+#?gidFHhJ)Bmp8JiAmTL6%`c~ z6%}_za9qZHS5Q%L8TSPh98`2bQE?e}$6fySJ)J=2`@ipd=HH&5N7L_H%c)bRPMxY- z_ug)uKNjSG2(ff^GRTKQT-q@YmItU}8S_iyn=Lk))ecSit{tWcxj{zDpc$LsznL>a+tn5dT9 za`K2nFZH4gw=>@F&k>c~9wDaY6P)e@ArAf5a*#wJP9ya}xVzu|s&gR%VA}Wr$l4Xh zi{K0H-A)=K?N0cpdykXGN^9-`{I-)_Ona0=^lm&|d4S)GIfQjj;Bb5z z$NXjv_h<3)iHLUY&*O4#?+g5e;P|k&L6Od29JCPLvfMv7uSS~gkI3NuT`XXPmK*NF zVp_iu{@VnMlFEA=g;Y5ru8I*FYVq_gY{7>q!}$zM?^(d*$vG8Xx+8KI{2}3_CSbpv`;XSS%@NpuZ{CS7f&^u-?H(R#i-%gj$V0- zkmqA1n4>SS^Lk_@?&1MNqBRkJy*zu6p36aVo5n%fk)1f5FUdke5_Mq06@NqmPS)r>5Ug1q}J zTQDPhbTjci3pu%FWT2`ZKV{C3Qqz)nb@bE4g;X6u422r)onrG)x>?&0_u4R>qgb{@K*1s#JOrS zCY*Q8_mH2jc3^zGr_lsODyXW>L%uTu6Ulov6?A*Nmqwvu z#v*j@GFd+|@Jrg*lM-8obNUn%-DIIicoZy_<-O_w7U$q!P5GUDxrVs2FV_+~lu0XH zN8H($&GEi4ih2J+DISS#-s_2dstSJQ-9k(H)lb;?dAAbV>Kpd=1}d2f{R{Ewyb4=E z?_UYS%hOQadn?T$O5N5?soT3Lbw^yOZy?fpXE&wp>So}(;|8`ID02@R_n|?~DCg=* zB;ETg8cb&0@o24c4uyZmR@Lu);l3^fUSxqztGqfXIn*ieUO0l!0RsT59$ zcZoeJ6Y<>p9tYK@-bZZq?j!cAuOY|#KCx{$x08IZgYvH_z$Eb=SOfWD*AKgO>!WVn zI@qmSA9w54C*8XBX}nu&Vvv4_8e^5Y1MTYnBqf3)<+Fr`EK7|8dUCXF4{{TV|XLUMIIN5pBe<$RrvCC_UKDT0;< zpjr~&LG`-KFM)$o5gC16ulW^9hd9Z6rYNc<#3l(bWn<>;A;h6Y)np+~ExP(mQC3UT z=xK_!M$*}k?@ci;hvZDZH*C)GV-F%?(>vQ(;6{mvnT23u>iwl48J%sM!3mey*~amR z8{RDG9WD(A>j#bA(t%rq5eo{*7hcC_-{!XBm-G z)G4$$4LQX^AhgIEHGSCahT4`l8{S+|+|ZA6F7%fSkG?b;Bu_-y`hD!ly)hxFdK1Hc zzL0eN2jkuVAz6Ao1q>8*qlSkDhgnL@>1av+ivX0?{M=bs*ImkHoPND&R-+M-|X{_6ygZs*Acy=1Y05g>X~=65Vz)L z(mTcs!OG~o?JYOIrb=S1vF5M9hL#XD&g_X0Yw3-&b%mJ=;?buK0~v3Q0r6>M7~TnH z6^P&PvZ{~H04*uf>t!MSK|&tV6D|B!gW>JXWd1<{!&;&hV)8I1^A8dj780!jCR4bN z&W(iez%XK^xd}ku$ayo#WNa~X1s#8~5KH^8#q>@Q;?ZaJ2bn6wXJlr1r<-o*9j`q@ zaA)VMgjhO@a%T$h#4RyPh)=s1*k%jy$IVhL#EzR~j*!&2S&k8s4y`$XGw=1Lnm4mu zeiNlPO=ggxcXPARtJ5p*r>plie??zCy59tlKIUuaTWWl428mav$JHBV_JoC}>iO7< zddtjXL5|mBQ$Z$*V=M_RYglG@rsiPcnHS(TyJcsBwA* ze+9Zn&Mgq1rB1{au1CQZ;HVMi$)(SC)oWDZoXNmf^Wq0P>T=*~-b81h^eiXHW-98O zKOXQea)ERQVw!I&%(kAERY-}wv6x{_{dG}A4LRHC9_c|ZwH{E8ixSK_5)k$_CCM^Tp_mq z(+uE(D6mic#PWsXfc9DAkf*|40;B_yKH!T7q| z4vuyf6rou}I~qc?lgqE8e^BOWmSKyB|FaA!vU%#4Xnn#$JOvfYNnbetzRp5k+Jp%- zX18`av-6luL9}nTY_{4ZVp3Nb+PzyDHriEYSyvg3N4GNFRk@U9I3RofvrIP381FYT z(4|x0SBcg`UBx++-9#QKjxq;PCforh%1y4xMltmS4$YDm&@nO2{&9xU%fH`o8glfL zgD`Rj91EGFm&14bA38W?9QwH^$VU#&C8vH8bI*TJifLVdVCw(a!6_ZkzZ?VdiPT9$ zp!a*7dnotzawI1?<8s&Lfb?+24w)1T~&%QZ3le!mp6b-_@Oo=(b5)&GVw`BS7$ zx{;mbPjLPOxoLl5ned04)IIG-gbRPFq{rvIf{)8QPcwr2uC6S?==!Nd* zApivZxz0Jr&^6OgBTrf}^nH~eG08BssF^Qny5rItx};l1@Pty#Q-7)R8VdQC^@hiV zgvQM^{38ULdhb+ZjFjFvjNl(|$rS%Y=WDF9pB-3?H;uh0jOsm;)IO$#f?VKC~>0N1*tuAh`s9d zA;A5Ked-AZaEv%fJ>MUA09_E*Im57^q-1{0P~JWVFslR2O8kBjy2!XG!}%H9Bc(UJ zBYYNCwcM2cUsKZ);nFFwD5M(d@9^xDd?s7*bF9N%_4^pkNx&(^FX6AV5T#Q_yn`y? z=?Fmnl+m*gjnsA+Dy1wgY7k486I)6nil&Su_NYlPK*~5`T-7`YWl|~ws2d)Kh?ip^-;2x}d2BYZ~*XFBNWmi{ss zP~{!lHhJ5wH&99!?8Lp&xVRXaE~I~;5~-9DAR{qq zJ>r|(8H&CxtTNn5CR)5J8GZ#3(6&eL#-J+07S$fbU7exs8wfm=J@cu(<-pT;*9eE< z_h1hC?PEV=g%{uf_Tm~8G88u=_7bjTmbwQ{XEzdi)b~)%mUCgBk<3y1u1k~7S;5EU zMKhlfo-h}aH1K{4lGNAGCh!556hr+;{7+&_eFj4X_7i*5kHiOveJUvl_(Nj9(!?JT z+bWItAaSb7B>tE<-3a~zBrDLzd>O6j>(Q-1Kfy+*ep#&%$TL@>W4HlRzsd;2Ojh#f zH(~xjz7U`0);BP~q{009VR%xYKxQg0V%V!-I_%>K3^adX3*!)60)qt`dL6tgP-pul z1E&cI=#~PI(}e^>jVp}68KQG2)K~|yRsvLi&2yo^nNn()9)_tEI7`TI{VNU{0%r>u zq0hi12&@w_GF0E*VFb=G=fOorh1%QdjKH}<#)UdCBIgO76lw!rFL;J-U}w&k>T`7N z9FPly9HWO}-3eSMWUd|nHxFzOGEZ}j3|u5+zUCqsxLC-sA+C~vON1P!4`TWSHVQdj z52enR3OPZaNNJY|IZ;198su^zH9B`5$R;5RbnQ@(D}>bQOA+h>R|;9E+uR^m38~X# z5jq1`3#r%pFkJ%In2G)P44g!k-f#z*A3crqC*g5b&R{LGOR%c})ed)YhPK2wc0yjN~PCcmBi~??^3m#HCnchNQ|3U5|1WzXZ zIfF4M*hc(&gu@qXCpOH;$*kN#VwsWS3qh81^gL!{0fJy~C3E~{ z48hfR!9Q^CWEx}%|P&3S|{HTxe@!z;BzEJ zj>u$$f#CBbC634+Ss*WvlsY1xQqh-4Mmi!bBrlVcIU)~X<_BNdh#6Pmh)k#5USmjj z))C>opy2E5&kGQZJ$Ud9Mxa+5kvljfZ<6eCL=FxCd5dJXBjUpR4DKe`>xg^@eS>>Q z_BkS#VsjXLn`FNu@?{msURvj%BXTx+AAFD7pN}1pA=vW;-)D}?85xBE41Pf3c1GUs z5AshE<%|qRAPVj$@i-%6Fhhd}ND`cp*WmQQ4@nZ8k!9&162X1W$hR!^33L3;$W*%S zA(EcX$dFQy&qz|7ktoUMB-$CtsRsFi#CAqbp|mea0?tSq7Mb8zBtd87C2B3t8l*by zjdY|Q=B*g+ET^5paZHu@TIRH0%?IlxtlVjz4krkPg^hLEZR5Z)%zS)|bJ{OZ+f2!u z=(Jy=`LiUi(rFLEv=3$rn~LApwK(a6e8A5a_`5m2A2jDTlm?!Y*lg(cxjH;A#L_NC z?H6P%@fg7w7!_aO1M?JCS~(3_|Lm+Z8m1#jgz7J(luy4y<-Rt#;`{aM&>--woH^K9TB)Nu4F>t5Ag7}uv2wn>>*c_;HFequB(FGdh*anBXGeH(P zzQ*WU`meJ<77Ov{Kj}G39eq&6rw3u82AYIK^+PaRV40AS+QT}{LaKEOhpI*NY0?MA zgR~0i(8sb^n<#+&GouloHj}YRHd2ORXY{ifxXAG;VnAHMOF9)yL?{YeCcUyWzg#eI zxe&i@q8gior0aXKK&}vys~wo`fh&cS=<_g#0@umNmFaKT-OWNO^mZETFLD-AslQ18 z`K#2Ks_(*l4csn6KTp4bupfv&A$ELdMP0iQh(929g8qVT8h<|QM164u$bAl8xGvB` zNbVQ1L>F@y9}v>2`TH}02ZgNCmvYbfkdU=Ha16*cF~NHM7TsmLTy$;F^>EI>n~t|& zoQ?K1Wgu@kJ|Z#g6FJVirQE%yeG``7z`N3k2Tgml1MEFvJ5756w?_M<>#vx$xbXYJ zcA54d5Ar?`OYAmnekELBztr1n+SQbDKuR7o?X(GC9|}8U+I-n5@R8K}(zN>`mIgkS zM;76jiPjq!pk(gksjCb%E{nIo)4o5-!#5*nXN4B~Vps#-$08P5LMO#_$sUANUufMV zW~8CdAz8W&H3ps(l9k(31IGfN7lp|!wcHQ9p4elA`70@|(8ZUr^00x(*vP1EC|(SQ zE+sbA227ODWxQl}s4roF(B;3Ph*RE4i;z==1Hhk3WyNiFNY*2lYR(3h<;bn_;L;&kja0_TE$v1~79)>5JQ0$$ zC_#BB^Iw#csJQbC$+F~C*Ubk0nmYK@162AOmg%9cMpy`aOPs9cW28gh5&P8=cKCbZ zo{GDw&=15Z>PmDX^dqrW+}el!O>8Uf>_a~h2h`uPfPW?qs@<4Hpy^RndgxE$tPJedLx&0bakCyWWV4>HCt$A~GKCD3OM;M7mcvrL2@6Qb zEo7LU0>26=A;Yzg2ER85}=g-tr#wD^-b*P)R3t%L3nnH6-FRJjiC7Vs=bxYqtS87~A?XqbLnp}+ zovXjXWo&4v5IhYw24tBiQzWr3)FNwqiGGwWyhc{#QauwJ=+J27fXbp*w}F(KU!1p}VAWYxOsrw0Dc58}uPM_rqeTjr!KfAlqbfbf>Q6 zl-Vx(k9&121hPX$|9(B2?(?{i2Q)7tLQj~C2M_8dD*B|5hxBeb$xbQuuuj4{6M9O> zHhIi4^t6!e`m~A2dB)s?4)4$}vD?p@H{s)1{VRjW-$k7l^eQ^=3nnidUeRy(KwgwC z?A4F3&dVml;y%3|V;_1&$RYh~8OU4G&JX&Z^qk#7e$*dg(FyI5t=i9aPqy=R+(S&e z6`PdMKSZ`=+GqH|_KFoerrncvd`Dy?;w*~}PQAtP;D`*^RK0T|B#Tjw^57=K=%5+jTl_}*ek!Bo(G_g+Gn4CpZ3M?m;WNzx9dtI?sf9}7TN>G7 zhK4ve7jRn|4TOdY@x{G#l&sKx&F^jujgdvrmOWgkyz_jFTfNXY2iJl47Be(nR;yP1 z;&kLpkcF&6Ps5}QO%$?9H_#U=g{;v{9HB`<*6KNQm?`p5?>f0o56y7!LVUfEy&<%~ zaR~aS@z!goR`l<+q`u7vEp*T_y?A#ygdG^l7|FNb&(A<&(@Z0E5C(Wd=tPGfp|00* zgbJ|*9xsBh)NSvev~wtmr#?d%-i9@1U+SwLmS7#?&$^_(_AQ{HZiLgNzD{f@ejRJ- zE@B+OVFskW$tTWz>iQt?Zl?Ryjrg0ohuBtcVqHmnn`KhfG}hf40!~*?A>O9G!}Kim z4Wec0drXh2^W4Dun4YUH*>s)s9J&`Vn!d%7JU9 z9wZ*A`m?Q%iObaGbAUf3u27?}My7s7T&dnh=Tg5Qo~n|l|G$W<)K&2J)USxERXO$l zhPusD{0aNiZ<&6);@{Mtr{nJewGFW-^_P0!diD5R;9t)NUZMgR@YLT~vPqxLJ{smt zAg%g5EW)X#kPba84a8|agPc`5fo8XatkFG(gSgF)kh4}_!VW1R>-0qUU21~)Cvw*7 zm2k4u9%cr5wn0a+Q%m)mB_JDh2#af~HmSiTJqAG~)fRHK-h;`Nnqf{yvCaCHV?Z*6 zY}F6ZxY_11FShA)d{7>pLml=@2XB$ z`d^f}oHFQL|FirqLEBh}UKcM!+jVtmAG7F#-LhnND}SW(op$?)CF!8uN{S>tO44QA zY~;(M19aYQ1v_O-U^W*tx^uT|k<-1g1{P#0T|Hh<6#73EyqE=fz(~*c@ii{#S^VaI zr^9SRmY0(uo-gf0yKE3IPPwr7dz41Z=bYos65*{f$5vd1C0Z`9be)MEza#DB3qaI6 z2>NO5QeTBqfmd+XZK`vyB}-dPr9Emhfxf)d z4ssp~`S41?7dV@-dZpdSCV0ZzD}JZh2;Yiz(-Xe(1!iQSz3^3hY$$$bHheX0i)WOx zdLZK(R(5;BfBAuB`ThRk>#?2zpU-+*h%KYfALA+Tx)2tc=qg0T@aB84=0^Lm%+|M1 z)o>O?fp4G~w?BOIIFyWwyM>iH#r=)gWAynAk=Y-d_S>DN*6TXdN z+*#qfF2iSB+}*6yDefL(ztQJZbS^7=$3tLo?e63QOL1}cp3L&jD3+e^eH4@41KY7p zX81uKy($G0h96>0LrtFsyq(s`Qcpu<_z~i$da^h0qr|!DTxcGCj5uHYhJ_=%gSbe2 zb`0?2GN$9PSk9n*$_v*D z^YHlEoO4Mu)$X?>=j4F2e z9pa9RDjMTms`@e?a`D`V>oAc)x2T&haCq z*u927-G|mPuU^A zGj3E07ITh?^B{QqW-{K~DVl)dhn|An-JbLc-T_hPRlykJxd^2TWTxuWMY@PnRp7ZTk)3!(x(zDqtBz9mFc5-WYBL#ZIh8+#>>8FZ(P5p zPs>KC(Pw-)bWUHe3nco4AL+Hc9~0dQmrh^E)c8g8ejw=@x=P`EcT{*5w&dVz-RUPM zj6tIb@cDFk|H)8)QNZ&4lcn}m1Fwvts7E!yx6@a#xKFiufmgGksj6)r@Tn|wylTdd zC4CL?0@W)Q_%xQUSD#>ul72ezO)AL;d2mMhOZ zXJis{t|K|#8CeY{O#chX0%v3<=4Sd0QIL9Pxt4WyRe_9jNB)h;pZ*p_pN40)=y$YK zcgLZ2U2{S_iDIO{VIz4mF#i|sz)Hy(B&8N~rIs1ayiCK0H1mN_=O0LpT=@a0r>i5|#=($s_cihe#T)8*SSj*o z3UJGN}II&VI;TVx8*;|iltpwgloS=?P1AdA)QJs!; zJn~Ew*r#5GQ$(KS6!fbYh9~k0%cQD*76HFToTkQO4n$rj?xm`;fp-yy)x-I~Z$yF9 zRSl+fWH)h^dIg~?vWGaTzG7SPSJqT7>JxusP32%C8Ic=wdFoP3?8t|7=6tmjmr@aV zyrPI-cx*)ED6~Yq0iTG-QRraRgn^I9QRoo$g#|1}p+nXAhiPn*l}XN5XQ-Q@Ulyt3hAk?$z8 zQZ2>AhZjy^eN|CuB4Y5Y63heIEfes5b%WH)>z^-&arL^f48@KW(xflO zNCuCSb~^L|1#-NQRr=Q)kQ3$LbB)gOfYb+Ms6_TZI?hSIL z)XCQYs&ZsI!&5Rg$eoWRdR76*#pWJF(N;SF`5Bjqv~`8%$mymRa_KY_MBIs|w5R$sxT{*aXYw z11cGJn|wm0(y|kWf!%L%=vys2jJcBWfV8mAvY$-=dng`fEc=37u!n_RYT4J*BHM&r zX4z|~^>&l)waKzC#u}CJn3(Qr%l;EFC}W4{x!JPQSnqMk+iKarVWMU{A$d1h_L%8l z&x)S6TJ~e`z>MdG-EP?fIG!&FyVJ7eMa9>J-EG+gh(Z~Agxzb|t1zcB_KIfrTlNQK zVDCxZgO>d?9pRtS`gY64*Krvc`-SbWY&Qq|fUupG{UhD_Bhl|dFnmNXti#&NFFtc2ukD+fsPUcu4mR^l9&m1SjqiOWa3L!q7>jfEa@)=FP5v<2Y zR_1BuEfmM+%QDZ9=gSOvawK!D=x*r>H*(Gt;?ew8hRm~s_~aqk%(G2CBZ{>fnRm;$+^vUT(q`TxX$j( z&kEV8w^8foOum%xl)j!L{JhE6AYRZeYW;$#K;G4#C`FfzZ9Nf>`1HuGDlVi`#na5%p+hoTg|6$5`$o<_Lc z=*;}LdD=8I%}13of0o7A&~p%pGJlCz)qG|-^H-A(EqnAc%=t~c!l#=GK@Ll?9{K~WN53wy<3cOaT)2IcvRy$*Xn z0#s(IXz{MYz7CzwOcVB=!W<;Jc+3&FbO<&8Br|}Ot>>m(-Gjl}d z=MMWkdO?A-_oc&DbofG%^0ULfig`uCesS1+=~l(Ues$Oj=79|qDZe}H!PCJ8N#36h z`&6`JM7muEQ1}~>*GPXdGvxIQV$Q(1!?}FQV);Lor!>-S?b{BAs(Ica?plJ z-a4l}Jr8WSuydSt5of|kVdpw+{_t7mXb0VAz0-c!2Nu6IxWQ?cGoXxADIlVfGgDJ&-KDsQ_fFkf>fg8srA^N95${ zwW%O~HG9p#m6pCX5#&a5Fi4RRegSKnuZQNFo$;4H?W12r(?hVO_#AqVz%9^=uiaDG z;O#I*diF;1DG=QUGO{l<`=WrMFQ9&x39)n?MkV`lAs&4<0%7(hAwIeFpM8Z8zdY%b zeWegv?)GP2B_!48zXdWAEjA;^?ChzJ7DVDJU5V_ZkGFKYat?Im*yyAr`UFuJD)Q@k z60P4@s1ODCe^*U@8&;x~g_Q6djMggGs}r!ysMu6od&`xuk+Gz%(Qv)VS!^nfp0D^|uj_5%0gB70>mS4gYM~$aUE)H;XT4leMAy%Y)^r*tMT^hsag2>j3dkx!QMqNL;G=jze9!LLR1)5e8gxg*;sCgR{Hj zVWAOf0Ckot;gRaz0l;$gJ4&5{XzG%y-_h!AY+GGFM(u2bZ?Rb$(gJNV2-=u7rImQW$+Z&AbHMz zs_q*DDG_qKPNTFksnewY4kvS!3t6V$9RxB?NV7f>W9Aw!q(#5h17w1bR{eJjkE>G1 z$@)8lHP<8|ZTd+Tn=GVVFGS#WO%c+eKO6=!RUXk;Zsc8t#n5yukk?#u*TMCT+_zyZ zGq(aZ#(R0ZVYC8%A`=~t_5=_=ELR`LcBJXP2>Y%)2?~ZDgm~eK2{HAtB>6%ddKrgq zfDk^dOL0kU77nOZ%U1;^U6~Dhin$PtC%v8|_(PPzxB4*UEX1hZr^@AA(&dP9on_9F9bI@6(j9$z zErv985<+gDbY5HGZ5~XbJ`rLZC?{fm^yxDeWx^lePh~WZ9D;!L$>Ebzb-^fXJ|H3xVQakiR^PDe|Kd#kfcfd{jEAN4uLHadhj zs_uuMMu!sjRjEb5!-)H-<1iM{;lw%WZcNwc2;yATintaXN!(w()Ejsdah}SiK4XYu zDg+OYmJ#Qxui>82a@wItEl2?#$Mh0)EX!074^{_y0*~id3{l?_Paqzu&MXA3WZhDA z0IPF!67fjIuk4Rb;gFUolk%rBo!@{&dCmZbc1|0*9sVMUG3q<~?;QO)j7VSUg`r-< z`r5agrA@U1UeR|fx9<+s6XpAghL(yU2=)~XU1}mmw(oeBcNqz%z)Q>IU?&?<`_V@zwsmv)OBxIu6mM z?|fpkRaO8}vx{v#-7}dT8TxoUpng=YElJogxFNcmB8Y$4mAg}rk{AMQ%1R; zc&w#HvwW20J?a*$#Qnr$eTrY=8pnP$3mzE9wt51d5XbngvZXLeznqcKA{0oM**S}deQG`NVq(8~5zdm+$ZpwcGA35eNmM7G z?u2P`mJ$aQzi}+5iDg3S<}%=A#Hs3XFK{zeNK?Dv$T_XVVRb)-H|J!QiKtwdKc|g2 zLxotroj6myi_n$RL7b)X5lC{DPeI*mbr;)O!Sw!W6YH)d&QqFr6>&^Wq5i9h^VMW* zzH&|>9-z(|1AHoVE>KDEfSl8a3sqtX@aZg5q)Ms78MIZ2I*iGkb2igU)#GrVoOQ=R zhhgdprk}GEc(}Td_B@w(gxZ45ZO(bbBh?GbDJo<}9qMInR=$IwOyh{GB8null5bJWnHKIU_R=@^fAw z$;Nv>m_Ru%lJs^)z9e~xq>nRl0b)|l%Op{}oWn+6p>_J=R#*|ptJk3mxz5PBwA*WU zfZ!fiH4XjxV<4-X5hn%gBH8SWjK*xvdE;e}oz6&WPmni11^LDqDRO}9al_VrE7Fdz zn)5bEsug)~GRQyJg)A#_6-B@6JPztuk@Gkt?@^r+D-xs^?jsp&MZOJy{F7P_u_9Y( zgZ<1IYDJzO4sw8`6!+4wWTR;cX3ag)1q;G-0Z9=qN>FJ7bnkyOL!!$OgBCe+VNQw~GymVr}n#uAJVq49@ z49d$OPF1rJ@bWT=)75dKfU}6Rln?gI%O;Mh&6L@jI9Kh!?kBGgalU$#=~3b$RRP=P z$=X?>&cM{mligma;ardCnwJxW{^1B*IGWf0<`ba*%48(RXdmoE`vT_^n`*KXcmT0O zy@)+Tp6vFVYJWO#A#H1^y@|j@d}`UF*27|X#akc--*Ge&cp&w$RXLm`ZxC^+`hmKY zP-eP%8Vh6IVB(01VjS~i=a-?}tSdXeO!X*yAg`2dWnnB32J(h|L;Zim0+O0H;$PJN z99-Vy$nS@wQyoWpj%En)sAC5LkD(6u8j14;gOvS@x{21k_#57YwO+*@syPuK z1L0kY@rAR*wh`lv7ib&XPV7*v5DzIWhH_*9|4MACKd8rVjE0s9GW~a^d(;YSEnp>ANDsY-8aag|>sKk)EySYmPe`WT%#rC~vM*Ws zZzRb=qIwvm`Gw@_ozp;i3dz@xa>%tw&nnXUu+GG6A*I@ifCPk;X+KF&NTt3Pmjisny}RAYma3jik+Nb&{D_gAL<5$ce^+4sR_k zocYQ_EKRVXA4sAA2d!gi{xni7EX1Q527;su@#)_5s=f}6f?t12m&tL2AnQ4xMuW_(-jxVaCdGXEZce6hAxZk&J|JU-^w8I02N)YC zBw07nohpR*bqj}VypWz6;l+qe5R#%j)L^0zttXEIsgy=-y_y0h2}upjs-ADeCX3SP z`c~{BV^bt2SKo#?9GhzK(kx&1pr=j~X$AV`6p-nXQ=~7V`DaMZKwZb-s}eFu4`8FS zg_P)ni0`ozgbdbRTK7aDLv&p^NR5!8dJXF=5K^l1u#1Y-3K^!)*B}dp4A*}v2B{M= zLbt>4v3emR^&e#*4MIlgzF06~i$u}U`sr+t#gbE|KO$Koq+I`lq*2IN{VDnzJ4tL% zp`WAH%Os~#-$@s27BWe1qzkqPnXI3~q8w`#GDY)pH`XC!s{Rg3O>DW4X?h*ayF$ox z{WU|!N+C0JGDmxrkScuv1Hoz`Gxc^l#VJB&>8po;oGN6tR)rvIgj5^J9HuYpIvpA} zFizxDJl#667Pl_u!*qT#w$3`K0j?RM%bY9N&`DJGJQ3p7FO30NFGT70NX{4H(O;5W zAS6N0;2gWqIt9XfdL^gT1|hjxQQ3=xROo6(hKr@n0_~X$a*0^AUOz<>Z?rCefF=4j zAIPObTC_#0UM6IP{*4y8T%@hlxAg?sBxJLGhQ+QBvRyC4x*WSw$ZoxaQ~oMx^c(%y z6p*VehRSdCow#<0T_YO&pp!V=ua#my>(A-v*9rMW2kG0JrP%NG&LGHNgcznh4a;%t zdSQ6W>E05sEyD1Y(^l%bRhSRAu^4h_9|OoF@c2_taKx6*3M|sk}Xr8}XKVtxs zzUTCO!+HmkIru8(lRx$ki$8C!D;TTyN_PxBpA+SsxH7tqk&ObOd+=3&3We#lB%zFfjC|9HEQDk5X;3bNAzQeQ86Vs8G6lZ5Rc?!>bp5P z5`<*wkGLnv6q2parnGDk9n~}Df%K7_T)p25(pPfw^#IP*9LXutB{V{RA;tOvb}lAl zpiYK2#PWp<()kRM1wu-+pP~ze4Azg+EsKN<(RXo;Di$(SZ=+KT6jG}9^#vIuWSG8% z#Rdx*t|OcaLxhab`)ScqAtUu0EH+HYC~X#lj1V$fUzG(iQpgzH#&9!AOjV|LF%*s# zQm!*9K+1%S)eq5K%Ebm1dNn)ayf> zF*QP#=-!YSs}<6upB(~HC!|$R=9=0dq(gs1yDbvkR_T|gfi$|((dZhzAra&xS8tHD z`ZexOmrBk$eTZb4ko9^BHE0&HLI1)!ts;7(zMbl{3E8BrIUwy)>}t(hC9w|4*{qxB zqbr1L)t}4&St-SC(j9c9)vmYU%C~BMXJYJBQS?szF1>1vkh}ChIE<$Wxm)w(J$AZ~ zd-RReZLN@dbzLFInPT|+bO{wbOUV8DNt)_xDfWOarK0PEJg5h9`*^O9hxAt*)ANKp ztPfG0^&()KzO4e}e976ao9VC@2zf+bLw~za$fNp02gpTI=P~^m$;Co;XkH`6E^%@9 zw^J`=e>MtvL0>|DyHv<7Z8O|nCSVW6(>KWKXZayCj!3Ic?{m0CFdKBGf%{8 z$@w9^fxTXI``MNa>=q%2_Xx`{Z6CMv_qupikY(E64h6eUShi{R2!Y)%thZ@jo(uMX$n0a< zJ5#_Ol=h;g{S~LwLz36mw9h*R>|x34XWF~ihi#IVW7;LO#CFNcHSI?z^AXAGZ`x1x z1bfuQW05@59szY@kGputP-@z5a+*CUB}ba}EIQ9lVWUiYB!}xMv2K}Z`{{BoyK*t3 zD@>cWTVtJ}8a8;t@4^DeH z*ZD78TwQ;5+K(|%ed%gI2=ln?-x)>!<>DcJmCHVsqwbh|OP6*xh9|d5)NgwvR?M9B+VPOZ{_B75Nx0^TCK6Kj=N>Oeuvj^Sw^=vQfW)M8& zwxjfdbYWk*?fG0wBEr6L+iA4m05_M~AKdoSoI!b2L-X`Gv2eDmVKQ3GeJ7QNkwr*J&fOn_LI~wBr5V4Ix}g><6J{7U6)0a1CYlq2mk)j|S{d-y4v96n=ql)0tX)G<75t zHS?rw1!1wksf0rWRuh&I77REW{$b7~#^bpBC_HN%QudQq!9wQdpHIeNgY@74d%%Ci zjfQ!Ug$I5ObC@4fMZ{KP;N_SH<|lMS__s0eBe-dtZUr6mIO3Z5DeFC5;!XiR^aHRP z@zgN33|>)en4dFq59r_(13TF;2pc#GvnHN-4{5~_`VQz24lRbxIEepEr}^p0IBa*p zfTe!?;g7nP{)!UA3BCrHM{p2e1;DVbio?Swya_48`vEM5Qp1Y@wgQY82{3#j{yf3t zSpYv0oB+V5@P;n|IEMhgPa^;u0dJ^tPGzpR)wbM)2Ao-4lfg&gO-&z~_LKVq~0 zxrvwlZO_cQm)wi{_qWeU+?G?C9WMBNS^hM94aV&1_QZzA5>HxD@Z!^Fo|E5p*$s!D z{OgoOy>4y2aLUs+&TM)KeTQ=$sc^`rZi8}(2S`oD{~&&ac{{3 zzVu;}Z{It8#!H)z`@W@M$yaAx($P|P^D2AQ3+p_N=QsR%_=$~QG*#X7(~ZA8@!hJE zpX=EJb}8?L8J4h|zZEt1y~!~DKs5o@@w^5Lm4BWEj~-?wB5zF}Ow;4!#{}d$uMLGH zQaojhdoB~!JY^wLTo^^Ha?6U~_IW;fw~r3!qd%iePqS|i?READ_m~svY5K7?IHLH$ zhS5lZUj+?kkKx`C-bosx*O`uR=R&%tE8VS4ub0F`A%&X&oi%u;5-+&3YCD3lfo(5boTJN(4vdk_(s&O zx@^(zM&XtLP-+UvrJzBnOKqiYs9P@TriLi_NG`r#wM#M{)i_!d$GAttNT<_}Xe2b! zSr1)hn;D%oNzq7Vr@2IdEE*!-&FoOzjFR44`i#nbj;JJ}@uM1D=EW_-Zh}#?-%)B9 zIaXI!q+V_=>ZK!6^`~)Z<-8*Wq`_DL%5xBzn@m^bJsO^0ntj#39!oWVzHvha|IS*+R8Jnwu_ zdZ^1NMpt0uV$A}>ym03fH=v{46068RKWCm%#gEA_ zrD@FJ2bUtt_};AA5-)`z1t^J^%|&LOl&vbjM@bxZ733$SIgH{h{5%o=o5t*Pl;RsF zfJf`kK3aeFNMyz}n2j1o{>4QViKuv^b6IJ)h?;w}(%d680JA8 zM_ZlsAFWEcBTWKywaU+dBDk6r;)cVX=;*)hC5xowyrU)Ob(JdxpxSsijvxQ2eJN6o z7~nrtVKtUDjd@*#0J{r~=T;xhJ)+#vx^s@^a{nU#uq*<`XhKScn+Q4wU_gphU< z)1}t`Low1H{9%`#!2hOE%?~P=V07SDFp>`&y|%D1dULlV6q0|e_`kL?bN_D)-DRj2 z*Jd_9p2q(PMthewq-^pGu^$J5LxSO!!i zs1j(fppihio6Ll7I9e>fnE~pr8={RhQ42IKH}ORzq!5 zN5j%CT0U+3*z&^m`lW?+Ez6d*G#A#lHLhrAYcE{cRNGwG)>#-|V_3MPwyAK&oa))L z#uc`8G?f+)8(eEF8h-q;g$?z`FRrT_P}{a_KyyoT!+?g`g^dGBYK9FMSX4atg zHZ~6$c>I54AK%zq*R;I8;rL~>bxRtX8~&dQYG2)M{CE9qZ>c-dug*R%#C6GkSNVTu zq|QG5zaWX`ZfUP?_`j%CZEIs;Yg28jts4Aaibq|P9{AsvZfUPUw+sJ2FlFJQwuT1w=D$?te>c+qIUSA~t8Q6) z<9{Q+YbsVxrOnF=@%v(pbq$7rDYj%~SC-otbUjaNV-{qZzA~HFnl( z@2IV5Y+ghqyDBx*t%x(}W^+e3Aq@?!Z7s`=mc@6@9wn{qOOKNFhPvf#jUB6xrnIhX ztLtcMI-0PoX&HOp*(_O2!>UfT;`YEubsAu0TWxD=0}YFNb*)QQ*DpIVP`Jd3CycMJ ztF2z%wy2}awMl>(!}m`R_&yCkB=5u-CVn@v2N_xs+N@vZL@1vG&V2pUPF?r z+iL5U9?7U$vbthgO?iE7Ye(aXct?+jo8Hpc-Z1TmFCcx^jA=EqI{mh$s&anCG>C_f zistc_x>ko8m>nrFOI=G_LrvYXL0~u;IFjG#Q^{TZp4G5;Tubw!M)CjhxLh0*)nW`PoyQD+*>6=NCFx735DDP#haL*cmBs))f>N z78W`~1xt1oM~aIFF3%p7J<2&V%Q^6@{He~{%*ol#CG#?eI1@(ZXF5+RaQ2<-z^g!J zS8G=~Oxxi=LK~c@qqco%Qv;^o60C>y#xl&L+QkhuCogYU-e4@OZfjh;xS_4Qxuc=E zxpwx-#*VrrMq9&TOtQAstyoP#+VN|GEox?%$-zGU1`jkFuoc=$mp6CHPS(Gc|p@F zCe5xXEgD!;TwF7KeD&NJv+&Zz{HpQBypGzY8H*ORH*^^7jf+ogFfdCR+7{K;HOQ1OYG#b99$!6ZV9liI)#E3QpJg;7$StXFGHS+Gj4Q9Ho-=Fg zj2dHVeQRAc2BzIWV5wQ$zlDfp0IHh5A1@0s58W-1$U)51lMe8DQF-CCa6r#3{YTCI|R1L!vf?%i1wAMB?wba1}>Lr800-44P zOu%Irv)Z^P88tP_VUg0B4r6(3YkPf{kF<5bn~ciZrU}cN>x`PQEiFyP!da`vE^l9r ziM?o1W1TU(uC_ToOdSjBYU*lRjjGu-W5;5Cjm6Ag-fB#mP(E&aO%>Mj;D5MMHT9#Ac4Ol7mgc$!qoSdycJ?ZoVtkoE|ylr-M zIVNy342mR}xTSqo$10X+t7$hDme-%OyuHKdG(tQ;NijNiduRAIrdLj@!Eeyk6dggu z29_vHz8V;9snJ?f*V4MWhV!xp;{zjO$eNcoH5D0kO%1hlXLwQDa?B2xvu0sq$1?Ok zK6N|Cu+vOaTQHetw#<%CfJyDut7;e5#eKA@rM(f+u%X=epC*qr@GHMv;h=SP=L%sg ztdPC)r1ps|@Sp0IIn7OMVqw+nib>5?Z7qx8rR~PtspZpa#*Ui~x5ih0H#RghV7?Tu zs#(bHVd5<>7Wa%7LyV}X!M7N7a~bJ$4ISqHVD8Q1qpI%z|2s=EArl~&NI*~mqM`yq zKo)UfvXMwaViFeDA(P1_*~la$xK!M=b)jlom%6mIb*(Z*UwOX|nt^0~r zEm}YNd%fQ0b(0C!@Ava~{CHTCg>UKRkAKH0!V-p*5 zUw@fdJ3=(K2ElyX*U=*zwB%uLi4^{@)ko=wkiv$B10 zs~z~I`Q{#U8z_LL-X_-DkmQcHr@Flr{hdejZY*wYZ0hc+#qWPq6jjALa2Ff86URI8 zh_mpALE6!D+t&4>VWO+lmAfwDKlQr7%4A0~l!!^e4jkA$*xm`v+0V!0(Rg)j-o$Jz z^l9a?O0T88qa)r{gg)Mx^wc0JBID@C4MX*6hcxy;;N#`Xb|%Uri5+$}FWKEUcP^XZ znq?>-zQyfs^ir-RQZ3_s`*C&LR6q2?Mm=#WejN5^vxobEQml)ikqmXshQZ1sO5%$a z7R@W>HLRgGcC?}p=(uql;5GKMV?$TE-p%%~rlL09VCoP*Ic9~%bN!mqpoX(z*P_!k zHf@Y`wD$J3b+W~?dP}QZ{aRtH0_xV3t*UlXzX3Yfa~DL7mp1o7VzDEjQB&ko=22*( zFsMc=3B*V*C0eSxrEj1SweM?S=ww*TecfJXsuhw6Piwe_De+mm)v+~dw3N7Be-G3% z?tU=YoN7X&$8Ig~xZ5%J&b1|2WGsAts-$GON8Jkf%jWCV#a1^$E_K07a?N5{ZDmco zvhIj@`N|cZ*$An1b_*9RNHY|zumW}a-!Pv5r_^QSZ+AU^_^rowgIy|^~ zQ_d!wUG?^@YaebAW{0$PbSLOHutW*hfm*st`=J6{Z+11-J^+ISj~UGYb`a!FFC3ETcAGp^GEn?8Tg_wgH2*NeQ(tZ3$iwL;4j^&#a_S>o)afuW9F<+QPt$An@}mn)nvCVPD`nMm(L?1bqZ z1cF&D$&8`u{=Q~BEswTaWpWTQo7Pd9)+$EhN})NnLZrnTo4n3OS~q6MTg8?1HZ4LU zL1VG*4)G(Gz&G4tK>5o-2->g#4410 zw^{%3q#4{W#J#duZB12ms+D3V=@lp7I(4<8QfgX~oyF8BDVVV)KucgZcB7uKZn?Uq zv@Bj<4@U$|sy)GWYZrimh2raFo7qW-dezYVkS1}qy`KIev#uC%fZb>=Pof?ot_M|9 z($)y$wFAd{9o=26g}f_TD9f7rR#8BAcg3q~;})`sSH~cO%9eTNqr_owRjyd((GP&u z?Ok6=?L_lM5;012zb2f);FZ1!tt&b-=J3OfJ+JWANL`Qvd$B=*6)<+kywZ$u6J#2~ zHQAn`QiZ&rK~k|$0zT2#)Q!&3+k&={h&7Z@`t`$aU=YF-B9vBZZx5w89#k^b*0_!W zyuF*@8E1n~J>W1HA+-(kp3zX~3Y+S-o@S*Qy(I52&vXwjIsE7F3IGT%>5m z#Y<(Vn?#PgpitcFflxr;k#6Q9uelL!OjoiPN)-K=ov9HgL?GA&6r2GCpW8!Zjp3GNP4eHL+mI(%S!!XIoc3*Mp8iWt(zH zR5!zIK?A1S3a@iydah?X#d>=iH(FDQTU+7-ZQp>qjHB_#W2Ld$hRRiy4M#!{z_F=s zs4S_s>Zybu1D^<{T@s?wxv5TiqrapE5a6f(;y<72$`vSpTvh8E_04@11L%qsXzv}+ z6ERrJye~edB)xF7PCP=GLiDn|coRG|ydTU(4$L1Kt^hg=akx@AjZ9`b$j#mTeeq5N zMPS&*Ve``SN^>+4s2GSSR(yF!e+pwYt++)>tzHktae7c8?su!s)~>i`*Ttm}ELA^q z_S2B2iI>AojiWb|tyqDERTryVu>vwQ?lr;6>S`W{!x{G|BGKnIKw8z-mBou!Bk+VS zfM`}Tf)OhVOA6=DUOanVAxE0#99Xota0Ub2&>j009v!QzKA@SSQ_1F}4M#y)bTzdV zqQcrK%L|K&7A{`6@YupxolQOchrkAcYM#|O59z+P{?5cV=eHIW&Z`asoz->aI| zyNMZ-VP;py=^e@csO{};Vr&JX7`h?VW)?bQf!`QT$I*XOBP{Dz}0}=Yq#Phq*W~FZkiaDyVu|49$}$9!bW(7rh;T6X;HY-rC!P@*rAb;Yq|l zU5t~KUyPO?D#^K}kawNb>?M9+$O;+Eq2Muq-y*3rnQcTU}l4Obc|X zPRibfig;B~1uqDFYmvkw7z8h>ZHJi+?@q=gBf79Epew0Boy12R1|@YG6hfuv9BgmXzB<^TQo?Z{ER1N>nM4t#%Y zR1RZv&L^uu4w1uJ#Gy&?sv&J+iE-gKoFK(9U}5&<#0j0HjXh+ zY}zwPb|b9a)YsvmkJcir%n490L7hZ^9cvEAXx_$Db_ z9SQ@dQ#|ZPfzaHtsmbp{?P!kL>Zvci7JlOTV1rFVk+*zp5 zW{;cy3nK!xTH7ki-#H^g+N->~HvzY^xrhfw4Cr1bvO?-qT zVpR8Qntv`WFW6wFf=9S%X1UUSa6T?VmtAngofM7_DOj%)zOq>-weVT!w={Sf5lQm` zP?EL*7yd)2Wuu2!ID(|S0va)lZ)$)-$rzczLSsNqP{5yeHa;h!;9T zDlL3&0hnUX4ENIJCR4X@7hNzXmepit5X~3gaij+}^duRF#AD?66PgJ1QoOQ*UNM45 zEg0gYQ@JYpum=SF=&cPO>pF+*N0L7f(hrg5z%LmoRI* zc9^ZQ>lAgRapxMQ6NjDaUDv@R1r)4(c%-Te!^iPds*BI4xSX*=h)6WiQuwCref0xX z&B@eAs~t)P0YwgHz>-c3#5)-m;NiWE{*Z+m^x4o2u~G^bPhm8RFrp8`w(wj>t?9M9 zHXmOT2~3115)|P(D@|+Lj2L2Aue7QR-?ywOVXX5TZTMQma)x8-!`sCc@}xV;h_CEt z_OrS*^(*Q;crS=Du4hJPkE=I7P+1;pQ1~rjQS;L3m^}bI4;XJ7V0ADYWR5PnL;~@A z1WaO8^=0u`6|A~+BYUUYv+hf~0JRG1!rXat7HK@US%<}QYEL?$!(johVxAvg9O$iw zoWtNMeCQYiY&S_7f zo8peD>uaS$;dkT8HpIfA0hGVC)D^`fCE|^8>d`zg){&@Y+!4KnN}djx6*OMIn$4GE z&~Y~i9d~g`l%7VK992GRiyA|e*A0b^aa9{nNW^K6z!HYi?tvqPfGb^o*E*eJn379~ zu7jcN%FbSR2)HWZ>5xP=LT3Sdnj%kir z%ILs2OGRUEl5u@krI7AT%^b02Z83UncY|9%vtsz2Pf2xcmI~%U#7m2p`QunF(x+Jh zDHrmsRuUm7j2`B7k7ed8IVFs2K|f+heZ z;*StxWXgv0HgpeFA%!DPsZbnG1K`zC6l3ixsbPZ2Z zzzl%CZUn^R5SC~d_PjMO!p(C)&24~~#ykl{@k~UZkWNIH^5`2xoVKbb#nChyCGjYN zod&7!d^apDvnp-7dS@}nHh>_88_3v6MA~-{j*Qh%8N!u~mzFh@VbVgW8{3s#KpO^b z6B`ZvXxCazL1PpYGR;K~Ad2hJo-zBy>#_EiYt8ObyqhcLL+x zny7~{0XRnxRcL{B7VAfqRHPI{klUy_g!Xu4IT9sK#KUy$@~otboSlYxFbxR{E(W`p zZibhlBwml0x_y&!ap1Z&xKln6n735oc3rs0bU1qY6Y$IscS|8CTUmx@3~%0ZPM#@m zNCGDr5Z#u^;6XtxE5qY=Gge?H(T=92VIl;U0Vc=VFm|H73th6K1BMPCVF}EfY8Y@9 z+ONXwkPg=sF+T;vD%7GqaR#js;elVu`*#B=Hk3jC2T|jy$`y!YS`&or$1~y!8)~6c zkJCQn6S01Rv3A&Rt2Hsup1JEJ7Px_Z?uKCFP{Rxk6|1X^6~lV4 zC&Z_R=|m_`?MhU*lv=vy&0smKn7T5=V}~?48bfVwJB!}fg}ICyP__;z0*F5Ko3BsB z_^)3SBixmmSA9T0GfRD3x;+8r)c8@kZ-c>`$>;T)(p?*-vlP9P`?S zhF*o6hwVlChBaDW9IwYL6NK#TN!btuq?R+$OZxqR0?vnXHlW$s?3X)7XV^16=Xp!j z!IGeeg$n^o104kquc8VACM_*yuN3ha*Oy@Sh|PU~56|EQx~%KPPV4lrzrbNiPr+|z zc#Y9DN}OTe!cD+30f;Ci!)s0>Ql3y;Rb$d=`_6h6Gh>=H2Y_ZwqO!FM;W)%GM@SwH zznZGUvQ=t4tXFkW$p!P#QaD&{BM41B1D$5}Qmb0SbYp*BcL!!JK_kR4#bc!fA=2l- z*pMnKH9m4Sjk{~7YArH>n&6}M8?|OIp<9|qi4F)u(@nUE_cdb#8%32&aWfMzu&<#+ z&ABssrMn4Z)I0ks7@fBn7?^9$X6R&WgM(TV+9DSZ` zZ5XS-kTxfQ_|xCqOv!Y`6o&%@K?d*7VitH12yOVTqIJ#{sisn>eZ(yInb6)CVyj#EJC03@IIeXLV?u9*QUOa{l;7It72Yw@s zKt!*hp)t48DSj`(DJj0f?L@R6;bO0W^A$M`$@wFG7p8gPrakmh&Lm)0!N_M=dMFrO zR##V3Cl7FVjw<~~ZyEG*omoGq9<&|?>1Zy?7DAaYVt_$Rr@drL*|a&RJDX>aKHtRk z^TkC?tZbgm?~%h^rKCLD8>-)C3!6EwApa8~Dp)}B_Q|LNyySw6M zJ66^-)M63DumXUnu^xq42A&&cF;mhyFT|@GS~K_3ngI=-4ef|fSTADFwQwI!2 z&MPjqfy`1UU35eDsNxVb7XD7uHFHKMd5~>Ygy8J)y~@t+-i@`G0z9Phn}>4X zPPu}@W<~Ab?35-$u{ST4NOgB0?qu;!fAR$enK(_Zo>Sjk+rabcV;8jXqjEQVhEm*%HlgE<2L&Se!ubV`#!HC7UZ2iSxwy2t;CxNYg2+F*L!N@wE!rO9zOa2!~pS znkmf&J9}LpoKYKiur^COYpBU`JekvpIA0VGjaIM5#>`IlD(0)pv!$EOKODoQs}`%r zjCbquFjxKQvKB3IVKdCHS10t9D5nUK|XK`OuJDz!S z5}n*xEEex_iUeX06G3BL8!^aLTvp4uGWGC3kjte~CJ3N!ix(_{S?+uS>Wo&1b1P`P zx)lzk&F#S`y6?^PH4V++<+Lm|RZg=?xu`*$vpy&jp?c9j>jpXPg%f^c%sJN*-X`pJ zJSH53>2FmwwhhUMDa1q5J}pLz=aO{uWl$)p1U3ozR!)6aa1P8mDQe1{t^rgUMq&Ee zAlCZ3x|nAJjug+X;rl^VHcuCggqblsHI$)>IA{IEMot+W$}fh6tQnIGBULX`KZ5;| zY;LDV1DnF8fx+5G(83u(?0=;L%^e-4%TOA~VU0Q3SSEdAi}^UcC}~?4L#HxZu&k^W z6UqFMm=)b6-HlkzhLs3d_rSV@Hn%ty9MIbOS{tsykP(N(aYAQ9nEb#LCO4AA&?T)^ zvz?ch)7{}%1|=_}0A_WRH+H0&V;!9on&^GFR!eQWJHphF%-L$p9`1EMkhMR=A8A)X z6hQ%}HYDM@z+gr*F*gX(%rtSW9~ax{(X+j{r(0cF0&@eQ*bzpD#;&Y;;40RTQSFGe zsQN7)pkRa>@b%ZDIcGwi5NAxuBiOl>oAu?UjCI-qB;1hPR5W;-hT^xP;g~ioS}3x{ zPMCA;E_Q5wueEu$KIZ{oPJkKSHf6ON%Z%ae3}D;|N)RXD1RSrlzo)LD-bG6|{Or3e zTz6(Rm0M$g8P{B7(8Ia!Ed!in>0;EFLCc4TNjTN3p`UT~@)!f55{f;Dou}};YFbJW ze%H{D`Sv|K+4ZzFeMxHr*B*qfKLUyIe%FE6j-YCwfH11qnM(FERLB`Wamp?y4Y0tO z)+!@=G*mIT<`1bQDps4cK`}8>&cUihxL@30m(A)hUz|p#d54fw>GMqMVyITw#F(yN zc2QmZ3fDHV-lV$6EktpL&i8tX@!VFoLoT2{;QS~%!bh-uv^d7*tftTI<;^QZs6bny z9x}~bO0V9{8%Uc!UN?wQL|b@-VUf-jtUjipXzKI7+3IHRcyV{bUUN4VUpEYvHV?W; znZyg6$lfLd&QKrqt2o7xMiS>Lxp5^IctRGYL^#)kPQlQW+_YI|rkiSq!=U~umyyv5 zxTEkiyOQ(17JBg#okP!E(;IA}GO8aM+=3Wxq%MI8gli-Ym9viZ-Gn)`Qo6Jl{Jz=P zKj=ZCqrG5`JO^|WR2%WWUgud`19CM56Qs3~D_N+Z(5DBTj!IXiII-6wPq@JrH+(G| zxT;cR8!;+t6y7V0&K)x&j=84y?4K zF$>?2OWgS2&?D(}Q?WG<_8@r4l@~oS{XE!^)s3bQhQ>_S4^ISe^3O~So0d;w(N>^P zCOLV>r6@&h5dZBXt?t!jwOoz1x)J)#&1-;dlQyrx93FgukeNmJIcI{c15+Q{n>KpI z4fE#2@g3(1KxlK4>3TQAIN6ODbF)`nQtw20n$CfB%z|KkgbfW3`(;j)cG^M}f8>$9 zljG-7zTEU(Z)ZS3Oqg1)S?={Oq7UXzTA*gPSqtg$T1E-$x$F!ki9Kuz1ozYs^5Zm~ zod-(XoKH^p+-a1=|Dx7r@b9#e7FB^^__|mvrQYzW7A-h-N&qopo8apzY=kWh_qqWg zvlQ2~nXQON>RH&T7!Qg{szI~6+Ph5?ak}A7V>EVLV*+~C)*6^+0k0&{2=AFAf9BrV zY6XH*HoAb~x7@LKDE=MT||m5Bal@SwrqD z1-~X>3`I34hZqV(5ZEn>(rhio7H+1S*`*9V_*R>X6;of#HLX!(D^#6}#$2de zn7kMx(6o*dxCjf9Y@}2fu@sW?5h>vq3p29|&m_sYVHk_2eADO{R5kKwpE}huGJ2B! zWJa7FgV?r69ddyyYEU>E#{Qa-W5yHo&9HkgBzK1AQDJ@)oI%fKHdyP&BXix$R64AF zHw|YsVvDXPl)~FsZIf}FAI~Yo?WtZ_g(l@1lbA;YB?k%bmdR2h*jPbB+WIgEiL?+X z$IzS2Hs?HHk7EhY2bjq-0DH_iy$yp^5P8KlHC6s97Tg_Yp~Z*RxA+-FJMS?Mv2m@SUTG#U!up3Lw<$h3*-7&D<0 zy`rYFzARo{v!b#Au}TgtAtKW^$i*v8i8f%amrhgH+}VYQB(FEr2Yi>!383?Au5|E#;}uZh*3~Ru5b(BD2*$-;75BE2kNFwOrb5CbQzW;T=P}r zLA@Z9!|i!r8{v1t0gu&Rvp$yt95C}a!OLV8M;WoEy}U8u`|7egiqQ!%ptBNT5xDD| zl;b6f5sin*I=qEd_3)S79yC@kL$V&j{prK92`t+}fA_O#O4$_)$`O zVTT(K?E7yklxRPrai*Kuh)0@}QSUD}@FT3l85q7TMR*OPW%Zbb%#jmBFlhkN4#Pu8 z!2$Hwf4GTVv3iptnkr%Totp!sC0Yo6xo2+5v9=L1b0e&1%tlAh4<*8RHP^+>62}?P z9^6#)V$5K#!6<~&>9(E}rZ(noa8LyzpJQ^ZkY`XbF4QmM)0YnB24hvmf1PJHJl>GB z$^4k7i?@jNqPbUbegK_pm?DF;Lv136y)(jkBKkGkaX$y&%-ePAkFflji+@pJeBF>M z(AQ+0^IX}6J-QpN(_jssdx3`^OM&BL?~j0ZhUDW+0#gS)UGuT7X%NG&SOB7yiu%HM zQhMaZc%1Y^;bwU8k+V6hC1O%KjKBuxb@;FD;Ha*>NXc7W8)Nf!u?jbB zNzPySLC37Bu7_I3ThFj6Wmb1;)`7DRoV|drNn1E~?wq-^&@=t7j&T-U>KOl3QSL=- ze$w9B=BDMjdSqqBZRR*$9FypV7Q&J>dr?T7ZNyxwhCwsmVBFWaW{3cs1OUKAhSC;`0c{GHcp6nnr3!j-~m@b`>SuL zsf}Z)OG(X2%)hDoFQc949L*Z?Okl{Tn`WMyh|CbAS8DDU0=o#!Gd(=SUyDc&R^-}5 zB>&9~LvtnBXOrDnRfDyT`c={<>K%sWUT>GtA5v=c2U+f1w&2%?)N@mBm)jv2Y7P=MHZc z4R2!Xhp)x3x&J1*V8i=M3K_RUIG5GpCgfP#R4^73o85W~zIg=7#@E>h3|Uh}ty08U zb#g3^b=lC}+6w1-L@>*1Y;Bbs@uOdf+Qxn?XFv<*2qmIy=_8abN`=`)HcuYTtjeZf zpLvh!5Vr05jrkLZVEOUFbdyCPmf;aJ-Zx_!nCgx-`IxDL8M0WZ!O;a+3pT*!Tz&+( z-Fg>$jTDqa-_Qabyk#NH9E8aWjhVvi0E>284>WIdpB8!?A0HZoa^Ue(07v<-PLYgk^_Ok2_X36Cy0<-P)x6hY1>@@+W_ z^x|MHF2s$)GE342hFBPE!fP%uLlT2Vh@S9);|{DR4!KtxFpvPG)y+FZa2E}eaZMJ& z&2-}26tl6g10x4+@Dd5DPX9u9Db%nhZnGYF&4F%vw;qHKqSg&-AS*HR8DdjYQT2+S zShA6?X@c5zV^a)L5A@a|m~O90aRS&Ywg!s;z12!_87Ft4m-yZXrP7f5(ZSbkuuJrM zsL~jECrl*7_qYyGEqZ9!7fyyrfS7wj79JXPF%r6_v{>@E#AovyJl@;0EwnV!C%1=4bbC;js&cP(UM0?yuZ6A==YF*UkK`Y;CVf z=qye&zyaw+A#h1}AY7vEqH(d>I95p|QIT%25~hc}h+sXRcLMUAV;^R9(Y!VLK#Psp zEAXfl`Sj%9G$&d6DL2lH+2Uw|ZrQF|ch47{uvd?G6^L1+am)e2v<5EBskKR+n(xZB z0eCr`8_$J~gVw^5D#oC!XEVvE6z2F1zXk!Pu&JvJxCbgd_s*=LwvRbfe6^GF6jG>R zy}gW^=)!24j1A$vAX=Ix`@*B1H5rhwc^9k#4sT-yXisITyeUPc;cOZ=nHZ4_KL`s! z(t}q3(!F!DU2Q#4JY8bPH8IIXG<$96&dP$wnMR*XrRzlwSl_}|OxPc2LUsf*Fe>KC zO>;APj?g5AhWe5@9{$YbA84cc5{y*Tm(1s%1NmnG|17k%E5i;RWQwz4Fv-{^{6hZA zh{lT@WCnYyYIMoO(6T}Z9GFySxL9)q(P{R(@BEv{ve7*}*}x91(q2_zyiwGx1OqP7ZRh z5x4}H3LJ05h8Xt^%^%|#uRLvkrVui;`5immxI9qxri4^Vm7P|f+7a0j<{%18P7XxFSDg_X%qy7 zDRon+7cd&g%J5pG~C|s8yYvX+q=FR{9!<@mBy>! zhF!9uiRtW8F0|th>p@tVEzjVM-o1fQvUQD6e=w60nDmQ@F19p$bxlP*R;pkfoQ;3j zd>celRq~1j>dhvbD&lyN3aokz9&pWVlJAW0{0?gF4P-3^&vHNbg@u7w1(ddQ2LVS+ z42Fa3-XBDb1})XMvAW`f$}YH2h&VugF>DW=L$Sh_jCqNgF33`hpwx8XbyjKNIJOve zEI08K3ZP`p{NY9N6ou(gY^ra%Iwf-!!Mk#A@v`QX)GLwExiFs53UL8@>Fc$M!BP&C z!2oarQ|uocBEm6HWE>tsJlV~k$5o0Kl;CZ})=_M@%K8^h4d>n@0>@xjjcx@k;sYaJ z(&$!%qJpqO*ZL>#Gi@NoIxk~(6i$c{+JqRG=XhNa z>Uq(DC0>s`#;=9_(W%*|6E=f2v9WCcziVLQm5jW**-RGeuqZL(X!eYt#rd)W+7!#6 z&YRj=F$V`7oXxha3-7SP`=w2$^g4x)shwu^!Xk;|RWUMs(e?b--awfQ={rOM@Ic|R zL;hjH9r|RevtG~zOIo^74X{wwqn?ILNlZq<%fj$hZ2CA@(9~;zH$FXycXS;0rdv8l zS~|<>!kAuK&;eRoz0*dW(_aMR;r%)X70%#0P#Q2go+`wwi$bi8EiBU;PYP?@P-j4=@fj^+r8}Uv%g{Ws9i6~ zS$wW*%y!$2T;#aHmB!_ut)?e2;{#@o%Io&{dJe3WW>06t4STb>4uYZOw5vLqG#ih7 zw$m7xDUk9j{C`3GtR-LF&G)j~XTIpeUc8OORQ%_D_A@--&inB@e(D7wx_ICI&~^WaZT}c-dX1;z z#~rz$kN@3cNT;7~#;kxh0eL(hUim(BzHQj{kHMyQF3!hi>3{t1UPMOv`Ih2*OOeO( z;breb=lclT{xR6}?!oz1<5vm%kN@5K$VflmCY+DImc;Xo!+*b?zr;3=@ynEZuIK$= z4KnoMclZHluun$Y=R> z#ectidtyI4_8w%}=NO!Co}U2yYw@1anum8G_w&C@+mBg6{P#a!yy1DbA``#y>ES2K z?7FNcmM#5!H@}5vhdlq2c4|M%n4TZ@KKv^E%g|71U2bSZNqD{VD>5Cnx)?r3*xFdt z&_(>(^v{>M)Be7c^1qMR@x$j!YdFXZSq~ikHpCyNNc)7WrwnI=tfi-?*;0o;A!}*r z={&nW>(_nwq=!GDok}0_@`t~~RtQhXm%o&KyP$p`I)*+xFMlwK)x(5?K`kFlKL#RgQI|0jL;4Vn;T;;*G;Lul}M22s^~T0sa8 z+6}>7Tt6jQOCzOr z4dN~0J>tXSQ{waDYvOis3GWl0rND9#oS77rKKh%I8D zc$&Cbyh^-TyjOfw{Hyq?_>suY!17EM_Y)V1HiVur_61RyT zi2PX-mLn>T7pIE&1x)*Xp;#&&As#25B%UjNU;K%9tN2^-3Gq4cHSu5KRCGL+>j3d! zu~J+mHi_%SZ;9U)zc2n+yhXfMd_;Und|Uif3_={U9Am`Y#J$BL@lf$_ag~@7H;I>t zKNW8i9~PeypBG;jKN7zbvtgLATm|AHu~e)Tj}_a*e(_ZCeDN~zr{ZnmZ^b9X=fv@& z)Gov|Vw2b-o+O?lULsy2{#?9Q{Jr=WkusR~St#x!&KBp1hl{JkgxDpXAf6>&Bwi)n zDBdY<5uX&F7he}Y62BC)VX(5CVzEp-LQIM$if4-#i&u*`iFb()iBE|yh;N9W zi+e#~u{?9cWn#S;7uSgc;_2dr;uYd`;=SVU#23Xk#g9drA-q0ZY~uuRf3aLVR^%_; zbN_zvRPlWAGV!P4FU9-B$HZsEm&NzQ&%_M;a1*byi@3WuUtB6yiEG59*dv}So+Dl@ z-Xz{7J|sRRz9POShGCwuJh|dzafUcwTq;(JM~SUspLmXViTHEzUh((hU&NQi55zER z8J1_9xQDpExJWD$j}hC&P2&0D<>GI}C&cH(*Tj#+uf$2PrC5#`Vodyjc#HUJ@lo*^ z@fC3`&cX9^iYJI?i&u#^iFb>?6aOUsLwr~KOdOx*&cCNPM?6G4TwE9@oDiz@lEk#(Hrl|kt0qJ4-y;2F7ZV19PxYN zkHuezqu?9x{&p3oi3f-Wi zVvCp(&l4{fuM=+<9~A!~zAJtvX2L1wb@Rlj;w*8oSSB7Jwu}AZsp9$K<>F7p2gE1D zXT^VtbUIm%s5oAnCe9WQ63fMU@i_5#af5i8c!7Aic%Ar5@jdZ#F@m4tW_j|(sp0|R z60t&DDJH~j@nrE_@%!RW#9PJt#K*;F#n;3S#jnJi-Cg-6ihGOm#HC`jc$C;G_KBy8 z7l@CGe-&R9KNPa&fiTB=(3Wi`R;`iN6*9B>qEuSM&;9IYx`SiTjB2#hAE4JX&lM`^D453&kIb zH;7M(FN$x8pNa=gb>%4*Ys6#3c5#EaS-eubQM^lhSllYUB)%i=5HqH^>+UJe5f2tC z#0GJ#*dY#zXNa4{>%}|7E#gz+i{e}2r($SNSDsvPcX2;)p;#&&As#2L69>gJ#f!wN z#hb-@#7D$Gi`&Ha#LvaZbXUH7ajH05Tq0J8E5(G^EuJKvD}G=6iFm7cpZK`=toW+< zq4=d3-OH74g1DDhBpxPKiARbpVoKa3o-bZ5UN7D$J}mx8+$O#+ej$$A+m&k%aer}< zST5F!YsF6SMDc9#67fgkuf<2jXT(>;55!UXxN?ja_Y|weqr_J6RPh4w3h{dJ4snb4 zl=!0fmiVa{n&GaWD^3^Ziie8J#UsTQF(qyi&lfKjuM=+<9~7SyUl2bNBm27Y{&H`~y@c?m&xJ;}UR`+HOrM_ytt=0M?6GaEhfeF z;rEE-5i!@!{D8y6<>G3wN$eI+6wekf7Oxg>67Lcp5}y)Z5Z@60C4MDF=ehC}h%yxLLeXyivSMd|2Enz9haQ?hrHPyYucMP7!B{i^X!WUR*17 ziYJI?ik-PBR(d+ zD84CvA_f+_>*t6Q#QnvEVyRdw9xb+tCx~Z>7mHVmH;Q+P4~kEU&x@~%ABkUz*$26D zju)qiv&DnNa`ANWE^&+al=y=9hWIb>D>1snU9UjgQ#?RiA}$lxi38&4;)UWB;&tNf z;)CLo;tS%NV!^?#9Q%n2#A0!Uc$C;8_KM#Uza#!wyhXfM{GIrr_@$VAi0WOOCe9WQ z63fLp@i_5#af5iexLLeXyivSMd|2Enz9haQ?hrE$b>-VdoFdK?7mMX$y|`BF6i*P( z7B3NhB;F$aT6|P|Mtnv5K>R{%Jj|7^LmUuK7ta+h6u&24A^uprMZ8yhM0`nnTl`cE zE_K%(Bkm^dEf$G~iieA<#Dv%-o*}mf_?Gyo7%q3^+eIuCXNw1mhl^{(7O_t} zP24PACEhIFD?TdzReV+aNc5Ju@{AEDi~EU-#B#AgOo%<=x5V?r%f;)(JH>~^KZ)DK z_r*~at~}$#J;gcVA>!fU8nIdI6;Bb*6E7356YmhWh);i|4-(78BgGamC2kVW7cUpD6K@v}u5s6^ z5Z8(w;-GkjxLN$6c)fVL_<;Ba@j3BTal811m{qI$6${0g;v%tBtQC(D+rEdSb zO7TYVF7aV;tN4=mj<`e2IKq{07jcR>Q(P=A6C1>%#I@ppc!v00@hb5q@qY0M@mcXL z@e?sp=gO5QP7(JP7m6ifjd--!CZ@zw#P5hd5Pu^6Lj1M(d-2cWKg4&$e~Y1dSI)8G zByk^co_LtJTwE#IM9?gDY==xTko4xI|ng z){8CTdhulOT=9G2kHnvg_lS>(TgAVNZ;79Xft9X&qs58hUSg4Wh*&AE6dT1(aie&q z_+9Zz@doh@af|pz@o(a5V%93POR-R#DJ~LA#ai(gu}$m~H;Lzomx|Ylw~D_J9~J*1 zZWG@XcZlKDuAI5zWO0T#UtB6yiEG59*dv}Ko+Dl&UL)Qt-Yq^XJ}tf|zA1hza>6+6 z_Z)GexVJb@Tq;(JM~SUspLnWxfp~>@y?BSXMSMzpQG84MR16)ddK7mT_Y)V2rQ#9d zapF30P&`w-NW5CSS-eMlMEtY3O?*%MT#Ov$%9k%r6=#e49qqn9P>hMy;*nyrxL!P2 zJXidl_#^S>;yvQ;#I54r#ka*z#K1AGJfp?k#J$A1;vr(CxKeBsJH?ISnc{cFE5#ec zJH!XYKZ<`7Ul%_V|3@5ktSj%X;#6^#xL7O`j}VU)+r@tIRPlWAGVy2PZQ_06W8yR7 z%i{auS7P)ySIz=)Pw@b8iMULx7uSmG!~yYi@j~$m@jCHW;{Dk;q6CW3!6<-xU6u%T_HoEdH63fJT5iim(Iocs^6weYb7OxS1F5WBt zUi^#rviQFEA2BQ8t}{(MKs;Ei6jzB&Vvl&T_-*kA;8VxYxccdR&B+*e#6mWZ|DvEuRKfOv-ZUGXaMCh>0ZcjBMKe~9mjpNW~Ru6%i7 zp*TxCNL(g1h>arNB52R;MDZN)d*YA9Ux>dE9~1v7{!`p8{*Rd5=FVRrP8a8jhlU~$~8uuB+d{I6pO_g@ffjP#H(7Y{!SM+ zi&u&_ig$?*i(AE)#COCUV#e|Ayt{}~#F^q^v0SVd*NUCu3F6t}CE}07Tf|?BkBZNT zuZSOrUx?Z3T=^!5dyDhMVzE{{PV5j*5YG|6FJ3GDQhY#sQhZT-TihXLcDVB7i_^q8 z;-O-dc$C;CZV=B9FA}d2ZxMeZJ}y2dzAk<&20LAOa>YHwnc_iWg}6$@kG5KS>J>MM z7l=O;Zxrtq9})i|z9McHzZ7%2-1&DCXNU{LQn5~4D|U$|iQg746@Mn)E^ZN@7GDzI z6+aiVx?Oo{#7418#P4!geVia}63-IP6E6}k6|WMn6>k)874H;(BW@8N6`vHJ5nmIx zi~kWbdtCX(iIc^B#3Jz!u|ljDj}zO)K5>(Hk$5SY;d$37eH%H(^X^yrF{PhW`Z=Zl zuJjv9zpL~PF}xn<*$wLnNStq~xHkzucaG8rDt(yJ6(q{jsPyq-N<2wCmBfA*DE$NR z8u1qKF7W~JG4W60vt+L4ZBzP966gJlL^;E~U>3@oa_J>vmAG2O`(14RQ%KzR8A^Nj z@O)u0DvlM$i#Wvgn<>r_7m7>7VzFFAIL3~H8*GGmYHSuEHY|KalLo~iTzGd`gHNzB3>_K<@la>nfPN8 z$Ju&&l=D~0|Fw9(XzTFt{o_jiP5is~n)sHuUHn)K1>N-{;uvukaT1Ag6e>MkoTdDO zls;4}6D!3vqOI>oIh&Mj6*q_{h^LBYini__$6c!QR`D5eLdcbWve+uF6Zw7`KIaYM znc}(PHR846P2w-a--=tr$HYI1e;<#dC^^3Jd30zWdAE z1q%ub7auskXujpI%|4~9syq-tgVra2w{Q%nAhX9$vSb z-AZF?->p-(pR%;@zfw4LFdxc*Wo)@XOf9c1kEUk*vyq#HU z+uo>1>Dyx(V{c~!VsA&Lp7wSihgaJ< zX{n9lGLgFP&D^Ef`+o0!-bec9|L^BJ<&MnqXjS-=i<_?*%-<21>}}pQIBhVnxo~6C zU~u!=jgk4G&2y|SZ!UgsYxvfl`#h=-)zhEt?)`fDa9sGC>LL&f21B86Mn+~Nk~L~n zc6N3&XSDlx-al}@O*rWX;5Fc3tiU;*cLWfD)Tjfmzjmxw4?+}r7rTA#|9o znCVysA;xqug&XdYH<_848Oh4Bn;g2!(WAfNK5-cDbMC2Q>^{%A-Q6c{$L@1`fxFLh zkmmiJqx(EZ_emRw_xZ>s(R26t2r882`m65q&$`c#&vWJd@Fd6gI~?E9eLh*`(og6< zAD!va%XOa>IXG#6x0!aI(VU#oWBkwmect@v@AFcep7(jF?vuKk_m{+f<0e1t z?lY)g+&E|)dN2A)GwL#P_ORQ`ahW+TbM$VOIof58c9~-iv&=DvS%r*Y zCNd`DKmP53Ou{mQE;HydgDx|~3k3rqml<-IVV4}2#S>L zGP7M~G}AJpE;H&fbKD)}xXc`vIof58cA2AHCTj`jWLq+LxKF32O;MZ78BaTZ!HRnAp@^&S7(p#8=iFgXJftFzzNXFzhq`r zhIc!#ydvz~0q%$Uz7sqYz7As?S>b?pH|QZCaSsqcIqo%vJ;pxh|J_f*CfY(w_q>OI zQTYEb{(mFgMf-KpNw_dDknw_lL^?erXMKiL2u$OZ^;KRp-w{z2IYcMsbL_}-q=Ds0du!g)7g zlb@yhV>W}&G}{4L*WkaioqXzh+EDn|d3U~V+8Q6{I$Pu8&0?;zIX>Qu6YO;V+`kY1 zjhjR~L6^q8G57s9UblL(yWZhBBhOQ% z{7RSaj>j%X214E$+!ghC7O({W&&K~|{J#MIm#)n8E(9qk%y%ht`*>r=+P+?NjN_=$ zj*%S4%&22H+c7xG5&fOl@Ww_QqnVD6WjIE{j+r4x1hQ;@$P42(`A|3o%fmM?&oKtP zx!_p*FT(#XzvX{#U*bO9yN&~2;5+Vwk59@$N@YLolX8-+l;68IJ$v5w4pC3Gyb*u? z^YQzyy}E51j)4-PO-=pcJV7(4O-FcNeuW*NfXugWCb#JrGpo-#(M7oNH}Gygc08{H zq0!|dU*{YQM?N|XCGJN*2u@mvG6VyeTjn9>r|9fK&g4f<)|~}FFyrsX;EOQM72H3; zFM^Saxa+4lY4ET<=7cl;iGhXCZfI%2*j~)Z%II2!oWJjj?V~TXoXGjLC{#FuzgK_) za9URAK~#Jwj}0<($u#`QKa`vGnfS9Cbw}te1pY!(+PV3IL-3~%x95epWG1vX`jr>r zTjs(`uEu6YYLOQ%M(6V~`mt3)9g)$GU*-vyJ!D^F;c&S8Nz3KtvcK8pg85#!@>Ohx zp1@hd)jz{#W;mQY3ePRFKSYDu#M9$NLiMPVaFVg>P(P$exW6Bpqr#zmp#{T((~-yy z)BB8Gj6XU2(i?r@3VioifVG+(=HD^d;h*9g)&g4ESnl-@{^#C|KU4TDs$$&rX(Y$- zi?L979^=fm$5=1)o!Pv%?a0~XJE-)h3o=#(-w$Jq=l4_bMKWmNxV#R0pV4fIVBX=! zBGD3L3B!4JqeK~P!Fl6xTX`MFA<-VpE<=Iy`PPt(7eu{38!X>Zd_gZ&pG6YBa%&>+GC41^K_^6|T2bZb5$KZb;o| zd*&D9k3!?lxXDtx7Uc7du^Bg8YJ5TdA~d6npIfS+Apf$1kh;ZE6AJQQ<#W5uQWFdE z$D#{l+#Q?(gJ^O=ekn_KuchV}ptm8l#ZpxT`8T3MG9I;5vLOFxbeN21f{~U+ZTfy_IG4NHeYXU!}n(=m!E%%&){3WRDjCX=-@bJ$o$p6)7q(+5! z@7EXPUw$M~QA^!WkpILeq{dq6#)AC4cwDZfZYs!smRH|3)P+`Xb3r~=fo2qh`fv}o z7UX}9$CxqE_Po6y|4`QFZkD>EAiryOq$XMF&Vu|C7bCTY9d~y@{?%*~Q!MqHg8bXL zXQ8DYD9GP11*vJFyU~aqF368fM(Qv-%cBKer~qvvqyIBJfb1~4Lul(nbl-Q_$wC(| zz~*}iZvJsPHs6Q*L2ey3KVUBpy}S=Lx3hA_{~48^oB2#|T?RVQc_>@vUxQ!atX|%J z7$?kp))Ij{zB4!TIom7fjb+z75eHbW9PN#N4Yih)`BLycp5#ZUpUiE+{ju%kl`cc# zWjjeY@6cQ%Ua>?*-qz!g_-8O1yJdRgPehB)%6vQc5zml;)|~ln&}2y7wJ3b%d$wQL z9rV6`P!^h4R_15H*(h8=rIc@yqMbI;BEV<-VpIq_H? z^t9W425lkpFCkXO#7sVlXF{y3i3dSz=HFfZ54q1vZhH>oLFPX~g*?wf*3LGUU&3Qwao0VG5Br}k-|p_!5Nl~-KMI@q zdT0TUU6zaOH{A9Lwv)Hq{)bgz`)zlgH`r3%v2FL*dvO8@NZ!CA>DJ;ForFZqy6THxJUc9>%M`YcNyNb@icR4%=)v*`0Lx*rObG1$%e|3!{zG0Nu=^ymkn9)2_-006 z_b1UWvtMLl-+(uE0ructcCS<1y#~-8^dv*4?1{bqo`an1a02_$U&bcINH8m$1&tRB zhwbG@S>f9cMZZp&qh1A9f(j$MLW42jNCR3+g;oa zMcCh?-5ePYNA_BU?H-;bD{?wiOmscBb0Xs*&7-~C&W-S$s?ij;^CK6a=AwPvo)B4p zDvkED#ZQjRjA45N?YP3ox6vx21Kge(;r#mOAg?6nT(E+r;gIBR4}G zMNj4S(#XMR=+V=7Xeny32-P}iD*DId=$$;ZRoGoDh$`%EZmYuX;kGL5UT&+xe(fqO zigQJOGaV<(iuAIu_i;NX@)RCm^tU{FZsaN)6}_L^`H{hLY(K#BOo&_r;TL`IKNLcgoUu9t+d%OsBG7e;^Z zEAGyRe<{zed%29;x|hqj9gNhnmagEo?&XK>UMR()SMn@bCf%Y}aXTk6Zhz!o&6>=O z#96D?a63P;R~5E@#6nI$`6-%1C-b@dn46RMO48iu^{fsn)D3Bcx-qR#H@QM>$0?&X zrxohwX%&2ntKg|Y?DGp=JO>y2j1~5BHL`Af7#AGNW6N+g^`S{)D_MX?Z}SWA7BN8g%^#H4&^qMYalFZh?*o_47Z(=PRqyOeeMf4NIpTl$zshFx3wgxgto zY-fX^J#psfr`(*hbU$?B=x3**O6-09JZ0&1BIi|X!CNRa4<+<)sffC4mU;Dn1~*Mp(tx( zdDd&E23}<&^QL4)_X=#_d7I&tMEAB!dwH~BqWf4P>`lpu&JJA1efF4->;trqoo9|t zdNw+Bbgm_E(mB!TfgEU(g5LfvFFL~tjtZ&7KKt4iS$WS>4(?~C%Fnx(b-ceNCghEp zfW%BoOwMbcfy69J6y{ye6BJo-r+Znfa8%3uzzSR`k1t@19%$Pt=K?z_T+q4Ri!KZ_ zV5cm1?~4Ld%9IrMKs=z~@kBY%g96vG$oO?`FS;ba{_7R+2P2~gTOwG1pXQ7nV%y;Y z{z6~$P)lUy(U^=L7ASyp#?9wPV}TD?B&)6Bz~|WZ@=QdP1jfM!2I;ces-861JP;B<{xBGtYwD_ zn7x?U{DTaNh3xQbX7l7ZY~08w!!|0hB5(;d@_s!BUsnbwThInzRYniDL^yBl?no@R zL{{FnXChH$i5zcAVRS_x6XkYC*VwjhzSa`qyhS|k5thhuHBo1YoV-g5@lCxYa$U7F zSR&t5%Sua3aMiNP5|dGCcHk+uMkfS*%ImhVY!j^qd3guZ*w{_2@@6WiX@SpiuUUCV zFGpg}z>~PQ3GUgo819BQ~KZ+0nmTN*eDiDU9Eo`}RUYZz?>oz0zIv^uZ~ zHFZ)!XHPrqNUOH<@=Rf`v5Vg9jULV3c4Qz2WedgO(dL}V3JvX>iOsWYlW)PwIomeR zg5b$H$2J$>$>n_KO&m7qcJ#KK(E}6FP9lrvLgEbGhHNjwmNt6hUf2vr3SfVaK7rmt zmKXYW3NLVR3XSnoOs8`=Q=JyP+SbD5C=?}9|z|p5MUJ==~4ApZw#i|!sa~!tM zcok;~M{Z{oe&;tVL1Zdg&gk>FofDxb9ep9)hTO=!W!T=#?R>Ph-{bp9J6Km^r(Mlc ze+FA^?4JDEvlDbPRtT+nW2b5qtH*y%-$Jn{8*v^jx&>qJYeFxhUBCV*&vGaa`?a7hv zz`Y%N;7iypjNAw5J9a@3f^)i8$S1(qUk?AE_=|z@uc7fx&*%uSJO%A7a}nHg-5iM` zMDx_mM=yq}H4tby0;S9Q0Ul_^U?7Z}%FTPe2#J#d`=Ggw%ew(r$~Zajn@K2O-i5II zGC~&inw+-|HJ6cLiQV%!2{a=!$fsS1g0NbwbgT#~ow;Abf3VLM?!zm7HF6&&@in7< z+2Pl@6QiJ3b9S$M06E$z$~s{ND>Lmn`g%Wp%@eVH)4t|a{Zmx>`>@{A_TfeSeLDSp z_&n0~NiWKGxep)6b0hbe%3g0f@(bM3320Z@;XC}@`6$y)IkY?Wc@_Iix($tJ#@P5& z>=xlG^T)1b!^CqgufXsA;;+%X|{ z-UkjvVr=S>48p@qu`L5qbAf~LJPxQurv;ftb8wnL64{?~>-K|`>{do`o<8x<(R^p4i$Lny! zes&cvZz6AhfBPbkXT_Xp#msbPZ}!g~_QsbUjDDKCD0CT5QqAKIawjP$S?%R6vF$(} z-vp9-u-#qI8-Etcyi4w~(33o7dKh0->cZP`$GL~=pm7jBxyx-Y1Uh)pm;4Kdyz#3b z0wTGqLWStgd0mUK>ze<4i@2w#xkOV@`t*Ss$86c35giHhob4ExYKuE%% zphZR!$V93F!4VY|6%}oqX>n@XR@-?VacD)QZM&U^R-Cchc51sFTfXPnw=&r6_b&hU z|K4x?YyDZNs{Nc{pL6!vd!K#Iy|*gN*D>j& zqtubmR9y0>bmecZ0htm)v*N!WMqgy!l;JF& zkF4?3j)Vs>*BNn>KV?rpr0}xRz|~NWNuaZt?6S|X4iD6yU^w@};l$-XjTC1tO2^H9 z6;%@M!a!r==G7uoT?9eJ72B-NVCfRlE_G}f=u*;=>NyA?u8cHxHSsW~xJnO-ChUVp zO^I7}?I54!HlMSTQKZ)9!|(r$tF!ssfdx3OUihe*xu93D3$cdN!^Vz03cz^~su0)8 zZpxwD0T$qeAZ6n>25>n4;{lv(c=?r%iE$BT4(waYxFSvIkaoh!#*Gl*(s!ZPaky8Q zL(}|P-?%9AMHySnu_Zv!CYgG_giCkD9pyNV+#b$FMnJr@q0e3kuug!fFTe!HH3)EM ze(6J8qX7Ia<}T<;+F!1KX=&iVR$9v><8$euVn44y)F1aY-(hrb9w}43f%?N-V z0ns`E!B|{Sd`_&cNd*Xrn~5`GE~Lo%96P`|ZpT{0TF$r=9M{1u*+SUnu!WFL4ktON z>Ms2c#7l9fNvV-qRA`5TiW99F62+Y%bqaN$2H;G`HOMK_&rynJIYvS{bM!olYNvy9 zU#z<@U2$hSZUtDUZ>|S8$3Zo2)<;u;&lMqtbOlv)m$2^lRaFFyxbqzMpr6Otb4ya@ z8pnDrOvqEf<2m<-9Y)N99OQ1tXB^}<^y)@u+?|dkh|Odp6L**6RrDJdE25EqcUXYD z&JcG`Sb$Ga&i6X74!~tLVBZ;cpX6A&Edn|B3y9a(b8a4Ru&*}O2QdMH$DnjpJLyQ(4*Rm?TsYbo%~|_mpeJFg zaG-$nEE+4{Q7}@^pSzKy-av0WZ(a-DhI)teTcllT6c$0xLDG?G9O<`7<79?q-XR^U z;Is_SyQD1@LHa$?@hY11`=k>M?_&Tdo(bkNXiXoFVRZkcIdDqj86pr^k#NkJ3D?^Ylu1X6So3%%A{MN2CIT1UU4Q&>Byl0H^*7 z_AZ{yCc_w)ejTFpY!MKlcXQnR0wVPdg#cRxjMOz#0FIGvN9$uSJ)UC)#Oe#tH_vgx z+R`6E#XQFg@aXH|-90A=@cP;}8=e!T&puy!6TmicP?L3b2}+$LrDp2g^8ij3FiS6F z2Tl<%TbIEIJlh4#@ihlShUZjsHB@A-FWB2;cuo^g<_lp)P8Yh$*9&@w(985~?9OI9lgoJ@EWOKtO+mIrQunuuk)9mOU2;Xwcuo*?BG$(5RCX zz(oR@^e1qgo{I%E>sqLa=Mr-y^rOx8EaRaLVjp9S#2h%28mG5`*|OX6HZlG-WXtDm zrdx5TO;7`G3u)VQz3ntzOKkxo@5a>_RlIT{zVUY4k!KipsP`~Y-Y%-(A;oV*^LAeg zmS4(M1n(x&UnkKAd3#BJ@8|S+gQN}9|0*ko2wbLrPXRz5XD`z9UjrxT-NKw$(|-gc z=ItlIwUg^GVDHx7VoGrBjcbNW{AuaDI1U;tz3oMJO#eTjPu?@r0Qyb8!aRG=V$N}<|0H-`@6Ovx4LsN3Ut0`t z-JdZL`%w%|!F%%|Ncja^{()2U-p+{cOVj^2!6Td(TrTUb0C7FNrFO$e*p!upP&nsWvKM_3V@IQ^J-scHkaQGj^d58A} zf>#{=#a@6H3Ept{KO77262U=-pZAM;U!io~bNI`%0A6SK^S;A>B33c)pPA!!`hQgn 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%0DHTeUdWtAmM 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

    7$-Gh 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%0Avo0?1~B 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

    r!qmEbpST5Eu6d(M?Eb;%;!RvS4_ZK%td zcC^+>IYz!B5;vvb z&7}2>x5lKIYlu;GB>#QTu{hAKM`e<}DG2QiN-an)Pg!dK=d{; zExJb;J1JR(Wl2kEY9^){FRzQX$T{RQ1sbYWv+q5s9eq!}vsCNymL4Uhbl3TcT{cLN zO7|qfgn}tO%azuYbXhUp@Ny|UZoqNoyb}^~C%c$gM`?*%@`LI8@=kFqUy5*Sa**2@8Omj*9q|H`Hf*${fp= z(-r}7@jb;?#U=>*bK0b4tSXKz)FVqtuG{29>x8lzkJTG zzNpbz-oC*hd3r)`tXN>%RFW`X?AL>+%LcOWNM6%y+)y}Z88{Q(8ZVaC>it=|lnt@f zHXo*zH#fH`^T6FlN%2p_i~Skju*tbmCzetQikYN7Q_Oj2oEalAC&ySU?0&Bui9jAa z*X35U`ZS_wlzxkq5<Ie(?Jfq`Ez_MRH*{4 zSDN}XsApqY-dL=)wT(CX!6tItw*&doL`n>mpB@m8c`vt6_eaS=N&ZyO(!%I{)n4x+*F* zgPk+K!Oo#vv2!R_>>SD!JBM<`&Y@hfb0}Br9Lg0thw`Feq%^2h6S*`4We4Cg@_n^^ zw7)d8T6&!Y{;d@&);E$X^*O86dvCnwM(ToPhDJ%Dl@}@-+P}}SMNai_o&Yb1rFWVb zkoYc`_;muyR1ZaLMwK6tXexM7SkWqNh;{KODaUF_mMrHhOH=Wt$x2NV=;|A59_g2& z-X&+|q%TNGLK<~iSINbx?oy{|#8xbE;s<5Y1z{}rS3^?oy3RzZQ!WV;|B`N!&_0u| zd8|~_Anq6cPe&5cH_ZOX2dFVv+-X<~{gv}Oy% zGNt^mQb*lLSn(-aEKKz<7k*sn%Pz23ne-8iT9R<7G#U*s&V$BO3F>7L>(T7EGjF0K zW#_l>DpppBH6semD)no!V3n61()wIi_1+b$u)BHxmWe%CCd7!v5=--4JJ3MpBzbN? z(@Zo(S|Gk9t4vCbTqYR3?-ZHY_zGKOV9I;YW$|5~fTi~1nw*>G;s<=we&s7I<|lF^ zf$W{qxMmJkq==MA>3E7Rn@`i*Zfbgg+!|(W@e3TlLR|>X#KtcadU%|NrrGxwAcIOg`M1IK7E3qdFm33+{Eg@mL|6uq87Xn#L9ec&0=w?8xJBjR>J7tc{xex2`!GJ9!WuASn>chN!J zs1!k;DObtWaq4hc9)RM6>6Mj{t;G^unwO`eBuTY0Q@T=JQs!mpkEX_ykE>9+e zRj(qZ?73>Mi3WK~oN;!GOH*kXDPLW^~nd&myz&nqR@%`$K;KrZt3u(PRMoi!IM@%hIo?|o8Z zF9pNd!QQ@gO4bS7g*$rE3C+JXkE#;4otm#dEoW0LY*^NT`oFX0lnP*?EE zt!-?fIFFkxHmFFF8fxWLRbP`S4mz`Bd(b+OD>uv9msfu{aKQydi)<=_4dt-|=9?vF zUvw$*nTqGg#*Um#`x~~bnOZSmk2YJI64zKm%Q?qK>n(lP`65q~)P2c1Ga9I+jmdZWkH z(Bm5qXsV=%R!rW+Xh8#x8#i1oLLm2y<u|h|0ehUdG7!A zF8jw9xc@J7|5sjx&xf&4qBC)HBkkj=b48PulI}gC?*8fqCO4bM6hLWM#eq)A#iXRR zNt{Hk5=zM^Z=lrpP<H;qb&$->XnApUK{5}%T1PBZ80mgg!8 zmU}mPqupVeOwnm4KJUMw)%Xlav$ZVy$cBsmj355x?67PidpCEt@pUK~A@k==yI;x$>LVdm94?PDsTg9p^AyAIs-PtV3KJK?h+b!Yyeez(3C?>Kdv(n<%)6n z|32YI!6V5-x5|JHcTHB`wqUGU-RfSYnVSk&Z-bgNj{JsB*K+BJ@-D2^;1kW6>$QBg zu0*qChbGc;Qg~r15p3Bp=9o1jT20+gDd|YdMWF0`yD{6j);Ds?=qj6&D^r`;Z%OY; z^|$Uw3|9%QWIbwtv*;ncNuKG1h9n8a&W`S-B%8`-tdy2wjgg&^5bKxfRrjFcb)|Yo zfb1}5i1hZ$JuTm>22VF9%hEC2Lo8HWegz+jbFEzW)?8d?Lye`uBnKp&%o;Ik(`K-* zYsvQI+{6*@im!Up4Xx55r7`NPnu21P%&sc&^gM;{ z#)_8QQ!sBtx0ytiCu=!0mLaazyS8CYTG_itoO)eZ3&AEX%CBWNDc@w6%8x0jr;-WO zm9>|dD~-rxEROYQ-k-HqNv=$vLP7;CP~&{x@|Bni&fFbtl8K)`yDrHh$2|e=I*o699D6JtVua^xxl9xwmk|c5S z66+d+%I240r+&eNRo81O6IL_QGc1S64{RpyEg!(Drq-$0ip(D@j|7t}qG#*m1<=dDJ2Uv^rZbO!W>(74U&|96kzUYy5OBI7>5eQ>Q9@Eeczj zC$2V_@2nl!Z`H{Nff|DA`YnakPL8WS)^G-fZGLRML~<|0azZ;=R%w8;m!B%g7-9~s zsk#33I|Wi{6-si-4_ADquHB`GN4Y?&tjO+sbG}z=nJ7_Fk}Nj5PW$7n37b}&!E)1( zkS}LfI;+f0kaPKOmOg7WaDnp$y^WD`H!aB;vK(GYcJNQTCK1FQvTQ32eEn|zOf0QI z!UauzSWJs9`B?|GE;I{6yVnzsdppA4Zl*h%?Ux7KJ$3oL6ijoGg|?OE)^S#)Qu9`t zuA@0aQW*;C%tgMIKv0xf5Gr*frD%;NbSliRV36Ee9nGnry{R)C&IH!-DkO?aZTDaUHS5z%WZM9G%$HbRFU42JX7Y5HJiy#nW@&! z34_QP;KW!%#6TIG+Tt5yOs0NIHZwNpok$JM$4p^AtxpLm@v`^&^?Pf>F6eav6Ih{y zec5SkwNq@pccotK_s*BFYjD)^+xwJ6AhXv!qOMc|`>&ygNmr3P2u-o^dA>4=0@I5v z#HRqie1IBDi`hurVOjWrmA;uKjlz<+_nwwQEMx85XZBA;1ENyi_uiTnp zPB9>~U<77l>S)O2Y+^j3_9FPcdf;luVf%@vACe37%@4zJ>)y(r&;9hF0mubGE zVG=k;ktKC`r*4pw(rOy34-I`w6lU!;IDjAb+WO=jZ^|#81kQ>5g&^h0fJBXd zPE|EXzlOo;Y|-Yzy63P!3E%cS7A#V(v-O6esVm6|tS1v?T~gg_Fp|xszF%j^TEmjj z91E2K>sP=EoYEc5SzwyFviE9TTe36MICN4?opv*U<a@t3YD>jZfEd9)5HiPW{U7I7GqMq?7CWC`EVC|#WB(+YE1 z8Nx#FE47@1W;v+y$LBXzYGtxR`Az0X(&%ePG)J!F$=m@P-KK+k`pVMi3trc;)D0)W zO_x=OrKBb>EJ@ri{|~vHF8jhpsrie#0$Uf!$qSpgq-oE7s;*t%CG9P3(>yAhYGn`D z2h!az)F3m=IE_j$wU}95%78R&U2{CK9ftaH@?XiF=sYJ*4^WU+kye>snjK>8 z(@%J`8K{0dlMu{l#IboZ(hv32ZA!iy78qrfZ|+yuvpGkmVw$^9u~khth?3B|I=U^F zuwjcDd4JJlPDaxwZ7z(I!$?<|=YwO5gV6P^XacE!rKTWQFO7nhT8hQ2Y}M4+E*XpP zD@|TGMFowpl}6{Xy6Qvpb_VAmtzBxOy<# z8O%%GnfoLfq!iKBtUt}jU!-gZDbex?+KtKmWPv>`MIyVfc3y)S;5Mt(URBuMsWl{| zRxtKDJ;dcWxk<-PWvrP+rRjRulwATY7U$%|be%5ol8@c`8 zoi%@V1@;X5Y*VMp`}yqE!7mzXHDl6lPA)@D<5P37IXX<)cc!P)gxst1*>O%yaB+Sa zy|qc*O7c}wcca(GpWC{Wn*>^t;%`&f+)b%P*wjs#*JDc4HI=XwsPAz5k&)_@88gt; zxt#MQmN2{AZoC{T7JJu`4;GfQ3S?GhH2X|yy+p;xWEMuks30GTs={Id3dpOkSH_|S znOPk-nrvwGULbQQ+k^4CvP~s+V%t5dewH=#t;F4mSw&i2&n#@qp2!!ZE7@Q=nT+k| zZfP~UqM;hj;BdQ|CdonZ{w8zBHfz-g*GnvZC4Q^K3y_boNKD9aYjgMnt+rf+QiI;h9JRGEoNehQB(pwf_Q%S5Xc`pn$Lr?~hCPs`DmV%mb@HNwoZosvWet zB@=s!E`l8tT!htpp&HLzZ>S`ZI+-0U(&2?%WMz6A2~SO3bjN(I?lf^F^=p|eT#v8uw@T(8u34CXpBjqSqn*E&*u=J^JVrgmpjMbAsh%8-?37YJM>r54myQvJle z8fB1!!{&qL~2)WS(%81 zOFDbvmZ)id3w2>z_sQ7{=8rBkST8o0&xUcWQl-8UDNSi_cAzKAFp=-YsQ`@77FCT^ z{JgR~mMwK7k@IFb?MzKjHznoF=?KH7p|>3kCkBHeVW*3Q85|oFfGEgRPS-6BRCg;_i*=*XsWa; z>ru$su30`w=7~9)G{3MeJP{Q1=zU&TgLKl8K3Y$#Rm0XNT!Vt4xS?cBNgCkn?B{`EKlzNi+!9I}lvuwLX&#Y>oXb(Uj2ACLNtEp;Y{I z7)_9FcpmC_E^V~Av!hi<%~iB5nm<%s#x0r^=RV0vB zsq}W!M3iP*s~X9yY6;?bO}tB+bho>3)-`kgY{@4-a3{?}=QBIebZi9$L}gtp1GjOI zurx^LgK1@Yq+QHry;eQ(exZPxJh22dSR%&FoHGy5!(5EEG zgAy$?=tZ(p-mGo;n=lVV)Q4@LsyIY~$tOx`GLM{;ij1g-=tiv-mF>B^lveAP(rqef z++IZ_8mTacwds;MA)Hr7H>|;p)GWEZl)fd)ytTVq>Y(~>cekxF6I2@iSY@163c5PT z@UWh}SsAu21~bejTw;gXfLE||EtytkS8EJiV-hsJa8XUBPNbijPp-91P0SzC9B9UH zq^%?rZ%4kG0!I^^q`mvaPu#?-?)I*g3LTgp==Cb|CF8iA+mIpd}8OzQFQN}|S5 z-@2n)9zCuCG^K zq3-NBj-hIbM)WRImZDHMlQ5jC+@gZsm^)dm>~L8c*6LGnX->UG&2n@Osd(Ilcr5TQ zSBpl2c$>vyy!xC{B9Id`g^Zk5u9LPYld?yiJT0-I@QYi=#tl*4EfE=cZs=8$a6MJt z^0m_RO%5=Ph|xPe;XJf9GIy>W4mOxMXwpM=XrHB&Wh?WSq`#Dl`Qd2z^JBT>fRf2v zQhOw8yK1*>;Nz(3`o6i%)iN`6v9i#wr$d&6tVVNqT2-CWOeKPh{;K8*B$F9^qDf{`p(=YEyFtKy1X;sN<)eTL=zZ& zij6yNLAam`Cype4zMSt<^r7aBYWB3PJ*bIY(bIC$T*5@zt6E0Ra%D!eEQ}85&nwY> z%vL^gYp>ZvOq+pO6Cu>R+0fpX7LGG_i@YCdyOPf4Wig*tre{u%$m1?G+l3D`z0)Vl+$~Y8`d-H^D0)T>Bzbv8-nFb8nM8n8SZWlVktjRHdR^D z+&j;D2L~Biqd`jV*)@FUv~#k?=ZibPmGhmu0Z{!yk#7%1Ilf+ z)oE*!#$(MaQpdUz{lN;^H2I>t-3BRb&QBM;+91eS*)z{Mo=lyWQ?jHVxU;}_W%V|1 zUF%NtW|wH_G5NMme#>I$GhY)fMN^|*&7#Am61#S3OZ90X9UCmobg$L>E9%5VxO}v) zRF<9XRuaRVXO}TgO0@QrRua^p7P)?GT$w9ZtMdLvb!D47qBw$L5o9pBaoXHHs5*Wj z3<}oT{iyASD))-&lUCJV>~;95g>Ig>NyKQ`4fiIAXV+$zSh%}s$eaX~$;|N{`76|9 zT$h&4%0eM-WUdb}R^~r$V9{0fG%2{1&DknDiIUZ)sA;%<&8(Us!A5=^Sd9{-D^UX0 zNRV3WqM&Z|d1(o@{(NarNugzR<_(&U&B`>FxM?Rc-=Z7YVD%4o%jUFB`qh`B$eE?l zP7Dm&(q3{rOdjVW{u9k!(}*Jd)-(^jT(bx4X1#_h$s}J}%9(yX*D4jwKDFs|I@S+Z zm_~Ked3>Z!rkaL*AMf_PGm$oZN3Ii_(ZO6HHyLWf8Bwm|y454}R;3tAX_I=}X+g6{ zU?!p&ftHzK`Sk2?(-kE@G?&eZ4-@{)#lA&;^sRWBy-f8nme9>}u^^BJ-MUmWElk#L z5!o&zGvsIdxit@;w{2#Dl#2 z&+fK;?9};P!o;AL|Gv^u|FtPbE(yqHU8xlmeYm-?(W-$*VsFFVRI^hu(M&{5bur7o zyQ3@7+1e%JtH+;l68Qa84(;?!btn zF07mby_sY(r3sa4@Mh4^zihQlt%D#Dotz-ysn$cI$@Xp`TImJl$T3vYWi2ijDbY^q zYs~?|AC)x_C|5Lo$`y^Daz*2(T+#R`S2TXg6^);AMdPQuNcs26XEx8AKYQ`)c{A;& zt2DiM@yvb9V3bC_@61mq<6!@+{oIuzRkQ5(t+XckXy4FGr3<@EshLep2P{6|fKSex zHPTlYJ6MYg%ULvQWS+|9AuWyi-rEP8X3pv<&77s5w>fxlbZqhBnX?8)^Rs*aR(~^* zWtLPXB_ka?N1JT;H=B2syo%2D)wX{1+}g6{FO_FGlXw=65FKQ1L-m)|B6ohw#Gsa& z)k+N-AD#bFp>{2GEPn%w634VCu@pPkczsk!eO&WMv|6K9*)xwGZsb^>P1Ds>#8xj- zl-Jg8>Vb2wh8Z;+WtCOzRT@W9UM$nun%g_%BVuZ{EtOTj)Rr@N&EB;PXLT04`$d9wrN&Yd%NmTc{4*O6W)DIFR8e3Jk5 zw5aHQYAvuI4v;7@cav5*Y?c&>$-6dpj>3kvoWB!rPL7yzf@S9PK*=>uNV^`I8^JcuYl8LLvBU$sq$^@#) zl~Dy=HCx%uqEN<$3we5pD-BE6_RC+pB|_Te&oYJDsf+TH`+=rjOHwtetGy~99W4pb zAPMUZo7X5O>-Nt7uX{IKgRiy%8!p3FyZ3q)FKkH+ikjqlAM;9Ssc?~qYQAD zXf9W}4{2zAn$2+wwR(eWOF7PL^1UCDT#(JJv1Rd+(SGMvtj`m2)51+(t}IDoN_nK6 zdjYI1Uh?V>FLL#Vm$mxC3t9c)rK|p^tRTI(ex2Ah4TgU4q4(GxSJ=!&{9MJQOzL*D zDpp3ZnA~V{`&@tV1@jfeoTSq@b8+&~Gj1lD#;?frE4Pd_a#I7k6pdopeis^4I+6ZU ze{D$Fb%I6KikSy$%09-dc$l+)8Ag3doS8v>Zj1|=X)z@&vQaK-H4iN(@AX1vamSdY1pH4VD3GT}tgVGr zwh2%Q6=({!(`9XF-ykmS4TGxQ9zCDLlEBB9>yj>Pue>OAKiv?zWK8F1ceY<`W`qBM zmm0rodZJTwGygd+{+7_ zis>EYt!TA1x9D-3MiC{Ic_(nqugy5$P^+z5X-!lSWgq#e*+O=`^MTdOrB}mz&*}7T zU&3X}xrG+%) zV9~HLrhYK4HXmt}^gN$P-q1X1R@jyk7Q;(UQFCh7j~g{d&hziSCv%LHtf(bW^2<9% zqh8f*V=gYINc(gv4It{M{-OFHuMLTnB_7ex%@@``;vPoE9H`Y~5IGRMw~!2s`f^F` z9G5dDJ53_Z`B#{G)UaesChe1IFfnm`RelC18pTzS&|*oA4@JGpX#gAANbK0qXT**T zhSca(^DVfaEmmg96>Qp_Wof(UN3>Fy#A`vnPoo-HU$Hjho|5uj%+=-Ar*PBpovc?l zDsqfEkE>*be8I!!9Fh&~X2|v^fywzp)aMj=8BtVF$;j$&wnl~@Bb_5UVOnW*%~|={ zHTTtZTC)R9Q8fof#WQ6qVpo47#9EYdfhbqa6v-B?)SwyliYVJz-S3`6oz85zh5&m} zDPCozvU@7m%a!HrT&+}Dbw-l)=2jc{_;m({l`pI2e zUs6#fZwAbCW`K8x7wqn$M&9L1a;;W%4fo)kdWUBx>>bmOYtifI^wD##k>vJ0n~mef z>8jMU6<9Z1e#C7}n8kq{==DEQS7yZ@ z8*JY5+hLp5q^zV>mXl4IX-$^w;6rvq+bWWwqgydJXC9@cy>yJq6jpwj7etlc&hu;PIjOh7kB7bY zW3F@8^5Zf!K0Py~m1V(_J^B$1GAK=BDg|1*Ndp-}fQ3sGP>x%wcWpqdA_9CYOr8ME zKG*8ma%wv(+5MQExj-j>LkpxYuTnd*#rsoEwNXHTr7^r3r}=PX|GV5Quh7;kX5dmU zyt*pqy5`tuAodlKfmTdq}D zT<(jdBREmoJXUnS0;j#w52|Z1xToY(^K31sAk&@qIRcs`QOUJsc_S%C73Z?qNP1Dd zBl;19oPLZ>dX{^0=FZVQIR(P4!s1sT@W1k<1Z(F*m&Y3Y+O~jb66mF#>R^)+# z%o$fdQ#+gI%nz&~nq$+KwXm=K0!uWZNUv3NNy zTVw589*d53%i+04s}WB2KKO}htwuT$F%00vhU?UbZbQ@J3tM=T7fEV0gYmd zJ(D_VuEcTK&=S99ZOclth_k7>wXQ$!S#qPTy>TbDTyxRXKZQIL1Jo~v+o&T6;?&BV zHQ3(hr-~}~DXUrfxigiuriT4ejv_G5YBVRwJpD9?B~97t!9iY`A<8$`S_GEFgoF*f zmaVWikJ|k}wX7Ulf=+YO>V6f5yip4YN>kN?(liJ2o<_5ZeRSPL&1Dwn^&&6~D$^tb z*}n?JsJH0tH0yme{@8-4a)GT}?jAM4Yu$G8n2sPBn@^?iwvhRFWN{?py5lK?MBfQcSah3-r^)(rmCkf&$BN z*dsAh*BL6ct4h`Uo?tb&rJ0ru(Jem(q_WbVVzBO6Mw7xxKQrr9voVx>uC}TrNF{tE zpImmahFWi!xk0TigV!Rc`V}g<80$FO|<1;rpYued5Cj0PD9(=&AW*6J0=J=iTcWnBm zr`UORuGv0)$_DlQKkI1sAAR=FAGPP(#GP-`Q|-P_*!*GDBfdrL@rUU6+UK>Yj*m~@ zS=!|J+>MYYzQ#OB?2NK^x2hNNR7OgHd&-ciOc}ca`uy-_5|Dw+ks&Di3txnzO zv}vc?Jzo2;f7tdMqR+MZqxP7koBM;T0=35_>W|CR92OiDolLw<|0aD#Ez=iGjcq=C zkNCqst-SX57Twczk=l2^yS}eBdES)n=^NE<_iaMk51YPGZM)mmA8+rlYx<`8Zj(0j zX0?JtFvZ^8#?3y=+BGlOWb^lRZ8mkrM%zr;cFOkCc9^o`l%1yRy3y`ag4v~YBjw(V zST1@FMSr=N!fdB{&DK~S%vQK}wr!kkGHQ}U&FTR*6in{+u0O^GipEt6>W^?|sr}u; z`rSIgd+(Hxl<}Zc06zxRf3toDe*HfEtat7A+&$YZ`K^=w&UE#`RD*;y%MjL|U$vHn zY$krKAGmr7?X+Kat558&KgHy(AGxjn_9VZWTYrG}?=-%_|29fizi;oXz1My$ezJ8M>yNXhSmQ)$*jY2>uwl<+ z9w>K6zxk_t8r5w7cdyMEUF-Xi-=c6;ZBd4sR=K68`6D*mGMrP!5@%Fb4Q9&??0zS- z=BiG)31(|>o$cp+X>LwQ65;>d=Yu*-;xjNgZlC!cmH(SOx6f|+XU9#mfM(r6Wk}d zk1myJ&v&BEXWx(OpFM-Qu%=d<%h=etCI*Pic9m22gD zbiNB3&i7fJZ!2xH`faX%(fMrrsXgD8D%f+0K6adazNLS)^}9;vv+LUVY)p;L_Y3`9 zd%k`ZY%GdCQT-m#hT8MpQFFhh-$duL=T&>Y<5e)dCi+C@v-ebczPok4qqWWIXZIbQ z&+f1GeCOx{(LL(0AUdDvF16>Id4Bc%&Zs%x9u4RF?0cNAqv5y^5?gp@q8Cl``gT#^CcV3 zXF?--wmPhGPvZ^8ZKUH&KaD=x?LMW3>z=9WUaCED{rj-~MfY)O!}*TZ&0p)z;QtrZ z!P;f*bD4SJ6sObM`Sz?i-?tjhx2c3mqULG@S2)cLc#2^`+<&HN}aBL)cD_Y5=exe)e8Hb(^V$H&CpzD?4d=UdkEy`}I>yd- zp#DYmyMy!1;rsjiBM3gRj)Gw4vw!zC9Cu1_N?bO^@Mo0PUTIr#N z`W5z^8hlnKvHIEg5Y_J)9jE^a_8t2?KQ<+p=l^v7x9i$xYyH!4mCyETrv!hl*$^FP ztf@|L^{J|#WNNdvFV#Q0uJvc@Lp5IyF4RDFq3z@ooi8d!tlhp*@Y;W(?Z#=9x9zu1 ztE-9auf3v`Hwylz_5>>1*lO2MchI*t3an4xqJREVQ$cN*rctQ=`;m6+kDew;Q@`IN zPxUiRnp*vS3B{VvG-+P-`?qxUNmq`kX_(qJEtuYLymMPsj-I9`Uw=M(6V=bOU`E4! z(}b#@Y4S|ee}9|mPW?44*tTK+whjBYYuIm3yZV_XjkEszJGlFuSvkb--=n5n`BQ&P zlZI0N{TDpA8cg*wE%;!=@urbfKhuI;8usr}-KoE(Nut+ZZ&!D{?JAAb?>8ON ze`-en`~J*^@6U`5beyIUt^WMGH|+m#!~PF9?BBCt|DLXXS67a*5x@GGrV+dTdNzVr zKhuJJ8}{3XT>VVbh+6;sk5+f;uW7n^{eJ6R)z7qG|AzfG0#-lM0vo}qpJ{cH%Fb^i zP4zR)jTE(Ill0ZkG$*NR%LlpVQ|%QdDXX7pb(*zZ@8IfA{WUE(G?-Jf#m>{(P+rwg z9#Gkuhe?(hk|!tDl{a;|p6%bk?cY4OL5x0j{(JS$_S<=9NM8Jsvgs}}BoAH^qmLcG zu@1K5&BmG`d9b||_}G5A|0*9V&u%C$ZYXy*lyePbiT}#S&iDC-@^>1_&!}vh{PUO* z{Iy~KCK_C-`?m=+thw?Y`pyi=pF=2{O*KQ(d=+JTlQZ-b*HAXwXNKg(r&W$VR==+_ zl+8YiKDPg%hVn}d<<}a@rhi5s`@ZQMR(~5QW=Q_*TQelt{$}>u*Jeom97)-1oEefg zYa5O?J;~1J?{8*cdQSAQ^L?qId;`b(=ev9G0A;g1X2_!WZNu^ZV!zoEGh`ubp)cC? z60W>=us7w~TzTK1)lSUEuD^=?yX)^6k`JpX`}R32_!MQ6j5E~#6-;)knrM1S^n1&D zD84(nb9oPCWl!Q&j?%#5RX1`&Hs565@+sK1$J~C^uU5Bj;CHraZ8&+JQ`GvPZBv8i z`M<^O?C^NqYOql%fkN!|r(15W_HQjiq3>A08Yi+}v#olO4Q9SocWv;CR}H6PWgy$i z$^91Z`L6sTt9EP4f1My>r>OU%`z;n9#*yxwy0-bhIM(gCS6$^bE_M4})x%xuNVl&{ z>O!}#RK4D{Uzuc&oAFVgF+$ip9#!xNweG{FV%U0UbxXi}^t!yz`D|g%RI?nCa z#SgXZD}q3qg3VXT_BToqI2sNa4-bNqjYkAdm)QIhL2!+gj|_tQ*#4C9lR@yN@hJUI z0^W|d&#p)7e=6H`=jhMPb+d;W2f1Hec$E)>7^1T7*-nYJQ z@7vnNOxr#|`_Rif$jXHvIL!8s&|W?j1XkZ&<@?yd_OJJT0ONL)HxZ}C{PUQqo8Q{X zqFIqfv)-n*_!!evDb{4_*$x z4sV3tf!2@gdlvIB{u;gjUxgpjbG7}ZGaHYFtKkHc%g*h;3f={+J=*tPhyR9Ks9o9i z9iZvNR&IhHhn?^UI0VvXeeZtwIQ%_)6}}6%+{hol4_pXaU=kh;N8z#XY){#j0(d3-2D}~K2Oopa!auA#PWq2Yy2VM%V zhBv|Q!Uy5w@OSVP_%_^Vy06bxaA&wLoDY}6m9P)y;iupk@IrVcybaz1ABMk%FT#Jo zjXvP(^+C8doCiM+m%^2>AFhGN!%xF2;WyxY@Gx00gl-Xq)@?hf~XAzTf|;VJMl@N)Py zcqhCc{ucfT{vA$}LT~l>0Q?}_8_t6thfCo~xDH+gZ-95gAH&DtbMP;)TLy+*{|Gn; z%kU(49=sf03vY!F!C%1_;TzBl61&d(;T~`f?1BTZ1W$zL!f(Jk;A8N&@D=zExXDib zx_iL6@DR8Zu7U%w2#<$n!;9gK@J@I?{5kwBd>L-6aGBlzR&Zyy4{U`A_z5@&OYj8v zX?Q983j8L#3;r1X0{#}h0{;%1cJ}rAIP8Rn!vR=^C&F{#=i%4jE$|-rFnk*R5&jKM zRk+ag1GqE%2wVtT;4*j=Tn#7SY4Ch_CA=Pf2i^~V0Y4z;y4B-@a9_9(Hp2uw29Cp1 z;RWzY_*M7~cr&~meh=OUAAwK9=indUpW&PE10VAB-Wl!=_kpwFe0U%{6t=-mn1qMJ zqv0SNg=6qocnUllehyv=uY}jY8{jSQE_e@o5Izc@gwMhk;4APA_)j=xrhhJ*!Vkdh z;4W|v_)*vd7sEs064(uw!y{oIJO-|T6YvChIy@I%2rq|UhF^y_!Q0{Y;g8@$@E7pc z@HzNL_*eKA{5RZaH~*ZrfHUBZa3Y{zCKG}8ur3b_$hc1{4)F|{4RVD{u2H#d=>s1 zZoa3#?mln9sUPyxwo(1j&LtH4;~7;;1O^Tmf=b8Ja{?07TyZ) zfser7z?a}#aN0h;UR%Lk;78yAumvuIN5R!_0-grXhgZTI;9c-R_#}J*z5%D~>+7{0 z{4ksY4~9$ODwu^ucp^LpUIwp$cf+5-U&BAZH{tY;`1*Vh?gNuBgv0Q3cmcc$-T?1} zKZcLP=ip!9zu=}H_1E7P?h6;fW|)9S!PRgAo(9i{SHkPzci{c-7w~uRUAX0bzCJs` zz2H1}DC~kqz(H7sC&BaJi)s3@pIo;W_a0 z@LG5qybpe0HthoL1Lwm-VJBP#vv3VO4xR-sf?t9+!aL#p@aOPZ_%eJ8PTk+vZzs4H zY=Vct!{7>-funFeJRP17uYlLV+u%L$-*EFez8>4dJ>Xn;2wVzR!6G~Xo&zs~x5NA3 zWAL}|75G1M{q+xktuP6-(2=tXhT%GRI=ld01#f_N!XLxO;dAgW@LzD#CV!o6;qGvM zco6J>D_|eg>gKMV$HBAVCGcu^GyFdMDSQgP0AGjyfm_b==id?T1?Ry-q2|oGdK>`< z;TSvxehxkgpMfvKzr&5@`}56!AAomgaHikHapw3iiP~{1iL`UI4Fz-+*_(d*Q?ISMUY+8vHlhY@x5uws1E%3oeGO za2fn0%)v2u57OZNSK3b;VJO5 z@Qd&|csslgJ_etKe}ZqrjTia)&43?*`@zMq4QlaO-_GC&To2EH4}Z)b_bd1!d>y_E zH$TW9w;kLa?hg-!9k2&3ho68MI0Dzf6X0p^)9`cf68J@UHM|Ml2EPmMfe*sR;qTy! z@D=zvd>g(CH$K?k_ttP1xG!7)W3USz4hP^GcpN+%UJSnszX|Vw55uS7AK>foUAXlj zzMi|lkHCd62D{+Va2T$Gr@_y{FTk(CTj1UBA@~%09=;0Sft!BZ*KZp*6Yd9d@Qd(T zcq{xN{2BZed;z`&{|z@g)L(B~xEq`Wm%&fM92|ou!E@o~;n(0T@Q3hW_;0vX%wKofJed{TnkTupM_t9 z*TLK2eef~(Ec_FE8*bd}>o)^_2<`_L!#1cNG52x}j==Ts40s{@61)-K1s{MQn|b+?AQzpMfvIzriVOzMk)gJHkETTzD|-fXiV9=HapMEO;^e3cLw^5B>x` z37?0r!4E9)_4^>)8_t6thfCo~*bnpYQ}7IU0lX4^1Ktkrg^$3e;oETIc3-a<@I!Dv zxEQv<6g(P^!1eG9cp>}}yb<07AAnE5-^0Jcci?6nzJ3S5IP8W;zyVl<$HTMX#qi7U zMtB#zA3hGBgMWelf}0-Z>$5G~9qtbgf*o)L?1Ke(96TFd053tkMr0&jxfhY!JD z!#~2e;6}^*^=81Ca5g*$9tKyz0a%77!_UGi;PvoM_yGJRd>+0IgQTy|bhtD82<(7I zz(H7sC&BaJi<-VTV!#&_!cnDkySHUbS!V};* z@G^J}{5HHB{tW&a{sF!TXRPq``Via?E{1LJ2si+TVF?}&&xRMnYvC>MZuk&<3O)~C zh3~*kSNi&G3unUp;3C)p6Yxkl1k3P5cn-W2UJY-8--Qpr$KmhbEAVZ&(JEiht>DgZ zA2=T#3OnH{*bfWvSa>G95MBkZhj+mH;G^(2@Q?6K7#!~F`9E-1_z}1e#$h)+0uI0u zJRY76FNR-+H^MvN{qX1TxA0~77Myy7ujh2Q6Wj|n!9(C-a0Sf3JX{Y?hv&mv;ob0O z@K^8!_!|5--0TyyOSl`H1sB6sxD0+0=HM7S37!itgI|R=!|%Zd;S=yV_-FVJxbcy` zo?F9R;J$DHjKMB=ILyK|@HluDya;{?-T=P??}xvDzk`2<|Ag=Rq_5{Ta5p#`ehjw5 z|5 zTi_4j!|-YNWa#Vhd-xalPq@j^e*X-(EBpvt2;;CD9svhn5grfEhL^xE!yDn9@W=4y z@LBjWd<#zP_4S+%cY=GtCU^)u46c9~I11Op)8Pg13V0p74c-GEhQEd{!q?%uaPy3> z?{;u^I2#@a+h7VF1&@Ji;mPnkcsaZV-VX1DkHDwlAK)ACKX8jaU(X%jhvEM4V{i#f z!4R&7P9e%r$j!#VI^co`{5dRJp44g6n+(c z3;qB;1b+ozgm1tg>+AJ?xD(tP&WADB4UdFFa15RdKLfu2zYcGM&%;;Yzu^`GJSVsZ zoC^;!~5W4@LBjL_%_^l$k%TM{1Ds^E{1I|1&@X!a6LQ&eihyfe*hnXzk)Bq zH(-$S^?5(s3GNN&!x-#_pMXPf44w=>1HS;j4sV0^!bjmV@MZWm+~gQvzinU&hHwo$ z9-az64KIOL!<*sv;ZNbO;0y2#7_8>`z@6aUa6XK|Zuki}1jpdX@H6lW@ayn4crSbu zJ_BEde}@|l`}%DScZDB?i(o5E!Vqe;e%BAz!PDUd@G5u%yc7NyJ`SIQe}Vskn~wPN zZwq&a`@@4^2V4RBpnhP+)$cfXHoOF04R40uhd+f+!584`@IP?NQGfm&;a+eaJQQ}p zBj6w`!;|27@N#%9ycOO9AA!GtFTuCqw7jp^R&W>i5qJP>fy>}ga5bEOr@`~#mGFA_ z9e6+d1^gZS3w#IKTy@Kj-vRCg=fgNmz@y+WTo2EL7sIRJx8U9IVfY*PGJG3uvc}hE z8@M~10}p|n@CY~r*TPfb`S2=uBm6G>3498^2;YQLi@ZO$E8Gtr2;1QbsNd1><03o} zo(I1GuY-5M`{Cp8_wZHtF5I%@&%YDg2QGvyFbR)_`XO#tuVdla@KSgUyanC^ABE4t zSKz#|Ki|jUGI$j1hsVGITnmqdC&M%0dGJE`d3Y7P23`-p4SxV1f+oH;`M9s|c5rt%8y*PTU=kh$ zkAZ99$?!b*d3X){7W_W^3498^2;YQLCwTvGSGXTM5Vpe=upjDYn_WLU5uOLX0I!30 z!299j@b~al_%7UXoj>nRa38o3w!kDj8jiwa;o0y~*se{Sxh4D`xD(tB?gRIS3*o`A1ulh2csM*74#H7529JfOz_a1! z;HB_Ncn!P(-U9D}_rM3?qwq=iEPMgJ0^flDgj0_5&u3Hk0k|F91?~Yq3Y*}8@G!U> z9t~H+GvS5sN_ZW-72XY>gwGi_4uV%H|I--P??X}E?08?EZZ!Rn@-CG3h4a|Hh;p3r z63WXcub_N1U`T#{vhSOD1VglLdqXA>bgh4Jo}G@XTl5NRq%Rv2fPnH2A_p5!?)nnQ+@rW!=2z> zun9IBKcIEtjPW1{;SgK{*TYlbIq)K*zJHmqB?!LG_HV(v;C=8xV@nYHobuD~dH84e zmQm;Zr?DjnHaSgH{kDa>!Vep@e?Q6#jr!g)xCWkV)cZQuI792HQU01y=e?ft?UcVu z`NxzWGU|K3Wc&ZZzruIm`%l+#y3USpPdFDI2wRQY1VNf|XjDD=DX)RYvi&rpjz7z& z`@M|qS5W>M2v+=K9!Y=4pRpWuJs4rln|7sA6}9~_6DhF^wv!N=k2aQc}#Uz_gV zxSiG?q&&~4`&&f0mHjIzXN)`OcM&KbYt->4QT`0P0)ExFlh%u;d=LDYQQ!MHx??jxs)%4SHiEe z{~q{Dw*MCX5x&m;Ezb7m`;bxf*$2*rA7g(S4zYa=Tn|rW{}K+n2&LJc|9} z@Y8I+5PlJUjs17S$Jzc2d=b9N{>{$w*Wbmc=du^vA1-Ep5)QCE4=3Qs?7tj-lkIoF zAHtuq|9SXFqvX|_?Eg31{!^4pZBeb(1&Q={s=J=~q`dsA+r zd;sM*vZFu(r+nWWz_ThD&?Cf z-%9yz%0Hs~DCH+8|BmttlwUXM{F|LGnmje`t@lcK7CZk&X@K$)IQOEt5@?(_$38!D+ueUv%3HODwjr#t_D7RA1!&BIP4!j6n z0l#9@_iv(nH|57EKLcNce}!)v^}Q(<`uc5QRCzvZXZtdE1nh%DMjby!`2@<>!tb*E zNAO|zB>at0-+zhn8O4!}GWH*7+&>6bQ(kM-`H!W1igB*i?WO!h_J5i34U}&){y%iR33wDm+y2|# z(~}x96EdWFW)hM~CLxdzwg>?N1_=8ui-3rT?3-+|35tS<3JQvfii)D3xPTjqf`X#p zDDD4KF;}{!*!A0b9XIW%Tv|W+ce^Br~ZsQNFFD@7b4yt z)b=AuT|%}LV*eePA&^%KXvhwzT?n6C` zT+HnclPk#8&-$eZZ^(oS~Jh}f686k7Y8bYKmrEX3=jJ%%P=a37?`^blcNdFY| zi`4tbAG!T3d7e~Huv|i<&!VnD-Hq%iMEeeA_!x3Bc_TSThLGCkK*4gornmda4ll&Jn`T z?hrP?yiNV25c#d5euesVA>wT(zb1br-Bk!jenDY5zHdogQ;7UZs2fu^r*2Q(g}N{G z0O}FcW2vW6-#~pE^_|oYP(MQbH1+e;>!{zPexG_f_2<-IQXi-OUWj^~C&SM`cfh(x z*c`_L>Pv*EZxia))E%gMQTL-BLOoK5eD37-dxaI2^#t{5A@Y5h`Yr0sLd5%-+s_JH zT9*4Pi1MWikf7XHb74VMg( z>133wPUe#}$)@C`B)Y=nhpsW~PWB>)k)y~7R6$>HQ^auO-uMUi;&4L9L@@*WbOA~xF} zAs;87CZ8kC_bZV89qJFskI6&iH{=hbeEUuId!BThq%J1wl8wlwq=8?6?60$Yf zp6o{UB(ET^BFB^0kvEdF$pz#has|1He2rXBzC&&y_mlE%S?PykjOk%akQnHNfKz1Q}k$uTg$v4Qi$n8QLOm>o=ll#fT-`JM{umqVQ(8Qm%z>kD$p1C!E#wE}PV!Uo2zi|RgZ!IJtD0<=YGi^e zB%6@U$!=s%(tM`~<++M_EIEO^g}jY?hL9Qa#ksHVzil@YXnB9v&cGR1F{L(oa{_?C$Axgk<-YT)n@RIMB$V$n>MzLe z$)8DlmONP>GDxPAxnu#^h-^xBCcBe;$o}Lg@>=pH@)q)b(tJ+|<$aub1!=ykgzf97 zw~;%@uSxU0CB!>P{S#@vyM*oXflKK(O~%ODWIeKsEGIjXUCDvuU~)1!oxF*>g6-mU)+B3_*}kA-v(Qa?hjAXkyElW&smlJAqBll#ddR>h2Y^E9q}P>5-Xa30a?PNwy*T zkp0QA}wI@>lYA zG8N~t^4v~UGD2pNb%dATxmU6Y*_>=mwkNxhJ;^J`tH`0G`Hmd&9Z!87IfI-<-b&s< z-c8;|K1DuDzCpf4enjpfkC4a7GvqlkH9J|~s$?!%K$el^WJj_qc{MqNoJrn9E+X$G z&3Eb04$n}(PQFR*Aa|2rlSj#4$g`xvT1omVNXE&0vXm?%JCI$-f#hIvGC7^Rja)!J zN-if~B3~unCqE<)kcY^h$zMq~o-BWW%p`Nj24o|$J=vM;PYxs}kdw)|W|BE%9kK!0nru(@C9fo}B`1=%khhUb$fe}-5`&2KhE=zL$r7`H=c!au2zWJVbs&{!0E%T8U&kxMWo_gUlflWC>ZHtR&l! zeaQagSaJe6hnz>=MczX`NIpV7Nj^=kAzvonA-9kplb?_W$V22w@+a~S@^3ONKiMAD z$b7OUSx#1vmyx~6E6JR(+Taj(azT}nUwd6$dW^yiR zzUzl_Ev0^re1Y6dZYB4UUy?`2ytuek~w5uvXpE?b|Cwc1IcU2iR3N9 zMtF{mTu3e^A0i(mSCFg7m&w=2x5#(MPsq>7gXCfI6!{zZ7kQqnigP?EUj~^)#>x6* zL$U+eg&aT*A}5fO$(f}2ULp1~k9t0N4|zZNH2EC4k=#svMVjvzBEQqrXULRV$@-*{ z*<>DBN|uo=$u?vkvOhVR97oP3ZzUffA10qA*N|_M?~$L9d&v{zkK}pMDN5F(8W|yr z$U0;NX}*7m_PCt-3UUlNo}5L_A@3s}Bv+BolN-s+LzA^g z^L<2=w}QHo>_J{mjv&X7Gs&CCd&v9Ar^)BY_2fo!r?3g$pCtE_Uy;Yi6XYrKH}b!v zjdMlGCro-|Hkn7(7nWOAL$VoZzQ2g=?WjAEJ;=++0puWZ1UZJBLS9eaPToo0OFlp@ zCs&fslP{8+$*tr^{RmlvpI+;t>CmWK@$(CdXvI{wY97K*J z$C8uD>E!L?o#cJwgXH7n3UV#^I=P8_m)uS6ArF#=$rI#{un_0CqlGx9 znk2-UYK9QUt~o-?ne&AhON)iL-m_HL0M7*ru?~7xhCfPwL^40Ww5pk|>&qmmsk`FuGKTdX|ycmC@LRVJEU1*^}%;4i=(ahLfYoapVjk zc0P-oL(U@?3sLVSqDC7 zbJ5A>`CM?YY==J%Cr1m>{^Q6=Line7UKgAp8h$#9oFjz4&Ligw;kOIP#X|V+5^|{! ze!Pr)LI{6;ihNdx{#`@9EJXXiMy?ma&o`2rh2@sDmE0zT-|rxI3oGzEA-PY8ad42F z9)L!FY!sp&b_vn`M}=tjKZI!SVuVRMw-Ta#9~7cppAn)R*9*~(yM$=JUxjF|^i&Y- z)mDgh>LWz^3>VhMb2CD;$45f6!`DL8zY)qH^}b1n`aUH@J%1IVer^avz0C71s1J%{ zIh{B^p+1$=?Sv>xPwGBGY*>PL!HG$~Ld<#aqs; z3(n{^<588;A+1B7cZxdPGh<_$D*H-iIm-(#HQefy%(TV25fQQ1_vBow@zh?y8?v)=|6Ps}uS}N?hfz z{7pIRoV6y2WgBfJ0-JW-oIK9TXgH7ip>~%cmNlvudzEk&4u!{LmqPmNl&_jXm}mau zZOoQHCT`659Dj!q2*{9|s&%fC07pG5QNKoRPOI^<#q}S?xOFmn<4^0^W{b*gkAQ&x zmaDPt_qzCV)lvxvsOzpkp6v!urQKtDzPKyb<=ZQ)TLhaSkP}7|K z1sWJbM@3!s*p>f}VdPaUWyoc(B)MAUmms=C6-Ld<`nUKxDXztSix z=A9Y}^^{R=%&Uss`k!{Bc>^(Ttu)>eYGQ=t#JpZovNw$? zi+Sij%m1EH-D2JzG@XB&QNv^2EF4?>pF8Us;}9D2Y-zK-M$L(NXELBpItwquVJj9H zI&G5W|K1VLogeewycA(SI9K#Q|HZte7&-nbKB@b&F|WoDsGw2L#k}jWBJigh^?b~G zO45amS{?Jw$=)Nrsqlg|G4H#!P%+;PsKd)KZ&N?0EEDs!nD?->XLY02#k?bVP}xSk zj{2ed{kbOH`j}T+_K;`P#+cV60hKUnbIc1!PZ#(ef}d}Vd7ZFZe=C#AwwUGIfy1DG z+MnovR9A+BBhNIY{Lls!c4{Eg6#15ou7#^DlCRz@jJR3nOe@D+OYoiRD=7GBj^Q0y8SptmwUHwLr?(&L+vk z%SY71P94~mK7`?va>Qif>NeFNjvC?D=P>wEzHw3!EyapH1&YZ9VYFRR3m&=<}tKtIOSvC zP)wCsmq^g=r2P zKw(q9^)->S^3-9$OmB&lGrpzR zrhkXOrTk-Bz=}AQP6bBmh7LF)^>voz94q%Ug$y;E%s&7r$Q)G@0s7QPKoho+7 za$ZP4Op_N{Qe7GG=7`c1S(!>WR%jU&0vobJF2e1kghWNEaGIw zSNDZI#*dE8apJGSAF7NkM5H-R{1gUFm1{-JbK;%gW>v;DhnSC%C&iTHru0>;bcrNc z7(FMcBNue0<*b&SPaK65f%T|Wsw)YCO%Nj_7B|lsh>!?92@1XYo~tp9fYbJg6(^xYtUlor_|3SWmxUQ0Wfv1MDf(`SSh7`@hWz= zB;Kn#?0u_Xdv^Q<%vP!UMP%CX4YeV@`~xX+?D!)iAP%?)DYoMu!hcf_il}W{=@p0} zu}qEgk~LPCf7qYStMG)>uQISD)g6s^0ZEwZ%4FgTxSMbY@VV|l6c6e@n8ULNp$|I+ z#}0#M<&GI{1+SHcvQ!uJNN}9kwvxFjI9_b51ToJBCy4D+GU|g9w}X2HH* z?0mIlIP4j+-vYHrw$Bv1hPpz^d4r@aRB4#FgExv@tTtfS1!w(<{OhVzv_|kIX@XLf z)*ANB5~nP8$|Nf|Tg-CxmK1G{*cGZvC)l@$U8#a__uyPf+77K)j*PN%F-mfRuS?dZ z!QPO9u))@g%?8^bHXH0svDsj6B^&H*Db&UibZ$Tmkiu>fJEY`hQSfcaJ**x_s^B|f zdumNr*qbGvOeI&eg73<-orO}3LAbNL1eGp)y%L*Nh?)IL4&n!&mF6&o zdhVh^J%3T5RwoM;M6H5rE-KUu7d7yU$p)4;se>=c&O_MYztUj$^v9-`w_}ItlC~@M z#xaz=?lLLBwl^*m;6sVPR@p8#Tje9M9c2ozLu|In#}^e~XR-h*W7ylSEr=6RezA9p zUDa~_gM9@*k-cX(sf+dqei4Izsn%E!1ougSEwy1V?EPZ9>HrR+!7s%Qs0vIw!2{B% zAr&cveNgPMT7rCnUy1EmPCF4_zbE-WhXZ6`@W@=`Z`$?fMb-M|qG}zxs9MJ_s@As` zRqMNCwJvRl+)qe}ajba@`3FxHKxE4u=uq&~kqf&zebKIdxoB6vCU<29{cp)#8DBah zDcz(mofSKPZd(L8H%mo-7c+ZaJq+UDpLbw>HTC)HqMiJG(N6wJ?!hrIuk2dwOY*Qg^BmbanOJf)68!(p!9V3eMFV{f$Y}s>NeGislLDz^C zqZibHsAoh%kChA>n&K8(0cmhFOPSpVd(tx{Vq;^ooJ~wBH#Yt{E7;T?fJlL4-OFt` zD9cRo4%!8dCmDr;&24$HBsPA?3@do4E#udU4Z}r^V1*G*Yz*qs!q{$X;xq)bG$KXI zk}}xJj$?L4<-K5QTV63qwpJV4!XeetW{PTS#~@sNM%ucaT^}N#-;{1^Z?}gCY0L{& zu!AkHl!UFIBn^o(pp=qju$pX;KiE);?Wt}GM6g&k%O7lzX)V=_%jQ4EY*b=ersa(90S?bTcAkD1RgtR>46TIAraI#tY7~v(GrLPg0$!6(iL=H+V z132&HV5YrV_AAfb1+&ZuvUIy)5Y_3GkJpDNu;q?hK)3A$QN!Mex@9K&rjhaLoMiEu z+45dfH+@5AM60yrC8dE{9?=bUG>$PkHh#o-E7;v0h?bfa8$W4`6}-YU+d^#)*!|5; z*H~$1aQq2gX=k8p&d6M}^=;Ci<~%NRyD_`KSwnXiQy%sW%{OKv)GBn>&q$UnuQr9! zuFt~(Srud6O`GusHd{(OEp6s(n6A331?(H-93o&jb8z?#Eh<6$?6t$OK&qPalBAV! zTs3zB3Xwb`shTIYt7NoP&F|F%Y1L$uplZQ#DUwIW9Bqz2_lA`ko?mzGH^`-g^??0{-lmv&{!QyxLjs2 z;ptX(^Gi^`w7GKCLbd9G=DAg-RZERUGo;P?9y@Z?&fc)^dQVEA2E%jG7K$BGGL@#? zBc}~vwW%BI#bSH#HhC{8dwyReNH2I=vc46;=`|$SGA)o^D7I^5%P+_jr`IltBGS); z5vk-on3k&23U-}uVY}+BV%YV9SR@405iCE`>zBX|sUdLO^ah<_hgEqc>`TVO_S69Q zV|v4TVP~obWyg)y!Ol?={IDAzgPl+-G5e-B31mvsC!`1D3Sdb7p!ltTXcg41&_B+W z^2ElByabo{lEWOLA+G6hn9Cy${_E}bXrq8W2S@VHuw7IttdBNJ) z2hZ_zolX!wbMY%jr*wz#8xhwZp@01;j`Vf{1(9YkrIUs*r8B2r|N94Vwn-e>qpYGX ziX#%ia_ukG{ZS&xwNTS?rmoTfAx5euZ6X__G5_y8N+nn_lJ>nQSoV4$iyjx^NV{JY zM|OH4&Xfyrq(3f-b8%4~k~q>KU;jVjF%WUApq3EdM7u;(U)d z*`we@#p%}+A)5L-j?Nz}j){IgiT1A^KJ46z5dHq8=(!`#RT83y!-2y`9T_r?E=E6x zzj0(N`ShC@d*Ndyn$~AAB*MoX8PXB`C5CkPTazXW6MZ=7J0SUXg&T&`e93(K)q|)i zYY*i6XBlnMDui7B}6r!zRmM7WCYzsNVs-x!-?J}G-v z2P|pAnPz)(oTp(~V8(ft6&;F-CBn*A3)^rtCLA~ALiMjL#h-Ao?|_?#%Z|Rw_Gx54DSv%Pi7KpdxaIg)Y!J}EV);h z+BsHK-et)Mcl7O%G__m=b>@y`u@~;bMClk<;jShYE_cXIkKwk-nF1B~$LhooDtGQw|V4?tHISIb(C4AgxcF;ug~$t<y3ZLve@oCCX# z*lFq)tOBal6BopJ&YZ!hf8JS{${&CaWF*F8w`P8RA7wEWRF*TP9fAtPJF*v`uZuHk zpOuo{fIUqKuaP z5mDWWhRUc+W+m@sWV9CBRjo0LX0#DIpeoS-8EwVJSG?QVaEtMvl=G={}Gfoc2TFaMlvm@`$BpYFllWc_aUI@R% z5m$G$yyBg4yNQ*mjSJ0p#BoAeUUJP?VA7Onj9)9`PUm@~DcAG5L)_(r5v@XRlBQbd zNZ(iL3FxkjMa~-#gY|P)LEP<#8xPm>#ewfJjW|`;stvK&WIZF+x&0I?<6h@&lyg?H zZ^blyi_3a0I%F4gf%N^qj+OSYRC0;)yHs*GO0~w9vCg?1Ycq2qlkvK92t&!zccdZw z4K|?MZOB;923$H2VuLdqvBI$-IPc7O(}Z|>WC}vwG9pv|EPb=lk$vZQy~WoznNC~k zvm7jpEq(j{_@=B3O?mw|%E(GG)s=gb*^B$2uf0p<_Mq~xMD<$8st!Y~IqYsyvyj?e z3A?-8JHjRL8)UNb2FU9_s_sw(jJgJqFtcUB9xcZ*R~^0@_874P>hFBm=IU_BN|#upEg&8u?1z-BItNG?A}YA#Y24Aod}#U9|>18#yd?K&=(~h}a=@ zNa7q7JFJe2{f*e3`a$etVrMG(v5LrXv2(2Ghv~Aj8ulmHn;wH|MQRz_iVYt>#EO*I z*P~Fl4KsX(6{%xOqJX|V1<~pn5z?~sjnuQH!NPhHJSkG&j8r*^ky=If4n~?tL;GLZ zLq6t>NMmDLdKYXxzW5fMEdvwP%bBcib})2+yCQ|4G~%rJ;KW`e4%<+@Ph z789$PUWMr{GS`UadTKeutwvm`d!#|kGom6ke9BaO$jBZ97ikfjGI^L4x!s7iv8m{h zJB-~qHW~JOWB1T`QkexNd0)L~7{r}M^wR?|rXzP5afM!aImALE`fE8xMiv=yrIv$a zFKaojVF*i4lW! zWhKM|MhwwYvD%6}Xv9!`m4bN4h++B>Or4RXMhw@xFkB)J+u>Rkp7=B~OEG%LjE`zo zP8gF(PhWJ11e>$1=rCD-TjrE6I$Wj|SKW;*(Gg-Nhi-I?3|&thD8%+_2Nlaeu&;zY zZg(l3ms8_A!k!>5ctX{X?Gsla%QNOKLi9SZ&*jP-6rC*gKXK{4=oGOnJ3dqrPZib14eHY zQEtcE)q~F_=_l3Ac4jZHG_+G38qH|^aKhBQ7 zh1QDRDq<2cKyOBGlL>9A9pB+V+%9689T(q-&KEJ=j(<`Hu|UN2D0KzIorMrH?D*^G z=jdG$GRuy?Uk_s8T6pywJHD)GhL z(l5Aa_HY-7_e2yr@x5&zwo2>Nb>b&|5dRTT>cp48qoW^)D0AZDYeH-jQSQWlk%G#P z5nB~b{3;P2iKukqt4BiYkmm;4Iq^l9Xreo1O4#bev+uC+-b`*e9)X%!yB| z4{<=2KgXSTV>CtdD+%%Y;-0k5*CJAUaRv8_9ulE^@f$@P77_5po1pN~BOZSjwJF8 zK+qv3nhIBl9A=^^7^IOSMg*)h`SFOzQM04y#~3IBBggC}MaV!dB}Klq#ZN80y%OSt zEwf1=HtAYS)jyb6A-!D+cgmI{epv5C2_nCkYYv`Hpv@w`nS)KHxlSHAV?=c=6H(-> zDM3z5E;U8|Fe0IwVmw9uv@1}6LY;wbjTAd=Ad2-m453JEvncD2R?0)MQr#$Onl9Dt zjW}ke#MxGV99H&38aOqumt-w2;i~H^I6$P4<44!C7L6UL>r}lA#g8;KYpWT_$~JSP zva|GQR6la5BlVl354VA6VRD|Q+e@4DG9{X?D={-hdK}hv;L(61@Rs zjr28QX|hWFj98Ye>=mZ6Pw0o?FOmL^Jd?H?)m(^F(M@R1%*fS_G@h16RU?B~tu5jO z*Elkb2Xu9~Q)F;*$p{aG7c7emb7WG|aw{@2!d$ko^!FIGk&(_RRL|Az21AT8BB1Ar z=UnT^lVu^@4kv?=aYhvCTpS`I9i9m6Ct(UfPLKG+jtk`Yt&cM@%~ zDFD{bG8@S=XQr>xvChY=e$I|8az4W(pDf@#Ea1|XNO+&Am8-9n_167Hg!LUYAeI=B zqw8U2j67gOvHo4U@`XlRhOYtQ96rH$76s z^QPwh~zB%c!-7@Iz9iWNydCU&)6BW{{}N^Fpx)C1xbrva)qSpO>-tTke^&X#U` z)rd*DiFEyIM$FIy!w~C?n4|X&hj_y@!F-(uuZyfVCtVA5I*v7wPo4c}oW#hG9?#P1SeUo^j!?jM{B`^Dq@f zzBVnf$M%|wPaHPs_SxRulFJbj^O)^5!D(6Ks8J_uZ=Ztt#-#fZd(VS9ZXR63LtUxv z7trall9#fYuEuHca(LRG7wNyC(=o@GaQ?NjtHQ++u~EecP~Vl|D$rh)`2o8!5yj^jisc1IyP!d267H9t0A>;N9-K`MXj?iVF-usH%2 z%Uo|MIYo}$E4HmpM`7P5C-RPJmkRrSDWOlvIdyD_#KDE&OdRR^#J+h3{i05xcVoxI zqb;>tN_1QzIjVFNY;$Pxso9uaW8ay?N*3QSbCmKc1!stvgH(#z4o8ofW0cChZsHUx zW)4vS^GHR^9HFYH^CJ=GC&?#O$$B(q4pu?+#}L@3qzoZtOQBCooT@4Z$DPOQSVu#f|QsLjkuBPtk0Q-#C8R|h)B6e16tz^L;`(12L$$CHbhu9HS6C*8lPVA_X zpM;M6DRxYqzbbIrkDV7gk&88a>|Zf!$r3(hnI(K(tp_5h zZA3$Jq7d_$gJikBts_EGjA*9ihlyj#i01k~(u@HkF4a*?im_B9Ds;U*5FsO4XnCkN zmS#jtv$&5{HKLW4r(vTJlE{sXJw>d;D+tkVEc(uPMoo!wmBitXQfR>m~&HC zcgFl38_5&ZUGU!6C?j&r^cWj!4&23hMG8W$HKMMr-x*@ODNL!E5n~h0k-tn&mA0Q{ zj@9M5C?Db`Tjsq=U8@Gf%|>+6|5SyTZA4G~45s+l93%Sc@sj2iBL?d$#gT6{`x&j* zN(tr}F;2@bqsDGCVv?Se264L)Q}qxuMr^ey=nU-}0kOu2S$Z2*3$YhW<>u&vGH72k z1zo65h;zSgT57TW6GxKR8)nJ0M!$qsjIB4Tl9%;m)gd;T-e0Syiu-Ib;#DoD7O}T& znGasmF)8RfMy%5#>OyQb(O%bfYlwG^c*8t`8GFx&_4+ql9*%9XUq)YT)D5vZh;6ku zLu}Pmv5t+sZ;G=`%ax_rHd{_7cIcJTh##6N?9=&@<|A9C#e;fh0Ahy`Cv>`W$!BIi zXSBQt6x(COS-lmIlN8PcXWm5Xv7R% zMSQW75wo=X#80fV5p%Ts?o_O+dEj@RIeU-waOCuSzLmc)h6}F^al6Bme~2l6_0hv8 zTd|>zv`lrm=Nubm;#ldc&?FvWn>Ng|GJB$f7sduTb+N7bG)xtyEiC6-z(+nDt*(`Q~IX7-f{n3+S?BR91g704VW8C&W~%wd_so5FTg zt4^>-w1FK^eI%EW-C>8+^di`!`oj*Z3e-1qv^g+X&d-=DGsg@=fOB^VD*A@m>k;^A z))uqZ1)1>GtdAeSbf`u(!{(h&!L(G?<*;{&?W)aiiLBjX2h?Tg_N-6W!49dpS+MuW z_OSX4BP8o{u|3rU{g<^@;$*4?l6K#A*f~mJ%FEg>+Y_pL1oi>hUZ^JFz>#%Owil}> zG1jxb{uXv!^$Kd9by&8SDi^Jjbwunkm5Z^R^^Mr&su~XOS;xe#P`zYd$HlHx0eDx| zcVf3wU$umNQtVD@FDjSygV^2FA=EwVC$W2~nHYvyKa1T*{XH1=X(?NO^(%TX>lfKR zP<3em`<&ebD@gS`rpT;6W3Y#-S4YDBs{;0DwK@pYTL4;t*DHT#i%+tTYA+xI3uOMW;-T>dvs%n1% zu~7HG->k6x9k5tm?Lufu^!8+WAB7mujP(O zR$coyh>iMMsZTvS19jZ2<)@^wF0n6#*s9<5Lo~F9Lu}LENwamd<#CD~`VR4j?)H3y z?A9M-KwM_8h1jF}ikJ1YKZDqpyvZyc7m{;89D*N!9h8b+*zi1TbFW$Y^1{ZqB-UZs zVE)J{Bht#LDc%i|FzH|uIV5)kLNbyN^rHkxeuRbfL=dj5a6{%@)aN#hbpyx^ip z+-)0dO-Nqi3d!ItGNQ*OcY3v?6kkXN?Ys~al5dxyl9{tbzR7vY>Qaad1v*F)tz zfcdtnQ~kOYnEO=^O#0QQnDpudMt=3_ax!46(dn>fN}&U4Oak_7iIb|HLw40~ZCi;V z#i#d!ZO-t5PCTO<#2peTO#>)fT%rFf3}BCRTplNyFu(iwOZo5DR!}{M9FjC61%Q?50h2yMzKrP zc63+nCTZ|8^#zWKxo=DM73$;_u-|EeI2%<{^jz*{iL+U~1dqvmSBkkUw_~5KR_=S- z5&uNZj@@Bzk?o`HnjJ5*a<@wU^I>^sAHJY{ zT+2B#rGVSNmj-yWH`Xn_+>i6n#O4-D?oP?eQcd8yxx2)6)lFFT=k69epq{RTZLZUY z)UpAvKb3uk)s1~%e2Fivv668o5XK+5*D*gq;; zwjXYQv}fW^N*f)OhaJy2af}};_Zw45UwjnGn0w6B(ieBI-poC2s_Bc5M746i6@e@J zD{&;w{Z1+r_9YutGB(ZGDyb`>lQ-P)j#GDxklYhLpxsjfdF|vbky?K>o+54Unvu6j z><(hv>OHYLitVTm#O@@vPwf!9v)HcsMC>kN`_*2tyNaEn4v5`NY=vQjIVF(SQf^k& znm%Nll~*Yz!G));LY(ehvDK9>gj#??#C;P<@2)l{ZW5!72sU6Y_47_`}st3ii!nKc(dR6?wD8 zJ{GT&4SS9>EAG+#dNsr?B1&y@6DjXDId#DeJGqIJce{uR+uTITyF)~!ZEhmv%@@(m zHaC&-7Kp%oJ-LaLcc+MMcDyUxIPdPZmF6bj1H};ch(Gl7#Xsl_ai26!A7A`icvs&2 zBKrE`A4_{bAfg}c8?}abP{b9!_}fy0N92Il-xqIM4dPJ|1AXzX@Tvfdnr46-2B_CeX^!#&YMd9O>f`EI?cQK~(K9IR#i5q`@5X5#lycVa#pTIE4`$(eIO^Mr>r}B0T zN6ONaxO~hbZ}$xl6)ExcQq#{QYkW&AUHq;s0*s^3ainw?#)R=C$;L$Z*GiuXTmBpE z-~cTn$i%wy!q!U5X;uRh@C12i)~ScfnTZGYTR7GYg_A5zywRpDoKS8cBsNGIOFe?B zC*I7&obIaBda&OT+n+mi;wUSzQEUtvbX{VT*h*cG-cGzDRS2j|%wLJkVpmZQqKy;p zik+(NEr7kH5Ozq_zY_LV8CPNDpaT*+Bu=L4i1{e7Q|v6&ZxrlZVpmtc)P%iT>}<87 z5$sP2Vdtps7^{grVkgv#I2B8LE_R_hFZ)WqtEU!U4mW6Kv_BK`j!TgpuDfyJE zp_jn^Udm9RCg#C5S9>c}^lI4V3U6z5SuNP+3U3>gB4s<}B7R#{L)!eb*zMFoDVw>% z+g`PV<0O8SJUgkY;q8gvBu+PVAP)PCID1buqc!Zavb~S$g-IY`uH^Przrddp=1Oiq z^(+=wiSrWY3LP2=yNbCM)nCgm{U=h*RjT3oL7Y(~g60CzXdRborkRj&`c|oDx-Ex> zNqQ;#JW095LbsEx!<*h#GOD?k^>X88J&&l`3Z1 z;)XbTZ2(bbLKa);v(c`-v7N&qdy;rvv_fv#sywttw1u>QrQ{v^XiKqOwR-^UR$>QK zDS9MoX7I3T-yU{rX@N|&XDDp5ip;T`x{|o9>?V5vJh@Y}z1-SW)dyp9C-G8CwS-4S zJBuAq`6xrQOVWEcqVCb|VrQzW;a$@>H~wJphH){n2;PF1A_B>jy9uMZ4OCNayOADG;~<9YDeK z?hX*$&2_hs?pPC|hq*kLsb^+F^fZ~}==-E>y-c^Z)8;9W-X={a9feOtFE;|W{VE~) znv27OwRyZJYXy6i7nV=0xt=sZHzT#WAgyQS$YRZF7WW13NI#z4$pEOtQs zkp}x-Ib92>nyp~pCw7`T?7+TX?5e5=(_a1(vD4K#iSvNiVKoSK$$wDnYL*i$fq3XP z>^GwWwj6Zxue1NgEMjhj=1<|3({E(gQ+egIH%?sglh1tx^!R}g)6GbzqUHCp@^3U9 z9nve{)%iD@%))vXCfxklrqewACHygeju8ocFQ$?FTTGg|x`z~Pu4%tgU4cU7-)2I} z^n1k+w;P8l*Jsc*`FEIT6?!tpV*Y$1TI$Ue5O>+~tY4+hgQw&#G&grf>nj^W+-=K@ zG|B5EA@`Zwa$Ik&hFW4~nuO~WHG@h%ELGR_;$f)d(^BkV}22*NwW@^s@a=CgS|V zMs0Mx#h6<1j~KNXB@>tZ#*}QU>jkBCj~TVi^@gJ9@{b#}!}ac~0rjVG)!nYwa|G01 zX777k?@S}8sJRsXx$Ax5gUWYoWVTP9eUuTJ>dKYxsQi|7c|j|?AHvM5kOi&H>|^Oy z5K_>_2v@I0pBJ<>BA}(w3)&eG(%*z2+S~GQY8W#D5+w?5vY(dhcI6{zwt2A5GLOs@ z%rRwmwWknrixB}WKT1(B*NBjLI=J9g+dSlMWkj%uc-by^++Km!Ocw766A`~Rg0?Ss zlKI^OXDV31{E8%GCG(SKwhEpyBCM-nhA(*92v4s^mlUirB2(vM5-xbgh#Yfsv*1}H z67sNR!E?qg)bf~D!Skjt#pW5|g4L#jpVgO0W=T(fUdsbu1uvM8HM;#(5HFg3c~N^E zAzm`#CEXVNUhuLJFY6sGAYL)z6@3?~U9i@OwYs0w?NuXQ)jKg33SKkfHC=*EE=UfO zby{ZGg5)T9UC)GT6eI`98+y%9i1jATdcCt3#0DcaXs-#xn?}5;%-rSRCLy2U%~J8EI5=o7#Ex~ z2V+Y&#loTB&ty_94{I0vWy{mrcwApX{x)6_(krEX|25I7>fbSY64#&H_HB{6*ShCOYo|N)sno@k}cpu?dQ;=oU z0mn0gH`}O#j`vyzgvHI{HHRIq0}glv2?w5Fop8JiX~rUx=l6~`MSQou+24 zfyw2ZrEJLl#k#qZh9d9Cf zs-UqWk3=SX-U9K0CMI2_&ub*j-_)eTGlRFFfCc4_ob%zC!S@G4H8WxJeBSa>sOCo9 z=JR$V>w*fSZufb=V9G6M>4^Kx_j&WHLM88hF7$cwR#`z?6LXQz8wgJ;XlK;jIB^t@ zl~u9v zD@t|$l1TLtLH=JzDL)2=rysE;`yTY(4FAXSPN$mNALriYOxVgDJ#38S|5RozTgg$; z|Cy}ETvew5?9XL;T_sO6`}c}nPsw4_|ApA~)zA#sUy9v8$wO{_bB0{1PS%HgP_ENA zRPEtJe)Ax2nK?W4o3rJ{=B(I%Skg8zXT|;_VmCEs`~IV1m#gzw;rPuNax*m;(}3Tc zAvaf*n4$dUd8kX(2`RHV6RuFtW8(3fv)>l#9n7YFbN1U(?S#kq&lMuiO7-v6u>Y3) z+nM*_{QrvGUZ>T>cFW9d9dsLvJHKs2M?D!$=Jy+c6B=ojp!e3^@Ks`%xt2AlG>0WgpS{pH5%M~AgTO%gurdX=`+Z!=a zKOBbWV8kR{O|tG}#C5tk=5&8&BPQ!RC0Z9Frs#I)dVg0Vrt0Fh5Z%mEDAVw)9V*-x z#V`XIPbaNwi4OPIa2~=o{SU^Vzr+lBORvRz;ICtZt>wdO{<=mux-*>CU(X163|X>E zTaUA=nlsHWA*MB`1^WgYL(NKiH{ICpB2KDnwhSAIEjOCewX}g)P}H1dFO`^&qho8{ zWS5HlJC?pRZ0qqli!$r>MVwwJPEqw_{2cUmQMQS%zN`z|^Qs~TwGqFQ2m zYB-j)Ma7afQ?12{r>M5rS?X2UZ;9B|RXYsUqPk*dtDn$TMfJqaQFRBwt}k|6y@Eb1 zY9My5s(}$+R4R6!x;_EB;UU-w)nYj8Mq=lychI&)Wnveom91enmiRT)O7vt=6R``` zUGTc1refDrx8k&=NaZ^0X4W zj_QXQw5U?-x~d#qQPf)6p;SGG`M;>GY%fy}OPqFMH&$7)y}k5B6IEO64q`V|>v8le z>Lh8))yFv27IhZ8LfxGLyQ_3*r5cDuc~LjnEWVLyTKiS?hOn;`8~f_m7~-18WM5xpz#nQ?zZ;ILvM~kL&XKg1%IE<*F1D?1LtSbc zk9AZ{jGEfUV|}KVYa5Ssm6G^{5jTwx@Q%6OuM=a$bQ( zsa;eBWytO|82(ez_iZUpH#A8}KPj`NhQk9(`pafqQ~3kC*#px|JjuU!9r$hRw&d!E zu|4MzoGK1>ORfoEmQYR5b0x#1GcENGnxtg7q<7U8Omih8#15zy4PcKHJET^MJxc7b zss`sR86(y5)Lu-oC1a&H5fzqvt`$3~w&RjZ$vBAV85XNX-#4V3cF6uYiUBw*hlc0IKcQ((!BQs(-~g9nt{Bz6OpizRKz z%@U_n{U&9YEp1h%D%!xlRkoL_Sq)*&lO<*|wXQYn+sa`#SJN<&l-w@%rRu(X*msCs zp`Mny&zJZu)UR;Wk_EE8rCKWGxl`;`%EI50yTqMHUIq#LSbyK;Rx1}ZR23RxHx~wJ0e_P{7(tlECTNsEs;9DD+2c$SBpQtCjxI0Jti%^MFd_E z%54R)RYayQeyfQ0MdbM6Q!$H`d?1aK@WmI%ezu9o_r>dA0F`_wqQDnFBVxOV8oqcc z=A@F3L=^hs17xQ=q;+cg;-jToJ|2xK6#L@+n?vlJ0fF04#nRBb=0nWz#oLua>=v=i z7rzdpx#W|j5Svj`X}3>bgE;Mrk98nE{|s4&-FTNq5PL;rx^e#%5MM|Y5^j8^Wc}rC zq$zacQ_3I?NO8*CcuVoZgCZKc@hzDUhosa^+<1kw!C?t$>c)FXmmCpM?#8n(gE%Up znHxVP?tScAWL@FLS4hJjmz}nAbU(k4c z!0hOP#x+%OrcM`WnT7ga&}qr=(HC^wN|zGIzD)kYA zCut|cq~$IOvo8*ls$U$IOd&rt%2-bAUa0$tLnw3h)$paNb(+791GQ>~?y7UCRLxQj zCYw4HV%sW)WpkYtVmoRj23eh!V*AwlHU1B6ZvrP*RpkNS>a9XL36NJnLPF?3AQVYg zFG)y;B~V?xl3prR6*>s|sI9w;bXQfXsy9GHML`rrK?fBD7u*+IP}~q)aT(MZQC!AB z#|6g)5gimA`TqZN&#S5qIG^8d=Br;i=bpFRci+9|p8ej3vPk77|9Avtk;={f$6HVi z^O_d_ohg)iS@!!si-&BBa5Pu=53=0H@=^Yq(X?$Mp;!7Z07Kn2!0vAK&t8o3Aj_-# zKgZy28{+k_6jy8jGVDVY8~9c1rtQI>v;Ew6cKfy-)Mosj0TpcD{wv&zM4c44?)LWk zdHuH_pU!PR;log}{LewTeI2{r_WqG@QBlL;(Ei8BX@<*_K)%N3q$SOS@!v_ZA7`9MY7TSYGGfz6Ir-taGD(CEtA)%P0Bo=JlfaZSsE^+HJdN zekc3SOrzYxXSHDmMP9Uri4hyRdr@2aIiFkr+%-353WG!Xh2pJ@Ca1+j!a&a%&cHbivj z9+n&Y_o0H&Cs=OuuRv=CltKB-)gY=cQGS}`R%bIR3mG4gRn8ZoXM}u$tae_^);0*T#`zeCCe$d%(as^vo=}S* z$2ehjvfn4P+b2anbsAV|ur?j)fN z`@V}oI{q7zn7*Oo8y?0e$r_E&dMO*{&ZAjD1AC{*`Sek&K#&#AZcKsDMnP6NKW1}I zYv3pxl<-C;i85U%J#J`=Q8$0zaYmtW2CwPLDo8t zku*4ZKun zRB8)34aWf)lQW&p57_iR$S!Aqz56^t&T`(w zIqM3t+d0UFUM5J7GYBmzloVu-^BX=iCCJ%M5-MUSEyy{}4-W##2y(8oo3&*HInTKS z!YMQ<4c+UcPX{t3XD)EABr+{X*eMXn3DWC452P2mT>7BTiLuqQa%RXmg_Aum$guMw zc6>pQ3mtBV7Agv|&)EfT9;yg3;#|EA$ebXfPK4b%FUXkl?gWqpLB<_FM|)9_sBV>^vXHm4d{bEhOlx1WA~qIZU6xAPGSu9P!#P&R*TL4V1a|Zgkx- zzRjm*Ut(^Za6J&+6k;n~#9OZ209D8}w zASzqsTun~=3PH|rT1eYB3exBFYzFd5x#u!x4|J)}tE5*m&L(#8O-&Q1VA}a-vWZs< zQgFUQ9Z3f*W$IpNr9uxX*)BU*C>065v56kOdgEUT*@7cyU=M(w9ZHtp9@&nrx zv-)$V1N&jq3sAw@t4>1*qBZo3rvE6Qx?4D*e%r)!bL0Gxvf~MFn`XYwG0s}v;}ay{9L0IpAjmprs0B!4vz1X-?F7=)%vV0inWN(2 zmouB3k0ybvkTWMcv)w?B5~R)fHFc7c1=;NEWNn+J>MhP?Q$S9YGiNw=L75DlCTF%g zpWsy6DrY*K7Is2VkS>R-q(a*S>2^9n4WaFV>~K~N0tpGS(`jMV9fIs~UbO~DryyrJ zuS8FTx&+znypcrFEl7_u&4=y~WRG(lFWV)^+0Ivw0dkfg=Qv+wkM;<1uJdJHwnvcj zoGW{PoFm9y=Qs>d=v+b0cOFHDh0c?%y1+S}Tz0P@VduMixeEm8b^e{)JS=_C=X{%V z)GHMXIo~Fc_X#rWe1}xkFUWBWLv>V(ONE|JSFb6yw)@?1eOPAlh}E6B7njXFa~L1vsA&Ighf zr0D$j2#~BG73U!`yh&->qBBm7B-i{)JoGAOKZWJx&5r@O#_8M(L)P({w%=By`;&I@vf^G%N2f?W1? z=Q0w~QuEyynRhvtQzyDo8u~ux7o@7I1bM&H$CrD)ARllRI0{z_@~1@?A9z{yXfV7NnW0`LC)nZVv6cdhaTf;{(DIfw8! zKk6EKo16>y0`KPVyrndJHZ$DCArx<1zYC}{FG04mtgCC zfjPd+y9GPZ7ue7W?7i}Y4Zgs~IS3zUrZnH^3*1lagMw}H1p=o4yQ`VLf;L~^UoQam zA;C8L0vGiF`>02{{+^1^!BL{K;mzMb7jE($53-nPxf}dVGODa+-Zs zt~}QlxRJzjpJ3HHAG&dKK z{_P9=g|p}(spabksq^XIZ>GZj&Bnl;cx>oL&Bx)&KQsmw$a8+xOzHZk#=vLDsD9nt z4FX)z9N-LLX$kn!z@BQRnYq{!IFa-H zFY*qLv;p-%^QErIv&>Fq5PwSQ;{+{zi$(ZcY^A6o)leD|&vY7&2K3EaRp+R-9T zFMl9S8Q;@FhhDKY@Co+r9;xMUYhaXDo-OA}t${S#a!v~+d$~2RV>hsK?zet(eapX_kHdAK?)l z^39(H|7P?~M|KO2H%W$c$Mo&Ee1&94cjQ=J%4QhSRac^6CD&*W%tQxl(Ye|6h|RKc5-fo&Ff#>l$X%>@*vHgwv0#?s&t;D|q8? zZ^oJ1?&(I8{1x!oj@$R3$JWU@!;U+czp&B28yu?_l{9 z|4qlD{7#m)_^&z><#(}sy8p9HD8F|L%4hgL0ItySey-%*?tcz@>w{eC*y+FF9F#xA zH`wWK!<^{&Fw49AKRXrWkFb1}{~hendst_W|4Cl|2_8S&eh)BZZHNL=qL$-AE`*xr$*ZKm@TY(MuBEaszIgUj_p73_aYK&pWLBa0y z1qv;|E*9(^zQ84<_e&&o?p?mXi#S%#_4R?k-iMaOfIZK*0hnnB(4E(jll!h;9oRDg z>~g_gwmJ~z#62X~4XXq9u`P>&y?k}xb8P35V6Rvm=-mv==3~Edbs)5gwntKYXeaBLf}ANfu@4jHYh z1F`dg{aAYGfz^R0Au&3BB55sOUmZ9n3hY0mKYzG7@K;jQ&*XXkhVaT$cukUmaI9zk z@7T0S5<=Y-dLJo5j%q-quDse_ZSUr2)!nW4z!QNX;@ElDZb4VXYxv40GQ!pGfMVY9 zN1v4W^oI8o>=f1tq)5ZfmBI|!Yhnczz?kAIGjjG;ZhFu_wnhmV@zi>I*r zmI+>nSNKm8Yy_!Z;|o3y9O#9<;5j(=B44oS7-L@S3;uE?=S1-P7a8*sU+`_{otOH8 zp8@?|=L_yVfOh(V{p-;{U+}{qPUOQJ-;N2|+_~P@umHRM51^+`y9uIkJ_XY5w0j`> zoK=wWog0N>8k}!{J#?NVNTc%~sIPOAAaEpYM;klO@Nq!ScyI(m(RIRB)Eqo%kc0CA zbPhglyd)=1dUO$ome6e`_#Ut*xON3c_J{j8vVTT%FtQlmGlG|-WMrS(DI zxkVxd_+8K>Fu;%E%3qn_0I2cTCU_=D@HZwnkIH^)f<0*VV^5fiW}* zH1Ke<(7q~-wX;3G_=5{;|o3q-S;wI@ZT}_Ztw-SgDbz>7yJ{> z-Qf$Kf(E|D7rYn4dY>%--g6HA=Ks5gXa(={THav-DH+IdPy##%pe5PxjDxS~h zH)n1DS#~X0w8fmsM6@o^27IXA|4WG3E>Q@4{@k%BUqLa2nBwy>1YKA5qr#OBxo zLRTKs_57=F#Q(r3PF_t4MYay!uImMxaXCJUf;rlC4LJt(i2rsgkQZJjHSELx+xVq* z9~d1}1N`}J`!5{a{?!Y3P`p?;xSj3sZD1QfT&8^${=58YWBwhNhI}#Ku8?nkLj}cX z!yK3n>v#1nt6F$u7Z4Y5+d~G;q_@D1K_X_VpSoa722M*c?wedl(0$P305H5X| z2eF=KdC-e{Q2l8*XE6MD(EF&6G14aSl zcRVr=Mw!e(VMd# z`Y=&x$$4x^04#0?#?x>Jy6_lusPx@VKKVu*G}{hguKD((1T_$)+rC+C&3?8fj4HPO z8uP=qpJTrWwCh;(f-g=Y6m;(Z&;(oacAVWs^0Fx3TaJGm$JX^o1b1nXSw_S0S*G1E8)I-%q$%g4iH=G}>) zH|)gOv$kFabY=@sG}?6W^QXR9q7mNvC?6+ij_Bt=(H6Z9DBnWPy_4tua~IC#Pdmz( zF9S8ZD2DwU(KYXE`QaNYkH7K$`*Uyn=}QOiee6qb zy8q~}zh%{y!uDUbzvtS@g+F}vU6+3U`ajRd_V2xQ_DfywdSGkgU0;5|#h-nm^^q?P zzWSXH?N5KTWhxki;r{WhJ)1X#{yMvT)LGpVPn1_?Keh7m`OsHB_rjNKFTLh1kAC*8 z`zB9(SMlZhKKHi$Ghbf+=xe^UrRDYCdC9Ide<)41mB)^l2ip%XN2F|Dn8aUKjqiy)?ET(ZKu zq{Z>Iwi5B-djIO`%{?IR6}t>;IqGQC0@hDJy!ANW*7dx6RkNI5t&eQx$u-BBt?NNn zKHspzYmV8BYdUcIv8T($YaL(Xn$~7Kv6-hGeIoAV69aW9i2697Y$?wIJznl*YvtY( z>dxZcbtkaq>e=xtE1CzBUUfa8#nYo=iYj@#fR~?E20ykKbZmZf=yB9QELpDO~ z*j?Z3VP{#xdu%Oi%^rOoXkjCG<=M4L&R>5nDDE6Rfb;gixy$Q4S9;>S`h)h+-s+*| zt*D8OKfijYm4`Uh@Ix0vKaLVWa-(>F;3RvLU=#kD4AhR>QK!M2K}bL>>vW7VDo zWl3wB&0(|SwCa--#Yy>5r=-q-PA6dNc*X7$<%S-6hJek}GbqWAPhi*iOx)|iMpL|X zI~z&)DhOcpXD^lk>BK>wxrktg6r%*Z>zO@gZ)2_yR%uC73A}4-eN}5u0_WxDwaaG` zBmsMS^(-%0i9ZY|!7=!=PiJYPJwb47^#lslUkoLm;YyI|1+})2exhX}J9$ikAyoCW?~$_~`BULyHFhE|Vf_k{{3VaD&-QKd2qG;Q-pP&tYtSojrOSWD6>)RE(o$Z35 z$=V6LcEz~TQQNhj&GQ~xn?z6?^jWbs6m9LXT7BFhL2Do#$j`f{3FF*UZIs2lJ1yqj zY%%Zt5fq@hEujDsWQ{kwP#ndgIjq|o_*n@r`}ce;Dp zyF0sf9p2HtkjwArzI55?OLO`3%v>gW>1;ARoy%wc_Z5|w%E+nsM_#gANLODtf;@v94E7q8v%|3g=HOqQ})zRf?_nEz>{y}2-cAQ8v* zKmU8uSzcjvj{V=&{C`)|k&VO4r)SH#f23PI_LCSPsf9c6ap7D#YmCQI+~Vwt z(&SkngvsRGOvSA%6|?2gG+C`%u4Hog3Xn!)Qps{IT|EmHoGHy$Q5Y%3+9)r6iT(@Q^g#tZ(ap5b_=WuJeDNwma`?c z9!DVNWU|&Bf(l(el$x8I#A!UcR9SGPB5BoR4o6Yq(P=h`N5N{{R2g%gx9G`IU76id zJ+U~O)BDPmq?^l6vXS0R+4Q`{hLSTEWlMctjq=v{N?o1VY_U|BwHNbjaeAqSfc|+P zJvmjY8(*TRA;t2c8dA=t=SsPX-p@BHE|k)h(oF4=*_m1PmNt`^n_bk`u>FUT)ec)I zC5y!@2Lfs@T9KKp4lHa+d!Rp)PA29`sX}Brn`Tq0XZnT*>(N+p*!EEEf~9Kk>#nPjn&o3}4oy?m^YD`!Wmw1eZZ@liLX zWbQ_XF76ve^-wpY<@QPJ@JzCj1a>rO!Aeyj|7j|?)g#`dkfZ5BDT`}%;4Zjcs@Eu; zLW!;(%5Y$htf!KcLBnAXhfKm)vXa%e;^mYG;Z*1KDlGAy`ce$gmZ`pimLu1{QXZw!t*?Q@wQyPz&Y+MX=U%G8s-QP04 z(@x&Jp|Le|CaUmlWj&qz?;`%kO-LHI@7TP&J&zjSDW`2Xt#M6T(q z{~K;xb?&y!C!czf9J*N!H5^sfnj3w-wvJA;#+mGB%(r!H+1Ge<+b(HR36qF@HIoJV znT86KF|*(#$*HV+crH7aHK{}?H#LVCEOkp9PExCEj9+RD%D`OtXL>6)~`MFte$)uYvxaH|Wsp6Jr3V4a! zY!)p_X51u67`Kyan9`zK0*M>2DxAoa%ush^xX&FP3r7;e7xlZ*xV%OQjWMawWIDP~ zieOTY=S^fNJT}%p;!X_r;gh_vf&K)zwDH)0D?K1{TuNho!*RE#v)k?Ja>x1;6XUUc zZsOu-zd2Y*&Wuk^ma`R8&Q0aXiYujTeyTFQmV-*m-*Eo4iR$#hnDfXRdDPiJO~ z+us)nyNLs_-f`EAWQyqo2C8hpXx&1wY+~hdjvX&Yr}f3~dfh`Ky{5dgcL{@$niw7! zcKaYF(iH;+U&Mg1J8+pRvjaUb41GDA=yxOIBP0EhMBTZ*aKw#I437=E7llU-^c(Q* zQgX^YY_jv&e8rudNlukbaU5(TUJ({#`f^il|6;|Ba$In53S+;2A4{c5f+M62aLM2~ zCYIQW$(fl#8q|}K6J(n>X~w~dW-;1HOM}LB=g?I>ZpF+ci{*?*U8M@>kn??DE}u4T zZ=o<_QnAI}x$+WN+~g!uQse1l-i}`-m3Gs~q9NsxiiAp{aksZOmYwPaL!2vG5)NC? zYlaeR4{s`)!LdR+rFbG7Ddh9$ zeO!X^D3oKBMcz?z%O(}hTs~K>80`ehs^zlYUN_c1I2=#($K1aD0gln|_?Vk8V?(2E z8eQL6Ep-_PdQ4##9eBtT-E^V2byK;@ zEc(JS03A>5vXKHO;a*dk%X>_v7+1MzQhj1{ z4VMQCpuj}oKz@dgNJZm)!}(~bFa_E!n~9O|nA;l}16>Y`n_M=V#iZ(5bW?mi%+a|n zq3c*Soka`Kx0AUky$O7$&+R{G>WE3Yz$Ga?+x)~MV&Qlqb|8W|)^Ae7<y#K7~&ETSOoD5wR~IwyKnCW~G_Y+TL;@DY-HWv=W}FuRs7 zffY^Wz>+dnHoNKRL&CL6CX-9f6woDyK*syBOC!P_j9cI4$oSa6@ZbSVR1kvc7p6E- zC}sME!S+GSPCz@!Di;WkW9G)n^O+)=+4XD(yPxgg4zQ!*LMCOPjpU#xf=OGJ3&n3X ziENW%5%W5n%FRGOFv9mnqtHd%?m@$u*>x7CX6ztG2vPy-Ixfdhqg%kMvQzlCYiBq5 zwvyzWlTiT|Ddljwn2L56M{@Z?b(B!75wTp0?wd)Lrm{upbvIo~b3Dp(DR2@uU0JLN z9yeDmn6bIp{iUVeY%*QQNAc;#q3#iPCZ%sZlIV|&_aAio$4q9vkh=#LA(1mS@hMB~wLY*e^8RLxRhF*j?{g*nbR zL)*+wOX;>Kl$_zgVKbSVnQ^DP!IEY(M&}H9ziXmk9Wn_p>yyQL*)=p_Cx>kct~(GL z1CQpjyX|wxT$P8CTbN9t($&RzbZ`)_g|ndBB@@q9MzbJ2OR3s3;Dqr=c#H!U+1&|_ zYZ-KT4n)7CFiJqL9!aIO*xv1GB=g8Qgaait#sTDgo1pX>Y1wL9W-2$3>hGfNj zux}j&(@Cb6!ZTB)%JeMfI0vYb_D=rhzWK15H?d%+#z5*41zef!8 zpuTJcj69o>22&DJG*FhHT^I&w6gX;$jJ{l$tSlrk%AQICB?l&0rC?^uQ()4dirQFF z5OSPU%aI1n6`?z$7Zx+wavJjz*G$4?mAfLVqz!%Dj$9dRl9NenHpyD69ze33HiFQe0Dmb2|;U5OcOdy@7;99%InFm4+~jjAsU zMkuOuaXb&1TbV}dNXFgnRH-lrW}PcyV3v;#lum=O%$Q_)7PMWNE@VvNV2w~XJJ6^U zNFQV%qyV%wf;*Rupc@0#kZ9Zy>^E_E4j(@dmI}`U#5F(Vi|?euw*s?9Sg$ZJ7(HP8 zQ23+aU4!g~*<2D8XOr58+3@9o+)rrRGE4bv;_Tn z27`v)K&SHS6JU%Bo$`N|fqhWU&bTSBke1^+<^Nss|5@_?Zq$j<##m6TGXvp~!h%{) zML0BsuY(~K#9VVTVl|Q7^oOJ4Bco-gFzI<{tUAxdHA554^rm1Q=cmv~W5jW0VMNgyBsEf*?+p;-p4qI8%FW8GX{&KixC zRVmmJ*8^8GqW>PJis>-shN0orfTX>S7_~H?a{zQ&1l1w{d*z?<|YUSQ>?FeXb>G_ zta>7x(as7O7b%F&qG-gz7E{oDBGdVq-U)WXP~V8#o6ZkU<>7n6fMP@sfV0CBg)zy* zXA6bOG&KH+KA6=DaN1fQMJ89K-~x-GTOkZZ_&{Ga56fuDq$=qGrcP-Rw1fChj+SZ$ z`~cDdg2C;b*xBg{l~CS*(L#S3$dzWPFU03kaA}rFb5vSa!(> zG!1d@KrTVMPu1x}COif<4bz0$lQ?+h;i!XlRDyz!2BK%s@B$v-a`t)>Fm=c+El$qR z3hiG0tk|LqX0lQ#nUX3T!oQ^(p?!*_F8cFi@=#S#DpRv{RRx6`g1uwipROr_xxgb& zH$soeCSjW9Grf@OV4-6$k!4PRH*f;-u?P}bh0H355JCq2YmNZPn9NQn4R$=FjdVNQ z0u_47VBV56zz<*E+<9>W;HjUxjAKUH}F@j;rG-f)f%kD*2Ct&nMlc|5cLMlh7jL$+cX z!eHP#a#%BT(tzkO;?yH9>W{@~J42PS16s5mDK`x>9s5sP=aQJPwGN_@=ECen)i4BT zNyzLg%vIdkvMBj3^ncpQb;ex^YABc{b-{s|xiZ4PQ|JZqQE@-2IvS0Q_o7MBs&ZlE zv3SyvS|CWk$~<=f?g|$(t$%C`#6-bj5sj!G(*)kY{6d&x3tJyn&LS7{>a+ zbl|(hG=s-93pdt*wn*E~(4NqaHpZ|!cXjV+JA=U_$gW`9B`_sBvW$CYvKa|9C=e)clYi+yLUggt$j9KoI4Mk5~@P`><-|S>ABg|-#%6J_ z+@3vc?UVUJyNyMntWM~5uqU`k&+EjYN$4LHJhUCYS3=x9N#(a5hdy0t7qzQhrcAbk zi>N@L{psl>{5FfD!=vNYT8XOzR_1VpUKh;aBeX+vaCkJ~_8u4j8-@Z)5dc*tjo6tH zJue)El!ae7g+9)fVwG}?oZ0F*xzYl{C7xbdo3Ifmo0cpLh+-02%@q_sa31t^y7W*| z#?mPUEeCd-w#=IlX}C-l^!j*zB03SH20`;@q13y?$E%xJGz@x^g;PRZneNNdknZyY zmI%(Bb>e?woNhPxD(d7s>{b`Xc)|3;q*@xy<^P^Y1an4)L(x!zvf28Iy_k{I>d-@; zUnflmA7qS6c87T=({LIRf!^%D>+Es|hD4)?Esl$>o~jI$#ZF5>+zrrlNkYS7oD?=X zy|bMAHtt}xMe%kP;CMDEm~OBM6xDX>Mx-(Nf1P zFm+)_4(llZZ=R)Q(@Q5PwL42SiTD8A#GnPb;tC8-TBl6dI;kPndK3E#Wy&^q*p6_& zM)Qz=6%ml}8OS*ky=WXtYH1SOW>O<5B`ACFu8xjc?G5Z<7CeoyKj;%m-U^E!*f%?WUwYZq|an7JCiZbE~$zI zXt2;xgkr^#631CFZ>%HA^|*s;U>c)8>ePG?IH#|gzsN+&^bf$uH`9!t@pFWIya1iLQmA$6|)Y>0;`I55uLd+LxQ00{i1!a> zE8=~I?MvFl@R(FDWWOlG)rhrc1HhyNlcT~4k!f%*xmkAdqGZXF*r`JxzR3kl%z5yN zbe_Q;+eHg>Xw!}mueq2Q{fs*eFzf`ol$^wiXF(K__rQ5z4NK$FhX4tQ&ZU5?TEmO( zfqc4Lfg)COzlq!s2iyWQNq7_vdlnExX~z1AXo-{7phjUdqEnudUMAbF3TVvn6s-Jg zp1$20`)uL6`1LwGvEU zY&@!wmFSd>?bw(~z4ym58r3Z&K)sCnz&?$J6OkcaoeeTu?PyqXyKaAq1j*z1G^XGs1G^*~9kjkWYpemeAvYgs0>p_?V*xU^_XFtQNOi zhTC+}?H!=U+A0`*&=7K!_`*mwQ#J_cRA#aZxyhUex@C4B1TDPU3@^g+NiDdu^bE1K zQql_{+JNjlv=+FP>(y<`TgFSmGz?z^N)EW1;mgH2{B|Pfz12Z!T4Crz%Yf&`!I}KGh4L1 zi%FM4G^;F4p!<9v3}*`FLDo{r0XVAoFes1`Y3dsdbATBVgf2Y~C6FFmafno_g4+oe zPk01McD;3U#G5m;42}agCOu--u>-})nmNW_RLv+)qN@ov_a&l?yHuw= z)I{5GI$$!G&hqBPbb*t^j`@%~(mh0##Aw_s3%vrwB|0koz0fcvXp48DgWh_0%4G@h zAxJH*T7)S3&1gKDvNVesfyYW5)QCT`DpjB;3US+3i2x|0xn%E*wjibmRslOe6e615 z(qJScaF#G9#kEN(uJw@PEvQhd8-p|=aSw>BST*>8M@rZ&sn^egwV z6%*loNU%u6Mi?@JV!=QXMdy63D#9rHH0UGsLyHnUg8!9a_M(xnB2|B}eMaLHnH6xh z8^%neG12h}yfCfqeoqyTpxxQh033I7Xy=lc1rijd;|oe)HCkXjXEO*}4kb$&x}&TH z53!ccGLeP7Dm*c<2o~N0HGwWY#+vvn9Tw5xkP_zh^$vOwOzThv`(wDUY$Fk)io%zP zI9UoFK4>iPrrGSB3T=mKE|EKgT!ZQu)Ven^G=^807zWF&^3gH~fznH8ngMVQCHR#k zW8~=|mOh3=7i3mMhQ%d-VJ;&t1acW67EB*6%LFlI3Hr|$s-r}K!B(l;n9s7#8>p$))MgDQO~Asq z%$pn>D@L8o!pQJ8mM4nftt>(-9x0ZGahU`h>A{V~;xR+v;)>wK;8n{bb>-0`**Iwo zzOteO0*_$vat_R$K1AvfaD!k35y(&UGoK6DBIJ61&+f8=AIr{S>P;-9kh;LF|DY^^; z!I2412z!v}F7zvjzc3Q7xfop>r*pZMdEpuab4G^85IK;^1OtJB3_}U`55mHblkO}Y z&Ow(6j})PNo${u3uAS)O!Gs}aWBM)>9|$K{Vnc9p6qU0hpy?r z%+W0(-lS+EQBvc)W+=!R_Id%uPmI2px=C!ak6*70>o8PA>`5wn1m|jU&C7 zA?HZb3^c!56wpE%c``?u&WHy|5*qTV zXEI*Imtj7t+g|z;+&R#7>a$vU_hH4|RL@yZQsdwsv=K1h?eYlATT&dpK8fP30AM_+32o#}RYA;$xHNrilrV^5a^_5I& zEQ|O%GDD!8qP-Y9>MC<^i-GZXyE|cUNW2hYG!5Y?nj`Wa)cC?`o5`FDzebvO_4n>H z2woz8hJ)*6HABIM1z9h>UD(dx%HVN!8dIwkKOV*nkr~g?Av(fXIo*fMclf8dNYOq; zYzdI$h2xxDP;zQ2@dz^b$k}vwMxmR}K!9ezCk#eJy?$P{Cd>(l8Tf&jrUM;Cv}{w& zp$E|EMWOgG{Sq;5Z9Ii0&WQx}`3Z1@) z)C9;*PqkF{u>_V8%$G;isvfA9Q;1g-Am`OaH`d9jgH?bE&HfrCA(bX~a21s0>7wA& zh7=l4UG)>l&x8PRhXFiWZ3MO&qqlVq*xDU%s=A1>AU26Gi}eSwkC{z{Sx1j_O_DRK zz=m+d4F*qw_yFJuv`Ld@8g>IB#AQNJCiiWR8Gw_W_lcNc!P{=W}S{srckoo6nKC=iUQm`k+6X6kPo0692aV5qz zswSCw?k7gv@u>84iTpSP^%?dj*D6%QR<)HBRMpKOwC0#7vmh{#Hh5KR zH6Du~@S4DM0Ug!3oUA0TlDA0qvWZh2nyCgSkv#&TjA>a0FMtOu?~3g(Jf4VRnP+`= zl;sIXNH8|+O9{%!BSOb!0*LEG2#RXzd=7p);R9qvHlIXnE((G2#O zT2bJQkT7T)mwGJB&U$@s-6I(qA6RH&^G4YiW~b$7VU}pgz)~6oEJ4%2t7TM`XRE+* z4(r$?7GYJ`p>@GUC9aid{t8w5uL4GVe9VN*;Jk#gaJOt!%=f-NWQA$6ucSjyFGxy< z2soJWns+7{ZIrYEQqUv!#6i{TshoQ(;U?WR(Qsx6aLbMjGh(>A+ z(>Ntri^)<@Uu|}%SZ*TJ#V9Nxk+vHt74w-Lb@3bo@}cfBwFYgGSs9LFrI;`w_>!t? zMX<1{fAGLan3*lY+r$xRJ=w_cXP)i8n$ZltTS97{$C_uY3e6R6ZPlnW=7hMh%h3YU zRcWXp^+U`A&Go@C;SF90o8cCuhKNNjtQy|OY8IFmi4wCEnGEb!&$A`mNP5Y-!efgP zb+3p~W`;5)j$+E4rY|YOm=Xeob<9zN4(FE; zobT52<297Mfo`XCgLSnFf2F z%jbDaaxK95tqM_%nQ#_ZCp;KUZFvHt1TK@o!^@W~RFC(<4$>@px@K#%M86?tEBq_u z!{K@B`-f{Rlcf-$Ehy>1NC<<=jv+5t;x;s3Radf$zJ=_}3UufX8zMdjO8jwAD+*^8ir~NqBIB=$}$O< z8jRow-;8>$>>~(^)M#mEbT|UN4oq;FcBd0lCMBLG(+7hG=cEo|ZM+$`qUuknFls|k z>YlSnHQqXXYpAO2&0HGG3v2>)-JBCO*ybw>Cjd1dF^k1&cuw5p%VK0OWS|KoXQ5Z; zY|KgG>oQbcej78jn37DVjh7;cN(%E>8$453K&Tzs1S;ZcQqwnAj3wgM;m8CXZ7g$9 zta2-yjLOiOUR&Ty!?Mz?6SW+F1WV0ztCo=mbBBEkt zs4(M`P#dBe{}zu`@d(4u^X@5q#}GoGh2V)DNd>Z5Yr-vEF}&%GVXwiH?HSXS12C}* z>-=o80TQqy&2%d_3I^KVN4qsJV-nfJ=R-XZKvl1+ykTOxyWp$H&>yd zSR=t+F{9lCqQl6iE!s>h+V?%!f3L_)xrrQjVci|el^INQG!L&1&n^^NUA0S}%CZ$O z>}HJws24pI2ZI+ciiz8#u(}0Zu|?!@$m(cBduJ!Hr4DTaQDUCWma{|P+Ws=x0)ps? z#lGyK=nfvQg-fKAMg}Xo6YLcV9+h9D{xInqo)PQT#UTu+wQFfKR#&IgYJ3sJQ!AJQFSW@;MEv}Hxuex6gvXx zYV#CEeyUWY0t`6|iH0zecj^#_D2+8JsvdFDd0Zwrw`gE;f z25A^^Ixf+UOsfaQa(f#$(4|N=yo#zl){??wbNR?n*G|LSPU{z>PuTRwqV90N85mMS z&a!Y?>Q-H%ufi}H86^#ifBJn zVWy_n=fH~QMY6=QfgIA#dlNf4T~xu$GDtkG?>KB%`D6+RS!K;A{AVHu>x4P-xY%AK z)Jeup%`srDpc;p&+YiGvvoIN_su`nXAxyI>O^!erp~r zX0C@uxo0m?Ba;NUWp4+YInKrUP$h+O$h#~FXtwB)p<$S*a2aqV#Sw8~??hC>AV=(J zV*7b)T;>Fg+i=v*|A?-Q)lF?QcS6%>ZNDxvy5K8<9|t6ah2~-ffItkw#yN6(z|V5fQa*E?6`A;}aJA6Z;jq2n0#aVn`cvp6PXr6i25 zgYdFpZQ?|IpVLT{?Ks4_?s6E!q*hHe0`Uj~1%8H-I8tSik!lgJWUTUM_4%rgmrftL;T3FuTaM4Z=$@5&~eu5b;Zbh&}%2zgLMHmE4An!b{%SrBl`b5ksm zjIcV;nN4ms$ahAMLyTDNG6!m>GD_cooycgA+V{&`@Iz6qgaCUK?Yo`~Idyvr@H2`s z%6()+r3Vuo?e7~7yR~Eyyk>R(3u#1HtnUHnEbc&g3F$wq939GjmD;FW+mvn_ghs4j z4Er%?B#kDGf%(QwARrrI4#7dMmsfo>;Ima14Mm}*>Q!BPAc+0SU-}>9#^MG36Xi} z(OA>PEsem;xLy~EyJRjsLpv2k7}B?9dR7@{Emaulym8opk~=SR3*&8PyJ$$T9F@oS zx)2VKo?xC#%R;Vv$#X)HGbc01g@u%d6tg>^Q0hs95)+GlNGNHtOIKZtf|*iTYpCU5 zS730E`3l)3Ykv#_nh=4=LR^4;Y@IiW#St)OE;Faiix@V%qAoM9-RkOD??CsFS728V zcvc~-B^E%M!%98|LBu6&eX`&Thv7nlDiRmRfGF7blJcco8RpV?To$i{U3Au=cL;a~NaviKyA`-}T);f{)lgDfGfz|nh_i&S#cIy3r z?JN_}k|%UVxR6V^MQ9=zWg!!YyLn_jFV%7IxRa<)v}qQ zflii{y8E(A6>@Z?GB_OVzFJld0o!4C4cUESxJf!-BI=?ak;#+ENUlXVfyP@Bt9ms0 zxyH@QPl|^TTla{NLH%(T`&f+EsT;k$(i=?ihcjMdYy*RsZ+I!aQzF(jOWI?@_Mx?a zjrF3dC!uch9rUowT;WepK{FsYFbUl5Mn>_iA@Gc>rB3vQW%bs&K+=Wl?SYljFlH@t z3;Q!c4V0z(Ro@ZSUdyqW_;?`Bv~&!EU2jU?15>`Liw8{6bGDGRS(%56sXsp>DZ&eG zN^oldDjq1E-iW$5TOI~#k;|mArK*yOcb;@pd1P8~9V0>q+}4a!2N_41X?X3({>SX% ze@cttJe)(8>0x>aC#-QjE_Lq)ZD$sCSYKSEFk1x2W@@qL-a`V6nAx5V#oR5+$3S)7 zHcDN{QIIGwLU_W42a?s*#u6Wq1z)Pk^@3p_B7H!&!y@a-a1j&cc&&uJp5WuLqFgi? zkS-FrAdZB*y^x`Ic!>4Zwkj9w_Db^z{!K6v%v zdW~ao5Cf`+#?ZM|r{`PE7aBB1pe#`%>uX_p36h4$zP$KdEqFo3Eg?hAh7+Z_-Zsd< zNenhkA2@wz(WI=#lGSN&x1;HFiAkO~$br@mY5={+(llsWL*;P1Uvm9q zuQSpf`42UH%r|V$MBZ=LQJd)K0XptuVK}etQa1E5Hy5>y1Br&q69f`KqJ0r1OQdwA| z#=^Y3F}t*_Kt5k}oPu@sa@9IWhJFlWBpY{m(w^AlSdIn-J7KL#Z+AMT!N@MFW+ECU zg;>X%-Mdiz00U=VdeLYc$_+Mx#&X*BLb-icXjkYg?i{_ltE;oC9jwedb*WW`%a?lF z$l8smJydqFwmIsy+d1y8EGt72U8+FwfIL8O8{|28rZc&%-RMswX#bd`*CiH36^7Xv zvjmUGjP+00RnTH}*KS1*dZ~(7^o8z5BB_iq#|g>-f+I#;O-#DNZHVMb3e^PqO>z>s zq>SrCZIUd6sx>bXR>KiLpe`Cmnxt$RL;{dU+3L8y(qnbi(11)2nZ~+qOP1QuaDoh0 z9Sd&1AtXzYw}Z&XVwqlpRpk&w))g%(jifhVRfN0}BQ`XdO*}D<4Q}}62avxRdzK6i zOxUcZaiqXL3)HnG7H6%=KC#Q8ZzDiQmJN)DTL zZk>A)d-Y&IkxW5*1GF!yE%QJ5vUFL7@v)KGnCNOt>tdAU9in`}zeleZX4P;Xbcr0c zsbk_h2eeE^OP;*kpHD}$^uL;auwJc7z$}wO(b|sQ{wLhefXVQ~5!>>9%iozjEp8$1 z8IbVy2@t&vE%v4XxH>a{WRX&RHoaR*hN^BTN*lrM5GP9$g=fQBV+Uw;vi{bEW$Nt> zK_@!mHta2%^C|O6wIkbcgK!6MN^v;|*ET{Hdzuj3QZl9JiAA!43=-l#=yz2_D5g2l z6NRZMIDMA6eC;+_2p3_VF-Sn;Sezv;H}23ud&Uac3jx0Eeo5PK9pVbAGWuVbpiv6fZ9o&y60(bp-a$l+pC z6WM^0b)eCET3R5~CE0iu!nRUfq%3Qrb!?6_8$^Pa>P!UKL`YmL!`mQ%GvPOOi3Vgu zcjxT%6+!^RFeSL1C^ul!1cb=sl%oxm$c!6u4w{VIjbR`;nzUP9d$}O8A&>mG z%&&x(W_~%g%iy{ObhqRl*u6Ws4N#rSe1PqP-@MLq&HM%3e<^c?HcbSmYy!dAZzN@w znK}`>O;!ra6XRA9P4&W^Gn=*h5-~e{n7n;iGIVusBRg8X-~i$Ql6<1U#J*UTI=vX0 z226l^qVU$P>}7*!BG)-s(O#-#9}xIF@YshkQf)C!G)6azpfh5?LQGzn&G~3oM}+Ef!BXlVz!lS7U!HBXrQA@Q>#|FChNp5PDSd)vORz;t zXf2upe-}55w#F6&3YMi~e^;+Lpx3Wn;K$AsCB7&bO8v^(-v=NfW( zxf8546U%Uw=-$dKf~DZO^nqf7JS>l(LseBcS!N+TNmT|l+p&BgC8>4nDy9=*eMND& zJdiGvu~^m8t`dS5ZkDdw=9sq{EqmI7UE&R016xvX z6GF@zD@d0)7V9dbqUtSf;+w(qtRZyaak@zw)&z5dHu(=)1t+R(E@X2+_iJiety(5W z3)@P>Bb{)BN4oeQw#??Aq($%S3h z)Of;!3D5l9^zQ6K+n}B99NhFh^EGLX|aOO)bVudrL;z&l&vx%^dq{R zH~=L)RpT`j_K0@E*!4n#)}utDz~j<<8xgiPUxy(nU5^T1-4M20Ulx8-r+TWoEv+;_ zsRV?jS?Xv%GeoWL5Jo3`q)E$M?XlW+4w%J4|Fz+SOY>5tE!p@@~~PcjWf$T;8WL7OI~FVk%t52I+v^{gGiI z86*f)s86k@$0O$YZ3yuEnqifMWKd;<&8J+D=mY6h>})DX;vRKv=GQa#B!QzCw@zAK z$6@1OFAH@d_ZN#Rkqn2u?yAdSX@4-GgYHPz&LFNyF_7rUfS^khNl@Zd#7=JB7M}=r zO6`&-2P4+YlM^EI)*@CtFV%dVI2JbAeS@soZn;%zV1lFtC9|sSYnJlBAernCk^rEB zhyI~&GJ)~H>+z3&c&elNnG5gh7>F=Qun@VrcDYP-w(16`Vtz%D=migyCyE$FLlRKJ z+l!XekcV)9){6i#da@ICIXYyrtm&xHJ}bTG#ex%#TwQnjXYMo;tf-hl3HA0j*1#Pl zIY$Y5+@QPQ0H}2paAtW|w|dse1v--e1UH#R3u?Ri&*x0p?()t=d+ga=^KMiZ;E^T4 z*#?cnOOJr;kPe_@Rd?@0Lct*+V92%z;!CiM=z5zNABtn;F*aY2n6Bg^ASk1)w_>}F zc0@H9a-lXOAsV4f?o*TD)^f&EUd6D72qXvJS9N8xFSvXVtB$zrL$)+U*SpXzDodk7 zR}AOjF@Vz#gT+uG)C2ek?J{x6=Ott2PRu4Xo`+C_{XCw>?!0vlc9J@0rCmvanIGxg zS=+!0ed@6b9GX(|!wfdR8kK`04 z4L})Gixb>{;c--lFDoz&`pAzNaC1`zh!EDYYYS_Sg?V1@tU`->&x+u4L&8TS$}j8( zZDH;+)L=wK?6}x%YpnA^eHXgsj(L>KH?Z5HU>vYdj&L$|V4dmf69?Q-;^9crn|6B_qZp`DsVvW80b|VAR;va&(7jS?M1= zs$p$Yz;~SQgvNEg^}Z8*o0?AXnNWFYwvtQ%R!SC5dnGZcLgEh!(LWx-?wTPU4ApP2 zN*CP`XO{c#>@CZdO4P28FaLr=?ZlBH*Vdv(aaYxqzU&sbi8VMQhcit3x6C7C%SmoE zGH)Afk6<>}qwq;Ud)Jq>S3L6w92U@;>{;}d2~jtK&!WB}%hf|5^N{Wk{w)o_ezibaa^Cy3N-i7$9ua6&gZNs1Uv)^X5-{GyV?@x90u@6`$>r3OW zzP=K0(z^Ha>bn95>aTkPaPRxByw zb#?XequpM8?>?fwRjB-09P@s>j=wMAul~6=0jd8Ut@qr|;kx?wI0MgZ!?DfyBX9Gb z`)??-KJWJckbk|}!)oWgheP%C4WYi925f!!G+nj6U!q)J-y5&Ncal9~tULFYx-yEU z883SX-x>6NUL8;3K>c$c9`%{~aNTAcckt)E$4cDb-NQPHFEb{}g8sa7AfsjV-5U3q z3vkV5{2hlsufCITop%oooBL4T1uW>#JGUN%W$i`I zccXW18wz!Yv7pl@*1l;B&>w1-$#aR0KHd+oan*J0RsN`9CA)qcv^!}(nP@I}Nb z4@^S|*ci>uNPNf{O=gC`ukz_v&A9#CdYM+OH9Bx%~e6 z5#jS&k2p_GQ~NdItC`F1UoEt{SiJs!?f@3VdUOqWly`oWizKY`c_^4&wuTf@d z?LecWLUUfP++z9Lrc>>G zE7AFFJbs#y@mm?R=U3up&Y%V`aO(LD7;N$tLh^J%^3H~JmM=E|;q!QWheAG=c)!9C zh5HpgPhnai$D7yBDSVN_mnnRu!Z#{>x55u7{Di_UDEx-P?<@S7!rv(*zvuJD6kewA zkitcUwQ zufne@{Jz3R75~j@DYWNDKyQt9jywF zSGZZ>c7?kY_9@)2@OcWaQus23uT%Iog?A~uSK-$bKCJL(3ZGE88558F)1mNOg~JLj zQkYhFSmD(QZ&3I;g>O~(0fnDb_$7ruQuv<=|4U&5z7fuLtWkKP!qXLYE8MH_LWLJ8 zEGxW5;p-LNsqjMzzo76N3cs)L=L&zX@NWuNLUglTCn)Su*rzb6@VN@770xMqp~4## zzFy&-3O}UqUWH#%_^`s`p&Ib{=P7)i!kof+g)dV0N`-Gw_zs01QFx!ie^&T?g)8ty zbw1~Gh3yJ=D%_(ms_;^U(+VpJuTl64g|{kvyTZE^ep=xJ3cs!J5rw~2_$P%;P=VOK zV-#*wc!t9B74B0wq408rFI0G=!q+RjQ{jgcen#O}6h5Tz#|nR=kb;Ws*{1L;g`)~D zR+v?ISmE;(zD(h36~0B``xV}&@M{WxqVTs0pHkQYRgdjht8kOTE`=is(+Ud;uT*%Q z!kZP|uJFAI?@{=9h2K#41BJg(_=Liz6}CdfWV_ZWJXPV@3I`O%6h2Sk*sxYT;Ug3=j-=OfF3O}mweuWPz{F%bX6|RA;!FFs_ zxKm+R;h4f1g-Z%wqwo%e?^pOqg2mxKZI53U?~JK;ekOixp-R78PEl@Op)} zD7-`A`xV}!@Ck(mh9=vwTH%Qbw<_GFFsyJ);Ux;E70xMqvBFm=yiMV|6@E@P`WjQ{j^eo8TCc zaZy$Z(^K1boC!ji(P72crmbqYVA@KXvOQ23C-pD27x;a?RVb*gR8@d{5> z*s1V5g%>KEP?%A8SmD(QU#{?0g?B3au)@zO{JO&LDg3#@CloTkEBr*^i3+zW+^I0E za7^JP3a1s$DSVN_S1G(r;ky-nOyTDhepBJUDf~}`PbzFW&9?7Yg_{&^Q`n=hUtvt4 zt8hl)lERlNyjkHL3O}Im(+a<;@L`2NSNI2o4X4|7ouF`w!Y+k-6^1WFB9w2`q{~@cD z`1!}kQnDG@k?c#3Bqxzqk~fme$d%+8@>TLZawoZ;JVU0}_5G z3$iZRgltFlB8QUW$?4=Z8TkiK?Tk+sQ2WLvT)Ih341&L_mLaOcgRo4edJH1 zSKrUSlI%?OCr6Q!$*ahl$mQh2s&)?{~bFgcE# zMqWeSO5Q_0PQF0CNp2(ekVnYhNO?eP)+w?kSxh!2+mXG=VdMnza&iHA2l)y44fzB4 z7n#z~&tH>CvIW_N96*jHr;rQDJIP1L=g5uZ`{X_{+Q`qh9$87^69%R}dXqy*d?&6s zK9!t9E+m(eE6LU5E9Bec$K+n}2zi41k4!ty&o4$6lJ&_JWM{G;c_DcTc{zCM{!E@GQycq!W|DbiDT%N9GxdhgYZ&$+N0670SC9+HrR0O;Gvo&H z9r9E1Tk=Qp6q(w@&sUR4vL4xj>_QG8N0U>?tI37r$CZA%dZZ{!&=)ZC93Cu@-v zWE-*@IglJpPA0D;Zy=YF50FojFOi$c?c`qa2>BbC+QRoQlguZ}$fjg_av(XHoI+kj z-asxTA0yY2uaobSJIQ_I59D8@+tT+hLgtbsWMi_5>`4wG$B|RXHROKsNAeVz(#p@T z2ALr1l1<2VWG`|kc@a5{ypw#GTtmJ>zC(UOenb91{zay=W;>DX$N}UiauPY4TtF@% zSCCJVFOl2G-Q*$i7c!@fpMMG2n5-gul0(RGSdtCch(3l6E^k{d6*$tW7o~Ta(?$f#hg%GI=F=1G$uZfP9L4iQG(nMD8IE zlfRPxlGWO?y~qNx9@(7iMD`^|kQ2#SZ}b@u(qB5RY4$hKrpaws{ToI%bf7nApqPmt@#&E$6SOY#_bk_>e5 z{i;Fcll91!B)*EmwBum%B60?KEqOcn0Qn603i%$ni#$mFN}eIpyZZU%kafvsWGAve zIhwqToJ-zH-b+3~zC>;zKOw&*e0=$Op)$$@S#h>C~`7+6?qf6oZLe0AipNRC;uYdp1vOmvW#p^_8^Cl7m?G+dE_GUUUC)r zBDsnDh}=saC4VQKUcNsOGLI}LTafsIN`Iat$C1;?`Q&Zn3i4@k1NknwlRQ8kC;ubE zz5V=Zk|ktQvLo4#97Rqc7n2W?&yX9)cgRo4Z^<9YQ)KG-z8{(_AnTFM$xh@D@*;9N zIgeaK-b=0`UnE=h@$>6KjwCN7uOP1{Zzu03pCDf(-y}aIzaS5izmR{EsxQk+=96V) zGqMADJ~@n>K+YnsBX1{HkWY~>lUv9g^hBd3yc$c5x`awWN%+(5of?jXM+ zkCDHV^1`*;w+fS4WD!|Gwj#Td1ISV2Byu*nfLubZAfF`Hk({ zLmnZ2BdwwIldMS=la0xCWN&g9If0x-UPsB+l55CU$@j>e zN3J4YB;O!EAU`J$kUx{B$YveX^ zH+hIWPX0p%NBVwxWRk2$R+9MkXR}`QA%~L_$eHAPauInC`53vD{D|C59wLvE|B%5^ z^p8xETLZawoZ;{F(fl4375wi;{(81F{v_jT}Ud zC8v>d$y>;~$;Zg&$v4Ok$x~#?7~hXfGD((`&B@MWe{vK#nY@a;iCj)TOg>A#Ms6i{ zk-w1tkk!Wee#OXIWChup>`o3Q$C1;>Ysg#4d&tMh7sxlsZR8&E2>Banjr09VCu@?$ zWMi@&*_#|jP9SHI*O9lAE67*LcgdaPe)4DXZ!&lh`x9A6HXvJ(-N-@YSQ1~0VaDlP z@)q)L@-gyx@(uDsayNOHJVBlz)5rVi=a6;D2_$};*5p5*Tuk0aK0&S{-y*k@UylSGx;(3HTeU1id0j4f1+e9vLV@)>_rYE@#SQu-SB&ZhBuJQ$cM@2$k)ja z$vxyz@+29!%ulZdnNQXuTaw+#!Q@5c4Dwp?cJcx88S)kKJ#rVBJJrv>gls`}BKwjf z$cZF=Q^3^2wd7**Uh;ABdGdAgeR3DMpZtkDMW#$+y^smAF4=@^Po7T>BQGXrkn_k} z$-Bu%$>+$|$oI(4$ZyFX$Un)zbl=YmGKVZC&m-HCJ;=f2SQ6ho>(2}1P2@82A@Uh= zJ-LPanEaCbj{K8Mnc=6e$pW$g*_!M@4kht3xW=zp`M+IN0Q^o z$>dD(YVtbrW^xI6H~Ap>IJuf!M{Xv!lV6g@$dhE?3icB+hb$mV$i`#~vWo0X_9Xj} zL&yusapWcBRPu6i4tX89ki3mtPTohZBv+BE$rs2CxtH8een*}p-7Eci(PSZ6pKM9?B!`gW$f@L9@-}k0FvYSSrCuY9S=I~G z8>u%75pN&)C&T|0D%|(K3ap9G+X``h4s~tnQX%4XBS$fOys#R+mxFqq5a%zTUP|82 z<4=;$^7uMo$g;Ljf5h-lslTG$PyGY+aq835XQ-=P?dM-zSQDRTrcMZvPb0Dw!`lnf zEvql}Fd_UOMSThNWz<(vUqii+dNK7%>c@ph_f7H>hJPWz47|)%^o@5_#Fgc7ILyjlS_x9lYIn>vaH<7oIcaV>fPm=4&*T}cXcgbBsboM>u zKJpOxGkJnMMgB`>1pM=mb|HI^1IeLes?1xS|6Od7ca~_(w@J=tB|^+66+(=oN+J4F zl@NZ)zjNpRplF;QCL==3ugJpCq>uD+MT1Ep(k&uQen`JuG-&cgK8;0#-I0OhccBpZ zOcx^k6+)!aqikMm7Apj%10NN2bZdXy07%%q+zM7k@eR|=8- z+tgcy$Y&q*AtCZ>(4?Yy@|=GSn>4JbXxhA@QDrh&VUGKMAf0bqJ{LTcVNS(;Hz~)&wR=X2fW8WGQ?2$7&a6AwQlm$PzrKZFRu!ZKt0aEf>@7pC|Lf~|IBw2Q?;d&S?IC)?jcYsn zZjIHW(s~4*ww6uoY}K-tIm-ge++``t&iwh`8N1d3r0w=7DXcj)b#3Hz3u&UqCWkZK zdfy#C|GgotdR;%^hPCeMFaFw^D4lTraVxFkU+$W~ugPj@9a1|Nbne=@bd;p_-d|hS zbcI$Yt=Xc>Ce-U`l?~WY(OJ~U)ALWi`m2=@_@vf^TF0veYK>ASht5Q5)kdDa`R~s< z9sRVT^H3AhDrvf7`CpY4c3GnxWfK;SXQVmW#%#)8}OA($yMDlNDD8nI@<>af9B_#Gd&(-sqqpHy%= zZ#PH9?6Sw0_+XXW&5W80k*eEk6^^F5?zjukPUCPs$kJXlXkc^pSFkD%^%#8U=2KfAbEIKKb^QZNE9v1MR*RKcEBh+>s!{Q zG_O0FGG&_6uOmDSdDGiLO?Miio6HWI22Yvc^hK1vGQ9^drKHSs)}#1SwKui~)GX(C zCA{>!N1{*L2IJnh1yE0zG{bT4TFK!_qatx{OE%QgCZ-qnI-+x@JY!Te z?#Uh@WwlYUxc3iQIAx7d@woR?bEs#H%8Gk`O1nL8RCe4OF1~DVDp0W8xcA%;s8@|@ z9QQ2zOL@zvo^kI1R94DXqsGO(eq~U*oNZ08t&Dp&OPzgg)cm;DTI%dO=TVHc1@Y(@ z+%8Y~-jSZWFzz*Jim)G?Dd(g8;$C?=RJDMV{mHoZ{a~n&QBTFaDOiD0GK_jU?&ZsQ z5u=`odv8ka(ZH?f1*_xUd#$13fg4bUwQ*10woS=4G1tYtccngS8ue1#J1+s1W7NxW zuL~MACC{9$4KgrDHl%iLs{)|}=vtD1AzsM+eh8M#;E|n8&h^C07 z?s6{0)T4*Mx75#_Gf36ayDOM#IN0xrG6U2U#h^ueGa-Dj>h!p)324CtyCk@e3t=N8eA58t;IUy;?M|x9# zbj%#0!)UbBpG-X0Kk4VQCt2uX!PHYueN0yI$yVy$ex~t@tki#;C{l9c6Rp&LO@^ud zx&IlVtk{>x!%cMqQ*o~T4Ev1K)PP^^0!+=RK_hG}Z%3w9Gs4k1QkXO&0#;Tp%$kwZ zj{;*b0cOvUlXm!aOZ0`*odKzgZ29zP>aKuPR`$KsVSgTwB4)Ql^QG?fj}OI;DfLU= z{hFPj za7_2@kC^|M8nEKCtkg56Y9m%oUnCb)rLQBBDo3NMGBGW675cSryXeD`hI6_;qK?{w zQ0E5pqTrP4(9v=_V{(fGr^ZkPY6&`JaN2g0KvU!xoW2FNtJ)UAo*{F5Q0>K>5u7P@ z*m9~%I@-a&IoQmsnT3IA=DHx!eZe-8Eoe#L`d7w1!kJt3x7i+B!&z? zKbq4%iJ(v9yxh}RA3U|H(_Iwwns#kov4B8NZb3TDRI7EVufD8_H-UVPe}VZ6GzhA35XYz6VqHNOCab@>?*qtw>{j0dJuDXj#Xt@ zT|<|Q#T<}_AAJj5Divj^cQA58lf<@_%vGVuVms(p*edw|ekhH5t4}d*Y zQVFUfsG`s`vBT>9T-ejaj;JuUl%W}7d+Hn1Txh1)S?X3y!l7Bx?{iiAD%h8=ft^$j zOZ+RuE>QA5X=t|OTd4YA0~Wec>{{wm@$)J?$=L-92=joZ1n!Scz)Qc>(Q_ z8+uuiHWjvB9ASlR5StbDirB2MSH)(9z2;Zg0N zGM9xOkW_+Zjte~~c32gnpM@ThnvAGYvlv6St}ok?I`2GHnCYNAD!dCcHe>frNutpf;eH7 zCH4-nt6R=Iy$ z)0cjiGhM$gofJEWW?Kw8&qzW45HshJx){WvQ#YYXOnFY9lgZ!bWb%)niD{;P{Y=cv z_1`(=Ib+JBO?fQa6i8YT+J{dppCB)+c>MutWm=@ z-dgF;BK=UNeJ@hZkA!mUArb6EOtQJmP8^j~g7 zu70T)qMi{+9g_qa8F!1Upj0@jrLjE#IqAnGViRN2&!*-qH$Hiq6>4T*fJi~V?3K1G z$}&^PjtCu35(ApE7aQ9Zd`t@E!4({R4rS| zP+L2JT1Mf$P&@mixMXSz4_q*-TG~ue9qc%StL0m4Lmln<5J9~h`-D&@yAwoMqY+ce7<~vGiQ&_}z_gwZ^qusD}|jEnm(R>S;vS%1?%R z+p_fgXP<9u7QT-Wu9k0W3iUN2=+{I)Bf@${5+VJKi1^hqzzEN;mVriO`PDMWh+KFr z12}(eD9e6E^34(7vdsvx^wOaaHQ6f{ltL7mU!V%=9kL47vbUpbS$^A`XL@z6?_P5| zjvDT%PhdwHsZOs1=? z^w(sx4Yf1jn-jqPD13udsPh1>O2Ri9^Kx|7@J+^SRRwdQG2cUP4Bz@QPRmKbXbY!b zk&k|&hE!n2nY|u|EhRlI{mOYTUG-@**jLFlM9^~L?Qp{4QpC^Masf6-)pMVdb7dS? z&y%YS|B9q~zSypk(Neu&!udE?HOPit_z=6_QV?me|!+uP>L~MOMyv3dx1<-YHI8&>QwWatUOaZBF>! z-6#y4?jAtE3USo=4Vi@>FqcVJpmD8lo!r1s@}&~#*UJoRshOye^aUr8r>io0z`pe@aYpS#L!~bgJFH|@ zO~1Ve@gwR1T&<)p5!*w@`v~D_uDGA(evdSA#`VI<8HF1qn+p&%qn1RqOvPjriS1fB za{sR+qi(wxBE5vwKBIIGOiOiX4!i7M*skha8+N@y%zZ)CY5?r|?O=!1D??y67zI0` z&c~dd(QpB5PrZWzXEb^ec9xnf8K1WecCIQ(f!*Y9*h$q1lX6DWeDvWWD=7^lHwMG< z2ks97Vi%*NMJbbP@h3iUd_&y%Gs9X$Bi!mU!qrdJ!FAXb_V9l2PFF)ar_8op6e^y@--AGDMlpp&1m+NR7Ywt2}h(_jCWEI z#yfLW_P>7+=Ua&*Ip!jZbK;0Zu-p<%a|2RnxkYMf&XiReAk0W55-bO#GXL*1x=64j zB=vhvu;h9+iScLSNWGsEM>0Jd=a#c^q&?1wbFM4TN*rmBlmE{+1*k^9+!BBy-Hm>g z=6-rMx-{iEN&ZiC#IX^S6G0~`$r#xNwz?0kkTFU+Cfa#*XZ!?EWS=8n!>y~DqUH8G zXhw)`=)jQ!jtn11k3l;}4mvWf0(vOs%g7-UP3tb0V5BTZMZUT`J@YDUyfryxBo-RU{j?@T9x>-8E5k#grC)X-S zMydro%uU%%Fabv50r5S%3u-8mWsdt}z6deQn9sIiUn84jLnSU%urr z7AXl#M}QvD7iW~3Tr54iCq$VEu(ffs+_;(Qr+(ep)Lkn!wx)IZQq=$)xyC9P3 z-)A!pSTXs`s)`H>w8n7OEh-Up2ou?ksWLLuWM=C*Qk54N5zsTFS%(>sV&$ZwDNAZ( zzl;P_U3gw2M|z{BE;|o)uGp^n5S3S>Pc3rW<>SZ)(jWV&*)dp-1YSfc1h|8Z}(V;T)E%Ya6a%-5$$;j5s)nCCE({9Rg zTD3t?q4bWNSJ2ianRUZC@XkRRnPo*t)l#F;vop)(u>FK(JUcHc<^StXROPo32auZG3Rgy&naEYxFeW~$u-$FwO|&^8X~aTtG@ z)r@d;e|VjlW<*d2QLC9DdzUF&`qC<>uq}zk=AgT}nIoKgCADwrBVeSNr7gW3i%{k$ zBWyhu4V*dJ2uF_?0x`x2{1o1+=qs5QJA)-P`8HcGbE0Eow$NWeWKL#kttHkJ^Tfi{ zVM*XJBZ7KGHHfK3g!Mvn)XW)X&WY&nk`Ob^G?Qti50WaI3_EpfNcMS~oHE|j)E<5=m-q>#&0QzxUNa&~@07OL=t$nV zUV-%W*G;3{gWqOU@I~MFKYdd+jK<#-tTM8}OmpRtWzI6poSxTGo*Jqr;g8o^HhY!| zVHkNmrDS2%7p{4|1SU3E2DHo8yj zpt@G<{bGmJ42g3Tr1WJB}qnW*~gHZmS4V!)-kpf zA2)fl6)m-|K*8{IX54HmT4u{hL46X{A1yZ`tYt?Wt!GPxMfB&`RYmKYkt)|VQmWVk zgKqA=b4fR&#w#Yl!QNXrbGR1J@hTQXj=_zUTrYTE)lBm}y0CuxFujwT{o2KGurf zXhetjOti>N#_krM4tt@o&)2U?S~r{12kK9ULfm4+ApJEK?dYvW4AzHmjSyXA#1JiO zWOT6+L$xfD(c6r;ATFz9^mZeL=@q!TiY_r?xSozpO?0UdBXkmjCVGbv7wS=152DMA z7^(FLh~-9%(t}$-+-byUeZw$_yNnp4SEfSTZNyl;6jNvP9wWx-BJ`W+y>>DB#{_?7 zk*7vxywtFAm!rq^3B*QAu(=3}jg|ekWv&Ec<78UF768}0v5Um^hi+`53|&usUx4G6 z&MJ|Ca4Qy!*rcOq$aTs^$Ba#pE_h5mDaS8cg(QDB4;Nz7#QrN!=AhVgvHwX(^TlR} zZP|%aRS+{pxOQSbE+b;Ir1gS!VjL#H*cB2Iu@mc1|FPL3@JOWx3LLxgXLJcXQn?S6 z6uU|Uo}yfb4j8*yM5UdmUkhT+hY(%u#AS6L=8EWJCuT?q=gT@c#7;Ep1#zt`8x!nA zTU;Z?u9N-$BnVs>$F3JK)lSG)*T-&<32mmGxCIMg>_!o@?1c1<*g_GP+ll{hk0W-o zh%4-beC$>h?DrfHpF(B65e(a@`xz* zv6N@4leigI^07~32HNH%PGhc)eJWyylaO!GjeRC!r;`|u@fq7GVz-l+7=_p+;wvX1 zKiU)fT*N*nQHd!(wp(iFkdu(FpO1Yh+n>Wu;+rCfuO%cUkVu!>`9?%)AhEp+;#(0a zkSN1M6x$~v7)U&i5gOYsqFNv!Z%f1uh)4@0?o2?K89W?F%x?;DL_#8gL|f^)$3)Z! zBnF}MvF}7=1`;hrd@n)=65nCXiv1wM3nU(q)P58Z4J7tr`HTH5A{I!DmwGcVBH%J* ztaPO6_8VxkWWak<+A+(F*Q$W$O4Zjis$IZ4iB1s9F{*vQQ<%47d3O7bc!NIRbrWy% zO<0$JS50a>X~Mb&yh#`{u>zxd2CyK=ppP|6#So6ZW6SlN9^Vd5zH8=YOOHi1(f5pS z^+B{lbgNlQf>!MBEIH{L`))bumc9u3mM85+k)r!}QY05*zY#$zy)oJ~dcb59JB5KV zJbK9P1)BXz^oT9}6i?4PA=WWlW|Lri>ZO>fe=xDadbBwAi!CdDL@yG5el_lT_X49W9Vy>@{i+nHwMlt_9**fN+ShorP=_!xM*A7D zNPj9TMt>ugXxaEg2NpM>sNz>thIsUdUoygh?hk(vfLAsAt3L=qP{7XvH2!FIW*B>&T>}$39vRv6Jy z-z63HfVmgaRS%N}e#D&9Q|EVqc-l1m5Pb=z{iy%?*zow}V`o@V|Lw66x_?`Q_%DxL zsB^nQJnu9>(MIXblE4c_Owe~>E{ncs#8jP>re9~oY`w8M#7joZ*GDgaSZ}Iep?*WU z%La4NwMZvXRnbqKeJA5&T9WC zE=umfRGy4q+!g`K!#WqAAYB&$;RfiA@da}v;04UaakHRXY7-hZZq{>Ky@OdQep3+| z!c}iXU@sIqXyqKoAWw}8yKIIPH%nAdwXec)vqDuCyd8ajgO6<5AgZU!b8k>PEEH@mz#t7*VAs$T<;P8nmOn zJ`+Nlke*ulOgzVy4%f?njb}R|nciz#vHtKc7_YMbz%hNP)KWWhX=v$bB03m>dyX%l zW8}tr+Vb-(=1Mc(+t~hHPd7K5?dCw5?w=T_);Uv zwS2{Re6n$-!pw;A%goB(SZ7Gx&oOItrLHCwG}o4SuS#E;gt*3tu6jv21g;Db(ntS{ zDLy{mh#^{THpH(rVwA2c9r=2b&jei{9xO0olFkT0++f619mM7=exngHbr;MA@n?*q zv$Z!2Vzm)-biY0jYfRzh>tf6n@n?;ri}W$++%KD&TB7InhFEX5Osn-;6h6Me>`K<^ zkFmpuZ#1p{f*vm2=XE1q)N*MNf5VpfV4c1(1>#L3Ueb$7AU2t3FY6+#KJm>)tT%6F z#@{kxgKpddAzSSC&{iAuzf$bC?JpqS);G%}@{Vz5s~&;LC%)B|%ZY8enN;HYrU<+B zk8;k3woHp(>G#m~@oh#N(@)E+@|nr!cikOpS$wAvC-u~>5WCC%9?etD4nQg$5iL-sE?!PUP>{T?-~71Yi8KzwJ*YT#kl3#9UNH){EcV4 zlUc*2>hJm?q_bJxX6kokHt%A@Y`sJ3w5t(wbYE$qZbr=4r=-L5Fz*2`Fjw#K^BuW7 zUuYF9ijQ(~;9$1#f3)$x=7e$6t@s#6YNn<ui{Qpc-ckCPt)a@FQ`urC@4JE-KVhqK1Z4+4c%MG@?aFM}OXucN$K6U@SZ z=hf(>Sre~9fb$N@oW0)UItRTmdyC0+NDO^7`=iz9c*?=Nk-c5+&*LF0#zOYTV!P_l zK-fFP4l4O#=j>1A-Fdt%g`Bc?%JGP5)C~46u|2gM%U$;85+_To83=p#e%QHcKbC>) zJ#sv$E{9{;U&`?!^%5qP?62f_iFyQMJ^Pz~VVA3}C~fvWIbNX#p?0$Oi``f)#@Nn2 zD0Zb?+j@y({~u*d0|)bJ*XB-Bo>#!e##;c2D&z%AWm`*nL!O z48!c7#U7yE8Vvim_%=kXMGI#CD#wSbrBcSfvYKKCspR%*_9=PccAR<=%YOFh{;(&g z`RIq)|495v`gkU6%btROse1Yd2-}F6I$jeZU@u0;`TF!g z2xY_qJrYAayPCZfAq(|!^!@DW_A!V>dJwv5cEtV}CjgOh1PWM0TM)7~)C&a2%qReKo{ttt48Jy%J)r zz7%tJcB%au#5!F&8=}lU46#9fF9PrO;>uv7?j+@@XV-<;q+i0Cp54&y2l2Mvj`b_M zk$pA9R{gA0TNhj2ve>4#Nq^{NKZKASI#L6oxBWiEPQ4LD%S$SgfBEZ2Zo zf>*;1Nx{z^*bLh|YnHY=d(gb<`llQ)e`ICFxpHZWx6W`lBn@mLhvkVtSVj_p0yr9y z_V$B#G*6C7%m44u|2^yMsf{I)^n!CDG25Xynv}GpEBL|klU(6T{7h%cnbH^hpu=Z_ z!g9?Crx^$)gpEx5V4e4F~U*TsHx>h1duk#~G-JLDc zDhZN4cutVnbelh>@T|AZ5>qhG)Fez_ zxqZd<)Zdt5a?OKad{kjL=Ih)+Bawd2O|_9)BKwf!bqYQv{HO6&j(iDyFz>EvEf6pW z#mu`~-njCgUgzB-TPM8UJ-j*s?v;~MgLw}$k+_$jh87s-3{ z2`E3g$CA;r$vrt%;ycsOH}js7WKxrPYd!=0N32@ohoU3oJ@W^YpWJGB z!OQnsl}}zQxAWG??P>KK_7!>a>9G_s z{X1`$6tqYM<=oH3E?1AmV1FTnYpixkgX|W2Kwcjy^d7Ni=Jk=v*ek9rSDVF$FXh~w zYK&C;S7Lvqp2axH`&#TnYBm1meIxdds=FND*BR&jo+!iSG4Fu91Npm?=m>Z74w^y+ z62GAHZkz_Y_-MwFbzj%x@zPtLj`ndXkl2C6~HI-TNa>uQ51k)sml=isX-~ z(FVs0P(Ash<(XAcXLRZOF>=(urBDFN?=SunKl$*j(Mc;ei4*3h=1=Qhg-o-tN6R-K zAVc|Zd5~{DK!zy|Look}B18?U67=o-*%Cdhc86eJDH-)tBSyf!TH*{>6R=UrpCk4t z^`pd}EAhvv3`z4Eu^&^jaKW8FPwYd931ZKeYQ;0U*g%MDMO4`4AyWPga_NExcJdG@ z|3(q5Z1WH)|0WStwt0w@zfeR++dM?dzgYyH>&Zi;{98oyv=i&4e7DJjkB58>Fs0?+ zF8!fTAaPQ}9a8fH0*R^UUHQvI3=AYnq`vPIF({Deh!K{5mx#f51|(kJCy)Pz1QPQy zAnq42JdpUTF~kERMgVxG$1b~W;;NKMFhN#yTX3ehSxktZenOp>09_u8c2Nll&G zam2f`W5T?ZBFUHtXRM4{VatD`9W2l?f=sN3&mOI^oJC1Yz*FP}TIa3~Fz?!9VXf<0 zYFYOr*AK-J^Vm80ikxGq6DWG})hz6;U6oT8_G@CN{QiJl6hThr5dBP zlW$59f~rwZ*qg+zrYdW~-Yj;S`Xe9qmLk|;CBKK0d|SpdQjdJH*aWKVeQxeo_QGSDoq#d#Bh*b%EHs#4b|9rL_J>_|zxZoh1EF z@Tr$E{Uptk$x_t}qcwRzdT64sR#*4?0frgrwP3J&xX<{7vHYRPv@;@^|U%ebkNUeaVw@ ze1Q5{j+;BV1670Ou+5#^L26+q*#AkK!8$e^b~SS^YKWG1*OO`HF4Z`FDcUm`GB=1O z=mQv?$#fGkNso|nX4tE%p5h;@)`a^mR8 zU1OcvcSM^148q~A(n~G%D0*+Ko7h3M2tLHR`@Q$y?y!4_ouwW_?~3&nJE`h6fqlN% zB}(q4#`=m~q2v)#Y=GF6N}esn28vzf4_NuG1{O5d50_Mr#k$(l&}_N_e`4Kjvzgc9 z#M>Tr5zceG-LMeid~ntQu*w0vbxY@`wMwRtgOlo1PbCzLui-o6%PT&PDhfS6!zSFX^T0uU38 zcu*h1JR7^zh?Q1`Jh_%LOm*R*L5*ZoxD=vm5W67R=zC({NA3n#nt-4!UcB z|K3+nZ^gn;aJd-?)%0SdP;j+r=&+7pt|++1Bo@)1N&@ptqj@?<3Nqh_r0!7!ajiM0 zT;C?HU1#dALfaS$1vi+G#=2K+h#O6Zs?^&t%nNQZ(OT)Q7>fl9jcB9u(Y*_9wdIj_ zm3{#|rC^bHxHCcDTmf;LeIkLW!IKw#3+^zf<+|RR*d7%uH#1Gr_1?n#UT~KwQMv2Q ztq$eCEmhC;zQ8CcxYxw2aJ@6VpzbrNv~s=IG2#jywm(E`RJq>R2-GU$RY%u*Z79@g zqdL2uyqQz*tSztRbalM~Da;GDH2qZ9Ymx%>qRC-_>&ePh@RIRmiR%q7g?ibjrLNaP zYGl1pcevgs;`Ihwy4P~o+uR81HB)u>xL$MdWux(P1;V7lUpHYZUGHvWTkwVnd(8D} zihA4l`6RqX4=i}ksHa`8leFgtMy+ph2As9={-YhAA~##F&>?H)2} ztLq)ahN$4MQQKT^PZH{s>8d+iZ}c#z(zhLm zoou;#8o_H%NG@48*WM_}$%}P`^URBNmU(5SaK7=~)zecEa;*_T{eYx>oe^R4c5vbK zwt30j%G``;c&%Odp#2KQj_=+|6VcL5Q1^uoGrfuEOofjyy&e+sDASX7whA9JBBFPo zRtg_C!qYdQNeWjPk)@AEA)YWI*F4-TeA0-dylh$cl(CDnyyjK-v~i}yydzxrjA`H} zb*Uug_w=W=yZ~0X#)Pca&tSzXeAcwfv-+7Ti06!WPKVL%g=>vit2Mer;qyj3uS-#T zg)bQKg07IVy=cUX`Z0`!!gWTh)7RC9@Q2Au`ZU&*LVuLJtT##9`GaJ=J~aelgE?n| z9)?A+@D(Fo(egy3@KqyT)$$RA!q<#=O;3>!|C!uIEgx7Y^q?zfHDq`wfa-?jhFwye#1hP3c|wtW6$t1c3+x7tMzd-WffR14p?<#Q*e zy*LI};fMD7XzK{B^Ic4<#+G-yah)$+bdQ9I#v|VHFqVPBuk7lWWOdi-IQJWqxuw@& zIVk+r%nGhPA>}$^Lh#zvgA(tkE$PJ0(^yjqf418pf%wFWtit1F5c+Qd7yfEaajo<^ zb#TfFyBA`mxi#@OvoEIGC4s^}>}4pJS&R$+GK;aL_hA!Jc*;Lj-y$`C+LpJqgSs#J za^c^mSA_KvsoyguT6Mh;!@AHigEd3nDh}F4MD%j$u#OQm^rXfR{^!Cn^-p~vTt^)6 zbZrSqcjPtijrt#{#p*`9uRo9mia2?wy4~K6AVdvE#%9F!T4Fy?s2zFexykX`NqU}9 z+Z=B>*5$&Od9h@-<8^Hdm1Vrx>v*Lod||dxUpk%{yg5dF<#;`$e<#fAHTxXzN$G1z z2UD1J%<-1Us32KAg#G7uw~1=($hG|$$LoSMp|FV~uSDVv!g{Ev!lvdtyg}Gis=t{z z5AO_K3kM4;ouzOd?+h*)4AtC(EeLpR%b{8rbwj|b-W;lxQ8xy>zcJ+&wsEBUEDU(L z=}`XD&qV?61DQ}dn3#(L-VLba!j4AWhMOzWW91b~)05LJXDT{Kt*mEpB+Xrizp*`7 zt{WHKXE!?^{YyUQUUa`L-zQ}07cl&aR+u;aB6=9QcF_a2g}gjH1O+X6(EbXi(+9Q$i4r+C3mDtekGBhH!N) zpLF#<4D0>x*Yi|2wyWd?{OZwF@JqgiK%9-umF$a_*k6G9G0en8OYM1xU}^a*PthGl zxOzk`#4;m-`k)K3+=#GwyP@b#BO>M%ucEt*@XQMhMRyyKWfeb!G}Bzk#@w=(l7^)Q zaqz&|gHp(_yuoocpUHmARdyNdU2?o!$s5fnpNm~j$ugSq zh1m7gGZEN(#crVFCASoFgIig_QZrMgXgHdn%})X@g8 z&DC#fH5apKin;o2qpra&D&?;tq*DZmpRYfW+L7ez86mGBOLFO#V?@-x(tJT;dUh??SJ}hRL(?0>FW9>g zC(SiSCJ)DvtIg$FdTmU6wddIPNX**k%C+a(6=KiC%v<{!8`Hj(z7zFWd!9X6>?7EP z)xOT`&vNd>ai>nr9;hs}7ag!pu3RZu>NwJ=lMoyCe80vZs8g#B;^d6P^w709s{{Ig zdJzp#T+@%g3GH2+W8$klSbU02I*#gs5*3?t0%|eRFV0_wLbxi5&Q+WgJ4LM+0J~7e zVoWaa4y$|8Vb}f!aU$vx)NpYfu{~9YZEbOhoSUUiC1KYUJ6pXV`Id@ZQ(ce2 zT3jx6jyiz4Dy}DXuIdBFi|dP>P&cDZiyMfYr#{9?R9qo;zRJL$DQ@%!?4-K*0@&w? zU7*54VK)}LP(9ibb`yzTOASX$7B>~UNF6~X6*m*Rw(8#qc5|`os6R1)id%?XtfmgZ z-J)WjJ=jCVMqXE7V3dqpCwbLD zwz+j{J}!A3NJIVS%DI->iPo%}5ZhMoqAYbyk9E}b7&UcGj}4esu4{U%tKOIRMG`-# z#$sKqYkF*0m16|?c0{#C5A`T?$d0gbz6t7+FQ719yo(H^aBmLE^Ke zZbJ_&9U_NuPo+9q;Rl#z;_?6DBxM{5~>ecu5_$4rlr0@ zm6VQ?^IcUd1NKE?2bIPQTsmItu)0$0i^Yy8c^j;Bq7=(h4hB}~CE`w0)sl2B6+5P$ zuLgUP#EGjq7;vSN#m-WHhhR?;7qZn9Oh2Vl#m-SfFbGPgNt}e5hLx{$y4ZPYw#1(y zcD_2$0`^R?lj@M8EY_ZE!Bk})AvCGwTY^6%C z61$$t=>Yp`@wvY0h#pWnSL_Dr-lnjxkvJ9VUh!d`)Ky~@YX$pyIbNxbq5G6BXbT^j ztCw2BzTte>E!4f}L!~#0-BKOJR-^PLv0JIuVb}{LervV(JlHqO@iyv|_;ZWcZPgnX z(51JEU8V4~yH@EU@u!{Yi@&9dWrAt1LiJ(aCUysPc@^v>4G_Phsx5vl72kTQF;eGu zjKuLiiN|`uUM9!8I*ETJV7Z*!%}EqXiH+#)BnrgUJ1@g2J)FcH(#`G?G0{mZ!0c1{ zkcgX{#HAuuig?^fEXJrTeObg7CoxULdJ+4bL|ppj8>WK=64Log-xT2n5^W@8lL&mq zsDYGmvj{wI+$bS$iNGg`u8^AEA_5-~8r~e@Z4p_4#ET-{5s`}zDP=;uCzX_hNJ4BC zQ4mPfzyKo#`F1=}oh!ugvT#V+@Po9I=6i9q8_4et95XbRU3@cgbuJ4g_ z#7#URt@gQyEH`m8=F-wHqzFkjkt1!m_bARO!gDOlzNKG^JB{7M+!2HL zR=jTNCa#h?*e4;)+(b=jlKmno-Na5TQKbh&Gq{kkWlJ>+*BIh=M%`J@4ZO>|ad_cm_KdW(1RXWqibF|Dtmz~w=e)znz zI$>pq2a=abKf~8jmqz1SNWz~xtAoCl8uk4#e;wcU!=&cU3A4`)lcJv+=AV&{Ntdyl zmt__@_6K~sjQ9I0TnKQ zZB}Jh)y3|i%&f{OY82LnvUUOe=c>M#4zr}{EwwNgcDC5A`W=&2y_#YN zm5VjLUXIvdwF47;yPEONi~MC5>R`iJhg^VM3~xFLtili%woIDRxr5T@1TG z>>^buX%>oIqOL*x)TI22!`K>L5N>$ZOU? zRSoNIy@s;mjHr91ej15Cp2|b5);mw^EH%6Uc4JBN|Iqd(aB@`T{&#gIGZVJpdjz>_ncq#^aT9BzMuF0`;*MKPFHo+sk1!id7kr}s=4+5y%gIk zxqWbb1NJU9&F_%<5y+0krun_AejJ@}@oHXco;R%#Vqo!_e`o$@oq)3~KK@6{Kcn#$ zo95@ae46GLslTKR->;(xfi?``wD?5k0Z+p?WHl1&pT%!?pMEX=9<&;bqCR$Sa{#;> z^&a~&uZZ}e1F(G`wse@g6;f8(`2gi?)tlgD`V&!g4F9_4nV{_~J(v2XE^Y4wlR zVf)+szPCQX6bXY_39oxRUb_t_LFXWbI^Xc#$fEvmn4y=TQ}nC*Lhx)#e8i4mD`c}?aasD zC=I9ApU3at;P*4?zlByFdz0I{)q9=T{yVpKufK(5@fNpd`Z(N+c@ZXN`Bz|Mh(#@@#urVxj+iwCC7f zmN>@uS*(79Eo+H??!HJwEwS2Pdk7NySYo~3!Nk6nX!pNci^P7Gi2FaBg~a}r*y=xp zZWcShvU7(2{ezG=&=N_%ZW|H@St8}l{v#V&N91Kx(!P&k&w|*#(_TR>*&2=50k-Y= z`_JJCrm=LU`w!0G2`n+g|2n!rY_26{`Ej6$p_Vf>9(>`+ATR2(NjX&J9wn1MT z3T2N}B|ZBx)L?AUv=8EtefP#)MPkQHTZR4p?;-1BF*_$jZ4YZ^$+Uy8XWyU15zi7k ze)_{19QJEg^IEfrJU?KoTsPfi_qXWCu@fyZ!#^I9CAQuUo8>>j_StBO+5Vx2Bhh4u zIsU|fNHkkw5C1earxr`>>Hh+zQLNPxd-;$YUaZX$d;9NW4mMcA_x}r0BGzsfjrwQu z1Ra*xf4|7|+q2AnfYleb#B#r7ZzTFGvBJL*<7MnLORV%uEZx&BvC4lIBUCJ~#IgQf8<04| z5_nWhJrYSvtnpE6UMyva3H}(*mbJuM{}C2qzh!it-*p%g z1GZ>TOyn%l1F z_-5}XQG3`G`ulrZ>Iyc&3Z$t<7 zL*iqW@FLOS%B)Wxp{e-1vVVa6Uh~;Af2hUfeFyQT48c}21 zfAwT~_T%Wxv0J9Uj5?eBD|Xl)P5&vn_r6C!EbkfnkLmw|WBn`l#Ez%zc0B*(HY9%P zGUNY+iKks&{3F?^o^e_6W`CBg{n_ca;{<#6ABstdnXwn9&nn<_Utqs}c{&5ov9xOe z5`VCBPxsI7L*mWpH{v%l{Qsad`n#3REdP~NNWkHY?C2KMtx=>@eH2&~KlG#NoE*82@>8z9VhV692m_kwunR>T}&x>}X3Y^Z72Z*fEw^ z?%zzY8MDL+|8E$9Vhxs9=^w_HxWp2x{Oh=9sU?o}PiLc8W{K7QwY=zZORVv);bAK+ zah$)FU3rxyj`t5wAhFsKC-@KWur-!g>$g$19dC(s{#%rkCs^V{|CF^zthJ(A@9#mm zyUr4g{?)AE^_FPzZ)0<5v@&S%x3a}I*$LYH$JoeQEYabQ9fL%xB~J2x&8ly+6KwSF zU4%rp?dkMC)QCiHEgMDLKZ1>Vb1j{J3IBUtNNlNP)7k1@z&bs}65ITpM<8*k9d?F4 zk2=a}mdN;TvBw0K81#=|!6z*-k~NOI+c5Nuolj<#25UvES>W$ahHDyMfwF+@OS$+@#ZeH#25XavZ&r` zhu!1-pEX&|B+jGCa2OI3=miUVQ zGTYnxE%8}*zwkeN01_Xz9Q@KBJqd}A*q&ecf8uRl zXNl+iN7yW{x5R(@kFlTLV2%7m|F<uRO+EV*RqH}qc+bwlKBsz@$`+FcN)nH>B>gD;yMw zj`H3`_SF zW9K|95^ZB||B_vAK_vP*yVSk5@9;?U>{F5Yvh6z}5)C+}-Dmrbj6{8w#QnB!VI=x~ zp7SfVZ&4(=W^bgviV07+P9o7uAR%H8*3#{;IuiXgyV=+6$P@643pSpIEwvU;!(eqi zVx_x25}m;&_x;*K(4$)-(e1dg*bnV)&xk~KaNK#KHimtfNc0u56ZP0dpQ~MmBVVhDZaM*}-_&w+{Yy>s_Y_nw)pj6*GisyVl%l__rCUE<8{M0= z@^URr1X7mXjd7SMl&Ws*ImH+rUj_jqG(VAsQonZUQGo$D3gVb94-RR8d$*i$;wr^}^ z^fMGyC)&R8nb8|Lu&lS##LVb-{*;iUDb@t5Ye3nbA zrOufdUD|?Fo2Aa38ReU7VjJq%JIay3n%j~3S0Hd3GTfe4e>_U3 zA-e$E(=BGYVelp#KEqNAnO~3xV?Yyf*$5hT@ci@Ym%j_!MQ+cpA3&>bC~^Bxo4sim$(`0d$TJ9uRMT-Xr}=Q4(SN&S61|M`ruS>eq+8y)^EOnFQ~ug2yEZZ?IY^XMeQ}*xd7XU;)Yac_#D^v9#g+)Uu=JYiyxQN*RI0$-MoVp z^$gH%_#(Gg)-Rlo?R&Vrs{U%0=>0tB>iQy&{|di9uKoa?=WE>i+Vr*L^NK5^HLiRTNg1>F8zn?Y#0*kY)ej&@`f>Qqg%j6Yq57s};a(dyWLWk&yE%rAT?pB_s@=A$9(Rz)D^R%A3@t{a1q*9VIS}IQrma+?C9&b zPQ&{xbeK1nbMV9P?7}wd+ ztI=W`er~1o*zD+c_DAX$7U=T$?C1;aNd3~v^V!+aFS3@Ox9j~UCS3l?+eG=9#CrQ* z-vv^#Aygfq-?2s5x0+(9+Mex>cE4tARsCAOfo}qtX5EFyEzk9H~=u7Ky8;cn662bH|M#0Ep3`Xe0_#e6PMI3VUCLSJ} zO|cz`AM*&>U*!1NS7DERj@pDuiJW0Snqxm&G#36SsUID^55#RGHJh>^vT3oMB5S9J z^m#|^gUm;^+X+zKxayraLCmhY-A*tM-@5A#+m9NVK4Kvb9hn_RYl9T>7T=5_iIiuv z{-<4Y#^PV0k}Juf26TGwhdXgwk=|+73@wRlnszR><28SX#GzfSg&c^y-*SLrKn~8D z2y^g$%fXqI99(HR_%N@?mJ_*ZHp{-Y245&o|6+Oi43GFZdPL;v*?jN9v}+QJ7i~oH zn%R8Lf28jidfXx(m`#cE0DpWua<25RnLdDp^}*TCVqkm&>7{&5V&q!89EH2rfjln1 zgEjWa**76QKF+~l<+IpCBlfemTAY-3^Y8A-Q(E3OSX8oSK{lm{VL2c^4Wk^>wR*{5Ady9Aaywow%&1~ckD*2 z42^u4yCT;$T;6m|%dtD2_}jzxe(ITfe|_pVPG0lsUay{V>xCzN;K!%Wz4N*|>Ys|7 z`rf@Cx_Ie=Z=O4AbNRG~ihsZRx${3=_v}Z@uYUBAM{*zi)%!L)^vbtC_Q)QO-#lwU z{+M4czT=|uNzZ=fu5C|W`ubS!rghg1e|zcej~!Wa*LU7?%Gdue^Jm}QaLuQGyea*? zx`9QDq8IOe-;t~59~66I_?Rw#_UgVwY4_~cc0Y40_T6t>aPcw458V9X*KgU_f8gzf z_iy~hCpQg!=YSVK@S_EF*Z<_=m2+MzeB#VK_kHBn17-{zdr0Sa`;qrPaMy}^X3br5 z(j8BA_k8chQ~!{U4ZeKgzm)UoPfbK89=mA9wC`N;*S8+J`Zq)ITmSsY*B|=*#Ex(8 z#g@JLD75$8MybuMxeJ1M$+G${qI72b5GAy_1f8ot4A&HjgD=H*m-WzBK7Z$Pyj z&6eXHmvA_KJd1y(G%~iH6;oOz+s+E_`02+3-PHfsWG0`;;2rnn7*6qfHkVoK%d^T*zV#wiUwM(eB8SiMXV%O)XwK&S_KNJeAG+?oUd^22W*$GY14?Gi0&nKb zb=VKhQJd(ewK!x(cu1WenK_e*2#&9xUHS29h~pV6J)UK^J#ZH2u>{jI_lX>N01uy4 zYx`&GlC|79XCLp#1JJA^kq)27>^UFDG~nlWMI-m`?MG_n%&f%~Yq{Ik74chMF+m#*YuHWXVpwVDi*ZovTiaLywqDqS>(! zSy~IHhxcSBShNuJ!w~YLVv!RMuzIdN@_@Y}d)KYs|07LSCwOzN`@X}Uwm$^(ipeBe z$Kt9a_Qt9X#@>d@E{vc_EyabGT#je*OxypOCLFbN@<-@aGb5Y#W6dp}%tD8Mf?azB z4)#{g#3}Fs1st*}JRcLs;w-Amxfp;}>!c{x6Aw56EoRN+RooZHRW2~|NF2d)9AEua zc-0dsU!p8{CQL@dZovPD*GnwH{~E7w9f#G*=V)w2yf}g0=1uo7xN=~!59En=0{%yA zw4Ux@}i+HCJzr+6; zZ)fBtZoFoRvu#ZkHk~fPFC*T&EsZ}sB}bZR-jYf#S6CW1ui6WvV~_%^C z+_vFVHnVLYonD+Q4lf?bk7O5Tld0U|6~UUt%a$x%xnud_@!ZJrW!t9g-j*9l4~=HB z+lG_r!Q4pp|Nn_fJ4={I_-AgiluuV~N;jOsyH)?WAOD|9NcZ%=a3+>@zLd%Sf6P^~ zkZULmCCmN!;_yG2i|WE~)!IKkluPN?D3fA2UkV#ab5C!gbt}HYn}z2h&s@{r-7VV0J%$yAV?&~3Q#L(Qtd#*4{9ASS-S!zBRBa#opQ z;o=gN-)2~|aL81?VE1y(2;agkL4Sg_^MwN=H8UeMb5HQF+^MeL{;r!g3)(|?#4itw z_)88sbXrZ-cfY}R%MO~q;Gn}BkEl6o-Vp~i%*Ur@_t?6%(`Hm1_x^(-{^Ew3+4E|~ z=N+`5X7_nDV<*(iI_a32;=GzY=N)rsLqpAuSj`@>rJY!Dj||lGTMlYsCoOULsp~mp zNyFO3^Ovsey!g~pPOG^-^3`c|xIhujoU&pl3jr|*EhXa(qpv3ivcZng>}b|YC5pL$ zfo!pHq?{cYN%oEB%IQI`m>qx^DDEsk$3dcmSAjO;t+?&Efx&F4%+mCF`}#V9L~q{~ z4-z3el1vR{Jv5+V62BWwmq&}J>P*%vCC9RvV7!nF3dvHbFo^wGFFTUPxyxRDd?Z^8 zM$o>!Z2xEpE#11BRk$}YIt)3M3`X)nX)s?b2c@ArZX!3FMUIl0Ajw9CpR-?k#fhMZ zMre60;)-6XE18au7n{+ydPcnF_Qvk+*3Mu{M@ypJi+64AfCS6oFC&LPHL<0qcVmz^CEn_7EhmS1`uj`SvRBFtj8G_+i`kKZ@?elj4S2x_ zWbI&P2pJkId+4dzVt+E7wQlK!`-0Y%=Efkgxwok&@H#VvbOJR~@*w-za=qSCDaVqw zZwI{%8?!rGpfUE9ljU4~q~w)WH0?wMq_%Xlbp$Pt-s!Rjv0FeTu?Qd=i^+jthnF48 zj+BG`q2xfxEA*gS;tcHKUQ2EuXq_krah58+96-%&+Q_Y9Il=PPsR9a6h-WpGLUL#* zpGMthYzM^>c6vSN>cgn3q-#N55RBr!R|jQpG+8KR!nRQ?qZN7RkZq$QX)kEX=ZCyh z??lsRX(vQTe}69R^`(;|35;T1shmm&>14rUyD3R_d-1-Ysi`+R&;)@qT5t`p(V@v} zPcT3HQOVoTogYbOy_W1ya%X3}uM>xPcLL~C!*(%RP1-I3_%=?)TJ zcY9ZWmq-UoDqBlE45a9Q0Sa)tR|wMi!p?wwGeBLTz)^i8qeDYWy!22u$tI0O7218ArvZ%b!mchJ<_9dvZJ^?12#HjA#Z zbRtOc_R#r8ms$($&8D-+0m`;NH{kWQwOZx6A47Vy1g%@Wszzl+5wJ!^ zy_=iSaaz4pN2x2`JeWhdOaz%?9^+uf!yCl{6r9(Y8$mWYSc-hsUe0uuOco`+!wc9G zARO4-%NQ%zBLXK;AVm6e=pPw3?gi<=?Iv%EUIwxvkK)*lCXDXbX&v4Rs`J_0)7{pw zVRLUI8-d4*^fp@gpg|NT3gelShv7K~xdWN#BpfuM;iT6$S}33+Hl}hz7%)8(KV5MQ z&cU(`9=p=gRp?8-TUn$K!a<{VCh7+F0!fh_z`vE4#4VtgP!L-2q1zX8*j-4)mlaqR zRaIA*Y;|@l?s+I#9LN^XsW3*Qi)j{MX*7kdAEe6@lX5=DmGWNq=6yjRd}1-1XSp#~a}yO}upYcjpFacH1e9vo)3V0pK6x&pT>S|RpsZ9Tcm zjTs3H;a-t+ZszkcI3(=nNc8C|xOzkv|l*We!5ANLg9R z_m{_$sG)F7$0!dgp`7=IO9PN|sL{!);8?sW!#x(Womqp-~~5L9=(oUEZFXY&WLX3=HK{ z&;l$+Dc9Nh^DUzoX`Bdf#g&7mpG38z(Lk+2$0|ZBm8fAXod_j6+X33lq*jf~mx~xC z(E+5Mc@zLW{SYMm$sBehu#4&f`e8GgWN!g|){SJ;h$u=EgW2LREF9it(0K9&WHghV z@X+joVd#bIolsxOOS@V@GiZ#(#GE<;&2nO+-^c>abi{bCtU4 zMqxHVw*Q?ajFgbxxGM-c=xs@qz;JG8Ckv;!xzROuwlC}ag{IL=W~XWVkS7BWY|L4S zKQEy)hNeopDP@H2=Zc70ZXd)>b6bzQCN+naMo1b{1PeVQ*?6)%h>NqWEei&U`B4bH zTmdCMwb-Ftd8nj}mrM_%0hR~z885MQvYy$5k*O5gC+gSg7|F@1Suv$*c8p?3GeHKM z6@w99hK4sy!77KkZ355f6jruSP~(j&H}J-Xa~TNTsdqk-Esy7m80DyS1-%JqMov+- zfxV{Xb; zI@33t&zA?YnfR8LCJ!A2JIvP2#xEj=s}NmD71N_hLWlJJpzI zrZ5{VK{!HELnsGLTUIOytgeVov`Xlmdi!2*zY8oiC8N}sBUI7nhx2Y++I;QN>l&?>2I)zSvt>=)~+wyc8w@oHFB-EQ}2v+>u z!zwM)%>wI+?EzgGdOlQ}#-Q74O&0P)5b2fvE@g`KM}g;bMciIH%%?aicbP}U0_Fe= zgeqlos+iCa?~SH|(m0x9=qZrEZ5*9o&+kLmruQy2V6wu-PU}w4vurfLxP`K@ks{TV zg+(Oo2xjio^it0q)HlvPW6dzIcF5|_jp23!^r@h+r7@o9IJqNn3SFoR$GSt z05odUD2MWsTYLLxszE(*l~-`ik01@J5RcSzehf3dCJTdxNC1Nkr-s5z&D(lcezY76 z!!rYAIDno^E3e9cNui`5{itWP4ULvCl{bJpra&yx+{@D=>}(6W5YAoLMVG1!JwY36 z-~fH6wYwXQjaAbP@f&z)Xj~)N@c{O}M{$e(ItIxX?`?(nfSU^)22Qjrd?TCZHP2fS zTN7J8k28-;RxVpJZy{#@FqkZwcWPsAS3{Pwm6>eDrYA9cjHCzWq11AeGV_)#J9f>n z$DTHC@o>5@x)wqYBlY6p%F$4{~X=|6@t9}gs^m#3Yo6dY+_>NMoIt{I~yx26J#nutBMI6NO8~INUCX478 zT^(ILedes|ldsNtW|`(Zdgd;wn76f~D-kqpZi7IDwn%9XO(Km656@Jr#yCbnco9<= z!L!BQa;cXx)~Ok};y8TVp%OUR4V$6axdz~&`q4;AXF<5x<-_)!hV4EMcSy#ZcnK=v zO*?sNc^gyBgDqLwi!I?mVguI-Sj|<#Dy*;oCT8Aih3T-fD>w3wMka_z%qbT<4rDZ@ zl)WbO8!AM&yU=ftrpE`8KA-?XZ?VoY2)RsOV!?<*(LU%3}kSn-u%$tfk zcb-_5R3lYK$Zu!sLP8Exi)f-JjM`G8^F^Ysqk66V#82*lj#lhPpYE3{y9jM)z}wQ* z<4s{Ex%3#zrw@jQ zRHRgQ-g$01MwXSFi>fUMRYY_%SbB2ZSB;2p3nXE&Qp-UYf-|pr;2kLcUzp@%v_!*{ zi5SguQi9SyivgiOmmSJ@?>u-E^3WKeDp->Z!hRfht*vpCWtE1E=A5Ht2|~9-q(`Q; z4Mwdu$O#e(U#qE19xnNGdB{Ug$7ox2c3vSlwU?tCu0|LUtJ9pb=1cEtgj&3n{^7o$ zuQidNip=)t9Dk^YT*2$Ic7J$u(G(u}cN9?0tqzT4)K*g{n zhj}301GL4~w#|L58?xnAPNcvxWOJofC@mTW7G(}J35-=9j-%Yk_MeZ69r~^u#xX!qVRGJ4Q_@>Gx6sC^1z2em4&m$rMkI<87|zbjnluI{g3Tl8 zQW@&ar0c+W!k`_Zw{6eDeBKcn4H&{Q^x&71lS&*N`2memDk>=U_&})ome9c`?KAY> z6pY>M2)%}rLYO9#*PbuHYKI{QeHpU@aBib>Oc7)BOutRbSnA32h3*F}&_?(vR-)ye$2rv=oq5W4(C@t=9cMm*c#CFCe7Px z>FtSo)`WxjK-`LQ3tOL*H=8QNEe_{Kcrx>!J41zC9(t9RgFY=iQ|@Fco2~^rF+04& zWeGtv$fZpOZBB&RASQ%z^hddp8Np0`P%4eEUYpwJ0!1T3>u!NPoh$c^cV;ss4_^E7 zPg#p07^xHolU=%w>o)X_!okzh*^2%BTbt?9{fFjA96qYa zIfu#ZCiCo4tk47Q~3oif_ z%;pnXx*DwpQK8UA$Dl^hgJ|*#y)I=(!f(>o8Z>r7O|7;XcDY*<6m%D()S>2>>jLVF zGYJMwG@x2@87JO2cj8HspzHI;Er~cC_?6BIWz1!qUWW`UX1n1+I?u-Ks=YnvT-Ht{ z!PD$W7MeWa zC#XrmRvw4OYSN);ORyQ!4=MNzs-~+j@qqE1(-9oY#&VT$h69wQ4(y!Jg=|FUpAw8h zECT{qPIT+rJ>f>s>^LvMv#OL$+d_m((9*OaoE3DQPRK3JCzYJPyGu!U z;V`F?g1ZWe0$fHe)S*nxyb^d3v}0C02f8OhT)PXlMFTPVAO0>#n>#CW;D9;l>{U^ZWk#>%0I{R9?pUw#w?GHIP> z+4XXz;VQinUaVZ20|EMgXJenWFH`4QdnKox1Zy=5COPpBEtu>;P{@p!rq(|WiE5K7 zvJdkfXoXv~#m%f!6#XOf zq_-d0qJsrvw#lqrT)K^zK`>Q=G9+}iK<@XUPjEWEV68X98s;s*-BDV)3NB-7+MF@B zt{@pqCmC!Mv`7dLS{2o!oVS66(TGtWM#X5kwO|Gd{jN@~qp6uFOtp=pL(mI?4&K+r z=?e4?jLvzuU>MS~(+g+v+{6~MRc+nupb5trKuiHzGiM+*EHiXBHo;blsoherbKLgJU_x7RCaI2zXU_H5pLNZrFfcKH^#KR(qyp;_l5Ciqda{ z+TTY#wM0R_1M?8Jr{vt{y<2g2lsr(*sYlp#(MV}%6-HAqO5w^Z!3*BeD*MdYx27;a zdN^r}^!P4J z5ZRPrCn9);TxUk;5N4z}925fj`r-G2NzVIsb5J(I(C&kqzO$nnu3~GP&|P^(?0}~M zGjSLLf?=GVwO}0x(GJiswe=-g^KQYqaP!*%hIR;JOs}=Wu!iHqWE|#vLeDlm zHjE=P9Ss3C!O4xi9gR&;Uaa<5vj_u2UgMil85$z19THuQ&1m>7y{+(xS2PGTlz1`6 z+e(fgN_GtS9>VYfQ7TK}?cp=;xTA?ZW;r4+V0$a9EnO}x!`b>h>3PVNGlCLsQrG!& zY$R@s&K02n6iNyOIE&f0FJ=(_`eh2;=2UY$C3P{z*6KLJ7k$vkT$Oxm`zZ%#>sm zlEKiIREJH!z#BY87IBJOp4(L`&^BP`CMIC%upeT29YJOcOR(9UbYXnhRB?{f)^Oc? zs+S)^^ckiyY>vh}GN|NA=o|eiCIW-0QBc*Rxd}j&1_f)_=rMWK-QtSS#iyYI!#CMF zQ9$cUKo>%nl|RCTPX*;Hf(S5TNfNnW5d>Cf(pFKFrXS_g2ou=V27}|?qGS*~Ig|t0g;8KoXCcsGJur>|PB)W{UL_P3ts*&$*&`FWR4d_V3gR1F z^I|L~ViP40Q+@D_m_}`0F${Om!%?V{3X;5yHh+i7Q9CCb1VfNa@Hgi%_{qxioF7fa zo`>ScJMUr>DE2SsIs*BsIiOEg4o3JyJg{+qq73?RCl!5Uvr5rNeR358eKe+ZLv^Je zg~dc4AbJK}lNQPc$Bqlj@&=*1V)_uX_Bm8JJyiK(#Z?gq2^)|8$!Zzy)NzJGWp;SdL1yh%C zzFxivoz&~P+N^d#`w9^4mWgF@Lr z2XxNG&`_+UpxnVu;Z#Cpx?nPLnQEoC0jdEVpF7zQ(AMY%#j>cKQo)c9%5ZuTOBdy1Whr%R+MV-+|DN>Dw za^3|N8S`F-xBWQoUIQ0mCk0%XO{H6b}n@hnogeyf7(ESj55vjk&c;MfZ@^e0&s;ywafo1B z2Hb6&w5=f9iirCO#ow@%iLKa}SDBkb5qWuxv(9qBRJCcbiafxeV0|;3!=rN=Q`x3+ znIwb%yjZtx%lbv3J5|99?{X*PbcT%1#A?bQWajf5+@el|0gb ziArn?2T#s;!M;Nvkgarq)8cK@CSiaUgF`ARy&0kOnowX?%oY<4HoCcS(m7=nk%gPI z_)4b=Wh_FI3QW@CX%R#P)0?IyXFAO1vB3>K5Y*Iw(7~Y;H51FF<%A+`JN|W^+HNzKn~hLe4mP(9BcaIYpp-BvTsPt|6bIX=EHFhZ(T) zASB=D$Oyl)nPLc0H@sHd%xt~R6$^!BGD?_^)PUihjZ>qCE8jOkQ&)g29cNw5eNOOV z{A?U^j!`H@nQV^c7ZeqX0z`-jd@h_DfMMtSrcMiEZ*CdS4h`9Gh+IO1Yx>xxrD^e- zi;I1?BB*;C(HBh_bvj5m1jD4F*Co^yy7SHXBvyQ4i3}Ftu*jh!aOkHc9q)_Vj3Q?B z7#xA~JI%y|6Yj)K_F*Q|G+a~lH@4AkW3QzQ$E)Pv7lu2)GEK*aX*O-ip;ESSXqXxx z-3F=N{&=p{nF<`{s`Vvj+F8qmvzBTdq#g$L(pU!O7!-RnF!PT>l9?EbhyKG|+6x<* zYZ6@@%}{UPtDd6dsB>Az!d0vbpn~91Qbm~yME(~yu^%qTbe52eJI3#Xh7E%vtNMp& zcrGl_dM#>JfdG{W3G+ch{!Y#UK;OmynH+}7m~+l`Gv}?NgfTH50zw#(NP8Zmx&=$& zB$x>*!ekrA93ckTP;qY=E%YY(oTG?g2BE#h1(>GGnN;Fz0!6!p8oDJf2;}FQmjahv z^p7)2*ELhbU$e3iw$-%-8Ue1?)<{pXyvPMCzbj$L?dfm9?1d)p%$ZTx#U2U0J!-4H z@Xu2D4Mn~MG%zTByl9dwFiQ`kK{(%Rg~vD&EL(AtqX-spotTXjgCvGd%qkC;GNW|E zvaA9MQ74fY0|N;_k0^C(OrVC-rm6NVCiZY|h_T=td5Ba zMznmW@Q8CU)h%46=X%%{n4w+i(dOYyQ_hSVjANL&YeEQJ!7aUFzgmqqDis)tvn2<;r)!~J*| z0`*+e1>VW*aAg~~g7C6=JPRT*(UP68aX1uxu&Ik_xFk_deJ3+ompWb^GXri?(7EmK z6>7>EV6<;40peBBk2aXnCz+jq2Af9dLv=2=t-e#}A&57l~2W0VzeUM04 zMdIx96r%oEofrw^m$JBe)E%@F^AEX+*%WGW!2GDzUrU3CQ_#Z3)OOZP8qwdX$sU%J9$n3wYf(Szr;_Qr#bRm4qXK9k2}0Q{a@G=m$3)|RvN zMpYvw0zsH-gyUHJz@)Y6Tvo%jMk}0YW~XOJMzOyWLpx3UCgdZYdP!L)+G%BbdDroF-)aa*jS z)jm~SDBi;Sa)EDS-1X3At?$ya1KcnMC%y&FxafRAMe~V=4n`cbR&FCSenEy=^Qdcba4h3WTk-Dbo`O%Py6awP*IQEfs=6u@w%Q zptEO7b&1mUvUS&{@&qhoRC%rd4ZQ=N9CM=CytsyDsPaxbayo9spJ(1UjPV%$omOYh zc7Tv?bfcu3W8esGBW3kWNy%$Wm${egDU9F}vUuMK4g z52+IkqtKQ(Cr>NZ^+E^&g_KY6p|-~vKZlNDnrU^TV!vz3!%byM9GCZ-x(nIX)!Ne0 z7@#|0Rc$vWL~(DGh0T_UMzbW_pkxGXrJV>N;K@;zEK)lg6;BtY>1OBP?Cs7JlA5%j zhVQ|2;R;`jO|TB&aMj@zF9C#P#Yw<{NAW%tHxUINJ+uhHbIWDf2r5q$u!d!er>l(; zb8Cg_s`Kzq78@4LP&dw}F>-VSjU8=$-CpzNM5xA>&*JJux?QI@N2V-1X4ox7Djkj1 z%`1f&mL#exL**P{8z<}{z*2I7VO!wjb$z1+#@ZGO4|C2FM%Cv^ zMYTecn8^&n+%URgjB#t%IVRcE5R^*#v!Dgp^Gm9H(G0rCnw7#xdXE!D7?BWLHV#$N zxfT)=oe-Q&Jv~_EeV2x5=H@6|p0%#Xj8I230g3u4 zg2_g3M?7z(@w0^{(MM#t!w9tA;u;t%aCjDrxe1K^3-E zO!uJ=zDgTSRJ2iQeJDCxbq1$~Nm{iW__W+(N!(Zu@eogVjOsCi#lnD~j@n#vV*>fD z@@m3$s>zGC4QS@bj^_#*5rEG9?ab7wiN3HuSO-TqS_but<@pttJs(BG_DtWZDQlk7 zjxi@pX#qQfGD&JvO7lC6)hlPWSgN zw_YK%=qWhdxPgPIlDusqSN;)>tnhmA_E{IKSj14kb}DeeK(<)X(YV?Mo?Wh7V*^D9 zLuL@39*WIww`P=5wqpbi2PZ*rt0q<^MF`hNE<-cRj4yXC9cbPK_)QtqSFJrTs>8_# z)O`3XiKUo;wHYwXjF=p2OIFsoNpopJ2gIb?W<3dneLus{edx)PTX@U`yasNBvw<9q z25}w`*w(PZ$_#(l6Z(}cD9cUbmfvZ0AG;k|WwqiC@2-uuec@W0&?i0l1t#8G;If5^ z*N32b&P}D=Ag+ldXaerJA5;hIL37jmD7)v9hLZ7wl- zIL(aWi6`wS_*0Qv`c*8b5_L^|9w*V|=}2rZ^|-XqkRIlAG7un6O??=-{Ca3Rthh=GlbomIy(pp6i}g=7oG z7qq{0}!rrOpDMgn2h6yYl$I-(8?oJDnYjt>6tuMrD0t_h6}oT5h`gj zj8)M&rrKjTrk?{rk|-KfOo8qvd(4Jcu%O8Tnj#E4R;GvNBcLKM9n3)t4be0)#&_{9 z=$vX?w!#G;o9+OyLRSY)(9wcnB?rx{3=Ng#UkamYr}|v!M6?prls_yZH+*vPJ6~|d zNw^-Jt5P|S($Q?O4G7OS#gSo%=0D(S&_uWb6b9~?>13^VU#-Q`R|l5{li?GUCy80C zgVnsPcrgJuhQSf%=k3zP2@g4M+y!e{E0#wa(f4jO6rUM{K`K-S;P$e{Om`Xtr4=wI zT3Nb@{J;Qg{VA?GXCDV#E1et|&^R7?`BL%ZD3Y@XxC?5*OXTWG) zw7DP8j-npU4E9o8#8O|@;6AJ9l6t@6w3JXhN_nKjk;VoL443Nqft!Jm{>&B_ecy?e6k02ty3C{tkYjX`O)=mAIxoiTEJ#=phZj-=EiW{lx2JqUTETyx z*b3o_$a~1ylaaf8(TZGg&3bkhCSmx5Hs}U!(vY6}@nRg)680P;C%nBTYtESbuu^Nn zq;@b0RXwzKIMY)xcpB4a$;sgWM-A}_IP5z`52fFTehdW`QkKhs)%3#^CR$bA-2x-4 z)%+7U3#W!`xhv+P`0zYbItP8&5e#o~!j2^~Il%*g8_twXd5VpRayUN&Of{z9jfAuv z&9tngcWh|Kb9QL>FgE2K z!tiZ67LNsR!4LFDVGf~J%jiuQ7e<%5F!PRqTxUvWbAkmHQ4yKJrC}2B(G$*_*ce9> zWkrXBN1qK@Zr&LRk3DQ;2ir*s0|%#^Ob?_oZdwU6Cu<^lL;$-Q+J~M-8ZNfXW+>C0 z8B)M%2l)8iGmD(3pHC^Gc$o4;AJdfs#D*b`g)7(M7DVhuY)D(I>wgEXx@Bq~+Lb*2(9g;B*YBKzGKx9z4PB8GDt^gD^Zk_01VFC75n{@F6!LBPfC} zZs8d}TJS05#^cCtLWZ@2mMe>qA-5KV!}4Kx1HzFD9i_H(iIT!OS6tLPye^^h8KSFz z=ZK=JQk~fxW6|QJaOky#c^s&rwlYi@9U!P4Is(PA+3a=EW@0VZ@C<6o&;*j6{eo3r ze8`Ob!I;dBW{+BM@m`x0^^)joUgF`;QvSiyK>C`O^Un(YS;;@E_~%$#DQ<2x)H$Zl z;IA_c3(@fwsgChSdOsckBMlyF&BIl`kYv#F&_%Iu5i%RycC--sGfWm*&qeJ|ibGmT z5DHb&)_IhiF=E?p(6@$Q%8&VRs7_W10*=f1eM%Se)4W?Fm! z-3>3W{4A?ixAMG`nm-#OWEnJ17s6m(T(&E-)2Mrx=PGakC2wE64fh;wr{4(~mbf`j zD{GyoEOTa=&ZWS$Xa-$-7!J|o=$b-6g~?JpM<#p*7&?}n#bRn;6ooN0)(*mzDix!= z5--pPmyLT~f;0G>WJtAbVeRjv@M_0|G1N>qcY*je7iLju(t1Xj1vkVIw!r`_$p=pS zAPgW8J_n9+vPBDlF-F+Kl;PsuVIdgM=j^FLSZ?PYXHZgbShx<6!5;9GP_XG~wDcS> zzJkgI)T{8}ftqyS0L8+?B77W?%wT-3%=C@YucgL_nl)c5AJ&NSnS9plSk7Z~DV|6< zX`NP9WlTE1!nsyRODhDrwe&O}%wcX%Vt|H1lxl{nT;a1@dfNN2xC@I;ZEne?KjCQ( zGrMaIn&@i}@GK_;5@ObcOX@Rx{EQdsUnYVe^eNXih7QC6g52RKaL*tcfoR9zS>D;z zepbf_tVVcaP*I%Nz~~3(jaz|dk#v+?e43$`>KTFfh6UC$f@kAZc{AD2*dJYhGzOvO zB`YSMok1ZRju2^_3i=c63Oj5y3{3Z|Kx>y7J#HSo5_3TV5Ja$!-d?nr#^$UfCu?o~ zj~$D1aQF>_)8FC2xin!pF9%1wTUmmuH?3;M6XLDs*=(V8SX`13gnWo5XS7(hZlS!h zS!J?nc?P4KIB)4zb)!tNGT-_>3!_R2Gr>TwCq-YG4x!9W8#LSq@3a`sH?T+GAugzx zc`P-#>#-blmkC#|rI{AGdEodH`fE0H_B7F$A3tFMoxG0dyBrf}j z*<1FUzF}JER6;qXw<- z^jo*M-h!=Qw%~DVsDRZgo4tb7``ac`(3Me~Udp1bQ#%L8y;1jIYR+Z2@H%rAnO~lM zN~=8R8hl_1RiO<~I?{s!i0^_VV7o^=6Jnz(a?aEegd>}_4@D}#v#F%=qr--e-$Jvk z496A~ht&;~w6=f%fjGPpJ8pA--llrI9Vn-Ys*JEVJg*S1D4@NE^?^n6YO>Nakf7(e zM|jg%)M9rQ7p6|D95v7-)R!%Qp!x|^9v<#>+`NT+?ot8~52bni`Qkh*U!T{ir!38j zyYPp6v9#!a;lWIJSUp|_;Jt+p-j#IDoLRFi&4<|Y!#Ct`fB4~>cKAA?@Y9ZsmN_#n zns!yBdCt6(=ir?V-okJviC0dv%vo^JZWqsZU;QO@m)2f3{qmakwQ~Ebp7%cGOS+6bo;J2?SXOM= z@-<7A;4SPpMTX(1u1je<$py+|)qBy#tCKJup}8TqlfQraH?S=6q7Zj>+%DcTkH{pb z=+(b+LN12p5_97d;y+5Pg@5XU_f@jG?9EgB0pGY({joP2;EVbA&*SV3jNq=vaUVZN z;y>HN|J!lL;Fw*n8@`zdyDIN{!VB%D9LLwzg>Qc1abf;W-Q~D4((ODzpYZ)re1jEV zrx$*<{@&%6?VE4k;&IG>0spJ>_W;uN1&L31z9DQ^pYIHuFOKhcKAtB$-+4-hfks*5iBTk1w?g^EV&Iq1p@h%07h` z@glr10rI;1;Qc6-zRUC{aoo~yC(_|28TLIMchSq9_b|S|`(V98@SoRZ{V{J<&CP3h z73CJ51pBHsk(&Hee?Q%O^{vT0JYV%*rmJ(pboCXPp6>BQl#`$7RyGSOUxcOUzNqnP zcR3z!+Nt`~KvGOSU!9%rgvv3LB$J;SNP?-y&#>d!X56Q$;o*xKya$POH~HD!qnzf4 zIgRi=NmZX3k3D|!Q^VKqRDEiuNKBreH8c6Cv7S+#X3L)Z)Oh<^ekOl4HFq_;yF~T)jIy{jq*G<+zE33 z)w`r`*(H6?F6qa1Nk6$u`k7tQzuhH0t*Qy~`j|r3i-xLRy|tk1Ey#HPKyj!jDDSMA zR4F7bKE$+4KJjpJ;y+w``cBjLZwrhzmtl4A=sU(dV;<1r&*&$Rmk7u0vOfMDEq=K- zxK9Bs>|eXj$ICj&!`vGlcVFOnolGB&H@cHYc;1a96o)U9_|c=}BG3B?d6eh9NFMFp z&pZu<&E7Q)O>`EC*Je^?k?dn6-=sMWO%RvHn?Uh~QhiT($Nj6tR+0JP_iTgY>0(+e zh-`!0f1wBwZ|SSVkBXlWKQDeo9jN9pcGiTHGO?CtfaoSiD92y!ch|+v0QL|A>DQr`5ZB%n=V1j}VuM z>%^19lf{yFzIeU(De-RcQSk}!Y4N|s--~}2cc0<%wV$|JY!Tz)Y2u(bDqbL7DPAvr zO1xWqNc_I|l(;XHE!NLk@pLgKj)@nFSBW=>w~6yjlF5_^|kW@fYID;$Ou& zsD;eO-Xh)*Zt10Br#5=|N#czsFh|h>Gh<^~@5@$jQWWM$n4-=0Q z+r(b+bn#4aOnk3+mG~*~Zt+3!yW)?<7sWq_cwfBbXJ7G9F(w`-wuyb>8RD>bmUxwT zgLselu=oS8BmPNT3I&<@Su1vko5iF!EbbJq6K@qC6u&F}Sp2#8Tk&?_^9|J@j3Agakm5A_4XAH6PJkV#FNC6 z#gsTAzEAvs_;K+L@jmez;(v-Sim!=uQtce#8VBd!)(#JIRk92Cpq`Qnx04dNr>55;H1SHw5O-R8OLA1odv z9xJwpo5a(_?c#)ZvG@V;Ch@c4SHy3NFNv>%}hd6frCA5YH7a6F(&0EPhV>miVvYe~B-NuZwkusT{<4 z;$rbQaf6r;lj4YYws@)dA@LUR3*rOfcg3HGzZ8EbzA4gY#eTD&xIkPgt`j$kTg9wc z6yGCWAzm-uCf*}HEdD@zT6{r#O^h7w@-;_1NL(nc6r02zahsSE$He!FSBoDL?-1`3 zza{>g_;c|U@lA2&5iWlRh%xbav0dCOrp1DIu6Vh4op`HwxA>6wl=!^(d+{xC){!nh zM~KVC_2QZ0xOkEHaq&*^e(_u4zl#4Qz9hab)-80`^~HJOVzE)|7Ecui#WC@{;??5E z#5=_M#7D&+iO-3@5&t6YyU68hfw)v$CvFtCidnHJzDK-5yk5Lbyhr?j__X+f_?j3w z%H?B@c#ybITq!n*aq)CDc*NdIvRxu+M#B;^V z#1Dx#i=Pv}B7R%^SMfRVf5bnD(~eQOhzE+x#C76H;>lu491+hF-zR=R{J40B_+{}M z;t$2A#eEjL{2VGah$o00;>luKEQptj9}#aA?-rjBpA~;C{#l$JbJssw>=92B&lJbS zi^OZhkBfJT_lw^W|5f}i@g?zfv97^g-xueJi^b!_4Prt}iX-CL;-%t;#9PEKh!2S0 z6@McBQv99xrnvhOm%shQ1>#b1ow!llDrUu^_#W{}@uT8r#23Xsiqn?5>+T`W6^{~+ z6*q~ei`&Hs@nZ2N@w4Jr#BYoLCjLzPvv|xhmyZ^)M|`)K6$|3o;w9n-#hb)C#rwo> zicgBqi2p6VD!wW1w%p}sA9238SX?8vikrmK#GE)PULam6UN3%1yjy%w{I2+8@#o@i z#n;8!6)vB9i3f{|#Fb*B*d@MO91zRm1>#lWN5$L4d&O^vPl(TozZU-_)~s~-+fzJP zJW4!PY!Nq!r;FRg3Grg_1L95Mf3J4ec~$(oxceIS{l4O%VoW?v+#qfi&k%>i3GpKF zYVk(#cJWK%BjV%YQ{waDtKysD?#H=&9xN^rSBXtxmw1XeBu#{vh;zk7;#P6HI4-_d{1@?~;-|%X#IK8w zi@y|K5&tIEt#kQUCY~s66t{?JF)yAiULt-_yh*%Myia^o{E_&a_#5#rV(p18KYNSs z5|0trh;3q@c!oGEo+Vx)UMt=#eqQ{V_?Y-(@fYGN;v3>_>s|i#6%P}ah-<}L#LtQM zi;s#=iqDF#iC&{S|15ETae=r*JV9(1@iYswOV1F8M8*NqUcE@XTD(!bUHp>xu=u$6 zl=v(0cj6o3j3#&fs5nnNMqDl8<<^#uxVTLm6wBiI;uYd`;;rIc;)CM%#QzX~CB7>D zU7XqMuD`!{xVTI_QS21Y6vxC1#jC^{#M{I#ieDGMC;mkIh4`}gSFx_eITRoG&(rCx{*5$zob8i06uziyskh74H@w62C7#B|b0y zUVKZOwZY}@KyjhCN^B8(#WTba@f`7T@jCG~@k`=2#3#k)#FxasiZj|(Ug83AnYdo; z7PpCKiWB1d#B0S{#Jj|Y#K*;_#TUgtiPJk=e%>V>Bd!tKL_E*g$uV(6JX^d}{E&Ey z_yzGn@%!Ra;`8F~#ka&+C%Nk#ARZwu7dyp%u_T@^UMb!nep>vJ_=xyJ@fq<&@sHxP zjV>R1h;zk7;wlkOeQV?yi5jI3`{wUM1cj-X?xgd`SGB_!IFL;>+S+ z#kx)IdV7n9h)0R5#3r#@e7D#y7RC37SBTe(w~6QS21Ah-on|o-JM? zeo(wgyi>eS{HFMX_>B01_y_SVac08hcR%qku|Ygu+#vReco2fg#qHv__+If}#E*)f z7ViF@M;>W~0#Cyd@#2<)1 z6`vPh72gzhJK5!PUva*;SX?8vikrmK#GE)PULam6UN7Dz-Yq^Teph@+{IfV6i?3*x z>?zI_7m6#y^_#b?DA#n(h{tIOvsaer}vxI{cb zY!~rp1E|Qr;+$e{7Zep05F0jB zR1}r(dCm^+%m4pL^u8u^8hKN)$$b2Kq zjcjjZFC&KVk4Isd7qI_82Ox$+l}09Qx+-T&hM(#B7b0fbuGBD2cpOHx;D~#-5WN#yf8Hvwz$$ElM zmy5i_$i+t9YUKS!t~K&`Bi}Ic10%mM^01Nr7@0Ocr9W;Y-dU6SS{T{I$bLqSG!oxB zl6*6aTwvr9BbOVw%E+gTeBa1Vjr_^Te~e6-;C zON?A@9kzX5m#7O&`l>UZB<``LGWLqP97&*kqn~c2M$VZKQ*2rx} z?lAIGBfm594K5FE%Ms725hmoHedC15= zjC9XU+1JR(JR{4DtTD2ukwc6;)5s}CUS#A|M&4rNN+Z`8x!K6qjofAAej|T0@|cmq z^HTOjjVv^>%E(Se_AzpVk@!NLjK^t4UTWmEM&54ZgGN4SBU&B(zOjof17yGHIc@{o~7jSQThvd1&B(8y{dyBOKu z$kU9RWaJzp7a4i8kt>aS!pP^1eACE1Mt)`F5hI-oQuaiQ%rmmw$PPx<8#%(r@kY)t za-oqo7`ej8$Bf))Ke;XN`VdBZiq><%D))?8t$iYUAHgb}Y_@Ir<4-1W4V&ol0K4|1R zBcC^NyOFz$+-KzXMjkcNote^~X=KvKN+UZN+1JRCMxJ9NKB+JEU2f!3BkwVCwUL{R z+-~FtMjkZs7bC4%DSZu%%r&yq$QmPi89B_zvyGf)OJBp=Yq+ryD-j@be6xX7~alZ=i&p)rLPsnQmEI4S$CcdUqQBso@6<|A{hUSw{>% zZqnTgaXcIEYZ+N!WH}}DwJ^Ms;dO@hH~bXC$56&Cd`vy1Z!RV5yVCI64S&kW*Nxn7 zUYsgdVq_O1#~3-+$Qz7& z&`1ma7!R(IAtN)4Oj4p>ii|8XvdYLhBYPS-%*c^OV!I*j!ZINe;Up4fi(F{rA|r1z z@=hZkHFAxS&l|bL$k&a0%g9|u?lJOPBY!aRZzK8P5%ynzT&KP_LO*1YBkq%wXm<%E z^6?*~_z4nOgollkawwlm4wNPUyC*^s;k?!uWs2snM@_5{_<$s zw#j6>_AT2%;NRG^1wH%svTZob{NvZ0{>L!Z4@m+aImEvb_#hh&nAW@Qm#lH>nXMzw zdeUwleShcCl`X7-CP!+=bw9Fj+*Yz%0{eKhJC3DzR-x1H_#gis_pKXq)IE0mc!otC z72h7N3-sDL(k{6CXxGT=BL^L}g0~;-T7BkUi;q0et@fkxP1U_VJi4e+q>yEEoBEHr zvj-hnn7RAtl16ru>Rvo*C;4~x(Z$I1e;-@c2)WO;{*Rp1y>=hvaSO-)SH9CG^_w-V zpjTl^XGwz{!JqBm#;rT#F{#QftrFCd#uFi0oS4lm$3@HedtSu`wFlxkVsp?qd86-GV=1CR*ul4nW!)Hl3U1@^8a5_aUUf3uSO< z26Ju0|Hx|m$w!_ym}mzo>R8|dkVZU`;o{GC_%Hb~Ea#sJw)J-$$$SHSvLo&v;T%Ed z>xT-EFy3j16id&*U;hLlj^>47|2Yorbah}L$RwwI42{z(ajDfm**UWp%=YroCH`}r zoBQLFIj;B35U}%{$Mf)ExS-bt2mMo=yH}2iu2kaq-?hVGhHicjhi_UP|+sqms5f+JiMUBB8lbl}M zU0F z?%g;FY_qV|ag1NEt-|`pz2D(1|8`;H;~w7u@$YuNg0tquy>$BQ17Qo}-fQ&Px6T1{ z@S=G1Z2Y{X|B%D@T^#qewME)@&KiuyC2@~mUhp^YvF(q~}~g@ipC_a1KmmLcr1 zxVMJoBElYzd(E(<_@lmu5CyB_UXqr@eHWt*>*8KFsP<<|&ZpsP`m?dHXX4)Z39uYt z&&Iv)YQXZO+{U=qk~QQDdp_>H&74VLTjJi;`Cx^<9}tSK#J!SSu&$zId)#v7W7_b~ zK8_AZb2%IwelH;K9YV}<%Aqvy1LrSiP7&ab=xhuf1Y_VQj&|A9}2Pc>o^qHBe@(agG2K&9Fb9(ZpB`O*Mfo1oNZLH0{#i? zb6SX!TQIf)`$dVXeG!lYLj0QdHv(Tc5h}J~b2F*okaLt8E@^>d-#aps=pW(Pzz>qo zO%?j_M4^W`J_3I_tubZAr&@tysY>G$tiaz+4m7#($yVSWsW6Z#`>zmX#m>Y)bpx(% z4$A7XFzN{SQth5w1riiu>x)N#G!WuwK2jG*6N0a{`7x>^fp>h96g~>|4h!u_VLnk3 z*yW=$vhPNW26p@Ctn88u;17IkV)h&CqK{L@Z^Jwq_#}mAvgvyTH^#3%S%FVe#}_cq zXDR$8LN4&RuNn0$U|suC$M;}m2^>h(`!W&(U!;yp>kj(prR-uD8~DoCiDkp=j;~Yr z(*rt&|Ci8XL2rRNn!%6EcO-98rz%w!zfgt;pjIO4kp$8^mw|*m^z$O;KkrrE>g}~L{aek%MoZfZ=$Or!D+d0 zfqDmvV{rN|QIJ55!5MD=yNYko24`}P52{v}pM$fA!Y-(?bnV~@+X0y~VA8=n{eC79y0+4UPp%H~W-BI$jW%iTKw+iE-QKVO5W4>511?P8}` z>TC2++HRJNsC>-PX&*3)r}j1k{_rVOw=B`5H}IZSz@D85b_V%~B+E`rXa@4}AFRPn zJc1=G?GqO%C3a#L#%0=GlIFIR(Fr-2OWK;BYO6v#n4WZgMGT~Unu#N6?j+<3vS6Ca zX~Y+F`Mjjhb)PB~b{q!eY^t@a`p~)KFwy1VR}Mnw(M6UTioOUP5IHG@UrCT+HU78N?Cw0JfB&nZ%yjIudvmah5s{ z({E@tBR*Fhs|B931~{o|Jm3q73)JhF$wPBlZ=w1Vd$G_(#7)##+Ica{7O8g;t)WYZ zOH`A7!1Mlu{&H0hKZGu&3#!#a9f9XFPwTvy)2z?}!Wwl6ObO}xHYF~I_wNROV#4A4K&0!Y$LI8*d}7*u+7BAVb7%;c7R4bUkYVG^-5ph z7l^~^OiV(d7pXm>?m?;0OT?byqt2l%)RU!p$ADk%i2T{GYBJKD8Vsb+6*Mpq4Bb?U zn8`Z_&AVCFk39U~A$F$3uH|H4#tJPPliyUEUA)J{p+?``bV|&Dk&a z6XrbK82Lkw&>dpbqbC{l*hxk`o-*n%REAccWYn6I9Q;Je!Tf$iH%p@Imv)`QwFqTkG;1I zdBSQfmafna;)Xa=LS3QvS$ocxCGbb+!#L&(m5!}IXb%mx)cBFW9}&CiWh|eekBNio zdd%mcPuQtpbyorKUgC%t=(EbfA#wv3b^oPDJ1j+dY=7d8(?LSe~;ghQR`J}3TNmX^M z7A1d8RVA@>geBcnEd53tM7LcJ>DZXxLcbH{e1dki4*hvGTq5oH>!eDKom9!+sY;}q z{z+9LGuOW-wdc6BM@xGwTNNlm+J*sTtlvqYFPO- zOiM3iulns@fMa|%FB}TlN02+tK^C^fP%Tqzx)577W}${c94)412=QsLHDZggT4s$# zwpeSWcV;wX+RGvGBcU97WCVKFxB=Nn~O4M zikC1wAn>Rt9O_^{Mw9VtbyldO&GBo+`O71rPC}eGe&{9CS+E=DFE@m`2nlFzCPQ8A z1ZHP6-V4>)ztJS|RyP}8BL+L%MbXhf$``DaYEd4M8zpoHi59B)EPe@RIR0h&tNZ86xh6dVU*qtgpNU&-A zU?Hx4q6!605fV&!Vu+BiUY$hBP$7|&TZReoQf?V8BrD~X5khidH3xA1x=@z=IO`oj z+p=W@S$aA*8;wm={>BBW(1t7F=QVvnn%M86ZCR&LnyTdh47 zWV9ZX4boczV^VzTgsE0&fIS+XnirosZL$?QRou2j%Yr>pDqU@*YmT;2b|!3ddf|*V zd?g*~e02)oRRa0_kMPw3f2##tEU*K5E_~gOD3)^rEDon%n2$J7@1j%E=Wf7ZOEJ>Y zFIoWTsyQ{l7xU~PXgPc8P~iGf{ z5XvfkT&!W?z0eaD{SBKCM^qCG*M>#JULJl-&uZ9|I4ci7Mrk!{MvHUv_!D{!i&sH? zQdMGC+pzLp;36xBr%>VW?Yn41CsY%@gC{?hY;(fP_n*1C@pEmJ=j? zv^Bhv`ZKVnz|{yC!z*b16px$uMY6;ws zzUUAta@8+%;dNVSfyzMSq%R>3D^8{9H}bS0qAu?Ryp-5Ow7rA$oL&P_Afxahs;)KycD|uwR|Kpm2L&J)c2U*GRnRJcGb;Ifh$6oP z;IQJev>8=>fFp|UM`yH{3hb#%5sw)yZvxIzr?cW#&j9DDVSeB?oGg=S6=vUzw!tjA zKFJ>7<+L#W!2GTdu@z`tk$;L!d*YMNX@QG-sbLP%5?AxgFb^Rx{TJGI4S{v~Zv>Km zuI-{x5#6^P$UM6uh^v-*Dr)jyYH!Vff%<&(g5M{Xy>j*Eu+Z-plF&=gzy5&3-cG_0 zx<#y`Bg8s6{rcY@TEJ zY9><={d-a}YdxW2(1|?s`$>6N>4`iuPvl{LoRsHeQ*LJ-cF1S{XP#oXG1YD+ph*i6 zS848ZC$h6EPg42c?8tKnd2;xHrjm>^i;+zoLoZ~EWniM8AL?ycjU)S+z$v-ATkK{BOGu2qnX zH1Pccz1fdrri;XVv^{$fJQT^2 zPgIQGP`Gatx-&Au*9^m1e^!I6BaM(#6%&V4 z8rF(N&56Tm6S}lf8F9MGhp!t|Fa&X)GZYg?X8v!S%HQn_n4F4gWqy7Ywn)Dz%efWd zky*&-$f;@pOEa7QMoS;3^U8{#)lzE^*_q`$?53_``EyM9CYG}pIJ3nLBsy)7JG0|Q zD3WtKyC}2ENF=Hma8zb(O4SVJt|NBUc+8@i-H3y#4;+x$ofu~|4KSQC>vNDbhhITY zW)52YUp=R!^xTt=EJIRyeC>gUrt}QPb?3}sqDS#d51GShLd0@@he4UA$ww=9xq#=; zOt~nxlNq>}sT4nOf}8YTPVjsyc0K%}?EsFLSbUh}s5Vmz6oyXe(l_^W~<5tN9*E<^@8qYis~A zO-NWzz?_pgQ|6qAE-V0*5PMMYjl51m6_K$5oGJ6^XaN3 z4*R}VpO5a!yx!s0L&xghhl1STFpS6R#~8pjiW6t)Ul^)OMfKcxpPn8D}W=W^y8v`KeIq=CI8v`U9DLMb%^A-lB7H#E)wRD4?(UZ!mK!DGl^v zS>o0+&E;*(obxc%dR|A~NmM!Mz@51bwAB4=fcw)GVbv9F@dofV6Rw_5#-NROr)6WD zsdHh7H}OnlveXqAo8BZYey;isQR+=54yuch(US|wVJm~(+#CnQ5;Kh2pWtCDrw>|? zjDEU`%D2Os=x3{-8{2B)&xu_%3!xC*M-1h}`-#KqE9N;s98upBe?jc2Ux*J9XQ`va zUlQk9v9%3ZSrgky!c!yBtY|aAR(w3(VThL67ouUfV}l2DqGdJ<1$Aiv*~*24HTTNV z3Y!j#=ob)r(MlQGJnLbrVwYh^1*0wPYSu6w6HT;@U`x+x22x|+3#Gi-Kozl{(D*6Q zX?CAN6mJmmGrvqjS@#zCN*@@1vx$klHOlXTw9^_IXQOz%cMdu5N z#qoQ((FJ02JU)3G$U>RXn(Je=$aR_IYOg=<405@U4tiTFkSm0A)Lk)ZqKkxdijT)H zzDBRKZ$zkdj?bJi&Wc_oqtd{>(WOF0>)){piryq-j6O;JBm}{eV2pO*j zB5tC~?K;HAq|{Wz@3zW#X=LTjLBtLA#m-`~oSwzTal>xOIbv))=OI^}hA@atAWjY4 z*kle}Pt`(E?7SP%sw_1XD@<&PjgEX;y;=u+K11*ubuEuyunH=V$Zdz%bmF6VoU~#y zi2qKo`(iVREjzK9g=dktcH(#Fi_K>51?|MOn1^B)G9_XsZimNWb4hTsWic8YyQrcI z46ze!JAzzHg8M69AOK^Rkkr_TMNL5FrGeDjiT9g~!m;q61i!=^+fGvBB$m<8H%U4pIVHT}BzW^E z_8!}_-ATNwK;GvJ^tO{|$1d4PvcpNtLEOgvL$b?Byod`Vv0Ws4@WpGaGqK$yd!5AE zY>*E~_Bo0C5g>c$or6x|HG1b0?w7uF5~WyqW1lj`?@RnN0OT{0fG^Re9OQEn2wJBk_ERuc+;NlBh2+0EaOVFXQ9AVvjo`rckmSx64`* zv|^*tE8*y8Hb1AU$K$Lj`nf4of+Nv=rqEDqW}^Fr1g-S9u*;7gkcwi9FhPut9<(Q7 zz{mzC`jyQ%wKVqu(QjMO!&-lmBf+8;5P3rTL3M z(RQ*Ko11EEdxwpkr+Z-#L_0cc-$LDyP3kO~7wMxIE74QLqQ&|~%#6_?LYC+eBtwNP z)t6!{M287krvJpm79B3+j#QII2w9P8?5Wb&mHK|fOLU~ehuC(YnJ=J)vENa5R&mtqHK%~*CHkLK-n4kPnLPosY27n>ibC6 z3z?*g*o{vKnWpEk>z@`fSNF>Rc}B=W{qgA_8^i^Rb%djHqnxEJ(Ko?W(Vb2joU_#X z8gohXKTcy3+uOl@-X;0g*{2(p0>UA4%jEcw%8uunvd?4roU}_62hMf+hKcK zgGl>KJh996_#KJpJ}I}y_6AYQe#v>z_Exe}4+#6l_PTPsd?Dq&x4p|Tmqx#oXB-dX zH!a;D23Q7n^0ZaD8t2hmElN+~e}VJE%#v>YS~(YEDo@5IjzWT(hIKAJiJ^e2=HXW|U?Gx|UN3vooP zVS|4qZln&?0v{pHRJWlK@!yEG;)Xx|JF%y@-;e)6998`FfcR13m>P}KoA{r^an)%k z{vM+ZxaojheEc770~_aY6CeMVIGKk%eEc|JGj8GImTck6_3&XRY71#8Ckk<&ERr?) z(>kOCgtXWEUAedt(m{VoHwJ}t)YCC3#?yr0;sACS@vxB2dMa&87t%#G_wj~8y6V#~ z!r~c1YIQBkL~M3w58W7RYg|i8f6bVQ=hzIm0jURkzCk95R@;j4lZnB2tsSX^%l0!+ z>*UnX(qEHw7lMnFD>3Kh#{1htn2%?g@qvOcW zHiIYee3Dn{$M3xIr|2Sfe60OGs*{N`ezq+q1iG>dicgSpQ&%sA`SEkiiRuHHAQOe; z%JdjNR~GIP-HRSRPe{2w1@m5fsu)u(Gh+M#S@~P*Tj=|FvR2pV^RRNpFSR-E)#~+0 zkoiLDwXY$_0wII-&6wij3x$l--=i7v%Y=;8YZ%B^NIjGE2wJd6$P_&>1ahU2X?iTy z^Y~RlX6cQX4dRcBp>wqw4YFFuJlz^IM|_PmZlRvfLHmRlx`K<@x!7UEpO@ZWuSYR_UJ&w>=BY*eMVs@%(|Wxh}K&G+Yv6fYa{OG@Y8pX}TE*8FUIyCJm4M zjQO~Ae81ft$5L_mg^5ew2we(g{XS3_RwYeI2IM09qOX4jZh47I5 zTfB8@qaz#7cw2{KA*gHU5^UK(!l@|jEbDeeUvN57y2{e%$<8ibC;Oo+%?)6@yTf%L zwegJilr?Oc-Z2y@y<~ZtrJu&2jrSHZSM$dPGkZPK0+4i`x!9(hVn)kol|LjZ>e9EO=b>rBF&pO_)* ztZ$)B@h6wE#!<1Qo~#2NKMB}Xmt#K5nlKYMsMer6vd-b_17S6<2zcT(z!7y0+M6{= z76!|C0zsNJc^ML%VoU_t8>Cjgl9atIRV$Xhz1i=))&@0Q#l!FJ2DDUXjD_s?h+Xv- zLLz$yaZo*tftkIN&(nw1k8$8#JRVVRVuWPxCic{yKRlG=={bxP!c(r8=@LyAbC#e@OwzL0c{wexu zI6vF67b9Vs=2vvGZ6UMt+{Pe2`(dQa)jKgnvRxtb^eXx&V84!(h5CaLAWFz0{UR2a z><0D$q%78-A@;Ky+77(FM8Azt&5qbvAWL7 zNjW=T$V#1s(V1OfpMsPJwZ92Sp*6=b#U#y%*rH-oIxe>VatwReL& zt*^=kDYK7*Y}EbOxN^G)-g;hdW_v2^?jT$AVXW!dEo`1nyrQqdbe-MOz7=G<4q*6Z z_qO@`#oOA(z{(zAZ$iory`1$7w7&q^rH7${?7_B+4&9TwE6s=t^BfRM@N2*!HvGha zPk`m-H2dYBDLUbURCelx$6um0;(wT%{Tn92J9Exm4l{fU zmir%sL_??X^z$*K)J#nJjb}=E^?MfZ9G(o=Y7BOYjW43nL3JFHK;s3>lcpYpy2e*5 zuZ2m8zXt-#8D7Xq{E6wQ@zu-}b}Z*_Y`=0!KSJgv?_uh;bK2j7+KPNbaHJ?5f9;|; z{yIek`0KNBuEyM*n_G9BCbb&{+^qcf2&t~EhbtWv&dycqVU4(sW-t)xOY7e?A?*%%%wYnWkXWolc-$@O^PBZT%>;`gW@CAi`!IR$QWx;) z$nzets}|whAa4h8P>n>XJh_-3R)^`NovbsWMqsm;_aFADr>>(jb`j^QQij}aHnd1R zh`)Is5SOa~ao`WxxYlYTJ7f>>u)M)+^hd3@6PDejzQRT$Z!hs) z)fwX??^EJ~s-CueM*O|{50=}!eOIFFkwp3_zz6sU*1Lo#^A&vAUX0`!2D6RA* zdZHzHUrIB5iI?HEyst=b`TtH#vw2^$K@nfdsZ=cP?3&`Yfv0ZcX^L+q-(#C?hVYCmy5;(+>! zxIeM7nzrDm%!2zA%tK{hC@-x)2+=e0lTCQU#cP^X1JmS6y@( z@P$Rl8dUskxBR)x9#++1;EPyMe>M9I;7gciw0b-jcpmXsH3nlL|5D~3uZCg!ls}*N zLG=yGE+9Ub_=I>N-HID|{CI8tWhB+M+-b_clIJ(LtH(P{`B#y2vgJ-w{?#P4w%lpT zUrf@&mOD-P*O1`mAMZ5fUrW;8PQ(z#`8O=Dl{;HU*gm@Aa|3D#myy* z&HVd{K*swLEqa68Pcq4uI1BNczlzWOOz|Zi!|=&p{}^mr>`Szo^wxrt{+fV{~yxFnF^fX;u5*~$Zntq#cB zn^8}7ATgU|cI*J@6iE2l(*IEPrFdG7aYs*`95}S@#F&ssq8iC?+{$tfyMHAp1#5t-*74Z8-z`5#! zKES((ld2u@ZsH zQZ5O%R^t$NNx3B4Mm>YxOv)wUwu&z%C*_iGJ5>O8C%>hh8r2R1IeCaSbW(WUw# z^hCi$`UCcJRLI4834lJO^${F5!y#uS za5C13_jT1ijQv<=dcaa$>VdluyQ*j?a984>Du7pGGJ{9d-~!+}dLT>j)5tN|Mdn%# zf6pV*bMI_h9dh-6S+H)!n*E34-(r`X-A7Z?thm5hlsp#F;4|o7^ma0c|#Rd{5 z)fP-eu|dQoiWgjCrw~^w-e-ypBd$@r0TmlgT$>uO{K$i8Xlx%&vL1}p+v~8_=sfgY ztgl=!we%QT+s`gSIaenFApIpJs9V;743LX+VSRNW$RN3fm!&_CfeaR9x%x@kc8YXs z4=s<943RSRIt?)u8!BX&+)j-Rmn+C)wLA$iN-j!{*YYI9X+oyxo6wW7)1{tS`k(?C zEo83lTnciATmYV@*9Jk(6tYmu(-UKbEYg{1VeA}x3&djmG)8x9l3deVp||-!CJVVo zpPmkKo{*JR25)b(gt!ZjveqF~cl?h#+e`4;>$H#1bvgWXF|XkIVep~4_jDY-fv&UE zZf3br+^F702p23R4yu2{z&G)nF06u>=?iWqPFMFKN(*iwZm1?S0A5C%p&n*68*wAcc^Ebo-2Mp;WtQQ{UbkSneF|nNxx891(_CKtiB-=smsckv_zO}GhXwUo zEDQy6WF$1umqA0pCDPGheIcT{V7@4e=*I?tERas~^uLJ5f`vko`gTks1(!*gay^!& zT`vBs)~9s^xl&SE>*Y;Bu9ASN(StgJTrJr;=>>Hli-mO28?bjPxX$JSfwfxWZ^06| z12jn=uLiln{v?5^!K-J=&7v*W^#)>BS+GoInxyOXY7LfpqN?2WY>eN6)FV|Du6H)O zW4Yw4cD?-r!R{0-om_7=MqI&tHh*8Q*7d%}ELgBgtm@%G-K`_c6U>uq-ZG}k-J5B8MQu*mg>W2P&3CNjGVN3 zqs{PI=6d|G$b#p@b$7VlR@(Bs*tx>>(pl~WNn7c9OEFLjUX-*4T~Cv}B6dFFde0#O z3tkuYnCm^r{(Mu|YS+7!etA#W6Rvk1W}$-J!q&OoL(ReVh-K?tuLvd;d?IO2yWU*- z>~pDoqw9^tL|m{>*z>Np9@~n7{ld1m-qj4*FT}D}T(6SeJt%Cu>n+Iw`%>83u9sN= z_NRpE4%Ztt8tgBreV6OqhOt@@lk4@nT@R1ES_K8psR-~rd_a;TG|lDZ@z}?hJZlQO z+N&A-e8IA?PG%oVw@-p}6XNRXK_K0Q1T~#r*h5HI?+=0WwD|;U#EKn-NETjdAEP=x zeOI_Zp1#9-mFV`ug<`v_9}a+ACM2jAQ1|6R!t%^<;T5(#I&Wp(12yaH!h7ta7&|HR zR!T;^i2>gi-e>e3LNFEHZ}b&2;p&%%_Eqi7_SeOa|csX?+qe>4hYqmnmvWcAGD?e5}V{bQQi~^KF*Dyj2+>Z`nc2x)Ge`yO>r5^T~0X=QBjJm`0BK zz>C6I1`7Au18__~*AQhtlgcf<4$DE|=Q1m}dKcUEm89U=tP0lgwM{*-H#I6K{Lx+r z5}!Q5Dm*NMF!i`_;m=aUwbF;N2Y<1bAQv7b!{5wr+u`)WSNOZV6S`$FE<7rWv8A`v zBlDlBqMA>17yf1Qk?x?bg!zTXBr3u>fU#G2T(ULPEikMLEg7sCI)etuqrha`0i0jY*Pe00(bceS&p4V4m+AC}*{IUJi2 z+gphJK%sVcXLO6>l~JE3>}|(uz?h54( ze>&b`oB$NI5cZejjXMLZrD*xv@fx#hT1nc!jyIdEwZn7!`P~~0=d`bGh|6!ht?LY6jG$OqC1N2v-={YMBjsPS9HI90Z6$X69Rd_z80h! z9|M6K!VNWFluf-$>;3P$J`DxCicje`jIM%R{E7jMjh%_oxkXFu7^Gf^nYidCdjT?7 zdI#;hS%|Aw=7QWJB&cn+X_=6)JOWX4tB{C12Uc{O5Ko?ZD7sxpmeu@T=uC52ja=7f zOT+Xa4)RH5ImkwazWK~#olGhr)l(zwZ%e4y1Cbq5qqeakJtI|dQAEW*r@|K%9HNWC7z zrlp=h>Z30vX&@Y99sfnzsa8pil48iL&f1`agis%v-jOVc|!pwd^kfEUR(7}GDn;@|XQ z`*a?ExS`;VD4XWWkt?xnX?lsA(xuPGx0JZC z8jb;7Tuz*${(`THD~NMdI|O)fC2>L>!hWW>ia1YkBT`&VoUelDz2cUmfRpMpc)Pe2 zae?|C1FN_-aiPlU1l)%Co2cOkrsB55Md}?yW^p^>rs~6%!0m~fsqW~D;ts^csw?$$ zBrZ{zN#IVz%~gZ0z@3Rp)e_p%mAFiez?4&5OI)rVL{}8o(GS&XvIg$X?FLR{cZVi@2T2p*{61Tca+h0`5cHNwo|B_hXmVs;!t4i~I99KOseZ&c*>a zG<*|a&bNr$U`dBCoT%=>;3|<;SgI$+a7i6=+iCTu$(_IPnPuFfa-HPV=7W5edkhtYj~!lKl4~>E~cN70V(}ww*nqW?5OdG zz>-14K6M+~STckdUqy%l4`r+U>Py--iWqhMfPqnRW*qu+)}q?n=8c0Gma0Pt{?BDu zOFfO=Y@Q&t)uU)jbBS0-ZG@MaOT^*}L+It^60xp&l=+L8AD_m`29}5otLYeJDI8J5 z5rHY}sa5bv3gbrT6L3oN;wxxR7$d8wba)Nz$wIG{j-bt!x(pFmI+BNR-DNte83-to zQ|d2XMBa^ROUGy&&wV8eSL5B%GcQLeRf3)?9mmeZt>qZ-c$Rn7dQ63-6NrOqQ5o<# z#9_6Mcp`B`O-HblPG++_b$to&xilxLHp8{0=Mm%EcnyH3Fi%|l+5>nhah4hy20ouA zWUGES?tGr56&Hst>7WE^(Q9fc9TRT&|u?0AEa8q5jhy_!8P&sWu}5N-rg@QeD~s z&u5-$^)qc)KwshJCkA)v6+B*}dRGE3x*s;QSEW3D<$B-_Y9acp^eWZ=I^W;wFbV1$GfN|*#4DXOWalE=KxGhmox~X$n?+wJ= zRb3tM(wmXLhq{z@-bCB_t13)#r8jTI@xh6!1_Iy0h+;XY2{ZnjuRUnkLz zX56|HMfy330*2XbB$J)Qr&vWw?UvHjwPcTUEFi zRQjR>m@mQLFMWx`^(FF

    zugURHXFZG4#o_axUcWh)6@Njgf8ZX?0FMm8>!l)gfe z_WIIWLFL5~rQ0W^ag}y{b_WzqCO`r|qzVt1UB46S{ zR{A!*)6|#P&rZf8 zcV#d!(o!>zmBCqP=Lw#kN~cRDJ%KC4$j`cjXQViNDIDiZOs6}A2UDCL6>iI4CxugK z^xR2lsT{bXKs{{w$!V#h)BbzZa&F-)^vx*PoYO+%1gES6UjwR6wG*p*SvO*(?BT%O z*_%OiC)SLz9>fjQKBSh(3Z147VL~nIMR$kPYo`GBCdLuJLmI`CStH>wL zRd>|^CyA445d2wDKwPBm#J-`Tkhnw*fPX5Q5SOcsJYGaxtv*iz%i7sm{f?nmA-laA z%lRu0r1(6x-5nv9je2&cv&l6*}w3JF;=n4HfRha)q zRleMIEcCyd#NlnsW2yCs#>!WSZFRf~_*G_c)Snm;m9O#m5H+9qUnd@_=AvgSw-XOj z3d6DT4dUS{L_1~b9-+>u1(uonRP`hC%fvl0H7E6gdKv43@I`GJ`@xg6uMTxgs{G^7 zS+MEq{y6+6^;&960q|eMwrY$KQhAKCp{sWB_}@GpRQyed%72I(s4rOdU*a@XhHXaW zapI6hcB>NKS_BE}U$M?q+CtLxXSE=XkcRpd1Wlz+NQRzGy#XN+eFvSaY>6%X9Oj+M zppY!xgw-^#CA#$Vz94Br68gI$kdP?I)0JppWmrhQ-oTz|XtOOzy_F{L&XBWlD$SQYDzgP! z`nrZx;Ltm+{wqiYLV~(GhCpSmkg&dzQPtF8FGTcmhD@<@Hk5g(^@mVm1M3T2Gvj|e z{d0DBbLaQ7U`H3U%C0PTmeY>!dLf}wbYiM~f<061%tuOW<0*LNrLv>jWCF51R)>Vn zazRnNgX+rwxvoV`j&JxmJx52VjIa|m8-H`5`BV?dn zgtM*63xy2QKKAxpA%k@eCxVNFoT6tlC@vNl%mKpDIdmILyy zcn6QIu+g~63iBiS5PQKE;_1dcK^!4j`g;bS&!1YOvZ_H`KbxG;Tk*G2NlKpHKN2J; zDfzmFgQJ0vr1o*b%NJ6h_fT7bs4mh&u$8H7A}J;MxiCmmNh#OUIMj+IrCM*LN16+1 zq4~O1Wtk96QHX}hav`ns6i$+rLRxE0)m1{;=-U{H)k50pbzGxb2x+GkgQBI78lBHd zTM22eA7!>SLOSTTGeFu3>8QiQL286_(z}?gy^zlO%~l{Cg>=!w(Lt4+gml$mPB)#! zRkeCp5TuKcI(-d$xK>Cvoz8Hn6Cd=@9T@T5L_xiNkU`!21-hQJ)#@P5I=)ru>O}84EOU=-!Q$JBluK5LuaJk$-UbsA*1yt%|K3iZrs*epflLrGOFtX|IY(@ptJiTyGTA>4 zmCnGCZPp#6T_)Ls#qf7*+FxtkK16 z+@(UE&|}yO^M$O{jk#Z2C}f@fhg0We;`k@^ADr|r7qVXeL04TN*`CrnXy_s#PwN@A zAXf=_Mo*{!xmw7xx@8<>u_)M}J^J7pN!h43GUZw!oAiv2VfbN6tQkRAHM0LaZk_UPt3VYo#U?9>Qll3}@A$XEIrj?+6O$iLBtxtF|46nw8I za+k6~QVwfHzuhe&&QVL=2UQ!HppOgyQ-mOf#U(#@k z{2``2AZecMHD&ibC^kiHFO%#cVKLjA(GF~tusA;Kz}f6!VOh2}pIROfmTi0QurZGc zYYd(2_{XJ&9NU}AwmsqJYMzTvK#;8!mS=mnKRFEYJ2C8276Z0n%UkTY{LdgE4IDgxF~Iuv=ZC< zn>sg1T626TgUj(|KQD`vLdyuS7yP`)P-A=Na+tj&IXl^2gu$~#SZCY2h~4$Fc(>N} zLJYaL{1;$E_rQlT(6GvPrL|*iZ)an$_xuZxHs1E$Iu&fUXnEV`y~^4@_H)C&!{>d? zrIIs=>bZuf`}2`n~Hoi~iu}Mf|~jZx(yyM?X)9r}({J z71&SyUSln5rr+Dt0PJT!Z(Y3Y_xQ=}%3u9F5#Qzaye?qB`FV+CkKfDZs`0y@7a6>O zcRjs(RMKh!UL}X_Uw)ou&JB1Eal9XsHtY*{&vF?#E^L3mYts}g5a5lq0|D=sQ@~V! z%k05`*Ms%t1ULzP6Yw5q6yyr~KH!b!T9OcUIN<%u+A9KFYL5iGpPGYJ1$cYpw}5v6 z+ukC;oy6Y(ZyH*?M0qGfu>>&BcNByC2>yOOqa3~*(i z8S<`f3D!x{W`#VD6Jlp6H#_9DWRG=`v^gO!!l|mOq+J;DW^uPvD{OAaYsWdQPIO)r z@~)tlx(9fb>f(@hgkzB~(_EejrcYu=%nkI0 zL(_kz1Lp?TAQQfy#3N^Sz>!-6+{KliTfh^@)q#(YT+}9lLq&UvamY%qMJp@UNiJt2 zoLSX_1#&iPthiNUf0&L-5_@1w)!DqSZmHrV@Hk>y@#<-n{4$ZFH2hgLp$Nxa#pkZ8 zCf$qdL3!@FYBF(HEk*BCol6{1jc~$Kbsn*&-i`xLA5%5&vT=g@;rfNFtN~$sW zz%z&o)M^Dhlekds?o`boZX$PpsxBlhk~=_EbBUYEU7xCph?}Xa8=>qad`S^MQ#A_s zQa%S>t@cy@LO!R{+RA+qQ^daXsyoNcMvI3sWd&cdx75DD!1sO$CuYejj#Vr9R79@o zI2ycnWzUmR;X6gYK`0*m(5_K5!NYxs? zL|m@6&|7QymSwfNr7iH2Y(Z;v21ZfUdg3-}egW`P#BJ4AnB}TAQfG~dw*%h9;~msG z>Uoa1qgue$KTq6Aaj#kRB5`Lmq83=*&*-9l=?eTZk9Sp5>VUTq*Q$xx!15kOom>j6 zlJ_vWsb{dQtCFWrx~rWSV^#7rNe}h^(DokSaaGse_nwh#OEw0B2MbeWFc>hliseT2 zs0*u%XU53X!!${QM>FFoDu&QW2p!T0B@jx0&_f9&p#&}^2?<;vA%PGANoWb3;84Q* zUu*x*Xk^HJ^F7~v^?-k;pM7>&d#$zC-qVX-y6$DUw{2RVq~TS`&h}})L?2!E)@j&2 zY+9S-$=k9$G_A50+waOsLL<|bLGsqUC)=abj*&e4Sbhq5%y+efT0=FCuT6uY1R$4@FI{+g}}6$9a6u zO5Hs`_rBusogisFQ1_1a_&T8})U{|B=7}C(t9)OZ=Z{FssUBaw)Z2E?+t|C@<2yiV zcUa$WmB;rlC_HuRbnj}9Z#EQ`xL~kaw-e_nPF>k)C%@!EW&QPM7x` z<@px&jMpa)z`CT~clu1CJ@RW<-<;_?auxO-)4j`Q z`evagu6s&TeZx%OH9KMNMbGZrB2IRuZz;r1-Jdj<9-HZ#BDLma4VL-kOy9#@*n36u z^M#qP*s%8(eIKlDU2#OJg37or{yWRAKzxeW};9j$uDC8aw;at8|6?DO9cqMooc|7PsgtwYW993mGUhuwPQ ztEt$CU%B>#rfeZUr`zBOdSHj)7nhLI#>-L1JsTxio=3sq^6aKzhz8H`@=Zm)T!KU6Na@9TDCjNV^=tIsK*i{Z zm8SkCTyP;Sz%%p!c6D0R{kTEv??L9k)tC?J`NcR+c`mFwqxt;S{rnxT zAO5pLR=&ISyN6zN@YncDgSGHJNIP$*Szixf;#A~L$ zaB<@6UMYk&g4Pd3H_g=Tisw+RJy^^dB!+F>i;(pAPTSGkfNWP&hw5 zaqskFMixK*vy)ESCwIa3U%UT`)dSmKn>};&&#qjPdUWn<7d$n8>UV#0+R`mQ$X{79x3lFw5c^egJdjuM1t_7jJNncI)g1li`(Kh{9{`0X~*dY z<+PsCMz#Bvvu9Lnxx&?~MIsbU~n0%r`S;9EkG}UEG91F$I@Y zxtC0x?U^w{c09O#+RW0;DDhcE?v*$C%66w9pa;8>QaOv= zIeM?8R`0DTJBxd_tC1&{&d!~96hiJME``2ZdW?Sbj-?do?oPZ9pDOR%nRm)AUa||b zOA~~6-4513`JI#Q zt81EcU;Wol_IS4TNPI%W8CZzNyWRP+$VTI0e4$hyc`xRQ;`EY3k&m zhMn*zdEdGjhvF-jPcaR%C3!1m;3eBYYg*aFBm2t6j>!7`^a$R$|8yLI*mqMTFFg?N zVNKZ)UW|h#UVG5o{ZSuR@c?R)J>W0@@clKXn#&J$&9(u=TWokZl_k1Ua${N zNdDR!)(y>T*^-QrKY3pHUnO_G?EKNlJFoc|Hm29}$(A#X2Y;w~$R3Wk6-SzjhHT&!G@%44F%$za*2d|&3~Af|EZ+iw$QgW916DluRpNV#{T!7%qO8hW5fC6 zf075TtO$2Yz3|uJ$NQ48#Q$E3CO*=*BE`uKEURDIxHu*v3-w?iQcM+`!gw~3Upyp| z(#aR%$#elb=oO=pd@@!#3%MB2jg)rL3y&sqiBuvlx1tA*r;>TO5yBBt%t_`pq_GEq zDSK!IPB!mA_9Y9M+{E$0Y!Yg@T!mWfWaLp$yQM}u`9x0g14p3cYFjNkg#JChK3W_Y zz-hcYR~U8lL7J+8B#vTBjt)tZbWk zds8AdV)r^DsY4RER`-ee)#*anGZTqyE;DQ|mb2NR@rfN&e>o5v7@T-EmV%zx$>!Hj z?Bo-%VlG+W{qkkm(Oj&MOHEudoEnzgVlrjVNsRF`Z2qBSnPH>3NH&|0fRK$l% z1q*%C9%zflBH>~#nrRtI#3U)DGp$`6<-5U1m(8Jx3&zut;bg42IglAmmOX7C`@gJNJonn2^1Ea51sujne;%C z9{_tuHHwOZJRYwX8i2e1jPcA~G;i0|x?Kh6)(#7r4 zpiFMe$)WT$tvS5WM0+B!z-X=omAWr&S~~r`y=~o2e^+a`(*)bw!jMwNZ3d2hrq*%Y z>TT@`IV3$ha&DMn2n_{DF{5xyYci!6Zf! z>4GzmiVWsWwhv7L50vI*T9boL+gQN~NXFveAPR5IYT3#a!ji>&vLnI^qLH;F8%d=y zF%*AXPl!msNz;dBHjLtm*h*v^r-*D=;S@|UlFi56>X9p;B1zk5FQ#M0Y0hL)CK?=T zF6PJ4dQjziQK&TtFQa%gcH=H${{%&MgS3nEZX)`UwTqx{EyG$cnaS1XylMfcg zrK{)WwPUrG*1U*g$ze&ri-amy@{m~5vkRvM!6yy39{CSCJV#J3)_NO zp3JiD4BGUXOvtu_u6%ebG8nU!G?2+BA^#G7^QDKI4Su!Tl?sz85GudPhS*7%Xsa3+ zUHOg->RLFnHl31pMgyVNu5=)m8AL_SPi|sPkAI!%@AmgP%`Lr7S8sctNhT5rw5f(M zCn`CBCR%LJIvq^J5=f*Ki@XW4rPXO$XUgiE=8_||?aP`cUJ>+%!ojsIXku+9+LiAK zv zc}JR#W2FxS&Oj0kDQ-I_CpNTRWmC??laW*g*|Z*Y9nH8~<%4m`Q{B?n+uqf&Ht3hy zV&o-3zvdEZPHrqa8jl+Ep-5f9WTnr86tyzZ3AQ@{KSWrln9ZW;`lHDdx;LX@t0#c2 z)M@N6()b#dq4fpVNe)ADJAQKv3J)IzQIifMYp;H$GYOF1o|lzvCw~VnX%+B z`r@LLoe_J%wkOSu0D9=IjxIBhOr@NmM#z%kxM5`%f$Tt*giDzo$)Y>K;_6Otog-ox zauM0?*oTS;q@nF8Z(PzWZ`LLhNev=tkQxpiVEefqex*?IvBFK?0WVt2^;w&dp zHlGg(JF*F@qGXPge za$|y(4hoojL^0pevf4-wj}Ahryb1dIBM^@1!4}q^jzCwR(-mCfwBuLURA0%j*Yray z51V`eRo#&__o3A!2gaT7n7^aNIV6%29ZL10TzNkRp*9jy6+sKqW^-YEa-zPdPBfUx zM4?4!ilVmB4P;u2=%cJmu-TP_ejY(_qq0CJLj%h}PUS^IX&7_+1Sx;i6@8oP!jPwh z96DGu1nPE11VP^bB+Eb~i4$R*61@ZMu?1Bzm_^&QeW0jQB5A`ziQF*k68TEUe@F)s z8c&QFRCi|>N~N??s6U0~{>J*orVhM)G}nb+ybSgGLr!l-zDFe|vM9na=xC)&g#dtkAO)RQTMwxnjX))hW5LI++y-b4Dlcts5p3^I7KS>Z4JLB! zNhqKYd`lWp)m5B}64s>&)*4JT*mmtwJEcjC=h6K_(&K|63sWL!2ViWZ#wFicTKu*J zNYzvMkZmr;qK;#TU_DQ1ia(f;bm6|LNCuJX6q|H6io?RX}Pt5*0<& zMbT^VV|Sv|nkJRnh9bH@m2EIW(Q(Pos^K@QU}i&&R~cv(70p}dz5)Nz4*BrmWE^sN z@|UL*h0#n7J))@DPB2{3PgND@Ye((2nE|5+eVVut99yJL05x69l3iR^i`555OG2XC zst=k}mB87wO}8tPbFNH|mN!Xh)8*|A9Re$#DtkS}LIR~|L^qX6Oqo5=g*Kx;=23$O zAt{|m%nV0FV^bSNv$iD{TVY$4N)L!KT06l|Z=2djaVSA5P2`I@x_kWw`Q*e>8EFwE z=^R0&f|i;>=^>M-mO#Rd)I1MF4cdR>A%bIOcXncNHieR z?(fcw(!R*T*}E^9TC6d-Bi{Vk2?W9EDAo9z>Ri=xCPCOXP-# z?-nS<8K}rzt){21wap2IU|ONZC8HwU_4(-4(c9*vE?F(0B#=!HbPq@-N2+GF*r>Xo zxFVpjsVUbo6oEpX!fhs%Ne|Y_xAe7y;Sh(O*VWr$#CAasp4-qW9hs>3o4vx1%5Hm< zC{%5cbg^O%0*0S#;K7lEiaDo3VDoya^`b9&4Ei(3iWFWTiNh!5jrKRqewEAcB%xOt zDOgp8`d*o`86QrG(goodj;2D1RLQa(Du{7AIAGfQCrlh%*|xI9v}V_LAcKt68MH@( zy@oo2Mi&hw3N1tFRCB*s3;70b1im638qQ=2Ly35xzqQ%qN8ymOMs_@zmrhsoUuZaf zXo+iE6KPlm<0e{&Wl-sJ11R;VKineHt_W3L)l<QPs#DG$5%{-Rw3aTyucCr!0pMR>z&-#KuXNA#>wvrj%mR~ z3Wc1>4OkJVGFh_`>Ytjfs+SH#)|Zr*yeN?lbwKK$*4O2jEaU_nx?)$aFo_6Evvj-} z{WF@jG%$G;1_7*MWEC}ZCZ9Fvzov_hrlr?IZB4h^<*6fL_ml15*NRtS|{zDEi%E}yJ?CfS*TB&<-+F^VdtgUUSZCbo?@se5@ zhlE0~vUX1y5kQBtSMA~cU{75_#xCQDxDHmLi%G|ZYLRP6kvX-EjmuXqUw&lmqTyJ! zcmPBqdh*DedxP|MXE3@(uR=8;Uekdk^b0FB!`C4)78^wZG;fL zh^kW*#B+cax|t?t)^+uSo#wUe5U)@+Mb<;xh+zQ4sD|bbp!b7kAc|f-kqZ{`L6Nvt z6-nks;q!KN$cbjy0>#i)0E6O3CCP7usMFWG^*aXdz$pAMarHBXMa6F(mq*hN8f_VB zO^5~B>UJ~Qfi=M{FY9Sx-#IW^Go}qj$#_pP{qOoM2uzGHXH9b~t?ix3Yeu^fr3qi> zdM0Axbb{P>L=d61Xk!_IloogDWN%i(GPvQ&e7cj|FHU=>cJ0BjKGl+=h0eTMMNxE0 z?P3!|pybHV6|7rvDoUHR{%)(Dsgo`W8wrZIezb|QZ_|+q)eK-jm?HXIDgIh5{)ia5 z+7k{HH0gOX-&7LrPZ+59&SuCY?YBzL`^}!QSFe2!rOMu)S zNG4KogE1bO8`grenMnmGOwNwxSFi1FyKZSNYffjL+GMr#UgFc_jS<45A6_5DkQ#> zW*GF2D15ESfdOe`q7}BauMM?zBnqllz(ka4CfXkLVwh7RJ)j$)*D<(GBuHZ5kVww$ z^rGvbp$v?op^Tt{$I>!fVDn)VU5zM0)}^Xycbkk{w9CK+Y%*!)?obE%7V+P}g0@E0 zgy}cttWC%A1t=^N?gi^5gVu*uvOWPjdV^~bpfifg_&^~tp`3{g;fQrADhIMXFzBkZ zc{I!kYYgo!3adAf77ycuI28lQbY`;9hG4cq560L7Jmsj=lf;iWx4)n-G#DDX(CMJv zXQ=Wy}b6W^~jU7Dt6VEf;aeh3qKXNXEb&?362!wrTg}G+Wf$ zz_<_{L5)U5ns3$yZ2cEUD8@`%yW4PnU|oy&Z~v{O5P;WdVxVDSyII}1A|J%fO|@Lw zVsKrkH)vo^!Fjqt4h&~)#=8F3c0a6qF%4~ju7!g{UI48~2N7C({90frKPZSJ&}_tA zsDcR1C#qM%-4SYY{N2zT%N6;}zE)ej_=b_U&^*-R0FAO zhUMnga6r8DrB(<1$R=DI0&$qM>a)(qGE#?a;dVORjh)g<8xDyiplqX8*nFHVkcOdG zum)TTqEi}+_!2a5NL~{bF6U;D0!%;b$%)(c|g|XrN~& zg(0lYNG>ie6r1trTw)1{G>|+Mf4_b(z7kbb1}wyX%Mwx5NOH5axx*blw9ZV%c;v0O zyNA1Qv|+F%3a=Bi13Mn-+RmkL4yO~N#igvzqm-q`(3*>)$zxa^{TdwdsQ>ODKgRzY z82~Icq0dzLuaP41NctP)G1g%qgWs(p&Yi3Xst$x~**G2OkC16P1dfU=-IKH_7_gyC z5g9UJTqmTNCiBB(N+4WP$(ZyFXfLQ;@?06sQ5~)=ND*$OU7H#pk+FYkfFuT;Y&@;% z*}y1dtd6!6G8iUsAgEETw6-wd#Rjk-Q%BHyVEln@OqE3V8Y_vkV=IioOWmE#%NV8( zIYB8L3N7f1ZHIEoMvD;kBq8I@D4p=>b<%Mt#_JVvs*+Gs>sBUDuf zNDV7R;O?htW6&{nw4p+T+d9xhpwx*0AR3X18>lG=3)k3!XfloFn@VA*MT$;Zmq@&| zushbaw6wv^+l`Q*lx@lgO~PoDbR5}#JF?@bRow#RUwbAo*x-5Z?&^gPSSu=&S2>Fl za2jAt4t<9+jJhUeqm2nM5>P<<88ND*Z(9&OVhKC=?LZ}f)W$$tr$kbyCJYz#gv(k6 zXeCljKML_X&LRF_m%kZGkCv&FHv-Ktau!&NB4XEC?n&tJx1epb1|=6tng^;+AeWTS zilh+$JA!nl&<{bZ(p30jbk3KaXqI-g1YsI5nmLpdE94vTw1F}gJ={e7L8rSXY^WI` zrPeYE+tFa_t}!rR;z=kW&`+VxFrY{ps6T*&4rk*h02r zYdy9DttOK~tQ&?bbZkaFD=70)pq&n0OZGXF1FGzI+MZpdB)(mwuiFMpGxT?xVKy2L zZ5&?5wy`WKV;DM=bjtW2nzN0>ata9q9-uR$xUzvI2*%)OF2goeugb&_TClmr2A8}> z*dSap6)z34QCD%}Lf|5R3Q!&*(7YN`Tn1ObNr&*hFg#b82wJNRNValLyqFNzI?Szc z2OONiIEVy|+ThccPWP4TVZfrtu=R*%wKGA*i9*jnC(fg#A;eCq{0LFxCzxn&0#Pg& zVuyl-^r5Vz%Pzu=0-4+BG{N7ZLs;mMV(8x_o(C4Bp%H<2_JO1W^EoDWwKX>xj2I!# zK*D|8*h;8_Fo4RtKL^Gh##AAZ)Z2s7fm6t}qP1)7&Bt1yb->dobARl!Tg-&^)@{&P zqJWv}JPlJr6Gsuk_gYpYW57R@!8sIY1h+0#MxJ6xv3}aMCC9i7jZ5>Xa z!&WMZ7e)LdrD9YfH&y>u-xzvAXzj?#35|)qLLHsMpr<|)PJ|Ss4*bU%^oub@pIC1i zGdlxKP`o}Ulf;LhJ&0pbqX6OFv4LA=$c8;*q&|s)7C%)chlmsR)5KXzdm%vAU{<6ee7&}b z$Y_rnTLt@28z^p14m7F*BfWW`vzzT^t%f%R{qpT@4YirWO4Ea2tDK3#K9-PTlgUAO z)k--$D0Y)upfImh5(mN|si&$4iIZ6Zl3ayg7$Ysx6^8r5{%$Bw8a?Dn0#SgHHk3w$ zSQPpm3>Fy@D7pP7VxvXBG#$_tf~tq1wV{rQ6BLu3#;KJd9T=g(n6&L7snuz?CAw4{ z*!!Z0SlJjW_1$hS!>79q8r=ttYjzw`OHnEsql)B)#o1M=Y3#Hn@8`{CgEAN%M?Zw7 zkVk`qhazo_yRN=)08^C8opiPxVwly~VJ=m3waG(%+i^`bsrfM@@Vu6v0S>zEV`x=4Ksu7AG?ruPsRj(o4q_qQQiO8N+Up3T-Q&>KGbM z4?7xhc<4uS8WnUxw1ABJz1X_~qSr7)3fEk^F78kJ{L_x;HpnxJ0g|UGeGdVPh z@j47K;tL#DdJKC}=a%$OxmI}qdI%Zz){CUdijJbslahlW{e^PV+APk1Qe~E5ehC}X zSP}`{fWBqp&(zA$-cAjb2_HFz9HEoR&^}%+>ZkFCFfl_V1T<(V6LBR#-^0+x+HQZi zFX%{ckx{3Tbx9(2SAz4(Y%&PI90Gw{89A&uq_ak9OT%s`4U<7rvbF`rrB!`pm;rhW zZOHEMoOrh}Zmn9Fic2_?N+Bq&V_z*M4Bbc;x{eMpDN>p#)}t95)4{}ooqN+6&xuVQ zb%w;X5EmCc23X337JE|^so(8cWiShNA))3| zxzL?NB}v2~DiGuqgQH0N__kky1VwbQKRu4o#^$zwgi?iIKH;dia8#T?S~M?P0b{|M zFVY1KqNmV=J3WK2pfw5%5fHBNT8Ne6#wEl>G%yLXlP+hleYA5lJhn#W0l7LA8gy_> zhEM%4E~#f)b2?o>xQUb|bgpP|uv=plAa4=9jzI?b%3@xJhfsWR8(xK!Nf#rAAj{5b z37zS9erP@Q0TEPeRl)X>G&Jc^WG2SV3PTW@#dKOO({W*lV%sg3eA-f>t=|_4&P4pN zcx@3e3H4%fTyp7nGxT|e-iqf9-K~Elp@> z#81rD!CW9o8dM6=6vXNdgaSJJh#^3UiNN!%A|sbM_!2uZh+$7vgw+mM-7Y4av|o|! z(&3fsO4ejE`0+Zpq~TG}ZxMfr>PPL7R6gNP4U7ILo`+~~Adqac=0&go6GF$fr8Z0G zuQ>P+Z;r^qkvOb2=>Mp6>S2X+Q_&W1J&>E#A*pz_n)GzFKre!4e3Ev=2B(b;Z_#Ff zqJn#hMW&7udUEVIzB@zH8cehSC4k4ZeqHPV=u@IW&C?pM7 zQjaF&^ThZAly!8ckzweaN$b|vkwtAtZh#C%-Ze~741G6p3J=MQV1`^OGm241bjhyP z-&)KD!y)T_k_ZFWM3dQ>st~Hwl5q?X{ThX6r`lk?fXubY$}Eq8Q3>m{l^3zxQUwsh z)zc6C0q<+~OQb$Ubrw?u^XQ=a23j$0!cju?a%49%X50`**5Dw#z2#Af8p|ND_oF$L ze2yB2=q+5m4N)Ps{YpihP^SkiCDJNs2G;^PosA)}oukZ;Hq+-a2?NE@-NAx+C;p@V+Zd>8_VaZz>9omXfZ zUO!CNo>;MEIF6AHF^!@x(V6Hld@S9!7&U?>wG|rkPQ!DeFRaKRY&+Tn?;p6WU z#;iw^@(<>BE(QlDvL|#1d?R{O2IC8M7}7fYpd2EW&{}O`9F-!;%R(WwlMP6fwr*;7 z#@H7O`7ijgOcXJF)aB`k(x7{k1=JDs5!sR4C`x8f-K{znnIA&z0;f_&*NZ1FhWKx) z6w(-6Nf0TH8FWObL6|He@c~g$U!6kEx+Szq*~~&K9E`|>FzH+&LB?$VTCN!2!6pl# zAVYr=8>?~rn|Wz5g+Yd2VX#gf@Yiha!r+F?B5WC=z3!Bnaug3wrdv82nv4W=S>KTO z?@U`T;B>W__D)!!sP7b$Voh3ALu`=t2>e$v-x$$i=)bKH7yC?Ns;uTI^%T>vWQ0m5 zgtUz%3oU3LFql%90WIn}G!mJAD#eFBQoI(@|0c$=a4^Ueq%2ikiM#5FXwPIdA2AeM zoqNMXsEL)ls;sM}ELt)enaRp*hF*zOm}Fh_w*_QwXnzDfu#J|1o>mquqeJ#M!R}Jy za>}g}?Zln75k1TsZ6lD^fZxI*kyH$p~~ z5)F}=^ck?%LNe783YJ!Y@^g1hpP!aZcTGIxf%t8v4K0n5<%4@(`+j4;?>r0;>S(Y7poF{I=_~ z!xYl3Yxim8u^oWP8-J`I^K!Jj3{*PE?JT0qR1M_Fd~`w~=M?KwIU?UMOG(G5t@I0r z+U+p46*5IASP~^5rm=0$5Gf2ppX8nG3`nFNWTC3H<<(ePb8`kRG1dEIr2?xfi>0J_ zzIlX{U(L{VNm_e;9H9*INaU$xtv*APQX9T$hXmm~?u}<79P$ubz`*X2X~*cmU`N1} z%gaj+2h{nJzd`yd1{;+eQX)9T_lpoeJ9Sqo1GK-GE)JpM7h+FhtX3>Nnc@ZmM(D`? zYqIm}r7P3%q_DM%p&{vlCuPoU3F}Cx;Ub~-M#h`aks+{c6xt=-5sBe6jKImhsPI@f zgmrUYU$;A@44*8)noeo5nR}pd^DCBM`4dbaqIoYh3bSRzldjH62HJ>n8!j_2{*4VQ zioLol#eRU+qD5uhg{qgUC!@Eo3vpdNeOPJ%t|1v_hH6q6lPP1i>klLNk+%l$0wq>P<6UGtN?+<2N#YiR^sk2 z(_zCU9aaZUbdDn)DT*`9{=$%rd6Efl$XlK82KR}I3f4Dx&+H;BR5`jF)LFN61kFY zDD!#XT$bf&q%tFbGd=|Ol8D=0JE>Kqb5|O^4J(RJ;Z;6O$Re4g*@!9`A6;VoNG+M+ zEX1b7D3)tC5`tm{3@U-UJVpZsf^|#|V>T-P+9RcTb=0hy(O5AIxR&dmi13KZQ~>De z6I)o^18xc1Ly9_vfa4Hm>p{?K9dpaoy|K@AZR^@Vb~w54WwQ&ViK2p*8xL?WYi}KL zXY;sj@reT%=5K|c7~a4Tg7jsy41J7vfkahB-sWNGx-J44en$X6NJR-FbW};T0c+N0 z5s#_6O}wY#tO-OQO~-9u2^_UZkvL~G4ix1nwgR4jVzzTNnlZ(r4?|A2*VlR9&|ncV zB%@~N3}l#g5JC;zkR8XN23>Nc$y|F_?_U~VIx(0O*Lg9BX~*h~IaK*>2}ThY1QeGs zQKmKiNY|{9$|G%?3M$s%5I3!z{$~O`Yr~MJK|kE2cAf_^PZmJ4i9>zS-bNbCB;jbS zbg8atRZ%}fEzv_T4ejth>aiV!(@rCsZo(A9F<5<=X~nu|g+;j=&B(GooEnl50b26R zK_P9H*_0@1F~4C|8E0~+k)%`NB%x}Ct&!y}BP5Xly40KL5BMd>$ohS3kR8q4_I-~y zq$dQW0E}rx^ngQkB%G43DWEh#{w-t*!9XTie@C($kAD zPXc9&p=vE8$#ry?@S|fEFRFk9kEmFciBHzzMb~4sgs|=C)u+UHiHOwFbt9zg^trBI zPHV058I` zxeLCOqJ>3x$1|AWhKUMsnLr*y+@_9smPP-l5rF<#tan6gB5R<6WHoFvi&_Y~Qp(X_ zeFkJa#-T+MMjcd5O`^&q>EhS&H#XT&X;mZO2NG`z9?;c_ULy(3O=40d(=olw3a`mN zTX8&UwlT&4hLi0mWz;>BwYG~p>0PF^iYKtEMT05eGgHM@nTXsdt(B%>7P``oPPtJjID%dfZ;}re2PwSnk_9#fOzSV*;g~C6 zr%}mDN9c`Q6#&jNt;XV%gS6DFmO)*~=Wu3l5YC244nJ$CJ2DA7GC0T%+a2GI1|r3L zLfSzV1q?T(NNsmy8%l06EyJZYadeQXP0QAz+qO}u^#V7a>tZWcf#`vn7*LfD7ne`m z+P*YJE21(8YPeD5*?M$=4k_& zAs-v-hle(5S#&`^l{L>~p&E|CVu?Uq01p0XaW801khZ6SAr@QT9_fkLH7DJ%Y+VpR z|C!{Uz(-+@Dhy=x03bVc1lBGvCd)9`ep)P3ESDm-lO6QLtK3msE^iUv$fRjkAsvIZ zE2Cj?5_8aEmm@)XFeD)>YwCF!{X-Pba6+7V=<)ECT_XJ^g*W;q?>3|D#biW4BO^M( ztAh#AJk@3~;vSG*f<9c4PS);nl|HmviO9<2w2jBaQI1FHDg>&NloU&Zbs;mL+Qs$r zQF1Y?WsDGD3>d=AB-H`6NZW78#FOD2*9`#u-%6G!YOA=0C6P8FPxN~opuh#<@KF44gO2XAn-6@}mxCnM@bYwC80;39cbtOBtAnPfKjF_~*kZR2i zV$%>fBR=bZMl#!88zL7|&!Ed|MWe}&Hi>u)ceF_g88`2m_RL>a5w4hoQ#B9c2@>R^$*mFF5l!?UV|Rk&a#^4SQx9krLLcVLy^T z5k5bb%3`@x6jii4k(8LYK;G?%brPZU+h{ftij3Ot z$U07lGS>dXVN9J4i|2G;S5pnIAx9lmDsfF2Oj(nKZS)^>%+ktq=>{8rwuXT<;ZRGx z!9NZ157rt9wJec;n&h9Q^3O8)XSvQZSLYkb90A_&>Zz86uzd}eM<+xJ087hIm&Z(X zcdjwS8FW3gS4^&i;6@uRW?d(T3Pf$jDE$eUC^i!$LYc_54k&Au=(g?owIZl4q#hpi zZ%s%A>2fg!1#`rh9QV*^#bIBy)@I(*K6l`N9Y@|_bi>qTLf0cmk1Ikp;0e7DBW>9jA* z&UDw6u?iNJsBzaLL#xuKY0M4`A~$A7D}g(MrevF!re22Nov}+TSi8@Pg=l+!P!07` ztQYz(@opfR&PHjJ>ND3%(?E#;f@HU)S&hPh9%9!X!X!Yu=s})w zX6|H3@if5yAp&f(6($<%xzw&W4n?Gu_$&K zD9$ISBkl#SUhvWKrPJ)kw$BMT<)+g#H40`c(1rf5Qa$CN6<~9 z*NV2lwa)n6{=Uu-rkP=?tPXMM=qfzYZelktJ(YQ#4wj5U$RY-3WJbSEPcp9drLqUo zUIf}|*JYSROg(%BcEK}g59l=u<2{`lyV5Wj;gCTg$+!o)J@{|zTtJP|6OkngE}Cdx z8gd(!SYH}z^p*K9rIJaTw2|59eOl_9CYIa~>FRb3F+2*|lLleRWh-D^+T{$jPR6;8 zJz6G$^Ic~}*`&@v2ql0SWH?O(Sr})&SXKl zo0qjb3=B~`z*pNHPYYV_#BWW`CV`A%LqW<|ZMgltz1&|ohZ zJ6LBFrLsD_P4$A?BSFII=aWmv?<_o<&rJ^13^)DnhrBI~n= z?$iM-B{npO_%cWkX)lPO!kR24*{FI90;bhQfac|3aV#1NXz1>0V5sh;{#)boFdajr zv(9)x?2o)j8hpz@Mu(Ej2IO5y(MA9s7FEP=CW!rkxsEw?h>E+Foe)~AUFKX&Oit~W zEX2rcnRf@u2W5c9IFv7eWw6TFzO{SG!cSoYV&rQFGPznz)~{{jGEcPu8XD!6k>3w;|K#U-TDF{Zj_2?#EAiunr9b(3pVlq6 zJ9X-5Q@&dHwTjcd=Xi`?elRE^zoKJ2dt!4+3xpaLpXym+rcR&MQ|;ZR(&yRMQ&X{> zXRc>^&(4**dhlcHCTW&rrGVJr>8ypZ60yZyk=w z^YAk(rRQCaZTH);X_jH;$9^L$G^rWVKKdH4~K((_)zwtEjYjprnz*U7g0x#wQMcKP#~@H~01JP*GXQhFY; zt8@=G%{)9WE*Zu@_jzw&zx;V|JWqb-OrD3I6)8RMU)Yv=+;2SX>&9Gk6b|rD&dLAP z_^153U0yS0gL@ILk@ItSoqOs$TqpI#{d4Q-Hn^@leaDr3?;Kq0md9?m4#l2z?|%)? zTjK73@=p1~&!?2yn(XiJI<9k1V&B~qx^-KwyG1ez2c-Su$NcoYlHZcHvg&4Tc}IS5 z4F~yGw&@;HmLIP)?|xo>vZ9m`nYt=-Kl9Z6|iHRe>5Tzg#GJEIF|a{@tJZt-3#DQeBhxtmpZA^!zk)GU)!vd67r% zpX}f6?trrYv(5JZu-X2^@A#A=?&cTF{QqdRxc@1{L(ZWeE}!@@arvaKR}O#qlsP`* z3sbVh5jn9ggcvL3N>|i|&TnPyUB;iUz5Kl|3bb)?uQC3&+jFV zCfAc=k>w27$pgrP$$m0Uo=l!gUP4|+ z-bp@8K1IGrzDfR*TmWTQ(zTRqCi}=E$Rs&Ro=ToaUP4|=-cCM1{*wGN`40IhS%q#& z(%~a($$iKbWGfjUk08g%uacLM*ONace@;G2zC`|w+(cGF-;(sqB6lJWBo8JJA!B5k zJeK?#`3>?i@_O>e}K z`{d{3j4f?Cwj*~V_a)oOAbAvd3^_ucLY_ljP2NiWlzg0gmVAwTpTy6^Yrf1OcO@5- z`;zTsh&-AcCO4AjkQb4+kq?khkiREiB|jvmLzj_qt0Cu;4dj93YBEY@$gh&$ATK8$ zCZ8f-B;O=AkyD^U$@}M#i^&f1Qu224LGoAR^Wk^V$Ul>Blb?{&d^R1k$y#zD zxtwev`^dw|K{8KXN!~*KgnW#AmVAkPliUM}vE)Z1c_4W(c?cOL)8t9y+2jw%ACdQw zKPP`fzD&MFeoRh?IE;hsYv%3VAMh33(lPC;1Th zB>4yOP4Xjh3T$3U-!|kf0`fBQ2J&w55%OvBC35OKn~vFJ zExCwHk>li7$#0OClQ)u&lFyKTBHtoEA**(^@7K8Cl4bB$vk-ic_#TC@=Ee% z@?P>$@{i=-$bXVkcVj+~wd5jlU$TP?lMyma9!s81ev7<4&CLMZQSBNp2#i>}Aun4OvefNUkQ=kqI(KoO zewX|Kc^mlv`2_hY`2p$K+ooenatCrxaw*wN_K`=B$B<*>SIKXZSCF@m_mRIOe^0(f z{)6-{wCU<042KgQGO7dp%Uh+}$Y4RoVZ{#Mjav%HtS>%r7o@5i*O|B#3 zWR^URJe~X|c{zClc^COG`6T%Q`5O5FS+~fhZ-26jJcNvqS@J978RS*ut>k^=FUZ%) ze~=Z6?fbSScP87&Bsof+N}f-CkG!6|i~KM0zsWz6e#GDc{lk8`84?w`FHYTa_dH$o_6vmGD#N5 z6UZ~jZ;{_8ZzS&~|BHNz`~&$0`5`F-QKH|@AZy6o$U1UAvV#nf4!NGh3}JoVDdf52 z#pE^QZRGvrFUa4LuaIw(pODjEIP06M>M&zk35_lBn#w8QUaloFZn3>CixLrae#gQR^$%k0j$|5xr983Tut_qF)~9QOMZ>~26-8I zJ^5quA@bMc^W>}K`{d{3jAon88ge(Xj@*yzAVVZ3YiWP7o*X4lAIYqRO{k@LvK*Tk|E6JzG7s%Jh4@lE))3F7)9XX$@C-)~iN&E_~)~}<KiFvM?Pix5-xq&=^Je$0jypH@a`CsJI=$-~JZvPhmxo=aXrUPsmB=Q^N_sN^cd&$ShXUUhzx5-b*>K>bpIpl6+J$V3mFu9H#APeNlFZn3>H2FvJP4XkMVx4{OR^$%k0&)p? z5V@M{Cu3xWJeK?#`3>?i@_O>e+&e$@j_6$r*>*^wyBOk#*#LWCs}{k0yu7 zjpWzJZ<609ZzAs{A0wY7UnbusKP9UVv+0{d?nc&=2apGo{bZcnKpsz?NnS`^P5y|y zpZq2HJMypO`=mMCrfVj-J-L8vBK>49c{n*l7Re1q*ykNbo=$#~yqvs&yo-F8e3E>D ze2x5oG)LO!Z$WNH&LzXqTuQc+ zSZG$|(oy6wtCFLO{IQcd5TjZ7G%j8?+$K#j3&_jJ8_2uK zN64qim&m`9ACuFLVY!m?$i?J-WGA_njFK7hIP&Y{x5+EXTgac1KPP`n{+WE2{1-W6 zy-nYCk^Z4mnI7OMadF4tX_s8~GslYw{1|o8&*qX~Q;M+mgGH4dg*&4|zC=ALrG4!f&f8 zPb0rUexJOV{3-bh@^|E`N|h>VaK@+;(-6}gOLM|kilPzQ)c{n*p=E)PtGs*9eSCTiA_mYp2 zPm_Nn-y}aGEAlp-Tai1E3&ud~?$$tTF?$=At`$SDQp zBRP+(BM%@~lZTRnBo6wlcP^Gt-(joFd=dkB$^h1_4t{e8LL%KaW8?mLqEQSRe62KD|i@+9&? zp1+lRiu^O_9kb8dmRw49l0)RN?DWCjpTPpgFh+1 zN^%Cd6**6c{NJ72hpZ=?$#$}bTtmWbqW8nRRYJX0LfudvN1jNYD?~njgS?3R9(f~q zEBOHVF!>Dm9QjA`74kjuALLYzecyCa*0z!N%UU?Xoyd9Q-sEC(IjQSF;QE8Puj@fz zf2zD^3%eeP!+UjRkNHG*^bXY`q%v{?wHwL*&g0? z$9gjl`=2iydg%R`-iO{lamlHh8tWGhU2)1o?>~U;CH3o1uXtyxis#KMqjHTmbn2!$ zoX1&g&98rRtm2)Dic>e$>ai1JSK_Ku-Z3$pkDa<{as7H+S+U!xn|9Z&6LD;TZpqn& z_1EL<47{}hZ`vDsyPh`tofAXb-Cv12j;McgsN$UyDo))rRKMbltJt=sMN)7vZF*}_}7_l{5Ay{WPG=XcNk;KUPr z_j`9WyFT>(s@-O{co!C*tXP3S(s}Ny@_moIYW8{esrO#3xaFs>y>rS>kGC=k|9bkj#X3Sypk-BdPb_{Vb?FU&`Svf@(%B-lI_K`Sp z_iI4QpRF=8u^Tph%W#akgxZqEDK( z-(}dGl3!t_HH+MvQp8rvUAl$ktEaU+q^Gf_?6me@=~3D2_?>RzH(RH5{TZ8H3GJEI z^8;*7t(+D=3@vrqT1XDNi51)ACEmAcPqhkkT285=3{4i<>~l$ z#y9ZK7IM;fZwlkwaq?hqVl6gLkaIKV^kMUHk7W7uO8Ixo>6Q251oEbPi7{Kry}!f% zvwntuc9DYe7W{PPL^*DJO%-d`<7DvMLSn1#7*k1)V7rSC#~Pt|&FZWm+5s(dHmU{%U{CHBs$^8ITS_R`*+QG+h2@?8b*cU8vwkG+g} ztjZ@b+ErO^U7axxO!wUr#NGyP0=fR=4BwG0*vok(ym4#`tp-(jZyYsd(>A{EF2lKk z_ve1Bkv7|R9eVYuqW80vfY0}uB=&pWWAFjn&G8M)!`@~3IXlkr{RlZxb-DL5yta0Z z?_2VzS9s^*%1`I`T2T;HSL&Xr@p(`gtFF?$${OFz2V?JQuVimkjc)-eX4N(N%q?ns zkINgb)xB9YzBjhV-VgOkUyV=3@~W=ay=`lJM^s|(2Hl%e<9h~Gw(3URtEutbwIB9w z(!K3!e7hk-s&3W2xi!AMB`tS(m!k3RSmP_8PmjeoXh` zHNGqM!QQjp-yyS(tMLs%Q){-3;+H4h}V%y9qE{&+p7MPKBRK?m9wz(vhGZo{gi{9SG={jY^s^FV75Hr4R6&{ zJmJ_zocfzrCCls}8c6lu^}0%X(_8LMHB!Z@|LJYTO*O-&`V;%onuMwT)VmN5uB=I# z>d*9rQ|-O~(w%8$&RJ+NmDQCMUzHciiY(PrE9`e4Q;(f0-SNymY#ny0b;mo~BOfze zcd&-t?roBDPgIOSfX@A`-1MZ~c2F0ppQ(_{nCq3Ic(y_^Ywq=1Vf!}~@`-ahQGC_E zx5s_e*nZw_=jGF1(CzK<<5Q;k5BB(HkiFF}+U;*b9#sFaVwpVid3o1M_V{zCOVuyi z_kL9h`xSd!zwXZ!l1puiEVw=VSYId;L4;>Z<<_Yi|M`Rnct? zpE`Y#YLZSTp$_TJ&`GBWB!r|BAV7cs31gUN1VLsHWS&8pR8&+{KonFI2b@uH1O*Ws zQE>zn6%`Z}XH=ZfSO2wkCy@8v`~TnjJ^$q)-D}mbYuBz_yXuVnbxh6^^ptM|$A*0s z1k?oMwC)2Db?Tk;Jcu+?50RnXUt$3(FyE^8kC-;a${Y)E-h{#fD5QDGEukr)rSlM; zV%UKXQ-)m(D<+QNqGjI-FG`$o5gaWuu?$Tn&MM;a(*sVKIQy6g;QbJZbKVDb^v#%Y ziE|m_z52;Y;CaM8?0YF^{tqaW;BdyviqZ$7q!YH4*(4RM`Ksqo`khIr(}Tqf)ATLKv>r1xG% zbL&IDb_YJR3)oemnH@mhCkd+1Ir$(TXvB~#6$ka&_}6Ek zNak6vSlGYeWfte)Z>0R1zT7}u)0Z2GZM_Q%l>a8;n!ap`^@UN)e>0_cCA#@<|^U^gvFP_lX@n7R#0Y17fc}fq3r!kb~;eS0Oh04-=>8zaYo|5wUC8 zFOYovHs$wgj!EJ_x(@QiuAkQF)@OCPb*xUeKCjcQFY0vb%UHMG!;y&pI5oy9GZymw zUo{8GJjSKM|HF^9O`WLI)Q@$V`YG0wO!}W=O^Gj^WKAdLOTQ3%F>E*E+y0py{gp6t zPa!6;|BnrbuhO4WbsG7zP9uNC8j)f8SF90sW{BB3|R_tCkLFaj7xtXB5{n3m1ZdJo0eVwoYdXip)IX^{=mONiGz zTLjWuh|kIi`}?Xa=pC!wPjF4=`wMZ*Bc-S?K!`VHiGf0VW@j#P1_?=tnPspLH)fV0 zLV_`~3>A_EtvP{nw)ulwjxjkfed2V>-$zY@rIrMy&zfTS&l0n( zHnLz3lSa2%N%J_{hN}p4vm0W6lza&dY9Ge&Nb;ouUx8_pFB6#A32>Fb2QYHUSN@G^ znb~OFm$I+~b5g&KK}lKk5|S-VPfJ<69MI8UwE;e#M-N`h{)1w!YK!ujyw$NFHR~DH z-7uY2DJ1j z9K_deN-uHry2il8nE`2kC~&kbuum@=0bDX1I7N>_@UGu%DX^<=hCkMCej9L54`RbD zUI5P0Bj8T;Tb=|C>&1w^^;-oIIPZ`yweo*2~3&P3@7(u z(;TEZ&gRuj^I!6z){<)Bk3=H+sbC91s_gKRpagDh1~WkEr+u``HA zPJ3Z0K|^nxkdS#C*b)F0g%#q=SJLj5sx zOdLpEh!o`+dk(%Le0P`?;hS2V$QlPj5n0>;3}^-3d`BJAw3A~#_`-?SogFo##D2wwxVMn&F2{aaP!b+o)qMV^Ew?opA=SW(_o zkt?wZZc&jxHGZG~F>oYK?5W5qyBHb{_k6V$K2jd*F6)_0D`;?Wo0wps%N9+sG1=FV-d-J0i^HEipV^EV9y0|CfajPLGv-_@8lKPXyHKow;a%09FQiU77Bo+y=K$r_ zL*G3~o|xQqg&=-UOztWu?Me2;G?ffxM9m^mGd?DLe64iHN}Jdop5ZC?Y@m?aJELCPn24kYd?kHg>kWn)DO6f;)+7%E`x9Sb!J2bc}yc%WLw# zuH`va+9`<4a^n?WF>0h=UL^{do|u1bJt2;{6k59pLcC@?W{{hxzLCBqEybjCeTqWU z{vHT3xaZjCQ(9^%GDgd4WSL9P0vRJjnMD|2cdQWGL`Hy&6XLOw=D=6nbM0~nNP8HQ z-gT$gpHf|=(48g3XEwr7-MJETQcSZ5$UF%% z^{u3fXtMeCr4U{Jz&Y4cdfa99T?k7tBdoAvM%YRT7us}n$5f_*Tq>m!jJVJ$n~vi% zw_$VRUM_XYOws_5E9~2mQ*QDRD%~q>FRW8xTF_LhZH|4VnStSQud*Kk8DkzD0&=xY zH=bbfD?zRiBhE7?=&EZ(^rAqIu5&GSt^EY_ToM~wLK$nEzH~4kFM;QA?EkT?B>t|1 zyWakuos2@OtseJryH^f6$t|e+g#82bMvr|U+iMKS>nZMz8Uxk9qpv?LgSHVrT$BM_8eDqXHz%QW(KimODR;~X4zIpu zZb#&F)7tR@sJ|YcmvJVZ*1Xe1hPO&!Iqhp4^pl+LnyD2P(<2JbbeZ3mP%=e z(mX2}m?PUz%Ov2;OJJ@LWxmV>nJ2_H*)+g>As(}qbrvXY*BsLk(gF*G#G60Z??pmz zI-n)UVj&4;725%lt`IWRoP~8KaHWv5jOh!q zTF5ZNH8OCOkl}`lWZ-HcX9u`S2Cfk@!kj2T&Ke;j4PU7iSS#cl(}mL32^nSDVm%04 zD`d3!jaFYTWQ>_q0dk#?v1ZgLkn4qvGu0YogOKs2H$rD%qmT(^G+ZTcgYv>ZCdVQR zU#=_jBh|`!8y?r+6CBHIIjRhf=W&K5hql293@eUKMM`iYact@ar*P`Jx*CFlQ-|W* zQc&}W^5C?6SWq6*UtpkuGw6cHbs^Jd($`PQ)sosk@@QOT;MJiMu z;~cz_IZISXA@T-SA4bv&6>3)na?j5&`#u%omM!?u7qId{6&i-17<`mFzLP4{mt-%; z1(yX6P|;^e^6bz$bSwBgty6>?56FuorFQ5Mcy#b3k}^BAjRUxkq}&dzr=qWrRM;U! z@+wKC9a=dWWdAYPwTm5UMZ3Muknp@6;x(_}8|=?MJJj0?^44b5*>8s)$A&!kHp!cI z=qpV2-~p0@b|}hWJVCxgt8HPf}fCRPv`=YBP3o=Xg6kP@F+<=Pv|I|KKLm~f+zHN zHi$%UpC_~hhd{wEn3LiOJ%l|_@Hk1TC)A-m$X6uwJ)wpqUy~S5=)n;n-;lVT(6f~G zElC4UXipNz_atea5MNaslzS?I9yiFI`qf()?y$!VaU6p(Un@OsYwWgy8N#YOZo39x znZi1G+*63o!ED9XEOqv{L#b_! z#u%Cboe>ybl-O*Ud*L^MmxMT`KHMv?Pu3Ezl@@`nzQD(75i7+HM%E`amH77Lz>%6t zrP!MUjtcQwN#|o+1D{GmX?@_jBLl}&6ca}FD}gT*{nRqt2Lz5QMiXyQ%CbB6T1}l|7tpvx9ekHTJJyAv?C62a!PKEadO6*MZ zCf18)HM_1K-~fRZ_P@fXd(qNnU+0-&UgWfvz15;vXWQ89>=JW#B68Z(Wpmn_`_kOFDb2 z$%VfJhS~SRA>Twd`Eu*DxgFsrfpcs|aq}jrwkXq#c&Yt};Rz!>QXe$laH zFz#myjJFw-3@^C`Cd%n4%e*oSWRm>@M%OW)3LZDoj__nIUAbSw8?|rsy-xT-gg`mXLX71B=ZO1+af+H2M{SWvr5|`k%DH5~BiF z*{>pQ#1y=yM#1meqT)K~6;8)w3e!Dsy^u2ViUV?! zj9jHDrW%`sbTO~cU^mOTkZR*{fNz&Ny-ocdAot184>Mgb=>xGl;YJ1);0cmI>_)hA zO!F$_#O{L|Wm0>BJZzVsYh%p)6!3_U$z}_88;=T^WfpSi9}}|3yq*m5xR4cw&*TTT ziwRbl@8~W&*wd?1~8Ou4Il-mbwulX~AOcNAi2;B&b(^Mr!GzJUprJRKj@RfZae#hc-2Ki1)=z%{%}@@qb= z%na;8!uGjgWayb#+U&`6T^y}+M6mVQE6-uZHL!#&3p&m*U|?-o&y|*!uw9mifxy)Q zL;-shvDeD%0vU1k)pxP-oL0zK!&q-=9wOUoiIwJQReK!|BZpf3`V_$_p_`?PK(4OaDlXK4&3Y*BgURS(-eWr+4iyrLvY++R7>wr>o%% zwk%TdT3)FtYn0BOjpvhWS)#mh>xeBYR6YIPXq5ksauT$>;#U@{L@lqo_<=h3^wU)O z1k3pK&W^x85-01gG5+>X#3_0iJNz?os!r(ye3H1nz8;;he<3!S8-Dv&Vpns&Z~sQz zKu^a^vwtT}(}6hPKZpa`Hw5@k>VRt{*u~rb;x;fNo11w1Z{lz^_VD&UgpIj{w=LPi z7n#OGQB?_PE(Z#>M;6I)^EZ`?7t+S;z-nk~A#F`%D-f@cc1B)LnjoaYOvP@__6cck zu7*B#l8_FvxrcjF-;Sm=);~L0NTreYc%>)~XczM`_Hno)ki~i%`iz~a=x}{v_a!}q zLgKABAKL-Tp4YBayuxmd(ow7A(9kkpl5`e=bB@;_=4RQwReA}^@krC|D>!zfX%DJ% zq-hV9N?!9QHp%u7m4hn0Xv=1kc@WPVkfnW(RsUJ6M=8o4qc);B37qygB?koN{*I_V zQI1U=vmEN%lWGoB2eNLde#sq&eN6p;3Xbt&ak0OY(ej$R z+2mJ>s{!^bynBAN-Q0ei5_s0kE{kn+WaDYKvN;#L=5m^(wGdy-OWVu3onnU2Ejr55 z=*rH{u9E#w&~O82cec3>#5SIGS6RbmnX4GYy2ii5L;M{Zt8)B%0AETkMu|serQDo!_ie_G~GQi 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

    YF+B4Dj#KAoM&AIv0S?z0xq6iKrySjI$I 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%0DdeH*{Y~s0-25vHQw{66!VGSLz7p?B^l8jK^}F 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 literal 6151596 zcmeEv3w&Hvwf8<}CX-2;Ch3_plW7MsX-WxAfxIXMT4-L=geGlBQd$t1PG%;_&`D-G zGig$&QnU(JK+99KsC-`J^3)cJ0)nkll}}MyXb}W73J8LFQ)uhxMfm<}?Q>?%Bq?&e z-g|%d`(1vV$zE%(z4qQ~ueJ8tk8@hF)E^HFo|}KVC;PwJGin+Z*PK~%R=vkl!&&BE zkEfmp7{5MW2XE_F zDGe8k|9y%@+4iyj5zm~pyTyOxnS0ron435v=I(xV+Q)4f6z(&h7Vf6Dzxz31tVaA- zJmqI}iT@uS&zMJi*r(zn<6_?2ol~C5O;zH*@|pj$_2Pq`lir^%{=Lu1F}pCHs*wg^ zJg0nWOf3BLb^qaKktHI` %?iNE!ncFHC{8v6_zY-Du9nZ3Y>%{S% zb6cy#hkiEPF3$ZAJj?Sg5&xY}w z?-S-{;6YRAANW* zFu1{&Ncw%@gwG!dZwd*2FzD-U>T@iD)2<(m`J!5)KU~6F$jJ^d%C$fIp^#zUVOXzbqOaK2BC7ASXtFPirVH*N^+9h1@M%;q z)E|l)8NkMqRE)bC9u6mclNd!~>1^uzKxjA=Co%N}hJE3XNQ9EU!Ei7bLdOyiqK}A} zPhcqMi^ap6OsLSNqzT2%o(7d&Ff_bzBs3E80V_ELLz58EzCkcqkA-vL5$K^GVUj;H2Xl^pwZY-3@)+~vd89;SrLi$`6Df%zL9~}VSisF#3V!h z0AvvNpMvHPuNtHa;?RLa?>Ls{JF8q;HcyG9q~eP&M=mS|ugHw5*zF zwJ$Nsa6Ck^G$ACj41shIL?E?9b|r!FT@-K}-VSfIk_A$DfV^O*^BZ7?;erUGnkL z(NGW4E+4KU7(oU*SE_JoPR0gkZel(@E*4CCu84H)dL1FmX2YR?VJ2i78Q;xw06TB$ z_z-JN8t02dbuTpu9}dackojciN#2GZ91bN%qwx(A2?dP?d|4Yxe~2u{~-WCh`kCvj#Kp4QZ9G^Vw5%J`eco(M(Aw4vYZ3Z?Q9 zI~uBtg2;iP?oVzQR}W<%PbRwt0Mj?8A$azVzR{tyfuwPX5G0f_n$U0{z8RBoFeLx7 zQN=?8aGk(Yct}+lg6HWds}AzOgGqy`aPP0l%!N%et=_@%eoJb&WoDx(-!owRV zP^T!K>H0>3!Ofua$6%}ECG-HF(fy+sx@1Viq(wj=(RkW-lGh}RFN2DY3=boU5G~Pe z%&mwItyQhKY^zMZy7* zf$L&Ix{slO=0v#HFWhTdb6xkaK9>Ot^&!0@j!+pA_ z!jYhl$t43=FcuF6Dbpk{KQl@Wf?=0LB+wimY%%6fLdJ1wFe#Y))66R;E<}DPZM$61 zP{?eop%117h#Yi%wI+dBJlYpR!rh^XlQ2kUroo`a;Iw&#g@}F)D$?Y2ao5M#E4VS_&8%N|myR z$Y{tY2r-?P)h(WAeWb7gp&R>v_!vYqFpTLL?kF@kkQ`*~jQBSTodPVABV?u2)>A563nj1l)q|CM+Yw(;1cu&6M2-3=!{Gncq2`VD54@ag4UTqSg;;; z(5gkc5-hoiI+I0^*})MRONP3N1-(gSD6RL=Sm0nx10(S`&*X9|#ZX4l5ZZXif>~{j zQ`T_$JpCF&Xdov|lrr|`6(6-f6F||h%ZN4`$5RW<)ul~}Kj*9M z7TrCoe7!5%yL`>jysIVPZQ;LNbzKtf>PZt3ad+=p z-`Xx&aHwA{4F+jdO^$))Aa-`r5hVK}a&RCm9|7>@(IMCil$UyufniLWeElQCfeZ?g z5C%C(CF6T3yfbn_yrvAMDJQu*gUpPEL8pt8|LqTt@hr*P6lq4l8WUL>$E!hI!G_aV zaz%(Wr{IaVu}@{RBM}<%i_1gtsJ==w@W!A~ESzR+AVo_k0Fl?N3~g?qO*nundRL0x zXbV=WJ)tB4tQ4a$Kf4C@6+Q5^t&Lr)JA|BXGB9JotQ$fP>bcoCk~c9M;KjSIt7oN% zB{pEx5XT@wK$3@#67VNjmBtgpzL-B89}OpDzC;s`G&;EfgmTWrPDj5#9HE#;x??d- zZ85}{u|cd*LyH@@&J2RV5U*)tqu9?NgT`pliqKd>vO7iI$S{Yha?di1)unW_tU(B= z6VbTnpq%7bu@I8hbD6*8=H(FBDfV3 z4OZP@fMiQ(0_&g#Rk=$VB2Ao5IJV`KMZUhQ4$xY^jSgT?YfHVx}4&oH}kGXW#a z6#h^mivz*t{E-Btf(e16I(^rV1jcTPme$$cHjR<1TvKS7ac(dSp7^pbl268Eka^KM zk@1-gKIsY#4%Cn|#zdLThFi$(mEmqY1U1lOG~yr~rkN*uAv1y;yBTI~eSsl3KD{%< zh^VF@nHQ=^Qw9PXXjMz55{Qfhu^cxr(c#GE3|8N;N^Ztp9xdqo;h--xCN3KxMb$HX zlq-lGqBh!U_tlMt`@_6yM)1|=PlN*u=p=RYmjX6wDy3=a6KnXKv5DYb1b^9}HyZDW z_9q*mf|zlAEuB6uS)Vro--8VW+I+}H_Q++CPACxf_&R&Kd37L{6hP5}vKfX7Vl@`wYHBAo4F3@&|@QdKZpdHN{F9L}JuDXAB`$ z=DkLaKj7z*V?6sKYLfAuoN5dtH3Q4sY4db(%l$jwrhvYqM9ve7sK7{sToP~eBbdNW z$mKZJ$3`e`_vxpIF@y<;VSTez=ZA11iQ&P~mNWs5)}SkB3ZgaQ&R&>0NUgGYi=!Vl{)M7jnex;E85I7+#uMjD9B9L6kp5*v>5 z0L!N706HXNVV;w+N;4)?+L)sH`+b9>ya6z!VeI@8kx&RGGeCVqsEdPD>Lk$$xolz> zK9*6;AA4LdS8VdvSc$=iHlcY6(YvJvl)_#g~mr_~2yF4YpkNmrQlF~odV4~LpIC$Z0q{g*7vS~`N(xpob7;kHF6DRGjF zDv-zVEf5ix=Nf$38L|ioP!{tCXjP+EHK_|3sv%4RbimC5k_8FHQ=8r4d$> zF7^!igV9mh5bm=?fM5+r5u!03_iy%fcKMdno^?i}udD4MUw7*YU)PGsIlb$;)^__k zI(tQ8L!VqG#iCJcBLd0jcQ_})UQ_B+P58=t+E9?3QPjn=UzCNs7d;^HSebN4Y z%&&q*2W)%CSn-=SQ?Hu*v^6xinRcwEX6Pk|@It!TkyzcIMZ_$7C@RcCuL_NFPCLvZ zE8{ry+yJz!d2l$=J{&~co845#aZ9uDy>XZjNj$56)LJevU1KNrU-o@U57L!Q77Noi zM~C76vb%;+=^N_BsT*cBctFZHyB%TjwK`VU?`$DSifjRAaM@jEd~cNXh`Df6O~aij znCV^yml=di;S8O`kqVOq;r1Jr=ykY+rQd`~Bl{^*Nsi&V01lya>H%1Fa*Sq4Y<_OS zWgb5*pWr+Uf&>Ugqa1Yf%R5NKkKF^#7I ziVZ(qDbG)|(UZmmadJ&t?FLK0`sTZV$}m-4J$?(xO6Sg*6NI z7v#K340Os#ni+`DJ%=nMK%j+Xlj-^+m6oR&nJbZmV}dV+wk#b9FxV-+l*dF zvTR&>K+=m!vtH>-aWjgh$#jQFUjp#cShJ^bP@hpcQV&KmHM0cGfgp7RGa>dhIOI$h zmNGqm}67p6CLPkYqOmlPy%ka>oVp!e5Y_pI$ zAwr)lbT=+q5bb2VPEMO5J^Hk2G{Pt{U0!yv$xJ7eoSKbs#bxU@f23mA2_$u#NWNH5iVhP*bgDm9ax%u zpedB+!zP$g+TEo}~q<%qLdg<;a?neOA%vW!-afnMo2=y{Zson%t?qF6zBw(j$r()DGYYh9T3XDFxSPSdJlrfMlcF#*EljtQqzVSH zqr!2Nua|EiOZ8~(kRz3b5c3Wo{?+BdyFj2JU$c9$8|j)>coT%9V?i~A2a7`%!l+M2@d1UU z-pSG*P!y`u+S1(I*o&zG`)?6=M{XtXz1?G-BZ#3H?rdykIw^CB!>EIE02iWkn0nSa zyeS-y4i8~pGtG)F9(Iien>xr(G(l8GEg3PG`kFzq8cO{LZ$gKXjr|aE2d<}Z4(UyJ zQ$}eRl&aewHQZ4;yE%hn8r|(Rdsj0^bZnJ|F|i3?${Gl@$ou<5u>$KLDJt5eY+uoi zo$i(}HdBb2rw(6B`wCXrE+ekg^t!bzjq|wCnr5BpT=Z{=zdD-Yhfvd7qyrc zy&Bw1UTGwuZyxF440VqN-bWftX4=X0UHajD8Y}mlSe9u{EU)8cFm0zlAZuk>M#%uG z+q*WL9BjkHg58!duB5Od;YFd$f^v<@XlYuarl#YThZ8<-o_FmuS(rB3*0v7~T&OQF zsVUuP8Se;j!w9P5ogyQzAq}x=XGj^$&@z}IhTBB*y0K^=MyS{XA+M>)l$8OH)9p3o zWB`O1*tScCIzvNI9FP%HFK*47z|JTx^JH>mlJ-HEn1()#u;lU(HZL}`CqqMw#+b!v zJHw2L#6P`k0wjor;58C6LDyV8`y zOBf?Z0(uTKC(>5ejPRTZAy0irnF2He1zjG1ho|VB(Ng8p6Ns-+uY1yBf_%U2HoO;Zf=!Wb}3nO60_Rd(#fKbWVBOB;vlD@3!S@3 zW8B@?g$pL~io1RwJDJw#UyMU7>;up~k=)ss#MLY$Q)P^%u1-fjEm9X5ZF1`I7AAni z25z-%1`b*yv=a#R4TO1nikagA5dy`@<@CYno<3I})#K!*+dX|@+5GAA8oL@>dOCQ3 zyBj$)Wl5Ne@Op@vOWiXJ$43ZXQ#eUG`!q<@@9sug?)h5iZJzGNPJN)WGDTM}j0T7P zSQH8>0}n&2^mQ7}2!=M-rpq3OpzintLNddemfzJ$H=7bI(NVmeJSl_S8RcRd9=a!b z6okD`l1X-^Q75yYM)o8_v1~@V0;Q3S z*h$irLBPqiwRDi%_F=|Apdn|`NmU+)iuYOA#)tt)KsVv8c!;~j>t3vvsf#^5G<;pH zt8f&5k!a~&-POKog>O}Bb8AmeWA{a(xBH?j1h$H>`f2T^7wcPnYq~P&mep%l;Y8ir zgzI4R(kq)eCep^?px*lQQC8!MW?ye(lc9L}M4UP5GUwA=JPixpi)vkQTo&g14`wmV zftp_U_&JkL;66lyF^)bQ-yOHXM*gHzKLh;%((LvJ!%-RUV@8}JOjGu81kv5t(!Lri z9sDZ@#c?l6@Cr&w zQ}6MIDoU08`-}d)RW|zmzWS!?C3NPD#eYv9KUBdfJ^YZRCiU+_l{!xE8kYQ>z5Ck* zr|aE^DK)is=~9y{C*uTsZB3J1peeKSgEBj&W=j7B-!;k5bWvqxuvzk%SSA!PnHDBI zHcy$Ez;4vW4V`{$P>$)$u*VN0!|J_xrEVmR!OKPxa(M)dz6b>$B=s`Wo&o52Em7>u z>uH)cI-1klzB(3xqmNb$jo1=4C^NY3F<@nD4J5X1rw}&zOoV(Dgjv#p2*k37l1nWa|5T#CU#v%ZxnS4qP#Q?Hb8S17c9|axL zpfkbC@p7jrl%5pzGVx@Dsj%9iyUK}CdKsrb5~XuVJqH_Rc!OcO99iagC8pvBM`OX^ zN!+oXqF2nat4xd}=!W1VY``DKeQtg$Zn_-2a>@Q8n^l}dO_z5j6^ZfZV(?`TCeLg* zNSU$i$d|0Uuv>`X#339V*RxFUDjEXzOtyZlA}g;mgb$oZ!|TSo^YY?FHibXXZbZz} zWOrj{LpPD>N;h`l73gj_xM_;QqwzXzx~xR+$Z!a||G0cTO?FeVGqyU0;hrW>=h{Bp zj`t?B@^QUwnA}6=x=6O9;^<0t2`Rtx@w#bKA~8iijkpg$3mE>SSC-710>kYC!`MpY zBj4`ueguy3{p3(IOb91tAvSb=%t}z?A1g{hLgWcdq%X>7+3@#CCsi~&iELfK9 zCAsL7dK%mQbc+pm(FHric{nB6AUgeH*!T?xSK%%YCTo+5%L8LVGCAozp9E&~z@I+z z!AHn380i+mAfM2-@O20sJ%~vi!;IT_a4yH8rd&F)N%IPWJ(bcg zsOYTZHJLPC?qQ%>EYl%N=>-6Ggp*0^ed18Q=(OEp_PtBs82eQCSj=ueZ z9blt4T4|CQ<;z$4*%{C^g=up!=B@EK-Uj4dqNWji@2hJ=5=S9&0%^+BNH$Fa6g3YG zRiht#)3#Ci%DLV(R;v%lZ{a&zA3z`nchZNmbmmldM@KJjQu5tW$eeCRu82oRV#a{s zqC2jh53(_$F9yg)$8dlTFL3L|bo1AQlY|&bmQU9Tx^&Ey@ug!rW(~EsG}BwRL_-G3 zAsJt7r0b|%-FTfLt!}4MO7 z{7F){l%kLGq%Jihl8)l8gghEMqj6HUDKw{En>uB>6=SNE{g#)Gm-Snyc)dy91J;Rp znzP}wZQ$%qzrKhIRT~gWWb|=FehV^vg-q9qe!2^3zV?VomTwJ9A&_0tWnu|Y9)04i zKW*aDZq1m?HE{Ckc$taRiPVKbiqiOyjE{X}cW_qQFK<+V|Fn2{WJza3x&Vj`i1~!b zghIq9LrvLSqH1cIjOq4H#zC$|Qn?2$j$&)@FJ@1^5L$6UxL~@4YN- zCgd3vgF_#6qbsot<1;JhhJnI%EVN9%;6O8wX%aSelPRnsr(nRKqOS!}AWNv`Aw->Y zze}|Dbo+Xndhrotxec8iU5T#FHRM9E%TGzFmUo=Z%EQCX8&`%J>6iZ&*PKyDQh=C7 z!@;D!Sfh@2dnr#}AxZfp@fEiOy~tD->@yj#@k%p|O_=(Vw)%~9qE9cE)4gSSw?@9` zqFZ=6mkR2cRCCty?##OSCT?riQjoFIlamds9+uNy3w;~{7J>V4^hyg8;7orMC#k*k zIw>R8X4bS4VH_wG`f~d7orYJ1Kl@a+l6VB_VcWmiJQ670lQ6$cH+(}PmxprEN z@daU7sAUDD%ohU<;q>w1WDtIlCSv(DlohSMRckQKEUBv%t5$b+;w_D?Ml*5}S#8}k zWI!5q@adcsKD|tl!Q*%g_j74bvhi5uAv(xp@YFokGUV?zf~hoXyrdpOu*2WSG_Jl5 zps@7g{AvroiIpx8;E!YI*|;H`Kx~;76Ws_M7{;IlN!9#(Y?aQGD8AphHqtc|n3SQv zMbz0S=_ELbhQ5J>Ly#7ONQWm;$>=hTG$KsD46D1xdIu)Sp$=k{{fhJ5e1s=Mm>n~M zj?=sPhIrDVzzbkue7L}P2R2=y^j5MPX=1wdon{fieSdse5OM~C{;4rs&uB-8zk#aT zSPR|`3FACG8yf}=O-0kPgKbuesrWvrN8FIC0)3OOo5PtyS$fC%g4jIINWu8b0&$S< zvFXh-zH(t?z(}YtF2Zz-VXO>k_v!D|QeGP-1$nd&;&tJnWD~xaLAN1{bT@_|hS;|^ z+B?=HZ>sZaQSvQL{VNa{0jcHshYitIeCtpDu(3`_C~BB|IWiE%^`k_9UYL-L?=xk> zZm>II$}->AH^|A>iJytgK*=g}F^R!I*caS{FB-GlO`!hHKqepGNyCduP=@$M6B!Sq zfsz_CiJci~VroWDW-arkVa~O=S?=!WrUK|G0ehoj>j*Ke(6HlTo~G%j+Qhvw7wW))lf| ze8~?p8j92BAob6iq9Er7@NNY@r=owkQy+4j262o0KEqTr)QaEW&&~l;`Ch+lrR;d7 zLZguJi9hs_yghxKiar6KjKk3MS8~9KCS21usfZah8d$7r=*|^BO@}wu<5-`N4;1vC zq>;u8lbJLM5-)uGE{X|Fe!haZ5i9DV@md)!h7rtNg6ydbDVY8pUlUq(IvPku#DEXm zQ*mmMnG@WGjF1fTjA4qSV~TDCpDv4^}kKD7XApmzMN&*~5jOq%B|3?qN6R+`_m zIZ#OYn&WhZ*aA&C^p0+tnw4@iEME$hYO z>=%vGS|mJ1a%2eEx_nmBEJ%xN&4(c*h9eB!R~8_fe?~ zQP4*P28JnUWDsAT!N<<9Jc5caf({wXFsbDfq8L8^$JBvnY_m+zduaT2H7enLK@;)8 zWNbf7LFn&f(}0?ZvS2wb6yedwq9SmLteoVheHbEmMO|HW0E1|}gO1N%_ZuX{hI_!@ z0YKzH=N|gDAgeJ&3CB^o?5woLLHEI(UiM~B#mWL4Q%{RbAZ(@UqD;wTnJEJW>BHxQ z6%l+=0(bo=>I~vTaqWiHif9yJA;Jz;M7&v#eIN{$99Co6mmkuVvzcksrFW-EGrO?9 z*PD%Gy_DLHiAn#skt8v`PJzbK=l3NNcRtBUNg%Nqc0uAcaY;*`Er=jp%9GMV`U#cahl7c}!km4dH1U9h}$q2sAl`aQkr_b)EVYz|`;}b0=B(D+B z_%s!VtY!q6Ir{>#q6}TevNAZH7Sm)H5QJ9bXNY;0izkHc<9U6{6sDO0ADJ`CpgohP zWm785+K8)tGm_L(}4|HAGT!a${p_7nX>7-OLB_`UPOM1iS!4I zc-H4r zbD}sxlOux{O0h8!IxTwoq>Ko?Ag(P_!n2%YbY)VxOEH7bejy}-Z(G~UJNp?7PYeBc4Kst{SCRBP%^583 z;Pb8*Ha`g6=I6CoBkk(w-7&g6I2s<}&1CqxKB9#fOgKbQQ<3q0ohby=-7hyT2_t2L zjZWEeTF*C{@Vy;rjL{&R+2S=8|MZC!1BeH{_6&%d&@!>cHYF#c0SmB>Is+dN*g^VD(6JTb1$16_$SVX@xaWZz#gVNvp%sqS^|;wOZs_=z%a@e_Y~IL9lF zwRmg1%02J@>Am+4r5ZYNjy0@U;;rx!T=VFiM{_q;dFKxj^v>%Bon`056XNJoiHV1w z{hb)Fc*W7DT3xWGxWZl`Dz9xS`i1qaSJWF*IrA(Nx#D}v zpUG|9V>w(PlzE?6KD$|||HJDyr{23kjDNxVTkFc~WKT(jwIUZ| zHT%ew(ULuu3Z+7fgz+A^z#Ws>VXX(G0qYCV{Gx5iq1;`0YnqW00lN|9xv+)}b9 zFma_NFyXU^iSzQWPg!efysdBMZdC4V=F&uG-*f)N^89V7O&hnRM*okx^NBYmt`-yT z7oGWVfj7r{09@yJmHO|3tEf;asis4zv87dB>LE0za$l;rR*nxz;+0*8QtKKXhA!+& zrD}Jl)H=s<$He*~H#A{e>b;5`==&|HKQ(Miy<2-rDuus)tyRFoTAMpgB|wAcT|9q9 zeQhZ7{;X{&p;?dajZxhmT{jM5d_3Of3B`g^HBw(JJ8O6xCsxn&UcIx_YxTlRCe~fG zJ+=Q#Q7tBVt`cv*1Z}dgb}c+rOnh$Z%lLhKYtE_5Czf5cJ2kx2dUX5d2U7Vp2hpoG zZ^1dIcysQhdaXx4GiLJ=wrf|;7n^oH^_Iv{>pnU+=SK0Cn)kpQC;qMAoEs0O?p)vI zRVu9a7MxSKn93FJvhGmpPi#TS3oMK6Z`ty`J~!t}BXd`IXFs}nLd+-_ui}yTB-(mx z|D%URk!63ocOm0)D(hot(<1H2m8;eL+Qhp>;()a>=cb$;$~=5iu=1hU+myf5b~q>B zvAkqY-NyQjIXez`t<|;zUqT=94=Z_}Nr{@g@to@116|P1d_|o{t;#>F=6xG=+4r}3 zFVbsU=RJjMed?_|dut0u^@4}s6>@I6Id$)1lHLPbsrRRNA)#0f`bT^emhc^0b9NBL z?OS)Jb~h;1pByXL(>!6ZRO0z0TKLHPPmXE3nkTFlWxNu<*Ty`u&*R>nwZNcKzr%_ms2HMA3={U+K-Xi^y#?| z%zgMRdrtm-Dc!5QOLpbIWmlwJm2pTu?_g@*HY%}v|7|J7lXIh5_fT1N%R@((U+H+h z%iAbNV8?Clu9iuo!sB@wNysmA+H}c@dA9p3Df_A5SG?RSZd7X<-)_`BLb0bZ3>h5R znt%-OTj{rs=coIpRBlU+HyE0kOE&m9!`B;sPyOA*YOA+@r4&og+QWjm8{YZ|kRRe77=RAHen)er~En0E~FA8CHmwt)13YBIFp zD(^MBa&}y?%X;`uahA7=$JKiHZjpCbRdT*arE_-dOWj!`(A(#0wxwRc^9wvLvb9xt zEfoeQ5BOB>+MZIktK(OB$ukz*Eh>uV?MuD7UG}56RzWWfdc|9_tKe?6RDQ{NV5m8Ld1c1g{(O%z*p zJb2D7WghkAX^(YW?4fZ&8vXeRo}c3R8TU&p*q7Qpv@i8Io_#}A-Wu+u?bh5|sowp& za=!50UE)@?)^>01eS}e}iVu*y$Ce&U?OwJowR2|kgbFXWdzlT=dwf|ge)lb_@{(=Z zZpyuBU+NK1?Olcz`*U^_p8L+6mr(<8vU$rMvfrcDNDIsP0(rxZPl!r!Q;qk7>m#o! z>wARj+q+CuT91DIBl}Vv4Kogx&B(cFM`~Hkv%9KD%2R5M?NV#L+HTYBT1=FEf;@aj zL;dA68`a09-kh2q?OdXsv~EKtX7(3dlL^mFd5@-C~8o=WwWVf;k3 zeUF%zfB60S7az>8c0Rv)LMbf#i{&Qok~F+j$3JVFy#Mu74n<)!d93>)3-zwRI0_ zyy+lhcj6wj6|?mIfB8wO;10(w@)-9lK8RXTBd52e?q7U!>fqwyd!Kyg6Bad9vdrV1 z&sM)X^~~ZY-?_@NE%hKu++3qntNW!Mdth@*R#Tg19$udB@medSPdz{7{+P#GUeV31 ztUcf3&AZW~LmqDhQhA@JQs=+j(nNXl^t^-6S`SACPgnk|^7_=Qn!sR5g#}VyR5|nT zEY-e;aI!v4^?0RM@_5_19*@^nalUSS)XE&RGCC1!R9KUw)-0>Y*XN$HUHM;e?z-Ad zw(jvRKX#Qud{v|`ezex>kQ{ZptiJP7;cUKCC@c@9s^mc9+xI74Sy$z~DRnGJoZ(s4 zThhFXcjfP}?D}*pch|YGgQ;yb;-qb=&R7R!s=`HSP>*n|BG9h98A}E%X{OoT#NSrznxEGN1KDRIYf_wo#6H-o$z0Q>jtq0&kV~Q>jgU z;-yr6A2Udm_X6e^7{tgP&@~A?Ur`~X&p)~>RHe_LHIEu8QFY#td+*kex zJl3Gp--+Lwa!ZhtUwc&`-M0aH5GavHQc|tz(Z7&eDnI|N`)Vc&9o5vbRZc`;j zGLcwaCZK&h-T#^BzX!f%YX8M}A=a@mtZ6Y%d!4+hY}tQR>iycQQlichR*r7l1YNi? z=fL*V$dVsFbW3W}l7}9`+6{fO)IIZH1+0!_oW0(uoG`C3t5X z_?&yJ$6DHnzD=h;m}=N!J=SnO;&gkL?g>TJ@`+Dv{g5y?i08&fY3=wzZs8%)symV1or+-gmQZAAPKBI9 z_0$Imx*0Z72}@S*krcWY^5oF`@JTD$k$|TW zCv8oQ_ijz?UrYS3JFrI5$zPk7^s`FeMW{{drQAWVzWoyKrKme&PtY6#e;TJftna3* z75h^i^Yb626tIC4u=nv@>~{dhbEKAb+h!p5NG)pJvjj6#swT(#Vs3%A=+FV$JDDfm zYIZ!CvOB3&6gP`mPrR{&YTL8q2~mkQH=xaD-hsK|4)}DMweEmdx&z+!4tSicsqf(L z-iE!YbxZfAF2S=NPY}=G(%6b(>bKr@5BzR1^JQtIIa9rVTN27WhTkE2D|V^qFUf;^ z1NO#_e*U7o!)19dq?Q-ou+w$b{?rzC@i)XNC3|WsDk?6zs-R*;YRL(Rc|O0cOjJ~| z-hCl;YO&Q@eoD@PTT;gw3ahWfuGWl-9A0u$94%>^a+hd>Cgb`6Ha_$oxUt+&& zUe4Rcnk7{Hbx~7mq1=UKhE)pZAIDlM^+%I26-`N`O!)WJp88tX#k zz>V#eadn~Pzzywk6{J*F#t)^oEV3TX7nJ{*_MCB0FIB582d+ue{By#3xLABjhec)O zh`OV+p|oDTiP~w0FA$%vtGN5HU6pG#tM?0t{cn1x1~JwgZkMNWW`zaoj|Woo*?&@< zmL1lG7VL>!pIT63#SV#^Qyy(S1Xr4d-L4`=Tkh>et{l-q`?gd8 za<`z*dC2KZ_xc*_584mg?907vI!@hTKWw#@)z5^C#!tWa(VUYiW1-mcbZ%&4ZhdZp zdeaxM8hrAhmn$n{WoXGA?z4>5AJzaT)jW`@!n3HR3D9XZ&Gbya!S>HGP2Q zdms_d$rX3byFOJ{QwPk+z$`4jK2?ps^)={)IK8sgtD!^#OHc|+$zWZjuR~R`&xc+Q{$K2bfmdgA?>;wJ(pzWAV8UA0Hd|3vB$FYSZNeS{U0 zD(NJ+>uu$I{;&9ap?Hd0grbV^4pl*OPee8y<_((uSQ~l(`1x2`4KA9m>^+{Fxs)De+McADI$4e^q1nY9Yw$;#V2QukvEE z5ZAT{@dzX3kNWYGkw3QvkVUc0Jzog5a5gX}G%?0Ld>S&;oJHp%!|g#v^+zZ}&Ao9U zFv~z?J#UCG)|_LFz;xk^!`gTyV{!{sWY}}&08;N?iHwijMj7^8d_YWCtvNWMLBZS= zV5$B9`8kf0i1c@hkSsZqk~=z(oYO_g&_zg=_fhiWc}RMal>Cba$pzO_@))K&+qqvs zGRJBgD8iA8?V82-;iM3`l%qaUN0`4LX~zye5aabgjMacT&#K;u>TFjK-fnFMDt{Gz zW>BV3pIwH$EAOJDb2*ZqpuB?5+L8RWLejEZ>362xx(ONRR&J{hg;e%tJVhVFPdUl> zJ@m$I{XYPUDWi}^z zAqG?}cLsodmD+990+3S8I_;NJW@fAot_cC=CxV~X^dfQ<=p0Ydctp*fRpIsot-h9W^ z7>eAD>Xp!s{WBb2#SrAi)k~LvXMrORB)JLI0oEzau|5Y-QhoJoAz}`P4U*0sQNIl7 z+e;i5LbkbIR!>4}%Ss)~A)(x_aCh9Lj(+qi_YU>TrwZXIb&Re9^i}nzK)ze*_}J-y z{+S`+bPQ9=?qta7bX){2%Ke&3;Q?Di_>v{+W8zqTT#vh=y$5p zj-5>EvQhg)6!HR#7?K<1{yIJQ|@*;&ZWN3Vd!C} zmoc zhaB|H{(F@@iGw@7U3L+`z*Hq z#8QvKWtCuK-!IdbQu7a5NEl`H@BsEh77|w37Bc7OEY!ua7zWk;3yFUc3T1y$rZ2BW z`Xx@g;`paq>@Q3F0_eK^momM24bs1|97Yey;tr(8CH_ZL_BXQLFE2s*6^ZBGy=oyT zm6g!o{MM37=`&$l_Sa?F1B0;a>_uXBC8i6H{fH$D zoOUh^#=9&5Q92^*@3Ux&#hmSslRaItEbeMRkZ+S7RtS3*c zegr0zKfDZzHs>bzhvNL$>%`z3INkh>UttEHflTt_HzRGeZ9$v!6I9Y}yZU6LlawwH zYS9S*M(zcX-AWeEGm0Ja5_dusbB1BS>WsEifwG-^5+<~EA``Z+z+cWdpVEp@e~FQw zv670-Rbju^sWSrKqyn#%0w0tGu7>z$gb1zJmJ*|W!q2un*@*N2rAuuM#B}fnpeb{| zfWFNLKZmqib-xK$IO8&E^H$aULk!Z44Fqgc-9sw?MD7A`4J?nENyWMKd7_Yrhy}x2 zCHz|hE)(h%#V8$J0t}NXP)8Cz@D#d+mBY>9( zI0YR#85Bgt9W0j}eA|Fkp@zY(;N`ypW4HF;m%|SS^h}qC#cHjGH?-KTTj2uKGcQ8C zas%~LwL*R~Z{*|&B}m@H$+lCF#9luL9)}QSetsQz%~^qYp`h^ce?r=J5zvKKR3IsA zWL1S*u0+ymdl_D_@MEOhcA@TGgtA|_naYk}#;z)IyPyngDn%#Oz&A)!DJrM5)%H#f z8eH*%c9gaK2!m5JFGl@h{za9PF1CHb1N?kSmz;omx1#7IN|&8LcOQ!u)FACXfv&z5 zolJV=v6W$dEIREgNY58@&Oql2X8!ZJ)ClZ~i)yWyKO*}UkS-6<*%d1YWcadFev2@K$ETI7kCiBib9&^egbM9IURo4fHCxxPtgVE z7l}E?y3zf@Ptjy;v!OSIpWeYuXhjnWul9k`YMY6vzwon*sDHMT%8>pXr3-AQuS5Dq zYG$$R`lU$UMClSJ(V0YRWrb4P#30W) zHE32CG&CM28mif#*+4WjAP;8KybUqRep3c2?1gOX*3TK_G?XTmX>!nf z2U&A2M)|5)zJEj7wg%QSYdt9@#`%j-(>dC>y0!@O_FZf7^J|r&MWJng4QRhn$$V68 z7-h6qRI)3JwjHyZ_9~M(wChy>uc_obW^3x10DjA5T%y9G&9Hof_&x;>tIf1XzH8wP zv_gyI`#LF5|{Yg_dVI0KR1h5bl3&5jWE&xu1su%-t$xuYgCfYD+8$V)8o#w%XZ}Non(1p`F8NMcY`9jHTQ= zRm^^J6(DVe@z`{t6gaM3o$tv z#-pv%nS34n(k|l45V)e(+Qkf5wA)~V+D913frG~|R5@G;xK-P2a2$@gq>aM%7@Us7 zO=+u5MW$mOX}jGPhXOe&DV=vhVjwIW^C_Kg3!^2DlPNvJ=Es;iPN8&x?U`nzt0_Ix z_6!utaVn``AvQ$LB}YzPUfq2TlAa;Zu&@3Cs$bU7pvuK zxH%1V#6_)xAS~w)`#G1R{l%7Z*P@gy5Bh6aE^EDe9ny_bJ`QSs6Q%7o7e><3OlgWY ziD}y$l%3;8)ZnqKzAw$^0?Ee<>#=l8K2M*IbdTg?L!4vjWj?lDm?tf3s0qbFJw#o< zxDP<3218OTm;M^*@|V$MQN9JM0j2yK9XwM)-7Mv+D!E5@HUQ`+b{zA*iz2#+=bY?8 zmSxkaFeTenEl7{iXz9J(OlgJV3Cra~0wpBWG9;M+Fo|{)x}psjyOkJMYD=hHU%M8V z@-Hq1b@>nLsa-!jmD;tX3*_Y|RiItv*W_acFMo3Zsw+QG2VEAGpIuIcANnm7{upLN zQLfCV-%Ef{$|<~6%71h+F=_#&TK+OMx%?E+Sjs<-fv}c8yN;OFV_0qF!*jv3{7qVf z$%Y>T8*X^Hn0*YjyDc_l398X}aP10-NN8uEy_P%%tlG1+0P-2IYvmUJn4#PSXHy^w z@}O9j0)?2){w!?JYWb-8Y2tP_JekGEvzpMzH(S;-plGFD0DcBk?MaN6rH=uND0l-l zWEoIfz+m=0kVc6mtp1U>Rl^lphIDRQh}$slW>~fBNx!2E*tK!8gct(_+Jz*S1pDY> z?LAnzCCP4C69wHEAIpe(BUsOR5CYv|v3y*mh)xP&EARFQ?O&@wc9lx5!K#%Y*s*+? zsq!^8xocE1v;uALEadzXmub+x*a_e>>c^3@MElvr0IpTZ;+ASZBb&NTB?DNlts)^@ zuaf4j*XF~zEuU4%?1Nex+0W-#h)L}g0=6^jvC{U|gs|M8eh=;3BFB=FJeG*}NhzNN zJfC(C-&aM!CK`d8)xS_DPdx*>G#1Ol>RL<#8U@XkZ>sI6R%o}|0DMaqAZ<`s9?=DO zE#^YYqw1BQDlWx8X)Y{}aZZW$B-!b=87R{pK?Rn_RjS+VxQXQa1P|J67EyT=NTuZC z*Pzz&A3MRQ{3;jeZw^LHE!W`ME#(1dtF`>al@!XVUxm7se42Ey@?I2DO77W5Wt-7R zQN96orj-94GEvK~q&}3l!^vCA?+%l{eCeo6T+E`Sp+e-SowV)jIkX>Ydk@~MbQ!G{gzW%+OFL*>3Tz`V*wRkgEW;kachRNd z(u?n<0^>w9Py#+!&ZAkSgA}<~ZSOZC9j3J1=0$r-c{yBwbsV(hF{35AH~WzR7l=9Y zAsCPIecLOn4R5Or+k-c=zvK(&)~GsZX-TR zl&^p(ZJ7{@*_&F0h&W@)FEEbUCu%_u=U^Oa4$XEZ7*I6(JOD`sRBaFX;2dGVqFuNE zz$S%)R;#uQ*6AE&z@}XW&32A4VAp;Ir{UbpK)#lQDmX9aW*2Dl5d1i=V4zs5wF20} ztV^`-L(iNaV_>%SJ~ij#43w6JHwovJ+-7HKH~?TPyVp~+LohApRZMl3_UY9CKEc4* z+8CApBm?JY`=~qH7+6{w#5=OiPbp*t%SsdRfN*}Af#%XAM&xQvx0l9|zJ}AQwYSd@ z!ud~Je2sQL_4zXlT&R6(C4g%gSgTo}h0g03Sf^1$EHU>@*hiP8%um_8iZ2V$ zYD@4|LRpZUqSclIZ7T~=TAFTIm`u0C_9a+u*#-}kw#@bz{CQa<0^{Fp^P(|j!=!?5 z*lxsJSQaH+KVthDf~T^Llun&M9<(e@>37{Ud}Rqr3&njKT341Nz^b@^b`pRQ8a=z> zehQI7*(l`{EA9?hN7)zw*b-WZIj3xM^%DFl?k&*9vdam;E>KeyfGY@CqPV+q0c^1Y zXj9y;P??Vr(51MO=L6VEv-mp2{mfbbSCQ8pRNUW3@KpARp8|*|?t}-xCkcot?wzp3 zvQIq%AgQ>2OI`Rh0V9f=bffGV0yZh`2^eA7KM^phxZ^Owvd<9fF~z;#0^nN8*`m0A zTmay@W3ZR4ihCX=tFpU0F%VBdAke|GZ|sDW4=V0*>d!+I-yc!jv#88>XNI1UF; z_B{gTt8UE$U>`|mk?LMk2H*z-)Tr(tjHv8~1T?7bP8yu22w0-JFCy{&h=8T4J3<2a zF#*d}_hu5+(}jzLXi?qQ(?I`}T*5xpO&j%PKcoIUrMmaI0309>^t9?;M#K0F0sB?= zk4RCTCE%dy{we%=*+BxHSKZsFbB73c30;6wDSM89an=1>8-V9YIc!9-@JCUO7x0F+Cap%KDmAyg0EQ|Yf8j{};pjq6%B;ZW~92R#T)$Rs(X3Mfa5>RS!Uyr%GjE`8#ERIJJnw1qQZ(+DS7RTeO0F|-5F1I-H zN&V(9)M#;hX&s=s3^iFCKe`CeiAwZbA(|}?H(6de=dD0F(t8i*wOJf5lcrTL)M3Gd zKt@0Nw3RSn=l7MF<>I`j5axc&467LJlG59H(b%|yD=)4IA2v##DJnL=Wi9#Qyd4;?D>X5 z-o##t7u<#OEv72ahLP|5SA}N$Vr>)J?mWypOeLBX&2hfNlT8_)+c=LfFh~0#ksak0 zxJzjZ)A=U`JldW!k@IKeJv3mx_C1)Dvr4sk;2^ZqF#66@IHX($DbdcX-TFKRv5>l3 z0vh&|SX;ji)i~%pU40EW*^62|X50rebk?gsEKB#|43+wt)av0PoM&=mI3_!LmP(!7 zqRoOyInPn4e_OQ}0n3>4HtmZI050GbU88*$l{&i_xK4Ye4L}bA+qFFyUuQ1^H)}^} zHeSQPZL&)jGH|=>>{{;Z9okE%+PO{*!p-eRH&>yJv+pANaeh=KFRrOQAh=ZT)|-U@ zd@8wdyS59o&h;|j6|-G%%eOlNDmf*MRtnA#Z_){E2ny=#SN|2GYt=4*0XYX4uxoiR z2ImI#Er_o``xB{Kgn{`Q3BftUz*6lfO@6}+^lF#D&pD&qo{08SSb{UgKvH{iHGnub z0MS2rqrGSgk5!SF_3nI3F^cng^_EJbfuGYGcq4JSk$Yv;3P_i3VxU+%5rv#LGvL-P zTM6J62CB3ojI8rk1{$<68q*y-a?7>*!QXj111(xT>Fk$y=c`ToHW|QIxlD)l!}9># z%R|3TyO#__9*kd7x(WYEr&FGbe^l#UiyV0@eyMgf>Fh4`Rdj8=ro!_%A7o%qJ47OS zh=G{4-vwYd17q4DD}aX?*sAS;%X5BFJIG1}~aVVt4zh=r;6~~*T2)|+I4aIRg8Nw@E?)Qr0PU_8Td{bjW zfxdnL!%#?(JhhdFI#(2a1r7do2A)%P3S6pd;2==8^)L(9ASo%K3+>>`3#>t=P7}l3iE70CKCX6UAKDP}(l$;Fh<@aeek;D!ltbWNd$gnA&J5 z@4A7~ifu1uR@aTZDPnuyh4f7i0B^C;+TV3E(OAWtYP6!)^-9kI6#ip3GG2WW83?@~ z2iI#vq}n#ZBwaiSS!_Q+cU-S?VH<_nE}oBaY}XQ=rz4x~70ea{55*tPKu0K(Fw(WvdNT(=WYWvF> zNdKAAPFn;ras3;$0jE%i*Ij?5fN#zT6t278qqOG)MC-2iDY<}xb(c^my-0J-LQ#c* zI$jdEEIb`9(cXh;yKD@crJZ&vfLsR7*2XcGE;|F~Xn%n%x$+rUswq%uR{;adv_>j3 zlYw(NjCU0>aGrL62DFHQ<=S2-x2sseO+L}01u;9i9Gugkk8eHE|9zaibYgdxm?_uC! ztsl1GQkEatVNa+E%LP``nzT zv@57{Pbsuecv^dt9M=EkEOSZFw<(rx|!d`xd5a*Rx#D5$$Tk7p{X0 z9My2=R=5svXqIw(Ujy)*)DXq-4w?GTnYUGOEG+``JWIijNdh4h-s~Y;&d1IhDLA#8 z6%UF?4w{1vQ642P7i#VXl?T`MDvJClI|sin(!MlRMqM$Ya$ zp7csMW^*-iq*JC*XyAwh+KdzPq%I*X6F&DlNRP5%aEdtyk|r`^&ifer~^OFc=rEK9wZn8VU^wSAc0m z;aw2PPEfN9%dy)4JH5_zsrnRft`Xr1vMfa9;}DQCr}pVZ*tNS94pEe^gm{$l(;#!T zy#EB+>ib$R#9LkgwaO`fuK`n0`JbVdx#jIO5L)@0P{h3QZ=p;1lyR=X;2G`IA@3OHoH?k8vu+*&jPo&u=vb#U20h_yU4q%bnS|gp&Uqge9PgY5 z-<#mv1Ik3_Ex?J+^&CS^2XZAj2jMxBoljT7*3Lp$G{u>WnIYBr3vB2(FW@`io|w$(dY%U9;1)M$_gy7Rp`VJaU4jEp#q{P4b-&QJ(_mHrRQQ6Azii&YdXhAoWG&k&*7dH%6=XOdT|DQ;JTBM!?_iL$OSLa zoj=W|4}7PRKJdYb^nt&l7E#V4D9CbdE};)pkD(8o0KM=5lRj|oT>8Mx@SHg3?ri$N zuTi5h&gJ3*E74!^j)N#W);S8_vz-f&E5SJg?l|XVDf+zn&pQz zlAa^%vz~&7Bt1{qZyBQj|B?@e##ui>&nCS2L7N5V_3b0-4+fN-_-BHQ>U z!gW>_#$(b)gqy6j@RFoYShtnduUPJ%NndL{6#)Fjt%jT7W5 z`?z!R@SuJcK)r|r8D6OwB58gQPsr?3NR^({bNu#eIs>h!CCyriBgp~uDY z7yxUv)qrEzaF5UnSRO86UwXtHl)8}w`QnBddB?%-e%}@3v4cf8mN%DTkAM%>?PRgP z70abQO)7hSm^z%x%lamT=mil%Zn4pz$`dwp1;u7?iRClsC^Q|^82W-@acm1Kmd6g@ z^S*ryJwow0qP;>}$fAEluvnFNx4e64+0J z8bhBsh9%F{fd7G)ov!pBWMaXJp?Cc|zNaXQLi9Q%#D4Ia)I=72FoN|c`SK-=ckR|o zNjhkRq-f$(Se|je3%)$qMCXkVbagyPHWy@c=Lojwi7f256eN|dt^}n*-w?FG7vt0O zWBIm)v`jskFD%|jZG`tyn*AF~2rqva%Ml6uzO#T${x)LA z7-RBj21cXxm#Lr(NPg=@E+95@XQ*3?O~Bh&X}=YZ@GyBhWn!!en9e7kdp>q;vB@uB zGMFq||5zjW$H+GMde-C+Lt^jjRo<(M6!AsMoT(?_~%c#atRr)f|2r_ zK6?D!@a8ecIGBS5VV8NyQGt{n#bdrvwY!y>Ty?h*j@PF85zqoDH_w5PQg;g} ze=O>%5av>Dr<%!cAr|h_Q|{yq1FI+i`d!SaSyR}sBeYJy%E7WE|yIsY|n}<^g_=u+J)G z_dibUST7U-evR;J)>{~1 zDZeHBwxv%8{5s(etx1^NQ{Ffic|T8X_5*&Ck2Qa8BtIArn$L!%RTFQHip*zZ-TFU!& z*3@)#Oc{r)X3ZqLgs^U95iTceSb2n(5;m>*gewU9tVM+75&kHvgm4wuTqLei{~^M>)C-8<&MI%?rGAS@wVqs&2;^eMTij;79KM};3H!g!Oy27Nx$Fp#CNue27&G;9 zBF$#<-&p7sM3$S$KemBfNn{0lCJxBe&jML#CU>%F*AQ82Cby7tEs=F*@_Ylx_h^hZ zGx=l;$<*tKY&4Vq$Z`(y39l|Q`8QZYrrvQC>bA#B4kF;E-c7MRzT_X0a}Nu>(3c!f z(;gvmkuUkdnLvI*u}gi)IZJ>%!C0`*mz>MqJIdK@hL!wF*81lZn`I@Z%?9%HO(-YZ zN-jijNPYf6Ao*7Ex8N(OzoP21@Ej@qjFu8d!I&VOwe!Y+5U553zJ>r`UV?Mh;)oHc zXFY16W~_s|Iz4<~-S{QOsdFW(m9zn|cP9 z*6$H#oX0qh;;mFTu=6x!60PZtfS)Bi$+{FV$9ax$l66V|@biQxTjx;z7p#7=bp!Sz z&I^PCR%IpN7YS!r4Lm~>mCaS}fLPzhq~XZD;hEMR%uvpo^w3$>!|+K*p6toC z#xSp(!sl6=DI=%wbFC*4d>lE2Khfe`W$X1o#8i zxzL&n$8_Z6y~wIWRB%2bz1UjLwtP&u#0sngEGO@!)>Fp;mXr4~>v+n4N}Wrscc@2B z-m9%2r2+n&&R%B~P5~?@?@bn;XLIC)z1jL5>2kup+?vV$`WMSuVPC_(7$s+hEA8{< z0f~{*#5Vi=NkC%dAaA4nFAKU$;V z?r=y-L&1T>eBLy-KE;qqET9E2tD>rjiwGmEBlIOMChWJ~K;050V#iw=ygjjq7D%*= ziTEz2Rg*PiAKWgngvBJCgI-&jSjL;{);};)B`&3xYS!~u4J1|&_FK^nfGd^vetR|G z8p4Uzb(F6q9I!s4{$+$`SUmGitS6jp@g`nk6XAIl@9rfw6E0K(mhS<(4IR(d-fu`; zs$YkpWxtBOOk$;+S>sJ+I89=eI)}C6=K!e|j^Fm7yAx~Vd^FC!U>cBRa*Ud2r#V3C zL|L-!F9cFA-CAnPb2<%@XQ@4p7Ht%yN$yoAHp?OYI$ItyStaMfZMHmSvRaTX`({)y zagCG{vcHX)JaMfcTkS-Q&csvX4E{`ecP)^hAUkY30A!sYyX?u>XC!v$w?fYzJB2pf zD96hC?Zp@piJgL6XZywg*(AsTZ493sU=A@C9`fc9>Vw1hls>dkH`aX&lJgj*SA?Ef zJXPW;wBg(juIZeGQS5V;!&~r}Wh+QV9~~ko9wm)4E*b#E`V^KoE+$#CcC7+@31Oc# zu?Fy^g#A`UHQ>G6Ud36TqYI782#>bDgB~z0Cp^ZorUKqa_&Dn>d>dB~j<@od_e#QJ zHRA+S)cDSqsPot~_{M8K<21dm1pUw3>&Ae4B)$Nn#R$1a;^)D24fUv=-|j%DGd9c6 z8D($AKsC+~&%l$vEaq%c7H>CX0NF0RJkAbK^$tM-b^;v8I7jl#vS&I#c8bBX?K9Z+ z^MsRUUy3nq>=qB4XCK9|G0qpUeEUh(V2>b+?B|n!d|T(^nT2*G#V(Y)bQ|r(SwJq< ze}}UB5@Mr(TqfF*eF+^HfW|%vO#xrR*@zj2dcJLzFX8oMVCn(4*}jA;S=sN3WVSEi zXEgTJq9xy#@De61<9oUv?pWwcSd2ku9F$s>`Vtnd0CtODOMD4@n98_S=hIY6eF?9? z?8Y5ByS~qt@YO6}Kb8`9`4Va|IE=egVDcrL$ClnL*j`^kg&){Gf?eiIn83Om(dm5q zd%UFA#oEqmgAspo!Q!t-qH1HwDtOSpoP4+`%FU&1>W+Qws2&zpP+y%w-1 z1UuwQ7@q^|s9?AF63(ZgpA+m>U&6a=(Tjo|_9fhnfnmHPHM_%?kW&QgRpH&~OL&fT z`JI%0#Fub@-uH%J_v3vpy3g+gd&rl-x08&wq-Kx#5==DAcw4Y1eF=qZ?H>et+Lv$! zOm6<=jWh!a3}tFQxPsdi8^VV7ojEsmW7LfgMtJpKX(Kjv#)!A3hVm^eQC8ou6OnQVL6cRyZTnu0l7htczXsyQs72G#@W}d269l4 zL^~bBB=7@4lI1RS;3h!=d_FetLxD4FKA9IdB$b&V52XigmJYtj{v6Alfb#T1HlNuG z{75*r*r%|bw@SaSpWxHs2@;sGF@1*u8UsJSbuh+BYLM2ObsVr*<;@G4Plm z582!4BaiERUFu=G1-%z|Lgx!wPuj0B&yzae4|~Nbf+krnz7M~WEABQZT>Ni8m@8eyzv6WabUup*a zs{a}8F0*&w3z@y~W?cn@|E{vye7-*LrOpTJ{q~3HK)w>Mh_h!P9t6G?u`%{{SSN%r zOmWBA*Hr=01&O!&5eNf@AY<+KVt}X@H*Nb`jv$}G3XHQKVxglAKAC^NeIMI9Mv$lM z-?Gqn<4lhHge$3StiiDvuP5A%pb$tfcsKhYBO$61*f_zSHWF6N2R1>T1$xOyxQOZ# zr53Lk37?DxHc7BojRYCIlLdRtNLa?or^pjgZx{(liNFE|LWlOAk)Ka7MoIJo8r?_Wm3 zVMc*GgNFlO8wsh+z~&l!iWLuizR3Z8qU6IvpIc`EJ4y24G0%JHck>Kx67iVlFX@u= zg}2L0*u~Z^5bQiN;YN;;e8F~`3DKFEkVG9tEsKBrh@({sjLH zlnQn+cAE59{yK_y_Gr!c5CJ1CF%A^J&&K!o3(*^S>DTF30I{c7xcxe$^T#bTn{REW zAJBOU9dCbvMx}pGUe+FGuSRT1zg}N}tjYGzG25koUth*vwfRd0={E?HVSh&CM!gf9 z88(-}=?C?Tfy}c145Os~K>s0-Y`pM?I>sHBz_;7g3-IHHe=FiRfqfR=nK*9zLDb8S znzORw_rZF}>HGA#&|<%f)0*@v^z9JPY#qImex)EjyA&}x{X2sA?L~-v=~oF7Cy%Y9 ze^-!rc`7gcYC*=ylPc-g2$HBBKg3dfEJlvl+0s~A5X3@{$VSHUaRiUk>~Z#Z;;{lz z88Y%0HT=F_3Vk16yu6(J!5VD%K}kzYKcq*)(I@a7{`8x5DRlz>A5i)&(lI`J5*9b< zKay3q-_FC_kbbKmarS(Kru5t7cbMWQ@c;9rAC~?btHnJ?o7}G7hBA_BkH>w#=x0)E zVEwA9RoYHR0J7r|Rh65YDuI z2c6Nc5YDpr>|?ZS+q11#9Kf$V3VN;;5ATSU=ezS{%N#9R__?xGkA8!BPn4~C^zR9u zBu5a@ZxWtoZN*57mTmid>&8)lW!t{M3QPek56>;MHX}Gi%l16qYCzbFmMwXK^*2~P zTDIhitjn-+ivHqd=q$AEMf{5Xiuz0CrP%1N376TM5xS!_iJwdC?bzW)>w=Wq1=xB< zM+vgjj$H{vJ&9If&nf{jN;sAF88JZA?z_sq4z3wJN8Wp>w*QR2i_Q~dt-Wj&kV47R zWq&yjNRc4j_6l0LM35eP8b)PwnIOG(B5k-tkUsl0Dp)GWX?8DqIJ!cRe)}kfaCD_0 z1NLb4WtAWy`%FZ&=xTX{X;2$)V2t{rrx^V4A^SY`;YvJ6TTCj6R^sebImF%3o0O!z7 z7N)FJrySwLaejmG5pe#@k?6!?7^XYlN7JV`58yk)xe?2tsZJ)M&@^WS>N(w64S0qV zz(6?OiAD`)I$y&%PXL6$;*_JMvz>JYpG=8Ii?W<%l$-5r!g?ad31NYh>$D*69LGWo z&vVl7J=fWXUOmyN2Yiy#h3|RJZJ^9|E(g58xfS0Fo%I-)`OXe}7dTg-jfzd=oi1?l6%+AxaH*oBUQSf`ssfV54)ST0hyoFaOVfnZ5HZex^ zA5d!~?`Y0GB=2g@7Fhp1Jd%RskDBunB=6(Y5aIFz&EY-#4^b>e{hu@^8|8hZIp4v+ z_!vET2?pQjd$@Zy*TBJN@tH1#YqM{GI~$$yOuTs>n3<2kd>{yXBeJ+m43e|a?5vn( z42zy<{YJ|2eF-3P<2&mOXwt8W)_)r2T;*~u#}YxmE?R#%%(>3xtb}{&H$>~7g*i94 zoR=`(^+VD6=z6c5LoTN|ADqL{`t&g8u*>-cIs`xHp%;ZYUnov?Nf|gLhCUvhq-tFv z&)Q{j2L=X@Y%=+33*aMg`uTV04uSc(xr}c6lpq?s&waKNu^=h$qZXO7FjWHR?oL1Og|61x`0ngLs z=Ct&0&~%^4N4h!J@|?i$;3kmBc$!l=rm`q}xp=fg{M$4`|g=5_>+tOP8Y^i-d|AA>^`lj@UV_<9T& zRGrhO=>dUquY%v{X+9R7%k{hmb2;z9T+Mqh_lSDB?@`LnoeFr0{IX-NpXSX_a07j5 zs*g2LwVmdZ+J-1I-FH3d25UaUM>DEc9PeW*a$lVQ`b^(Vl=-_2c$V*0!Z}j_XG=X# zx_|`!dY=BQG%fc-Dt=BBXmjVK%mh{)HH0c^c^JpA41X2T@8b^mSC zU1!oHCVyEX^Y;ikAn+*xZFVQdxp|FvgZT-#C$1mB>*Lo**K65(vr)>={dyDZt?c}B z)t!6_8w^@>uIjkwRmW8=2ICigj`7?gwAF*fzklhcf9JMhM$mudr&89EOWUj?D>1@% z8|Ds{Btw69#L(X@aY4)4O{udC^I%x&tO%*Il+^qbG*I8^7u%qOJ8szuL*#)%g>HR+qH#1W2Y+o+r%H^5I;{e-6c3(bho&riQ%}g6VX*a-_P;09=MiI z6Y_(6DDyRxS@2Jgo&a;vC{)_|lHWs%5iBv1ux^?F6z8Oc=}7ezMVUzc0O6tq089hG z5&-D{iZRHv-RI!sA4*H~dSoim>x|9d1i-l#oWm|B1b&^d1sp6-v?Jg=CY(BB5UVrz zhxQz3BXnS;HWqV=-X;qhNN9z)^!*btc`cB>Ym?I<{tU;G{`QcjcZlR5a4ny4jvt%_ zAP=9>E~o|R0x%0!1GtMo2Y}xLDDMYQekQ(_?!lL~bRWOVdD6D@76FeClmqIb=K&ff z%~3R-G}ZrMW$(Rp&u2dMA1aLqSUha2m9Tco5?H60d9T274aZ=LuW7yYwN@ zDnWyce^86VF9aV4hsVnl*TU2EE6@V`{3|Yf|05VK%IB|;U*J3$O;Ejgg~^e42Jl)5 zyWcSxc8$GV3uPL(N~U1GXS7h_*>_FGv&V@`G``wo9DAR*41xV7hrk$wyM_HTQ1Z2c z=K?Qg)z+c5D^Qmby;09$E9s&2dNx}Lmn_bO4BhlJk*OE9;#>*NImo?NI1Pq>sh80V z?J%|C>%ixrxY^CQw~IPMaPvFB3A?#R)s~$?FW;(nVi7n?qQO?q8+8(rPG>}_lezC~ z#_ak&95w0N`{31c>oJ?0&lp;_W-K%)@EJIO3tpQL2Jaxa=TVejcP%F#x&2>v$=opb zh!qBZhV{NHkivpITrV%!ovJf&=nmMKN1oztV) z1Wtly;77=~l0aKrkne!%XGXt_D$dR6t0+SwqWMcTD0mG#Q~zhQ?qBT{{7)%ZP1^sA zrU|sH)+|Wf6RqD7mbyn(uOa}(PedxW1VP7x#ZoR^Oy$CKYq&B!_ z!2$qW5f>~0a65qp0LP(s%1;JR)QPWbU`2xf8UQTD(n&iAO(M7%6v=ua0V;c+0M)0$ zN@3wbDl_(0ms4N4=#qg6T{b#KU*JEy7Ww!ZXFl^Sa2Z7}gR%^iqPGFG6Zjaw82}ms zkSY2K*nX0I@RFYq;KMOxegH`T&Hzw26@am~vM3wr?IbJ|LS5k!Nt=r5k$%7|YXR`L zpNbJuwfz`#QK*%Kq$Z3xj8l%RZQx(*@-sYs9mgcbwPG{$JcR7?gsq10QP5rlZKa!q z%IcwvdCq{!4A_DEEsC$_lD)UmQ#sFNe`iGYGrSs=7J~l?vJcl2O7UsnFs}x49T2_H zzxrg@c{6DI<;}$&qi826d7uR7VrH4SZ&SjM(9BHLpAkeDESkw$1Fj!L#^jjd}$EC0IUrk5-3bfxs zS;5BuM#Vsiqw*z4{F3d7^UtT$c+ir;TLl7407LS7}dgM_NQy$4B z6+P}xLTeEBu8%rh+p48|URUjkM8nF|NWFE&=_q%d%SjWCo0(&yl!h7UiJ&3}e*vfu zHEmEi^gJru48~(FW7DyW7hJ}!V;H4(q6n%&Q^RUB{+x$Qgm;QK22V9By9HHx1oGjD z(4#^+D{B@y0RNYF;yN$Xe2~Z+*AsEreK-+{~}Yr+QR(R-f95QV-?@Du51aMYs3VZ)f!9K@yTbW6RqZ}F8TfoM)7ZOop%}eQ z)V)jgTRC92NAbZQbMKMu3%SnJH%4*Kn->ptvNr6D;@WU0ap{~>qqsPEo_OaZ$Zv{b z2l0jEC7iLlrS%(tuH+dI45-b+rJohmza9ag%gwuLD}Z>d=}ma=67XLHvvwz|J7BRn z#@^C}+tvUbwAg8PL0|EQkmXwX0mw?2EyXBPYv~XMLI#Y%AE+Y7%2VC*d{ibeT2Zqzxwgz8f8zf%=?M*NjdyJxY zK=}(Og`Wa|WsClW^tka*6tfO31yH&GN-jA!!mfrtgApbK#adG>7Edz)G(vw-9|~W{ z%x40qV`jdb7oPhH*(r0FcMv%mCa#0Qz<&dXULG~A12xP5?Nnr3>@f(mOaO2(fC2(n184-$^dO3TLBm-$%517d z_tQ!f+hK?MA%fyc`#^NJbKI>oAo`>B(VMZG+oE=JY=80FP{duzJmjU6>{1Zk>0^UC zuuXX%0yo2Y)gqwQNq+_HA<(+qOrjbQo0h?(QEZ@Wy6Z(QpB#71WDdS$Xw}IOkUiu) z0Nf-VaX~;&m;Bh zU6^%*@2!`q`9nA758RTulCIZJ^fKbvJ*^xWpHghD&FiD&pum%ehXhCDA6*4|Q7F2h zfc!xeFb(`xXz(H2fn&y;1N7N96d)X-UreUgv*4ante5B zw}ZCIrEvprJ!nsW);%m&%E8a=8&`JRFnF#y*R2V%apvH_yIrzjiKv-uhZ;m|M=1n2 zh<+{tTyl9W>~T3CsH`+zy&1Y-2Kif&6AjW{M~%LAYea3kLHiuEgihtlq+JghEtw~@ z22RT(t8h02SjT21VE9plTSYT;gN`L21X#yD5kNPqx#=dbK6I5|Izo9kdKSlFLZt57 z6kjh4tHyM$6(@tux;-~CyKL21_nF|coJ)SQB+OegFpb~{Xzs9&AoS`YtTc7w{r&}%kNx6wf4hfbo^E;E(D9~ z?6^&02w7`$6-4cu4Xt=3_{*R@PxvFWQ^MP&6yM|)u}tX+8x%#{?G~}oEkXt`b-&`~ zx!{;Qv%RJ*GF80~9U~APz(*ml6}5Xz1iW70D18B(OTc+UaeRAk*ltlRd3Rgb>4Ep9 zn@eqZ=qe9^^DsE$u-KxLg*l}!f%6(Tt_~dNe}z?P_#`|AF0AkGL^e4IKMfOa0nfns z8;Ps^VDexddCkxCx;11VY-lx8kWJ^Y1fMFTf+xDYmH7v9eE$@(tE0>hqsz#Sf?(@k35%OSIx2IPGS*T@LQ3scb4`$io>#rXLLE`9&Ih=}U2_`Xrx z`|N=cl!fmb#SO~+z?Fp`ker_o7Yjc)iYxwREcTU!e>#dsl6!#{FMw*cp$^Jj8`c}c z&0goSdn4Jymb=(xUmVFE&ixYDG}`sTRz`cz&GNXL<=+@h4(VB`k)0Ygm{w*jhe52E zBhbaqEx7dkKkM`CW5v)uzd-wxeXJPTXEHWN3%-bwoYxhgX{`_6u7!2 zx<~G_*8VX7-bL~ta};7VOaRvqK%%TYBr9h}49@E+^;g`?W|ENE=^JuYpFrk(r>Xz==H6iFFX zJ4MrlS{#Fv!S8cnH*j_39e1;toFp!Q!Z8EN0LsMRoXlfsOoSQ2sEabCvrb;Es0%!* zg~DM*P+6^7Mdry|@u{G(;0;0x7pxUy>8Bll@cAx-dn9wqhi7@S&LiNnAHOGj3_bA& z+Uh7cjP>`q95qd|8P9{mZQ66fQNi+c(2{rJ6hUaXSJ}v>`^(&NN_lXq0%g4(UUiop zTn_&{MFI?)#*wS<{~`KajiFN{I{pb>t;WzgH~P6_s3nHa228>Xq{fiKX8~6SY3r3@ zHDX#NvQ|=9LSvhR#!lig^K?k)iY>eTL92k37O5_}en$h}tZ_KkWfjV1) ztb4Z9KtrL=mCS`PacF`pP5uHIS*-9EY)dhiyfq5eNZ}<)@ifpS{vjL9HasX#1cwe= z=yH_Du*a8xLoa9&&hVh57Yqo^^#XNkg#ES_S=iSX9a~H(tL_Fl<+FQNx*ewlj~|0( zb5P6r26uun_}0n&&Xt_IlF_ghIhX|}=Rpr(# z+Ae!N2BIrnj+(`2qC(`Mi4Gr|r*tVe&ms?MVTN8Cg@xt3g)q$JT$H-cXr!ZGl;d75 zj{7NEpr-Z9#rYB(I2(V?S-(O&Gmp5K<4SS9Cg834P{+p}w3_l_NZu>@*%W>M!(sjR zivDeoSNiW2{r6Fy*z^7v8uU}*V$cU-Xwi}YPOI3HbK+{D?{TTbB~Xfq9W0H{Ufc>a zyf_TcsjD-=e#31&R@cC4{)tNJ{N){ZCoX;eG`M%0IL1+_o?f>Ehwx8JDftD#JV zol&vg6Aj|oaj|smtzfH2GCG#NeLZn$;h0#~<#FQDpyOiM89WgTyYncN<+*brcy#BK z2paT@JLg2uW`Ra`t`b_LJLiEzcW!q%!|qIHqC0Q@MjrT<<~tu}`NJiYR)UrUn$!$t zEbD^V^c}H7pz{+jX{WTaVW%e+3x|D>frc&MW9g9Ojg3=?Uxe(yA4RTj0bkDJdd0pO zs5<@M8OziE!x_Nk^#9ygp8kJAT>^5gAx`F?%L_aT$~N5Z8n3y zcHnd@fnr}qY3AMo+ZSF5nu}imu&NJ?n=s4Q4i{D$A%q7Bz+BLrba?Evfa*O{n8AdU~{u};PP zZXLF$Qh3v1xDKV<9gZx6eD}Bx<2~H&bVJQ(pR$ZKTw|__<(F=P}EwB(!+WX@p!7SCua>{1qhAttf?HbY7sxcyB0Rry zPbEU}VT;HHl!C8H>5Z7dAt$HZQJ?9JQ{p^HdFp|OQ=f=n9X(b}zC5>&I!gwaB4Wys zvS$eq2S0M+ryhV9?u_D{u2_RBHu%?3vzdw!T~RBwGmy0-r!R}ueLik9II?!6ZrOFe1VHQH zoHYwPww;a}WtM~DO;#Jy1pyT)sZl1zBR=tbJxqSXVKp+#i)D+ojaB^dnvNad>sMuc zt9WneNvA#c)kAmP`08DMT=U5C`F|e!=T$fCTzuJ!rzGEe)uHH@^fl+&51yBk@#tA` z&7qSY?Ely8ukZMQ_1ZO|KVS3k!=2Z>y}SIuj~~DG;p3kEUR*}+tUt~^v@2Bk+7Az} zePz$zH#gKTx~lu}oSUAUZXSMO`>LOQ7W>BI<$HhdVtwmTYs2x!k2^2sp6T<_CTISm zdsa=t=y{Dz12OIQ#hki1^QlM9Id4|~W#4=6r`K0?B;C~a?W#wehZ&^D1uKN$?{Wvape&wN;YL^||zvi>v%#9!Iyd>1y zdgIn{Tc6zJH=elg%da22^nX z;G~rPTMs|A8a_0!RGu}E-;4P>IGeQ2)>@6Y4d?}E-T_p{IUj+>u5c>9aJe`3}0J29hmrsuAQ2Z3I08C zr-Ib=D*$(E`=##`E#dQ_hP6RlPu>3e3&wp`z-m=y5cJ}E%0rFs|xk&aa;^( zU4MXa#zgDyj8xRc1CFHm2JbB@Y1UAd2{H+5JzWKOU1x9zRPG)Xv1>;HawQnN5gGA& zck;Yow?;FL?!CR8D4A8nht%iSI3MPkuHu z$SOzW?fD^w>+}|u$7g+1bw6gs9SRcCdY)f^>~BzpK}%)qO+>~qfBGb>QxvnwTJL4! z!1_IJJScra?Ftp4?%y)_bdsv2JUiLLW25P(QTdW^hJ(-&@sovQ;DDUeo{8BI@1;2J zGAR8bPExE$_V5Q5$9zOX^FE_$@^JOKcEAghY=bk@u_o_%9}Y8pfC_m_M$~IPe@0NA zeg^e%-xb>zHX%t`_t`19aeJYhQt_6pG)|in@u~rD%;srbJK%tU9)q`Jl}uM<1}G;R zyj!VE!a%Nd-C726lfiqDip;iYU6){N2UZ!p!KldMV3MW#k8mU7c6pMYcNrC5dar9N zY9Cl<@P48q7eiUBe65k<7D9VqpTV1pBA|7Di3%8x8;^p`+l#S$6h-TrX+Z9BgSYpT z-N@IvUoC|2*YcaxyvwI-)_u-=Q2!}Zt`8Ko_dE=s>8-rGG~9Dq&moMn>6>WGiZF** ztf1j9xB#g=7G{L$rxN6?8l~vpiFXZRu@%^D@V1R=xp-XHD;Xf4Z}5&y1iAZ_G<4&) zq#Jq5Ms_-GWB7btqB?ivJ(~ztS8xj2`JBOnVr9I@lVlzeqvP+LiUMyjl7XoL#e>B7 z-D9$_-#cuw7rC!deDP(HRFLTYOBKrBBQa`iSV#q<-(nID95r}65}{j0T<>~x?3lms z6wVE3Wl0FrvrQh7DPg7KAFH6_DT6z+2p!V9T_={H=nHfn2MAB=%CVqzw9YNE#L*F3 zZ0<(U;_K%^CQj$BOUZQK5(7Q>1s61m`z}}4>SeIry9U>1vXj($`p`Mk*UNxOK6Ok&tT|@#nC6LN^?1xB#stkAvmkb1Yz0P& znW4qTE&?ALLl?x18I_>N#!^Iwh&4JaKMw;adalNd{^O95z$gN^-7sFCK8fP7QNoXN zONpY)=<(Y0Nw9;iS0qs8xHQOQAy@n~5gwbMn`2_5P+}C>wp$|dvPArwY^gBODBM8= z>Zhne$4g$;R`O1W;3DtDiPRkCCJw8@8RD=g3>a1;jh-B?k)X+LKD3xsNO5x#MIm^R zY`6&g_Ki6P@>+lvQSD80?I|@(pBN!M#pl&e%E=JJpoFR6dJBEpaQSeGh|(cCV;IG= zue3BxKGUs}WIrJjrLaHA3kYdeRJd317MIJ98s=xZeCfZeVZO?povAOLq&j8#Bt^=} z3wH}v)j(LFec>JhDJ35&$yA7wpu* z%n_e0`PNSSSZ3nhVn~#F3@rPH>q_H|s2qOV(`y@xET>+)nZzU+t*Xe>%iZ3pq|W8bFvU;ZN?inLNOA45GIo{tWFrg4 zxred^YtTGgtmiVzhr5c+Suxx?wq_-DHb9N1a~0b}&T3_?D~czvJ!@#koCLAs+F=zm z{K-o2^5R6+;1p#8V0e~3TpPIX2qUa>9RTfOrCNsDOpWU!P;gt7O1CC>hr@GH%C=Ls zA|Y=Qkq%WA)?MhJ`n zhm~PUDW7)Q=jIS0O9~GG10o;9dyO>|kMOE$YMbMRyb2ua0bUN6>SuCA>HBpi^ZdOsD!*~8g2u48iNe_ zl*!!!hP@J)7!sAEO_X56uwWAf_@Vts7K?j)QyUB)?u8}jbcy`WKT;Na6c`Zscv>KX zTSXBvym9nR84S$`8DNnztgrGBujW3jA3idiBhq7-GaVPqz~o7TU=tG_K!4MA0jX2=MUT)I!63;Ylbvdm=t96k+FNHzV6Vtee#Tx0=RkQTuSysQpx2aN4a% zu2vvT^`;D(=3(Q6U6gs)0=MU=6g>xmd=}uF`Tq?G&5a0;o*<|ZBb=kORI;yRqPj1% z&j{O^0y}Y`^ox-kQs7}EoM%AAw|q9^n{5K=AQH|ty0(hRQ301Tc@r1Hls-g&p#z99 zMBqb(m_q~%R0SO05CIh^RxueP^lkbO0oCeN5SI@t8p6d`#Z=X06_W!lSyJRgy+Dx< zbFod##YQna5N7%mF0_V;DoZx{z_c@QeG8YNw?t|gb^#WDi;%+o?vX~gy+<7B=n>Q}ZEN!bSK7=zq?03%Cpbu+M*t1D+Kqt3pG#oqVg4gCfGeN%{mA`-y41 zubf=c$8xdYULfEvk-TuVo!OaKWZb$c;fALU<7t|MfiV zRDRIoa9P@*I2&Q5DePH%1d5~)ZsZY1h6+-B5Cs*TPl(k(6_`+mVt9>YKw||E>O2xp z->w(I7;Siw;Za9afno>0A?i^_h*EnTE(}#BI2i!g#AJ?ubxcYXl}Ux7GSQ+%7C`uu z1PEQrgsVe_@A@G^*^0r0LmusBLJdlWi1$%S8X}c6h>|==U=P8>%Q-wbgg`u91nPDp zxk`c8Be_+9Oc);FAWV?rua0jyq$`j~hJf`lzcr=2~N2_ReOb%jWlDv(K~fb~q4 z;S%Yy0q~YPbTj$3fc1Rc;9W%xpks1yK_C~&0tGU;Qo!X*exRr~A-Pq7O!#C!OvmIM zMP)Jr`%zt6!6Z|_IzHgPQGst@(eyqpWMlH7fOSm1P*f&gDk`nweQ14-A9miGD1QlF_-}OZtpn;{dM_@R^&uoL zDDdBDxD2(pSNdZ4f2vqyi)mLw%Ng?Q>$USesqpfDSHe-~{VOhtGW`M<+>QyC_#`u3 zFO>+#r4FDzG2UuVX~ae#5g8(FHw)5K#FQQi5AYn7WIF6?;v*}Dm4){URK_ump!3Dl zA#b#E?LBqK8}N$fjd{iMhP~oJiF_ipC63URI6_tFjTvcY*nCVnom*H zhlCU!o+MER9orL&Xwm=LgTL0Uz;8kmQEKnP%I{(v#`a~3f z?O22#0*mlNU=e-@jDF}A0PNpr!|FCd8?Xp%z#_B(i_iuvQd=U*VLvfVl5SkVB-tf1 z{ZNr3bA5@1GRQKGLkyJg?+IjputWl5cwtLYE-t?odSUcF9Y>PK3d8>++UcnPHKM+? zsK_Q<=)qfX15$lFB2?d!Wlf1tA}^GWbY+r?UC(67x0gp@1LGd(csdujEX=|lDF!5x zBS=(6+t7SWKf#4D!X#HD!||JvR6xl*r0W%%32P9G9g!U6;63xOVZ7Rpa958wGFlvg z`ZrYJOl}qJ;e{w$fQ1{Y#>9_{i@3TWLNSVg@9;;-)CZ>8=sqTFG&+jO7mCW{ zABu|a@JFrc<-akiJk7&->WA};aKBvSru~_+duep0%W=WzOxC+(rn?lG3A>5XOjU8q zz2c}4)bNL`5F2~V5$k)>!tts%VoXs1vnUgKnU#6H+=}OAS3KtPKA8YuNG4Ya*v#Z= zMP;&IQJGw)s7!8ARD6d&N>lx?rY34SfD1!|iOLg>tf0u<81$@{ha;t4o|P*d5RU!)2w)&>XG+HCb+u4Sz|AExL$1RhO+*Lh{6DbKknk)D!te zV05)$D)B_V8T?!sEYu=oB9?6|aUm|$l}SFXkv$KBD^MRPFg&;WAdrd+x8s;l2!}UM zVy&Y-D0?c7?I?;mxKIry%6iRA)cw~wCiEv&IYQaEAdc_wM`_^ir+YVeslm%u zAHE}wXdTW2fb!@K*wM?0K?lq$Uh%vdgy(Os5{mtA6vE6A3V}r^1U6D32oVZ_c?!KI z(6cDP@IzN+%CKN)xe^{02s}sDCmeBxmM0^xP~f>?eL!WM3ETMr+PL85OvVeyABvJl z^i4mYytt&7QC!l?DjYBKzw2OnAWCIYE8vLH699>AWI7EOB$+75|HJ5^!2d9MmOwRP{%H?4618p0$r%dwmqwd2n7V=TAn$)k1}^XlR{ju zJQGiLcvOKX3m>cyxa#o)hRj+ud;&mI8}JViV7-9EiH|Tl+RLO67dr;8+YAwI zzy%hQkbq50&Qa8zNUl&Ir`a16$b>U4I$M{=H||h~F+|{JxS){9<3bPlh6wypA^sr( zf5ZhLChseH%n*T(6f$Orz^4j{A0qH~T*$%XOOH;#z@&!$8z*dyf5^vz99l%DmoK& z!=Z^u3@#~`fUOW?hyW*KaH56?@E8m3z~ny9dPMI6;oiI+cdME=BZet7hbfv`urDu!1?5h^f9BB}t)s{&Mf(t3=F zh!MpY-i#|EET01OR3X(dVP~Kt{)I#>Vpf6}{@~F#aO;??!}ZO$6(a)mOc)s{P%p8O z@c=ewvJRK2^&c6HH2mQrgE5KeI9zyYOUusW<0YQR3;>z9Fi!K3tWzMq<>PUoIBv+} z3v#Rko|u3|JQ0Qc8yUe9OnHhoKdQ^Aq;?_XB|A;KSKk zeeQ5mE(!Q4lyCLS5W%}$oR3Y&hldjQ(8~Pq6o8+9s6-aX1i1$1XO~K3c|_1Fhx0l= zh4QVYB7%&>`~=|4{H&92_4Oo@*Kxgx>tDDS7%aDZpmHp*9O-IY)e&^|>lj=%u5q|% z#Uxzbhdi2cCN8gDne|Bzm&fL@H%-+)3GbeZL2=-c6!CL&gv5lQQ|1T&S*f#KAwrilbHEa^s zT#k&lYM&!+S>n@x?1`=v--MPLLI&R-T!4RBAYNTXa3xltd1>Ro$LS0+`R)? z{rGP*|D6{=xOX6kMrC<@{@>;MuMCyd(cj+QAL{kG4ys$b2Rc3U|K#i*uc?{_D9XZ{ zuAQyzcnvnRCD_uJ*~&3PxVx*nJ#!<2FULX<|MaD;y+aYus*aYyu23+vt*?CmGz7lj zK&Y*=Cj?LD|;7IgCWNsDMb_$QrqDzuWH4_V)I9*||A6!>rcswqayzcc+_cAk-4 zEEAZtu_xr}WLfR)ef_=N!?LIK(lTzwzJX1{$UuARV1H+5+c2eXOMh#qziXJlehap5 zbt|H5fsSz-zooyWudkhU#G+(NXGdqSwYLYg?Fo5B_I3xQ`_Vlu8(a@y@C&wf&p|d! zO#PuQ89PC@4-k4${opay!E@ti0hTU1$LfjZ>6z2aQJI5jh3VC1XQr7H&Jy2k@oRQY)uNf5)3U0v3e2iZvmhTcCPKNZ>*!cLV8#S?<*v?MQ)?IzoVN|# zjMdG-OfxoM#^sx#OfxQ1zVm->_#y-!_3304@5`<_bVh9F$TL^vo7d}sZL6oQ zNA~Qh>e}3y*^5OP^kr_zGTZY_C-X!jDnii}(WuMl%-rO{YBbH<5=hG~Uc5Nxgq+p2 zQ&!b3%g)L&W6tVJ_sre`mnYSsnJ-28$K%d*eQo|2NDmA)!FJvk$LbM}VZMXPJF%&SIM=C0kl zyK2!Q{FxtVm0Qm@4{r|@&)IBl-HF;~q%SH!13J)vti`LUs}>b(SzJ(Cb(zmFFCMHk zN9E%MrSoGe&0lCM7n$*uMr=eIUygxQ^Uc8k%mVq{rw1VX*Qh{782LCVFdfLZgmbwS z$T7R}&54=W8#|Zv@5(92NvX+#NzRq-&a|>O3>NKGNWjXPhr;LQWS^V8%DjDhrui!^ za4s6PdRBIASiZ1o*SFw2g;`nUIa#74U}f)GJUgqpz|6@{&dSQl+3V`Q>_FkHY>-dN zPoJGNE4|jE?^N^{a`7N%uoA(=CI{*L) zI;&QjDV06vE;4t)GW+$w#?W##6Wv7v19 z%QHF_ElQu2ot>SN-Cec%+??!!@;vza%Gd&Xn?Mbt8 zv$@+`xgou(Xv3l+^MkVkW=X#J2p%;`2$-QtGd|P&N(&ffglqhKtUhkUc=%wfZrTB} zC)4}RPdB>*=J?D-C^R)&%oeb6+fU3MK`;~YH>NMDPR*Xueq#Efjga4*K0*LFMiSuD zo9CnztjQ`UScl7u?MN$tX;yFO%AGl4jNO-@2c|AIx8octGknds$vj_Yt;0CDDWj%;&se)XEw z8>(u|yUgaeqX)(MPpWK|>5y5B%3XBVwfy%VmBh;NgK^O&Qa;6!`T!hM0FEZ0B zN675J+m`Y9W?zRHADEt#y4vi>H&X+hCrru0kgi;0CRAp@M^n>twpMLAergVe6IfYU zwYet%u3DCRYPOR$r{MCElc&tj$(fa&TC;Y~s@&wc}J=QcDgYJJ=3tPCRi41 zXj&1hX)Lb`u4t%e0=guaqjmN6YzW8~Rs!0JI{f;7Q&F&@cF8i03&|iCF2O!*eYB-T z)xl+@HNl3J!VZ=;*VJk2+gq?oD6J{##P5(VZRuJv*wd<&*ER=A0(qJ9Gv@@jU&)@E zJ3lak>$;YK_TvL}7O7fKTjxN_U}z(k^IEZVc3pdaXK$NUj#YM$-5o6JIkw~_6)S@! zON(l2%c_I9+R_!lXxo9EatJ;ltO94(y}GN=GxM- zhLU9sMNMU;jWx@bH7zYGty@uA>}jkiDyb+9t|+Q1Yp&C(xr>KqHkFmb>RdH<4zvcj zf6%ZJ51uyIKG=S2J>lvNO~I1t+NNMpbJJ27skFVTWm|P!V|B|wsHwBNy)o3%-KUid z4upEU+xsg@wd%fsingxylHNg>4W=*aX<6UZUWI>a*skGFpe@+HHQ3P!%QZCC21_dH zmXN()~?=x z_BM^Xt7;8y(9$+fYwv08-_{pG%I3jqTY`Np0|R{<`{}x!TVT(YE;ymKzLO5!-`k3j z#Td}o+S1cRXW>pk?WZJsps(9HTU)SE^LnpgCBjCqsJuK_S02P;K0Vmm1P2Csv|9Ka z_EN!|oYF=O=5HGey447>9^M8@>p~v|;Y@v-LIcP4?2?8u1h}%2XCrQ)P=_a!TWb&U+B=q^UurW|-B;{-Nf$Le=SYGY%tWLeqDipD0C)7TzDJVn4= z-qOFcr3XIOudQ#`+R)foQQA3x!;NjM3Wo{2gYjAg7?#ax52Blf-Ftt_hTv(!7(fWXu-p{nM4;M`+n_b~w6!B5BS^G0 zcK7y%Hnz8wlvG7@+7fi-V7GKrPj7HwBVt@|psN>Mh4G|ec&y(RY9G)#I=4!wqYJWQ zl#9}97!2|2fihbyD=iDwE~_omkQqe&_oPONV_JE$L@EqWM(wJ0oK>ywYw7IY(mBu` zg!iM5VT-OVcs4w=qpM|u7HS#T6qI%z6DjLfz$8V>%Yrp5FNeVzJ&NoI&2B*S&Lz}{ zYwHc=b@ugREz!!jRJ?3iby-pEv2}-2(l$#=t5N^pit3`;U@^TtShmvZ1-0DJ zHn#QC6NUptnF?2M1dI(vtTvpb^taIo;eA}gjI3d8S<{MT4OPLWRdr=y-K{;r_I{c6 z=zcw0I@`3yfzGySSt}e{*}B}iU~zLrb!o7s9MgvvX6U;kY97Q7RSqKD%*hRgVA&Ss zEI5|xhHv&^-ev&qZ*A}ImrmKzg5wk~_^vP6SlZ6nH{2+-m>5tK=YKXiW5*Wstrs_r zakGZ9qEfZ`tH8|BxTU(i4TEQ3K;~rE-+Oyx1fPoKj#_iH_p1@QtfZ-|39a#F+KPty z;F9KA&tV$M8ta0M6-yd5gk^S;JC_9!u_Ak{2+gX&6H6Tt z#4Hv3gai;37eYuNkdTmsqN11dMAAqC0n6G@ z!G?9Qtp&THf}LG^@50&@SL`S@R4l8m@9#P1JGTY*egAmxE`D-m=1x6x`pk8cN_=^& zs?thiN}s~guPgUODwN$vle1=}s||`}YDrYt$?}qx`OPZ9kxVx$9|_NgZb;ocDp4rq zt85?U{ySXhtTGw5g%&mb#kSx|+xG3GE9Nr@{X|z`c5%)$-5x5^wAHGxF~70Va^0#0 zRgFqztL9mOu&AWSoy3aTDka_t$*XT*)ZI{Kji;_~RGwc|*E+wYs;D*G~$mFSqj_l($th zRVi1gR+bk%xs?1|*bd*y_F7WuQKY?0<))S@D}^hLSC*G4(AKiZWmGLb-Lf{_Src2D zmA@!CupF$#pEgB-8h0-@D-F~oaEXkSAACWx)zZ0ygdot3+@uYty40weMtrJM+h)aH zOLR(9rzop0X>0Lmj?SvP6B_2L0;G(xJ<`N2kS;}da;#GZBO<9F%qk4k2DdO@ATU(@|LZx|K{vwwa6x1jisc48as0c>hUNq?lclK5F zvC6L+1C-?`X^0j4ij)fGm1I-U$W{vM3hyq?D_gfxS}dUnQ>84`0H;n>g(+`FPH{dTc?c5eoi zD)U)sHL-<7Yf`4DbTmK9N@M?PZpX+J|J@O~aZLKYvTNS+#txlr!%32ImAJq3<>e*U%oYFg54%FU|mo+|L=~At( zj+GmfE^V!zm{sIzM1|9B->2v($|(jES2Z-XRn63P)v!Xc8BqbCw#`=6IKRGrn9nWZ zN}-BS(UO|WNrDEFYs*2yl1pv7vW}p&UR`_hd05s~sbOKh}E zP*Go}TYi$AiMbQ3xa13h5!E#sG$W{JZf}URHCeK2d4Bo)%F0EN>UNzQWdhMWhm0*T ztYVVSUR+KSt5Md3 zrW~jY6Q=VM^K?gLDX(n}np$)s!n$Elys#jzpfD+SRQB6sJ)X%iQ*A5ONTQ4BlDZac zr6w$sG}JUkf=I+ln(S15=^AikY9HBSR!N=tkzQ-@T) zyvCP`R3K`x%5Qm|m3@^ns5IYHGQZU_UUy|{sv4_YJ7&2mRf^5IW%aF9S@jJ{!y~$L zeL8NXB`X2wfL-ay6{jo}QFDn^%&c+4cE~D`RSRf^wicj-5`}A1akqF@MVqxp`lh*Q z*4~#j`3@CtrgzBxnLg6TMb~<3H@GE9 zNm~rBoXavY1C^?^KymIwr3o`sD_3IRigaNT>n>^}V^}b?DZ8mmLnbs*Bidx5Ov<&6 zDbKeun@{@G>Rd~izad&iD%aUpUaEXB(4}msYgCG%q*yHl^>tQlwzfl5^Sd2#$%OA7 z98}ho)i>2BA)TveskSy14#N8?JFCEVn*?q1TgscPLnRwMk4AXDqG)6SE!k6Z`OsANa~EFiC{`O;SXN&XZTj?0 zX)Oz_$X(%@q?3!&s<*0fRHZqec)Aq8iZ(TBt5OTEb?mszsZC`$yJb}#jQAW|7unZk zT;s2bZS5{IwDd`5$TzAaMPW5hyE>}cx2%$CYxhOP%BK0&j2z~py3EQ-YpPvd-=zKw z6++_*>sgVJYELM&X5}{DDWgK>0&Ai2-2}&}`fBx8S9U9`Xj3V(*#^q!SfVv^SEVoa z*`Y5nbV*KjBs+Ivc(Jpx3nJO2#rZ*&ZLq9u{QT;yN)>~X4p;Yf zv2q1h!p{iYjpnXYEW?YnOJyoo%PLoVQ6bi6{bj0vEBa`Utc;luK`cpZn;)%^Tgsqv zBq?i~N>W3Kl z>*SM%@fPu>s>r7=w*>J;W^0a1J_`xyR)_n~dVRujHHG15D=mdUS6QX76Ics~wbQB* zH7pg-=4d-aHdR`jH&MMjzN2jzv7vmC8iRDhhMA_a`ZiyK3A4`$C8`-Iiw&&JO5IZv zR6tC+q}EYYRH!_tWM*Dz_9XRQZM|JgU6~82f_z1e`iScZn@|_+*igHOdjBRA+of%7 zE3b%Nw}b{QpOU&LP}}a>eRL&T)TmDpR&Di`I#~z8^pe1OS==_QA*xl4@ajuxZOitR zYHOUaRN21jdT4VdPS5v^uXgWhj@`5F{_rgX3+fWv#=_=M72AumN=l2TXO~VdR>P=k zPFT?74nSGE3Uoe6PzF)fQc)ZD*5PKQPr<~}DaBPPuLoQ;RU7Lgy5%a=m1%ALY8J9| z#_D=hHdTCacZ({;F7h_G)&up=z%!ZR%cWnHM&t z`d-xJHL2;^u2ih~I%!Ku^A)S;olr^2PMT5@jhmYlDae}T3y1S`nUgn?kXdC0zBfe2 z?9RA$-Sr+6wANT^@6UEvpdB-iKQWooDMO$K2pW}m9rKz*92?v$5-W}#p-5FD_3R0wUOC%oU0VgHD}q;SxJA?2pyZ$ zWwpYN%Lshbb&*1eS|m$%b1d18Yn(1BnG)1hxA<-&ADeuGruCF0UFBHeKf}666%psD z2Gg;-PbsGQ>^c-V{bV&bHLAJHx8GPd6cvJ`ZTW>qxSPt_!*yh?P#G<=muZ@^x_YZx z>)3sFXL)P8np0gPy4@kxMz7LJyUSOD(vs|9_MhSQpA7p?ru}Dx{b!{8XO#Wt;6Pm$ zDlw|%Co;aNsl!Pq$(gDi8`sm-;RxgAbtqWJ&C3kb(pytg)neT^ZDEaPff|%t6w}S` zs`AP=DqGZ5)mo?a`uQyj)L5V{sld{GB@*+31x@M#)7_=RuT=A?OBXDD_^arGmbhE) zYyDx0cxvJFjo3js-5_*0*(Fg)S*@>aEeqo#N|6-=-9?~(TSF&k;C208y1!jFVYs@A z#vn@r`u#Wz-pxI>xKIgK1i}*~>wP%z>vxjg1fopwLJuIw!mHS?l zyw-{8xv42_nyxNfHTuQkcC1J;JgkeWuP|&f-P&?fo7!j;(e)@%Tq`Ik_Gi;hU$eyl zi>I!%>N-7qrHXV=aW-YfK2fO+aYmxC?;0XnP7ysNXm9(#} zgV5)TWiI1%B~Dl7)*YsCJHF{&RU6f1UFMy%0#_uq{3>t4EG2X*4e6LHIkaQ&^-ycX z(|86O-4tF7uANo2ateyna+@=?R6}FJ21K{JT7eQD*Me?^3wIuh3TN7w1~=3q7J;LQ zc$S`<%_(bcs#h^t*<*<{Qbcp~ut;eewZpceg{6vNZ&TRtU8Z(FYr77|(EHe|J+=`T z@z*ubS@GwjncBW`SVdK9ZYl~}tSrY=H&wNbI(a2Rkmli|0)I4-y__AN4o!x za{oOz?nYK)nhuCMMe_M~IZURK#^b6~n(?t;#i2Hhf>1w3c(duAIhoiysnW4X?INi?p%wxzY=j2JLG_ zS;_&ej8|^Cb+vLJbw624<$|QbfAoC2+|7!?O)WJ(A5anAj}r?^D)IHpjA0G6#|0Hl zDlG(U70ng3bFFtoTX(6rHJe$&t-Z7Ls$-`@4^35BA6=~)sA`%5l^~R$#Wyg!wAdwb z;Z5YvtGoFuvSroRw6xVW*eHnMv+P(Xw^(FV?~Lt?%FL=dt2m(!cPkDnvbo-}@CLEo zM_-S3YgK$%puQDW99U1eT6xr?qtP20S774yGiK+j#M;iRRdPWPkAz#5`uEtKw} zhBuXsybH_uZrDRzyGvyn+>TfuXr#5hu1)=RI#)rnYl;tdOF5<+Ok~f}C=UqFyGDGJ zOfPcPCH1;kk4sQiQ$v0oR_Ls0+HJxLqgH&Q{oBR`r6&wRRGQbO1{hcN4jQb#RoRQ> z=)SksofkDxX-Jd0t9=rnz5;iUGd0x8Vw3A}jdm<4ee|)$ia)VoaPGEb2xW!q^0FH- zAq}$k5f8D|sT0a7h%b1&|fnM1fJySe2qCtwx;VFhIsS*p5g zNS-_M+MeP?g^CxdHEO(rstWG0qQaIOYXJz<>KAe2d|K6dpgcBQt-7Ce3N0&&*1WT) z7Z)p4j?l}dMzRtcEo4=A`=aY$Z&1g&;!&l#BYZ3MTq}bqTMdt4riMdUBd^+ZU706R zUanippUw$Y)jIiBF1KVjuo}H90CzmuB^u#l1rkeA>RR1hx6l>$Ev2PMtg3S5B8~Xc zBWIQZ*qs=yrfZl{amkDct`pmJPAM@UzNq|NJ69#Qu*pl~;TEbM>Kbk+Q@V~!ZI<$O zrJBaAl&vahOVh%-2356MB8g+h!W%JTQrPxjX`6cIT^wa@*qEZy0ySRUGRp6*jM5sH z_=lOBY$|cLZ9)TD_SS~!xuLT*LPj~bonTi2j+M+>>f7c<+yi}XhpJU_(D`@ck4Tf$ z<~G;z3!PurGN4_vo;%Wab)~6pS*gzB=v}R$I4$ubmaR=QqgDr87r(dTCk7EWsz_OQ zv5iXPTomMM|MNrK)!Et!!nfjeVoe z-TP{MR8msK;KmBIrq~ESi6UGis~=Xute)qwDdE+sdN0q=+G%wXtKtmY14BwaNG5v`i{SXyzF9E z4%B}&@H4E8$5pZ8?le1MH6r_*ol{vlt0+r@e#0BP+z+gZo-8W$s&nWBQme{qXi;mK zYhI+H)oe+>AKW@Vd#dZ-w)WQOKmp4jlgc5=nG>4RhFihQwJcg;vQF1XLlIoxW^35$ zY^4L=U>9!88bvhN#Mjt!v$9JIi^JNyk{+K?yETQmx$THHQo68ku0~1t;p#q~D}GuX z!q)&5AzYcd!>}&(1Gqtiil|CB-O!?hmJ!zqYK>GA^9#qT4C1a-v=HypYZc#J5~13k zjZp|(DY>Y<#i#PR?X@d9cwdC~NkG!M^P}|CzML5pX-vAx@%g&4il4A$nWu%2Sj zkj|2+#euRvHDguHb3?4+?;s7#)PT&X8s_6hT2$0F+K{(sg~?LAGD||$E$zqs+JImU zdXJT)r}`1Pr5e_)94`49>(aQ)qeE?sm9I7^Wjwwlkx+PM@T8)b zJEdtlghR~L zdE@%c!(zM6aGq;9h;1ydQEOMn$@~iS0=bi6)mz^kV>_zY;tM9FvkHsUm~L$>t{I36 zQkbhQgY06(aZ)_Aabh_WXozN%gzrIjV_M_VJ)it5d#O^ZZ&ko( zBz1JLj4M2sSrOZflyX>W8x!n;(W@@B>Z^)RS zp0b(Nh7#!3$uG^BVnsr=UWVz&_^gt=Y~Qn;bcn9odqVLHwfZZTx;!vU?yJ>i?Fwcp zvWy>JTvapPKWo$8VC6XXa73e$3*DCXyo4>PejDG9Sn9eFt(8K>30(=*2h{nXcoVc~ zT!MFm;BUF>6E-8HGb*c5^kV_+ePhhl?`Ck zH4gIY8s|>X0|ylv5U4Q)78l#~wv4*!4ELZzcsAT%&Fm@G29=v@h0BBt&D!5os?W=I zoks2{i14PdT~k+-olTb{1vUPR`?0NIIvo}Z{Ig~@G`x65R(`Da#BR+FBRyU2YR%|A zhqN1{*_v>}0)>W4x<*}JYPU1v+6k?brC_2OD%3O|Dbyf8|JZ?Q+$#E2Ev!>VL0nBo zcdSnxN*B7sZ~UTSt7cj3cd1|epews2T{X~7ZnPOKuT+gGYNx8Mw*HTnI<8q#Tvy}KMK?6dcc9almweA#Q>B0MVmLKLOQ2PoEU__m zv5IndwD#ziTIw0BtcNX|?Gc#DK%JD<4Vb)oH7rKE&4&l`?5w+FDgGSz5?WFC5Tz=# zc@t(>`%R9oJL^*00~Ada3598urDN%do=fxt($#)7)7k*_oLi%YvzFDnj>bt%dh)A7 zADchX6LM&gR$O=KL|8Zt+iUC;Te(H$TR+aQQcovYNg!Z|zJt9y_H2W{aePCjRYNUd<7QN)NKe;AZ*>jW@&mHNJ6%sx`yx@&m5Coo>&DGc z{fO4KvM1$aPw{u8A35i8Z1r=t*yAe}9jr#~VwawXjb!QR8}&_4*0y2m73%tJa?!-M z3C2gQgom{vdU(%0v6rsIIT$~`+6vwAONV0{G^#%CR#IJ~<=WBgUOaSdQK^-bk! z;c``k^3sIP1*_xgoTveSRL_;b%JW*Y8W*Wub$m{dJx1y~;f9Y&IOwo6>Y7dU7=!xL z>eP5@Pl8+jq-$!nosN(0E*rDh9^WDBbFx?-VBco=lXdjEb5#~Tnd66lStPY}x%48e znW$p!N|LT^KJGf?Db)@lVY2Jm$K#(xkEo@_hD~XezLD8F5B2Paul`#)yw#XVTDY~u zYPjl1VGo4LMcH~}&z&TfM_3(&rfaM6mqhzL6UrXy#-MItH@iAsD)m^48YFeCYAny` z*zl+IYSe;jIn49}2(7^G}B+vQ$qVZs)+oI@f*W>Uyd&xj@ZCDyt?!J-GkKV@ z;{|lN@%V~HS7I%0E1civ#_3X~a@Cgbad^K6*6m|Ahwg-VRQrl*irh#yU*Xd*rwlbz zCq7(IY7d@S0;U786v6$cH8RYe2d3&)xyYRs-#1FLkbCu&)nQ#q?n)+F$PU~kEAHv} ziB)Z`_Ni7#i?lX=kqV==^Vsmn7PYCUG@4k>?vU2n(~H(sE?mcfwu_Jz*qaP~ei)T8o+5?~3+IQ7( zWT_xGj2pVGa?-@Cys1Hse^5b<6uF1ao>AbME!=AkhcvYg896j_=rDV;;laa33?Ds2 zXFHrVTY0!{?$+7itLgk}7sH@?M`K+2r?eztutIq2mgs#Hd4+2KQda32;#7*PYRRUW zpy$T@V?<>OtYK}wQpk2?_+c+8(L%KaYdcUuS4otAIMIL23K#agT4kNemDVp+85X7N zUZ5Y@l?4@j%j|LdxGGMpFs+dyMbsXA;c2`zVe8RsMOP)*>VAmb!Nf(E^{bme%@5WP zyC5jYF7adPTuN%+kCsN_GM(mH8xo_+VxdOfHmDJly0O-zQTz6KJav57F#EX7l(uaD z1exyJ_*O9MNVQg5-%;dxIm1Uk!V93{OOYC73fv<(oIaJ{R9TB&gycBqo>6wsT>ROb zj3D}w74`6jT{arq*%+~=%IFX`-~DRy>1T+0dU-;7Reil{TXThtYBeyazUCg!RZ-D3 z4Olj&BW_Y@C@88`lc3I=%X~&F6;Vr1V=!F>>F9uhmY~GO_qrA;twIg{E$T{X52iJh z__N+xrtugJb@hw%vXML`9z1`o)}dBK7o`OibrE-?CmnZeaJ8!ex(*DjF>ImE%TZG2 znuGli6*s~>R>h7*p15k3@9$P_>Mxz@%D#?V<|34G5YoQy^4p;ch&FQ9l*o>hZrAb zx9~c-60NJ`TPo!?WBXz~ajGNP9$RV>9W81NjLIl=Ufr8T!@N#SuhyDrnVp>l#YT-w zcX_%hmGs)$lciR457b6gFjJ%LbWbJSA#tq=e>SH>3uW{>nL)jds!|6OKBjApZth0c z0qd}XEY&o8Ltkl0t{Nlss4X==dzho8)s3swpu=!lgzMncAlvY@2`=IH zo!zb(IQG1>Z(Da`R+Yi3_@czN#y>yrM-eHhk9$xs;lTlGr?Y3J+=Z}H>54C87c@P% zdG1Pw7ui*hU8Udd!LVs7ezaWl^;6~XE}Ux2*zbO&>n_bRz(LfmQthac_`Nf!j6e zk<=t~WV&aJNRZr>VRW;PS$cPk8XS1*lA@*^9m%CD6{sUOe3Z{>>+y--B((&TOb_2c zq@*wT$q)^nQ&Gh~)MNepZg`)s7g|B3Qk7skVbO7|ibWA?nXu&oy|To0D}<@1S`3SA zgprbKtBx?lzgYLbRsGZ~*k8e2RW2vA9aZtnj$6ewH~b{5 zv0F)B?~>5dlI<-;I(pZ*?#pcM0!1RNIyLSTQT=o`nadt*0lP-7g)#0?245?-HZKiB ztgBe0o`BdRTVcJ&Qp&9jbqWu}`W4g*RXSZwaPElQY1ZoOIWom&ixFC}^#R-CKK9C^ zR$r%fS-#tOyNK>UT`1b~9eqEOEBwV>)WRb74iLMO?3irSS!0W9Aaw0{z5rqMKE4w^ zvah!~yQELcC)~{8J6|-wtjSjBcEkRoVQ$tvVoj3KmHBqB(pl=l(HP2Bo$c^RK^4uc z_mI{-bzs&fJ*jLD1t>}N4+Xfq%_?O2zH9YKPK?!xQJ|>WqS0s8!i^T>W#W_OIqEh2%-V*Nu%k%T17jjz?H?+#7O zHptfsqqM0+Tt``42CXhYd&>pA*rX{g%KO@`YYKH&Q8B+YInnk_0CCm-X3Gr1Zcsf( zpyG&bC7;yA#SnYc&%Ns`%nT_$yPG0LBycdT>G%DxlkYdi!y8onJTqsVSX^`_+)YSgf@dYTmc zXaaYd7^`5bwir`hqB~UsQhax25bbfL5Mj5byJyOpT|*$-o0>I4BmIhUbP6=8&>m87 zl^b98PQHlBVAX5jpTXQ(?i-z{0rhSmwTiu*f+txX>*Kba0#Bz zLR^thy$fZPIk`5vaDp|FYim9|aE%vyUGIw0rOmMi97=Mgg(ukcJO$xU7j~s+XNXI5tZjN^U~eOF<>$B(n|mtFz8oE;7~g39-xgM&<{(b3>#Uinixa3fSp6|>ERrfOVR5gSt<*P0b(u9ofF zD}Jox>0d??uAfxU5^UYCHozgV9x{5EJz&hkNH#>+qK%cs!Tq`*}I=VF09OG*HmVmg*MqDi; z>0XGvCn_^JRgcY5T(NOFI!Cp7__)2u2LH$1Y>EsVw+1)c7){k!i5@m`&fZ$%66*Lw z!i{~RM>lDg!U07ca*}XH$J#XShVF0(;WtJ^yEx0>EF<%e#?1~yy8k9GLB=}s@v+k9<=i|@l$)C%UQ1KY*} zxK?@+goF-ihGV*cB++gnE33L3Gnkm2eQ5e1dzW^p9Y185yXQ{v^T%m^cF&z+^A)xq`wBn3^qVr{dk$LM_4F=hY;$JkC231j&(c~t zo!T=!VLSHAU0FT*EKWV$<{r`0_VvJUCDMM;YkbeW7k4|o>lt0n+-6DVrDoa z_Z*jcOiEANX8iK@lQLUfKD%da>Y`M)ylo@=*e`^ohXHB76qePq*W$F(Q_rwHdi~|6 zpL$Y1y=A|~6@GrxA92ehe1D~z7kAz|mG-n>^NQa``_-|n?xP)37k^Cg=W?;WKfY(b z#a&L{=8Vo~rY%Wbsy)l@Ic!nSehKF?-)*~3xbKxcd--dx$?jv)X)c2HSM+QqZka@3fs#c23zf zwNJ`!DZ8iiPaBXD3~gQ1(5A=MhpN8dtquRuSKET2F5w)iY&RHc6Nb75rmeg+WvJeB z@0V}|)UAziAF9Go+tA?|tf|9Tl(H7t z>I;^>vJ>%diH)sj>kIi;X2h0?FO9~ghVLba>$Hi@Oe`SArpFp!!V*+$o)z?5)x+;{ z+_7lc=*)!PY=8MQPtU|@Ay;gQt*~QfKx|&Z!-cWQw%^IG#EQ+eVp0724~Mq6rV$_I z6dx1cXfSm6!I{G|br^1;q4C8}%^HD*qifXcZx&MIzF$0;gv>$mUx7qq=#sQuJ}^3eEi`Ie%g%Daa8-cY@%p;fo#|MRD> zmQ-?UztH7A_G^;yANONYny{Dt*>e2YVvxL?&9l#b`lnw9`@b${=~41_!(TqsEc+QQ z_p!7rez{K-wlp;Sgv(9V1pNqE^z-DADM7kI86P$&*_~liep= z-vtWAFITC6<)`5%jX%zn@!S1a+qHCYoc`JNY&r7={fl2;n>J+mZukked#xtKudl~Z zvGrL#8LsbX{T;u)19f4dzr4wEB6wW?;@3Aq>sza7Z#IG-Hc1kc#J3mg-?bk8G_1Uj(Cah0CS7!Ske)JXh`H%h^zrG2_q`31nPScfb zMb~H7DSmzWvB~H!ifXYSTwi}J6u-WFt#7pEkJG>2`WNos#H95-tev+qMfeHVmz}h} z#af@`+2i!j^2l&~4N2?!$M*UmVa*Re;ri;5)_0HASEPl;>7V84;rdQXT3@YBM)*sq zTFfnHo|Lq{v`9+uv!;*JKPxYU>$@gteb?(`EY|$+W6Rmcei%9a{Qai&jnj1dXTO9R zuFwAhZ!Fyyv||wDYkv6Y#2@!0t#8bn*!8e7OSrz*lJ>7n>)YCWzBXxnZCan*U*q(z zf86@MPFmk8tHTHvDRnh!SG|t*{3vVed}%i^u=+SXK8%6z6D9^yMEUon4|gOCtP1k()zwEi`_?q zwQ#t;b6B5npEN~ci+AD2_T4`A%ewY=xa;X!F5H&Q5C2}Bw7$KyoL%4W6Rz(?mb2om zeMV@xa{s6MuPtZ)-e{(x?U3m zpIU~+C)~f^la~8h8OqQ5hD*h^`%BVx^Yx47t8{|LX;C}2aJxNp;=*;?T0VU-2p+XR z_=NMiYPtC1_)RzJDlIck|3>IvxV}A;)_3De`pM03C0Z{0vv1P+R=%$EPy1}^8x^;{ z;YsW3`HHrsG(Y@=>l>1^zTe(Valc1DP799Kzi|H!XMJHB(0hFl+4I}TfJdeZ)l9-R_AtK$eiwq5&7OWMEd-_r4F1>-c&(zkH`%C(&S->gag zb684{8U8K9~>qG|rZ{bK1$3_~MuElC*r>0cx>Sl#ed^d8Z}upB1#N!8Mc%O{3X zRkBK)(!;GU7C)@y75k*B$fW( z`=qL5l(>Br4&pwkD(NK7SEdp7NmUM)I6pqev+egun%~DAU%zOyP$C-lNmYuUxW3)p z@+U`^iO&&i{r!@b?-yOt{zz5HAaQ+GQiy$0gY=~N>9LvmD>WF9G=D(S{DDdH2PVzm zCuzRL*4QUiIcnnm?dOhH8|JfL_=ht!7@V~HV7L6F=u%4X<36du0dXNao&){*qf-wI zCiAzY3n>Y$MYjBqpp5wzb5azJ|D*;(a=6$hH5eWX=&w|l6U8Q_Ce#d5?tAwqL)LZGvdkTjiTYr24Y2h90%X}<6C@Fk+QrPkgn{=Q4+1*-`H2?Ud@EI&` zb;90Ck1kG{e|1v$)}-*gN#RG5!Y?O<-%bi|ObVxHKf;e4ua&36kA-(m3h$8=4$IY6 zC+)5D^01`&M`Dg0(q__L(2mAk@^JHF_>>+{*2lfru^ zg)@`F6O+P6CWUK~!Y3q!mnDU-N($ed6n-Wt{BBZsQ&RZ%q;PK~9Cpbq9qX<9=0L)$ zG_kk-H<9pfZvIX|1!1cr_g4PVq;UAL^LJWO`0q*KyOP3BB!$;1Z2Mz%=HAMGK1!PZ zeNuRvXx{0s*KSGS1Cqj{lERad!ZQ`N?Jw59-pbFa2wNSwxALp@q~*^^3SY(Yma_F$ z{&ff8VJ@5=Jd?EidghOF^9KZ95VoAScQ7#cEou3lYTvQ_v$|w&m7e-qdk-Hw|HG5Q z`7EEV>)u=W)tsdHbCbd+C510Z3g4C#ekm#Z@1*b#3fun9(ZAlx|I(BWgdf}A9!X(0 z;K4m`v$sYfs*PBkg&N+Xo^KmjMtk+2w#r9)5%#v1+HJLwcq@&=wi&h0CcO{LPwn`E z=eTj=Zjt1t>pOH^XaFxy$=LEX&i~IJgS91Wgn=#PUkb-aBpX)|{|uE|Ao0k`gC_hO~E5u(wTDTc4I3x^Ncx;pmSgj)zlLE9D8!xYh{9>e*u$9@uK`4w`y z{Wuo;hMl3Lw{zQMbyvlW$4{7I!>2U%O`D1PofC$=>(vPES4-^+;ZSUUowxQnyb^8O zUMxG^JvknI_$g_qFlQp+_ib#i!!fkHO(o$KlU(4$x3Sqy*(Hjdpl}d@rnoT!;SvdN zZ4W2f=oH(ojlZ#J$?s1Lm(z_IU6~trY+X*#DbcajiV*Hc;r{ey|C86yyPw+rX7kOM%J-!FnSQWAPJWv@ds~h6?Tl#g!s?8 z3vGQCzY_-3>)Ua?haLM2-A*RF?)H+;axNC7pglIr^Si zruIr)i(i`MD!-}BXY1{6YJHP%Hd@`l)_cBLp?)M&>wDPL{#rXtr^+C(HsMZHL9o`W z4uaRr8qSlBa~%79EH;~UL2#<6iC3B7accQTEv)_7$n>tZznb31)N=cpn(vNV;e5jC zQVhD!4T59M`XD&Y)chspoFKSHc2X7hUrhhlY|wSl{@QX@2Dam~HvR66L11+sw_i+u zgYZUE*W1c?wjYO@`u@{qlg@*wgB+!@b9Xh07MU$UaHQF)>%{a0xERmJYw&q|1OIKR zLcWpkZ{~cJ=~QO5?GG>)C|;WFzTKTzUE5V|5V>jZeg7o zH~lPp&D8fkCj2dqG0zBs38waUmZ|-nW1gvaWiC-ahPhbBWokK13c4@VePU|)6{a?3 zbqbrmuQ`?DILG(@*>Z|PZob<;eZSJeny#qprt1>8ur}qw?)bHyl@^{B1kamV-!^vK zrz<|1=jwP(O|NFUwTE^;Pxq~<^*?Ru{JdytBk!2n8J8aDd|7*Ar)657nWc2eJYQ`u z<^>ufWnQRw#{3aD+SExL!2V{K+TZc)XTGWZ49{z$g>{}3rGxI>{rR-}v!{hG^8K>i zFY*1Awx0*ube+!;rp}i(<&I~9`8VH>(O)a?XW?R>UiZJuk1ObYrPYVDuFGTV-^rHK z`gb?A{z0bJKg`tnN1Hlde=)BjoxhrRb!`x66E2-`$D{kB*}|HxsO`KEA2*NDeS|-v zOV70Y{wbQT`|MD2h5FM>O>bnni{}d8Y++!=Q>bNyJFP80q8W6NbS->!>=bI{_Ig>_3f zb!g5CwCiH?=i{lUOYElW)^J{dIusYa1J~e__zJ#*pWwHcs_S9f+ZiptvT!CAqUBdM zy$Vmp<#<2Z^|s|K|2E%4>yx+ePnf3bY2h7kPaJ~Q7HISHa3)q^E1rVO@b7pVu0d=2 zv-Q1>AK_;F1GlqyqUEel(;SQkV-A*J88+dGcs5>!H{reb1g^uc@K@}X=C{8q?t___ zg@t%D&c#J|CSHQq;c9#o*Wr5n48OzQv1@0)Upu4a<9417!U8-JYp@MZ!DV11$b35D}_e0CqZT@&H#G|kVThZFGZ27ZsIo^r?#AonTd>=RAPnfDa+Sa!{ zT7RpB_rnP|4UfeIcq(3k*WhhfefT)OjPKy5_#N)Fo!_6sa1u_(a%{pAa4CMI0+$`n zH~1TN+ul##1qb3VJRB!u88+haxCAf36}SeU!VmFR?Apt3e`g$k zgHPkDxBxz5fU$795!ZNJE z25iMecoLqD=isGy6<&|GqK$d9^LZaWh>zp5_%gnR@1TuwwD13fX{uOQcn9o{2jC%? zgT)xZdR&BO;zf83-j4skXYe)r0KdUsv6~9owtu_eKpcjL<7AwPl{gRoif7}c_!@4& zuklyxs*15~e`h=h$6y}L!b&_An{ff2fT!Y8ycn;+8*wGxg%9Av_!O?gH}O6E2tUVf za0~v1oixVNj-sf5BN;g)Mjzo`aX+jd(XciZ9_N{29~w`u*sI{csSDz;T$5v#=RY#ItZYUXQEs zVSEAK!cXu!`~!Qa0maVKZn!UI;y5h8Be4eC@Dw}`ufUt}UVI#1!S(n#{)nl2aNcka z+#e6d2{;Xp!MV5)Psa=KYFvqH@M(M%H{e(JAMDcK@83?i7Y@b4a1u_(a%{%G;yHLZ z-i-I*llV4%ir-_fr{ABR*cS)kNX*7UoQ-vO8lI1T$6N7!T!;V0O}KNq-;V)!5a!_w ztiWbG5zoTqcs;Jhhw%k`3%|r)aGSmSe(Z>Q;ZQsbC*gD~$0j@hm*U^>I(!UY!S(n# z{)njq{QmU9J#c?K7$@K~JO&ry>3AVtjVo~tK8>&92K)+t#cl)re(j3;U?yf^As&r$ zaS@)058|`NC*dO=DQ8*r_;!#+Gt#}fijmz;myc3_nSMhz^gg;^G zK7RkU$G*59X5v_!f-|uKoA6e=AD_f^_;1{VKV#>8{eJ9;2jU@^i=|kGjd%hs#Z~wk zeu&@TZ`f@=zujGMAP&RBaWc-tN}Pv(#k28JyaDgRNAN{_8$ZSG(HihA-`Wm$$Ng{w zX5myk3Ttsbo{G!xO1uT{!zXYpzK37nPnb5??_Y0B$D!DO$KjcHFHoQMTjf=6Hkt8gyP!*)CoPs63S3@^be@LIeHZ^yfF4L*WT;S0D9-^BOuBm5k{ z!7cbJrX1+cXBXTKcf{RrPuvF&z~Oi>9*)_VhlMyDXJZ8(i}P?Ho`h%Mxp*;Nfh+J9 zT!r`J!}t`wgm2^f_z7;p&G-}kj;TZZdFzJTf2xj6TI2Lno3QohBcnsFz zd^{dc!87q(ycn;>+wgvT0$;&*@iY7$|G;gB`s3df2jW3^7*50zjNn{s$J1~bUV%5^ z-S`N;fN$bQ_znJwT@Uj6xib#HgK!My;S8+6W;_wk!sU29uEvM)1$+xX!SC=7>@m#m z-)^`sX5u(3z>72e@>kSg7bm{a3~&%6Y)r_##THD&%(dqEqE_J zjxXce_zC`uX(Ro9?SOmWARK{XF&}4PB{t&;xCAf8Yj7n#fKOt|D8C;gaU2%l5m<%u z@I+jSm*BN{JFdZ}@N?XPDF^%QZ-=|#KA3@HF&~e>YPeC>a5Mgn-465H+Y5)_ zA((^H@Mx^V`FIMRi0KdXtu=5zde>>nFI2cD_78c+UScUWOL|lrO z;I()=uED2p9lnQO;7^!#IQxnH@clx<=i=pf6W)W5;mi0gZp1BU zW1HN0#C|v!M`1P=;n8?3F2pnNVqAf%@L_xr-@%ReBc_e_`_&uMaVU<#$v6wEu?Sw=AwR7-R=JzY{292OuQJc z#XIny_$F9)5v8VOoLT?hd#o9*BovE|y>u&d1~N6g(5p#f$JV zyc%!7+i*4Bj}PG!_#D21uj9M;0e*&G;rI9p{(+sR`s3dgcfeh74;+Yt@gUS2)!lVF z4E1|VF07yUbrzt0>C}afzzA01T%3pPcp{#LOK}-qf>+?RcoW`^cjFp-1fRkea2>vh z@8L)IIevpb;_sMN=#O(-?2Wr&I_`%j{5A_)Ef@3I9eo zWjg20)c1EF+>h|SX4fD%gz#j-)r6aHA)d(m<+vK3!uL#_pN;0W8iz-?(+t1;-q_FF zPUGqckH#!qfG6P+yxi3H?!rfyz82rc4{;OzfWPAoGqoO-We1pA-()Po7CZy5Hg#M# zn!SSHUc!%>IVGCY} zEAa_a`}+#MgP&mMBmDec*cbQ3;W!2-Vlf_#$6`C4hRg5@ya_+TZ?W5vem{1>0XP&7 z#at}LWAIp9fT!YRc)!_O&*zyszpvtY`~<(p-!SDU|Gl23zPBr;<6s{j7f%oFertZ&o@iY7$|G;hM z_~rWGJ~$i?$2^>lbFm#y!)15{-i$Beo951XK9cZeQ}N_S!YO4wyaOJH!%ZE}7{XbE z^9fHQJezPm&SUxsgij%S0bYx%@j+Aj^BCb539lo(0XH%ITf+8YRNKF8O?|%?;l6~^ z2_Has7~#VRPsS2c=Vzv=`?rSatxP}J)OMEP<;=gD`48he_%-u?CfuXK@88b2yQ%H% zNB9sNk5f=To9K?K9Z$xkcp+Ya*W>MYpQ-IUPxuwW>j{5_KjN><->uSrZ+}zgH4{fO zeHPX;eIDU62w#kU#~blZd;lNA=kXO&`@0@DW1lKN{SYj`20Ra!<8Al|evJRcovZ!& z_QMf42`h0SUVy9c75oObukq_U2n(?Zm*UO%JbrEBe4-Lz`O88{1SsY zzrLMtB+kHjcmb}$wfHf1K9>E$v3LX?hv(s)_%Hklx0~zNGZKri4$s2d@G1NNf5n~a z{d$I(ef66&<^(+#jnkNZtT`zN=9zm0!O4WrHnsfugs&ic4dL4euOj?U!jBSuf$&;W z>wS;u8=3w!(|b4g`J?biY{U!kK77{H{=RDN83Z2^{>s$;enO(!VAj-p;h`5#EFF0K!8EXAsW9e5Ow$JezPC z;d;XJO>J)};S2Fnrr%&{zwRfz4!_3jn*I0p!z?@s=i@TG1)nyx-j~dQN`DA{X6ksq zB>XFGGtW=o*3|cQA>5bnzJw1YoI`jr;pv2rBwUTH=9nN@Xlg$$#Fh9czJott&lbP@ zARLdgaRHu>*W&~DteK^9BjGo23vS=)*T1K!<@O;wlJH@K3$YfL;0k;Y*W$OhO`F!M z^SFb#ZxEytKETxZA4YgAPG))`;Ufvx6K*Gb0^u_WpF?;#;VTK>X==MqF#T1+pAr5R zw=jLX`F{ERFbk(+8=i-^nmWE!=HMWBgz$5wj_+l{>+w^jZz8;f@P7!WE%4v#W@^1V z67EBI0O9>iZSOEF#0oqSm*Z-D!qj@7HxCGcw+Vl2YJWc``~%@%2&c9C`Q1!?e<#Ab znOe_4rtfbKQTqhp38vPYN4S*m5riuV*AZ?byvWSe`#_j}zNz)ziH|e=IrAX>E(zgp zOl|K6!f6W?*8c8{`{59CxXQnTb4`733gPL5k2JMh6Q08SC1z$2EGN9e)c0>9d>=l> z^rs20Bm4&84+wuscr)Q2O|9SFHDvb349v%BJQ**>8%!PdDs!abCE@2y?dL0m-y!@y z;V%gPg8yZDx8wZxdYW4AZiM?29!z*B;lE%W(~l-xOSr+*^-&eV3!V*1^< z9yjAQC;Iga!4jN}Rrpt2iBIDO`~`de)vs^3sqK$3M=QP(o?+^`9!0pC@M*Y&=@${c zl<;+gZzg;<;RgsmLHJdCi|HSlV}oFmsr~qa`CU))`_a?X^mJ4C$`Hb%%&|c*mg)5; zE3D&b$0c|XUWa$%6Zk5Ag#W?rr}*{lj{9Q{7U5BNJf4YH;Tl|vpJCTi{rdO7LvRX~ z;i>p{d<@^f&DiBMzrOxhfb;NtT#1k22K*7bF6Ov#I8MS!JPEJCyYN|jAGhGPr~CEp zg+;gs&&QkaaeNQI!IU#NZ#W*0#zlA*UW*UmEBFC^kDbr->+Op}a0UkYSi5{0Zj0OF zZny{Tje{@)N8#a^g(Wx>%dr|&tZ>^`a_&4Em*H}}0$1RTcrUKO$M7k93D@D<_#S?Y z8}VEG0aH`_es#fKxD%%1-Z%t@ck`;|^O14rRl z%*K2y!b+^g7F>WQ<6?C0r_%QRPWT4A1s}i%@dbPZ|BWBwX54~lN(k&ccg5{-M;w6r z;z&FM$KeEY@44!wpDVSnti^gf9#6tE@GQIl-TScg{p$(ejPAWyntm_gr_tVTY1?}Z z-@-5OYy27QeV4X;Pu)XiZ|sNZn1Q2k9NO=`*!QMlF;<$rb==s5t#};%747|*w*19- z1zwG-@m_ooAH`?z1$-Uf#trx}evRMZFZerdzm4CY9nrnVOZ(TK@Gx}m^V0Og31?w3 z&cHcXi3{*JJO|H5_nt4U_X@%*(BAK9=V=w*gYG?Gn*Ipk=g{75Z_C^JKh3xB3;Y_l z;4c_-@ypx0?(KWqqI++c!u<&kz`-~K$KW_D#1gE+Iy@dv!ZYwJyb|5}#3q5O!^zc5e*hoEXYoaR3)kbf z_yhiifyy{`Uv$B3u{Z95{c!*e$B{S&$KfoTjkQ>h$Ky$OK3@g-b`Z{d1$@5j^ed_j0KZow`pJK6DWi@k9d+ynQ*L3ki$;=%YA9FKWefTcJK z%diUTu^HR(csv!)z-4$5UXEAc4R{N#!h7(a_y|6Y&*M6L9oORq{0ukYclaazjwwC; zdG3lma7Ww~`{Mu{j6-k)j>fT=jm0F`k3x<8r(LZ^JwBe*7ms zfzRN}_%D1H-$(b}Ma9SO3IB?JU>8;NU3|sf=-$hy@9jZ&FC2~|aRN@lA}qz(I0tL7 z9@}sso`k32MYtTV#_RA_yaVq;`|W2tuIKP2d=1~i&u|ldk3Zobn5we9t*<-w#9eTA z+za=?5jYyhV=fk9DISC6SdYzkDxQJo?F5&sO2v5T^@dCUAug2@}UR;BZ zE+%m~a;6U?G;^(O8D9*p7e2Q*kMt zix=ai=-#)f?O#XuF1!yP!pCqezJ?#+XZRETik)}#=fk~+Q`^~*@UH0I$EoT25IzVq zF$eRo7-wJvE3h7$(Y>!z>pzk3d3YgSiPxZePp6i@gYX0B-qWe+PZNF~*Q0wcr{;e{ z_1SKtb~5%0je z@G*P}U&3|xA%2Qm@E6=($7J`%j<^pF#=~$d7GWtKi;Z|9o`Os9T)ZA{#{2P~_&mOh zZ{R!l0e*r%;LjNB;*Tc{x5e#o5FUt!V-}X+Ogsk5ah};%zbAn1{i6z>O!zE35C4wW z;?1}c@56uKbEX>eU&7b$Eqou{dq}n17lgk?_a0JB|Ala{t6yIl?t;7HUbqh)h{Nz; zJPgNUF3!T)Sc$dRjBR)Vo{VSW*?18yNB4eH9nT8Fx8fc65I%;_DqMlL;O+PzK8nxa z3-~X51K-0B@LT)=-TPX#KY==$Y`?l<58M%V#XZrz&sEFsPk1Pf!b33&b8tEyf#q0@ zP1uSj;K_IaUV>NSb$C0v_rz-d{z>=|Txag3-?hN?xB)-IP52%Di0*x}`hLppemz~W z2lmB1abMgY-TP?u{gH&n;5aPA5t$ zm+@ctF20W&@k`u-zhHNzop!!^Vjpzx#ntqE3Ga{Y{kWPwn(%nc#Ud=lYCINOu^msw z#dt1WfGhAuT!r`G)8;^pN5XaZI*#-S6!qf02M@AcLGt|EL7K7r4md(W?ydzJ7z_;38m z+&2g|!vpY8{0rvdWSoZX{li*M zCE;3Z!3DSk-TR2O{3V1h!&~tVd;lNBm+@b?9yj23<^j4N@OMm6+HBKz#9gsJ4!{vO z8pmQbmf|cd!zx^44pDss7vmCKh8N-Gcop7^EAgNB2tJL^<2rmD-^Y*eJNyxYbiaRT z*b{qWKTO9VI2^NaB2L5U7{Ll`zh}xPw@-fj9c)(*lBNnUbn^VaTnYj2jYG>6f^KJ9E-U)8K>cNJO;~gE;ivp zJONL`Gx2=97_Y#qaTVT!598zbBCf?Z@m>5Df587@r+xhS>Vds*ckGXucra#R4i;hw z9*t$V0FT3^crIRym*UlU9o}V**6-oqL--iJif^KOKe?9wknorIE&hbRVh@#_Z2i5k z5B9?h9EFEt78apb_d0v+FY z9iQ3R|Bk7R*Hd=o#@P)r)kikW)IvH0*DpQJ+?n6gRGpy6!YTvKGF29sV=B$BHFXa* zo7(0=Q{}RgO_i6Hm@3blZ(2TWDu2AjR6cRDsdQnLX&X1SKWW$%)m`eQ_d+!nx^TLw zwq!+X=O8=~ZIyN$V{jZ!z)6^ovrO&pY@CCY=#EqS+h$?85Kq7*cn-Sb)^ZmUz6P(y zn{g#RVCp(Oh>x0GgWySg)>NPRi@4U*`FaiCGIf&H;|5db=VRPx>U?~O-U^y*|Z`#nRQm%nyXSm&dcjoZ+9C^h#|JT`T_BeX6%-Ud_0dA50g;^jlF#iEF zy#AUWUVnGJYO z$EMCp&`JN-_tVS+bUq31Wa>PPCOpQ}`IFzUpyf*|-C5t=+uC!^_p>usXMMM__4`>nuI`_k`s2bb zqjUFi``t~>-;EiU;?8w?bl$=GPFilO&TxCXiyg0RU(ers{&QjH+(5@wG|A?5-tvzlQU;#>^WxEy{84Us zsH8_`-`c*bQ@8x1Bp7h{oX%U;%-CsEFtD|3o6TJV`%W;ZdTnN1a6rYn&Rg!E)pc{f zu5bMu3`;rSsI{H9JaFVY?(gYtiQ;vB&eXMj>g2Vf-B!|9r`Dznuq|9Z$4^m=8T9Dd zwLb@|UjKQ?=qqy4)~2#2N8KHs?XGK52kx@r!`j~8rl#te4@}*3Vd{z{R|I4C|7cFP zxAvHly6N%MqiQo(&&s{F_R@*h%uCsjHt@Q6E0&Dizw2AOFt_jO^xD00FP+$FgTIz` zJhyxnxHI7Qq?d~$KYwPiV3T4&)_0RyE-kX-_h;y#jXxKz&!&94Bp;q5{&p@O{e5b&Rxj7(!U!UV%6Yg-tCx>)x4yjI*s)`0mG7^9 zpdhz?Nwud_zHkoMy#2J6Vt>|YQqJc5k`5)g^;xdjLQ1jWB}Hh5>u44|iL-$->x4 zF8QE(!76=ke6#)^XgPIGr+RX$jV{*Ns$ur&H3{ZZPgdid{kQ3N4JP3!C(gR)Eft?biz25ZQcRQPnRcIwuuoXNgZxheJsJ7BG%Q#V%iJe7^nGvLga z3i8I6Oje@*`F)rAFZ zc37t?HT!h7Zj1e42~Yg#1qmpfpIy?uWU#ctI(ye815Rm)+b4QYhrPS2`#p1ab(j3> zH*2ddVl^*u7+$J-~82mb|H&hF}=1$S5X0{6b^1)WDadeg*1am~DY<4?~swcFe} zC?%?MYLV2qqydq51{*Whu40p=5Pbrj|Qw zZ#b&s`LUHtPhRek^s179wR8_ltSyrKSStdkH;h(z&n}tk$r(4c2&2lb|48}n>eMRQ zAy+V|Hj^{rv-TfAe>^_pIoK}r(t+xO5%1ZxGwdJqH2t54yT>6iriw@CIm@cw?N-|& z)QSHGs^@jKnjJZ)KQy>H=hSk94*q`^{U&{=+TZHkZ?u;XqkAqcSy2)yX|^LxTC8Uy z>Rcb|A1$}j|7d;n^=|9!zi2%pPxbZx*?JH9uo3!@(IswgZi(mYk{PaVYdMe4I61>x zt8ZDJ|BQ9)4{GRoOzzX}*o>7+Ln)22n$*58CL>Oak4`K15hKd{td{&QZgX>U}z z)+i3+_q<0|zo6$-eY;1CwW)*1eWd&tT6D$O_*$CNi$*k|%;XY(iFs&I6Me7Np!HEb z>O)%YuY2u^!<%C@W+O^O=jWqg8Ec&&Td$>ay%Nf2t9EZmINGGdojW%DUUf!CY#;As zj-KavX?gX1tD1m+rJ`e-*7Dp zRD^-=L9jh>IS+Edeu7h2iMG0Xq&$VY!<)6%v3 zE++H8`_2Qs%e4P{av1}D>28(ODbbqr+?zN_@08H2{lU+_HBZ^?+9hHktlG6s)^3$kKV9?-#LQfOR6{Ttv-`~Y=^PYuGYI`mlW4)E!G`yD$#Rqb$tG(JH}^| zfBR|OlU>quZ!G`RH{I)LGPWO`l=}4KNm>)@GxA||fq6{J4j=s(axdNSO!c(RIasT$ z!}l}QQ=|0M&RYHKlDK+4sq3?ESn`u^4946GeEfggDdGQ-odypbKBi~?USo!q4KD89 z3qj@o=f4G}TcH)L_dhYO3;7qz=k+81!tR%b%USu0ed7{R{&1-%f3b2n)_VcQrPBo% zms1zuDE$BI3zx(Hul~jC_P>PIzOExr49EXRfmnLX9?|Zpu|F=^q z3DIv{!pmQ*y|I3Y^+!rHAD8m-mlplTrM&$4qTjK8$Cics;h2^D;nV9e10+7GF=y&tzcZ=vZwgBWW=I7V~kiXW^Z)^d`pL-3C^C?l>F8bX*`W^G<4pH1O z`rRq|-8uT*CHmbp`aNQPY;0M2H>Bx2fHo1ik472zW$cGp;xeeCsoO1kAtebN6_?pV zQak~)+BD)8LkWWiLE@TS$_yi3cH>8*?znDOF~y3@1u(jy)p6YyNlN@SxSZ(`zcOAc zM#iOUnBj>}DurrR+~jGMC>TFvC<>lMzU^Zl7~Nob+t213SC@cHA4qcBV31jtlPrX5 z+I(%0X7Esk-RLHgAHcEWyWS5n&WfLyg1YVdU~`wmH*<^}^iur9-$_1&j*6ex6nq}b zxE>Y7UvmiQUW*T~Cvf*Dk(rv2i^j(v*jSWS~Ji zVB}<$y&3;0bMcV{p4*wJ+r@oZ;6Z>?rX+7i(Pu#jUkY}{&{v+>FC!&wdXc8>4S6m$ zUP7!>2m2#qyzwgdH8m8L@=Oq5sIM_ZJy#gi-cs*o0ZcMl)WMf(1u>q<#*@%5$u|vF z_e?PsU=QnC%l8WW#dD=G1;cHg$CrZkd!`!q0Il@+h7SUoW|$blYdyXq^p9t{u?z!c zkH^Q`4xS3*ZaBuS1YdV_g=dDbk(ws@R-y|$GmXn(rFlud;n_g5jGY&0TD9{1hMG!siRIzS+j3aC(p5Hxr%hxzEUgw&9@fdMN0*Uz!sM`sfFq2aHGISlL0}K5F)m z@g5TY2>LF=SoAzBNDKLRBgL~$kQMSRZv^y+LGyY-zJ4tC50RM^@_of}j|xf+`L4kT z^gJe<{*dnlqQ?aVLOve4@H`m-+i#S zXS?wSf@B1`pwB(e2`UKr&eaEcMNq$xk3SRd*&}Ft$TtA~?AdQDL6BGw^7TQC@f;9T z74q?*wC6h`8Gf)N zAzx3rQHr3)LOwpU?nxE&c*s}P94KIphZj5%^0h)__k_&h_}UcmRj|kE3g_@*QA(8G@b-`5L7GIZ|$W$j6_T@MH=F`G}ddo2zJ;~vZy-XCCC&8UkK-k%tXjFG)Tp1_A@3_ytRo?K7Ti(0*> zXq>=Lxfp8R{YGbqSL3she!$oZshYaHJHW>Rbd|%x2ZhVfk~uW{p@59aI$B^YoZsU; zV%$t274SvxQG*ZAYwBcOfG!a2I6?FNVSEk2R&cWB{ZlHm-Ln4{ z5U&MtFyJh&W%9Xn^%DemZPRUcIi^~#M}V%@Al`Vr0t|J4=1CA>Y9Sk5nCgAkY=c1_ z-hkS?dtG`P)!%2*7-1Wk-u)(x75*0f<2_)qiQyKAHr`L%^hWHtPhHxB`O=(;m2 zXKCKg-1LJOlinjP?F<0@xp^8@hTlRE@*Z{5D_HhRx84DmKfTA?bZOmjlU54XVds2p z#*027(BHW9UUv3(E`KA0B=7gGoExa;4??@$-V+Uq2IIhws4&}m#^kf=Y5_XK`-fOS z3(nTO=ft$BTKeOy&`SwTZw8aiQ+x@{NMibdXxwX~lrvHrJurk4r?rQp zr5}N}rY2T=LjkKX+!ANpF9I?!{u5{34%)H@Lg&O;Ea|b2)B{~fI!QAgL;y*g{TP_M z7Dv3yC>{uxMi^T9x&+jgRMs3x_M$A5=}k7x<_+bfKBRTc_%$1#FNKvQ_+OJ10F9JA35Y{74gaJO`6X+2=@)OePe9Fe>>X8T0S9J~(G=YWKaB_(;vs{by zjA27FI z!F53LZ9?*dP4ewR{sdDb-}Mw^rEf??N19h31#OQ znDIb(W0bx72bK*rMdMN;6%ZjKFvU3yP23Tfl119Gs}N06>V3rN&)$G8N~u2ua*{-T zN)G8%n`e$w8j$v9O_(-bOKC_toHc&J94)0$Q_zvDsS~DYDUIo_+4d!vc2ip154wSt zo{Vaek{`Z+h#_FAkzeJKQaQtSVn72l1I)EpUWVztx;q%AF-KcShM+9azEm}bB)Qk!lA ziILSEbhA%ETXr0#uhixmMz_cQcPZ!=Ssdy1g5IE8b_Jbk^T=&#D?XU)xA}9WsjZiR z4%=fOKef$cpd)?9rgY~WG%H^JvTontChJ=YmvfnJTCPgC0vJUt6_4{YLB zTgw1USs+G~54QKj3CL74xUjPgS~MGq&@7@I4I$b|+&KRMo)^f&8h^i#hY;EC$>$ej z;((>)Y6*%m*|Z6JgvR{u?1s#K581SDt!&ns7!}bg#zVW;;$fvRo=Gtt_D3xq)*R#E zGvdb6lM6iaie}y$t%juYS z24FG*iJmsL2Qr-IIY@E3fYox|$I8az%s}tpctBtSIxao!sBs_IRAUT_v@eWHSzayb z5AY?ACE;vBDym95W^g>3s&O8`abfeR-{CrGUl|M*0hNj6RNB{4rY^Pu(-O^pQZCmD zX?09j?zXxB$)+p!;cfsarYrXfD4v!oY<_hSMWvaP8&>7T07}Y4w4CfTuNlUe3j6Vq z7BZ=Om}el;!jkUBj$C9)tf;F6_9H%Jr^TDyk%o0mTBhg)jg4$1q~)4(kfHXpfrzG3 zi>B(e0%#@~x)L?>L`~b3&PTOHx}^p9vu##dp~=UvRo6n4>*xvz_8hLIbrM=vpEXBD zXK9_G1x8?~sI*e^B+Cryj;!9%ig{=-txvSjs(}D~g$oM@R(cNqQn9H8c-}BR?P9Y# znx|ewPo|BC3Q=fR+9gt%uI9rn(nbm}l^@1RyHr4&mVPnDa;~cT90b_kA-t#z`mAOz zHbF;7TlO93dsUxf!ehUTE>bz9y;-v+PS#Wd(h2t4&_p#RooE-JPgN7rN%mKm3sf`G zb?mR;P^vloFOPuC^evuL6(E0Y{;WG%#K>b|cDJ_30hy?>B>{R+Ci3 z8#@vHWHoa&ZPgfb9+NG1U6>70%I9dtPndtKRzEdL3C?SBtJ za*-=4ZZPQXq%C_AmFhv-W4}}cx+iI@MaNU|vUVt&UTMRttO0M-$Qk6yISN;_2D@_F z!gH-5uAJpz&_hLzeIxwe8b%dTHRC6n-kEX{bXCBCkpI9U&e(f?7q3C@jSNPV?6r9LtNNzT?*lzL|iN}Y!_jp4l7 zhf>F3KDV5O9xejI^h0l%&%fes+OT@DEZAepMKaWl=G<6FKSY82^nvW=9 zB?$1SF?|6N_4Tk!l9sd<9%Uuz6dK4UZCz%>VTMrk;a=7lnKR%vbpXl*=;}*2l{Hp? zp>Bprtjh(MT2hyWKogBuDJ>Bi_^rvtRg~5ht+uX;N_(54r^#l5rIOhb(*<}`J9x2;e4z&QY!wW3g)8Y;d@YSAR0+7BOO_x(DIJS|y_A1$!6I(yUvJ?$C3A+m|H8 zQLsARj&2(a+<;qnSfV9;fw5-YZtzL-w5j>nBr&b62A`)^RajhF&l(SaK~q6`?6#-@ zxj$fSj~Xy(5Wo&&5x7!=V<(T-tmh=hug>&B&hrAo>V1SUYp21wBfc$&Le>k?X=_Ye zU0~Gumen{m*S4Z>9OgV(3-^blY=28`;@I!NRsH!Sak&R$`CD;jwz6hUn5Fq!vwgPB z_jLH%aO(8fCo@48P_%vxD$m|0LFF*{#rS z|72IMTl<2Ri^n9KFTe^=_y4^O4B_NJdCfUGnB%oB3K&iYc$n#&rk^>NW^lY}1yrSN ze_pgr0qt?7BY=CIVHfeDEvp~GvNH_pfg~;cUT9(Yzv>6kc3VtB{;%0)44p42&u{B| z=vr}m!XGaSK1~UmM;3foG4NsMe1E#WfqdsU-ZJ!)l%PIq2@nxrsU{HTcZAEMCDZ43 zpn&uvDmx36!v22x?-atvs{Q@-FVN4LDra9^BsJSXxQ~B;(DA`5C(PIU10{rbw7}g^ z(BmJXw+zPw42=qyi^%F9<_d6Czu1-FdV4n%5G|6lKsf?ml7Ep=Ng=Nx5c#XbJvB8M zo$FsLz*3)Lr1`HiroeKjnJ>#s^0zS8qEN7s8s^I?CEAWwCfk8k!Ae*|_s=%BQFsMn zrhl$%{Gs(NQ>gqY^K)i>Qx93EP3Z;Y)4g6}r{AFCW>?Es&%;OMB8sO!U0z{EY+48G@F@Iqh4~M-JrBM^-_C$GNmVePmpF z`bafGU81A4L))BNV3s=0J#f)vryk~-6z3H>vvaU6f`an}N-5_XxQ@@6-WKXQrLa%H z;Y-MZPAVjX96zFU*jWO%uj^bj5W~lL4Ekg^O&~eq9D^pAj)I>$&Rs=VyE}aGWVRER zg{jIpg3tO+9~dmh@u6`IoZC=)L+9R7O>5-LgoMTpe^@%#xg!^s_|6v8($wh#Yd3TL zR*1a@hd;a8+zDVbv~ZR}tCr5+8^dRvEof;gCl&g%cIr37wt&+GZ7Fb?!DHGwAD~6; z91}IRcP>M#3!O8N*}>TX7w_owh2=XrN1;h)rzJ*b7pE`go373`(7&5=q$6$>pqYFz zYj)tXKOw~a9la4avK}3Sy;0N?_?)z5+oX?@_Si|JzaX7t^Wm$&m!wneFzI8Y{kB8; zIO(v>2eSfSk&bAAt(eiW13CI72m$I(_CX_|wcz-x#%h74dLA4WyQkylX@O=s3whK- zaE?HpfF#8$_&{@=fh<+Uqbma~WV(*P$LLmpOVF8~Kx=(DYd8T93A7bjQ+HBMp?*Jv za^sI80=?1cQv((H1BkFH6^Ee9Q{=a zRr}zyfw=-~RRuo|%oE^IpW6WQ1th4+@RPvRqIQz%gbof|BOp~Jp)UdpM6_RB-2`Bv zfPlJ}ZM#-LFgSUR7FZ-Yhk}#G0aQtdX`+5aAPOuNt`6!pba~)90Ug!1Y|ixpI;pW} zZD5Ij&cX4sDz(5;2}E6jvu2Ld0?P#S3|68?mJ8iGI1}^=p$Dkm7z=?Lr1&tEi?|TD zQNYFOYxsEJZvuv^K79dJ3K*fdAP?Lm;1b0ZdEjONBZFL$2W}B?shSJN4XhF{O7Rr~ zfm;P!rZ!?S3#=9}TJ>iGZWAy@RSgBWT|l|Yqn+*$Fjl1^-URLxaJlkeiUjlBLmN6HxbD$X<%WT;+3XbEJfF?6;a6D&R%jR2w zf)hx)Qz|?-$brxwgD-gH*Et*ri5)>tZ4D=T#@>m+9h^oN{MP;o77R|Oub;8s>H>NO z>FO*lM1nI({}EyL1!s}g^hgoLb+D4a(j!hbz--2Ej~+>Z$%Av5ld4A^L9hzWBfvi7 z1}xoz^IJj%>_gsS16)mjt;baupTTPg3iSxz)*D=q1W=|&N+@6f{PD9^dvp9t_0w^_W-8qk>@e&g4YvN=#lR+7K2N-161mf`RM@52xjXM`bKaC z!5nOhVh{#zAegI1_<%z2Mv9)NM;GdIdW3JV46bZgq-j-pWER1r+(X}^M|gc0 zd}E|AzClo6M4qSUJp_edgQEoBBIs;H7SSMY6BHSdYMS>QRfy+FjL4A=0Pis*>^362 z-4uME?b%~QmiYlbU<7){hy>Y<9}?^}BID>N9}(;`B99IL*hg^Ch-lPcKfz%mat=Wy zc!1!j5xIk%b&%FMZbW9(1^AR#OJ5n0pSuBk#+*1a(wiC_A+XKJ!-%=T&k5qqNGo>9 zQ38({8G-Q;{DQ!1MjmGqz9dL6BTg7VB6yM+X@e0O{F*tbW@H!3d`pmKMuuTj2frgw zW~3j%_XIvOvY5L4K;Snc8wq|S2$+$hh;hLa1VJ<6$B+rijl!_$OW_Df*3*kHVVJ%_ zWk6vWuSKSBBc{V(x}ff+?{_+5hM*p%ulW!lN52o{dYZnG2;9Le$tyK|sWwoy*;Cr1obm9A#l(KdLx1*1zywnc(NMFNdLOTW=*{W?+Lsiz*0-G{0r=nxdh8AJ{z1A zIHG&-t$s$g20o7#dbSkcXtdBhg#cd&@MuZ5UIg@|R1^rnO-BWe>n~D36#`D+Yn^_o zDPAfBzSS8`Ji&@95vqR>t|VFE1y1U6C7>KudRn$Y{i-RX1b&gpCMAlG;cAXk0PrZ$l)vk|ZoZv=R)`=C}boBIj= zB~oH*XE0o2U!bMI8wqYJT179t6491G8-wp0iMFDx!M0YaMF8Ggh`=?dc{de>6b7(juE0z7I9C;Tgo z&8R0youj)=70^IcW26VJ63|(#rk_p|FjW1UDohuBrmAKXT_K=SB|z=KOi=(A(XXO9 z9u<+kO3~8zx`=8$aFcOqqnLuXL=`-V@f27st+G^WTHrPTsp=S(n1R~`MAR&dl)xPV za#cC)cBg;>wS|3pkMvxTTFf$Q1@uy@5Pbso%EoJ%`a1`}LsF)nnu}-}cucx}gwhdx z0`BpSQNcOmW@!QUbjM}tC`Nw3J=`%`RnccR8^_VKaKHZnp7U-yy zJE-G{7N9SL^SJK&nU3(Kpl@|w4(8;*F)8<>?hDguU&(o+Q#$;03BU zehBQA%~$4xR*?2+>4z}o#D#9oM%cFRMlXd{F{*1ecf>-slGg2yF|&qNbJNeTPoY;r zw>^n;)8-ah=yvkpE>vgOVrb}CT?__$14diuIDJ>M*TN2=ugGNB+u_?GnS@N656FkU zk-|2Y*&&&a;%uGiG96(vr4Y2tM)6rQrq9wsG8uVnu9rhH7kTY(Sl3UKlVEe@8Iox! z(S9%w^hxTFWd8`C51k@UvVD^Lr%9*SZ&J?Bq*Lv$sM{~3)9evg+=tGPRyNo6p|hlY zHkbCHf0FjwT-k?yB^|JBOmm@X(m{JrE6~4@4%x4wXF~s?4!G%w^?K+}F8I>3xLgnY zn{;*-R_md2BpY$D9@1p7o~NEjMp0crYq=x{nKB&~s=+xFEue#1g?Mj?3n);QXrvPkHG(pEkLjCmX$;WHR z&_zPK*N~whwXPvUL!;M_8JNUE!}J?aBnjh$&XvqPy1PL{r?0ezy}4`-mFot2Tw-?U za$T1CssqM#Xo6gIT544@fGeVxphvm_OcW52z!#b#Q*y3KB-@n&@|3}0bCoEQFR?B( zUFP%xRnY-C3uG29RLv0QLksoe=;$Ifg@(UYK$-fiDZnBD1645sM5s!@2=#0yfW-pJ z)oqvnL)S|^lhn2J$|VA(s^0McO9fP@dVK+w38+-tslnr-=sd;OJBOYSut5Dt@T4@Z zN|nX@Hdzckp*~>Fc3E$1Qs2`g-YPuyK2IUMRey_Ap?*DNQ)2j!@CJb%w#i>PtqccLaQ^Mp4m^q@FYC zcgPIw6L3~FGXVC>(yZDy05eYLfa@W;uZ(JcEV3=#S4?>a#R?wXcU2hZkjO~D2DUgj z#ERp=5gDMVx?tqfD7;LJ;y|Z9xD*L}p;sc!^~+;XzvNmXbUeCyxzPgnMtaMm8fF80 zr!($jHS!VESs7|=6gGzht}jCc?h;0pl%aM8$AU-wllEyZAj$R8E;1vhs$2Ubr<+WA zep$1Hy30x@thlrb^)wjw-6dtHSZ1dR^&lz@mB_?ZsoK&GE{C{0sX_G|5(w#?xgWEwb11TEmQZZ30G;Mal)e| zuZIoifLm;srG>^K)T|7RHf}~*-Pu}byx2mk_b`?xdbril!)9;B4&7h9*vxqzEy{DAf$KDP2KDET>Os&Ksy}m*zA^gJ0I1rEt?%H0L-Ld9P~D7<}#4oHK}g zuW3$yX!5$|JUdX+-oSkZFD|ZeQ~(Bl6Tb(9a&KwQI5_0n*kwkG-q9Q{s()8=rlH5) z)0{pS`tNJb2GqS5%ZZs7$l+~=(D}v^R>!W_qqY7|jbG*$O(();*w)GCkj(3X_DtAYEYJLG_Q3 zF0@Nv{qS+po$ZZvKz~KL$mS1{g})))%l;PL9R7}UnSD}${(*EqJHod7M0%k8LNm}O zNDsB&gr&o$sM`qpZ>;w;(?{7M1ded^UeM+Cdh})Zx358uxA$T^gnv(j-%qmnLYnX& zN~1T0YR!$@IUpMabym5)vi#|v1Z zme4X@y$U%i)MB`2I9cb_<4QG>_DI#A1z4q?P6hDk)BrCdr$zh%)+oMA@L>)~ely#U+Q+%5ol`YQlC)pr8{n(JQx>{35;256-xK;PZU!(M5vw*lCrw)6!k z)p@w?9aRV8D%@Wmj-0*f%_4w{^u+-C)CPLQK>Z1N2%xvZZ?B-BA-S;rFlqApf9*t_r|gkdFhV)zRagbxcMB> zu}ZIG7X71E7AuYAFJnGk#?9w$1O%=}f>?}R;^xpw$l1vpRzNSQC6h_WK7iB&`pkc1 z$pI?lpN$o#EBz0i0J0M3U4NAy6V!oB^g5S`{Sa%?XlBs|Yh}I4eEE>ZN9{JBoOIAy zoFa+G?PA7#82NI7jm}$(F)CvZv$?3DJJ-qK9Y^P zGm;R??Vj0~gl9>4`vmDZywcL`5eTMr=Tm8qeL2EI-9_X{u;0K0UiW(5%1n&>8v^Re z<#Qr7eSHAS$&`dM;8ripBI$J-vI_3%r@Kd)wDe(!e4dOu`!M4XWMtgMJGq)1{mEEE z+u|@y6GV`VyIDBSlX34H@?O~hN%t*6zGk-{0{VW^me%M`@Om=txf@K4pBsvdwR^F; zXgrZ39vFsH9N9)&G9ILuxYUeCUaJweo`s^~{z2NKHTpXOUTVg}-vYVf*73lTEAG*C zYGyxJKM2PNtf{-)qa* zOfeZ9J0ODV8P9OL-M$jjLdI5>)a;gQ*mhbc+g^mQm9c|#1Dn4wlJOkrT>Cm)Vr4u} zI?p} zt)8IezC)7TlXZW{2Bq4!(qJF4PyKcpCGR60u`i_??Po(9*q6~@2T14HU9eit_?V3= zu$y4*lW~yr(5!)M^dZufSp#W|PpI1Mc5`;lr!2eAK1cq;qz~ICF}5;3BYoU%Sr7CP z(m&d}(6Ef7%Te}BWReZ~OP)bLV???o100h^nvr)}0UVcBni2jUPR3W#Of&Kzq-1E5I*J3_h-={UO{>As|GyAkPrq~oEJd!Ts#1 z-9TSMo>BIlta}0Ja(hKX&5oY8gcEddcqs+)%aKy;H1m(y<7epSUF~*ybxAFlVBA8@Go@PDkdCYLC8Tqw0 zz?QYpZG{%U7b0NPazl+Fp4toq+0b%Oh0<& zqkOW|S&BHIIegW;?%az{!}+9$SJp3}G1&5*g)p=xbK6$5R_?H8?x1+h{t#}H`5d1W zvh2^`yP40Ej?1c?K2giuN!qqsV*F>mKsw(31=?l4#MXN3W*BFgyGVQOTtDcSNhjEU z!;s6AE4(B-3AJSI=8(f>8ZKos-yu)fZqy(2d!*~yrx2bp-zS}JZ-DBVdr4>5L!oTu z2W)A?UWjO#xsPkKFWcSi?H1_v%MUE_#dZ(! z|4f->c5^svrfhNdvmc6pKErV_(B?bcGi8f=sGY&SldbGw_GUVWY-L|;uYu!c{+o3T zSN!e5Os{OtjZp2{03^t^-FWpWdn{3Q%qFQPF#~1Rk({aOC4v(Ioxx0ynI@o8 z{X77`-CCZfHe+>@=@$X>RiHOOK)}`N=lTFa0oSN|F%e~k1T0XSFpx9DI^D2J6%_*% zNX{xPc@gw|4e8O5lRgg>X9qi{7r_M|&Bc~Y7g|8G_gJ92lD6!JF_MGbNPFz(pj%La zd#ZgF10&d-76{uP!%D#(v}!~%UPM;~d$OAJ@{3^SVDWuLkl6?mbFhqFip>Yav|w-2 z9{XBYFW854sy&x7`;!ja2QlLXFCv|7ckqE8Kswjv=5lZl>3o}a%Ys8m7uvjy792*p z$Q|1oi)tDgmJh3xP=rO)n}|liLDH?glpKf|EM>~nM#Qt=5CKEwrf_hW?3R}+InQy4 zY`~6Ja-L(PfT`+_4k&Y})KjS*YzZ(*z&y1Fss~5QX7>V>hoKQ1BcMvj8IW=TOVsf^ z90KRe9GG^%a7o-1qAKRD}-Fu#o(PC6a_nx1E>l*Hv zIFFK_!ki;R$EzHcxkfxANlj!m*NU)IbplbrSR}pdS06B^NCgD2%yGlkruIh%`gCs+a)w*TfPtL1Gxvu@+{w&FpztathwbYWi##; z&V0*vgvS26Na<|(+M-j92X$UT7FoV0G3bo-qE#=;_vS#LCj^yPKAu`KHtIaKRA%|s z!R*Eson2pH`3AvdjHjiBC6@0CqOERVvV4u%(q{$TYWYUlK-&bZwtPJ3Y;4!*e79S^ z_6R}7^J2O+mTxERy;JmDYx&-1YhRGO2Q1%Ma=s{e>nz{a7C^g2&qpnv9tZS>pvNrV z!*t8H1U+H-TGG((3)*P;I?=`V3)*D)8n71+ie_6Z-y}G`@u}oJWBE2xm(Qj4?UwHc zdf!n&J1rkKJ&Z2|?XrCGBe=&zv)z_&B%S=YpgorFN?QIaLGM_;IfwwpZ{n(ZEnjQ) z(eG0GKFimXgCHn3Gxl4)VVHM}dd4Gg@Pj-T$|3Ewc<-RzI=GDPOe`(MxV;-5t~om5 zsqPeGb}}6Pa+B#aLPeId7p3EzxS<%HPF#219Jm4D#N#{(EkaJA2B-7S%3hP z>Nq#yGucTg#AtMm!_2A9N2n^z*$Mf|xfb!!=Nv`v`JMgf68sVh((5@n@Y?!L zIp(w+$BR-8oUOgMwO>ETt^KPp4jMbvD4Xk?@^EYaTIkl)spCc5cbej}m9rZz)Y=&i zx{Y%k21J2VgtBcN{svq-=T1my?@UMc6*`R|zk|~QpSv_?ESiCh`G;UWY|MXvO0h9N z8hO~5Uy7pGnEw-r*qDD92pjV+;|m+}{3$nV%>Rk6y_!?qMAJUdoP-9N_Mzrnjp83^ zPF7P~A|g0K)%}{&73hHG@WS|G&B;gjJ*YWnyW$0Wn&ZLOIov7nH>7^u^gCfO#bc9B zcbQ5w)g8s09s(@28^P7-DZnEq|D9d}lH{g zr5=pRJB8|;hobTxMnrHPj>_X%LuZ|URP{HAa~=`kS2w_qob>|2>TOul`G2==VvTWK6OfNfJ#1_NxDGTYTLj67$DfE{W%T+n$=z;o(tc#`wHfag_P0{4#d zPF2tiz`f)Af;tRGcU}~>7uD6Y`>O(8QUMHMXSaY|Y9+#m^SaJQ7GGA)ivZrx`Hgpy z9%-s8B7}29D%aEi6X0`+*p}iic{*Q94vq^prZvCODJL)pk;mhl(5C-mzAdTPkm=URL!%6PPMG8G?mp8;5WCZ;=@1A z?>e9U@hJWRl=Cm~iX_zmvD!H&Y{@D}oiN29GN!0)7`u)xAXNqEdGn-h;jll$K_2Y^LhIiF9V4!CU&f z3|}2Y9LF!{9m98!c|kc4bc8V91A;Y z_^zbovkk-%?OVflA0{NHvB>=1@D-uQofcBxkA`m`8_-guR0At?pE(BQQ`&bsoKhn)_Rx5V@rY;8wDOHE%qqNUSW&@$84iJEma=sqh<-vM^E zdvAZG>8pqb>M5KznZ6tA0QC}tO~+(<>^tZ=@npPzrxYX9d|K!xQ%S46H_f7G&S2KLnuocAM<`b-w9F zQ^ydhvLBE$uBmDl%#!_}&WCaR>Y3&M59!!#)gtOGd}cqakK&gqvhlf2Km+wpf=Bc@ z$jMb7Vb;xFuipcZr%D?G{6l{hAYV(bQ-txE;^R9h+}Bq4&%Zb(MQF?BqbDf=w$%g8 zscfJG_K#%WuJ?cx#h>rYzC&LG1^{?T_MHMO)qfzsT>?Dn6q~U|K$4vP$-Y}asvK_2 z{<{Fb9Qet;M?hF>dOu|1O9Z8Z=ebG$1Tuy*%;BXCXJh{c|K$u&}}|M=lO`M zZOgvf0KK2-dG_O^50Gwdb7kuJm~;!fvH|E%NVl|kywf8aCi!-KIH~9Gt4MEc2hnq$ zBjmxpGlIHDHc#5hCW+@L)7!}=iRTN_?Pc@F^Cjs*`?D1A%Z5n@dkk9XkqwiM_7OxF zkDL$eWM?Aucw}Rwv;9&&XxR+uV*eQjS~f$v+K*z*>Zv{inML++mi-sy_maoXJ?BUl zs~^Hh*CaZYD0z#TE}&HP9*Uee0cC2zAOQEUU2k<&7XYv1^pR)oJnp_nU-cLq%F{+3 z?dhj@m(^1sV3fLpV}x*=_jYOW@`zzb`ev}e~r5-t2^TAy`hgn*i zo3g;LNG%r;6a+L7{eMam#OAEJy(B(%RKS{1w+wUVb;rU(>*lH!2i0CBl;6B%>DT1OVV)@|&0eywv_5~LnumHaEfzrJ=yjcUiJ+A~OWb@?i)ONl7@HB0@9 z%;HphP@k)#wYvHsp%~7f-2vie$q@?|*GJl8NP8%j2JH~o|3f=4Xq}e?pwAyM?fgj6 z*XqM!hWmrs1rR)3ea?}u4PZz10c(x*Y3V2oMcpS?Cdi8RUL^#TN$>f@{|BLHZ}E?S zaO!>Nh;##te@zeR;)Ueu8%z9O?x<;{uc1kLq^3#{v34h`6pxHZNSFy>{iI4qE)lzv zjSdgZUB~V}1W9^B@VTn!YrlYui$q34kpahSe|OYp-C9yE#)w&uq}xzTMAD0EM3#<2 zh}GLkg%nGl(btYdA=eu1#2U|_Y?;K4b`lXz01vpX6<7-;IH%AC?HO(O=T>|ZE6zYt zdt?r53_@zBtJl=to`LLqkzFiu8c96XFz`6bk+F*m&0E-tWn>rlIt*0^@ zM7jAWJV+tydGtDehE<5}WM&FSf+xF1Ug-{or}CP4ZyOYMkT9d{?chcxzKOg!`6V*ULwJn##Y%)z$d#y&bX`Nol;2J{*P#C(L zH}n&KW$6CnQATfw2_fcIFV$4qFo|x}9P_SQX~QJC759DzOzVYGxk==`jrc80gL;#s z*MMIGF5u3V-ZY7~DO`KDOR90X-Z00LqMYjhdqdiPd!5(XSi~g;Csrt=$qc_&aL)+Rm3j`FW6p)R$q|ub>>pbET%gE&(kKKPU3f*M%rhvmpON9qs z!o(5Z0JY?l>ej|z!;{*k88^midl=b$V;NE#H()x}2kQm3$x2~7I{iVE#Hi=1{qR?u zjgL7<-s&bB^O4pIY0HuJW;AV%M=RcmG=|h;l2$9Ej{F`uzeG8&(X^2sRBfW?+`y|1 z!X}vvu|eEmS_`p*a-%85JwUMX*1|rJm0#KiY3q>Y?jz6z+(UcOeFXYaX%mEO-H5)d z1k%B+ukAi2HckzBd-7MXL)liWQ^3hQ6P;gneTv}wQKBBOJF8eCsT=Ts$)(7TGdaXY z6IT@h+h!@sFCZ3Ai#NIE6PmA>}*aWU4nh4t@XE!%*B08Zw;2kd&pds6a8-~k6aBL97h3WgB72Fz^?yw~Ez z*brigTOU~Tm>I<4As<@wkVlAR?*GW*6#NzO6Bu3kKI>)FR}bAd;HAF6`>i*C#}aD+ z-~-mXzz-5X)&%&V^%3wF#1qhL{S%9?*s6!?k^yyzKeY}azZ>xaWax*j&w&>KyMg~m z+}E(csB|=9E&ex;1>=mmU^L@6u3lon$$1yxp~VA%t+-dgZ`?X`=*aH1;KdRnnxW@x zi0Y&dG3H6nyB9rIYn_aR7Tw!esOj*tp^$M2nA3%MAg+zHVvdwbq!mb7?0Sj5cO7yl zdQ>gZ1C0xWiiDNmyA6C5wWR(%D)q+ylsbqVxDnhPp9S$22zu(AJUU$EGYvUPP`5Um z+YYaTu<@^76n7AE3P&OBTbQVD5{Lv&p~JZ(*#|;=a7f%avT;e0hg=!2-N`1y`XGoh z{OiNx8llm`c5#etib&&rz#lPbGvj)Ztr%&Gm^-Rm$1Ok**CKhqA6#s$iaP}S1ado8 zAoJ^JYhWTo750SNm|>LrA{ffSt-l<%HYWEa%9W7Lh_DICu_*B+GMM(7n`S29mrsgM zAd!pt&m}PyCfJFhG;04%at4zfDzM9wP%WdK4}M6k=0sQpSc_XnbJ|GGV7;AWXCvFJ zJcIl)8$8 zHZFj_WPQV3EyaJ$N`xlF9G(>LTD+a_wRqwZhyO3)CvV$h_p}c`d6%N}JB%y+tGMkj z6aV_*Uthatd@R^}700;rA#6V25{|KN;utJW5icDI{B0b0>tbedgU9!A3?BV~-C*>i zNS*=g4(2!;RcplvPSRD=Q8?Cp{%G2DZkk@;PVnr!wUQL;yh;dwE@F&LQ2_|$9ZQfF zGlpC>nR8rY@J(-}Rx7BRWXBqc0D*?SJR#Q5B%2L=6pEImwH8iBsn^*snOE@`H5z`L zcwT?xr`Rl82gY_Ao@TS*yvyb`TuDt6fZc}Y+OR)d3m^2+Nhlm^IO>(OYuq$8ygriH z@H-@_cEejBhhDHDDu4~AN&m9pd=Fh|9A;0wWlh6RfLUMr-o#kLTS~*%LeVl=bGNh^ zRe2+^?CI>9k_UlZL$ne@{6_o{=d{)~Wi^LixrS&XhTx8&yQVL&xu#!5EYnFlo72fR z#4>%fw>f=yVeG-P@MO4NXmicqoLDZKJBa3efn7sZ+OMDm66>l!NUXcW-hBna4rASV zFiNc31LFK@;vn*4_J%#g-aoi$dfEBKL>!vJ5i6JdvY04{GKVE+pkAmI7a@tA)B3-d z87i66*Uiz(SS4`r#mHcC_Q0=u1my>$MQ#M1doMAI*T z-Ok@)uZ6~Pg<1t8Ju}JeF4t;Y{=*}sZ}&)!yLxOIP5abMV}G|p5#{bob(0^^w9ELu#3<)Qz-4^(BQVGFbYQm&+Qu_b z-9#*bt(|Q3Y$k3u5d7`qDf<)P==hVGlY_A?7#d#=4QiI@t-#C{c(S!(OeJFcUT&J+ zSu1XYBwA>+B-OTEA#!Mrg_3iD`_H!ALBLASpr-S?qc8_fD|aiClie^kNqnRocq*Se#!+=|l+oDU}O&l{2F?Adbt{6{Tafvla^XKZW^Q zPw*l^qqFL3$6pmQTY`6d5Zff+DwF$A30{tye*s^{dr=8qUJSR!b;sz}hoEFYa8nc? z<2u1z^KhRCkWNq;9UvQ!Hu!v6ch>nl(%6b$bPU7(uiKEdQxu}t=xevvD6~@)8iE?j zR-+)eUIj-baK~g2?~0tk#;tQ?!s_A5gin?pE(G_>-tA!G-)Q{nYagE$Yv{`&_x>8W zFN@q4fZc)ds+TLBBg8T=c6&K6;-P};53hL{Kso`t{_uv>GzQr9hr`~Hs8RNY+4+M} zF>S&C0l6|TCb(&}1H>Xpsy#3;D8(UeiwfYt7>cyN7#QtGaJ1vk!oR-u2b3tBfTTO2 zRN)K|+eq+tMGk_HTLs_Ei**A{_D>YlFG`4+Y?O$3Z+gsR7s>s}-%xhIJs21IKzVsA zpBZyaG$?^4x|mpo%-{r?=tf}IL_a45qDc(`cex zByq?*BuTYR)DbxxGtWi^&_uMvUzn)$mM&2Iv6?2*lKR@s6|p8hCQS^Zde;k{kS4Yx z7B6^GnmC47nz&J#cpI?W#HU2^Hek1jugg82nuY!dR1|9>9i2_Q(oL%!9+yf|?IyO1 zHu3JL05wA4@3m}{Sy>)x3$bDa>uC(v9sTAWDWW3THoVV=SQlsqNo;%VOD z^vxD1j*+hE|4vvwBkGDzBU7C74H9(MPeF8S4YsIrGLC4&*hif~z+p8#D{&HZD0~rV zzk&M_CXRRu=pwXz!~qaHNPG$6OAupMA^&2Oxcnqij9Vub)A9a=QfHxt>>}V3_AX}U zpt@pAw_0dE0wxMchmF^Yua1^!B5Bxp_>VHLBfkmC^ppG{+&vr2k3o9dsMta8fQ92p z>sW-3-e8XAU`sU*DIXz>528CWAQvwI!T5HYTcOA@Jl(ZHtC7K>pq0K4Q|s^6^v_VF z>1(TI#ro&n1a7eR%Z|D8`{K@1h{c`vO8?wOEbjb)xbqvpt~-Ayl79ep-TAu<-MKL; z66+wS`8C&_JGyDL-Fc`a{gpdUiVFBYap&Yk5WEU}a)zy&Hm)xpcU()K(ATuQvB#~w z+Ru3ZU%R$G^6A#^E`8cXU9m6yFZ z^WU3~RQtbWdY*(;JH}dFhwLqpz3V`j7pC#=T`vY|_NPG+|rg!g?7k{Kk>xUHw4=`|blv+a{l> zcwkCu@a1)NJyY8|{pOZ6-nw&B!P7~R4t*Xwc+r5j)?WI{^cIs&Tz5<5^l^{O^UvF} z#ACd%^7nHuuKHo>z;(Yq{M(B^&ztdjDtmf-$1?0D&*qPLO?bWywiFlG+hLvf_h6y% zKP6zn-k~QxllhMDgUAp&cGa$^z`*hMw!TM_dnX}v56EO57d%&sO%LKGcMmfS?iOV` ziQI`^1P(K-^8`pDPZDSor(iv1w$yoiBXM#PKJG`VHn9|bZPw9w!Xfc8Bx@53;IpQo z^Q48OB#vY9q-&ZX`3z54B=Yo-d}tGQVaaHkIu9h&VxF9eDouI1jfWvz-btUuA@M8+ zMl|6;0|{U7_OF~_bYHwM@c}L@iv5w+t)`|TZL6WWWzGN-sCRU;s%y^ym=V~QS*^XL*H_9n>-o;5|ymil3 zPUO%2nS*uSNJ+ez^-j7Dt1k1mCm9)+I`#4<8! z$g-|TILU2(S1!BO6)}~URA!dkH=G+Z_BA+%L{q+OfD~nLX07#F4mMGnSl$m$P?qbQ7NgvwTY}qXa3cIK z?s~n@?~Qd%cl2zY{W^;waIn}bsIuTyDGje{C}nRzbjwU)AWYPzC<%QBY9XT zO-~KMXhF?P?wHsqv9}NM8)%7%U6GF^ZIncmi}UG;iDco!J$9WM{=!5=y|x+)dQwmj z#^o1rLO^d^m+XmglAjc@c~RI*KF^A)v>Gwe=!_bT1V*Ce z&{Wo$Y1OiilMDNRLBr3XiDG0z)!DR&+unLsObd}#KWbi4I49)F63{>lgBlvvl#ujB zHO&wKjnAutyQsCQMad@TAs%v~;n@StT0jH#C}Fk;$&0J$S8Rhu^W)Cvw}|FT54LQf zcdHwd;Fiy?NkSnvsZ~uiuDkn9yMYYlH#Tn-FYPmJEZ=tvH zrRmBp3g6X3{0;rl3IhlaWfg#k!0;V!xK4-Pw?eZ!-FO||V-dc!M;J@nnyN*)3xsqz zZwrd*dR}D;>?Tz}L{V)K7YOL?)_F&dx~#TGv<>hCit8C|A0edlN{AXh4e_=(rYs#F zua}Q`5X+U;R42x|pu)2Ay+hXC(ULGBHSUucHPeX1OW+fI6JZa9;L-0q8}+oA)IyLH-Xv6LC{=t%{=(LSTYQWHZYD299pX|WDTQcgY{t{YQ{ES9Am~6 zOl_^1H-a@$;w6bFfnyV{v6ywKTYJ>tqud5E*t-+YSJ)UuD1A~*58=bQxT)@{ z9!z&vrK&oeAfiHKR1rm-(BQyv!U1tWK}AIbMMcFKXK_T1dQimS_Fm z@tK?hDz9-H!D6oqb`m|#mS9VPE&f+7)-rNUxO>vod$v{YsZ=s=Wb7;mawR^9lUQe8 z?bToFoh?C$u`bw7Y;m@Pi)*`&i=kB`t2B3C(sjWO7C19DE!bmpS*dCIkRg~90t3ku z<-<;ayb@}<1O`UlM)=!m>zx6j^Ugi!L!QZjVDa3VN{>_-mMn<8aPP!Heq)21Tve`% zZzC8fYM9_M6-godZM8{ZES400Q9KV- z^0yu2x6_;h!P}ezzErN71iJXP6O70b?qf^@$XC3qrMOyqJ)-K@&PnC-i zq0<~eGGWt#GOM?8MGCYHb2^Hf;Gx>uME?eNJdO|I^Y{J~Uw&;?z1|AW!66n*#flNT zkazl!T|)nIL?xm0!-ODfA8t6vZ}d7n7>B9$CRo7Lu9x8du@+ZlM7t7JH{ugXUMeMcv3M~{hXBz zv;O&_!kKfx7fuKx&NwQ7s1adE>l#s zY;s?H2qfE)+U-5|wWhlrZdTg}=UORh*zg@{xVNY3x{J2{dL_PaU?)F;PefE;3*>-@ zhza_LxN_{{SPxgC!M^Sw8l5e1fwLt-d{7y)NJf+h_U@~+l9{kz9?`VW;P~wxGvRFL zBtJGnc`uNcsv}e%?%9hE^8?sLGo!<+1A|t{wckB+ZwM7dKx~+JTcuqalv!F z^FX}KzNU#=oh@O9QLCaEY;11=v)_h_>kiub>*r`09Dd1PxmH5_S=Qbg$+pgNAb$aO zQg-riHQ$T;2N8 zm>%G8-9cX<&dryJbHgo_i+5SQ``c}1@^_nyzqw}4VgQQ!!C43W%?KYRe>dWW$=~kW zDiK%j|I2aF`(cXQ4^!lRn5Me_q?-Frs=5E9n)^?h>i&mo(hpN4ewZTh!{p=V{M=zR zbAGjw&X2mPbbd8EnmU*wp~Dmj9i}Pn|I4A#`(cXQ4^!lRnEd@q@rC{{oq6wQ`}E5Z zKO$4y2P4yOb?e)0O+{CI%vxG$*@*xK+-ldu`2QVzU}?|K$1Ed)&hHVE>r(40cYC{< zNdJy7W?HiLo^X&~xZXw%2$x*gTRiy3^SMwau#4(*qm}s$_zG>ha+q zL^4Ea?w#+lhfSG5K`J_D=OAc(J)Ar*q#_}AQww-IG zWAfg}v`tsac|DbSI081u;e)&qpS7=P;y!0fxIiny5etRs$2~-Yecev1bhd;GX?ykd zN>R;(>nwa+^WZm^tZ4I~pEdZfc*wKxL3BiyeceU$I9tL+w~JtuyssMdF4)-Rqpr;S zj2ZGnb>{azn7HFie(;H_j>U6u)6*9@U6gUR(9rI{7W;p{5PZGpon~b{B8O z#wkMDM%-dwD+LXcEm$Eg`gmNstKQb*Z>w#P)jNBmclI8v-q{9HUq@WjG9KDP!@u2F-7`n2B!q zQn{M&jSZ7z3qV4N3+?L;;$r)nB3%4Ch+FXCeSlrF@c(~WA-rcDK5S0p2K&D9Aj$EQ z_T+`KCtojn@)mrMUi`0I3=&pE*1q!o$`$D#bY&&iDmNm-lDoY!P|t*ahFTpUTnNzt z;t04Oiw_b&Tx?&{gbS>aQdUPjKJZAKZeO<(99LjVTx?$}mCXdO39(Q}`ep@?u7Fk@ zBx6y*COSE}(W#OvjtfjRq9m9=EP@CPWB6v*(fEG?KJZ8|0cf7YN@q*B+bb!a4y&2? zxFX{>20A^!q0CCNp`S(gFjpi)WUfdz7_B-;#*zb@Xu6p?h#5qr{4aC1_+Pn>z&8vI z1UGg+)xueVsz#98*$CXWl8E&kiZ#=-2P zs0r37iki6CzFJSb#M$D%T{H2YNpnSAO(cujmx^;^`M4ZLtAY2g!^ihTrjXS@GI_Ko zU1HM2n5;=x(rJ9FxsU^zxi^8bC0y;K30LANf;paC;{U7LdU&@Fw^|>tGz}C|Mnx2h zh7qSK?U5eXDUe>mX{(AxdY%^CuotLYk>Td~u#Abiyc+=#bgj+eJlHTuB!yt4A1WK0J?v z6OrOv=WGdgdu1epjZJQ@3;8s;k&IrM9_Qv$Ry)e^{-yY^sLANqot8c6qD>KO2(`Vg zk^{IzhjiW;X?U?A-3^>+!g;I&b2O}27$^vWO+iC?qq8O4?UjO9ZG*hsgZqHezdAM^)em3>VSYn&}{rn4nBI9uWzXG;{FEwSI(5|=t#;tFR=+~{nH zo186izq2L2Rf{L>U0E*w zZbjYPal`$hQS0ABV88>5^ z7My($u@4*MTBX~19C~tIWstj5iV8x7L?7)@@zcDf>>0shFHdyE8o33;7X>car zKAlfCQAXq3@TGFi#5W{~V5$6nV9ZEEy)@18S7~iFd(&#Z*?V_4tJ8{OFRwKYHV5-7 z$4y>7Bo}VgyudkE+`Ye3Wxqo_PCP+e88dr#Zg26r$NpF2p?;ZHheKs~^SI2nh*^;> zj28z9UKDzG9qnM#H^2JyUMPFtF&>VYY2>}f;={E1eB-OB-5&zKj*q{O_IvT!htDPW z9Kgq4-@%vf;p6p--kz$#d+_1gbM8}q>BjzWDLyyj!#3=%^YCRVd%F92`~U0Pl@`Y~ zUjLK&K5!`e$-oT!ulw7)!-6_o2m+tFhK3dRODB6ax2D6MTxO)4+wG0X&eo>nic)s> zivIlQXnt%(wm7^uS1hfV7|D#SD9ST_&l~Q=T=2gSYIv-FWIX%thLkU@$d|%wuCT)2 zH*nU4qkXyTg@gV5%QMB%d%cH<@r|}aj8fl=%9t;gio?FqVR^$V9KzwT0mkWX%JuJcCQJ2LITA=NS19I3 ztA6+7nOEIdDDAEqO1b{=;&6F?)uu2}>@OEbsurxAFt<+$aTSE3Rt_hMnL;7QlEJXZ zkqb4u8YW2B#qx+X;82Byr9Dy=4(D>Y^(z}!t#VQL=7sE)2bfHR!-B{ZoI7MmBpl1= zg>_34%NwRm!+`6pz8BQhCl0IM7`K0YUEQ?0h`;yM)g7~N+VqIcm+I>3Pih=`-nMCp zi0#i{d&=O2E7mXVuCf0+?NiGVbL(q@ea*DG#7&pgCw^a7o2;9s)g4ol&ReI&(i8Xa zQG|3{-D!)1Y18XwZkV|uF?-kIny3yW>Yh~-ez?pUyBVPbF~QD0vZ@Z*Qqos!sJf66K6B9LfdfBV?F#G&@nh>wPFzxd@}lX}5?7B6;5h$ZkF3Y{E63{X`-XFuCTl`_Iga>0ZD_Y1 zS69CzF>lwBQ)}+IH&NGsI#`{Uvtjwh=JPu)7FW!~7qHaTC_J%=}>jmqkClX(~jLG_N-2lEnsPFa1pR}m!q)qGAZR$$Qu1}q_ za&h9Vmu*NqTDRe(6^plSTA5rvZFZ!sTs{+tIl4YEQlB`wVZ}KcS8P3}>+Xds7p&aG zR4m%K0=fU{WxEi~C+b)d_gz+h4h$cwYq((L+Qj~bwOz2h=d$xUVfjh~bw+J9{MW3y zL}Oh|_P;c{E^$mlVs}I0nEJ%-`oz43wU*)fnTf>>=dU?ug%0-FUm)Dg39rJLHlG(7ra?-eb#mY}#Q{(IV^OV!A%*LXX zAFR#m2M@1H%&kk5>+2D{Di2|uyJ+#o6&;J;w?A>=d5KdR66ZH0PN{EP*jy9zweu15 zocd%l{w4O-jyQK8Rad`pV@)1Eb5vc!(!{>{r7Ko5Evpu;Sopr$w7%)+x}$1h_{!0B zmP2%v`X#EY6${^=7%V3iHq=zddyc8AKY61Cym;Y?Meo0)#`W=I>KYa|eR3=MPkrJy zbsIJ&p1iDn#i~uoy_?QW9NCb_*Dp@oShs7N6+pwxO^M`&#Akzs#G{urY#bckmv~KG zZS(nZEVlg?+em(Fu-^V*=D^YEWZ0WdhV5N#-2vy6kdtRvfRG*Z?%H18T)(E_%!bwV6lPbhZ9KDnDFuT}DYvZtdC8v66*&sP*<98n-o9dH ztbeG!2qC64oFA)iY&_%4GtRiEe)(vBVSFQ|zH)Bg^3l~Wmxsnj`<~u@u(5u5cd33k zM3#+%W8-I@S-*T>EWg}IWB5J_(IhjNTRxH-8!QiPTnVcIq_~Vomt(#rarZzrQ_e)q zdE|HbKru6#TVBYcNODDZDh&^gA^rVBnPR|++{z=hCD{>fPPKQ3$(Cd)jkn5eNr(NJ zLNEbQr!a*4+YDUFmBWbww`F*6C|7J6FYWKymo8=o28R2COg2*}5ATKa5N1b5 zg67orp4?zxrhoT%A;=DwP~>AsZCJqS0HvKD>(4cf4+K_Y<6|yi^{l$#Vj;v^iE`y& z47X**%R?0Gf+nlARIWITx0!8*ycM$E!q%|>5?50j6Ko<;uw`esBiR#nCY#$^!kx*j ztvIIM!8I5fL%MY{vPWqM2?{Cc1&}<$J>$9YT+osm$?We)^>$=R<@E4quD6^SEd`1OTKaOM~bFE{UzLDJ4HZ-pQE4FM{+!qcE599+cMp^Nqu#xi- zE5lJX#frcQIT8!9VaSpd85VEJMM_3?=k^CBD~y3mf6jzepRd-o?Y*sG)A{Mv-e3$> z(m#?f<+1?<)s6rKm&vXVa%26){e?0rFoW_gl?p>e*5dF4a+(=I4F!F}tlMI~AB~IM zAf$|y8?%C-FpgL2WyaDhcNJ&PE_9eMxp{M#+8n001T4#uaA$iS~rFbbd7(t1KsHVd1aw#Yv)f4&R?x2JyDCR-B&x{1QOrbY7mSvlOPsq$DlTyEr zzO%KZ-FkF-d+(}1La7z6Z?s|h{8X#=-nKJL^>P46w+00^bO@|ypxLHOPi~KEg1xyi z`hIsy=Z;KqOJ)r9S`7Mn_Vx7kwzmwIuu9u+HD+T+Zm)(8w#ZQFcePi|BO8-1tW-Ko zw|BPoguSilbbHrkSNS;%4f}&Jbjbi~mSScw+*6H%?T~No-#(VjVf4t9bJ^a}e7-!C z%QiP}4IrjtQBxc)SjiSL!^MeVbxhPGYiw+M6h1QHSUxNbVfYD4BYBiM8nQ()h_-@u z$?l70+PA-qpQsoZ-WM{aU}t+2RgU#!w!zCY@vb1ijW@EgW=A#IiNFpOF?z z1$4ZT5q9%n^Y#J;A$A*%N$^n$`g}q|v}n{d?i?9GYekX=MlypzIfHCjffNTq)GFMO znryzjYE^k(VJtu|w@PM$*jv#iMso1MW*i`LyfSF-FiLSeQz&ICZLgFY%>+HWT6c5? zrTjn{Ylk4*oGYh>_J_@#Eg`#ZYND9#8|g*2%r6ovD`XVP|_+*qcf= zw+79w3#YL3L`N^7nR0w624PoAdvA!Mx+<5^GsB79;ZSxY7|Iqg0R;V+ zkBTVrQDnAU+>b?RG0R#x%ju7l?ZUkWysEIs8`HiCou5Jv= zD1eMBYb;<#QB4KZDaV&$f38@xf}F@;J?F=kzUHBp97kvL7IyipwT|%u5{}Y$Gf2se z$l-aIfSO7rSNg0=6k@qJj@dvhGS%DE)YFQAr8}MMXzoe}PhYSFG&?q%fE{=ORp~o# zJI2x8iH=;hWGQ(8;)I%jt+d)iZH~$nU2$|br(4s=x}O%>d$xsb+fhLXIf;JblIy#4 zYi}y-ZEx!hFo;=AxHb`Dq!vpX&ZQAHbhs|4(U0tmmVM}*s5^Z&7 zcTY!4*w)SuCXW0~)D{oD1Gr;lb`P{^Z8Y8DB4#|s5YJ=q@gVT>(a=rS23 zbg)K`dE8lzZtVx|3Gh2a!a zg~eEe9;6zh34Oeqjb;cF^!V5qr@P!qH|114Xh1=RDjpLI`Z{vMrSW1e zRq}CfX>1NTv+V5Y>~6utVv}aS$p;u#(S_J@ny77J5xC|vG=VY8W@Ap$h5Q6spN(>% zjY;WU^ojy6V{{wtR~ISgF-}@@K(K5T7`?PtoEDEio; zEvgda0rpTg*Ro`TzH)y)hp~SkKUOU^i9uG3R3cHLginlN;Y0>9N-@X!4JeI;rQu6* zoKX8Ru*N`S^9%+=6hL}k%5rJV$A)sMcXn+q7BD4XbmELubVY1Et%MRs0l4BSU~J{6 z$BLs2;3TsW$IqIP%Ly!&RCaJ1xG)&yks1k_&PO&E5osX&W=49;MK?5}W=!-N9fzdO zULD%tOPR+_Cw-MKyD5^`M2T??q6CG_l66&0x|~v3Tu#D)h_x3zpuM;UB5E*7Etr)h zdS!1j#(tAj3S(>5Tia*QY?J*%VSZqMJz}t!$2i(QT!4&iLb#h8*v2^WV4hSH>L1GW zV{Es%2*Ol;cig5~zHR4)g*peboi`SCL6QAn?S%@FRLr?!#t5|sXfki=L- zLy%7K!ew+blP$0xPzbr{0dXPd3rlVQ2`Nlu^Z6n?_3sT`XU6mgftdA&th)+yWr`k< zM_r8M1~dIwcw7>o4RGj3stbj16g`S1>RM#y;8>999}P!2eYlx0wdH)bMs(A9Ge#*B zOKr&!?u0Hh7xuJqYO>~xX_kUYwHN!LAqjD~t1B6{wC`x`>1|J+A9l2NZ4LS+Y^;vX zW*o&aFQFq?M63_17>c|B<+Cgbd1ntw3QK_89`^n)GMrZzv{pLRKH_A3Cl>m)gQ`L8 z7EO*oSXAT&Q2t_|2x{lWzQJOF5*kO`(okl1uF?`l@{sHx4PaD63*A$8EkrC z|IHTXHS<@PZt3WC(Lnn%Byni8GE4N?pu$bK0OdM5JVt59#C~c&&{O?{M+Fkrn`n;f zE1le`y0Ynm?$5~-3Zl$Neh?jUH^wHc!ZDQimeZW<40ralqoT{>#lAe}90*=mgkcp) z4Fcx-f#Ja^q}tYWZ~LmSYkNnB8}(g#?CT#3GpKVLPn2!bNub$3O(2$JY#L(bFJ^4u zWLJX11-&=44#Mf($`$esrJa2kEh<_Mx7KD0pRmy{wB<{2A7}l3r%Re7WS^JB`XTJ< z4qLe5h)wvArAt`E_V0DWg7qR!B7=}2q4%MVGnC|HvjS#2TDl1{n;)lw#*e@#e+}FyW zlH;aHw@|MY;&TJzB`6te$J#YmH~ciQpLIbP!hBk+Q4dg&f;j+d&T%xm{Z6}A(K|_s zrjVTpG5SHG4LGv14?>mX=U+8Mq!*Z^ejXM3j-Cy2OGSOA~8S zqqe>Z)4M{qO`z!(w?ffZy*EG72QjD|vH)hkOm7g;N=UA1Cj#LS=OvS}C#84f`#EKaF5{N@ogCNONsV0}_7 zW3#HbXNy!GZi58VwNsfwl3~H@K{dI_2s$@wknC5ia<5Q>zJgOKmAtTpvf8w!xzPfJ z#d66?7SXpRQ{5e%r9n<2*?<)dg$VD;?JM9k4CZ0UkgL`~h=jJqDTh@QCfz_rRZoGA z8)BWQM7$oar)_0W{k|&ly%93&U|7hG+1OvOSwRAv-_^GyyG-sjJx7Ol>iio3Lp)NcT3cwRU{C7qG z^)42&ST(b_FcLr=(~so@I{!!zHs$jp0rW?MgSjGFCK{6@`@L98TcvUQ=0*<2)NBz- z^T^nXW*BfxL?!GA_U56PXFUvKOJiSvX}r6uCE0U+Wwy6I!!F^9&5RH#ZL(t0`WuHh ztg($#k8kQ{DbuLXgA~Fdg*2KkgyrJCX#J$v=_{)M+e--1W-vC}CZvrdUi02R79??+ z(d|dN)qh@#z;J>Zfb}*Ag`FMf@~t}{MQ{_r5*XDj7i?g4vw8_7dcQm8g%8z8aO;T1KNvMR8;*qlrb#W;}3Qh3$? zNYOKNJB(P*?sWsT4LWR9dxtS4j%Ty1p>jpTN^z?NTY8YVEJrrDM|OPuelIJo>Vd1C z_AF|-6FYBKIFsbS$rFi_(D{E2_E}A>)a!PD_Hru>DotPAmN713B888I{}48RxPY?0 ztF>-ru?X!4i_OOOp$U^4iu?L;3RMlmt0l|Gh3(MvQG>{m54k*dJ5)7Nbtz+`IF~hU z_(gliuCr6iVR_+q7BEXAa_ZbzNNx>9Jqq?0xo7T6aNNze+#B;_DHl7fohj&#TD#Ic z=SzJjT@eC9zcoD^XFKp*qTVD+Jn|iAwRM;w;z)L zw_T~MbaPKMB|WXl77H(?Z1J-Wm+mND?Ds@QE!)(CdW}7YyYLm|nLjz`TA{5KES;70 zHA>L!%oMb+#UzB5Nj*l&YdjD&R($B&oJOF(9^iH{Hv;&7mHltD|Eul)8vDQ2{;#wD zX9Vb+Sb_}(P;&b2WGkLbu{fM7QeA~=rA{)vPuYUhqaVu6K+{CoCV7Ps(zf^`h^zg1uG;u~ZwXK+`8m$h+6_FF;2PB@b7X{kuWLz78 z`gTK19>CZSZ8OzZdt)+frMyi&Kv^$e9CSmt?e}(W#x6BC%_D2U#+9Q(m*C(g=FFhn zU!Zag(+-uD(){@zG`TZ(Zr!>n#J|-6y3r7HDua0_*KEBQ(HwGQbZchcvs`nq;(~r= zC^<4%gqDrFs;hSSX5`cu>id-$pFII;XC}9Qh>BlK!&v`KPFiH0x5^3{Q<&-8eMjXE zhFgkTI?&qoLY=In1l-Akq6C_3Y$jvY;pvwYC4;><(+c&4wHx$J`QecFhrI&Mzw z?4%gLk!UpF=B2q7Oc(2;N2|c$0kk?UoU=h@a8Q%3U$IbIX$j}P3`Lfq2^1ev1i7)k z=JX8WDMOcHk|h+f6b!Y8WBG%+1_zobCE73oWw0g3_EsvoaGo__&!iBPD^^dS_$hB- z7*8@3YYzNiX#}l3dt;^DYsV+(>`mzu&=f}-sNQn7MC-mYvyUsWzGet}lJs_VZ|Uts z5m`-9k8N5H_BPk{U74qCXU0n`s)Dxmw(hVQd+$A6AXX?!KQ)z&H9;BL@A@FxV zU%%PQ`jh3Nun$7BElRtKtz4p3hRN+cJ*{2oP#XZyUG?%H0oR+DVogxXjzaNM?jOoR z+w9b%81S)%+2_M(+erz#r!B;}0TVdFzCKp36=h3q07Hi@9&!ko5|~@!YUEGuV8ZR} zhQxDI7jl_u66WO6?Zu%1w6b0fDp(=d7-h!*IM7n3gT4;&E;{D3u~g*!mX5HecSlQ@ zN^Zs`D0c9@u9_=C+>5pYjWf1(FnVB14FlK2FtVRSV;URNKA$vUIRCN_>oL>QKv;ab zo{K&0wI)g0&JEJ6=_U(JZ>p!gGb&WF&0-x_%#mc4_`s4j>3Pp;KG`Xvuk(W!vIyNq6?x&Z!%|rsxEzoh?na zn+Rco6>Y*@RbCr_NW#&~XdBZtvOAdVT=SB2(RK2ddCqBL}Kn zbEh(N*oG0zG|-l7_Uy~){F5DOLBnCUplE>=j+;JMeZFx)ib6ED%a_4%P57mPW&hK* z8Ivtn;_(YECkCF`+cWF;R;>=OiG{rc9Jt~x7KdoxP_}obDC30NwzqEQ0YjWNb-PfV z?ai*%@gHZ&{E|7c)QyYj8=te zVw#$}Y>$Qd)yl>x=Ud2j98M|Z^rDrFY1XYrCU2% zo4J{58>5UNayZF1CF@lFm`myX{CZr8s!z zo+T04m4hITAj|Ri8@eQmg+1uXicA2#rGwIQu zLG%;T00s;bL#HTPPOoSvXJ|Jdx*CSWhcl14!6wMfI1w>1$|Ie&g^m+YSWDPZE(VPK z6t_E?w#`whYLG;VSGLiBt`wAUJ_5bp4PF%~k%JXyP#r>Hmn}sbfDI1Xrm$^dSJj+_ zDV$Pg&6A(p+;8VRgoh|>Q0MyD26R)oLKcL2lm~qJxFI(Y4Dig4Bs8aRhAK;o4;!-r zYXo){s5&@M{HM;Y8%uIcq3$3@Dso62?Fxr@F^=S2QX$oh;oM|#0QxUi2R1UgeIwP6 z?GIqX*JRHU4icCa-;H~=LbjpNl{dvk{2&@MYS=~?emrq&CjuA%*0~I}iXNZRf8tp_x&77Cq zp5B6mMSHWICk{=$UJ(r#EjK7AdtewDbeXRm_T{;$HHj$&GXWm#*pck0ZZ)uDOxjwu z6(1GNZW3i9D`3y7B2Qq)#Wva8g22{EQJn>sNodoq=cV02z^45@T%@tpn8wOhH7t>e z-mN{|8B#MgFo1a*g$DIB1VPj-ADbX;HS1=Alv|qP$2c$&RpNeYLUu5?4!0eZw`Y3lm+4^8MXk<4f*J0578 z*ZN8Hj2wp)$h@c`v^AeJs4eU}Z^ddggu1D2q7TN5bPA}R~EF1r)YX+CO6s(ymV155$u7wnFeRX z@Tw7ebPadwoDw%tt)ME0_MK*#{hMLgxZ*bRlYwKC*ete)5P)sdzfIgMZV}tX^Te$I z*5NqjF^+RaJTf)84@3r$wVNaBfOfRkAoS-kp@gb^_A+!&ATSF~)l;_8=3Eci1I;Pu zZNC5~52$FieUPV%c`KJRHrG!(HS)5M9z8XZILDPrE?+I}~jsuut za&;ps58JI)?7m?^f11R3h_I>h{2f}ithVCGM0Z5H11oBbKsw8gmqhSEPCvRi(J9(P zc(k*Z4@jYrOkPa%qU($~?W#K=>`yepTI0}dPD5@Q;JR;0(C)=Jd{RYS0 z8d1P0S&>`Uicm!EF)33JU=`%rWf>=)i~G3SjS&^QkoJ(4lc^)e#wQi&PHw?9^^cht z*i-HvFWU)F$vh^0`)5d9{C-S8yWZoLdtquYWlw0i#SL_?jg|4zpZ`wtIT8*%$Oe11 z{VRodYKB@4Q!tp2We+iNtf(%DY;3XRNOr%KlG_gT#|noBpj|HH`UBe(!{aHo?1J)- zZHgU&F>v>&vO~*}s7An@G=Rc~l{MNv<;BYL0GU!@l>1K@WO(d}^0@7*I-y1zjg?tx za({r})sb$cf~&2)tJUSbdR&a@Lh&F_D;;wl&5d$sQv2p<<92pao_cCK>%twKwuZOY zAuZ3BmalDC-LR5xKssaPnpNwUqqMx!g_w1*VlG`+d(6%o?Hy1U>@LaKA_cNouGs7k zV)QwE3pA)yGL7Rf*92x_zhkL-n4DRjTB;~vOygJ1crBQwSUWXFDIkE(Bs+}hjk`fv zFAuRHOA<7x4NVT?D{8d52(b2SVk{0Or6iG8`x5HPTAN93V|hNO3YFyEptHHxJw;;! z4@ORG-JqFZ)Nv03at#dmI&$m*k9a~|%<~DDmb!5|brdQ@E#{z^AA`=sCK2vDL}xH* zecb~m=wwm76V)I)J8`JmcI0gD&_8%n8PK+dDYTkSKGfj%qDw(5RyvjHsT^X#Djd%b zVIFfUqZCiFVds>M-)(+G9z4Ynz_BpRCybn8J@W8j%S3KuB+av8Hg^v|&w*u)J=f+B zQYG73S7Q2UOu2gGu#T+dAzcJo6;Ck@wfFWUTRYsg(t3ysP$i57+o7hdZ205pUOrV} z3Kd9%P;VEp<1i6y%lE2BKoaAs0;eAa@W{o;emp7Pj&81pEl~g^v>0^W{$U)8Kwota zsoGM~o;GW5#TY~dDYZprZ7a-bgNdxk+~zSR99KP9OqyN`Pt~yzVK~PFc)ge$nRDMk zo40T|CLO$;o|vK_Okc-;D8pV%DX6yLvGM$P$t%L`lny$D8iC&fYVN>+OSDpJvm7EV z71V>7ste*g)^Aj^V8nE1q}#SQ*?_{fSE3A;ifMbGS_j)|w@IXbHf@*<&2Ev+*eZ(a z$z462Y~NWuB(7xlc67UE&$W{XwS>KrfT|8OQ_F_WV(-rOG!`eV-1yy@r}iMgf=!Ry zpu0=yopn1;Zr2wxcrx9M-3_d1(mo)2za2Na-OT5nUJ8T2jhY=m#xQ)TMX>o7uaj*3H>9$EP1Ndu?tJ>lCN0{(asuC2W~NW zeK%9eeJ->j=7-Y<6i|AW#u^aAbPv@B1;6h;xl$|5^ck8kmQF5j+(zK=`3!!iIveie zI1^Rb-nkRU^U&Q#kjpHB^^f~ei{&<>i%=&F21%?II7^mrhOiB~11NuSz|S9`nKC2N zxx29rCrSN-);4{(eQoPG)h8dF7TOMAP7V<(N6yq3i7=iI+Fl9<6K+~l)6?9%E4t0< z_dJ}6!K%ut+1IeGf^A*TzAM2ih#qsRyx62KdS=U>IpL9Ayd%PCs%-1r&dFv+u|4B< zWos0hIM26x%${?b9|nCK*0^&rQOle~8*W zy=FSOK2wlYM1{(+LSIOJiL;}9itg9ErM)X@D|GC?xTmB2U|Crk?dY~=h+L^6fe^ef z;6TITPJigwL=$8*ywm~XpcNeFF3$YURGFBlQn!ZX*U+{nf%d!;xl8c?F15~1hOm39ahfVjyxi$=RTFI9k)$iCiNpFW*%@&yUm@i`B6I~`cLZ@BkdW;e+ zwjwfvCEI0;oK)ptLA_NEmFswZlWJJco!`PJ#~C*I8Fwk+iLvB)%J3SHTu#_FNEnwk}K`OwTq@Zg?-La!X2xUgx5kddr9zJFt z>E*5!_F?xHYp^VJGB_2(#RU43ildMFQxvRQ#_{4SC7fN3<>7o{$GxK)hk`MFYqyf^ z2S-KRIRGn79V%b~S@n|#4vgYBQG-5<6C|!UgUTkNV(m)qz*)UiE8azhGk`q#Z_6gP zQ0LkJ@0`UxOSM9{NR}!fB7Q0~?0@N)0DF=j{_RX#4+h-UHXi81n>4ab$sPQHtS&P6b;`F{X}o zzKPk`AFfh&!eYpl`2)kb5lo2~`eQG8v4wzp{hiZELsw%OhMs*q-EgtsBfnx;_*`oyn0}Q{UGe9dBL4& zRV6?2WCy43eK?zxZGy^2dalXc67zW@4{)yu+DnyVX2W?KnY657*{H0WyK(T9=f!&4 z^dKTsy8YOX;G2wiet?I~oes-%O@10;1LPY!u+;DxCxxhyhJz$}5I5HKTntat@|+u6 z(!c~dBGrR91*_rFj=H*~H#R3z&|P7JC$PSOx8oK4Eg=;cuK(j@VU=t^Z{6O7jd8q< zD~Tt?xk}^H-6%E8qBgIj+@y;c(4Av9|5>;|=a;T?8_$@-x- zXRv~?LpT1>>xx9jgjms|%&9wRIll`JgW^eOC_6MH*_t4-7~oJIIa7icolSb;+35`2 zaEp=}!lS4YDIR5yG~a3+fUQ4^8l4Q;w);uMi&bE^j;SX620+yr8r55#Gw_SyYk_!#xDDz1Pk@ zyLV%|YTAP>+2~n8|3FjCHmo&aFYH44HVJ`3m(4c8=H}+J>X-6Wq-i|XRjS7clzO~) zw7yj@9{onAeQv1#Jf8xSxaxa}X_b~hI3cg&M7k?WfId9e#(_UFuW6$4; zfc*j5HOJEycjxbPME%FzY3A>F`0G@BX>w(d`pUiYYVyh7GC@AB zn0a8v%cftMxQgWzy_esWmv-J8bz^zSZEM_(zlBmMpB?k&{=4_Z<6}Adi@&4NG;iq@ za}LaY*{mxMxoYOsGp?C_ZQ?qldD>gQ@})06aQ_$X`~1D1n@9iAy1WPGCe+o;m(93x z`c;Xmna6nfE#*zR_`57k^Oj7GrFq`^X;02u63t5o?n%x&!nc!}cvI$9TekIzgW&JH zG|j6&FzaQ9TsiZq8COrgCUGs(R!>J=w}9|-#jFE|ylm!`Gp?F`b>bTOiRLeBerod< zb?i@!jk;e2C z?)9+q*TeY2vW(R6w1IiY)s)jzVI&)IV}?Hr64bE`%xK2Yk5?ggt`26-Iiz#;wE5GI zt~;jgS$M(yv+JHyw_y6Bx}c%7f3%$G1ItCnA^**Ut_GX78z6)P4R|GU11%e>4-i(S z%BdVHi>t_8wX3e!UFP_7K}KIx7`rd}LZq0}q(@<^?vv;HDcoXt;5|>5g^F7>2Uc3N zrmDH7Yq^wsRA+{O9|_gr}M{@NQ++^N8~AZ_z7HVvr>mnubi{pCE8coFWn*ui@8Lz z6>~yT^&FT*R1=`f2K51x-Qthg)F!2}5Sn~r^hq#1k6(MQt5IKtkiq+lJn^XcAo z8}WiNntbr7>K@%A_isR{y0V0!A()(@Ne2^Z@2OGs#nOx*Bd;ZBD4K4LTYo9i3rJ02j=Hn{H@s(|;p@SF`b?-r6gU`;rPjh~3sWE;rR_`N50 z15y|?@SXCIc%ye=iH|+!21uC=Zqpxc#VGkX;NRi#@Pz5zepQqH*YIEDvR`X~c_BXZ z$Db|b757IsUZ>!L-`@F`{wNQ{YdGc2Ovy&U0D4r99Un>&^8?!xzIcvr(5tvesy$6y}~?;QxQ9(D|m zzvAoD_bq&nhIcp2N8{r!AKuqt5e@I&NPhWK<37AU<9jr`hhUzn{QejV@4-lTM@GV% zkHDhg@i+Jwm%n`a=D|}meGf;%I|`nC`c937_d~e(Fc_x)-WK!sW4KKfFQTc5_mN1v z$Lb!o=jX@5`#J0u;NveJ??lYsG?=G~w-k%_=aG1yjX-^VZ-|9A^J&6+MJ&9>BH?jN z@!@?i7Tz3~x&HE(&&O@C@SZ?;zCE7^&px~_#ll+yGuLeX^5K0U7T(f~M<5*bkA;!&j>HY{S{YB@2Ez$3`^$%S7`{Z?--bwdi{aU) zZ*?p@{(dCKPJj9ER>Z>VKzP3VPJ(A2-p*Kfk3UWNdSl^bBkAK9@58$!7Tz3~rz*d_ zvGB@~@Rmiwds{5LB{2Kn3uT@eFR!=6!aIQQ_Q9U@aT-28eRsveyA%`HJ#hCIobCEp zEWE!XJdXJcZ#h0byoY1qZGeMM69e+${XXXJTzK-oZyNRYSS;R-mb%~;cwoG&XCLnz zq&wQKHp~nHuC@K;GxR`2D?G;O;M7N8O@^MQdrygOpyWf30p$@Ed?@!>rj3-4xxN4bMf)v z{UH|KM-kps^ZxH*;e8n4p=d0;rbu{4Bj9Lz{vyJAKHUA~({}{?!KrfH9Vx#S*!uLX ziG{ZmLImCX<-=PE%V>B%kEE{+o_%;dvG7huco+J>Kp$RLEWF1e>Dv+sZ!i|#)d(*= zMR@(O@Q&VGZ7=6V!n-mS-XjR_;VHtqJQm&tgtrU+Sic-U;B57CYb?AELWrCyeQ%A0 zcVi@dU6JrUq3}57@R~k12q^dYi*?V>m*vlw=h5)@7dq&Ivt19w;=LR3z637J$2NTE zkL~QI_`=(LcyposoGQE@#=_gMrCQFtk?{Vh@L*-v^dry?_><(id{X}w3oncCu5NYd z<8Q>n+0u9D43|EC|Han?!CztLFCX5CF@G0a9|VgQdSBHro(+G|_WT$GvvZfYcv;Ur z-qT~@UHZY=dDX|eG#1|JAF2zG6)WcpBH^7A3-96E-EUp{6#DSaj)hmgqb|4@V+8As z{mG|qTP(bL?+AjcxscK2!|RNN_wYxNU!{-ZhY#-}g~zd*SI4J=;B%1%&G7gciupVI z=(=DJZ_wrajmOgW68K9qGF|@bo>=;hz7y>fjgk57!^fxZa`;0r6#V@UA6FNw_6Csg z^5WVC{wmiY&#ntzjeGs&{gJ-S)9sOly5J%7r9ph(jSu5R)3vq|4ez$I>w?eEgo7?0 zo;Q0&?WYHS_@}og@uRCzBh1m1&^;O>&C_j-TD{4ap0i0ndX7{*EF%eoDS@6;>&~8E zy%NY}t$VbG@cu(%?zO%XSn<}{a0Ohw5*W#9-J>HL!#^_S&RVQqiQuT1J6D|5D-j$M zb3dl)h;Iq}LVa!gTsc;+1ZMDBch2b5D-k?9=FSyh^-2WC$K1K1t6quV#F#r*Xw@qb zJU8af6<762V8v9MzJ*msd`kq2WA2M%?kC0EPl~yp5_9K@rFtcTWij_Rqwtg=DsEt z{<@g^I?GR0UU2Tes@z3Mym}=dVb;dKzUqi?2}s7Z?v#|PS0dODbEo86y%LaIYwxEd zTfGv&xiR;1tB&}V2%2KYDn0rgiy)EY67IWVcbEjliy%NEBF?UL8)hhu>t2Tcf zR{qsq>D-r8ZlPpWy%IrJ?0!mG)hki6a$|XHv+%1vwpG94TO#O0k-boio>b%r9A)U3jyD37Gvw{}9{E|LNd-)Xp2d zBS`o6#mt|Lnc4RkAA9P2%r}q5+@Fk@4}oX;Kid2s9-Jt%OW%>f3Yn*y`%ytsW|yC1 zg5DbUV}qQ`3(Ws-L%r5?A!8>FA zssCa8yYO#5#{c_b?%$4?e-<(NH8Ds->}RnGp`9=DD&fHUKhMV=3C6XK6oq4{$l*M%RP(l^D$q2R%YsK z=3{>PuFRL2c~kJ1%+E3NxdGRK{$hAXMr3fB7st$Jz|8c!{@N6zV(xu%=g2reXbJYo z%xLCgbb5Kr|C{B`HPifHOYkn4(`G&|_@vAao4F(SdhGsR#>`K}%!fooZ06?}n3;YT zepj$W?p#YBiP3U-jk!126uWEfZ{L0Ca za&Y~-$!VkqNgk91-rV@xA@a) z@*5fHFZ#Bo$v=^336A|}MC~u{TI`cfh1h*~YSWIGxKosf%nGNHb^572wNkOE$t?{! zr9uzUvne!B8F$S&6#8;Mw9RkvlB)R)Cb+w^3s3hNgviMT9t2>3Qyob$dmL+Vk7d#n zJ-<;sOX3m~tt!4T%WR_+<1Hh{Lu$it$2_Jwt-`Pd-BTfUpnztUsLrg==pPVald-t{ zkM`2B`bzgH-{Tg&pAVSO96R|!EB~w@zgyktWo&u^g4WhJs*kO~MsHo9Bfj#dviX&n z!6Tad$w@0-v#kAH1$v7VRpmDQxbV}wQ;2u5dU*ob9vz$V2evEk!j3%S#5*f5El?yi zc6yOP)UNu&EU|~==qcJ*T#?os@u3%2!dc1iw@OfRi7Kz%P!rsyB2TcI8f!x4?|(E z>&Fv0eEE662UhI40=83g;&6g`_Yc|Ah@#NJE;H45u-J#(;#p}aq5 zpWB0{JLL`9`*2|l7L4*gSP=J$(0fx4GUsx|1D;HO;v5K1E9w4Hw^uf&7+_@#^8tLw zE1f*F0PYsf)o!ntX389Mt_^~E^18tG$QVxCpM~?vYB+Q0|5a|?Fz1FKIG5&E2LX~4 z%t3l@B$56*Nu+OX9mx2|*C6dA+?U9H6NzxB>zRgSZHjyzwvzE1gnz0+~ec|#DOD1tdyBqGbfoGXF=Net$^DG1(1!tz}5Ep88X&Ox^q zHs=<%2S|In@2x?Ar~=yCefakwn%}Pc!SRPQgTEm!$KD5t_-7&Aj2~)YBesQuIqwL9 z5%Sg`xQ+aeAb>hOnDfpcxSvG&e@G&|*4_}V)f32d6~kXj!e0{!f3rxq&leYv@OLT+ ze{CfEJze=(`@#JibYF|uqx*{_@^Pv7F7Zwh;XVvb!_D6j9}#~n{#>+nb(`8T;yW4k zOm`!R^lp;*Jee(i*k4RD@`10Gj#rbB{2WU&!dXPZ(;E4+{NTPF@*gixUrv^P_}e0X zKD>DP&Z0Z~rRDEp^2#6>BN4BKf4j>0Ls);pe!(4Zqx(lhr1NN+L7(3BG$Y&;iG1-| zaHskq{2d1~{rmR5j%N7pBH{n(@@3@;e^#FGXYJ;LXpg)P;afN#R=wY?a{8p(H<|OP zAlOTPFu#OE`d>*RpPwbMw{t)FiGM%->F_`8bFO?ymIHZ$$o$cKx>zRfb?t82=Y!zo zG~egOmuX)Jf}3eZBHlqhfc`{&F$nHP|C#os!1N*09t?s9X}&86EIb5qDg8m2bR&6{ z?t2CHZ|Lu3E>5v61>NhRbp%F?1QNb z@paWS!nhS)0hiWxC4zDT@Ie1rH-@gw5rMCy4MKF@8Ce-md< zcjjk_CyCVC&|gyQ7B3Qai~Gf^#Mg>%7pae7IQNKO6CV+ODgIIXhd677yYCork+?$S z{xHM6KpYgy;!DNr#hb-A_aZoIYFBY#8UnhP* zyi5Fo_zm$#;%~(##l#^leTR$3i>HV!;x_RG;$HD`@wMVD;(Nu9iJud{Dt=%5l{kBr z>PK8CHi&16ZDNo3eDMY1Uh#7AdhurQ-Qq9Bm9t&E>%F^CI3gCs z{o)(NTg4BFpAvbFiS6WD;!nl@6#p*H#zahi$BHfDs8|;FiwDH(#W#w#iXRm37Vj4y z7Jni>CjLd7j*Tg%;|TEtajCdQ%!+%&7m3%1H;Hc*ZxcTzepdX4ID4*(_ZV@ZxLiC_ zY!&y4my2%_-znZ9ep>vJ_-*lL;(v;N6AwAerQ;}Zt$3k0EbbMr5ML#}S$vN;{cx41 zc%ryWTp_L%&la1-lz5T&0&zk-Al@LpOZSQM`nZxY`ozF)jcyifdz_?Y+? zar%6hu7%?1;u&JI*eyO!92Cpqi^c22*NJZzKOo*E-Y0T?IEhfdyVyDEif7mpE-7Z-}Bh|9&*;+f((Vyn1S+$Qc6 zFB1F3VKFa`i!T&kDqbbNLVS(*2JxVHtN32=cJX84C&kZ+4~SnCzbSrS{E7HW@ps~X ziBF0D6lXlgmFJ=2k>az&6UD{iGI52tRygqP;{_eA0eJ7o+_RpUL?LioDdI)pA#Pve<1!wd{Uf_BZ7=?fq0s@UThV6#84a& z_lsAGuMuw-KP7%q{FeAr@p195;!G&qn4bCK0&$(#ET+VZ#21JY;sNmn@h#$e#XH5% zi(eOiBt9lSCCsPArNq7GEyDLHrN#4)GrG%i{OMUy4tNbqig(=84CPOT~3! zi`XMxERKnnir0z<#oNS>i}#5Si$4(`7yl;CUgXksjJQZ#A-0P<#D1|LzDRtX_zv-Q z@%!Sh#6O9LFLv>sATATviOph4yhwb3I3XSoZxG)ien|YZ_@MY*@t5KgV%-wek9fSe zR9q`IiQVFb;;?v?_*(I8;s?aL#RtT1i9Zv6FaATEbCOHfv&1FhCUL8{OU#Ky@x|iH z#W#rmA>JW=M*OPy1M#=wQ{o{ftG$Se#Z}@tVyAey_)76j;ycAV#7~P~62BwQQG zcX8G!E*(dU3&rK)nPRKBO}t1P7RSX`h;I;Y6>k?mDLx>6Q~ZheJMk%T#!{EQBgGTN zW#U?~AihYvR(zfK4)J#JQ{tDzN5wyi{}ksgbMZe%JVjh1Hi_NhUh$3MyTp%(pB29< zJ|g~F{Ii%i)x~>+c%pc!c!t;_ZWEs`?iTlnFB4xa9u#jAKQ7)Uenb4R_&f2h;vuK0 z-G~dt2Jvihi@06v6Z7Jw;x*z;;@ia!ik}p}D1Jx$h4_TH`gE7BbHz^a0&!3r7cUoY z7T+y?RQ#OykoX(%Npbpe7vGWM0`WAlNt_U`7vChlReY!TKJgCmCYzb1ZL z{DJs0@z>&iihmOSCe~qNj&jH$;$h-Z;k;_>1lahbSMJVV?hwu&8MuXur&5r@RQxL16UctE^Pe2w@P@!jG_#LtLd z7QZV#D*i$Ihd6ts%l9$jLUFlxrikB2v39pjyht1t$HkY5uMpoL-YVWMeo}lu{HFL5 z@ps}=;*3=;{`ul_#nZ(z#Wt~5yjUC+FA=X2Zxr7uzF)jcykGpL_*3ye#lMTQ8(sR2 z6&H&u#f{>5;!g1`Yu$bC7C$O}R{V(t#aU;#bR8ou6i*k|i}*2LYhNkxLUBkei!TvhF1}uT zhxkG9Zt;F`#(Ee2nPQ8$O}t1P7RSYximwpgAl@q8E`CycK>VHflsMx|7ypssiQ+PG zo!Bg<#EZlih;I;Y6Ymu76(15G5q~8xR=mGfcZ5^<%tLEJ3%iv{sg@oMo#@fPtm z@lNqx@geaM@mJ!X#A#={bR909ATATviOph4yhwb3I3XSoZxG)izE`|c{Ji*e@kiog z;#1o&Uh4iOI%j~462)5Y~-O1w}U z63gOC#FvY&7vCX%P`q2bUwl~nvG|zy7jgO~m);}96U3$B8u47QL);~1#e#ULc(r(= zc#C+Oc&B);_>lOB_$%=VF*wJibFTPo@nmtec&^wfULX#NW$~rrE5$d7?-K75zb^hz z{Ehf$aoV{qUGv1_#goNGag%tSxI^p{$HYs-E5%of9}w>r9}vGK{!IM6_z!VT(xvZN z;u3L{xJle9?h+e-(M4k@D|MajrODJWhPBc&fNgY!bV~ z3&a7jC|)LBE8Zl&U3|ZIxA=hgE%9gK@5O(JbDC9-;u3L{xJle9?hsd$a}I`JLi?c%4zFNxm~e<400)@^a=pC=wKE)~~`O=7orp*SvHFWxM^Tl}c_ zIq@O!2jXwUC&lUQE?de2sXE_&)Iy;upk+#l(3o9Y=^K zil>U}#TM}*akuy)@jCJK;;rI`#7~P4ir*D~A^w*bY<1~5Oni=binvB>5>w*y#S!rm z@oMoV@g3ra#CycAh>wWB5&t62>~QHiT3jTq6gP?ZjSU-bE)a*rz2X7!)#5GU`^7Jd z-xGf+9^UD~trwSzXNjA|w3rdc#21QJi?0>mE`C6~OZ~6JlMLOV2#ZKsGI6b#6g$Q9#hkcDe35vK_*(I;;`_vpi=P+2CjLPD zjrgQEJ*9Mt3&hjJ^&)-&&e}nb7>Xm}e(_52HR3Je`@~O(_lw^Yzc2no{FV48aoRQ) z|KZ{Z;!5#cu|vE_92PGXuNL1ZzEk{!_(kz2;vdET77y)l={P}LDy|jJ7YD?mc&+$4 z@$KS=$r(ZL1u_!^Uzhpka(|pWBnbW?^C7*?-*F`D8_C&0&`#!ppqo4t&lAZ!L?YZ# z*}qiw*O7+>!5d|M2MK?7hF z948UqOUPq_;Ch+gNaFtY%KnqGzn6R#(k1gR$Y%$^QzZQVx6DWEfEnQ)PacowqGVo6 z!rxgkx5|8;%-dxS$rJHBnar2U{A%*KL2#?=KOpmGNW^zPxiAR6E%Q%F#P>_t|6Y7b zJaVVI?*wu&-oGL9IuiGtEpwa9JH+S7en95kG8ajNGa=p}-YR}t{2Gb$euq2>>67`7 zB;tKi=4rc}`4AHR=ga&onHP|_f3dh;JWuZ1$W!nGJjP3qWE+1332*GF8ss9 zW5wr+tHqrp>Y3uaNm#68XMfyjk|| zB$2M$Wd4}Ucgy@G@p~lhKLmcs@c5zs| zRJ=)ik9a?c&o{^oc;B$hzax>JKg#?MnWqgn|A&!qpD*)?GB1+(|FHKS;8B%{+xIzV zCMT0*5|T5SOn?D~(1Ns3r3#@$kQOP5HH0KUB+V4T6%`c~6%~cGth)AI7S@KYg|)Kk zDk>^=?6`IXjs3mv=iC#5yZbNK`~Tke`mXPrE1BPOKfRwa&w0)O=^@hNq$f(xl%6Af zl=LF$TImzTbHxkgekqCkUL)Qk_lL#DW&f)9spu~8!*vvgiZjH8;>qG4#e2nHi&CTlxICT5%n*9JBji?C_Wniq;{eC3U9VAW^4-xCd)5JfDo5k%U^8Y$H75j2X?;(-i57H^MzRndp zk_gw2M7Z(dT(L^-HRM6KZk9fSM7-xnUnG4Q34iy={xNa}<}vBFNQ8S&`g7@Tq<@hP z)WIL}l|{mTM7pc=Kyj$-N0Ufryf{}}EUpqah#SdSXjc;PKO?>*zDCZ%^*)Jwd`Fhz zce;9C=a2}OC*57TxAb7?5z@ud2aAWu{wNahE)tIu&l0Z{?-idTk)PK{+?)AWdN+yu zd@mhr@O2sq|GCl~rF%*b6GzE@0*QF1h=++a;u+!}#6OdW|6%bJ@jdYuG3{9R!#$IH z68?LT$Zw(aQ0bAI{}RdT;x`VQ%P#Vz9Fa(|gbI^T-i zQ;2#$ai(~vSS>b+Cx{!wKawct%_OeLH%mWCqTE}hUzFY<{hstL>2IV1O@6o#iFiAZ zh&NX(6vv43#cJ`IW;QZiWiB05U&=m7w;mG+0Ej^;-lhI z;~5ka9%DRDJ~Qn z$*5%=C!Q#tBCaPp;`&Maqj-(T{fc@2b+h=e_^9}I@p*BFX!hknxX-1(7QYvN7CSh8 z{1LIUX!e;w`2DH7;6AE2Q7jP`klk?IBvyz^#N)~CmUW`IT3jQV{b=C6UiuFr-oQ2d9;_bbug9x)XY4K?>sCUeDnu|L@d`|XMQi(|wo;xzFHu}oYn9wQzrwumdm zRpN!>MdFp>wc_pKCh>8yFYYso+r;hS>*CwuhvGlP??tok58?@?`0<(jf1o|-Jdy9q zVS3%gp(6KTru_tQvN&CwEiMp`6l+Dk&xPSn5lk*p5$_lOCjMP~L)P)e_LqXbOZqS3!{W2z3*xKdo1)ow3gN$$Hv3OO z|0Es2xv{x#FUG{qVh^#8I9MDmjuVT;x#FSX(c&V}>|=%WTclTttHd+KbHocpv(FX6 zT`zsJc&BLgyMp^)r5_ic6JHcR5I+{b7QYpL6$4?vUczFwX!grOI=!R^i9^M4VzD?~ zoGq4%Rbsu^B%UaqBAz3jFJ3KPFaAk1`*0y&4@&=4H2ZPE{yFJ)#1F(T#Bao(MLW|k ze}>pW>@M~a`-?^5cyW?AQ#@EaLM#)_K3~XRt@O#_Y2vx!1>$AmmEz6f?c&4YqvBKI zv*JtQtKu&4Q*n>@y_lZm*F%;V6FZCj#Uim-oFX0~9xfgu)`=&Jr-^IDb>hY1W#Vn( zM)6_sQSk+GB=*4*-xS{wzZ7?iKZ?JKF0NG>K3(i6n*G#Z-&49!H2bQ-eyH?l@c?nA zc(8bcSSB7TwumQ+r-)~X=Ze1T3@;_I)N;Lbw!Twn37V$*!6!9$aT=8-ezc*ba z-YDKG-Y-5RJ}&-E+#$Xpz9)VpelPwk261nJ>4n4&Vnj6i&cVH_^Z;?NI8q!dP7)6k z&AxO9KS%m7@hGuIY!H7Zo+PdlH;9*uSBW=@w~Buj?-3sq|0-@3pAol1W{Pn!A@&jbi9^H@ z;yBUl%ZK<%rRRx9h-N=NxK~Tpip}B*@oe!t@%Q4T;vIHntlJ^ue)?FagaDv948iw)5Y0hxmYFEipPp8 z#FgS{;+f)k;)UX+;uYfU;wEvkX!a9C{vVZoQhZi?L3~I2K>SSnO8j2@SxmvbN(b?# zi8*3a>>_p-i^z#s$03dp$BVPXIpSgBQDVK=B%1vU5#LGD=ZY7Imx))3o5Z`t2gEJn zlj76jYvNnt2ja)#m*Q^mNAXuNE6*>lCw3CMioM1C#3AAcaSAyZ>z>6@ah_NqE)na* zM)7#@L~*USPP|yWOuRmn$TOMYAts z3HB|g278P9iG#)A;#kq_(+K~wrRR!fzed;}ExlB%5u3#2;#uOk;s)^&@fz_4@pf^O z_^4?1dqld=O1~h!D!wVcFYXe*6V3jR2=CIZ(AaRs9PCQVYF3uMZ z6PJng;&Sl>@ig&F(d<8oe6E-NgZM}B2GQ(G34ixdPsMeV_?Wm=d`^5(d`)~y{6PFz z{89W>bn)8=<4+fJM6ULcZg=6O4$EZdaL-1_?Gyt__1jAr$o5j(yd}@CqEstFD2YP={&KE*j+3X z`-^5jN`xCPJxw(GQNrHrKM7XI-t0dKT`z6+pM*X^`ZV!O@gi~-?$d}@i`R?yihmIw z5uXruh;NARi64pIlcjjBL=56LD(aBfL5zr<#IE81aj-a294k%|4-^j(4;RbDDzQdv z5SNQ5h-ZstKTPEF66wpu8^l}0yTr}nQ{uDY%i?R|yW)r9=i=Am_u|iDO5CrnG%=r? zgK;GG5c`ND#L;50I7OTxmWpL!g=qHUMErHqE#mRwD$(rI34iOQFBY#BuNUtX{~|sr zJ}EvYz9_yfzAb)E&cpgg@q6)S(d_>T_Yi*bq`wYgMC>GX6?=(&#UgQ-I7S>VmWT(5 z2aEH?BgKW{5^C>|%CD4rs&5!Z_A#f!xo#9PEo;@#o{;ui5q@oDh|(d=7_`gv3O z9dVcVsrZffo%oCBboJ{uP0SQ?#eA`w*h3s5n*C3a{y6DkajG~&oGTtG9xW~stHoNe zSzIBWES@HwEuJU-Uc6MiO1w_IQ@mGvQhZu`T{QcwqC6i;|3ftUt-}6i=^%bgm{ct zC$@;ki>t)d;(GC7@sHv);?3gi;$7lq@k#M%@g?z9@e}b2@jLNHF@QA{EKjP~L5zs5 z1@|(`!tE-vjwqkRZ+ZxBp4TiSanHYq#691UB<}T1AaTzIr)1{d1P*m(-3yX3&l@fz zaSpST#IdM>#9Xj~M4PQ5k%u*856fCd_QLU!?1TGrWM9j=iR_1UA>;t96B=Y$Td0Tl z@7Ln*MBAuG=>2NQQYG(6|ob`{#I_l1)yvtb7vZiwP3v zJ%uFBZ;HrLl%K?LYXXUWIF)3f@nL?0Vn_^&`6Tj>?szJC=ZHah$0vw>xRgh zDIcH;9*rmy0)%_>KQIaU+R-a+kQ7#BYQT zh+9bXo5#ehB>K-Y;x-cfXuG(BM1Oii+)3h|&impn64&IPieHkr*4iz$lIU+giKczg z?}BU}(6lr9Uzi#+?TvnzOAVTK?~eAN22J~;Uz&Acpy>zbpZ)0$n*M-(I*b}L{Q~Vj zmKrqu1O0X~HE8+?`tJ;Cu#`l9Fz*io7f_@9&3ZC$A@wjk_98AN(Z6fN26CijHH#}q z^!JtGDsrr4trpji6YzdGaUF?qutB_poQ(IyiC2*r7uSh5kyFwB;zknVBcYh?&-|isM&$f{0 zUoVsBSD%yUPbrw-*pIr9=syEV^qT`n^cV9!EY45V=oe<)2>Qc?)ZGz3iS~bu>}6Ts zkZA90M_>>mm*#gb<+Vo$v?;8vUZTcnJxmEfn675~&`0m30rhD87PRQgMD0_r0GB0st0M5Hf0jGT=0rRS08KMm5&n85x8<^jH#|$h<1KYEjFQf%StD_zWIi zG;GAsAw!0bNF<7Aq3^*(MI%PQZuroVzI9?@`pHvfl-M>ZS|8ggWcO(M?94L86jU=l zg;tK0W!#@c+W5mKXm3Zo*?)quKMedhw)-R^37m{Cy9-(nHX*YL*GV~m%1J#5UIXJ1 zgFSvWZGtIW)f+erX1loD*rYlvUnu1eI5?ry7lB|frMj*ezEeL!-30zXm)xH49e5n^ zIo&4HXkPo6I0VL&pc}j$Oy!6PU5_s-%?+C26HGl7vGXms*30ewAHY&GP~m|co5CD6*vd!2B(jKpR8+Pv(^b#e9QpT z@D;4|18~80u!`1p=0=(q(>|J6$%vNFoR^9IXa$#Ysd9b?E(i@)ry)8X$-`55MI zmD7PkB)E)XwbS7nMpbhn#2Uv+XEqt!R8g9F0j|X;j9%sIj!B(w1@2)~^~(?GO!v*l0@*0PF-0r{? zswuCphD)K{;RK2|DEit~`f&K5FZB$*e;5UjcC0`pBYiUiHg2#S{+wWNB&?iJ&+$^oe`()-gGd`IVUrQoOAGH=Uj|$C+9U-2XeSfJZO36A+(*k&_0%a>D9^!Q5a)?vlW->J1icGgMj%H!a=tq3 zx>Ltr_|nnwTQ9jKb%%Y#Y2HJp5AONsiQ)OpM?KW|%ci$h-RQn?S@Tzy{q?Wam%V?+ zfe(H0#1((-@XXcWp7s4d9&pR*=7Zk2dE=3Y!V8%$ohwir=H(jUvd44+!b3_hny$Z{_yKV>prO|z3#hf zzklfK6~{i2%Q}lbh`I>2uq)@O-Z_9*;6w0ktyg)!F|Hw zB?y76IL^wvHv1ID85w2;LWm+|T7>KDb9yQr%2$R!mO1Iim~2h`QqRSl>r zUsOF{SlOrnLy86uKX&MV<<)gVha9<&^O4nc6*VoDRY%sAS1hfrtFr#LBWgOn$r?Ct z5dP*B&pB|)ys|k}VY-xRlLT*3?{yqbvl5($eypvg*cT>!8q^ zs8CU54NYYzZgq2g<6iqE4b>Q`^u_a$hUJYF&5bp%K(DE6JgzMPNG4rYQ9Bfl=+}+S zHKxAH6ag**_MXsGSU7*CY^thgX{>HO-jC3lR#H4^N?GabIrECznFm{?jn(z^W|h`2 zuWFpzT;5z|9auVTcG>*7Q|6RSn{#kk$^2PX)6)9J<^<0qX3i~LR9>;HrNNrkcx*{a zomE!W0{fvu%9^dYljlr z>dO8Hn`}_~x|vzLplokVSf$I`mpED2DJ!a*C!tQNE6QuE#WnTi%@&=e7SEbIV~SN= z(TrkOOsa1|ZPe7)ElHR!)=lZu;u&S8@`@)Hm(H6q$9JcbUrQrVNt4T)%PnPM-eILv zELI;KTI!mrm(*2NCMuSeH(HZg8XK$Xn*9br@^xkN(BZ81UiK#57L-ZtZH}6%s)mx9 z@+D~7#^&NOG{w~Ny2_fWMx@_Xpt80$m^XV~@r+5c=2<19k33}NT;u}t3TCAN^-TkY z4;(tMh!fHNMZ*S<98g|UlXN<=xx8^nRddsk$-(DO2}x<@3-zCUvN@w3)mwHT#z5I* zJdescomRQRI<$OQ)s*8!FV;Lrr; z$fDsxMkNXxt7@vso2vRIjwqfpb5IpaP>DitB3;y2URSX+(THiGsk*){F=WX8qxRqb zsKkKUiiVbP7-h{>D+bgKg>GKjQoHEi+b*MMQKJ$A7T47e@TU-% zYpa@?%9m6PsHv)3(!6wB5v&%YfXzsB00t(B(2Fb47uxIk+Un*3iyO;ps|GaGqp($t z@Z>l708;^F6YKFT{S>;i_0Z%HDlWlmA@-@_wq`ed&UBZ3+$-x_7S&W)WuU5ubIrNrzv&i43E}8V9g3;4JI&~wYajp0U5Q>(#xtU z(RF`U#YxjDoqZ^#mbvqa=S{KZH&r#Z>z8dtYudb-Wph?cY+1Y*F<_h~BTEia({b2o z$}r_v2TqzaI#I~}Fb@^flvrHfm_X|%rl|E3rH%C!Xp{QJroR6J9mXogMYUDV1GHrq z!k9A2?>jSxT5fvk%rwUf=Gsv^7Ra|d+MVpK!2;VF*mQhtb2*NWP0fuymnKcaXdL*@H9Zi0dtfE29?h}19{!BEe9v*#s{}Sc@^ zc{Dcp!fk|o;tRmBTe}33#>Kz!SAYuQSz+>%^tT8W?bH1!*H4G(vL2G@w!oYW1EVz> z@$q@qmJv4sqMI>+jro41ti~siiHsFl-SO(CCZv6i}{?TR)vbIuidOtKN zK>Fc_S6<1sr5*`?*VCX+(jVC_+twNcq|UnFhbiaqyZw1g&r0i`X9s^Q@?I}v<9%qh4T)QvhPaHe9AqUS z-Am+bMt`Hk3E~uSj(Dh8DJ~Nm#Z}_z;yUp%@e%P=@h$OVakt3kVt&G6zG&{R!hW#y zSaGU2Pb?SBeOCBCUix(L0`Us*X7O(E5%D?E+;2rZozQ`quMy&*;v%tLJV88DG|!hK z+?CSizAE&6(&jmG=oh7JbVsI>D|QwO#6F^V?i>C_NskxJbKkI^EfbI+-aj2YbmacH zjf&5Ie*d&TJ0+%G|9Dbpb+I~GO?Ri1ScMC=4Vd0(Y1fjoH(5Q0EDe4#Iq-b`wj-yl z`1QMAe$8wRTJ|uv|JTnKmQ%g3+Q%5t5x)Czuf1qXtlxNpaTvD1KxRUc8?CRdOR;+3X5P((CE?M5^}+Qi>*;gh zCg;+FH>KQ)%?JhuZVBE>JG(Ht%}T^~Zb!&Mgb0tOtyQ>tn{%nv_p5FD`u^yn;AM}s zUNtm;@5_g#;QP9vsT+$PY`EL{>Js;ijZC$uf97uxHKN|1|eKVL8v1;4t^4UZ`*De4})h2evj1?~%N z3iL?X8MrKClhecA8AUvdBT+(khAAo;&^_gr@EGc%O(~c4*mT;8M^;Sw2YwUTY4y0S z^`@b|uW@a@^5H9E)1xcszPk06p)Trk38rRrNPL1epIEj_G39aVhxQ-bn7$aJH*g6o zoi6+H+YYTu0h|;*E*|&-o!Q}r-MqQJ3IidKj<_6dLCBly{3$SSH^*afv$07vn<|7- z&f=U9O8p9!dvC7)43B})ICKSad43WIQ+Jv|;~FN`jWcIp5t0lfs%e~#EC&xb3&s?4 zd)*DD1mA#4{Rm&7?f8NNbDfqF{0zVi{3B83bh>092N}Cz=mtMI%#Q6o#Hd3sr+mgD zg@1q!x%+Wq%$$oaw;zpG=9S2!Zw?}G57-6fz-#Kl&2SAoizHI(czZwG0^97=hN~ID z6nv!~dzgvfYZNE7aTd(MO#W<`+Qg8d%)vA_(~Mj9*HN^X8@|DdX*G%!8JhYEV>=m+ zp=q?XGMA#>LkH1}8~CH(8k+uRd}q1H$XX{J>HB?1wJF|&_7t=nP z>B1(ogyy_Vj4vy+v;j8x9ilW>uYwsj@MkcAW0*(Wz)xrBWfZu9?=guQ9ncPz#Z9D7V%G`$DlJ*iqW@lav$F!H}B{%a4xTd}G zBfMud||X1AiJb_XY)T;Pa?NU+PHEX=-emX`Uq6}D z9jxp>!`vxjr_%$$b9N(e#yk8m4}#B$XT0k$0w;&RGGx5xFs48bcL2$F-*}7Ud`*`R z95!1tXB@?cCQL^w`w7I5mr)p4z__=*e) ze-#W*GC?g&&=6C(Ye={p#zc5_Ra-m<`|)t=j_@2m9xhV|&-LS(h>8l&Gx22d^dLN+ zS;)2mJsIcWafrY=rn{JavadlJ!SGSegRsw8!1^h3SU@X>EgN2Fgq`ya1D6}&Q4Oct8kU&l!^!{+IVrzkOxXw8X@dR^Nd*ON`LOHt_TZ0kd zoMFsalj#oGIRoge+4KO<^48N|i}N=`6yd%(D+A$^9B!16W2$$R!}3@;cQS@k95#C} zX9u%=hVhl2V;XUdV-n9PWq!^wVTR?r%p#oaG$G8$oIR|Ba~y8rGB)R0inR`Fe?rbn z%)z-%1H?i;$z+Akb54S{%A86@aK5R;<{WMk5ngAaUXeR(N|P17!1*4zTIqKk8co;1 z2xU$4C>7=G|Eptp-!oeq9PVF&qc#@A1j2Va+-)Q0PfX$-hdc6EIWMx1_o@PetmnVd{3j3<-OVJtAQr?3{>Y9HmYRth?We80~HW#>UU@@NZv!II`NQ z5fuR!nrmQNa3E^Q?jB%YaxPfdgNfM%fscT*>CA3y_b?GT7gQFoFSW^~1^2X+?7&CamLS?Y$Ft~7!fdb<)*STORN`V9tD1>uCjn(rYcz6gN z#{M>Fw?%My6D|q+pMzmW&qI@SRQ4RRQpUdgHC!|LMW1Sl{sLS&SCltc_CW#8 z*vytn_!9pG4>OXPsu>iWZJCryd-Ow(v}XkvaUZz!*hxJ*uoIdWah-AF z)UrzhoZ3;KE=cKMQ>&-Y^Wm_y=LFa)qn4u{3-j@1?`QL@dA|aV z$9^_DDLY4q2J>b0dl|8LpK-kTXJ^~#WR4O2*T5;eii4ViE<{7^`FROn&V$ME> z=FN0ww=^yxBip{vuJqIYQFQg}#f*gG@SkEk80E=cMxX4`|30?;`l93I{Om9}_GjbM z>i+?Q*D^RenID{^$TzJ)UFcyymnDQ z#)9_Vg$Vh{#RMG(+T%O=QTOSXV|(s|{EH`=r45}@+LGj&!p?h_8E}xmANnW+)@k_b918bF;al|e7e4H_Z!X4~LicO4%;=}bO>{{XI6ucTqC902p7=gaX=&*TmG zH=b#@Ne+PdT!imG;~&|50PxdoD-5GrjDJQ&o{E3?#JBnM$2VpZd@x(;!xrL))xr;B zZ2$R>+<9^5SZVzJ?P{6-d?Cnxc|FJf_IjEB%L{L`Xk}4T!~f8diTb9>s{dwOHt zf$V|D88Og3VD-3hf%LJC(=N{HF?_HGW@JkHh6H^94wHSTQ+5ZHMgaqf$Iw@=U_=ylhxkO zq}j7drX4sRUZ>5TWldgQRZ}ysy0*&NXAM)sqL#&0V^bY!+$#I`q1(I6ojYx^HMgm{ za)w#K(r*1y+nTBN-uKByS;E1rx6b93ifv;5#(;5DrdD`K>ejtjX4 zkHE?>t6+E$|kala&#oS zR#}nXX#2z>zmsN_O`BCR+bWsrw_f|zj{B^%^A|eq6NR5zGKRLMO)jM~IZOT)TDG*g zjQ2(S?sjlXc@39VqN_EcuQs++G`BQX&8)AivZ|Xn$_KBo&^fE>us%&8{fbaynw5}q z+g9=)-dJBnh8IbvELh&`GP_H%q8Z$q(WbbTSfVIyO#)dX$%ra%Q6-@}fw}~_? zrq(x^*$^&<8&ZdL zrS0ov)|7dN&Ym;9%&e-^qBAUSJ+8dscxz%+c}0C)X%$wxR+|2Yj>K_ZR&d1!TAW&QGf*Q@Rl4+e%*gdPWd74q)#NJV-v*mqI%U?} z!{*|&2J0+2hP4>n%m?MQ4V5iCjVP~e@(VC^o?#j0VYAF~PE%9$|M^9#_>~6d%)jD; zJ4Y+C!kOlI|K#;Iuf2=2@>d5>51iqgXFEq_W$)w8Yxd%-@an+naGjJ@xFRcTC6a+b zUdtC}WhcYKhf{$l{vTf&%O$W}FFVj2RNBqrX8CKI3umDAJ@cPk+qzr3b+e}X{o7Tw zHT4z$a*^%cRk_J!w|i~={nFdLe$0yR|2MA1EkYl_r7Ev6&1V?CllOFJftxqx!+S%x zrfd7W0gD6_*AUYW|8a?F@eW)2_*$Wp_l{uH{UysPfw_HrKedaGc}d2%6z2BvHA1w% z2j$gX0;Z?$wF&$t_JGBnw)YdjYHM^?ETKt$SmS#?0n-BQHE*o%{RFIz#s};8G5mYz zC4Kffn|RU9+dfQZLYwl_odM18oI5?#*FrG)q5t}%0I65~Mz8ygz6P4{ZNtBZ8S&2F zxbqjo^=!7Vg#EWi@O>}sjH`dqXihzK^-uF}5AI1jU9D2? zb62OGySXIU$3vS9V{JPrNCx>A=hsOm-M&al+{x&QqNZa48ckx3xkuarI-UISmySVL zMEfrOaV#Byj;8L0u}pTy;t3MrXOR$#NX!YRl9((nl-?|I1aQ9@_GAag296IhDk3V& zK|>&FvmZ*K>~UB!{+M6-FBVJ0x#9w`N<2nfE}kTwF0L0Z5w8{R5bqP&znSiLVlFxv zbw|;x_lM>-2DCTp{lVGNhl^F>vEqrMS*r{Gzn8v7yi940aSUf?@p;>qIK;zc4?4>G=o#izuV zM6T$d`)8tgzZrB2e$Sx2Cz|(|LHCs&E*6V3#lytK;<4gN@htHo@mg`C_>lON_=;%W zJBIYXk~Z%fgU-M}WIpr7-r^8(f;dw=TwEeHi)P;^#B-kXW#UcZ-QpwSb7BU5xMBJ+ zv6nbR952og7mH2eD)DOZ4)HG0yr&ECZ;^gNd`5gxe2qlid@Q}2#4q3>9Exdg-oFJs zkQy}a--7)(xtEBGNTgRw;(w*|nIyukmA*{8LH1m~$8h(He-q!6`!16IH~}Jih~va^ z65*GUIALEdeJY7`&HJw4ezo)sa=%-AOngr6+oj)@{z@fh)J z(Y${O=7*$1nD`k_MC>UJ632*#h{uZS#D~SV#8ezh7+)80x`=7ov>%42A%4g+4T<(?5Y6!h`UL5-#q-49iFDlOy`$0~lmjG{-Y&^ZXjfrH*v(Ck_?&7bl35 zMJ|P;e=f8p7m9qcg1S~T$31ASj-5!OwsGyxD^5kq8bk%mc18t=?7-3r|e#xp?mS z)&mn(uT`x*`>t=Dny`DXYVFl`Rcr6QT?@9fURAlJb-}z|R<)z}UZ|bpgfwgCxu`B-iwtdvbb}IPo zS`$7|^5CxQ35en0&Z)ai_)kB|zB^cA?YUwh;|+eh!aVl{|31G88*XpiHfGEw|Cuej zBwME7w_AN*d&Vs^q4)GR^!*{O3AFVUa@X|kg7i&R_vcIPMD~Ltkt$tL;zp~-wez|b zJcc?8?uk?d_gpr|N?6@bZCzZnzVeaQRYi|~Y}vtYL&M4L)vH_A4C}r-RNlS()YcV6 zEZJkNTZV6My`(eavlAmt+?Glby3gu0a_3{MYo;d4WEJk&=I6;O{IbpTNt@}zZ7f%J zlRK;M?QKDnDyep~`Fe5NW35Fq{CL`br+e*c%b0#2Vc__m`f#E8prlZT9ZX zixNG;rY*WpPbmrR`HOK07IlN$s>VbQQ-;F8^UJy(HSwroYp2z#-!JYf%{8ep4}Q9g(JujWkEbL}8z=h}M`dGG1$L?_Z(3HP9}QPv3yXa$Fm9_F z8(SJ+yA<06RazCbl}Y3CxWM3Cf^YjST!h$fVG>Bkfv3n=`d`lD$YP)~tpc`t5-yjV zmoQ%iy71@`utV?R;1qCDt{nx3KjDZJ=ywDioYckidj9~J$Jf#(m=fi2_ifq~pKNSW zclL$|rQCwi?;MNiC~(9jbO@z(9gIx*o96|BsZU{Ma_+*FTQJfK?#?;LXE2vl=X{29 z=3u8%8dGta6ErLAokn;ICYotm-518*=hFBb=D?H#u7oiqn6jh;O5yT>5Z{P(vUG7y z%cRW@G%mwALCT8#;4c((_$W@w39rIFEjSKV>3pIugN}HxXAs=}VzWllg8a@*3-aO! zS^s7rmPXUp3jB8{$5%JjzwmZ3zvr?!x(+N6H8!~ zV<^%Yjq5fz`=OqiM8UgT?*^eSgK8Z(g>8IS(p zUgJEAsDH|ftVBZYwMJR7NDAGqGb$L1eAXZ8dh>KoC>B}9%Dd6T8IDDGoOEw8DmxZg ziL)s87UMHF7CB=W)U8HEW05x*W!nX2c>7VIa6$jjD`A_@WT^B_{`&Um1%$%Q}16 zs8z8DH+^+Kc0yC|)0o{8TCLc@(z6_jM@^53}s6f1bR%v z9k*EI(`=~mCYG%+%Q>MtWDB3=OAB&1I2WV*sh^1ctE}K%1q$?A*o4&*NK|Q(rN{_O@XPEG5ikqpi)0|%pBqkN3Tl#%=ioXfj&Y|(Yz`v z^(TiH@xi=mEA?lSpzDYI#fVfZ%6BdVQ-c9M)HjT|V`FoZmHMV{e?I-Z<(tpKe31HffOjYIcQCD;zCB;hk@~Km z?hMRPsqgvrrgZNISWEeQ)GPJFz$Xlw#=h~9Z@vVbI`w1U{~jEPQvcz{!&f?`eqzji zv-5FCO~%m|&@_qE-GP~~^YFL;s@>FpmDggW{%Wc=+v;=`q6>xgjFGUn9mw1%e{frYQMV^1>??8f|-*0=)Z zpnEUoth6SE47smhWTrLK9JU<3n=q|~&*r6>C)&*sI)5IxUHpPIu-VIIEH zr}3C$xp?B*Nn5NQ~&`+LQLqAJzfuH<%J*qann)d?YPW+t*hCDkt6_gC>0$#cC%$wl72t zhb?lH#cVRT$$grYMNf>v=vBUcDyj1=X9E+jkHf}z<(s{YSKHTnk{VmZFo)@U3^s$2 zqPl*7Bc9=h#kM?Hrv>BqPVY}29Gbp2=V25n<9UYbd^nC*{q2kw?}2c6lQUyG8_jYL zMhj-V#E{wUQ5|7^nO<_;e)!IKWhs1ah#!GMXY4ov=3F~|LNAC{De~=j0u`0<+7s{_ zx8omm@r;SI)kB&sTW@mO@F zPIdSSXa24haDPFHnJ1*cXt^9!nJZ6*G3cI%V?gGK?A#&C!Nr{wzH|k{_DA6gv*JH9 zEQd-~*E7+P{GpQ7jpm^HEi#bR{qIxQ(^uiVB&&dz<6#qjRu7u9-D{Blte!OIcEK_} zE2|gH`CYK_q?Og1IgWSXdYG&}>{ki*T%?;dkjI0bR;Q#n*L7jdr5@ zNlA@!yaV<}?W{TrHfh20@tw}|gp5h}vN}~G-TchczkqOW>I;8ooQxzacOj1AnP>7j zsi3o& zdSk4+ukMGe_n=qHR9c6gGzYCtEL>rSzPHlTGf2O~ev>lc;+}!SQipzKI}rCK%&{E? ztc88Z-7_5Kfw#gOcK?hrb{NDLOJ}>od%`^UbC`48StwJ7As$XG^W9IG@X!%3$K84y ze>)7Xf;r)Sk2A6kBhG@kr)3@;;@NBlzfg!RKy)Tb+S9GEnV-Ds#e;FWiboCM4lxAh zr$z+5Gtdp)<@QGy0wHhFD2Np{2UE893#!>&X}^Jn&++bOWuItI!c3a$twe8i1Lj07 z?#=E8kzzy_?g|JivHof#49x1BRn%}^BEl73k4?ffv&q@UeMKWvY7ewcF7Pd=PX zk<0e=^D?I?KQv)FTHO-a8G$1i?*??k?96~4@9p^zSph%Z12D$3I|TfA=b-tsvyHc0 zFCASvJ14++^SwbletRZN+)5;}(*h?U-uy2xIcCQK%zOR@Or_cR#@?R~&V#L)FFIP$ zdlTqU*{OjWVTUt|>@Fr>$T8pRmzP}_cmodJ+c>?=-p{0Bc?E+Y`WXk?GuiBKvg!J< zf0~RvXhnZUR)g6i0|`{DcLsWQ_Gmwnyh(>z*<*~^_SQ1?v8Hs66}4+`LQfg)+bfXqJ3 zBxZX@uqqEXBH(?=avfnriq+`?9C{0LIwsJFu7{lGbY>^B+$J1FT`&u) z_RyicZnIEu=arE#CTii|%;P1BpRA&PCj+45KTOnm>8>$9bZ6{Z+6kU}v`q zZbaVff*Ck4I0cWQz5)eLU>Xk=yoRx!QsBYWE!d1qq*~p7NHFl7KQeGx9|ryf#~-WU z_njHV*O&kvd*a3A_v z$j^5Ms=(yCn-%>EMUCTu;F+uzQ{N$*1+={PFfVv%Mg%=>=;5Us5%RVnQ7^+j+h(1I zpF#$`u+2!L^9Lhw?y??KhvjWS-}Dw5VSA4wq*rc);|)cPc#Dj{hJ*{~ zZ;5jlV|yl_N2F>efRleO))8N|itWdt5OwDAKj?L41ocMXo{tNGr&3XZu(xmkM3b2d zv%NcF5Y1-#^Q)_@%k7hZc?L@scDJEN=Fa5(8C-U9 zKdx|W z6;`yL%|Ib9jHx5q--xisv-s!$n-!Mr-HM(R9cV^s9F@ybMeiDcFwr4)K3l!95H`b& z+42U#COXpQaN$)tqln%*2D{8e8|=Ys)q%8WG^dT0Hyo2%w8;qD%SCHPn~iY16Z%24 z7!mL~G0buHqm0yBjP4L!ZiMUo!g8-LBINbQ92Gs@h;(l>j`h*snQVu>hcIDAPcS0e zJCrUfP1L#Gkr*w}6OD*^gD{ImPckAeulhJEda}uLEU&r(VwIVo`g$j0&_z!%zD9Zb z^@cdrh|%6RI4(v{Gh&Q)9ePQ0wGm_UD)GEc^mKbUy4tur?80wF&oE+AUNc(cOkWEy`R{w>y0S$Za^DGHyE+d8;7Ys z`gZL4msv6J3boIYZ+vL=7q_?{^fq@$f4q%e)gPM%wXH z5KrF9OChG(@hUV%-iZ{Yc6^S>I-WrPI?D!Kn#^#+xvD}XD8VPYWqh4XhKSw*~ zokN$EcKqjjh_$z&O;_3RKCFYA1|w5j?Kn>*^Zt~Y;Oph$KVnkMyOU?4yY2W_6n|yA z;KtO0%;+N&J)QWG7^``Yv3B}9@rQ7P%zJ{O$cY~c4|z{g40Gbou>rSIjCA53GNVsX zjCJDIP&`dB!HHkO*q*r(g`e!iT^9RUP6>}Wao!uwdyeJV>cqc8AIy86Gte_mJj;c6 zfnu8zf4T?6ixk_P_;INa+bMQ9@$+!bl=l+F8&3Qv%ocesQ|xr&J%&T0DKMI;b^c7KRZ zC~^aF8(GZzlp-34pPL2oIYnL|{s41r?&{|UB9-h&S@zXv?nEH6h3%Mc#_NPY>%xyR0c3>b2B1F z01gNo^wH61p>XtZyAs378_j9v2{Sia-gb10=#xeSy?fCP(XHlK62c(}Dja>wzLbH! zK%GS2R-j*aNZP4DgL5F>F(PDzSD{^_@0x_7UGniJ$msj_Yz%XAz7qY=WF_}N|~^YfLt7n19}h|`ehH|AiIZ+?lz*6x1QPA zV{#DB<6X1pcSa<Ku_;{)P1zjIRc{4;H@Em?}eI_vrd9UwZ?>574&QVe%k)@F};yhryp=TVqWb{MBj=YY;v^5dlS(_=NPfpyNP115$n7YF$F~D8L`3p zBjSwCH{ue%NQW44xnI~rO<}L{o=m{o0*Al*ZbLDzM+u|DQ8oF|qa4oSUJG2JN2^$Q zOrgx-G#>J1@N8zGf69p8WY7yPk5)LTh|uHh#%Ptfon(2RW7I|$J71u6gWjqU5KD{* zd80AYMwdAgkxtm#$lh3EL{D!7W}#@U5o5hx3{z*sJa0Ois@~+M#yesFM1v8{-XZkX zXflBFXU;}3xuW4hIjp6h&y5#nd?d}Xi?rlRPDrc^->@3O&>)`)DcGqbV5 zh`4td#qW(M^e$zSTx7&BuOI+%nQ6HRUXcO)bDvk^GjL-Ue$%LJ zc7(foM&B|uvE7bLVxQP)!tJmlcQBTBjL-M&$Qf+Zca7R*M~>ng@}3FzsU3NM>I1Vl z01K(pf?wugSn^Dsc{NR)YGv_g;qBF(PRFq~5nIv^R_+@(h{cw&lj6GMdrYh0*y^Qp z_%oUyW)9t!I}1%1Ge>UQE$9dHnXkfo(5=K&5L-iY$m*1f8cT_tw~2vwpa;j+ZDyn{ zFNR|m&}_TQFr;G_@>YW5a=~tF{q3+1xV(CfZJ;0AioOxC&WpWw3wo407WE%{pMBSI zUtx|upeM)u5eLW z=3o?ZdA=Mo$D%ZM8{_LMn>!_nmf3U zjfDAYnzP-_Ebuop=eW&`e>csZ%X9nK9-1RAPwivh(wysZDvfcZ3Y*e^6Ey5MX*_A8COd9og}%*lFxZxFL% z8!^OO62t=La5&OS!2u-Z8ZpW%3qqtCG1|KvjTj3VF~<8F`fV)Th_PPAAc(LL<2-Jt z8_P7}0CO52%Q9lTH)JGSIv6p*J03GxEZcr5gp(t0DCWvo#JJ4x*k@v$ZFabsR)9$y&kP*ro`AH+nnlq^LrzBmAUE+dUvxt zi**SaV0o4p5jPWG>=<)MF7$F)qsxrw@4e4qQ)@C)Wahe9y*Z{2^P1UZSDK^nNN)oU zkg*f(_tDT3yw(WBNk&Zdwxjl9CmT`ftz-MFGGc+Zn|?Lz*)*3l90r9fmL+r>5=JXX4chHWk=cKX2)I!LP?7%@f_Ns{^9rv!- z!I^K<@z4=DK{M+{!=07F%S7pDBj(>>v3G0^SifJsr+&$EiP-zL&Lub;KQgTq@{Yhk zAoj7%c|X^RUfqkUg@!nPV+_0>78~ZD!kAOa*a(MXA>^ISD%szNu-{9^nIm$xm(Ff6 z-W>FD%{g1FSogztY8RX2aNhS%DPvR2(W${(&2}g;2d-vs90qOdKqFRo@l=SZMy&KM z#c?+_&4^XrkL)nh&2pL5=DIvK+u?=x8Y{6jw$S+w`Oi1`FE{z`xD@*c#TGfNnU2{0 z#EMlIKUUTasKZqBF;j=#Fv(*qtc@M*bc0>T7Asb1>cVo$5qbW-ufn&}86z?OQ5riP zorzA7|M#yjYTYHYe%8D|+g*-Mm;W5iLH9Y-ef~C@Lv8>Koc{vXa)sT|C_?^r+Go3W zp$hU}qB+++3l)|BGX3PcmoV%OUaG|1`_VS}uhKr@eumj3|8?5;bk9JJ^WUI-q5B%T zXZ~9gVeaq7SqD35U*vAb@jw3^nuoc3@+kj3nn${o37Frfd8~Ul)B1qs3GSDem-9cO zd9r(W512oud8)e}h0gzk<{9oqD0}{AG?%*T@SXoT&HszF_W+Nhy85_hi^j6tXKhKg z3TtDG0b7>bjSaS%E!mPSOENZfz0$4s& ze98F3>{+P!{I3tk_D1`c=tJ}WnZS0$z6v9-{BJJCc8C218d3hgczl<02Jg}G+=D=` zvtS7V9tk9!7sepq^ZW*T2Appoi}`*D9OHPQfAek6U$Ex{=WX85FbSOEe1cvzf4FDV zOvs26gOKHq_RK`!Oy_5;*|DBV1b*iH#*09}!yKINe2(^)KVAYCJ6xuiU+g&?hi!Lm zgu=_;LjqSh$3U^>Pxc&xJ=Zz&CLl1yvmJq(oXxD_Jw1;haGP@x>tL$qj|kl590etr zkLhX1$-T}Z-p_uXeG%BGRJs)DvE@vzBS^jFzXmrP~Ifqlq8a%TQc+<=uQ{qN& z7=^x$LY%`JcOz_U%QQ0U(v8f+cFqz;$RCcna4tu8!~HY3j}-d}Qq6Mcw@Y?8>3YnEhIWa}XgVMkz6SSW385E%)#Ol#+}z z8HL@gh|QtQ4A~_!=-7Xfdpbqw|2XCvra|fYvHfmB&+s5hojHj0;NH@w+(jA8*!3j$ z%OAOUEjJqn{yK>kV%zn8}s@l!rOcy2o2~*=XCt=KGxrO!G z-fwW1!~NqCDtHO{cC>fm=1UN;FTg1i6LP*iW(>Bs(8~7MyR)&qm6^`AIUPFjcpj5u zx8d)^lk=fhMik@pK+E5{vboM-T0vH1Td;f*##TX2u({!Z7x; z3od+vJMwY8f{VD~$;|8)T+FidTi)W~*l`I@&dM&h+=t89x8hI16~|-0Wv}CTS905L zP3?ySWEWgE4g2@HeNXJzJ|8-3uVNl^)gO?A<>kP!;A$q5HMZdT##C}Q@FY#{Ms8$qUi* z72Nt1LMFM}xWLLJcNf>6THc)~%Yt7pnSy5YBP z-XG;v@Bp``+Ov4fgWR5OHzVf-4{>{jJ(;QPzXn4R_!=s^k|<1vrff6d4C9NUKGRcpITL+`0X#D%3k`U(*eS=G@Y8PCr`C)2#YH&h`InjHJt2+xzJeG1 zkP?|LD0qo!!MDp}UgoynUIck6*v0K^`)u@f1>$oaX)nb|1;619jkWjU_N%PZ@%G{9 zf(l;acA7gEyt%pdr>u}Sx!qjUz?*)H+sUE^7RKAm z+WGdM&^!v>;kmEbt5L@VyScsFeidC;!SA^Jp?w_l_Iqysuf3h|?~TW~e=B^ImH7v* zLHwJyFo^6Hd>}XJD;$AP!H05}zQQm}p@KikZTbqEU`G}F4+HR0pE((UKkX8YM z!c%WRN|#;Dn70cUILKG{8sx9=LI&3R z3cr9IPOzr-~}Fr(ZG4oONGB)gzJ>rh3BFhD%`aOfhBg~ zZr*gItnl!Y}VfYR|y;kS*vQ(i>jV2Q+qP_;!DGVhZbM_Sg!MfWdR z1WBcbyyyWY3`s@#6g|l0+y zFOPqW+rw=xQY(6#+d1|bXbD9!wi{_54{<1Zij8fo{UY*N^lKiIZ+{2@Dtd|A6KxyP zU-UA!C)wrb?TdDCyTE>%d3%M~FSHBLfQw$^cF?{H=3vq5+@5N`0s$y8%ew7{O0aEK zb=%=7*p{iceeKb?*!}~>c!vEc)0c%4r8bJeD*7X@HP_w=5iAlX=REtN>DU%0=X|@x zhi!3kF0i*j=@os*6(+`)_P~^{@5NaE}0F^A_zfIjyP)~&O4Blq7mXJ>2Ru{jEY9d zo-St?I<%rO9?Dj)b0Zo<(Krbtor8H7#-TXiY~>}#O9ES+i&)PSByg1TE`=di0!KUD z%t4+6j&UaQ7V|w6!xNlWCn7Lc_WaBmeLV78hj?u>lh#A(g1JjLCuxrz4JYjZECI`| zM(yVw$ZfxU1lnlsQf_D4A=F5&sP(b-?{HFXIZGhl{sgXo+={obU1)j#fku*B$;(W- z7Nu8{Tg|ykJBnM)t)Y}!_6A5)ZY{U7?dixv?n)!QWhL0I=XSnb0qM$J&F!FF9mMt; zZcn%AQp{b;?NXa_B)QGpUTAajBzGORmzh@0C;Rk9Crm~6d0lRer+G2_MOUNla#xB= z&~h$gZdVyMm-9U&F}F_kWINZPigN44{WQ{f2#P3ojd-c@oplhv+y+Uk(3u}ZV69YZ zl_Sd_8s(fCXANX3w@CucG8LG+PJE;r9ht>HSln(AM`rO4kwBL-fK2BeD%VLmqtM0W z9wvbSXV^ppju02;G0wf*6OzCQj?DaTl)x#@3n+lxHctdMy3Ogr=smYXyms52XCW84 zof5dhX@#cA-6VmltkImBXZ*^YVdS%FCoZ(b&d& z&#HlbvI~)f_iRR6b_EYPhuePpRfvW6XWY)VXCmX?pL1|F(mo%p!+S2bN7+agW)HVV z+j~$!pU>?v_E$XS0&b7BPb7tTA@GiVGcs)i{=XY1B+o5 zc+Kjf8UDZ`RH4@_FPiBO*sP9A{~kuzn6gPf0#+@&^VWYTjohbc;W*i}m@ugl_W(Ze_W=ETKF6fdl3v z^ty!Z@&~SGDZME|LUcliUiFGA=Wx%zAVKr`CDH&;B| zulobHv3X4Pu7ZHS$;E~4mwJAKGn`w3a6puc{xc+l2RvY4^VDYh@$;*%&*RB;GFKgGZu5}CoC&=CU9e$Uy_(Tb0JAAgX z_#_F8lm)oOCwsU6cdRvT7|fWvJjGXdiYwggT_p!v&cD&o7GJIDMWA_#uhH~!P>;pe zYIY^JAPjF1_|Ul^C8W}H%g#TW)+KXl0cB_8H;b0?Wqn|QWf7K znVBxjaEoshk+{h@3ng1@+Quyo*H{(bE_-fs&YFY39a58bIB%nw7vCv?JDuYpDaCh5 z;4bHZDG2;R0>5zP_z(dXz++!xkb~=1kq1a50 zJ?whdtsJBhbs06cr6+^?fg*aK8^&DgE5p!n6z}#V5a(2* zF%|z_E^awvya>E2dc^N6;Klz(_F!exS~U6MKY5tWgd5RtvWq|S+<-tX-{1FzG+VRS zw)jgq#cz$A$Ljox=WZM|+9nA!7mt>}ubdWE&{!|^!JC1vvJe>OW!oI<3B1cT z81QoT@iA}Ue)OBg<0bTKZ-CR+#ksO}<4tcMK&j1_T)gcKR53JBLhpD3(s&CbwA&ll z#(hPyg5^DL;1kMP(2EkYKJo@$Med6CmNY-{25zMkl*sk|7yDQ?vm}+Ty@7|guT(<+ z^aiemxmH{zp>Mo_u}ct|Evfv=8>nX~%#nTHc>}!+&GphH@x3>&gVi$6%TI>AfB`lH9X}-Wj zs)GZ)6rXLrKn(qPv6+TE(--&~n@Ob{d6qBmFGyN(m4u*uM^j??0tJ!mQI_{BWOa}H z0AhywC*tpf&B*lJ;1!@gXaPSW;i9dK=4M- zT?mv~lg>ghj2s={1F+^9+3|5^KprO_E!$XnkCGle;RZx!Bj?QQgyYI^`QZ7UB}m1Y zjWmK6c#g*bmUBJxccBFQ&O+$-;6)P1c9PQ&xL5)sWtlhch6z&o^#y8N5~cv!-;(8ez<=N54r_^ z_}@K~@3a{1zYH;xs!>}5_KT0#pfvu1+qGpZZWVR3c3Spt*or+idqw+IT5x{*3g~S6 zb;i%IxoFt_Ew^Xd>_+W3xLsneMJu%5=JqU`>&R>wqnFw}Ja_k#h@WlGW}3g}F>_^n zY|D6ko{Y?UBF==Nl*lJ4*sJ&QEx2W>rtEa{~jzWzS0Iv&9IQq4p~0Ae5m!N1h?5 zbM8lLwC76TFvkxI++HTMC)(vYhL|^tji4$=PzT|Uz zTZ>r=JmF0@^0hJ6;)68u&u-+IdDfDRh+Jmw-iNPNLIXUz53+iuTmD1}Ia!w>@?1Ca>#^2iG<)lAMBeB|o;l81JQb0@LgYj4HAY&C*{Q#SxLxjn z&*4DauJva`{?U!xm1iw(MC5S%`NoZWY=X6T10sWn9F5!6Y%ku3xY>x?)5Q6bU*}t8 zl%py{x-v8KUX-{;G!yn%)Ipx@ucQj?a~2w3n{(g|xId403Ozi;L?K;zYyuJ|DN+!)C0G#2injFBHH+xROSyE};Oub(2 z9>szBp}3udNKD!p8D#xTN909_Jk&%oZ;NLm?smk*GUA{atS1q7az-4h>@CDyA#rPQ zt`Th{%iH@Kc0Dk77pt!YyGA!z){7Y_^&)O6;@;1QqfGCQxUVwejzJvt(r^@rE3v%c zIvnTLa(O2#XU{z{?7}W z&c?^Wa~{i@?OB@z<4Mcy*Cn(0v2PX?s?6dUI|iR&dE|_7?inAZ&!E)tj8EJ%rpq<- zj4AFJ+tX(pr)L!67G~qy>)CpSSFVAZ<*oaY_omPIDdNt;HOk}+?891wvhxvn4IX>nIVHJr_sw@5_V%`aZfRV5 z;Kkj~l-=~)-oCq@J^tWF|2pEmXIA|D#@E-jK5w`0v(NZbbMD`J;pBpne|68O4~$ya z)SSqPK9qChmXcpRapI{n;^$ud(WBR_YMXRZ?-{F}xOQ#VvlBl$_m!#kCBHp&-sr#e zUUlTy+{dq*nBBFYxURou@B4P%HTRy8g^O0+^5*I_&u>5Uud$Mj&rUiAU!uBxVEn*y zr(}DdJ@cFIANkp*T@Ba$VI?O%GMrS3FFVajnVvrXuhLw zRVl=2{5elDntu?@CxvVO1`+Wd>Sc#8f@;>Peb2#QV6uA zKRBPR{Z*IFg4)lY#AyCOG#5YD?kvNMN3DmQf|kTnGcml_>0ysBf_8;fd;J*BFnFnl z^_UOQCW23Us5_;!WHpXe_u^P&{fxJ84i%`mtGeh2M2ef53e?=w%1Z*c$U{pP{orm(PkyxrxjXi4`?mp;a%~FF(37B1Vzk|NoGw*Zkp#qiL)swoA zRPL#AS?W=Zy$p>v_Y8@pCN;6OaimgI+ATYIJ(oR)`$@Yj_~2O{JM#2WCb$5t`0wtd{Q09^G!p;%m>G_ z$KXVW2El}K+|SC7$g&t7nfZm>Wg?I!f4F1%7ZpL1mo0sSDjg~LP%h%=e(@A0OHhm~8(^N7en8Sip zjwD#9=dlcM%_2Qhi=>$MZtiRkEjhVbFwYdD1Sb34oJfjO+;7(J>3-pUYAUO8z+UM~ zTGq6T3*!2Fr-QI}Qwhs;_F-AG2JlIEQ;G}*CC&Y^QU!})NqWE8JLEI)gT7>6qG#fc zy)dotsEE`7f`usMQvE8u?k#gaY>%$-rzc_2O#aU~=`<(vGxLK|pF6^{E|0|y$F`d; zFEhW$Qx@Qn8%7)~H?SbfDw7PL7Ruz(izEiA?~jXG<8VBBSoiu&a)}9CP%)9a4j6$J zffsvV^T2ebc@Il@tw!Vn*OG!q_?kzm-JjM~-=JT;?$d4L!zZ^^Qy( z;oE zR_T@GGTAP>lB|;L*{Q1qHBPd*5do(4gFHitGCu^Z?u=`})G)@O)j*?dk?cjkoc=+j z^ISsj#ogz}2BW3C-2H>D?H+-e`C=MhfhkF#yby9zAv5x~4Z)23aWCy-uT^#>X?Cw; zwEN4!1~N!oDx1y3PW(3|jE&SUh%F{XvY4~+{eZH4vcI2nB|`^FOrORuR3R}5t5l9* zsA|wL44I3rb1#alATssKxHZ-#ZjC^1&O8$=_Q4s&C=!|E&o6)Zha%4(tCv4kBY&(C z{#Y*j@wWM6s_rj{jn(+S5&zxuu_@!){XyO+ZzS{g|L1y_&=|66psT!|Z%2=^Joq7P z{P+C#zB&3|_?u4 z-v97qJt2Y*AV=egS^Zt%o>XFZGILfe5sChPOe@^mIjgrToNSB5yZ^&nWZuHUvPJX4 zv)cN*I$Qq3vttQ-b#~xCKRA{M;ihJ}b^hNGL@B6QZSiO{o{YIwhooD(6P<3bxx8^j zb#tguD@%jr_0<*Sv)p~nbu57LS$H>SXKPfyi6$SlXl1kE+w{A;x}zl>)C;(ews2n; zUYd`O!Y2^tLtG*m!Q1o^fXZkICpueGd(jLdalD9M4@Lt0o%p^ezR8TE(NZJ)P%Sp0 zojbx^q0ac`9)zH_7(yL|dJ`dtS7$O7Psg|Sc4B19qfiO>DtMgvMg+zgQYINu(94NU zEq!fm*p17{_d0m4WTdUrY%#WjxnL~BG1QWP4Du92$j1aSw(*sK^bUShz=RUXuzXrK zy^miYFd?}!6li*1G>R`occ;U6x;h=`O>9aB@GZB#I6k7Bj_K`>w5bQGN9DoyhJ1al6CKqv+b z5vKdbt@Oo$vwXu#eEq>$^Cr)m<4ctIMwj?HOMH33S*0_|N=s*z&ho7*@y!p;S?cvd z`Rd8OU6vHRDCx`rA-`V~RFx0<2y2Q6f_R9JxGZ6KGuLM!w9bJN#@ubf>)8h&H zrUo18>KYC>VAis_y1D}!eWRAFnl~uz&vDeWvQ-uP&Ym%2a@j1TcDipRFK|o{+owv( z+m2l_cfYdLgU;LT^#rFMI=i$xB9ZevXX=J=XmBGKD{{ZW2xUC)TN_2E0~_G)1K@IMOtuyfsUjlpW$c=w?@r(*n6NnIwDtv(;*9 z4fixdHKH(ETIKWe4NaknipFSrMYwenK43uQ!zLMuZb_N~W=t#UEQ#{M*G(*Z(Hq&~ zxe0u1KGp*TUKQ;MZ>?)+s)N)tql!^v-MyAu#Z<+Xe7c-P8MP=ytV^j~=wFm&2zR~7 z>J7EVdbgSnshAHzqab_wy1Gg&+<&O0Gue%LiTCxmrQcE|U3zU|MGR%#99!4Z6$?kq zN7E}RSBGj>FJEK1AKM%VweTtsB>AX%MN?C4Rj7JHW|_-HLoD$hlPaXvSl-m!xURB! zU1PO{7rKS;ITx!_I*dpZ`QB_~8{*v7*%q@RTYJLYkgnE_O(OYmtEsYlb*OSpeM4P! zbF~El({ICvGOt&;X7%#g73&(yn`_sshRF8zM_Q~%H_EFsiH2y}7qxk3qE)LN^2D~l z55Jeqhgckm@<4tPXw;?^$xTIjlJQPP%BO15H;epsh2!nfUWfp{6&`QpeI@!@_yL<% zSRJ^-wyrRQc}uM2NRW!UKxa3!e;>bjBTC-XtK_q- zv#TrAF&ib*9kH}B*#<+Fw5O_Q8;XXnJqq_iQQ*<>)sfD`!qV9x)7Gew@b&tJrd7x! zRKr#+-SllS9UNaa5bkQn#lz^XlE{A;4K>96-^d$YWhlv`zP4Jg=f>sD>w zR#P>qr>ea1;81y0c|&t`BdQ#NAh*@Hq57bD3vH=d^l0;d2z|xYMoPW8B=XYE7KGMg zL7wB>Lxs~HMmHJlX@yo!TF|htLy|F5Y_5iAg^pGYYbv`JiWc`Z5Q!#QAttmrVBU5f z6}8wuqlrobThUOvCRE$FHne=*YH51t>{%r3Xj$D>OHF5cM>L+PA{uc&O`u@w$O!~wt0nzFdsnQ5_EQf8y``?RXHzYxMQS z+$N|CBQPdiUAV3%5`~3>JVcthW3gmMG_q!SRXxjjcBnlb>qGPC>_q`v_2nB<5)*Fi z4s}P99kGbDxerg2;mt`fInm4FqTQX5NY{{-*b`0m$Kuc-RHUKC=1^r#`RdixbwywCEPPps67>&)UEZ*!u0GLD;l(x4%TXLG zs3_=_I8_O67~P538C|iS_8?PQQ`wBM3Uqqy>J{js;>q$51g46O-!#G&bVul~*%CKf zo0;U$;_pJA$AodI1bTZkMbrj9xr{z8iU#ZUqN?bnPwd2Smxg24~T zFs<2@hE$72-HJ{L^~U;Pl$llqDNaz4w@B9(Le;Vyx4?#n`ii3`!GX~p*n!Dd5?PSy zq(F#Sx(9;!vvoa6`tBQ`IV zWk|)ZI@}xULI;tmZq=6}j2+>GQSqXN&<(;yf-TvPl5=e`O$H4Rd6hP`Hr8YmnS^M+ zhD0;}-@USHm_Ttrfl#(YS*5BQ#$TczPKAaw>#G|fVCCrUo1)2@e$;qPxCc!hGT~RQ&2+7YpgJo6de>+IXrExQC7DZHW@X@4+8$k z%`|nuB#2lo2Zg(EUCEu*qRlhBg+mJp8w$_r>!FT~MuM$41$qm%18p1(&!kcleZ5e+ z(1#T^eCq)0%`zY3q!3MXaj+XjfM=8kH4t z#We)g9F9~khb#CWtBveLLiYV-F~_9+*rh;VoGi$Tbd%~sSVdOma(8O6N5x?y!J*@Py5&YjJvmX-(n0#GQiroIFV zLG2h*q!yYd^Q$&SFU}ccK%w73bL?!x$PNy04wOv>WS}lK2l6Ue!*#klduW~}qIhSz z=}TK732eKjc1$xtUDJwI!?QEPGr>MPkr01E#d3}rj0UTU)}qv!`s<<*j_{(%7Whm1 zl2KS>EFsAi)tzL+cnG${tmXS3c2K=&6>0cdi9Fr$u1Id`-NXP9Te>pZax06|}Ta6>tCoqqVB8nvEvYiG=Pd z2IbNUgOS$NhNjhx7EB2^LwF0OI~V5w2Q_j>EzvMesj4q$L8k9m>Ol?=U4{y5*$TtK z>VQR!Q3WN{vJ0W?vUOSPhM}^_jkhN~0-_ zB-0Vq6@{agQk1Z&no#j=ooFJV1V#_yN8uq51=ziENEc0VQ5Tdwc9korS<0d05|(LZ zs3MX5mgW6=vD%)7rg}44ZN)@j)RG&5J)7AJZ>Fum77IUw2mwr=D9i~OSK{NOaI0C- zfC&(^WAwKR&B%@YKNU-&3!U3$mn)`a2%2@K6@t5J&Z@>+GA ze!{@Gxq1bBGf?L2eo?%=nBVNeunS(79!O_b7Y4(;dkm5>b`cq?>V);wN-fkYS_LLK zEH_#cGU}_VUA-z)1;1TobEp}Pr{3OBHwNy!BdKFJ>UylohIO#;RSRTVh4tl?82?u_ zRyQ?KcNp17d4Ak+9h8Ge68|LdPAXbgX{!_!IcGK`C*^=|O(te1qFoq181;|gb)=7@ zJhA`WKEDyU<$xISYRvuKj;*F65tYemHx^vTsDKE^xN@=#9ARKJ4y=KDN3~#TKyUo& z7*0UT8aEt0ju_d&6qrAk&K5K&T(}kfKoq!M94%PJ;8JGB(`UuH;EYC#Dz9&-S|=uB zrdL)5G|XklIBs3XZuN2~Mi@n+nvfDr2?&NdrBU_LgP^j}7--VuObiX`!>zSdV!T(2abiq&w5C=x zz;Jss#BZm-Vy9t^Day9a5R8#lt7Q{3uNlG_-Ke8glxZ6+1X!J2Xv7iJBn@Kv5qn$u zA`w{Bsv=V}F0g;Y-S83^5vA+aYN7uhH5rf55J@X8wa;-X(rm|tAk^qS*a%T_F*Hu? zq%C*wtggxiG27~q3p&-1K~5Tp;{tuI@yohbLA!^MN`nP?z;NXUT^IXgSI^^{fns50 z+B0kvDJRJf?$TN({a0goJu>3fM`LnLUs8t9u{hMYI5#l5MPKNa7L^t%w}lQ)Oh1Ub zx;q-?n9qv$_QONEJQhbU$jO}4aMCz%6Br|44Zv2_e^A0=V(LybLzzr79cM$kDJj!s zrj+9P-Mu&Lwl zJHQVTQS~q9vL7&oA94qrqVHsO4-Gyh6LN9!IP!0qs8?4bG}VV1nq*RkQZKjePIH@X zXV4st3}Mhc^ja*`s_NyTgUTCg%PU~tqOa#oTfKBXu_9#Z6n%|p@$fxH>3OBuWVyau z@so>P(9tg)wNd;=Iizc;97V;h7n2{NT*XrChPlo1NsmTSwM8EoJIp;W{H?#^(D?P;v{khKo8v8lOCIDh3nWQsSKazx<9tr%=O5kl87 zLH}M)6hl>5m|`nrx)$A`qV(2m^yo@BkibfgM87M`ycILDZX9TYJ#W=S;^_9RmQV*y z2uCvW5p zjVox2WHW=3h1fL?&}~!R)kXINMYAQNqGOZx z0JJoF`srWljwCzKn$-FfClY!aqY;f80#*y_+6*gDcQXAbqXjshRRqzwi)SA86MWE_ z-sB%>dzlZ~V3{t5{S7XM(S-VvQc6^Nrq!{^SQv|VFxiY5?M61g&IFY&Ev|;9201%{ zwny7S)VMXMy+Y557j|6}Z9!xGFqKd_{3g6nDL$BPW^}V^IaHs_9#9$3@|4bJdAKVP zE$`~Cgp&nwEbc!}8R53k=AeudTi};q=Z=wr)!?dGlw1d_Tdjcl+Dh~r7{CqcJ=CEh zl7`j{Q(23Yje#{TZ6Vn~GdUrawamgxw&f6JLp1CXYwL>jTglec z>~X4}PkDCeJk&1q$L?s5SI2mvVc*dW-OGvPwtgmLtYS>>u@*6%UcbJxCxQ!8;knvJ z{Dm0oq{gCfwHi6+j5-u3x&pYnx)YH;4%(9FctTVKoKkFqaV};9$62%(;9hc_N-Z_( zrJdt?J!U|;5ch+eLK8F(T9eUI-)q(}&>W0cv0p&?kxt|SLl5+ETGBEhmpP}%+t5*( zx;&eVQ#NB(w{gH-`TXY-5GHszvd08X3~MZ#2dbh2qLxe?;LXEqsCDVr&QdJm*vRzMC zeM`HH-O!6tm%$^c%V1hIvEVq|Fzv*`n9Gc_=~ZlzR+Nkzt6S<&?-s+I!Gk+@esz6q zRdbD1-PjPSt+tle=y=-b(G}<>Og})Ex6IfZy~E*;%r#fTvs8(Kgzp{ea5(fv0lE&r zUbYe_4P)yY2PulXhFALXPZMNzwn~d3oj)XRbwy3mWXeNYBaig<9$1@=A zT=oL=ou z!4)ggS+jUMV@5@yGwP3?ern+83Mdwff}&&9<}KAW4CV=xG>rV*k(B*?KUTfC`hc0#5!sSCxji?*4D zB}G5TgN}>AI}(${Ryw$+la3u#3^IX)#dm_CB)e-WTCPDtD@9k25uP5y#;9K8l$FmS z;)oK~yjlOl(nu}2ld{a{GoV&8tqLxelit+a2-kKQbFaJ-J#Fpsrq$xEhDSr))tMfW zLCc;vZ^jnGVVj5!$|+*Tzv5U_ClXX5GAu3=S@<$|WP!Ql_Vy@e(YV3_U0ag&&JUEo z^bUip8%$xqdbFD8e_GCkPbgTqb)y*JO$&+fz}Zx0ic>X%ydEOsYM7bkE2{`vF`z^* z#f6ST%_A8;%LvIhVIYg>b?CJaUrwrjREroc9L(^g+mqCvWRYWpT8xyd-8nZ_w<$xq zFJrJDb^OgVv6w}aU|hx%CKm7@Kn+3oEpulP9i*vEm9gZ}txAzTchn>qV<&1FzH3QfJ{c>f*imyC zU9BiaQ#){xh1@lrEjshl810TFqw8hzigUQqIyheh*)XdYXs~gA^%mI3Qsjd^JrC@Ycc3>nT)h;*YG z@nmsFqfxHhD5H~xj-PI=*OWR=&(o#FGxIje*EQEvuWqibge|mYb*O$#6(%xZvs!XE zX6-uA(y`JNO<%R5EYkh4N#n}ORn&{PJsb|zCHAp8e2u=!P!o~X5M81ioS~FB_`)IX z7)6#~(J6xprt7O6O#?+>I)F$FUS3$@?r?+i+K_dfF^b46KV~@bTnL+a<3JO~MybXk z19)i_siC~&)3hm$u~Qeqa-}$|Mpj)kBwfB5pS?YEVF(Ri1|@=;G9_>BmP>Ed2WKMS z@}r$Z&su1(A6j~Q8tfEpjNUmGF{`&^HKL3Tu-3XIR*%s=S~Y3`j#Sr>NZn6rst6-o zW7rsPtC$iv91%{s+IBr$#T9_9lGYe)QG8Gqc5~~ zLK&}aj8s@y-2#)uEZ$4|)i9AJ<<0(!>cNs*L*gRe@c}bq&;rF4<5FE&KBH?(xsqBI zCN=14m-I{*g(nh=K}m7_w>YHNp@~EHXZWStI8H+C!CP=tRK&MemL6gmABqJY4SMUP zAIIPl0>v3Q_LR(7f&*Zq-ME^KZdnfD5~geBHYiRhO@}FrSIZsSI~o zh=bW7i{07l7+-RI?FN}<6TyeF%$T`MD{owhIplD~xGJQURa0VC)vR6M;$moYSO1wg z`^GhuoLhiVE^fZYfMt2x%*j>a@-*kI9)ZN#7w9wM1N(2tnc##}E#24{|Kf0blcF(- z@|RT*sM}sn|4=sDMTw-^{UA%Cv!AAcs}b2ujoNp+B^i?PK{pC_YF=X?w63Q$kwot! z>oqazW$mPUrnI|h4vzW19l#iUK%_CoW46=!6?ZS5Vrl%+yKa^X^v9&U(Ka!dZr-q_ z0jihEhoj^EcmsyxGBa+8wxPAp`6Kk;SS9MNnMWbfra`xilEqV5(Em`6k!EprsO(6K zdLkLDj1b1TGfA0Fz&8!h!U?YQ^)n?sq zGfey19{61?wPvCbnpg>A$zp{B{0^qcm~k=JJVQrXgVrC*jAJOJ^g}YW*NORSu{qI` zn;A*t>U7J7Q&i|Y#E((I>!jx*WhyS!0x(6yM-F7X28RjP#z;TnnwswL5l>?Fa`iMc zf=sydhcTv%i#N=S@YJt-Inv%qx*1(}BCgG$>8u|8W~z z+8n27NEUlysD9JDQznS)5ZgH|nk;d+4Pp7Xqf}!Tvu{RX(t9%FW?U#eD@G_a;jY2s zdL7uINW&3~QUH!1j9)^Ul-V@qh*29%6)Q0|TMZpBqoJB$^t+3(Tq$?etQFpZNgvL< zaMB%}0jy`vh~ktCb3s*sDFAss2^vF&UYH@o<=Tull(!-+UYiWuvbrc9(jq&=Sqa<5 zb&gA!xy!3k2Bf%wxSqBNjnOQxY+1hEbZI}P-^$!!daBxWAu4YPcMOR)51e8CT^$?r zV`4%oof;JqdsHx{vs+Zws418l^7yGbYT?CD!?~6)d#$OO-)lh zp2vv0mm6Bju=zsJkw%^A6IL{<>CSPN**DRdCw50wZIjG;NsDSQjTRk<8IVzaFnyZb zT3>TiZ4XSoXdLSkGs-dD>&#Bq%AiN!D4tk!gz6pSaPR`l&^$;YGBS8f+Ky_0 zSx8$z7I#p#qzytzHV<0aV8m0jm>ghM7s8q!^2FGn1*>Mk9&S}uW8+yMW?71ZQc|wZ z1&ZS`vQ^ZOF?d}uv&`ffm7Wg$v5r&5Fy>y&6d27y89A(|TT=nUQyy)@pt>_sflgD_ zuh1(6Un%4Z3+&~A5%HYpLxbq(x{SpO6^CZd1?Lb>PJTn@hy$snr_eA9w=ZRxh0EA<^=gVg3@`j7X_#DA#U_R`veayZ>*mcq76oUv^~7eH7YJax8y!2QcV-#`@qki9xpN#d(KT^AfwSA_mdFgFy(edix}B-B z!Z?W5CGro=AGbE6a%8&6ZM#w`GX0w>6+VFn5rdY2YvhLlMpcATHRoVv47MMhQb$p9 zrIi^~bNrniJhPVJyHA^ld_G89usDq~pH;9{R95aEoX(nQ#z-g;#7sgE^$@JqdI&Zc z-*zmX*yq1cb$nRd`W`>Lzv!6JBS*;#Dfvt|e|%X-`RK8y_)qnnhA%+i<1FbPU-(fu zI{OsFZ_0V;snJ%&2n(;1Oa1sFk#e(tP?~(P2+};+e~Rx^rpY$~x<9^bBy(Tp_4opk z^3nO`Ebpq(%y;Iwd@+e$Zv(Sa&ex%Y`L+$qGaZ{*l}0-2=U8^mu=?R%$3NaP!IS69 z_e}Im@)Y~=367G)*6w7u1x&^bJKQbtx0i?;tb`-~610*MMwYNY`VnO~_yC*JMD-0xQJpk&V9rkiY)DL4|9!1?0aXqVqjUJtM=2^zFErHyZn1+f)*9lbO zfB3_z-1&M7z9T_?bCoXSr3VO1#(y4%7hTA2=yBY~-`@C-S5o}H9>1{+D(__Be^nQx%%=GYTveb)%uq&0`Y1qz8Zx_-V zi#Vo-*LbATyB^z_>HQvoZHRM!?)_ekh|Kif%g7(~f}6ibv7MP-2NIwjaeq9HzlZQY zGreW^;)^nfWBx|tznk8>*v?FEDg-CD`6&rX!B&@xI;kzQH!rqpITX z5TsXOHsvq(@&73NA>H409QS&Y8%pmRj)O9<`zEftZ9j9}01kJrJ8?*Qo7Y2LxKn@b zwe}lw+|7sLz1Qwd;#l{%y|Iyb-Hq>IC-TVq&BcHBy8H~Odk&(li;l3Y25#uj-8X+| zdLLNUG91J7sPoW8HFC#1)EbAN7nwL{Xo3hCX2gP7hV{CCsir>Wd?n8x~$WnJzn z5ro}+hYm@v;lp%$W1r=ww@K40Wn%dK4X@x?vBYfiFVo}yEkll5e2ryo<^lS1k2_h9 zbK`Hrac{Z-kk{pp@7v6*k8Q{w%VjG52l3y{AHKKBYDyK^Dc9olh1l=@uv>oP@E6CW ze)r?JtK6N4bvMZj@vv%cMLFYQdm%oE|Ge&4{Ab=W)BE~PytynR!c7l{4fij( z&)n%t<-)|`(~6n9alMQSV2=;E!CP@Me#~9^=Y!@Pygx$_aF`F8aPWR=#`Mnz%{F*H zHC_7WgXJ}NKQ&kShc9*v**{v!ZhPtwYNqthhrNT-V@aofKFdi5u;sI;5z;@OH6b0q zmQPx4I?6Z5+Twn;ob=B($U5ZyV##kh7s2$w*z$=)q@#S+9_fJWpCUPAowE;hP+$9I z9Km$U@t^yT#D53%br9(OxIf|sK!(}Z@p#ff{jpzif82kG8vq%G_@;ggKb#7g{kw*Q z|2QQ4_aWgNUR-}nuV_fPY)E*;knq7n!mfTf3~4!#w_}Fv=f`mw#Xi)5yj?nE|7}CU zj|>U#8WR3sNcitV!Z{gDj`vqQBwRKmykbcB@FC%Dgn5ablK;`x$wT(@Q?Kri*SmU1 z_?JV%{DPtT6Gs1FsKCg<%LnAl)LKyP&m2I=_FyMy>X6jzTPh~?Bz-C-J=wr0F1sA$ zhDjZ#?$V6;wX~a6JhYM#9AzAo>8SKHTq>7fCvZv0uiGN&Jxem$>xJ{)pE)m8~C?u$=pYQqhX% zPAP#O4)mB}=1Zg)PA}?Uh-sMfjMG(%68>uVvlrUYM*Pp2%r*w@X>2mGM8htboM}cU=U}i#8!-n4 zcaYo%?|>%Jd9WSlz#is{NpldnoSbP{t4Um}nZ#S+nQl%gUU*2B8M}q~ll?G|*wg3W z9jojC`Qblg!OB^n`NhBs|EwIm@>bH{U(Z{N&o?k0H`7HPfVcFK$jks4w5$`zrJDb8 zGcL#hH!vPNO38jJrvjgYBP%UyJLs)~O-7E#mukss%eqO!w~@%qT^h!)0N*dg$0szL z1LoA?o#V=4C5lkuXM@Ekd>i!U;;rXo0l$K3NXvm?zEatXKPW28i^7?v@w6$qpXEX# zYr;C^S|!Ve`&*U0%0A^u%AY9DR$ivOS$T)@0p(N5mz8fT*zvR1iX$&XRb>j$|sdCEBSeHUjI+Zzbe01ju>Y4Pgl-U@^cP6?+|61a;x$b1&x?`01j)sK!i9N>8SN?3Y32#^4to)_& zN#!o(@06b?|DhZ`#-vlAoUWXwtWd5|wkhMvbCfqJ?^8aZd|CNtv-j44O0**H;!P_f=LY*D8-tb}P?UUZuQExkLH1@)hOplpia|`vl~*h8 zP(Gx5PWhRVpPlFRv-1rnD4UgGWsmY`I7$~%=imA_K{R{4SQ3+2C+IT-u!`gzK! z$_nKg<)O-UWkPwp@(krg%4?N(DxX!prhH%dnetm@HpXDg&jjTZyOjJuIFCO~d6n{Z<%7y+m9Ht^SAM4aR+)_{1Ex1YIYl{3S*dJL9 zLS>b*L3x<6Q`x6HQF)f~66N*EyOob9pI81?`3L1^%5RkRo+e+#%6*mdl@-d>%0rZG z%DD14oipH{xA zd`~%SFO!e`l#7(hl}*Zx%5LRR%F~tSE3a1Gp?paBobq+$AC#Xf|D_y0&EzLnxu>#J zd4O`Ia=kL5+^jrKd4}?0<@L(Dm5(Zat$a)QKgz!I7%4?K&Dt9VhRc7yFt`}79 zr<|{>P_9-UqHI(0!=Ws%S(~%0DZ=Q4ZVBAUsWuNjy{RwCPg0(v+^)P?`Ag-K%3aFeDL+yEL+PJq z@;6RdtlUqzP+6^PRECuN7&F_^R^@5R^ORR9Z&yC3d{+6I@_prJ%5Rk$=bQ95Df^Yj zDo~HclN;y$EUsM~9pZUtYl(UsfmG#O)m7U6d z<*CZ^lvgY7R6eYHLHU;QPs*>9z5`8u#wqtu&QvZ|)+*O4qsoNxMCCck%ayk(A5cE4 zd|mm0@=N9S%27*Az6zB4C>JOjl_6zRxk@E>+ek4_3A*lgbm6mnd&k zKA?P7`I_>5l(Upel(ou(lM<#Eb0m6s}SQvOo;l=3&q_mrP0 z|E0{SGWp6^PE*cRRwx^kM<~0LM=7@{FH~Nqyj%I0@+IYN^BkHYr2OP0D`d$;xw-mnm;l-lKd}`GWEd<%h~ImES2x)Tmr2_fpPQ zE>+ek4_3A*6Uq~mXDKgL-l)7+`GoRi$CPi9xXuS8)^_|w!~Z669dEtaKZ-=y(eOla6xLEI=O}BG zhbeoNrzo#fKB#<2`3L3Sl{u?T`UNENH;o*FXKOUPj6{B_HQbvRoY zui*zY{Dy`<)$s5&=J+BK*O{%XBys(fq+?kJYdAvU`kfkoobo*7P0ELrUo@C>zEzG~ zYr=WTeU#!*YAN7D=2~m~s7-g|?igJb$?kqVDW`q#kh!DjqY*w}@ zk5nd<{mO01GnE%AFIC<~Lf_n_ykGf{@(JZL$`_TdDBn@OtNcv)7v(p~@07O3T#wJ! z@Vb+f#Y#S($oTz~OGxOgWlBD0!|*EQA<83^QDvucfJCA5c^mR%<>|@`m3-cY`>$2r zsNA94seDHHymB`=%Cg>5{z>_%@*CxMO51CW=kqr_Zz2g{C{j*UPFK!S&QVq?WqmQu zTdU!9%2s8&vQN2HdAjlpG1g7N}KgQ z!L0XZJIGf#2$HDB=_JZsS@q*Btu`GpLFLFH7X+m7J& zlXfHNBOMHjCEaBt@&R*H2=hYHsZ&aOL%yWFfg2c)aym@8kwiWt%5}I$-sia_uJas; z^gkn!KUw#Sbk?F^n9eCA&W9?uyhU0*I9BqFu;d%*NInpjd?39JJ-&-Xx~FJ(8;SI< z((rX8uJf3NpCWNRKJL*OD~ZhtnjhXMGI#!**|X;@2nI_f%KR-WEuBAqelR$%Y|fn7 z62CF$`0Bdl9uEXse;(9gI)pW`=gN*O=AAV>1lHo`li&@ZMrq~ zzFlA6Rb%aW-SUS&8oTU-j*TlA0~>Kj%#J}Z3+|h++`iO0ch}cDYbGr}p<}=0SFP{_ zeRq{UybybKef?NQ?81j3gGlqLnkB#ROmVN{tqm;4wH~$}{leO7tf%(-e|-0-*^WX0 z{E~ma2SaYlb6y#qzTI15Qh&VdxhPFefml9|UB4d!mqReUMHLd0%|$dmZ`QkeBCZ~V z?%nTD?(h!V2(k6bl<3lK#`v=)O+(Cj^akGY<0WPoHIXkHqJX$*Gw|ooi@76vSm{h; z&7Z}WC{%^(RoAqj?mS^q4UI?7?z8aTX6f z6~VFGF?t71qI#Ai##r9(a9UR1^@thASj0?Sd{ zS)08FEkaI51dc>8XT`nqaQeW=z}d`6!n>~8vc7f#$NLaUdLKe!y@9|QUa!x4bO~}f zK5z^~DC-LE9>{HeZXg>aly#-tPGK%R^;XtZUd|W?a|1h>vunIBA@X0j0WP!3x>iC~ zUSJG!cAbR$d4X<*uJ^Kdv-1KQdESkZ=E%IjKX~3v5*nKqIC3&Vx5$y>^8)8HbgP6W z$S2z@ltZPot5AP=fyY=6!+pH>oALs0=O8pfLO16H-a~uN z8Y7`w@&Z?~R>n%`R^$^cAZvo}RowJ#d4YA=2<7=+#Xa1W7r2QvHc^heH!tuj-uom8 z-Io`*kJl@Z&@b}>4@2~_isif=d4VMFeGduk#Cg2GpoAXF3ry#}DZXn~Sk_Z{fh26Y>nXi|WMNA~@IK8t>3abChx^$wya%Hw>`&R=ytSxV`_I%o-c67u`?FeZe#h9) zZ{TJ%E@FSda+>fwG}c)Ab?<)2y>l7F)BdgZQKV`)oandTkbuYek|)0@M|rK$Y^95F zf;7-k)`UIL^s?>Wdyi!zEl?Epd)`ka5w7aC-<7A$GTGb2j|6U=VF z><|c$gdIZI!V(Dk79e3yfDrb@tRV{ozChp$|KIQS?U7`X@8zBMy>s4qI`;hPc2!qb z-MaVIty|SI1wwf2kI9~~LU@fb9yBYlp7u@}0~Ng&LSsGWq|apYU+|I{S?{s*)K?eLOI<@<4P-uM0&@7)7xW_{qKr$ITbkDT%= zVO6bU!}?ZOTVhmP20rDF znQ;sXSpkgLnBAE)tSw-zllDP|S%+snL@s~*ACT+e>s9&v3m|9}Ce*VeKlKtTxCaWD zzwu0|fG0om(I!l>8^Vt@-8SK1Jq9=R_cv8?ywcQ5IV>5ZXw7$S7W+7G~^j3#{(WT1`58oy#NKVBSDf(A8%XDad z+lSohHO8=oV@q(Mkd=a6c}RP{2OBr`xrs;?_@?4>>;jgcYC6R{hrlk6eV+GKuHF^L z2hFj+dkBOz6D%A10td~owoga;Mc!Fr{S6jj>`N>Xu=*oN|GpcQogaR3D$*|>igdsX z`+373NR*plzIihCmFICs*bM&x*T%lewoWs{H{yX~Un4Oc9SWfYOG$@zaXR?6OM48@ z-n{koPjCf(2|mRW@qj^cg9!)4cPIU~e4o6VGZTiV@ErEkvmNSEc&;RiF#Lt*N%9g* zT7~CJ@(M7a@WSP&t0EsPE-E@|2x;pmTrN7g1WCi9RuyeI7D=CVHF!{T423%%5;_6* z{_q6edor|q+PH8&m71zDuKH=rJC3T1+l6VLbtf#%xQUF)=UcC0aK=q)Lp?=O|G3Fa zmsm$b7spLuI#9(gsT{W})8$q8@@!+=ZftS5ir=$4ZYt#}V!gN<%Fp6_FvY0gi%La> zSJto*-=LzxtEii>IPCe=bJ0#T`W@U+cpV$+nS$Xd{Hf^gLFiZE4XnSI6VVaK7T)GL zbiYeuaF|b5K=Q}KNolB`Lv0j*j^m$ANFwDD=t92-vUp(obtomVU!ekL};Xv^erhP`m)exm= z#nVqfCoMldif2?pw+)NO;)-|QA88-vKcs6qkj}U6twDO$2}l=N8!?p?&%Ofb5^FsM zsd(;VNC&KorXW4r)%*y1a~#e43Hbj0GZwc@>ENKY}UIRf-j3;BWO zUjzs)uR&g3ugUg=dOGLA4K>MP67%493gNR0(9pa=^D_u`zTHS~Zpfr&l-N9RnYYFK z0HauH-;P@HjxqW6Q^1~zhUa<3K?~b6!QH$(A*$>b(V#rb!_khQA!LiRj*O7jiS`eF zpv**MRr85Qj4neG+0V#l0}DNZBsn*tA}w?zvpFJU=6ADCWi~4!e@A5VsfAj_b#58* zeMA{P)GhOrTZZE?q70wxmia5oa6lG}F7r0n==7Tz=-3}1R|UQR2r15?98qPiILc5E z3w&I;RP^CvT5dyf61mFm{QIFZAvW?Y2+J!{u>a zr{1Md+VREQHbuS1O#?CB>(qN1XNwXk7O=-hK$Ln}Z@K;Y?jUTrCu~F_;|sipq2BTr z(46sQUbek_CEHOh*Bx!|MG4XN2}ZCA%#Dm6<2?!2;4F-c}x6T;9kEBhT zFHDSIEWPs>!Teb$JAS#BPLcg{=+gK`eejZU5C`Z@zncf*Kq-aUm=CSP4bm-qNz*(O z9W(wQ?@6p=3%D@;V6B92myJI}9%kCVfR2v;o)BJpJb8Ag5P2}Z(A8-r6aI+`EE6W9 zq*82^H4j$5BrLYd;v2sulPL4>m@z~plbJ54%5?P@B~zFlYc--JB~zI$v}}xN$#kZR ztTmWrOLk{^oV5TmQb`R(u-NeY6>KWqWfdCZX_&-?b|1=!m7YTR;97l*;du^CDxE~> zsNj1t(@LkeA=jD*c`DuAY3ZXAke7`8PTdOfVrFBfh!F!kuUvU)ft@tgJDpI<- z5Vp;!XN^Cz&Tl?J z2z;g4PazYfU7nw?wst%;P}+lV7;5_#s#V&jwSCU2`(+XBvm42wq!9V`uP1;=2~lKs zV9ZK0VslFDdmy!?Sur#CDy#JoPy?Pn;W?#az{xG%((il5VP15YuvLN#Xf~@m&O=f6 z*(XuvPL@(*Z4seu9tuv8UCx0&RqmN@ch`V8%~OD!h4xDnmD4>*5R2`Fl+5iOj{Oq* zMKa+GPYA?%n_sX{dZveB++lB`=$s`?%-Vk=akf-F6l!e97^UZUs?g3Y&R8=kV-4Su z8Z!&@L@ENlf}?0U*>t{VE%;aZ8f4@KZ|NPLTT#NMgI4+r&q64PVL#~sai=nni{a9{ zl!1#W+`sf3i&7;a{-R6i-I5cqe@YR(M~HHJJ!an0dp&%1*nb%Le4h;3MfeWAk7?gd z&dDbILuqdwW*PdE1wKa6Dk?DU0slS>WLYI>kAGkKc82vh7~@~bo)uYq>(t-GC;c%Sol76!{5yr&1dm-4}TBS`PRb_TE8q_ii~28+B#Z0a!R$L z%cYBqiVWBj3B3LSD?b5G4ZLv;%UP!~{U*~si|@Dw-eNl6x`64onJ%&}Vfr1WORUS8 zewXQhbuH67m@c<&Wcod(!$$B8j8Y^p*_?xm_B9rAc9XOb>gbCZff?pZG!jvQjv*tk zyUCmK?Jr;n0yBjuvgrT^YD_Y$#4cmivqV$FU@m(VycB|)ADCy7f%f;H6oEY@ZP*{N zo`vR5P$?Io~BugAwnViYDwT&X>(Z!KZk4twu*t8ZXW~T3>+t=7TKFIg9eTl zVsAUn`%e&JADgd?2Tl}Xai{}7UKKdWybq$bZzz+F8-bIBs0(E=BBw~YF_cDno1|CU zQJAN|sdD>TdotJCh7YGrvKY>aI zejr4!Y|lCv*NSpZ3YueJE|M(q3Q;#tiX8M~jhcB36+AzaiFf+j{37;80oI*dq(aSf(2ZH6n zLFSa0VZMkM93p`Q{3{U}C%7Vv+WK6cq)lOGyELb96XIx51HX(p%1~+nX|cq zkCHnxJ>erbe2-HVm_ihtojKO3q9cgTm2gni#_2JS=*B&mUzO`$*QN` zn}cmkPx!y!Nd=#wNqE!~W>_`&Ec^3>C(Q3A2|iB?^pq#OFNg8BB%bqxe?UR`9f=n_ z;qQax!52up>QHA4vqf;YB1qArbV3`(fjP zeH@Bp_by_1_H*4HlaZFT{l5^_%QNx#;T>um4l>r$VS&um2?qW2I0_z5cE9 zK~faV3 z-zYk2E~t0pLBabmDu)Gjm=~Z);;#hWHz}uv&1o#~p-F3!AL7q82L33eitGz;Pv9>m zXZ#Yofe-yuA`b!kHs13$nQY1>${zS!hzk2;7W+b45Dqcm6!^Ok5qo+BIbWHVpaE0t zZ#Y3s^IQ&Mnmq%fADAvq*}>ov<7frG0ra$(-TgVrh^548>olZa2+Z~z4|C`AVy=2! z8_~$X9-a;~Onb4Xhkec3SHVOC7Km>(@yE6}NAIiU*F+ZnaZBq8^&@e7gdo7Fh4Nj7D$_%<`py zxQ9l`W~45Vkl+orV<4b`PS0O3x<30wPD))u}( zAr{;3`$6;z(Pr<3;Rqz9J-zl<(1burh^+l6R3?y?2Ec!&HRA55jMaFf^keY&OEYkW zXC64~H1I5K;FGN7TMF*9bTp znupsZY@4&6d4wIIg#6sI16^Bhr!WYCTZQPhA0vxy6C!2*7u$Bb5JPqoX7j)uLTt79 zRULslg$3K}cPQs~d1#Ba+gVtjz;8VZ!JM=GCz6xD^Q<6Y`XORQ-~}mni|Kz5)-3Rf zbmDf??}yb3yeia#rauBR6?jd${uC(O9(Y}-=S=@P8iqH76EB$lo0#{O-1oBSFQ62^ zEhTrD{;A~iJ3@VE`scFbyK>(rroV!{c~7?3|7t>B_rhou)01agWvIs(#hfh;9;Pcc zAWR+!b#25YYdO>+)J-A9x`cNZg-&E+tR)cbkWAf%bt9xNBr~^Zal0vW3a2xl-+A+E=y>RCa?-H47!IAov}tui4?^d1$?masg((W1cO$NQEv}wJ z=d%m~zx*DAw$Qtbe^?hm+d?}iyVxlOS3>WxkjJWmN`_<-@>*Y@JE0HcW{YliNamwF z>v3L}>BzG9-2x$*jmA{rSCfs9Oh)+@{pFC%MFrL)eAb^>&sd9|XGo@{LTf6_Na!zY zLy@&$CenXpnPTfnmj9IL@z(cP&u2`RSo7JozcF2ECHUOWnYJzZ_MtDB_FHuAL;uBe zz@ld#`a9D>>rqHW=u4(URu={(^cB-()>@2A=xeqCdj{~=L;p>OucC_Xdgz}_N2=hh zhrVTUH#+MfL!9-Q_U$kbAybHXvLpz3Wjb7FA3+9LLM*bqP=(MKA@;VXPY01N#6I>P zIm%;&SZt5u$QB8)uN~q&cY()=FFaSa(-C2403 z8EQ3$*N~w$T|>Uh$F4QkQFLa0-hpdU;H(IrG!3}5I-nUbg3<5+Bi5HoFlIb^6$8Z$?1T_`DY`h0sE zS`gYIv+zRu8!w1s%pDl$CHDPf{P%@eVgH2^bF2`}_SGDptwJ1ZKMczmI!=i7_K{SQ z6XZGFc7#%Sq7c3IDyqgwLZs}&DWfL~k+q*=3w|aI9kL&xxZEJb7W*)Y_>I!Jt@b9$ z<4w}g?Y0RMANqxG>TKIb=H4mJ&<*xM%(+Yaja%%Ql#qL6v~RU*Ft>*86XG_Ti-yqs zCiVYz`*#%k2ZXr8&S!HTlw!ZI?`5|i65>wT`wu-V#9j94J&^N=`4PtIUi(y-_|T)~ zS0Em><9yDqq&ZL6J6PKjCKn1%*|W*fUrQHWw&QH*lP1mJYjy>@{ge5=azu_gVZq= zu`3EV+bx0zL8O6Z(}hMpnZjkF(!qBjnDaw#n>;|{$mP2#m-HndwHk}`S#)D&jKNe94XybX5l$ zKgGds6k@A=An!R)PMVx3>+;ZQ4;S9sjL7!Tde6RSe>vlMp_sIPLU%{n2(^32nF)P~ zJ|h&DGDh(=U`Z273lDcO%JxTkd*}#H0ytp+rb2jOc%m4@vO774c?uv9Wsfjf@ly!b zYh_O_z|?EePc3_98Im}hVIlo2(?07@(7Uqdn9jFu1{2DD%M(#WmVwTdy};`@i~_!w zy~uRHy2C{JC6+0-UciW!z1)j**n)%`Wq;uHi1i4Dq3l&&pJH7H-6?yG*QZ&lponE} z@YiW(TK7Yd%iiMkIo6{v1Z8hCJ>RNe^WSB9p>_8Rq<1jA*m@r^8`JS+#j3id|}V;j?TPAuh8Qa*!sP598WZ z_QmYMB=a2**V!i*ftYMsklY*W=TT?b6mxeFx7aoC-OFZ}%Rt<29}cA{+ucloxXb3( z;groZF930`JpuAnR%6}{;z9dV=FBx;2l1%=Fe{j6T6p#o_Pa3CWy?*TOL)p|fYm5# zGG`#?Ir|U}z$&v1#0$2MBhzdSfOy&2t);{jav6oWZUNF`*>U&6N~C4emSgE&Je;MD z=LPxTstfmWbywg^Gmir-g$o%}FQi|BtTUO#@piKGDg)+YIr76-hwpN4eSn211tSXS zWBHXUvU5#QaI&elg*<$ThknaDDGN?k%FQa|vJLsw$QnzDaPq0q?nC!u7Ug3^79Z;7 zAHsZ!jFYb{+>8stF-nP(LoVS_XEBElpp=ZLlb4YFQ(PTOnb|2z_N$TqgnK(h>ED$3 zkabYH{#CwPQ4#XTQtF&S90#{cbD2dM9Fg@1^W{T2uY6m{k`&MpC8Z{wZg82q3Hfqh zfWkYXpw_{Fhito3oJV9!JtH4>Hw*GAMcpYV4f;;OcUkZm6r|)A-sHoFl#yXofhj`P zSSo{)FVD#hyHlL^fa7yeNFLkI(j4DHrf}-na|tW~PDX>OTm)NM>?z;)CJ5^&tf$H| za=+z)BVN9VUbbn?fiW%L%tq&1(FsT&%Q9mv8?$}+2}i&b7KRHaBP~m(LQnY3aUf1% zp(31fTLcO6O_=Z{AHj(31ZQX2s0hLG+p!$OAapjKQ&XTgWl;xKg; zKjh7M`4vBEWZ8ehFRu9UvB)>9)8-@n6Q+H}q#9V8{EAC@QD|}!&8oPR-vvDRK2~uV z&$k+$FYttl%UMlcNyXI{<*K`eH)(a(GM#Ts`Wg){skrhUP)>DMasSz=?z%yi_neN; zil4HYyhz239{`=!-Nc);x|^9UF(&N?Qx>WC8Gk~;sqTg&a@F1P7|VMeg9=pqoYhpe zzzUvkR@}}|t93A@g^D|PCqkR-*j?mK#CjQ{RPjrur&z0tkiMJgX;uYmfGti7NaM zyixHmzx?RKDa)IXeuUS%%_+-Q85NJR{%uG%85O@`db=5J0`DsxBXKr-Jyy<}#ZNib zp$pL*p}p$8cz%v~xZ*cKl&jp|3nB7WJbeI0Pqqsxo?%^vbw~tdo@Lr+@wGp!X6`ikGP zbMvi@@O>&?X1cAanVtRv)7h$KGUF9C?R;wn8TKmgeZl&YDQUwVTCzR zZ!rCd)s2o-y!AcY`+4{=KKC6S-}~GX9t2dpE1mR)uipj44(TPL)Ocvcd(usB_$Jo- zJ_$srf5OrIfE_BqZ-cSJtXSB&ze8^T?Q9<7IB78oRD2i$-}CY->$&4$9SLht+2Ck> zlIdkkn^uF(&;XAEQ&b zA2(ih<*%1lF4=)XlkWwaE1Nc<3C5&v$D{p~>vu(w$;DtvWsLhTlP~ii+0LV*&TiG7 z$d|4~jLLpE6I-pyjjJ%a)?d;8N;!mUSSM0=}Fa*E3E@Ct5(VzC5KsGV1}&R!t(2_*UFJThUGh~jv&(CXZk9u0%p4MSf+P`=dcf3 z$wuri)xzpk9!Fx1DH|Y_CtZV@u-U{7kjj%uEH-5Wr1BIJOHA1SsoX}Q-jofH%2P>T zPl_8Lm8X$dX@*-cZk1=!(qe<^_az|C;`ldv!#s9Sc`mu$<_*t^fH;rDT8IfBdI5=p zyx|!TpvoVRSmzD%hZQO>eg?$B-tb=R+9f0o^M=cq^CJ@Lz2OHi1eKSQ86Dnm(Jmma zAkpm&H%35Q!_y_b-tf<7fw-0Cb{lp!;73*dg2lG^!k04VPCj(IFMJ=XzKg^ezA$$n zDu2mhXZyl;aR45tEjZs7J_$-$`5Vq_)2whKTm2-9&9uV*H37s^$KpA2tndevjOQ)@ zvDgZ?vZ23Y)yLpW7UhhbatwH=tQtE2=>Jr0q z8-^OYI8af~>G%l$fX%9yj}jM!?>u}Vgpk4S@Gp6fVLbp@2;a>^&OYl9yC97;oMJ0ZG{pL7&2YF&(iuRRvcwJq<5+Aiaj^ITp7+f^AGMv?39t*D}4tQCPnErX3AV#RIPj zt}qAoMkr_z{EFZK674hWD1;_>pcBEeuYko0u9O^{z=22vnG9U#_^i5s=@RQ0-unZlOAXJpvq4;V8Cq5P1;q9>U)4r4w4cTXt1=oJ{0J}w{1I9dj}$o>f*^L?qT#J-wsIaUTOVBZWYUbR(- z2!0G6#Bp-ZOnV1Jpz3(x-yHjHR(+D>%(pYpg{qT9pcdL^KAPoiCOq;`9GEYknS5*B_O3v~5KO?g*mRc73{Fg(ct1dUW%v<8~pMkNjx<*=6 z@AH2J4X?UEsAWDsPnA^NWb#h!-!TEyZSsT@eg4T6pzd(&jL#os zPk$lQIX?g0K2UcGb*|6_pLdV2?joQ6&m4(+rJa}h{GYJ5_etJm z=sQc^FL_t_{3RUcN2Q(D`TTE_OOFe6z0aSaSpG(+8+`tQ$mnNxn8Or61g#E92 zS6cR{&!47{?-1$aRpppY!?mtrRb4CA$FNt<0I^gEpB+JqtLucwx5@PC zdLfEz{>DUggSi|{D}g!3O_Azj%m-QB1CWX8W93j7j{1Xh)mx?QK6@^6juRr^=KFrt z#|u#;CtIseFsFc*`2AD^;JTY*hizf>Z^qa*tgCHag7k=_90M{>T87v%XVG$bwWgVP_X)^lAdBu$4FIQ zFO8Wd=Uc0PCIft({SCaAYDdzqw|RJ}`bNpQ!G4GByh+C8CYwKCP<^uyH`|wyBew`~ zi#-KmR{e7!er|sbOHqBR5VzV%*r)2-gt*QAGsod}A#S&qkoAt5++jb&3LGu@h0Pyc zs&>+kc8@cgt*6kjhu3Jo$j@H*uL7? zb-K^4W^?YBV)xsd$@fQuc)(u9&OIu`gZ3k=`Z1Gl59K_IbSL36rl* zykcL=p8ncA3B*7AAF!cMnonb_OZ0p)(=v}>T~85x-KDXK`7!K5QT1!4T?^URj0aV} zArCj~QfP4Xn_?Aw_GRqx`;vnrL#x^R4@}k*EQgTgSO3{;Kn02g@Iv%S^-WnNf^NArA9^_Mak8}^OVny;K&Z5}kP{)fqv z#`*T^@Bpg67O5z*H^LrNe=Eg`?fuv$LzH#A&3J9KDMX3Amcru^qST(m+MG9=Z2N3# zkk7*g1nmFjL&te|MEPF(ZT7cVh+o^!@S!E1NnqW}{w~&5>Y;9ynEo3hp!^pkf4 zFWntfK&YoY{(_01LUJhLWsm<2R$nfyc*WyC9&>i}1fgE__(gdug?i27|A4hr$

    1X{R4TR>ZIfuUjO4T>ecl^orz!yC6@2^i)4>8Jp8?bUCM986}-@k&)|jN zJqAh{xxhRY1q}O2j85bS zLip@kF*uP6g~+!(FkO+0guv-^_V$NDl*sX<$i+egWXnEsi4f(+Za+bt1wKATV&&{< zAvuVP@4FY-$wKbSx;bCFIkT9<;)Rl8Ww?a&l>a~{UWc=w0Igf?f=H$ru0bnd0(^sdU=;C?^~uD>}N6Rd4|}wWp)h~4SA*z z%k3&?SYDnGE9_&~P3O2wqs_hiyaLHNz9y}>POT7q_6l;jPKbVc7BnWWL5QS%8T+zKh?IRUD_9}KM*9&+WL~2XX*&&z zop*o`8T+wv5C;m8wGF6T-by)VF<=Dmn2Z6=o9wv)vS2?1xyYL#N^aN(lh|Dd)BX&) zls8idk3D@Vh#DbyWR_wy^;;A$WlsehG{)k;dFf}!n8q`GW;I`+B zodsu@E#{mV<{Izc%r&U#BDCC`Oo8E_Q`6!VZcUR}(^6zOHOWiEaghJ2rt85(a~g-5 ze@;y&=W3e9nodN9Q?ND5E z&(RfMl&g48R=hn|@t&;s#$3fhKC@HBEf}7b;ZfQfGqJhIv}yxp zc#bi==NND&rcUe>mJXGv8%3!iV z4Uq%ULV985q1@Zt12xP}C%~%1*}^&Kr$H6SRWrkE1~-}!EI5|=xLYRT{f)T?B6e>s zUddW7ntj^RbLtmteD>=H@3{KaJ3cz};e!@^TKefBR~^6qxi20O{@F#>k9pZV^aT6< zljcr&Y`xZc?UL-Lmpt@P&m}ufUVi^y9{bTlW@< zm_6XNpWbrVE8D)>)Usy3i~1g$d)*ULy|+Am>>&^Qt?;eKmY;L&i)-S)vAU*D51cgi z&Z!G0R?hmSZ)TH!+``tj%-F;|V~^Z4>(>t-chb!CxtD+Vz!e8}R$P}l{lJH>T+{pb zgb&Ysev0+OmrmNV`190dN0x*hx@tmx?}F-;gDa-qaqlhjZz~EfI^g=3SFQfdrHB44 zIjj56$Dfr=#;+a<3_WpTzUT4n|M>R)v;WxJeAVBt{ObPChBiJ{LaxsH7}mF7fZx8c z$0rd)y0=&dgF9oM0f*+bVjw3i;%(F6kNu|ad{1QsvMll&rm zN**)E1&yf_Fsi26=x3Sn6H#V1ZZFwQ3YYp#Z*gHBo|wmMTc3z~`9%K+5))7WWIl@` z7i3WGWozZ$(1={zTUN%JbGhZiRUuqHTolejt{UldWv)d+hV?#lmCwW*<6l?+&n4QB&mAxaMg&ykEj?$cO52i^p#8`H>b`r_n+VlAup7g zwzZ`E!llCfX?eN9;`gggKlOMMB5=V{aDT>W$746J{G6rGVSE9T+W{7vIpQwl);M>a z$C9%~K5W#ZX3x*n0bR{KXf9efSF8vG6IT!A&C3jBYe2HIHkg20LKyS=~+#$FKI0;7B36yQ%5=L)op z>gNCN9>IC`yNrS$kx>Msi|dTO{3f5w7Z$W+16PC2N}+me$VBbZnR% zPxkdC`)7Bgdp0G~nc0KAv3|H8PGP)Vfc$jA=-m6TzV<}NVO{ZfO)TA4)1T~5)Ffi< zJvH;Ai)!Z0nY-u4J!%Gf`uCW3*r@EodivwN109LO`eO0!p8o%ZiZYusFt`6n$1=%y zt|QvX_Dt$Oy!n6PiuUP$p(gS-ndwOU-)vPZ)iXQQ8_RYk(|!M8D@HP7;oL=g#%6a8 z_V%>@hj%A4v(wq3|GaQA6Gf+H|G&Vf*`4V`BAvw>JdP0HGv1f!amoKl*xkIgm1IEe zY<%@rPdt(P8s0c{2F>n_4fJNC+0Cg$W>z;%Lo}1^z!$xOz%1P!%k;!^xp3Dz(wlN5 zlyI;oo#;(ucq=S!M{iGtH^SBIj`c=+(i{6hVFD(FA&I6kQ7B(eHkls2-j%|a0!u0I zJeoH5Zp1Ipkj@@lMT%Fu*$Q5Tc1PPY5INqW znduSfcwfhG#!z36-j~V7qCNecY?pgeBEHF?q-Xuv5tSqosdTb$xGY|{8YWVi4Z}nx z5g$nRWH%3ANe!ms*>vylg}&ZC_Ff-LDw-J5W;y)8;3xwI)3H=4L0-b)q~VIj`}P0@ zv!BlPirhz)z2j(+^ThIdt4%+?FB*1J>B&3M({`e3%!voqcswKSnERb8dw%E2er9Ci zNgnTryPh!2$fWL36+LU1Q}&%V!;?Rv*sF#a^jNsio9yq3$Opf8cwKXCw6(1^+PG@j zYJ+MK<#S0&DtYElRan8d5a>` zD6g?hVtVAz+Lor-37YwiM2Fb*_H?X2-W^FpQ8GQr{>Z#}3l=R{aCoGqFP<9M7yQj8 zhHCou0G;g~=xhJ?*SqFLYF1|=HPEDeyZQ$fEsE51_9tr`Ba3t&G$z)SsKE=#UD@t^ z=ipK&TAam0Yak*-+}+s`%f?31N%Xg-Gac(o)TEMNNg|CxnVznGv_IY*OB<9H;Yag| z+Lh7e&5f(0we_{lZ4E8PineGxmNEvRfvIlv-)LXa)770wFCEBiZW(Gz$2vQE;zq0^ zmdf^Qf`mpp`g)DJ=Cv(}uJ%}b1HRXG`Kn}pJh613Q#1@yX2;yU3>lq)ey0%;4pUD$ z6-_5HSkU)(^kiZK*>2hvW2uZ#b0Xc7>@b!?<)a*`SB@>y4GE zOk+oHqAodrCZP`v{jv7m#DU8oHU^s>O%FvodpeUwYkdpa;OeC?53KC(PxR(&8%$P5 z!svn7%9%?9yU>c>4T;T0hMlI(VYT>vnx4*BJRv61=uc#$@!n)6(ZS?kGQGjME=3m_ ziT-$cb1I85iA7VfOeWQx=D_p}qLZ;+jDgYK!{JIN~!mo#!{Q2_Q8 z{mjG-HBG{k)DM^*tF(&R~SvOhd-1A5v<-?51N~ z(T&F1{*DCnCzefgwDu*F+3rL~UEP63|3IHKus<2ibff*zOm7m6#DE$YpZ3k!M8@ds z8H(~oSblK3RfN!3zBUEr;ILCy4otvFYEQ*_(t|yjL=@%FH#DcW7n}zNJ9}eYMmCn& z5S3P?JEQ0t@=<9=GCOx}b|}?vKq955s2Bqn-aY0;vm6)c7&w~g15Z*=X9{LIo=B&qFM~169IiCB z*LBw?sJ0ka>P&~4j*O$8|GonhkwLJ;6^}+JOzYsvL`TLkD~Yrt{f#YaqRZBK*uF*hKLjhKMNbLc{I9l`93rZby5peKOmhQ zgLC9_E`%JqA{D0LBMet4vl9!$Y-PJ)aR&PPslj4qOB zPy5P5Pi7#UXwDe0rZ6sXF>TQvSQevu5c(;m1A_y-9|UJbnxjTG38@#(pd=Zze5XN) zretQI{jH^~hfHP$b7LRNX47zzQJGYjfr+9BIF^E3Fxs>6WC9A=nd~3#vl?aL0lg#6 zTPO)xjt<6PHPZ>lICXTi$3SG$n?=XdV!gm+3?Yg_NqQgxqLI*$xd$&#r=Z!8Y8r&J z!>NL(@;6n!Dt16@FwvXI0XHeON~}ckg?v@Y}(Naa8FEm-vDNF3Sl&j(Um#M zQTXPX1aaZVBJ6(tj#v|H@7x%qFh=lS;>Jc?IEVg z_BuEYPN8MJ0~xG~yWq#s!gsT|G9Al9xgdu*H`=2aM_r?IJvx#}ND7)Cb##kwz|!B~ zl0pa7VKHPniSg-8bj9NEUygz{M301@ga)Tl(Y`olOfa}v^rfk*--yNgqJ5YZ)W9~c zIK=TS9fMs5n;_Gqhz6`Ir;TAMJfn^Th0kbT zwyp(z$E2CqNHwJ#)vc&qwW?vI(+0;U&e<5YoeK+qY?%!L4Cur=s~qDjkQZxHc;BdJ7`yH*^=l> zW)tgB9o#<^`6%pUca}x_2YP$wIO>eyfl?cN;4&p3(~A|+Mv>QeZx3W+1zWYD9zhhH zOrmhY`;cM8Q-gg`9){29t7{ru{S_Lv-O*Q3U3aR61og(!U5U{%TCQoGv7TN7R@c>w z<&9u{Elf(rNTxfWUh0$?EkjL>O{;gZ6PPoTT&g+pnTB!ea*b_YSAW!qMmfVSggu6F zAX8<~;fkwGN_EeRM>_}UvpP+uH|VUv)wp6zHsr?1v9ujVLrXITlvdZs#5SQeIA_tm zM7A4lbNh;QBE22S!T#K=>~iuuD$(BM*ix9$G##AwM$TnWn_Ae%)`1N5-dGmv%_M4j z`ylO6NJ&m`W$(RC@SNIvvSMskCF_zg1Qp`&u<5j7m}x>C*~HqVTj$8W zoat&8z2HLMKo|RZ`Z38vMc}Z}$A?h5R+!5l938{hEzF6q7`~oFBEd;#E`(baN|=j! zlU)$a4NxyQx=?E)JCJTq(#By*hEE6Al5RBSna-Xr$C~Ik#rvZ%FjSO5TMwI`$nx9I z5fp(yMrH8XE$K2QJwAOX*4veH)E)OXJ;VtjF6)?`jX&I$44lyTCP#EdHqbX`P816Q z|;lAfMVq;GCB%f?&=g9lEktPmKUN7lb>~#ps=Ky=-7(!$Q%Xtg#L-xx7G11 zOli(jl8&}JGm>M8j9T6m%Pt-0tnGlomI0Kms&RN=fw4~mxvO9=DH#U5f4n-Im}z|!rLr5%>pYx{fRP=z|jEuc3@G3F2h zsHUQ#j{mZ$NBx&gNu#!@xqdCUhwsP1Ynv?z%n^omGTPnI8-+6yk7B;UA`8AGCU#+X zpLi_E-u5_6eIkh{vRHixi%g;D2qzy$A>F_Q+Do0twHiy|oR^IuR;k37cjinBRavAl ziE5!qu$`El(^-Ug(i`1XgcEguZEzNJFlOw-MsSD^l)j*rhT7)UE1NQ1RE7?N?17U_ z-Xw-nh)_a})n3ot3kF*(73@DudNkG1@61__N8zr#F;Di2^ZcDf@3LeX>m@p&xdqbj z+{I?mp>>>t;WY!UwGZk%z-eQz`Dg|Z9p{X0a2*}3-Gs$|XWCh$I!f&L^ITRUDgbtF z#GEw*#p{QQ=y+6I%F28KIdGk#7?u}^1oYBTz(brxetTvROFUU@Q0Bz*?N1Dfb{lQ2 zb#wSJmml-^u?Iiq^J7nb?8T1-1{RR;gy3XFmnM_F238AQU5PZt4aP)gEqr@f&hUvh z0cGn*V@;evlmcs-O>k4-VHs2*x-rJ4B-Yv(R5Y~%9=Qk&McUzjkTC3GCb;mH#j37< zgb^_Q$y79(9?DI3vYuDxw>{o()MER_iCj4jT~d7vN4*vrDN#a4pJ|OSQ@ZnGyR#f^ z%q)i^+0~X@+uxgn&x-hf>o(^am?B3w9AerfdJ%P^Mv#w9j)sbub67U@!2S$$bgDIn_3H3>mFW(dJf!yu|r#b%Gh2lI=%wJ?FAVJ(HZb1rL(8 zK$N(9P;BL>H{Bk@ju?4#yXXv-`pqZ_A(Q0=&66~zqQ-Kxo6aytjiKJ* zHSbV#ZGSwIMZV6qn0TBOMf(QKdYw>LEHCLSZ`x_fayJUl7r3IFN|Na=M-fL%`19uU zbsvSD0vISG8&Ac%H*k%{1&b~W(nE3VTqX<#fZz~zB{6sIym+9BIR1+(5{~E&n?a5p z)_;6Zyqn7~ST%%!Buc6)URN*}3~;=gS|_xJ^&z5ba5osAZl-bEguM*-Wa)Gd109Ke z#7OB?%V@$ZQlk5elq`qbT46g7FXloH_NK##b#t&sRbZv7}GcQ^_xVx}?mxU6U?SfligoaFDvVmqA#>WXcx3_aqBt5B5bfObfOvl;B zvt(A1h@{bzVa#*xkOU>EX^b;K@lLN>)LR@p|!20an*7I&OMvZD)D)Y!if01Gh|#+IC~PX z0}$o}xCTeSQEoEBT?NB9qbiA=#ISjWq1F(^2F|^h6-!S4wmg8vD}lrLznVsPB-%)0{}k@FWd` zPyc*fQ4Flb4-om>}z#>OGGBU)FrFoq8Ou02rO+gJ3S3n?PC2%N+AxJvjWnxht$s~XzYt!_DxjBBZdGOn#_TieoLFk05Y2>&u}I!U9V>kw{g z5D}=yf`1*i>ztDbuIhCTiZw((Tcb;twj{ciI$N%TeSNNQb2C-9XuxwWkDUlbn*=CC z^o1QxGy*e}7&;A7a)>g<&M`)4xEOP;$+#87&=X#w8MbD0W<)JygCr`86h>}!DwK^r zCx$yR%-1};U&*Z*?9`+?;T5yh+}y+nJ1ciYND}@1bVhrfc!MKq;>gJK<#d;J8%Lkv zTVo5kk4J#$KT9MY*1-vqWa2oj(+-K|o&&mNtnBIEP@iBNqmk|qnKy`2NBFri*#Ycw z8Z%n>b4yPS(su&wqV`;fIjW2GS2D$gj2o85;#rn9&K!mzbOyX_NJMh!<`(vz3>9}) z=1ev==W#c-HAU$YcXq-sp!-;8!7&2=xD!njm&8$+W_aKTaXaf4)QNmVs<1AUp%Yz& zG2z3w9+hWF1W*qRNC0A#*RHOBItHx_4iEb$?$fvjjfI|WpWrM*3K0|75QHWeOZe`? z9gEuRoFz0C#*cfj0p_eJ-duutBffZ6Jm*u#n>cBCGN|49rt`B^G9uWN0%YY$1VQ|6pNd^oNh*z zZmO-r*%chlXl)%{(diZ*S2r?0bR_YE^6@O9BjV*^Vs=7jj6uK{h>O+P)7u+mEFRr= zjzo0zCfniS%f!~+HfkLz$79k-I7#r3bL-jm#!PMhW-L#ZHZ=3}L@q2hvcc|rARByK zmhglQ<07)=k|p;Dw?qsFRd;02#<3kRZ8&Hu=Ra__24)%MkuK-i&^m#qV)L-}9KA)?#{GASGFn0Tl8;Pu4o{(Ie5_-$v!IqkDQ>JDhZm#R zkck@&%ht9wVAEb42e|Vb2N}eXy!(zO@lXWU#L{sLC#Ra+9%?L;!ctcjTMR$T?goe4 zG0$iy1kO>0WqTiXP*W>b9yq^@V{tXfOwFFN_Lwz?2c8$qnLl@74Vvy|9R`boWnAVk z_nfJ7hT0|Nz%``%sDyaAF!_me9XubH9_;iu4kXqE^k)aKsW1pD98=H)# zx>jfZU(^BmgzMc5*}UkI_4V;O4^O3B68(nc${ zc*VuVB!ksp8jIdRV@>!Pg?bmoLD>NKuZAtC~jy`g`O?S&q!v9crf-&Hik#{a9JupBhP zUEKS}-Xnt}xS!z}%vJ^`{EV|9Bt}f0%ZXUpC{!-$lsgA2&l1;&J~cPt8JMRpgBLM+ z=waYm3V|VHOBMX!+7JW7;P*!CZe(~WSD}q{ObQwf-Exksh_OgB zek4LXLLCv)X@WUOBUaA1!ss(_@I=&v(mm_o!cGrgFq5uHGqv|8hDyqhd+Z-sCne(8i*j9f%!1$G9wF)9UPggJ4Kj*}s-+KJ6>fs!;VW8}Y{SveO-97T7pYS>n&Q#R{AdKK+|dYjCB$8I*= z8@%}wHvnSDuou}a! zDxBpTyjT z-B`!P;gRsXHTQkEr#QkLcWns`6pvnFx_6y&-8ko-61jm{%~cQ1f9iiB%+rkc4^E{S zIdFL9PD;exHW6c5_>-j`fSYNg;~Rk$JaFv1D9MljNt#VHJ0H}Wn_!q|$M1x1+U1g-G~K?dXXpZ?){mH5sr-&~cy z`HC($ujL!YL|kAwynZWxJC|b~|EA(Uzue;gs@zPJ+4;HdtN6&$uLHoh?(9?!Up$!m zN`R5&nszF;;@^}zVyAK~pxsyfk<2|exl=iQMZv!+cic|pHvOA&=j~K(8))~d1(3`= z_u8GxT>;wtN`sN*?%k=}U7#Z@pnrHPTK--@SB_wU3@oN_|N*>za2>QtaPd2yw7oIWPRIF--8g22(I%RCEWUasBC0?O&G}QT%kib zH!rkPxi41pM+Hzo|J-sm5+k3x@(}~SMBqG^8XzKJ{4cj;sJ zVFKhw@So%2*0*q{`hJf3SkC=(>zlt*eV?Pg%TOqS|M>c;Tz&kOG4~!^HVWGC>l}Fh z+Wm9$mLV~+zvn-W{-RI>|I6{;ZQnsC$9v}BKmWcs1m8f2@6vPsn8*LIoyzr{Wf&XX zLRyC9`n8;!^%lx~;}SqVmw!j1+{pIrK>IGk^$7lRPIB9KG|FL^Qn)04ubquA-*E{b zvgME8H8Wz^jq&Fg#_4V*^4uhGgcup0TNZW|nc&GZUo$_64?%qFU zr~ENH-JicxJ~e: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

    #K=6NqQrW$9sP!rKm^kV#ux+Y1biI$ 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 z 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≺zdrf;ZJQi968;F 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